diff options
Diffstat (limited to 'sc/source/ui/app/scmod.cxx')
-rw-r--r-- | sc/source/ui/app/scmod.cxx | 2208 |
1 files changed, 2208 insertions, 0 deletions
diff --git a/sc/source/ui/app/scmod.cxx b/sc/source/ui/app/scmod.cxx new file mode 100644 index 000000000000..41ba2db31cbe --- /dev/null +++ b/sc/source/ui/app/scmod.cxx @@ -0,0 +1,2208 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * 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 <com/sun/star/ui/dialogs/XExecutableDialog.hpp> +#include <comphelper/processfactory.hxx> + + + + + +// INCLUDE --------------------------------------------------------------- + +#include "scitems.hxx" +#include <sfx2/app.hxx> +#include <editeng/eeitem.hxx> + +#include <editeng/flditem.hxx> +#include <editeng/outliner.hxx> +#include <basic/sbstar.hxx> + +#include <sfx2/sfxdlg.hxx> +#include <sfx2/viewfrm.hxx> +#include <sfx2/objface.hxx> + +#include "IAnyRefDialog.hxx" + +#include <svtools/ehdl.hxx> +#include <svtools/accessibilityoptions.hxx> +#include <svl/ctloptions.hxx> +#include <unotools/useroptions.hxx> +#include <vcl/status.hxx> +#include <sfx2/bindings.hxx> +#include <sfx2/request.hxx> +#include <sfx2/printer.hxx> +#include <editeng/langitem.hxx> +#include <svtools/colorcfg.hxx> + +#include <svl/whiter.hxx> +#include <svx/selctrl.hxx> +#include <svx/insctrl.hxx> +#include <svx/zoomctrl.hxx> +#include <svx/modctrl.hxx> +#include <svx/pszctrl.hxx> +#include <svx/zoomsliderctrl.hxx> +#include <vcl/msgbox.hxx> +#include <svl/inethist.hxx> +#include <vcl/waitobj.hxx> +#include <svx/svxerr.hxx> + + + +#include "scmod.hxx" +#include "global.hxx" +#include "viewopti.hxx" +#include "docoptio.hxx" +#include "appoptio.hxx" +#include "inputopt.hxx" +#include "printopt.hxx" +#include "navicfg.hxx" +#include "addincfg.hxx" +#include "tabvwsh.hxx" +#include "prevwsh.hxx" +#include "docsh.hxx" +#include "drwlayer.hxx" +#include "uiitems.hxx" +#include "sc.hrc" +#include "cfgids.hxx" +#include "inputhdl.hxx" +#include "inputwin.hxx" +#include "msgpool.hxx" +#include "scresid.hxx" +#include "anyrefdg.hxx" +#include "dwfunctr.hxx" +#include "formdata.hxx" +#include "tpprint.hxx" +#include "transobj.hxx" +#include "detfunc.hxx" +#include "preview.hxx" + +#include <svx/xmlsecctrl.hxx> + + +#define ScModule +#include "scslots.hxx" + +#include "scabstdlg.hxx" + +#define SC_IDLE_MIN 150 +#define SC_IDLE_MAX 3000 +#define SC_IDLE_STEP 75 +#define SC_IDLE_COUNT 50 + +static sal_uInt16 nIdleCount = 0; + +//------------------------------------------------------------------ + +SFX_IMPL_INTERFACE( ScModule, SfxShell, ScResId(RID_APPTITLE) ) +{ + SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_APPLICATION | SFX_VISIBILITY_DESKTOP | SFX_VISIBILITY_STANDARD | SFX_VISIBILITY_CLIENT | SFX_VISIBILITY_VIEWER, + ScResId(RID_OBJECTBAR_APP) ); + SFX_STATUSBAR_REGISTRATION( ScResId(SCCFG_STATUSBAR) ); // nur ID wichtig +} + +//------------------------------------------------------------------ + +ScModule::ScModule( SfxObjectFactory* pFact ) : + SfxModule( SfxApplication::CreateResManager( "sc" ), false, pFact, NULL ), + pSelTransfer( NULL ), + pMessagePool( NULL ), + pRefInputHandler( NULL ), + pViewCfg( NULL ), + pDocCfg( NULL ), + pAppCfg( NULL ), + pInputCfg( NULL ), + pPrintCfg( NULL ), + pNavipiCfg( NULL ), + pAddInCfg( NULL ), + pColorConfig( NULL ), + pAccessOptions( NULL ), + pCTLOptions( NULL ), + pUserOptions( NULL ), + pErrorHdl( NULL ), + pSvxErrorHdl( NULL ), + pFormEditData( NULL ), + nCurRefDlgId( 0 ), + bIsWaterCan( false ), + bIsInEditCommand( false ), + bIsInExecuteDrop( false ), + mbIsInSharedDocLoading( false ), + mbIsInSharedDocSaving( false ) +{ + // im ctor ist der ResManager (DLL-Daten) noch nicht initialisiert! + + SetName(String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("StarCalc"))); // fuer Basic + + ResetDragObject(); + SetClipObject( NULL, NULL ); + + // InputHandler braucht nicht mehr angelegt zu werden + + // ErrorHandler anlegen - war in Init() + // zwischen OfficeApplication::Init und ScGlobal::Init + SvxErrorHandler::Get(); + pErrorHdl = new SfxErrorHandler( RID_ERRHDLSC, + ERRCODE_AREA_SC, + ERRCODE_AREA_APP2-1, + GetResMgr() ); + + aSpellTimer.SetTimeout(10); + aSpellTimer.SetTimeoutHdl( LINK( this, ScModule, SpellTimerHdl ) ); + aIdleTimer.SetTimeout(SC_IDLE_MIN); + aIdleTimer.SetTimeoutHdl( LINK( this, ScModule, IdleHandler ) ); + aIdleTimer.Start(); + + pMessagePool = new ScMessagePool; + pMessagePool->FreezeIdRanges(); + SetPool( pMessagePool ); + ScGlobal::InitTextHeight( pMessagePool ); + + StartListening( *SFX_APP() ); // for SFX_HINT_DEINITIALIZING +} + +ScModule::~ScModule() +{ + DBG_ASSERT( !pSelTransfer, "Selection Transfer object not deleted" ); + + // InputHandler braucht nicht mehr geloescht zu werden (gibt keinen an der App mehr) + + SfxItemPool::Free(pMessagePool); + + DELETEZ( pFormEditData ); + + delete pErrorHdl; +// delete pSvxErrorHdl; + + ScGlobal::Clear(); // ruft auch ScDocumentPool::DeleteVersionMaps(); + + DeleteCfg(); // wurde mal aus Exit() gerufen +} + +//------------------------------------------------------------------ +void ScModule::ConfigurationChanged( utl::ConfigurationBroadcaster* p, sal_uInt32 ) +{ + if ( p == pColorConfig || p == pAccessOptions ) + { + // Test if detective objects have to be updated with new colors + // (if the detective colors haven't been used yet, there's nothing to update) + if ( ScDetectiveFunc::IsColorsInitialized() ) + { + const svtools::ColorConfig& rColors = GetColorConfig(); + sal_Bool bArrows = + ( ScDetectiveFunc::GetArrowColor() != (ColorData)rColors.GetColorValue(svtools::CALCDETECTIVE).nColor || + ScDetectiveFunc::GetErrorColor() != (ColorData)rColors.GetColorValue(svtools::CALCDETECTIVEERROR).nColor ); + sal_Bool bComments = + ( ScDetectiveFunc::GetCommentColor() != (ColorData)rColors.GetColorValue(svtools::CALCNOTESBACKGROUND).nColor ); + if ( bArrows || bComments ) + { + ScDetectiveFunc::InitializeColors(); // get the new colors + + // update detective objects in all open documents + SfxObjectShell* pObjSh = SfxObjectShell::GetFirst(); + while ( pObjSh ) + { + if ( pObjSh->Type() == TYPE(ScDocShell) ) + { + ScDocShell* pDocSh = ((ScDocShell*)pObjSh); + if ( bArrows ) + ScDetectiveFunc( pDocSh->GetDocument(), 0 ).UpdateAllArrowColors(); + if ( bComments ) + ScDetectiveFunc::UpdateAllComments( *pDocSh->GetDocument() ); + } + pObjSh = SfxObjectShell::GetNext( *pObjSh ); + } + } + } + + // force all views to repaint, using the new options + + SfxViewShell* pViewShell = SfxViewShell::GetFirst(); + while(pViewShell) + { + if ( pViewShell->ISA(ScTabViewShell) ) + { + ScTabViewShell* pViewSh = (ScTabViewShell*)pViewShell; + pViewSh->PaintGrid(); + pViewSh->PaintTop(); + pViewSh->PaintLeft(); + pViewSh->PaintExtras(); + + ScInputHandler* pHdl = pViewSh->GetInputHandler(); + if ( pHdl ) + pHdl->ForgetLastPattern(); // EditEngine BackgroundColor may change + } + else if ( pViewShell->ISA(ScPreviewShell) ) + { + Window* pWin = pViewShell->GetWindow(); + if (pWin) + pWin->Invalidate(); + } + pViewShell = SfxViewShell::GetNext( *pViewShell ); + } + } + else if ( p == pCTLOptions ) + { + // for all documents: set digit language for printer, recalc output factor, update row heights + SfxObjectShell* pObjSh = SfxObjectShell::GetFirst(); + while ( pObjSh ) + { + if ( pObjSh->Type() == TYPE(ScDocShell) ) + { + ScDocShell* pDocSh = ((ScDocShell*)pObjSh); + OutputDevice* pPrinter = pDocSh->GetPrinter(); + if ( pPrinter ) + pPrinter->SetDigitLanguage( GetOptDigitLanguage() ); + + pDocSh->CalcOutputFactor(); + + SCTAB nTabCount = pDocSh->GetDocument()->GetTableCount(); + for (SCTAB nTab=0; nTab<nTabCount; nTab++) + pDocSh->AdjustRowHeight( 0, MAXROW, nTab ); + } + pObjSh = SfxObjectShell::GetNext( *pObjSh ); + } + + // for all views (table and preview): update digit language + SfxViewShell* pSh = SfxViewShell::GetFirst(); + while ( pSh ) + { + if ( pSh->ISA( ScTabViewShell ) ) + { + ScTabViewShell* pViewSh = (ScTabViewShell*)pSh; + + // set ref-device for EditEngine (re-evaluates digit settings) + ScInputHandler* pHdl = GetInputHdl(pViewSh); + if (pHdl) + pHdl->UpdateRefDevice(); + + pViewSh->DigitLanguageChanged(); + pViewSh->PaintGrid(); + } + else if ( pSh->ISA( ScPreviewShell ) ) + { + ScPreviewShell* pPreviewSh = (ScPreviewShell*)pSh; + ScPreview* pPreview = pPreviewSh->GetPreview(); + + pPreview->SetDigitLanguage( GetOptDigitLanguage() ); + pPreview->Invalidate(); + } + + pSh = SfxViewShell::GetNext( *pSh ); + } + } +} + +void ScModule::Notify( SfxBroadcaster&, const SfxHint& rHint ) +{ + if ( rHint.ISA(SfxSimpleHint) ) + { + sal_uLong nHintId = ((SfxSimpleHint&)rHint).GetId(); + if ( nHintId == SFX_HINT_DEINITIALIZING ) + { + // ConfigItems must be removed before ConfigManager + DeleteCfg(); + } + } +} + +//------------------------------------------------------------------ + +void ScModule::DeleteCfg() +{ + DELETEZ( pViewCfg ); // Speichern passiert vor Exit() automatisch + DELETEZ( pDocCfg ); + DELETEZ( pAppCfg ); + DELETEZ( pInputCfg ); + DELETEZ( pPrintCfg ); + DELETEZ( pNavipiCfg ); + DELETEZ( pAddInCfg ); + + if ( pColorConfig ) + { + pColorConfig->RemoveListener(this); + DELETEZ( pColorConfig ); + } + if ( pAccessOptions ) + { + pAccessOptions->RemoveListener(this); + DELETEZ( pAccessOptions ); + } + if ( pCTLOptions ) + { + pCTLOptions->RemoveListener(this); + DELETEZ( pCTLOptions ); + } + if( pUserOptions ) + { + DELETEZ( pUserOptions ); + } +} + +//------------------------------------------------------------------ +// +// von der Applikation verschoben: +// +//------------------------------------------------------------------ + +void ScModule::Execute( SfxRequest& rReq ) +{ + SfxViewFrame* pViewFrm = SfxViewFrame::Current(); + SfxBindings* pBindings = pViewFrm ? &pViewFrm->GetBindings() : NULL; + + const SfxItemSet* pReqArgs = rReq.GetArgs(); + sal_uInt16 nSlot = rReq.GetSlot(); + + switch ( nSlot ) + { + case SID_CHOOSE_DESIGN: + { + String aMacroName = + String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("Template.Samples.ShowStyles")); + SfxApplication::CallAppBasic( aMacroName ); + } + break; + case SID_EURO_CONVERTER: + { + String aMacroName = + String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("Euro.ConvertRun.Main")); + SfxApplication::CallAppBasic( aMacroName ); + } + break; + case SID_AUTOSPELL_CHECK: + { + sal_Bool bSet; + const SfxPoolItem* pItem; + if ( pReqArgs && SFX_ITEM_SET == pReqArgs->GetItemState( nSlot, sal_True, &pItem ) ) + bSet = ((const SfxBoolItem*)pItem)->GetValue(); + else + { // Toggle + ScDocShell* pDocSh = PTR_CAST(ScDocShell, SfxObjectShell::Current()); + if ( pDocSh ) + bSet = !pDocSh->GetDocument()->GetDocOptions().IsAutoSpell(); + else + bSet = !GetDocOptions().IsAutoSpell(); + } + + SfxItemSet aSet( GetPool(), SID_AUTOSPELL_CHECK, SID_AUTOSPELL_CHECK ); + aSet.Put( SfxBoolItem( SID_AUTOSPELL_CHECK, bSet ) ); + ModifyOptions( aSet ); + rReq.Done(); + } + break; + + case SID_ATTR_METRIC: + { + const SfxPoolItem* pItem; + if ( pReqArgs && SFX_ITEM_SET == pReqArgs->GetItemState( nSlot, sal_True, &pItem ) ) + { + FieldUnit eUnit = (FieldUnit)((const SfxUInt16Item*)pItem)->GetValue(); + switch( eUnit ) + { + case FUNIT_MM: // nur die Einheiten, die auch im Dialog stehen + case FUNIT_CM: + case FUNIT_INCH: + case FUNIT_PICA: + case FUNIT_POINT: + { + PutItem( *pItem ); + ScAppOptions aNewOpts( GetAppOptions() ); + aNewOpts.SetAppMetric( eUnit ); + SetAppOptions( aNewOpts ); + rReq.Done(); + } + break; + default: + { + // added to avoid warnings + } + } + } + } + break; + + case FID_AUTOCOMPLETE: + { + ScAppOptions aNewOpts( GetAppOptions() ); + sal_Bool bNew = !aNewOpts.GetAutoComplete(); + aNewOpts.SetAutoComplete( bNew ); + SetAppOptions( aNewOpts ); + ScInputHandler::SetAutoComplete( bNew ); + if (pBindings) + pBindings->Invalidate( FID_AUTOCOMPLETE ); + rReq.Done(); + } + break; + + case SID_DETECTIVE_AUTO: + { + ScAppOptions aNewOpts( GetAppOptions() ); + sal_Bool bNew = !aNewOpts.GetDetectiveAuto(); + SFX_REQUEST_ARG( rReq, pAuto, SfxBoolItem, SID_DETECTIVE_AUTO, false ); + if ( pAuto ) + bNew = pAuto->GetValue(); + + aNewOpts.SetDetectiveAuto( bNew ); + SetAppOptions( aNewOpts ); + if (pBindings) + pBindings->Invalidate( SID_DETECTIVE_AUTO ); + rReq.AppendItem( SfxBoolItem( SID_DETECTIVE_AUTO, bNew ) ); + rReq.Done(); + } + break; + + case SID_PSZ_FUNCTION: + if (pReqArgs) + { + const SfxUInt16Item& rItem = (const SfxUInt16Item&)pReqArgs->Get(SID_PSZ_FUNCTION); + DBG_ASSERT(rItem.ISA(SfxUInt16Item),"falscher Parameter"); + + ScAppOptions aNewOpts( GetAppOptions() ); + aNewOpts.SetStatusFunc( rItem.GetValue() ); + SetAppOptions( aNewOpts ); + + if (pBindings) + { + pBindings->Invalidate( SID_TABLE_CELL ); + pBindings->Update( SID_TABLE_CELL ); // sofort + + pBindings->Invalidate( SID_PSZ_FUNCTION ); + pBindings->Update( SID_PSZ_FUNCTION ); + // falls Menue gleich wieder aufgeklappt wird + } + } + break; + + case SID_ATTR_LANGUAGE: + case SID_ATTR_CHAR_CJK_LANGUAGE: + case SID_ATTR_CHAR_CTL_LANGUAGE: + { + const SfxPoolItem* pItem; + if ( pReqArgs && SFX_ITEM_SET == pReqArgs->GetItemState( GetPool().GetWhich(nSlot), sal_True, &pItem ) ) + { + ScDocShell* pDocSh = PTR_CAST(ScDocShell, SfxObjectShell::Current()); + ScDocument* pDoc = pDocSh ? pDocSh->GetDocument() : NULL; + if ( pDoc ) + { + LanguageType eNewLang = ((SvxLanguageItem*)pItem)->GetLanguage(); + LanguageType eLatin, eCjk, eCtl; + pDoc->GetLanguage( eLatin, eCjk, eCtl ); + LanguageType eOld = ( nSlot == SID_ATTR_CHAR_CJK_LANGUAGE ) ? eCjk : + ( ( nSlot == SID_ATTR_CHAR_CTL_LANGUAGE ) ? eCtl : eLatin ); + if ( eNewLang != eOld ) + { + if ( nSlot == SID_ATTR_CHAR_CJK_LANGUAGE ) + eCjk = eNewLang; + else if ( nSlot == SID_ATTR_CHAR_CTL_LANGUAGE ) + eCtl = eNewLang; + else + eLatin = eNewLang; + + pDoc->SetLanguage( eLatin, eCjk, eCtl ); + + ScInputHandler* pInputHandler = GetInputHdl(); + if ( pInputHandler ) + pInputHandler->UpdateSpellSettings(); // EditEngine-Flags + ScTabViewShell* pViewSh = PTR_CAST(ScTabViewShell, SfxViewShell::Current()); + if ( pViewSh ) + pViewSh->UpdateDrawTextOutliner(); // EditEngine-Flags + + pDocSh->SetDocumentModified(); + } + } + } + } + break; + + case FID_FOCUS_POSWND: + { + ScInputHandler* pHdl = GetInputHdl(); + if (pHdl) + { + ScInputWindow* pWin = pHdl->GetInputWindow(); + if (pWin) + pWin->PosGrabFocus(); + } + rReq.Done(); + } + break; + + case SID_OPEN_XML_FILTERSETTINGS: + { + try + { + com::sun::star::uno::Reference < ::com::sun::star::ui::dialogs::XExecutableDialog > xDialog(::comphelper::getProcessServiceFactory()->createInstance(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.comp.ui.XSLTFilterDialog"))), com::sun::star::uno::UNO_QUERY); + if( xDialog.is() ) + { + xDialog->execute(); + } + } + catch( ::com::sun::star::uno::RuntimeException& ) + { + } + } + break; + + default: + OSL_FAIL( "ScApplication: Unknown Message." ); + break; + } +} + +void ScModule::GetState( SfxItemSet& rSet ) +{ + SfxWhichIter aIter(rSet); + sal_uInt16 nWhich = aIter.FirstWhich(); + while ( nWhich ) + { + switch ( nWhich ) + { + case FID_AUTOCOMPLETE: + rSet.Put( SfxBoolItem( nWhich, GetAppOptions().GetAutoComplete() ) ); + break; + case SID_DETECTIVE_AUTO: + rSet.Put( SfxBoolItem( nWhich, GetAppOptions().GetDetectiveAuto() ) ); + break; + case SID_PSZ_FUNCTION: + rSet.Put( SfxUInt16Item( nWhich, GetAppOptions().GetStatusFunc() ) ); + break; + case SID_ATTR_METRIC: + rSet.Put( SfxUInt16Item( nWhich, sal::static_int_cast<sal_uInt16>(GetAppOptions().GetAppMetric()) ) ); + break; + case SID_AUTOSPELL_CHECK: + { + sal_Bool bAuto; + ScDocShell* pDocSh = PTR_CAST(ScDocShell, SfxObjectShell::Current()); + if ( pDocSh ) + bAuto = pDocSh->GetDocument()->GetDocOptions().IsAutoSpell(); + else + { + sal_uInt16 nDummyLang, nDummyCjk, nDummyCtl; + GetSpellSettings( nDummyLang, nDummyCjk, nDummyCtl, bAuto ); + } + rSet.Put( SfxBoolItem( nWhich, bAuto ) ); + } + break; + case SID_ATTR_LANGUAGE: + case ATTR_CJK_FONT_LANGUAGE: // WID for SID_ATTR_CHAR_CJK_LANGUAGE + case ATTR_CTL_FONT_LANGUAGE: // WID for SID_ATTR_CHAR_CTL_LANGUAGE + { + ScDocShell* pDocSh = PTR_CAST(ScDocShell, SfxObjectShell::Current()); + ScDocument* pDoc = pDocSh ? pDocSh->GetDocument() : NULL; + if ( pDoc ) + { + LanguageType eLatin, eCjk, eCtl; + pDoc->GetLanguage( eLatin, eCjk, eCtl ); + LanguageType eLang = ( nWhich == ATTR_CJK_FONT_LANGUAGE ) ? eCjk : + ( ( nWhich == ATTR_CTL_FONT_LANGUAGE ) ? eCtl : eLatin ); + rSet.Put( SvxLanguageItem( eLang, nWhich ) ); + } + } + break; + + } + nWhich = aIter.NextWhich(); + } +} + + +void ScModule::HideDisabledSlots( SfxItemSet& rSet ) +{ + if( SfxViewFrame* pViewFrm = SfxViewFrame::Current() ) + { + SfxBindings& rBindings = pViewFrm->GetBindings(); + SfxWhichIter aIter( rSet ); + for( sal_uInt16 nWhich = aIter.FirstWhich(); nWhich != 0; nWhich = aIter.NextWhich() ) + { + ScViewUtil::HideDisabledSlot( rSet, rBindings, nWhich ); + // always disable the slots + rSet.DisableItem( nWhich ); + } + } +} + + +//------------------------------------------------------------------ + +void ScModule::ResetDragObject() +{ + aDragData.pCellTransfer = NULL; + aDragData.pDrawTransfer = NULL; + + aDragData.aLinkDoc.Erase(); + aDragData.aLinkTable.Erase(); + aDragData.aLinkArea.Erase(); + aDragData.pJumpLocalDoc = NULL; + aDragData.aJumpTarget.Erase(); + aDragData.aJumpText.Erase(); +} + +void ScModule::SetDragObject( ScTransferObj* pCellObj, ScDrawTransferObj* pDrawObj ) +{ + ResetDragObject(); + aDragData.pCellTransfer = pCellObj; + aDragData.pDrawTransfer = pDrawObj; +} + +void ScModule::SetDragLink( const String& rDoc, const String& rTab, const String& rArea ) +{ + ResetDragObject(); + + aDragData.aLinkDoc = rDoc; + aDragData.aLinkTable = rTab; + aDragData.aLinkArea = rArea; +} + +void ScModule::SetDragJump( ScDocument* pLocalDoc, const String& rTarget, const String& rText ) +{ + ResetDragObject(); + + aDragData.pJumpLocalDoc = pLocalDoc; + aDragData.aJumpTarget = rTarget; + aDragData.aJumpText = rText; +} + +//------------------------------------------------------------------ + +void ScModule::SetClipObject( ScTransferObj* pCellObj, ScDrawTransferObj* pDrawObj ) +{ + DBG_ASSERT( !pCellObj || !pDrawObj, "SetClipObject: not allowed to set both objects" ); + + aClipData.pCellClipboard = pCellObj; + aClipData.pDrawClipboard = pDrawObj; +} + +ScDocument* ScModule::GetClipDoc() +{ + // called from document + + ScTransferObj* pObj = ScTransferObj::GetOwnClipboard( NULL ); + if (pObj) + return pObj->GetDocument(); + + return NULL; +} + +//------------------------------------------------------------------ + +void ScModule::SetSelectionTransfer( ScSelectionTransferObj* pNew ) +{ + pSelTransfer = pNew; +} + +//------------------------------------------------------------------ + +void ScModule::InitFormEditData() +{ + pFormEditData = new ScFormEditData; +} + +void ScModule::ClearFormEditData() +{ + DELETEZ( pFormEditData ); +} + +//------------------------------------------------------------------ + +void ScModule::SetViewOptions( const ScViewOptions& rOpt ) +{ + if ( !pViewCfg ) + pViewCfg = new ScViewCfg; + + pViewCfg->SetOptions( rOpt ); +} + +const ScViewOptions& ScModule::GetViewOptions() +{ + if ( !pViewCfg ) + pViewCfg = new ScViewCfg; + + return *pViewCfg; +} + +void ScModule::SetDocOptions( const ScDocOptions& rOpt ) +{ + if ( !pDocCfg ) + pDocCfg = new ScDocCfg; + + pDocCfg->SetOptions( rOpt ); +} + +const ScDocOptions& ScModule::GetDocOptions() +{ + if ( !pDocCfg ) + pDocCfg = new ScDocCfg; + + return *pDocCfg; +} + +#ifndef LRU_MAX +#define LRU_MAX 10 +#endif + +void ScModule::InsertEntryToLRUList(sal_uInt16 nFIndex) +{ + if(nFIndex != 0) + { + const ScAppOptions& rAppOpt = GetAppOptions(); + sal_uInt16 nLRUFuncCount = Min( rAppOpt.GetLRUFuncListCount(), (sal_uInt16)LRU_MAX ); + sal_uInt16* pLRUListIds = rAppOpt.GetLRUFuncList(); + + sal_uInt16 aIdxList[LRU_MAX]; + sal_uInt16 n = 0; + sal_Bool bFound = false; + + while ((n < LRU_MAX) && n<nLRUFuncCount) // alte Liste abklappern + { + if (!bFound && (pLRUListIds[n]== nFIndex)) + bFound = sal_True; // erster! Treffer + else if (bFound) + aIdxList[n ] = pLRUListIds[n]; // hinter Treffer kopieren + else if ((n+1) < LRU_MAX) + aIdxList[n+1] = pLRUListIds[n]; // vor Treffer verschieben + n++; + } + if (!bFound && (n < LRU_MAX)) // Eintrag nicht gefunden? + n++; // einen mehr + aIdxList[0] = nFIndex; // Current on Top + + ScAppOptions aNewOpts(rAppOpt); // an App melden + aNewOpts.SetLRUFuncList(aIdxList, n); + SetAppOptions(aNewOpts); + + RecentFunctionsChanged(); + } +} + +void ScModule::RecentFunctionsChanged() +{ + // update function list window + sal_uInt16 nFuncListID = ScFunctionChildWindow::GetChildWindowId(); + + //! notify all views + SfxViewFrame* pViewFrm = SfxViewFrame::Current(); + if ( pViewFrm && pViewFrm->HasChildWindow(nFuncListID) ) + { + ScFunctionChildWindow* pWnd =(ScFunctionChildWindow*)pViewFrm->GetChildWindow( nFuncListID ); + + ScFunctionDockWin* pFuncList=(ScFunctionDockWin*)pWnd->GetWindow(); + + pFuncList->InitLRUList(); + } +} + +void ScModule::SetAppOptions( const ScAppOptions& rOpt ) +{ + if ( !pAppCfg ) + pAppCfg = new ScAppCfg; + + pAppCfg->SetOptions( rOpt ); +} + +void global_InitAppOptions() +{ + SC_MOD()->GetAppOptions(); +} + +const ScAppOptions& ScModule::GetAppOptions() +{ + if ( !pAppCfg ) + pAppCfg = new ScAppCfg; + + return *pAppCfg; +} + +void ScModule::SetInputOptions( const ScInputOptions& rOpt ) +{ + if ( !pInputCfg ) + pInputCfg = new ScInputCfg; + + pInputCfg->SetOptions( rOpt ); +} + +const ScInputOptions& ScModule::GetInputOptions() +{ + if ( !pInputCfg ) + pInputCfg = new ScInputCfg; + + return *pInputCfg; +} + +void ScModule::SetPrintOptions( const ScPrintOptions& rOpt ) +{ + if ( !pPrintCfg ) + pPrintCfg = new ScPrintCfg; + + pPrintCfg->SetOptions( rOpt ); +} + +const ScPrintOptions& ScModule::GetPrintOptions() +{ + if ( !pPrintCfg ) + pPrintCfg = new ScPrintCfg; + + return *pPrintCfg; +} + +ScNavipiCfg& ScModule::GetNavipiCfg() +{ + if ( !pNavipiCfg ) + pNavipiCfg = new ScNavipiCfg; + + return *pNavipiCfg; +} + +ScAddInCfg& ScModule::GetAddInCfg() +{ + if ( !pAddInCfg ) + pAddInCfg = new ScAddInCfg; + + return *pAddInCfg; +} + +svtools::ColorConfig& ScModule::GetColorConfig() +{ + if ( !pColorConfig ) + { + pColorConfig = new svtools::ColorConfig; + pColorConfig->AddListener(this); + } + + return *pColorConfig; +} + +SvtAccessibilityOptions& ScModule::GetAccessOptions() +{ + if ( !pAccessOptions ) + { + pAccessOptions = new SvtAccessibilityOptions; + pAccessOptions->AddListener(this); + } + + return *pAccessOptions; +} + +SvtCTLOptions& ScModule::GetCTLOptions() +{ + if ( !pCTLOptions ) + { + pCTLOptions = new SvtCTLOptions; + pCTLOptions->AddListener(this); + } + + return *pCTLOptions; +} + +SvtUserOptions& ScModule::GetUserOptions() +{ + if( !pUserOptions ) + { + pUserOptions = new SvtUserOptions; + } + return *pUserOptions; +} + +sal_uInt16 ScModule::GetOptDigitLanguage() +{ + SvtCTLOptions::TextNumerals eNumerals = GetCTLOptions().GetCTLTextNumerals(); + return ( eNumerals == SvtCTLOptions::NUMERALS_ARABIC ) ? LANGUAGE_ENGLISH_US : + ( eNumerals == SvtCTLOptions::NUMERALS_HINDI) ? LANGUAGE_ARABIC_SAUDI_ARABIA : + LANGUAGE_SYSTEM; +} + +//------------------------------------------------------------------ +// +// Optionen +// +//------------------------------------------------------------------ + +// +// ModifyOptions - Items aus Calc-Options-Dialog +// und SID_AUTOSPELL_CHECK +// + +#define IS_AVAILABLE(w,item) (SFX_ITEM_SET==rOptSet.GetItemState((w),sal_True,&item)) + +void ScModule::ModifyOptions( const SfxItemSet& rOptSet ) +{ + sal_uInt16 nOldSpellLang, nOldCjkLang, nOldCtlLang; + sal_Bool bOldAutoSpell; + GetSpellSettings( nOldSpellLang, nOldCjkLang, nOldCtlLang, bOldAutoSpell ); + + if (!pAppCfg) + GetAppOptions(); + DBG_ASSERT( pAppCfg, "AppOptions not initialised :-(" ); + + if (!pInputCfg) + GetInputOptions(); + DBG_ASSERT( pInputCfg, "InputOptions not initialised :-(" ); + + //-------------------------------------------------------------- + + SfxViewFrame* pViewFrm = SfxViewFrame::Current(); + SfxBindings* pBindings = pViewFrm ? &pViewFrm->GetBindings() : NULL; + + ScTabViewShell* pViewSh = PTR_CAST(ScTabViewShell, SfxViewShell::Current()); + ScDocShell* pDocSh = PTR_CAST(ScDocShell, SfxObjectShell::Current()); + ScDocument* pDoc = pDocSh ? pDocSh->GetDocument() : NULL; + const SfxPoolItem* pItem = NULL; + sal_Bool bRepaint = false; + sal_Bool bUpdateMarks = false; + sal_Bool bUpdateRefDev = false; + sal_Bool bCalcAll = false; + sal_Bool bSaveAppOptions = false; + sal_Bool bSaveInputOptions = false; + + //-------------------------------------------------------------------------- + + // SFX_APP()->SetOptions( rOptSet ); + + // Linguistik nicht mehr + + if ( IS_AVAILABLE(SID_ATTR_METRIC,pItem) ) + { + PutItem( *pItem ); + pAppCfg->SetAppMetric( (FieldUnit)((const SfxUInt16Item*)pItem)->GetValue() ); + bSaveAppOptions = sal_True; + } + + if ( IS_AVAILABLE(SCITEM_USERLIST,pItem) ) + { + ScGlobal::SetUserList( ((const ScUserListItem*)pItem)->GetUserList() ); + bSaveAppOptions = sal_True; + } + + if ( IS_AVAILABLE(SID_SC_OPT_SYNCZOOM,pItem) ) + { + pAppCfg->SetSynchronizeZoom( static_cast<const SfxBoolItem*>(pItem)->GetValue() ); + bSaveAppOptions = sal_True; + } + + //============================================ + // ViewOptions + //============================================ + + if ( IS_AVAILABLE(SID_SCVIEWOPTIONS,pItem) ) + { + const ScViewOptions& rNewOpt = ((const ScTpViewItem*)pItem)->GetViewOptions(); + + if ( pViewSh ) + { + ScViewData* pViewData = pViewSh->GetViewData(); + const ScViewOptions& rOldOpt = pViewData->GetOptions(); + + sal_Bool bAnchorList = ( rOldOpt.GetOption( VOPT_ANCHOR ) != + rNewOpt.GetOption( VOPT_ANCHOR ) ); + + if ( rOldOpt != rNewOpt ) + { + pViewData->SetOptions( rNewOpt ); // veraendert rOldOpt + pViewData->GetDocument()->SetViewOptions( rNewOpt ); + pDocSh->SetDocumentModified(); + bRepaint = sal_True; + } + if ( bAnchorList ) + pViewSh->UpdateAnchorHandles(); + } + SetViewOptions( rNewOpt ); + if (pBindings) + pBindings->Invalidate(SID_HELPLINES_MOVE); + } + + //============================================ + // GridOptions, Auswertung nach ViewOptions, + // da GridOptions Member der ViewOptions ist! + //============================================ + + if ( IS_AVAILABLE(SID_ATTR_GRID_OPTIONS,pItem) ) + { + ScGridOptions aNewGridOpt( (const SvxOptionsGrid&)((const SvxGridItem&)*pItem) ); + + if ( pViewSh ) + { + ScViewData* pViewData = pViewSh->GetViewData(); + ScViewOptions aNewViewOpt( pViewData->GetOptions() ); + const ScGridOptions& rOldGridOpt = aNewViewOpt.GetGridOptions(); + + if ( rOldGridOpt != aNewGridOpt ) + { + aNewViewOpt.SetGridOptions( aNewGridOpt ); + pViewData->SetOptions( aNewViewOpt ); + pViewData->GetDocument()->SetViewOptions( aNewViewOpt ); + pDocSh->SetDocumentModified(); + bRepaint = sal_True; + } + } + ScViewOptions aNewViewOpt ( GetViewOptions() ); + aNewViewOpt.SetGridOptions( aNewGridOpt ); + SetViewOptions( aNewViewOpt ); + if (pBindings) + { + pBindings->Invalidate(SID_GRID_VISIBLE); + pBindings->Invalidate(SID_GRID_USE); + } + } + + + //============================================ + // DocOptions + //============================================ + + if ( IS_AVAILABLE(SID_SCDOCOPTIONS,pItem) ) + { + const ScDocOptions& rNewOpt = ((const ScTpCalcItem*)pItem)->GetDocOptions(); + + if ( pDoc ) + { + const ScDocOptions& rOldOpt = pDoc->GetDocOptions(); + ScOptionsUtil::KeyBindingType eKeyOld = rOldOpt.GetKeyBindingType(); + ScOptionsUtil::KeyBindingType eKeyNew = rNewOpt.GetKeyBindingType(); + if (eKeyOld != eKeyNew) + pDocSh->ResetKeyBindings(eKeyNew); + + bRepaint = ( bRepaint || ( rOldOpt != rNewOpt ) ); + bCalcAll = bRepaint && + ( rOldOpt.IsIter() != rNewOpt.IsIter() + || rOldOpt.GetIterCount() != rNewOpt.GetIterCount() + || rOldOpt.GetIterEps() != rNewOpt.GetIterEps() + || rOldOpt.IsIgnoreCase() != rNewOpt.IsIgnoreCase() + || rOldOpt.IsCalcAsShown() != rNewOpt.IsCalcAsShown() + || (rNewOpt.IsCalcAsShown() && + rOldOpt.GetStdPrecision() != rNewOpt.GetStdPrecision()) + || rOldOpt.IsMatchWholeCell() != rNewOpt.IsMatchWholeCell() + || rOldOpt.GetYear2000() != rNewOpt.GetYear2000() + || rOldOpt.IsFormulaRegexEnabled() != rNewOpt.IsFormulaRegexEnabled() + ); + pDoc->SetDocOptions( rNewOpt ); + pDocSh->SetDocumentModified(); + } + SetDocOptions( rNewOpt ); + } + + // nach den eigentlichen DocOptions auch noch die TabDistance setzen + if ( IS_AVAILABLE(SID_ATTR_DEFTABSTOP,pItem) ) + { + sal_uInt16 nTabDist = ((SfxUInt16Item*)pItem)->GetValue(); + ScDocOptions aOpt(GetDocOptions()); + aOpt.SetTabDistance(nTabDist); + SetDocOptions( aOpt ); + + if ( pDoc ) + { + ScDocOptions aDocOpt(pDoc->GetDocOptions()); + aDocOpt.SetTabDistance(nTabDist); + pDoc->SetDocOptions( aDocOpt ); + pDocSh->SetDocumentModified(); + if(pDoc->GetDrawLayer()) + pDoc->GetDrawLayer()->SetDefaultTabulator(nTabDist); + } + } + + // AutoSpell nach den Doc-Options (weil Member) + + if ( IS_AVAILABLE(SID_AUTOSPELL_CHECK,pItem) ) // an Doc-Options + { + sal_Bool bDoAutoSpell = ((const SfxBoolItem*)pItem)->GetValue(); + + if (pDoc) + { + ScDocOptions aNewOpt = pDoc->GetDocOptions(); + if ( aNewOpt.IsAutoSpell() != bDoAutoSpell ) + { + aNewOpt.SetAutoSpell( bDoAutoSpell ); + pDoc->SetDocOptions( aNewOpt ); + + if (bDoAutoSpell) + pDoc->SetOnlineSpellPos( ScAddress(0,0,0) ); // vorne anfangen + else + { + WaitObject aWait( pDocSh->GetActiveDialogParent() ); + pDoc->RemoveAutoSpellObj(); // Edit-Text-Objekte wieder zurueckwandeln + } + + //#92038#; don't set document modified, because this flag is no longer saved +// pDocSh->SetDocumentModified(); + + bRepaint = sal_True; // weil HideAutoSpell evtl. ungueltig + //! alle Views painten ??? + } + } + + if ( bOldAutoSpell != bDoAutoSpell ) + SetAutoSpellProperty( bDoAutoSpell ); + if ( pDocSh ) + pDocSh->PostPaintGridAll(); // wegen Markierungen + ScInputHandler* pInputHandler = GetInputHdl(); + if ( pInputHandler ) + pInputHandler->UpdateSpellSettings(); // EditEngine-Flags + if ( pViewSh ) + pViewSh->UpdateDrawTextOutliner(); // EditEngine-Flags + + if (pBindings) + pBindings->Invalidate( SID_AUTOSPELL_CHECK ); + } + + //============================================ + // InputOptions + //============================================ + + if ( IS_AVAILABLE(SID_SC_INPUT_SELECTIONPOS,pItem) ) + { + pInputCfg->SetMoveDir( ((const SfxUInt16Item*)pItem)->GetValue() ); + bSaveInputOptions = sal_True; + } + if ( IS_AVAILABLE(SID_SC_INPUT_SELECTION,pItem) ) + { + pInputCfg->SetMoveSelection( ((const SfxBoolItem*)pItem)->GetValue() ); + bSaveInputOptions = sal_True; + } + if ( IS_AVAILABLE(SID_SC_INPUT_EDITMODE,pItem) ) + { + pInputCfg->SetEnterEdit( ((const SfxBoolItem*)pItem)->GetValue() ); + bSaveInputOptions = sal_True; + } + if ( IS_AVAILABLE(SID_SC_INPUT_FMT_EXPAND,pItem) ) + { + pInputCfg->SetExtendFormat( ((const SfxBoolItem*)pItem)->GetValue() ); + bSaveInputOptions = sal_True; + } + if ( IS_AVAILABLE(SID_SC_INPUT_RANGEFINDER,pItem) ) + { + pInputCfg->SetRangeFinder( ((const SfxBoolItem*)pItem)->GetValue() ); + bSaveInputOptions = sal_True; + } + if ( IS_AVAILABLE(SID_SC_INPUT_REF_EXPAND,pItem) ) + { + pInputCfg->SetExpandRefs( ((const SfxBoolItem*)pItem)->GetValue() ); + bSaveInputOptions = sal_True; + } + if ( IS_AVAILABLE(SID_SC_INPUT_MARK_HEADER,pItem) ) + { + pInputCfg->SetMarkHeader( ((const SfxBoolItem*)pItem)->GetValue() ); + bSaveInputOptions = sal_True; + bUpdateMarks = sal_True; + } + if ( IS_AVAILABLE(SID_SC_INPUT_TEXTWYSIWYG,pItem) ) + { + sal_Bool bNew = ((const SfxBoolItem*)pItem)->GetValue(); + if ( bNew != pInputCfg->GetTextWysiwyg() ) + { + pInputCfg->SetTextWysiwyg( bNew ); + bSaveInputOptions = sal_True; + bUpdateRefDev = sal_True; + } + } + if( IS_AVAILABLE( SID_SC_INPUT_REPLCELLSWARN, pItem ) ) + { + pInputCfg->SetReplaceCellsWarn( ((const SfxBoolItem*)pItem)->GetValue() ); + bSaveInputOptions = sal_True; + } + + //============================================ + // PrintOptions + //============================================ + + if ( IS_AVAILABLE(SID_SCPRINTOPTIONS,pItem) ) + { + const ScPrintOptions& rNewOpt = ((const ScTpPrintItem*)pItem)->GetPrintOptions(); + SetPrintOptions( rNewOpt ); + + // broadcast causes all previews to recalc page numbers + SFX_APP()->Broadcast( SfxSimpleHint( SID_SCPRINTOPTIONS ) ); + } + + //---------------------------------------------------------- + + if ( bSaveAppOptions ) + pAppCfg->OptionsChanged(); + + if ( bSaveInputOptions ) + pInputCfg->OptionsChanged(); + + // Neuberechnung anstossen? + + if ( pDoc && bCalcAll ) + { + WaitObject aWait( pDocSh->GetActiveDialogParent() ); + pDoc->CalcAll(); + if ( pViewSh ) + pViewSh->UpdateCharts( sal_True ); + else + ScDBFunc::DoUpdateCharts( ScAddress(), pDoc, sal_True ); + if (pBindings) + pBindings->Invalidate( SID_ATTR_SIZE ); //SvxPosSize-StatusControl-Update + } + + if ( pViewSh && bUpdateMarks ) + pViewSh->UpdateAutoFillMark(); + + // View neuzeichnen? + + if ( pViewSh && bRepaint ) + { + pViewSh->UpdateFixPos(); + pViewSh->PaintGrid(); + pViewSh->PaintTop(); + pViewSh->PaintLeft(); + pViewSh->PaintExtras(); + pViewSh->InvalidateBorder(); + if (pBindings) + { + pBindings->Invalidate( FID_TOGGLEHEADERS ); // -> Checks im Menue + pBindings->Invalidate( FID_TOGGLESYNTAX ); + } + } + + // update ref device (for all documents) + + if ( bUpdateRefDev ) + { + // for all documents: recalc output factor, update row heights + SfxObjectShell* pObjSh = SfxObjectShell::GetFirst(); + while ( pObjSh ) + { + if ( pObjSh->Type() == TYPE(ScDocShell) ) + { + ScDocShell* pOneDocSh = ((ScDocShell*)pObjSh); + pOneDocSh->CalcOutputFactor(); + SCTAB nTabCount = pOneDocSh->GetDocument()->GetTableCount(); + for (SCTAB nTab=0; nTab<nTabCount; nTab++) + pOneDocSh->AdjustRowHeight( 0, MAXROW, nTab ); + } + pObjSh = SfxObjectShell::GetNext( *pObjSh ); + } + + // for all (tab-) views: + TypeId aScType = TYPE(ScTabViewShell); + SfxViewShell* pSh = SfxViewShell::GetFirst( &aScType ); + while ( pSh ) + { + ScTabViewShell* pOneViewSh = (ScTabViewShell*)pSh; + + // set ref-device for EditEngine + ScInputHandler* pHdl = GetInputHdl(pOneViewSh); + if (pHdl) + pHdl->UpdateRefDevice(); + + // update view scale + ScViewData* pViewData = pOneViewSh->GetViewData(); + pOneViewSh->SetZoom( pViewData->GetZoomX(), pViewData->GetZoomY(), false ); + + // repaint + pOneViewSh->PaintGrid(); + pOneViewSh->PaintTop(); + pOneViewSh->PaintLeft(); + + pSh = SfxViewShell::GetNext( *pSh, &aScType ); + } + } +} + +#undef IS_AVAILABLE + +//------------------------------------------------------------------ +// +// Input-Handler +// +//------------------------------------------------------------------ + +ScInputHandler* ScModule::GetInputHdl( ScTabViewShell* pViewSh, sal_Bool bUseRef ) +{ + if ( pRefInputHandler && bUseRef ) + return pRefInputHandler; + + ScInputHandler* pHdl = NULL; + if ( !pViewSh ) + { + // in case a UIActive embedded object has no ViewShell ( UNO component ) + // the own calc view shell will be set as current, but no handling should happen + + ScTabViewShell* pCurViewSh = PTR_CAST( ScTabViewShell, SfxViewShell::Current() ); + if ( pCurViewSh && !pCurViewSh->GetUIActiveClient() ) + pViewSh = pCurViewSh; + } + + if ( pViewSh ) + pHdl = pViewSh->GetInputHandler(); // Viewshell hat jetzt immer einen + + // wenn keine ViewShell uebergeben oder aktiv, kann NULL herauskommen + DBG_ASSERT( pHdl || !pViewSh, "GetInputHdl: kein InputHandler gefunden" ); + return pHdl; +} + +void ScModule::ViewShellChanged() +{ + ScInputHandler* pHdl = GetInputHdl(); + ScTabViewShell* pShell = ScTabViewShell::GetActiveViewShell(); + if ( pShell && pHdl ) + pShell->UpdateInputHandler(); +} + +void ScModule::SetInputMode( ScInputMode eMode ) +{ + ScInputHandler* pHdl = GetInputHdl(); + if (pHdl) + pHdl->SetMode( eMode ); +} + +sal_Bool ScModule::IsEditMode() +{ + ScInputHandler* pHdl = GetInputHdl(); + return pHdl && pHdl->IsEditMode(); +} + +sal_Bool ScModule::IsInputMode() +{ + ScInputHandler* pHdl = GetInputHdl(); + return pHdl && pHdl->IsInputMode(); +} + +sal_Bool ScModule::InputKeyEvent( const KeyEvent& rKEvt, sal_Bool bStartEdit ) +{ + ScInputHandler* pHdl = GetInputHdl(); + return ( pHdl ? pHdl->KeyInput( rKEvt, bStartEdit ) : false ); +} + +void ScModule::InputEnterHandler( sal_uInt8 nBlockMode ) +{ + if ( !SFX_APP()->IsDowning() ) // nicht beim Programmende + { + ScInputHandler* pHdl = GetInputHdl(); + if (pHdl) + pHdl->EnterHandler( nBlockMode ); + } +} + +void ScModule::InputCancelHandler() +{ + ScInputHandler* pHdl = GetInputHdl(); + if (pHdl) + pHdl->CancelHandler(); +} + +void ScModule::InputSelection( EditView* pView ) +{ + ScInputHandler* pHdl = GetInputHdl(); + if (pHdl) + pHdl->InputSelection( pView ); +} + +void ScModule::InputChanged( EditView* pView ) +{ + ScInputHandler* pHdl = GetInputHdl(); + if (pHdl) + pHdl->InputChanged( pView ); +} + +void ScModule::ViewShellGone( ScTabViewShell* pViewSh ) +{ + ScInputHandler* pHdl = GetInputHdl(); + if (pHdl) + pHdl->ViewShellGone( pViewSh ); +} + +void ScModule::SetRefInputHdl( ScInputHandler* pNew ) +{ + pRefInputHandler = pNew; +} + +ScInputHandler* ScModule::GetRefInputHdl() +{ + return pRefInputHandler; +} + +//------------------------------------------------------------------------ +// Olk's Krempel: + +void ScModule::InputGetSelection( xub_StrLen& rStart, xub_StrLen& rEnd ) +{ + ScInputHandler* pHdl = GetInputHdl(); + if (pHdl) + pHdl->InputGetSelection( rStart, rEnd ); +} + +void ScModule::InputSetSelection( xub_StrLen nStart, xub_StrLen nEnd ) +{ + ScInputHandler* pHdl = GetInputHdl(); + if (pHdl) + pHdl->InputSetSelection( nStart, nEnd ); +} + +void ScModule::InputReplaceSelection( const String& rStr ) +{ + ScInputHandler* pHdl = GetInputHdl(); + if (pHdl) + pHdl->InputReplaceSelection( rStr ); +} + +String ScModule::InputGetFormulaStr() +{ + ScInputHandler* pHdl = GetInputHdl(); + String aStr; + if ( pHdl ) + aStr = pHdl->InputGetFormulaStr(); + return aStr; +} + +void ScModule::ActivateInputWindow( const String* pStrFormula, sal_Bool bMatrix ) +{ + ScInputHandler* pHdl = GetInputHdl(); + if ( pHdl ) + { + ScInputWindow* pWin = pHdl->GetInputWindow(); + if ( pStrFormula ) + { + // Formel uebernehmen + if ( pWin ) + { + pWin->SetFuncString( *pStrFormula, false ); + // SetSumAssignMode wegen sal_False nicht noetig + } + sal_uInt8 nMode = bMatrix ? SC_ENTER_MATRIX : SC_ENTER_NORMAL; + pHdl->EnterHandler( nMode ); + + // ohne Invalidate bleibt die Selektion stehen, wenn die Formel unveraendert ist + if (pWin) + pWin->TextInvalidate(); + } + else + { + // Abbrechen + if ( pWin ) + { + pWin->SetFuncString( EMPTY_STRING, false ); + // SetSumAssignMode wegen sal_False nicht noetig + } + pHdl->CancelHandler(); + } + } +} + +//------------------------------------------------------------------ +// +// Referenz - Dialoge +// +//------------------------------------------------------------------ + +void ScModule::SetRefDialog( sal_uInt16 nId, sal_Bool bVis, SfxViewFrame* pViewFrm ) +{ + //! move reference dialog handling to view + //! (only keep function autopilot here for references to other documents) + + if(nCurRefDlgId==0 || (nId==nCurRefDlgId && !bVis)) + { + if ( !pViewFrm ) + pViewFrm = SfxViewFrame::Current(); + + // bindings update causes problems with update of stylist if + // current style family has changed + //if ( pViewFrm ) + // pViewFrm->GetBindings().Update(); // to avoid trouble in LockDispatcher + + nCurRefDlgId = bVis ? nId : 0 ; // before SetChildWindow + + if ( pViewFrm ) + { + // store the dialog id also in the view shell + SfxViewShell* pViewSh = pViewFrm->GetViewShell(); + if ( pViewSh && pViewSh->ISA( ScTabViewShell ) ) + ((ScTabViewShell*)pViewSh)->SetCurRefDlgId( nCurRefDlgId ); + else + { + // no ScTabViewShell - possible for example from a Basic macro + bVis = false; + nCurRefDlgId = 0; // don't set nCurRefDlgId if no dialog is created + } + + pViewFrm->SetChildWindow( nId, bVis ); + } + + SfxApplication* pSfxApp = SFX_APP(); + pSfxApp->Broadcast( SfxSimpleHint( FID_REFMODECHANGED ) ); + } +} + +SfxChildWindow* lcl_GetChildWinFromAnyView( sal_uInt16 nId ) +{ + // first try the current view + + SfxViewFrame* pViewFrm = SfxViewFrame::Current(); + // #i46999# current view frame can be null (for example, when closing help) + SfxChildWindow* pChildWnd = pViewFrm ? pViewFrm->GetChildWindow( nId ) : NULL; + if ( pChildWnd ) + return pChildWnd; // found in the current view + + // if not found there, get the child window from any open view + // it can be open only in one view because nCurRefDlgId is global + + pViewFrm = SfxViewFrame::GetFirst(); + while ( pViewFrm ) + { + pChildWnd = pViewFrm->GetChildWindow( nId ); + if ( pChildWnd ) + return pChildWnd; // found in any view + + pViewFrm = SfxViewFrame::GetNext( *pViewFrm ); + } + + return NULL; // none found +} + +sal_Bool ScModule::IsModalMode(SfxObjectShell* pDocSh) +{ + //! move reference dialog handling to view + //! (only keep function autopilot here for references to other documents) + + sal_Bool bIsModal = false; + + if ( nCurRefDlgId ) + { + SfxChildWindow* pChildWnd = lcl_GetChildWinFromAnyView( nCurRefDlgId ); + if ( pChildWnd ) + { + IAnyRefDialog* pRefDlg = dynamic_cast<IAnyRefDialog*>(pChildWnd->GetWindow()); + bIsModal = pChildWnd->IsVisible() && + !( pRefDlg->IsRefInputMode() && pRefDlg->IsDocAllowed(pDocSh) ); + } + else + { + // in 592 and above, the dialog isn't visible in other views + // if the dialog is open but can't be accessed, disable input + + bIsModal = sal_True; + } + + // pChildWnd kann 0 sein, wenn der Dialog nach dem Umschalten + // von einer anderen Shell noch nicht erzeugt wurde (z.B. in GetFocus) + } + else if (pDocSh) + { + ScInputHandler* pHdl = GetInputHdl(); + if ( pHdl ) + bIsModal = pHdl->IsModalMode(pDocSh); + } + + return bIsModal; +} + +sal_Bool ScModule::IsTableLocked() +{ + //! move reference dialog handling to view + //! (only keep function autopilot here for references to other documents) + + sal_Bool bLocked = false; + + // bisher nur bei ScAnyRefDlg + + if ( nCurRefDlgId ) + { + SfxChildWindow* pChildWnd = lcl_GetChildWinFromAnyView( nCurRefDlgId ); + if ( pChildWnd ) + bLocked = dynamic_cast<IAnyRefDialog*>(pChildWnd->GetWindow())->IsTableLocked(); + else + bLocked = sal_True; // for other views, see IsModalMode + } + + return bLocked; +} + +sal_Bool ScModule::IsRefDialogOpen() +{ + //! move reference dialog handling to view + //! (only keep function autopilot here for references to other documents) + + sal_Bool bIsOpen = false; + + if ( nCurRefDlgId ) + { + SfxChildWindow* pChildWnd = lcl_GetChildWinFromAnyView( nCurRefDlgId ); + if ( pChildWnd ) + bIsOpen = pChildWnd->IsVisible(); + else + bIsOpen = sal_True; // for other views, see IsModalMode + } + + return bIsOpen; +} + +sal_Bool ScModule::IsFormulaMode() +{ + //! move reference dialog handling to view + //! (only keep function autopilot here for references to other documents) + + sal_Bool bIsFormula = false; + + if ( nCurRefDlgId ) + { + SfxChildWindow* pChildWnd = lcl_GetChildWinFromAnyView( nCurRefDlgId ); + if ( pChildWnd ) + { + IAnyRefDialog* pRefDlg = dynamic_cast<IAnyRefDialog*>(pChildWnd->GetWindow()); + bIsFormula = pChildWnd->IsVisible() && pRefDlg->IsRefInputMode(); + } + } + else + { + ScInputHandler* pHdl = GetInputHdl(); + if ( pHdl ) + bIsFormula = pHdl->IsFormulaMode(); + } + + if (bIsInEditCommand) + bIsFormula = sal_True; + + return bIsFormula; +} + +void lcl_MarkedTabs( const ScMarkData& rMark, SCTAB& rStartTab, SCTAB& rEndTab ) +{ + if (rMark.GetSelectCount() > 1) + { + sal_Bool bFirst = sal_True; + for (SCTAB i=0; i<=MAXTAB; i++) + if (rMark.GetTableSelect(i)) + { + if (bFirst) + rStartTab = i; + rEndTab = i; + bFirst = false; + } + } +} + +void ScModule::SetReference( const ScRange& rRef, ScDocument* pDoc, + const ScMarkData* pMarkData ) +{ + //! move reference dialog handling to view + //! (only keep function autopilot here for references to other documents) + + // in Ref-Dialogen wird hiermit auch das Zoom-In ausgeloest, + // wenn Start und Ende der Ref unterschiedlich sind + + ScRange aNew = rRef; + aNew.Justify(); // immer "richtig herum" + + if( nCurRefDlgId ) + { + SfxChildWindow* pChildWnd = lcl_GetChildWinFromAnyView( nCurRefDlgId ); + DBG_ASSERT( pChildWnd, "NoChildWin" ); + if ( pChildWnd ) + { + if ( nCurRefDlgId == SID_OPENDLG_CONSOLIDATE && pMarkData ) + { + SCTAB nStartTab = aNew.aStart.Tab(); + SCTAB nEndTab = aNew.aEnd.Tab(); + lcl_MarkedTabs( *pMarkData, nStartTab, nEndTab ); + aNew.aStart.SetTab(nStartTab); + aNew.aEnd.SetTab(nEndTab); + } + + IAnyRefDialog* pRefDlg = dynamic_cast<IAnyRefDialog*>(pChildWnd->GetWindow()); + + // hide the (color) selection now instead of later from LoseFocus, + // don't abort the ref input that causes this call (bDoneRefMode = sal_False) + pRefDlg->HideReference( false ); + pRefDlg->SetReference( aNew, pDoc ); + } + } + else + { + ScInputHandler* pHdl = GetInputHdl(); + if (pHdl) + pHdl->SetReference( aNew, pDoc ); + else + { + OSL_FAIL("SetReference ohne Empfaenger"); + } + } +} + +void ScModule::AddRefEntry() // "Mehrfachselektion" +{ + //! move reference dialog handling to view + //! (only keep function autopilot here for references to other documents) + + if ( nCurRefDlgId ) + { + SfxChildWindow* pChildWnd = lcl_GetChildWinFromAnyView( nCurRefDlgId ); + DBG_ASSERT( pChildWnd, "NoChildWin" ); + if ( pChildWnd ) + { + IAnyRefDialog* pRefDlg = dynamic_cast<IAnyRefDialog*>(pChildWnd->GetWindow()); + pRefDlg->AddRefEntry(); + } + } + else + { + ScInputHandler* pHdl = GetInputHdl(); + if (pHdl) + pHdl->AddRefEntry(); + } +} + +void ScModule::EndReference() +{ + //! move reference dialog handling to view + //! (only keep function autopilot here for references to other documents) + + // in Ref-Dialogen wird hiermit auch das Zoom-In wieder aufgehoben + + //! ShowRefFrame am InputHdl, wenn der Funktions-AP offen ist ??? + + if ( nCurRefDlgId ) + { + SfxChildWindow* pChildWnd = lcl_GetChildWinFromAnyView( nCurRefDlgId ); + DBG_ASSERT( pChildWnd, "NoChildWin" ); + if ( pChildWnd ) + { + IAnyRefDialog* pRefDlg = dynamic_cast<IAnyRefDialog*>(pChildWnd->GetWindow()); + pRefDlg->SetActive(); + } + } +} + +//------------------------------------------------------------------ +// +// Idle / Online-Spelling +// +//------------------------------------------------------------------ + +void ScModule::AnythingChanged() +{ + sal_uLong nOldTime = aIdleTimer.GetTimeout(); + if ( nOldTime != SC_IDLE_MIN ) + aIdleTimer.SetTimeout( SC_IDLE_MIN ); + + nIdleCount = 0; +} + +void lcl_CheckNeedsRepaint( ScDocShell* pDocShell ) +{ + SfxViewFrame* pFrame = SfxViewFrame::GetFirst( pDocShell ); + while ( pFrame ) + { + SfxViewShell* p = pFrame->GetViewShell(); + ScTabViewShell* pViewSh = PTR_CAST(ScTabViewShell,p); + if ( pViewSh ) + pViewSh->CheckNeedsRepaint(); + pFrame = SfxViewFrame::GetNext( *pFrame, pDocShell ); + } +} + +IMPL_LINK( ScModule, IdleHandler, Timer*, EMPTYARG ) +{ + if ( Application::AnyInput( INPUT_MOUSEANDKEYBOARD ) ) + { + aIdleTimer.Start(); // Timeout unveraendert + return 0; + } + + sal_Bool bMore = false; + ScDocShell* pDocSh = PTR_CAST( ScDocShell, SfxObjectShell::Current() ); + if ( pDocSh ) + { + ScDocument* pDoc = pDocSh->GetDocument(); + + sal_Bool bLinks = pDoc->IdleCheckLinks(); + sal_Bool bWidth = pDoc->IdleCalcTextWidth(); + sal_Bool bSpell = pDoc->ContinueOnlineSpelling(); + if ( bSpell ) + aSpellTimer.Start(); // da ist noch was + + bMore = bLinks || bWidth || bSpell; // ueberhaupt noch was? + + // While calculating a Basic formula, a paint event may have occurred, + // so check the bNeedsRepaint flags for this document's views + if (bWidth) + lcl_CheckNeedsRepaint( pDocSh ); + } + + sal_uLong nOldTime = aIdleTimer.GetTimeout(); + sal_uLong nNewTime = nOldTime; + if ( bMore ) + { + nNewTime = SC_IDLE_MIN; + nIdleCount = 0; + } + else + { + // SC_IDLE_COUNT mal mit initialem Timeout, dann hochzaehlen + + if ( nIdleCount < SC_IDLE_COUNT ) + ++nIdleCount; + else + { + nNewTime += SC_IDLE_STEP; + if ( nNewTime > SC_IDLE_MAX ) + nNewTime = SC_IDLE_MAX; + } + } + if ( nNewTime != nOldTime ) + aIdleTimer.SetTimeout( nNewTime ); + + aIdleTimer.Start(); + return 0; +} + +IMPL_LINK( ScModule, SpellTimerHdl, Timer*, EMPTYARG ) +{ + if ( Application::AnyInput( INPUT_KEYBOARD ) ) + { + aSpellTimer.Start(); + return 0; // dann spaeter wieder... + } + + ScDocShell* pDocSh = PTR_CAST( ScDocShell, SfxObjectShell::Current() ); + if ( pDocSh ) + { + ScDocument* pDoc = pDocSh->GetDocument(); + if ( pDoc->ContinueOnlineSpelling() ) + aSpellTimer.Start(); + } + return 0; +} + + //virtuelle Methoden fuer den Optionendialog +SfxItemSet* ScModule::CreateItemSet( sal_uInt16 nId ) +{ + SfxItemSet* pRet = 0; + if(SID_SC_EDITOPTIONS == nId) + { + pRet = new SfxItemSet( GetPool(), + // TP_CALC: + SID_SCDOCOPTIONS, SID_SCDOCOPTIONS, + // TP_VIEW: + SID_SCVIEWOPTIONS, SID_SCVIEWOPTIONS, + SID_SC_OPT_SYNCZOOM, SID_SC_OPT_SYNCZOOM, + // TP_INPUT: + SID_SC_INPUT_SELECTION,SID_SC_INPUT_MARK_HEADER, + SID_SC_INPUT_TEXTWYSIWYG,SID_SC_INPUT_TEXTWYSIWYG, + SID_SC_INPUT_REPLCELLSWARN,SID_SC_INPUT_REPLCELLSWARN, + // TP_USERLISTS: + SCITEM_USERLIST, SCITEM_USERLIST, + // TP_PRINT: + SID_SCPRINTOPTIONS, SID_SCPRINTOPTIONS, + // TP_GRID: + SID_ATTR_GRID_OPTIONS, SID_ATTR_GRID_OPTIONS, + // + SID_ATTR_METRIC, SID_ATTR_METRIC, + SID_ATTR_DEFTABSTOP, SID_ATTR_DEFTABSTOP, + 0 ); + + ScDocShell* pDocSh = PTR_CAST(ScDocShell, + SfxObjectShell::Current()); + ScDocOptions aCalcOpt = pDocSh + ? pDocSh->GetDocument()->GetDocOptions() + : GetDocOptions(); + + ScTabViewShell* pViewSh = PTR_CAST(ScTabViewShell, + SfxViewShell::Current()); + ScViewOptions aViewOpt = pViewSh + ? pViewSh->GetViewData()->GetOptions() + : GetViewOptions(); + + ScUserListItem aULItem( SCITEM_USERLIST ); + ScUserList* pUL = ScGlobal::GetUserList(); + + // SFX_APP()->GetOptions( aSet ); + + pRet->Put( SfxUInt16Item( SID_ATTR_METRIC, + sal::static_int_cast<sal_uInt16>(GetAppOptions().GetAppMetric()) ) ); + + // TP_CALC + pRet->Put( SfxUInt16Item( SID_ATTR_DEFTABSTOP, + aCalcOpt.GetTabDistance())); + pRet->Put( ScTpCalcItem( SID_SCDOCOPTIONS, aCalcOpt ) ); + + // TP_VIEW + pRet->Put( ScTpViewItem( SID_SCVIEWOPTIONS, aViewOpt ) ); + pRet->Put( SfxBoolItem( SID_SC_OPT_SYNCZOOM, GetAppOptions().GetSynchronizeZoom() ) ); + + // TP_INPUT + const ScInputOptions& rInpOpt = GetInputOptions(); + pRet->Put( SfxUInt16Item( SID_SC_INPUT_SELECTIONPOS, + rInpOpt.GetMoveDir() ) ); + pRet->Put( SfxBoolItem( SID_SC_INPUT_SELECTION, + rInpOpt.GetMoveSelection() ) ); + pRet->Put( SfxBoolItem( SID_SC_INPUT_EDITMODE, + rInpOpt.GetEnterEdit() ) ); + pRet->Put( SfxBoolItem( SID_SC_INPUT_FMT_EXPAND, + rInpOpt.GetExtendFormat() ) ); + pRet->Put( SfxBoolItem( SID_SC_INPUT_RANGEFINDER, + rInpOpt.GetRangeFinder() ) ); + pRet->Put( SfxBoolItem( SID_SC_INPUT_REF_EXPAND, + rInpOpt.GetExpandRefs() ) ); + pRet->Put( SfxBoolItem( SID_SC_INPUT_MARK_HEADER, + rInpOpt.GetMarkHeader() ) ); + pRet->Put( SfxBoolItem( SID_SC_INPUT_TEXTWYSIWYG, + rInpOpt.GetTextWysiwyg() ) ); + pRet->Put( SfxBoolItem( SID_SC_INPUT_REPLCELLSWARN, + rInpOpt.GetReplaceCellsWarn() ) ); + + // RID_SC_TP_PRINT + pRet->Put( ScTpPrintItem( SID_SCPRINTOPTIONS, GetPrintOptions() ) ); + + // TP_GRID + SvxGridItem* pSvxGridItem = aViewOpt.CreateGridItem(); + pRet->Put( *pSvxGridItem ); + delete pSvxGridItem; + + // TP_USERLISTS + if ( pUL ) + aULItem.SetUserList( *pUL ); + pRet->Put( aULItem ); + + } + return pRet; +} + +void ScModule::ApplyItemSet( sal_uInt16 nId, const SfxItemSet& rSet ) +{ + if(SID_SC_EDITOPTIONS == nId) + { + ModifyOptions( rSet ); + } +} + +SfxTabPage* ScModule::CreateTabPage( sal_uInt16 nId, Window* pParent, const SfxItemSet& rSet ) +{ + SfxTabPage* pRet = NULL; + ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create(); + DBG_ASSERT(pFact, "ScAbstractFactory create fail!"); + switch(nId) + { + case SID_SC_TP_LAYOUT: + { + ::CreateTabPage ScTpLayoutOptionsCreate = pFact->GetTabPageCreatorFunc( RID_SCPAGE_LAYOUT ); + if ( ScTpLayoutOptionsCreate ) + pRet = (*ScTpLayoutOptionsCreate) (pParent, rSet); + } + break; + case SID_SC_TP_CONTENT: + { + ::CreateTabPage ScTpContentOptionsCreate = pFact->GetTabPageCreatorFunc(RID_SCPAGE_CONTENT); + if ( ScTpContentOptionsCreate ) + pRet = (*ScTpContentOptionsCreate)(pParent, rSet); + } + break; + case SID_SC_TP_GRID: pRet = SvxGridTabPage::Create(pParent, rSet); break; + case SID_SC_TP_USERLISTS: + { + ::CreateTabPage ScTpUserListsCreate = pFact->GetTabPageCreatorFunc( RID_SCPAGE_USERLISTS ); + if ( ScTpUserListsCreate ) + pRet = (*ScTpUserListsCreate)( pParent, rSet); + } + break; + case SID_SC_TP_CALC: + { + ::CreateTabPage ScTpCalcOptionsCreate = pFact->GetTabPageCreatorFunc( RID_SCPAGE_CALC ); + if ( ScTpCalcOptionsCreate ) + pRet = (*ScTpCalcOptionsCreate)(pParent, rSet); + } + break; + case SID_SC_TP_FORMULA: + { + ::CreateTabPage ScTpFormulaOptionsCreate = pFact->GetTabPageCreatorFunc (RID_SCPAGE_FORMULA); + if (ScTpFormulaOptionsCreate) + pRet = (*ScTpFormulaOptionsCreate)(pParent, rSet); + } + break; + case SID_SC_TP_COMPATIBILITY: + { + ::CreateTabPage ScTpCompatOptionsCreate = pFact->GetTabPageCreatorFunc (RID_SCPAGE_COMPATIBILITY); + if (ScTpCompatOptionsCreate) + pRet = (*ScTpCompatOptionsCreate)(pParent, rSet); + } + break; + case SID_SC_TP_CHANGES: + { + ::CreateTabPage ScRedlineOptionsTabPageCreate = pFact->GetTabPageCreatorFunc( RID_SCPAGE_OPREDLINE ); + if ( ScRedlineOptionsTabPageCreate ) + pRet =(*ScRedlineOptionsTabPageCreate)(pParent, rSet); + } + break; + case RID_SC_TP_PRINT: + { + ::CreateTabPage ScTpPrintOptionsCreate = pFact->GetTabPageCreatorFunc( RID_SCPAGE_PRINT ); + if ( ScTpPrintOptionsCreate ) + pRet = (*ScTpPrintOptionsCreate)( pParent, rSet); + } + break; + case RID_OFA_TP_INTERNATIONAL: + { + SfxAbstractDialogFactory* pSfxFact = SfxAbstractDialogFactory::Create(); + if ( pSfxFact ) + { + ::CreateTabPage fnCreatePage = pSfxFact->GetTabPageCreatorFunc( nId ); + if ( fnCreatePage ) + pRet = (*fnCreatePage)( pParent, rSet ); + } + } + } + + DBG_ASSERT( pRet, "ScModule::CreateTabPage(): no valid ID for TabPage!" ); + + return pRet; +} + +//------------------------------------------------------------------ + +IMPL_LINK( ScModule, CalcFieldValueHdl, EditFieldInfo*, pInfo ) +{ + //! mit ScFieldEditEngine zusammenfassen !!! + + if (pInfo) + { + const SvxFieldItem& rField = pInfo->GetField(); + const SvxFieldData* pField = rField.GetField(); + + if (pField && pField->ISA(SvxURLField)) + { + /****************************************************************** + * URL-Field + ******************************************************************/ + + const SvxURLField* pURLField = (const SvxURLField*) pField; + String aURL = pURLField->GetURL(); + + switch ( pURLField->GetFormat() ) + { + case SVXURLFORMAT_APPDEFAULT: //!!! einstellbar an App??? + case SVXURLFORMAT_REPR: + { + pInfo->SetRepresentation( pURLField->GetRepresentation() ); + } + break; + + case SVXURLFORMAT_URL: + { + pInfo->SetRepresentation( aURL ); + } + break; + } + + svtools::ColorConfigEntry eEntry = + INetURLHistory::GetOrCreate()->QueryUrl( aURL ) ? svtools::LINKSVISITED : svtools::LINKS; + pInfo->SetTxtColor( GetColorConfig().GetColorValue(eEntry).nColor ); + } + else + { + OSL_FAIL("unbekannter Feldbefehl"); + pInfo->SetRepresentation(String('?')); + } + } + + return 0; +} + +sal_Bool ScModule::RegisterRefWindow( sal_uInt16 nSlotId, Window *pWnd ) +{ + std::list<Window*> & rlRefWindow = m_mapRefWindow[nSlotId]; + + if( std::find( rlRefWindow.begin(), rlRefWindow.end(), pWnd ) == rlRefWindow.end() ) + { + rlRefWindow.push_back( pWnd ); + return sal_True; + } + + return false; +} + +sal_Bool ScModule::UnregisterRefWindow( sal_uInt16 nSlotId, Window *pWnd ) +{ + std::map<sal_uInt16, std::list<Window*> >::iterator iSlot = m_mapRefWindow.find( nSlotId ); + + if( iSlot == m_mapRefWindow.end() ) + return false; + + std::list<Window*> & rlRefWindow = iSlot->second; + + std::list<Window*>::iterator i = std::find( rlRefWindow.begin(), rlRefWindow.end(), pWnd ); + + if( i == rlRefWindow.end() ) + return false; + + rlRefWindow.erase( i ); + + if( !rlRefWindow.size() ) + m_mapRefWindow.erase( nSlotId ); + + return sal_True; +} + +sal_Bool ScModule::IsAliveRefDlg( sal_uInt16 nSlotId, Window *pWnd ) +{ + std::map<sal_uInt16, std::list<Window*> >::iterator iSlot = m_mapRefWindow.find( nSlotId ); + + if( iSlot == m_mapRefWindow.end() ) + return false; + + std::list<Window*> & rlRefWindow = iSlot->second; + + return rlRefWindow.end() != std::find( rlRefWindow.begin(), rlRefWindow.end(), pWnd ); +} + +Window * ScModule::Find1RefWindow( sal_uInt16 nSlotId, Window *pWndAncestor ) +{ + if (!pWndAncestor) + return NULL; + + std::map<sal_uInt16, std::list<Window*> >::iterator iSlot = m_mapRefWindow.find( nSlotId ); + + if( iSlot == m_mapRefWindow.end() ) + return NULL; + + std::list<Window*> & rlRefWindow = iSlot->second; + + while( Window *pParent = pWndAncestor->GetParent() ) pWndAncestor = pParent; + + for( std::list<Window*>::iterator i = rlRefWindow.begin(); i!=rlRefWindow.end(); ++i ) + if ( pWndAncestor->IsWindowOrChild( *i, (*i)->IsSystemWindow() ) ) + return *i; + + return NULL; +} + +Window * ScModule::Find1RefWindow( Window *pWndAncestor ) +{ + if (!pWndAncestor) + return NULL; + + while( Window *pParent = pWndAncestor->GetParent() ) pWndAncestor = pParent; + + for( std::map<sal_uInt16, std::list<Window*> >::iterator i = m_mapRefWindow.begin(); + i!=m_mapRefWindow.end(); ++i ) + for( std::list<Window*>::iterator j = i->second.begin(); j!=i->second.end(); ++j ) + if ( pWndAncestor->IsWindowOrChild( *j, (*j)->IsSystemWindow() ) ) + return *j; + + return NULL; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |