* As UCB is only ever initialized with "Local"/"Office", remove this configuration vector completely. The "create" ctor creates an instance internally initialized with those "Local"/"Office" keys. Special (test) code can still instantiate an uninitialized one via plain createInstance. And for backwards compatilibity process startup still ensures to create an initialized instance early, in case there is still code out there (in extensions) that later calls plain createInstance and expects to get the already-initialized (single) instance. * XInitialization is an "implementation detail" of the UniversalContentBroker service, do not expose in XUniversalContentBroker. * ucbhelper/configurationkeys.hxx is no longer needed and is removed. * ucbhelper/contentbroker.hxx is an empty wrapper and is removed; however, that requires ucbhelper::Content constructors to take explicit XComponentContext arguments now. * The only remaining code in ucbhelper/source/client/contentbroker.cxx is Android-only InitUCBHelper. Is that relevant still? Change-Id: I3f7bddd0456bffbcd13590c66d9011915c760f28
1217 lines
42 KiB
C++
1217 lines
42 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*************************************************************************
|
|
*
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
|
*
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
|
*
|
|
* This file is part of OpenOffice.org.
|
|
*
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
* only, as published by the Free Software Foundation.
|
|
*
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License version 3 for more details
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
* <http://www.openoffice.org/license.html>
|
|
* for a copy of the LGPLv3 License.
|
|
*
|
|
************************************************************************/
|
|
|
|
#include <hintids.hxx>
|
|
|
|
#include <vcl/menu.hxx>
|
|
#include <vcl/msgbox.hxx>
|
|
#include <vcl/help.hxx>
|
|
#include <svl/stritem.hxx>
|
|
#include <unotools/pathoptions.hxx>
|
|
#include <unotools/lingucfg.hxx>
|
|
#include <sfx2/request.hxx>
|
|
#include <sfx2/fcontnr.hxx>
|
|
|
|
#include <svx/svxdlg.hxx>
|
|
#include <svx/dialogs.hrc>
|
|
#include <editeng/acorrcfg.hxx>
|
|
#include <sfx2/viewfrm.hxx>
|
|
#include <unocrsr.hxx>
|
|
#include <unotools.hxx>
|
|
#include <comphelper/processfactory.hxx>
|
|
#include <comphelper/string.hxx>
|
|
#include <ucbhelper/content.hxx>
|
|
#include <com/sun/star/ui/dialogs/XFilePicker.hpp>
|
|
#include <com/sun/star/ui/dialogs/XFilterManager.hpp>
|
|
#include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
|
|
#include <svl/urihelper.hxx>
|
|
#include <unotools/charclass.hxx>
|
|
#include <swwait.hxx>
|
|
#include <swtypes.hxx>
|
|
#include <wrtsh.hxx>
|
|
#include <view.hxx>
|
|
#include <basesh.hxx>
|
|
#include <glossary.hxx>
|
|
#include <gloshdl.hxx>
|
|
#include <glosbib.hxx>
|
|
#include <initui.hxx> // for ::GetGlossaries()
|
|
#include <glosdoc.hxx>
|
|
#include <macassgn.hxx>
|
|
#include <swevent.hxx>
|
|
#include <docsh.hxx>
|
|
#include <shellio.hxx>
|
|
|
|
#include <cmdid.h>
|
|
#include <helpid.h>
|
|
#include <swerror.h>
|
|
#include <globals.hrc>
|
|
#include <misc.hrc>
|
|
#include <glossary.hrc>
|
|
#include <swmodule.hxx>
|
|
#include <sfx2/filedlghelper.hxx>
|
|
|
|
#include "access.hrc"
|
|
|
|
#define LONG_LENGTH 60
|
|
#define SHORT_LENGTH 30
|
|
|
|
|
|
using namespace ::com::sun::star;
|
|
using namespace ::com::sun::star::lang;
|
|
using namespace ::com::sun::star::uno;
|
|
using namespace ::com::sun::star::text;
|
|
using namespace ::com::sun::star::ucb;
|
|
using namespace ::com::sun::star::ui::dialogs;
|
|
using namespace ::comphelper;
|
|
using namespace ::ucbhelper;
|
|
using ::rtl::OUString;
|
|
using namespace ::sfx2;
|
|
|
|
String lcl_GetValidShortCut( const String& rName )
|
|
{
|
|
const sal_uInt16 nSz = rName.Len();
|
|
|
|
if ( 0 == nSz )
|
|
return rName;
|
|
|
|
sal_uInt16 nStart = 1;
|
|
while( rName.GetChar( nStart-1 ) == ' ' && nStart < nSz )
|
|
nStart++;
|
|
|
|
String aBuf = rtl::OUString(rName.GetChar(nStart-1));
|
|
|
|
for( ; nStart < nSz; ++nStart )
|
|
{
|
|
if( rName.GetChar( nStart-1 ) == ' ' && rName.GetChar( nStart ) != ' ')
|
|
aBuf += rName.GetChar( nStart );
|
|
}
|
|
return aBuf;
|
|
}
|
|
|
|
struct GroupUserData
|
|
{
|
|
String sGroupName;
|
|
sal_uInt16 nPathIdx;
|
|
sal_Bool bReadonly;
|
|
|
|
GroupUserData()
|
|
: nPathIdx(0),
|
|
bReadonly(sal_False) {}
|
|
};
|
|
|
|
/*------------------------------------------------------------------------
|
|
Description: dialog for new block name
|
|
------------------------------------------------------------------------*/
|
|
class SwNewGlosNameDlg : public ModalDialog
|
|
{
|
|
FixedText aNNFT;
|
|
Edit aNewName;
|
|
FixedText aNSFT;
|
|
NoSpaceEdit aNewShort;
|
|
OKButton aOk;
|
|
CancelButton aCancel;
|
|
FixedText aONFT;
|
|
Edit aOldName;
|
|
FixedText aOSFT;
|
|
Edit aOldShort;
|
|
FixedLine aFL;
|
|
|
|
protected:
|
|
DECL_LINK( Modify, Edit * );
|
|
DECL_LINK(Rename, void *);
|
|
|
|
public:
|
|
SwNewGlosNameDlg( Window* pParent,
|
|
const String& rOldName,
|
|
const String& rOldShort );
|
|
|
|
String GetNewName() const { return aNewName.GetText(); }
|
|
String GetNewShort() const { return aNewShort.GetText(); }
|
|
};
|
|
|
|
SwNewGlosNameDlg::SwNewGlosNameDlg(Window* pParent,
|
|
const String& rOldName,
|
|
const String& rOldShort ) :
|
|
ModalDialog( pParent, SW_RES( DLG_RENAME_GLOS ) ),
|
|
aNNFT (this, SW_RES( FT_NN )),
|
|
aNewName(this, SW_RES( ED_NN )),
|
|
aNSFT (this, SW_RES( FT_NS )),
|
|
aNewShort(this,SW_RES( ED_NS )),
|
|
aOk (this, SW_RES( BT_OKNEW)),
|
|
aCancel (this, SW_RES( BT_CANCEL)),
|
|
aONFT (this, SW_RES( FT_ON )),
|
|
aOldName(this, SW_RES( ED_ON )),
|
|
aOSFT (this, SW_RES( FT_OS )),
|
|
aOldShort(this,SW_RES( ED_OS )),
|
|
aFL (this, SW_RES( FL_NN ))
|
|
|
|
{
|
|
FreeResource();
|
|
aOldName.SetText( rOldName );
|
|
aOldShort.SetText( rOldShort );
|
|
aNewShort.SetMaxTextLen(SHORT_LENGTH);
|
|
aNewName.SetMaxTextLen(LONG_LENGTH);
|
|
aNewName.SetModifyHdl(LINK(this, SwNewGlosNameDlg, Modify ));
|
|
aNewShort.SetModifyHdl(LINK(this, SwNewGlosNameDlg, Modify ));
|
|
aOk.SetClickHdl(LINK(this, SwNewGlosNameDlg, Rename ));
|
|
aNewName.GrabFocus();
|
|
}
|
|
|
|
/*------------------------------------------------------------------------
|
|
Description: query / set currently set group
|
|
------------------------------------------------------------------------*/
|
|
String SwGlossaryDlg::GetCurrGroup()
|
|
{
|
|
if( ::GetCurrGlosGroup() && ::GetCurrGlosGroup()->Len() )
|
|
return *(::GetCurrGlosGroup());
|
|
return SwGlossaries::GetDefName();
|
|
}
|
|
|
|
void SwGlossaryDlg::SetActGroup(const String &rGrp)
|
|
{
|
|
if( !::GetCurrGlosGroup() )
|
|
::SetCurrGlosGroup( new String );
|
|
*(::GetCurrGlosGroup()) = rGrp;
|
|
}
|
|
|
|
SwGlossaryDlg::SwGlossaryDlg(SfxViewFrame* pViewFrame,
|
|
SwGlossaryHdl * pGlosHdl, SwWrtShell *pWrtShell) :
|
|
|
|
SvxStandardDialog(&pViewFrame->GetWindow(), SW_RES(DLG_GLOSSARY)),
|
|
|
|
aInsertTipCB (this, SW_RES(CB_INSERT_TIP)),
|
|
aNameLbl (this, SW_RES(FT_NAME)),
|
|
aNameED (this, SW_RES(ED_NAME)),
|
|
aShortNameLbl (this, SW_RES(FT_SHORTNAME)),
|
|
aShortNameEdit(this, SW_RES(ED_SHORTNAME)),
|
|
aCategoryBox (this, SW_RES(LB_BIB)),
|
|
aRelativeFL (this, SW_RES(FL_RELATIVE)),
|
|
aFileRelCB (this, SW_RES(CB_FILE_REL)),
|
|
aNetRelCB (this, SW_RES(CB_NET_REL)),
|
|
aExampleWIN (this, SW_RES(WIN_EXAMPLE )),
|
|
aExampleDummyWIN(this, SW_RES(WIN_EXAMPLE_DUMMY )),
|
|
aShowExampleCB(this, SW_RES(CB_SHOW_EXAMPLE )),
|
|
aInsertBtn (this, SW_RES(PB_INSERT)),
|
|
aCloseBtn (this, SW_RES(PB_CLOSE)),
|
|
aHelpBtn (this, SW_RES(PB_HELP)),
|
|
aEditBtn (this, SW_RES(PB_EDIT)),
|
|
aBibBtn (this, SW_RES(PB_BIB)),
|
|
aPathBtn (this, SW_RES(PB_PATH)),
|
|
|
|
sReadonlyPath (SW_RES(ST_READONLY_PATH)),
|
|
pExampleFrame(0),
|
|
|
|
pMenu (new PopupMenu(SW_RES(MNU_EDIT))),
|
|
pGlossaryHdl (pGlosHdl),
|
|
|
|
bResume(sal_False),
|
|
|
|
bSelection( pWrtShell->IsSelection() ),
|
|
bReadOnly( sal_False ),
|
|
bIsOld( sal_False ),
|
|
bIsDocReadOnly(sal_False),
|
|
|
|
pSh (pWrtShell)
|
|
{
|
|
SvtLinguConfig aLocalLinguConfig;
|
|
|
|
// initialise static-pointer
|
|
if( !::GetCurrGlosGroup() )
|
|
::SetCurrGlosGroup(new String);//(SwGlossaries::GetDefName());
|
|
|
|
pMenu->SetActivateHdl(LINK(this,SwGlossaryDlg,EnableHdl));
|
|
pMenu->SetSelectHdl(LINK(this,SwGlossaryDlg,MenuHdl));
|
|
aEditBtn.SetPopupMenu(pMenu);
|
|
aEditBtn.SetSelectHdl(LINK(this,SwGlossaryDlg,EditHdl));
|
|
aPathBtn.SetClickHdl(LINK(this, SwGlossaryDlg, PathHdl));
|
|
|
|
aNameED.SetModifyHdl(LINK(this,SwGlossaryDlg,NameModify));
|
|
aShortNameEdit.SetModifyHdl(LINK(this,SwGlossaryDlg,NameModify));
|
|
|
|
aCategoryBox.SetDoubleClickHdl(LINK(this,SwGlossaryDlg, NameDoubleClick));
|
|
aCategoryBox.SetSelectHdl(LINK(this,SwGlossaryDlg,GrpSelect));
|
|
aBibBtn.SetClickHdl(LINK(this,SwGlossaryDlg,BibHdl));
|
|
aShowExampleCB.SetClickHdl(LINK(this, SwGlossaryDlg, ShowPreviewHdl));
|
|
|
|
aShortNameEdit.SetMaxTextLen(SHORT_LENGTH);
|
|
aNameED.SetMaxTextLen(LONG_LENGTH);
|
|
FreeResource();
|
|
|
|
const SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
|
|
|
|
aShowExampleCB.Check( rCfg.IsAutoTextPreview());
|
|
ShowPreviewHdl(&aShowExampleCB);
|
|
|
|
bIsDocReadOnly = pSh->GetView().GetDocShell()->IsReadOnly() ||
|
|
pSh->HasReadonlySel();
|
|
if( bIsDocReadOnly )
|
|
aInsertBtn.Enable(sal_False);
|
|
aNameED.GrabFocus();
|
|
aCategoryBox.SetHelpId(HID_MD_GLOS_CATEGORY);
|
|
aCategoryBox.SetStyle(aCategoryBox.GetStyle()|WB_HASBUTTONS|WB_HASBUTTONSATROOT|WB_HSCROLL|WB_VSCROLL|WB_CLIPCHILDREN|WB_SORT);
|
|
aCategoryBox.GetModel()->SetSortMode(SortAscending);
|
|
aCategoryBox.SetHighlightRange(); // select over full width
|
|
aCategoryBox.SetNodeDefaultImages( );
|
|
aCategoryBox.SetAccessibleName(SW_RES(STR_ACCESS_SW_CATEGORY));
|
|
aCategoryBox.SetAccessibleRelationLabeledBy(&aInsertTipCB);
|
|
|
|
Init();
|
|
}
|
|
|
|
SwGlossaryDlg::~SwGlossaryDlg()
|
|
{
|
|
SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
|
|
rCfg.SetAutoTextPreview(aShowExampleCB.IsChecked()) ;
|
|
|
|
aCategoryBox.Clear();
|
|
aEditBtn.SetPopupMenu(0);
|
|
delete pMenu;
|
|
delete pExampleFrame;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------
|
|
Description: select new group
|
|
------------------------------------------------------------------------*/
|
|
IMPL_LINK( SwGlossaryDlg, GrpSelect, SvTreeListBox *, pBox )
|
|
{
|
|
SvLBoxEntry* pEntry = pBox->FirstSelected();
|
|
if(!pEntry)
|
|
return 0;
|
|
SvLBoxEntry* pParent = pBox->GetParent(pEntry) ? pBox->GetParent(pEntry) : pEntry;
|
|
GroupUserData* pGroupData = (GroupUserData*)pParent->GetUserData();
|
|
String *pGlosGroup = ::GetCurrGlosGroup();
|
|
(*pGlosGroup) = pGroupData->sGroupName;
|
|
(*pGlosGroup) += GLOS_DELIM;
|
|
(*pGlosGroup) += String::CreateFromInt32(pGroupData->nPathIdx);
|
|
pGlossaryHdl->SetCurGroup(*pGlosGroup);
|
|
// set current text block
|
|
bReadOnly = pGlossaryHdl->IsReadOnly();
|
|
EnableShortName( !bReadOnly );
|
|
aEditBtn.Enable(!bReadOnly);
|
|
bIsOld = pGlossaryHdl->IsOld();
|
|
if( pParent != pEntry)
|
|
{
|
|
String aName(pBox->GetEntryText(pEntry));
|
|
aNameED.SetText(aName);
|
|
aShortNameEdit.SetText(*(String*)pEntry->GetUserData());
|
|
pEntry = pBox->GetParent(pEntry);
|
|
aInsertBtn.Enable( !bIsDocReadOnly);
|
|
ShowAutoText(*::GetCurrGlosGroup(), aShortNameEdit.GetText());
|
|
}
|
|
else
|
|
ShowAutoText(aEmptyStr, aEmptyStr);
|
|
// update controls
|
|
NameModify(&aShortNameEdit);
|
|
if( SfxRequest::HasMacroRecorder( pSh->GetView().GetViewFrame() ) )
|
|
{
|
|
SfxRequest aReq( pSh->GetView().GetViewFrame(), FN_SET_ACT_GLOSSARY );
|
|
String sTemp(*::GetCurrGlosGroup());
|
|
// the zeroth path is not being recorded!
|
|
if('0' == sTemp.GetToken(1, GLOS_DELIM).GetChar(0))
|
|
sTemp = sTemp.GetToken(0, GLOS_DELIM);
|
|
aReq.AppendItem(SfxStringItem(FN_SET_ACT_GLOSSARY, sTemp));
|
|
aReq.Done();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void SwGlossaryDlg::Apply()
|
|
{
|
|
const String aGlosName(aShortNameEdit.GetText());
|
|
if(aGlosName.Len()) pGlossaryHdl->InsertGlossary(aGlosName);
|
|
if( SfxRequest::HasMacroRecorder( pSh->GetView().GetViewFrame() ) )
|
|
{
|
|
SfxRequest aReq( pSh->GetView().GetViewFrame(), FN_INSERT_GLOSSARY );
|
|
String sTemp(*::GetCurrGlosGroup());
|
|
// the zeroth path is not being recorded!
|
|
if('0' == sTemp.GetToken(1, GLOS_DELIM).GetChar(0))
|
|
sTemp = sTemp.GetToken(0, GLOS_DELIM);
|
|
aReq.AppendItem(SfxStringItem(FN_INSERT_GLOSSARY, sTemp));
|
|
aReq.AppendItem(SfxStringItem(FN_PARAM_1, aGlosName));
|
|
aReq.Done();
|
|
}
|
|
}
|
|
|
|
/* inline */ void SwGlossaryDlg::EnableShortName(sal_Bool bOn)
|
|
{
|
|
aShortNameLbl.Enable(bOn);
|
|
aShortNameEdit.Enable(bOn);
|
|
}
|
|
|
|
/* --------------------------------------------------
|
|
* does the title exist in the selected group?
|
|
* --------------------------------------------------*/
|
|
SvLBoxEntry* SwGlossaryDlg::DoesBlockExist(const String& rBlock,
|
|
const String& rShort)
|
|
{
|
|
// look for possible entry in TreeListBox
|
|
SvLBoxEntry* pEntry = aCategoryBox.FirstSelected();
|
|
if(pEntry)
|
|
{
|
|
if(aCategoryBox.GetParent(pEntry))
|
|
pEntry = aCategoryBox.GetParent(pEntry);
|
|
sal_uInt32 nChildCount = aCategoryBox.GetChildCount( pEntry );
|
|
for(sal_uInt32 i = 0; i < nChildCount; i++)
|
|
{
|
|
SvLBoxEntry* pChild = aCategoryBox.GetEntry( pEntry, i );
|
|
if(rBlock == aCategoryBox.GetEntryText(pChild) &&
|
|
(!rShort.Len() || rShort == *(String*)pChild->GetUserData()))
|
|
{
|
|
return pChild;
|
|
}
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
IMPL_LINK( SwGlossaryDlg, NameModify, Edit *, pEdit )
|
|
{
|
|
String aName(aNameED.GetText());
|
|
sal_Bool bNameED = pEdit == &aNameED;
|
|
if( !aName.Len() )
|
|
{
|
|
if(bNameED)
|
|
aShortNameEdit.SetText(aName);
|
|
aInsertBtn.Enable(sal_False);
|
|
return 0;
|
|
}
|
|
String sShortSearch;
|
|
if(!bNameED)
|
|
sShortSearch = pEdit->GetText();
|
|
sal_Bool bNotFound = !DoesBlockExist(aName, sShortSearch);
|
|
if(bNameED)
|
|
{
|
|
// did the text get in to the Listbbox in the Edit with a click?
|
|
if(bNotFound)
|
|
{
|
|
aShortNameEdit.SetText( lcl_GetValidShortCut( aName ) );
|
|
EnableShortName();
|
|
}
|
|
else
|
|
{
|
|
aShortNameEdit.SetText(pGlossaryHdl->GetGlossaryShortName(aName));
|
|
EnableShortName(!bReadOnly);
|
|
}
|
|
aInsertBtn.Enable(!bNotFound && !bIsDocReadOnly);
|
|
}
|
|
else
|
|
{
|
|
//ShortNameEdit
|
|
if(!bNotFound)
|
|
{
|
|
sal_Bool bEnable = !bNotFound;
|
|
bEnable &= !bIsDocReadOnly;
|
|
aInsertBtn.Enable(bEnable);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
IMPL_LINK_INLINE_START( SwGlossaryDlg, NameDoubleClick, SvTreeListBox*, pBox )
|
|
{
|
|
SvLBoxEntry* pEntry = pBox->FirstSelected();
|
|
if(pBox->GetParent(pEntry) && !bIsDocReadOnly)
|
|
EndDialog( RET_OK );
|
|
return 0;
|
|
}
|
|
IMPL_LINK_INLINE_END( SwGlossaryDlg, NameDoubleClick, SvTreeListBox*, pBox )
|
|
|
|
IMPL_LINK( SwGlossaryDlg, EnableHdl, Menu *, pMn )
|
|
{
|
|
SvLBoxEntry* pEntry = aCategoryBox.FirstSelected();
|
|
|
|
const String aEditText(aNameED.GetText());
|
|
const sal_Bool bHasEntry = aEditText.Len() && aShortNameEdit.GetText().Len();
|
|
const sal_Bool bExists = 0 != DoesBlockExist(aEditText, aShortNameEdit.GetText());
|
|
const sal_Bool bIsGroup = pEntry && !aCategoryBox.GetParent(pEntry);
|
|
pMn->EnableItem(FN_GL_DEFINE, bSelection && bHasEntry && !bExists);
|
|
pMn->EnableItem(FN_GL_DEFINE_TEXT, bSelection && bHasEntry && !bExists);
|
|
pMn->EnableItem(FN_GL_COPY_TO_CLIPBOARD, bExists && !bIsGroup);
|
|
pMn->EnableItem(FN_GL_REPLACE, bSelection && bExists && !bIsGroup && !bIsOld );
|
|
pMn->EnableItem(FN_GL_REPLACE_TEXT, bSelection && bExists && !bIsGroup && !bIsOld );
|
|
pMn->EnableItem(FN_GL_EDIT, bExists && !bIsGroup );
|
|
pMn->EnableItem(FN_GL_RENAME, bExists && !bIsGroup );
|
|
pMn->EnableItem(FN_GL_DELETE, bExists && !bIsGroup );
|
|
pMn->EnableItem(FN_GL_MACRO, bExists && !bIsGroup && !bIsOld &&
|
|
!pGlossaryHdl->IsReadOnly() );
|
|
pMn->EnableItem( FN_GL_IMPORT, bIsGroup && !bIsOld && !pGlossaryHdl->IsReadOnly() );
|
|
return 1;
|
|
}
|
|
|
|
IMPL_LINK( SwGlossaryDlg, MenuHdl, Menu *, pMn )
|
|
{
|
|
sal_Bool bNoAttr = sal_False;
|
|
|
|
switch(pMn->GetCurItemId())
|
|
{
|
|
case FN_GL_REPLACE:
|
|
case FN_GL_REPLACE_TEXT:
|
|
pGlossaryHdl->NewGlossary( aNameED.GetText(),
|
|
aShortNameEdit.GetText(),
|
|
sal_False,
|
|
pMn->GetCurItemId() == FN_GL_REPLACE_TEXT);
|
|
break;
|
|
case FN_GL_DEFINE_TEXT:
|
|
bNoAttr = sal_True;
|
|
// no break!!!
|
|
case FN_GL_DEFINE:
|
|
{
|
|
const String aStr(aNameED.GetText());
|
|
const String aShortName(aShortNameEdit.GetText());
|
|
if(pGlossaryHdl->HasShortName(aShortName))
|
|
{
|
|
InfoBox(this, SW_RES(MSG_DOUBLE_SHORTNAME)).Execute();
|
|
aShortNameEdit.SetSelection(Selection(0, SELECTION_MAX));
|
|
aShortNameEdit.GrabFocus();
|
|
break;
|
|
}
|
|
if(pGlossaryHdl->NewGlossary(aStr, aShortName, sal_False, bNoAttr ))
|
|
{
|
|
SvLBoxEntry* pEntry = aCategoryBox.FirstSelected();
|
|
if(aCategoryBox.GetParent(pEntry))
|
|
pEntry = aCategoryBox.GetParent(pEntry);
|
|
|
|
SvLBoxEntry* pChild = aCategoryBox.InsertEntry(aStr, pEntry);
|
|
pChild->SetUserData(new String(aShortName));
|
|
aNameED.SetText(aStr);
|
|
aShortNameEdit.SetText(aShortName);
|
|
NameModify(&aNameED); // for toggling the buttons
|
|
|
|
if( SfxRequest::HasMacroRecorder( pSh->GetView().GetViewFrame() ) )
|
|
{
|
|
SfxRequest aReq(pSh->GetView().GetViewFrame(), FN_NEW_GLOSSARY);
|
|
String sTemp(*::GetCurrGlosGroup());
|
|
// the zeroth path is not being recorded!
|
|
if('0' == sTemp.GetToken(1, GLOS_DELIM).GetChar(0))
|
|
sTemp = sTemp.GetToken(0, GLOS_DELIM);
|
|
aReq.AppendItem(SfxStringItem(FN_NEW_GLOSSARY, sTemp));
|
|
aReq.AppendItem(SfxStringItem(FN_PARAM_1, aShortName));
|
|
aReq.AppendItem(SfxStringItem(FN_PARAM_2, aStr));
|
|
aReq.Done();
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case FN_GL_COPY_TO_CLIPBOARD :
|
|
{
|
|
pGlossaryHdl->CopyToClipboard(*pSh, aShortNameEdit.GetText());
|
|
}
|
|
break;
|
|
case FN_GL_EDIT:
|
|
break;
|
|
case FN_GL_RENAME:
|
|
{
|
|
aShortNameEdit.SetText(pGlossaryHdl->GetGlossaryShortName(aNameED.GetText()));
|
|
SwNewGlosNameDlg* pNewNameDlg = new SwNewGlosNameDlg(this, aNameED.GetText(),
|
|
aShortNameEdit.GetText() );
|
|
if( RET_OK == pNewNameDlg->Execute() &&
|
|
pGlossaryHdl->Rename( aShortNameEdit.GetText(),
|
|
pNewNameDlg->GetNewShort(),
|
|
pNewNameDlg->GetNewName()))
|
|
{
|
|
SvLBoxEntry* pEntry = aCategoryBox.FirstSelected();
|
|
SvLBoxEntry* pNewEntry = aCategoryBox.InsertEntry(
|
|
pNewNameDlg->GetNewName(), aCategoryBox.GetParent(pEntry));
|
|
pNewEntry->SetUserData(new String(pNewNameDlg->GetNewShort()));
|
|
delete (String*)pEntry->GetUserData();
|
|
aCategoryBox.GetModel()->Remove(pEntry);
|
|
aCategoryBox.Select(pNewEntry);
|
|
aCategoryBox.MakeVisible(pNewEntry);
|
|
}
|
|
GrpSelect( &aCategoryBox );
|
|
delete pNewNameDlg;
|
|
}
|
|
break;
|
|
case FN_GL_DELETE:
|
|
{
|
|
QueryBox aQuery(this, SW_RES(MSG_QUERY_DELETE));
|
|
if(RET_YES == aQuery.Execute())
|
|
{
|
|
const String aShortName(aShortNameEdit.GetText());
|
|
const String aTitle(aNameED.GetText());
|
|
if(aTitle.Len() && pGlossaryHdl->DelGlossary(aShortName))
|
|
{
|
|
SvLBoxEntry* pChild = DoesBlockExist(aTitle, aShortName);
|
|
OSL_ENSURE(pChild, "entry not found!");
|
|
SvLBoxEntry* pParent = aCategoryBox.GetParent(pChild);
|
|
aCategoryBox.Select(pParent);
|
|
|
|
aCategoryBox.GetModel()->Remove(pChild);
|
|
aNameED.SetText( aEmptyStr );
|
|
NameModify(&aNameED);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case FN_GL_MACRO:
|
|
{
|
|
SfxItemSet aSet( pSh->GetAttrPool(), RES_FRMMACRO, RES_FRMMACRO, SID_EVENTCONFIG, SID_EVENTCONFIG, 0 );
|
|
|
|
SvxMacro aStart(aEmptyStr, aEmptyStr, STARBASIC);
|
|
SvxMacro aEnd(aEmptyStr, aEmptyStr, STARBASIC);
|
|
pGlossaryHdl->GetMacros(aShortNameEdit.GetText(), aStart, aEnd );
|
|
|
|
SvxMacroItem aItem(RES_FRMMACRO);
|
|
if( aStart.HasMacro() )
|
|
aItem.SetMacro( SW_EVENT_START_INS_GLOSSARY, aStart );
|
|
if( aEnd.HasMacro() )
|
|
aItem.SetMacro( SW_EVENT_END_INS_GLOSSARY, aEnd );
|
|
|
|
aSet.Put( aItem );
|
|
aSet.Put( SwMacroAssignDlg::AddEvents( MACASSGN_AUTOTEXT ) );
|
|
|
|
const SfxPoolItem* pItem;
|
|
SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
|
|
SfxAbstractDialog* pMacroDlg = pFact->CreateSfxDialog( this, aSet,
|
|
pSh->GetView().GetViewFrame()->GetFrame().GetFrameInterface(), SID_EVENTCONFIG );
|
|
if ( pMacroDlg && pMacroDlg->Execute() == RET_OK &&
|
|
SFX_ITEM_SET == pMacroDlg->GetOutputItemSet()->GetItemState( RES_FRMMACRO, sal_False, &pItem ) )
|
|
{
|
|
const SvxMacroTableDtor& rTbl = ((SvxMacroItem*)pItem)->GetMacroTable();
|
|
pGlossaryHdl->SetMacros( aShortNameEdit.GetText(),
|
|
rTbl.Get( SW_EVENT_START_INS_GLOSSARY ),
|
|
rTbl.Get( SW_EVENT_END_INS_GLOSSARY ) );
|
|
}
|
|
|
|
delete pMacroDlg;
|
|
}
|
|
break;
|
|
|
|
case FN_GL_IMPORT:
|
|
{
|
|
// call the FileOpenDialog do find WinWord - Files with templates
|
|
FileDialogHelper aDlgHelper( TemplateDescription::FILEOPEN_SIMPLE, 0 );
|
|
uno::Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker();
|
|
|
|
SvtPathOptions aPathOpt;
|
|
xFP->setDisplayDirectory(aPathOpt.GetWorkPath() );
|
|
|
|
uno::Reference<XFilterManager> xFltMgr(xFP, UNO_QUERY);
|
|
SfxFilterMatcher aMatcher( rtl::OUString::createFromAscii(SwDocShell::Factory().GetShortName()) );
|
|
SfxFilterMatcherIter aIter( aMatcher );
|
|
const SfxFilter* pFilter = aIter.First();
|
|
while ( pFilter )
|
|
{
|
|
if( pFilter->GetUserData() == FILTER_WW8 )
|
|
{
|
|
xFltMgr->appendFilter( pFilter->GetUIName(),
|
|
pFilter->GetWildcard().getGlob() );
|
|
xFltMgr->setCurrentFilter( pFilter->GetUIName() ) ;
|
|
}
|
|
|
|
pFilter = aIter.Next();
|
|
}
|
|
|
|
if( aDlgHelper.Execute() == ERRCODE_NONE )
|
|
{
|
|
if( pGlossaryHdl->ImportGlossaries( xFP->getFiles().getConstArray()[0] ))
|
|
Init();
|
|
else
|
|
{
|
|
InfoBox(this, SW_RES( MSG_NO_GLOSSARIES )).Execute();
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
default:
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/*--------------------------------------------------------------------
|
|
Description: dialog manage regions
|
|
--------------------------------------------------------------------*/
|
|
IMPL_LINK_NOARG(SwGlossaryDlg, BibHdl)
|
|
{
|
|
SwGlossaries* pGloss = ::GetGlossaries();
|
|
if( pGloss->IsGlosPathErr() )
|
|
pGloss->ShowError();
|
|
else
|
|
{
|
|
//check if at least one glossary path is write enabled
|
|
SvtPathOptions aPathOpt;
|
|
String sGlosPath( aPathOpt.GetAutoTextPath() );
|
|
sal_uInt16 nPaths = comphelper::string::getTokenCount(sGlosPath, ';');
|
|
sal_Bool bIsWritable = sal_False;
|
|
for(sal_uInt16 nPath = 0; nPath < nPaths; nPath++)
|
|
{
|
|
String sPath = URIHelper::SmartRel2Abs(
|
|
INetURLObject(), sGlosPath.GetToken(nPath, ';'),
|
|
URIHelper::GetMaybeFileHdl());
|
|
try
|
|
{
|
|
Content aTestContent( sPath,
|
|
uno::Reference< XCommandEnvironment >(),
|
|
comphelper::getProcessComponentContext() );
|
|
Any aAny = aTestContent.getPropertyValue( C2U("IsReadOnly") );
|
|
if(aAny.hasValue())
|
|
{
|
|
bIsWritable = !*(sal_Bool*)aAny.getValue();
|
|
}
|
|
}
|
|
catch (const Exception&)
|
|
{
|
|
}
|
|
if(bIsWritable)
|
|
break;
|
|
}
|
|
if(bIsWritable)
|
|
{
|
|
|
|
SwGlossaryGroupDlg *pDlg = new SwGlossaryGroupDlg( this, pGloss->GetPathArray(), pGlossaryHdl );
|
|
if ( RET_OK == pDlg->Execute() )
|
|
{
|
|
Init();
|
|
//if new groups were created - select one of them
|
|
String sNewGroup = pDlg->GetCreatedGroupName();
|
|
SvLBoxEntry* pEntry = aCategoryBox.First();
|
|
while(sNewGroup.Len() && pEntry)
|
|
{
|
|
if(!aCategoryBox.GetParent(pEntry))
|
|
{
|
|
GroupUserData* pGroupData = (GroupUserData*)pEntry->GetUserData();
|
|
String sGroup = pGroupData->sGroupName;
|
|
sGroup += GLOS_DELIM;
|
|
sGroup += String::CreateFromInt32(pGroupData->nPathIdx);
|
|
if(sGroup == sNewGroup)
|
|
{
|
|
aCategoryBox.Select(pEntry);
|
|
aCategoryBox.MakeVisible(pEntry);
|
|
GrpSelect(&aCategoryBox);
|
|
break;
|
|
}
|
|
}
|
|
pEntry = aCategoryBox.Next(pEntry);
|
|
}
|
|
|
|
}
|
|
delete pDlg;
|
|
}
|
|
else
|
|
{
|
|
QueryBox aBox(this, WB_YES_NO, sReadonlyPath);
|
|
if(RET_YES == aBox.Execute())
|
|
PathHdl(&aPathBtn);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------
|
|
Description: initialisation; from Ctor and after editing regions
|
|
------------------------------------------------------------------------*/
|
|
void SwGlossaryDlg::Init()
|
|
{
|
|
aCategoryBox.SetUpdateMode( sal_False );
|
|
aCategoryBox.Clear();
|
|
// display text block regions
|
|
const sal_uInt16 nCnt = pGlossaryHdl->GetGroupCnt();
|
|
SvLBoxEntry* pSelEntry = 0;
|
|
const String sSelStr(::GetCurrGlosGroup()->GetToken(0, GLOS_DELIM));
|
|
const sal_uInt16 nSelPath = static_cast< sal_uInt16 >(::GetCurrGlosGroup()->GetToken(1, GLOS_DELIM).ToInt32());
|
|
// #i66304# - "My AutoText" comes from mytexts.bau, but should be translated
|
|
const String sMyAutoTextEnglish(RTL_CONSTASCII_USTRINGPARAM("My AutoText"));
|
|
const String sMyAutoTextTranslated(SW_RESSTR(STR_MY_AUTOTEXT));
|
|
for(sal_uInt16 nId = 0; nId < nCnt; ++nId )
|
|
{
|
|
String sTitle;
|
|
String sGroupName(pGlossaryHdl->GetGroupName(nId, &sTitle));
|
|
if(!sGroupName.Len())
|
|
continue;
|
|
if(!sTitle.Len())
|
|
sTitle = sGroupName.GetToken( 0, GLOS_DELIM );
|
|
if(sTitle == sMyAutoTextEnglish)
|
|
sTitle = sMyAutoTextTranslated;
|
|
SvLBoxEntry* pEntry = aCategoryBox.InsertEntry( sTitle );
|
|
sal_uInt16 nPath = static_cast< sal_uInt16 >(sGroupName.GetToken( 1, GLOS_DELIM ).ToInt32());
|
|
|
|
GroupUserData* pData = new GroupUserData;
|
|
pData->sGroupName = sGroupName.GetToken(0, GLOS_DELIM);
|
|
pData->nPathIdx = nPath;
|
|
pData->bReadonly = pGlossaryHdl->IsReadOnly(&sGroupName);
|
|
|
|
pEntry->SetUserData(pData);
|
|
if(sSelStr == pData->sGroupName && nSelPath == nPath)
|
|
pSelEntry = pEntry;
|
|
|
|
// fill entries for the groups
|
|
{
|
|
pGlossaryHdl->SetCurGroup(sGroupName, sal_False, sal_True);
|
|
const sal_uInt16 nCount = pGlossaryHdl->GetGlossaryCnt();
|
|
for(sal_uInt16 i = 0; i < nCount; ++i)
|
|
{
|
|
String sGroupTitle(pGlossaryHdl->GetGlossaryName(i));
|
|
SvLBoxEntry* pChild = aCategoryBox.InsertEntry(
|
|
sGroupTitle, pEntry);
|
|
pChild->SetUserData(new String(pGlossaryHdl->GetGlossaryShortName(i)));
|
|
}
|
|
}
|
|
}
|
|
// set current group and display text blocks
|
|
if(!pSelEntry)
|
|
{
|
|
//find a non-readonly group
|
|
SvLBoxEntry* pSearch = aCategoryBox.First();
|
|
while(pSearch)
|
|
{
|
|
if(!aCategoryBox.GetParent(pSearch))
|
|
{
|
|
GroupUserData* pData = (GroupUserData*)pSearch->GetUserData();
|
|
if(!pData->bReadonly)
|
|
{
|
|
pSelEntry = pSearch;
|
|
break;
|
|
}
|
|
}
|
|
pSearch = aCategoryBox.Next(pSearch);
|
|
}
|
|
if(!pSelEntry)
|
|
pSelEntry = aCategoryBox.GetEntry(0);
|
|
}
|
|
if(pSelEntry)
|
|
{
|
|
aCategoryBox.Expand(pSelEntry);
|
|
aCategoryBox.Select(pSelEntry);
|
|
aCategoryBox.MakeVisible(pSelEntry);
|
|
GrpSelect(&aCategoryBox);
|
|
}
|
|
//JP 16.11.99: the SvxTreeListBox has a Bug. The Box dont recalc the
|
|
// outputsize, when all entries are insertet. The result is, that
|
|
// the Focus/Highlight rectangle is to large and paintet over the
|
|
// HScrollbar. -> Fix: call the resize
|
|
aCategoryBox.Resize();
|
|
|
|
aCategoryBox.GetModel()->Resort();
|
|
aCategoryBox.SetUpdateMode( sal_True );
|
|
aCategoryBox.Update();
|
|
|
|
const SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
|
|
aFileRelCB.Check( rCfg.IsSaveRelFile() );
|
|
aFileRelCB.SetClickHdl(LINK(this, SwGlossaryDlg, CheckBoxHdl));
|
|
aNetRelCB.Check( rCfg.IsSaveRelNet() );
|
|
aNetRelCB.SetClickHdl(LINK(this, SwGlossaryDlg, CheckBoxHdl));
|
|
aInsertTipCB.Check( rCfg.IsAutoTextTip() );
|
|
aInsertTipCB.SetClickHdl(LINK(this, SwGlossaryDlg, CheckBoxHdl));
|
|
}
|
|
|
|
IMPL_LINK_NOARG_INLINE_START(SwGlossaryDlg, EditHdl)
|
|
{
|
|
// EndDialog must not be called in MenuHdl
|
|
if(aEditBtn.GetCurItemId() == FN_GL_EDIT )
|
|
{
|
|
SwTextBlocks *pGroup = ::GetGlossaries()->GetGroupDoc ( GetCurrGrpName () );
|
|
sal_Bool bRet = pGlossaryHdl->ConvertToNew ( *pGroup );
|
|
delete pGroup;
|
|
if ( bRet )
|
|
EndDialog(RET_EDIT);
|
|
}
|
|
return 0;
|
|
}
|
|
IMPL_LINK_NOARG_INLINE_END(SwGlossaryDlg, EditHdl)
|
|
|
|
/*------------------------------------------------------------------------
|
|
Description: KeyInput for ShortName - Edits without Spaces
|
|
------------------------------------------------------------------------*/
|
|
IMPL_LINK( SwNewGlosNameDlg, Modify, Edit *, pBox )
|
|
{
|
|
String aName(aNewName.GetText());
|
|
SwGlossaryDlg* pDlg = (SwGlossaryDlg*)GetParent();
|
|
|
|
if( pBox == &aNewName )
|
|
aNewShort.SetText( lcl_GetValidShortCut( aName ) );
|
|
|
|
sal_Bool bEnable = aName.Len() && aNewShort.GetText().Len() &&
|
|
(!pDlg->DoesBlockExist(aName, aNewShort.GetText())
|
|
|| aName == aOldName.GetText());
|
|
aOk.Enable(bEnable);
|
|
return 0;
|
|
}
|
|
|
|
IMPL_LINK_NOARG(SwNewGlosNameDlg, Rename)
|
|
{
|
|
SwGlossaryDlg* pDlg = (SwGlossaryDlg*)GetParent();
|
|
String sNew = GetAppCharClass().uppercase(aNewShort.GetText());
|
|
if( pDlg->pGlossaryHdl->HasShortName(aNewShort.GetText())
|
|
&& sNew != aOldShort.GetText() )
|
|
{
|
|
InfoBox(this, SW_RES(MSG_DOUBLE_SHORTNAME)).Execute();
|
|
aNewShort.GrabFocus();
|
|
}
|
|
else
|
|
EndDialog(sal_True);
|
|
return 0;
|
|
}
|
|
|
|
IMPL_LINK( SwGlossaryDlg, CheckBoxHdl, CheckBox *, pBox )
|
|
{
|
|
SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
|
|
sal_Bool bCheck = pBox->IsChecked();
|
|
if( pBox == &aInsertTipCB )
|
|
rCfg.SetAutoTextTip(bCheck);
|
|
else if(pBox == &aFileRelCB)
|
|
rCfg.SetSaveRelFile(bCheck);
|
|
else
|
|
rCfg.SetSaveRelNet(bCheck);
|
|
return 0;
|
|
}
|
|
|
|
/* --------------------------------------------------
|
|
* TreeListBox for groups and blocks
|
|
* --------------------------------------------------*/
|
|
SwGlTreeListBox::SwGlTreeListBox(Window* pParent, const ResId& rResId) :
|
|
SvTreeListBox(pParent, rResId),
|
|
sReadonly (SW_RES(ST_READONLY)),
|
|
pDragEntry(0)
|
|
{
|
|
FreeResource();
|
|
SetDragDropMode( SV_DRAGDROP_CTRL_MOVE|SV_DRAGDROP_CTRL_COPY );
|
|
}
|
|
|
|
void SwGlTreeListBox::Clear()
|
|
{
|
|
SvLBoxEntry* pEntry = First();
|
|
while(pEntry)
|
|
{
|
|
if(GetParent(pEntry))
|
|
delete (String*)pEntry->GetUserData();
|
|
else
|
|
delete (GroupUserData*)pEntry->GetUserData();
|
|
pEntry = Next(pEntry);
|
|
}
|
|
SvTreeListBox::Clear();
|
|
}
|
|
|
|
void SwGlTreeListBox::RequestHelp( const HelpEvent& rHEvt )
|
|
{
|
|
Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ));
|
|
SvLBoxEntry* pEntry = GetEntry( aPos );
|
|
// there's only help for groups' names
|
|
if(pEntry)
|
|
{
|
|
SvLBoxTab* pTab;
|
|
SvLBoxItem* pItem = GetItem( pEntry, aPos.X(), &pTab );
|
|
if(pItem)
|
|
{
|
|
aPos = GetEntryPosition( pEntry );
|
|
Size aSize(pItem->GetSize( this, pEntry ));
|
|
aPos.X() = GetTabPos( pEntry, pTab );
|
|
|
|
if((aPos.X() + aSize.Width()) > GetSizePixel().Width())
|
|
aSize.Width() = GetSizePixel().Width() - aPos.X();
|
|
aPos = OutputToScreenPixel(aPos);
|
|
Rectangle aItemRect( aPos, aSize );
|
|
String sMsg;
|
|
if(!GetParent(pEntry))
|
|
{
|
|
GroupUserData* pData = (GroupUserData*)pEntry->GetUserData();
|
|
const std::vector<String> & rPathArr = ::GetGlossaries()->GetPathArray();
|
|
if( !rPathArr.empty() )
|
|
{
|
|
sMsg = rPathArr[pData->nPathIdx];
|
|
sMsg += INET_PATH_TOKEN;
|
|
sMsg += pData->sGroupName;
|
|
sMsg += SwGlossaries::GetExtension();
|
|
INetURLObject aTmp(sMsg);
|
|
sMsg = aTmp.GetPath();
|
|
|
|
if(pData->bReadonly)
|
|
{
|
|
sMsg += ' ';
|
|
sMsg += '(';
|
|
sMsg += sReadonly;
|
|
sMsg += ')';
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
else
|
|
sMsg = *(String*)pEntry->GetUserData();
|
|
Help::ShowQuickHelp( this, aItemRect, sMsg,
|
|
QUICKHELP_LEFT|QUICKHELP_VCENTER );
|
|
}
|
|
}
|
|
}
|
|
|
|
DragDropMode SwGlTreeListBox::NotifyStartDrag(
|
|
TransferDataContainer& /*rContainer*/,
|
|
SvLBoxEntry* pEntry )
|
|
{
|
|
DragDropMode eRet;
|
|
pDragEntry = pEntry;
|
|
if(!GetParent(pEntry))
|
|
eRet = SV_DRAGDROP_NONE;
|
|
else
|
|
{
|
|
SwGlossaryDlg* pDlg = (SwGlossaryDlg*)Window::GetParent();
|
|
SvLBoxEntry* pParent = GetParent(pEntry);
|
|
|
|
GroupUserData* pGroupData = (GroupUserData*)pParent->GetUserData();
|
|
String sEntry(pGroupData->sGroupName);
|
|
sEntry += GLOS_DELIM;
|
|
sEntry += String::CreateFromInt32(pGroupData->nPathIdx);
|
|
sal_Int8 nDragOption = DND_ACTION_COPY;
|
|
eRet = SV_DRAGDROP_CTRL_COPY;
|
|
if(!pDlg->pGlossaryHdl->IsReadOnly(&sEntry))
|
|
{
|
|
eRet |= SV_DRAGDROP_CTRL_MOVE;
|
|
nDragOption |= DND_ACTION_MOVE;
|
|
}
|
|
SetDragOptions( nDragOption );
|
|
}
|
|
return eRet;
|
|
}
|
|
|
|
sal_Bool SwGlTreeListBox::NotifyAcceptDrop( SvLBoxEntry* pEntry)
|
|
{
|
|
// TODO: Readonly - check still missing!
|
|
SvLBoxEntry* pSrcParent = GetParent(pEntry) ? GetParent(pEntry) : pEntry;
|
|
SvLBoxEntry* pDestParent =
|
|
GetParent(pDragEntry ) ? GetParent(pDragEntry ) : pDragEntry ;
|
|
return pDestParent != pSrcParent;
|
|
|
|
}
|
|
|
|
sal_Bool SwGlTreeListBox::NotifyMoving( SvLBoxEntry* pTarget,
|
|
SvLBoxEntry* pEntry,
|
|
SvLBoxEntry*& /*rpNewParent*/,
|
|
sal_uLong& /*rNewChildPos*/
|
|
)
|
|
{
|
|
pDragEntry = 0;
|
|
if(!pTarget) // move to the beginning
|
|
{
|
|
pTarget = GetEntry(0);
|
|
}
|
|
// 1. move to different groups?
|
|
// 2. allowed to write in both groups?
|
|
SvLBoxEntry* pSrcParent = GetParent(pEntry);
|
|
SvLBoxEntry* pDestParent =
|
|
GetParent(pTarget) ? GetParent(pTarget) : pTarget;
|
|
sal_Bool bRet = sal_False;
|
|
if(pDestParent != pSrcParent)
|
|
{
|
|
SwGlossaryDlg* pDlg = (SwGlossaryDlg*)Window::GetParent();
|
|
SwWait aWait( *pDlg->pSh->GetView().GetDocShell(), sal_True );
|
|
|
|
GroupUserData* pGroupData = (GroupUserData*)pSrcParent->GetUserData();
|
|
String sSourceGroup(pGroupData->sGroupName);
|
|
sSourceGroup += GLOS_DELIM;
|
|
sSourceGroup += String::CreateFromInt32(pGroupData->nPathIdx);
|
|
pDlg->pGlossaryHdl->SetCurGroup(sSourceGroup);
|
|
String sTitle(GetEntryText(pEntry));
|
|
String sShortName(*(String*)pEntry->GetUserData());
|
|
|
|
GroupUserData* pDestData = (GroupUserData*)pDestParent->GetUserData();
|
|
String sDestName = pDestData->sGroupName;
|
|
sDestName += GLOS_DELIM;
|
|
sDestName += String::CreateFromInt32(pDestData->nPathIdx);
|
|
bRet = pDlg->pGlossaryHdl->CopyOrMove( sSourceGroup, sShortName,
|
|
sDestName, sTitle, sal_True );
|
|
if(bRet)
|
|
{
|
|
SvLBoxEntry* pChild = InsertEntry(sTitle, pDestParent);
|
|
pChild->SetUserData(new String(sShortName));
|
|
GetModel()->Remove(pEntry);
|
|
}
|
|
}
|
|
return sal_False; // otherwise the entry is being set automatically
|
|
}
|
|
|
|
sal_Bool SwGlTreeListBox::NotifyCopying( SvLBoxEntry* pTarget,
|
|
SvLBoxEntry* pEntry,
|
|
SvLBoxEntry*& /*rpNewParent*/,
|
|
sal_uLong& /*rNewChildPos*/
|
|
)
|
|
{
|
|
pDragEntry = 0;
|
|
// 1. move in different groups?
|
|
// 2. allowed to write to both groups?
|
|
if(!pTarget) // move to the beginning
|
|
{
|
|
pTarget = GetEntry(0);
|
|
}
|
|
SvLBoxEntry* pSrcParent = GetParent(pEntry);
|
|
SvLBoxEntry* pDestParent =
|
|
GetParent(pTarget) ? GetParent(pTarget) : pTarget;
|
|
sal_Bool bRet = sal_False;
|
|
if(pDestParent != pSrcParent)
|
|
{
|
|
SwGlossaryDlg* pDlg = (SwGlossaryDlg*)Window::GetParent();
|
|
SwWait aWait( *pDlg->pSh->GetView().GetDocShell(), sal_True );
|
|
|
|
GroupUserData* pGroupData = (GroupUserData*)pSrcParent->GetUserData();
|
|
String sSourceGroup(pGroupData->sGroupName);
|
|
sSourceGroup += GLOS_DELIM;
|
|
sSourceGroup += String::CreateFromInt32(pGroupData->nPathIdx);
|
|
|
|
pDlg->pGlossaryHdl->SetCurGroup(sSourceGroup);
|
|
String sTitle(GetEntryText(pEntry));
|
|
String sShortName(*(String*)pEntry->GetUserData());
|
|
|
|
GroupUserData* pDestData = (GroupUserData*)pDestParent->GetUserData();
|
|
String sDestName = pDestData->sGroupName;
|
|
sDestName += GLOS_DELIM;
|
|
sDestName += String::CreateFromInt32(pDestData->nPathIdx);
|
|
|
|
bRet = pDlg->pGlossaryHdl->CopyOrMove( sSourceGroup, sShortName,
|
|
sDestName, sTitle, sal_False );
|
|
if(bRet)
|
|
{
|
|
SvLBoxEntry* pChild = InsertEntry(sTitle, pDestParent);
|
|
pChild->SetUserData(new String(sShortName));
|
|
}
|
|
}
|
|
return sal_False; // otherwise the entry is being set automatically
|
|
}
|
|
|
|
String SwGlossaryDlg::GetCurrGrpName() const
|
|
{
|
|
SvLBoxEntry* pEntry = aCategoryBox.FirstSelected();
|
|
String sRet;
|
|
if(pEntry)
|
|
{
|
|
pEntry =
|
|
aCategoryBox.GetParent(pEntry) ? aCategoryBox.GetParent(pEntry) : pEntry;
|
|
GroupUserData* pGroupData = (GroupUserData*)pEntry->GetUserData();
|
|
sRet = pGroupData->sGroupName;
|
|
sRet += GLOS_DELIM;
|
|
sRet += String::CreateFromInt32(pGroupData->nPathIdx);
|
|
}
|
|
return sRet;
|
|
}
|
|
|
|
IMPL_LINK( SwGlossaryDlg, PathHdl, Button *, pBtn )
|
|
{
|
|
SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
|
|
if(pFact)
|
|
{
|
|
AbstractSvxMultiPathDialog* pDlg = pFact->CreateSvxMultiPathDialog( pBtn );
|
|
OSL_ENSURE(pDlg, "Dialogdiet fail!");
|
|
SvtPathOptions aPathOpt;
|
|
String sGlosPath( aPathOpt.GetAutoTextPath() );
|
|
pDlg->SetPath(sGlosPath);
|
|
if(RET_OK == pDlg->Execute())
|
|
{
|
|
String sTmp(pDlg->GetPath());
|
|
if(sTmp != sGlosPath)
|
|
{
|
|
aPathOpt.SetAutoTextPath( sTmp );
|
|
::GetGlossaries()->UpdateGlosPath( sal_True );
|
|
Init();
|
|
}
|
|
}
|
|
delete pDlg;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
IMPL_LINK( SwGlossaryDlg, ShowPreviewHdl, CheckBox *, pBox )
|
|
{
|
|
sal_Bool bCreated = sal_False;
|
|
if(pBox->IsChecked())
|
|
{
|
|
//create example
|
|
if(!pExampleFrame)
|
|
{
|
|
Link aLink(LINK(this, SwGlossaryDlg, PreviewLoadedHdl));
|
|
pExampleFrame = new SwOneExampleFrame( aExampleWIN,
|
|
EX_SHOW_ONLINE_LAYOUT, &aLink );
|
|
bCreated = sal_True;
|
|
}
|
|
}
|
|
|
|
sal_Bool bShow = pBox->IsChecked() && !bCreated;
|
|
aExampleWIN.Show( bShow );
|
|
aExampleDummyWIN.Show(!bShow);
|
|
if( ::GetCurrGlosGroup() )
|
|
ShowAutoText(*::GetCurrGlosGroup(), aShortNameEdit.GetText());
|
|
|
|
return 0;
|
|
};
|
|
|
|
IMPL_LINK_NOARG(SwGlossaryDlg, PreviewLoadedHdl)
|
|
{
|
|
sal_Bool bShow = aShowExampleCB.IsChecked();
|
|
aExampleWIN.Show( bShow );
|
|
aExampleDummyWIN.Show(!bShow);
|
|
ResumeShowAutoText();
|
|
return 0;
|
|
}
|
|
|
|
void SwGlossaryDlg::ShowAutoText(const String& rGroup, const String& rShortName)
|
|
{
|
|
if(aExampleWIN.IsVisible())
|
|
{
|
|
SetResumeData(rGroup, rShortName);
|
|
//try to make an Undo()
|
|
pExampleFrame->ClearDocument( sal_True );
|
|
}
|
|
}
|
|
|
|
void SwGlossaryDlg::ResumeShowAutoText()
|
|
{
|
|
String sGroup, sShortName;
|
|
if(GetResumeData(sGroup, sShortName) && aExampleWIN.IsVisible())
|
|
{
|
|
if(!_xAutoText.is())
|
|
{
|
|
uno::Reference< lang::XMultiServiceFactory >
|
|
xMgr = getProcessServiceFactory();
|
|
//now the AutoText ListBoxes have to be filled
|
|
|
|
uno::Reference< uno::XInterface > xAText = xMgr->createInstance( C2U("com.sun.star.text.AutoTextContainer") );
|
|
_xAutoText = uno::Reference< container::XNameAccess >(xAText, uno::UNO_QUERY);
|
|
}
|
|
|
|
uno::Reference< XTextCursor > & xCrsr = pExampleFrame->GetTextCursor();
|
|
if(xCrsr.is())
|
|
{
|
|
if(sShortName.Len())
|
|
{
|
|
uno::Any aGroup = _xAutoText->getByName(sGroup);
|
|
uno::Reference< XAutoTextGroup > xGroup;
|
|
OUString uShortName(sShortName);
|
|
if((aGroup >>= xGroup) && xGroup->hasByName(uShortName))
|
|
{
|
|
uno::Any aEntry(xGroup->getByName(uShortName));
|
|
uno::Reference< XAutoTextEntry > xEntry;
|
|
aEntry >>= xEntry;
|
|
uno::Reference< XTextRange > xRange(xCrsr, uno::UNO_QUERY);
|
|
xEntry->applyTo(xRange);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
ResetResumeData();
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|