summaryrefslogtreecommitdiff
path: root/sc/source/ui/navipi/navipi.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sc/source/ui/navipi/navipi.cxx')
-rw-r--r--sc/source/ui/navipi/navipi.cxx1565
1 files changed, 1565 insertions, 0 deletions
diff --git a/sc/source/ui/navipi/navipi.cxx b/sc/source/ui/navipi/navipi.cxx
new file mode 100644
index 000000000000..846e2ce53310
--- /dev/null
+++ b/sc/source/ui/navipi/navipi.cxx
@@ -0,0 +1,1565 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sc.hxx"
+
+//------------------------------------------------------------------
+
+// #include <math.h>
+#include <rangelst.hxx>
+#include <sfx2/app.hxx>
+#include <sfx2/bindings.hxx>
+#include <sfx2/dispatch.hxx>
+#include <sfx2/event.hxx>
+#include <sfx2/imgmgr.hxx>
+#include <sfx2/navigat.hxx>
+#include <svl/stritem.hxx>
+#include <svl/urlbmk.hxx>
+#include <vcl/sound.hxx>
+#include <unotools/charclass.hxx>
+#include <stdlib.h>
+
+#include "viewdata.hxx"
+#include "tabvwsh.hxx"
+#include "docsh.hxx"
+#include "document.hxx"
+#include "dbcolect.hxx"
+#include "rangenam.hxx"
+#include "rangeutl.hxx"
+#include "popmenu.hxx"
+#include "scresid.hxx"
+#include "scmod.hxx"
+#include "navicfg.hxx"
+#include "navcitem.hxx"
+#include "navipi.hrc"
+#include "navipi.hxx"
+#include "navsett.hxx"
+
+// Timeout, um Notizen zu suchen
+#define SC_CONTENT_TIMEOUT 1000
+
+// Toleranz, wieviel ueber der eingeklappten Groesse noch klein ist
+#define SCNAV_MINTOL 5
+
+// maximum values for UI
+#define SCNAV_MAXCOL (MAXCOLCOUNT)
+// macro is sufficient since only used in ctor
+#define SCNAV_COLDIGITS (static_cast<xub_StrLen>( floor( log10( static_cast<double>(SCNAV_MAXCOL)))) + 1) // 1...256...18278
+// precomputed constant because it is used in every change of spin button field
+static const xub_StrLen SCNAV_COLLETTERS = ::ScColToAlpha(SCNAV_MAXCOL).Len(); // A...IV...ZZZ
+
+#define SCNAV_MAXROW (MAXROWCOUNT)
+
+//------------------------------------------------------------------------
+
+// static
+void ScNavigatorDlg::ReleaseFocus()
+{
+ SfxViewShell* pCurSh = SfxViewShell::Current();
+
+ if ( pCurSh )
+ {
+ Window* pShellWnd = pCurSh->GetWindow();
+ if ( pShellWnd )
+ pShellWnd->GrabFocus();
+ }
+}
+
+//==================================================================
+// class ColumnEdit
+//==================================================================
+
+ColumnEdit::ColumnEdit( ScNavigatorDlg* pParent, const ResId& rResId )
+ : SpinField ( pParent, rResId ),
+ rDlg ( *pParent ),
+ nCol ( 0 ),
+ nKeyGroup ( KEYGROUP_ALPHA )
+{
+ SetMaxTextLen( SCNAV_COLDIGITS ); // 1...256...18278 or A...IV...ZZZ
+}
+
+//------------------------------------------------------------------------
+
+__EXPORT ColumnEdit::~ColumnEdit()
+{
+}
+
+//------------------------------------------------------------------------
+
+long __EXPORT ColumnEdit::Notify( NotifyEvent& rNEvt )
+{
+ long nHandled = SpinField::Notify( rNEvt );
+
+ USHORT nType = rNEvt.GetType();
+ if ( nType == EVENT_KEYINPUT )
+ {
+ const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
+ KeyCode aCode = pKEvt->GetKeyCode();
+
+ if ( !aCode.IsMod1() && !aCode.IsMod2() )
+ {
+ //! Eingabeueberpruefung (nur Zahlen oder nur Buchstaben, max 2 bzw 3 Stellen)
+ //! war vor VCL per nicht weitergeleitetem KeyInput
+ //! dafuer was neues ausdenken!!!
+
+ if ( aCode.GetCode() == KEY_RETURN )
+ {
+ ScNavigatorDlg::ReleaseFocus();
+ ExecuteCol();
+ nHandled = 1;
+ }
+ }
+ }
+ else if ( nType == EVENT_LOSEFOCUS ) // LoseFocus wird bei VCL nicht gerufen
+ EvalText(); // nCol setzen
+
+ return nHandled;
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT ColumnEdit::LoseFocus()
+{
+ EvalText();
+}
+
+
+//------------------------------------------------------------------------
+
+void __EXPORT ColumnEdit::Up()
+{
+ nCol++;
+
+#ifdef OS2
+ if ( nCol > SCNAV_MAXCOL )
+ nCol = 1;
+#endif
+
+ if ( nCol <= SCNAV_MAXCOL )
+ SetCol( nCol );
+ else
+ nCol--;
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT ColumnEdit::Down()
+{
+ if ( nCol>1 )
+ SetCol( nCol-1 );
+#ifdef OS2
+ else
+ SetCol( SCNAV_MAXCOL );
+#endif
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT ColumnEdit::First()
+{
+ nCol = 1;
+ SetText( 'A' );
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT ColumnEdit::Last()
+{
+ String aStr;
+ nCol = NumToAlpha( SCNAV_MAXCOL, aStr );
+ SetText( aStr );
+}
+
+
+//------------------------------------------------------------------------
+
+void ColumnEdit::EvalText()
+{
+ String aStrCol = GetText();
+
+ if ( aStrCol.Len() > 0 )
+ {
+ // nKeyGroup wird bei VCL mangels KeyInput nicht mehr gesetzt
+
+ if ( CharClass::isAsciiNumeric(aStrCol) )
+ nCol = NumStrToAlpha( aStrCol );
+ else
+ nCol = AlphaToNum( aStrCol );
+ }
+ else
+ nCol = 0;
+
+ SetText( aStrCol );
+ nKeyGroup = KEYGROUP_ALPHA;
+}
+
+//------------------------------------------------------------------------
+
+void ColumnEdit::ExecuteCol()
+{
+ SCROW nRow = rDlg.aEdRow.GetRow();
+
+ EvalText(); // setzt nCol
+
+ if ( (nCol > 0) && (nRow > 0) )
+ rDlg.SetCurrentCell( nCol-1, nRow-1 );
+}
+
+//------------------------------------------------------------------------
+
+void ColumnEdit::SetCol( SCCOL nColNo )
+{
+ String aStr;
+
+ if ( nColNo == 0 )
+ {
+ nCol = 0;
+ SetText( aStr );
+ }
+ else
+ {
+ nColNo = NumToAlpha( nColNo, aStr );
+ nCol = nColNo;
+ SetText( aStr );
+ }
+}
+
+//------------------------------------------------------------------------
+
+SCCOL ColumnEdit::AlphaToNum( String& rStr )
+{
+ SCCOL nColumn = 0;
+
+ if ( CharClass::isAsciiAlpha( rStr) )
+ {
+ rStr.ToUpperAscii();
+
+ if (::AlphaToCol( nColumn, rStr))
+ ++nColumn;
+
+ if ( (rStr.Len() > SCNAV_COLLETTERS) || (nColumn > SCNAV_MAXCOL) )
+ {
+ nColumn = SCNAV_MAXCOL;
+ NumToAlpha( nColumn, rStr );
+ }
+ }
+ else
+ rStr.Erase();
+
+ return nColumn;
+}
+
+//------------------------------------------------------------------------
+
+SCCOL ColumnEdit::NumStrToAlpha( String& rStr )
+{
+ SCCOL nColumn = 0;
+
+ if ( CharClass::isAsciiNumeric(rStr) )
+ nColumn = NumToAlpha( (SCCOL)rStr.ToInt32(), rStr );
+ else
+ rStr.Erase();
+
+ return nColumn;
+}
+
+//------------------------------------------------------------------------
+
+SCCOL ColumnEdit::NumToAlpha( SCCOL nColNo, String& rStr )
+{
+ if ( nColNo > SCNAV_MAXCOL )
+ nColNo = SCNAV_MAXCOL;
+ else if ( nColNo < 1 )
+ nColNo = 1;
+
+ ::ScColToAlpha( rStr, nColNo - 1);
+
+ return nColNo;
+}
+
+//==================================================================
+// class RowEdit
+//==================================================================
+
+RowEdit::RowEdit( ScNavigatorDlg* pParent, const ResId& rResId )
+ : NumericField( pParent, rResId ),
+ rDlg ( *pParent )
+{
+ SetMax( SCNAV_MAXROW);
+ SetLast( SCNAV_MAXROW);
+}
+
+//------------------------------------------------------------------------
+
+__EXPORT RowEdit::~RowEdit()
+{
+}
+
+//------------------------------------------------------------------------
+
+long __EXPORT RowEdit::Notify( NotifyEvent& rNEvt )
+{
+ long nHandled = NumericField::Notify( rNEvt );
+
+ if ( rNEvt.GetType() == EVENT_KEYINPUT )
+ {
+ const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
+ KeyCode aCode = pKEvt->GetKeyCode();
+ if ( aCode.GetCode() == KEY_RETURN && !aCode.IsMod1() && !aCode.IsMod2() )
+ {
+ ScNavigatorDlg::ReleaseFocus();
+ ExecuteRow();
+ nHandled = 1;
+ }
+ }
+
+ return nHandled;
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT RowEdit::LoseFocus()
+{
+}
+
+//------------------------------------------------------------------------
+
+void RowEdit::ExecuteRow()
+{
+ SCCOL nCol = rDlg.aEdCol.GetCol();
+ SCROW nRow = (SCROW)GetValue();
+
+ if ( (nCol > 0) && (nRow > 0) )
+ rDlg.SetCurrentCell( nCol-1, nRow-1 );
+}
+
+//==================================================================
+// class ScDocListBox
+//==================================================================
+
+ScDocListBox::ScDocListBox( ScNavigatorDlg* pParent, const ResId& rResId )
+ : ListBox ( pParent, rResId ),
+ rDlg ( *pParent )
+{
+}
+
+//------------------------------------------------------------------------
+
+__EXPORT ScDocListBox::~ScDocListBox()
+{
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT ScDocListBox::Select()
+{
+ ScNavigatorDlg::ReleaseFocus();
+
+ String aDocName = GetSelectEntry();
+ rDlg.aLbEntries.SelectDoc( aDocName );
+}
+
+//==================================================================
+// class CommandToolBox
+//==================================================================
+
+CommandToolBox::CommandToolBox( ScNavigatorDlg* pParent, const ResId& rResId )
+ : ToolBox ( pParent, rResId ),
+ rDlg ( *pParent )
+{
+ InitImageList(); // ImageList members of ScNavigatorDlg must be initialized before!
+
+ SetSizePixel( CalcWindowSizePixel() );
+ SetDropdownClickHdl( LINK(this, CommandToolBox, ToolBoxDropdownClickHdl) );
+ SetItemBits( IID_DROPMODE, GetItemBits( IID_DROPMODE ) | TIB_DROPDOWNONLY );
+// EnableItem( IID_UP, FALSE );
+// EnableItem( IID_DOWN, FALSE );
+}
+
+//------------------------------------------------------------------------
+
+__EXPORT CommandToolBox::~CommandToolBox()
+{
+}
+
+//------------------------------------------------------------------------
+
+void CommandToolBox::Select( USHORT nSelId )
+{
+ // Modus umschalten ?
+
+ if ( nSelId == IID_ZOOMOUT || nSelId == IID_SCENARIOS )
+ {
+ NavListMode eOldMode = rDlg.eListMode;
+ NavListMode eNewMode = eOldMode;
+
+ if ( nSelId == IID_SCENARIOS ) // auf Szenario
+ {
+ if ( eOldMode == NAV_LMODE_SCENARIOS )
+ eNewMode = NAV_LMODE_AREAS;
+ else
+ eNewMode = NAV_LMODE_SCENARIOS;
+ }
+ else // ein/aus
+ {
+ if ( eOldMode == NAV_LMODE_NONE )
+ eNewMode = NAV_LMODE_AREAS;
+ else
+ eNewMode = NAV_LMODE_NONE;
+ }
+ rDlg.SetListMode( eNewMode );
+ UpdateButtons();
+ }
+ else
+ switch ( nSelId )
+ {
+ case IID_DATA:
+ rDlg.MarkDataArea();
+ break;
+ case IID_UP:
+ rDlg.StartOfDataArea();
+ break;
+ case IID_DOWN:
+ rDlg.EndOfDataArea();
+ break;
+ // IID_DROPMODE ist in Click
+ case IID_CHANGEROOT:
+ rDlg.aLbEntries.ToggleRoot();
+ UpdateButtons();
+ break;
+ }
+}
+
+void __EXPORT CommandToolBox::Select()
+{
+ Select( GetCurItemId() );
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT CommandToolBox::Click()
+{
+}
+
+//------------------------------------------------------------------------
+
+IMPL_LINK( CommandToolBox, ToolBoxDropdownClickHdl, ToolBox*, EMPTYARG )
+{
+ // Das Popupmenue fuer den Dropmodus muss im Click (Button Down)
+ // statt im Select (Button Up) aufgerufen werden.
+
+ if ( GetCurItemId() == IID_DROPMODE )
+ {
+ ScPopupMenu aPop( ScResId( RID_POPUP_DROPMODE ) );
+ aPop.CheckItem( RID_DROPMODE_URL + rDlg.GetDropMode() );
+ aPop.Execute( this, GetItemRect(IID_DROPMODE), POPUPMENU_EXECUTE_DOWN );
+ USHORT nId = aPop.GetSelected();
+
+ EndSelection(); // vor SetDropMode (SetDropMode ruft SetItemImage)
+
+ if ( nId >= RID_DROPMODE_URL && nId <= RID_DROPMODE_COPY )
+ rDlg.SetDropMode( nId - RID_DROPMODE_URL );
+
+ // #49956# den gehighlighteten Button aufheben
+ Point aPoint;
+ MouseEvent aLeave( aPoint, 0, MOUSE_LEAVEWINDOW | MOUSE_SYNTHETIC );
+ MouseMove( aLeave );
+ }
+
+ return 1;
+}
+
+//------------------------------------------------------------------------
+
+void CommandToolBox::UpdateButtons()
+{
+ NavListMode eMode = rDlg.eListMode;
+ CheckItem( IID_SCENARIOS, eMode == NAV_LMODE_SCENARIOS );
+ CheckItem( IID_ZOOMOUT, eMode != NAV_LMODE_NONE );
+
+ // Umschalten-Button:
+ if ( eMode == NAV_LMODE_SCENARIOS || eMode == NAV_LMODE_NONE )
+ {
+ EnableItem( IID_CHANGEROOT, FALSE );
+ CheckItem( IID_CHANGEROOT, FALSE );
+ }
+ else
+ {
+ EnableItem( IID_CHANGEROOT, TRUE );
+ BOOL bRootSet = rDlg.aLbEntries.GetRootType() != SC_CONTENT_ROOT;
+ CheckItem( IID_CHANGEROOT, bRootSet );
+ }
+
+ BOOL bHC = GetSettings().GetStyleSettings().GetHighContrastMode();
+
+ USHORT nImageId = 0;
+ switch ( rDlg.nDropMode )
+ {
+ case SC_DROPMODE_URL: nImageId = bHC ? RID_IMG_H_DROP_URL : RID_IMG_DROP_URL; break;
+ case SC_DROPMODE_LINK: nImageId = bHC ? RID_IMG_H_DROP_LINK : RID_IMG_DROP_LINK; break;
+ case SC_DROPMODE_COPY: nImageId = bHC ? RID_IMG_H_DROP_COPY : RID_IMG_DROP_COPY; break;
+ }
+ SetItemImage( IID_DROPMODE, Image(ScResId(nImageId)) );
+}
+
+void CommandToolBox::InitImageList()
+{
+ BOOL bHC = GetSettings().GetStyleSettings().GetHighContrastMode();
+
+ ImageList& rImgLst = bHC ? rDlg.aCmdImageListH : rDlg.aCmdImageList;
+
+ USHORT nCount = GetItemCount();
+ for (USHORT i = 0; i < nCount; i++)
+ {
+ USHORT nId = GetItemId(i);
+ SetItemImage( nId, rImgLst.GetImage( nId ) );
+ }
+}
+
+void CommandToolBox::DataChanged( const DataChangedEvent& rDCEvt )
+{
+ if ( rDCEvt.GetType() == DATACHANGED_SETTINGS && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
+ {
+ // update item images
+
+ InitImageList();
+ UpdateButtons(); // drop mode
+ }
+
+ ToolBox::DataChanged( rDCEvt );
+}
+
+//==================================================================
+// class ScNavigatorSettings
+//==================================================================
+
+ScNavigatorSettings::ScNavigatorSettings() :
+ maExpandedVec( SC_CONTENT_COUNT, FALSE ),
+ mnRootSelected( SC_CONTENT_ROOT ),
+ mnChildSelected( SC_CONTENT_NOCHILD )
+{
+}
+
+//==================================================================
+// class ScNavigatorDlgWrapper
+//==================================================================
+
+SFX_IMPL_CHILDWINDOWCONTEXT( ScNavigatorDialogWrapper, SID_NAVIGATOR )
+
+#define IS_MODE(bit)(((nFlags)&(bit))==(bit))
+
+ScNavigatorDialogWrapper::ScNavigatorDialogWrapper(
+ Window* pParent,
+ USHORT nId,
+ SfxBindings* pBind,
+ SfxChildWinInfo* /* pInfo */ ) :
+ SfxChildWindowContext( nId )
+{
+ pNavigator = new ScNavigatorDlg( pBind, this, pParent );
+ SetWindow( pNavigator );
+
+ // Einstellungen muessen anderswo gemerkt werden,
+ // pInfo geht uns (ausser der Groesse) nichts mehr an
+
+ Size aInfoSize = pParent->GetOutputSizePixel(); // von aussen vorgegebene Groesse
+ Size aNavSize = pNavigator->GetOutputSizePixel(); // Default-Groesse
+
+ aNavSize.Width() = Max( aInfoSize.Width(), aNavSize.Width() );
+ aNavSize.Height() = Max( aInfoSize.Height(), aNavSize.Height() );
+ pNavigator->nListModeHeight = Max( aNavSize.Height(), pNavigator->nListModeHeight );
+
+ // Die Groesse kann in einem anderen Modul geaendert worden sein,
+ // deshalb muessen in Abhaengigkeit von der momentanen Groesse die
+ // Inhalte eingeblendet werden oder nicht
+
+ BOOL bSmall = ( aInfoSize.Height() <= pNavigator->aInitSize.Height() + SCNAV_MINTOL );
+ NavListMode eNavMode = NAV_LMODE_NONE;
+ if (!bSmall)
+ {
+ // wenn Szenario aktiv war, wieder einschalten
+
+ ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
+ NavListMode eLastMode = (NavListMode) rCfg.GetListMode();
+ if ( eLastMode == NAV_LMODE_SCENARIOS )
+ eNavMode = NAV_LMODE_SCENARIOS;
+ else
+ eNavMode = NAV_LMODE_AREAS;
+ }
+
+ // Die Groesse des Floats nicht neu setzen (FALSE bei SetListMode), damit der
+ // Navigator nicht aufgeklappt wird, wenn er minimiert war (#38872#).
+
+ pNavigator->SetListMode( eNavMode, FALSE ); // FALSE: Groesse des Float nicht setzen
+
+ USHORT nCmdId;
+ switch (eNavMode)
+ {
+ case NAV_LMODE_DOCS: nCmdId = IID_DOCS; break;
+ case NAV_LMODE_AREAS: nCmdId = IID_AREAS; break;
+ case NAV_LMODE_DBAREAS: nCmdId = IID_DBAREAS; break;
+ case NAV_LMODE_SCENARIOS: nCmdId = IID_SCENARIOS; break;
+ default: nCmdId = 0;
+ }
+ if (nCmdId)
+ {
+ pNavigator->aTbxCmd.CheckItem( nCmdId );
+ pNavigator->DoResize();
+ }
+
+ pNavigator->bFirstBig = ( nCmdId == 0 ); // dann spaeter
+
+/*???
+ FloatingWindow* pFloat = GetFloatingWindow();
+ if ( pFloat )
+ pFloat->SetMinOutputSizePixel( pNavigator->GetMinOutputSizePixel() );
+*/
+
+//!? pNavigator->Show();
+}
+
+void __EXPORT ScNavigatorDialogWrapper::Resizing( Size& rSize )
+{
+ ((ScNavigatorDlg*)GetWindow())->Resizing(rSize);
+}
+
+//========================================================================
+// class ScNavigatorPI
+//========================================================================
+
+#define CTRL_ITEMS 4
+
+#define REGISTER_SLOT(i,id) \
+ ppBoundItems[i]=new ScNavigatorControllerItem(id,*this,rBindings);
+
+ScNavigatorDlg::ScNavigatorDlg( SfxBindings* pB, SfxChildWindowContext* pCW, Window* pParent ) :
+ Window( pParent, ScResId(RID_SCDLG_NAVIGATOR) ),
+ rBindings ( *pB ), // is used in CommandToolBox ctor
+ aCmdImageList( ScResId( IL_CMD ) ),
+ aCmdImageListH( ScResId( ILH_CMD ) ),
+ aFtCol ( this, ScResId( FT_COL ) ),
+ aEdCol ( this, ScResId( ED_COL ) ),
+ aFtRow ( this, ScResId( FT_ROW ) ),
+ aEdRow ( this, ScResId( ED_ROW ) ),
+ aTbxCmd ( this, ScResId( TBX_CMD ) ),
+ aLbEntries ( this, ScResId( LB_ENTRIES ) ),
+ aWndScenarios( this,ScResId( STR_QHLP_SCEN_LISTBOX), ScResId(STR_QHLP_SCEN_COMMENT)),
+ aLbDocuments( this, ScResId( LB_DOCUMENTS ) ),
+ aStrDragMode ( ScResId( STR_DRAGMODE ) ),
+ aStrDisplay ( ScResId( STR_DISPLAY ) ),
+ aStrActiveWin( ScResId( STR_ACTIVEWIN ) ),
+ pContextWin ( pCW ),
+ pMarkArea ( NULL ),
+ pViewData ( NULL ),
+ nListModeHeight( 0 ),
+ nInitListHeight( 0 ),
+ eListMode ( NAV_LMODE_NONE ),
+ nDropMode ( SC_DROPMODE_URL ),
+ nCurCol ( 0 ),
+ nCurRow ( 0 ),
+ nCurTab ( 0 ),
+ bFirstBig ( FALSE )
+{
+ ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
+ nDropMode = rCfg.GetDragMode();
+ // eListMode wird von aussen gesetzt, Root weiter unten
+
+ aLbDocuments.SetDropDownLineCount(9);
+ String aOpen = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( " (" ));
+ aStrActive = aOpen;
+ aStrActive += String( ScResId( STR_ACTIVE ) );
+ aStrActive += ')'; // " (aktiv)"
+ aStrNotActive = aOpen;
+ aStrNotActive += String( ScResId( STR_NOTACTIVE ) );
+ aStrNotActive += ')'; // " (inaktiv)"
+ aStrHidden = aOpen;
+ aStrHidden += String( ScResId( STR_HIDDEN ) );
+ aStrHidden += ')'; // " (versteckt)"
+
+ aTitleBase = GetText();
+
+ long nListboxYPos = aTbxCmd.GetPosPixel().Y() + aTbxCmd.GetSizePixel().Height() + 4;
+ aLbEntries.SetPosSizePixel( 0, nListboxYPos, 0, 0, WINDOW_POSSIZE_Y);
+
+ nBorderOffset = aLbEntries.GetPosPixel().X();
+
+ aInitSize.Width() = aTbxCmd.GetPosPixel().X()
+ + aTbxCmd.GetSizePixel().Width()
+ + nBorderOffset;
+ aInitSize.Height() = aLbEntries.GetPosPixel().Y();
+
+ nInitListHeight = aLbEntries.GetSizePixel().Height();
+ nListModeHeight = aInitSize.Height()
+ + nInitListHeight;
+
+ // kein Resize, eh der ganze Kontext-Kram initialisiert ist!
+// SetOutputSizePixel( aInitSize ); //???
+/*! FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
+ if ( pFloat)
+ pFloat->SetMinOutputSizePixel( aInitSize );
+*/
+ ppBoundItems = new ScNavigatorControllerItem* [CTRL_ITEMS];
+
+ rBindings.ENTERREGISTRATIONS();
+ //-----------------------------
+ REGISTER_SLOT( 0, SID_CURRENTCELL );
+ REGISTER_SLOT( 1, SID_CURRENTTAB );
+ REGISTER_SLOT( 2, SID_CURRENTDOC );
+ REGISTER_SLOT( 3, SID_SELECT_SCENARIO );
+ //-----------------------------
+ rBindings.LEAVEREGISTRATIONS();
+
+ StartListening( *(SFX_APP()) );
+ StartListening( rBindings );
+
+ aLbDocuments.Hide(); // bei NAV_LMODE_NONE gibts die nicht
+
+ aLbEntries.InitWindowBits(TRUE);
+
+ aLbEntries.SetSpaceBetweenEntries(0);
+ aLbEntries.SetSelectionMode( SINGLE_SELECTION );
+ aLbEntries.SetDragDropMode( SV_DRAGDROP_CTRL_MOVE |
+ SV_DRAGDROP_CTRL_COPY |
+ SV_DRAGDROP_ENABLE_TOP );
+
+ // war eine Kategorie als Root ausgewaehlt?
+ USHORT nLastRoot = rCfg.GetRootType();
+ if ( nLastRoot )
+ aLbEntries.SetRootType( nLastRoot );
+
+ aLbEntries.Refresh();
+ GetDocNames();
+
+ aTbxCmd.UpdateButtons();
+
+ UpdateColumn();
+ UpdateRow();
+ UpdateTable();
+ aLbEntries.Hide();
+ aWndScenarios.Hide();
+ aWndScenarios.SetPosPixel( aLbEntries.GetPosPixel() );
+
+ aContentTimer.SetTimeoutHdl( LINK( this, ScNavigatorDlg, TimeHdl ) );
+ aContentTimer.SetTimeout( SC_CONTENT_TIMEOUT );
+
+ FreeResource();
+}
+
+//------------------------------------------------------------------------
+
+__EXPORT ScNavigatorDlg::~ScNavigatorDlg()
+{
+ aContentTimer.Stop();
+
+ USHORT i;
+ for ( i=0; i<CTRL_ITEMS; i++ )
+ delete ppBoundItems[i];
+
+ delete [] ppBoundItems;
+ delete pMarkArea;
+
+ EndListening( *(SFX_APP()) );
+ EndListening( rBindings );
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT ScNavigatorDlg::Resizing( Size& rNewSize ) // Size = Outputsize?
+{
+ FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
+ if ( pFloat )
+ {
+ Size aMinOut = pFloat->GetMinOutputSizePixel();
+
+ if ( rNewSize.Width() < aMinOut.Width() )
+ rNewSize.Width() = aMinOut.Width();
+
+ if ( eListMode == NAV_LMODE_NONE )
+ rNewSize.Height() = aInitSize.Height();
+ else
+ {
+ if ( rNewSize.Height() < aMinOut.Height() )
+ rNewSize.Height() = aMinOut.Height();
+ }
+ }
+// else
+// SfxDockingWindow::Resizing(rNewSize);
+}
+
+
+
+void ScNavigatorDlg::Paint( const Rectangle& rRec )
+{
+ const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
+ Color aBgColor = rStyleSettings.GetFaceColor();
+ Wallpaper aBack( aBgColor );
+
+ SetBackground( aBack );
+ aFtCol.SetBackground( aBack );
+ aFtRow.SetBackground( aBack );
+
+ Window::Paint( rRec );
+}
+
+void ScNavigatorDlg::DataChanged( const DataChangedEvent& rDCEvt )
+{
+ if ( rDCEvt.GetType() == DATACHANGED_SETTINGS && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
+ {
+ // toolbox images are exchanged in CommandToolBox::DataChanged
+ Invalidate();
+ }
+
+ Window::DataChanged( rDCEvt );
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT ScNavigatorDlg::Resize()
+{
+ DoResize();
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::DoResize()
+{
+ Size aNewSize = GetOutputSizePixel();
+ long nTotalHeight = aNewSize.Height();
+
+ // #41403# bei angedocktem Navigator wird das Fenster evtl. erst klein erzeugt,
+ // dann kommt ein Resize auf die wirkliche Groesse -> dann Inhalte einschalten
+
+ BOOL bSmall = ( nTotalHeight <= aInitSize.Height() + SCNAV_MINTOL );
+ if ( !bSmall && bFirstBig )
+ {
+ // Inhalte laut Config wieder einschalten
+
+ bFirstBig = FALSE;
+ NavListMode eNavMode = NAV_LMODE_AREAS;
+ ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
+ NavListMode eLastMode = (NavListMode) rCfg.GetListMode();
+ if ( eLastMode == NAV_LMODE_SCENARIOS )
+ eNavMode = NAV_LMODE_SCENARIOS;
+ SetListMode( eNavMode, FALSE ); // FALSE: Groesse des Float nicht setzen
+ }
+
+ // auch wenn die Inhalte nicht sichtbar sind, die Groessen anpassen,
+ // damit die Breite stimmt
+
+ //@@ 03.11.97 changes begin
+ Point aEntryPos = aLbEntries.GetPosPixel();
+ Point aListPos = aLbDocuments.GetPosPixel();
+ aNewSize.Width() -= 2*nBorderOffset;
+ Size aDocSize = aLbDocuments.GetSizePixel();
+ aDocSize.Width() = aNewSize.Width();
+
+ if(!bSmall)
+ {
+
+ long nListHeight = aLbDocuments.GetSizePixel().Height();
+ aNewSize.Height() -= ( aEntryPos.Y() + nListHeight + 2*nBorderOffset );
+ if(aNewSize.Height()<0) aNewSize.Height()=0;
+
+ aListPos.Y() = aEntryPos.Y() + aNewSize.Height() + nBorderOffset;
+
+ if(aListPos.Y() > aLbEntries.GetPosPixel().Y())
+ aLbDocuments.SetPosPixel( aListPos );
+
+ }
+ aLbEntries.SetSizePixel( aNewSize );
+ aWndScenarios.SetSizePixel( aNewSize );
+ aLbDocuments.SetSizePixel( aDocSize );
+
+ //@@ 03.11.97 end
+
+ BOOL bListMode = (eListMode != NAV_LMODE_NONE);
+ FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
+ if ( pFloat && bListMode )
+ nListModeHeight = nTotalHeight;
+}
+
+//------------------------------------------------------------------------
+
+void __EXPORT ScNavigatorDlg::Notify( SfxBroadcaster&, const SfxHint& rHint )
+{
+ if ( rHint.ISA(SfxSimpleHint) )
+ {
+ ULONG nHintId = ((SfxSimpleHint&)rHint).GetId();
+
+ if ( nHintId == SC_HINT_DOCNAME_CHANGED )
+ {
+ aLbEntries.ActiveDocChanged();
+ }
+ else if ( NAV_LMODE_NONE == eListMode )
+ {
+ // Tabellen hier nicht mehr
+ }
+ else
+ {
+ switch ( nHintId )
+ {
+ case SC_HINT_TABLES_CHANGED:
+ aLbEntries.Refresh( SC_CONTENT_TABLE );
+ break;
+
+ case SC_HINT_DBAREAS_CHANGED:
+ aLbEntries.Refresh( SC_CONTENT_DBAREA );
+ break;
+
+ case SC_HINT_AREAS_CHANGED:
+ aLbEntries.Refresh( SC_CONTENT_RANGENAME );
+ break;
+
+ case SC_HINT_DRAW_CHANGED:
+ aLbEntries.Refresh( SC_CONTENT_GRAPHIC );
+ aLbEntries.Refresh( SC_CONTENT_OLEOBJECT );
+ aLbEntries.Refresh( SC_CONTENT_DRAWING );
+ break;
+
+ case SC_HINT_AREALINKS_CHANGED:
+ aLbEntries.Refresh( SC_CONTENT_AREALINK );
+ break;
+
+ // SFX_HINT_DOCCHANGED kommt nicht nur bei Dokument-Wechsel
+
+ case SC_HINT_NAVIGATOR_UPDATEALL:
+ UpdateAll();
+ break;
+
+ case FID_DATACHANGED:
+ case FID_ANYDATACHANGED:
+ aContentTimer.Start(); // Notizen nicht sofort suchen
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+ else if ( rHint.ISA(SfxEventHint) )
+ {
+ ULONG nEventId = ((SfxEventHint&)rHint).GetEventId();
+ if ( nEventId == SFX_EVENT_ACTIVATEDOC )
+ {
+ aLbEntries.ActiveDocChanged();
+ UpdateAll();
+ }
+ }
+}
+
+//------------------------------------------------------------------------
+
+IMPL_LINK( ScNavigatorDlg, TimeHdl, Timer*, pTimer )
+{
+ if ( pTimer != &aContentTimer )
+ return 0;
+
+ aLbEntries.Refresh( SC_CONTENT_NOTE );
+ return 0;
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::SetDropMode(USHORT nNew)
+{
+ nDropMode = nNew;
+ aTbxCmd.UpdateButtons();
+
+ ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
+ rCfg.SetDragMode(nDropMode);
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::CursorPosChanged()
+{
+ //! Eintraege selektieren ???
+
+// if ( GetDBAtCursor( aStrDbName ) )
+// if ( GetAreaAtCursor( aStrAreaName ) )
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::SetCurrentCell( SCCOL nColNo, SCROW nRowNo )
+{
+ if ( (nColNo+1 != nCurCol) || (nRowNo+1 != nCurRow) )
+ {
+ // SID_CURRENTCELL == Item #0 Cache leeren, damit das Setzen der
+ // aktuellen Zelle auch in zusammengefassten Bereichen funktioniert.
+ ppBoundItems[0]->ClearCache();
+
+ ScAddress aScAddress( nColNo, nRowNo, 0 );
+ String aAddr;
+ aScAddress.Format( aAddr, SCA_ABS );
+
+ BOOL bUnmark = FALSE;
+ if ( GetViewData() )
+ bUnmark = !pViewData->GetMarkData().IsCellMarked( nColNo, nRowNo );
+
+ SfxStringItem aPosItem( SID_CURRENTCELL, aAddr );
+ SfxBoolItem aUnmarkItem( FN_PARAM_1, bUnmark ); // ggf. Selektion aufheben
+
+ rBindings.GetDispatcher()->Execute( SID_CURRENTCELL,
+ SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
+ &aPosItem, &aUnmarkItem, 0L );
+ }
+}
+
+void ScNavigatorDlg::SetCurrentCellStr( const String rName )
+{
+ ppBoundItems[0]->ClearCache();
+ SfxStringItem aNameItem( SID_CURRENTCELL, rName );
+
+ rBindings.GetDispatcher()->Execute( SID_CURRENTCELL,
+ SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
+ &aNameItem, 0L );
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::SetCurrentTable( SCTAB nTabNo )
+{
+ if ( nTabNo != nCurTab )
+ {
+ // Tabelle fuer Basic ist 1-basiert
+ SfxUInt16Item aTabItem( SID_CURRENTTAB, static_cast<sal_uInt16>(nTabNo) + 1 );
+ rBindings.GetDispatcher()->Execute( SID_CURRENTTAB,
+ SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
+ &aTabItem, 0L );
+ }
+}
+
+void ScNavigatorDlg::SetCurrentTableStr( const String rName )
+{
+ if (!GetViewData()) return;
+
+ ScDocument* pDoc = pViewData->GetDocument();
+ SCTAB nCount = pDoc->GetTableCount();
+ String aTabName;
+
+ for ( SCTAB i=0; i<nCount; i++ )
+ {
+ pDoc->GetName( i, aTabName );
+ if ( aTabName == rName )
+ {
+ SetCurrentTable( i );
+ return;
+ }
+ }
+
+ Sound::Beep(); // Tabelle nicht gefunden
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::SetCurrentObject( const String rName )
+{
+ SfxStringItem aNameItem( SID_CURRENTOBJECT, rName );
+ rBindings.GetDispatcher()->Execute( SID_CURRENTOBJECT,
+ SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
+ &aNameItem, 0L );
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::SetCurrentDoc( const String& rDocName ) // aktivieren
+{
+ SfxStringItem aDocItem( SID_CURRENTDOC, rDocName );
+ rBindings.GetDispatcher()->Execute( SID_CURRENTDOC,
+ SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
+ &aDocItem, 0L );
+}
+
+//------------------------------------------------------------------------
+
+ScTabViewShell* ScNavigatorDlg::GetTabViewShell() const
+{
+ return PTR_CAST( ScTabViewShell, SfxViewShell::Current() );
+}
+
+//------------------------------------------------------------------------
+
+ScNavigatorSettings* ScNavigatorDlg::GetNavigatorSettings()
+{
+ // #95791# Don't store the settings pointer here, because the settings belong to
+ // the view, and the view may be closed while the navigator is open (reload).
+ // If the pointer is cached here again later for performance reasons, it has to
+ // be forgotten when the view is closed.
+
+ ScTabViewShell* pViewSh = GetTabViewShell();
+ return pViewSh ? pViewSh->GetNavigatorSettings() : NULL;
+}
+
+//------------------------------------------------------------------------
+
+BOOL ScNavigatorDlg::GetViewData()
+{
+ ScTabViewShell* pViewSh = GetTabViewShell();
+ pViewData = pViewSh ? pViewSh->GetViewData() : NULL;
+
+ return ( pViewData != NULL );
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::UpdateColumn( const SCCOL* pCol )
+{
+ if ( pCol )
+ nCurCol = *pCol;
+ else if ( GetViewData() )
+ nCurCol = pViewData->GetCurX() + 1;
+
+ aEdCol.SetCol( nCurCol );
+ CheckDataArea();
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::UpdateRow( const SCROW* pRow )
+{
+ if ( pRow )
+ nCurRow = *pRow;
+ else if ( GetViewData() )
+ nCurRow = pViewData->GetCurY() + 1;
+
+ aEdRow.SetRow( nCurRow );
+ CheckDataArea();
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::UpdateTable( const SCTAB* pTab )
+{
+ if ( pTab )
+ nCurTab = *pTab;
+ else if ( GetViewData() )
+ nCurTab = pViewData->GetTabNo();
+
+// aLbTables.SetTab( nCurTab );
+ CheckDataArea();
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::UpdateAll()
+{
+ switch ( eListMode )
+ {
+ case NAV_LMODE_DOCS:
+ case NAV_LMODE_DBAREAS:
+ case NAV_LMODE_AREAS:
+ aLbEntries.Refresh();
+ break;
+
+ case NAV_LMODE_NONE:
+ //! ???
+ break;
+
+ default:
+ break;
+ }
+
+ aContentTimer.Stop(); // dann nicht nochmal
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::SetListMode( NavListMode eMode, BOOL bSetSize )
+{
+ if ( eMode != eListMode )
+ {
+ if ( eMode != NAV_LMODE_NONE )
+ bFirstBig = FALSE; // nicht mehr automatisch umschalten
+
+ eListMode = eMode;
+
+ switch ( eMode )
+ {
+ case NAV_LMODE_NONE:
+ ShowList( FALSE, bSetSize );
+ break;
+
+ case NAV_LMODE_AREAS:
+ case NAV_LMODE_DBAREAS:
+ case NAV_LMODE_DOCS:
+ aLbEntries.Refresh();
+ ShowList( TRUE, bSetSize );
+ break;
+
+ case NAV_LMODE_SCENARIOS:
+ ShowScenarios( TRUE, bSetSize );
+ break;
+ }
+
+ aTbxCmd.UpdateButtons();
+
+ if ( eMode != NAV_LMODE_NONE )
+ {
+ ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
+ rCfg.SetListMode( (USHORT) eMode );
+ }
+ }
+
+ if ( pMarkArea )
+ UnmarkDataArea();
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::ShowList( BOOL bShow, BOOL bSetSize )
+{
+ FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
+ Size aSize = GetParent()->GetOutputSizePixel();
+
+ if ( bShow )
+ {
+ Size aMinSize = aInitSize;
+
+ aMinSize.Height() += nInitListHeight;
+ if ( pFloat )
+ pFloat->SetMinOutputSizePixel( aMinSize );
+ aSize.Height() = nListModeHeight;
+ aLbEntries.Show();
+ aLbDocuments.Show();
+ }
+ else
+ {
+ if ( pFloat )
+ {
+ pFloat->SetMinOutputSizePixel( aInitSize );
+ nListModeHeight = aSize.Height();
+ }
+ aSize.Height() = aInitSize.Height();
+ aLbEntries.Hide();
+ aLbDocuments.Hide();
+ }
+ aWndScenarios.Hide();
+
+ if ( pFloat )
+ {
+ if ( bSetSize )
+ pFloat->SetOutputSizePixel( aSize );
+ }
+ else
+ {
+ SfxNavigator* pNav = (SfxNavigator*)GetParent();
+ Size aFloating = pNav->GetFloatingSize();
+ aFloating.Height() = aSize.Height();
+ pNav->SetFloatingSize( aFloating );
+ }
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::ShowScenarios( BOOL bShow, BOOL bSetSize )
+{
+ FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
+ Size aSize = GetParent()->GetOutputSizePixel();
+
+ if ( bShow )
+ {
+ Size aMinSize = aInitSize;
+ aMinSize.Height() += nInitListHeight;
+ if ( pFloat )
+ pFloat->SetMinOutputSizePixel( aMinSize );
+ aSize.Height() = nListModeHeight;
+
+ rBindings.Invalidate( SID_SELECT_SCENARIO );
+ rBindings.Update( SID_SELECT_SCENARIO );
+
+ aWndScenarios.Show();
+ aLbDocuments.Show();
+ }
+ else
+ {
+ if ( pFloat )
+ {
+ pFloat->SetMinOutputSizePixel( aInitSize );
+ nListModeHeight = aSize.Height();
+ }
+ aSize.Height() = aInitSize.Height();
+ aWndScenarios.Hide();
+ aLbDocuments.Hide();
+ }
+ aLbEntries.Hide();
+
+ if ( pFloat )
+ {
+ if ( bSetSize )
+ pFloat->SetOutputSizePixel( aSize );
+ }
+ else
+ {
+ SfxNavigator* pNav = (SfxNavigator*)GetParent();
+ Size aFloating = pNav->GetFloatingSize();
+ aFloating.Height() = aSize.Height();
+ pNav->SetFloatingSize( aFloating );
+ }
+}
+
+
+//------------------------------------------------------------------------
+//
+// Dokumente fuer Dropdown-Listbox
+//
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::GetDocNames( const String* pManualSel )
+{
+ aLbDocuments.Clear();
+ aLbDocuments.SetUpdateMode( FALSE );
+
+ ScDocShell* pCurrentSh = PTR_CAST( ScDocShell, SfxObjectShell::Current() );
+
+ String aSelEntry;
+ SfxObjectShell* pSh = SfxObjectShell::GetFirst();
+ while ( pSh )
+ {
+ if ( pSh->ISA(ScDocShell) )
+ {
+ String aName = pSh->GetTitle();
+ String aEntry = aName;
+ if (pSh == pCurrentSh)
+ aEntry += aStrActive;
+ else
+ aEntry += aStrNotActive;
+ aLbDocuments.InsertEntry( aEntry );
+
+ if ( pManualSel ? ( aName == *pManualSel )
+ : ( pSh == pCurrentSh ) )
+ aSelEntry = aEntry; // kompletter Eintrag zum Selektieren
+ }
+
+ pSh = SfxObjectShell::GetNext( *pSh );
+ }
+
+ aLbDocuments.InsertEntry( aStrActiveWin );
+
+ String aHidden = aLbEntries.GetHiddenTitle();
+ if (aHidden.Len())
+ {
+ String aEntry = aHidden;
+ aEntry += aStrHidden;
+ aLbDocuments.InsertEntry( aEntry );
+
+ if ( pManualSel && aHidden == *pManualSel )
+ aSelEntry = aEntry;
+ }
+
+ aLbDocuments.SetUpdateMode( TRUE );
+
+ aLbDocuments.SelectEntry( aSelEntry );
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::MarkDataArea()
+{
+ ScTabViewShell* pViewSh = GetTabViewShell();
+
+ if ( pViewSh )
+ {
+ if ( !pMarkArea )
+ pMarkArea = new ScArea;
+
+ pViewSh->MarkDataArea();
+ ScRange aMarkRange;
+ pViewSh->GetViewData()->GetMarkData().GetMarkArea(aMarkRange);
+ pMarkArea->nColStart = aMarkRange.aStart.Col();
+ pMarkArea->nRowStart = aMarkRange.aStart.Row();
+ pMarkArea->nColEnd = aMarkRange.aEnd.Col();
+ pMarkArea->nRowEnd = aMarkRange.aEnd.Row();
+ pMarkArea->nTab = aMarkRange.aStart.Tab();
+ }
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::UnmarkDataArea()
+{
+ ScTabViewShell* pViewSh = GetTabViewShell();
+
+ if ( pViewSh )
+ {
+ pViewSh->Unmark();
+ DELETEZ( pMarkArea );
+ }
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::CheckDataArea()
+{
+ if ( aTbxCmd.IsItemChecked( IID_DATA ) && pMarkArea )
+ {
+ if ( nCurTab != pMarkArea->nTab
+ || nCurCol < pMarkArea->nColStart+1
+ || nCurCol > pMarkArea->nColEnd+1
+ || nCurRow < pMarkArea->nRowStart+1
+ || nCurRow > pMarkArea->nRowEnd+1 )
+ {
+ aTbxCmd.SetItemState( IID_DATA, TriState(STATE_CHECK) );
+ aTbxCmd.Select( IID_DATA );
+ }
+ }
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::StartOfDataArea()
+{
+ // pMarkArea auswerten ???
+
+ if ( GetViewData() )
+ {
+ ScMarkData& rMark = pViewData->GetMarkData();
+ ScRange aMarkRange;
+ rMark.GetMarkArea( aMarkRange );
+
+ SCCOL nCol = aMarkRange.aStart.Col();
+ SCROW nRow = aMarkRange.aStart.Row();
+
+ if ( (nCol+1 != aEdCol.GetCol()) || (nRow+1 != aEdRow.GetRow()) )
+ SetCurrentCell( nCol, nRow );
+ }
+}
+
+//------------------------------------------------------------------------
+
+void ScNavigatorDlg::EndOfDataArea()
+{
+ // pMarkArea auswerten ???
+
+ if ( GetViewData() )
+ {
+ ScMarkData& rMark = pViewData->GetMarkData();
+ ScRange aMarkRange;
+ rMark.GetMarkArea( aMarkRange );
+
+ SCCOL nCol = aMarkRange.aEnd.Col();
+ SCROW nRow = aMarkRange.aEnd.Row();
+
+ if ( (nCol+1 != aEdCol.GetCol()) || (nRow+1 != aEdRow.GetRow()) )
+ SetCurrentCell( nCol, nRow );
+ }
+}
+
+//------------------------------------------------------------------------
+
+SfxChildAlignment __EXPORT ScNavigatorDlg::CheckAlignment(
+ SfxChildAlignment eActAlign, SfxChildAlignment eAlign )
+{
+ SfxChildAlignment eRetAlign;
+
+ //! kein Andocken, wenn Listbox nicht da ???
+
+ switch (eAlign)
+ {
+ case SFX_ALIGN_TOP:
+ case SFX_ALIGN_HIGHESTTOP:
+ case SFX_ALIGN_LOWESTTOP:
+ case SFX_ALIGN_BOTTOM:
+ case SFX_ALIGN_LOWESTBOTTOM:
+ case SFX_ALIGN_HIGHESTBOTTOM:
+ eRetAlign = eActAlign; // nicht erlaubt
+ break;
+
+ case SFX_ALIGN_LEFT:
+ case SFX_ALIGN_RIGHT:
+ case SFX_ALIGN_FIRSTLEFT:
+ case SFX_ALIGN_LASTLEFT:
+ case SFX_ALIGN_FIRSTRIGHT:
+ case SFX_ALIGN_LASTRIGHT:
+ eRetAlign = eAlign; // erlaubt
+ break;
+
+ default:
+ eRetAlign = eAlign;
+ break;
+ }
+ return eRetAlign;
+}
+
+//------------------------------------------------------------------------
+//
+// Drop auf den Navigator - andere Datei laden (File oder Bookmark)
+//
+//------------------------------------------------------------------------
+
+#if 0
+BOOL __EXPORT ScNavigatorDlg::Drop( const DropEvent& rEvt )
+{
+ BOOL bReturn = FALSE;
+
+ if ( !aLbEntries.IsInDrag() ) // kein Verschieben innerhalb der TreeListBox
+ {
+ String aFileName;
+
+ SvScDataObjectRef pObject = SvScDataObject::PasteDragServer(rEvt);
+
+ ULONG nFormat = INetBookmark::HasFormat(*pObject);
+ INetBookmark aBookmark;
+ if (aBookmark.Paste(*pObject,nFormat))
+ aFileName = aBookmark.GetURL();
+ else
+ {
+ // FORMAT_FILE direkt aus DragServer
+
+ USHORT nCount = DragServer::GetItemCount();
+ for ( USHORT i = 0; i < nCount && !aFileName.Len(); ++i )
+ if (DragServer::HasFormat( i, FORMAT_FILE ))
+ aFileName = DragServer::PasteFile( i );
+ }
+
+ if ( aFileName.Len() )
+ bReturn = aLbEntries.LoadFile( aFileName );
+ }
+ return bReturn;
+}
+
+BOOL __EXPORT ScNavigatorDlg::QueryDrop( DropEvent& rEvt )
+{
+ BOOL bReturn = FALSE;
+
+ if ( !aLbEntries.IsInDrag() ) // kein Verschieben innerhalb der TreeListBox
+ {
+ SvScDataObjectRef pObject = SvScDataObject::PasteDragServer(rEvt);
+ if ( pObject->HasFormat(FORMAT_FILE)
+ || INetBookmark::HasFormat(*pObject) )
+ {
+ rEvt.SetAction(DROP_COPY); // Kopier-Cursor anzeigen
+ bReturn = TRUE;
+ }
+ }
+
+ return bReturn;
+}
+#endif
+
+
+