LCOV - code coverage report
Current view: top level - sw/source/uibase/utlui - glbltree.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 48 755 6.4 %
Date: 2015-06-13 12:38:46 Functions: 9 55 16.4 %
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 :     explicit 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           8 : 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           8 :     bIsImageListInitialized ( false )
     162             : 
     163             : {
     164             :     SetDragDropMode(DragDropMode::APP_COPY  |
     165          16 :                     DragDropMode::CTRL_MOVE |
     166          16 :                     DragDropMode::ENABLE_TOP );
     167             : 
     168           8 :     aUpdateTimer.SetTimeout(GLOBAL_UPDATE_TIMEOUT);
     169           8 :     aUpdateTimer.SetTimeoutHdl(LINK(this, SwGlobalTree, Timeout));
     170           8 :     aUpdateTimer.Start();
     171         120 :     for(sal_uInt16 i = 0; i < GLOBAL_CONTEXT_COUNT; i++)
     172             :     {
     173         112 :         aContextStrings[i] = SW_RESSTR(i+ ST_GLOBAL_CONTEXT_FIRST);
     174             :     }
     175           8 :     SetHelpId(HID_NAVIGATOR_GLOB_TREELIST);
     176           8 :     SelectHdl();
     177           8 :     SetDoubleClickHdl(LINK(this, SwGlobalTree, DoubleClickHdl));
     178           8 :     EnableContextMenuHandling();
     179           8 : }
     180             : 
     181          24 : SwGlobalTree::~SwGlobalTree()
     182             : {
     183           8 :     disposeOnce();
     184          16 : }
     185             : 
     186           8 : void SwGlobalTree::dispose()
     187             : {
     188           8 :     delete pSwGlblDocContents;
     189           8 :     pSwGlblDocContents = NULL;
     190           8 :     delete pDocInserter;
     191           8 :     pDocInserter = NULL;
     192           8 :     pDefParentWin.clear();
     193           8 :     aUpdateTimer.Stop();
     194           8 :     SvTreeListBox::dispose();
     195           8 : }
     196             : 
     197           0 : sal_Int8 SwGlobalTree::ExecuteDrop( const ExecuteDropEvent& rEvt )
     198             : {
     199           0 :     sal_Int8 nRet = DND_ACTION_NONE;
     200           0 :     SvTreeListEntry* pLast = LastVisible();
     201           0 :     if(pEmphasisEntry)
     202             :     {
     203           0 :         ImplShowTargetEmphasis( Prev(pEmphasisEntry), false );
     204           0 :         pEmphasisEntry = 0;
     205             :     }
     206           0 :     else if(bLastEntryEmphasis && pLast)
     207             :     {
     208           0 :         ImplShowTargetEmphasis( pLast, false);
     209             :     }
     210             : 
     211           0 :     SvTreeListEntry* pDropEntry = bLastEntryEmphasis ? 0 : GetEntry(rEvt.maPosPixel);
     212           0 :     if( bIsInternalDrag )
     213             :     {
     214           0 :         SvTreeListEntry* pDummy = 0;
     215           0 :         sal_uLong nInsertionPos = TREELIST_APPEND;
     216           0 :         NotifyMoving( pDropEntry, pDDSource, pDummy, nInsertionPos );
     217             :     }
     218             :     else
     219             :     {
     220           0 :         TransferableDataHelper aData( rEvt.maDropEvent.Transferable );
     221             : 
     222           0 :         OUString sFileName;
     223             :         const SwGlblDocContent* pCnt = pDropEntry ?
     224             :                     static_cast<const SwGlblDocContent*>(pDropEntry->GetUserData()) :
     225           0 :                             0;
     226           0 :         if( aData.HasFormat( SotClipboardFormatId::FILE_LIST ))
     227             :         {
     228           0 :             nRet = rEvt.mnAction;
     229           0 :             boost::scoped_ptr<SwGlblDocContents> pTempContents(new SwGlblDocContents);
     230             :             int nAbsContPos = pDropEntry ?
     231           0 :                                 (int) GetModel()->GetAbsPos(pDropEntry):
     232           0 :                                     - 1;
     233           0 :             sal_uLong nEntryCount = GetEntryCount();
     234             : 
     235             :             // Get data
     236           0 :             FileList aFileList;
     237           0 :             aData.GetFileList( SotClipboardFormatId::FILE_LIST, aFileList );
     238           0 :             for ( size_t n = aFileList.Count(); n--; )
     239             :             {
     240           0 :                 sFileName = aFileList.GetFile(n);
     241           0 :                 InsertRegion(pCnt, &sFileName);
     242             :                 // The list of contents must be newly fetched after inserting,
     243             :                 // to not work on an old content.
     244           0 :                 if(n)
     245             :                 {
     246           0 :                     pActiveShell->GetGlobalDocContent(*pTempContents);
     247             :                     // If the file was successfully inserted,
     248             :                     // then the next content must also be fetched.
     249           0 :                     if(nEntryCount < pTempContents->size())
     250             :                     {
     251           0 :                         nEntryCount++;
     252           0 :                         nAbsContPos++;
     253           0 :                         pCnt = (*pTempContents)[ nAbsContPos ];
     254             :                     }
     255             :                 }
     256           0 :             }
     257             :         }
     258           0 :         else if( !(sFileName =
     259           0 :                         SwNavigationPI::CreateDropFileName( aData )).isEmpty())
     260             :         {
     261           0 :             INetURLObject aTemp(sFileName);
     262           0 :             GraphicDescriptor aDesc(aTemp);
     263           0 :             if( !aDesc.Detect() )   // accept no graphics
     264             :             {
     265           0 :                 nRet = rEvt.mnAction;
     266           0 :                 InsertRegion(pCnt, &sFileName);
     267           0 :             }
     268           0 :         }
     269             :     }
     270           0 :     bLastEntryEmphasis = false;
     271           0 :     return nRet;
     272             : 
     273             : }
     274             : 
     275           0 : sal_Int8 SwGlobalTree::AcceptDrop( const AcceptDropEvent& rEvt )
     276             : {
     277           0 :     sal_Int8 nRet = rEvt.mnAction;
     278             : 
     279             :     //initiate scrolling
     280           0 :     GetDropTarget( rEvt.maPosPixel );
     281           0 :     SvTreeListEntry* pLast = LastVisible();
     282           0 :     if( rEvt.mbLeaving )
     283             :     {
     284           0 :         if( pEmphasisEntry )
     285             :         {
     286           0 :             ImplShowTargetEmphasis( Prev(pEmphasisEntry), false );
     287           0 :             pEmphasisEntry = 0;
     288             :         }
     289           0 :         else if(bLastEntryEmphasis && pLast)
     290             :         {
     291           0 :             ImplShowTargetEmphasis( pLast, false);
     292             :         }
     293           0 :         bLastEntryEmphasis = false;
     294             :     }
     295             :     else
     296             :     {
     297           0 :         SvTreeListEntry* pDropEntry = GetEntry( rEvt.maPosPixel );
     298           0 :         if(bIsInternalDrag)
     299             :         {
     300           0 :             if( pDDSource != pDropEntry )
     301           0 :                 nRet = rEvt.mnAction;
     302             :         }
     303           0 :         else if( IsDropFormatSupported( SotClipboardFormatId::SIMPLE_FILE ) ||
     304           0 :                   IsDropFormatSupported( SotClipboardFormatId::STRING ) ||
     305           0 :                   IsDropFormatSupported( SotClipboardFormatId::FILE_LIST ) ||
     306           0 :                   IsDropFormatSupported( SotClipboardFormatId::SOLK ) ||
     307           0 :                    IsDropFormatSupported( SotClipboardFormatId::NETSCAPE_BOOKMARK )||
     308           0 :                    IsDropFormatSupported( SotClipboardFormatId::FILECONTENT ) ||
     309           0 :                    IsDropFormatSupported( SotClipboardFormatId::FILEGRPDESCRIPTOR ) ||
     310           0 :                    IsDropFormatSupported( SotClipboardFormatId::UNIFORMRESOURCELOCATOR ) ||
     311           0 :                    IsDropFormatSupported( SotClipboardFormatId::FILENAME ))
     312           0 :                 nRet = DND_ACTION_LINK;
     313             : 
     314           0 :         if(pEmphasisEntry && pEmphasisEntry != pDropEntry)
     315           0 :             ImplShowTargetEmphasis( Prev(pEmphasisEntry), false );
     316           0 :         else if(pLast && bLastEntryEmphasis  && pDropEntry)
     317             :         {
     318           0 :             ImplShowTargetEmphasis( pLast, false);
     319           0 :             bLastEntryEmphasis = false;
     320             :         }
     321             : 
     322           0 :         if(pDropEntry)
     323           0 :             ImplShowTargetEmphasis( Prev(pDropEntry), DND_ACTION_NONE != nRet );
     324           0 :         else if(pLast)
     325             :         {
     326           0 :             ImplShowTargetEmphasis( pLast, DND_ACTION_NONE != nRet );
     327           0 :             bLastEntryEmphasis = true;
     328             :         }
     329           0 :         pEmphasisEntry = pDropEntry;
     330             :     }
     331           0 :     return nRet;
     332             : }
     333             : 
     334           0 : PopupMenu* SwGlobalTree::CreateContextMenu()
     335             : {
     336           0 :     PopupMenu* pPop = 0;
     337           0 :     if(pActiveShell &&
     338           0 :         !pActiveShell->GetView().GetDocShell()->IsReadOnly())
     339             :     {
     340           0 :         const sal_uInt16 nEnableFlags = GetEnableFlags();
     341           0 :         pPop = new PopupMenu;
     342           0 :         PopupMenu* pSubPop1 = new PopupMenu;
     343           0 :         PopupMenu* pSubPop2 = new PopupMenu;
     344             : 
     345           0 :         for (sal_uInt16 i = CTX_UPDATE_SEL; i <= CTX_UPDATE_ALL; i++)
     346             :         {
     347           0 :             pSubPop2->InsertItem( i, aContextStrings[ST_UPDATE_SEL - ST_GLOBAL_CONTEXT_FIRST - CTX_UPDATE_SEL+ i] );
     348           0 :             pSubPop2->SetHelpId(i, aHelpForMenu[i]);
     349             :         }
     350           0 :         pSubPop2->EnableItem(CTX_UPDATE_SEL, 0 != (nEnableFlags & ENABLE_UPDATE_SEL));
     351             : 
     352           0 :         pSubPop1->InsertItem(CTX_INSERT_ANY_INDEX, aContextStrings[ST_INDEX  - ST_GLOBAL_CONTEXT_FIRST]);
     353           0 :         pSubPop1->SetHelpId(CTX_INSERT_ANY_INDEX, aHelpForMenu[CTX_INSERT_ANY_INDEX]);
     354           0 :         pSubPop1->InsertItem(CTX_INSERT_FILE, aContextStrings[ST_FILE   - ST_GLOBAL_CONTEXT_FIRST]);
     355           0 :         pSubPop1->SetHelpId(CTX_INSERT_FILE, aHelpForMenu[CTX_INSERT_FILE]);
     356           0 :         pSubPop1->InsertItem(CTX_INSERT_NEW_FILE, aContextStrings[ST_NEW_FILE   - ST_GLOBAL_CONTEXT_FIRST]);
     357           0 :         pSubPop1->SetHelpId(CTX_INSERT_NEW_FILE, aHelpForMenu[CTX_INSERT_NEW_FILE]);
     358           0 :         pSubPop1->InsertItem(CTX_INSERT_TEXT, aContextStrings[ST_TEXT   - ST_GLOBAL_CONTEXT_FIRST]);
     359           0 :         pSubPop1->SetHelpId(CTX_INSERT_TEXT, aHelpForMenu[CTX_INSERT_TEXT]);
     360             : 
     361           0 :         pPop->InsertItem(CTX_UPDATE, aContextStrings[ST_UPDATE - ST_GLOBAL_CONTEXT_FIRST]);
     362           0 :         pPop->SetHelpId(CTX_UPDATE, aHelpForMenu[CTX_UPDATE]);
     363           0 :         pPop->InsertItem(CTX_EDIT, aContextStrings[ST_EDIT_CONTENT - ST_GLOBAL_CONTEXT_FIRST]);
     364           0 :         pPop->SetHelpId(CTX_EDIT, aHelpForMenu[CTX_EDIT]);
     365           0 :         if(nEnableFlags&ENABLE_EDIT_LINK)
     366             :         {
     367           0 :             pPop->InsertItem(CTX_EDIT_LINK, aContextStrings[ST_EDIT_LINK - ST_GLOBAL_CONTEXT_FIRST]);
     368           0 :             pPop->SetHelpId(CTX_EDIT_LINK, aHelpForMenu[CTX_EDIT_LINK]);
     369             :         }
     370           0 :         pPop->InsertItem(CTX_INSERT, aContextStrings[ST_INSERT - ST_GLOBAL_CONTEXT_FIRST]);
     371           0 :         pPop->SetHelpId(CTX_INSERT, aHelpForMenu[CTX_INSERT]);
     372           0 :         pPop->InsertSeparator() ;
     373           0 :         pPop->InsertItem(CTX_DELETE, aContextStrings[ST_DELETE - ST_GLOBAL_CONTEXT_FIRST]);
     374           0 :         pPop->SetHelpId(CTX_DELETE, aHelpForMenu[CTX_DELETE]);
     375             : 
     376             :         //disabling if applicable
     377           0 :         pSubPop1->EnableItem(CTX_INSERT_ANY_INDEX,  0 != (nEnableFlags & ENABLE_INSERT_IDX ));
     378           0 :         pSubPop1->EnableItem(CTX_INSERT_TEXT,       0 != (nEnableFlags & ENABLE_INSERT_TEXT));
     379           0 :         pSubPop1->EnableItem(CTX_INSERT_FILE,       0 != (nEnableFlags & ENABLE_INSERT_FILE));
     380           0 :         pSubPop1->EnableItem(CTX_INSERT_NEW_FILE,   0 != (nEnableFlags & ENABLE_INSERT_FILE));
     381             : 
     382           0 :         pPop->EnableItem(CTX_UPDATE,    0 != (nEnableFlags & ENABLE_UPDATE));
     383           0 :         pPop->EnableItem(CTX_INSERT,    0 != (nEnableFlags & ENABLE_INSERT_IDX));
     384           0 :         pPop->EnableItem(CTX_EDIT,      0 != (nEnableFlags & ENABLE_EDIT));
     385           0 :         pPop->EnableItem(CTX_DELETE,    0 != (nEnableFlags & ENABLE_DELETE));
     386             : 
     387           0 :         pPop->SetPopupMenu( CTX_INSERT, pSubPop1 );
     388           0 :         pPop->SetPopupMenu( CTX_UPDATE, pSubPop2 );
     389             :     }
     390           0 :     return pPop;
     391             : }
     392             : 
     393           0 : void SwGlobalTree::TbxMenuHdl(sal_uInt16 nTbxId, ToolBox* pBox)
     394             : {
     395           0 :     const sal_uInt16 nEnableFlags = GetEnableFlags();
     396           0 :     if(FN_GLOBAL_OPEN == nTbxId)
     397             :     {
     398           0 :         boost::scoped_ptr<PopupMenu> pMenu(new PopupMenu);
     399           0 :         for (sal_uInt16 i = CTX_INSERT_ANY_INDEX; i <= CTX_INSERT_TEXT; i++)
     400             :         {
     401           0 :             pMenu->InsertItem( i, aContextStrings[ST_INDEX  - ST_GLOBAL_CONTEXT_FIRST - CTX_INSERT_ANY_INDEX + i] );
     402           0 :             pMenu->SetHelpId(i, aHelpForMenu[i] );
     403             :         }
     404           0 :         pMenu->EnableItem(CTX_INSERT_ANY_INDEX, 0 != (nEnableFlags & ENABLE_INSERT_IDX ));
     405           0 :         pMenu->EnableItem(CTX_INSERT_TEXT,      0 != (nEnableFlags & ENABLE_INSERT_TEXT));
     406           0 :         pMenu->EnableItem(CTX_INSERT_FILE,      0 != (nEnableFlags & ENABLE_INSERT_FILE));
     407           0 :         pMenu->EnableItem(CTX_INSERT_NEW_FILE,  0 != (nEnableFlags & ENABLE_INSERT_FILE));
     408           0 :         pMenu->SetSelectHdl(LINK(this, SwGlobalTree, PopupHdl));
     409           0 :         pMenu->Execute(pBox, pBox->GetItemRect(nTbxId));
     410           0 :         pMenu.reset();
     411           0 :         pBox->EndSelection();
     412           0 :         pBox->Invalidate();
     413             :     }
     414           0 :     else if(FN_GLOBAL_UPDATE == nTbxId)
     415             :     {
     416           0 :         boost::scoped_ptr<PopupMenu> pMenu(new PopupMenu);
     417           0 :         for (sal_uInt16 i = CTX_UPDATE_SEL; i <= CTX_UPDATE_ALL; i++)
     418             :         {
     419           0 :             pMenu->InsertItem( i, aContextStrings[ST_UPDATE_SEL - ST_GLOBAL_CONTEXT_FIRST - CTX_UPDATE_SEL+ i] );
     420           0 :             pMenu->SetHelpId(i, aHelpForMenu[i] );
     421             :         }
     422           0 :         pMenu->EnableItem(CTX_UPDATE_SEL, 0 != (nEnableFlags & ENABLE_UPDATE_SEL));
     423           0 :         pMenu->SetSelectHdl(LINK(this, SwGlobalTree, PopupHdl));
     424           0 :         pMenu->Execute(pBox, pBox->GetItemRect(nTbxId));
     425           0 :         pMenu.reset();
     426           0 :         pBox->EndSelection();
     427           0 :         pBox->Invalidate();
     428             :     }
     429           0 : }
     430             : 
     431           0 : sal_uInt16  SwGlobalTree::GetEnableFlags() const
     432             : {
     433           0 :     SvTreeListEntry* pEntry = FirstSelected();
     434           0 :     sal_uLong nSelCount = GetSelectionCount();
     435           0 :     sal_uLong nEntryCount = GetEntryCount();
     436           0 :     SvTreeListEntry* pPrevEntry = pEntry ? Prev(pEntry) : 0;
     437             : 
     438           0 :     sal_uInt16 nRet = 0;
     439           0 :     if(nSelCount == 1 || !nEntryCount)
     440           0 :         nRet |= ENABLE_INSERT_IDX|ENABLE_INSERT_FILE;
     441           0 :     if(nSelCount == 1)
     442             :     {
     443           0 :         nRet |= ENABLE_EDIT;
     444           0 :         if (pEntry && static_cast<SwGlblDocContent*>(pEntry->GetUserData())->GetType() != GLBLDOC_UNKNOWN &&
     445           0 :                     (!pPrevEntry || static_cast<SwGlblDocContent*>(pPrevEntry->GetUserData())->GetType() != GLBLDOC_UNKNOWN))
     446           0 :             nRet |= ENABLE_INSERT_TEXT;
     447           0 :         if (pEntry && GLBLDOC_SECTION == static_cast<SwGlblDocContent*>(pEntry->GetUserData())->GetType())
     448           0 :             nRet |= ENABLE_EDIT_LINK;
     449             :     }
     450           0 :     else if(!nEntryCount)
     451             :     {
     452           0 :         nRet |= ENABLE_INSERT_TEXT;
     453             :     }
     454           0 :     if(nEntryCount)
     455           0 :         nRet |= ENABLE_UPDATE|ENABLE_DELETE;
     456           0 :     if(nSelCount)
     457           0 :         nRet |= ENABLE_UPDATE_SEL;
     458           0 :     return nRet;
     459             : }
     460             : 
     461           0 : void     SwGlobalTree::RequestHelp( const HelpEvent& rHEvt )
     462             : {
     463           0 :     bool bParent = true;
     464           0 :     Update(true);
     465           0 :     Display(true);
     466           0 :     if( rHEvt.GetMode() & HelpEventMode::QUICK )
     467             :     {
     468           0 :         Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ));
     469           0 :         SvTreeListEntry* pEntry = GetEntry( aPos );
     470             :         const SwGlblDocContent* pCont = pEntry ?
     471           0 :                             static_cast<const SwGlblDocContent*>(pEntry->GetUserData()) : 0;
     472           0 :         if( pCont &&  GLBLDOC_SECTION == pCont->GetType())
     473             :         {
     474           0 :             bParent = false;
     475             :             SvLBoxTab* pTab;
     476           0 :             SvLBoxItem* pItem = GetItem( pEntry, aPos.X(), &pTab );
     477           0 :             if (pItem && SV_ITEM_ID_LBOXSTRING == pItem->GetType())
     478             :             {
     479           0 :                 const SwSection* pSect = pCont->GetSection();
     480           0 :                 OUString sEntry = pSect->GetLinkFileName().getToken(0, sfx2::cTokenSeparator);
     481           0 :                 if(!pSect->IsConnectFlag())
     482           0 :                     sEntry = aContextStrings[ST_BROKEN_LINK - ST_GLOBAL_CONTEXT_FIRST] + sEntry;
     483           0 :                 Point aEntryPos = GetEntryPosition( pEntry );
     484             : 
     485           0 :                 aEntryPos.X() = GetTabPos( pEntry, pTab );
     486           0 :                 Size aSize( pItem->GetSize( this, pEntry ) );
     487             : 
     488           0 :                 if((aEntryPos.X() + aSize.Width()) > GetSizePixel().Width())
     489           0 :                     aSize.Width() = GetSizePixel().Width() - aEntryPos.X();
     490             : 
     491           0 :                 aEntryPos = OutputToScreenPixel(aEntryPos);
     492           0 :                 Rectangle aItemRect( aEntryPos, aSize );
     493           0 :                 if(Help::IsBalloonHelpEnabled())
     494             :                 {
     495           0 :                     aEntryPos.X() += aSize.Width();
     496           0 :                     Help::ShowBalloon( this, aEntryPos, aItemRect, sEntry );
     497             :                 }
     498             :                 else
     499             :                     Help::ShowQuickHelp( this, aItemRect, sEntry,
     500           0 :                         QuickHelpFlags::Left|QuickHelpFlags::VCenter );
     501             :             }
     502             :         }
     503             :     }
     504             : 
     505           0 :     if(bParent)
     506           0 :         SvTreeListBox::RequestHelp(rHEvt);
     507           0 : }
     508             : 
     509           8 : void     SwGlobalTree::SelectHdl()
     510             : {
     511             : 
     512           8 :     sal_uLong nSelCount = GetSelectionCount();
     513           8 :     SvTreeListEntry* pSel = FirstSelected();
     514           8 :     sal_uLong nAbsPos = pSel ? GetModel()->GetAbsPos(pSel) : 0;
     515           8 :     SwNavigationPI* pNavi = GetParentWindow();
     516           8 :     bool bReadonly = !pActiveShell ||
     517           8 :                 pActiveShell->GetView().GetDocShell()->IsReadOnly();
     518           8 :     pNavi->aGlobalToolBox->EnableItem(FN_GLOBAL_EDIT,  nSelCount == 1 && !bReadonly);
     519           8 :     pNavi->aGlobalToolBox->EnableItem(FN_GLOBAL_OPEN,  nSelCount <= 1 && !bReadonly);
     520           8 :     pNavi->aGlobalToolBox->EnableItem(FN_GLOBAL_UPDATE,  GetEntryCount() > 0 && !bReadonly);
     521           8 :     pNavi->aGlobalToolBox->EnableItem(FN_ITEM_UP,
     522          16 :                     nSelCount == 1 && nAbsPos && !bReadonly);
     523           8 :     pNavi->aGlobalToolBox->EnableItem(FN_ITEM_DOWN,
     524          16 :                     nSelCount == 1 && nAbsPos < GetEntryCount() - 1 && !bReadonly);
     525             : 
     526           8 : }
     527             : 
     528           0 : void     SwGlobalTree::DeselectHdl()
     529             : {
     530           0 :     SelectHdl();
     531           0 : }
     532             : 
     533           0 : DragDropMode SwGlobalTree::NotifyStartDrag( TransferDataContainer& ,
     534             :                                                 SvTreeListEntry* pEntry )
     535             : {
     536           0 :     bIsInternalDrag = true;
     537           0 :     pDDSource = pEntry;
     538           0 :     return DragDropMode::CTRL_MOVE;
     539             : }
     540             : 
     541           0 : sal_IntPtr SwGlobalTree::GetTabPos( SvTreeListEntry*, SvLBoxTab* pTab)
     542             : {
     543           0 :     return pTab->GetPos() - GLBL_TABPOS_SUB;
     544             : }
     545             : 
     546           0 : TriState SwGlobalTree::NotifyMoving(   SvTreeListEntry*  pTarget,
     547             :                                         SvTreeListEntry*  pSource,
     548             :                                         SvTreeListEntry*&,
     549             :                                         sal_uLong&
     550             :                                     )
     551             : {
     552           0 :     SvTreeList* _pModel = GetModel();
     553           0 :     sal_uLong nSource = _pModel->GetAbsPos(pSource);
     554           0 :     sal_uLong nDest   = pTarget ? _pModel->GetAbsPos(pTarget) : pSwGlblDocContents->size();
     555             : 
     556           0 :     if( pActiveShell->MoveGlobalDocContent(
     557           0 :             *pSwGlblDocContents, nSource, nSource + 1, nDest ) &&
     558           0 :             Update( false ))
     559           0 :         Display();
     560             : 
     561           0 :     return TRISTATE_FALSE;
     562             : }
     563             : 
     564           0 : TriState SwGlobalTree::NotifyCopying(  SvTreeListEntry*  /*pTarget*/,
     565             :                                         SvTreeListEntry*  /*pEntry*/,
     566             :                                         SvTreeListEntry*& /*rpNewParent*/,
     567             :                                         sal_uLong&        /*rNewChildPos*/
     568             :                                     )
     569             : {
     570           0 :     return TRISTATE_FALSE;
     571             : }
     572             : 
     573           0 : bool SwGlobalTree::NotifyAcceptDrop( SvTreeListEntry* pEntry)
     574             : {
     575           0 :     return pEntry != 0;
     576             : }
     577             : 
     578           0 : void SwGlobalTree::StartDrag( sal_Int8 nAction, const Point& rPt )
     579             : {
     580           0 :     if( 1 == GetSelectionCount() )
     581           0 :         SvTreeListBox::StartDrag( nAction, rPt );
     582           0 : }
     583             : 
     584           0 : void SwGlobalTree::DragFinished( sal_Int8 nAction )
     585             : {
     586           0 :     SvTreeListBox::DragFinished( nAction );
     587           0 :     bIsInternalDrag = false;
     588           0 : }
     589             : 
     590             : // If a Ctrl+DoubleClick is executed in an empty area,
     591             : // then the base function of the control should be called.
     592             : 
     593           0 : void  SwGlobalTree::MouseButtonDown( const MouseEvent& rMEvt )
     594             : {
     595           0 :     Point aPos( rMEvt.GetPosPixel());
     596           0 :     SvTreeListEntry* pEntry = GetEntry( aPos, true );
     597           0 :     if( !pEntry && rMEvt.IsLeft() && rMEvt.IsMod1() && (rMEvt.GetClicks() % 2) == 0)
     598           0 :         Control::MouseButtonDown( rMEvt );
     599             :     else
     600           0 :         SvTreeListBox::MouseButtonDown( rMEvt );
     601           0 : }
     602             : 
     603           0 : void     SwGlobalTree::GetFocus()
     604             : {
     605           0 :     if(Update( false ))
     606           0 :         Display();
     607           0 :     SvTreeListBox::GetFocus();
     608           0 : }
     609             : 
     610           0 : void     SwGlobalTree::KeyInput(const KeyEvent& rKEvt)
     611             : {
     612           0 :     const vcl::KeyCode aCode = rKEvt.GetKeyCode();
     613           0 :     if(aCode.GetCode() == KEY_RETURN)
     614             :     {
     615           0 :         switch(aCode.GetModifier())
     616             :         {
     617             :             case KEY_MOD2:
     618             :                 // Switch boxes
     619           0 :                 GetParentWindow()->ToggleTree();
     620           0 :             break;
     621             :         }
     622             :     }
     623             :     else
     624           0 :         SvTreeListBox::KeyInput(rKEvt);
     625           0 : }
     626             : 
     627           0 : void SwGlobalTree::Clear()
     628             : {
     629           0 :     pEmphasisEntry = 0;
     630           0 :     SvTreeListBox::Clear();
     631           0 : }
     632             : 
     633           0 : void    SwGlobalTree::Display(bool bOnlyUpdateUserData)
     634             : {
     635           0 :     if(!bIsImageListInitialized)
     636             :     {
     637           0 :         aEntryImages = ImageList(SW_RES(IMG_NAVI_ENTRYBMP));
     638           0 :         bIsImageListInitialized = true;
     639             :     }
     640           0 :     size_t nCount = pSwGlblDocContents->size();
     641           0 :     if(bOnlyUpdateUserData && GetEntryCount() == pSwGlblDocContents->size())
     642             :     {
     643           0 :         SvTreeListEntry* pEntry = First();
     644           0 :         for (size_t i = 0; i < nCount && pEntry; i++)
     645             :         {
     646           0 :             SwGlblDocContent* pCont = (*pSwGlblDocContents)[i];
     647           0 :             pEntry->SetUserData(pCont);
     648           0 :             pEntry = Next(pEntry);
     649             :             assert(pEntry || i == nCount - 1);
     650             :         }
     651             :     }
     652             :     else
     653             :     {
     654           0 :         SetUpdateMode( false );
     655           0 :         SvTreeListEntry* pOldSelEntry = FirstSelected();
     656           0 :         OUString sEntryName;  // Name of the entry
     657           0 :         sal_uLong nSelPos = TREELIST_ENTRY_NOTFOUND;
     658           0 :         if(pOldSelEntry)
     659             :         {
     660           0 :             sEntryName = GetEntryText(pOldSelEntry);
     661           0 :             nSelPos = GetModel()->GetAbsPos(pOldSelEntry);
     662             :         }
     663           0 :         Clear();
     664           0 :         if(!pSwGlblDocContents)
     665           0 :             Update( false );
     666             : 
     667           0 :         SvTreeListEntry* pSelEntry = 0;
     668           0 :         for( size_t i = 0; i < nCount; i++)
     669             :         {
     670           0 :             SwGlblDocContent* pCont = (*pSwGlblDocContents)[i];
     671           0 :             OUString sEntry;
     672           0 :             Image aImage;
     673           0 :             switch( pCont->GetType()  )
     674             :             {
     675             :                 case GLBLDOC_UNKNOWN:
     676             :                 {
     677           0 :                     sEntry = aContextStrings[ST_TEXT   - ST_GLOBAL_CONTEXT_FIRST];
     678             :                 }
     679           0 :                 break;
     680             :                 case GLBLDOC_TOXBASE:
     681             :                 {
     682           0 :                     const SwTOXBase* pBase = pCont->GetTOX();
     683           0 :                     sEntry = pBase->GetTitle();
     684           0 :                     aImage = aEntryImages.GetImage(SID_SW_START + CONTENT_TYPE_INDEX);
     685             :                 }
     686           0 :                 break;
     687             :                 case GLBLDOC_SECTION:
     688             :                 {
     689           0 :                     const SwSection* pSect = pCont->GetSection();
     690           0 :                     sEntry = pSect->GetSectionName();
     691           0 :                     aImage = aEntryImages.GetImage(SID_SW_START + CONTENT_TYPE_REGION);
     692             :                 }
     693           0 :                 break;
     694             :             }
     695             :             SvTreeListEntry* pEntry = InsertEntry(sEntry, aImage, aImage,
     696           0 :                         0, false, TREELIST_APPEND, pCont);
     697           0 :             if(sEntry == sEntryName)
     698             :             {
     699           0 :                 pSelEntry = pEntry;
     700             :             }
     701           0 :         }
     702           0 :         if(pSelEntry)
     703             :         {
     704           0 :             Select(pSelEntry);
     705             :         }
     706           0 :         else if(nSelPos != TREELIST_ENTRY_NOTFOUND && nSelPos < nCount)
     707             :         {
     708           0 :             Select(GetEntry(nSelPos));
     709             :         }
     710           0 :         else if(nCount)
     711           0 :             Select(First());
     712             :         else
     713           0 :             SelectHdl();
     714           0 :         SetUpdateMode( true );
     715             :     }
     716           0 : }
     717             : 
     718           0 : void SwGlobalTree::InsertRegion( const SwGlblDocContent* pCont, const OUString* pFileName )
     719             : {
     720           0 :     Sequence< OUString > aFileNames;
     721           0 :     if ( !pFileName )
     722             :     {
     723           0 :         pDefParentWin = Application::GetDefDialogParent();
     724           0 :         Application::SetDefDialogParent( this );
     725           0 :         delete pDocInserter;
     726             :         pDocInserter = new ::sfx2::DocumentInserter(
     727           0 :                 OUString("swriter"), true );
     728           0 :         pDocInserter->StartExecuteModal( LINK( this, SwGlobalTree, DialogClosedHdl ) );
     729             :     }
     730           0 :     else if ( !pFileName->isEmpty() )
     731             :     {
     732           0 :         aFileNames.realloc(1);
     733           0 :         INetURLObject aFileName;
     734           0 :         aFileName.SetSmartURL( *pFileName );
     735           0 :         aFileNames.getArray()[0] = aFileName.GetMainURL( INetURLObject::NO_DECODE );
     736           0 :         InsertRegion( pCont, aFileNames );
     737           0 :     }
     738           0 : }
     739             : 
     740           0 : void    SwGlobalTree::EditContent(const SwGlblDocContent* pCont )
     741             : {
     742           0 :     sal_uInt16 nSlot = 0;
     743           0 :     switch( pCont->GetType() )
     744             :     {
     745             :         case GLBLDOC_UNKNOWN:
     746           0 :             pActiveShell->GetView().GetEditWin().GrabFocus();
     747           0 :         break;
     748             :         case GLBLDOC_TOXBASE:
     749             :         {
     750           0 :             const SwTOXBase* pBase = pCont->GetTOX();
     751           0 :             if(pBase)
     752           0 :                 nSlot = FN_INSERT_MULTI_TOX;
     753             :         }
     754           0 :         break;
     755             :         case GLBLDOC_SECTION:
     756             :         {
     757           0 :             OpenDoc(pCont);
     758             : 
     759           0 :             nSlot = 0;
     760           0 :             pCont = 0;
     761             :         }
     762           0 :         break;
     763             :     }
     764           0 :     if(pCont)
     765           0 :         GotoContent(pCont);
     766           0 :     if(nSlot)
     767             :     {
     768           0 :         pActiveShell->GetView().GetViewFrame()->GetDispatcher()->Execute(nSlot);
     769           0 :         if(Update( false ))
     770           0 :             Display();
     771             :     }
     772           0 : }
     773             : 
     774           0 : IMPL_LINK( SwGlobalTree, PopupHdl, Menu* , pMenu)
     775             : {
     776           0 :     ExcecuteContextMenuAction( pMenu->GetCurItemId());
     777           0 :     return sal_IntPtr(true);
     778             : }
     779             : 
     780           0 : void    SwGlobalTree::ExcecuteContextMenuAction( sal_uInt16 nSelectedPopupEntry )
     781             : {
     782           0 :     SvTreeListEntry* pEntry = FirstSelected();
     783           0 :     SwGlblDocContent* pCont = pEntry ? static_cast<SwGlblDocContent*>(pEntry->GetUserData()) : 0;
     784             :     // If a RequestHelp is called during the dialogue,
     785             :     // then the content gets lost. Because of that a copy
     786             :     // is created in which only the DocPos is set correctly.
     787           0 :     SwGlblDocContent* pContCopy = 0;
     788           0 :     if(pCont)
     789           0 :         pContCopy = new SwGlblDocContent(pCont->GetDocPos());
     790           0 :     SfxDispatcher& rDispatch = *pActiveShell->GetView().GetViewFrame()->GetDispatcher();
     791           0 :     sal_uInt16 nSlot = 0;
     792           0 :     bool bDeleteContentCopy = true;
     793           0 :     switch( nSelectedPopupEntry )
     794             :     {
     795             :         case CTX_UPDATE_SEL:
     796             :         {
     797             :             // Two passes: first update the areas, then the directories.
     798           0 :             SvTreeListEntry* pSelEntry = FirstSelected();
     799           0 :             while( pSelEntry )
     800             :             {
     801           0 :                 SwGlblDocContent* pContent = static_cast<SwGlblDocContent*>(pSelEntry->GetUserData());
     802           0 :                 if(GLBLDOC_SECTION == pContent->GetType() &&
     803           0 :                     pContent->GetSection()->IsConnected())
     804             :                 {
     805           0 :                     const_cast<SwSection*>(pContent->GetSection())->UpdateNow();
     806             :                 }
     807             : 
     808           0 :                 pSelEntry = NextSelected(pSelEntry);
     809             :             }
     810           0 :             pSelEntry = FirstSelected();
     811           0 :             while( pSelEntry )
     812             :             {
     813           0 :                 SwGlblDocContent* pContent = static_cast<SwGlblDocContent*>(pSelEntry->GetUserData());
     814           0 :                 if(GLBLDOC_TOXBASE == pContent->GetType())
     815           0 :                     pActiveShell->UpdateTableOf(*pContent->GetTOX());
     816           0 :                 pSelEntry = NextSelected(pSelEntry);
     817             :             }
     818             : 
     819             :         }
     820           0 :         break;
     821             :         case CTX_UPDATE_INDEX:
     822             :         {
     823           0 :             nSlot = FN_UPDATE_TOX;
     824             :         }
     825           0 :         break;
     826             :         case CTX_UPDATE_LINK:
     827             :         case CTX_UPDATE_ALL:
     828             :         {
     829           0 :             pActiveShell->GetLinkManager().UpdateAllLinks(true);
     830           0 :             if(CTX_UPDATE_ALL == nSelectedPopupEntry)
     831           0 :                 nSlot = FN_UPDATE_TOX;
     832           0 :             pCont = 0;
     833             :         }
     834           0 :         break;
     835             :         case CTX_EDIT:
     836             :         {
     837             :             OSL_ENSURE(pCont, "edit without entry ? " );
     838           0 :             if (pCont)
     839             :             {
     840           0 :                 EditContent(pCont);
     841             :             }
     842             :         }
     843           0 :         break;
     844             :         case CTX_EDIT_LINK:
     845             :         {
     846             :             OSL_ENSURE(pCont, "edit without entry ? " );
     847           0 :             if (pCont)
     848             :             {
     849             :                 SfxStringItem aName(FN_EDIT_REGION,
     850           0 :                         pCont->GetSection()->GetSectionName());
     851           0 :                 rDispatch.Execute(FN_EDIT_REGION, SfxCallMode::ASYNCHRON, &aName, 0L);
     852             :             }
     853             :         }
     854           0 :         break;
     855             :         case CTX_DELETE:
     856             :         {
     857             :             // If several entries selected, then after each delete the array
     858             :             // must be refilled. So you do not have to remember anything,
     859             :             // deleting begins at the end.
     860           0 :             SvTreeListEntry* pSelEntry = LastSelected();
     861           0 :             boost::scoped_ptr<SwGlblDocContents> pTempContents;
     862           0 :             pActiveShell->StartAction();
     863           0 :             while(pSelEntry)
     864             :             {
     865             :                 pActiveShell->DeleteGlobalDocContent(
     866           0 :                     pTempContents ? *pTempContents : *pSwGlblDocContents,
     867           0 :                                      GetModel()->GetAbsPos(pSelEntry));
     868           0 :                 pSelEntry = PrevSelected(pSelEntry);
     869           0 :                 if(pSelEntry)
     870             :                 {
     871           0 :                     pTempContents.reset(new SwGlblDocContents);
     872           0 :                     pActiveShell->GetGlobalDocContent(*pTempContents);
     873             :                 }
     874             :             }
     875           0 :             pTempContents.reset();
     876           0 :             pActiveShell->EndAction();
     877           0 :             pCont = 0;
     878             :         }
     879           0 :         break;
     880             :         case CTX_INSERT_ANY_INDEX:
     881             :         {
     882           0 :             if(pContCopy)
     883             :             {
     884           0 :                 SfxItemSet aSet(pActiveShell->GetView().GetPool(),
     885             :                             RES_COL, RES_COL,
     886             :                             RES_BACKGROUND, RES_BACKGROUND,
     887             :                             RES_FRM_SIZE, RES_FRM_SIZE,
     888             :                             SID_ATTR_PAGE_SIZE, SID_ATTR_PAGE_SIZE,
     889             :                             RES_LR_SPACE, RES_LR_SPACE,
     890             :                             FN_PARAM_TOX_TYPE, FN_PARAM_TOX_TYPE,
     891           0 :                             0);
     892             : 
     893           0 :                 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
     894             :                 assert(pFact && "Dialog creation failed!");
     895             :                 boost::scoped_ptr<AbstractMultiTOXTabDialog> pDlg(pFact->CreateMultiTOXTabDialog(
     896             :                                                         this, aSet,
     897             :                                                         *pActiveShell,
     898             :                                                         0,
     899             :                                                         USHRT_MAX,
     900           0 :                                                         true));
     901             :                 assert(pDlg && "Dialog creation failed!");
     902           0 :                 if(RET_OK == pDlg->Execute())
     903             :                 {
     904           0 :                     SwTOXDescription&  rDesc = pDlg->GetTOXDescription(
     905           0 :                                                 pDlg->GetCurrentTOXType());
     906           0 :                     SwTOXMgr aMgr(pActiveShell);
     907           0 :                     SwTOXBase* pToInsert = 0;
     908           0 :                     if(aMgr.UpdateOrInsertTOX(rDesc, &pToInsert, pDlg->GetOutputItemSet()))
     909           0 :                         pActiveShell->InsertGlobalDocContent( *pContCopy, *pToInsert );
     910             :                 }
     911           0 :                 pCont = 0;
     912             :             }
     913             :         }
     914           0 :         break;
     915             :         case CTX_INSERT_FILE:
     916             :         {
     917           0 :             bDeleteContentCopy = false;
     918           0 :             pDocContent = pContCopy;
     919           0 :             InsertRegion( pContCopy );
     920           0 :             pCont = NULL;
     921             :         }
     922           0 :         break;
     923             :         case CTX_INSERT_NEW_FILE:
     924             :         {
     925           0 :             SfxViewFrame* pGlobFrm = pActiveShell->GetView().GetViewFrame();
     926           0 :             SwGlobalFrameListener_Impl aFrmListener(*pGlobFrm);
     927             : 
     928           0 :             sal_uLong nEntryPos = pEntry ? GetModel()->GetAbsPos(pEntry) : (sal_uLong)-1;
     929             :             // Creating a new doc
     930             :             SfxStringItem aFactory(SID_NEWDOCDIRECT,
     931           0 :                             SwDocShell::Factory().GetFilterContainer()->GetName());
     932             : 
     933             :              const SfxFrameItem* pItem = static_cast<const SfxFrameItem*>(
     934             :                             rDispatch.Execute(SID_NEWDOCDIRECT,
     935           0 :                                 SfxCallMode::SYNCHRON, &aFactory, 0L));
     936             : 
     937             :             // save at
     938           0 :             SfxFrame* pFrm = pItem ? pItem->GetFrame() : 0;
     939           0 :             SfxViewFrame* pFrame = pFrm ? pFrm->GetCurrentViewFrame() : 0;
     940           0 :             if( pFrame )
     941             :             {
     942             :                 const SfxBoolItem* pBool = static_cast<const SfxBoolItem*>(
     943             :                         pFrame->GetDispatcher()->Execute(
     944           0 :                                 SID_SAVEASDOC, SfxCallMode::SYNCHRON ));
     945           0 :                 SfxObjectShell& rObj = *pFrame->GetObjectShell();
     946           0 :                 const SfxMedium* pMedium = rObj.GetMedium();
     947           0 :                 OUString sNewFile(pMedium->GetURLObject().GetMainURL(INetURLObject::DECODE_TO_IURI));
     948             :                 // Insert the area with the Doc-Name
     949             :                 // Bring the own Doc in the foreground
     950           0 :                 if(aFrmListener.IsValid() && !sNewFile.isEmpty())
     951             :                 {
     952           0 :                     pGlobFrm->ToTop();
     953             :                     // Due to the update the entries are invalid
     954           0 :                     if(nEntryPos != (sal_uLong)-1)
     955             :                     {
     956           0 :                         Update( false );
     957           0 :                         Display();
     958           0 :                         Select(GetModel()->GetEntryAtAbsPos(nEntryPos));
     959           0 :                         pEntry = FirstSelected();
     960           0 :                         pCont = pEntry ? static_cast<SwGlblDocContent*>(pEntry->GetUserData()) : 0;
     961             :                     }
     962             :                     else
     963             :                     {
     964           0 :                         pEntry = 0;
     965           0 :                         pCont = 0;
     966             :                     }
     967           0 :                     if(pBool->GetValue())
     968             :                     {
     969           0 :                         InsertRegion(pCont, &sNewFile);
     970           0 :                         pFrame->ToTop();
     971             :                     }
     972             :                     else
     973             :                         pFrame->GetDispatcher()->Execute(SID_CLOSEWIN,
     974           0 :                                                 SfxCallMode::SYNCHRON);
     975             :                 }
     976             :                 else
     977             :                 {
     978           0 :                     pFrame->ToTop();
     979           0 :                     return;
     980           0 :                 }
     981           0 :             }
     982             :         }
     983           0 :         break;
     984             :         case CTX_INSERT_TEXT:
     985             :         {
     986           0 :             if(pCont)
     987           0 :                 pActiveShell->InsertGlobalDocContent(*pCont);
     988             :             else
     989             :             {
     990           0 :                 pActiveShell->SplitNode(); // Empty document
     991           0 :                 pActiveShell->Up( false, 1 );
     992             :             }
     993           0 :             pActiveShell->GetView().GetEditWin().GrabFocus();
     994             :         }
     995           0 :         break;
     996             :         case CTX_UPDATE:
     997           0 :             pCont = 0;
     998           0 :         break;
     999             :         default:;
    1000             :         // here nothing happens
    1001             :     }
    1002           0 :     if(pCont)
    1003           0 :         GotoContent(pCont);
    1004           0 :     if(nSlot)
    1005           0 :         rDispatch.Execute(nSlot);
    1006           0 :     if(Update( false ))
    1007           0 :         Display();
    1008           0 :     if ( bDeleteContentCopy )
    1009           0 :         delete pContCopy;
    1010             : }
    1011             : 
    1012           0 : IMPL_LINK_NOARG_TYPED(SwGlobalTree, Timeout, Timer *, void)
    1013             : {
    1014           0 :     if(!IsDisposed() && !HasFocus() && Update( false ))
    1015           0 :         Display();
    1016           0 : }
    1017             : 
    1018           0 : void SwGlobalTree::GotoContent(const SwGlblDocContent* pCont)
    1019             : {
    1020           0 :     pActiveShell->EnterStdMode();
    1021             : 
    1022           0 :     switch( pCont->GetType()  )
    1023             :     {
    1024             :         case GLBLDOC_UNKNOWN:
    1025           0 :             pActiveShell->GotoGlobalDocContent(*pCont);
    1026           0 :         break;
    1027             :         case GLBLDOC_TOXBASE:
    1028             :         {
    1029           0 :             const OUString sName = pCont->GetTOX()->GetTOXName();
    1030           0 :             if (!pActiveShell->GotoNextTOXBase(&sName))
    1031           0 :                 pActiveShell->GotoPrevTOXBase(&sName);
    1032             :         }
    1033           0 :         break;
    1034             :         case GLBLDOC_SECTION:
    1035           0 :         break;
    1036             :     }
    1037             : 
    1038           0 : }
    1039             : 
    1040           0 : void    SwGlobalTree::ShowTree()
    1041             : {
    1042           0 :     aUpdateTimer.Start();
    1043           0 :     SvTreeListBox::Show();
    1044           0 : }
    1045             : 
    1046           8 : void    SwGlobalTree::HideTree()
    1047             : {
    1048           8 :     aUpdateTimer.Stop();
    1049           8 :     SvTreeListBox::Hide();
    1050           8 : }
    1051             : 
    1052           0 : void    SwGlobalTree::ExecCommand(sal_uInt16 nCmd)
    1053             : {
    1054           0 :     SvTreeListEntry* pEntry = FirstSelected();
    1055             :     OSL_ENSURE(pEntry, "It explodes in the next moment");
    1056           0 :     if(FN_GLOBAL_EDIT == nCmd)
    1057             :     {
    1058             :         const SwGlblDocContent* pCont = static_cast<const SwGlblDocContent*>(
    1059           0 :                                                 pEntry->GetUserData());
    1060           0 :         EditContent(pCont);
    1061             :     }
    1062             :     else
    1063             :     {
    1064           0 :         if(GetSelectionCount() == 1)
    1065             :         {
    1066           0 :             bool bMove = false;
    1067           0 :             sal_uLong nSource = GetModel()->GetAbsPos(pEntry);
    1068           0 :             sal_uLong nDest = nSource;
    1069           0 :             switch(nCmd)
    1070             :             {
    1071             :                 case FN_ITEM_DOWN:
    1072             :                 {
    1073           0 :                     sal_uLong nEntryCount = GetEntryCount();
    1074           0 :                     bMove = nEntryCount > nSource + 1;
    1075           0 :                     nDest+= 2;
    1076             :                 }
    1077           0 :                 break;
    1078             :                 case FN_ITEM_UP:
    1079             :                 {
    1080           0 :                     if(nSource)
    1081           0 :                         bMove = 0 != nSource;
    1082           0 :                     nDest--;
    1083             :                 }
    1084           0 :                 break;
    1085             :             }
    1086           0 :             if( bMove && pActiveShell->MoveGlobalDocContent(
    1087           0 :                 *pSwGlblDocContents, nSource, nSource + 1, nDest ) &&
    1088           0 :                     Update( false ))
    1089           0 :                 Display();
    1090             :         }
    1091             :     }
    1092           0 : }
    1093             : 
    1094           0 : bool    SwGlobalTree::Update(bool bHard)
    1095             : {
    1096           0 :     SwView* pActView = GetParentWindow()->GetCreateView();
    1097           0 :     bool bRet = false;
    1098           0 :     if(pActView && pActView->GetWrtShellPtr())
    1099             :     {
    1100           0 :         const SwWrtShell* pOldShell = pActiveShell;
    1101           0 :         pActiveShell = pActView->GetWrtShellPtr();
    1102           0 :         if(pActiveShell != pOldShell)
    1103             :         {
    1104           0 :             delete pSwGlblDocContents;
    1105           0 :             pSwGlblDocContents = 0;
    1106             :         }
    1107           0 :         if(!pSwGlblDocContents)
    1108             :         {
    1109           0 :             pSwGlblDocContents = new SwGlblDocContents;
    1110           0 :             bRet = true;
    1111           0 :             pActiveShell->GetGlobalDocContent(*pSwGlblDocContents);
    1112             :         }
    1113             :         else
    1114             :         {
    1115           0 :             bool bCopy = false;
    1116           0 :             boost::scoped_ptr<SwGlblDocContents> pTempContents(new SwGlblDocContents);
    1117           0 :             pActiveShell->GetGlobalDocContent(*pTempContents);
    1118           0 :             if(pTempContents->size() != pSwGlblDocContents->size() ||
    1119           0 :                     pTempContents->size() != GetEntryCount())
    1120             :             {
    1121           0 :                 bRet = true;
    1122           0 :                 bCopy = true;
    1123             :             }
    1124             :             else
    1125             :             {
    1126           0 :                 for(size_t i = 0; i < pTempContents->size() && !bCopy; i++)
    1127             :                 {
    1128           0 :                     SwGlblDocContent* pLeft = (*pTempContents)[i];
    1129           0 :                     SwGlblDocContent* pRight = (*pSwGlblDocContents)[i];
    1130           0 :                     GlobalDocContentType eType = pLeft->GetType();
    1131           0 :                     SvTreeListEntry* pEntry = GetEntry(i);
    1132           0 :                     OUString sTemp = GetEntryText(pEntry);
    1133           0 :                     if (
    1134           0 :                          eType != pRight->GetType() ||
    1135             :                          (
    1136           0 :                            eType == GLBLDOC_SECTION &&
    1137           0 :                            pLeft->GetSection()->GetSectionName() != sTemp
    1138           0 :                          ) ||
    1139             :                          (
    1140           0 :                            eType == GLBLDOC_TOXBASE &&
    1141           0 :                            pLeft->GetTOX()->GetTitle() != sTemp
    1142             :                          )
    1143             :                        )
    1144             :                     {
    1145           0 :                         bCopy = bRet = true;
    1146             :                     }
    1147           0 :                 }
    1148             :             }
    1149           0 :             if(bCopy || bHard)
    1150             :             {
    1151           0 :                 pSwGlblDocContents->DeleteAndDestroyAll();
    1152           0 :                 pSwGlblDocContents->insert( *pTempContents );
    1153           0 :                 pTempContents->clear();
    1154             : 
    1155           0 :             }
    1156             :         }
    1157             : 
    1158             :     }
    1159             :     else
    1160             :     {
    1161           0 :         Clear();
    1162           0 :         if(pSwGlblDocContents)
    1163           0 :             pSwGlblDocContents->DeleteAndDestroyAll();
    1164             :     }
    1165             :     // FIXME: Implement a test for changes!
    1166           0 :     return bRet;
    1167             : }
    1168             : 
    1169           0 : void SwGlobalTree::OpenDoc(const SwGlblDocContent* pCont)
    1170             : {
    1171             :     const OUString sFileName(pCont->GetSection()->GetLinkFileName().getToken(0,
    1172           0 :             sfx2::cTokenSeparator));
    1173           0 :     bool bFound = false;
    1174           0 :     const SfxObjectShell* pCurr = SfxObjectShell::GetFirst();
    1175           0 :     while( !bFound && pCurr )
    1176             :     {
    1177           0 :         if(pCurr->GetMedium() &&
    1178           0 :            pCurr->GetMedium()->GetURLObject().GetMainURL(INetURLObject::DECODE_TO_IURI) == sFileName)
    1179             :         {
    1180           0 :             bFound = true;
    1181           0 :             SwGlobalTree::SetShowShell(pCurr);
    1182           0 :             Application::PostUserEvent( LINK( this, SwGlobalTree, ShowFrameHdl ), NULL, true );
    1183           0 :             pCurr = 0;
    1184             :         }
    1185             :         else
    1186           0 :             pCurr = SfxObjectShell::GetNext(*pCurr);
    1187             :     }
    1188           0 :     if(!bFound)
    1189             :     {
    1190           0 :         SfxStringItem aURL(SID_FILE_NAME, sFileName);
    1191           0 :         SfxBoolItem aReadOnly(SID_DOC_READONLY, false);
    1192           0 :         SfxStringItem aTargetFrameName( SID_TARGETNAME, "_blank" );
    1193           0 :         SfxStringItem aReferer(SID_REFERER, pActiveShell->GetView().GetDocShell()->GetTitle());
    1194           0 :         pActiveShell->GetView().GetViewFrame()->GetDispatcher()->
    1195             :                 Execute(SID_OPENDOC, SfxCallMode::ASYNCHRON,
    1196           0 :                             &aURL, &aReadOnly, &aReferer, &aTargetFrameName, 0L);
    1197           0 :     }
    1198           0 : }
    1199             : 
    1200           0 : IMPL_LINK_NOARG( SwGlobalTree, DoubleClickHdl)
    1201             : {
    1202           0 :     SvTreeListEntry* pEntry = GetCurEntry();
    1203           0 :     SwGlblDocContent* pCont = static_cast<SwGlblDocContent*>(pEntry->GetUserData());
    1204           0 :     if(pCont->GetType() == GLBLDOC_SECTION)
    1205           0 :         OpenDoc(pCont);
    1206             :     else
    1207             :     {
    1208           0 :         GotoContent(pCont);
    1209           0 :         pActiveShell->GetView().GetEditWin().GrabFocus();
    1210             :     }
    1211           0 :     return 0;
    1212             : }
    1213             : 
    1214           8 : SwNavigationPI* SwGlobalTree::GetParentWindow()
    1215             : {
    1216           8 :     return static_cast<SwNavigationPI*>(Window::GetParent());
    1217             : }
    1218             : 
    1219           0 : IMPL_STATIC_LINK(SwGlobalTree, ShowFrameHdl, SwGlobalTree*,)
    1220             : {
    1221           0 :     const SfxObjectShell* pShell = SwGlobalTree::GetShowShell();
    1222           0 :     SfxViewFrame* pFirst = pShell ? SfxViewFrame::GetFirst(pShell) : NULL;
    1223           0 :     if (pFirst)
    1224           0 :         pFirst->ToTop();
    1225           0 :     SwGlobalTree::SetShowShell(0);
    1226           0 :     return 0;
    1227             : }
    1228             : 
    1229           0 : void SwGlobalTree::InitEntry(SvTreeListEntry* pEntry,
    1230             :         const OUString& rStr ,const Image& rImg1,const Image& rImg2,
    1231             :         SvLBoxButtonKind eButtonKind)
    1232             : {
    1233           0 :     const size_t nColToHilite = 1; //0==Bitmap;1=="Column1";2=="Column2"
    1234           0 :     SvTreeListBox::InitEntry( pEntry, rStr, rImg1, rImg2, eButtonKind );
    1235           0 :     SvLBoxString* pCol = static_cast<SvLBoxString*>(pEntry->GetItem( nColToHilite ));
    1236           0 :     SwLBoxString* pStr = new SwLBoxString( pEntry, 0, pCol->GetText() );
    1237           0 :     pEntry->ReplaceItem( pStr, nColToHilite );
    1238           0 : }
    1239             : 
    1240           0 : void SwLBoxString::Paint(const Point& rPos, SvTreeListBox& rDev, vcl::RenderContext& rRenderContext,
    1241             :                          const SvViewDataEntry* pView, const SvTreeListEntry& rEntry)
    1242             : {
    1243           0 :     SwGlblDocContent* pCont = static_cast<SwGlblDocContent*>(rEntry.GetUserData());
    1244           0 :     if (pCont->GetType() == GLBLDOC_SECTION &&
    1245           0 :       !(pCont->GetSection())->IsConnectFlag())
    1246             :     {
    1247           0 :         rRenderContext.Push(PushFlags::FONT);
    1248           0 :         vcl::Font aOldFont(rRenderContext.GetFont());
    1249           0 :         vcl::Font aFont(rRenderContext.GetFont());
    1250           0 :         Color aCol(COL_LIGHTRED);
    1251           0 :         aFont.SetColor(aCol);
    1252           0 :         rRenderContext.SetFont(aFont);
    1253           0 :         rRenderContext.DrawText(rPos, GetText());
    1254           0 :         rRenderContext.Pop();
    1255             :     }
    1256             :     else
    1257           0 :         SvLBoxString::Paint(rPos, rDev, rRenderContext, pView, rEntry);
    1258           0 : }
    1259             : 
    1260           0 : void    SwGlobalTree::DataChanged( const DataChangedEvent& rDCEvt )
    1261             : {
    1262           0 :     if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
    1263           0 :          (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
    1264             :     {
    1265           0 :         aEntryImages = ImageList(SW_RES(IMG_NAVI_ENTRYBMP));
    1266           0 :         Update(true);
    1267             :     }
    1268           0 :     SvTreeListBox::DataChanged( rDCEvt );
    1269           0 : }
    1270             : 
    1271           0 : void SwGlobalTree::InsertRegion( const SwGlblDocContent* _pContent, const Sequence< OUString >& _rFiles )
    1272             : {
    1273           0 :     sal_Int32 nFiles = _rFiles.getLength();
    1274           0 :     if ( nFiles )
    1275             :     {
    1276           0 :         bool bMove = false;
    1277           0 :         if ( !_pContent )
    1278             :         {
    1279           0 :             SvTreeListEntry* pLast = LastVisible();
    1280           0 :             _pContent = static_cast<SwGlblDocContent*>(pLast->GetUserData());
    1281           0 :             bMove = true;
    1282             :         }
    1283           0 :         OUString sFilePassword;
    1284           0 :         sal_uLong nEntryCount = GetEntryCount();
    1285           0 :         const OUString* pFileNames = _rFiles.getConstArray();
    1286           0 :         SwWrtShell& rSh = GetParentWindow()->GetCreateView()->GetWrtShell();
    1287           0 :         rSh.StartAction();
    1288             :         // after insertion of the first new content the 'pCont' parameter becomes invalid
    1289             :         // find the index of the 'anchor' content to always use a current anchor content
    1290           0 :         size_t nAnchorContent = pSwGlblDocContents->size() - 1;
    1291           0 :         if ( !bMove )
    1292             :         {
    1293           0 :             for (size_t nContent = 0; nContent < pSwGlblDocContents->size();
    1294             :                     ++nContent)
    1295             :             {
    1296           0 :                 if( *_pContent == *(*pSwGlblDocContents)[ nContent ] )
    1297             :                 {
    1298           0 :                     nAnchorContent = nContent;
    1299           0 :                     break;
    1300             :                 }
    1301             :             }
    1302             :         }
    1303           0 :         SwGlblDocContents aTempContents;
    1304           0 :         for ( sal_Int32 nFile = 0; nFile < nFiles; ++nFile )
    1305             :         {
    1306             :             //update the global document content after each inserted document
    1307           0 :             rSh.GetGlobalDocContent(aTempContents);
    1308           0 :             SwGlblDocContent* pAnchorContent = 0;
    1309             :             OSL_ENSURE(aTempContents.size() > (nAnchorContent + nFile), "invalid anchor content -> last insertion failed");
    1310           0 :             if ( aTempContents.size() > (nAnchorContent + nFile) )
    1311           0 :                 pAnchorContent = aTempContents[nAnchorContent + nFile];
    1312             :             else
    1313           0 :                 pAnchorContent = aTempContents.back();
    1314           0 :             OUString sFileName(pFileNames[nFile]);
    1315           0 :             INetURLObject aFileUrl;
    1316           0 :             aFileUrl.SetSmartURL( sFileName );
    1317             :             OUString sSectionName(aFileUrl.GetLastName(
    1318           0 :                 INetURLObject::DECODE_UNAMBIGUOUS).getToken(0, sfx2::cTokenSeparator));
    1319           0 :             sal_uInt16 nSectCount = rSh.GetSectionFormatCount();
    1320           0 :             OUString sTempSectionName(sSectionName);
    1321           0 :             sal_uInt16 nAddNumber = 0;
    1322           0 :             sal_uInt16 nCount = 0;
    1323             :             // if applicable: add index if the range name is already in use.
    1324           0 :             while ( nCount < nSectCount )
    1325             :             {
    1326           0 :                 const SwSectionFormat& rFormat = rSh.GetSectionFormat(nCount);
    1327           0 :                 if ((rFormat.GetSection()->GetSectionName() == sTempSectionName)
    1328           0 :                     && rFormat.IsInNodesArr())
    1329             :                 {
    1330           0 :                     nCount = 0;
    1331           0 :                     nAddNumber++;
    1332           0 :                     sTempSectionName = sSectionName + ":" + OUString::number( nAddNumber );
    1333             :                 }
    1334             :                 else
    1335           0 :                     nCount++;
    1336             :             }
    1337             : 
    1338           0 :             if ( nAddNumber )
    1339           0 :                 sSectionName = sTempSectionName;
    1340             : 
    1341           0 :             SwSectionData aSectionData(CONTENT_SECTION, sSectionName);
    1342           0 :             aSectionData.SetProtectFlag(true);
    1343           0 :             aSectionData.SetHidden(false);
    1344             : 
    1345           0 :             aSectionData.SetLinkFileName(sFileName);
    1346           0 :             aSectionData.SetType(FILE_LINK_SECTION);
    1347           0 :             aSectionData.SetLinkFilePassword( sFilePassword );
    1348             : 
    1349           0 :             rSh.InsertGlobalDocContent( *pAnchorContent, aSectionData );
    1350           0 :         }
    1351           0 :         if ( bMove )
    1352             :         {
    1353           0 :             Update( false );
    1354             :             rSh.MoveGlobalDocContent(
    1355           0 :                 *pSwGlblDocContents, nEntryCount, nEntryCount + nFiles, nEntryCount - nFiles );
    1356             :         }
    1357           0 :         rSh.EndAction();
    1358           0 :         Update( false );
    1359           0 :         Display();
    1360             :     }
    1361           0 : }
    1362             : 
    1363           0 : IMPL_LINK( SwGlobalTree, DialogClosedHdl, sfx2::FileDialogHelper*, _pFileDlg )
    1364             : {
    1365           0 :     Application::SetDefDialogParent( pDefParentWin );
    1366           0 :     if ( ERRCODE_NONE == _pFileDlg->GetError() )
    1367             :     {
    1368           0 :         boost::scoped_ptr<SfxMediumList> pMedList(pDocInserter->CreateMediumList());
    1369           0 :         if ( pMedList )
    1370             :         {
    1371           0 :             Sequence< OUString >aFileNames( pMedList->size() );
    1372           0 :             OUString* pFileNames = aFileNames.getArray();
    1373           0 :             sal_Int32 nPos = 0;
    1374           0 :             for ( size_t i = 0, n = pMedList->size(); i < n; ++i )
    1375             :             {
    1376           0 :                 SfxMedium* pMed = pMedList->at( i );
    1377           0 :                 OUString sFileName = pMed->GetURLObject().GetMainURL( INetURLObject::NO_DECODE );
    1378           0 :                 sFileName += OUString(sfx2::cTokenSeparator);
    1379           0 :                 sFileName += pMed->GetFilter()->GetFilterName();
    1380           0 :                 sFileName += OUString(sfx2::cTokenSeparator);
    1381           0 :                 pFileNames[nPos++] = sFileName;
    1382           0 :             }
    1383           0 :             pMedList.reset();
    1384           0 :             InsertRegion( pDocContent, aFileNames );
    1385           0 :             DELETEZ( pDocContent );
    1386           0 :         }
    1387             :     }
    1388           0 :     return 0;
    1389         177 : }
    1390             : 
    1391             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11