LCOV - code coverage report
Current view: top level - sw/source/uibase/dochdl - gloshdl.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 17 381 4.5 %
Date: 2014-11-03 Functions: 5 33 15.2 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <hintids.hxx>
      21             : #include <editeng/wghtitem.hxx>
      22             : #include <editeng/adjustitem.hxx>
      23             : #ifndef __RSC //autogen
      24             : #include <tools/errinf.hxx>
      25             : #endif
      26             : #include <vcl/msgbox.hxx>
      27             : #include <svl/macitem.hxx>
      28             : #include <sfx2/fcontnr.hxx>
      29             : #include <sfx2/docfile.hxx>
      30             : #include <svl/urihelper.hxx>
      31             : #include <unotools/transliterationwrapper.hxx>
      32             : #include <poolfmt.hxx>
      33             : #include <fmtcol.hxx>
      34             : #include <docary.hxx>
      35             : #include <wrtsh.hxx>
      36             : #include <uitool.hxx>
      37             : #include <view.hxx>
      38             : #include <swevent.hxx>
      39             : #include <gloshdl.hxx>
      40             : #include <glosdoc.hxx>
      41             : #include <shellio.hxx>
      42             : #include <swundo.hxx>
      43             : #include <expfld.hxx>
      44             : #include <initui.hxx>
      45             : #include <gloslst.hxx>
      46             : #include <swdtflvr.hxx>
      47             : #include <docsh.hxx>
      48             : #include <crsskip.hxx>
      49             : 
      50             : #include <dochdl.hrc>
      51             : #include <swerror.h>
      52             : #include <frmmgr.hxx>
      53             : #include <vcl/layout.hxx>
      54             : #include <vcl/lstbox.hxx>
      55             : 
      56             : #include <editeng/acorrcfg.hxx>
      57             : #include "swabstdlg.hxx"
      58             : #include <misc.hrc>
      59             : 
      60             : #include <IDocumentFieldsAccess.hxx>
      61             : #include <boost/scoped_ptr.hpp>
      62             : 
      63             : using namespace ::com::sun::star;
      64             : 
      65             : const short RET_EDIT = 100;
      66             : 
      67           0 : struct TextBlockInfo_Impl
      68             : {
      69             :     OUString sTitle;
      70             :     OUString sLongName;
      71             :     OUString sGroupName;
      72             : };
      73             : typedef boost::ptr_vector<TextBlockInfo_Impl> TextBlockInfoArr;
      74             : 
      75             : // Dialog for edit templates
      76           0 : void SwGlossaryHdl::GlossaryDlg()
      77             : {
      78           0 :     SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
      79             :     assert(pFact && "Dialog creation failed!");
      80           0 :     boost::scoped_ptr<AbstractGlossaryDlg> pDlg(pFact->CreateGlossaryDlg(pViewFrame, this, pWrtShell));
      81             :     assert(pDlg && "Dialog creation failed!");
      82           0 :     OUString sName;
      83           0 :     OUString sShortName;
      84             : 
      85           0 :     if( RET_EDIT == pDlg->Execute() )
      86             :     {
      87           0 :         sName = pDlg->GetCurrGrpName();
      88           0 :         sShortName = pDlg->GetCurrShortName();
      89             :     }
      90             : 
      91           0 :     pDlg.reset();
      92           0 :     DELETEZ(pCurGrp);
      93           0 :     if(HasGlossaryList())
      94             :     {
      95           0 :         GetGlossaryList()->ClearGroups();
      96             :     }
      97             : 
      98           0 :     if( !sName.isEmpty() || !sShortName.isEmpty() )
      99           0 :         rStatGlossaries.EditGroupDoc( sName, sShortName );
     100           0 : }
     101             : 
     102             : // set the default group; if called from the dialog
     103             : // the group is created temporarily for faster access
     104           0 : void SwGlossaryHdl::SetCurGroup(const OUString &rGrp, bool bApi, bool bAlwaysCreateNew )
     105             : {
     106           0 :     OUString sGroup(rGrp);
     107           0 :     if (sGroup.indexOf(GLOS_DELIM)<0 && !FindGroupName(sGroup))
     108             :     {
     109           0 :         sGroup += OUString(GLOS_DELIM) + "0";
     110             :     }
     111           0 :     if(pCurGrp)
     112             :     {
     113           0 :         bool bPathEqual = false;
     114           0 :         if(!bAlwaysCreateNew)
     115             :         {
     116           0 :             INetURLObject aTemp( pCurGrp->GetFileName() );
     117           0 :             const OUString sCurBase = aTemp.getBase();
     118           0 :             aTemp.removeSegment();
     119           0 :             const OUString sCurEntryPath = aTemp.GetMainURL(INetURLObject::NO_DECODE);
     120           0 :             const std::vector<OUString> & rPathArr = rStatGlossaries.GetPathArray();
     121           0 :             sal_uInt16 nCurrentPath = USHRT_MAX;
     122           0 :             for (size_t nPath = 0; nPath < rPathArr.size(); ++nPath)
     123             :             {
     124           0 :                 if (sCurEntryPath == rPathArr[nPath])
     125             :                 {
     126           0 :                     nCurrentPath = static_cast<sal_uInt16>(nPath);
     127           0 :                     break;
     128             :                 }
     129             :             }
     130           0 :             const OUString sPath = sGroup.getToken(1, GLOS_DELIM);
     131           0 :             sal_uInt16 nComparePath = (sal_uInt16)sPath.toInt32();
     132           0 :             if(nCurrentPath == nComparePath &&
     133           0 :                 sGroup.getToken(0, GLOS_DELIM) == sCurBase)
     134           0 :                 bPathEqual = true;
     135             :         }
     136             : 
     137             :         // When path changed, the name is not reliable
     138           0 :         if(!bAlwaysCreateNew && bPathEqual)
     139           0 :             return;
     140             :     }
     141           0 :     aCurGrp = sGroup;
     142           0 :     if(!bApi)
     143             :     {
     144           0 :         delete pCurGrp;
     145           0 :         pCurGrp = rStatGlossaries.GetGroupDoc(aCurGrp, true);
     146           0 :     }
     147             : }
     148             : 
     149           0 : size_t SwGlossaryHdl::GetGroupCnt() const
     150             : {
     151           0 :     return rStatGlossaries.GetGroupCnt();
     152             : }
     153             : 
     154           0 : OUString SwGlossaryHdl::GetGroupName( size_t nId, OUString* pTitle )
     155             : {
     156           0 :     OUString sRet = rStatGlossaries.GetGroupName(nId);
     157           0 :     if(pTitle)
     158             :     {
     159           0 :         SwTextBlocks* pGroup = rStatGlossaries.GetGroupDoc(sRet, false);
     160           0 :         if (pGroup && !pGroup->GetError())
     161             :         {
     162           0 :             *pTitle = pGroup->GetName();
     163           0 :             if (pTitle->isEmpty())
     164             :             {
     165           0 :                 *pTitle = sRet.getToken(0, GLOS_DELIM);
     166           0 :                 pGroup->SetName(*pTitle);
     167             :             }
     168           0 :             delete pGroup;
     169             :         }
     170             :         else
     171             :         {
     172           0 :             delete pGroup;
     173           0 :             sRet = OUString();
     174             :         }
     175             :     }
     176           0 :     return sRet;
     177             : }
     178             : 
     179           0 : bool SwGlossaryHdl::NewGroup(OUString &rGrpName, const OUString& rTitle)
     180             : {
     181           0 :     if (rGrpName.indexOf(GLOS_DELIM)<0)
     182           0 :         FindGroupName(rGrpName);
     183           0 :     return rStatGlossaries.NewGroupDoc(rGrpName, rTitle);
     184             : }
     185             : 
     186           0 : bool SwGlossaryHdl::RenameGroup(const OUString& rOld, OUString& rNew, const OUString& rNewTitle)
     187             : {
     188           0 :     bool bRet = false;
     189           0 :     OUString sOldGroup(rOld);
     190           0 :     if (rOld.indexOf(GLOS_DELIM)<0)
     191           0 :         FindGroupName(sOldGroup);
     192           0 :     if(rOld == rNew)
     193             :     {
     194           0 :         SwTextBlocks* pGroup = rStatGlossaries.GetGroupDoc(sOldGroup, false);
     195           0 :         if(pGroup)
     196             :         {
     197           0 :             pGroup->SetName(rNewTitle);
     198           0 :             delete pGroup;
     199           0 :             bRet = true;
     200             :         }
     201             :     }
     202             :     else
     203             :     {
     204           0 :         OUString sNewGroup(rNew);
     205           0 :         if (sNewGroup.indexOf(GLOS_DELIM)<0)
     206             :         {
     207           0 :             sNewGroup += OUString(GLOS_DELIM) + "0";
     208             :         }
     209           0 :         bRet = rStatGlossaries.RenameGroupDoc(sOldGroup, sNewGroup, rNewTitle);
     210           0 :         rNew = sNewGroup;
     211             :     }
     212           0 :     return bRet;
     213             : }
     214             : 
     215           0 : bool SwGlossaryHdl::CopyOrMove( const OUString& rSourceGroupName, OUString& rSourceShortName,
     216             :                                 const OUString& rDestGroupName, const OUString& rLongName, bool bMove )
     217             : {
     218           0 :     SwTextBlocks* pSourceGroup = rStatGlossaries.GetGroupDoc(rSourceGroupName, false);
     219           0 :     SwTextBlocks* pDestGroup = rStatGlossaries.GetGroupDoc(rDestGroupName, false);
     220           0 :     if (pDestGroup->IsReadOnly() || (bMove && pSourceGroup->IsReadOnly()) )
     221             :     {
     222           0 :         delete pDestGroup;
     223           0 :         delete pSourceGroup;
     224           0 :         return false;
     225             :     }
     226             : 
     227             :     //The index must be determined here because rSourceShortName maybe changed in CopyBlock
     228           0 :     sal_uInt16 nDeleteIdx = pSourceGroup->GetIndex( rSourceShortName );
     229             :     OSL_ENSURE(USHRT_MAX != nDeleteIdx, "entry not found");
     230           0 :     sal_uLong nRet = pSourceGroup->CopyBlock( *pDestGroup, rSourceShortName, rLongName );
     231           0 :     if(!nRet && bMove)
     232             :     {
     233             :         // the index must be existing
     234           0 :         nRet = pSourceGroup->Delete( nDeleteIdx ) ? 0 : 1;
     235             :     }
     236           0 :     delete pSourceGroup;
     237           0 :     delete pDestGroup;
     238           0 :     return !nRet;
     239             : }
     240             : 
     241             : // delete a autotext-file-group
     242           0 : bool SwGlossaryHdl::DelGroup(const OUString &rGrpName)
     243             : {
     244           0 :     OUString sGroup(rGrpName);
     245           0 :     if (sGroup.indexOf(GLOS_DELIM)<0)
     246           0 :         FindGroupName(sGroup);
     247           0 :     if( rStatGlossaries.DelGroupDoc(sGroup) )
     248             :     {
     249           0 :         if(pCurGrp)
     250             :         {
     251           0 :             if (pCurGrp->GetName() == sGroup)
     252           0 :                 DELETEZ(pCurGrp);
     253             :         }
     254           0 :         return true;
     255             :     }
     256           0 :     return false;
     257             : }
     258             : 
     259             : // ask for number of autotexts
     260           0 : sal_uInt16 SwGlossaryHdl::GetGlossaryCnt()
     261             : {
     262           0 :     return pCurGrp ? pCurGrp->GetCount() : 0;
     263             : }
     264             : 
     265           0 : OUString SwGlossaryHdl::GetGlossaryName( sal_uInt16 nId )
     266             : {
     267             :     OSL_ENSURE(nId < GetGlossaryCnt(), "Textbausteinarray ueberindiziert.");
     268           0 :     return pCurGrp->GetLongName( nId );
     269             : }
     270             : 
     271           0 : OUString SwGlossaryHdl::GetGlossaryShortName(sal_uInt16 nId)
     272             : {
     273             :     OSL_ENSURE(nId < GetGlossaryCnt(), "Textbausteinarray ueberindiziert.");
     274           0 :     return pCurGrp->GetShortName( nId );
     275             : }
     276             : 
     277             : // ask for short name
     278           0 : OUString SwGlossaryHdl::GetGlossaryShortName(const OUString &rName)
     279             : {
     280           0 :     OUString sReturn;
     281             :     SwTextBlocks *pTmp =
     282           0 :         pCurGrp ? pCurGrp: rStatGlossaries.GetGroupDoc( aCurGrp, false );
     283           0 :     if(pTmp)
     284             :     {
     285           0 :         sal_uInt16 nIdx = pTmp->GetLongIndex( rName );
     286           0 :         if( nIdx != (sal_uInt16) -1 )
     287           0 :             sReturn = pTmp->GetShortName( nIdx );
     288           0 :         if( !pCurGrp )
     289           0 :             delete pTmp;
     290             :     }
     291           0 :     return sReturn;
     292             : }
     293             : 
     294             : // short name for autotext already used?
     295           0 : bool SwGlossaryHdl::HasShortName(const OUString& rShortName) const
     296             : {
     297             :     SwTextBlocks *pBlock = pCurGrp ? pCurGrp
     298           0 :                                    : rStatGlossaries.GetGroupDoc( aCurGrp );
     299           0 :     bool bRet = pBlock->GetIndex( rShortName ) != (sal_uInt16) -1;
     300           0 :     if( !pCurGrp )
     301           0 :         delete pBlock;
     302           0 :     return bRet;
     303             : }
     304             : 
     305           0 : bool SwGlossaryHdl::ConvertToNew(SwTextBlocks& /*rOld*/)
     306             : {
     307           0 :     return true;
     308             : }
     309             : 
     310             : // Create autotext
     311           0 : bool SwGlossaryHdl::NewGlossary(const OUString& rName, const OUString& rShortName,
     312             :                                 bool bCreateGroup, bool bNoAttr)
     313             : {
     314             :     SwTextBlocks *pTmp =
     315           0 :         pCurGrp ? pCurGrp: rStatGlossaries.GetGroupDoc( aCurGrp, bCreateGroup );
     316             :     //pTmp == 0 if the AutoText path setting is wrong
     317           0 :     if(!pTmp)
     318           0 :         return false;
     319           0 :     if(!ConvertToNew(*pTmp))
     320           0 :         return false;
     321             : 
     322           0 :     OUString sOnlyTxt;
     323           0 :     OUString* pOnlyTxt = 0;
     324           0 :     if( bNoAttr )
     325             :     {
     326           0 :         if( !pWrtShell->GetSelectedText( sOnlyTxt, GETSELTXT_PARABRK_TO_ONLYCR ))
     327           0 :             return false;
     328           0 :         pOnlyTxt = &sOnlyTxt;
     329             :     }
     330             : 
     331           0 :     const SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
     332             : 
     333             :     const sal_uInt16 nSuccess = pWrtShell->MakeGlossary( *pTmp, rName, rShortName,
     334           0 :                             rCfg.IsSaveRelFile(), pOnlyTxt );
     335           0 :     if(nSuccess == (sal_uInt16) -1 )
     336             :     {
     337           0 :         MessageDialog(pWrtShell->GetView().GetWindow(), SW_RES(STR_ERR_INSERT_GLOS), VCL_MESSAGE_INFO).Execute();
     338             :     }
     339           0 :     if( !pCurGrp )
     340           0 :         delete pTmp;
     341           0 :     return nSuccess != (sal_uInt16) -1;
     342             : }
     343             : 
     344             : // Delete a autotext
     345           0 : bool SwGlossaryHdl::DelGlossary(const OUString &rShortName)
     346             : {
     347             :     SwTextBlocks *pGlossary = pCurGrp ? pCurGrp
     348           0 :                                     : rStatGlossaries.GetGroupDoc(aCurGrp);
     349             :     //pTmp == 0 if the AutoText path setting is wrong
     350           0 :     if(!pGlossary || !ConvertToNew(*pGlossary))
     351           0 :         return false;
     352             : 
     353           0 :     sal_uInt16 nIdx = pGlossary->GetIndex( rShortName );
     354           0 :     if( nIdx != (sal_uInt16) -1 )
     355           0 :         pGlossary->Delete( nIdx );
     356           0 :     if( !pCurGrp )
     357           0 :         delete pGlossary;
     358           0 :     return true;
     359             : }
     360             : 
     361             : // expand short name
     362           0 : bool SwGlossaryHdl::ExpandGlossary()
     363             : {
     364             :     OSL_ENSURE(pWrtShell->CanInsert(), "illegal");
     365             :     SwTextBlocks *pGlossary;
     366           0 :     SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
     367             :     assert(pFact && "Dialog creation failed!");
     368           0 :     ::GlossaryGetCurrGroup fnGetCurrGroup = pFact->GetGlossaryCurrGroupFunc();
     369             :     assert(fnGetCurrGroup && "Dialog creation failed!");
     370           0 :     OUString sGroupName( (*fnGetCurrGroup)() );
     371           0 :     if (sGroupName.indexOf(GLOS_DELIM)<0)
     372           0 :         FindGroupName(sGroupName);
     373           0 :     pGlossary = rStatGlossaries.GetGroupDoc(sGroupName);
     374             : 
     375           0 :     OUString aShortName;
     376             : 
     377             :         // use this at text selection
     378           0 :     if(pWrtShell->SwCrsrShell::HasSelection() && !pWrtShell->IsBlockMode())
     379             :     {
     380           0 :         aShortName = pWrtShell->GetSelTxt();
     381             :     }
     382             :     else
     383             :     {
     384           0 :         if(pWrtShell->IsAddMode())
     385           0 :             pWrtShell->LeaveAddMode();
     386           0 :         else if(pWrtShell->IsBlockMode())
     387           0 :             pWrtShell->LeaveBlockMode();
     388           0 :         else if(pWrtShell->IsExtMode())
     389           0 :             pWrtShell->LeaveExtMode();
     390             :         // select word
     391           0 :         pWrtShell->SelNearestWrd();
     392             :             // ask for word
     393           0 :         if(pWrtShell->IsSelection())
     394           0 :             aShortName = pWrtShell->GetSelTxt();
     395             :     }
     396           0 :     return pGlossary ? Expand( aShortName, &rStatGlossaries, pGlossary ) : sal_False;
     397             : }
     398             : 
     399           0 : bool SwGlossaryHdl::Expand( const OUString& rShortName,
     400             :                             SwGlossaries *pGlossaries,
     401             :                             SwTextBlocks *pGlossary  )
     402             : {
     403           0 :     TextBlockInfoArr aFoundArr;
     404           0 :     OUString aShortName( rShortName );
     405           0 :     bool bCancel = false;
     406             :     // search for text block
     407             :     // - don't prefer current group depending on configuration setting
     408           0 :     const SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
     409           0 :     sal_uInt16 nFound = !rCfg.IsSearchInAllCategories() ? pGlossary->GetIndex( aShortName ) : -1;
     410             :     // if not found then search in all groups
     411           0 :     if( nFound == (sal_uInt16) -1 )
     412             :     {
     413           0 :         const ::utl::TransliterationWrapper& rSCmp = GetAppCmpStrIgnore();
     414           0 :         SwGlossaryList* pGlossaryList = ::GetGlossaryList();
     415           0 :         const size_t nGroupCount = pGlossaryList->GetGroupCount();
     416           0 :         for(size_t i = 0; i < nGroupCount; ++i)
     417             :         {
     418             :             // get group name with path-extension
     419           0 :             const OUString sGroupName = pGlossaryList->GetGroupName(i, false);
     420           0 :             if(sGroupName == pGlossary->GetName())
     421           0 :                 continue;
     422           0 :             const sal_uInt16 nBlockCount = pGlossaryList->GetBlockCount(i);
     423           0 :             if(nBlockCount)
     424             :             {
     425           0 :                 const OUString sTitle = pGlossaryList->GetGroupTitle(i);
     426           0 :                 for(sal_uInt16 j = 0; j < nBlockCount; j++)
     427             :                 {
     428           0 :                     const OUString sLongName(pGlossaryList->GetBlockLongName(i, j));
     429           0 :                     const OUString sShortName(pGlossaryList->GetBlockShortName(i, j));
     430           0 :                     if( rSCmp.isEqual( rShortName, sShortName ))
     431             :                     {
     432           0 :                         TextBlockInfo_Impl* pData = new TextBlockInfo_Impl;
     433           0 :                         pData->sTitle = sTitle;
     434           0 :                         pData->sLongName = sLongName;
     435           0 :                         pData->sGroupName = sGroupName;
     436           0 :                         aFoundArr.push_back(pData);
     437             :                     }
     438           0 :                 }
     439             :             }
     440           0 :         }
     441           0 :         if( !aFoundArr.empty() )  // one was found
     442             :         {
     443           0 :             delete pGlossary;
     444           0 :             if(1 == aFoundArr.size())
     445             :             {
     446           0 :                 TextBlockInfo_Impl* pData = &aFoundArr.front();
     447           0 :                 pGlossary = (SwTextBlocks *)pGlossaries->GetGroupDoc(pData->sGroupName);
     448           0 :                 nFound = pGlossary->GetIndex( aShortName );
     449             :             }
     450             :             else
     451             :             {
     452           0 :                 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
     453             :                 assert(pFact && "SwAbstractDialogFactory fail!");
     454             : 
     455           0 :                 boost::scoped_ptr<AbstractSwSelGlossaryDlg> pDlg(pFact->CreateSwSelGlossaryDlg(0, aShortName));
     456             :                 assert(pDlg && "Dialog creation failed!");
     457           0 :                 for(sal_uInt16 i = 0; i < aFoundArr.size(); ++i)
     458             :                 {
     459           0 :                     TextBlockInfo_Impl* pData = &aFoundArr[i];
     460           0 :                     pDlg->InsertGlos(pData->sTitle, pData->sLongName);
     461             :                 }
     462           0 :                 pDlg->SelectEntryPos(0);
     463           0 :                 const sal_Int32 nRet = RET_OK == pDlg->Execute()?
     464           0 :                                         pDlg->GetSelectedIdx():
     465           0 :                                         LISTBOX_ENTRY_NOTFOUND;
     466           0 :                 pDlg.reset();
     467           0 :                 if(LISTBOX_ENTRY_NOTFOUND != nRet)
     468             :                 {
     469           0 :                     TextBlockInfo_Impl* pData = &aFoundArr[nRet];
     470           0 :                     pGlossary = (SwTextBlocks *)pGlossaries->GetGroupDoc(pData->sGroupName);
     471           0 :                     nFound = pGlossary->GetIndex( aShortName );
     472             :                 }
     473             :                 else
     474             :                 {
     475           0 :                     nFound = (sal_uInt16) -1;
     476           0 :                     bCancel = true;
     477           0 :                 }
     478             :             }
     479             :         }
     480             :     }
     481             : 
     482             :     // not found
     483           0 :     if( nFound == (sal_uInt16) -1 )
     484             :     {
     485           0 :         if( !bCancel )
     486             :         {
     487           0 :             delete pGlossary;
     488             : 
     489           0 :             const sal_Int32 nMaxLen = 50;
     490           0 :             if(pWrtShell->IsSelection() && aShortName.getLength() > nMaxLen)
     491             :             {
     492           0 :                 aShortName = aShortName.copy(0, nMaxLen) + " ...";
     493             :             }
     494           0 :             OUString aTmp( SW_RES(STR_NOGLOS));
     495           0 :             aTmp = aTmp.replaceFirst("%1", aShortName);
     496           0 :             InfoBox( pWrtShell->GetView().GetWindow(), aTmp ).Execute();
     497             :         }
     498             : 
     499           0 :         return false;
     500             :     }
     501             :     else
     502             :     {
     503           0 :         SvxMacro aStartMacro(aEmptyOUStr, aEmptyOUStr, STARBASIC);
     504           0 :         SvxMacro aEndMacro(aEmptyOUStr, aEmptyOUStr, STARBASIC);
     505           0 :         GetMacros( aShortName, aStartMacro, aEndMacro, pGlossary );
     506             : 
     507             :         // StartAction must not be before HasSelection and DelRight,
     508             :         // otherwise the possible Shell change gets delayed and
     509             :         // API-programs would hang.
     510             :         // Moreover the event macro must also not be called in an action
     511           0 :         pWrtShell->StartUndo(UNDO_INSGLOSSARY);
     512           0 :         if( aStartMacro.HasMacro() )
     513           0 :             pWrtShell->ExecMacro( aStartMacro );
     514           0 :         if(pWrtShell->HasSelection())
     515           0 :             pWrtShell->DelLeft();
     516           0 :         pWrtShell->StartAllAction();
     517             : 
     518             :         // cache all InputFields
     519           0 :         SwInputFieldList aFldLst( pWrtShell, true );
     520             : 
     521           0 :         pWrtShell->InsertGlossary(*pGlossary, aShortName);
     522           0 :         pWrtShell->EndAllAction();
     523           0 :         if( aEndMacro.HasMacro() )
     524             :         {
     525           0 :             pWrtShell->ExecMacro( aEndMacro );
     526             :         }
     527           0 :         pWrtShell->EndUndo(UNDO_INSGLOSSARY);
     528             : 
     529             :         // demand input for all new InputFields
     530           0 :         if( aFldLst.BuildSortLst() )
     531           0 :             pWrtShell->UpdateInputFlds( &aFldLst );
     532             :     }
     533           0 :     delete pGlossary;
     534           0 :     return true;
     535             : }
     536             : 
     537             : // add autotext
     538           0 : bool SwGlossaryHdl::InsertGlossary(const OUString &rName)
     539             : {
     540             :     OSL_ENSURE(pWrtShell->CanInsert(), "illegal");
     541             : 
     542             :     SwTextBlocks *pGlos =
     543           0 :         pCurGrp? pCurGrp: rStatGlossaries.GetGroupDoc(aCurGrp);
     544             : 
     545           0 :     if (!pGlos)
     546           0 :         return false;
     547             : 
     548           0 :     SvxMacro aStartMacro(aEmptyOUStr, aEmptyOUStr, STARBASIC);
     549           0 :     SvxMacro aEndMacro(aEmptyOUStr, aEmptyOUStr, STARBASIC);
     550           0 :     GetMacros( rName, aStartMacro, aEndMacro, pGlos );
     551             : 
     552             :     // StartAction must not be before HasSelection and DelRight,
     553             :     // otherwise the possible Shell change gets delayed and
     554             :     // API-programs would hang.
     555             :     // Moreover the event macro must also not be called in an action
     556           0 :     if( aStartMacro.HasMacro() )
     557           0 :         pWrtShell->ExecMacro( aStartMacro );
     558           0 :     if( pWrtShell->HasSelection() )
     559           0 :         pWrtShell->DelRight();
     560           0 :     pWrtShell->StartAllAction();
     561             : 
     562             :     // cache all InputFields
     563           0 :     SwInputFieldList aFldLst( pWrtShell, true );
     564             : 
     565           0 :     pWrtShell->InsertGlossary(*pGlos, rName);
     566           0 :     pWrtShell->EndAllAction();
     567           0 :     if( aEndMacro.HasMacro() )
     568             :     {
     569           0 :         pWrtShell->ExecMacro( aEndMacro );
     570             :     }
     571             : 
     572             :     // demand input for all new InputFields
     573           0 :     if( aFldLst.BuildSortLst() )
     574           0 :         pWrtShell->UpdateInputFlds( &aFldLst );
     575             : 
     576           0 :     if(!pCurGrp)
     577           0 :         delete pGlos;
     578           0 :     return true;
     579             : }
     580             : 
     581             : // set / ask for macro
     582           0 : void SwGlossaryHdl::SetMacros(const OUString& rShortName,
     583             :                               const SvxMacro* pStart,
     584             :                               const SvxMacro* pEnd,
     585             :                               SwTextBlocks *pGlossary )
     586             : {
     587             :     SwTextBlocks *pGlos = pGlossary ? pGlossary :
     588             :                                 pCurGrp ? pCurGrp
     589           0 :                                   : rStatGlossaries.GetGroupDoc( aCurGrp );
     590           0 :     SvxMacroTableDtor aMacroTbl;
     591           0 :     if( pStart )
     592           0 :         aMacroTbl.Insert( SW_EVENT_START_INS_GLOSSARY, *pStart);
     593           0 :     if( pEnd )
     594           0 :         aMacroTbl.Insert( SW_EVENT_END_INS_GLOSSARY, *pEnd);
     595           0 :     sal_uInt16 nIdx = pGlos->GetIndex( rShortName );
     596           0 :     if( !pGlos->SetMacroTable( nIdx, aMacroTbl ) && pGlos->GetError() )
     597           0 :         ErrorHandler::HandleError( pGlos->GetError() );
     598             : 
     599           0 :     if(!pCurGrp && !pGlossary)
     600           0 :         delete pGlos;
     601           0 : }
     602             : 
     603           4 : void SwGlossaryHdl::GetMacros( const OUString &rShortName,
     604             :                                 SvxMacro& rStart,
     605             :                                 SvxMacro& rEnd,
     606             :                                 SwTextBlocks *pGlossary  )
     607             : {
     608             :     SwTextBlocks *pGlos = pGlossary ? pGlossary
     609             :                                     : pCurGrp ? pCurGrp
     610           4 :                                         : rStatGlossaries.GetGroupDoc(aCurGrp);
     611           4 :     sal_uInt16 nIndex = pGlos->GetIndex( rShortName );
     612           4 :     if( nIndex != USHRT_MAX )
     613             :     {
     614           2 :         SvxMacroTableDtor aMacroTbl;
     615           2 :         if( pGlos->GetMacroTable( nIndex, aMacroTbl ) )
     616             :         {
     617           0 :             SvxMacro *pMacro = aMacroTbl.Get( SW_EVENT_START_INS_GLOSSARY );
     618           0 :             if( pMacro )
     619           0 :                 rStart = *pMacro;
     620             : 
     621           0 :             pMacro = aMacroTbl.Get( SW_EVENT_END_INS_GLOSSARY );
     622           0 :             if( pMacro )
     623           0 :                 rEnd = *pMacro;
     624           2 :         }
     625             :     }
     626             : 
     627           4 :     if( !pCurGrp && !pGlossary )
     628           0 :         delete pGlos;
     629           4 : }
     630             : 
     631             : // ctor, dtor
     632           2 : SwGlossaryHdl::SwGlossaryHdl(SfxViewFrame* pVwFrm, SwWrtShell *pSh)
     633           2 :     : rStatGlossaries( *::GetGlossaries() ),
     634             :     aCurGrp( SwGlossaries::GetDefName() ),
     635             :     pViewFrame( pVwFrm ),
     636             :     pWrtShell( pSh ),
     637           2 :     pCurGrp( 0 )
     638             : {
     639           2 : }
     640             : 
     641           4 : SwGlossaryHdl::~SwGlossaryHdl()
     642             : {
     643           2 :     delete pCurGrp;
     644           2 : }
     645             : 
     646             : // rename an autotext
     647           0 : bool SwGlossaryHdl::Rename(const OUString& rOldShort, const OUString& rNewShortName,
     648             :                            const OUString& rNewName )
     649             : {
     650           0 :     bool bRet = false;
     651             :     SwTextBlocks *pGlossary = pCurGrp ? pCurGrp
     652           0 :                                     : rStatGlossaries.GetGroupDoc(aCurGrp);
     653           0 :     if(pGlossary)
     654             :     {
     655           0 :         if(!ConvertToNew(*pGlossary))
     656           0 :             return false;
     657             : 
     658           0 :         sal_uInt16 nIdx = pGlossary->GetIndex( rOldShort );
     659           0 :         sal_uInt16 nOldLongIdx = pGlossary->GetLongIndex( rNewName );
     660           0 :         sal_uInt16 nOldIdx = pGlossary->GetIndex( rNewShortName );
     661             : 
     662           0 :         if( nIdx != USHRT_MAX &&
     663           0 :                 (nOldLongIdx == USHRT_MAX || nOldLongIdx == nIdx )&&
     664           0 :                     (nOldIdx == USHRT_MAX || nOldIdx == nIdx ))
     665             :         {
     666           0 :             pGlossary->Rename( nIdx, &rNewShortName, &rNewName );
     667           0 :             bRet = pGlossary->GetError() == 0;
     668             :         }
     669           0 :         if( !pCurGrp )
     670           0 :             delete pGlossary;
     671             :     }
     672           0 :     return bRet;
     673             : }
     674             : 
     675           0 : bool SwGlossaryHdl::IsReadOnly( const OUString* pGrpNm ) const
     676             : {
     677           0 :     SwTextBlocks *pGlossary = 0;
     678             : 
     679           0 :     if (pGrpNm)
     680           0 :         pGlossary = rStatGlossaries.GetGroupDoc( *pGrpNm );
     681           0 :     else if (pCurGrp)
     682           0 :         pGlossary = pCurGrp;
     683             :     else
     684           0 :         pGlossary = rStatGlossaries.GetGroupDoc(aCurGrp);
     685             : 
     686           0 :     bool bRet = pGlossary ? pGlossary->IsReadOnly() : sal_True;
     687           0 :     if( pGrpNm || !pCurGrp )
     688           0 :         delete pGlossary;
     689           0 :     return bRet;
     690             : }
     691             : 
     692           0 : bool SwGlossaryHdl::IsOld() const
     693             : {
     694             :     SwTextBlocks *pGlossary = pCurGrp ? pCurGrp
     695           0 :                                       : rStatGlossaries.GetGroupDoc(aCurGrp);
     696           0 :     bool bRet = pGlossary ? pGlossary->IsOld() : sal_False;
     697           0 :     if( !pCurGrp )
     698           0 :         delete pGlossary;
     699           0 :     return bRet;
     700             : }
     701             : 
     702             : // find group without path index
     703           0 : bool SwGlossaryHdl::FindGroupName(OUString& rGroup)
     704             : {
     705           0 :     return rStatGlossaries.FindGroupName(rGroup);
     706             : }
     707             : 
     708           0 : bool SwGlossaryHdl::CopyToClipboard(SwWrtShell& rSh, const OUString& rShortName)
     709             : {
     710             :     SwTextBlocks *pGlossary = pCurGrp ? pCurGrp
     711           0 :                                     : rStatGlossaries.GetGroupDoc(aCurGrp);
     712             : 
     713           0 :     SwTransferable* pTransfer = new SwTransferable( rSh );
     714             : /*??*/uno::Reference<
     715           0 :         datatransfer::XTransferable > xRef( pTransfer );
     716             : 
     717           0 :     int nRet = pTransfer->CopyGlossary( *pGlossary, rShortName );
     718           0 :     if( !pCurGrp )
     719           0 :         delete pGlossary;
     720           0 :     return 0 != nRet;
     721             : }
     722             : 
     723           0 : bool SwGlossaryHdl::ImportGlossaries( const OUString& rName )
     724             : {
     725           0 :     bool bRet = false;
     726           0 :     if( !rName.isEmpty() )
     727             :     {
     728           0 :         const SfxFilter* pFilter = 0;
     729           0 :         boost::scoped_ptr<SfxMedium> pMed(new SfxMedium( rName, STREAM_READ, 0, 0 ));
     730           0 :         SfxFilterMatcher aMatcher( OUString("swriter") );
     731           0 :         pMed->UseInteractionHandler( true );
     732           0 :         if( !aMatcher.GuessFilter( *pMed, &pFilter, sal_False ) )
     733             :         {
     734           0 :             SwTextBlocks *pGlossary = NULL;
     735           0 :             pMed->SetFilter( pFilter );
     736           0 :             Reader* pR = SwReaderWriter::GetReader( pFilter->GetUserData() );
     737           0 :             if( pR && 0 != ( pGlossary = pCurGrp ? pCurGrp
     738           0 :                                     : rStatGlossaries.GetGroupDoc(aCurGrp)) )
     739             :             {
     740           0 :                 SwReader aReader( *pMed, rName );
     741           0 :                 if( aReader.HasGlossaries( *pR ) )
     742             :                 {
     743           0 :                     const SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
     744             :                     bRet = aReader.ReadGlossaries( *pR, *pGlossary,
     745           0 :                                 rCfg.IsSaveRelFile() );
     746           0 :                 }
     747             :             }
     748           0 :         }
     749             :     }
     750           0 :     return bRet;
     751         270 : }
     752             : 
     753             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10