LCOV - code coverage report
Current view: top level - sw/source/uibase/utlui - glbltree.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 35 741 4.7 %
Date: 2014-11-03 Functions: 6 53 11.3 %
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             : #include <boost/scoped_ptr.hpp>
      61             : 
      62             : using namespace ::com::sun::star::uno;
      63             : 
      64             : // Context menu for GlobalTree
      65             : #define CTX_INSERT_ANY_INDEX 10
      66             : #define CTX_INSERT_FILE     11
      67             : #define CTX_INSERT_NEW_FILE 12
      68             : #define CTX_INSERT_TEXT     13
      69             : 
      70             : #define CTX_UPDATE_SEL      20
      71             : #define CTX_UPDATE_INDEX    21
      72             : #define CTX_UPDATE_LINK     22
      73             : #define CTX_UPDATE_ALL      23
      74             : 
      75             : #define CTX_UPDATE          1
      76             : #define CTX_INSERT          2
      77             : #define CTX_EDIT            3
      78             : #define CTX_DELETE          4
      79             : #define CTX_EDIT_LINK       5
      80             : 
      81             : #define GLOBAL_UPDATE_TIMEOUT 2000
      82             : 
      83             : // Flags for PopupMenu-enable/disable
      84             : #define ENABLE_INSERT_IDX   0x0001
      85             : #define ENABLE_INSERT_FILE  0x0002
      86             : #define ENABLE_INSERT_TEXT  0x0004
      87             : #define ENABLE_EDIT         0x0008
      88             : #define ENABLE_DELETE       0x0010
      89             : #define ENABLE_UPDATE       0x0020
      90             : #define ENABLE_UPDATE_SEL   0x0040
      91             : #define ENABLE_EDIT_LINK    0x0080
      92             : 
      93             : // TabPos: push to left
      94             : #define  GLBL_TABPOS_SUB 5
      95             : 
      96             : const SfxObjectShell* SwGlobalTree::pShowShell = 0;
      97             : static const char* aHelpForMenu[] =
      98             : {
      99             :     0,
     100             :     HID_GLBLTREE_UPDATE,        //CTX_UPDATE
     101             :     HID_GLBLTREE_INSERT,        //CTX_INSERT
     102             :     HID_GLBLTREE_EDIT,          //CTX_EDIT
     103             :     HID_GLBLTREE_DEL,           //CTX_DELETE
     104             :     HID_GLBLTREE_EDIT_LINK,     //CTX_EDIT_LINK
     105             :     0,
     106             :     0,
     107             :     0,
     108             :     0,
     109             :     HID_GLBLTREE_INS_IDX,       //CTX_INSERT_ANY_INDEX
     110             :     HID_GLBLTREE_INS_FILE,      //CTX_INSERT_FILE
     111             :     HID_GLBLTREE_INS_NEW_FILE,  //CTX_INSERT_NEW_FILE
     112             :     HID_GLBLTREE_INS_TEXT,      //CTX_INSERT_TEXT
     113             :     0,
     114             :     0,
     115             :     0,
     116             :     0,
     117             :     0,
     118             :     0,
     119             :     HID_GLBLTREE_UPD_SEL,       //CTX_UPDATE_SEL
     120             :     HID_GLBLTREE_UPD_IDX,       //CTX_UPDATE_INDEX
     121             :     HID_GLBLTREE_UPD_LINK,      //CTX_UPDATE_LINK
     122             :     HID_GLBLTREEUPD_ALL         //CTX_UPDATE_ALL
     123             : };
     124             : 
     125           0 : class SwGlobalFrameListener_Impl : public SfxListener
     126             : {
     127             :     bool bValid;
     128             : public:
     129           0 :     SwGlobalFrameListener_Impl(SfxViewFrame& rFrame) :
     130           0 :         bValid(true)
     131             :         {
     132           0 :             StartListening(rFrame);
     133           0 :         }
     134             : 
     135             :     virtual void        Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) SAL_OVERRIDE;
     136             : 
     137           0 :     bool                IsValid() const {return bValid;}
     138             : };
     139             : 
     140           0 : void SwGlobalFrameListener_Impl::Notify( SfxBroadcaster& /*rBC*/, const SfxHint& rHint )
     141             : {
     142           0 :     const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>( &rHint );
     143           0 :     if( pSimpleHint && pSimpleHint->GetId() == SFX_HINT_DYING)
     144           0 :         bValid = false;
     145           0 : }
     146             : 
     147         120 : SwGlobalTree::SwGlobalTree(vcl::Window* pParent, const ResId& rResId) :
     148             : 
     149             :     SvTreeListBox(pParent, rResId),
     150             : 
     151             :     pActiveShell        ( NULL ),
     152             :     pEmphasisEntry      ( NULL ),
     153             :     pDDSource           ( NULL ),
     154             :     pSwGlblDocContents  ( NULL ),
     155             :     pDefParentWin       ( NULL ),
     156             :     pDocContent         ( NULL ),
     157             :     pDocInserter        ( NULL ),
     158             : 
     159             :     bIsInternalDrag         ( false ),
     160             :     bLastEntryEmphasis      ( false ),
     161         120 :     bIsImageListInitialized ( false )
     162             : 
     163             : {
     164             :     SetDragDropMode(SV_DRAGDROP_APP_COPY  |
     165             :                     SV_DRAGDROP_CTRL_MOVE |
     166         120 :                     SV_DRAGDROP_ENABLE_TOP );
     167             : 
     168         120 :     aUpdateTimer.SetTimeout(GLOBAL_UPDATE_TIMEOUT);
     169         120 :     aUpdateTimer.SetTimeoutHdl(LINK(this, SwGlobalTree, Timeout));
     170         120 :     aUpdateTimer.Start();
     171        1800 :     for(sal_uInt16 i = 0; i < GLOBAL_CONTEXT_COUNT; i++)
     172             :     {
     173        1680 :         aContextStrings[i] = SW_RESSTR(i+ ST_GLOBAL_CONTEXT_FIRST);
     174             :     }
     175         120 :     SetHelpId(HID_NAVIGATOR_GLOB_TREELIST);
     176         120 :     SelectHdl();
     177         120 :     SetDoubleClickHdl(LINK(this, SwGlobalTree, DoubleClickHdl));
     178         120 :     EnableContextMenuHandling();
     179         120 : }
     180             : 
     181         240 : SwGlobalTree::~SwGlobalTree()
     182             : {
     183         120 :     delete pSwGlblDocContents;
     184         120 :     delete pDocInserter;
     185         120 : }
     186             : 
     187           0 : sal_Int8 SwGlobalTree::ExecuteDrop( const ExecuteDropEvent& rEvt )
     188             : {
     189           0 :     sal_Int8 nRet = DND_ACTION_NONE;
     190           0 :     SvTreeListEntry* pLast = (SvTreeListEntry*)LastVisible();
     191           0 :     if(pEmphasisEntry)
     192             :     {
     193           0 :         ImplShowTargetEmphasis( Prev(pEmphasisEntry), false );
     194           0 :         pEmphasisEntry = 0;
     195             :     }
     196           0 :     else if(bLastEntryEmphasis && pLast)
     197             :     {
     198           0 :         ImplShowTargetEmphasis( pLast, false);
     199             :     }
     200             : 
     201           0 :     SvTreeListEntry* pDropEntry = bLastEntryEmphasis ? 0 : GetEntry(rEvt.maPosPixel);
     202           0 :     if( bIsInternalDrag )
     203             :     {
     204           0 :         SvTreeListEntry* pDummy = 0;
     205           0 :         sal_uLong nInsertionPos = TREELIST_APPEND;
     206           0 :         NotifyMoving( pDropEntry, pDDSource, pDummy, nInsertionPos );
     207             :     }
     208             :     else
     209             :     {
     210           0 :         TransferableDataHelper aData( rEvt.maDropEvent.Transferable );
     211             : 
     212           0 :         OUString sFileName;
     213             :         const SwGlblDocContent* pCnt = pDropEntry ?
     214             :                     (const SwGlblDocContent*)pDropEntry->GetUserData() :
     215           0 :                             0;
     216           0 :         if( aData.HasFormat( FORMAT_FILE_LIST ))
     217             :         {
     218           0 :             nRet = rEvt.mnAction;
     219           0 :             boost::scoped_ptr<SwGlblDocContents> pTempContents(new SwGlblDocContents);
     220             :             int nAbsContPos = pDropEntry ?
     221           0 :                                 (int) GetModel()->GetAbsPos(pDropEntry):
     222           0 :                                     - 1;
     223           0 :             sal_uLong nEntryCount = GetEntryCount();
     224             : 
     225             :             // Get data
     226           0 :             FileList aFileList;
     227           0 :             aData.GetFileList( FORMAT_FILE_LIST, aFileList );
     228           0 :             for ( size_t n = aFileList.Count(); n--; )
     229             :             {
     230           0 :                 sFileName = aFileList.GetFile(n);
     231           0 :                 InsertRegion(pCnt, &sFileName);
     232             :                 // The list of contents must be newly fetched after inserting,
     233             :                 // to not work on an old content.
     234           0 :                 if(n)
     235             :                 {
     236           0 :                     pActiveShell->GetGlobalDocContent(*pTempContents);
     237             :                     // If the file was successfully inserted,
     238             :                     // then the next content must also be fetched.
     239           0 :                     if(nEntryCount < pTempContents->size())
     240             :                     {
     241           0 :                         nEntryCount++;
     242           0 :                         nAbsContPos++;
     243           0 :                         pCnt = (*pTempContents)[ nAbsContPos ];
     244             :                     }
     245             :                 }
     246           0 :             }
     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 :         const 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 :     const sal_uInt16 nEnableFlags = GetEnableFlags();
     386           0 :     if(FN_GLOBAL_OPEN == nTbxId)
     387             :     {
     388           0 :         boost::scoped_ptr<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));
     400           0 :         pMenu.reset();
     401           0 :         pBox->EndSelection();
     402           0 :         pBox->Invalidate();
     403             :     }
     404           0 :     else if(FN_GLOBAL_UPDATE == nTbxId)
     405             :     {
     406           0 :         boost::scoped_ptr<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));
     415           0 :         pMenu.reset();
     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 (pEntry && ((SwGlblDocContent*)pEntry->GetUserData())->GetType() != GLBLDOC_UNKNOWN &&
     435           0 :                     (!pPrevEntry || ((SwGlblDocContent*)pPrevEntry->GetUserData())->GetType() != GLBLDOC_UNKNOWN))
     436           0 :             nRet |= ENABLE_INSERT_TEXT;
     437           0 :         if (pEntry && 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(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         120 : void     SwGlobalTree::SelectHdl()
     500             : {
     501             : 
     502         120 :     sal_uLong nSelCount = GetSelectionCount();
     503         120 :     SvTreeListEntry* pSel = FirstSelected();
     504         120 :     sal_uLong nAbsPos = pSel ? GetModel()->GetAbsPos(pSel) : 0;
     505         120 :     SwNavigationPI* pNavi = GetParentWindow();
     506         120 :     bool bReadonly = !pActiveShell ||
     507         120 :                 pActiveShell->GetView().GetDocShell()->IsReadOnly();
     508         120 :     pNavi->aGlobalToolBox.EnableItem(FN_GLOBAL_EDIT,  nSelCount == 1 && !bReadonly);
     509         120 :     pNavi->aGlobalToolBox.EnableItem(FN_GLOBAL_OPEN,  nSelCount <= 1 && !bReadonly);
     510         120 :     pNavi->aGlobalToolBox.EnableItem(FN_GLOBAL_UPDATE,  GetEntryCount() > 0 && !bReadonly);
     511             :     pNavi->aGlobalToolBox.EnableItem(FN_ITEM_UP,
     512         120 :                     nSelCount == 1 && nAbsPos && !bReadonly);
     513             :     pNavi->aGlobalToolBox.EnableItem(FN_ITEM_DOWN,
     514         120 :                     nSelCount == 1 && nAbsPos < GetEntryCount() - 1 && !bReadonly);
     515             : 
     516         120 : }
     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( 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( false ))
     596           0 :         Display();
     597           0 :     SvTreeListBox::GetFocus();
     598           0 : }
     599             : 
     600           0 : void     SwGlobalTree::KeyInput(const KeyEvent& rKEvt)
     601             : {
     602           0 :     const vcl::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 && pEntry; i++)
     635             :         {
     636           0 :             SwGlblDocContent* pCont = (*pSwGlblDocContents)[i];
     637           0 :             pEntry->SetUserData(pCont);
     638           0 :             pEntry = Next(pEntry);
     639             :             assert(pEntry || i == nCount - 1);
     640             :         }
     641             :     }
     642             :     else
     643             :     {
     644           0 :         SetUpdateMode( false );
     645           0 :         SvTreeListEntry* pOldSelEntry = FirstSelected();
     646           0 :         OUString sEntryName;  // Name of the entry
     647           0 :         sal_uLong nSelPos = TREELIST_ENTRY_NOTFOUND;
     648           0 :         if(pOldSelEntry)
     649             :         {
     650           0 :             sEntryName = GetEntryText(pOldSelEntry);
     651           0 :             nSelPos = GetModel()->GetAbsPos(pOldSelEntry);
     652             :         }
     653           0 :         Clear();
     654           0 :         if(!pSwGlblDocContents)
     655           0 :             Update( false );
     656             : 
     657           0 :         SvTreeListEntry* pSelEntry = 0;
     658           0 :         for( size_t i = 0; i < nCount; i++)
     659             :         {
     660           0 :             SwGlblDocContent* pCont = (*pSwGlblDocContents)[i];
     661           0 :             OUString sEntry;
     662           0 :             Image aImage;
     663           0 :             switch( pCont->GetType()  )
     664             :             {
     665             :                 case GLBLDOC_UNKNOWN:
     666             :                 {
     667           0 :                     sEntry = aContextStrings[ST_TEXT   - ST_GLOBAL_CONTEXT_FIRST];
     668             :                 }
     669           0 :                 break;
     670             :                 case GLBLDOC_TOXBASE:
     671             :                 {
     672           0 :                     const SwTOXBase* pBase = pCont->GetTOX();
     673           0 :                     sEntry = pBase->GetTitle();
     674           0 :                     aImage = aEntryImages.GetImage(SID_SW_START + CONTENT_TYPE_INDEX);
     675             :                 }
     676           0 :                 break;
     677             :                 case GLBLDOC_SECTION:
     678             :                 {
     679           0 :                     const SwSection* pSect = pCont->GetSection();
     680           0 :                     sEntry = pSect->GetSectionName();
     681           0 :                     aImage = aEntryImages.GetImage(SID_SW_START + CONTENT_TYPE_REGION);
     682             :                 }
     683           0 :                 break;
     684             :             }
     685             :             SvTreeListEntry* pEntry = InsertEntry(sEntry, aImage, aImage,
     686           0 :                         0, false, TREELIST_APPEND, pCont);
     687           0 :             if(sEntry == sEntryName)
     688             :             {
     689           0 :                 pSelEntry = pEntry;
     690             :             }
     691           0 :         }
     692           0 :         if(pSelEntry)
     693             :         {
     694           0 :             Select(pSelEntry);
     695             :         }
     696           0 :         else if(nSelPos != TREELIST_ENTRY_NOTFOUND && nSelPos < nCount)
     697             :         {
     698           0 :             Select(GetEntry(nSelPos));
     699             :         }
     700           0 :         else if(nCount)
     701           0 :             Select(First());
     702             :         else
     703           0 :             SelectHdl();
     704           0 :         SetUpdateMode( true );
     705             :     }
     706           0 : }
     707             : 
     708           0 : void SwGlobalTree::InsertRegion( const SwGlblDocContent* pCont, const OUString* pFileName )
     709             : {
     710           0 :     Sequence< OUString > aFileNames;
     711           0 :     if ( !pFileName )
     712             :     {
     713           0 :         pDefParentWin = Application::GetDefDialogParent();
     714           0 :         Application::SetDefDialogParent( this );
     715           0 :         delete pDocInserter;
     716             :         pDocInserter = new ::sfx2::DocumentInserter(
     717           0 :                 OUString("swriter"), true );
     718           0 :         pDocInserter->StartExecuteModal( LINK( this, SwGlobalTree, DialogClosedHdl ) );
     719             :     }
     720           0 :     else if ( !pFileName->isEmpty() )
     721             :     {
     722           0 :         aFileNames.realloc(1);
     723           0 :         INetURLObject aFileName;
     724           0 :         aFileName.SetSmartURL( *pFileName );
     725           0 :         aFileNames.getArray()[0] = aFileName.GetMainURL( INetURLObject::NO_DECODE );
     726           0 :         InsertRegion( pCont, aFileNames );
     727           0 :     }
     728           0 : }
     729             : 
     730           0 : void    SwGlobalTree::EditContent(const SwGlblDocContent* pCont )
     731             : {
     732           0 :     sal_uInt16 nSlot = 0;
     733           0 :     switch( pCont->GetType() )
     734             :     {
     735             :         case GLBLDOC_UNKNOWN:
     736           0 :             pActiveShell->GetView().GetEditWin().GrabFocus();
     737           0 :         break;
     738             :         case GLBLDOC_TOXBASE:
     739             :         {
     740           0 :             const SwTOXBase* pBase = pCont->GetTOX();
     741           0 :             if(pBase)
     742           0 :                 nSlot = FN_INSERT_MULTI_TOX;
     743             :         }
     744           0 :         break;
     745             :         case GLBLDOC_SECTION:
     746             :         {
     747           0 :             OpenDoc(pCont);
     748             : 
     749           0 :             nSlot = 0;
     750           0 :             pCont = 0;
     751             :         }
     752           0 :         break;
     753             :     }
     754           0 :     if(pCont)
     755           0 :         GotoContent(pCont);
     756           0 :     if(nSlot)
     757             :     {
     758           0 :         pActiveShell->GetView().GetViewFrame()->GetDispatcher()->Execute(nSlot);
     759           0 :         if(Update( false ))
     760           0 :             Display();
     761             :     }
     762           0 : }
     763             : 
     764           0 : IMPL_LINK( SwGlobalTree, PopupHdl, Menu* , pMenu)
     765             : {
     766           0 :     ExcecuteContextMenuAction( pMenu->GetCurItemId());
     767           0 :     return sal_True;
     768             : }
     769             : 
     770           0 : void    SwGlobalTree::ExcecuteContextMenuAction( sal_uInt16 nSelectedPopupEntry )
     771             : {
     772           0 :     SvTreeListEntry* pEntry = FirstSelected();
     773           0 :     SwGlblDocContent* pCont = pEntry ? (SwGlblDocContent*)pEntry->GetUserData() : 0;
     774             :     // If a RequestHelp is called during the dialogue,
     775             :     // then the content gets lost. Because of that a copy
     776             :     // is created in which only the DocPos is set correctly.
     777           0 :     SwGlblDocContent* pContCopy = 0;
     778           0 :     if(pCont)
     779           0 :         pContCopy = new SwGlblDocContent(pCont->GetDocPos());
     780           0 :     SfxDispatcher& rDispatch = *pActiveShell->GetView().GetViewFrame()->GetDispatcher();
     781           0 :     sal_uInt16 nSlot = 0;
     782           0 :     bool bDeleteContentCopy = true;
     783           0 :     switch( nSelectedPopupEntry )
     784             :     {
     785             :         case CTX_UPDATE_SEL:
     786             :         {
     787             :             // Two passes: first update the areas, then the directories.
     788           0 :             SvTreeListEntry* pSelEntry = FirstSelected();
     789           0 :             while( pSelEntry )
     790             :             {
     791           0 :                 SwGlblDocContent* pContent = (SwGlblDocContent*)pSelEntry->GetUserData();
     792           0 :                 if(GLBLDOC_SECTION == pContent->GetType() &&
     793           0 :                     pContent->GetSection()->IsConnected())
     794             :                 {
     795           0 :                     ((SwSection*)pContent->GetSection())->UpdateNow();
     796             :                 }
     797             : 
     798           0 :                 pSelEntry = NextSelected(pSelEntry);
     799             :             }
     800           0 :             pSelEntry = FirstSelected();
     801           0 :             while( pSelEntry )
     802             :             {
     803           0 :                 SwGlblDocContent* pContent = (SwGlblDocContent*)pSelEntry->GetUserData();
     804           0 :                 if(GLBLDOC_TOXBASE == pContent->GetType())
     805           0 :                     pActiveShell->UpdateTableOf(*pContent->GetTOX());
     806           0 :                 pSelEntry = NextSelected(pSelEntry);
     807             :             }
     808             : 
     809             :         }
     810           0 :         break;
     811             :         case CTX_UPDATE_INDEX:
     812             :         {
     813           0 :             nSlot = FN_UPDATE_TOX;
     814             :         }
     815           0 :         break;
     816             :         case CTX_UPDATE_LINK:
     817             :         case CTX_UPDATE_ALL:
     818             :         {
     819           0 :             pActiveShell->GetLinkManager().UpdateAllLinks(true);
     820           0 :             if(CTX_UPDATE_ALL == nSelectedPopupEntry)
     821           0 :                 nSlot = FN_UPDATE_TOX;
     822           0 :             pCont = 0;
     823             :         }
     824           0 :         break;
     825             :         case CTX_EDIT:
     826             :         {
     827             :             OSL_ENSURE(pCont, "edit without entry ? " );
     828           0 :             if (pCont)
     829             :             {
     830           0 :                 EditContent(pCont);
     831             :             }
     832             :         }
     833           0 :         break;
     834             :         case CTX_EDIT_LINK:
     835             :         {
     836             :             OSL_ENSURE(pCont, "edit without entry ? " );
     837           0 :             if (pCont)
     838             :             {
     839             :                 SfxStringItem aName(FN_EDIT_REGION,
     840           0 :                         pCont->GetSection()->GetSectionName());
     841           0 :                 rDispatch.Execute(FN_EDIT_REGION, SfxCallMode::ASYNCHRON, &aName, 0L);
     842             :             }
     843             :         }
     844           0 :         break;
     845             :         case CTX_DELETE:
     846             :         {
     847             :             // If several entries selected, then after each delete the array
     848             :             // must be refilled. So you do not have to remember anything,
     849             :             // deleting begins at the end.
     850           0 :             SvTreeListEntry* pSelEntry = LastSelected();
     851           0 :             boost::scoped_ptr<SwGlblDocContents> pTempContents;
     852           0 :             pActiveShell->StartAction();
     853           0 :             while(pSelEntry)
     854             :             {
     855             :                 pActiveShell->DeleteGlobalDocContent(
     856           0 :                     pTempContents ? *pTempContents : *pSwGlblDocContents,
     857           0 :                                      GetModel()->GetAbsPos(pSelEntry));
     858           0 :                 pSelEntry = PrevSelected(pSelEntry);
     859           0 :                 if(pSelEntry)
     860             :                 {
     861           0 :                     pTempContents.reset(new SwGlblDocContents);
     862           0 :                     pActiveShell->GetGlobalDocContent(*pTempContents);
     863             :                 }
     864             :             }
     865           0 :             pTempContents.reset();
     866           0 :             pActiveShell->EndAction();
     867           0 :             pCont = 0;
     868             :         }
     869           0 :         break;
     870             :         case CTX_INSERT_ANY_INDEX:
     871             :         {
     872           0 :             if(pContCopy)
     873             :             {
     874           0 :                 SfxItemSet aSet(pActiveShell->GetView().GetPool(),
     875             :                             RES_COL, RES_COL,
     876             :                             RES_BACKGROUND, RES_BACKGROUND,
     877             :                             RES_FRM_SIZE, RES_FRM_SIZE,
     878             :                             SID_ATTR_PAGE_SIZE, SID_ATTR_PAGE_SIZE,
     879             :                             RES_LR_SPACE, RES_LR_SPACE,
     880             :                             FN_PARAM_TOX_TYPE, FN_PARAM_TOX_TYPE,
     881           0 :                             0);
     882             : 
     883           0 :                 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
     884             :                 assert(pFact && "Dialog creation failed!");
     885             :                 boost::scoped_ptr<AbstractMultiTOXTabDialog> pDlg(pFact->CreateMultiTOXTabDialog(
     886             :                                                         this, aSet,
     887             :                                                         *pActiveShell,
     888             :                                                         0,
     889             :                                                         USHRT_MAX,
     890           0 :                                                         true));
     891             :                 assert(pDlg && "Dialog creation failed!");
     892           0 :                 if(RET_OK == pDlg->Execute())
     893             :                 {
     894           0 :                     SwTOXDescription&  rDesc = pDlg->GetTOXDescription(
     895           0 :                                                 pDlg->GetCurrentTOXType());
     896           0 :                     SwTOXMgr aMgr(pActiveShell);
     897           0 :                     SwTOXBase* pToInsert = 0;
     898           0 :                     if(aMgr.UpdateOrInsertTOX(rDesc, &pToInsert, pDlg->GetOutputItemSet()))
     899           0 :                         pActiveShell->InsertGlobalDocContent( *pContCopy, *pToInsert );
     900             :                 }
     901           0 :                 pCont = 0;
     902             :             }
     903             :         }
     904           0 :         break;
     905             :         case CTX_INSERT_FILE:
     906             :         {
     907           0 :             bDeleteContentCopy = false;
     908           0 :             pDocContent = pContCopy;
     909           0 :             InsertRegion( pContCopy );
     910           0 :             pCont = NULL;
     911             :         }
     912           0 :         break;
     913             :         case CTX_INSERT_NEW_FILE:
     914             :         {
     915           0 :             SfxViewFrame* pGlobFrm = pActiveShell->GetView().GetViewFrame();
     916           0 :             SwGlobalFrameListener_Impl aFrmListener(*pGlobFrm);
     917             : 
     918           0 :             sal_uLong nEntryPos = pEntry ? GetModel()->GetAbsPos(pEntry) : (sal_uLong)-1;
     919             :             // Creating a new doc
     920             :             SfxStringItem aFactory(SID_NEWDOCDIRECT,
     921           0 :                             SwDocShell::Factory().GetFilterContainer()->GetName());
     922             : 
     923             :              const SfxFrameItem* pItem = (SfxFrameItem*)
     924             :                             rDispatch.Execute(SID_NEWDOCDIRECT,
     925           0 :                                 SfxCallMode::SYNCHRON, &aFactory, 0L);
     926             : 
     927             :             // save at
     928           0 :             SfxFrame* pFrm = pItem ? pItem->GetFrame() : 0;
     929           0 :             SfxViewFrame* pFrame = pFrm ? pFrm->GetCurrentViewFrame() : 0;
     930           0 :             if( pFrame )
     931             :             {
     932             :                 const SfxBoolItem* pBool = (const SfxBoolItem*)
     933             :                         pFrame->GetDispatcher()->Execute(
     934           0 :                                 SID_SAVEASDOC, SfxCallMode::SYNCHRON );
     935           0 :                 SfxObjectShell& rObj = *pFrame->GetObjectShell();
     936           0 :                 const SfxMedium* pMedium = rObj.GetMedium();
     937           0 :                 OUString sNewFile(pMedium->GetURLObject().GetMainURL(INetURLObject::DECODE_TO_IURI));
     938             :                 // Insert the area with the Doc-Name
     939             :                 // Bring the own Doc in the foreground
     940           0 :                 if(aFrmListener.IsValid() && !sNewFile.isEmpty())
     941             :                 {
     942           0 :                     pGlobFrm->ToTop();
     943             :                     // Due to the update the entries are invalid
     944           0 :                     if(nEntryPos != (sal_uLong)-1)
     945             :                     {
     946           0 :                         Update( 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 :                                                 SfxCallMode::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(); // Empty document
     981           0 :                 pActiveShell->Up( 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             :         // here nothing happens
     991             :     }
     992           0 :     if(pCont)
     993           0 :         GotoContent(pCont);
     994           0 :     if(nSlot)
     995           0 :         rDispatch.Execute(nSlot);
     996           0 :     if(Update( false ))
     997           0 :         Display();
     998           0 :     if ( bDeleteContentCopy )
     999           0 :         delete pContCopy;
    1000             : }
    1001             : 
    1002           0 : IMPL_LINK_NOARG(SwGlobalTree, Timeout)
    1003             : {
    1004           0 :     if(!HasFocus() && Update( false ))
    1005           0 :         Display();
    1006           0 :     return 0;
    1007             : }
    1008             : 
    1009           0 : void SwGlobalTree::GotoContent(const SwGlblDocContent* pCont)
    1010             : {
    1011           0 :     pActiveShell->EnterStdMode();
    1012             : 
    1013           0 :     switch( pCont->GetType()  )
    1014             :     {
    1015             :         case GLBLDOC_UNKNOWN:
    1016           0 :             pActiveShell->GotoGlobalDocContent(*pCont);
    1017           0 :         break;
    1018             :         case GLBLDOC_TOXBASE:
    1019             :         {
    1020           0 :             const OUString sName = pCont->GetTOX()->GetTOXName();
    1021           0 :             if (!pActiveShell->GotoNextTOXBase(&sName))
    1022           0 :                 pActiveShell->GotoPrevTOXBase(&sName);
    1023             :         }
    1024           0 :         break;
    1025             :         case GLBLDOC_SECTION:
    1026           0 :         break;
    1027             :     }
    1028             : 
    1029           0 : }
    1030             : 
    1031           0 : void    SwGlobalTree::ShowTree()
    1032             : {
    1033           0 :     aUpdateTimer.Start();
    1034           0 :     SvTreeListBox::Show();
    1035           0 : }
    1036             : 
    1037          62 : void    SwGlobalTree::HideTree()
    1038             : {
    1039          62 :     aUpdateTimer.Stop();
    1040          62 :     SvTreeListBox::Hide();
    1041          62 : }
    1042             : 
    1043           0 : void    SwGlobalTree::ExecCommand(sal_uInt16 nCmd)
    1044             : {
    1045           0 :     SvTreeListEntry* pEntry = FirstSelected();
    1046             :     OSL_ENSURE(pEntry, "It explodes in the next moment");
    1047           0 :     if(FN_GLOBAL_EDIT == nCmd)
    1048             :     {
    1049             :         const SwGlblDocContent* pCont = (const SwGlblDocContent*)
    1050           0 :                                                 pEntry->GetUserData();
    1051           0 :         EditContent(pCont);
    1052             :     }
    1053             :     else
    1054             :     {
    1055           0 :         if(GetSelectionCount() == 1)
    1056             :         {
    1057           0 :             bool bMove = false;
    1058           0 :             sal_uLong nSource = GetModel()->GetAbsPos(pEntry);
    1059           0 :             sal_uLong nDest = nSource;
    1060           0 :             switch(nCmd)
    1061             :             {
    1062             :                 case FN_ITEM_DOWN:
    1063             :                 {
    1064           0 :                     sal_uLong nEntryCount = GetEntryCount();
    1065           0 :                     bMove = nEntryCount > nSource + 1;
    1066           0 :                     nDest+= 2;
    1067             :                 }
    1068           0 :                 break;
    1069             :                 case FN_ITEM_UP:
    1070             :                 {
    1071           0 :                     if(nSource)
    1072           0 :                         bMove = 0 != nSource;
    1073           0 :                     nDest--;
    1074             :                 }
    1075           0 :                 break;
    1076             :             }
    1077           0 :             if( bMove && pActiveShell->MoveGlobalDocContent(
    1078           0 :                 *pSwGlblDocContents, nSource, nSource + 1, nDest ) &&
    1079           0 :                     Update( false ))
    1080           0 :                 Display();
    1081             :         }
    1082             :     }
    1083           0 : }
    1084             : 
    1085           0 : bool    SwGlobalTree::Update(bool bHard)
    1086             : {
    1087           0 :     SwView* pActView = GetParentWindow()->GetCreateView();
    1088           0 :     bool bRet = false;
    1089           0 :     if(pActView && pActView->GetWrtShellPtr())
    1090             :     {
    1091           0 :         const SwWrtShell* pOldShell = pActiveShell;
    1092           0 :         pActiveShell = pActView->GetWrtShellPtr();
    1093           0 :         if(pActiveShell != pOldShell)
    1094             :         {
    1095           0 :             delete pSwGlblDocContents;
    1096           0 :             pSwGlblDocContents = 0;
    1097             :         }
    1098           0 :         if(!pSwGlblDocContents)
    1099             :         {
    1100           0 :             pSwGlblDocContents = new SwGlblDocContents;
    1101           0 :             bRet = true;
    1102           0 :             pActiveShell->GetGlobalDocContent(*pSwGlblDocContents);
    1103             :         }
    1104             :         else
    1105             :         {
    1106           0 :             bool bCopy = false;
    1107           0 :             boost::scoped_ptr<SwGlblDocContents> pTempContents(new SwGlblDocContents);
    1108           0 :             pActiveShell->GetGlobalDocContent(*pTempContents);
    1109           0 :             if(pTempContents->size() != pSwGlblDocContents->size() ||
    1110           0 :                     pTempContents->size() != GetEntryCount())
    1111             :             {
    1112           0 :                 bRet = true;
    1113           0 :                 bCopy = true;
    1114             :             }
    1115             :             else
    1116             :             {
    1117           0 :                 for(size_t i = 0; i < pTempContents->size() && !bCopy; i++)
    1118             :                 {
    1119           0 :                     SwGlblDocContent* pLeft = (*pTempContents)[i];
    1120           0 :                     SwGlblDocContent* pRight = (*pSwGlblDocContents)[i];
    1121           0 :                     GlobalDocContentType eType = pLeft->GetType();
    1122           0 :                     SvTreeListEntry* pEntry = GetEntry(i);
    1123           0 :                     OUString sTemp = GetEntryText(pEntry);
    1124           0 :                     if (
    1125           0 :                          eType != pRight->GetType() ||
    1126             :                          (
    1127           0 :                            eType == GLBLDOC_SECTION &&
    1128           0 :                            pLeft->GetSection()->GetSectionName() != sTemp
    1129           0 :                          ) ||
    1130             :                          (
    1131           0 :                            eType == GLBLDOC_TOXBASE &&
    1132           0 :                            pLeft->GetTOX()->GetTitle() != sTemp
    1133             :                          )
    1134             :                        )
    1135             :                     {
    1136           0 :                         bCopy = bRet = true;
    1137             :                     }
    1138           0 :                 }
    1139             :             }
    1140           0 :             if(bCopy || bHard)
    1141             :             {
    1142           0 :                 pSwGlblDocContents->DeleteAndDestroyAll();
    1143           0 :                 pSwGlblDocContents->insert( *pTempContents );
    1144           0 :                 pTempContents->clear();
    1145             : 
    1146           0 :             }
    1147             :         }
    1148             : 
    1149             :     }
    1150             :     else
    1151             :     {
    1152           0 :         Clear();
    1153           0 :         if(pSwGlblDocContents)
    1154           0 :             pSwGlblDocContents->DeleteAndDestroyAll();
    1155             :     }
    1156             :     // FIXME: Implement a test for changes!
    1157           0 :     return bRet;
    1158             : }
    1159             : 
    1160           0 : void SwGlobalTree::OpenDoc(const SwGlblDocContent* pCont)
    1161             : {
    1162             :     const OUString sFileName(pCont->GetSection()->GetLinkFileName().getToken(0,
    1163           0 :             sfx2::cTokenSeparator));
    1164           0 :     bool bFound = false;
    1165           0 :     const SfxObjectShell* pCurr = SfxObjectShell::GetFirst();
    1166           0 :     while( !bFound && pCurr )
    1167             :     {
    1168           0 :         if(pCurr->GetMedium() &&
    1169           0 :            pCurr->GetMedium()->GetURLObject().GetMainURL(INetURLObject::DECODE_TO_IURI) == sFileName)
    1170             :         {
    1171           0 :             bFound = true;
    1172           0 :             SwGlobalTree::SetShowShell(pCurr);
    1173             :             Application::PostUserEvent( STATIC_LINK(
    1174           0 :                         this, SwGlobalTree, ShowFrameHdl ) );
    1175           0 :             pCurr = 0;
    1176             :         }
    1177             :         else
    1178           0 :             pCurr = SfxObjectShell::GetNext(*pCurr);
    1179             :     }
    1180           0 :     if(!bFound)
    1181             :     {
    1182           0 :         SfxStringItem aURL(SID_FILE_NAME, sFileName);
    1183           0 :         SfxBoolItem aReadOnly(SID_DOC_READONLY, false);
    1184           0 :         SfxStringItem aTargetFrameName( SID_TARGETNAME, "_blank" );
    1185           0 :         SfxStringItem aReferer(SID_REFERER, pActiveShell->GetView().GetDocShell()->GetTitle());
    1186           0 :         pActiveShell->GetView().GetViewFrame()->GetDispatcher()->
    1187             :                 Execute(SID_OPENDOC, SfxCallMode::ASYNCHRON,
    1188           0 :                             &aURL, &aReadOnly, &aReferer, &aTargetFrameName, 0L);
    1189           0 :     }
    1190           0 : }
    1191             : 
    1192           0 : IMPL_LINK_NOARG( SwGlobalTree, DoubleClickHdl)
    1193             : {
    1194           0 :     SvTreeListEntry* pEntry = GetCurEntry();
    1195           0 :     SwGlblDocContent* pCont = (SwGlblDocContent*)pEntry->GetUserData();
    1196           0 :     if(pCont->GetType() == GLBLDOC_SECTION)
    1197           0 :         OpenDoc(pCont);
    1198             :     else
    1199             :     {
    1200           0 :         GotoContent(pCont);
    1201           0 :         pActiveShell->GetView().GetEditWin().GrabFocus();
    1202             :     }
    1203           0 :     return 0;
    1204             : }
    1205             : 
    1206           0 : IMPL_STATIC_LINK_NOINSTANCE(SwGlobalTree, ShowFrameHdl, SwGlobalTree*, EMPTYARG)
    1207             : {
    1208           0 :     const SfxObjectShell* pShell = SwGlobalTree::GetShowShell();
    1209           0 :     SfxViewFrame* pFirst = pShell ? SfxViewFrame::GetFirst(pShell) : NULL;
    1210           0 :     if (pFirst)
    1211           0 :         pFirst->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 :     const size_t 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 :         vcl::Font aOldFont( rDev.GetFont());
    1236           0 :         vcl::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(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( false );
    1341             :             rSh.MoveGlobalDocContent(
    1342           0 :                 *pSwGlblDocContents, nEntryCount, nEntryCount + nFiles, nEntryCount - nFiles );
    1343             :         }
    1344           0 :         rSh.EndAction();
    1345           0 :         Update( 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 :         boost::scoped_ptr<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 :             pMedList.reset();
    1371           0 :             InsertRegion( pDocContent, aFileNames );
    1372           0 :             DELETEZ( pDocContent );
    1373           0 :         }
    1374             :     }
    1375           0 :     return 0;
    1376         270 : }
    1377             : 
    1378             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10