LCOV - code coverage report
Current view: top level - usr/local/src/libreoffice/sc/source/ui/navipi - navipi.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 3 679 0.4 %
Date: 2013-07-09 Functions: 3 80 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 <unotools/charclass.hxx>
      30             : #include <stdlib.h>
      31             : 
      32             : #include "viewdata.hxx"
      33             : #include "tabvwsh.hxx"
      34             : #include "docsh.hxx"
      35             : #include "document.hxx"
      36             : #include "dbdata.hxx"
      37             : #include "rangenam.hxx"
      38             : #include "rangeutl.hxx"
      39             : #include "popmenu.hxx"
      40             : #include "scresid.hxx"
      41             : #include "scmod.hxx"
      42             : #include "navicfg.hxx"
      43             : #include "navcitem.hxx"
      44             : #include "navipi.hrc"
      45             : #include "navipi.hxx"
      46             : #include "navsett.hxx"
      47             : #include "markdata.hxx"
      48             : 
      49             : #include <algorithm>
      50             : 
      51             : //  Timeout, um Notizen zu suchen
      52             : #define SC_CONTENT_TIMEOUT  1000
      53             : 
      54             : //  Toleranz, wieviel ueber der eingeklappten Groesse noch klein ist
      55             : #define SCNAV_MINTOL        5
      56             : 
      57             : //  maximum values for UI
      58             : #define SCNAV_MAXCOL        (MAXCOLCOUNT)
      59             : // macro is sufficient since only used in ctor
      60             : #define SCNAV_COLDIGITS     (static_cast<xub_StrLen>( floor( log10( static_cast<double>(SCNAV_MAXCOL)))) + 1)   // 1...256...18278
      61             : // precomputed constant because it is used in every change of spin button field
      62          31 : static const xub_StrLen SCNAV_COLLETTERS = ::ScColToAlpha(SCNAV_MAXCOL).Len();    // A...IV...ZZZ
      63             : 
      64             : #define SCNAV_MAXROW        (MAXROWCOUNT)
      65             : 
      66             : //------------------------------------------------------------------------
      67             : 
      68           0 : void ScNavigatorDlg::ReleaseFocus()
      69             : {
      70           0 :     SfxViewShell* pCurSh = SfxViewShell::Current();
      71             : 
      72           0 :     if ( pCurSh )
      73             :     {
      74           0 :         Window* pShellWnd = pCurSh->GetWindow();
      75           0 :         if ( pShellWnd )
      76           0 :             pShellWnd->GrabFocus();
      77             :     }
      78           0 : }
      79             : 
      80             : //==================================================================
      81             : //  class ColumnEdit
      82             : //==================================================================
      83             : 
      84           0 : ColumnEdit::ColumnEdit( ScNavigatorDlg* pParent, const ResId& rResId )
      85             :     :   SpinField   ( pParent, rResId ),
      86             :         rDlg        ( *pParent ),
      87             :         nCol        ( 0 ),
      88           0 :         nKeyGroup   ( KEYGROUP_ALPHA )
      89             : {
      90           0 :     SetMaxTextLen( SCNAV_COLDIGITS );   // 1...256...18278 or A...IV...ZZZ
      91           0 : }
      92             : 
      93             : //------------------------------------------------------------------------
      94             : 
      95           0 : ColumnEdit::~ColumnEdit()
      96             : {
      97           0 : }
      98             : 
      99             : //------------------------------------------------------------------------
     100             : 
     101           0 : long ColumnEdit::Notify( NotifyEvent& rNEvt )
     102             : {
     103           0 :     long nHandled = SpinField::Notify( rNEvt );
     104             : 
     105           0 :     sal_uInt16 nType = rNEvt.GetType();
     106           0 :     if ( nType == EVENT_KEYINPUT )
     107             :     {
     108           0 :         const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
     109           0 :         KeyCode aCode = pKEvt->GetKeyCode();
     110             : 
     111           0 :         if ( !aCode.IsMod1() && !aCode.IsMod2() )
     112             :         {
     113             :             //! Eingabeueberpruefung (nur Zahlen oder nur Buchstaben, max 2 bzw 3 Stellen)
     114             :             //! war vor VCL per nicht weitergeleitetem KeyInput
     115             :             //! dafuer was neues ausdenken!!!
     116             : 
     117           0 :             if ( aCode.GetCode() == KEY_RETURN )
     118             :             {
     119           0 :                 ScNavigatorDlg::ReleaseFocus();
     120           0 :                 ExecuteCol();
     121           0 :                 nHandled = 1;
     122             :             }
     123             :         }
     124             :     }
     125           0 :     else if ( nType == EVENT_LOSEFOCUS )    // LoseFocus wird bei VCL nicht gerufen
     126           0 :         EvalText();                         // nCol setzen
     127             : 
     128           0 :     return nHandled;
     129             : }
     130             : 
     131             : //------------------------------------------------------------------------
     132             : 
     133           0 : void ColumnEdit::LoseFocus()
     134             : {
     135           0 :     EvalText();
     136           0 : }
     137             : 
     138             : 
     139             : //------------------------------------------------------------------------
     140             : 
     141           0 : void ColumnEdit::Up()
     142             : {
     143           0 :     nCol++;
     144             : 
     145           0 :     if ( nCol <= SCNAV_MAXCOL )
     146           0 :         SetCol( nCol );
     147             :     else
     148           0 :         nCol--;
     149           0 : }
     150             : 
     151             : //------------------------------------------------------------------------
     152             : 
     153           0 : void ColumnEdit::Down()
     154             : {
     155           0 :     if ( nCol>1 )
     156           0 :         SetCol( nCol-1 );
     157           0 : }
     158             : 
     159             : //------------------------------------------------------------------------
     160             : 
     161           0 : void ColumnEdit::First()
     162             : {
     163           0 :     nCol = 1;
     164           0 :     SetText(OUString('A'));
     165           0 : }
     166             : 
     167             : //------------------------------------------------------------------------
     168             : 
     169           0 : void ColumnEdit::Last()
     170             : {
     171           0 :     String aStr;
     172           0 :     nCol = NumToAlpha( SCNAV_MAXCOL, aStr );
     173           0 :     SetText( aStr );
     174           0 : }
     175             : 
     176             : 
     177             : //------------------------------------------------------------------------
     178             : 
     179           0 : void ColumnEdit::EvalText()
     180             : {
     181           0 :     String aStrCol = GetText();
     182             : 
     183           0 :     if ( aStrCol.Len() > 0 )
     184             :     {
     185             :         //  nKeyGroup wird bei VCL mangels KeyInput nicht mehr gesetzt
     186             : 
     187           0 :         if ( CharClass::isAsciiNumeric(aStrCol) )
     188           0 :             nCol = NumStrToAlpha( aStrCol );
     189             :         else
     190           0 :             nCol = AlphaToNum( aStrCol );
     191             :     }
     192             :     else
     193           0 :         nCol = 0;
     194             : 
     195           0 :     SetText( aStrCol );
     196           0 :     nKeyGroup = KEYGROUP_ALPHA;
     197           0 : }
     198             : 
     199             : //------------------------------------------------------------------------
     200             : 
     201           0 : void ColumnEdit::ExecuteCol()
     202             : {
     203           0 :     SCROW nRow = rDlg.aEdRow.GetRow();
     204             : 
     205           0 :     EvalText(); // setzt nCol
     206             : 
     207           0 :     if ( (nCol > 0) && (nRow > 0) )
     208           0 :         rDlg.SetCurrentCell( nCol-1, nRow-1 );
     209           0 : }
     210             : 
     211             : //------------------------------------------------------------------------
     212             : 
     213           0 : void ColumnEdit::SetCol( SCCOL nColNo )
     214             : {
     215           0 :     String aStr;
     216             : 
     217           0 :     if ( nColNo == 0 )
     218             :     {
     219           0 :         nCol = 0;
     220           0 :         SetText( aStr );
     221             :     }
     222             :     else
     223             :     {
     224           0 :         nColNo = NumToAlpha( nColNo, aStr );
     225           0 :         nCol = nColNo;
     226           0 :         SetText( aStr );
     227           0 :     }
     228           0 : }
     229             : 
     230             : //------------------------------------------------------------------------
     231             : 
     232           0 : SCCOL ColumnEdit::AlphaToNum( String& rStr )
     233             : {
     234           0 :     SCCOL  nColumn = 0;
     235             : 
     236           0 :     if ( CharClass::isAsciiAlpha( rStr) )
     237             :     {
     238           0 :         rStr.ToUpperAscii();
     239             : 
     240           0 :         if (::AlphaToCol( nColumn, rStr))
     241           0 :             ++nColumn;
     242             : 
     243           0 :         if ( (rStr.Len() > SCNAV_COLLETTERS) || (nColumn > SCNAV_MAXCOL) )
     244             :         {
     245           0 :             nColumn = SCNAV_MAXCOL;
     246           0 :             NumToAlpha( nColumn, rStr );
     247             :         }
     248             :     }
     249             :     else
     250           0 :         rStr.Erase();
     251             : 
     252           0 :     return nColumn;
     253             : }
     254             : 
     255             : //------------------------------------------------------------------------
     256             : 
     257           0 : SCCOL ColumnEdit::NumStrToAlpha( String& rStr )
     258             : {
     259           0 :     SCCOL  nColumn = 0;
     260             : 
     261           0 :     if ( CharClass::isAsciiNumeric(rStr) )
     262           0 :         nColumn = NumToAlpha( (SCCOL)rStr.ToInt32(), rStr );
     263             :     else
     264           0 :         rStr.Erase();
     265             : 
     266           0 :     return nColumn;
     267             : }
     268             : 
     269             : //------------------------------------------------------------------------
     270             : 
     271           0 : SCCOL ColumnEdit::NumToAlpha( SCCOL nColNo, String& rStr )
     272             : {
     273           0 :     if ( nColNo > SCNAV_MAXCOL )
     274           0 :         nColNo = SCNAV_MAXCOL;
     275           0 :     else if ( nColNo < 1 )
     276           0 :         nColNo = 1;
     277             : 
     278           0 :     ::ScColToAlpha( rStr, nColNo - 1);
     279             : 
     280           0 :     return nColNo;
     281             : }
     282             : 
     283             : //==================================================================
     284             : //  class RowEdit
     285             : //==================================================================
     286             : 
     287           0 : RowEdit::RowEdit( ScNavigatorDlg* pParent, const ResId& rResId )
     288             :     :   NumericField( pParent, rResId ),
     289           0 :         rDlg        ( *pParent )
     290             : {
     291           0 :     SetMax( SCNAV_MAXROW);
     292           0 :     SetLast( SCNAV_MAXROW);
     293           0 : }
     294             : 
     295             : //------------------------------------------------------------------------
     296             : 
     297           0 : RowEdit::~RowEdit()
     298             : {
     299           0 : }
     300             : 
     301             : //------------------------------------------------------------------------
     302             : 
     303           0 : long RowEdit::Notify( NotifyEvent& rNEvt )
     304             : {
     305           0 :     long nHandled = NumericField::Notify( rNEvt );
     306             : 
     307           0 :     if ( rNEvt.GetType() == EVENT_KEYINPUT )
     308             :     {
     309           0 :         const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
     310           0 :         KeyCode aCode = pKEvt->GetKeyCode();
     311           0 :         if ( aCode.GetCode() == KEY_RETURN && !aCode.IsMod1() && !aCode.IsMod2() )
     312             :         {
     313           0 :             ScNavigatorDlg::ReleaseFocus();
     314           0 :             ExecuteRow();
     315           0 :             nHandled = 1;
     316             :         }
     317             :     }
     318             : 
     319           0 :     return nHandled;
     320             : }
     321             : 
     322             : //------------------------------------------------------------------------
     323             : 
     324           0 : void RowEdit::LoseFocus()
     325             : {
     326           0 : }
     327             : 
     328             : //------------------------------------------------------------------------
     329             : 
     330           0 : void RowEdit::ExecuteRow()
     331             : {
     332           0 :     SCCOL nCol = rDlg.aEdCol.GetCol();
     333           0 :     SCROW nRow = (SCROW)GetValue();
     334             : 
     335           0 :     if ( (nCol > 0) && (nRow > 0) )
     336           0 :         rDlg.SetCurrentCell( nCol-1, nRow-1 );
     337           0 : }
     338             : 
     339             : //==================================================================
     340             : //  class ScDocListBox
     341             : //==================================================================
     342             : 
     343           0 : ScDocListBox::ScDocListBox( ScNavigatorDlg* pParent, const ResId& rResId )
     344             :     :   ListBox ( pParent, rResId ),
     345           0 :         rDlg    ( *pParent )
     346             : {
     347           0 : }
     348             : 
     349             : //------------------------------------------------------------------------
     350             : 
     351           0 : ScDocListBox::~ScDocListBox()
     352             : {
     353           0 : }
     354             : 
     355             : //------------------------------------------------------------------------
     356             : 
     357           0 : void ScDocListBox::Select()
     358             : {
     359           0 :     ScNavigatorDlg::ReleaseFocus();
     360             : 
     361           0 :     String aDocName = GetSelectEntry();
     362           0 :     rDlg.aLbEntries.SelectDoc( aDocName );
     363           0 : }
     364             : 
     365             : //==================================================================
     366             : //  class CommandToolBox
     367             : //==================================================================
     368             : 
     369           0 : CommandToolBox::CommandToolBox( ScNavigatorDlg* pParent, const ResId& rResId )
     370             :     :   ToolBox ( pParent, rResId ),
     371           0 :         rDlg    ( *pParent )
     372             : {
     373           0 :     InitImageList();    // ImageList members of ScNavigatorDlg must be initialized before!
     374             : 
     375           0 :     SetSizePixel( CalcWindowSizePixel() );
     376           0 :     SetDropdownClickHdl( LINK(this, CommandToolBox, ToolBoxDropdownClickHdl) );
     377           0 :     SetItemBits( IID_DROPMODE, GetItemBits( IID_DROPMODE ) | TIB_DROPDOWNONLY );
     378           0 : }
     379             : 
     380             : //------------------------------------------------------------------------
     381             : 
     382           0 : CommandToolBox::~CommandToolBox()
     383             : {
     384           0 : }
     385             : 
     386             : //------------------------------------------------------------------------
     387             : 
     388           0 : void CommandToolBox::Select( sal_uInt16 nSelId )
     389             : {
     390             :     //  Modus umschalten ?
     391             : 
     392           0 :     if ( nSelId == IID_ZOOMOUT || nSelId == IID_SCENARIOS )
     393             :     {
     394           0 :         NavListMode eOldMode = rDlg.eListMode;
     395           0 :         NavListMode eNewMode = eOldMode;
     396             : 
     397           0 :         if ( nSelId == IID_SCENARIOS )                  // auf Szenario
     398             :         {
     399           0 :             if ( eOldMode == NAV_LMODE_SCENARIOS )
     400           0 :                 eNewMode = NAV_LMODE_AREAS;
     401             :             else
     402           0 :                 eNewMode = NAV_LMODE_SCENARIOS;
     403             :         }
     404             :         else                                            // ein/aus
     405             :         {
     406           0 :             if ( eOldMode == NAV_LMODE_NONE )
     407           0 :                 eNewMode = NAV_LMODE_AREAS;
     408             :             else
     409           0 :                 eNewMode = NAV_LMODE_NONE;
     410             :         }
     411           0 :         rDlg.SetListMode( eNewMode );
     412           0 :         UpdateButtons();
     413             :     }
     414             :     else
     415           0 :         switch ( nSelId )
     416             :         {
     417             :             case IID_DATA:
     418           0 :                 rDlg.MarkDataArea();
     419           0 :                 break;
     420             :             case IID_UP:
     421           0 :                 rDlg.StartOfDataArea();
     422           0 :                 break;
     423             :             case IID_DOWN:
     424           0 :                 rDlg.EndOfDataArea();
     425           0 :                 break;
     426             :             case IID_CHANGEROOT:
     427           0 :                 rDlg.aLbEntries.ToggleRoot();
     428           0 :                 UpdateButtons();
     429           0 :                 break;
     430             :         }
     431           0 : }
     432             : 
     433           0 : void CommandToolBox::Select()
     434             : {
     435           0 :     Select( GetCurItemId() );
     436           0 : }
     437             : 
     438             : //------------------------------------------------------------------------
     439             : 
     440           0 : void CommandToolBox::Click()
     441             : {
     442           0 : }
     443             : 
     444             : //------------------------------------------------------------------------
     445             : 
     446           0 : IMPL_LINK_NOARG(CommandToolBox, ToolBoxDropdownClickHdl)
     447             : {
     448             :     //  Das Popupmenue fuer den Dropmodus muss im Click (Button Down)
     449             :     //  statt im Select (Button Up) aufgerufen werden.
     450             : 
     451           0 :     if ( GetCurItemId() == IID_DROPMODE )
     452             :     {
     453           0 :         ScPopupMenu aPop( ScResId( RID_POPUP_DROPMODE ) );
     454           0 :         aPop.CheckItem( RID_DROPMODE_URL + rDlg.GetDropMode() );
     455           0 :         aPop.Execute( this, GetItemRect(IID_DROPMODE), POPUPMENU_EXECUTE_DOWN );
     456           0 :         sal_uInt16 nId = aPop.GetSelected();
     457             : 
     458           0 :         EndSelection();     // vor SetDropMode (SetDropMode ruft SetItemImage)
     459             : 
     460           0 :         if ( nId >= RID_DROPMODE_URL && nId <= RID_DROPMODE_COPY )
     461           0 :             rDlg.SetDropMode( nId - RID_DROPMODE_URL );
     462             : 
     463             :         //  den gehighlighteten Button aufheben
     464           0 :         Point aPoint;
     465           0 :         MouseEvent aLeave( aPoint, 0, MOUSE_LEAVEWINDOW | MOUSE_SYNTHETIC );
     466           0 :         MouseMove( aLeave );
     467             :     }
     468             : 
     469           0 :     return 1;
     470             : }
     471             : 
     472             : //------------------------------------------------------------------------
     473             : 
     474           0 : void CommandToolBox::UpdateButtons()
     475             : {
     476           0 :     NavListMode eMode = rDlg.eListMode;
     477           0 :     CheckItem( IID_SCENARIOS,   eMode == NAV_LMODE_SCENARIOS );
     478           0 :     CheckItem( IID_ZOOMOUT,     eMode != NAV_LMODE_NONE );
     479             : 
     480             :     //  Umschalten-Button:
     481           0 :     if ( eMode == NAV_LMODE_SCENARIOS || eMode == NAV_LMODE_NONE )
     482             :     {
     483           0 :         EnableItem( IID_CHANGEROOT, false );
     484           0 :         CheckItem( IID_CHANGEROOT, false );
     485             :     }
     486             :     else
     487             :     {
     488           0 :         EnableItem( IID_CHANGEROOT, sal_True );
     489           0 :         sal_Bool bRootSet = rDlg.aLbEntries.GetRootType() != SC_CONTENT_ROOT;
     490           0 :         CheckItem( IID_CHANGEROOT, bRootSet );
     491             :     }
     492             : 
     493           0 :     sal_uInt16 nImageId = 0;
     494           0 :     switch ( rDlg.nDropMode )
     495             :     {
     496           0 :         case SC_DROPMODE_URL:   nImageId = RID_IMG_DROP_URL;  break;
     497           0 :         case SC_DROPMODE_LINK:  nImageId = RID_IMG_DROP_LINK; break;
     498           0 :         case SC_DROPMODE_COPY:  nImageId = RID_IMG_DROP_COPY; break;
     499             :     }
     500           0 :     SetItemImage( IID_DROPMODE, Image(ScResId(nImageId)) );
     501           0 : }
     502             : 
     503           0 : void CommandToolBox::InitImageList()
     504             : {
     505           0 :     ImageList& rImgLst = rDlg.aCmdImageList;
     506             : 
     507           0 :     sal_uInt16 nCount = GetItemCount();
     508           0 :     for (sal_uInt16 i = 0; i < nCount; i++)
     509             :     {
     510           0 :         sal_uInt16 nId = GetItemId(i);
     511           0 :         SetItemImage( nId, rImgLst.GetImage( nId ) );
     512             :     }
     513           0 : }
     514             : 
     515           0 : void CommandToolBox::DataChanged( const DataChangedEvent& rDCEvt )
     516             : {
     517           0 :     if ( rDCEvt.GetType() == DATACHANGED_SETTINGS && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
     518             :     {
     519             :         //  update item images
     520             : 
     521           0 :         InitImageList();
     522           0 :         UpdateButtons();    // drop mode
     523             :     }
     524             : 
     525           0 :     ToolBox::DataChanged( rDCEvt );
     526           0 : }
     527             : 
     528             : //==================================================================
     529             : //  class ScNavigatorSettings
     530             : //==================================================================
     531             : 
     532           0 : ScNavigatorSettings::ScNavigatorSettings() :
     533             :     maExpandedVec( SC_CONTENT_COUNT, false ),
     534             :     mnRootSelected( SC_CONTENT_ROOT ),
     535           0 :     mnChildSelected( SC_CONTENT_NOCHILD )
     536             : {
     537           0 : }
     538             : 
     539             : //==================================================================
     540             : //  class ScNavigatorDlgWrapper
     541             : //==================================================================
     542             : 
     543          31 : SFX_IMPL_CHILDWINDOWCONTEXT( ScNavigatorDialogWrapper, SID_NAVIGATOR )
     544             : 
     545           0 : ScNavigatorDialogWrapper::ScNavigatorDialogWrapper(
     546             :                                     Window*          pParent,
     547             :                                     sal_uInt16           nId,
     548             :                                     SfxBindings*     pBind,
     549             :                                     SfxChildWinInfo* /* pInfo */ ) :
     550           0 :         SfxChildWindowContext( nId )
     551             : {
     552           0 :     pNavigator = new ScNavigatorDlg( pBind, this, pParent, true );
     553           0 :     SetWindow( pNavigator );
     554             : 
     555             :     //  Einstellungen muessen anderswo gemerkt werden,
     556             :     //  pInfo geht uns (ausser der Groesse) nichts mehr an
     557             : 
     558           0 :     Size aInfoSize = pParent->GetOutputSizePixel();     // von aussen vorgegebene Groesse
     559           0 :     Size aNavSize = pNavigator->GetOutputSizePixel();   // Default-Groesse
     560             : 
     561           0 :     aNavSize.Width()  = std::max( aInfoSize.Width(),  aNavSize.Width() );
     562           0 :     aNavSize.Height() = std::max( aInfoSize.Height(), aNavSize.Height() );
     563           0 :     pNavigator->nListModeHeight = std::max( aNavSize.Height(), pNavigator->nListModeHeight );
     564             : 
     565             :     //  Die Groesse kann in einem anderen Modul geaendert worden sein,
     566             :     //  deshalb muessen in Abhaengigkeit von der momentanen Groesse die
     567             :     //  Inhalte eingeblendet werden oder nicht
     568             : 
     569           0 :     sal_Bool bSmall = ( aInfoSize.Height() <= pNavigator->aInitSize.Height() + SCNAV_MINTOL );
     570           0 :     NavListMode eNavMode = NAV_LMODE_NONE;
     571           0 :     if (!bSmall)
     572             :     {
     573             :         //  wenn Szenario aktiv war, wieder einschalten
     574             : 
     575           0 :         ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
     576           0 :         NavListMode eLastMode = (NavListMode) rCfg.GetListMode();
     577           0 :         if ( eLastMode == NAV_LMODE_SCENARIOS )
     578           0 :             eNavMode = NAV_LMODE_SCENARIOS;
     579             :         else
     580           0 :             eNavMode = NAV_LMODE_AREAS;
     581             :     }
     582             : 
     583             :     //  Die Groesse des Floats nicht neu setzen (sal_False bei SetListMode), damit der
     584             :     //  Navigator nicht aufgeklappt wird, wenn er minimiert war (#38872#).
     585             : 
     586           0 :     pNavigator->SetListMode( eNavMode, false );     // FALSE: Groesse des Float nicht setzen
     587             : 
     588             :     sal_uInt16 nCmdId;
     589           0 :     switch (eNavMode)
     590             :     {
     591           0 :         case NAV_LMODE_DOCS:        nCmdId = IID_DOCS;      break;
     592           0 :         case NAV_LMODE_AREAS:       nCmdId = IID_AREAS;     break;
     593           0 :         case NAV_LMODE_DBAREAS:     nCmdId = IID_DBAREAS;   break;
     594           0 :         case NAV_LMODE_SCENARIOS:   nCmdId = IID_SCENARIOS; break;
     595           0 :         default:                    nCmdId = 0;
     596             :     }
     597           0 :     if (nCmdId)
     598             :     {
     599           0 :         pNavigator->aTbxCmd.CheckItem( nCmdId );
     600           0 :         pNavigator->DoResize();
     601             :     }
     602             : 
     603           0 :     pNavigator->bFirstBig = ( nCmdId == 0 );    // dann spaeter
     604           0 : }
     605             : 
     606           0 : void ScNavigatorDialogWrapper::Resizing( Size& rSize )
     607             : {
     608           0 :     ((ScNavigatorDlg*)GetWindow())->Resizing(rSize);
     609           0 : }
     610             : 
     611             : //========================================================================
     612             : // class ScNavigatorPI
     613             : //========================================================================
     614             : 
     615             : #define CTRL_ITEMS 4
     616             : 
     617             : #define REGISTER_SLOT(i,id) \
     618             :     ppBoundItems[i]=new ScNavigatorControllerItem(id,*this,rBindings);
     619             : 
     620           0 : ScNavigatorDlg::ScNavigatorDlg( SfxBindings* pB, SfxChildWindowContext* pCW, Window* pParent,
     621             :     const bool bUseStyleSettingsBackground) :
     622             :         Window( pParent, ScResId(RID_SCDLG_NAVIGATOR) ),
     623             :         rBindings   ( *pB ),                                // is used in CommandToolBox ctor
     624             :         aCmdImageList( ScResId( IL_CMD ) ),
     625             :         aFtCol      ( this, ScResId( FT_COL ) ),
     626             :         aEdCol      ( this, ScResId( ED_COL ) ),
     627             :         aFtRow      ( this, ScResId( FT_ROW ) ),
     628             :         aEdRow      ( this, ScResId( ED_ROW ) ),
     629             :         aTbxCmd     ( this, ScResId( TBX_CMD ) ),
     630             :         aLbEntries  ( this, ScResId( LB_ENTRIES ) ),
     631             :         aWndScenarios( this,ScResId( STR_QHLP_SCEN_LISTBOX), ScResId(STR_QHLP_SCEN_COMMENT)),
     632             :         aLbDocuments( this, ScResId( LB_DOCUMENTS ) ),
     633             :         aStrDragMode ( ScResId( STR_DRAGMODE ) ),
     634             :         aStrDisplay  ( ScResId( STR_DISPLAY ) ),
     635             :         aStrActiveWin( ScResId( STR_ACTIVEWIN ) ),
     636             :         pContextWin ( pCW ),
     637             :         pMarkArea   ( NULL ),
     638             :         pViewData   ( NULL ),
     639             :         nListModeHeight( 0 ),
     640             :         nInitListHeight( 0 ),
     641             :         eListMode   ( NAV_LMODE_NONE ),
     642             :         nDropMode   ( SC_DROPMODE_URL ),
     643             :         nCurCol     ( 0 ),
     644             :         nCurRow     ( 0 ),
     645             :         nCurTab     ( 0 ),
     646             :         bFirstBig   ( false ),
     647           0 :         mbUseStyleSettingsBackground(bUseStyleSettingsBackground)
     648             : {
     649           0 :     ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
     650           0 :     nDropMode = rCfg.GetDragMode();
     651             :     //  eListMode wird von aussen gesetzt, Root weiter unten
     652             : 
     653           0 :     aLbDocuments.SetDropDownLineCount(9);
     654           0 :     OUString aOpen(" (");
     655           0 :     aStrActive = aOpen;
     656           0 :     aStrActive += String( ScResId( STR_ACTIVE ) );
     657           0 :     aStrActive += ')';                                      // " (aktiv)"
     658           0 :     aStrNotActive = aOpen;
     659           0 :     aStrNotActive += String( ScResId( STR_NOTACTIVE ) );
     660           0 :     aStrNotActive += ')';                                   // " (inaktiv)"
     661           0 :     aStrHidden = aOpen;
     662           0 :     aStrHidden += String( ScResId( STR_HIDDEN ) );
     663           0 :     aStrHidden += ')';                                      // " (versteckt)"
     664             : 
     665           0 :     aTitleBase = GetText();
     666             : 
     667             :     const long nListboxYPos =
     668             :         ::std::max(
     669           0 :             (aTbxCmd.GetPosPixel().Y() + aTbxCmd.GetSizePixel().Height()),
     670           0 :             (aEdRow.GetPosPixel().Y() + aEdRow.GetSizePixel().Height()) )
     671           0 :         + 4;
     672           0 :     aLbEntries.setPosSizePixel( 0, nListboxYPos, 0, 0, WINDOW_POSSIZE_Y);
     673             : 
     674           0 :     nBorderOffset = aLbEntries.GetPosPixel().X();
     675             : 
     676           0 :     aInitSize.Width()  =  aTbxCmd.GetPosPixel().X()
     677           0 :                         + aTbxCmd.GetSizePixel().Width()
     678           0 :                         + nBorderOffset;
     679           0 :     aInitSize.Height() = aLbEntries.GetPosPixel().Y();
     680             : 
     681           0 :     nInitListHeight = aLbEntries.GetSizePixel().Height();
     682           0 :     nListModeHeight =  aInitSize.Height()
     683           0 :                      + nInitListHeight;
     684             : 
     685           0 :     ppBoundItems = new ScNavigatorControllerItem* [CTRL_ITEMS];
     686             : 
     687           0 :     rBindings.ENTERREGISTRATIONS();
     688             :     //-----------------------------
     689           0 :     REGISTER_SLOT( 0, SID_CURRENTCELL       );
     690           0 :     REGISTER_SLOT( 1, SID_CURRENTTAB        );
     691           0 :     REGISTER_SLOT( 2, SID_CURRENTDOC        );
     692           0 :     REGISTER_SLOT( 3, SID_SELECT_SCENARIO   );
     693             :     //-----------------------------
     694           0 :     rBindings.LEAVEREGISTRATIONS();
     695             : 
     696           0 :     StartListening( *(SFX_APP()) );
     697           0 :     StartListening( rBindings );
     698             : 
     699           0 :     aLbDocuments.Hide();        // bei NAV_LMODE_NONE gibts die nicht
     700             : 
     701           0 :     aLbEntries.InitWindowBits(sal_True);
     702             : 
     703           0 :     aLbEntries.SetSpaceBetweenEntries(0);
     704           0 :     aLbEntries.SetSelectionMode( SINGLE_SELECTION );
     705             :     aLbEntries.SetDragDropMode(     SV_DRAGDROP_CTRL_MOVE |
     706             :                                     SV_DRAGDROP_CTRL_COPY |
     707           0 :                                     SV_DRAGDROP_ENABLE_TOP );
     708             : 
     709             :     //  war eine Kategorie als Root ausgewaehlt?
     710           0 :     sal_uInt16 nLastRoot = rCfg.GetRootType();
     711           0 :     if ( nLastRoot )
     712           0 :         aLbEntries.SetRootType( nLastRoot );
     713             : 
     714           0 :     aLbEntries.Refresh();
     715           0 :     GetDocNames();
     716             : 
     717           0 :     aTbxCmd.UpdateButtons();
     718             : 
     719           0 :     UpdateColumn();
     720           0 :     UpdateRow();
     721           0 :     UpdateTable();
     722           0 :     aLbEntries.Hide();
     723           0 :     aWndScenarios.Hide();
     724           0 :     aWndScenarios.SetPosPixel( aLbEntries.GetPosPixel() );
     725             : 
     726           0 :     aContentTimer.SetTimeoutHdl( LINK( this, ScNavigatorDlg, TimeHdl ) );
     727           0 :     aContentTimer.SetTimeout( SC_CONTENT_TIMEOUT );
     728             : 
     729           0 :     FreeResource();
     730             : 
     731           0 :     aLbEntries.SetAccessibleRelationLabeledBy(&aLbEntries);
     732           0 :     aTbxCmd.SetAccessibleRelationLabeledBy(&aTbxCmd);
     733           0 :     aLbDocuments.SetAccessibleName(aStrActiveWin);
     734             : 
     735           0 :     if (pContextWin == NULL)
     736             :     {
     737             :         // When the context window is missing then the navigator is
     738             :         // displayed in the sidebar and has the whole deck to fill.
     739             :         // Therefore hide the button that hides all controls below the
     740             :         // top two rows of buttons.
     741           0 :         aTbxCmd.Select(IID_ZOOMOUT);
     742           0 :         aTbxCmd.RemoveItem(aTbxCmd.GetItemPos(IID_ZOOMOUT));
     743           0 :     }
     744           0 : }
     745             : 
     746             : //------------------------------------------------------------------------
     747             : 
     748           0 : ScNavigatorDlg::~ScNavigatorDlg()
     749             : {
     750           0 :     aContentTimer.Stop();
     751             : 
     752             :     sal_uInt16 i;
     753           0 :     for ( i=0; i<CTRL_ITEMS; i++ )
     754           0 :         delete ppBoundItems[i];
     755             : 
     756           0 :     delete [] ppBoundItems;
     757           0 :     delete pMarkArea;
     758             : 
     759           0 :     EndListening( *(SFX_APP()) );
     760           0 :     EndListening( rBindings );
     761           0 : }
     762             : 
     763             : //------------------------------------------------------------------------
     764             : 
     765           0 : void ScNavigatorDlg::Resizing( Size& rNewSize )  // Size = Outputsize?
     766             : {
     767           0 :     FloatingWindow* pFloat = pContextWin!=NULL ? pContextWin->GetFloatingWindow() : NULL;
     768           0 :     if ( pFloat )
     769             :     {
     770           0 :         Size aMinOut = pFloat->GetMinOutputSizePixel();
     771             : 
     772           0 :         if ( rNewSize.Width() < aMinOut.Width() )
     773           0 :             rNewSize.Width() = aMinOut.Width();
     774             : 
     775           0 :         if ( eListMode == NAV_LMODE_NONE )
     776           0 :             rNewSize.Height() = aInitSize.Height();
     777             :         else
     778             :         {
     779           0 :             if ( rNewSize.Height() < aMinOut.Height() )
     780           0 :                 rNewSize.Height() = aMinOut.Height();
     781             :         }
     782             :     }
     783           0 : }
     784             : 
     785             : 
     786             : 
     787           0 : void ScNavigatorDlg::Paint( const Rectangle& rRect )
     788             : {
     789           0 :     if (mbUseStyleSettingsBackground)
     790             :     {
     791           0 :         const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
     792           0 :         Color aBgColor = rStyleSettings.GetFaceColor();
     793           0 :         Wallpaper aBack( aBgColor );
     794             : 
     795           0 :         SetBackground( aBack );
     796           0 :         aFtCol.SetBackground( aBack );
     797           0 :         aFtRow.SetBackground( aBack );
     798             :     }
     799             :     else
     800             :     {
     801           0 :         aFtCol.SetBackground(Wallpaper());
     802           0 :         aFtRow.SetBackground(Wallpaper());
     803             :     }
     804             : 
     805           0 :     Window::Paint( rRect );
     806           0 : }
     807             : 
     808           0 : void ScNavigatorDlg::DataChanged( const DataChangedEvent& rDCEvt )
     809             : {
     810           0 :     if ( rDCEvt.GetType() == DATACHANGED_SETTINGS && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
     811             :     {
     812             :         //  toolbox images are exchanged in CommandToolBox::DataChanged
     813           0 :         Invalidate();
     814             :     }
     815             : 
     816           0 :     Window::DataChanged( rDCEvt );
     817           0 : }
     818             : 
     819             : //------------------------------------------------------------------------
     820             : 
     821           0 : void ScNavigatorDlg::Resize()
     822             : {
     823           0 :     DoResize();
     824           0 : }
     825             : 
     826             : //------------------------------------------------------------------------
     827             : 
     828           0 : void ScNavigatorDlg::DoResize()
     829             : {
     830           0 :     Size aNewSize = GetOutputSizePixel();
     831           0 :     long nTotalHeight = aNewSize.Height();
     832             : 
     833             :     //  bei angedocktem Navigator wird das Fenster evtl. erst klein erzeugt,
     834             :     //  dann kommt ein Resize auf die wirkliche Groesse -> dann Inhalte einschalten
     835             : 
     836           0 :     sal_Bool bSmall = ( nTotalHeight <= aInitSize.Height() + SCNAV_MINTOL );
     837           0 :     if ( !bSmall && bFirstBig )
     838             :     {
     839             :         //  Inhalte laut Config wieder einschalten
     840             : 
     841           0 :         bFirstBig = false;
     842           0 :         NavListMode eNavMode = NAV_LMODE_AREAS;
     843           0 :         ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
     844           0 :         NavListMode eLastMode = (NavListMode) rCfg.GetListMode();
     845           0 :         if ( eLastMode == NAV_LMODE_SCENARIOS )
     846           0 :             eNavMode = NAV_LMODE_SCENARIOS;
     847           0 :         SetListMode( eNavMode, false );         // FALSE: Groesse des Float nicht setzen
     848             :     }
     849             : 
     850             :     //  auch wenn die Inhalte nicht sichtbar sind, die Groessen anpassen,
     851             :     //  damit die Breite stimmt
     852             : 
     853           0 :     Point aEntryPos = aLbEntries.GetPosPixel();
     854           0 :     Point aListPos = aLbDocuments.GetPosPixel();
     855           0 :     aNewSize.Width() -= 2*nBorderOffset;
     856           0 :     Size aDocSize = aLbDocuments.GetSizePixel();
     857           0 :     aDocSize.Width() = aNewSize.Width();
     858             : 
     859           0 :     if(!bSmall)
     860             :     {
     861             : 
     862           0 :         long nListHeight = aLbDocuments.GetSizePixel().Height();
     863           0 :         aNewSize.Height() -= ( aEntryPos.Y() + nListHeight + 2*nBorderOffset );
     864           0 :         if(aNewSize.Height()<0) aNewSize.Height()=0;
     865             : 
     866           0 :         aListPos.Y() = aEntryPos.Y() + aNewSize.Height() + nBorderOffset;
     867             : 
     868           0 :         if(aListPos.Y() > aLbEntries.GetPosPixel().Y())
     869           0 :                             aLbDocuments.SetPosPixel( aListPos );
     870             : 
     871             :     }
     872           0 :     aLbEntries.SetSizePixel( aNewSize );
     873           0 :     aWndScenarios.SetSizePixel( aNewSize );
     874           0 :     aLbDocuments.SetSizePixel( aDocSize );
     875             : 
     876           0 :     sal_Bool bListMode = (eListMode != NAV_LMODE_NONE);
     877           0 :     if (pContextWin != NULL)
     878             :     {
     879           0 :         FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
     880           0 :         if ( pFloat && bListMode )
     881           0 :             nListModeHeight = nTotalHeight;
     882             :     }
     883           0 : }
     884             : 
     885             : //------------------------------------------------------------------------
     886             : 
     887           0 : void ScNavigatorDlg::Notify( SfxBroadcaster&, const SfxHint& rHint )
     888             : {
     889           0 :     if ( rHint.ISA(SfxSimpleHint) )
     890             :     {
     891           0 :         sal_uLong nHintId = ((SfxSimpleHint&)rHint).GetId();
     892             : 
     893           0 :         if ( nHintId == SC_HINT_DOCNAME_CHANGED )
     894             :         {
     895           0 :             aLbEntries.ActiveDocChanged();
     896             :         }
     897           0 :         else if ( NAV_LMODE_NONE == eListMode )
     898             :         {
     899             :             //  Tabellen hier nicht mehr
     900             :         }
     901             :         else
     902             :         {
     903           0 :             switch ( nHintId )
     904             :             {
     905             :                 case SC_HINT_TABLES_CHANGED:
     906           0 :                     aLbEntries.Refresh( SC_CONTENT_TABLE );
     907           0 :                     break;
     908             : 
     909             :                 case SC_HINT_DBAREAS_CHANGED:
     910           0 :                     aLbEntries.Refresh( SC_CONTENT_DBAREA );
     911           0 :                     break;
     912             : 
     913             :                 case SC_HINT_AREAS_CHANGED:
     914           0 :                     aLbEntries.Refresh( SC_CONTENT_RANGENAME );
     915           0 :                     break;
     916             : 
     917             :                 case SC_HINT_DRAW_CHANGED:
     918           0 :                     aLbEntries.Refresh( SC_CONTENT_GRAPHIC );
     919           0 :                     aLbEntries.Refresh( SC_CONTENT_OLEOBJECT );
     920           0 :                     aLbEntries.Refresh( SC_CONTENT_DRAWING );
     921           0 :                     break;
     922             : 
     923             :                 case SC_HINT_AREALINKS_CHANGED:
     924           0 :                     aLbEntries.Refresh( SC_CONTENT_AREALINK );
     925           0 :                     break;
     926             : 
     927             :                 //  SFX_HINT_DOCCHANGED kommt nicht nur bei Dokument-Wechsel
     928             : 
     929             :                 case SC_HINT_NAVIGATOR_UPDATEALL:
     930           0 :                     UpdateAll();
     931           0 :                     break;
     932             : 
     933             :                 case FID_DATACHANGED:
     934             :                 case FID_ANYDATACHANGED:
     935           0 :                     aContentTimer.Start();      // Notizen nicht sofort suchen
     936           0 :                     break;
     937             : 
     938             :                 default:
     939           0 :                     break;
     940             :             }
     941             :         }
     942             :     }
     943           0 :     else if ( rHint.ISA(SfxEventHint) )
     944             :     {
     945           0 :         sal_uLong nEventId = ((SfxEventHint&)rHint).GetEventId();
     946           0 :         if ( nEventId == SFX_EVENT_ACTIVATEDOC )
     947             :         {
     948           0 :             aLbEntries.ActiveDocChanged();
     949           0 :             UpdateAll();
     950             :         }
     951             :     }
     952           0 : }
     953             : 
     954             : //------------------------------------------------------------------------
     955             : 
     956           0 : IMPL_LINK( ScNavigatorDlg, TimeHdl, Timer*, pTimer )
     957             : {
     958           0 :     if ( pTimer != &aContentTimer )
     959           0 :         return 0;
     960             : 
     961           0 :     aLbEntries.Refresh( SC_CONTENT_NOTE );
     962           0 :     return 0;
     963             : }
     964             : 
     965             : //------------------------------------------------------------------------
     966             : 
     967           0 : void ScNavigatorDlg::SetDropMode(sal_uInt16 nNew)
     968             : {
     969           0 :     nDropMode = nNew;
     970           0 :     aTbxCmd.UpdateButtons();
     971             : 
     972           0 :     ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
     973           0 :     rCfg.SetDragMode(nDropMode);
     974           0 : }
     975             : 
     976             : //------------------------------------------------------------------------
     977             : 
     978           0 : void ScNavigatorDlg::CursorPosChanged()
     979             : {
     980             :     //! Eintraege selektieren ???
     981             : 
     982             : //  if ( GetDBAtCursor( aStrDbName ) )
     983             : //  if ( GetAreaAtCursor( aStrAreaName ) )
     984           0 : }
     985             : 
     986             : //------------------------------------------------------------------------
     987             : 
     988           0 : void ScNavigatorDlg::SetCurrentCell( SCCOL nColNo, SCROW nRowNo )
     989             : {
     990           0 :     if ( (nColNo+1 != nCurCol) || (nRowNo+1 != nCurRow) )
     991             :     {
     992             :         // SID_CURRENTCELL == Item #0 Cache leeren, damit das Setzen der
     993             :         // aktuellen Zelle auch in zusammengefassten Bereichen funktioniert.
     994           0 :         ppBoundItems[0]->ClearCache();
     995             : 
     996           0 :         ScAddress aScAddress( nColNo, nRowNo, 0 );
     997           0 :         String  aAddr;
     998           0 :         aScAddress.Format( aAddr, SCA_ABS );
     999             : 
    1000           0 :         sal_Bool bUnmark = false;
    1001           0 :         if ( GetViewData() )
    1002           0 :             bUnmark = !pViewData->GetMarkData().IsCellMarked( nColNo, nRowNo );
    1003             : 
    1004           0 :         SfxStringItem   aPosItem( SID_CURRENTCELL, aAddr );
    1005           0 :         SfxBoolItem     aUnmarkItem( FN_PARAM_1, bUnmark );     // ggf. Selektion aufheben
    1006             : 
    1007             :         rBindings.GetDispatcher()->Execute( SID_CURRENTCELL,
    1008             :                                   SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
    1009           0 :                                   &aPosItem, &aUnmarkItem, 0L );
    1010             :     }
    1011           0 : }
    1012             : 
    1013           0 : void ScNavigatorDlg::SetCurrentCellStr( const String rName )
    1014             : {
    1015           0 :     ppBoundItems[0]->ClearCache();
    1016           0 :     SfxStringItem   aNameItem( SID_CURRENTCELL, rName );
    1017             : 
    1018             :     rBindings.GetDispatcher()->Execute( SID_CURRENTCELL,
    1019             :                               SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
    1020           0 :                               &aNameItem, 0L );
    1021           0 : }
    1022             : 
    1023             : //------------------------------------------------------------------------
    1024             : 
    1025           0 : void ScNavigatorDlg::SetCurrentTable( SCTAB nTabNo )
    1026             : {
    1027           0 :     if ( nTabNo != nCurTab )
    1028             :     {
    1029             :         //  Tabelle fuer Basic ist 1-basiert
    1030           0 :         SfxUInt16Item aTabItem( SID_CURRENTTAB, static_cast<sal_uInt16>(nTabNo) + 1 );
    1031             :         rBindings.GetDispatcher()->Execute( SID_CURRENTTAB,
    1032             :                                   SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
    1033           0 :                                   &aTabItem, 0L );
    1034             :     }
    1035           0 : }
    1036             : 
    1037           0 : void ScNavigatorDlg::SetCurrentTableStr( const OUString& rName )
    1038             : {
    1039           0 :     if (!GetViewData()) return;
    1040             : 
    1041           0 :     ScDocument* pDoc = pViewData->GetDocument();
    1042           0 :     SCTAB nCount     = pDoc->GetTableCount();
    1043           0 :     OUString aTabName;
    1044             : 
    1045           0 :     for ( SCTAB i=0; i<nCount; i++ )
    1046             :     {
    1047           0 :         pDoc->GetName( i, aTabName );
    1048           0 :         if ( aTabName.equals(rName) )
    1049             :         {
    1050           0 :             SetCurrentTable( i );
    1051           0 :             return;
    1052             :         }
    1053           0 :     }
    1054             : }
    1055             : 
    1056             : //------------------------------------------------------------------------
    1057             : 
    1058           0 : void ScNavigatorDlg::SetCurrentObject( const String rName )
    1059             : {
    1060           0 :     SfxStringItem aNameItem( SID_CURRENTOBJECT, rName );
    1061             :     rBindings.GetDispatcher()->Execute( SID_CURRENTOBJECT,
    1062             :                               SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
    1063           0 :                               &aNameItem, 0L );
    1064           0 : }
    1065             : 
    1066             : //------------------------------------------------------------------------
    1067             : 
    1068           0 : void ScNavigatorDlg::SetCurrentDoc( const String& rDocName )        // aktivieren
    1069             : {
    1070           0 :     SfxStringItem aDocItem( SID_CURRENTDOC, rDocName );
    1071             :     rBindings.GetDispatcher()->Execute( SID_CURRENTDOC,
    1072             :                               SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
    1073           0 :                               &aDocItem, 0L );
    1074           0 : }
    1075             : 
    1076             : //------------------------------------------------------------------------
    1077             : 
    1078           0 : ScTabViewShell* ScNavigatorDlg::GetTabViewShell() const
    1079             : {
    1080           0 :     return PTR_CAST( ScTabViewShell, SfxViewShell::Current() );
    1081             : }
    1082             : 
    1083             : //------------------------------------------------------------------------
    1084             : 
    1085           0 : ScNavigatorSettings* ScNavigatorDlg::GetNavigatorSettings()
    1086             : {
    1087             :     //  Don't store the settings pointer here, because the settings belong to
    1088             :     //  the view, and the view may be closed while the navigator is open (reload).
    1089             :     //  If the pointer is cached here again later for performance reasons, it has to
    1090             :     //  be forgotten when the view is closed.
    1091             : 
    1092           0 :     ScTabViewShell* pViewSh = GetTabViewShell();
    1093           0 :     return pViewSh ? pViewSh->GetNavigatorSettings() : NULL;
    1094             : }
    1095             : 
    1096             : //------------------------------------------------------------------------
    1097             : 
    1098           0 : sal_Bool ScNavigatorDlg::GetViewData()
    1099             : {
    1100           0 :     ScTabViewShell* pViewSh = GetTabViewShell();
    1101           0 :     pViewData = pViewSh ? pViewSh->GetViewData() : NULL;
    1102             : 
    1103           0 :     return ( pViewData != NULL );
    1104             : }
    1105             : 
    1106             : //------------------------------------------------------------------------
    1107             : 
    1108           0 : void ScNavigatorDlg::UpdateColumn( const SCCOL* pCol )
    1109             : {
    1110           0 :     if ( pCol )
    1111           0 :         nCurCol = *pCol;
    1112           0 :     else if ( GetViewData() )
    1113           0 :         nCurCol = pViewData->GetCurX() + 1;
    1114             : 
    1115           0 :     aEdCol.SetCol( nCurCol );
    1116           0 :     CheckDataArea();
    1117           0 : }
    1118             : 
    1119             : //------------------------------------------------------------------------
    1120             : 
    1121           0 : void ScNavigatorDlg::UpdateRow( const SCROW* pRow )
    1122             : {
    1123           0 :     if ( pRow )
    1124           0 :         nCurRow = *pRow;
    1125           0 :     else if ( GetViewData() )
    1126           0 :         nCurRow = pViewData->GetCurY() + 1;
    1127             : 
    1128           0 :     aEdRow.SetRow( nCurRow );
    1129           0 :     CheckDataArea();
    1130           0 : }
    1131             : 
    1132             : //------------------------------------------------------------------------
    1133             : 
    1134           0 : void ScNavigatorDlg::UpdateTable( const SCTAB* pTab )
    1135             : {
    1136           0 :     if ( pTab )
    1137           0 :         nCurTab = *pTab;
    1138           0 :     else if ( GetViewData() )
    1139           0 :         nCurTab = pViewData->GetTabNo();
    1140             : 
    1141           0 :     CheckDataArea();
    1142           0 : }
    1143             : 
    1144             : //------------------------------------------------------------------------
    1145             : 
    1146           0 : void ScNavigatorDlg::UpdateAll()
    1147             : {
    1148           0 :     switch ( eListMode )
    1149             :     {
    1150             :         case NAV_LMODE_DOCS:
    1151             :         case NAV_LMODE_DBAREAS:
    1152             :         case NAV_LMODE_AREAS:
    1153           0 :             aLbEntries.Refresh();
    1154           0 :             break;
    1155             : 
    1156             :         case NAV_LMODE_NONE:
    1157             :             //! ???
    1158           0 :             break;
    1159             : 
    1160             :         default:
    1161           0 :             break;
    1162             :     }
    1163             : 
    1164           0 :     aContentTimer.Stop();       // dann nicht nochmal
    1165           0 : }
    1166             : 
    1167             : //------------------------------------------------------------------------
    1168             : 
    1169           0 : void ScNavigatorDlg::SetListMode( NavListMode eMode, sal_Bool bSetSize )
    1170             : {
    1171           0 :     if ( eMode != eListMode )
    1172             :     {
    1173           0 :         if ( eMode != NAV_LMODE_NONE )
    1174           0 :             bFirstBig = false;              // nicht mehr automatisch umschalten
    1175             : 
    1176           0 :         eListMode = eMode;
    1177             : 
    1178           0 :         switch ( eMode )
    1179             :         {
    1180             :             case NAV_LMODE_NONE:
    1181           0 :                 ShowList( false, bSetSize );
    1182           0 :                 break;
    1183             : 
    1184             :             case NAV_LMODE_AREAS:
    1185             :             case NAV_LMODE_DBAREAS:
    1186             :             case NAV_LMODE_DOCS:
    1187           0 :                 aLbEntries.Refresh();
    1188           0 :                 ShowList( sal_True, bSetSize );
    1189           0 :                 break;
    1190             : 
    1191             :             case NAV_LMODE_SCENARIOS:
    1192           0 :                 ShowScenarios( sal_True, bSetSize );
    1193           0 :                 break;
    1194             :         }
    1195             : 
    1196           0 :         aTbxCmd.UpdateButtons();
    1197             : 
    1198           0 :         if ( eMode != NAV_LMODE_NONE )
    1199             :         {
    1200           0 :             ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
    1201           0 :             rCfg.SetListMode( (sal_uInt16) eMode );
    1202             :         }
    1203             :     }
    1204             : 
    1205           0 :     if ( pMarkArea )
    1206           0 :         UnmarkDataArea();
    1207           0 : }
    1208             : 
    1209             : //------------------------------------------------------------------------
    1210             : 
    1211           0 : void ScNavigatorDlg::ShowList( sal_Bool bShow, sal_Bool bSetSize )
    1212             : {
    1213           0 :     FloatingWindow* pFloat = pContextWin!=NULL ? pContextWin->GetFloatingWindow() : NULL;
    1214           0 :     Size aSize = GetParent()->GetOutputSizePixel();
    1215             : 
    1216           0 :     if ( bShow )
    1217             :     {
    1218           0 :         Size aMinSize = aInitSize;
    1219             : 
    1220           0 :         aMinSize.Height() += nInitListHeight;
    1221           0 :         if ( pFloat )
    1222           0 :             pFloat->SetMinOutputSizePixel( aMinSize );
    1223           0 :         aSize.Height() = nListModeHeight;
    1224           0 :         aLbEntries.Show();
    1225           0 :         aLbDocuments.Show();
    1226             :     }
    1227             :     else
    1228             :     {
    1229           0 :         if ( pFloat )
    1230             :         {
    1231           0 :             pFloat->SetMinOutputSizePixel( aInitSize );
    1232           0 :             nListModeHeight = aSize.Height();
    1233             :         }
    1234           0 :         aSize.Height() = aInitSize.Height();
    1235           0 :         aLbEntries.Hide();
    1236           0 :         aLbDocuments.Hide();
    1237             :     }
    1238           0 :     aWndScenarios.Hide();
    1239             : 
    1240           0 :     if ( pFloat )
    1241             :     {
    1242           0 :         if ( bSetSize )
    1243           0 :             pFloat->SetOutputSizePixel( aSize );
    1244             :     }
    1245             :     else
    1246             :     {
    1247           0 :         SfxNavigator* pNav = dynamic_cast<SfxNavigator*>(GetParent());
    1248           0 :         if (pNav != NULL)
    1249             :         {
    1250           0 :             Size aFloating = pNav->GetFloatingSize();
    1251           0 :             aFloating.Height() = aSize.Height();
    1252           0 :             pNav->SetFloatingSize( aFloating );
    1253             :         }
    1254             :     }
    1255           0 : }
    1256             : 
    1257             : //------------------------------------------------------------------------
    1258             : 
    1259           0 : void ScNavigatorDlg::ShowScenarios( sal_Bool bShow, sal_Bool bSetSize )
    1260             : {
    1261           0 :     FloatingWindow* pFloat = pContextWin!=NULL ? pContextWin->GetFloatingWindow() : NULL;
    1262           0 :     Size aSize = GetParent()->GetOutputSizePixel();
    1263             : 
    1264           0 :     if ( bShow )
    1265             :     {
    1266           0 :         Size aMinSize = aInitSize;
    1267           0 :         aMinSize.Height() += nInitListHeight;
    1268           0 :         if ( pFloat )
    1269           0 :             pFloat->SetMinOutputSizePixel( aMinSize );
    1270           0 :         aSize.Height() = nListModeHeight;
    1271             : 
    1272           0 :         rBindings.Invalidate( SID_SELECT_SCENARIO );
    1273           0 :         rBindings.Update( SID_SELECT_SCENARIO );
    1274             : 
    1275           0 :         aWndScenarios.Show();
    1276           0 :         aLbDocuments.Show();
    1277             :     }
    1278             :     else
    1279             :     {
    1280           0 :         if ( pFloat )
    1281             :         {
    1282           0 :             pFloat->SetMinOutputSizePixel( aInitSize );
    1283           0 :             nListModeHeight = aSize.Height();
    1284             :         }
    1285           0 :         aSize.Height() = aInitSize.Height();
    1286           0 :         aWndScenarios.Hide();
    1287           0 :         aLbDocuments.Hide();
    1288             :     }
    1289           0 :     aLbEntries.Hide();
    1290             : 
    1291           0 :     if ( pFloat )
    1292             :     {
    1293           0 :         if ( bSetSize )
    1294           0 :             pFloat->SetOutputSizePixel( aSize );
    1295             :     }
    1296             :     else
    1297             :     {
    1298           0 :         SfxNavigator* pNav = (SfxNavigator*)GetParent();
    1299           0 :         Size aFloating = pNav->GetFloatingSize();
    1300           0 :         aFloating.Height() = aSize.Height();
    1301           0 :         pNav->SetFloatingSize( aFloating );
    1302             :     }
    1303           0 : }
    1304             : 
    1305             : 
    1306             : //------------------------------------------------------------------------
    1307             : //
    1308             : //      Dokumente fuer Dropdown-Listbox
    1309             : //
    1310             : //------------------------------------------------------------------------
    1311             : 
    1312           0 : void ScNavigatorDlg::GetDocNames( const String* pManualSel )
    1313             : {
    1314           0 :     aLbDocuments.Clear();
    1315           0 :     aLbDocuments.SetUpdateMode( false );
    1316             : 
    1317           0 :     ScDocShell* pCurrentSh = PTR_CAST( ScDocShell, SfxObjectShell::Current() );
    1318             : 
    1319           0 :     String aSelEntry;
    1320           0 :     SfxObjectShell* pSh = SfxObjectShell::GetFirst();
    1321           0 :     while ( pSh )
    1322             :     {
    1323           0 :         if ( pSh->ISA(ScDocShell) )
    1324             :         {
    1325           0 :             String aName = pSh->GetTitle();
    1326           0 :             String aEntry = aName;
    1327           0 :             if (pSh == pCurrentSh)
    1328           0 :                 aEntry += aStrActive;
    1329             :             else
    1330           0 :                 aEntry += aStrNotActive;
    1331           0 :             aLbDocuments.InsertEntry( aEntry );
    1332             : 
    1333           0 :             if ( pManualSel ? ( aName == *pManualSel )
    1334           0 :                             : ( pSh == pCurrentSh ) )
    1335           0 :                 aSelEntry = aEntry;                     // kompletter Eintrag zum Selektieren
    1336             :         }
    1337             : 
    1338           0 :         pSh = SfxObjectShell::GetNext( *pSh );
    1339             :     }
    1340             : 
    1341           0 :     aLbDocuments.InsertEntry( aStrActiveWin );
    1342             : 
    1343           0 :     String aHidden =  aLbEntries.GetHiddenTitle();
    1344           0 :     if (aHidden.Len())
    1345             :     {
    1346           0 :         String aEntry = aHidden;
    1347           0 :         aEntry += aStrHidden;
    1348           0 :         aLbDocuments.InsertEntry( aEntry );
    1349             : 
    1350           0 :         if ( pManualSel && aHidden == *pManualSel )
    1351           0 :             aSelEntry = aEntry;
    1352             :     }
    1353             : 
    1354           0 :     aLbDocuments.SetUpdateMode( sal_True );
    1355             : 
    1356           0 :     aLbDocuments.SelectEntry( aSelEntry );
    1357           0 : }
    1358             : 
    1359             : //------------------------------------------------------------------------
    1360             : 
    1361           0 : void ScNavigatorDlg::MarkDataArea()
    1362             : {
    1363           0 :     ScTabViewShell* pViewSh = GetTabViewShell();
    1364             : 
    1365           0 :     if ( pViewSh )
    1366             :     {
    1367           0 :         if ( !pMarkArea )
    1368           0 :             pMarkArea = new ScArea;
    1369             : 
    1370           0 :         pViewSh->MarkDataArea();
    1371           0 :         ScRange aMarkRange;
    1372           0 :         pViewSh->GetViewData()->GetMarkData().GetMarkArea(aMarkRange);
    1373           0 :         pMarkArea->nColStart = aMarkRange.aStart.Col();
    1374           0 :         pMarkArea->nRowStart = aMarkRange.aStart.Row();
    1375           0 :         pMarkArea->nColEnd = aMarkRange.aEnd.Col();
    1376           0 :         pMarkArea->nRowEnd = aMarkRange.aEnd.Row();
    1377           0 :         pMarkArea->nTab = aMarkRange.aStart.Tab();
    1378             :     }
    1379           0 : }
    1380             : 
    1381             : //------------------------------------------------------------------------
    1382             : 
    1383           0 : void ScNavigatorDlg::UnmarkDataArea()
    1384             : {
    1385           0 :     ScTabViewShell* pViewSh = GetTabViewShell();
    1386             : 
    1387           0 :     if ( pViewSh )
    1388             :     {
    1389           0 :         pViewSh->Unmark();
    1390           0 :         DELETEZ( pMarkArea );
    1391             :     }
    1392           0 : }
    1393             : 
    1394             : //------------------------------------------------------------------------
    1395             : 
    1396           0 : void ScNavigatorDlg::CheckDataArea()
    1397             : {
    1398           0 :     if ( aTbxCmd.IsItemChecked( IID_DATA ) && pMarkArea )
    1399             :     {
    1400           0 :         if (   nCurTab   != pMarkArea->nTab
    1401           0 :             || nCurCol <  pMarkArea->nColStart+1
    1402           0 :             || nCurCol >  pMarkArea->nColEnd+1
    1403           0 :             || nCurRow <  pMarkArea->nRowStart+1
    1404           0 :             || nCurRow >  pMarkArea->nRowEnd+1 )
    1405             :         {
    1406           0 :             aTbxCmd.SetItemState( IID_DATA, TriState(STATE_CHECK) );
    1407           0 :             aTbxCmd.Select( IID_DATA );
    1408             :         }
    1409             :     }
    1410           0 : }
    1411             : 
    1412             : //------------------------------------------------------------------------
    1413             : 
    1414           0 : void ScNavigatorDlg::StartOfDataArea()
    1415             : {
    1416             :     //  pMarkArea auswerten ???
    1417             : 
    1418           0 :     if ( GetViewData() )
    1419             :     {
    1420           0 :         ScMarkData& rMark = pViewData->GetMarkData();
    1421           0 :         ScRange aMarkRange;
    1422           0 :         rMark.GetMarkArea( aMarkRange );
    1423             : 
    1424           0 :         SCCOL nCol = aMarkRange.aStart.Col();
    1425           0 :         SCROW nRow = aMarkRange.aStart.Row();
    1426             : 
    1427           0 :         if ( (nCol+1 != aEdCol.GetCol()) || (nRow+1 != aEdRow.GetRow()) )
    1428           0 :             SetCurrentCell( nCol, nRow );
    1429             :     }
    1430           0 : }
    1431             : 
    1432             : //------------------------------------------------------------------------
    1433             : 
    1434           0 : void ScNavigatorDlg::EndOfDataArea()
    1435             : {
    1436             :     //  pMarkArea auswerten ???
    1437             : 
    1438           0 :     if ( GetViewData() )
    1439             :     {
    1440           0 :         ScMarkData& rMark = pViewData->GetMarkData();
    1441           0 :         ScRange aMarkRange;
    1442           0 :         rMark.GetMarkArea( aMarkRange );
    1443             : 
    1444           0 :         SCCOL nCol = aMarkRange.aEnd.Col();
    1445           0 :         SCROW nRow = aMarkRange.aEnd.Row();
    1446             : 
    1447           0 :         if ( (nCol+1 != aEdCol.GetCol()) || (nRow+1 != aEdRow.GetRow()) )
    1448           0 :             SetCurrentCell( nCol, nRow );
    1449             :     }
    1450           0 : }
    1451             : 
    1452             : //------------------------------------------------------------------------
    1453             : 
    1454           0 : SfxChildAlignment ScNavigatorDlg::CheckAlignment(
    1455             :                             SfxChildAlignment eActAlign, SfxChildAlignment eAlign )
    1456             : {
    1457             :     SfxChildAlignment eRetAlign;
    1458             : 
    1459             :     //! kein Andocken, wenn Listbox nicht da ???
    1460             : 
    1461           0 :     switch (eAlign)
    1462             :     {
    1463             :         case SFX_ALIGN_TOP:
    1464             :         case SFX_ALIGN_HIGHESTTOP:
    1465             :         case SFX_ALIGN_LOWESTTOP:
    1466             :         case SFX_ALIGN_BOTTOM:
    1467             :         case SFX_ALIGN_LOWESTBOTTOM:
    1468             :         case SFX_ALIGN_HIGHESTBOTTOM:
    1469           0 :             eRetAlign = eActAlign;              // nicht erlaubt
    1470           0 :             break;
    1471             : 
    1472             :         case SFX_ALIGN_LEFT:
    1473             :         case SFX_ALIGN_RIGHT:
    1474             :         case SFX_ALIGN_FIRSTLEFT:
    1475             :         case SFX_ALIGN_LASTLEFT:
    1476             :         case SFX_ALIGN_FIRSTRIGHT:
    1477             :         case SFX_ALIGN_LASTRIGHT:
    1478           0 :             eRetAlign = eAlign;                 // erlaubt
    1479           0 :             break;
    1480             : 
    1481             :         default:
    1482           0 :             eRetAlign = eAlign;
    1483           0 :             break;
    1484             :     }
    1485           0 :     return eRetAlign;
    1486          93 : }
    1487             : 
    1488             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10