LCOV - code coverage report
Current view: top level - libreoffice/sw/source/ui/utlui - glbltree.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 1 737 0.1 %
Date: 2012-12-27 Functions: 2 52 3.8 %
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 <vcl/msgbox.hxx>
      21             : #include <svl/stritem.hxx>
      22             : #include <sfx2/fcontnr.hxx>
      23             : #include <sfx2/linkmgr.hxx>
      24             : #include <sfx2/dispatch.hxx>
      25             : #include <svl/urihelper.hxx>
      26             : #include <sfx2/docfile.hxx>
      27             : #include <vcl/help.hxx>
      28             : #include <sot/filelist.hxx>
      29             : #include <svl/eitem.hxx>
      30             : #include <svl/urlbmk.hxx>
      31             : #include <svtools/filter.hxx>
      32             : #include "svtools/treelistentry.hxx"
      33             : #include <sfx2/docinsert.hxx>
      34             : #include <sfx2/filedlghelper.hxx>
      35             : 
      36             : #include <sfx2/app.hxx>
      37             : #include <swmodule.hxx>
      38             : #include <wrtsh.hxx>
      39             : #include <view.hxx>
      40             : #include <docsh.hxx>
      41             : #include <content.hxx>
      42             : #include <edglbldc.hxx>
      43             : #include <section.hxx>
      44             : #include <tox.hxx>
      45             : #include <cnttab.hxx>
      46             : #define NAVIPI_CXX
      47             : #include <navipi.hxx>
      48             : #include <navicont.hxx>
      49             : #include <edtwin.hxx>
      50             : #include <uitool.hxx>
      51             : 
      52             : #include <cmdid.h>
      53             : #include <helpid.h>
      54             : #include <navipi.hrc>
      55             : #include <utlui.hrc>
      56             : #include <comcore.hrc>
      57             : #include <globals.hrc>
      58             : #include "swabstdlg.hxx"
      59             : 
      60             : using namespace ::com::sun::star::uno;
      61             : using ::rtl::OUString;
      62             : 
      63             : // Kontextmenue fuer GlobalTree
      64             : #define CTX_INSERT_ANY_INDEX 10
      65             : #define CTX_INSERT_FILE     11
      66             : #define CTX_INSERT_NEW_FILE 12
      67             : #define CTX_INSERT_TEXT     13
      68             : 
      69             : #define CTX_UPDATE_SEL      20
      70             : #define CTX_UPDATE_INDEX    21
      71             : #define CTX_UPDATE_LINK     22
      72             : #define CTX_UPDATE_ALL      23
      73             : 
      74             : #define CTX_UPDATE          1
      75             : #define CTX_INSERT          2
      76             : #define CTX_EDIT            3
      77             : #define CTX_DELETE          4
      78             : #define CTX_EDIT_LINK       5
      79             : 
      80             : #define GLOBAL_UPDATE_TIMEOUT 2000
      81             : 
      82             : // Flags fuer PopupMenu-enable/disable
      83             : #define ENABLE_INSERT_IDX   0x0001
      84             : #define ENABLE_INSERT_FILE  0x0002
      85             : #define ENABLE_INSERT_TEXT  0x0004
      86             : #define ENABLE_EDIT         0x0008
      87             : #define ENABLE_DELETE       0x0010
      88             : #define ENABLE_UPDATE       0x0020
      89             : #define ENABLE_UPDATE_SEL   0x0040
      90             : #define ENABLE_EDIT_LINK    0x0080
      91             : 
      92             : // TabPos nach links schieben
      93             : #define  GLBL_TABPOS_SUB 5
      94             : 
      95             : const SfxObjectShell* SwGlobalTree::pShowShell = 0;
      96             : static const char* aHelpForMenu[] =
      97             : {
      98             :     0,                          //
      99             :     HID_GLBLTREE_UPDATE,        //CTX_UPDATE
     100             :     HID_GLBLTREE_INSERT,        //CTX_INSERT
     101             :     HID_GLBLTREE_EDIT,          //CTX_EDIT
     102             :     HID_GLBLTREE_DEL,           //CTX_DELETE
     103             :     HID_GLBLTREE_EDIT_LINK,     //CTX_EDIT_LINK
     104             :     0,                        //
     105             :     0,                        //
     106             :     0,                        //
     107             :     0,                        //
     108             :     HID_GLBLTREE_INS_IDX,       //CTX_INSERT_ANY_INDEX
     109             :     HID_GLBLTREE_INS_FILE,      //CTX_INSERT_FILE
     110             :     HID_GLBLTREE_INS_NEW_FILE,  //CTX_INSERT_NEW_FILE
     111             :     HID_GLBLTREE_INS_TEXT,      //CTX_INSERT_TEXT
     112             :     0,                          //
     113             :     0,                          //
     114             :     0,                          //
     115             :     0,                          //
     116             :     0,                          //
     117             :     0,                          //
     118             :     HID_GLBLTREE_UPD_SEL,       //CTX_UPDATE_SEL
     119             :     HID_GLBLTREE_UPD_IDX,       //CTX_UPDATE_INDEX
     120             :     HID_GLBLTREE_UPD_LINK,      //CTX_UPDATE_LINK
     121             :     HID_GLBLTREEUPD_ALL         //CTX_UPDATE_ALL
     122             : };
     123             : 
     124           0 : class SwGlobalFrameListener_Impl : public SfxListener
     125             : {
     126             :     sal_Bool bValid;
     127             : public:
     128           0 :     SwGlobalFrameListener_Impl(SfxViewFrame& rFrame) :
     129           0 :         bValid(sal_True)
     130             :         {
     131           0 :             StartListening(rFrame);
     132           0 :         }
     133             : 
     134             :     virtual void        Notify( SfxBroadcaster& rBC, const SfxHint& rHint );
     135             : 
     136           0 :     sal_Bool                IsValid() const {return bValid;}
     137             : };
     138             : 
     139           0 : void    SwGlobalFrameListener_Impl::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
     140             : {
     141           0 :     if( rHint.ISA(SfxSimpleHint) &&
     142           0 :             (((SfxSimpleHint&) rHint).GetId() == SFX_HINT_DYING))
     143           0 :         bValid = sal_False;
     144           0 : }
     145             : 
     146           0 : SwGlobalTree::SwGlobalTree(Window* pParent, const ResId& rResId) :
     147             : 
     148             :     SvTreeListBox(pParent, rResId),
     149             : 
     150             :     pActiveShell        ( NULL ),
     151             :     pEmphasisEntry      ( NULL ),
     152             :     pDDSource           ( NULL ),
     153             :     pSwGlblDocContents  ( NULL ),
     154             :     pDefParentWin       ( NULL ),
     155             :     pDocContent         ( NULL ),
     156             :     pDocInserter        ( NULL ),
     157             : 
     158             :     bIsInternalDrag         ( sal_False ),
     159             :     bLastEntryEmphasis      ( sal_False ),
     160           0 :     bIsImageListInitialized ( sal_False )
     161             : 
     162             : {
     163             :     SetDragDropMode(SV_DRAGDROP_APP_COPY  |
     164             :                     SV_DRAGDROP_CTRL_MOVE |
     165           0 :                     SV_DRAGDROP_ENABLE_TOP );
     166             : 
     167           0 :     aUpdateTimer.SetTimeout(GLOBAL_UPDATE_TIMEOUT);
     168           0 :     aUpdateTimer.SetTimeoutHdl(LINK(this, SwGlobalTree, Timeout));
     169           0 :     aUpdateTimer.Start();
     170           0 :     for(sal_uInt16 i = 0; i < GLOBAL_CONTEXT_COUNT; i++)
     171             :     {
     172           0 :         aContextStrings[i] = SW_RESSTR(i+ ST_GLOBAL_CONTEXT_FIRST);
     173             :     }
     174           0 :     SetHelpId(HID_NAVIGATOR_GLOB_TREELIST);
     175           0 :     SelectHdl();
     176           0 :     SetDoubleClickHdl(LINK(this, SwGlobalTree, DoubleClickHdl));
     177           0 :     EnableContextMenuHandling();
     178           0 : }
     179             : 
     180           0 : SwGlobalTree::~SwGlobalTree()
     181             : {
     182           0 :     delete pSwGlblDocContents;
     183           0 :     delete pDocInserter;
     184           0 : }
     185             : 
     186           0 : sal_Int8 SwGlobalTree::ExecuteDrop( const ExecuteDropEvent& rEvt )
     187             : {
     188           0 :     sal_Int8 nRet = DND_ACTION_NONE;
     189           0 :     SvTreeListEntry* pLast = (SvTreeListEntry*)LastVisible();
     190           0 :     if(pEmphasisEntry)
     191             :     {
     192           0 :         ImplShowTargetEmphasis( Prev(pEmphasisEntry), sal_False );
     193           0 :         pEmphasisEntry = 0;
     194             :     }
     195           0 :     else if(bLastEntryEmphasis && pLast)
     196             :     {
     197           0 :         ImplShowTargetEmphasis( pLast, sal_False);
     198             :     }
     199             : 
     200           0 :     SvTreeListEntry* pDropEntry = bLastEntryEmphasis ? 0 : GetEntry(rEvt.maPosPixel);
     201           0 :     if( bIsInternalDrag )
     202             :     {
     203           0 :         SvTreeListEntry* pDummy = 0;
     204           0 :         sal_uLong nInsertionPos = LIST_APPEND;
     205           0 :         NotifyMoving( pDropEntry, pDDSource, pDummy, nInsertionPos );
     206             :     }
     207             :     else
     208             :     {
     209           0 :         TransferableDataHelper aData( rEvt.maDropEvent.Transferable );
     210             : 
     211           0 :         String sFileName;
     212             :         const SwGlblDocContent* pCnt = pDropEntry ?
     213             :                     (const SwGlblDocContent*)pDropEntry->GetUserData() :
     214           0 :                             0;
     215           0 :         if( aData.HasFormat( FORMAT_FILE_LIST ))
     216             :         {
     217           0 :             nRet = rEvt.mnAction;
     218           0 :             SwGlblDocContents* pTempContents = new SwGlblDocContents;
     219             :             int nAbsContPos = pDropEntry ?
     220           0 :                                 (int) GetModel()->GetAbsPos(pDropEntry):
     221           0 :                                     - 1;
     222           0 :             sal_uInt16 nEntryCount = (sal_uInt16)GetEntryCount();
     223             : 
     224             :             // Daten holen
     225           0 :             FileList aFileList;
     226           0 :             aData.GetFileList( FORMAT_FILE_LIST, aFileList );
     227           0 :             for ( sal_uInt16 n = (sal_uInt16)aFileList.Count(); n--; )
     228             :             {
     229           0 :                 sFileName = aFileList.GetFile(n);
     230           0 :                 InsertRegion(pCnt, &sFileName);
     231             :                 // nach dem Einfuegen muss die Liste der Contents neu
     232             :                 // geholt werden, um nicht auf einem alten Content zu
     233             :                 // arbeiten
     234           0 :                 if(n)
     235             :                 {
     236           0 :                     pActiveShell->GetGlobalDocContent(*pTempContents);
     237             :                     // wenn das file erfolgreich eingefuegt wurde,
     238             :                     // dann muss auch der naechste Content geholt werden
     239           0 :                     if(nEntryCount < pTempContents->size())
     240             :                     {
     241           0 :                         nEntryCount++;
     242           0 :                         nAbsContPos++;
     243           0 :                         pCnt = (*pTempContents)[ nAbsContPos ];
     244             :                     }
     245             :                 }
     246             :             }
     247           0 :             delete pTempContents;
     248             :         }
     249           0 :         else if( 0 != (sFileName =
     250           0 :                         SwNavigationPI::CreateDropFileName( aData )).Len())
     251             :         {
     252           0 :             INetURLObject aTemp(sFileName);
     253           0 :             GraphicDescriptor aDesc(aTemp);
     254           0 :             if( !aDesc.Detect() )   // keine Grafiken annehmen
     255             :             {
     256           0 :                 nRet = rEvt.mnAction;
     257           0 :                 InsertRegion(pCnt, &sFileName);
     258           0 :             }
     259           0 :         }
     260             :     }
     261           0 :     bLastEntryEmphasis = sal_False;
     262           0 :     return nRet;
     263             : 
     264             : }
     265             : 
     266           0 : sal_Int8 SwGlobalTree::AcceptDrop( const AcceptDropEvent& rEvt )
     267             : {
     268           0 :     sal_Int8 nRet = rEvt.mnAction;
     269             : 
     270             :     //initiate scrolling
     271           0 :     GetDropTarget( rEvt.maPosPixel );
     272           0 :     SvTreeListEntry* pLast = (SvTreeListEntry*)LastVisible();
     273           0 :     if( rEvt.mbLeaving )
     274             :     {
     275           0 :         if( pEmphasisEntry )
     276             :         {
     277           0 :             ImplShowTargetEmphasis( Prev(pEmphasisEntry), sal_False );
     278           0 :             pEmphasisEntry = 0;
     279             :         }
     280           0 :         else if(bLastEntryEmphasis && pLast)
     281             :         {
     282           0 :             ImplShowTargetEmphasis( pLast, sal_False);
     283             :         }
     284           0 :         bLastEntryEmphasis = sal_False;
     285             :     }
     286             :     else
     287             :     {
     288           0 :         SvTreeListEntry* pDropEntry = GetEntry( rEvt.maPosPixel );
     289           0 :         if(bIsInternalDrag)
     290             :         {
     291           0 :             if( pDDSource != pDropEntry )
     292           0 :                 nRet = rEvt.mnAction;
     293             :         }
     294           0 :         else if( IsDropFormatSupported( FORMAT_FILE ) ||
     295           0 :                   IsDropFormatSupported( FORMAT_STRING ) ||
     296           0 :                   IsDropFormatSupported( FORMAT_FILE_LIST ) ||
     297           0 :                   IsDropFormatSupported( SOT_FORMATSTR_ID_SOLK ) ||
     298           0 :                    IsDropFormatSupported( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK )||
     299           0 :                    IsDropFormatSupported( SOT_FORMATSTR_ID_FILECONTENT ) ||
     300           0 :                    IsDropFormatSupported( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR ) ||
     301           0 :                    IsDropFormatSupported( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR ) ||
     302           0 :                    IsDropFormatSupported( SOT_FORMATSTR_ID_FILENAME ))
     303           0 :                 nRet = DND_ACTION_LINK;
     304             : 
     305           0 :         if(pEmphasisEntry && pEmphasisEntry != pDropEntry)
     306           0 :             ImplShowTargetEmphasis( Prev(pEmphasisEntry), sal_False );
     307           0 :         else if(pLast && bLastEntryEmphasis  && pDropEntry)
     308             :         {
     309           0 :             ImplShowTargetEmphasis( pLast, sal_False);
     310           0 :             bLastEntryEmphasis = sal_False;
     311             :         }
     312             : 
     313           0 :         if(pDropEntry)
     314           0 :             ImplShowTargetEmphasis( Prev(pDropEntry), DND_ACTION_NONE != nRet );
     315           0 :         else if(pLast)
     316             :         {
     317           0 :             ImplShowTargetEmphasis( pLast, DND_ACTION_NONE != nRet );
     318           0 :             bLastEntryEmphasis = sal_True;
     319             :         }
     320           0 :         pEmphasisEntry = pDropEntry;
     321             :     }
     322           0 :     return nRet;
     323             : }
     324             : 
     325           0 : PopupMenu* SwGlobalTree::CreateContextMenu()
     326             : {
     327           0 :     PopupMenu* pPop = 0;
     328           0 :     if(pActiveShell &&
     329           0 :         !pActiveShell->GetView().GetDocShell()->IsReadOnly())
     330             :     {
     331           0 :         sal_uInt16 nEnableFlags = GetEnableFlags();
     332           0 :         pPop = new PopupMenu;
     333           0 :         PopupMenu* pSubPop1 = new PopupMenu;
     334           0 :         PopupMenu* pSubPop2 = new PopupMenu;
     335             : 
     336           0 :         for (sal_uInt16 i = CTX_UPDATE_SEL; i <= CTX_UPDATE_ALL; i++)
     337             :         {
     338           0 :             pSubPop2->InsertItem( i, aContextStrings[ST_UPDATE_SEL - ST_GLOBAL_CONTEXT_FIRST - CTX_UPDATE_SEL+ i] );
     339           0 :             pSubPop2->SetHelpId(i, aHelpForMenu[i]);
     340             :         }
     341           0 :         pSubPop2->EnableItem(CTX_UPDATE_SEL, 0 != (nEnableFlags & ENABLE_UPDATE_SEL));
     342             : 
     343           0 :         pSubPop1->InsertItem(CTX_INSERT_ANY_INDEX, aContextStrings[ST_INDEX  - ST_GLOBAL_CONTEXT_FIRST]);
     344           0 :         pSubPop1->SetHelpId(CTX_INSERT_ANY_INDEX, aHelpForMenu[CTX_INSERT_ANY_INDEX]);
     345           0 :         pSubPop1->InsertItem(CTX_INSERT_FILE, aContextStrings[ST_FILE   - ST_GLOBAL_CONTEXT_FIRST]);
     346           0 :         pSubPop1->SetHelpId(CTX_INSERT_FILE, aHelpForMenu[CTX_INSERT_FILE]);
     347           0 :         pSubPop1->InsertItem(CTX_INSERT_NEW_FILE, aContextStrings[ST_NEW_FILE   - ST_GLOBAL_CONTEXT_FIRST]);
     348           0 :         pSubPop1->SetHelpId(CTX_INSERT_NEW_FILE, aHelpForMenu[CTX_INSERT_NEW_FILE]);
     349           0 :         pSubPop1->InsertItem(CTX_INSERT_TEXT, aContextStrings[ST_TEXT   - ST_GLOBAL_CONTEXT_FIRST]);
     350           0 :         pSubPop1->SetHelpId(CTX_INSERT_TEXT, aHelpForMenu[CTX_INSERT_TEXT]);
     351             : 
     352             : 
     353           0 :         pPop->InsertItem(CTX_UPDATE, aContextStrings[ST_UPDATE - ST_GLOBAL_CONTEXT_FIRST]);
     354           0 :         pPop->SetHelpId(CTX_UPDATE, aHelpForMenu[CTX_UPDATE]);
     355           0 :         pPop->InsertItem(CTX_EDIT, aContextStrings[ST_EDIT_CONTENT - ST_GLOBAL_CONTEXT_FIRST]);
     356           0 :         pPop->SetHelpId(CTX_EDIT, aHelpForMenu[CTX_EDIT]);
     357           0 :         if(nEnableFlags&ENABLE_EDIT_LINK)
     358             :         {
     359           0 :             pPop->InsertItem(CTX_EDIT_LINK, aContextStrings[ST_EDIT_LINK - ST_GLOBAL_CONTEXT_FIRST]);
     360           0 :             pPop->SetHelpId(CTX_EDIT_LINK, aHelpForMenu[CTX_EDIT_LINK]);
     361             :         }
     362           0 :         pPop->InsertItem(CTX_INSERT, aContextStrings[ST_INSERT - ST_GLOBAL_CONTEXT_FIRST]);
     363           0 :         pPop->SetHelpId(CTX_INSERT, aHelpForMenu[CTX_INSERT]);
     364           0 :         pPop->InsertSeparator() ;
     365           0 :         pPop->InsertItem(CTX_DELETE, aContextStrings[ST_DELETE - ST_GLOBAL_CONTEXT_FIRST]);
     366           0 :         pPop->SetHelpId(CTX_DELETE, aHelpForMenu[CTX_DELETE]);
     367             : 
     368             :         //evtl. disablen
     369           0 :         pSubPop1->EnableItem(CTX_INSERT_ANY_INDEX,  0 != (nEnableFlags & ENABLE_INSERT_IDX ));
     370           0 :         pSubPop1->EnableItem(CTX_INSERT_TEXT,       0 != (nEnableFlags & ENABLE_INSERT_TEXT));
     371           0 :         pSubPop1->EnableItem(CTX_INSERT_FILE,       0 != (nEnableFlags & ENABLE_INSERT_FILE));
     372           0 :         pSubPop1->EnableItem(CTX_INSERT_NEW_FILE,   0 != (nEnableFlags & ENABLE_INSERT_FILE));
     373             : 
     374           0 :         pPop->EnableItem(CTX_UPDATE,    0 != (nEnableFlags & ENABLE_UPDATE));
     375           0 :         pPop->EnableItem(CTX_INSERT,    0 != (nEnableFlags & ENABLE_INSERT_IDX));
     376           0 :         pPop->EnableItem(CTX_EDIT,      0 != (nEnableFlags & ENABLE_EDIT));
     377           0 :         pPop->EnableItem(CTX_DELETE,    0 != (nEnableFlags & ENABLE_DELETE));
     378             : 
     379             : 
     380           0 :         pPop->SetPopupMenu( CTX_INSERT, pSubPop1 );
     381           0 :         pPop->SetPopupMenu( CTX_UPDATE, pSubPop2 );
     382             :     }
     383           0 :     return pPop;
     384             : }
     385             : 
     386           0 : void SwGlobalTree::TbxMenuHdl(sal_uInt16 nTbxId, ToolBox* pBox)
     387             : {
     388           0 :     sal_uInt16 nEnableFlags = GetEnableFlags();
     389           0 :     if(FN_GLOBAL_OPEN == nTbxId)
     390             :     {
     391           0 :         PopupMenu *pMenu = new PopupMenu;
     392           0 :         for (sal_uInt16 i = CTX_INSERT_ANY_INDEX; i <= CTX_INSERT_TEXT; i++)
     393             :         {
     394           0 :             pMenu->InsertItem( i, aContextStrings[ST_INDEX  - ST_GLOBAL_CONTEXT_FIRST - CTX_INSERT_ANY_INDEX + i] );
     395           0 :             pMenu->SetHelpId(i, aHelpForMenu[i] );
     396             :         }
     397           0 :         pMenu->EnableItem(CTX_INSERT_ANY_INDEX, 0 != (nEnableFlags & ENABLE_INSERT_IDX ));
     398           0 :         pMenu->EnableItem(CTX_INSERT_TEXT,      0 != (nEnableFlags & ENABLE_INSERT_TEXT));
     399           0 :         pMenu->EnableItem(CTX_INSERT_FILE,      0 != (nEnableFlags & ENABLE_INSERT_FILE));
     400           0 :         pMenu->EnableItem(CTX_INSERT_NEW_FILE,  0 != (nEnableFlags & ENABLE_INSERT_FILE));
     401           0 :         pMenu->SetSelectHdl(LINK(this, SwGlobalTree, PopupHdl));
     402           0 :         pMenu->Execute( pBox, pBox->GetItemRect(nTbxId).BottomLeft());
     403           0 :         delete pMenu;
     404           0 :         pBox->EndSelection();
     405           0 :         pBox->Invalidate();
     406             :     }
     407           0 :     else if(FN_GLOBAL_UPDATE == nTbxId)
     408             :     {
     409           0 :         PopupMenu *pMenu = new PopupMenu;
     410           0 :         for (sal_uInt16 i = CTX_UPDATE_SEL; i <= CTX_UPDATE_ALL; i++)
     411             :         {
     412           0 :             pMenu->InsertItem( i, aContextStrings[ST_UPDATE_SEL - ST_GLOBAL_CONTEXT_FIRST - CTX_UPDATE_SEL+ i] );
     413           0 :             pMenu->SetHelpId(i, aHelpForMenu[i] );
     414             :         }
     415           0 :         pMenu->EnableItem(CTX_UPDATE_SEL, 0 != (nEnableFlags & ENABLE_UPDATE_SEL));
     416           0 :         pMenu->SetSelectHdl(LINK(this, SwGlobalTree, PopupHdl));
     417           0 :         pMenu->Execute( pBox, pBox->GetItemRect(nTbxId).BottomLeft());
     418           0 :         delete pMenu;
     419           0 :         pBox->EndSelection();
     420           0 :         pBox->Invalidate();
     421             :     }
     422           0 : }
     423             : 
     424           0 : sal_uInt16  SwGlobalTree::GetEnableFlags() const
     425             : {
     426           0 :     SvTreeListEntry* pEntry = FirstSelected();
     427           0 :     sal_uInt16 nSelCount = (sal_uInt16)GetSelectionCount();
     428           0 :     sal_uInt16 nEntryCount = (sal_uInt16)GetEntryCount();
     429           0 :     SvTreeListEntry* pPrevEntry = pEntry ? Prev(pEntry) : 0;
     430             : 
     431           0 :     sal_uInt16 nRet = 0;
     432           0 :     if(nSelCount == 1 || !nEntryCount)
     433           0 :         nRet |= ENABLE_INSERT_IDX|ENABLE_INSERT_FILE;
     434           0 :     if(nSelCount == 1)
     435             :     {
     436           0 :         nRet |= ENABLE_EDIT;
     437           0 :         if( ((SwGlblDocContent*)pEntry->GetUserData())->GetType() != GLBLDOC_UNKNOWN &&
     438           0 :                     (!pPrevEntry || ((SwGlblDocContent*)pPrevEntry->GetUserData())->GetType() != GLBLDOC_UNKNOWN))
     439           0 :             nRet |= ENABLE_INSERT_TEXT;
     440           0 :         if( GLBLDOC_SECTION == ((SwGlblDocContent*)pEntry->GetUserData())->GetType() )
     441           0 :             nRet |= ENABLE_EDIT_LINK;
     442             :     }
     443           0 :     else if(!nEntryCount)
     444             :     {
     445           0 :         nRet |= ENABLE_INSERT_TEXT;
     446             :     }
     447           0 :     if(nEntryCount)
     448           0 :         nRet |= ENABLE_UPDATE|ENABLE_DELETE;
     449           0 :     if(nSelCount)
     450           0 :         nRet |= ENABLE_UPDATE_SEL;
     451           0 :     return nRet;
     452             : }
     453             : 
     454           0 : void     SwGlobalTree::RequestHelp( const HelpEvent& rHEvt )
     455             : {
     456           0 :     sal_Bool bParent = sal_True;
     457           0 :     Update(sal_True);
     458           0 :     Display(sal_True);
     459           0 :     if( rHEvt.GetMode() & HELPMODE_QUICK )
     460             :     {
     461           0 :         Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ));
     462           0 :         SvTreeListEntry* pEntry = GetEntry( aPos );
     463             :         const SwGlblDocContent* pCont = pEntry ?
     464           0 :                             (const SwGlblDocContent*)pEntry->GetUserData() : 0;
     465           0 :         if( pCont &&  GLBLDOC_SECTION == pCont->GetType())
     466             :         {
     467           0 :             bParent = sal_False;
     468             :             SvLBoxTab* pTab;
     469           0 :             SvLBoxItem* pItem = GetItem( pEntry, aPos.X(), &pTab );
     470           0 :             if (pItem && SV_ITEM_ID_LBOXSTRING == pItem->GetType())
     471             :             {
     472           0 :                 const SwSection* pSect = pCont->GetSection();
     473           0 :                 String sEntry = pSect->GetLinkFileName().GetToken(0, sfx2::cTokenSeperator);
     474           0 :                 if(!pSect->IsConnectFlag())
     475           0 :                     sEntry.Insert(aContextStrings[ST_BROKEN_LINK - ST_GLOBAL_CONTEXT_FIRST], 0 );
     476           0 :                 Point aEntryPos = GetEntryPosition( pEntry );
     477             : 
     478           0 :                 aEntryPos.X() = GetTabPos( pEntry, pTab );
     479           0 :                 Size aSize( pItem->GetSize( this, pEntry ) );
     480             : 
     481           0 :                 if((aEntryPos.X() + aSize.Width()) > GetSizePixel().Width())
     482           0 :                     aSize.Width() = GetSizePixel().Width() - aEntryPos.X();
     483             : 
     484           0 :                 aEntryPos = OutputToScreenPixel(aEntryPos);
     485           0 :                 Rectangle aItemRect( aEntryPos, aSize );
     486           0 :                 if(Help::IsBalloonHelpEnabled())
     487             :                 {
     488           0 :                     aEntryPos.X() += aSize.Width();
     489           0 :                     Help::ShowBalloon( this, aEntryPos, aItemRect, sEntry );
     490             :                 }
     491             :                 else
     492             :                     Help::ShowQuickHelp( this, aItemRect, sEntry,
     493           0 :                         QUICKHELP_LEFT|QUICKHELP_VCENTER );
     494             :             }
     495             :         }
     496             :     }
     497             : 
     498           0 :     if(bParent)
     499           0 :         SvTreeListBox::RequestHelp(rHEvt);
     500           0 : }
     501             : 
     502           0 : void     SwGlobalTree::SelectHdl()
     503             : {
     504             : 
     505           0 :     sal_uInt16 nSelCount = (sal_uInt16)GetSelectionCount();
     506           0 :     SvTreeListEntry* pSel = FirstSelected();
     507           0 :     sal_uInt16 nAbsPos = pSel ? (sal_uInt16)GetModel()->GetAbsPos(pSel) : 0;
     508           0 :     SwNavigationPI* pNavi = GetParentWindow();
     509           0 :     sal_Bool bReadonly = !pActiveShell ||
     510           0 :                 pActiveShell->GetView().GetDocShell()->IsReadOnly();
     511           0 :     pNavi->aGlobalToolBox.EnableItem(FN_GLOBAL_EDIT,  nSelCount == 1 && !bReadonly);
     512           0 :     pNavi->aGlobalToolBox.EnableItem(FN_GLOBAL_OPEN,  nSelCount <= 1 && !bReadonly);
     513           0 :     pNavi->aGlobalToolBox.EnableItem(FN_GLOBAL_UPDATE,  GetEntryCount() > 0 && !bReadonly);
     514             :     pNavi->aGlobalToolBox.EnableItem(FN_ITEM_UP,
     515           0 :                     nSelCount == 1 && nAbsPos && !bReadonly);
     516             :     pNavi->aGlobalToolBox.EnableItem(FN_ITEM_DOWN,
     517           0 :                     nSelCount == 1 && nAbsPos < ((sal_uInt16)GetEntryCount()) - 1 && !bReadonly);
     518             : 
     519           0 : }
     520             : 
     521           0 : void     SwGlobalTree::DeselectHdl()
     522             : {
     523           0 :     SelectHdl();
     524           0 : }
     525             : 
     526           0 : DragDropMode SwGlobalTree::NotifyStartDrag( TransferDataContainer& ,
     527             :                                                 SvTreeListEntry* pEntry )
     528             : {
     529           0 :     bIsInternalDrag = sal_True;
     530           0 :     pDDSource = pEntry;
     531           0 :     return SV_DRAGDROP_CTRL_MOVE;
     532             : }
     533             : 
     534           0 : long     SwGlobalTree::GetTabPos( SvTreeListEntry*, SvLBoxTab* pTab)
     535             : {
     536           0 :     return pTab->GetPos() - GLBL_TABPOS_SUB;
     537             : }
     538             : 
     539           0 : sal_Bool     SwGlobalTree::NotifyMoving(   SvTreeListEntry*  pTarget,
     540             :                                         SvTreeListEntry*  pSource,
     541             :                                         SvTreeListEntry*&,
     542             :                                         sal_uLong&
     543             :                                     )
     544             : {
     545           0 :     SvTreeList* _pModel = GetModel();
     546           0 :     sal_uInt16 nSource = (sal_uInt16) _pModel->GetAbsPos(pSource);
     547           0 :     sal_uInt16 nDest   = pTarget ? (sal_uInt16) _pModel->GetAbsPos(pTarget) : pSwGlblDocContents->size();
     548             : 
     549           0 :     if( pActiveShell->MoveGlobalDocContent(
     550           0 :             *pSwGlblDocContents, nSource, nSource + 1, nDest ) &&
     551           0 :             Update( sal_False ))
     552           0 :         Display();
     553           0 :     return sal_False;
     554             : }
     555             : 
     556           0 : sal_Bool     SwGlobalTree::NotifyCopying(  SvTreeListEntry*  /*pTarget*/,
     557             :                                         SvTreeListEntry*  /*pEntry*/,
     558             :                                         SvTreeListEntry*& /*rpNewParent*/,
     559             :                                         sal_uLong&        /*rNewChildPos*/
     560             :                                     )
     561             : {
     562           0 :     return sal_False;
     563             : }
     564             : 
     565           0 : sal_Bool SwGlobalTree::NotifyAcceptDrop( SvTreeListEntry* pEntry)
     566             : {
     567           0 :     return pEntry != 0;
     568             : }
     569             : 
     570           0 : void SwGlobalTree::StartDrag( sal_Int8 nAction, const Point& rPt )
     571             : {
     572           0 :     if( 1 == GetSelectionCount() )
     573           0 :         SvTreeListBox::StartDrag( nAction, rPt );
     574           0 : }
     575             : 
     576           0 : void SwGlobalTree::DragFinished( sal_Int8 nAction )
     577             : {
     578           0 :     SvTreeListBox::DragFinished( nAction );
     579           0 :     bIsInternalDrag = sal_False;
     580           0 : }
     581             : 
     582             : /***************************************************************************
     583             :     Beschreibung:   Wird ein Ctrl+DoubleClick in einen freien Bereich ausgefuehrt,
     584             :  *                  dann soll die Basisfunktion des Controls gerufen werden
     585             : ***************************************************************************/
     586           0 : void  SwGlobalTree::MouseButtonDown( const MouseEvent& rMEvt )
     587             : {
     588           0 :     Point aPos( rMEvt.GetPosPixel());
     589           0 :     SvTreeListEntry* pEntry = GetEntry( aPos, sal_True );
     590           0 :     if( !pEntry && rMEvt.IsLeft() && rMEvt.IsMod1() && (rMEvt.GetClicks() % 2) == 0)
     591           0 :         Control::MouseButtonDown( rMEvt );
     592             :     else
     593           0 :         SvTreeListBox::MouseButtonDown( rMEvt );
     594           0 : }
     595             : 
     596           0 : void     SwGlobalTree::GetFocus()
     597             : {
     598           0 :     if(Update( sal_False ))
     599           0 :         Display();
     600           0 :     SvTreeListBox::GetFocus();
     601           0 : }
     602             : 
     603           0 : void     SwGlobalTree::KeyInput(const KeyEvent& rKEvt)
     604             : {
     605           0 :     const KeyCode aCode = rKEvt.GetKeyCode();
     606           0 :     if(aCode.GetCode() == KEY_RETURN)
     607             :     {
     608           0 :         switch(aCode.GetModifier())
     609             :         {
     610             :             case KEY_MOD2:
     611             :                 // Boxen umschalten
     612           0 :                 GetParentWindow()->ToggleTree();
     613           0 :             break;
     614             :         }
     615             :     }
     616             :     else
     617           0 :         SvTreeListBox::KeyInput(rKEvt);
     618           0 : }
     619             : 
     620           0 : void SwGlobalTree::Clear()
     621             : {
     622           0 :     pEmphasisEntry = 0;
     623           0 :     SvTreeListBox::Clear();
     624           0 : }
     625             : 
     626           0 : void    SwGlobalTree::Display(sal_Bool bOnlyUpdateUserData)
     627             : {
     628           0 :     if(!bIsImageListInitialized)
     629             :     {
     630           0 :         aEntryImages = ImageList(SW_RES(IMG_NAVI_ENTRYBMP));
     631           0 :         bIsImageListInitialized = sal_True;
     632             :     }
     633           0 :     sal_uInt16 nCount = pSwGlblDocContents->size();
     634           0 :     if(bOnlyUpdateUserData && GetEntryCount() == pSwGlblDocContents->size())
     635             :     {
     636           0 :         SvTreeListEntry* pEntry = First();
     637           0 :         for( sal_uInt16 i = 0; i < nCount; i++)
     638             :         {
     639           0 :             SwGlblDocContent* pCont = (*pSwGlblDocContents)[i];
     640           0 :             pEntry->SetUserData(pCont);
     641           0 :             pEntry = Next(pEntry);
     642             :         }
     643             :     }
     644             :     else
     645             :     {
     646           0 :         SetUpdateMode( sal_False );
     647           0 :         SvTreeListEntry* pOldSelEntry = FirstSelected();
     648           0 :         String sEntryName;  // Name des Eintrags
     649           0 :         sal_uInt16 nSelPos = USHRT_MAX;
     650           0 :         if(pOldSelEntry)
     651             :         {
     652           0 :             sEntryName = GetEntryText(pOldSelEntry);
     653           0 :             nSelPos = (sal_uInt16)GetModel()->GetAbsPos(pOldSelEntry);
     654             :         }
     655           0 :         Clear();
     656           0 :         if(!pSwGlblDocContents)
     657           0 :             Update( sal_False );
     658             : 
     659           0 :         SvTreeListEntry* pSelEntry = 0;
     660           0 :         for( sal_uInt16 i = 0; i < nCount; i++)
     661             :         {
     662           0 :             SwGlblDocContent* pCont = (*pSwGlblDocContents)[i];
     663           0 :             String sEntry;
     664           0 :             Image aImage;
     665           0 :             switch( pCont->GetType()  )
     666             :             {
     667             :                 case GLBLDOC_UNKNOWN:
     668             :                 {
     669           0 :                     sEntry = aContextStrings[ST_TEXT   - ST_GLOBAL_CONTEXT_FIRST];
     670           0 :                     aImage = aEntryImages.GetImage(SID_SW_START + GLOBAL_CONTENT_TEXT);
     671             :                 }
     672           0 :                 break;
     673             :                 case GLBLDOC_TOXBASE:
     674             :                 {
     675           0 :                     const SwTOXBase* pBase = pCont->GetTOX();
     676           0 :                     sEntry = pBase->GetTitle();
     677           0 :                     aImage = aEntryImages.GetImage(SID_SW_START + CONTENT_TYPE_INDEX);
     678             :                 }
     679           0 :                 break;
     680             :                 case GLBLDOC_SECTION:
     681             :                 {
     682           0 :                     const SwSection* pSect = pCont->GetSection();
     683           0 :                     sEntry = pSect->GetSectionName();
     684           0 :                     aImage = aEntryImages.GetImage(SID_SW_START + CONTENT_TYPE_REGION);
     685             :                 }
     686           0 :                 break;
     687             :             }
     688             :             SvTreeListEntry* pEntry = InsertEntry(sEntry, aImage, aImage,
     689           0 :                         0, sal_False, LIST_APPEND, pCont);
     690           0 :             if(sEntry == sEntryName)
     691             :             {
     692           0 :                 pSelEntry = pEntry;
     693             :             }
     694           0 :         }
     695           0 :         if(pSelEntry)
     696             :         {
     697           0 :             Select(pSelEntry);
     698             :         }
     699           0 :         else if(nSelPos != USHRT_MAX && nSelPos < nCount)
     700             :         {
     701           0 :             Select(GetEntry(nSelPos));
     702             :         }
     703           0 :         else if(nCount)
     704           0 :             Select(First());
     705             :         else
     706           0 :             SelectHdl();
     707           0 :         SetUpdateMode( sal_True );
     708             :     }
     709           0 : }
     710             : 
     711           0 : void SwGlobalTree::InsertRegion( const SwGlblDocContent* pCont, const String* pFileName )
     712             : {
     713           0 :     Sequence< OUString > aFileNames;
     714           0 :     if ( !pFileName )
     715             :     {
     716           0 :         pDefParentWin = Application::GetDefDialogParent();
     717           0 :         Application::SetDefDialogParent( this );
     718           0 :         delete pDocInserter;
     719             :         pDocInserter = new ::sfx2::DocumentInserter(
     720           0 :                 rtl::OUString("swriter"), true );
     721           0 :         pDocInserter->StartExecuteModal( LINK( this, SwGlobalTree, DialogClosedHdl ) );
     722             :     }
     723           0 :     else if ( pFileName->Len() )
     724             :     {
     725           0 :         aFileNames.realloc(1);
     726           0 :         INetURLObject aFileName;
     727           0 :         aFileName.SetSmartURL( *pFileName );
     728           0 :         aFileNames.getArray()[0] = aFileName.GetMainURL( INetURLObject::NO_DECODE );
     729           0 :         InsertRegion( pCont, aFileNames );
     730           0 :     }
     731           0 : }
     732             : 
     733           0 : void    SwGlobalTree::EditContent(const SwGlblDocContent* pCont )
     734             : {
     735           0 :     sal_uInt16 nSlot = 0;
     736           0 :     switch( pCont->GetType() )
     737             :     {
     738             :         case GLBLDOC_UNKNOWN:
     739           0 :             pActiveShell->GetView().GetEditWin().GrabFocus();
     740           0 :         break;
     741             :         case GLBLDOC_TOXBASE:
     742             :         {
     743           0 :             const SwTOXBase* pBase = pCont->GetTOX();
     744           0 :             if(pBase)
     745           0 :                 nSlot = FN_INSERT_MULTI_TOX;
     746             :         }
     747           0 :         break;
     748             :         case GLBLDOC_SECTION:
     749             :         {
     750           0 :             OpenDoc(pCont);
     751             : 
     752           0 :             nSlot = 0;
     753           0 :             pCont = 0;
     754             :         }
     755           0 :         break;
     756             :     }
     757           0 :     if(pCont)
     758           0 :         GotoContent(pCont);
     759           0 :     if(nSlot)
     760             :     {
     761           0 :         pActiveShell->GetView().GetViewFrame()->GetDispatcher()->Execute(nSlot);
     762           0 :         if(Update( sal_False ))
     763           0 :             Display();
     764             :     }
     765           0 : }
     766             : 
     767           0 : IMPL_LINK( SwGlobalTree, PopupHdl, Menu* , pMenu)
     768             : {
     769           0 :     ExcecuteContextMenuAction( pMenu->GetCurItemId());
     770           0 :     return sal_True;
     771             : }
     772             : 
     773           0 : void    SwGlobalTree::ExcecuteContextMenuAction( sal_uInt16 nSelectedPopupEntry )
     774             : {
     775           0 :     SvTreeListEntry* pEntry = FirstSelected();
     776           0 :     SwGlblDocContent* pCont = pEntry ? (SwGlblDocContent*)pEntry->GetUserData() : 0;
     777             :     // wird waehrend des Dialogs ein RequestHelp gerufen,
     778             :     // dann geht der Content verloren. Deshalb wird hier eine
     779             :     // Kopie angelegt, in der nur die DocPos richtig gesetzt ist.
     780           0 :     SwGlblDocContent* pContCopy = 0;
     781           0 :     if(pCont)
     782           0 :         pContCopy = new SwGlblDocContent(pCont->GetDocPos());
     783           0 :     SfxDispatcher& rDispatch = *pActiveShell->GetView().GetViewFrame()->GetDispatcher();
     784           0 :     sal_uInt16 nSlot = 0;
     785           0 :     bool bDeleteContentCopy = true;
     786           0 :     switch( nSelectedPopupEntry )
     787             :     {
     788             :         case CTX_UPDATE_SEL:
     789             :         {
     790             :             // zwei Durchlaeufe: zuerst die Bereiche, dann die Verzeichnisse
     791             :             // aktualisieren
     792           0 :             SvTreeListEntry* pSelEntry = FirstSelected();
     793           0 :             while( pSelEntry )
     794             :             {
     795           0 :                 SwGlblDocContent* pContent = (SwGlblDocContent*)pSelEntry->GetUserData();
     796           0 :                 if(GLBLDOC_SECTION == pContent->GetType() &&
     797           0 :                     pContent->GetSection()->IsConnected())
     798             :                 {
     799           0 :                     ((SwSection*)pContent->GetSection())->UpdateNow();
     800             :                 }
     801             : 
     802           0 :                 pSelEntry = NextSelected(pSelEntry);
     803             :             }
     804           0 :             pSelEntry = FirstSelected();
     805           0 :             while( pSelEntry )
     806             :             {
     807           0 :                 SwGlblDocContent* pContent = (SwGlblDocContent*)pSelEntry->GetUserData();
     808           0 :                 if(GLBLDOC_TOXBASE == pContent->GetType())
     809           0 :                     pActiveShell->UpdateTableOf(*pContent->GetTOX());
     810           0 :                 pSelEntry = NextSelected(pSelEntry);
     811             :             }
     812             : 
     813             :         }
     814           0 :         break;
     815             :         case CTX_UPDATE_INDEX:
     816             :         {
     817           0 :             nSlot = FN_UPDATE_TOX;
     818             :         }
     819           0 :         break;
     820             :         case CTX_UPDATE_LINK:
     821             :         case CTX_UPDATE_ALL:
     822             :         {
     823           0 :             pActiveShell->GetLinkManager().UpdateAllLinks(true);
     824           0 :             if(CTX_UPDATE_ALL == nSelectedPopupEntry)
     825           0 :                 nSlot = FN_UPDATE_TOX;
     826           0 :             pCont = 0;
     827             :         }
     828           0 :         break;
     829             :         case CTX_EDIT:
     830             :         {
     831             :             OSL_ENSURE(pCont, "edit without entry ? " );
     832           0 :             EditContent(pCont);
     833             :         }
     834           0 :         break;
     835             :         case CTX_EDIT_LINK:
     836             :         {
     837             :             OSL_ENSURE(pCont, "edit without entry ? " );
     838             :             SfxStringItem aName(FN_EDIT_REGION,
     839           0 :                     pCont->GetSection()->GetSectionName());
     840           0 :             rDispatch.Execute(FN_EDIT_REGION, SFX_CALLMODE_ASYNCHRON, &aName, 0L);
     841             :         }
     842           0 :         break;
     843             :         case CTX_DELETE:
     844             :         {
     845             :             // sind mehrere Eintraege selektiert, dann muss nach jedem delete
     846             :             // das Array neu gefuellt werden. Damit man sich nichts merken muss,
     847             :             // beginnt das Loeschen am Ende
     848           0 :             SvTreeListEntry* pSelEntry = LastSelected();
     849           0 :             SwGlblDocContents* pTempContents  = 0;
     850           0 :             pActiveShell->StartAction();
     851           0 :             while(pSelEntry)
     852             :             {
     853             :                 pActiveShell->DeleteGlobalDocContent(
     854             :                     pTempContents ? *pTempContents : *pSwGlblDocContents,
     855           0 :                                      (sal_uInt16)GetModel()->GetAbsPos(pSelEntry));
     856           0 :                 pSelEntry = PrevSelected(pSelEntry);
     857           0 :                 if(pSelEntry)
     858             :                 {
     859           0 :                     pTempContents = new SwGlblDocContents;
     860           0 :                     pActiveShell->GetGlobalDocContent(*pTempContents);
     861             :                 }
     862             :             }
     863           0 :             delete pTempContents;
     864           0 :             pActiveShell->EndAction();
     865           0 :             pCont = 0;
     866             :         }
     867           0 :         break;
     868             :         case CTX_INSERT_ANY_INDEX:
     869             :         {
     870           0 :             if(pContCopy)
     871             :             {
     872           0 :                 SfxItemSet aSet(pActiveShell->GetView().GetPool(),
     873             :                             RES_COL, RES_COL,
     874             :                             RES_BACKGROUND, RES_BACKGROUND,
     875             :                             RES_FRM_SIZE, RES_FRM_SIZE,
     876             :                             SID_ATTR_PAGE_SIZE, SID_ATTR_PAGE_SIZE,
     877             :                             RES_LR_SPACE, RES_LR_SPACE,
     878             :                             FN_PARAM_TOX_TYPE, FN_PARAM_TOX_TYPE,
     879           0 :                             0);
     880             : 
     881           0 :                 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
     882             :                 OSL_ENSURE(pFact, "Dialogdiet fail!");
     883             :                 AbstractMultiTOXTabDialog* pDlg = pFact->CreateMultiTOXTabDialog( DLG_MULTI_TOX,
     884             :                                                         this, aSet,
     885             :                                                         *pActiveShell,
     886             :                                                         0,
     887             :                                                         USHRT_MAX,
     888           0 :                                                         sal_True);
     889             :                 OSL_ENSURE(pDlg, "Dialogdiet fail!");
     890           0 :                 if(RET_OK == pDlg->Execute())
     891             :                 {
     892             :                     SwTOXDescription&  rDesc = pDlg->GetTOXDescription(
     893           0 :                                                 pDlg->GetCurrentTOXType());
     894           0 :                     SwTOXMgr aMgr(pActiveShell);
     895           0 :                     SwTOXBase* pToInsert = 0;
     896           0 :                     if(aMgr.UpdateOrInsertTOX(rDesc, &pToInsert, pDlg->GetOutputItemSet()))
     897           0 :                         pActiveShell->InsertGlobalDocContent( *pContCopy, *pToInsert );
     898             :                 }
     899           0 :                 pCont = 0;
     900           0 :                 delete pDlg;
     901             :             }
     902             :         }
     903           0 :         break;
     904             :         case CTX_INSERT_FILE:
     905             :         {
     906           0 :             bDeleteContentCopy = false;
     907           0 :             pDocContent = pContCopy;
     908           0 :             InsertRegion( pContCopy );
     909           0 :             pCont = NULL;
     910             :         }
     911           0 :         break;
     912             :         case CTX_INSERT_NEW_FILE:
     913             :         {
     914           0 :             SfxViewFrame* pGlobFrm = pActiveShell->GetView().GetViewFrame();
     915           0 :             SwGlobalFrameListener_Impl aFrmListener(*pGlobFrm);
     916             : 
     917           0 :             sal_uLong nEntryPos = pEntry ? GetModel()->GetAbsPos(pEntry) : (sal_uLong)-1;
     918             :             // neues Dok anlegen
     919             :             SfxStringItem aFactory(SID_NEWDOCDIRECT,
     920           0 :                             SwDocShell::Factory().GetFilterContainer()->GetName());
     921             : 
     922             :              const SfxFrameItem* pItem = (SfxFrameItem*)
     923             :                             rDispatch.Execute(SID_NEWDOCDIRECT,
     924           0 :                                 SFX_CALLMODE_SYNCHRON, &aFactory, 0L);
     925             : 
     926             :             // sichern unter
     927           0 :             SfxFrame* pFrm = pItem ? pItem->GetFrame() : 0;
     928           0 :             SfxViewFrame* pFrame = pFrm ? pFrm->GetCurrentViewFrame() : 0;
     929           0 :             if( pFrame )
     930             :             {
     931             :                 const SfxBoolItem* pBool = (const SfxBoolItem*)
     932             :                         pFrame->GetDispatcher()->Execute(
     933           0 :                                 SID_SAVEASDOC, SFX_CALLMODE_SYNCHRON );
     934           0 :                 SfxObjectShell& rObj = *pFrame->GetObjectShell();
     935           0 :                 const SfxMedium* pMedium = rObj.GetMedium();
     936           0 :                 String sNewFile(pMedium->GetURLObject().GetMainURL(INetURLObject::DECODE_TO_IURI));
     937             :                 // Bereich mit dem Dok-Namen einfuegen
     938             :                 // eigenes Dok in den Vordergrund
     939             : 
     940           0 :                 if(aFrmListener.IsValid() && sNewFile.Len())
     941             :                 {
     942           0 :                     pGlobFrm->ToTop();
     943             :                     // durch das Update sind die Eintraege invalid
     944           0 :                     if(nEntryPos != (sal_uLong)-1)
     945             :                     {
     946           0 :                         Update( sal_False );
     947           0 :                         Display();
     948           0 :                         Select(GetModel()->GetEntryAtAbsPos(nEntryPos));
     949           0 :                         pEntry = FirstSelected();
     950           0 :                         pCont = pEntry ? (SwGlblDocContent*)pEntry->GetUserData() : 0;
     951             :                     }
     952             :                     else
     953             :                     {
     954           0 :                         pEntry = 0;
     955           0 :                         pCont = 0;
     956             :                     }
     957           0 :                     if(pBool->GetValue())
     958             :                     {
     959           0 :                         InsertRegion(pCont, &sNewFile);
     960           0 :                         pFrame->ToTop();
     961             :                     }
     962             :                     else
     963             :                         pFrame->GetDispatcher()->Execute(SID_CLOSEWIN,
     964           0 :                                                 SFX_CALLMODE_SYNCHRON);
     965             :                 }
     966             :                 else
     967             :                 {
     968           0 :                     pFrame->ToTop();
     969           0 :                     return;
     970           0 :                 }
     971           0 :             }
     972             :         }
     973           0 :         break;
     974             :         case CTX_INSERT_TEXT:
     975             :         {
     976           0 :             if(pCont)
     977           0 :                 pActiveShell->InsertGlobalDocContent(*pCont);
     978             :             else
     979             :             {
     980           0 :                 pActiveShell->SplitNode(); // leeres Dokument
     981           0 :                 pActiveShell->Up( sal_False, 1 );
     982             :             }
     983           0 :             pActiveShell->GetView().GetEditWin().GrabFocus();
     984             :         }
     985           0 :         break;
     986             :         case CTX_UPDATE:
     987           0 :             pCont = 0;
     988           0 :         break;
     989             :         default:;
     990             :         // hier passiert nichts
     991             :     }
     992           0 :     if(pCont)
     993           0 :         GotoContent(pCont);
     994           0 :     if(nSlot)
     995           0 :         rDispatch.Execute(nSlot);
     996           0 :     if(Update( sal_False ))
     997           0 :         Display();
     998           0 :     if ( bDeleteContentCopy )
     999           0 :         delete pContCopy;
    1000             :     else
    1001           0 :         bDeleteContentCopy = true;
    1002             : }
    1003             : 
    1004           0 : IMPL_LINK_NOARG(SwGlobalTree, Timeout)
    1005             : {
    1006           0 :     if(!HasFocus() && Update( sal_False ))
    1007           0 :         Display();
    1008           0 :     return 0;
    1009             : }
    1010             : 
    1011           0 : void SwGlobalTree::GotoContent(const SwGlblDocContent* pCont)
    1012             : {
    1013           0 :     pActiveShell->EnterStdMode();
    1014             : 
    1015           0 :     switch( pCont->GetType()  )
    1016             :     {
    1017             :         case GLBLDOC_UNKNOWN:
    1018           0 :             pActiveShell->GotoGlobalDocContent(*pCont);
    1019           0 :         break;
    1020             :         case GLBLDOC_TOXBASE:
    1021             :         {
    1022           0 :             String sName = pCont->GetTOX()->GetTOXName();
    1023           0 :             if (!pActiveShell->GotoNextTOXBase(&sName))
    1024           0 :                 pActiveShell->GotoPrevTOXBase(&sName);
    1025             :         }
    1026           0 :         break;
    1027             :         case GLBLDOC_SECTION:
    1028           0 :         break;
    1029             :     }
    1030             : 
    1031           0 : }
    1032             : 
    1033           0 : void    SwGlobalTree::ShowTree()
    1034             : {
    1035           0 :     aUpdateTimer.Start();
    1036           0 :     SvTreeListBox::Show();
    1037           0 : }
    1038             : 
    1039           0 : void    SwGlobalTree::HideTree()
    1040             : {
    1041           0 :     aUpdateTimer.Stop();
    1042           0 :     SvTreeListBox::Hide();
    1043           0 : }
    1044             : 
    1045           0 : void    SwGlobalTree::ExecCommand(sal_uInt16 nCmd)
    1046             : {
    1047           0 :     SvTreeListEntry* pEntry = FirstSelected();
    1048             :     OSL_ENSURE(pEntry, "gleich knallt's");
    1049           0 :     if(FN_GLOBAL_EDIT == nCmd)
    1050             :     {
    1051             :         const SwGlblDocContent* pCont = (const SwGlblDocContent*)
    1052           0 :                                                 pEntry->GetUserData();
    1053           0 :         EditContent(pCont);
    1054             :     }
    1055             :     else
    1056             :     {
    1057           0 :         if(GetSelectionCount() == 1)
    1058             :         {
    1059           0 :             sal_Bool bMove = sal_False;
    1060           0 :             sal_uInt16 nSource = (sal_uInt16)GetModel()->GetAbsPos(pEntry);
    1061           0 :             sal_uInt16 nDest = nSource;
    1062           0 :             switch(nCmd)
    1063             :             {
    1064             :                 case FN_ITEM_DOWN:
    1065             :                 {
    1066           0 :                     sal_uInt16 nEntryCount = (sal_uInt16)GetEntryCount();
    1067           0 :                     bMove = nEntryCount > nSource + 1;
    1068           0 :                     nDest+= 2;
    1069             :                 }
    1070           0 :                 break;
    1071             :                 case FN_ITEM_UP:
    1072             :                 {
    1073           0 :                     if(nSource)
    1074           0 :                         bMove = 0 != nSource;
    1075           0 :                     nDest--;
    1076             :                 }
    1077           0 :                 break;
    1078             :             }
    1079           0 :             if( bMove && pActiveShell->MoveGlobalDocContent(
    1080           0 :                 *pSwGlblDocContents, nSource, nSource + 1, nDest ) &&
    1081           0 :                     Update( sal_False ))
    1082           0 :                 Display();
    1083             :         }
    1084             :     }
    1085           0 : }
    1086             : 
    1087           0 : sal_Bool    SwGlobalTree::Update(sal_Bool bHard)
    1088             : {
    1089           0 :     SwView* pActView = GetParentWindow()->GetCreateView();
    1090           0 :     sal_Bool bRet = sal_False;
    1091           0 :     if(pActView && pActView->GetWrtShellPtr())
    1092             :     {
    1093           0 :         const SwWrtShell* pOldShell = pActiveShell;
    1094           0 :         pActiveShell = pActView->GetWrtShellPtr();
    1095           0 :         if(pActiveShell != pOldShell)
    1096             :         {
    1097           0 :             delete pSwGlblDocContents;
    1098           0 :             pSwGlblDocContents = 0;
    1099             :         }
    1100           0 :         if(!pSwGlblDocContents)
    1101             :         {
    1102           0 :             pSwGlblDocContents = new SwGlblDocContents;
    1103           0 :             bRet = sal_True;
    1104           0 :             pActiveShell->GetGlobalDocContent(*pSwGlblDocContents);
    1105             :         }
    1106             :         else
    1107             :         {
    1108           0 :             sal_Bool bCopy = sal_False;
    1109           0 :             SwGlblDocContents* pTempContents  = new SwGlblDocContents;
    1110           0 :             pActiveShell->GetGlobalDocContent(*pTempContents);
    1111           0 :             if(pTempContents->size() != pSwGlblDocContents->size() ||
    1112           0 :                     pTempContents->size() != GetEntryCount())
    1113             :             {
    1114           0 :                 bRet = sal_True;
    1115           0 :                 bCopy = sal_True;
    1116             :             }
    1117             :             else
    1118             :             {
    1119           0 :                 for(sal_uInt16 i = 0; i < pTempContents->size() && !bCopy; i++)
    1120             :                 {
    1121           0 :                     SwGlblDocContent* pLeft = (*pTempContents)[i];
    1122           0 :                     SwGlblDocContent* pRight = (*pSwGlblDocContents)[i];
    1123           0 :                     GlobalDocContentType eType = pLeft->GetType();
    1124           0 :                     SvTreeListEntry* pEntry = GetEntry(i);
    1125           0 :                     String sTemp = GetEntryText(pEntry);
    1126           0 :                     if (
    1127           0 :                          eType != pRight->GetType() ||
    1128             :                          (
    1129             :                            eType == GLBLDOC_SECTION &&
    1130           0 :                            pLeft->GetSection()->GetSectionName() != sTemp
    1131             :                          ) ||
    1132             :                          (
    1133             :                            eType == GLBLDOC_TOXBASE &&
    1134           0 :                            pLeft->GetTOX()->GetTitle() != sTemp
    1135             :                          )
    1136             :                        )
    1137             :                     {
    1138           0 :                         bCopy = bRet = sal_True;
    1139             :                     }
    1140           0 :                 }
    1141             :             }
    1142           0 :             if(bCopy || bHard)
    1143             :             {
    1144           0 :                 pSwGlblDocContents->DeleteAndDestroyAll();
    1145           0 :                 pSwGlblDocContents->insert( *pTempContents );
    1146           0 :                 pTempContents->clear();
    1147             : 
    1148             :             }
    1149           0 :             delete pTempContents;
    1150             :         }
    1151             : 
    1152             :     }
    1153             :     else
    1154             :     {
    1155           0 :         Clear();
    1156           0 :         if(pSwGlblDocContents)
    1157           0 :             pSwGlblDocContents->DeleteAndDestroyAll();
    1158             :     }
    1159             :     // hier muss noch eine Veraenderungspruefung rein!
    1160           0 :     return bRet;
    1161             : }
    1162             : 
    1163           0 : void SwGlobalTree::OpenDoc(const SwGlblDocContent* pCont)
    1164             : {
    1165           0 :     String sFileName(pCont->GetSection()->GetLinkFileName().GetToken(0,
    1166           0 :             sfx2::cTokenSeperator));
    1167           0 :     sal_Bool bFound = sal_False;
    1168           0 :     const SfxObjectShell* pCurr = SfxObjectShell::GetFirst();
    1169           0 :     while( !bFound && pCurr )
    1170             :     {
    1171           0 :         if(pCurr->GetMedium() &&
    1172           0 :             String(pCurr->GetMedium()->GetURLObject().GetMainURL(INetURLObject::DECODE_TO_IURI)) == sFileName)
    1173             :         {
    1174           0 :             bFound = sal_True;
    1175           0 :             SwGlobalTree::SetShowShell(pCurr);
    1176             :             Application::PostUserEvent( STATIC_LINK(
    1177           0 :                         this, SwGlobalTree, ShowFrameHdl ) );
    1178           0 :             pCurr = 0;
    1179             :         }
    1180             :         else
    1181           0 :             pCurr = SfxObjectShell::GetNext(*pCurr);
    1182             :     }
    1183           0 :     if(!bFound)
    1184             :     {
    1185             :         SfxStringItem aURL(SID_FILE_NAME,
    1186           0 :             sFileName);
    1187           0 :         SfxBoolItem aReadOnly(SID_DOC_READONLY, sal_False);
    1188           0 :         SfxStringItem aTargetFrameName( SID_TARGETNAME, rtl::OUString("_blank") );
    1189           0 :         SfxStringItem aReferer(SID_REFERER, pActiveShell->GetView().GetDocShell()->GetTitle());
    1190           0 :         pActiveShell->GetView().GetViewFrame()->GetDispatcher()->
    1191             :                 Execute(SID_OPENDOC, SFX_CALLMODE_ASYNCHRON,
    1192           0 :                             &aURL, &aReadOnly, &aReferer, &aTargetFrameName, 0L);
    1193           0 :     }
    1194           0 : }
    1195             : 
    1196           0 : IMPL_LINK_NOARG( SwGlobalTree, DoubleClickHdl)
    1197             : {
    1198           0 :     SvTreeListEntry* pEntry = GetCurEntry();
    1199           0 :     SwGlblDocContent* pCont = (SwGlblDocContent*)pEntry->GetUserData();
    1200           0 :     if(pCont->GetType() == GLBLDOC_SECTION)
    1201           0 :         OpenDoc(pCont);
    1202             :     else
    1203             :     {
    1204           0 :         GotoContent(pCont);
    1205           0 :         pActiveShell->GetView().GetEditWin().GrabFocus();
    1206             :     }
    1207           0 :     return 0;
    1208             : }
    1209             : 
    1210           0 : IMPL_STATIC_LINK_NOINSTANCE(SwGlobalTree, ShowFrameHdl, SwGlobalTree*, EMPTYARG)
    1211             : {
    1212           0 :     if(SwGlobalTree::GetShowShell())
    1213           0 :         SfxViewFrame::GetFirst(SwGlobalTree::GetShowShell())->ToTop();
    1214           0 :     SwGlobalTree::SetShowShell(0);
    1215           0 :     return 0;
    1216             : }
    1217             : 
    1218           0 : void SwGlobalTree::InitEntry(SvTreeListEntry* pEntry,
    1219             :         const OUString& rStr ,const Image& rImg1,const Image& rImg2,
    1220             :         SvLBoxButtonKind eButtonKind)
    1221             : {
    1222           0 :     sal_uInt16 nColToHilite = 1; //0==Bitmap;1=="Spalte1";2=="Spalte2"
    1223           0 :     SvTreeListBox::InitEntry( pEntry, rStr, rImg1, rImg2, eButtonKind );
    1224           0 :     SvLBoxString* pCol = (SvLBoxString*)pEntry->GetItem( nColToHilite );
    1225           0 :     SwLBoxString* pStr = new SwLBoxString( pEntry, 0, pCol->GetText() );
    1226           0 :     pEntry->ReplaceItem( pStr, nColToHilite );
    1227           0 : }
    1228             : 
    1229           0 : void SwLBoxString::Paint(
    1230             :     const Point& rPos, SvTreeListBox& rDev, const SvViewDataEntry* pView,
    1231             :     const SvTreeListEntry* pEntry)
    1232             : {
    1233           0 :     SwGlblDocContent* pCont = (SwGlblDocContent*)pEntry->GetUserData();
    1234           0 :     if(pCont->GetType() == GLBLDOC_SECTION &&
    1235           0 :         !(pCont->GetSection())->IsConnectFlag() )
    1236             :     {
    1237           0 :         Font aOldFont( rDev.GetFont());
    1238           0 :         Font aFont(aOldFont);
    1239           0 :         Color aCol( COL_LIGHTRED );
    1240           0 :         aFont.SetColor( aCol );
    1241           0 :         rDev.SetFont( aFont );
    1242           0 :         rDev.DrawText( rPos, GetText() );
    1243           0 :         rDev.SetFont( aOldFont );
    1244             :     }
    1245             :     else
    1246           0 :         SvLBoxString::Paint( rPos, rDev, pView, pEntry);
    1247           0 : }
    1248             : 
    1249           0 : void    SwGlobalTree::DataChanged( const DataChangedEvent& rDCEvt )
    1250             : {
    1251           0 :     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
    1252           0 :          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
    1253             :     {
    1254           0 :         aEntryImages = ImageList(SW_RES(IMG_NAVI_ENTRYBMP));
    1255           0 :         Update(sal_True);
    1256             :     }
    1257           0 :     SvTreeListBox::DataChanged( rDCEvt );
    1258           0 : }
    1259             : 
    1260           0 : void SwGlobalTree::InsertRegion( const SwGlblDocContent* _pContent, const Sequence< OUString >& _rFiles )
    1261             : {
    1262           0 :     sal_Int32 nFiles = _rFiles.getLength();
    1263           0 :     if ( nFiles )
    1264             :     {
    1265           0 :         sal_Bool bMove = sal_False;
    1266           0 :         if ( !_pContent )
    1267             :         {
    1268           0 :             SvTreeListEntry* pLast = (SvTreeListEntry*)LastVisible();
    1269           0 :             _pContent = (SwGlblDocContent*)pLast->GetUserData();
    1270           0 :             bMove = sal_True;
    1271             :         }
    1272           0 :         String sFilePassword;
    1273           0 :         sal_uInt16 nEntryCount = (sal_uInt16)GetEntryCount();
    1274           0 :         const OUString* pFileNames = _rFiles.getConstArray();
    1275           0 :         SwWrtShell& rSh = GetParentWindow()->GetCreateView()->GetWrtShell();
    1276           0 :         rSh.StartAction();
    1277             :         // after insertion of the first new content the 'pCont' parameter becomes invalid
    1278             :         // find the index of the 'anchor' content to always use a current anchor content
    1279           0 :         size_t nAnchorContent = pSwGlblDocContents->size() - 1;
    1280           0 :         if ( !bMove )
    1281             :         {
    1282           0 :             for (size_t nContent = 0; nContent < pSwGlblDocContents->size();
    1283             :                     ++nContent)
    1284             :             {
    1285           0 :                 if( *_pContent == *(*pSwGlblDocContents)[ nContent ] )
    1286             :                 {
    1287           0 :                     nAnchorContent = nContent;
    1288           0 :                     break;
    1289             :                 }
    1290             :             }
    1291             :         }
    1292           0 :         SwGlblDocContents aTempContents;
    1293           0 :         for ( sal_Int32 nFile = 0; nFile < nFiles; ++nFile )
    1294             :         {
    1295             :             //update the global document content after each inserted document
    1296           0 :             rSh.GetGlobalDocContent(aTempContents);
    1297           0 :             SwGlblDocContent* pAnchorContent = 0;
    1298             :             OSL_ENSURE(aTempContents.size() > (nAnchorContent + nFile), "invalid anchor content -> last insertion failed");
    1299           0 :             if ( aTempContents.size() > (nAnchorContent + nFile) )
    1300           0 :                 pAnchorContent = aTempContents[nAnchorContent + nFile];
    1301             :             else
    1302           0 :                 pAnchorContent = aTempContents.back();
    1303           0 :             String sFileName(pFileNames[nFile]);
    1304           0 :             INetURLObject aFileUrl;
    1305           0 :             aFileUrl.SetSmartURL( sFileName );
    1306             :             String sSectionName(String(aFileUrl.GetLastName(
    1307             :                 INetURLObject::DECODE_UNAMBIGUOUS)).GetToken(0,
    1308           0 :                 sfx2::cTokenSeperator));
    1309           0 :             sal_uInt16 nSectCount = rSh.GetSectionFmtCount();
    1310           0 :             String sTempSectionName(sSectionName);
    1311           0 :             sal_uInt16 nAddNumber = 0;
    1312           0 :             sal_uInt16 nCount = 0;
    1313             :             // evtl : und Index anhaengen, wenn der Bereichsname schon vergeben ist
    1314           0 :             while ( nCount < nSectCount )
    1315             :             {
    1316           0 :                 const SwSectionFmt& rFmt = rSh.GetSectionFmt(nCount);
    1317           0 :                 if ((rFmt.GetSection()->GetSectionName() == sTempSectionName)
    1318           0 :                     && rFmt.IsInNodesArr())
    1319             :                 {
    1320           0 :                     nCount = 0;
    1321           0 :                     nAddNumber++;
    1322           0 :                     sTempSectionName = sSectionName;
    1323           0 :                     sTempSectionName += ':';
    1324           0 :                     sTempSectionName += String::CreateFromInt32( nAddNumber );
    1325             :                 }
    1326             :                 else
    1327           0 :                     nCount++;
    1328             :             }
    1329             : 
    1330           0 :             if ( nAddNumber )
    1331           0 :                 sSectionName = sTempSectionName;
    1332             : 
    1333           0 :             SwSectionData aSectionData(CONTENT_SECTION, sSectionName);
    1334           0 :             aSectionData.SetProtectFlag(true);
    1335           0 :             aSectionData.SetHidden(false);
    1336             : 
    1337           0 :             aSectionData.SetLinkFileName(sFileName);
    1338           0 :             aSectionData.SetType(FILE_LINK_SECTION);
    1339           0 :             aSectionData.SetLinkFilePassword( sFilePassword );
    1340             : 
    1341           0 :             rSh.InsertGlobalDocContent( *pAnchorContent, aSectionData );
    1342           0 :         }
    1343           0 :         if ( bMove )
    1344             :         {
    1345           0 :             Update( sal_False );
    1346             :             rSh.MoveGlobalDocContent(
    1347           0 :                 *pSwGlblDocContents, nEntryCount, nEntryCount + (sal_uInt16)nFiles, nEntryCount - (sal_uInt16)nFiles );
    1348             :         }
    1349           0 :         rSh.EndAction();
    1350           0 :         Update( sal_False );
    1351           0 :         Display();
    1352             :     }
    1353           0 : }
    1354             : 
    1355           0 : IMPL_LINK( SwGlobalTree, DialogClosedHdl, sfx2::FileDialogHelper*, _pFileDlg )
    1356             : {
    1357           0 :     Application::SetDefDialogParent( pDefParentWin );
    1358           0 :     if ( ERRCODE_NONE == _pFileDlg->GetError() )
    1359             :     {
    1360           0 :         SfxMediumList* pMedList = pDocInserter->CreateMediumList();
    1361           0 :         if ( pMedList )
    1362             :         {
    1363           0 :             Sequence< OUString >aFileNames( pMedList->size() );
    1364           0 :             OUString* pFileNames = aFileNames.getArray();
    1365           0 :             sal_Int32 nPos = 0;
    1366           0 :             for ( size_t i = 0, n = pMedList->size(); i < n; ++i )
    1367             :             {
    1368           0 :                 SfxMedium* pMed = pMedList->at( i );
    1369           0 :                 String sFileName = pMed->GetURLObject().GetMainURL( INetURLObject::NO_DECODE );
    1370           0 :                 sFileName += sfx2::cTokenSeperator;
    1371           0 :                 sFileName += pMed->GetFilter()->GetFilterName();
    1372           0 :                 sFileName += sfx2::cTokenSeperator;
    1373           0 :                 pFileNames[nPos++] = sFileName;
    1374           0 :             }
    1375           0 :             delete pMedList;
    1376           0 :             InsertRegion( pDocContent, aFileNames );
    1377           0 :             DELETEZ( pDocContent );
    1378             :         }
    1379             :     }
    1380           0 :     return 0;
    1381          30 : }
    1382             : 
    1383             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10