/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_sc.hxx" //------------------------------------------------------------------ // #include #include #include #include #include #include #include #include #include #include #include #include #include #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" #include // 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( floor( log10( static_cast(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 ); sal_uInt16 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, sal_False ); // EnableItem( IID_DOWN, sal_False ); } //------------------------------------------------------------------------ __EXPORT CommandToolBox::~CommandToolBox() { } //------------------------------------------------------------------------ void CommandToolBox::Select( sal_uInt16 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 ); sal_uInt16 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, sal_False ); CheckItem( IID_CHANGEROOT, sal_False ); } else { EnableItem( IID_CHANGEROOT, sal_True ); sal_Bool bRootSet = rDlg.aLbEntries.GetRootType() != SC_CONTENT_ROOT; CheckItem( IID_CHANGEROOT, bRootSet ); } sal_Bool bHC = GetSettings().GetStyleSettings().GetHighContrastMode(); sal_uInt16 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() { sal_Bool bHC = GetSettings().GetStyleSettings().GetHighContrastMode(); ImageList& rImgLst = bHC ? rDlg.aCmdImageListH : rDlg.aCmdImageList; sal_uInt16 nCount = GetItemCount(); for (sal_uInt16 i = 0; i < nCount; i++) { sal_uInt16 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, sal_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, sal_uInt16 nId, SfxBindings* pBind, SfxChildWinInfo* /* pInfo */ ) : SfxChildWindowContext( nId ) { pNavigator = new ScNavigatorDlg( pBind, this, pParent, true ); 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 sal_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 (sal_False bei SetListMode), damit der // Navigator nicht aufgeklappt wird, wenn er minimiert war (#38872#). pNavigator->SetListMode( eNavMode, sal_False ); // FALSE: Groesse des Float nicht setzen sal_uInt16 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, const bool bUseStyleSettingsBackground) : 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 ( sal_False ), mbUseStyleSettingsBackground(bUseStyleSettingsBackground) { 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(); const long nListboxYPos = ::std::max( (aTbxCmd.GetPosPixel().Y() + aTbxCmd.GetSizePixel().Height()), (aEdRow.GetPosPixel().Y() + aEdRow.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(sal_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? sal_uInt16 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(); aLbEntries.SetAccessibleRelationLabeledBy(&aLbEntries); aTbxCmd.SetAccessibleRelationLabeledBy(&aTbxCmd); aLbDocuments.SetAccessibleName(aStrActiveWin); if (pContextWin == NULL) { // When the context window is missing then the navigator is // displayed in the sidebar and has the whole deck to fill. // Therefore hide the button that hides all controls below the // top two rows of buttons. aTbxCmd.Select(IID_ZOOMOUT); aTbxCmd.RemoveItem(aTbxCmd.GetItemPos(IID_ZOOMOUT)); } aLbEntries.SetNavigatorDlgFlag(sal_True); } //------------------------------------------------------------------------ __EXPORT ScNavigatorDlg::~ScNavigatorDlg() { aContentTimer.Stop(); sal_uInt16 i; for ( i=0; iGetFloatingWindow() : NULL; 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 ) { if (mbUseStyleSettingsBackground) { const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings(); Color aBgColor = rStyleSettings.GetFaceColor(); Wallpaper aBack( aBgColor ); SetBackground( aBack ); aFtCol.SetBackground( aBack ); aFtRow.SetBackground( aBack ); } else { aFtCol.SetBackground(Wallpaper()); aFtRow.SetBackground(Wallpaper()); } 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 sal_Bool bSmall = ( nTotalHeight <= aInitSize.Height() + SCNAV_MINTOL ); if ( !bSmall && bFirstBig ) { // Inhalte laut Config wieder einschalten bFirstBig = sal_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, sal_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 sal_Bool bListMode = (eListMode != NAV_LMODE_NONE); if (pContextWin != NULL) { FloatingWindow* pFloat = pContextWin->GetFloatingWindow(); if ( pFloat && bListMode ) nListModeHeight = nTotalHeight; } } //------------------------------------------------------------------------ void __EXPORT ScNavigatorDlg::Notify( SfxBroadcaster&, const SfxHint& rHint ) { if ( rHint.ISA(SfxSimpleHint) ) { sal_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; case FID_KILLEDITVIEW: aLbEntries.ObjectFresh( SC_CONTENT_OLEOBJECT ); aLbEntries.ObjectFresh( SC_CONTENT_DRAWING ); aLbEntries.ObjectFresh( SC_CONTENT_GRAPHIC ); break; default: break; } } } else if ( rHint.ISA(SfxEventHint) ) { sal_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(sal_uInt16 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 ); sal_Bool bUnmark = sal_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(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; iGetName( 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; } //------------------------------------------------------------------------ sal_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, sal_Bool bSetSize ) { if ( eMode != eListMode ) { if ( eMode != NAV_LMODE_NONE ) bFirstBig = sal_False; // nicht mehr automatisch umschalten eListMode = eMode; switch ( eMode ) { case NAV_LMODE_NONE: ShowList( sal_False, bSetSize ); break; case NAV_LMODE_AREAS: case NAV_LMODE_DBAREAS: case NAV_LMODE_DOCS: aLbEntries.Refresh(); ShowList( sal_True, bSetSize ); break; case NAV_LMODE_SCENARIOS: ShowScenarios( sal_True, bSetSize ); break; } aTbxCmd.UpdateButtons(); if ( eMode != NAV_LMODE_NONE ) { ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg(); rCfg.SetListMode( (sal_uInt16) eMode ); } } if ( pMarkArea ) UnmarkDataArea(); } //------------------------------------------------------------------------ void ScNavigatorDlg::ShowList( sal_Bool bShow, sal_Bool bSetSize ) { FloatingWindow* pFloat = pContextWin!=NULL ? pContextWin->GetFloatingWindow() : NULL; 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 = dynamic_cast(GetParent()); if (pNav != NULL) { Size aFloating = pNav->GetFloatingSize(); aFloating.Height() = aSize.Height(); pNav->SetFloatingSize( aFloating ); } } } //------------------------------------------------------------------------ void ScNavigatorDlg::ShowScenarios( sal_Bool bShow, sal_Bool bSetSize ) { FloatingWindow* pFloat = pContextWin!=NULL ? pContextWin->GetFloatingWindow() : NULL; 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( sal_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( sal_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 sal_Bool __EXPORT ScNavigatorDlg::Drop( const DropEvent& rEvt ) { sal_Bool bReturn = sal_False; if ( !aLbEntries.IsInDrag() ) // kein Verschieben innerhalb der TreeListBox { String aFileName; SvScDataObjectRef pObject = SvScDataObject::PasteDragServer(rEvt); sal_uLong nFormat = INetBookmark::HasFormat(*pObject); INetBookmark aBookmark; if (aBookmark.Paste(*pObject,nFormat)) aFileName = aBookmark.GetURL(); else { // FORMAT_FILE direkt aus DragServer sal_uInt16 nCount = DragServer::GetItemCount(); for ( sal_uInt16 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; } sal_Bool __EXPORT ScNavigatorDlg::QueryDrop( DropEvent& rEvt ) { sal_Bool bReturn = sal_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 = sal_True; } } return bReturn; } #endif