LCOV - code coverage report
Current view: top level - sw/source/uibase/dochdl - gloshdl.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 17 375 4.5 %
Date: 2015-06-13 12:38:46 Functions: 5 32 15.6 %
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 += OUStringLiteral1<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.clear();
     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 += OUStringLiteral1<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             : // Create autotext
     306           0 : bool SwGlossaryHdl::NewGlossary(const OUString& rName, const OUString& rShortName,
     307             :                                 bool bCreateGroup, bool bNoAttr)
     308             : {
     309             :     SwTextBlocks *pTmp =
     310           0 :         pCurGrp ? pCurGrp: rStatGlossaries.GetGroupDoc( aCurGrp, bCreateGroup );
     311             :     //pTmp == 0 if the AutoText path setting is wrong
     312           0 :     if(!pTmp)
     313           0 :         return false;
     314             : 
     315           0 :     OUString sOnlyText;
     316           0 :     OUString* pOnlyText = 0;
     317           0 :     if( bNoAttr )
     318             :     {
     319           0 :         if( !pWrtShell->GetSelectedText( sOnlyText, GETSELTXT_PARABRK_TO_ONLYCR ))
     320           0 :             return false;
     321           0 :         pOnlyText = &sOnlyText;
     322             :     }
     323             : 
     324           0 :     const SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
     325             : 
     326             :     const sal_uInt16 nSuccess = pWrtShell->MakeGlossary( *pTmp, rName, rShortName,
     327           0 :                             rCfg.IsSaveRelFile(), pOnlyText );
     328           0 :     if(nSuccess == (sal_uInt16) -1 )
     329             :     {
     330           0 :         ScopedVclPtrInstance<MessageDialog>::Create(pWrtShell->GetView().GetWindow(), SW_RES(STR_ERR_INSERT_GLOS), VCL_MESSAGE_INFO)->Execute();
     331             :     }
     332           0 :     if( !pCurGrp )
     333           0 :         delete pTmp;
     334           0 :     return nSuccess != (sal_uInt16) -1;
     335             : }
     336             : 
     337             : // Delete a autotext
     338           0 : bool SwGlossaryHdl::DelGlossary(const OUString &rShortName)
     339             : {
     340             :     SwTextBlocks *pGlossary = pCurGrp ? pCurGrp
     341           0 :                                     : rStatGlossaries.GetGroupDoc(aCurGrp);
     342             :     //pTmp == 0 if the AutoText path setting is wrong
     343           0 :     if(!pGlossary)
     344           0 :         return false;
     345             : 
     346           0 :     sal_uInt16 nIdx = pGlossary->GetIndex( rShortName );
     347           0 :     if( nIdx != (sal_uInt16) -1 )
     348           0 :         pGlossary->Delete( nIdx );
     349           0 :     if( !pCurGrp )
     350           0 :         delete pGlossary;
     351           0 :     return true;
     352             : }
     353             : 
     354             : // expand short name
     355           0 : bool SwGlossaryHdl::ExpandGlossary()
     356             : {
     357             :     OSL_ENSURE(pWrtShell->CanInsert(), "illegal");
     358             :     SwTextBlocks *pGlossary;
     359           0 :     SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
     360             :     assert(pFact && "Dialog creation failed!");
     361           0 :     ::GlossaryGetCurrGroup fnGetCurrGroup = pFact->GetGlossaryCurrGroupFunc();
     362             :     assert(fnGetCurrGroup && "Dialog creation failed!");
     363           0 :     OUString sGroupName( (*fnGetCurrGroup)() );
     364           0 :     if (sGroupName.indexOf(GLOS_DELIM)<0)
     365           0 :         FindGroupName(sGroupName);
     366           0 :     pGlossary = rStatGlossaries.GetGroupDoc(sGroupName);
     367             : 
     368           0 :     OUString aShortName;
     369             : 
     370             :         // use this at text selection
     371           0 :     if(pWrtShell->SwCrsrShell::HasSelection() && !pWrtShell->IsBlockMode())
     372             :     {
     373           0 :         aShortName = pWrtShell->GetSelText();
     374             :     }
     375             :     else
     376             :     {
     377           0 :         if(pWrtShell->IsAddMode())
     378           0 :             pWrtShell->LeaveAddMode();
     379           0 :         else if(pWrtShell->IsBlockMode())
     380           0 :             pWrtShell->LeaveBlockMode();
     381           0 :         else if(pWrtShell->IsExtMode())
     382           0 :             pWrtShell->LeaveExtMode();
     383             :         // select word
     384           0 :         pWrtShell->SelNearestWrd();
     385             :             // ask for word
     386           0 :         if(pWrtShell->IsSelection())
     387           0 :             aShortName = pWrtShell->GetSelText();
     388             :     }
     389           0 :     return pGlossary && Expand( aShortName, &rStatGlossaries, pGlossary );
     390             : }
     391             : 
     392           0 : bool SwGlossaryHdl::Expand( const OUString& rShortName,
     393             :                             SwGlossaries *pGlossaries,
     394             :                             SwTextBlocks *pGlossary  )
     395             : {
     396           0 :     TextBlockInfoArr aFoundArr;
     397           0 :     OUString aShortName( rShortName );
     398           0 :     bool bCancel = false;
     399             :     // search for text block
     400             :     // - don't prefer current group depending on configuration setting
     401           0 :     const SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
     402           0 :     sal_uInt16 nFound = !rCfg.IsSearchInAllCategories() ? pGlossary->GetIndex( aShortName ) : -1;
     403             :     // if not found then search in all groups
     404           0 :     if( nFound == (sal_uInt16) -1 )
     405             :     {
     406           0 :         const ::utl::TransliterationWrapper& rSCmp = GetAppCmpStrIgnore();
     407           0 :         SwGlossaryList* pGlossaryList = ::GetGlossaryList();
     408           0 :         const size_t nGroupCount = pGlossaryList->GetGroupCount();
     409           0 :         for(size_t i = 0; i < nGroupCount; ++i)
     410             :         {
     411             :             // get group name with path-extension
     412           0 :             const OUString sGroupName = pGlossaryList->GetGroupName(i, false);
     413           0 :             if(sGroupName == pGlossary->GetName())
     414           0 :                 continue;
     415           0 :             const sal_uInt16 nBlockCount = pGlossaryList->GetBlockCount(i);
     416           0 :             if(nBlockCount)
     417             :             {
     418           0 :                 const OUString sTitle = pGlossaryList->GetGroupTitle(i);
     419           0 :                 for(sal_uInt16 j = 0; j < nBlockCount; j++)
     420             :                 {
     421           0 :                     const OUString sLongName(pGlossaryList->GetBlockLongName(i, j));
     422           0 :                     const OUString sShortName(pGlossaryList->GetBlockShortName(i, j));
     423           0 :                     if( rSCmp.isEqual( rShortName, sShortName ))
     424             :                     {
     425           0 :                         TextBlockInfo_Impl* pData = new TextBlockInfo_Impl;
     426           0 :                         pData->sTitle = sTitle;
     427           0 :                         pData->sLongName = sLongName;
     428           0 :                         pData->sGroupName = sGroupName;
     429           0 :                         aFoundArr.push_back(pData);
     430             :                     }
     431           0 :                 }
     432             :             }
     433           0 :         }
     434           0 :         if( !aFoundArr.empty() )  // one was found
     435             :         {
     436           0 :             delete pGlossary;
     437           0 :             if(1 == aFoundArr.size())
     438             :             {
     439           0 :                 TextBlockInfo_Impl* pData = &aFoundArr.front();
     440           0 :                 pGlossary = pGlossaries->GetGroupDoc(pData->sGroupName);
     441           0 :                 nFound = pGlossary->GetIndex( aShortName );
     442             :             }
     443             :             else
     444             :             {
     445           0 :                 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
     446             :                 assert(pFact && "SwAbstractDialogFactory fail!");
     447             : 
     448           0 :                 boost::scoped_ptr<AbstractSwSelGlossaryDlg> pDlg(pFact->CreateSwSelGlossaryDlg(0, aShortName));
     449             :                 assert(pDlg && "Dialog creation failed!");
     450           0 :                 for(size_t i = 0; i < aFoundArr.size(); ++i)
     451             :                 {
     452           0 :                     TextBlockInfo_Impl* pData = &aFoundArr[i];
     453           0 :                     pDlg->InsertGlos(pData->sTitle, pData->sLongName);
     454             :                 }
     455           0 :                 pDlg->SelectEntryPos(0);
     456           0 :                 const sal_Int32 nRet = RET_OK == pDlg->Execute()?
     457           0 :                                         pDlg->GetSelectedIdx():
     458           0 :                                         LISTBOX_ENTRY_NOTFOUND;
     459           0 :                 pDlg.reset();
     460           0 :                 if(LISTBOX_ENTRY_NOTFOUND != nRet)
     461             :                 {
     462           0 :                     TextBlockInfo_Impl* pData = &aFoundArr[nRet];
     463           0 :                     pGlossary = pGlossaries->GetGroupDoc(pData->sGroupName);
     464           0 :                     nFound = pGlossary->GetIndex( aShortName );
     465             :                 }
     466             :                 else
     467             :                 {
     468           0 :                     nFound = (sal_uInt16) -1;
     469           0 :                     bCancel = true;
     470           0 :                 }
     471             :             }
     472             :         }
     473             :     }
     474             : 
     475             :     // not found
     476           0 :     if( nFound == (sal_uInt16) -1 )
     477             :     {
     478           0 :         if( !bCancel )
     479             :         {
     480           0 :             delete pGlossary;
     481             : 
     482           0 :             const sal_Int32 nMaxLen = 50;
     483           0 :             if(pWrtShell->IsSelection() && aShortName.getLength() > nMaxLen)
     484             :             {
     485           0 :                 aShortName = aShortName.copy(0, nMaxLen) + " ...";
     486             :             }
     487           0 :             OUString aTmp( SW_RES(STR_NOGLOS));
     488           0 :             aTmp = aTmp.replaceFirst("%1", aShortName);
     489           0 :             ScopedVclPtr<InfoBox>::Create( pWrtShell->GetView().GetWindow(), aTmp )->Execute();
     490             :         }
     491             : 
     492           0 :         return false;
     493             :     }
     494             :     else
     495             :     {
     496           0 :         SvxMacro aStartMacro(aEmptyOUStr, aEmptyOUStr, STARBASIC);
     497           0 :         SvxMacro aEndMacro(aEmptyOUStr, aEmptyOUStr, STARBASIC);
     498           0 :         GetMacros( aShortName, aStartMacro, aEndMacro, pGlossary );
     499             : 
     500             :         // StartAction must not be before HasSelection and DelRight,
     501             :         // otherwise the possible Shell change gets delayed and
     502             :         // API-programs would hang.
     503             :         // Moreover the event macro must also not be called in an action
     504           0 :         pWrtShell->StartUndo(UNDO_INSGLOSSARY);
     505           0 :         if( aStartMacro.HasMacro() )
     506           0 :             pWrtShell->ExecMacro( aStartMacro );
     507           0 :         if(pWrtShell->HasSelection())
     508           0 :             pWrtShell->DelLeft();
     509           0 :         pWrtShell->StartAllAction();
     510             : 
     511             :         // cache all InputFields
     512           0 :         SwInputFieldList aFieldLst( pWrtShell, true );
     513             : 
     514           0 :         pWrtShell->InsertGlossary(*pGlossary, aShortName);
     515           0 :         pWrtShell->EndAllAction();
     516           0 :         if( aEndMacro.HasMacro() )
     517             :         {
     518           0 :             pWrtShell->ExecMacro( aEndMacro );
     519             :         }
     520           0 :         pWrtShell->EndUndo(UNDO_INSGLOSSARY);
     521             : 
     522             :         // demand input for all new InputFields
     523           0 :         if( aFieldLst.BuildSortLst() )
     524           0 :             pWrtShell->UpdateInputFields( &aFieldLst );
     525             :     }
     526           0 :     delete pGlossary;
     527           0 :     return true;
     528             : }
     529             : 
     530             : // add autotext
     531           0 : bool SwGlossaryHdl::InsertGlossary(const OUString &rName)
     532             : {
     533             :     OSL_ENSURE(pWrtShell->CanInsert(), "illegal");
     534             : 
     535             :     SwTextBlocks *pGlos =
     536           0 :         pCurGrp? pCurGrp: rStatGlossaries.GetGroupDoc(aCurGrp);
     537             : 
     538           0 :     if (!pGlos)
     539           0 :         return false;
     540             : 
     541           0 :     SvxMacro aStartMacro(aEmptyOUStr, aEmptyOUStr, STARBASIC);
     542           0 :     SvxMacro aEndMacro(aEmptyOUStr, aEmptyOUStr, STARBASIC);
     543           0 :     GetMacros( rName, aStartMacro, aEndMacro, pGlos );
     544             : 
     545             :     // StartAction must not be before HasSelection and DelRight,
     546             :     // otherwise the possible Shell change gets delayed and
     547             :     // API-programs would hang.
     548             :     // Moreover the event macro must also not be called in an action
     549           0 :     if( aStartMacro.HasMacro() )
     550           0 :         pWrtShell->ExecMacro( aStartMacro );
     551           0 :     if( pWrtShell->HasSelection() )
     552           0 :         pWrtShell->DelRight();
     553           0 :     pWrtShell->StartAllAction();
     554             : 
     555             :     // cache all InputFields
     556           0 :     SwInputFieldList aFieldLst( pWrtShell, true );
     557             : 
     558           0 :     pWrtShell->InsertGlossary(*pGlos, rName);
     559           0 :     pWrtShell->EndAllAction();
     560           0 :     if( aEndMacro.HasMacro() )
     561             :     {
     562           0 :         pWrtShell->ExecMacro( aEndMacro );
     563             :     }
     564             : 
     565             :     // demand input for all new InputFields
     566           0 :     if( aFieldLst.BuildSortLst() )
     567           0 :         pWrtShell->UpdateInputFields( &aFieldLst );
     568             : 
     569           0 :     if(!pCurGrp)
     570           0 :         delete pGlos;
     571           0 :     return true;
     572             : }
     573             : 
     574             : // set / ask for macro
     575           0 : void SwGlossaryHdl::SetMacros(const OUString& rShortName,
     576             :                               const SvxMacro* pStart,
     577             :                               const SvxMacro* pEnd,
     578             :                               SwTextBlocks *pGlossary )
     579             : {
     580             :     SwTextBlocks *pGlos = pGlossary ? pGlossary :
     581             :                                 pCurGrp ? pCurGrp
     582           0 :                                   : rStatGlossaries.GetGroupDoc( aCurGrp );
     583           0 :     SvxMacroTableDtor aMacroTable;
     584           0 :     if( pStart )
     585           0 :         aMacroTable.Insert( SW_EVENT_START_INS_GLOSSARY, *pStart);
     586           0 :     if( pEnd )
     587           0 :         aMacroTable.Insert( SW_EVENT_END_INS_GLOSSARY, *pEnd);
     588           0 :     sal_uInt16 nIdx = pGlos->GetIndex( rShortName );
     589           0 :     if( !pGlos->SetMacroTable( nIdx, aMacroTable ) && pGlos->GetError() )
     590           0 :         ErrorHandler::HandleError( pGlos->GetError() );
     591             : 
     592           0 :     if(!pCurGrp && !pGlossary)
     593           0 :         delete pGlos;
     594           0 : }
     595             : 
     596           2 : void SwGlossaryHdl::GetMacros( const OUString &rShortName,
     597             :                                 SvxMacro& rStart,
     598             :                                 SvxMacro& rEnd,
     599             :                                 SwTextBlocks *pGlossary  )
     600             : {
     601             :     SwTextBlocks *pGlos = pGlossary ? pGlossary
     602             :                                     : pCurGrp ? pCurGrp
     603           2 :                                         : rStatGlossaries.GetGroupDoc(aCurGrp);
     604           2 :     sal_uInt16 nIndex = pGlos->GetIndex( rShortName );
     605           2 :     if( nIndex != USHRT_MAX )
     606             :     {
     607           1 :         SvxMacroTableDtor aMacroTable;
     608           1 :         if( pGlos->GetMacroTable( nIndex, aMacroTable ) )
     609             :         {
     610           0 :             SvxMacro *pMacro = aMacroTable.Get( SW_EVENT_START_INS_GLOSSARY );
     611           0 :             if( pMacro )
     612           0 :                 rStart = *pMacro;
     613             : 
     614           0 :             pMacro = aMacroTable.Get( SW_EVENT_END_INS_GLOSSARY );
     615           0 :             if( pMacro )
     616           0 :                 rEnd = *pMacro;
     617           1 :         }
     618             :     }
     619             : 
     620           2 :     if( !pCurGrp && !pGlossary )
     621           0 :         delete pGlos;
     622           2 : }
     623             : 
     624             : // ctor, dtor
     625           1 : SwGlossaryHdl::SwGlossaryHdl(SfxViewFrame* pVwFrm, SwWrtShell *pSh)
     626           1 :     : rStatGlossaries( *::GetGlossaries() ),
     627             :     aCurGrp( SwGlossaries::GetDefName() ),
     628             :     pViewFrame( pVwFrm ),
     629             :     pWrtShell( pSh ),
     630           1 :     pCurGrp( 0 )
     631             : {
     632           1 : }
     633             : 
     634           2 : SwGlossaryHdl::~SwGlossaryHdl()
     635             : {
     636           1 :     delete pCurGrp;
     637           1 : }
     638             : 
     639             : // rename an autotext
     640           0 : bool SwGlossaryHdl::Rename(const OUString& rOldShort, const OUString& rNewShortName,
     641             :                            const OUString& rNewName )
     642             : {
     643           0 :     bool bRet = false;
     644             :     SwTextBlocks *pGlossary = pCurGrp ? pCurGrp
     645           0 :                                     : rStatGlossaries.GetGroupDoc(aCurGrp);
     646           0 :     if(pGlossary)
     647             :     {
     648           0 :         sal_uInt16 nIdx = pGlossary->GetIndex( rOldShort );
     649           0 :         sal_uInt16 nOldLongIdx = pGlossary->GetLongIndex( rNewName );
     650           0 :         sal_uInt16 nOldIdx = pGlossary->GetIndex( rNewShortName );
     651             : 
     652           0 :         if( nIdx != USHRT_MAX &&
     653           0 :                 (nOldLongIdx == USHRT_MAX || nOldLongIdx == nIdx )&&
     654           0 :                     (nOldIdx == USHRT_MAX || nOldIdx == nIdx ))
     655             :         {
     656           0 :             pGlossary->Rename( nIdx, &rNewShortName, &rNewName );
     657           0 :             bRet = pGlossary->GetError() == 0;
     658             :         }
     659           0 :         if( !pCurGrp )
     660           0 :             delete pGlossary;
     661             :     }
     662           0 :     return bRet;
     663             : }
     664             : 
     665           0 : bool SwGlossaryHdl::IsReadOnly( const OUString* pGrpNm ) const
     666             : {
     667           0 :     SwTextBlocks *pGlossary = 0;
     668             : 
     669           0 :     if (pGrpNm)
     670           0 :         pGlossary = rStatGlossaries.GetGroupDoc( *pGrpNm );
     671           0 :     else if (pCurGrp)
     672           0 :         pGlossary = pCurGrp;
     673             :     else
     674           0 :         pGlossary = rStatGlossaries.GetGroupDoc(aCurGrp);
     675             : 
     676           0 :     const bool bRet = !pGlossary || pGlossary->IsReadOnly();
     677           0 :     if( pGrpNm || !pCurGrp )
     678           0 :         delete pGlossary;
     679           0 :     return bRet;
     680             : }
     681             : 
     682           0 : bool SwGlossaryHdl::IsOld() const
     683             : {
     684             :     SwTextBlocks *pGlossary = pCurGrp ? pCurGrp
     685           0 :                                       : rStatGlossaries.GetGroupDoc(aCurGrp);
     686           0 :     bool bRet = pGlossary && pGlossary->IsOld();
     687           0 :     if( !pCurGrp )
     688           0 :         delete pGlossary;
     689           0 :     return bRet;
     690             : }
     691             : 
     692             : // find group without path index
     693           0 : bool SwGlossaryHdl::FindGroupName(OUString& rGroup)
     694             : {
     695           0 :     return rStatGlossaries.FindGroupName(rGroup);
     696             : }
     697             : 
     698           0 : bool SwGlossaryHdl::CopyToClipboard(SwWrtShell& rSh, const OUString& rShortName)
     699             : {
     700             :     SwTextBlocks *pGlossary = pCurGrp ? pCurGrp
     701           0 :                                     : rStatGlossaries.GetGroupDoc(aCurGrp);
     702             : 
     703           0 :     SwTransferable* pTransfer = new SwTransferable( rSh );
     704             : /*??*/uno::Reference<
     705           0 :         datatransfer::XTransferable > xRef( pTransfer );
     706             : 
     707           0 :     int nRet = pTransfer->CopyGlossary( *pGlossary, rShortName );
     708           0 :     if( !pCurGrp )
     709           0 :         delete pGlossary;
     710           0 :     return 0 != nRet;
     711             : }
     712             : 
     713           0 : bool SwGlossaryHdl::ImportGlossaries( const OUString& rName )
     714             : {
     715           0 :     bool bRet = false;
     716           0 :     if( !rName.isEmpty() )
     717             :     {
     718           0 :         const SfxFilter* pFilter = 0;
     719           0 :         boost::scoped_ptr<SfxMedium> pMed(new SfxMedium( rName, StreamMode::READ, 0, 0 ));
     720           0 :         SfxFilterMatcher aMatcher( OUString("swriter") );
     721           0 :         pMed->UseInteractionHandler( true );
     722           0 :         if (!aMatcher.GuessFilter(*pMed, &pFilter, SfxFilterFlags::NONE))
     723             :         {
     724           0 :             SwTextBlocks *pGlossary = NULL;
     725           0 :             pMed->SetFilter( pFilter );
     726           0 :             Reader* pR = SwReaderWriter::GetReader( pFilter->GetUserData() );
     727           0 :             if( pR && 0 != ( pGlossary = pCurGrp ? pCurGrp
     728           0 :                                     : rStatGlossaries.GetGroupDoc(aCurGrp)) )
     729             :             {
     730           0 :                 SwReader aReader( *pMed, rName );
     731           0 :                 if( aReader.HasGlossaries( *pR ) )
     732             :                 {
     733           0 :                     const SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
     734             :                     bRet = aReader.ReadGlossaries( *pR, *pGlossary,
     735           0 :                                 rCfg.IsSaveRelFile() );
     736           0 :                 }
     737             :             }
     738           0 :         }
     739             :     }
     740           0 :     return bRet;
     741         177 : }
     742             : 
     743             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11