LCOV - code coverage report
Current view: top level - sc/source/ui/navipi - navipi.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 3 681 0.4 %
Date: 2015-06-13 12:38:46 Functions: 3 79 3.8 %
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 <rangelst.hxx>
      21             : #include <sfx2/app.hxx>
      22             : #include <sfx2/bindings.hxx>
      23             : #include <sfx2/dispatch.hxx>
      24             : #include <sfx2/event.hxx>
      25             : #include <sfx2/imgmgr.hxx>
      26             : #include <sfx2/navigat.hxx>
      27             : #include <svl/stritem.hxx>
      28             : #include <svl/urlbmk.hxx>
      29             : #include <vcl/settings.hxx>
      30             : #include <unotools/charclass.hxx>
      31             : #include <stdlib.h>
      32             : 
      33             : #include "viewdata.hxx"
      34             : #include "tabvwsh.hxx"
      35             : #include "docsh.hxx"
      36             : #include "document.hxx"
      37             : #include "dbdata.hxx"
      38             : #include "rangenam.hxx"
      39             : #include "rangeutl.hxx"
      40             : #include "popmenu.hxx"
      41             : #include "scresid.hxx"
      42             : #include "scmod.hxx"
      43             : #include "navicfg.hxx"
      44             : #include "navcitem.hxx"
      45             : #include "navipi.hrc"
      46             : #include "navipi.hxx"
      47             : #include "navsett.hxx"
      48             : #include "markdata.hxx"
      49             : 
      50             : #include <algorithm>
      51             : 
      52             : //  toleance, how much spac above the folded size is still small
      53             : #define SCNAV_MINTOL        5
      54             : 
      55             : //  maximum values for UI
      56             : #define SCNAV_MAXCOL        (MAXCOLCOUNT)
      57             : // macro is sufficient since only used in ctor
      58             : #define SCNAV_COLDIGITS     (static_cast<sal_Int32>( floor( log10( static_cast<double>(SCNAV_MAXCOL)))) + 1)   // 1...256...18278
      59             : // precomputed constant because it is used in every change of spin button field
      60          52 : static const sal_Int32 SCNAV_COLLETTERS = ::ScColToAlpha(SCNAV_MAXCOL).getLength();    // A...IV...ZZZ
      61             : 
      62             : #define SCNAV_MAXROW        (MAXROWCOUNT)
      63             : 
      64           0 : void ScNavigatorDlg::ReleaseFocus()
      65             : {
      66           0 :     SfxViewShell* pCurSh = SfxViewShell::Current();
      67             : 
      68           0 :     if ( pCurSh )
      69             :     {
      70           0 :         vcl::Window* pShellWnd = pCurSh->GetWindow();
      71           0 :         if ( pShellWnd )
      72           0 :             pShellWnd->GrabFocus();
      73             :     }
      74           0 : }
      75             : 
      76             : //  class ColumnEdit
      77             : 
      78           0 : ColumnEdit::ColumnEdit( ScNavigatorDlg* pParent, const ResId& rResId )
      79             :     :   SpinField   ( pParent, rResId ),
      80             :         rDlg        ( *pParent ),
      81             :         nCol        ( 0 ),
      82           0 :         nKeyGroup   ( KEYGROUP_ALPHA )
      83             : {
      84           0 :     SetMaxTextLen( SCNAV_COLDIGITS );   // 1...256...18278 or A...IV...ZZZ
      85           0 : }
      86             : 
      87           0 : ColumnEdit::~ColumnEdit()
      88             : {
      89           0 : }
      90             : 
      91           0 : bool ColumnEdit::Notify( NotifyEvent& rNEvt )
      92             : {
      93           0 :     bool nHandled = SpinField::Notify( rNEvt );
      94             : 
      95           0 :     MouseNotifyEvent nType = rNEvt.GetType();
      96           0 :     if ( nType == MouseNotifyEvent::KEYINPUT )
      97             :     {
      98           0 :         const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
      99           0 :         vcl::KeyCode aCode = pKEvt->GetKeyCode();
     100             : 
     101           0 :         if ( !aCode.IsMod1() && !aCode.IsMod2() )
     102             :         {
     103             :             //! Input Validation (only alphanumerics, max 2-3 digits)
     104             :             //! was before VCL not forwarded keyinput
     105             :             //! rethink this!!!
     106             : 
     107           0 :             if ( aCode.GetCode() == KEY_RETURN )
     108             :             {
     109           0 :                 ScNavigatorDlg::ReleaseFocus();
     110           0 :                 ExecuteCol();
     111           0 :                 nHandled = true;
     112             :             }
     113             :         }
     114             :     }
     115           0 :     else if ( nType == MouseNotifyEvent::LOSEFOCUS )    // LoseFocus not called at VCL
     116           0 :         EvalText();                         // nCol set
     117             : 
     118           0 :     return nHandled;
     119             : }
     120             : 
     121           0 : void ColumnEdit::LoseFocus()
     122             : {
     123           0 :     EvalText();
     124           0 : }
     125             : 
     126           0 : void ColumnEdit::Up()
     127             : {
     128           0 :     nCol++;
     129             : 
     130           0 :     if ( nCol <= SCNAV_MAXCOL )
     131           0 :         SetCol( nCol );
     132             :     else
     133           0 :         nCol--;
     134           0 : }
     135             : 
     136           0 : void ColumnEdit::Down()
     137             : {
     138           0 :     if ( nCol>1 )
     139           0 :         SetCol( nCol-1 );
     140           0 : }
     141             : 
     142           0 : void ColumnEdit::First()
     143             : {
     144           0 :     nCol = 1;
     145           0 :     SetText(OUString('A'));
     146           0 : }
     147             : 
     148           0 : void ColumnEdit::Last()
     149             : {
     150           0 :     OUString aStr;
     151           0 :     nCol = NumToAlpha( SCNAV_MAXCOL, aStr );
     152           0 :     SetText( aStr );
     153           0 : }
     154             : 
     155           0 : void ColumnEdit::EvalText()
     156             : {
     157           0 :     OUString aStrCol = GetText();
     158             : 
     159           0 :     if (!aStrCol.isEmpty())
     160             :     {
     161             :         //  nKeyGroup is no longer set at VCL, in cause of lack of keyinput
     162             : 
     163           0 :         if ( CharClass::isAsciiNumeric(aStrCol) )
     164           0 :             nCol = NumStrToAlpha( aStrCol );
     165             :         else
     166           0 :             nCol = AlphaToNum( aStrCol );
     167             :     }
     168             :     else
     169           0 :         nCol = 0;
     170             : 
     171           0 :     SetText( aStrCol );
     172           0 :     nKeyGroup = KEYGROUP_ALPHA;
     173           0 : }
     174             : 
     175           0 : void ColumnEdit::ExecuteCol()
     176             : {
     177           0 :     SCROW nRow = rDlg.aEdRow->GetRow();
     178             : 
     179           0 :     EvalText(); // setzt nCol
     180             : 
     181           0 :     if ( (nCol > 0) && (nRow > 0) )
     182           0 :         rDlg.SetCurrentCell( nCol-1, nRow-1 );
     183           0 : }
     184             : 
     185           0 : void ColumnEdit::SetCol( SCCOL nColNo )
     186             : {
     187           0 :     OUString aStr;
     188             : 
     189           0 :     if ( nColNo == 0 )
     190             :     {
     191           0 :         nCol = 0;
     192           0 :         SetText( aStr );
     193             :     }
     194             :     else
     195             :     {
     196           0 :         nColNo = NumToAlpha( nColNo, aStr );
     197           0 :         nCol = nColNo;
     198           0 :         SetText( aStr );
     199           0 :     }
     200           0 : }
     201             : 
     202           0 : SCCOL ColumnEdit::AlphaToNum( OUString& rStr )
     203             : {
     204           0 :     SCCOL  nColumn = 0;
     205             : 
     206           0 :     if ( CharClass::isAsciiAlpha( rStr) )
     207             :     {
     208           0 :         rStr = rStr.toAsciiUpperCase();
     209             : 
     210           0 :         if (::AlphaToCol( nColumn, rStr))
     211           0 :             ++nColumn;
     212             : 
     213           0 :         if ( (rStr.getLength() > SCNAV_COLLETTERS) || (nColumn > SCNAV_MAXCOL) )
     214             :         {
     215           0 :             nColumn = SCNAV_MAXCOL;
     216           0 :             NumToAlpha( nColumn, rStr );
     217             :         }
     218             :     }
     219             :     else
     220           0 :         rStr.clear();
     221             : 
     222           0 :     return nColumn;
     223             : }
     224             : 
     225           0 : SCCOL ColumnEdit::NumStrToAlpha( OUString& rStr )
     226             : {
     227           0 :     SCCOL  nColumn = 0;
     228             : 
     229           0 :     if ( CharClass::isAsciiNumeric(rStr) )
     230           0 :         nColumn = NumToAlpha( (SCCOL)rStr.toInt32(), rStr );
     231             :     else
     232           0 :         rStr.clear();
     233             : 
     234           0 :     return nColumn;
     235             : }
     236             : 
     237           0 : SCCOL ColumnEdit::NumToAlpha( SCCOL nColNo, OUString& rStr )
     238             : {
     239           0 :     if ( nColNo > SCNAV_MAXCOL )
     240           0 :         nColNo = SCNAV_MAXCOL;
     241           0 :     else if ( nColNo < 1 )
     242           0 :         nColNo = 1;
     243             : 
     244           0 :     ::ScColToAlpha( rStr, nColNo - 1);
     245             : 
     246           0 :     return nColNo;
     247             : }
     248             : 
     249             : //  class RowEdit
     250             : 
     251           0 : RowEdit::RowEdit( ScNavigatorDlg* pParent, const ResId& rResId )
     252             :     :   NumericField( pParent, rResId ),
     253           0 :         rDlg        ( *pParent )
     254             : {
     255           0 :     SetMax( SCNAV_MAXROW);
     256           0 :     SetLast( SCNAV_MAXROW);
     257           0 : }
     258             : 
     259           0 : RowEdit::~RowEdit()
     260             : {
     261           0 : }
     262             : 
     263           0 : bool RowEdit::Notify( NotifyEvent& rNEvt )
     264             : {
     265           0 :     bool nHandled = NumericField::Notify( rNEvt );
     266             : 
     267           0 :     if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
     268             :     {
     269           0 :         const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
     270           0 :         vcl::KeyCode aCode = pKEvt->GetKeyCode();
     271           0 :         if ( aCode.GetCode() == KEY_RETURN && !aCode.IsMod1() && !aCode.IsMod2() )
     272             :         {
     273           0 :             ScNavigatorDlg::ReleaseFocus();
     274           0 :             ExecuteRow();
     275           0 :             nHandled = true;
     276             :         }
     277             :     }
     278             : 
     279           0 :     return nHandled;
     280             : }
     281             : 
     282           0 : void RowEdit::LoseFocus()
     283             : {
     284           0 : }
     285             : 
     286           0 : void RowEdit::ExecuteRow()
     287             : {
     288           0 :     SCCOL nCol = rDlg.aEdCol->GetCol();
     289           0 :     SCROW nRow = (SCROW)GetValue();
     290             : 
     291           0 :     if ( (nCol > 0) && (nRow > 0) )
     292           0 :         rDlg.SetCurrentCell( nCol-1, nRow-1 );
     293           0 : }
     294             : 
     295             : //  class ScDocListBox
     296             : 
     297           0 : ScDocListBox::ScDocListBox( ScNavigatorDlg* pParent, const ResId& rResId )
     298             :     :   ListBox ( pParent, rResId ),
     299           0 :         rDlg    ( *pParent )
     300             : {
     301           0 : }
     302             : 
     303           0 : ScDocListBox::~ScDocListBox()
     304             : {
     305           0 : }
     306             : 
     307           0 : void ScDocListBox::Select()
     308             : {
     309           0 :     ScNavigatorDlg::ReleaseFocus();
     310             : 
     311           0 :     OUString aDocName = GetSelectEntry();
     312           0 :     rDlg.aLbEntries->SelectDoc( aDocName );
     313           0 : }
     314             : 
     315             : //  class CommandToolBox
     316             : 
     317           0 : CommandToolBox::CommandToolBox( ScNavigatorDlg* pParent, const ResId& rResId )
     318             :     :   ToolBox ( pParent, rResId ),
     319           0 :         rDlg    ( *pParent )
     320             : {
     321           0 :     InitImageList();    // ImageList members of ScNavigatorDlg must be initialized before!
     322             : 
     323           0 :     SetSizePixel( CalcWindowSizePixel() );
     324           0 :     SetDropdownClickHdl( LINK(this, CommandToolBox, ToolBoxDropdownClickHdl) );
     325           0 :     SetItemBits( IID_DROPMODE, GetItemBits( IID_DROPMODE ) | ToolBoxItemBits::DROPDOWNONLY );
     326           0 : }
     327             : 
     328           0 : CommandToolBox::~CommandToolBox()
     329             : {
     330           0 : }
     331             : 
     332           0 : void CommandToolBox::Select( sal_uInt16 nSelId )
     333             : {
     334             :     //  Modus umschalten ?
     335             : 
     336           0 :     if ( nSelId == IID_ZOOMOUT || nSelId == IID_SCENARIOS )
     337             :     {
     338           0 :         NavListMode eOldMode = rDlg.eListMode;
     339           0 :         NavListMode eNewMode = eOldMode;
     340             : 
     341           0 :         if ( nSelId == IID_SCENARIOS )
     342             :         {
     343           0 :             if ( eOldMode == NAV_LMODE_SCENARIOS )
     344           0 :                 eNewMode = NAV_LMODE_AREAS;
     345             :             else
     346           0 :                 eNewMode = NAV_LMODE_SCENARIOS;
     347             :         }
     348             :         else                                            // on/off
     349             :         {
     350           0 :             if ( eOldMode == NAV_LMODE_NONE )
     351           0 :                 eNewMode = NAV_LMODE_AREAS;
     352             :             else
     353           0 :                 eNewMode = NAV_LMODE_NONE;
     354             :         }
     355           0 :         rDlg.SetListMode( eNewMode );
     356           0 :         UpdateButtons();
     357             :     }
     358             :     else
     359           0 :         switch ( nSelId )
     360             :         {
     361             :             case IID_DATA:
     362           0 :                 rDlg.MarkDataArea();
     363           0 :                 break;
     364             :             case IID_UP:
     365           0 :                 rDlg.StartOfDataArea();
     366           0 :                 break;
     367             :             case IID_DOWN:
     368           0 :                 rDlg.EndOfDataArea();
     369           0 :                 break;
     370             :             case IID_CHANGEROOT:
     371           0 :                 rDlg.aLbEntries->ToggleRoot();
     372           0 :                 UpdateButtons();
     373           0 :                 break;
     374             :         }
     375           0 : }
     376             : 
     377           0 : void CommandToolBox::Select()
     378             : {
     379           0 :     Select( GetCurItemId() );
     380           0 : }
     381             : 
     382           0 : void CommandToolBox::Click()
     383             : {
     384           0 : }
     385             : 
     386           0 : IMPL_LINK_NOARG_TYPED(CommandToolBox, ToolBoxDropdownClickHdl, ToolBox *, void)
     387             : {
     388             :     // the popup menue of the drop modus has to be called in the
     389             :     // click (button down) and not in the select (button up)
     390             : 
     391           0 :     if ( GetCurItemId() == IID_DROPMODE )
     392             :     {
     393           0 :         ScPopupMenu aPop( ScResId( RID_POPUP_DROPMODE ) );
     394           0 :         aPop.CheckItem( RID_DROPMODE_URL + rDlg.GetDropMode() );
     395           0 :         aPop.Execute( this, GetItemRect(IID_DROPMODE), PopupMenuFlags::ExecuteDown );
     396           0 :         sal_uInt16 nId = aPop.GetSelected();
     397             : 
     398           0 :         EndSelection();     // bevore SetDropMode (SetDropMode calls SetItemImage)
     399             : 
     400           0 :         if ( nId >= RID_DROPMODE_URL && nId <= RID_DROPMODE_COPY )
     401           0 :             rDlg.SetDropMode( nId - RID_DROPMODE_URL );
     402             : 
     403             :         //  reset the highlighted button
     404           0 :         Point aPoint;
     405           0 :         MouseEvent aLeave( aPoint, 0, MouseEventModifiers::LEAVEWINDOW | MouseEventModifiers::SYNTHETIC );
     406           0 :         MouseMove( aLeave );
     407             :     }
     408           0 : }
     409             : 
     410           0 : void CommandToolBox::UpdateButtons()
     411             : {
     412           0 :     NavListMode eMode = rDlg.eListMode;
     413           0 :     CheckItem( IID_SCENARIOS,   eMode == NAV_LMODE_SCENARIOS );
     414           0 :     CheckItem( IID_ZOOMOUT,     eMode != NAV_LMODE_NONE );
     415             : 
     416             :     //  Umschalten-Button:
     417           0 :     if ( eMode == NAV_LMODE_SCENARIOS || eMode == NAV_LMODE_NONE )
     418             :     {
     419           0 :         EnableItem( IID_CHANGEROOT, false );
     420           0 :         CheckItem( IID_CHANGEROOT, false );
     421             :     }
     422             :     else
     423             :     {
     424           0 :         EnableItem( IID_CHANGEROOT, true );
     425           0 :         bool bRootSet = rDlg.aLbEntries->GetRootType() != SC_CONTENT_ROOT;
     426           0 :         CheckItem( IID_CHANGEROOT, bRootSet );
     427             :     }
     428             : 
     429           0 :     sal_uInt16 nImageId = 0;
     430           0 :     switch ( rDlg.nDropMode )
     431             :     {
     432           0 :         case SC_DROPMODE_URL:   nImageId = RID_IMG_DROP_URL;  break;
     433           0 :         case SC_DROPMODE_LINK:  nImageId = RID_IMG_DROP_LINK; break;
     434           0 :         case SC_DROPMODE_COPY:  nImageId = RID_IMG_DROP_COPY; break;
     435             :     }
     436           0 :     SetItemImage( IID_DROPMODE, Image(ScResId(nImageId)) );
     437           0 : }
     438             : 
     439           0 : void CommandToolBox::InitImageList()
     440             : {
     441           0 :     ImageList& rImgLst = rDlg.aCmdImageList;
     442             : 
     443           0 :     sal_uInt16 nCount = GetItemCount();
     444           0 :     for (sal_uInt16 i = 0; i < nCount; i++)
     445             :     {
     446           0 :         sal_uInt16 nId = GetItemId(i);
     447           0 :         SetItemImage( nId, rImgLst.GetImage( nId ) );
     448             :     }
     449           0 : }
     450             : 
     451           0 : void CommandToolBox::DataChanged( const DataChangedEvent& rDCEvt )
     452             : {
     453           0 :     if ( rDCEvt.GetType() == DataChangedEventType::SETTINGS && (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
     454             :     {
     455             :         //  update item images
     456             : 
     457           0 :         InitImageList();
     458           0 :         UpdateButtons();    // drop mode
     459             :     }
     460             : 
     461           0 :     ToolBox::DataChanged( rDCEvt );
     462           0 : }
     463             : 
     464             : //  class ScNavigatorSettings
     465             : 
     466           0 : ScNavigatorSettings::ScNavigatorSettings() :
     467             :     maExpandedVec( SC_CONTENT_COUNT, false ),
     468             :     mnRootSelected( SC_CONTENT_ROOT ),
     469           0 :     mnChildSelected( SC_CONTENT_NOCHILD )
     470             : {
     471           0 : }
     472             : 
     473             : //  class ScNavigatorDlgWrapper
     474             : 
     475          52 : SFX_IMPL_CHILDWINDOWCONTEXT( ScNavigatorDialogWrapper, SID_NAVIGATOR )
     476             : 
     477           0 : ScNavigatorDialogWrapper::ScNavigatorDialogWrapper(
     478             :                                     vcl::Window*          pParent,
     479             :                                     sal_uInt16           nId,
     480             :                                     SfxBindings*     pBind,
     481             :                                     SfxChildWinInfo* /* pInfo */ ) :
     482           0 :         SfxChildWindowContext( nId )
     483             : {
     484           0 :     pNavigator = VclPtr<ScNavigatorDlg>::Create( pBind, this, pParent, true );
     485           0 :     SetWindow( pNavigator );
     486             : 
     487             :     //  handle configurations elsewhere,
     488             :     //  only size of pInfo matters now
     489             : 
     490           0 :     Size aInfoSize = pParent->GetOutputSizePixel();     // outside defined size
     491           0 :     Size aNavSize = pNavigator->GetOutputSizePixel();   // Default-Size
     492             : 
     493           0 :     aNavSize.Width()  = std::max( aInfoSize.Width(),  aNavSize.Width() );
     494           0 :     aNavSize.Height() = std::max( aInfoSize.Height(), aNavSize.Height() );
     495           0 :     pNavigator->nListModeHeight = std::max( aNavSize.Height(), pNavigator->nListModeHeight );
     496             : 
     497             :     //  The size could be changed in another module,
     498             :     //  therefore we have to or have not to display the content
     499             :     //  in dependence of the current size
     500             : 
     501           0 :     bool bSmall = ( aInfoSize.Height() <= pNavigator->aInitSize.Height() + SCNAV_MINTOL );
     502           0 :     NavListMode eNavMode = NAV_LMODE_NONE;
     503           0 :     if (!bSmall)
     504             :     {
     505             :         //  if scenario was active, switch on
     506             : 
     507           0 :         ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
     508           0 :         NavListMode eLastMode = (NavListMode) rCfg.GetListMode();
     509           0 :         if ( eLastMode == NAV_LMODE_SCENARIOS )
     510           0 :             eNavMode = NAV_LMODE_SCENARIOS;
     511             :         else
     512           0 :             eNavMode = NAV_LMODE_AREAS;
     513             :     }
     514             : 
     515             :     // Do not set the size of the float again (sal_False at SetListMode), so that the
     516             :     // navigator is not expanded, if it was minimized (#38872#).
     517             : 
     518           0 :     pNavigator->SetListMode( eNavMode, false );     // FALSE: do not set the Float size
     519             : 
     520             :     sal_uInt16 nCmdId;
     521           0 :     switch (eNavMode)
     522             :     {
     523           0 :         case NAV_LMODE_SCENARIOS:   nCmdId = IID_SCENARIOS; break;
     524           0 :         case NAV_LMODE_AREAS:       nCmdId = IID_AREAS;     break;
     525             : // The following case can never be reach due to how eNavMode is set-up
     526             : //        case NAV_LMODE_DOCS:        nCmdId = IID_DOCS;      break;
     527             : //        case NAV_LMODE_DBAREAS:     nCmdId = IID_DBAREAS;   break;
     528           0 :         default:                    nCmdId = 0;
     529             :     }
     530           0 :     if (nCmdId)
     531             :     {
     532           0 :         pNavigator->aTbxCmd->CheckItem( nCmdId );
     533           0 :         pNavigator->DoResize();
     534             :     }
     535             : 
     536           0 :     pNavigator->bFirstBig = ( nCmdId == 0 );    // later
     537           0 : }
     538             : 
     539           0 : void ScNavigatorDialogWrapper::Resizing( Size& rSize )
     540             : {
     541           0 :     static_cast<ScNavigatorDlg*>(GetWindow())->Resizing(rSize);
     542           0 : }
     543             : 
     544             : // class ScNavigatorPI
     545             : 
     546             : #define CTRL_ITEMS 4
     547             : 
     548             : #define REGISTER_SLOT(i,id) \
     549             :     ppBoundItems[i]=new ScNavigatorControllerItem(id,*this,rBindings);
     550             : 
     551           0 : ScNavigatorDlg::ScNavigatorDlg( SfxBindings* pB, SfxChildWindowContext* pCW, vcl::Window* pParent,
     552             :     const bool bUseStyleSettingsBackground) :
     553             :         Window( pParent, ScResId(RID_SCDLG_NAVIGATOR) ),
     554             :         rBindings   ( *pB ),                                // is used in CommandToolBox ctor
     555             :         aCmdImageList( ScResId( IL_CMD ) ),
     556             :         aFtCol      ( VclPtr<FixedInfo>::Create( this, ScResId( FT_COL ) ) ),
     557             :         aEdCol      ( VclPtr<ColumnEdit>::Create( this, ScResId( ED_COL ) ) ),
     558             :         aFtRow      ( VclPtr<FixedInfo>::Create( this, ScResId( FT_ROW ) ) ),
     559             :         aEdRow      ( VclPtr<RowEdit>::Create( this, ScResId( ED_ROW ) ) ),
     560             :         aTbxCmd     ( VclPtr<CommandToolBox>::Create( this, ScResId( TBX_CMD ) ) ),
     561             :         aLbEntries  ( VclPtr<ScContentTree>::Create( this, ScResId( LB_ENTRIES ) ) ),
     562             :         aWndScenarios( VclPtr<ScScenarioWindow>::Create( this,ScResId( STR_QHLP_SCEN_LISTBOX), ScResId(STR_QHLP_SCEN_COMMENT)) ),
     563             :         aLbDocuments( VclPtr<ScDocListBox>::Create( this, ScResId( LB_DOCUMENTS ) ) ),
     564             :         aStrDragMode ( ScResId( STR_DRAGMODE ) ),
     565             :         aStrDisplay  ( ScResId( STR_DISPLAY ) ),
     566             :         aStrActiveWin( ScResId( STR_ACTIVEWIN ) ),
     567             :         pContextWin ( pCW ),
     568             :         pMarkArea   ( NULL ),
     569             :         pViewData   ( NULL ),
     570             :         nListModeHeight( 0 ),
     571             :         nInitListHeight( 0 ),
     572             :         eListMode   ( NAV_LMODE_NONE ),
     573             :         nDropMode   ( SC_DROPMODE_URL ),
     574             :         nCurCol     ( 0 ),
     575             :         nCurRow     ( 0 ),
     576             :         nCurTab     ( 0 ),
     577             :         bFirstBig   ( false ),
     578           0 :         mbUseStyleSettingsBackground(bUseStyleSettingsBackground)
     579             : {
     580           0 :     ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
     581           0 :     nDropMode = rCfg.GetDragMode();
     582             :     //  eListMode is set from outside, Root further below
     583             : 
     584           0 :     aLbDocuments->SetDropDownLineCount(9);
     585           0 :     OUString aOpen(" (");
     586           0 :     aStrActive = aOpen;
     587           0 :     aStrActive += OUString( ScResId( STR_ACTIVE ) );
     588           0 :     aStrActive += ")";                                      // " (active)"
     589           0 :     aStrNotActive = aOpen;
     590           0 :     aStrNotActive += OUString( ScResId( STR_NOTACTIVE ) );
     591           0 :     aStrNotActive += ")";                                   // " (not active)"
     592           0 :     aStrHidden = aOpen;
     593           0 :     aStrHidden += OUString( ScResId( STR_HIDDEN ) );
     594           0 :     aStrHidden += ")";                                      // " (hidden)"
     595             : 
     596           0 :     aTitleBase = GetText();
     597             : 
     598             :     const long nListboxYPos =
     599             :         ::std::max(
     600           0 :             (aTbxCmd->GetPosPixel().Y() + aTbxCmd->GetSizePixel().Height()),
     601           0 :             (aEdRow->GetPosPixel().Y() + aEdRow->GetSizePixel().Height()) )
     602           0 :         + 4;
     603           0 :     aLbEntries->setPosSizePixel( 0, nListboxYPos, 0, 0, PosSizeFlags::Y);
     604             : 
     605           0 :     nBorderOffset = aLbEntries->GetPosPixel().X();
     606             : 
     607           0 :     aInitSize.Width()  =  aTbxCmd->GetPosPixel().X()
     608           0 :                         + aTbxCmd->GetSizePixel().Width()
     609           0 :                         + nBorderOffset;
     610           0 :     aInitSize.Height() = aLbEntries->GetPosPixel().Y();
     611             : 
     612           0 :     nInitListHeight = aLbEntries->GetSizePixel().Height();
     613           0 :     nListModeHeight =  aInitSize.Height()
     614           0 :                      + nInitListHeight;
     615             : 
     616           0 :     ppBoundItems = new ScNavigatorControllerItem* [CTRL_ITEMS];
     617             : 
     618           0 :     rBindings.ENTERREGISTRATIONS();
     619             : 
     620           0 :     REGISTER_SLOT( 0, SID_CURRENTCELL       );
     621           0 :     REGISTER_SLOT( 1, SID_CURRENTTAB        );
     622           0 :     REGISTER_SLOT( 2, SID_CURRENTDOC        );
     623           0 :     REGISTER_SLOT( 3, SID_SELECT_SCENARIO   );
     624             : 
     625           0 :     rBindings.LEAVEREGISTRATIONS();
     626             : 
     627           0 :     StartListening( *(SfxGetpApp()) );
     628           0 :     StartListening( rBindings );
     629             : 
     630           0 :     aLbDocuments->Hide();        // does not exist at NAV_LMODE_NONE
     631             : 
     632           0 :     aLbEntries->InitWindowBits(true);
     633             : 
     634           0 :     aLbEntries->SetSpaceBetweenEntries(0);
     635           0 :     aLbEntries->SetSelectionMode( SINGLE_SELECTION );
     636           0 :     aLbEntries->SetDragDropMode( DragDropMode::CTRL_MOVE |
     637           0 :                                  DragDropMode::CTRL_COPY |
     638           0 :                                  DragDropMode::ENABLE_TOP );
     639             : 
     640             :     //  was a category chosen as root?
     641           0 :     sal_uInt16 nLastRoot = rCfg.GetRootType();
     642           0 :     if ( nLastRoot )
     643           0 :         aLbEntries->SetRootType( nLastRoot );
     644             : 
     645           0 :     aLbEntries->Refresh();
     646           0 :     GetDocNames();
     647             : 
     648           0 :     aTbxCmd->UpdateButtons();
     649             : 
     650           0 :     UpdateColumn();
     651           0 :     UpdateRow();
     652           0 :     UpdateTable();
     653           0 :     aLbEntries->Hide();
     654           0 :     aWndScenarios->Hide();
     655           0 :     aWndScenarios->SetPosPixel( aLbEntries->GetPosPixel() );
     656             : 
     657           0 :     aContentIdle.SetIdleHdl( LINK( this, ScNavigatorDlg, TimeHdl ) );
     658           0 :     aContentIdle.SetPriority( SchedulerPriority::LOWEST );
     659             : 
     660           0 :     FreeResource();
     661             : 
     662           0 :     aLbEntries->SetAccessibleRelationLabeledBy(aLbEntries.get());
     663           0 :     aTbxCmd->SetAccessibleRelationLabeledBy(aTbxCmd.get());
     664           0 :     aLbDocuments->SetAccessibleName(aStrActiveWin);
     665             : 
     666           0 :     if (pContextWin == NULL)
     667             :     {
     668             :         // When the context window is missing then the navigator is
     669             :         // displayed in the sidebar and has the whole deck to fill.
     670             :         // Therefore hide the button that hides all controls below the
     671             :         // top two rows of buttons.
     672           0 :         aTbxCmd->Select(IID_ZOOMOUT);
     673           0 :         aTbxCmd->RemoveItem(aTbxCmd->GetItemPos(IID_ZOOMOUT));
     674             :     }
     675           0 :     aLbEntries->SetNavigatorDlgFlag(true);
     676           0 : }
     677             : 
     678           0 : ScNavigatorDlg::~ScNavigatorDlg()
     679             : {
     680           0 :     disposeOnce();
     681           0 : }
     682             : 
     683           0 : void ScNavigatorDlg::dispose()
     684             : {
     685           0 :     aContentIdle.Stop();
     686             : 
     687             :     sal_uInt16 i;
     688           0 :     for ( i=0; i<CTRL_ITEMS; i++ )
     689           0 :         delete ppBoundItems[i];
     690             : 
     691           0 :     delete [] ppBoundItems;
     692           0 :     delete pMarkArea;
     693             : 
     694           0 :     EndListening( *(SfxGetpApp()) );
     695           0 :     EndListening( rBindings );
     696             : 
     697           0 :     aFtCol.disposeAndClear();
     698           0 :     aEdCol.disposeAndClear();
     699           0 :     aFtRow.disposeAndClear();
     700           0 :     aEdRow.disposeAndClear();
     701           0 :     aTbxCmd.disposeAndClear();
     702           0 :     aLbEntries.disposeAndClear();
     703           0 :     aWndScenarios.disposeAndClear();
     704           0 :     aLbDocuments.disposeAndClear();
     705           0 :     vcl::Window::dispose();
     706           0 : }
     707             : 
     708           0 : void ScNavigatorDlg::Resizing( Size& rNewSize )  // Size = Outputsize?
     709             : {
     710           0 :     FloatingWindow* pFloat = pContextWin!=NULL ? pContextWin->GetFloatingWindow() : NULL;
     711           0 :     if ( pFloat )
     712             :     {
     713           0 :         Size aMinOut = pFloat->GetMinOutputSizePixel();
     714             : 
     715           0 :         if ( rNewSize.Width() < aMinOut.Width() )
     716           0 :             rNewSize.Width() = aMinOut.Width();
     717             : 
     718           0 :         if ( eListMode == NAV_LMODE_NONE )
     719           0 :             rNewSize.Height() = aInitSize.Height();
     720             :         else
     721             :         {
     722           0 :             if ( rNewSize.Height() < aMinOut.Height() )
     723           0 :                 rNewSize.Height() = aMinOut.Height();
     724             :         }
     725             :     }
     726           0 : }
     727             : 
     728           0 : void ScNavigatorDlg::Paint( vcl::RenderContext& rRenderContext, const Rectangle& rRect )
     729             : {
     730           0 :     if (mbUseStyleSettingsBackground)
     731             :     {
     732           0 :         const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
     733           0 :         Color aBgColor = rStyleSettings.GetFaceColor();
     734           0 :         Wallpaper aBack( aBgColor );
     735             : 
     736           0 :         SetBackground( aBack );
     737           0 :         aFtCol->SetBackground( aBack );
     738           0 :         aFtRow->SetBackground( aBack );
     739             :     }
     740             :     else
     741             :     {
     742           0 :         aFtCol->SetBackground(Wallpaper());
     743           0 :         aFtRow->SetBackground(Wallpaper());
     744             :     }
     745             : 
     746           0 :     Window::Paint(rRenderContext, rRect);
     747           0 : }
     748             : 
     749           0 : void ScNavigatorDlg::DataChanged( const DataChangedEvent& rDCEvt )
     750             : {
     751           0 :     if ( rDCEvt.GetType() == DataChangedEventType::SETTINGS && (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
     752             :     {
     753             :         //  toolbox images are exchanged in CommandToolBox::DataChanged
     754           0 :         Invalidate();
     755             :     }
     756             : 
     757           0 :     Window::DataChanged( rDCEvt );
     758           0 : }
     759             : 
     760           0 : void ScNavigatorDlg::Resize()
     761             : {
     762           0 :     DoResize();
     763           0 : }
     764             : 
     765           0 : void ScNavigatorDlg::DoResize()
     766             : {
     767           0 :     Size aNewSize = GetOutputSizePixel();
     768           0 :     long nTotalHeight = aNewSize.Height();
     769             : 
     770             :     //  if the navigator is docked, the window is probably at first small generated,
     771             :     //  then there is a resize to the actual size -> switch on content
     772             : 
     773           0 :     bool bSmall = ( nTotalHeight <= aInitSize.Height() + SCNAV_MINTOL );
     774           0 :     if ( !bSmall && bFirstBig )
     775             :     {
     776             :         //  Switch on content again as described in the config
     777             : 
     778           0 :         bFirstBig = false;
     779           0 :         NavListMode eNavMode = NAV_LMODE_AREAS;
     780           0 :         ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
     781           0 :         NavListMode eLastMode = (NavListMode) rCfg.GetListMode();
     782           0 :         if ( eLastMode == NAV_LMODE_SCENARIOS )
     783           0 :             eNavMode = NAV_LMODE_SCENARIOS;
     784           0 :         SetListMode( eNavMode, false );         // FALSE: do not set the Float size
     785             :     }
     786             : 
     787             :     //  even if the content is not visible, adapt the size,
     788             :     //  so the width fit
     789             : 
     790           0 :     Point aEntryPos = aLbEntries->GetPosPixel();
     791           0 :     Point aListPos = aLbDocuments->GetPosPixel();
     792           0 :     aNewSize.Width() -= 2*nBorderOffset;
     793           0 :     Size aDocSize = aLbDocuments->GetSizePixel();
     794           0 :     aDocSize.Width() = aNewSize.Width();
     795             : 
     796           0 :     if(!bSmall)
     797             :     {
     798             : 
     799           0 :         long nListHeight = aLbDocuments->GetSizePixel().Height();
     800           0 :         aNewSize.Height() -= ( aEntryPos.Y() + nListHeight + 2*nBorderOffset );
     801           0 :         if(aNewSize.Height()<0) aNewSize.Height()=0;
     802             : 
     803           0 :         aListPos.Y() = aEntryPos.Y() + aNewSize.Height() + nBorderOffset;
     804             : 
     805           0 :         if(aListPos.Y() > aLbEntries->GetPosPixel().Y())
     806           0 :                             aLbDocuments->SetPosPixel( aListPos );
     807             : 
     808             :     }
     809           0 :     aLbEntries->SetSizePixel( aNewSize );
     810           0 :     aWndScenarios->SetSizePixel( aNewSize );
     811           0 :     aLbDocuments->SetSizePixel( aDocSize );
     812             : 
     813           0 :     bool bListMode = (eListMode != NAV_LMODE_NONE);
     814           0 :     if (pContextWin != NULL)
     815             :     {
     816           0 :         FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
     817           0 :         if ( pFloat && bListMode )
     818           0 :             nListModeHeight = nTotalHeight;
     819             :     }
     820           0 : }
     821             : 
     822           0 : void ScNavigatorDlg::Notify( SfxBroadcaster&, const SfxHint& rHint )
     823             : {
     824           0 :     const SfxSimpleHint* pSimpleHint = dynamic_cast<const SfxSimpleHint*>( &rHint );
     825           0 :     if ( pSimpleHint )
     826             :     {
     827           0 :         sal_uLong nHintId = pSimpleHint->GetId();
     828             : 
     829           0 :         if ( nHintId == SC_HINT_DOCNAME_CHANGED )
     830             :         {
     831           0 :             aLbEntries->ActiveDocChanged();
     832             :         }
     833           0 :         else if ( NAV_LMODE_NONE == eListMode )
     834             :         {
     835             :             //  Table not any more
     836             :         }
     837             :         else
     838             :         {
     839           0 :             switch ( nHintId )
     840             :             {
     841             :                 case SC_HINT_TABLES_CHANGED:
     842           0 :                     aLbEntries->Refresh( SC_CONTENT_TABLE );
     843           0 :                     break;
     844             : 
     845             :                 case SC_HINT_DBAREAS_CHANGED:
     846           0 :                     aLbEntries->Refresh( SC_CONTENT_DBAREA );
     847           0 :                     break;
     848             : 
     849             :                 case SC_HINT_AREAS_CHANGED:
     850           0 :                     aLbEntries->Refresh( SC_CONTENT_RANGENAME );
     851           0 :                     break;
     852             : 
     853             :                 case SC_HINT_DRAW_CHANGED:
     854           0 :                     aLbEntries->Refresh( SC_CONTENT_GRAPHIC );
     855           0 :                     aLbEntries->Refresh( SC_CONTENT_OLEOBJECT );
     856           0 :                     aLbEntries->Refresh( SC_CONTENT_DRAWING );
     857           0 :                     break;
     858             : 
     859             :                 case SC_HINT_AREALINKS_CHANGED:
     860           0 :                     aLbEntries->Refresh( SC_CONTENT_AREALINK );
     861           0 :                     break;
     862             : 
     863             :                 //  SFX_HINT_DOCCHANGED not only at document change
     864             : 
     865             :                 case SC_HINT_NAVIGATOR_UPDATEALL:
     866           0 :                     UpdateAll();
     867           0 :                     break;
     868             : 
     869             :                 case FID_DATACHANGED:
     870             :                 case FID_ANYDATACHANGED:
     871           0 :                     aContentIdle.Start();      // Do not search notes immediately
     872           0 :                     break;
     873             :                 case FID_KILLEDITVIEW:
     874           0 :                     aLbEntries->ObjectFresh( SC_CONTENT_OLEOBJECT );
     875           0 :                     aLbEntries->ObjectFresh( SC_CONTENT_DRAWING );
     876           0 :                     aLbEntries->ObjectFresh( SC_CONTENT_GRAPHIC );
     877           0 :                     break;
     878             :                 default:
     879           0 :                     break;
     880             :             }
     881             :         }
     882             :     }
     883           0 :     else if ( dynamic_cast<const SfxEventHint*>(&rHint) )
     884             :     {
     885           0 :         sal_uLong nEventId = static_cast<const SfxEventHint&>(rHint).GetEventId();
     886           0 :         if ( nEventId == SFX_EVENT_ACTIVATEDOC )
     887             :         {
     888           0 :             aLbEntries->ActiveDocChanged();
     889           0 :             UpdateAll();
     890             :         }
     891             :     }
     892           0 : }
     893             : 
     894           0 : IMPL_LINK_TYPED( ScNavigatorDlg, TimeHdl, Idle*, pIdle, void )
     895             : {
     896           0 :     if ( pIdle != &aContentIdle )
     897           0 :         return;
     898             : 
     899           0 :     aLbEntries->Refresh( SC_CONTENT_NOTE );
     900             : }
     901             : 
     902           0 : void ScNavigatorDlg::SetDropMode(sal_uInt16 nNew)
     903             : {
     904           0 :     nDropMode = nNew;
     905           0 :     aTbxCmd->UpdateButtons();
     906             : 
     907           0 :     ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
     908           0 :     rCfg.SetDragMode(nDropMode);
     909           0 : }
     910             : 
     911           0 : void ScNavigatorDlg::SetCurrentCell( SCCOL nColNo, SCROW nRowNo )
     912             : {
     913           0 :     if ( (nColNo+1 != nCurCol) || (nRowNo+1 != nCurRow) )
     914             :     {
     915             :         // SID_CURRENTCELL == Item #0 clear cache, so it's possible
     916             :         // setting the current cell even in combined areas
     917           0 :         ppBoundItems[0]->ClearCache();
     918             : 
     919           0 :         ScAddress aScAddress( nColNo, nRowNo, 0 );
     920           0 :         OUString aAddr(aScAddress.Format(SCA_ABS));
     921             : 
     922           0 :         bool bUnmark = false;
     923           0 :         if ( GetViewData() )
     924           0 :             bUnmark = !pViewData->GetMarkData().IsCellMarked( nColNo, nRowNo );
     925             : 
     926           0 :         SfxStringItem   aPosItem( SID_CURRENTCELL, aAddr );
     927           0 :         SfxBoolItem     aUnmarkItem( FN_PARAM_1, bUnmark );     // cancel selektion
     928             : 
     929             :         rBindings.GetDispatcher()->Execute( SID_CURRENTCELL,
     930             :                                   SfxCallMode::SYNCHRON | SfxCallMode::RECORD,
     931           0 :                                   &aPosItem, &aUnmarkItem, 0L );
     932             :     }
     933           0 : }
     934             : 
     935           0 : void ScNavigatorDlg::SetCurrentCellStr( const OUString& rName )
     936             : {
     937           0 :     ppBoundItems[0]->ClearCache();
     938           0 :     SfxStringItem   aNameItem( SID_CURRENTCELL, rName );
     939             : 
     940             :     rBindings.GetDispatcher()->Execute( SID_CURRENTCELL,
     941             :                               SfxCallMode::SYNCHRON | SfxCallMode::RECORD,
     942           0 :                               &aNameItem, 0L );
     943           0 : }
     944             : 
     945           0 : void ScNavigatorDlg::SetCurrentTable( SCTAB nTabNo )
     946             : {
     947           0 :     if ( nTabNo != nCurTab )
     948             :     {
     949             :         // Table for basic is base-1
     950           0 :         SfxUInt16Item aTabItem( SID_CURRENTTAB, static_cast<sal_uInt16>(nTabNo) + 1 );
     951             :         rBindings.GetDispatcher()->Execute( SID_CURRENTTAB,
     952             :                                   SfxCallMode::SYNCHRON | SfxCallMode::RECORD,
     953           0 :                                   &aTabItem, 0L );
     954             :     }
     955           0 : }
     956             : 
     957           0 : void ScNavigatorDlg::SetCurrentTableStr( const OUString& rName )
     958             : {
     959           0 :     if (!GetViewData()) return;
     960             : 
     961           0 :     ScDocument* pDoc = pViewData->GetDocument();
     962           0 :     SCTAB nCount     = pDoc->GetTableCount();
     963           0 :     OUString aTabName;
     964             : 
     965           0 :     for ( SCTAB i=0; i<nCount; i++ )
     966             :     {
     967           0 :         pDoc->GetName( i, aTabName );
     968           0 :         if ( aTabName.equals(rName) )
     969             :         {
     970           0 :             SetCurrentTable( i );
     971           0 :             return;
     972             :         }
     973           0 :     }
     974             : }
     975             : 
     976           0 : void ScNavigatorDlg::SetCurrentObject( const OUString& rName )
     977             : {
     978           0 :     SfxStringItem aNameItem( SID_CURRENTOBJECT, rName );
     979             :     rBindings.GetDispatcher()->Execute( SID_CURRENTOBJECT,
     980             :                               SfxCallMode::SYNCHRON | SfxCallMode::RECORD,
     981           0 :                               &aNameItem, 0L );
     982           0 : }
     983             : 
     984           0 : void ScNavigatorDlg::SetCurrentDoc( const OUString& rDocName )        // activate
     985             : {
     986           0 :     SfxStringItem aDocItem( SID_CURRENTDOC, rDocName );
     987             :     rBindings.GetDispatcher()->Execute( SID_CURRENTDOC,
     988             :                               SfxCallMode::SYNCHRON | SfxCallMode::RECORD,
     989           0 :                               &aDocItem, 0L );
     990           0 : }
     991             : 
     992           0 : ScTabViewShell* ScNavigatorDlg::GetTabViewShell()
     993             : {
     994           0 :     return PTR_CAST( ScTabViewShell, SfxViewShell::Current() );
     995             : }
     996             : 
     997           0 : ScNavigatorSettings* ScNavigatorDlg::GetNavigatorSettings()
     998             : {
     999             :     //  Don't store the settings pointer here, because the settings belong to
    1000             :     //  the view, and the view may be closed while the navigator is open (reload).
    1001             :     //  If the pointer is cached here again later for performance reasons, it has to
    1002             :     //  be forgotten when the view is closed.
    1003             : 
    1004           0 :     ScTabViewShell* pViewSh = GetTabViewShell();
    1005           0 :     return pViewSh ? pViewSh->GetNavigatorSettings() : NULL;
    1006             : }
    1007             : 
    1008           0 : bool ScNavigatorDlg::GetViewData()
    1009             : {
    1010           0 :     ScTabViewShell* pViewSh = GetTabViewShell();
    1011           0 :     pViewData = pViewSh ? &pViewSh->GetViewData() : NULL;
    1012             : 
    1013           0 :     return ( pViewData != NULL );
    1014             : }
    1015             : 
    1016           0 : void ScNavigatorDlg::UpdateColumn( const SCCOL* pCol )
    1017             : {
    1018           0 :     if ( pCol )
    1019           0 :         nCurCol = *pCol;
    1020           0 :     else if ( GetViewData() )
    1021           0 :         nCurCol = pViewData->GetCurX() + 1;
    1022             : 
    1023           0 :     aEdCol->SetCol( nCurCol );
    1024           0 :     CheckDataArea();
    1025           0 : }
    1026             : 
    1027           0 : void ScNavigatorDlg::UpdateRow( const SCROW* pRow )
    1028             : {
    1029           0 :     if ( pRow )
    1030           0 :         nCurRow = *pRow;
    1031           0 :     else if ( GetViewData() )
    1032           0 :         nCurRow = pViewData->GetCurY() + 1;
    1033             : 
    1034           0 :     aEdRow->SetRow( nCurRow );
    1035           0 :     CheckDataArea();
    1036           0 : }
    1037             : 
    1038           0 : void ScNavigatorDlg::UpdateTable( const SCTAB* pTab )
    1039             : {
    1040           0 :     if ( pTab )
    1041           0 :         nCurTab = *pTab;
    1042           0 :     else if ( GetViewData() )
    1043           0 :         nCurTab = pViewData->GetTabNo();
    1044             : 
    1045           0 :     CheckDataArea();
    1046           0 : }
    1047             : 
    1048           0 : void ScNavigatorDlg::UpdateAll()
    1049             : {
    1050           0 :     switch ( eListMode )
    1051             :     {
    1052             :         case NAV_LMODE_DOCS:
    1053             :         case NAV_LMODE_DBAREAS:
    1054             :         case NAV_LMODE_AREAS:
    1055           0 :             aLbEntries->Refresh();
    1056           0 :             break;
    1057             : 
    1058             :         case NAV_LMODE_NONE:
    1059             :             //! ???
    1060           0 :             break;
    1061             : 
    1062             :         default:
    1063           0 :             break;
    1064             :     }
    1065             : 
    1066           0 :     aContentIdle.Stop();       // not again
    1067           0 : }
    1068             : 
    1069           0 : void ScNavigatorDlg::SetListMode( NavListMode eMode, bool bSetSize )
    1070             : {
    1071           0 :     if ( eMode != eListMode )
    1072             :     {
    1073           0 :         if ( eMode != NAV_LMODE_NONE )
    1074           0 :             bFirstBig = false;              // do not switch automatically any more
    1075             : 
    1076           0 :         eListMode = eMode;
    1077             : 
    1078           0 :         switch ( eMode )
    1079             :         {
    1080             :             case NAV_LMODE_NONE:
    1081           0 :                 ShowList( false, bSetSize );
    1082           0 :                 break;
    1083             : 
    1084             :             case NAV_LMODE_AREAS:
    1085             :             case NAV_LMODE_DBAREAS:
    1086             :             case NAV_LMODE_DOCS:
    1087           0 :                 aLbEntries->Refresh();
    1088           0 :                 ShowList( true, bSetSize );
    1089           0 :                 break;
    1090             : 
    1091             :             case NAV_LMODE_SCENARIOS:
    1092           0 :                 ShowScenarios( true, bSetSize );
    1093           0 :                 break;
    1094             :         }
    1095             : 
    1096           0 :         aTbxCmd->UpdateButtons();
    1097             : 
    1098           0 :         if ( eMode != NAV_LMODE_NONE )
    1099             :         {
    1100           0 :             ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
    1101           0 :             rCfg.SetListMode( (sal_uInt16) eMode );
    1102             :         }
    1103             :     }
    1104             : 
    1105           0 :     if ( pMarkArea )
    1106           0 :         UnmarkDataArea();
    1107           0 : }
    1108             : 
    1109           0 : void ScNavigatorDlg::ShowList( bool bShow, bool bSetSize )
    1110             : {
    1111           0 :     FloatingWindow* pFloat = pContextWin!=NULL ? pContextWin->GetFloatingWindow() : NULL;
    1112           0 :     Size aSize = GetParent()->GetOutputSizePixel();
    1113             : 
    1114           0 :     if ( bShow )
    1115             :     {
    1116           0 :         Size aMinSize = aInitSize;
    1117             : 
    1118           0 :         aMinSize.Height() += nInitListHeight;
    1119           0 :         if ( pFloat )
    1120           0 :             pFloat->SetMinOutputSizePixel( aMinSize );
    1121           0 :         aSize.Height() = nListModeHeight;
    1122           0 :         aLbEntries->Show();
    1123           0 :         aLbDocuments->Show();
    1124             :     }
    1125             :     else
    1126             :     {
    1127           0 :         if ( pFloat )
    1128             :         {
    1129           0 :             pFloat->SetMinOutputSizePixel( aInitSize );
    1130           0 :             nListModeHeight = aSize.Height();
    1131             :         }
    1132           0 :         aSize.Height() = aInitSize.Height();
    1133           0 :         aLbEntries->Hide();
    1134           0 :         aLbDocuments->Hide();
    1135             :     }
    1136           0 :     aWndScenarios->Hide();
    1137             : 
    1138           0 :     if ( pFloat )
    1139             :     {
    1140           0 :         if ( bSetSize )
    1141           0 :             pFloat->SetOutputSizePixel( aSize );
    1142             :     }
    1143             :     else
    1144             :     {
    1145           0 :         SfxNavigator* pNav = dynamic_cast<SfxNavigator*>(GetParent());
    1146           0 :         if (pNav != NULL)
    1147             :         {
    1148           0 :             Size aFloating = pNav->GetFloatingSize();
    1149           0 :             aFloating.Height() = aSize.Height();
    1150           0 :             pNav->SetFloatingSize( aFloating );
    1151             :         }
    1152             :     }
    1153           0 : }
    1154             : 
    1155           0 : void ScNavigatorDlg::ShowScenarios( bool bShow, bool bSetSize )
    1156             : {
    1157           0 :     FloatingWindow* pFloat = pContextWin!=NULL ? pContextWin->GetFloatingWindow() : NULL;
    1158           0 :     Size aSize = GetParent()->GetOutputSizePixel();
    1159             : 
    1160           0 :     if ( bShow )
    1161             :     {
    1162           0 :         Size aMinSize = aInitSize;
    1163           0 :         aMinSize.Height() += nInitListHeight;
    1164           0 :         if ( pFloat )
    1165           0 :             pFloat->SetMinOutputSizePixel( aMinSize );
    1166           0 :         aSize.Height() = nListModeHeight;
    1167             : 
    1168           0 :         rBindings.Invalidate( SID_SELECT_SCENARIO );
    1169           0 :         rBindings.Update( SID_SELECT_SCENARIO );
    1170             : 
    1171           0 :         aWndScenarios->Show();
    1172           0 :         aLbDocuments->Show();
    1173             :     }
    1174             :     else
    1175             :     {
    1176           0 :         if ( pFloat )
    1177             :         {
    1178           0 :             pFloat->SetMinOutputSizePixel( aInitSize );
    1179           0 :             nListModeHeight = aSize.Height();
    1180             :         }
    1181           0 :         aSize.Height() = aInitSize.Height();
    1182           0 :         aWndScenarios->Hide();
    1183           0 :         aLbDocuments->Hide();
    1184             :     }
    1185           0 :     aLbEntries->Hide();
    1186             : 
    1187           0 :     if ( pFloat )
    1188             :     {
    1189           0 :         if ( bSetSize )
    1190           0 :             pFloat->SetOutputSizePixel( aSize );
    1191             :     }
    1192             :     else
    1193             :     {
    1194           0 :         SfxNavigator* pNav = static_cast<SfxNavigator*>(GetParent());
    1195           0 :         Size aFloating = pNav->GetFloatingSize();
    1196           0 :         aFloating.Height() = aSize.Height();
    1197           0 :         pNav->SetFloatingSize( aFloating );
    1198             :     }
    1199           0 : }
    1200             : 
    1201             : //      documents for Dropdown-Listbox
    1202             : 
    1203           0 : void ScNavigatorDlg::GetDocNames( const OUString* pManualSel )
    1204             : {
    1205           0 :     aLbDocuments->Clear();
    1206           0 :     aLbDocuments->SetUpdateMode( false );
    1207             : 
    1208           0 :     ScDocShell* pCurrentSh = PTR_CAST( ScDocShell, SfxObjectShell::Current() );
    1209             : 
    1210           0 :     OUString aSelEntry;
    1211           0 :     SfxObjectShell* pSh = SfxObjectShell::GetFirst();
    1212           0 :     while ( pSh )
    1213             :     {
    1214           0 :         if ( pSh->ISA(ScDocShell) )
    1215             :         {
    1216           0 :             OUString aName = pSh->GetTitle();
    1217           0 :             OUString aEntry = aName;
    1218           0 :             if (pSh == pCurrentSh)
    1219           0 :                 aEntry += aStrActive;
    1220             :             else
    1221           0 :                 aEntry += aStrNotActive;
    1222           0 :             aLbDocuments->InsertEntry( aEntry );
    1223             : 
    1224           0 :             if ( pManualSel ? ( aName == *pManualSel )
    1225             :                             : ( pSh == pCurrentSh ) )
    1226           0 :                 aSelEntry = aEntry;                     // compelte entry for selection
    1227             :         }
    1228             : 
    1229           0 :         pSh = SfxObjectShell::GetNext( *pSh );
    1230             :     }
    1231             : 
    1232           0 :     aLbDocuments->InsertEntry( aStrActiveWin );
    1233             : 
    1234           0 :     OUString aHidden =  aLbEntries->GetHiddenTitle();
    1235           0 :     if (!aHidden.isEmpty())
    1236             :     {
    1237           0 :         OUString aEntry = aHidden;
    1238           0 :         aEntry += aStrHidden;
    1239           0 :         aLbDocuments->InsertEntry( aEntry );
    1240             : 
    1241           0 :         if ( pManualSel && aHidden == *pManualSel )
    1242           0 :             aSelEntry = aEntry;
    1243             :     }
    1244             : 
    1245           0 :     aLbDocuments->SetUpdateMode( true );
    1246             : 
    1247           0 :     aLbDocuments->SelectEntry( aSelEntry );
    1248           0 : }
    1249             : 
    1250           0 : void ScNavigatorDlg::MarkDataArea()
    1251             : {
    1252           0 :     ScTabViewShell* pViewSh = GetTabViewShell();
    1253             : 
    1254           0 :     if ( pViewSh )
    1255             :     {
    1256           0 :         if ( !pMarkArea )
    1257           0 :             pMarkArea = new ScArea;
    1258             : 
    1259           0 :         pViewSh->MarkDataArea();
    1260           0 :         ScRange aMarkRange;
    1261           0 :         pViewSh->GetViewData().GetMarkData().GetMarkArea(aMarkRange);
    1262           0 :         pMarkArea->nColStart = aMarkRange.aStart.Col();
    1263           0 :         pMarkArea->nRowStart = aMarkRange.aStart.Row();
    1264           0 :         pMarkArea->nColEnd = aMarkRange.aEnd.Col();
    1265           0 :         pMarkArea->nRowEnd = aMarkRange.aEnd.Row();
    1266           0 :         pMarkArea->nTab = aMarkRange.aStart.Tab();
    1267             :     }
    1268           0 : }
    1269             : 
    1270           0 : void ScNavigatorDlg::UnmarkDataArea()
    1271             : {
    1272           0 :     ScTabViewShell* pViewSh = GetTabViewShell();
    1273             : 
    1274           0 :     if ( pViewSh )
    1275             :     {
    1276           0 :         pViewSh->Unmark();
    1277           0 :         DELETEZ( pMarkArea );
    1278             :     }
    1279           0 : }
    1280             : 
    1281           0 : void ScNavigatorDlg::CheckDataArea()
    1282             : {
    1283           0 :     if ( aTbxCmd->IsItemChecked( IID_DATA ) && pMarkArea )
    1284             :     {
    1285           0 :         if (   nCurTab   != pMarkArea->nTab
    1286           0 :             || nCurCol <  pMarkArea->nColStart+1
    1287           0 :             || nCurCol >  pMarkArea->nColEnd+1
    1288           0 :             || nCurRow <  pMarkArea->nRowStart+1
    1289           0 :             || nCurRow >  pMarkArea->nRowEnd+1 )
    1290             :         {
    1291           0 :             aTbxCmd->SetItemState( IID_DATA, TriState(TRISTATE_TRUE) );
    1292           0 :             aTbxCmd->Select( IID_DATA );
    1293             :         }
    1294             :     }
    1295           0 : }
    1296             : 
    1297           0 : void ScNavigatorDlg::StartOfDataArea()
    1298             : {
    1299             :     //  pMarkArea evaluate ???
    1300             : 
    1301           0 :     if ( GetViewData() )
    1302             :     {
    1303           0 :         ScMarkData& rMark = pViewData->GetMarkData();
    1304           0 :         ScRange aMarkRange;
    1305           0 :         rMark.GetMarkArea( aMarkRange );
    1306             : 
    1307           0 :         SCCOL nCol = aMarkRange.aStart.Col();
    1308           0 :         SCROW nRow = aMarkRange.aStart.Row();
    1309             : 
    1310           0 :         if ( (nCol+1 != aEdCol->GetCol()) || (nRow+1 != aEdRow->GetRow()) )
    1311           0 :             SetCurrentCell( nCol, nRow );
    1312             :     }
    1313           0 : }
    1314             : 
    1315           0 : void ScNavigatorDlg::EndOfDataArea()
    1316             : {
    1317             :     //  pMarkArea evaluate ???
    1318             : 
    1319           0 :     if ( GetViewData() )
    1320             :     {
    1321           0 :         ScMarkData& rMark = pViewData->GetMarkData();
    1322           0 :         ScRange aMarkRange;
    1323           0 :         rMark.GetMarkArea( aMarkRange );
    1324             : 
    1325           0 :         SCCOL nCol = aMarkRange.aEnd.Col();
    1326           0 :         SCROW nRow = aMarkRange.aEnd.Row();
    1327             : 
    1328           0 :         if ( (nCol+1 != aEdCol->GetCol()) || (nRow+1 != aEdRow->GetRow()) )
    1329           0 :             SetCurrentCell( nCol, nRow );
    1330             :     }
    1331         156 : }
    1332             : 
    1333             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11