LCOV - code coverage report
Current view: top level - sw/source/uibase/utlui - navipi.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 288 753 38.2 %
Date: 2014-11-03 Functions: 20 62 32.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 <string>
      21             : #include <comphelper/string.hxx>
      22             : #include <svl/urlbmk.hxx>
      23             : #include <svl/stritem.hxx>
      24             : #include <vcl/graphicfilter.hxx>
      25             : #include <svl/urihelper.hxx>
      26             : #include <sot/formats.hxx>
      27             : #include <sot/filelist.hxx>
      28             : #include <sfx2/event.hxx>
      29             : #include <sfx2/imgmgr.hxx>
      30             : #include <sfx2/dispatch.hxx>
      31             : #include <sfx2/dockwin.hxx>
      32             : #include <vcl/toolbox.hxx>
      33             : #include <vcl/settings.hxx>
      34             : #include <swtypes.hxx>
      35             : #include <swmodule.hxx>
      36             : #include <view.hxx>
      37             : #include <navicfg.hxx>
      38             : #include <wrtsh.hxx>
      39             : #include <docsh.hxx>
      40             : #include <actctrl.hxx>
      41             : #include <IMark.hxx>
      42             : #include <navipi.hxx>
      43             : #include <content.hxx>
      44             : #include <workctrl.hxx>
      45             : #include <section.hxx>
      46             : #include <edtwin.hxx>
      47             : #include <sfx2/app.hxx>
      48             : #include <cmdid.h>
      49             : #include <helpid.h>
      50             : #include <ribbar.hrc>
      51             : #include <navipi.hrc>
      52             : #include <utlui.hrc>
      53             : 
      54             : #include "access.hrc"
      55             : 
      56             : #include <unomid.h>
      57             : #include <boost/scoped_ptr.hpp>
      58             : 
      59             : #define PAGE_CHANGE_TIMEOUT 1000
      60             : 
      61             : using namespace ::com::sun::star::uno;
      62             : using namespace ::com::sun::star::frame;
      63             : 
      64         208 : SFX_IMPL_CHILDWINDOW_CONTEXT( SwNavigationChild, SID_NAVIGATOR, SwView )
      65             : 
      66             : // Filter the control characters out of the Outline-Entry
      67             : 
      68           0 : OUString SwNavigationPI::CleanEntry(const OUString& rEntry)
      69             : {
      70           0 :     if (rEntry.isEmpty())
      71           0 :         return rEntry;
      72             : 
      73           0 :     OUStringBuffer aEntry(rEntry);
      74           0 :     for (sal_Int32 i = 0; i < rEntry.getLength(); ++i)
      75           0 :         if(aEntry[i] == 10 || aEntry[i] == 9)
      76           0 :             aEntry[i] = 0x20;
      77             : 
      78           0 :     return aEntry.makeStringAndClear();
      79             : }
      80             : 
      81             : // Execution of the drag operation with and without the children.
      82             : 
      83           0 : void SwNavigationPI::MoveOutline(sal_uInt16 nSource, sal_uInt16 nTarget,
      84             :                                                     bool bWithChildren)
      85             : {
      86           0 :     SwView *pView = GetCreateView();
      87           0 :     SwWrtShell &rSh = pView->GetWrtShell();
      88           0 :     if(nTarget < nSource || nTarget == USHRT_MAX)
      89           0 :         nTarget ++;
      90           0 :     if ( rSh.IsOutlineMovable( nSource ))
      91             :     {
      92             : 
      93           0 :         short nMove = nTarget-nSource; //( nDir<0 ) ? 1 : 0 ;
      94           0 :         rSh.GotoOutline(nSource);
      95           0 :         if (bWithChildren)
      96           0 :             rSh.MakeOutlineSel(nSource, nSource, true);
      97             :         // While moving, the selected children does not counting.
      98           0 :         const sal_uInt16 nLastOutlinePos = rSh.GetOutlinePos(MAXLEVEL);
      99           0 :         if(bWithChildren && nMove > 1 &&
     100             :                 nLastOutlinePos < nTarget)
     101             :         {
     102           0 :             if(!rSh.IsCrsrPtAtEnd())
     103           0 :                 rSh.SwapPam();
     104           0 :             nMove -= nLastOutlinePos - nSource;
     105             :         }
     106           0 :         if(!bWithChildren || nMove < 1 || nLastOutlinePos < nTarget )
     107           0 :             rSh.MoveOutlinePara( nMove );
     108           0 :         rSh.ClearMark();
     109           0 :         rSh.GotoOutline( nSource + nMove);
     110           0 :         FillBox();
     111             :     }
     112             : 
     113           0 : }
     114             : 
     115             : // After goto cancel the status frame selection
     116             : 
     117           0 : static void lcl_UnSelectFrm(SwWrtShell *pSh)
     118             : {
     119           0 :     if (pSh->IsFrmSelected())
     120             :     {
     121           0 :         pSh->UnSelectFrm();
     122           0 :         pSh->LeaveSelFrmMode();
     123             :     }
     124           0 : }
     125             : 
     126             : // Select the document view
     127             : 
     128           0 : IMPL_LINK( SwNavigationPI, DocListBoxSelectHdl, ListBox *, pBox )
     129             : {
     130           0 :     int nEntryIdx = pBox->GetSelectEntryPos();
     131             :     SwView *pView ;
     132           0 :     pView = SwModule::GetFirstView();
     133           0 :     while (nEntryIdx-- && pView)
     134             :     {
     135           0 :         pView = SwModule::GetNextView(pView);
     136             :     }
     137           0 :     if(!pView)
     138             :     {
     139             :         nEntryIdx == 0 ?
     140           0 :             aContentTree.ShowHiddenShell():
     141           0 :                 aContentTree.ShowActualView();
     142             : 
     143             :     }
     144             :     else
     145             :     {
     146           0 :         aContentTree.SetConstantShell(pView->GetWrtShellPtr());
     147             :     }
     148           0 :     return 0;
     149             : }
     150             : 
     151             : // Filling of the list box for outline view or documents
     152             : // The PI will be set to full size
     153             : 
     154           0 : void SwNavigationPI::FillBox()
     155             : {
     156           0 :     if(pContentWrtShell)
     157             :     {
     158           0 :         aContentTree.SetHiddenShell( pContentWrtShell );
     159           0 :         aContentTree.Display(  false );
     160             :     }
     161             :     else
     162             :     {
     163           0 :         SwView *pView = GetCreateView();
     164           0 :         if(!pView)
     165             :         {
     166           0 :             aContentTree.SetActiveShell(0);
     167             :         }
     168           0 :         else if( pView != pActContView)
     169             :         {
     170           0 :             SwWrtShell* pWrtShell = pView->GetWrtShellPtr();
     171           0 :             aContentTree.SetActiveShell(pWrtShell);
     172             :         }
     173             :         else
     174           0 :             aContentTree.Display( true );
     175           0 :         pActContView = pView;
     176             :     }
     177           0 : }
     178             : 
     179         120 : void SwNavigationPI::UsePage(SwWrtShell *pSh)
     180             : {
     181         120 :     if (!pSh)
     182             :     {
     183         120 :         SwView *pView = GetCreateView();
     184         120 :         pSh = pView ? &pView->GetWrtShell() : 0;
     185         120 :         GetPageEdit().SetValue(1);
     186             :     }
     187         120 :     if (pSh)
     188             :     {
     189           2 :         const sal_uInt16 nPageCnt = pSh->GetPageCnt();
     190             :         sal_uInt16 nPhyPage, nVirPage;
     191           2 :         pSh->GetPageNum(nPhyPage, nVirPage);
     192             : 
     193           2 :         GetPageEdit().SetMax(nPageCnt);
     194           2 :         GetPageEdit().SetLast(nPageCnt);
     195           2 :         GetPageEdit().SetValue(nPhyPage);
     196             :     }
     197         120 : }
     198             : 
     199             : // Select handler of the toolboxes
     200             : 
     201           0 : IMPL_LINK( SwNavigationPI, ToolBoxSelectHdl, ToolBox *, pBox )
     202             : {
     203           0 :     const sal_uInt16 nCurrItemId = pBox->GetCurItemId();
     204           0 :     SwView *pView = GetCreateView();
     205           0 :     if (!pView)
     206           0 :         return 1;
     207           0 :     SwWrtShell &rSh = pView->GetWrtShell();
     208             :     // Get MouseModifier for Outline-Move
     209             : 
     210             :     // Standard: sublevels are taken
     211             :     // do not take sublevels with Ctrl
     212           0 :     bool bOutlineWithChildren  = ( KEY_MOD1 != pBox->GetModifier());
     213           0 :     int nFuncId = 0;
     214           0 :     bool bFocusToDoc = false;
     215           0 :     switch (nCurrItemId)
     216             :     {
     217             :         case FN_UP:
     218             :         case FN_DOWN:
     219             :         {
     220             :             // #i75416# move the execution of the search to an asynchronously called static link
     221           0 :             bool* pbNext = new bool( FN_DOWN == nCurrItemId );
     222           0 :             Application::PostUserEvent( STATIC_LINK(pView, SwView, MoveNavigationHdl), pbNext );
     223             :         }
     224           0 :         break;
     225             :         case FN_SHOW_ROOT:
     226             :         {
     227           0 :             aContentTree.ToggleToRoot();
     228             :         }
     229           0 :         break;
     230             :         case FN_SHOW_CONTENT_BOX:
     231             :         case FN_SELECT_CONTENT:
     232           0 :             if(pContextWin!=NULL && pContextWin->GetFloatingWindow()!=NULL)
     233             :             {
     234           0 :                 if(_IsZoomedIn() )
     235             :                 {
     236           0 :                     _ZoomOut();
     237             :                 }
     238             :                 else
     239             :                 {
     240           0 :                     _ZoomIn();
     241             :                 }
     242             :             }
     243           0 :             return sal_True;
     244             :         // Functions that will trigger a direct action.
     245             : 
     246             :         case FN_SELECT_FOOTER:
     247             :         {
     248           0 :             rSh.MoveCrsr();
     249           0 :             const sal_uInt16 eType = rSh.GetFrmType(0,false);
     250           0 :             if (eType & FRMTYPE_FOOTER)
     251             :             {
     252           0 :                 if (rSh.EndPg())
     253           0 :                     nFuncId = FN_END_OF_PAGE;
     254             :             }
     255           0 :             else if (rSh.GotoFooterTxt())
     256           0 :                 nFuncId = FN_TO_FOOTER;
     257           0 :             bFocusToDoc = true;
     258             :         }
     259           0 :         break;
     260             :         case FN_SELECT_HEADER:
     261             :         {
     262           0 :             rSh.MoveCrsr();
     263           0 :             const sal_uInt16 eType = rSh.GetFrmType(0,false);
     264           0 :             if (eType & FRMTYPE_HEADER)
     265             :             {
     266           0 :                 if (rSh.SttPg())
     267           0 :                     nFuncId = FN_START_OF_PAGE;
     268             :             }
     269           0 :             else if (rSh.GotoHeaderTxt())
     270           0 :                 nFuncId = FN_TO_HEADER;
     271           0 :             bFocusToDoc = true;
     272             :         }
     273           0 :         break;
     274             :         case FN_SELECT_FOOTNOTE:
     275             :         {
     276           0 :             rSh.MoveCrsr();
     277           0 :             const sal_uInt16 eFrmType = rSh.GetFrmType(0,false);
     278             :                 // Jump from the footnote to the anchor.
     279           0 :             if (eFrmType & FRMTYPE_FOOTNOTE)
     280             :             {
     281           0 :                 if (rSh.GotoFtnAnchor())
     282           0 :                     nFuncId = FN_FOOTNOTE_TO_ANCHOR;
     283             :             }
     284             :                 // Otherwise, jump to the first footnote text;
     285             :                 // go to the next footnote if this is not possible;
     286             :                 // if this is also not possible got to the footnote before.
     287             :             else
     288             :             {
     289           0 :                 if (rSh.GotoFtnTxt())
     290           0 :                     nFuncId = FN_FOOTNOTE_TO_ANCHOR;
     291           0 :                 else if (rSh.GotoNextFtnAnchor())
     292           0 :                     nFuncId = FN_NEXT_FOOTNOTE;
     293           0 :                 else if (rSh.GotoPrevFtnAnchor())
     294           0 :                     nFuncId = FN_PREV_FOOTNOTE;
     295             :             }
     296           0 :             bFocusToDoc = true;
     297             :         }
     298           0 :         break;
     299             : 
     300             :         case FN_SELECT_SET_AUTO_BOOKMARK:
     301           0 :             MakeMark();
     302           0 :         break;
     303             :         case FN_ITEM_DOWN:
     304             :         case FN_ITEM_UP:
     305             :         case FN_ITEM_LEFT:
     306             :         case FN_ITEM_RIGHT:
     307             :         case FN_GLOBAL_EDIT:
     308             :         {
     309           0 :             if(IsGlobalMode())
     310           0 :                 aGlobalTree.ExecCommand(nCurrItemId);
     311             :             else
     312           0 :                 aContentTree.ExecCommand(nCurrItemId, bOutlineWithChildren);
     313             :         }
     314           0 :         break;
     315             :         case FN_GLOBAL_SWITCH:
     316             :         {
     317           0 :             ToggleTree();
     318           0 :             pConfig->SetGlobalActive(IsGlobalMode());
     319             :         }
     320           0 :         break;
     321             :         case FN_GLOBAL_SAVE_CONTENT:
     322             :         {
     323           0 :             bool bSave = rSh.IsGlblDocSaveLinks();
     324           0 :             rSh.SetGlblDocSaveLinks( !bSave );
     325           0 :             pBox->CheckItem(FN_GLOBAL_SAVE_CONTENT, !bSave );
     326             :         }
     327           0 :         break;
     328             :     }
     329           0 :     if (nFuncId)
     330             :     {
     331           0 :         lcl_UnSelectFrm(&rSh);
     332             :     }
     333           0 :     if(bFocusToDoc)
     334           0 :         pView->GetEditWin().GrabFocus();
     335           0 :     return sal_True;
     336             : }
     337             : 
     338             : // Click handler of the toolboxes
     339             : 
     340           0 : IMPL_LINK( SwNavigationPI, ToolBoxClickHdl, ToolBox *, pBox )
     341             : {
     342           0 :     const sal_uInt16 nCurrItemId = pBox->GetCurItemId();
     343           0 :     switch (nCurrItemId)
     344             :     {
     345             :         case FN_GLOBAL_UPDATE:
     346             :         case FN_GLOBAL_OPEN:
     347             :         {
     348           0 :             aGlobalTree.TbxMenuHdl(nCurrItemId, pBox);
     349             :         }
     350           0 :         break;
     351             :     }
     352             : 
     353           0 :     return sal_True;
     354             : }
     355             : 
     356           0 : IMPL_LINK( SwNavigationPI, ToolBoxDropdownClickHdl, ToolBox*, pBox )
     357             : {
     358           0 :     const sal_uInt16 nCurrItemId = pBox->GetCurItemId();
     359           0 :     switch (nCurrItemId)
     360             :     {
     361             :         case FN_CREATE_NAVIGATION:
     362             :         {
     363           0 :             CreateNavigationTool(pBox->GetItemRect(FN_CREATE_NAVIGATION), true, this);
     364             :         }
     365           0 :         break;
     366             : 
     367             :         case FN_DROP_REGION:
     368             :         {
     369             :             static const char* aHIDs[] =
     370             :             {
     371             :                 HID_NAVI_DRAG_HYP,
     372             :                 HID_NAVI_DRAG_LINK,
     373             :                 HID_NAVI_DRAG_COPY,
     374             :             };
     375           0 :             boost::scoped_ptr<PopupMenu> pMenu(new PopupMenu);
     376           0 :             for (sal_uInt16 i = 0; i <= REGION_MODE_EMBEDDED; i++)
     377             :             {
     378           0 :                 pMenu->InsertItem( i + 1, aContextArr[i] );
     379           0 :                 pMenu->SetHelpId(i + 1, aHIDs[i]);
     380             :             }
     381           0 :             pMenu->CheckItem( nRegionMode + 1 );
     382           0 :             pMenu->SetSelectHdl(LINK(this, SwNavigationPI, MenuSelectHdl));
     383           0 :             pBox->SetItemDown( nCurrItemId, true );
     384             :             pMenu->Execute( pBox,
     385             :                     pBox->GetItemRect(FN_DROP_REGION),
     386           0 :                     POPUPMENU_EXECUTE_DOWN );
     387           0 :             pBox->SetItemDown( nCurrItemId, false );
     388           0 :             pBox->EndSelection();
     389           0 :             pMenu.reset();
     390           0 :             pBox->Invalidate();
     391             :         }
     392           0 :         break;
     393             :         case FN_OUTLINE_LEVEL:
     394             :         {
     395           0 :             boost::scoped_ptr<PopupMenu> pMenu(new PopupMenu);
     396           0 :             for (sal_uInt16 i = 101; i <= 100 + MAXLEVEL; i++)
     397             :             {
     398           0 :                 pMenu->InsertItem( i, OUString::number(i - 100) );
     399           0 :                 pMenu->SetHelpId( i, HID_NAVI_OUTLINES );
     400             :             }
     401           0 :             pMenu->CheckItem( aContentTree.GetOutlineLevel() + 100 );
     402           0 :             pMenu->SetSelectHdl(LINK(this, SwNavigationPI, MenuSelectHdl));
     403           0 :             pBox->SetItemDown( nCurrItemId, true );
     404             :             pMenu->Execute( pBox,
     405             :                     pBox->GetItemRect(FN_OUTLINE_LEVEL),
     406           0 :                     POPUPMENU_EXECUTE_DOWN );
     407           0 :             pBox->SetItemDown( nCurrItemId, false );
     408           0 :             pMenu.reset();
     409           0 :             pBox->EndSelection();
     410           0 :             pBox->Invalidate();
     411             :         }
     412           0 :         break;
     413             :     }
     414           0 :     return sal_True;
     415             : }
     416             : 
     417         120 : SwNavHelpToolBox::SwNavHelpToolBox(SwNavigationPI* pParent, const ResId &rResId) :
     418         120 :             SwHelpToolBox(pParent, rResId)
     419         120 : {}
     420             : 
     421           0 : void SwNavHelpToolBox::MouseButtonDown(const MouseEvent &rEvt)
     422             : {
     423           0 :     if(rEvt.GetButtons() == MOUSE_LEFT &&
     424           0 :             FN_CREATE_NAVIGATION == GetItemId(rEvt.GetPosPixel()))
     425             :     {
     426           0 :         ((SwNavigationPI*)GetParent())->CreateNavigationTool(GetItemRect(FN_CREATE_NAVIGATION), false, this);
     427             :     }
     428             :     else
     429           0 :         SwHelpToolBox::MouseButtonDown(rEvt);
     430           0 : }
     431             : 
     432           0 : void SwNavigationPI::CreateNavigationTool(const Rectangle& rRect, bool bSetFocus, vcl::Window *pParent)
     433             : {
     434           0 :     Reference< XFrame > xFrame = GetCreateView()->GetViewFrame()->GetFrame().GetFrameInterface();
     435             :     SwScrollNaviPopup* pPopup = new
     436           0 :         SwScrollNaviPopup(FN_SCROLL_NAVIGATION, xFrame, pParent);
     437             : 
     438           0 :     Rectangle aRect(rRect);
     439           0 :     Point aT1 = aRect.TopLeft();
     440           0 :     aT1 = pPopup->GetParent()->OutputToScreenPixel(pPopup->GetParent()->AbsoluteScreenToOutputPixel(aContentToolBox.OutputToAbsoluteScreenPixel(aT1)));
     441           0 :     aRect.SetPos(aT1);
     442           0 :     pPopup->StartPopupMode(aRect, FLOATWIN_POPUPMODE_RIGHT|FLOATWIN_POPUPMODE_ALLOWTEAROFF);
     443           0 :     SetPopupWindow( pPopup );
     444           0 :     if(bSetFocus)
     445             :     {
     446           0 :         pPopup->EndPopupMode(FLOATWIN_POPUPMODEEND_TEAROFF);
     447           0 :         pPopup->GrabFocus();
     448           0 :     }
     449           0 : }
     450             : 
     451           0 : void  SwNavHelpToolBox::RequestHelp( const HelpEvent& rHEvt )
     452             : {
     453           0 :     const sal_uInt16 nItemId = GetItemId(ScreenToOutputPixel(rHEvt.GetMousePosPixel()));
     454           0 :     if( FN_UP == nItemId || FN_DOWN == nItemId )
     455             :     {
     456           0 :         SetItemText(nItemId, SwScrollNaviPopup::GetQuickHelpText((FN_DOWN == nItemId)));
     457             :     }
     458           0 :     SwHelpToolBox::RequestHelp(rHEvt);
     459           0 : }
     460             : 
     461             : // Action-Handler Edit:
     462             : // Switches to the page if the structure view is not turned on.
     463             : 
     464           0 : IMPL_LINK( SwNavigationPI, EditAction, NumEditAction *, pEdit )
     465             : {
     466           0 :     SwView *pView = GetCreateView();
     467           0 :     if (pView)
     468             :     {
     469           0 :         if(aPageChgTimer.IsActive())
     470           0 :             aPageChgTimer.Stop();
     471           0 :         pCreateView->GetWrtShell().GotoPage((sal_uInt16)pEdit->GetValue(), true);
     472           0 :         pCreateView->GetEditWin().GrabFocus();
     473           0 :         pCreateView->GetViewFrame()->GetBindings().Invalidate(FN_STAT_PAGE);
     474             :     }
     475           0 :     return 0;
     476             : }
     477             : 
     478             : // If the page can be set here, the maximum is set.
     479             : 
     480           0 : IMPL_LINK( SwNavigationPI, EditGetFocus, NumEditAction *, pEdit )
     481             : {
     482           0 :     SwView *pView = GetCreateView();
     483           0 :     if (!pView)
     484           0 :         return 0;
     485           0 :     SwWrtShell &rSh = pView->GetWrtShell();
     486             : 
     487           0 :     const sal_uInt16 nPageCnt = rSh.GetPageCnt();
     488           0 :     pEdit->SetMax(nPageCnt);
     489           0 :     pEdit->SetLast(nPageCnt);
     490           0 :     return 0;
     491             : }
     492             : 
     493           0 : bool SwNavigationPI::Close()
     494             : {
     495           0 :     SfxViewFrame* pVFrame = pCreateView->GetViewFrame();
     496           0 :     pVFrame->GetBindings().Invalidate(SID_NAVIGATOR);
     497           0 :     pVFrame->GetDispatcher()->Execute(SID_NAVIGATOR);
     498           0 :     return true;
     499             : }
     500             : 
     501             : // Setting of an automatic mark
     502             : 
     503           0 : void SwNavigationPI::MakeMark()
     504             : {
     505           0 :     SwView *pView = GetCreateView();
     506           0 :     if (!pView) return;
     507           0 :     SwWrtShell &rSh = pView->GetWrtShell();
     508           0 :     IDocumentMarkAccess* const pMarkAccess = rSh.getIDocumentMarkAccess();
     509             : 
     510             :     // collect and sort navigator reminder names
     511           0 :     ::std::vector< ::rtl::OUString > vNavMarkNames;
     512           0 :     for(IDocumentMarkAccess::const_iterator_t ppMark = pMarkAccess->getAllMarksBegin();
     513           0 :         ppMark != pMarkAccess->getAllMarksEnd();
     514             :         ++ppMark)
     515           0 :         if( IDocumentMarkAccess::GetType(**ppMark) == IDocumentMarkAccess::NAVIGATOR_REMINDER )
     516           0 :             vNavMarkNames.push_back(ppMark->get()->GetName());
     517           0 :     ::std::sort(vNavMarkNames.begin(), vNavMarkNames.end());
     518             : 
     519             :     // we are maxed out and delete one
     520             :     // nAutoMarkIdx rotates through the available MarkNames
     521             :     // this assumes that IDocumentMarkAccess generates Names in ascending order
     522           0 :     if(vNavMarkNames.size() == MAX_MARKS)
     523           0 :         pMarkAccess->deleteMark(pMarkAccess->findMark(vNavMarkNames[nAutoMarkIdx]));
     524             : 
     525           0 :     rSh.SetBookmark(vcl::KeyCode(), OUString(), OUString(), IDocumentMarkAccess::NAVIGATOR_REMINDER);
     526           0 :     SwView::SetActMark( nAutoMarkIdx );
     527             : 
     528           0 :     if(++nAutoMarkIdx == MAX_MARKS)
     529           0 :         nAutoMarkIdx = 0;
     530             : }
     531             : 
     532           0 : void SwNavigationPI::GotoPage()
     533             : {
     534           0 :     if (pContextWin && pContextWin->GetFloatingWindow() && pContextWin->GetFloatingWindow()->IsRollUp())
     535           0 :         _ZoomIn();
     536           0 :     if(IsGlobalMode())
     537           0 :         ToggleTree();
     538           0 :     UsePage(0);
     539           0 :     GetPageEdit().GrabFocus();
     540           0 : }
     541             : 
     542           0 : void SwNavigationPI::_ZoomOut()
     543             : {
     544           0 :     if (_IsZoomedIn())
     545             :     {
     546           0 :         FloatingWindow* pFloat = pContextWin!=NULL ? pContextWin->GetFloatingWindow() : NULL;
     547           0 :         bIsZoomedIn = false;
     548           0 :         Size aSz(GetOutputSizePixel());
     549           0 :         aSz.Height() = nZoomOut;
     550           0 :         Size aMinOutSizePixel = ((SfxDockingWindow*)GetParent())->GetMinOutputSizePixel();
     551           0 :         ((SfxDockingWindow*)GetParent())->SetMinOutputSizePixel(Size(
     552           0 :                             aMinOutSizePixel.Width(),nZoomOutInit));
     553           0 :         if (pFloat != NULL)
     554           0 :             pFloat->SetOutputSizePixel(aSz);
     555           0 :         FillBox();
     556           0 :         if(IsGlobalMode())
     557             :         {
     558           0 :             aGlobalTree.ShowTree();
     559             :         }
     560             :         else
     561             :         {
     562           0 :             aContentTree.ShowTree();
     563           0 :             aDocListBox.Show();
     564             :         }
     565           0 :         SvTreeListEntry* pFirst = aContentTree.FirstSelected();
     566           0 :         if(pFirst)
     567           0 :             aContentTree.Select(pFirst, true); // Enable toolbox
     568           0 :         pConfig->SetSmall( false );
     569           0 :         aContentToolBox.CheckItem(FN_SHOW_CONTENT_BOX);
     570             :     }
     571           0 : }
     572             : 
     573           0 : void SwNavigationPI::_ZoomIn()
     574             : {
     575           0 :     if (pContextWin != NULL)
     576             :     {
     577           0 :         FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
     578           0 :         if (pFloat &&
     579           0 :             (!_IsZoomedIn() || ( pContextWin->GetFloatingWindow()->IsRollUp())))
     580             :         {
     581           0 :             aContentTree.HideTree();
     582           0 :             aDocListBox.Hide();
     583           0 :             aGlobalTree.HideTree();
     584           0 :             bIsZoomedIn = true;
     585           0 :             Size aSz(GetOutputSizePixel());
     586           0 :             if( aSz.Height() > nZoomIn )
     587           0 :                 nZoomOut = ( short ) aSz.Height();
     588             : 
     589           0 :             aSz.Height() = nZoomIn;
     590           0 :             Size aMinOutSizePixel = ((SfxDockingWindow*)GetParent())->GetMinOutputSizePixel();
     591           0 :             ((SfxDockingWindow*)GetParent())->SetMinOutputSizePixel(Size(
     592           0 :                     aMinOutSizePixel.Width(), aSz.Height()));
     593           0 :             pFloat->SetOutputSizePixel(aSz);
     594           0 :             SvTreeListEntry* pFirst = aContentTree.FirstSelected();
     595           0 :             if(pFirst)
     596           0 :                 aContentTree.Select(pFirst, true); // Enable toolbox
     597           0 :             pConfig->SetSmall( true );
     598           0 :             aContentToolBox.CheckItem(FN_SHOW_CONTENT_BOX, false);
     599             :         }
     600             :     }
     601           0 : }
     602             : 
     603         242 : void SwNavigationPI::Resize()
     604             : {
     605         242 :     vcl::Window* pParent = GetParent();
     606         242 :     if( !_IsZoomedIn() )
     607             :     {
     608         242 :         Size aNewSize (pParent->GetOutputSizePixel());
     609             : 
     610         242 :         SfxDockingWindow* pDockingParent = dynamic_cast<SfxDockingWindow*>(pParent);
     611         242 :         if (pDockingParent != NULL)
     612             :         {
     613         236 :             FloatingWindow* pFloat =  pDockingParent->GetFloatingWindow();
     614             :             //change the minimum width depending on the dock status
     615         236 :             Size aMinOutSizePixel = pDockingParent->GetMinOutputSizePixel();
     616         236 :             if( pFloat)
     617             :             {
     618           0 :                 aNewSize = pFloat->GetOutputSizePixel();
     619           0 :                 aMinOutSizePixel.Width() = nWishWidth;
     620           0 :                 aMinOutSizePixel.Height() = _IsZoomedIn() ? nZoomIn : nZoomOutInit;
     621             :             }
     622             :             else
     623             :             {
     624         236 :                 aMinOutSizePixel.Width() = 0;
     625         236 :                 aMinOutSizePixel.Height() = 0;
     626             :             }
     627         236 :             pDockingParent->SetMinOutputSizePixel(aMinOutSizePixel);
     628             :         }
     629             : 
     630         242 :         const Point aPos = aContentTree.GetPosPixel();
     631         242 :         Point aLBPos = aDocListBox.GetPosPixel();
     632         242 :         long nDist = aPos.X();
     633         242 :         aNewSize.Height() -= (aPos.Y() + aPos.X() + nDocLBIniHeight + nDist);
     634         242 :         aNewSize.Width() -= 2 * nDist;
     635         242 :         aLBPos.Y() = aPos.Y() + aNewSize.Height() + nDist;
     636         242 :         aDocListBox.Show(!aGlobalTree.IsVisible() && aLBPos.Y() > aPos.Y() );
     637             : 
     638         242 :         Size aDocLBSz = aDocListBox.GetSizePixel();
     639         242 :         aDocLBSz.Width() = aNewSize.Width();
     640         242 :         if(aNewSize.Height() < 0)
     641           4 :             aDocLBSz.Height() = 0;
     642             :         else
     643         238 :             aDocLBSz.Height() = nDocLBIniHeight;
     644         242 :         aContentTree.SetSizePixel(aNewSize);
     645             :         // GlobalTree starts on to the top and goes all the way down.
     646         242 :         aNewSize.Height() += (nDist + nDocLBIniHeight + aPos.Y() - aGlobalTree.GetPosPixel().Y());
     647         242 :         aGlobalTree.SetSizePixel(aNewSize);
     648         484 :         aDocListBox.setPosSizePixel( aLBPos.X(), aLBPos.Y(),
     649         484 :             aDocLBSz.Width(), aDocLBSz.Height(),
     650         968 :             WINDOW_POSSIZE_X|WINDOW_POSSIZE_Y|WINDOW_POSSIZE_WIDTH);
     651             :     }
     652         242 : }
     653             : 
     654         120 : SwNavigationPI::SwNavigationPI( SfxBindings* _pBindings,
     655             :                                 SfxChildWindowContext* pCw,
     656             :                                 vcl::Window* pParent) :
     657             : 
     658             :     Window( pParent, SW_RES(DLG_NAVIGATION_PI)),
     659             :     SfxControllerItem( SID_DOCFULLNAME, *_pBindings ),
     660             : 
     661             :     aContentToolBox(this, SW_RES(TB_CONTENT)),
     662             :     aGlobalToolBox(this, SW_RES(TB_GLOBAL)),
     663             :     aContentImageList(SW_RES(IL_CONTENT)),
     664             :     aContentTree(this, SW_RES(TL_CONTENT)),
     665             :     aGlobalTree(this, SW_RES(TL_GLOBAL)),
     666             :     aDocListBox(this, SW_RES(LB_DOCS)),
     667             : 
     668             :     pxObjectShell(0),
     669             :     pContentView(0),
     670             :     pContentWrtShell(0),
     671             :     pActContView(0),
     672             :     pCreateView(0),
     673             :     pPopupWindow(0),
     674             :     pFloatingWindow(0),
     675             : 
     676             :     pContextWin(pCw),
     677             : 
     678         120 :     pConfig(SW_MOD()->GetNavigationConfig()),
     679             :     rBindings(*_pBindings),
     680             : 
     681             :     nWishWidth(0),
     682             :     nAutoMarkIdx(1),
     683             :     nRegionMode(REGION_MODE_NONE),
     684             : 
     685             :     bSmallMode(false),
     686             :     bIsZoomedIn(false),
     687             :     bPageCtrlsVisible(false),
     688         240 :     bGlobalMode(false)
     689             : {
     690         120 :     GetCreateView();
     691         120 :     InitImageList();
     692             : 
     693         120 :     aContentToolBox.SetHelpId(HID_NAVIGATOR_TOOLBOX );
     694         120 :     aGlobalToolBox.SetHelpId(HID_NAVIGATOR_GLOBAL_TOOLBOX);
     695         120 :     aDocListBox.SetHelpId(HID_NAVIGATOR_LISTBOX );
     696         120 :     aDocListBox.SetDropDownLineCount(9);
     697             : 
     698         120 :     nDocLBIniHeight = aDocListBox.GetSizePixel().Height();
     699         120 :     nZoomOutInit = nZoomOut = Resource::ReadShortRes();
     700             : 
     701             :     // Insert the numeric field in the toolbox.
     702             :     NumEditAction* pEdit = new NumEditAction(
     703         120 :                     &aContentToolBox, SW_RES(NF_PAGE ));
     704         120 :     pEdit->SetActionHdl(LINK(this, SwNavigationPI, EditAction));
     705         120 :     pEdit->SetGetFocusHdl(LINK(this, SwNavigationPI, EditGetFocus));
     706         120 :     pEdit->SetAccessibleName(pEdit->GetQuickHelpText());
     707         120 :     pEdit->SetUpHdl(LINK(this, SwNavigationPI, PageEditModifyHdl));
     708         120 :     pEdit->SetDownHdl(LINK(this, SwNavigationPI, PageEditModifyHdl));
     709             : 
     710         120 :     bPageCtrlsVisible = true;
     711             : 
     712             :     // Double separators are not allowed, so you have to
     713             :     // determine the suitable size differently.
     714         120 :     Rectangle aFirstRect = aContentToolBox.GetItemRect(FN_SELECT_FOOTNOTE);
     715         120 :     Rectangle aSecondRect = aContentToolBox.GetItemRect(FN_SELECT_HEADER);
     716         240 :     Size aItemWinSize( aFirstRect.Left() - aSecondRect.Left(),
     717         360 :                        aFirstRect.Bottom() - aFirstRect.Top() );
     718         120 :     pEdit->SetSizePixel(aItemWinSize);
     719         120 :     aContentToolBox.InsertSeparator(4);
     720         120 :     aContentToolBox.InsertWindow( FN_PAGENUMBER, pEdit, ToolBoxItemBits::NONE, 4);
     721         120 :     aContentToolBox.InsertSeparator(4);
     722         120 :     aContentToolBox.SetHelpId(FN_PAGENUMBER, HID_NAVI_TBX16);
     723         120 :     aContentToolBox.ShowItem( FN_PAGENUMBER );
     724             : 
     725         480 :     for( sal_uInt16 i = 0; i <= REGION_MODE_EMBEDDED; i++  )
     726             :     {
     727         360 :         aContextArr[i] = SW_RESSTR(ST_HYPERLINK + i);
     728         360 :         aStatusArr[i] = SW_RESSTR(ST_STATUS_FIRST + i);
     729             :     }
     730         120 :     aStatusArr[3] = SW_RESSTR(ST_ACTIVE_VIEW);
     731         120 :     FreeResource();
     732             : 
     733         120 :     const Size& rOutSize =  GetOutputSizePixel();
     734             : 
     735         120 :     nZoomIn = (short)rOutSize.Height();
     736             : 
     737             :     // Make sure the toolbox has a size that fits all its contents
     738         120 :     Size aContentToolboxSize( aContentToolBox.CalcWindowSizePixel() );
     739         120 :     aContentToolBox.SetOutputSizePixel( aContentToolboxSize );
     740             : 
     741             :     // position listbox below toolbar and add some space
     742         120 :     long nListboxYPos = aContentToolBox.GetPosPixel().Y() + aContentToolboxSize.Height() + 4;
     743             : 
     744             :     // The left and right margins around the toolboxes should be equal.
     745         120 :     nWishWidth = aContentToolboxSize.Width();
     746         120 :     nWishWidth += 2 * aContentToolBox.GetPosPixel().X();
     747             : 
     748         120 :     DockingWindow* pDockingParent = dynamic_cast<DockingWindow*>(pParent);
     749         120 :     if (pDockingParent != NULL)
     750             :     {
     751         118 :         FloatingWindow* pFloat =  pDockingParent->GetFloatingWindow();
     752         118 :         Size aMinSize(pFloat ? nWishWidth : 0, pFloat ? nZoomOutInit : 0);
     753         118 :         pDockingParent->SetMinOutputSizePixel(aMinSize);
     754         118 :         SetOutputSizePixel( Size( nWishWidth, nZoomOutInit));
     755             : 
     756         118 :         SfxDockingWindow* pSfxDockingParent = dynamic_cast<SfxDockingWindow*>(pParent);
     757         118 :         if (pSfxDockingParent != NULL)
     758             :         {
     759         118 :             Size aTmpParentSize(pSfxDockingParent->GetSizePixel());
     760         236 :             if (aTmpParentSize.Width() < aMinSize.Width()
     761         118 :                 || aTmpParentSize.Height() < aMinSize.Height())
     762             :             {
     763           0 :                 if (pSfxDockingParent->GetFloatingWindow()
     764           0 :                     && ! pSfxDockingParent->GetFloatingWindow()->IsRollUp())
     765             :                 {
     766           0 :                     pSfxDockingParent->SetOutputSizePixel(aMinSize);
     767             :                 }
     768             :             }
     769             :         }
     770             :     }
     771             : 
     772         120 :     aContentTree.setPosSizePixel( 0, nListboxYPos, 0, 0, WINDOW_POSSIZE_Y );
     773         120 :     aContentTree.SetStyle( aContentTree.GetStyle()|WB_HASBUTTONS|WB_HASBUTTONSATROOT|
     774         120 :                             WB_CLIPCHILDREN|WB_HSCROLL|WB_FORCE_MAKEVISIBLE );
     775         120 :     aContentTree.SetSpaceBetweenEntries(3);
     776         120 :     aContentTree.SetSelectionMode( SINGLE_SELECTION );
     777             :     aContentTree.SetDragDropMode(   SV_DRAGDROP_CTRL_MOVE |
     778             :                                     SV_DRAGDROP_CTRL_COPY |
     779         120 :                                     SV_DRAGDROP_ENABLE_TOP );
     780         120 :     aContentTree.EnableAsyncDrag(true);
     781         120 :     aContentTree.ShowTree();
     782         120 :     aContentToolBox.CheckItem(FN_SHOW_CONTENT_BOX, true);
     783             : 
     784             : //  TreeListBox for global document
     785         120 :     aGlobalTree.setPosSizePixel( 0, nListboxYPos, 0, 0, WINDOW_POSSIZE_Y );
     786         120 :     aGlobalTree.SetSelectionMode( MULTIPLE_SELECTION );
     787         120 :     aGlobalTree.SetStyle( aGlobalTree.GetStyle()|WB_HASBUTTONS|WB_HASBUTTONSATROOT|
     788         120 :                                 WB_CLIPCHILDREN|WB_HSCROLL );
     789         120 :     Size aGlblSize(aGlobalToolBox.CalcWindowSizePixel());
     790         120 :     aGlobalToolBox.SetSizePixel(aGlblSize);
     791             : 
     792             : //  Handler
     793             : 
     794         120 :     Link aLk = LINK(this, SwNavigationPI, ToolBoxSelectHdl);
     795         120 :     aContentToolBox.SetSelectHdl( aLk );
     796         120 :     aGlobalToolBox.SetSelectHdl( aLk );
     797             :     aDocListBox.SetSelectHdl(LINK(this, SwNavigationPI,
     798         120 :                                                     DocListBoxSelectHdl));
     799         120 :     aContentToolBox.SetClickHdl( LINK(this, SwNavigationPI, ToolBoxClickHdl) );
     800         120 :     aContentToolBox.SetDropdownClickHdl( LINK(this, SwNavigationPI, ToolBoxDropdownClickHdl) );
     801         120 :     aGlobalToolBox.SetClickHdl( LINK(this, SwNavigationPI, ToolBoxClickHdl) );
     802         120 :     aGlobalToolBox.SetDropdownClickHdl( LINK(this, SwNavigationPI, ToolBoxDropdownClickHdl) );
     803         120 :     aGlobalToolBox.CheckItem(FN_GLOBAL_SWITCH, true);
     804             : 
     805         120 :     vcl::Font aFont(GetFont());
     806         120 :     aFont.SetWeight(WEIGHT_NORMAL);
     807         120 :     GetPageEdit().SetFont(aFont);
     808         120 :     aFont = aContentTree.GetFont();
     809         120 :     aFont.SetWeight(WEIGHT_NORMAL);
     810         120 :     aContentTree.SetFont(aFont);
     811         120 :     aGlobalTree.SetFont(aFont);
     812             : 
     813         120 :     StartListening(*SfxGetpApp());
     814         120 :     if ( pCreateView )
     815           2 :         StartListening(*pCreateView);
     816         120 :     SfxImageManager* pImgMan = SfxImageManager::GetImageManager( SW_MOD() );
     817         120 :     pImgMan->RegisterToolBox(&aContentToolBox, SFX_TOOLBOX_CHANGEOUTSTYLE);
     818         120 :     pImgMan->RegisterToolBox(&aGlobalToolBox, SFX_TOOLBOX_CHANGEOUTSTYLE);
     819             : 
     820         120 :     aContentToolBox.SetItemBits( FN_CREATE_NAVIGATION, aContentToolBox.GetItemBits( FN_CREATE_NAVIGATION ) | ToolBoxItemBits::DROPDOWNONLY );
     821         120 :     aContentToolBox.SetItemBits( FN_DROP_REGION, aContentToolBox.GetItemBits( FN_DROP_REGION ) | ToolBoxItemBits::DROPDOWNONLY );
     822         120 :     aContentToolBox.SetItemBits( FN_OUTLINE_LEVEL, aContentToolBox.GetItemBits( FN_OUTLINE_LEVEL ) | ToolBoxItemBits::DROPDOWNONLY );
     823             : 
     824         120 :     if(IsGlobalDoc())
     825             :     {
     826           0 :         SwView *pActView = GetCreateView();
     827             :         aGlobalToolBox.CheckItem(FN_GLOBAL_SAVE_CONTENT,
     828           0 :                     pActView->GetWrtShellPtr()->IsGlblDocSaveLinks());
     829           0 :         if(pConfig->IsGlobalActive())
     830           0 :             ToggleTree();
     831           0 :         aGlobalTree.GrabFocus();
     832             :     }
     833             :     else
     834         120 :         aContentTree.GrabFocus();
     835         120 :     UsePage(0);
     836         120 :     aPageChgTimer.SetTimeoutHdl(LINK(this, SwNavigationPI, ChangePageHdl));
     837         120 :     aPageChgTimer.SetTimeout(PAGE_CHANGE_TIMEOUT);
     838             : 
     839         120 :     aContentTree.SetAccessibleName(SW_RESSTR(STR_ACCESS_TL_CONTENT));
     840         120 :     aGlobalTree.SetAccessibleName(SW_RESSTR(STR_ACCESS_TL_GLOBAL));
     841         120 :     aDocListBox.SetAccessibleName(aStatusArr[3]);
     842             : 
     843         120 :     if (pContextWin == NULL)
     844             :     {
     845             :         // When the context window is missing then the navigator is
     846             :         // displayed in the sidebar.  While the navigator could change
     847             :         // its size, the sidebar can not, and the navigator would just
     848             :         // waste space.  Therefore hide this button.
     849           2 :         aContentToolBox.RemoveItem(aContentToolBox.GetItemPos(FN_SHOW_CONTENT_BOX));
     850         120 :     }
     851         120 : }
     852             : 
     853         360 : SwNavigationPI::~SwNavigationPI()
     854             : {
     855         120 :     if(IsGlobalDoc() && !IsGlobalMode())
     856             :     {
     857           0 :         SwView *pView = GetCreateView();
     858           0 :         SwWrtShell &rSh = pView->GetWrtShell();
     859           0 :         if( !rSh.IsAllProtect() )
     860           0 :             pView->GetDocShell()->SetReadOnlyUI(false);
     861             :     }
     862             : 
     863         120 :     EndListening(*SfxGetpApp());
     864             : 
     865         120 :     SfxImageManager* pImgMan = SfxImageManager::GetImageManager( SW_MOD() );
     866         120 :     pImgMan->ReleaseToolBox(&aContentToolBox);
     867         120 :     pImgMan->ReleaseToolBox(&aGlobalToolBox);
     868         120 :     delete aContentToolBox.GetItemWindow(FN_PAGENUMBER);
     869         120 :     aContentToolBox.Clear();
     870         120 :     if(pxObjectShell)
     871             :     {
     872           0 :         if(pxObjectShell->Is())
     873           0 :             (*pxObjectShell)->DoClose();
     874           0 :         delete pxObjectShell;
     875             :     }
     876         120 :     delete pPopupWindow;
     877         120 :     delete pFloatingWindow;
     878             : 
     879         120 :     if ( IsBound() )
     880         120 :         rBindings.Release(*this);
     881         240 : }
     882             : 
     883           0 : void SwNavigationPI::SetPopupWindow( SfxPopupWindow* pWindow )
     884             : {
     885           0 :     pPopupWindow = pWindow;
     886           0 :     pPopupWindow->SetPopupModeEndHdl( LINK( this, SwNavigationPI, PopupModeEndHdl ));
     887           0 :     pPopupWindow->SetDeleteLink_Impl( LINK( this, SwNavigationPI, ClosePopupWindow ));
     888           0 : }
     889             : 
     890           0 : IMPL_LINK_NOARG(SwNavigationPI, PopupModeEndHdl)
     891             : {
     892           0 :     if ( pPopupWindow->IsVisible() )
     893             :     {
     894             :         // Replace floating window with popup window and destroy
     895             :         // floating window instance.
     896           0 :         delete pFloatingWindow;
     897           0 :         pFloatingWindow = pPopupWindow;
     898           0 :         pPopupWindow    = 0;
     899             :     }
     900             :     else
     901             :     {
     902             :         // Popup window has been closed by the user. No replacement, instance
     903             :         // will destroy itself.
     904           0 :         pPopupWindow = 0;
     905             :     }
     906             : 
     907           0 :     return 1;
     908             : }
     909             : 
     910           0 : IMPL_LINK( SwNavigationPI, ClosePopupWindow, SfxPopupWindow *, pWindow )
     911             : {
     912           0 :     if ( pWindow == pFloatingWindow )
     913           0 :         pFloatingWindow = 0;
     914             :     else
     915           0 :         pPopupWindow = 0;
     916             : 
     917           0 :     return 1;
     918             : }
     919             : 
     920          62 : void SwNavigationPI::StateChanged( sal_uInt16 nSID, SfxItemState /*eState*/,
     921             :                                             const SfxPoolItem* /*pState*/ )
     922             : {
     923          62 :     if(nSID == SID_DOCFULLNAME)
     924             :     {
     925          62 :         SwView *pActView = GetCreateView();
     926          62 :         if(pActView)
     927             :         {
     928          62 :             SwWrtShell* pWrtShell = pActView->GetWrtShellPtr();
     929          62 :             aContentTree.SetActiveShell(pWrtShell);
     930          62 :             bool bGlobal = IsGlobalDoc();
     931          62 :             aContentToolBox.EnableItem(FN_GLOBAL_SWITCH, bGlobal);
     932         186 :             if( (!bGlobal && IsGlobalMode()) ||
     933         124 :                     (!IsGlobalMode() && pConfig->IsGlobalActive()) )
     934             :             {
     935          62 :                 ToggleTree();
     936             :             }
     937          62 :             if(bGlobal)
     938             :             {
     939           0 :                 aGlobalToolBox.CheckItem(FN_GLOBAL_SAVE_CONTENT, pWrtShell->IsGlblDocSaveLinks());
     940             :             }
     941             :         }
     942             :         else
     943             :         {
     944           0 :             aContentTree.SetActiveShell(0);
     945             :         }
     946          62 :         UpdateListBox();
     947             :     }
     948          62 : }
     949             : 
     950             : // Get the numeric field from the toolbox.
     951             : 
     952         246 : NumEditAction& SwNavigationPI::GetPageEdit()
     953             : {
     954         246 :     return *(NumEditAction*)aContentToolBox.GetItemWindow(FN_PAGENUMBER);
     955             : }
     956             : 
     957           0 : SfxChildAlignment SwNavigationPI::CheckAlignment
     958             :     (
     959             :         SfxChildAlignment eActAlign,
     960             :         SfxChildAlignment eAlign
     961             :     )
     962             : {
     963             : SfxChildAlignment eRetAlign;
     964             : 
     965           0 :     if(_IsZoomedIn())
     966           0 :         eRetAlign = SFX_ALIGN_NOALIGNMENT;
     967             :     else
     968           0 :         switch (eAlign)
     969             :         {
     970             :             case SFX_ALIGN_BOTTOM:
     971             :             case SFX_ALIGN_LOWESTBOTTOM:
     972             :             case SFX_ALIGN_HIGHESTBOTTOM:
     973           0 :                 eRetAlign = eActAlign;
     974           0 :                 break;
     975             : 
     976             :             case SFX_ALIGN_TOP:
     977             :             case SFX_ALIGN_HIGHESTTOP:
     978             :             case SFX_ALIGN_LOWESTTOP:
     979             :             case SFX_ALIGN_LEFT:
     980             :             case SFX_ALIGN_RIGHT:
     981             :             case SFX_ALIGN_FIRSTLEFT:
     982             :             case SFX_ALIGN_LASTLEFT:
     983             :             case SFX_ALIGN_FIRSTRIGHT:
     984             :             case SFX_ALIGN_LASTRIGHT:
     985           0 :                 eRetAlign = eAlign;
     986           0 :                 break;
     987             : 
     988             :             default:
     989           0 :                 eRetAlign = eAlign;
     990           0 :                 break;
     991             :         }
     992           0 :     return eRetAlign;
     993             : 
     994             : }
     995             : 
     996             : // Notification on modified DocInfo
     997             : 
     998        1220 : void SwNavigationPI::Notify( SfxBroadcaster& rBrdc, const SfxHint& rHint )
     999             : {
    1000        1220 :     if(&rBrdc == pCreateView)
    1001             :     {
    1002           0 :         if(dynamic_cast<const SfxSimpleHint*>(&rHint) && ((SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING)
    1003             :         {
    1004           0 :             pCreateView = 0;
    1005             :         }
    1006             :     }
    1007             :     else
    1008             :     {
    1009        1220 :         if(dynamic_cast<const SfxEventHint*>(&rHint))
    1010             :         {
    1011        1150 :             if( pxObjectShell &&
    1012           0 :                         ((SfxEventHint&) rHint).GetEventId() == SFX_EVENT_CLOSEAPP)
    1013             :             {
    1014           0 :                 DELETEZ(pxObjectShell);
    1015             :             }
    1016        1150 :             else if(((SfxEventHint&) rHint).GetEventId() == SFX_EVENT_OPENDOC)
    1017             :             {
    1018             : 
    1019          10 :                 SwView *pActView = GetCreateView();
    1020          10 :                 if(pActView)
    1021             :                 {
    1022          10 :                     SwWrtShell* pWrtShell = pActView->GetWrtShellPtr();
    1023          10 :                     aContentTree.SetActiveShell(pWrtShell);
    1024          10 :                     if(aGlobalTree.IsVisible())
    1025             :                     {
    1026           0 :                         if(aGlobalTree.Update( false ))
    1027           0 :                             aGlobalTree.Display();
    1028             :                         else
    1029             :                         // If no update is needed, then paint at least,
    1030             :                         // because of the red entries for the broken links.
    1031           0 :                             aGlobalTree.Invalidate();
    1032             :                     }
    1033             :                 }
    1034             :             }
    1035             :         }
    1036             :     }
    1037        1220 : }
    1038             : 
    1039           0 : IMPL_LINK( SwNavigationPI, MenuSelectHdl, Menu *, pMenu )
    1040             : {
    1041           0 :     sal_uInt16 nMenuId = pMenu->GetCurItemId();
    1042           0 :     if(nMenuId != USHRT_MAX)
    1043             :     {
    1044           0 :         if(nMenuId < 100)
    1045           0 :             SetRegionDropMode( --nMenuId);
    1046             :         else
    1047           0 :             aContentTree.SetOutlineLevel( static_cast< sal_uInt8 >(nMenuId - 100) );
    1048             :     }
    1049           0 :     return 0;
    1050             : }
    1051             : 
    1052          62 : void SwNavigationPI::UpdateListBox()
    1053             : {
    1054          62 :     aDocListBox.SetUpdateMode(false);
    1055          62 :     aDocListBox.Clear();
    1056          62 :     SwView *pActView = GetCreateView();
    1057          62 :     bool bDisable = pActView == 0;
    1058          62 :     SwView *pView = SwModule::GetFirstView();
    1059          62 :     sal_Int32 nCount = 0;
    1060          62 :     sal_Int32 nAct = 0;
    1061          62 :     sal_Int32 nConstPos = 0;
    1062          62 :     const SwView* pConstView = aContentTree.IsConstantView() &&
    1063           0 :                                 aContentTree.GetActiveWrtShell() ?
    1064           0 :                                     &aContentTree.GetActiveWrtShell()->GetView():
    1065          62 :                                         0;
    1066         194 :     while (pView)
    1067             :     {
    1068          70 :         SfxObjectShell* pDoc = pView->GetDocShell();
    1069             :         // #i53333# don't show help pages here
    1070          70 :         if ( !pDoc->IsHelpDocument() )
    1071             :         {
    1072          70 :             OUString sEntry = pDoc->GetTitle();
    1073          70 :             sEntry += " (";
    1074          70 :             if (pView == pActView)
    1075             :             {
    1076          62 :                 nAct = nCount;
    1077          62 :                 sEntry += aStatusArr[ST_ACTIVE - ST_STATUS_FIRST];
    1078             :             }
    1079             :             else
    1080           8 :                 sEntry += aStatusArr[ST_INACTIVE - ST_STATUS_FIRST];
    1081          70 :             sEntry += ")";
    1082          70 :             aDocListBox.InsertEntry(sEntry);
    1083             : 
    1084          70 :             if (pConstView && pView == pConstView)
    1085           0 :                 nConstPos = nCount;
    1086             : 
    1087          70 :             nCount++;
    1088             :         }
    1089          70 :         pView = SwModule::GetNextView(pView);
    1090             :     }
    1091          62 :     aDocListBox.InsertEntry(aStatusArr[3]); // "Active Window"
    1092          62 :     nCount++;
    1093             : 
    1094          62 :     if(aContentTree.GetHiddenWrtShell())
    1095             :     {
    1096           0 :         OUString sEntry = aContentTree.GetHiddenWrtShell()->GetView().
    1097           0 :                                         GetDocShell()->GetTitle();
    1098           0 :         sEntry += " (";
    1099           0 :         sEntry += aStatusArr[ST_HIDDEN - ST_STATUS_FIRST];
    1100           0 :         sEntry += ")";
    1101           0 :         aDocListBox.InsertEntry(sEntry);
    1102           0 :         bDisable = false;
    1103             :     }
    1104          62 :     if(aContentTree.IsActiveView())
    1105             :     {
    1106             :         //Either the name of the current Document or "Active Document".
    1107          62 :         aDocListBox.SelectEntryPos( pActView ? nAct : --nCount );
    1108             :     }
    1109           0 :     else if(aContentTree.IsHiddenView())
    1110             :     {
    1111           0 :         aDocListBox.SelectEntryPos(nCount);
    1112             :     }
    1113             :     else
    1114           0 :         aDocListBox.SelectEntryPos(nConstPos);
    1115             : 
    1116          62 :     aDocListBox.Enable( !bDisable );
    1117          62 :     aDocListBox.SetUpdateMode(true);
    1118          62 : }
    1119             : 
    1120           0 : IMPL_LINK(SwNavigationPI, DoneLink, SfxPoolItem *, pItem)
    1121             : {
    1122           0 :     const SfxViewFrameItem* pFrameItem = PTR_CAST(SfxViewFrameItem, pItem );
    1123           0 :     if( pFrameItem )
    1124             :     {
    1125           0 :         SfxViewFrame* pFrame =  pFrameItem->GetFrame();
    1126           0 :         if(pFrame)
    1127             :         {
    1128           0 :             aContentTree.Clear();
    1129           0 :             pContentView = PTR_CAST(SwView, pFrame->GetViewShell());
    1130             :             OSL_ENSURE(pContentView, "no SwView");
    1131           0 :             if(pContentView)
    1132           0 :                 pContentWrtShell = pContentView->GetWrtShellPtr();
    1133             :             else
    1134           0 :                 pContentWrtShell = 0;
    1135           0 :             pxObjectShell = new SfxObjectShellLock(pFrame->GetObjectShell());
    1136           0 :             FillBox();
    1137           0 :             aContentTree.Update();
    1138             :         }
    1139             :     }
    1140           0 :     return 0;
    1141             : }
    1142             : 
    1143           0 : OUString SwNavigationPI::CreateDropFileName( TransferableDataHelper& rData )
    1144             : {
    1145           0 :     OUString sFileName;
    1146             :     sal_uLong nFmt;
    1147           0 :     if( rData.HasFormat( nFmt = FORMAT_FILE_LIST ))
    1148             :     {
    1149           0 :         FileList aFileList;
    1150           0 :         rData.GetFileList( nFmt, aFileList );
    1151           0 :         sFileName = aFileList.GetFile( 0 );
    1152             :     }
    1153           0 :     else if( rData.HasFormat( nFmt = FORMAT_STRING ) ||
    1154           0 :               rData.HasFormat( nFmt = FORMAT_FILE ) ||
    1155           0 :              rData.HasFormat( nFmt = SOT_FORMATSTR_ID_FILENAME ))
    1156             :     {
    1157           0 :         (void)rData.GetString(nFmt, sFileName);
    1158             :     }
    1159           0 :     else if( rData.HasFormat( nFmt = SOT_FORMATSTR_ID_SOLK ) ||
    1160           0 :                 rData.HasFormat( nFmt = SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK )||
    1161           0 :                 rData.HasFormat( nFmt = SOT_FORMATSTR_ID_FILECONTENT ) ||
    1162           0 :                 rData.HasFormat( nFmt = SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR ) ||
    1163           0 :                 rData.HasFormat( nFmt = SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR ))
    1164             :     {
    1165           0 :         INetBookmark aBkmk( aEmptyOUStr, aEmptyOUStr );
    1166           0 :         if (rData.GetINetBookmark(nFmt, aBkmk))
    1167           0 :             sFileName = aBkmk.GetURL();
    1168             :     }
    1169           0 :     if( !sFileName.isEmpty() )
    1170             :     {
    1171           0 :         sFileName = INetURLObject( sFileName ).GetMainURL( INetURLObject::NO_DECODE );
    1172             :     }
    1173           0 :     return sFileName;
    1174             : }
    1175             : 
    1176           0 : sal_Int8 SwNavigationPI::AcceptDrop( const AcceptDropEvent& /*rEvt*/ )
    1177             : {
    1178           0 :     return ( !SwContentTree::IsInDrag() &&
    1179           0 :         ( aContentTree.IsDropFormatSupported( FORMAT_FILE ) ||
    1180           0 :           aContentTree.IsDropFormatSupported( FORMAT_STRING ) ||
    1181           0 :           aContentTree.IsDropFormatSupported( SOT_FORMATSTR_ID_SOLK ) ||
    1182           0 :            aContentTree.IsDropFormatSupported( SOT_FORMATSTR_ID_NETSCAPE_BOOKMARK )||
    1183           0 :            aContentTree.IsDropFormatSupported( SOT_FORMATSTR_ID_FILECONTENT ) ||
    1184           0 :            aContentTree.IsDropFormatSupported( SOT_FORMATSTR_ID_FILEGRPDESCRIPTOR ) ||
    1185           0 :            aContentTree.IsDropFormatSupported( SOT_FORMATSTR_ID_UNIFORMRESOURCELOCATOR ) ||
    1186           0 :            aContentTree.IsDropFormatSupported( SOT_FORMATSTR_ID_FILENAME )))
    1187             :         ? DND_ACTION_COPY
    1188           0 :         : DND_ACTION_NONE;
    1189             : }
    1190             : 
    1191           0 : sal_Int8 SwNavigationPI::ExecuteDrop( const ExecuteDropEvent& rEvt )
    1192             : {
    1193           0 :     TransferableDataHelper aData( rEvt.maDropEvent.Transferable );
    1194           0 :     sal_Int8 nRet = DND_ACTION_NONE;
    1195           0 :     OUString sFileName;
    1196           0 :     if( !SwContentTree::IsInDrag() &&
    1197           0 :         !(sFileName = SwNavigationPI::CreateDropFileName( aData )).isEmpty() )
    1198             :     {
    1199           0 :         INetURLObject aTemp( sFileName );
    1200           0 :         GraphicDescriptor aDesc( aTemp );
    1201           0 :         if( !aDesc.Detect() )   // accept no graphics
    1202             :         {
    1203           0 :             if( -1 == sFileName.indexOf('#')
    1204           0 :                 && (sContentFileName.isEmpty() || sContentFileName != sFileName ))
    1205             :             {
    1206           0 :                 nRet = rEvt.mnAction;
    1207           0 :                 sFileName = comphelper::string::stripEnd(sFileName, 0);
    1208           0 :                 sContentFileName = sFileName;
    1209           0 :                 if(pxObjectShell)
    1210             :                 {
    1211           0 :                     aContentTree.SetHiddenShell( 0 );
    1212           0 :                     (*pxObjectShell)->DoClose();
    1213           0 :                     DELETEZ( pxObjectShell);
    1214             :                 }
    1215           0 :                 SfxStringItem aFileItem(SID_FILE_NAME, sFileName );
    1216           0 :                 SfxStringItem aOptionsItem( SID_OPTIONS, OUString("HRC") );
    1217             :                 SfxLinkItem aLink( SID_DONELINK,
    1218           0 :                                     LINK( this, SwNavigationPI, DoneLink ) );
    1219           0 :                 GetActiveView()->GetViewFrame()->GetDispatcher()->Execute(
    1220             :                             SID_OPENDOC, SfxCallMode::ASYNCHRON,
    1221           0 :                             &aFileItem, &aOptionsItem, &aLink, 0L );
    1222             :             }
    1223           0 :         }
    1224             :     }
    1225           0 :     return nRet;
    1226             : }
    1227             : 
    1228         118 : void SwNavigationPI::SetRegionDropMode(sal_uInt16 nNewMode)
    1229             : {
    1230         118 :     nRegionMode = nNewMode;
    1231         118 :     pConfig->SetRegionMode( nRegionMode );
    1232             : 
    1233         118 :     sal_uInt16 nDropId = FN_DROP_REGION;
    1234         118 :     if(nRegionMode == REGION_MODE_LINK)
    1235           0 :         nDropId = FN_DROP_REGION_LINK;
    1236         118 :     else if(nRegionMode == REGION_MODE_EMBEDDED)
    1237           0 :         nDropId = FN_DROP_REGION_COPY;
    1238             : 
    1239         118 :     ImageList& rImgLst = aContentImageList;
    1240             : 
    1241         118 :     aContentToolBox.SetItemImage( FN_DROP_REGION, rImgLst.GetImage(nDropId));
    1242         118 : }
    1243             : 
    1244          62 : bool    SwNavigationPI::ToggleTree()
    1245             : {
    1246          62 :     bool bRet = true;
    1247          62 :     bool bGlobalDoc = IsGlobalDoc();
    1248          62 :     if(!IsGlobalMode() && bGlobalDoc)
    1249             :     {
    1250           0 :         SetUpdateMode(false);
    1251           0 :         if(_IsZoomedIn())
    1252           0 :             _ZoomOut();
    1253           0 :         aGlobalTree.ShowTree();
    1254           0 :         aGlobalToolBox.Show();
    1255           0 :         aContentTree.HideTree();
    1256           0 :         aContentToolBox.Hide();
    1257           0 :         aDocListBox.Hide();
    1258           0 :         SetGlobalMode(true);
    1259           0 :         SetUpdateMode(true);
    1260             :     }
    1261             :     else
    1262             :     {
    1263          62 :         aGlobalTree.HideTree();
    1264          62 :         aGlobalToolBox.Hide();
    1265          62 :         if(!_IsZoomedIn())
    1266             :         {
    1267          62 :             aContentTree.ShowTree();
    1268          62 :             aContentToolBox.Show();
    1269          62 :             aDocListBox.Show();
    1270             :         }
    1271          62 :         bRet = false;
    1272          62 :         SetGlobalMode(false);
    1273             :     }
    1274          62 :     return bRet;
    1275             : }
    1276             : 
    1277         364 : bool    SwNavigationPI::IsGlobalDoc() const
    1278             : {
    1279         364 :     bool bRet = false;
    1280         364 :     SwView *pView = GetCreateView();
    1281         364 :     if(pView)
    1282             :     {
    1283         246 :         SwWrtShell &rSh = pView->GetWrtShell();
    1284         246 :         bRet = rSh.IsGlobalDoc();
    1285             :     }
    1286         364 :     return bRet;
    1287             : }
    1288             : 
    1289           0 : IMPL_LINK_NOARG(SwNavigationPI, ChangePageHdl)
    1290             : {
    1291           0 :     EditAction(&GetPageEdit());
    1292           0 :     GetPageEdit().GrabFocus();
    1293           0 :     return 0;
    1294             : }
    1295             : 
    1296           0 : IMPL_LINK_NOARG(SwNavigationPI, PageEditModifyHdl)
    1297             : {
    1298           0 :     if(aPageChgTimer.IsActive())
    1299           0 :         aPageChgTimer.Stop();
    1300           0 :     aPageChgTimer.Start();
    1301           0 :     return 0;
    1302             : }
    1303             : 
    1304        1080 : SwView*  SwNavigationPI::GetCreateView() const
    1305             : {
    1306        1080 :     if(!pCreateView)
    1307             :     {
    1308         474 :         SwView* pView = SwModule::GetFirstView();
    1309         980 :         while(pView)
    1310             :         {
    1311         152 :             if(&pView->GetViewFrame()->GetBindings() == &rBindings)
    1312             :             {
    1313         120 :                 ((SwNavigationPI*)this)->pCreateView = pView;
    1314         120 :                 ((SwNavigationPI*)this)->StartListening(*pCreateView);
    1315         120 :                 break;
    1316             :             }
    1317          32 :             pView = SwModule::GetNextView(pView);
    1318             :         }
    1319             :     }
    1320        1080 :     return pCreateView;
    1321             : }
    1322             : 
    1323         118 : SwNavigationChild::SwNavigationChild( vcl::Window* pParent,
    1324             :                         sal_uInt16 nId,
    1325             :                         SfxBindings* _pBindings,
    1326             :                         SfxChildWinInfo* )
    1327         118 :     : SfxChildWindowContext( nId )
    1328             : {
    1329         118 :     SwNavigationPI* pNavi  = new SwNavigationPI( _pBindings, this, pParent );
    1330         118 :     SetWindow( pNavi );
    1331         118 :     _pBindings->Invalidate(SID_NAVIGATOR);
    1332             : 
    1333         118 :     SwNavigationConfig* pNaviConfig = SW_MOD()->GetNavigationConfig();
    1334             : 
    1335         118 :     const sal_uInt16 nRootType = static_cast< sal_uInt16 >( pNaviConfig->GetRootType() );
    1336         118 :     if( nRootType < CONTENT_TYPE_MAX )
    1337             :     {
    1338           0 :         pNavi->aContentTree.SetRootType(nRootType);
    1339           0 :         pNavi->aContentToolBox.CheckItem(FN_SHOW_ROOT, true);
    1340             :     }
    1341         118 :     pNavi->aContentTree.SetOutlineLevel( static_cast< sal_uInt8 >( pNaviConfig->GetOutlineLevel() ) );
    1342         118 :     pNavi->SetRegionDropMode( static_cast< sal_uInt16 >( pNaviConfig->GetRegionMode() ) );
    1343             : 
    1344         118 :     if(GetFloatingWindow() && pNaviConfig->IsSmall())
    1345             :     {
    1346           0 :         pNavi->_ZoomIn();
    1347             :     }
    1348         118 : }
    1349             : 
    1350           0 : void SwNavigationPI::DataChanged( const DataChangedEvent& rDCEvt )
    1351             : {
    1352           0 :     Window::DataChanged( rDCEvt );
    1353           0 :     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
    1354           0 :          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
    1355             :     {
    1356           0 :         InitImageList();
    1357           0 :         const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
    1358           0 :         Color aBgColor = rStyleSettings.GetFaceColor();
    1359           0 :         Wallpaper aBack( aBgColor );
    1360           0 :         SetBackground( aBack );
    1361             :     }
    1362           0 : }
    1363             : 
    1364         120 : void SwNavigationPI::InitImageList()
    1365             : {
    1366         120 :     ImageList& rImgLst = aContentImageList;
    1367        2760 :     for( sal_uInt16 k = 0; k < aContentToolBox.GetItemCount(); k++)
    1368        2640 :             aContentToolBox.SetItemImage(aContentToolBox.GetItemId(k),
    1369        5280 :                     rImgLst.GetImage(aContentToolBox.GetItemId(k)));
    1370             : 
    1371        1320 :     for( sal_uInt16 k = 0; k < aGlobalToolBox.GetItemCount(); k++)
    1372        1200 :             aGlobalToolBox.SetItemImage(aGlobalToolBox.GetItemId(k),
    1373        2400 :                     rImgLst.GetImage(aGlobalToolBox.GetItemId(k)));
    1374             : 
    1375         120 :     sal_uInt16 nDropId = FN_DROP_REGION;
    1376         120 :     if(nRegionMode == REGION_MODE_LINK)
    1377           0 :         nDropId = FN_DROP_REGION_LINK;
    1378         120 :     else if(nRegionMode == REGION_MODE_EMBEDDED)
    1379           0 :         nDropId = FN_DROP_REGION_COPY;
    1380             :     aContentToolBox.SetItemImage( FN_DROP_REGION,
    1381         120 :                                     rImgLst.GetImage(nDropId));
    1382         390 : }
    1383             : 
    1384             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10