blob: 921edb7a71411a58383aa9812c6c033ee7d259b8 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sw.hxx"
#include <hintids.hxx>
#include <editeng/wghtitem.hxx>
#include <editeng/adjitem.hxx>
#ifndef __RSC //autogen
#include <tools/errinf.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#ifndef _MSGBOX_HXX //autogen
#include <vcl/msgbox.hxx>
#endif
#include <svl/macitem.hxx>
#include <sfx2/fcontnr.hxx>
#include <sfx2/docfile.hxx>
#define _SVSTDARR_STRINGS
#include <svl/svstdarr.hxx>
#include <svl/urihelper.hxx>
#include <unotools/transliterationwrapper.hxx>
#include <poolfmt.hxx>
#include <fmtcol.hxx>
#include <docary.hxx>
#include <wrtsh.hxx>
#include <uitool.hxx> // Fehlermeldungen
#include <view.hxx>
#include <swevent.hxx>
#include <gloshdl.hxx>
#include <glosdoc.hxx>
#include <shellio.hxx>
#include <swundo.hxx> // fuer Undo-Ids
#include <expfld.hxx>
#include <initui.hxx> // fuer ::GetGlossaries()
#include <gloslst.hxx>
#include <swdtflvr.hxx>
#ifndef _DOCSH_HXX
#include <docsh.hxx>
#endif
#include <crsskip.hxx>
#ifndef _DOCHDL_HRC
#include <dochdl.hrc>
#endif
#ifndef _SWERROR_H
#include <swerror.h>
#endif
#include <frmmgr.hxx>
#ifndef _LSTBOX_HXX //autogen
#include <vcl/lstbox.hxx>
#endif
#include <editeng/acorrcfg.hxx>
#include "swabstdlg.hxx"
#include <misc.hrc>
#include <IDocumentFieldsAccess.hxx>
using namespace ::com::sun::star;
const short RET_EDIT = 100;
// PUBLIC METHODES -------------------------------------------------------
struct TextBlockInfo_Impl
{
String sTitle;
String sLongName;
String sGroupName;
};
typedef TextBlockInfo_Impl* TextBlockInfo_ImplPtr;
SV_DECL_PTRARR_DEL( TextBlockInfoArr, TextBlockInfo_ImplPtr, 0, 4 )
SV_IMPL_PTRARR( TextBlockInfoArr, TextBlockInfo_ImplPtr )
SV_IMPL_REF( SwDocShell )
/*------------------------------------------------------------------------
Beschreibung: Dialog fuer Bearbeiten Vorlagen
------------------------------------------------------------------------*/
void SwGlossaryHdl::GlossaryDlg()
{
SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "Dialogdiet fail!");
AbstractGlossaryDlg* pDlg = pFact->CreateGlossaryDlg( DLG_RENAME_GLOS,
pViewFrame, this, pWrtShell);
DBG_ASSERT(pDlg, "Dialogdiet fail!");
String sName, sShortName;
if( RET_EDIT == pDlg->Execute() )
{
sName = pDlg->GetCurrGrpName();
sShortName = pDlg->GetCurrShortName();
}
delete pDlg;
DELETEZ(pCurGrp);
if(HasGlossaryList())
{
GetGlossaryList()->ClearGroups();
}
if( sName.Len() || sShortName.Len() )
rStatGlossaries.EditGroupDoc( sName, sShortName );
}
/*------------------------------------------------------------------------
Beschreibung: Setzen der aktuellen Gruppe; falls aus dem Dialog
gerufen, wird die Gruppe temp. erzeugt fuer einen
schnelleren Zugriff
------------------------------------------------------------------------*/
void SwGlossaryHdl::SetCurGroup(const String &rGrp, sal_Bool bApi, sal_Bool bAlwaysCreateNew )
{
String sGroup(rGrp);
if(STRING_NOTFOUND == sGroup.Search(GLOS_DELIM) && !FindGroupName(sGroup))
{
sGroup += GLOS_DELIM;
sGroup += '0';
}
if(pCurGrp)
{
sal_Bool bPathEqual = sal_False;
if(!bAlwaysCreateNew)
{
INetURLObject aTemp( pCurGrp->GetFileName() );
String sCurBase = aTemp.getBase();
aTemp.removeSegment();
const String sCurEntryPath = aTemp.GetMainURL(INetURLObject::NO_DECODE);
const SvStrings* pPathArr = rStatGlossaries.GetPathArray();
sal_uInt16 nCurrentPath = USHRT_MAX;
for(sal_uInt16 nPath = 0; nPath < pPathArr->Count(); nPath++)
{
if(sCurEntryPath == *(*pPathArr)[nPath])
{
nCurrentPath = nPath;
break;
}
}
String sPath = sGroup.GetToken(1, GLOS_DELIM);
sal_uInt16 nComparePath = (sal_uInt16)sPath.ToInt32();
if(nCurrentPath == nComparePath &&
sGroup.GetToken(0, GLOS_DELIM) == sCurBase)
bPathEqual = sal_True;
}
// const String aMac_Tmp(pCurGrp->GetName());
// Beim Pfadwechsel kann man sich auf den Namen nicht verlassen
if(!bAlwaysCreateNew &&
bPathEqual
// aMac_Tmp == sGroup
)
return;
}
aCurGrp = sGroup;
if(!bApi)
{
if(pCurGrp)
{
rStatGlossaries.PutGroupDoc(pCurGrp);
pCurGrp = 0;
}
pCurGrp = rStatGlossaries.GetGroupDoc(aCurGrp, sal_True);
}
}
/*------------------------------------------------------------------------
Beschreibung:
------------------------------------------------------------------------*/
sal_uInt16 SwGlossaryHdl::GetGroupCnt() const
{
return rStatGlossaries.GetGroupCnt();
}
/*------------------------------------------------------------------------
Beschreibung:
------------------------------------------------------------------------*/
String SwGlossaryHdl::GetGroupName( sal_uInt16 nId, String* pTitle )
{
String sRet = rStatGlossaries.GetGroupName(nId);
if(pTitle)
{
SwTextBlocks* pGroup = rStatGlossaries.GetGroupDoc(sRet, sal_False);
if(pGroup && !pGroup->GetError())
{
*pTitle = pGroup->GetName();
if(!pTitle->Len())
{
*pTitle = sRet.GetToken(0, GLOS_DELIM);
pGroup->SetName(*pTitle);
}
rStatGlossaries.PutGroupDoc( pGroup );
}
else
sRet.Erase();
}
return sRet;
}
/*------------------------------------------------------------------------
Beschreibung:
------------------------------------------------------------------------*/
sal_Bool SwGlossaryHdl::NewGroup(String &rGrpName, const String& rTitle)
{
if(STRING_NOTFOUND == rGrpName.Search(GLOS_DELIM))
FindGroupName(rGrpName);
return rStatGlossaries.NewGroupDoc(rGrpName, rTitle);
}
/* -----------------23.11.98 13:10-------------------
* Umbenennen eines Textbausteins
* --------------------------------------------------*/
sal_Bool SwGlossaryHdl::RenameGroup(const String & rOld, String& rNew, const String& rNewTitle)
{
sal_Bool bRet = sal_False;
String sOldGroup(rOld);
if(STRING_NOTFOUND == rOld.Search(GLOS_DELIM))
FindGroupName(sOldGroup);
if(rOld == rNew)
{
SwTextBlocks* pGroup = rStatGlossaries.GetGroupDoc(sOldGroup, sal_False);
if(pGroup)
{
pGroup->SetName(rNewTitle);
rStatGlossaries.PutGroupDoc( pGroup );
bRet = sal_True;
}
}
else
{
String sNewGroup(rNew);
if(STRING_NOTFOUND == sNewGroup.Search(GLOS_DELIM))
{
sNewGroup += GLOS_DELIM;
sNewGroup += '0';
}
bRet = rStatGlossaries.RenameGroupDoc(sOldGroup, sNewGroup, rNewTitle);
rNew = sNewGroup;
}
return bRet;
}
/* -----------------27.11.98 13:49-------------------
*
* --------------------------------------------------*/
sal_Bool SwGlossaryHdl::CopyOrMove( const String& rSourceGroupName, String& rSourceShortName,
const String& rDestGroupName, const String& rLongName, sal_Bool bMove )
{
SwTextBlocks* pSourceGroup = rStatGlossaries.GetGroupDoc(rSourceGroupName, sal_False);
SwTextBlocks* pDestGroup = rStatGlossaries.GetGroupDoc(rDestGroupName, sal_False);
if(pDestGroup->IsReadOnly() || (bMove && pSourceGroup->IsReadOnly()) )
return sal_False;
/*if(pDestGroup->IsOld()&& 0!= pDestGroup->ConvertToNew())
return sal_False;
if(bMove && pSourceGroup->IsOld() && 0 != pSourceGroup->ConvertToNew())
return sal_False;*/
//Der Index muss hier ermittelt werden, weil rSourceShortName in CopyBlock evtl veraendert wird
sal_uInt16 nDeleteIdx = pSourceGroup->GetIndex( rSourceShortName );
DBG_ASSERT(USHRT_MAX != nDeleteIdx, "Eintrag nicht gefunden");
sal_uLong nRet = pSourceGroup->CopyBlock( *pDestGroup, rSourceShortName, rLongName );
if(!nRet && bMove)
{
// der Index muss existieren
nRet = pSourceGroup->Delete( nDeleteIdx ) ? 0 : 1;
}
rStatGlossaries.PutGroupDoc( pSourceGroup );
rStatGlossaries.PutGroupDoc( pDestGroup );
return !nRet;
}
/*------------------------------------------------------------------------
Beschreibung: Loeschen einer Textbausteindatei-Gruppe
------------------------------------------------------------------------*/
sal_Bool SwGlossaryHdl::DelGroup(const String &rGrpName)
{
String sGroup(rGrpName);
if(STRING_NOTFOUND == sGroup.Search(GLOS_DELIM))
FindGroupName(sGroup);
if( rStatGlossaries.DelGroupDoc(sGroup) )
{
if(pCurGrp)
{
const String aMac_Tmp(pCurGrp->GetName());
if(aMac_Tmp == sGroup)
DELETEZ(pCurGrp);
}
return sal_True;
}
return sal_False;
}
/*------------------------------------------------------------------------
Beschreibung: Anzahl Textbausteine erfragen
------------------------------------------------------------------------*/
sal_uInt16 SwGlossaryHdl::GetGlossaryCnt()
{
return pCurGrp ? pCurGrp->GetCount() : 0;
}
/*------------------------------------------------------------------------
Beschreibung:
------------------------------------------------------------------------*/
String SwGlossaryHdl::GetGlossaryName( sal_uInt16 nId )
{
ASSERT(nId < GetGlossaryCnt(), Textbausteinarray ueberindiziert.);
return pCurGrp->GetLongName( nId );
}
/* -----------------30.11.98 13:18-------------------
*
* --------------------------------------------------*/
String SwGlossaryHdl::GetGlossaryShortName(sal_uInt16 nId)
{
ASSERT(nId < GetGlossaryCnt(), Textbausteinarray ueberindiziert.);
return pCurGrp->GetShortName( nId );
}
/*------------------------------------------------------------------------
Beschreibung: Kurzname erfragen
------------------------------------------------------------------------*/
String SwGlossaryHdl::GetGlossaryShortName(const String &rName)
{
String sReturn;
SwTextBlocks *pTmp =
pCurGrp ? pCurGrp: rStatGlossaries.GetGroupDoc( aCurGrp, sal_False );
if(pTmp)
{
sal_uInt16 nIdx = pTmp->GetLongIndex( rName );
if( nIdx != (sal_uInt16) -1 )
sReturn = pTmp->GetShortName( nIdx );
if( !pCurGrp )
rStatGlossaries.PutGroupDoc( pTmp );
}
return sReturn;
}
/*------------------------------------------------------------------------
Beschreibung: Kuerzel fuer Textbaustein bereits verwendet?
------------------------------------------------------------------------*/
sal_Bool SwGlossaryHdl::HasShortName(const String& rShortName) const
{
SwTextBlocks *pBlock = pCurGrp ? pCurGrp
: rStatGlossaries.GetGroupDoc( aCurGrp );
sal_Bool bRet = pBlock->GetIndex( rShortName ) != (sal_uInt16) -1;
if( !pCurGrp )
rStatGlossaries.PutGroupDoc( pBlock );
return bRet;
}
/* -----------------------------20.03.01 10:52--------------------------------
---------------------------------------------------------------------------*/
sal_Bool SwGlossaryHdl::ConvertToNew(SwTextBlocks& /*rOld*/)
{
/*if( rOld.IsOld() )
{
QueryBox aAsk( pWrtShell->GetView().GetWindow(), SW_RES( MSG_UPDATE_NEW_GLOS_FMT ) );
if( aAsk.Execute() == RET_YES )
{
if( rOld.ConvertToNew() )
{
InfoBox(pWrtShell->GetView().GetWindow(), SW_RES(MSG_ERR_INSERT_GLOS)).Execute();
return sal_False;
}
}
else
return sal_False;
}*/
return sal_True;
}
/*------------------------------------------------------------------------
Beschreibung: Erzeugen eines Textbausteines
------------------------------------------------------------------------*/
sal_Bool SwGlossaryHdl::NewGlossary(const String& rName, const String& rShortName,
sal_Bool bCreateGroup, sal_Bool bNoAttr)
{
SwTextBlocks *pTmp =
pCurGrp ? pCurGrp: rStatGlossaries.GetGroupDoc( aCurGrp, bCreateGroup );
//pTmp == 0 if the AutoText path setting is wrong
if(!pTmp)
return sal_False;
if(!ConvertToNew(*pTmp))
return sal_False;
String sOnlyTxt;
String* pOnlyTxt = 0;
if( bNoAttr )
{
if( !pWrtShell->GetSelectedText( sOnlyTxt, GETSELTXT_PARABRK_TO_ONLYCR ))
return sal_False;
pOnlyTxt = &sOnlyTxt;
}
const SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get();
const sal_uInt16 nSuccess = pWrtShell->MakeGlossary( *pTmp, rName, rShortName,
pCfg->IsSaveRelFile(), pOnlyTxt );
if(nSuccess == (sal_uInt16) -1 )
{
InfoBox(pWrtShell->GetView().GetWindow(), SW_RES(MSG_ERR_INSERT_GLOS)).Execute();
}
if( !pCurGrp )
rStatGlossaries.PutGroupDoc( pTmp );
return sal_Bool( nSuccess != (sal_uInt16) -1 );
}
/*------------------------------------------------------------------------
Beschreibung: Loeschen eines Textbausteines
------------------------------------------------------------------------*/
sal_Bool SwGlossaryHdl::DelGlossary(const String &rShortName)
{
SwTextBlocks *pGlossary = pCurGrp ? pCurGrp
: rStatGlossaries.GetGroupDoc(aCurGrp);
//pTmp == 0 if the AutoText path setting is wrong
if(!pGlossary || !ConvertToNew(*pGlossary))
return sal_False;
sal_uInt16 nIdx = pGlossary->GetIndex( rShortName );
if( nIdx != (sal_uInt16) -1 )
pGlossary->Delete( nIdx );
if( !pCurGrp )
rStatGlossaries.PutGroupDoc( pGlossary );
return sal_True;
}
/*------------------------------------------------------------------------
Beschreibung: Kurzform expandieren
------------------------------------------------------------------------*/
sal_Bool SwGlossaryHdl::ExpandGlossary()
{
ASSERT(pWrtShell->CanInsert(), illegal);
SwTextBlocks *pGlossary;
SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "Dialogdiet fail!");
::GlossaryGetCurrGroup fnGetCurrGroup = pFact->GetGlossaryCurrGroupFunc( DLG_RENAME_GLOS );
DBG_ASSERT(fnGetCurrGroup, "Dialogdiet fail!");
String sGroupName( (*fnGetCurrGroup)() );
if(STRING_NOTFOUND == sGroupName.Search(GLOS_DELIM))
FindGroupName(sGroupName);
pGlossary = rStatGlossaries.GetGroupDoc(sGroupName);
String aShortName;
// bei Textselektion diese verwenden
if(pWrtShell->SwCrsrShell::HasSelection() && !pWrtShell->IsBlockMode())
{
aShortName = pWrtShell->GetSelTxt();
}
else
{
if(pWrtShell->IsAddMode())
pWrtShell->LeaveAddMode();
else if(pWrtShell->IsBlockMode())
pWrtShell->LeaveBlockMode();
else if(pWrtShell->IsExtMode())
pWrtShell->LeaveExtMode();
// Wort selektieren
pWrtShell->SelNearestWrd();
// Wort erfragen
if(pWrtShell->IsSelection())
aShortName = pWrtShell->GetSelTxt();
}
return pGlossary ? Expand( aShortName, &rStatGlossaries, pGlossary ) : sal_False;
}
sal_Bool SwGlossaryHdl::Expand( const String& rShortName,
SwGlossaries *pGlossaries,
SwTextBlocks *pGlossary )
{
TextBlockInfoArr aFoundArr;
String aShortName( rShortName );
sal_Bool bCancel = sal_False;
// search for text block
//#b6633427# - don't prefer current group depending on configuration setting
const SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get();
sal_uInt16 nFound = !pCfg->IsSearchInAllCategories() ? pGlossary->GetIndex( aShortName ) : -1;
// if not found then search in all groups
if( nFound == (sal_uInt16) -1 )
{
const ::utl::TransliterationWrapper& rSCmp = GetAppCmpStrIgnore();
SwGlossaryList* pGlossaryList = ::GetGlossaryList();
sal_uInt16 nGroupCount = pGlossaryList->GetGroupCount();
for(sal_uInt16 i = 1; i <= nGroupCount; i++)
{
// Gruppenname mit Pfad-Extension besorgen
String sTitle;
String sGroupName = pGlossaryList->GetGroupName(i - 1, sal_False, &sTitle);
if(sGroupName == pGlossary->GetName())
continue;
sal_uInt16 nBlockCount = pGlossaryList->GetBlockCount(i -1);
if(nBlockCount)
{
for(sal_uInt16 j = 0; j < nBlockCount; j++)
{
String sEntry;
String sLongName(pGlossaryList->GetBlockName(i - 1, j, sEntry));
if( rSCmp.isEqual( rShortName, sEntry ))
{
TextBlockInfo_Impl* pData = new TextBlockInfo_Impl;
pData->sTitle = sTitle;
pData->sLongName = sLongName;
pData->sGroupName = sGroupName;
aFoundArr.Insert(pData, aFoundArr.Count());
}
}
}
}
if( aFoundArr.Count() ) // einer wurde gefunden
{
pGlossaries->PutGroupDoc(pGlossary);
if(1 == aFoundArr.Count())
{
TextBlockInfo_Impl* pData = aFoundArr.GetObject(0);
pGlossary = (SwTextBlocks *)pGlossaries->GetGroupDoc(pData->sGroupName);
nFound = pGlossary->GetIndex( aShortName );
}
else
{
SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
AbstarctSwSelGlossaryDlg* pDlg = pFact->CreateSwSelGlossaryDlg( 0, aShortName, DLG_SEL_GLOS );
DBG_ASSERT(pDlg, "Dialogdiet fail!");
for(sal_uInt16 i = 0; i < aFoundArr.Count(); ++i)
{
TextBlockInfo_Impl* pData = aFoundArr.GetObject(i);
pDlg->InsertGlos(pData->sTitle, pData->sLongName);
}
pDlg->SelectEntryPos(0);
const sal_uInt16 nRet = RET_OK == pDlg->Execute()?
pDlg->GetSelectedIdx():
LISTBOX_ENTRY_NOTFOUND;
delete pDlg;
if(LISTBOX_ENTRY_NOTFOUND != nRet)
{
TextBlockInfo_Impl* pData = aFoundArr.GetObject(nRet);
pGlossary = (SwTextBlocks *)pGlossaries->GetGroupDoc(pData->sGroupName);
nFound = pGlossary->GetIndex( aShortName );
}
else
{
nFound = (sal_uInt16) -1;
bCancel = sal_True;
}
}
}
}
// nicht gefunden
if( nFound == (sal_uInt16) -1 )
{
if( !bCancel )
{
pGlossaries->PutGroupDoc(pGlossary);
const sal_uInt16 nMaxLen = 50;
if(pWrtShell->IsSelection() && aShortName.Len() > nMaxLen)
{
aShortName.Erase(nMaxLen);
aShortName.AppendAscii(" ...");
}
String aTmp( SW_RES(STR_NOGLOS));
aTmp.SearchAndReplaceAscii("%1", aShortName);
InfoBox( pWrtShell->GetView().GetWindow(), aTmp ).Execute();
}
return sal_False;
}
else
{
String aLongName = pGlossary->GetLongName( nFound );
SvxMacro aStartMacro(aEmptyStr, aEmptyStr, STARBASIC);
SvxMacro aEndMacro(aEmptyStr, aEmptyStr, STARBASIC);
GetMacros( aShortName, aStartMacro, aEndMacro, pGlossary );
// StartAction darf nich vor HasSelection und DelRight stehen,
// sonst wird der moeglich Shellwechsel verzoegert und
// API-Programme wuerden dann haengenbleiben
// ausserdem darf das Ereignismacro ebenfalls nicht in einer Action gerufen werden
pWrtShell->StartUndo(UNDO_INSGLOSSARY);
if( aStartMacro.GetMacName().Len() )
pWrtShell->ExecMacro( aStartMacro );
if(pWrtShell->HasSelection())
pWrtShell->DelLeft();
pWrtShell->StartAllAction();
// alle InputFelder zwischenspeichern
SwInputFieldList aFldLst( pWrtShell, sal_True );
pWrtShell->InsertGlossary(*pGlossary, aShortName);
pWrtShell->EndAllAction();
if( aEndMacro.GetMacName().Len() )
{
pWrtShell->ExecMacro( aEndMacro );
}
pWrtShell->EndUndo(UNDO_INSGLOSSARY);
// fuer alle neuen InputFelder die Eingaben abfordern
if( aFldLst.BuildSortLst() )
pWrtShell->UpdateInputFlds( &aFldLst );
}
pGlossaries->PutGroupDoc(pGlossary);
return sal_True;
}
/*------------------------------------------------------------------------
Beschreibung: Textbaustein einfuegen
------------------------------------------------------------------------*/
sal_Bool SwGlossaryHdl::InsertGlossary(const String &rName)
{
ASSERT(pWrtShell->CanInsert(), illegal);
SwTextBlocks *pGlos =
pCurGrp? pCurGrp: rStatGlossaries.GetGroupDoc(aCurGrp);
if (!pGlos)
return sal_False;
SvxMacro aStartMacro(aEmptyStr, aEmptyStr, STARBASIC);
SvxMacro aEndMacro(aEmptyStr, aEmptyStr, STARBASIC);
GetMacros( rName, aStartMacro, aEndMacro, pGlos );
// StartAction darf nich vor HasSelection und DelRight stehen,
// sonst wird der moeglich Shellwechsel verzoegert und
// API-Programme wuerden dann haengenbleiben
// ausserdem darf das Ereignismacro ebenfalls nicht in einer Action gerufen werden
if( aStartMacro.GetMacName().Len() )
pWrtShell->ExecMacro( aStartMacro );
if( pWrtShell->HasSelection() )
pWrtShell->DelRight();
pWrtShell->StartAllAction();
// alle InputFelder zwischenspeichern
SwInputFieldList aFldLst( pWrtShell, sal_True );
pWrtShell->InsertGlossary(*pGlos, rName);
pWrtShell->EndAllAction();
if( aEndMacro.GetMacName().Len() )
{
pWrtShell->ExecMacro( aEndMacro );
}
// fuer alle neuen InputFelder die Eingaben abfordern
if( aFldLst.BuildSortLst() )
pWrtShell->UpdateInputFlds( &aFldLst );
if(!pCurGrp)
rStatGlossaries.PutGroupDoc(pGlos);
return sal_True;
}
/*------------------------------------------------------------------------
Beschreibung: Macro setzen / erfragen
------------------------------------------------------------------------*/
void SwGlossaryHdl::SetMacros(const String& rShortName,
const SvxMacro* pStart,
const SvxMacro* pEnd,
SwTextBlocks *pGlossary )
{
SwTextBlocks *pGlos = pGlossary ? pGlossary :
pCurGrp ? pCurGrp
: rStatGlossaries.GetGroupDoc( aCurGrp );
SvxMacroTableDtor aMacroTbl;
if( pStart )
aMacroTbl.Insert( SW_EVENT_START_INS_GLOSSARY, new SvxMacro(*pStart));
if( pEnd )
aMacroTbl.Insert( SW_EVENT_END_INS_GLOSSARY, new SvxMacro(*pEnd));
sal_uInt16 nIdx = pGlos->GetIndex( rShortName );
if( !pGlos->SetMacroTable( nIdx, aMacroTbl ) && pGlos->GetError() )
ErrorHandler::HandleError( pGlos->GetError() );
if(!pCurGrp && !pGlossary)
rStatGlossaries.PutGroupDoc(pGlos);
}
void SwGlossaryHdl::GetMacros( const String &rShortName,
SvxMacro& rStart,
SvxMacro& rEnd,
SwTextBlocks *pGlossary )
{
SwTextBlocks *pGlos = pGlossary ? pGlossary
: pCurGrp ? pCurGrp
: rStatGlossaries.GetGroupDoc(aCurGrp);
sal_uInt16 nIndex = pGlos->GetIndex( rShortName );
if( nIndex != USHRT_MAX )
{
SvxMacroTableDtor aMacroTbl;
if( pGlos->GetMacroTable( nIndex, aMacroTbl ) )
{
SvxMacro *pMacro = aMacroTbl.Get( SW_EVENT_START_INS_GLOSSARY );
if( pMacro )
rStart = *pMacro;
pMacro = aMacroTbl.Get( SW_EVENT_END_INS_GLOSSARY );
if( pMacro )
rEnd = *pMacro;
}
}
if( !pCurGrp && !pGlossary )
rStatGlossaries.PutGroupDoc( pGlos );
}
/*------------------------------------------------------------------------
Beschreibung: ctor, dtor
------------------------------------------------------------------------*/
SwGlossaryHdl::SwGlossaryHdl(SfxViewFrame* pVwFrm, SwWrtShell *pSh)
: rStatGlossaries( *::GetGlossaries() ),
aCurGrp( rStatGlossaries.GetDefName() ),
pViewFrame( pVwFrm ),
pWrtShell( pSh ),
pCurGrp( 0 )
{
}
SwGlossaryHdl::~SwGlossaryHdl()
{
if( pCurGrp )
rStatGlossaries.PutGroupDoc( pCurGrp );
}
/*------------------------------------------------------------------------
Beschreibung: Umbenennen eines Textbausteines
------------------------------------------------------------------------*/
sal_Bool SwGlossaryHdl::Rename(const String& rOldShort, const String& rNewShortName,
const String& rNewName )
{
sal_Bool bRet = sal_False;
SwTextBlocks *pGlossary = pCurGrp ? pCurGrp
: rStatGlossaries.GetGroupDoc(aCurGrp);
if(pGlossary)
{
if(!ConvertToNew(*pGlossary))
return sal_False;
sal_uInt16 nIdx = pGlossary->GetIndex( rOldShort );
sal_uInt16 nOldLongIdx = pGlossary->GetLongIndex( rNewName );
sal_uInt16 nOldIdx = pGlossary->GetIndex( rNewShortName );
if( nIdx != USHRT_MAX &&
(nOldLongIdx == USHRT_MAX || nOldLongIdx == nIdx )&&
(nOldIdx == USHRT_MAX || nOldIdx == nIdx ))
{
String aNewShort( rNewShortName );
String aNewName( rNewName );
pGlossary->Rename( nIdx, &aNewShort, &aNewName );
bRet = pGlossary->GetError() == 0;
}
if( !pCurGrp )
rStatGlossaries.PutGroupDoc(pGlossary);
}
return bRet;
}
sal_Bool SwGlossaryHdl::IsReadOnly( const String* pGrpNm ) const
{
SwTextBlocks *pGlossary = 0;
if (pGrpNm)
pGlossary = rStatGlossaries.GetGroupDoc( *pGrpNm );
else if (pCurGrp)
pGlossary = pCurGrp;
else
pGlossary = rStatGlossaries.GetGroupDoc(aCurGrp);
sal_Bool bRet = pGlossary ? pGlossary->IsReadOnly() : sal_True;
if( pGrpNm || !pCurGrp )
delete pGlossary;
return bRet;
}
sal_Bool SwGlossaryHdl::IsOld() const
{
SwTextBlocks *pGlossary = pCurGrp ? pCurGrp
: rStatGlossaries.GetGroupDoc(aCurGrp);
sal_Bool bRet = pGlossary ? pGlossary->IsOld() : sal_False;
if( !pCurGrp )
delete pGlossary;
return bRet;
}
/*-----------------09.06.97 16:15-------------------
Gruppe ohne Pfadindex finden
--------------------------------------------------*/
sal_Bool SwGlossaryHdl::FindGroupName(String & rGroup)
{
return rStatGlossaries.FindGroupName(rGroup);
}
/* -----------------29.07.99 08:34-------------------
--------------------------------------------------*/
sal_Bool SwGlossaryHdl::CopyToClipboard(SwWrtShell& rSh, const String& rShortName)
{
SwTextBlocks *pGlossary = pCurGrp ? pCurGrp
: rStatGlossaries.GetGroupDoc(aCurGrp);
SwTransferable* pTransfer = new SwTransferable( rSh );
/*??*/uno::Reference<
datatransfer::XTransferable > xRef( pTransfer );
int nRet = pTransfer->CopyGlossary( *pGlossary, rShortName );
if( !pCurGrp )
rStatGlossaries.PutGroupDoc( pGlossary );
return 0 != nRet;
}
sal_Bool SwGlossaryHdl::ImportGlossaries( const String& rName )
{
sal_Bool bRet = sal_False;
if( rName.Len() )
{
const SfxFilter* pFilter = 0;
SfxMedium* pMed = new SfxMedium( rName, STREAM_READ, sal_True, 0, 0 );
SfxFilterMatcher aMatcher( String::CreateFromAscii("swriter") );
pMed->UseInteractionHandler( sal_True );
if( !aMatcher.GuessFilter( *pMed, &pFilter, sal_False ) )
{
SwTextBlocks *pGlossary;
pMed->SetFilter( pFilter );
Reader* pR = SwReaderWriter::GetReader( pFilter->GetUserData() );
if( pR && 0 != ( pGlossary = pCurGrp ? pCurGrp
: rStatGlossaries.GetGroupDoc(aCurGrp)) )
{
SwReader aReader( *pMed, rName );
if( aReader.HasGlossaries( *pR ) )
{
const SvxAutoCorrCfg* pCfg = SvxAutoCorrCfg::Get();
bRet = aReader.ReadGlossaries( *pR, *pGlossary,
pCfg->IsSaveRelFile() );
}
}
}
DELETEZ(pMed);
}
return bRet;
}