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

Generated by: LCOV version 1.11