blob: 9a3ca74de40accbf8c7636c2458587801b2d4810 [file] [log] [blame]
/**************************************************************
*
* 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 <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"
#include <algorithm>
// 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 );
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; 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!=NULL ? pContextWin->GetFloatingWindow() : 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<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;
}
//------------------------------------------------------------------------
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<SfxNavigator*>(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