LCOV - code coverage report
Current view: top level - sw/source/core/uibase/utlui - glbltree.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 740 0.0 %
Date: 2014-04-14 Functions: 0 52 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 <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 <vcl/graphicfilter.hxx>
      32             : #include <vcl/settings.hxx>
      33             : 
      34             : #include "svtools/treelistentry.hxx"
      35             : #include <sfx2/docinsert.hxx>
      36             : #include <sfx2/filedlghelper.hxx>
      37             : 
      38             : #include <sfx2/app.hxx>
      39             : #include <swmodule.hxx>
      40             : #include <wrtsh.hxx>
      41             : #include <view.hxx>
      42             : #include <docsh.hxx>
      43             : #include <content.hxx>
      44             : #include <edglbldc.hxx>
      45             : #include <section.hxx>
      46             : #include <tox.hxx>
      47             : #include <cnttab.hxx>
      48             : #include <navipi.hxx>
      49             : #include <navicont.hxx>
      50             : #include <edtwin.hxx>
      51             : #include <uitool.hxx>
      52             : 
      53             : #include <cmdid.h>
      54             : #include <helpid.h>
      55             : #include <navipi.hrc>
      56             : #include <utlui.hrc>
      57             : #include <comcore.hrc>
      58             : #include <globals.hrc>
      59             : #include "swabstdlg.hxx"
      60             : 
      61             : using namespace ::com::sun::star::uno;
      62             : 
      63             : // Context menu for 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 for 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: push to left
      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             :     bool bValid;
     127             : public:
     128           0 :     SwGlobalFrameListener_Impl(SfxViewFrame& rFrame) :
     129           0 :         bValid(true)
     130             :         {
     131           0 :             StartListening(rFrame);
     132           0 :         }
     133             : 
     134             :     virtual void        Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) SAL_OVERRIDE;
     135             : 
     136           0 :     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 = 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         ( false ),
     159             :     bLastEntryEmphasis      ( false ),
     160           0 :     bIsImageListInitialized ( 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), false );
     193           0 :         pEmphasisEntry = 0;
     194             :     }
     195           0 :     else if(bLastEntryEmphasis && pLast)
     196             :     {
     197           0 :         ImplShowTargetEmphasis( pLast, 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 = TREELIST_APPEND;
     205           0 :         NotifyMoving( pDropEntry, pDDSource, pDummy, nInsertionPos );
     206             :     }
     207             :     else
     208             :     {
     209           0 :         TransferableDataHelper aData( rEvt.maDropEvent.Transferable );
     210             : 
     211           0 :         OUString 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_uLong nEntryCount = GetEntryCount();
     223             : 
     224             :             // Get data
     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             :                 // The list of contents must be newly fetched after inserting,
     232             :                 // to not work on an old content.
     233           0 :                 if(n)
     234             :                 {
     235           0 :                     pActiveShell->GetGlobalDocContent(*pTempContents);
     236             :                     // If the file was successfully inserted,
     237             :                     // then the next content must also be fetched.
     238           0 :                     if(nEntryCount < pTempContents->size())
     239             :                     {
     240           0 :                         nEntryCount++;
     241           0 :                         nAbsContPos++;
     242           0 :                         pCnt = (*pTempContents)[ nAbsContPos ];
     243             :                     }
     244             :                 }
     245             :             }
     246           0 :             delete pTempContents;
     247             :         }
     248           0 :         else if( !(sFileName =
     249           0 :                         SwNavigationPI::CreateDropFileName( aData )).isEmpty())
     250             :         {
     251           0 :             INetURLObject aTemp(sFileName);
     252           0 :             GraphicDescriptor aDesc(aTemp);
     253           0 :             if( !aDesc.Detect() )   // accept no graphics
     254             :             {
     255           0 :                 nRet = rEvt.mnAction;
     256           0 :                 InsertRegion(pCnt, &sFileName);
     257           0 :             }
     258           0 :         }
     259             :     }
     260           0 :     bLastEntryEmphasis = false;
     261           0 :     return nRet;
     262             : 
     263             : }
     264             : 
     265           0 : sal_Int8 SwGlobalTree::AcceptDrop( const AcceptDropEvent& rEvt )
     266             : {
     267           0 :     sal_Int8 nRet = rEvt.mnAction;
     268             : 
     269             :     //initiate scrolling
     270           0 :     GetDropTarget( rEvt.maPosPixel );
     271           0 :     SvTreeListEntry* pLast = (SvTreeListEntry*)LastVisible();
     272           0 :     if( rEvt.mbLeaving )
     273             :     {
     274           0 :         if( pEmphasisEntry )
     275             :         {
     276           0 :             ImplShowTargetEmphasis( Prev(pEmphasisEntry), false );
     277           0 :             pEmphasisEntry = 0;
     278             :         }
     279           0 :         else if(bLastEntryEmphasis && pLast)
     280             :         {
     281           0 :             ImplShowTargetEmphasis( pLast, false);
     282             :         }
     283           0 :         bLastEntryEmphasis = false;
     284             :     }
     285             :     else
     286             :     {
     287           0 :         SvTreeListEntry* pDropEntry = GetEntry( rEvt.maPosPixel );
     288           0 :         if(bIsInternalDrag)
     289             :         {
     290           0 :             if( pDDSource != pDropEntry )
     291           0 :                 nRet = rEvt.mnAction;
     292             :         }
     293           0 :         else if( IsDropFormatSupported( FORMAT_FILE ) ||
     294           0 :                   IsDropFormatSupported( FORMAT_STRING ) ||
     295           0 :                   IsDropFormatSupported( FORMAT_FILE_LIST ) ||
     296           0 :                   IsDropFormatSupported( SOT_FORMATSTR_ID_SOLK ) ||
     297           0 :                    IsDropFormatSupported( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK )||
     298           0 :                    IsDropFormatSupported( SOT_FORMATSTR_ID_FILECONTENT ) ||
     299           0 :                    IsDropFormatSupported( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR ) ||
     300           0 :                    IsDropFormatSupported( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR ) ||
     301           0 :                    IsDropFormatSupported( SOT_FORMATSTR_ID_FILENAME ))
     302           0 :                 nRet = DND_ACTION_LINK;
     303             : 
     304           0 :         if(pEmphasisEntry && pEmphasisEntry != pDropEntry)
     305           0 :             ImplShowTargetEmphasis( Prev(pEmphasisEntry), false );
     306           0 :         else if(pLast && bLastEntryEmphasis  && pDropEntry)
     307             :         {
     308           0 :             ImplShowTargetEmphasis( pLast, false);
     309           0 :             bLastEntryEmphasis = false;
     310             :         }
     311             : 
     312           0 :         if(pDropEntry)
     313           0 :             ImplShowTargetEmphasis( Prev(pDropEntry), DND_ACTION_NONE != nRet );
     314           0 :         else if(pLast)
     315             :         {
     316           0 :             ImplShowTargetEmphasis( pLast, DND_ACTION_NONE != nRet );
     317           0 :             bLastEntryEmphasis = true;
     318             :         }
     319           0 :         pEmphasisEntry = pDropEntry;
     320             :     }
     321           0 :     return nRet;
     322             : }
     323             : 
     324           0 : PopupMenu* SwGlobalTree::CreateContextMenu()
     325             : {
     326           0 :     PopupMenu* pPop = 0;
     327           0 :     if(pActiveShell &&
     328           0 :         !pActiveShell->GetView().GetDocShell()->IsReadOnly())
     329             :     {
     330           0 :         sal_uInt16 nEnableFlags = GetEnableFlags();
     331           0 :         pPop = new PopupMenu;
     332           0 :         PopupMenu* pSubPop1 = new PopupMenu;
     333           0 :         PopupMenu* pSubPop2 = new PopupMenu;
     334             : 
     335           0 :         for (sal_uInt16 i = CTX_UPDATE_SEL; i <= CTX_UPDATE_ALL; i++)
     336             :         {
     337           0 :             pSubPop2->InsertItem( i, aContextStrings[ST_UPDATE_SEL - ST_GLOBAL_CONTEXT_FIRST - CTX_UPDATE_SEL+ i] );
     338           0 :             pSubPop2->SetHelpId(i, aHelpForMenu[i]);
     339             :         }
     340           0 :         pSubPop2->EnableItem(CTX_UPDATE_SEL, 0 != (nEnableFlags & ENABLE_UPDATE_SEL));
     341             : 
     342           0 :         pSubPop1->InsertItem(CTX_INSERT_ANY_INDEX, aContextStrings[ST_INDEX  - ST_GLOBAL_CONTEXT_FIRST]);
     343           0 :         pSubPop1->SetHelpId(CTX_INSERT_ANY_INDEX, aHelpForMenu[CTX_INSERT_ANY_INDEX]);
     344           0 :         pSubPop1->InsertItem(CTX_INSERT_FILE, aContextStrings[ST_FILE   - ST_GLOBAL_CONTEXT_FIRST]);
     345           0 :         pSubPop1->SetHelpId(CTX_INSERT_FILE, aHelpForMenu[CTX_INSERT_FILE]);
     346           0 :         pSubPop1->InsertItem(CTX_INSERT_NEW_FILE, aContextStrings[ST_NEW_FILE   - ST_GLOBAL_CONTEXT_FIRST]);
     347           0 :         pSubPop1->SetHelpId(CTX_INSERT_NEW_FILE, aHelpForMenu[CTX_INSERT_NEW_FILE]);
     348           0 :         pSubPop1->InsertItem(CTX_INSERT_TEXT, aContextStrings[ST_TEXT   - ST_GLOBAL_CONTEXT_FIRST]);
     349           0 :         pSubPop1->SetHelpId(CTX_INSERT_TEXT, aHelpForMenu[CTX_INSERT_TEXT]);
     350             : 
     351           0 :         pPop->InsertItem(CTX_UPDATE, aContextStrings[ST_UPDATE - ST_GLOBAL_CONTEXT_FIRST]);
     352           0 :         pPop->SetHelpId(CTX_UPDATE, aHelpForMenu[CTX_UPDATE]);
     353           0 :         pPop->InsertItem(CTX_EDIT, aContextStrings[ST_EDIT_CONTENT - ST_GLOBAL_CONTEXT_FIRST]);
     354           0 :         pPop->SetHelpId(CTX_EDIT, aHelpForMenu[CTX_EDIT]);
     355           0 :         if(nEnableFlags&ENABLE_EDIT_LINK)
     356             :         {
     357           0 :             pPop->InsertItem(CTX_EDIT_LINK, aContextStrings[ST_EDIT_LINK - ST_GLOBAL_CONTEXT_FIRST]);
     358           0 :             pPop->SetHelpId(CTX_EDIT_LINK, aHelpForMenu[CTX_EDIT_LINK]);
     359             :         }
     360           0 :         pPop->InsertItem(CTX_INSERT, aContextStrings[ST_INSERT - ST_GLOBAL_CONTEXT_FIRST]);
     361           0 :         pPop->SetHelpId(CTX_INSERT, aHelpForMenu[CTX_INSERT]);
     362           0 :         pPop->InsertSeparator() ;
     363           0 :         pPop->InsertItem(CTX_DELETE, aContextStrings[ST_DELETE - ST_GLOBAL_CONTEXT_FIRST]);
     364           0 :         pPop->SetHelpId(CTX_DELETE, aHelpForMenu[CTX_DELETE]);
     365             : 
     366             :         //disabling if applicable
     367           0 :         pSubPop1->EnableItem(CTX_INSERT_ANY_INDEX,  0 != (nEnableFlags & ENABLE_INSERT_IDX ));
     368           0 :         pSubPop1->EnableItem(CTX_INSERT_TEXT,       0 != (nEnableFlags & ENABLE_INSERT_TEXT));
     369           0 :         pSubPop1->EnableItem(CTX_INSERT_FILE,       0 != (nEnableFlags & ENABLE_INSERT_FILE));
     370           0 :         pSubPop1->EnableItem(CTX_INSERT_NEW_FILE,   0 != (nEnableFlags & ENABLE_INSERT_FILE));
     371             : 
     372           0 :         pPop->EnableItem(CTX_UPDATE,    0 != (nEnableFlags & ENABLE_UPDATE));
     373           0 :         pPop->EnableItem(CTX_INSERT,    0 != (nEnableFlags & ENABLE_INSERT_IDX));
     374           0 :         pPop->EnableItem(CTX_EDIT,      0 != (nEnableFlags & ENABLE_EDIT));
     375           0 :         pPop->EnableItem(CTX_DELETE,    0 != (nEnableFlags & ENABLE_DELETE));
     376             : 
     377           0 :         pPop->SetPopupMenu( CTX_INSERT, pSubPop1 );
     378           0 :         pPop->SetPopupMenu( CTX_UPDATE, pSubPop2 );
     379             :     }
     380           0 :     return pPop;
     381             : }
     382             : 
     383           0 : void SwGlobalTree::TbxMenuHdl(sal_uInt16 nTbxId, ToolBox* pBox)
     384             : {
     385           0 :     sal_uInt16 nEnableFlags = GetEnableFlags();
     386           0 :     if(FN_GLOBAL_OPEN == nTbxId)
     387             :     {
     388           0 :         PopupMenu *pMenu = new PopupMenu;
     389           0 :         for (sal_uInt16 i = CTX_INSERT_ANY_INDEX; i <= CTX_INSERT_TEXT; i++)
     390             :         {
     391           0 :             pMenu->InsertItem( i, aContextStrings[ST_INDEX  - ST_GLOBAL_CONTEXT_FIRST - CTX_INSERT_ANY_INDEX + i] );
     392           0 :             pMenu->SetHelpId(i, aHelpForMenu[i] );
     393             :         }
     394           0 :         pMenu->EnableItem(CTX_INSERT_ANY_INDEX, 0 != (nEnableFlags & ENABLE_INSERT_IDX ));
     395           0 :         pMenu->EnableItem(CTX_INSERT_TEXT,      0 != (nEnableFlags & ENABLE_INSERT_TEXT));
     396           0 :         pMenu->EnableItem(CTX_INSERT_FILE,      0 != (nEnableFlags & ENABLE_INSERT_FILE));
     397           0 :         pMenu->EnableItem(CTX_INSERT_NEW_FILE,  0 != (nEnableFlags & ENABLE_INSERT_FILE));
     398           0 :         pMenu->SetSelectHdl(LINK(this, SwGlobalTree, PopupHdl));
     399           0 :         pMenu->Execute( pBox, pBox->GetItemRect(nTbxId).BottomLeft());
     400           0 :         delete pMenu;
     401           0 :         pBox->EndSelection();
     402           0 :         pBox->Invalidate();
     403             :     }
     404           0 :     else if(FN_GLOBAL_UPDATE == nTbxId)
     405             :     {
     406           0 :         PopupMenu *pMenu = new PopupMenu;
     407           0 :         for (sal_uInt16 i = CTX_UPDATE_SEL; i <= CTX_UPDATE_ALL; i++)
     408             :         {
     409           0 :             pMenu->InsertItem( i, aContextStrings[ST_UPDATE_SEL - ST_GLOBAL_CONTEXT_FIRST - CTX_UPDATE_SEL+ i] );
     410           0 :             pMenu->SetHelpId(i, aHelpForMenu[i] );
     411             :         }
     412           0 :         pMenu->EnableItem(CTX_UPDATE_SEL, 0 != (nEnableFlags & ENABLE_UPDATE_SEL));
     413           0 :         pMenu->SetSelectHdl(LINK(this, SwGlobalTree, PopupHdl));
     414           0 :         pMenu->Execute( pBox, pBox->GetItemRect(nTbxId).BottomLeft());
     415           0 :         delete pMenu;
     416           0 :         pBox->EndSelection();
     417           0 :         pBox->Invalidate();
     418             :     }
     419           0 : }
     420             : 
     421           0 : sal_uInt16  SwGlobalTree::GetEnableFlags() const
     422             : {
     423           0 :     SvTreeListEntry* pEntry = FirstSelected();
     424           0 :     sal_uLong nSelCount = GetSelectionCount();
     425           0 :     sal_uLong nEntryCount = GetEntryCount();
     426           0 :     SvTreeListEntry* pPrevEntry = pEntry ? Prev(pEntry) : 0;
     427             : 
     428           0 :     sal_uInt16 nRet = 0;
     429           0 :     if(nSelCount == 1 || !nEntryCount)
     430           0 :         nRet |= ENABLE_INSERT_IDX|ENABLE_INSERT_FILE;
     431           0 :     if(nSelCount == 1)
     432             :     {
     433           0 :         nRet |= ENABLE_EDIT;
     434           0 :         if( ((SwGlblDocContent*)pEntry->GetUserData())->GetType() != GLBLDOC_UNKNOWN &&
     435           0 :                     (!pPrevEntry || ((SwGlblDocContent*)pPrevEntry->GetUserData())->GetType() != GLBLDOC_UNKNOWN))
     436           0 :             nRet |= ENABLE_INSERT_TEXT;
     437           0 :         if( GLBLDOC_SECTION == ((SwGlblDocContent*)pEntry->GetUserData())->GetType() )
     438           0 :             nRet |= ENABLE_EDIT_LINK;
     439             :     }
     440           0 :     else if(!nEntryCount)
     441             :     {
     442           0 :         nRet |= ENABLE_INSERT_TEXT;
     443             :     }
     444           0 :     if(nEntryCount)
     445           0 :         nRet |= ENABLE_UPDATE|ENABLE_DELETE;
     446           0 :     if(nSelCount)
     447           0 :         nRet |= ENABLE_UPDATE_SEL;
     448           0 :     return nRet;
     449             : }
     450             : 
     451           0 : void     SwGlobalTree::RequestHelp( const HelpEvent& rHEvt )
     452             : {
     453           0 :     bool bParent = true;
     454           0 :     Update(sal_True);
     455           0 :     Display(true);
     456           0 :     if( rHEvt.GetMode() & HELPMODE_QUICK )
     457             :     {
     458           0 :         Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ));
     459           0 :         SvTreeListEntry* pEntry = GetEntry( aPos );
     460             :         const SwGlblDocContent* pCont = pEntry ?
     461           0 :                             (const SwGlblDocContent*)pEntry->GetUserData() : 0;
     462           0 :         if( pCont &&  GLBLDOC_SECTION == pCont->GetType())
     463             :         {
     464           0 :             bParent = false;
     465             :             SvLBoxTab* pTab;
     466           0 :             SvLBoxItem* pItem = GetItem( pEntry, aPos.X(), &pTab );
     467           0 :             if (pItem && SV_ITEM_ID_LBOXSTRING == pItem->GetType())
     468             :             {
     469           0 :                 const SwSection* pSect = pCont->GetSection();
     470           0 :                 OUString sEntry = pSect->GetLinkFileName().getToken(0, sfx2::cTokenSeparator);
     471           0 :                 if(!pSect->IsConnectFlag())
     472           0 :                     sEntry = aContextStrings[ST_BROKEN_LINK - ST_GLOBAL_CONTEXT_FIRST] + sEntry;
     473           0 :                 Point aEntryPos = GetEntryPosition( pEntry );
     474             : 
     475           0 :                 aEntryPos.X() = GetTabPos( pEntry, pTab );
     476           0 :                 Size aSize( pItem->GetSize( this, pEntry ) );
     477             : 
     478           0 :                 if((aEntryPos.X() + aSize.Width()) > GetSizePixel().Width())
     479           0 :                     aSize.Width() = GetSizePixel().Width() - aEntryPos.X();
     480             : 
     481           0 :                 aEntryPos = OutputToScreenPixel(aEntryPos);
     482           0 :                 Rectangle aItemRect( aEntryPos, aSize );
     483           0 :                 if(Help::IsBalloonHelpEnabled())
     484             :                 {
     485           0 :                     aEntryPos.X() += aSize.Width();
     486           0 :                     Help::ShowBalloon( this, aEntryPos, aItemRect, sEntry );
     487             :                 }
     488             :                 else
     489             :                     Help::ShowQuickHelp( this, aItemRect, sEntry,
     490           0 :                         QUICKHELP_LEFT|QUICKHELP_VCENTER );
     491             :             }
     492             :         }
     493             :     }
     494             : 
     495           0 :     if(bParent)
     496           0 :         SvTreeListBox::RequestHelp(rHEvt);
     497           0 : }
     498             : 
     499           0 : void     SwGlobalTree::SelectHdl()
     500             : {
     501             : 
     502           0 :     sal_uLong nSelCount = GetSelectionCount();
     503           0 :     SvTreeListEntry* pSel = FirstSelected();
     504           0 :     sal_uLong nAbsPos = pSel ? GetModel()->GetAbsPos(pSel) : 0;
     505           0 :     SwNavigationPI* pNavi = GetParentWindow();
     506           0 :     bool bReadonly = !pActiveShell ||
     507           0 :                 pActiveShell->GetView().GetDocShell()->IsReadOnly();
     508           0 :     pNavi->aGlobalToolBox.EnableItem(FN_GLOBAL_EDIT,  nSelCount == 1 && !bReadonly);
     509           0 :     pNavi->aGlobalToolBox.EnableItem(FN_GLOBAL_OPEN,  nSelCount <= 1 && !bReadonly);
     510           0 :     pNavi->aGlobalToolBox.EnableItem(FN_GLOBAL_UPDATE,  GetEntryCount() > 0 && !bReadonly);
     511             :     pNavi->aGlobalToolBox.EnableItem(FN_ITEM_UP,
     512           0 :                     nSelCount == 1 && nAbsPos && !bReadonly);
     513             :     pNavi->aGlobalToolBox.EnableItem(FN_ITEM_DOWN,
     514           0 :                     nSelCount == 1 && nAbsPos < GetEntryCount() - 1 && !bReadonly);
     515             : 
     516           0 : }
     517             : 
     518           0 : void     SwGlobalTree::DeselectHdl()
     519             : {
     520           0 :     SelectHdl();
     521           0 : }
     522             : 
     523           0 : DragDropMode SwGlobalTree::NotifyStartDrag( TransferDataContainer& ,
     524             :                                                 SvTreeListEntry* pEntry )
     525             : {
     526           0 :     bIsInternalDrag = true;
     527           0 :     pDDSource = pEntry;
     528           0 :     return SV_DRAGDROP_CTRL_MOVE;
     529             : }
     530             : 
     531           0 : sal_IntPtr SwGlobalTree::GetTabPos( SvTreeListEntry*, SvLBoxTab* pTab)
     532             : {
     533           0 :     return pTab->GetPos() - GLBL_TABPOS_SUB;
     534             : }
     535             : 
     536           0 : TriState SwGlobalTree::NotifyMoving(   SvTreeListEntry*  pTarget,
     537             :                                         SvTreeListEntry*  pSource,
     538             :                                         SvTreeListEntry*&,
     539             :                                         sal_uLong&
     540             :                                     )
     541             : {
     542           0 :     SvTreeList* _pModel = GetModel();
     543           0 :     sal_uLong nSource = _pModel->GetAbsPos(pSource);
     544           0 :     sal_uLong nDest   = pTarget ? _pModel->GetAbsPos(pTarget) : pSwGlblDocContents->size();
     545             : 
     546           0 :     if( pActiveShell->MoveGlobalDocContent(
     547           0 :             *pSwGlblDocContents, nSource, nSource + 1, nDest ) &&
     548           0 :             Update( sal_False ))
     549           0 :         Display();
     550             : 
     551           0 :     return TRISTATE_FALSE;
     552             : }
     553             : 
     554           0 : TriState SwGlobalTree::NotifyCopying(  SvTreeListEntry*  /*pTarget*/,
     555             :                                         SvTreeListEntry*  /*pEntry*/,
     556             :                                         SvTreeListEntry*& /*rpNewParent*/,
     557             :                                         sal_uLong&        /*rNewChildPos*/
     558             :                                     )
     559             : {
     560           0 :     return TRISTATE_FALSE;
     561             : }
     562             : 
     563           0 : bool SwGlobalTree::NotifyAcceptDrop( SvTreeListEntry* pEntry)
     564             : {
     565           0 :     return pEntry != 0;
     566             : }
     567             : 
     568           0 : void SwGlobalTree::StartDrag( sal_Int8 nAction, const Point& rPt )
     569             : {
     570           0 :     if( 1 == GetSelectionCount() )
     571           0 :         SvTreeListBox::StartDrag( nAction, rPt );
     572           0 : }
     573             : 
     574           0 : void SwGlobalTree::DragFinished( sal_Int8 nAction )
     575             : {
     576           0 :     SvTreeListBox::DragFinished( nAction );
     577           0 :     bIsInternalDrag = false;
     578           0 : }
     579             : 
     580             : // If a Ctrl+DoubleClick is executed in an empty area,
     581             : // then the base function of the control should be called.
     582             : 
     583           0 : void  SwGlobalTree::MouseButtonDown( const MouseEvent& rMEvt )
     584             : {
     585           0 :     Point aPos( rMEvt.GetPosPixel());
     586           0 :     SvTreeListEntry* pEntry = GetEntry( aPos, true );
     587           0 :     if( !pEntry && rMEvt.IsLeft() && rMEvt.IsMod1() && (rMEvt.GetClicks() % 2) == 0)
     588           0 :         Control::MouseButtonDown( rMEvt );
     589             :     else
     590           0 :         SvTreeListBox::MouseButtonDown( rMEvt );
     591           0 : }
     592             : 
     593           0 : void     SwGlobalTree::GetFocus()
     594             : {
     595           0 :     if(Update( sal_False ))
     596           0 :         Display();
     597           0 :     SvTreeListBox::GetFocus();
     598           0 : }
     599             : 
     600           0 : void     SwGlobalTree::KeyInput(const KeyEvent& rKEvt)
     601             : {
     602           0 :     const KeyCode aCode = rKEvt.GetKeyCode();
     603           0 :     if(aCode.GetCode() == KEY_RETURN)
     604             :     {
     605           0 :         switch(aCode.GetModifier())
     606             :         {
     607             :             case KEY_MOD2:
     608             :                 // Switch boxes
     609           0 :                 GetParentWindow()->ToggleTree();
     610           0 :             break;
     611             :         }
     612             :     }
     613             :     else
     614           0 :         SvTreeListBox::KeyInput(rKEvt);
     615           0 : }
     616             : 
     617           0 : void SwGlobalTree::Clear()
     618             : {
     619           0 :     pEmphasisEntry = 0;
     620           0 :     SvTreeListBox::Clear();
     621           0 : }
     622             : 
     623           0 : void    SwGlobalTree::Display(bool bOnlyUpdateUserData)
     624             : {
     625           0 :     if(!bIsImageListInitialized)
     626             :     {
     627           0 :         aEntryImages = ImageList(SW_RES(IMG_NAVI_ENTRYBMP));
     628           0 :         bIsImageListInitialized = true;
     629             :     }
     630           0 :     size_t nCount = pSwGlblDocContents->size();
     631           0 :     if(bOnlyUpdateUserData && GetEntryCount() == pSwGlblDocContents->size())
     632             :     {
     633           0 :         SvTreeListEntry* pEntry = First();
     634           0 :         for( size_t i = 0; i < nCount; i++)
     635             :         {
     636           0 :             SwGlblDocContent* pCont = (*pSwGlblDocContents)[i];
     637           0 :             pEntry->SetUserData(pCont);
     638           0 :             pEntry = Next(pEntry);
     639             :             assert(pEntry);
     640           0 :             if (!pEntry)
     641           0 :                 break;
     642             :         }
     643             :     }
     644             :     else
     645             :     {
     646           0 :         SetUpdateMode( false );
     647           0 :         SvTreeListEntry* pOldSelEntry = FirstSelected();
     648           0 :         OUString sEntryName;  // Name of the entry
     649           0 :         sal_uLong nSelPos = TREELIST_ENTRY_NOTFOUND;
     650           0 :         if(pOldSelEntry)
     651             :         {
     652           0 :             sEntryName = GetEntryText(pOldSelEntry);
     653           0 :             nSelPos = 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( size_t i = 0; i < nCount; i++)
     661             :         {
     662           0 :             SwGlblDocContent* pCont = (*pSwGlblDocContents)[i];
     663           0 :             OUString 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, false, TREELIST_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 != TREELIST_ENTRY_NOTFOUND && 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( true );
     708             :     }
     709           0 : }
     710             : 
     711           0 : void SwGlobalTree::InsertRegion( const SwGlblDocContent* pCont, const OUString* 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 :                 OUString("swriter"), true );
     721           0 :         pDocInserter->StartExecuteModal( LINK( this, SwGlobalTree, DialogClosedHdl ) );
     722             :     }
     723           0 :     else if ( !pFileName->isEmpty() )
     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             :     // If a RequestHelp is called during the dialogue,
     778             :     // then the content gets lost. Because of that a copy
     779             :     // is created in which only the DocPos is set correctly.
     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             :             // Two passes: first update the areas, then the directories.
     791           0 :             SvTreeListEntry* pSelEntry = FirstSelected();
     792           0 :             while( pSelEntry )
     793             :             {
     794           0 :                 SwGlblDocContent* pContent = (SwGlblDocContent*)pSelEntry->GetUserData();
     795           0 :                 if(GLBLDOC_SECTION == pContent->GetType() &&
     796           0 :                     pContent->GetSection()->IsConnected())
     797             :                 {
     798           0 :                     ((SwSection*)pContent->GetSection())->UpdateNow();
     799             :                 }
     800             : 
     801           0 :                 pSelEntry = NextSelected(pSelEntry);
     802             :             }
     803           0 :             pSelEntry = FirstSelected();
     804           0 :             while( pSelEntry )
     805             :             {
     806           0 :                 SwGlblDocContent* pContent = (SwGlblDocContent*)pSelEntry->GetUserData();
     807           0 :                 if(GLBLDOC_TOXBASE == pContent->GetType())
     808           0 :                     pActiveShell->UpdateTableOf(*pContent->GetTOX());
     809           0 :                 pSelEntry = NextSelected(pSelEntry);
     810             :             }
     811             : 
     812             :         }
     813           0 :         break;
     814             :         case CTX_UPDATE_INDEX:
     815             :         {
     816           0 :             nSlot = FN_UPDATE_TOX;
     817             :         }
     818           0 :         break;
     819             :         case CTX_UPDATE_LINK:
     820             :         case CTX_UPDATE_ALL:
     821             :         {
     822           0 :             pActiveShell->GetLinkManager().UpdateAllLinks(true);
     823           0 :             if(CTX_UPDATE_ALL == nSelectedPopupEntry)
     824           0 :                 nSlot = FN_UPDATE_TOX;
     825           0 :             pCont = 0;
     826             :         }
     827           0 :         break;
     828             :         case CTX_EDIT:
     829             :         {
     830             :             OSL_ENSURE(pCont, "edit without entry ? " );
     831           0 :             EditContent(pCont);
     832             :         }
     833           0 :         break;
     834             :         case CTX_EDIT_LINK:
     835             :         {
     836             :             OSL_ENSURE(pCont, "edit without entry ? " );
     837             :             SfxStringItem aName(FN_EDIT_REGION,
     838           0 :                     pCont->GetSection()->GetSectionName());
     839           0 :             rDispatch.Execute(FN_EDIT_REGION, SFX_CALLMODE_ASYNCHRON, &aName, 0L);
     840             :         }
     841           0 :         break;
     842             :         case CTX_DELETE:
     843             :         {
     844             :             // If several entries selected, then after each delete the array
     845             :             // must be refilled. So you do not have to remember anything,
     846             :             // deleting begins at the end.
     847           0 :             SvTreeListEntry* pSelEntry = LastSelected();
     848           0 :             SwGlblDocContents* pTempContents  = 0;
     849           0 :             pActiveShell->StartAction();
     850           0 :             while(pSelEntry)
     851             :             {
     852             :                 pActiveShell->DeleteGlobalDocContent(
     853             :                     pTempContents ? *pTempContents : *pSwGlblDocContents,
     854           0 :                                      GetModel()->GetAbsPos(pSelEntry));
     855           0 :                 pSelEntry = PrevSelected(pSelEntry);
     856           0 :                 if(pSelEntry)
     857             :                 {
     858           0 :                     delete pTempContents;
     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(
     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             :             // Creating a new doc
     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             :             // save at
     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 :                 OUString sNewFile(pMedium->GetURLObject().GetMainURL(INetURLObject::DECODE_TO_IURI));
     937             :                 // Insert the area with the Doc-Name
     938             :                 // Bring the own Doc in the foreground
     939           0 :                 if(aFrmListener.IsValid() && !sNewFile.isEmpty())
     940             :                 {
     941           0 :                     pGlobFrm->ToTop();
     942             :                     // Due to the update the entries are invalid
     943           0 :                     if(nEntryPos != (sal_uLong)-1)
     944             :                     {
     945           0 :                         Update( sal_False );
     946           0 :                         Display();
     947           0 :                         Select(GetModel()->GetEntryAtAbsPos(nEntryPos));
     948           0 :                         pEntry = FirstSelected();
     949           0 :                         pCont = pEntry ? (SwGlblDocContent*)pEntry->GetUserData() : 0;
     950             :                     }
     951             :                     else
     952             :                     {
     953           0 :                         pEntry = 0;
     954           0 :                         pCont = 0;
     955             :                     }
     956           0 :                     if(pBool->GetValue())
     957             :                     {
     958           0 :                         InsertRegion(pCont, &sNewFile);
     959           0 :                         pFrame->ToTop();
     960             :                     }
     961             :                     else
     962             :                         pFrame->GetDispatcher()->Execute(SID_CLOSEWIN,
     963           0 :                                                 SFX_CALLMODE_SYNCHRON);
     964             :                 }
     965             :                 else
     966             :                 {
     967           0 :                     pFrame->ToTop();
     968           0 :                     return;
     969           0 :                 }
     970           0 :             }
     971             :         }
     972           0 :         break;
     973             :         case CTX_INSERT_TEXT:
     974             :         {
     975           0 :             if(pCont)
     976           0 :                 pActiveShell->InsertGlobalDocContent(*pCont);
     977             :             else
     978             :             {
     979           0 :                 pActiveShell->SplitNode(); // Empty document
     980           0 :                 pActiveShell->Up( false, 1 );
     981             :             }
     982           0 :             pActiveShell->GetView().GetEditWin().GrabFocus();
     983             :         }
     984           0 :         break;
     985             :         case CTX_UPDATE:
     986           0 :             pCont = 0;
     987           0 :         break;
     988             :         default:;
     989             :         // here nothing happens
     990             :     }
     991           0 :     if(pCont)
     992           0 :         GotoContent(pCont);
     993           0 :     if(nSlot)
     994           0 :         rDispatch.Execute(nSlot);
     995           0 :     if(Update( sal_False ))
     996           0 :         Display();
     997           0 :     if ( bDeleteContentCopy )
     998           0 :         delete pContCopy;
     999             :     else
    1000           0 :         bDeleteContentCopy = true;
    1001             : }
    1002             : 
    1003           0 : IMPL_LINK_NOARG(SwGlobalTree, Timeout)
    1004             : {
    1005           0 :     if(!HasFocus() && Update( sal_False ))
    1006           0 :         Display();
    1007           0 :     return 0;
    1008             : }
    1009             : 
    1010           0 : void SwGlobalTree::GotoContent(const SwGlblDocContent* pCont)
    1011             : {
    1012           0 :     pActiveShell->EnterStdMode();
    1013             : 
    1014           0 :     switch( pCont->GetType()  )
    1015             :     {
    1016             :         case GLBLDOC_UNKNOWN:
    1017           0 :             pActiveShell->GotoGlobalDocContent(*pCont);
    1018           0 :         break;
    1019             :         case GLBLDOC_TOXBASE:
    1020             :         {
    1021           0 :             const OUString sName = pCont->GetTOX()->GetTOXName();
    1022           0 :             if (!pActiveShell->GotoNextTOXBase(&sName))
    1023           0 :                 pActiveShell->GotoPrevTOXBase(&sName);
    1024             :         }
    1025           0 :         break;
    1026             :         case GLBLDOC_SECTION:
    1027           0 :         break;
    1028             :     }
    1029             : 
    1030           0 : }
    1031             : 
    1032           0 : void    SwGlobalTree::ShowTree()
    1033             : {
    1034           0 :     aUpdateTimer.Start();
    1035           0 :     SvTreeListBox::Show();
    1036           0 : }
    1037             : 
    1038           0 : void    SwGlobalTree::HideTree()
    1039             : {
    1040           0 :     aUpdateTimer.Stop();
    1041           0 :     SvTreeListBox::Hide();
    1042           0 : }
    1043             : 
    1044           0 : void    SwGlobalTree::ExecCommand(sal_uInt16 nCmd)
    1045             : {
    1046           0 :     SvTreeListEntry* pEntry = FirstSelected();
    1047             :     OSL_ENSURE(pEntry, "It explodes in the next moment");
    1048           0 :     if(FN_GLOBAL_EDIT == nCmd)
    1049             :     {
    1050             :         const SwGlblDocContent* pCont = (const SwGlblDocContent*)
    1051           0 :                                                 pEntry->GetUserData();
    1052           0 :         EditContent(pCont);
    1053             :     }
    1054             :     else
    1055             :     {
    1056           0 :         if(GetSelectionCount() == 1)
    1057             :         {
    1058           0 :             bool bMove = false;
    1059           0 :             sal_uLong nSource = GetModel()->GetAbsPos(pEntry);
    1060           0 :             sal_uLong nDest = nSource;
    1061           0 :             switch(nCmd)
    1062             :             {
    1063             :                 case FN_ITEM_DOWN:
    1064             :                 {
    1065           0 :                     sal_uLong nEntryCount = GetEntryCount();
    1066           0 :                     bMove = nEntryCount > nSource + 1;
    1067           0 :                     nDest+= 2;
    1068             :                 }
    1069           0 :                 break;
    1070             :                 case FN_ITEM_UP:
    1071             :                 {
    1072           0 :                     if(nSource)
    1073           0 :                         bMove = 0 != nSource;
    1074           0 :                     nDest--;
    1075             :                 }
    1076           0 :                 break;
    1077             :             }
    1078           0 :             if( bMove && pActiveShell->MoveGlobalDocContent(
    1079           0 :                 *pSwGlblDocContents, nSource, nSource + 1, nDest ) &&
    1080           0 :                     Update( sal_False ))
    1081           0 :                 Display();
    1082             :         }
    1083             :     }
    1084           0 : }
    1085             : 
    1086           0 : sal_Bool    SwGlobalTree::Update(sal_Bool bHard)
    1087             : {
    1088           0 :     SwView* pActView = GetParentWindow()->GetCreateView();
    1089           0 :     sal_Bool bRet = sal_False;
    1090           0 :     if(pActView && pActView->GetWrtShellPtr())
    1091             :     {
    1092           0 :         const SwWrtShell* pOldShell = pActiveShell;
    1093           0 :         pActiveShell = pActView->GetWrtShellPtr();
    1094           0 :         if(pActiveShell != pOldShell)
    1095             :         {
    1096           0 :             delete pSwGlblDocContents;
    1097           0 :             pSwGlblDocContents = 0;
    1098             :         }
    1099           0 :         if(!pSwGlblDocContents)
    1100             :         {
    1101           0 :             pSwGlblDocContents = new SwGlblDocContents;
    1102           0 :             bRet = sal_True;
    1103           0 :             pActiveShell->GetGlobalDocContent(*pSwGlblDocContents);
    1104             :         }
    1105             :         else
    1106             :         {
    1107           0 :             sal_Bool bCopy = sal_False;
    1108           0 :             SwGlblDocContents* pTempContents  = new SwGlblDocContents;
    1109           0 :             pActiveShell->GetGlobalDocContent(*pTempContents);
    1110           0 :             if(pTempContents->size() != pSwGlblDocContents->size() ||
    1111           0 :                     pTempContents->size() != GetEntryCount())
    1112             :             {
    1113           0 :                 bRet = sal_True;
    1114           0 :                 bCopy = sal_True;
    1115             :             }
    1116             :             else
    1117             :             {
    1118           0 :                 for(size_t i = 0; i < pTempContents->size() && !bCopy; i++)
    1119             :                 {
    1120           0 :                     SwGlblDocContent* pLeft = (*pTempContents)[i];
    1121           0 :                     SwGlblDocContent* pRight = (*pSwGlblDocContents)[i];
    1122           0 :                     GlobalDocContentType eType = pLeft->GetType();
    1123           0 :                     SvTreeListEntry* pEntry = GetEntry(i);
    1124           0 :                     OUString sTemp = GetEntryText(pEntry);
    1125           0 :                     if (
    1126           0 :                          eType != pRight->GetType() ||
    1127             :                          (
    1128           0 :                            eType == GLBLDOC_SECTION &&
    1129           0 :                            pLeft->GetSection()->GetSectionName() != sTemp
    1130           0 :                          ) ||
    1131             :                          (
    1132           0 :                            eType == GLBLDOC_TOXBASE &&
    1133           0 :                            pLeft->GetTOX()->GetTitle() != sTemp
    1134             :                          )
    1135             :                        )
    1136             :                     {
    1137           0 :                         bCopy = bRet = sal_True;
    1138             :                     }
    1139           0 :                 }
    1140             :             }
    1141           0 :             if(bCopy || bHard)
    1142             :             {
    1143           0 :                 pSwGlblDocContents->DeleteAndDestroyAll();
    1144           0 :                 pSwGlblDocContents->insert( *pTempContents );
    1145           0 :                 pTempContents->clear();
    1146             : 
    1147             :             }
    1148           0 :             delete pTempContents;
    1149             :         }
    1150             : 
    1151             :     }
    1152             :     else
    1153             :     {
    1154           0 :         Clear();
    1155           0 :         if(pSwGlblDocContents)
    1156           0 :             pSwGlblDocContents->DeleteAndDestroyAll();
    1157             :     }
    1158             :     // FIXME: Implement a test for changes!
    1159           0 :     return bRet;
    1160             : }
    1161             : 
    1162           0 : void SwGlobalTree::OpenDoc(const SwGlblDocContent* pCont)
    1163             : {
    1164             :     const OUString sFileName(pCont->GetSection()->GetLinkFileName().getToken(0,
    1165           0 :             sfx2::cTokenSeparator));
    1166           0 :     bool bFound = false;
    1167           0 :     const SfxObjectShell* pCurr = SfxObjectShell::GetFirst();
    1168           0 :     while( !bFound && pCurr )
    1169             :     {
    1170           0 :         if(pCurr->GetMedium() &&
    1171           0 :            pCurr->GetMedium()->GetURLObject().GetMainURL(INetURLObject::DECODE_TO_IURI) == sFileName)
    1172             :         {
    1173           0 :             bFound = true;
    1174           0 :             SwGlobalTree::SetShowShell(pCurr);
    1175             :             Application::PostUserEvent( STATIC_LINK(
    1176           0 :                         this, SwGlobalTree, ShowFrameHdl ) );
    1177           0 :             pCurr = 0;
    1178             :         }
    1179             :         else
    1180           0 :             pCurr = SfxObjectShell::GetNext(*pCurr);
    1181             :     }
    1182           0 :     if(!bFound)
    1183             :     {
    1184           0 :         SfxStringItem aURL(SID_FILE_NAME, sFileName);
    1185           0 :         SfxBoolItem aReadOnly(SID_DOC_READONLY, false);
    1186           0 :         SfxStringItem aTargetFrameName( SID_TARGETNAME, "_blank" );
    1187           0 :         SfxStringItem aReferer(SID_REFERER, pActiveShell->GetView().GetDocShell()->GetTitle());
    1188           0 :         pActiveShell->GetView().GetViewFrame()->GetDispatcher()->
    1189             :                 Execute(SID_OPENDOC, SFX_CALLMODE_ASYNCHRON,
    1190           0 :                             &aURL, &aReadOnly, &aReferer, &aTargetFrameName, 0L);
    1191           0 :     }
    1192           0 : }
    1193             : 
    1194           0 : IMPL_LINK_NOARG( SwGlobalTree, DoubleClickHdl)
    1195             : {
    1196           0 :     SvTreeListEntry* pEntry = GetCurEntry();
    1197           0 :     SwGlblDocContent* pCont = (SwGlblDocContent*)pEntry->GetUserData();
    1198           0 :     if(pCont->GetType() == GLBLDOC_SECTION)
    1199           0 :         OpenDoc(pCont);
    1200             :     else
    1201             :     {
    1202           0 :         GotoContent(pCont);
    1203           0 :         pActiveShell->GetView().GetEditWin().GrabFocus();
    1204             :     }
    1205           0 :     return 0;
    1206             : }
    1207             : 
    1208           0 : IMPL_STATIC_LINK_NOINSTANCE(SwGlobalTree, ShowFrameHdl, SwGlobalTree*, EMPTYARG)
    1209             : {
    1210           0 :     if(SwGlobalTree::GetShowShell())
    1211           0 :         SfxViewFrame::GetFirst(SwGlobalTree::GetShowShell())->ToTop();
    1212           0 :     SwGlobalTree::SetShowShell(0);
    1213           0 :     return 0;
    1214             : }
    1215             : 
    1216           0 : void SwGlobalTree::InitEntry(SvTreeListEntry* pEntry,
    1217             :         const OUString& rStr ,const Image& rImg1,const Image& rImg2,
    1218             :         SvLBoxButtonKind eButtonKind)
    1219             : {
    1220           0 :     sal_uInt16 nColToHilite = 1; //0==Bitmap;1=="Column1";2=="Column2"
    1221           0 :     SvTreeListBox::InitEntry( pEntry, rStr, rImg1, rImg2, eButtonKind );
    1222           0 :     SvLBoxString* pCol = (SvLBoxString*)pEntry->GetItem( nColToHilite );
    1223           0 :     SwLBoxString* pStr = new SwLBoxString( pEntry, 0, pCol->GetText() );
    1224           0 :     pEntry->ReplaceItem( pStr, nColToHilite );
    1225           0 : }
    1226             : 
    1227           0 : void SwLBoxString::Paint(
    1228             :     const Point& rPos, SvTreeListBox& rDev, const SvViewDataEntry* pView,
    1229             :     const SvTreeListEntry* pEntry)
    1230             : {
    1231           0 :     SwGlblDocContent* pCont = (SwGlblDocContent*)pEntry->GetUserData();
    1232           0 :     if(pCont->GetType() == GLBLDOC_SECTION &&
    1233           0 :         !(pCont->GetSection())->IsConnectFlag() )
    1234             :     {
    1235           0 :         Font aOldFont( rDev.GetFont());
    1236           0 :         Font aFont(aOldFont);
    1237           0 :         Color aCol( COL_LIGHTRED );
    1238           0 :         aFont.SetColor( aCol );
    1239           0 :         rDev.SetFont( aFont );
    1240           0 :         rDev.DrawText( rPos, GetText() );
    1241           0 :         rDev.SetFont( aOldFont );
    1242             :     }
    1243             :     else
    1244           0 :         SvLBoxString::Paint( rPos, rDev, pView, pEntry);
    1245           0 : }
    1246             : 
    1247           0 : void    SwGlobalTree::DataChanged( const DataChangedEvent& rDCEvt )
    1248             : {
    1249           0 :     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
    1250           0 :          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
    1251             :     {
    1252           0 :         aEntryImages = ImageList(SW_RES(IMG_NAVI_ENTRYBMP));
    1253           0 :         Update(sal_True);
    1254             :     }
    1255           0 :     SvTreeListBox::DataChanged( rDCEvt );
    1256           0 : }
    1257             : 
    1258           0 : void SwGlobalTree::InsertRegion( const SwGlblDocContent* _pContent, const Sequence< OUString >& _rFiles )
    1259             : {
    1260           0 :     sal_Int32 nFiles = _rFiles.getLength();
    1261           0 :     if ( nFiles )
    1262             :     {
    1263           0 :         bool bMove = false;
    1264           0 :         if ( !_pContent )
    1265             :         {
    1266           0 :             SvTreeListEntry* pLast = (SvTreeListEntry*)LastVisible();
    1267           0 :             _pContent = (SwGlblDocContent*)pLast->GetUserData();
    1268           0 :             bMove = true;
    1269             :         }
    1270           0 :         OUString sFilePassword;
    1271           0 :         sal_uLong nEntryCount = GetEntryCount();
    1272           0 :         const OUString* pFileNames = _rFiles.getConstArray();
    1273           0 :         SwWrtShell& rSh = GetParentWindow()->GetCreateView()->GetWrtShell();
    1274           0 :         rSh.StartAction();
    1275             :         // after insertion of the first new content the 'pCont' parameter becomes invalid
    1276             :         // find the index of the 'anchor' content to always use a current anchor content
    1277           0 :         size_t nAnchorContent = pSwGlblDocContents->size() - 1;
    1278           0 :         if ( !bMove )
    1279             :         {
    1280           0 :             for (size_t nContent = 0; nContent < pSwGlblDocContents->size();
    1281             :                     ++nContent)
    1282             :             {
    1283           0 :                 if( *_pContent == *(*pSwGlblDocContents)[ nContent ] )
    1284             :                 {
    1285           0 :                     nAnchorContent = nContent;
    1286           0 :                     break;
    1287             :                 }
    1288             :             }
    1289             :         }
    1290           0 :         SwGlblDocContents aTempContents;
    1291           0 :         for ( sal_Int32 nFile = 0; nFile < nFiles; ++nFile )
    1292             :         {
    1293             :             //update the global document content after each inserted document
    1294           0 :             rSh.GetGlobalDocContent(aTempContents);
    1295           0 :             SwGlblDocContent* pAnchorContent = 0;
    1296             :             OSL_ENSURE(aTempContents.size() > (nAnchorContent + nFile), "invalid anchor content -> last insertion failed");
    1297           0 :             if ( aTempContents.size() > (nAnchorContent + nFile) )
    1298           0 :                 pAnchorContent = aTempContents[nAnchorContent + nFile];
    1299             :             else
    1300           0 :                 pAnchorContent = aTempContents.back();
    1301           0 :             OUString sFileName(pFileNames[nFile]);
    1302           0 :             INetURLObject aFileUrl;
    1303           0 :             aFileUrl.SetSmartURL( sFileName );
    1304             :             OUString sSectionName(aFileUrl.GetLastName(
    1305           0 :                 INetURLObject::DECODE_UNAMBIGUOUS).getToken(0, sfx2::cTokenSeparator));
    1306           0 :             sal_uInt16 nSectCount = rSh.GetSectionFmtCount();
    1307           0 :             OUString sTempSectionName(sSectionName);
    1308           0 :             sal_uInt16 nAddNumber = 0;
    1309           0 :             sal_uInt16 nCount = 0;
    1310             :             // if applicable: add index if the range name is already in use.
    1311           0 :             while ( nCount < nSectCount )
    1312             :             {
    1313           0 :                 const SwSectionFmt& rFmt = rSh.GetSectionFmt(nCount);
    1314           0 :                 if ((rFmt.GetSection()->GetSectionName() == sTempSectionName)
    1315           0 :                     && rFmt.IsInNodesArr())
    1316             :                 {
    1317           0 :                     nCount = 0;
    1318           0 :                     nAddNumber++;
    1319           0 :                     sTempSectionName = sSectionName + ":" + OUString::number( nAddNumber );
    1320             :                 }
    1321             :                 else
    1322           0 :                     nCount++;
    1323             :             }
    1324             : 
    1325           0 :             if ( nAddNumber )
    1326           0 :                 sSectionName = sTempSectionName;
    1327             : 
    1328           0 :             SwSectionData aSectionData(CONTENT_SECTION, sSectionName);
    1329           0 :             aSectionData.SetProtectFlag(true);
    1330           0 :             aSectionData.SetHidden(false);
    1331             : 
    1332           0 :             aSectionData.SetLinkFileName(sFileName);
    1333           0 :             aSectionData.SetType(FILE_LINK_SECTION);
    1334           0 :             aSectionData.SetLinkFilePassword( sFilePassword );
    1335             : 
    1336           0 :             rSh.InsertGlobalDocContent( *pAnchorContent, aSectionData );
    1337           0 :         }
    1338           0 :         if ( bMove )
    1339             :         {
    1340           0 :             Update( sal_False );
    1341             :             rSh.MoveGlobalDocContent(
    1342           0 :                 *pSwGlblDocContents, nEntryCount, nEntryCount + nFiles, nEntryCount - nFiles );
    1343             :         }
    1344           0 :         rSh.EndAction();
    1345           0 :         Update( sal_False );
    1346           0 :         Display();
    1347             :     }
    1348           0 : }
    1349             : 
    1350           0 : IMPL_LINK( SwGlobalTree, DialogClosedHdl, sfx2::FileDialogHelper*, _pFileDlg )
    1351             : {
    1352           0 :     Application::SetDefDialogParent( pDefParentWin );
    1353           0 :     if ( ERRCODE_NONE == _pFileDlg->GetError() )
    1354             :     {
    1355           0 :         SfxMediumList* pMedList = pDocInserter->CreateMediumList();
    1356           0 :         if ( pMedList )
    1357             :         {
    1358           0 :             Sequence< OUString >aFileNames( pMedList->size() );
    1359           0 :             OUString* pFileNames = aFileNames.getArray();
    1360           0 :             sal_Int32 nPos = 0;
    1361           0 :             for ( size_t i = 0, n = pMedList->size(); i < n; ++i )
    1362             :             {
    1363           0 :                 SfxMedium* pMed = pMedList->at( i );
    1364           0 :                 OUString sFileName = pMed->GetURLObject().GetMainURL( INetURLObject::NO_DECODE );
    1365           0 :                 sFileName += OUString(sfx2::cTokenSeparator);
    1366           0 :                 sFileName += pMed->GetFilter()->GetFilterName();
    1367           0 :                 sFileName += OUString(sfx2::cTokenSeparator);
    1368           0 :                 pFileNames[nPos++] = sFileName;
    1369           0 :             }
    1370           0 :             delete pMedList;
    1371           0 :             InsertRegion( pDocContent, aFileNames );
    1372           0 :             DELETEZ( pDocContent );
    1373             :         }
    1374             :     }
    1375           0 :     return 0;
    1376           0 : }
    1377             : 
    1378             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10