LCOV - code coverage report
Current view: top level - sw/source/ui/misc - glossary.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 0 628 0.0 %
Date: 2015-06-13 12:38:46 Functions: 0 61 0.0 %
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             : 
      22             : #include <vcl/menu.hxx>
      23             : #include <vcl/layout.hxx>
      24             : #include <vcl/help.hxx>
      25             : #include <vcl/builderfactory.hxx>
      26             : #include <svl/stritem.hxx>
      27             : #include <unotools/pathoptions.hxx>
      28             : #include <unotools/lingucfg.hxx>
      29             : #include <sfx2/request.hxx>
      30             : #include <sfx2/fcontnr.hxx>
      31             : 
      32             : #include <svx/svxdlg.hxx>
      33             : #include <svx/dialogs.hrc>
      34             : #include <editeng/acorrcfg.hxx>
      35             : #include <sfx2/viewfrm.hxx>
      36             : #include <unocrsr.hxx>
      37             : #include <unotools.hxx>
      38             : #include <comphelper/processfactory.hxx>
      39             : #include <comphelper/string.hxx>
      40             : #include <ucbhelper/content.hxx>
      41             : #include <com/sun/star/text/AutoTextContainer.hpp>
      42             : #include <com/sun/star/ui/dialogs/XFilePicker.hpp>
      43             : #include <com/sun/star/ui/dialogs/XFilterManager.hpp>
      44             : #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
      45             : #include <svl/urihelper.hxx>
      46             : #include <unotools/charclass.hxx>
      47             : #include <svtools/treelistentry.hxx>
      48             : #include <swwait.hxx>
      49             : #include <swtypes.hxx>
      50             : #include <wrtsh.hxx>
      51             : #include <view.hxx>
      52             : #include <basesh.hxx>
      53             : #include <glossary.hxx>
      54             : #include <gloshdl.hxx>
      55             : #include <glosbib.hxx>
      56             : #include <initui.hxx>
      57             : #include <glosdoc.hxx>
      58             : #include <macassgn.hxx>
      59             : #include <swevent.hxx>
      60             : #include <docsh.hxx>
      61             : #include <shellio.hxx>
      62             : 
      63             : #include <cmdid.h>
      64             : #include <helpid.h>
      65             : #include <swerror.h>
      66             : #include <globals.hrc>
      67             : #include <misc.hrc>
      68             : #include <swmodule.hxx>
      69             : #include <sfx2/filedlghelper.hxx>
      70             : 
      71             : #include <boost/scoped_ptr.hpp>
      72             : 
      73             : #include "access.hrc"
      74             : 
      75             : using namespace ::com::sun::star;
      76             : using namespace ::com::sun::star::lang;
      77             : using namespace ::com::sun::star::uno;
      78             : using namespace ::com::sun::star::text;
      79             : using namespace ::com::sun::star::ucb;
      80             : using namespace ::com::sun::star::ui::dialogs;
      81             : using namespace ::ucbhelper;
      82             : using namespace ::sfx2;
      83             : 
      84           0 : static OUString lcl_GetValidShortCut( const OUString& rName )
      85             : {
      86           0 :     const sal_Int32 nSz = rName.getLength();
      87             : 
      88           0 :     if ( 0 == nSz )
      89           0 :         return rName;
      90             : 
      91           0 :     sal_Int32 nStart = 1;
      92           0 :     while( rName[nStart-1]==' ' && nStart < nSz )
      93           0 :         nStart++;
      94             : 
      95           0 :     OUString aBuf = OUString(rName[nStart-1]);
      96             : 
      97           0 :     for( ; nStart < nSz; ++nStart )
      98             :     {
      99           0 :         if( rName[nStart-1]==' ' && rName[nStart]!=' ')
     100           0 :             aBuf += OUString(rName[nStart]);
     101             :     }
     102           0 :     return aBuf;
     103             : }
     104             : 
     105           0 : struct GroupUserData
     106             : {
     107             :     OUString    sGroupName;
     108             :     sal_uInt16  nPathIdx;
     109             :     bool        bReadonly;
     110             : 
     111           0 :     GroupUserData()
     112             :         : nPathIdx(0),
     113           0 :           bReadonly(false)  {}
     114             : };
     115             : 
     116             : // dialog for new block name
     117             : class SwNewGlosNameDlg : public ModalDialog
     118             : {
     119             :     VclPtr<Edit>        m_pNewName;
     120             :     TextFilter          m_aNoSpaceFilter;
     121             :     VclPtr<Edit>        m_pNewShort;
     122             :     VclPtr<OKButton>    m_pOk;
     123             :     VclPtr<Edit>        m_pOldName;
     124             :     VclPtr<Edit>        m_pOldShort;
     125             : 
     126             : protected:
     127             :     DECL_LINK( Modify, Edit * );
     128             :     DECL_LINK(Rename, void *);
     129             : 
     130             : public:
     131             :     SwNewGlosNameDlg( vcl::Window* pParent,
     132             :                       const OUString& rOldName,
     133             :                       const OUString& rOldShort );
     134             :     virtual ~SwNewGlosNameDlg();
     135             :     virtual void dispose() SAL_OVERRIDE;
     136             : 
     137           0 :     OUString GetNewName()  const { return m_pNewName->GetText(); }
     138           0 :     OUString GetNewShort() const { return m_pNewShort->GetText(); }
     139             : };
     140             : 
     141           0 : SwNewGlosNameDlg::SwNewGlosNameDlg(vcl::Window* pParent,
     142             :                             const OUString& rOldName,
     143             :                             const OUString& rOldShort )
     144             :     : ModalDialog(pParent, "RenameAutoTextDialog",
     145           0 :         "modules/swriter/ui/renameautotextdialog.ui")
     146             : {
     147           0 :     get(m_pNewName, "newname");
     148           0 :     get(m_pNewShort, "newsc");
     149           0 :     m_pNewShort->SetTextFilter(&m_aNoSpaceFilter);
     150           0 :     get(m_pOk, "ok");
     151           0 :     get(m_pOldName, "oldname");
     152           0 :     get(m_pOldShort, "oldsc");
     153             : 
     154           0 :     m_pOldName->SetText( rOldName );
     155           0 :     m_pOldShort->SetText( rOldShort );
     156           0 :     m_pNewName->SetModifyHdl(LINK(this, SwNewGlosNameDlg, Modify ));
     157           0 :     m_pNewShort->SetModifyHdl(LINK(this, SwNewGlosNameDlg, Modify ));
     158           0 :     m_pOk->SetClickHdl(LINK(this, SwNewGlosNameDlg, Rename ));
     159           0 :     m_pNewName->GrabFocus();
     160           0 : }
     161             : 
     162           0 : SwNewGlosNameDlg::~SwNewGlosNameDlg()
     163             : {
     164           0 :     disposeOnce();
     165           0 : }
     166             : 
     167           0 : void SwNewGlosNameDlg::dispose()
     168             : {
     169           0 :     m_pNewName.clear();
     170           0 :     m_pNewShort.clear();
     171           0 :     m_pOk.clear();
     172           0 :     m_pOldName.clear();
     173           0 :     m_pOldShort.clear();
     174           0 :     ModalDialog::dispose();
     175           0 : }
     176             : 
     177             : // query / set currently set group
     178           0 : OUString SwGlossaryDlg::GetCurrGroup()
     179             : {
     180           0 :     if( !::GetCurrGlosGroup().isEmpty() )
     181           0 :         return ::GetCurrGlosGroup();
     182           0 :     return SwGlossaries::GetDefName();
     183             : }
     184             : 
     185           0 : void SwGlossaryDlg::SetActGroup(const OUString &rGrp)
     186             : {
     187           0 :     ::SetCurrGlosGroup(rGrp);
     188           0 : }
     189             : 
     190           0 : SwGlossaryDlg::SwGlossaryDlg(SfxViewFrame* pViewFrame,
     191             :                             SwGlossaryHdl * pGlosHdl, SwWrtShell *pWrtShell)
     192           0 :     : SvxStandardDialog(&pViewFrame->GetWindow(), "AutoTextDialog",
     193             :         "modules/swriter/ui/autotext.ui")
     194             :     , sReadonlyPath(SW_RESSTR(STR_READONLY_PATH))
     195             :     , pExampleFrame(0)
     196             :     , pGlossaryHdl(pGlosHdl)
     197             :     , bResume(false)
     198           0 :     , bSelection(pWrtShell->IsSelection())
     199             :     , bReadOnly(false)
     200             :     , bIsOld(false)
     201             :     , bIsDocReadOnly(false)
     202           0 :     , pSh(pWrtShell)
     203             : {
     204           0 :     get(m_pInsertTipCB, "inserttip");
     205           0 :     get(m_pNameED, "name");
     206           0 :     get(m_pShortNameLbl, "shortnameft");
     207           0 :     get(m_pShortNameEdit, "shortname");
     208           0 :     m_pShortNameEdit->SetTextFilter(&m_aNoSpaceFilter);
     209           0 :     get(m_pCategoryBox, "category");
     210           0 :     get(m_pFileRelCB, "relfile");
     211           0 :     get(m_pNetRelCB, "relnet");
     212           0 :     get(m_pInsertBtn, "insert");
     213           0 :     get(m_pBibBtn, "categories");
     214           0 :     get(m_pPathBtn, "path");
     215           0 :     get(m_pExampleWIN, "example");
     216           0 :     get(m_pEditBtn, "autotext");
     217             : 
     218           0 :     SvtLinguConfig aLocalLinguConfig;
     219             : 
     220           0 :     PopupMenu *pMenu = m_pEditBtn->GetPopupMenu();
     221             :     assert(pMenu);
     222           0 :     pMenu->SetActivateHdl(LINK(this,SwGlossaryDlg,EnableHdl));
     223           0 :     pMenu->SetSelectHdl(LINK(this,SwGlossaryDlg,MenuHdl));
     224           0 :     m_pEditBtn->SetSelectHdl(LINK(this,SwGlossaryDlg,EditHdl));
     225           0 :     m_pPathBtn->SetClickHdl(LINK(this, SwGlossaryDlg, PathHdl));
     226             : 
     227           0 :     m_pNameED->SetModifyHdl(LINK(this,SwGlossaryDlg,NameModify));
     228           0 :     m_pShortNameEdit->SetModifyHdl(LINK(this,SwGlossaryDlg,NameModify));
     229             : 
     230           0 :     m_pCategoryBox->SetDoubleClickHdl(LINK(this,SwGlossaryDlg, NameDoubleClick));
     231           0 :     m_pCategoryBox->SetSelectHdl(LINK(this,SwGlossaryDlg,GrpSelect));
     232           0 :     m_pBibBtn->SetClickHdl(LINK(this,SwGlossaryDlg,BibHdl));
     233             : 
     234           0 :     m_pInsertBtn->SetClickHdl(LINK(this,SwGlossaryDlg,InsertHdl));
     235             : 
     236           0 :     ShowPreview();
     237             : 
     238           0 :     bIsDocReadOnly = pSh->GetView().GetDocShell()->IsReadOnly() ||
     239           0 :                       pSh->HasReadonlySel();
     240           0 :     if( bIsDocReadOnly )
     241           0 :         m_pInsertBtn->Enable(false);
     242           0 :     m_pNameED->GrabFocus();
     243           0 :     m_pCategoryBox->SetStyle(m_pCategoryBox->GetStyle()|WB_HASBUTTONS|WB_HASBUTTONSATROOT|WB_HSCROLL|WB_VSCROLL|WB_CLIPCHILDREN|WB_SORT);
     244           0 :     m_pCategoryBox->GetModel()->SetSortMode(SortAscending);
     245           0 :     m_pCategoryBox->SetHighlightRange();   // select over full width
     246           0 :     m_pCategoryBox->SetNodeDefaultImages( );
     247             : 
     248           0 :     Init();
     249           0 : }
     250             : 
     251           0 : SwGlossaryDlg::~SwGlossaryDlg()
     252             : {
     253           0 :     disposeOnce();
     254           0 : }
     255             : 
     256           0 : void SwGlossaryDlg::dispose()
     257             : {
     258           0 :     m_pCategoryBox->Clear();
     259           0 :     delete pExampleFrame;
     260           0 :     m_pInsertTipCB.clear();
     261           0 :     m_pNameED.clear();
     262           0 :     m_pShortNameLbl.clear();
     263           0 :     m_pShortNameEdit.clear();
     264           0 :     m_pCategoryBox.clear();
     265           0 :     m_pFileRelCB.clear();
     266           0 :     m_pNetRelCB.clear();
     267           0 :     m_pExampleWIN.clear();
     268           0 :     m_pInsertBtn.clear();
     269           0 :     m_pEditBtn.clear();
     270           0 :     m_pBibBtn.clear();
     271           0 :     m_pPathBtn.clear();
     272           0 :     SvxStandardDialog::dispose();
     273           0 : }
     274             : 
     275             : // select new group
     276           0 : IMPL_LINK( SwGlossaryDlg, GrpSelect, SvTreeListBox *, pBox )
     277             : {
     278           0 :     SvTreeListEntry* pEntry = pBox->FirstSelected();
     279           0 :     if(!pEntry)
     280           0 :         return 0;
     281           0 :     SvTreeListEntry* pParent = pBox->GetParent(pEntry) ? pBox->GetParent(pEntry) : pEntry;
     282           0 :     GroupUserData* pGroupData = static_cast<GroupUserData*>(pParent->GetUserData());
     283             :     ::SetCurrGlosGroup(pGroupData->sGroupName
     284           0 :         + OUStringLiteral1<GLOS_DELIM>()
     285           0 :         + OUString::number(pGroupData->nPathIdx));
     286           0 :     pGlossaryHdl->SetCurGroup(::GetCurrGlosGroup());
     287             :     // set current text block
     288           0 :     bReadOnly = pGlossaryHdl->IsReadOnly();
     289           0 :     EnableShortName( !bReadOnly );
     290           0 :     m_pEditBtn->Enable(!bReadOnly);
     291           0 :     bIsOld = pGlossaryHdl->IsOld();
     292           0 :     if( pParent != pEntry)
     293             :     {
     294           0 :         OUString aName(pBox->GetEntryText(pEntry));
     295           0 :         m_pNameED->SetText(aName);
     296           0 :         m_pShortNameEdit->SetText(*static_cast<OUString*>(pEntry->GetUserData()));
     297           0 :         m_pInsertBtn->Enable( !bIsDocReadOnly);
     298           0 :         ShowAutoText(::GetCurrGlosGroup(), m_pShortNameEdit->GetText());
     299             :     }
     300             :     else
     301             :     {
     302           0 :         m_pNameED->SetText("");
     303           0 :         m_pShortNameEdit->SetText("");
     304           0 :         m_pShortNameEdit->Enable(false);
     305           0 :         ShowAutoText("", "");
     306             :     }
     307             :     // update controls
     308           0 :     NameModify(m_pShortNameEdit);
     309           0 :     if( SfxRequest::HasMacroRecorder( pSh->GetView().GetViewFrame() ) )
     310             :     {
     311           0 :         SfxRequest aReq( pSh->GetView().GetViewFrame(), FN_SET_ACT_GLOSSARY );
     312           0 :         OUString sTemp(::GetCurrGlosGroup());
     313             :         // the zeroth path is not being recorded!
     314           0 :         if (sTemp.getToken(1, GLOS_DELIM).startsWith("0"))
     315           0 :             sTemp = sTemp.getToken(0, GLOS_DELIM);
     316           0 :         aReq.AppendItem(SfxStringItem(FN_SET_ACT_GLOSSARY, sTemp));
     317           0 :         aReq.Done();
     318             :     }
     319           0 :     return 0;
     320             : }
     321             : 
     322           0 : void SwGlossaryDlg::Apply()
     323             : {
     324           0 :     const OUString aGlosName(m_pShortNameEdit->GetText());
     325           0 :     if (!aGlosName.isEmpty())
     326             :     {
     327           0 :         pGlossaryHdl->InsertGlossary(aGlosName);
     328             :     }
     329           0 :     if( SfxRequest::HasMacroRecorder( pSh->GetView().GetViewFrame() ) )
     330             :     {
     331           0 :         SfxRequest aReq( pSh->GetView().GetViewFrame(), FN_INSERT_GLOSSARY );
     332           0 :         OUString sTemp(::GetCurrGlosGroup());
     333             :         // the zeroth path is not being recorded!
     334           0 :         if (sTemp.getToken(1, GLOS_DELIM).startsWith("0"))
     335           0 :             sTemp = sTemp.getToken(0, GLOS_DELIM);
     336           0 :         aReq.AppendItem(SfxStringItem(FN_INSERT_GLOSSARY, sTemp));
     337           0 :         aReq.AppendItem(SfxStringItem(FN_PARAM_1, aGlosName));
     338           0 :         aReq.Done();
     339           0 :     }
     340           0 : }
     341             : 
     342           0 : void SwGlossaryDlg::EnableShortName(bool bOn)
     343             : {
     344           0 :     m_pShortNameLbl->Enable(bOn);
     345           0 :     m_pShortNameEdit->Enable(bOn);
     346           0 : }
     347             : 
     348             : // does the title exist in the selected group?
     349           0 : SvTreeListEntry* SwGlossaryDlg::DoesBlockExist(const OUString& rBlock,
     350             :                 const OUString& rShort)
     351             : {
     352             :     // look for possible entry in TreeListBox
     353           0 :     SvTreeListEntry* pEntry = m_pCategoryBox->FirstSelected();
     354           0 :     if(pEntry)
     355             :     {
     356           0 :         if(m_pCategoryBox->GetParent(pEntry))
     357           0 :             pEntry = m_pCategoryBox->GetParent(pEntry);
     358           0 :         sal_uInt32 nChildCount = m_pCategoryBox->GetChildCount( pEntry );
     359           0 :         for(sal_uInt32 i = 0; i < nChildCount; i++)
     360             :         {
     361           0 :             SvTreeListEntry* pChild = m_pCategoryBox->GetEntry( pEntry, i );
     362           0 :             if (rBlock == m_pCategoryBox->GetEntryText(pChild) &&
     363           0 :                 (rShort.isEmpty() ||
     364           0 :                  rShort==*static_cast<OUString*>(pChild->GetUserData()))
     365             :                )
     366             :             {
     367           0 :                 return pChild;
     368             :             }
     369             :         }
     370             :     }
     371           0 :     return 0;
     372             : }
     373             : 
     374           0 : IMPL_LINK( SwGlossaryDlg, NameModify, Edit *, pEdit )
     375             : {
     376           0 :     const OUString aName(m_pNameED->GetText());
     377           0 :     bool bNameED = pEdit == m_pNameED;
     378           0 :     if( aName.isEmpty() )
     379             :     {
     380           0 :         if(bNameED)
     381           0 :             m_pShortNameEdit->SetText(aName);
     382           0 :         m_pInsertBtn->Enable(false);
     383           0 :         return 0;
     384             :     }
     385           0 :     const bool bNotFound = !DoesBlockExist(aName, bNameED ? OUString() : pEdit->GetText());
     386           0 :     if(bNameED)
     387             :     {
     388             :             // did the text get in to the Listbbox in the Edit with a click?
     389           0 :         if(bNotFound)
     390             :         {
     391           0 :             m_pShortNameEdit->SetText( lcl_GetValidShortCut( aName ) );
     392           0 :             EnableShortName();
     393             :         }
     394             :         else
     395             :         {
     396           0 :             m_pShortNameEdit->SetText(pGlossaryHdl->GetGlossaryShortName(aName));
     397           0 :             EnableShortName(!bReadOnly);
     398             :         }
     399           0 :         m_pInsertBtn->Enable(!bNotFound && !bIsDocReadOnly);
     400             :     }
     401             :     else
     402             :     {
     403             :         //ShortNameEdit
     404           0 :         if(!bNotFound)
     405             :         {
     406           0 :             bool bEnable = !bNotFound;
     407           0 :             bEnable &= !bIsDocReadOnly;
     408           0 :             m_pInsertBtn->Enable(bEnable);
     409             :         }
     410             :     }
     411           0 :     return 0;
     412             : }
     413             : 
     414           0 : IMPL_LINK( SwGlossaryDlg, NameDoubleClick, SvTreeListBox*, pBox )
     415             : {
     416           0 :     SvTreeListEntry* pEntry = pBox->FirstSelected();
     417           0 :     if(pBox->GetParent(pEntry) && !bIsDocReadOnly)
     418           0 :         EndDialog( RET_OK );
     419           0 :     return 0;
     420             : }
     421             : 
     422           0 : IMPL_LINK_TYPED( SwGlossaryDlg, EnableHdl, Menu *, pMn, bool )
     423             : {
     424           0 :     SvTreeListEntry* pEntry = m_pCategoryBox->FirstSelected();
     425             : 
     426           0 :     const OUString aEditText(m_pNameED->GetText());
     427           0 :     const bool bHasEntry = !aEditText.isEmpty() && !m_pShortNameEdit->GetText().isEmpty();
     428           0 :     const bool bExists = 0 != DoesBlockExist(aEditText, m_pShortNameEdit->GetText());
     429           0 :     const bool bIsGroup = pEntry && !m_pCategoryBox->GetParent(pEntry);
     430           0 :     pMn->EnableItem("new", bSelection && bHasEntry && !bExists);
     431           0 :     pMn->EnableItem("newtext", bSelection && bHasEntry && !bExists);
     432           0 :     pMn->EnableItem("copy", bExists && !bIsGroup);
     433           0 :     pMn->EnableItem("replace", bSelection && bExists && !bIsGroup && !bIsOld );
     434           0 :     pMn->EnableItem("replacetext", bSelection && bExists && !bIsGroup && !bIsOld );
     435           0 :     pMn->EnableItem("edit", bExists && !bIsGroup );
     436           0 :     pMn->EnableItem("rename", bExists && !bIsGroup );
     437           0 :     pMn->EnableItem("delete", bExists && !bIsGroup );
     438           0 :     pMn->EnableItem("macro", bExists && !bIsGroup && !bIsOld &&
     439           0 :                                     !pGlossaryHdl->IsReadOnly() );
     440           0 :     pMn->EnableItem("import", bIsGroup && !bIsOld && !pGlossaryHdl->IsReadOnly() );
     441           0 :     return true;
     442             : }
     443             : 
     444           0 : IMPL_LINK( SwGlossaryDlg, MenuHdl, Menu *, pMn )
     445             : {
     446           0 :     OString sItemIdent(pMn->GetCurItemIdent());
     447             : 
     448           0 :     if (sItemIdent == "replace")
     449             :     {
     450           0 :         pGlossaryHdl->NewGlossary(m_pNameED->GetText(),
     451           0 :                                   m_pShortNameEdit->GetText(),
     452           0 :                                   false, false);
     453             :     }
     454           0 :     else if (sItemIdent == "replacetext")
     455             :     {
     456           0 :         pGlossaryHdl->NewGlossary(m_pNameED->GetText(),
     457           0 :                                   m_pShortNameEdit->GetText(),
     458           0 :                                   false, true);
     459             :     }
     460           0 :     else if (sItemIdent == "new" || sItemIdent == "newtext")
     461             :     {
     462           0 :         bool bNoAttr = sItemIdent == "newtext";
     463             : 
     464           0 :         const OUString aStr(m_pNameED->GetText());
     465           0 :         const OUString aShortName(m_pShortNameEdit->GetText());
     466           0 :         if(pGlossaryHdl->HasShortName(aShortName))
     467             :         {
     468           0 :             ScopedVclPtrInstance<MessageDialog>::Create(this, SW_RES(STR_DOUBLE_SHORTNAME), VCL_MESSAGE_INFO)->Execute();
     469           0 :             m_pShortNameEdit->SetSelection(Selection(0, SELECTION_MAX));
     470           0 :             m_pShortNameEdit->GrabFocus();
     471           0 :             return 1;
     472             :         }
     473           0 :         if(pGlossaryHdl->NewGlossary(aStr, aShortName, false, bNoAttr ))
     474             :         {
     475           0 :             SvTreeListEntry* pEntry = m_pCategoryBox->FirstSelected();
     476           0 :             if(m_pCategoryBox->GetParent(pEntry))
     477           0 :                 pEntry = m_pCategoryBox->GetParent(pEntry);
     478             : 
     479           0 :             SvTreeListEntry* pChild = m_pCategoryBox->InsertEntry(aStr, pEntry);
     480           0 :             pChild->SetUserData(new OUString(aShortName));
     481           0 :             m_pNameED->SetText(aStr);
     482           0 :             m_pShortNameEdit->SetText(aShortName);
     483           0 :             NameModify(m_pNameED);       // for toggling the buttons
     484             : 
     485           0 :             if( SfxRequest::HasMacroRecorder( pSh->GetView().GetViewFrame() ) )
     486             :             {
     487           0 :                 SfxRequest aReq(pSh->GetView().GetViewFrame(), FN_NEW_GLOSSARY);
     488           0 :                 OUString sTemp(::GetCurrGlosGroup());
     489             :                 // the zeroth path is not being recorded!
     490           0 :                 if (sTemp.getToken(1, GLOS_DELIM).startsWith("0"))
     491           0 :                     sTemp = sTemp.getToken(0, GLOS_DELIM);
     492           0 :                 aReq.AppendItem(SfxStringItem(FN_NEW_GLOSSARY, sTemp));
     493           0 :                 aReq.AppendItem(SfxStringItem(FN_PARAM_1, aShortName));
     494           0 :                 aReq.AppendItem(SfxStringItem(FN_PARAM_2, aStr));
     495           0 :                 aReq.Done();
     496             :             }
     497           0 :         }
     498             :     }
     499           0 :     else if (sItemIdent == "copy")
     500             :     {
     501           0 :         pGlossaryHdl->CopyToClipboard(*pSh, m_pShortNameEdit->GetText());
     502             :     }
     503           0 :     else if (sItemIdent == "rename")
     504             :     {
     505           0 :         m_pShortNameEdit->SetText(pGlossaryHdl->GetGlossaryShortName(m_pNameED->GetText()));
     506           0 :         ScopedVclPtrInstance<SwNewGlosNameDlg> pNewNameDlg(this, m_pNameED->GetText(),
     507           0 :                                                            m_pShortNameEdit->GetText());
     508           0 :         if( RET_OK == pNewNameDlg->Execute() &&
     509           0 :             pGlossaryHdl->Rename( m_pShortNameEdit->GetText(),
     510             :                                     pNewNameDlg->GetNewShort(),
     511           0 :                                     pNewNameDlg->GetNewName()))
     512             :         {
     513           0 :             SvTreeListEntry* pEntry = m_pCategoryBox->FirstSelected();
     514           0 :             SvTreeListEntry* pNewEntry = m_pCategoryBox->InsertEntry(
     515           0 :                     pNewNameDlg->GetNewName(), m_pCategoryBox->GetParent(pEntry));
     516           0 :             pNewEntry->SetUserData(new OUString(pNewNameDlg->GetNewShort()));
     517           0 :             delete static_cast<OUString*>(pEntry->GetUserData());
     518           0 :             m_pCategoryBox->GetModel()->Remove(pEntry);
     519           0 :             m_pCategoryBox->Select(pNewEntry);
     520           0 :             m_pCategoryBox->MakeVisible(pNewEntry);
     521             :         }
     522           0 :         GrpSelect(m_pCategoryBox);
     523             :     }
     524           0 :     else if (sItemIdent == "delete")
     525             :     {
     526           0 :         ScopedVclPtrInstance< MessageDialog > aQuery(this, SW_RES(STR_QUERY_DELETE), VCL_MESSAGE_QUESTION, VCL_BUTTONS_YES_NO);
     527           0 :         if (RET_YES == aQuery->Execute())
     528             :         {
     529           0 :             const OUString aShortName(m_pShortNameEdit->GetText());
     530           0 :             const OUString aTitle(m_pNameED->GetText());
     531           0 :             if (!aTitle.isEmpty() && pGlossaryHdl->DelGlossary(aShortName))
     532             :             {
     533           0 :                 SvTreeListEntry* pChild = DoesBlockExist(aTitle, aShortName);
     534             :                 OSL_ENSURE(pChild, "entry not found!");
     535           0 :                 SvTreeListEntry* pParent = m_pCategoryBox->GetParent(pChild);
     536           0 :                 m_pCategoryBox->Select(pParent);
     537             : 
     538           0 :                 m_pCategoryBox->GetModel()->Remove(pChild);
     539           0 :                 m_pNameED->SetText(OUString());
     540           0 :                 NameModify(m_pNameED);
     541           0 :             }
     542           0 :         }
     543             :     }
     544           0 :     else if (sItemIdent == "macro")
     545             :     {
     546           0 :         SfxItemSet aSet( pSh->GetAttrPool(), RES_FRMMACRO, RES_FRMMACRO, SID_EVENTCONFIG, SID_EVENTCONFIG, 0 );
     547             : 
     548           0 :         SvxMacro aStart(aEmptyOUStr, aEmptyOUStr, STARBASIC);
     549           0 :         SvxMacro aEnd(aEmptyOUStr, aEmptyOUStr, STARBASIC);
     550           0 :         pGlossaryHdl->GetMacros(m_pShortNameEdit->GetText(), aStart, aEnd );
     551             : 
     552           0 :         SvxMacroItem aItem(RES_FRMMACRO);
     553           0 :         if( aStart.HasMacro() )
     554           0 :             aItem.SetMacro( SW_EVENT_START_INS_GLOSSARY, aStart );
     555           0 :         if( aEnd.HasMacro() )
     556           0 :             aItem.SetMacro( SW_EVENT_END_INS_GLOSSARY, aEnd );
     557             : 
     558           0 :         aSet.Put( aItem );
     559           0 :         aSet.Put( SwMacroAssignDlg::AddEvents( MACASSGN_AUTOTEXT ) );
     560             : 
     561             :         const SfxPoolItem* pItem;
     562           0 :         SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
     563             :         boost::scoped_ptr<SfxAbstractDialog> pMacroDlg(pFact->CreateSfxDialog( this, aSet,
     564           0 :             pSh->GetView().GetViewFrame()->GetFrame().GetFrameInterface(), SID_EVENTCONFIG ));
     565           0 :         if ( pMacroDlg && pMacroDlg->Execute() == RET_OK &&
     566           0 :             SfxItemState::SET == pMacroDlg->GetOutputItemSet()->GetItemState( RES_FRMMACRO, false, &pItem ) )
     567             :         {
     568           0 :             const SvxMacroTableDtor& rTable = static_cast<const SvxMacroItem*>(pItem)->GetMacroTable();
     569           0 :             pGlossaryHdl->SetMacros( m_pShortNameEdit->GetText(),
     570             :                                         rTable.Get( SW_EVENT_START_INS_GLOSSARY ),
     571           0 :                                         rTable.Get( SW_EVENT_END_INS_GLOSSARY ) );
     572           0 :         }
     573             :     }
     574           0 :     else if (sItemIdent == "import")
     575             :     {
     576             :         // call the FileOpenDialog do find WinWord - Files with templates
     577           0 :         FileDialogHelper aDlgHelper( TemplateDescription::FILEOPEN_SIMPLE, 0 );
     578           0 :         uno::Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker();
     579             : 
     580           0 :         SvtPathOptions aPathOpt;
     581           0 :         xFP->setDisplayDirectory(aPathOpt.GetWorkPath() );
     582             : 
     583           0 :         uno::Reference<XFilterManager> xFltMgr(xFP, UNO_QUERY);
     584           0 :         SfxFilterMatcher aMatcher( OUString::createFromAscii(SwDocShell::Factory().GetShortName()) );
     585           0 :         SfxFilterMatcherIter aIter( aMatcher );
     586           0 :         const SfxFilter* pFilter = aIter.First();
     587           0 :         while ( pFilter )
     588             :         {
     589           0 :             if( pFilter->GetUserData() == FILTER_WW8 )
     590             :             {
     591           0 :                 xFltMgr->appendFilter( pFilter->GetUIName(),
     592           0 :                             pFilter->GetWildcard().getGlob() );
     593           0 :                 xFltMgr->setCurrentFilter( pFilter->GetUIName() ) ;
     594             :             }
     595             : 
     596           0 :             pFilter = aIter.Next();
     597             :         }
     598             : 
     599           0 :         if( aDlgHelper.Execute() == ERRCODE_NONE )
     600             :         {
     601           0 :             if( pGlossaryHdl->ImportGlossaries( xFP->getFiles().getConstArray()[0] ))
     602           0 :                 Init();
     603             :             else
     604             :             {
     605           0 :                 ScopedVclPtrInstance<MessageDialog>::Create(this, SW_RES( STR_NO_GLOSSARIES ), VCL_MESSAGE_INFO)->Execute();
     606             :             }
     607           0 :         }
     608             :     }
     609             :     else
     610             :     {
     611           0 :         return 0;
     612             :     }
     613           0 :     return 1;
     614             : }
     615             : 
     616             : // dialog manage regions
     617           0 : IMPL_LINK_NOARG(SwGlossaryDlg, BibHdl)
     618             : {
     619           0 :     SwGlossaries* pGloss = ::GetGlossaries();
     620           0 :     if( pGloss->IsGlosPathErr() )
     621           0 :         pGloss->ShowError();
     622             :     else
     623             :     {
     624             :         //check if at least one glossary path is write enabled
     625           0 :         SvtPathOptions aPathOpt;
     626           0 :         const OUString sGlosPath( aPathOpt.GetAutoTextPath() );
     627           0 :         const sal_Int32 nPaths = comphelper::string::getTokenCount(sGlosPath, ';');
     628           0 :         bool bIsWritable = false;
     629           0 :         for(sal_Int32 nPath = 0; nPath < nPaths; nPath++)
     630             :         {
     631             :             const OUString sPath = URIHelper::SmartRel2Abs(
     632             :                 INetURLObject(), sGlosPath.getToken(nPath, ';'),
     633           0 :                 URIHelper::GetMaybeFileHdl());
     634             :             try
     635             :             {
     636             :                 Content aTestContent( sPath,
     637             :                             uno::Reference< XCommandEnvironment >(),
     638           0 :                             comphelper::getProcessComponentContext() );
     639           0 :                 Any aAny = aTestContent.getPropertyValue( "IsReadOnly" );
     640           0 :                 if(aAny.hasValue())
     641             :                 {
     642           0 :                     bIsWritable = !*static_cast<sal_Bool const *>(aAny.getValue());
     643           0 :                 }
     644             :             }
     645           0 :             catch (const Exception&)
     646             :             {
     647             :             }
     648           0 :             if(bIsWritable)
     649           0 :                 break;
     650           0 :         }
     651           0 :         if(bIsWritable)
     652             :         {
     653             : 
     654           0 :             ScopedVclPtrInstance< SwGlossaryGroupDlg > pDlg( this, pGloss->GetPathArray(), pGlossaryHdl );
     655           0 :             if ( RET_OK == pDlg->Execute() )
     656             :             {
     657           0 :                 Init();
     658             :                 //if new groups were created - select one of them
     659           0 :                 const OUString sNewGroup = pDlg->GetCreatedGroupName();
     660           0 :                 SvTreeListEntry* pEntry = m_pCategoryBox->First();
     661           0 :                 while (!sNewGroup.isEmpty() && pEntry)
     662             :                 {
     663           0 :                     if(!m_pCategoryBox->GetParent(pEntry))
     664             :                     {
     665           0 :                         GroupUserData* pGroupData = static_cast<GroupUserData*>(pEntry->GetUserData());
     666             :                         const OUString sGroup = pGroupData->sGroupName
     667           0 :                             + OUStringLiteral1<GLOS_DELIM>()
     668           0 :                             + OUString::number(pGroupData->nPathIdx);
     669           0 :                         if(sGroup == sNewGroup)
     670             :                         {
     671           0 :                             m_pCategoryBox->Select(pEntry);
     672           0 :                             m_pCategoryBox->MakeVisible(pEntry);
     673           0 :                             GrpSelect(m_pCategoryBox);
     674           0 :                             break;
     675           0 :                         }
     676             :                     }
     677           0 :                     pEntry = m_pCategoryBox->Next(pEntry);
     678           0 :                 }
     679             : 
     680           0 :             }
     681             :         }
     682             :         else
     683             :         {
     684           0 :             ScopedVclPtrInstance< MessageDialog > aBox(this, sReadonlyPath, VCL_MESSAGE_QUESTION, VCL_BUTTONS_YES_NO);
     685             : 
     686           0 :             if(RET_YES == aBox->Execute())
     687           0 :                 PathHdl(m_pPathBtn);
     688           0 :         }
     689             :     }
     690           0 :     return 0;
     691             : }
     692             : 
     693             : // initialisation; from Ctor and after editing regions
     694           0 : void SwGlossaryDlg::Init()
     695             : {
     696           0 :     m_pCategoryBox->SetUpdateMode( false );
     697           0 :     m_pCategoryBox->Clear();
     698             :     // display text block regions
     699           0 :     const size_t nCnt = pGlossaryHdl->GetGroupCnt();
     700           0 :     SvTreeListEntry* pSelEntry = 0;
     701           0 :     const OUString sSelStr(::GetCurrGlosGroup().getToken(0, GLOS_DELIM));
     702           0 :     const sal_Int32 nSelPath = ::GetCurrGlosGroup().getToken(1, GLOS_DELIM).toInt32();
     703             :     // #i66304# - "My AutoText" comes from mytexts.bau, but should be translated
     704           0 :     const OUString sMyAutoTextEnglish("My AutoText");
     705           0 :     const OUString sMyAutoTextTranslated(SW_RES(STR_MY_AUTOTEXT));
     706           0 :     for(size_t nId = 0; nId < nCnt; ++nId )
     707             :     {
     708           0 :         OUString sTitle;
     709           0 :         OUString sGroupName(pGlossaryHdl->GetGroupName(nId, &sTitle));
     710           0 :         if(sGroupName.isEmpty())
     711           0 :             continue;
     712           0 :         if(sTitle.isEmpty())
     713           0 :             sTitle = sGroupName.getToken( 0, GLOS_DELIM );
     714           0 :         if(sTitle == sMyAutoTextEnglish)
     715           0 :             sTitle = sMyAutoTextTranslated;
     716           0 :         SvTreeListEntry* pEntry = m_pCategoryBox->InsertEntry( sTitle );
     717           0 :         const sal_Int32 nPath = sGroupName.getToken( 1, GLOS_DELIM ).toInt32();
     718             : 
     719           0 :         GroupUserData* pData = new GroupUserData;
     720           0 :         pData->sGroupName = sGroupName.getToken(0, GLOS_DELIM);
     721           0 :         pData->nPathIdx = static_cast< sal_uInt16 >(nPath);
     722           0 :         pData->bReadonly = pGlossaryHdl->IsReadOnly(&sGroupName);
     723             : 
     724           0 :         pEntry->SetUserData(pData);
     725           0 :         if(sSelStr == pData->sGroupName && nSelPath == nPath)
     726           0 :             pSelEntry = pEntry;
     727             : 
     728             :         // fill entries for the groups
     729             :         {
     730           0 :             pGlossaryHdl->SetCurGroup(sGroupName, false, true);
     731           0 :             const sal_uInt16 nCount = pGlossaryHdl->GetGlossaryCnt();
     732           0 :             for(sal_uInt16 i = 0; i < nCount; ++i)
     733             :             {
     734           0 :                 SvTreeListEntry* pChild = m_pCategoryBox->InsertEntry(
     735           0 :                                     pGlossaryHdl->GetGlossaryName(i), pEntry);
     736           0 :                 pChild->SetUserData(new OUString(pGlossaryHdl->GetGlossaryShortName(i)));
     737             :             }
     738             :         }
     739           0 :     }
     740             :         // set current group and display text blocks
     741           0 :     if(!pSelEntry)
     742             :     {
     743             :         //find a non-readonly group
     744           0 :         SvTreeListEntry* pSearch = m_pCategoryBox->First();
     745           0 :         while(pSearch)
     746             :         {
     747           0 :             if(!m_pCategoryBox->GetParent(pSearch))
     748             :             {
     749           0 :                 GroupUserData* pData = static_cast<GroupUserData*>(pSearch->GetUserData());
     750           0 :                 if(!pData->bReadonly)
     751             :                 {
     752           0 :                     pSelEntry = pSearch;
     753           0 :                     break;
     754             :                 }
     755             :             }
     756           0 :             pSearch = m_pCategoryBox->Next(pSearch);
     757             :         }
     758           0 :         if(!pSelEntry)
     759           0 :             pSelEntry = m_pCategoryBox->GetEntry(0);
     760             :     }
     761           0 :     if(pSelEntry)
     762             :     {
     763           0 :         m_pCategoryBox->Expand(pSelEntry);
     764           0 :         m_pCategoryBox->Select(pSelEntry);
     765           0 :         m_pCategoryBox->MakeVisible(pSelEntry);
     766           0 :         GrpSelect(m_pCategoryBox);
     767             :     }
     768             :     //JP 16.11.99: the SvxTreeListBox has a Bug. The Box dont recalc the
     769             :     //      outputsize, when all entries are insertet. The result is, that
     770             :     //      the Focus/Highlight rectangle is to large and paintet over the
     771             :     //      HScrollbar. -> Fix: call the resize
     772           0 :     m_pCategoryBox->Resize();
     773             : 
     774           0 :     m_pCategoryBox->GetModel()->Resort();
     775           0 :     m_pCategoryBox->SetUpdateMode( true );
     776           0 :     m_pCategoryBox->Update();
     777             : 
     778           0 :     const SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
     779           0 :     m_pFileRelCB->Check( rCfg.IsSaveRelFile() );
     780           0 :     m_pFileRelCB->SetClickHdl(LINK(this, SwGlossaryDlg, CheckBoxHdl));
     781           0 :     m_pNetRelCB->Check( rCfg.IsSaveRelNet() );
     782           0 :     m_pNetRelCB->SetClickHdl(LINK(this, SwGlossaryDlg, CheckBoxHdl));
     783           0 :     m_pInsertTipCB->Check( rCfg.IsAutoTextTip() );
     784           0 :     m_pInsertTipCB->SetClickHdl(LINK(this, SwGlossaryDlg, CheckBoxHdl));
     785           0 : }
     786             : 
     787           0 : IMPL_LINK_NOARG_TYPED(SwGlossaryDlg, EditHdl, MenuButton *, void)
     788             : {
     789             : // EndDialog must not be called in MenuHdl
     790           0 :     if (m_pEditBtn->GetCurItemIdent() == "edit")
     791             :     {
     792           0 :         SwTextBlocks *pGroup = ::GetGlossaries()->GetGroupDoc (  GetCurrGrpName () );
     793           0 :         delete pGroup;
     794           0 :         EndDialog(RET_EDIT);
     795             :     }
     796           0 : }
     797             : 
     798             : // KeyInput for ShortName - Edits without Spaces
     799           0 : IMPL_LINK( SwNewGlosNameDlg, Modify, Edit *, pBox )
     800             : {
     801           0 :     OUString aName(m_pNewName->GetText());
     802           0 :     SwGlossaryDlg* pDlg = static_cast<SwGlossaryDlg*>(GetParent());
     803           0 :     if (pBox == m_pNewName)
     804           0 :         m_pNewShort->SetText( lcl_GetValidShortCut( aName ) );
     805             : 
     806           0 :     bool bEnable = !aName.isEmpty() && !m_pNewShort->GetText().isEmpty() &&
     807           0 :         (!pDlg->DoesBlockExist(aName, m_pNewShort->GetText())
     808           0 :             || aName == m_pOldName->GetText());
     809           0 :     m_pOk->Enable(bEnable);
     810           0 :     return 0;
     811             : }
     812             : 
     813           0 : IMPL_LINK_NOARG(SwNewGlosNameDlg, Rename)
     814             : {
     815           0 :     SwGlossaryDlg* pDlg = static_cast<SwGlossaryDlg*>(GetParent());
     816           0 :     OUString sNew = GetAppCharClass().uppercase(m_pNewShort->GetText());
     817           0 :     if( pDlg->pGlossaryHdl->HasShortName(m_pNewShort->GetText())
     818           0 :         && sNew != m_pOldShort->GetText() )
     819             :     {
     820           0 :         ScopedVclPtrInstance<MessageDialog>::Create(this, SW_RES(STR_DOUBLE_SHORTNAME), VCL_MESSAGE_INFO)->Execute();
     821           0 :         m_pNewShort->GrabFocus();
     822             :     }
     823             :     else
     824           0 :         EndDialog(RET_OK);
     825           0 :     return 0;
     826             : }
     827             : 
     828           0 : IMPL_LINK( SwGlossaryDlg, CheckBoxHdl, CheckBox *, pBox )
     829             : {
     830           0 :     SvxAutoCorrCfg& rCfg = SvxAutoCorrCfg::Get();
     831           0 :     bool bCheck = pBox->IsChecked();
     832           0 :     if (pBox == m_pInsertTipCB)
     833           0 :         rCfg.SetAutoTextTip(bCheck);
     834           0 :     else if(pBox == m_pFileRelCB)
     835           0 :         rCfg.SetSaveRelFile(bCheck);
     836             :     else
     837           0 :         rCfg.SetSaveRelNet(bCheck);
     838           0 :     rCfg.Commit();
     839           0 :     return 0;
     840             : }
     841             : 
     842             : // TreeListBox for groups and blocks
     843           0 : SwGlTreeListBox::SwGlTreeListBox(vcl::Window* pParent, WinBits nBits)
     844             :     : SvTreeListBox(pParent, nBits)
     845             :     , sReadonly(SW_RESSTR(SW_STR_READONLY)),
     846           0 :     pDragEntry(0)
     847             : {
     848           0 :     SetDragDropMode( DragDropMode::CTRL_MOVE|DragDropMode::CTRL_COPY );
     849           0 : }
     850             : 
     851           0 : Size SwGlTreeListBox::GetOptimalSize() const
     852             : {
     853           0 :     return LogicToPixel(Size(212, 84), MapMode(MAP_APPFONT));
     854             : }
     855             : 
     856           0 : VCL_BUILDER_FACTORY_ARGS(SwGlTreeListBox, WB_BORDER | WB_TABSTOP)
     857             : 
     858           0 : void SwGlTreeListBox::Clear()
     859             : {
     860           0 :     SvTreeListEntry* pEntry = First();
     861           0 :     while(pEntry)
     862             :     {
     863           0 :         if(GetParent(pEntry))
     864           0 :             delete static_cast<OUString*>(pEntry->GetUserData());
     865             :         else
     866           0 :             delete static_cast<GroupUserData*>(pEntry->GetUserData());
     867           0 :         pEntry = Next(pEntry);
     868             :     }
     869           0 :     SvTreeListBox::Clear();
     870           0 : }
     871             : 
     872           0 : void SwGlTreeListBox::RequestHelp( const HelpEvent& rHEvt )
     873             : {
     874           0 :     Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ));
     875           0 :     SvTreeListEntry* pEntry = GetEntry( aPos );
     876             :     // there's only help for groups' names
     877           0 :     if(pEntry)
     878             :     {
     879             :         SvLBoxTab* pTab;
     880           0 :         SvLBoxItem* pItem = GetItem( pEntry, aPos.X(), &pTab );
     881           0 :         if(pItem)
     882             :         {
     883           0 :             aPos = GetEntryPosition( pEntry );
     884           0 :              Size aSize(pItem->GetSize( this, pEntry ));
     885           0 :             aPos.X() = GetTabPos( pEntry, pTab );
     886             : 
     887           0 :             if((aPos.X() + aSize.Width()) > GetSizePixel().Width())
     888           0 :                 aSize.Width() = GetSizePixel().Width() - aPos.X();
     889           0 :             aPos = OutputToScreenPixel(aPos);
     890           0 :              Rectangle aItemRect( aPos, aSize );
     891           0 :             OUString sMsg;
     892           0 :             if(!GetParent(pEntry))
     893             :             {
     894           0 :                 GroupUserData* pData = static_cast<GroupUserData*>(pEntry->GetUserData());
     895           0 :                 const std::vector<OUString> & rPathArr = ::GetGlossaries()->GetPathArray();
     896           0 :                 if( !rPathArr.empty() )
     897             :                 {
     898           0 :                     INetURLObject aTmp(rPathArr[pData->nPathIdx]
     899           0 :                                        + "/"
     900           0 :                                        + pData->sGroupName
     901           0 :                                        + SwGlossaries::GetExtension());
     902           0 :                     sMsg = aTmp.GetPath();
     903             : 
     904           0 :                     if(pData->bReadonly)
     905             :                     {
     906           0 :                         sMsg += " (" + sReadonly + ")";
     907           0 :                     }
     908             :                 }
     909             :             }
     910             :             else
     911           0 :                 sMsg = *static_cast<OUString*>(pEntry->GetUserData());
     912             :             Help::ShowQuickHelp( this, aItemRect, sMsg,
     913           0 :                         QuickHelpFlags::Left|QuickHelpFlags::VCenter );
     914             :         }
     915             :     }
     916           0 : }
     917             : 
     918           0 : DragDropMode SwGlTreeListBox::NotifyStartDrag(
     919             :                     TransferDataContainer& /*rContainer*/,
     920             :                     SvTreeListEntry* pEntry )
     921             : {
     922             :     DragDropMode  eRet;
     923           0 :     pDragEntry = pEntry;
     924           0 :     if(!GetParent(pEntry))
     925           0 :         eRet = DragDropMode::NONE;
     926             :     else
     927             :     {
     928           0 :         SwGlossaryDlg* pDlg = static_cast<SwGlossaryDlg*>(GetParentDialog());
     929           0 :         SvTreeListEntry* pParent = GetParent(pEntry);
     930             : 
     931           0 :         GroupUserData* pGroupData = static_cast<GroupUserData*>(pParent->GetUserData());
     932             :         OUString sEntry = pGroupData->sGroupName
     933           0 :             + OUStringLiteral1<GLOS_DELIM>()
     934           0 :             + OUString::number(pGroupData->nPathIdx);
     935           0 :         sal_Int8 nDragOption = DND_ACTION_COPY;
     936           0 :         eRet = DragDropMode::CTRL_COPY;
     937           0 :         if(!pDlg->pGlossaryHdl->IsReadOnly(&sEntry))
     938             :         {
     939           0 :             eRet |= DragDropMode::CTRL_MOVE;
     940           0 :             nDragOption |= DND_ACTION_MOVE;
     941             :         }
     942           0 :         SetDragOptions( nDragOption );
     943             :     }
     944           0 :     return eRet;
     945             : }
     946             : 
     947           0 : bool SwGlTreeListBox::NotifyAcceptDrop( SvTreeListEntry* pEntry)
     948             : {
     949             :     // TODO: Readonly - check still missing!
     950           0 :     SvTreeListEntry* pSrcParent = GetParent(pEntry) ? GetParent(pEntry) : pEntry;
     951             :     SvTreeListEntry* pDestParent =
     952           0 :         GetParent(pDragEntry ) ? GetParent(pDragEntry ) : pDragEntry ;
     953           0 :     return pDestParent != pSrcParent;
     954             : 
     955             : }
     956             : 
     957           0 : TriState SwGlTreeListBox::NotifyMoving(   SvTreeListEntry*  pTarget,
     958             :                                     SvTreeListEntry*  pEntry,
     959             :                                     SvTreeListEntry*& /*rpNewParent*/,
     960             :                                     sal_uLong&        /*rNewChildPos*/
     961             :                                 )
     962             : {
     963           0 :     return NotifyCopyingOrMoving(pTarget, pEntry, true);
     964             : }
     965             : 
     966           0 : TriState SwGlTreeListBox::NotifyCopying(   SvTreeListEntry*  pTarget,
     967             :                                     SvTreeListEntry*  pEntry,
     968             :                                     SvTreeListEntry*& /*rpNewParent*/,
     969             :                                     sal_uLong&        /*rNewChildPos*/
     970             :                                 )
     971             : {
     972           0 :     return NotifyCopyingOrMoving(pTarget, pEntry, false);
     973             : }
     974             : 
     975           0 : TriState SwGlTreeListBox::NotifyCopyingOrMoving(
     976             :     SvTreeListEntry*  pTarget,
     977             :     SvTreeListEntry*  pEntry,
     978             :     bool              bIsMove)
     979             : {
     980           0 :     pDragEntry = 0;
     981             :     // 1. move in different groups?
     982             :     // 2. allowed to write to both groups?
     983           0 :     if(!pTarget) // move to the beginning
     984             :     {
     985           0 :         pTarget = GetEntry(0);
     986             :     }
     987           0 :     SvTreeListEntry* pSrcParent = GetParent(pEntry);
     988             :     SvTreeListEntry* pDestParent =
     989           0 :         GetParent(pTarget) ? GetParent(pTarget) : pTarget;
     990           0 :     if(pDestParent != pSrcParent)
     991             :     {
     992           0 :         SwGlossaryDlg* pDlg = static_cast<SwGlossaryDlg*>(GetParentDialog());
     993           0 :         SwWait aWait( *pDlg->pSh->GetView().GetDocShell(), true );
     994             : 
     995           0 :         GroupUserData* pGroupData = static_cast<GroupUserData*>(pSrcParent->GetUserData());
     996             :         OUString sSourceGroup = pGroupData->sGroupName
     997           0 :             + OUStringLiteral1<GLOS_DELIM>()
     998           0 :             + OUString::number(pGroupData->nPathIdx);
     999             : 
    1000           0 :         pDlg->pGlossaryHdl->SetCurGroup(sSourceGroup);
    1001           0 :         OUString sTitle(GetEntryText(pEntry));
    1002           0 :         OUString sShortName(*static_cast<OUString*>(pEntry->GetUserData()));
    1003             : 
    1004           0 :         GroupUserData* pDestData = static_cast<GroupUserData*>(pDestParent->GetUserData());
    1005             :         OUString sDestName = pDestData->sGroupName
    1006           0 :             + OUStringLiteral1<GLOS_DELIM>()
    1007           0 :             + OUString::number(pDestData->nPathIdx);
    1008             : 
    1009             :         const bool bRet = pDlg->pGlossaryHdl->CopyOrMove( sSourceGroup,  sShortName,
    1010           0 :                         sDestName, sTitle, bIsMove );
    1011           0 :         if(bRet)
    1012             :         {
    1013           0 :             SvTreeListEntry* pChild = InsertEntry(sTitle, pDestParent);
    1014           0 :             pChild->SetUserData(new OUString(sShortName));
    1015           0 :             if (bIsMove)
    1016             :             {
    1017           0 :                 GetModel()->Remove(pEntry);
    1018             :             }
    1019           0 :         }
    1020             :     }
    1021           0 :     return TRISTATE_FALSE; // otherwise the entry is being set automatically
    1022             : }
    1023             : 
    1024           0 : OUString SwGlossaryDlg::GetCurrGrpName() const
    1025             : {
    1026           0 :     SvTreeListEntry* pEntry = m_pCategoryBox->FirstSelected();
    1027           0 :     if(pEntry)
    1028             :     {
    1029             :         pEntry =
    1030           0 :             m_pCategoryBox->GetParent(pEntry) ? m_pCategoryBox->GetParent(pEntry) : pEntry;
    1031           0 :         GroupUserData* pGroupData = static_cast<GroupUserData*>(pEntry->GetUserData());
    1032           0 :         return pGroupData->sGroupName + OUStringLiteral1<GLOS_DELIM>() + OUString::number(pGroupData->nPathIdx);
    1033             :     }
    1034           0 :     return OUString();
    1035             : }
    1036             : 
    1037           0 : IMPL_LINK( SwGlossaryDlg, PathHdl, Button *, pBtn )
    1038             : {
    1039           0 :     SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
    1040           0 :     if(pFact)
    1041             :     {
    1042           0 :         boost::scoped_ptr<AbstractSvxMultiPathDialog> pDlg(pFact->CreateSvxPathSelectDialog(pBtn));
    1043             :         OSL_ENSURE(pDlg, "Dialog creation failed!");
    1044           0 :         SvtPathOptions aPathOpt;
    1045           0 :         const OUString sGlosPath( aPathOpt.GetAutoTextPath() );
    1046           0 :         pDlg->SetPath(sGlosPath);
    1047           0 :         if(RET_OK == pDlg->Execute())
    1048             :         {
    1049           0 :             const OUString sTmp(pDlg->GetPath());
    1050           0 :             if(sTmp != sGlosPath)
    1051             :             {
    1052           0 :                 aPathOpt.SetAutoTextPath( sTmp );
    1053           0 :                 ::GetGlossaries()->UpdateGlosPath( true );
    1054           0 :                 Init();
    1055           0 :             }
    1056           0 :         }
    1057             :     }
    1058           0 :     return 0;
    1059             : }
    1060             : 
    1061           0 : IMPL_LINK_NOARG(SwGlossaryDlg, InsertHdl)
    1062             : {
    1063           0 :     EndDialog(RET_OK);
    1064           0 :     return 0;
    1065             : }
    1066             : 
    1067           0 : void SwGlossaryDlg::ShowPreview()
    1068             : {
    1069             :     //create example
    1070           0 :     if (!pExampleFrame)
    1071             :     {
    1072           0 :         Link<> aLink(LINK(this, SwGlossaryDlg, PreviewLoadedHdl));
    1073           0 :         pExampleFrame = new SwOneExampleFrame( *m_pExampleWIN,
    1074           0 :                         EX_SHOW_ONLINE_LAYOUT, &aLink );
    1075             :     }
    1076             : 
    1077           0 :     ShowAutoText(::GetCurrGlosGroup(), m_pShortNameEdit->GetText());
    1078           0 : };
    1079             : 
    1080           0 : IMPL_LINK_NOARG(SwGlossaryDlg, PreviewLoadedHdl)
    1081             : {
    1082           0 :     ResumeShowAutoText();
    1083           0 :     return 0;
    1084             : }
    1085             : 
    1086           0 : void SwGlossaryDlg::ShowAutoText(const OUString& rGroup, const OUString& rShortName)
    1087             : {
    1088           0 :     if(m_pExampleWIN->IsVisible())
    1089             :     {
    1090           0 :         SetResumeData(rGroup, rShortName);
    1091             :         //try to make an Undo()
    1092           0 :         pExampleFrame->ClearDocument( true );
    1093             :     }
    1094           0 : }
    1095             : 
    1096           0 : void SwGlossaryDlg::ResumeShowAutoText()
    1097             : {
    1098           0 :     OUString sGroup;
    1099           0 :     OUString sShortName;
    1100           0 :     if(GetResumeData(sGroup, sShortName) && m_pExampleWIN->IsVisible())
    1101             :     {
    1102           0 :         if(!m_xAutoText.is())
    1103             :         {
    1104             :             //now the AutoText ListBoxes have to be filled
    1105           0 :             m_xAutoText = text::AutoTextContainer::create( comphelper::getProcessComponentContext() );
    1106             :         }
    1107             : 
    1108           0 :         uno::Reference< XTextCursor > & xCrsr = pExampleFrame->GetTextCursor();
    1109           0 :         if(xCrsr.is())
    1110             :         {
    1111           0 :             if (!sShortName.isEmpty())
    1112             :             {
    1113           0 :                 uno::Any aGroup = m_xAutoText->getByName(sGroup);
    1114           0 :                 uno::Reference< XAutoTextGroup >  xGroup;
    1115           0 :                 OUString uShortName(sShortName);
    1116           0 :                 if((aGroup >>= xGroup) && xGroup->hasByName(uShortName))
    1117             :                 {
    1118           0 :                     uno::Any aEntry(xGroup->getByName(uShortName));
    1119           0 :                     uno::Reference< XAutoTextEntry >  xEntry;
    1120           0 :                     aEntry >>= xEntry;
    1121           0 :                     uno::Reference< XTextRange >  xRange(xCrsr, uno::UNO_QUERY);
    1122           0 :                     xEntry->applyTo(xRange);
    1123           0 :                 }
    1124             :             }
    1125             :         }
    1126             :     }
    1127           0 :     ResetResumeData();
    1128           0 : }
    1129             : 
    1130             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11