xref: /trunk/main/sc/source/ui/app/scmod.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sc.hxx"
30 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
31 #include <comphelper/processfactory.hxx>
32 
33 
34 
35 
36 
37 // INCLUDE ---------------------------------------------------------------
38 
39 #include "scitems.hxx"
40 #include <sfx2/app.hxx>
41 #include <editeng/eeitem.hxx>
42 
43 #include <editeng/flditem.hxx>
44 #include <editeng/outliner.hxx>
45 #include <basic/sbstar.hxx>
46 
47 #include <sfx2/sfxdlg.hxx>
48 #include <sfx2/viewfrm.hxx>
49 #include <sfx2/objface.hxx>
50 
51 #include <svx/hyprlink.hxx>
52 #include "IAnyRefDialog.hxx"
53 
54 #include <svtools/ehdl.hxx>
55 #include <svtools/accessibilityoptions.hxx>
56 #include <svl/ctloptions.hxx>
57 #include <unotools/useroptions.hxx>
58 #include <vcl/status.hxx>
59 #include <sfx2/bindings.hxx>
60 #include <sfx2/request.hxx>
61 #include <sfx2/printer.hxx>
62 #include <editeng/langitem.hxx>
63 #include <svtools/colorcfg.hxx>
64 
65 #include <svl/whiter.hxx>
66 #include <svx/selctrl.hxx>
67 #include <svx/insctrl.hxx>
68 #include <svx/zoomctrl.hxx>
69 #include <svx/modctrl.hxx>
70 #include <svx/pszctrl.hxx>
71 #include <svx/zoomsliderctrl.hxx>
72 #include <vcl/msgbox.hxx>
73 #include <svl/inethist.hxx>
74 #include <vcl/waitobj.hxx>
75 #include <svx/svxerr.hxx>
76 
77 
78 
79 #include "scmod.hxx"
80 #include "global.hxx"
81 #include "viewopti.hxx"
82 #include "docoptio.hxx"
83 #include "appoptio.hxx"
84 #include "inputopt.hxx"
85 #include "printopt.hxx"
86 #include "navicfg.hxx"
87 #include "addincfg.hxx"
88 #include "tabvwsh.hxx"
89 #include "prevwsh.hxx"
90 #include "docsh.hxx"
91 #include "drwlayer.hxx"
92 #include "uiitems.hxx"
93 #include "sc.hrc"
94 #include "cfgids.hxx"
95 #include "inputhdl.hxx"
96 #include "inputwin.hxx"
97 #include "msgpool.hxx"
98 #include "scresid.hxx"
99 #include "anyrefdg.hxx"
100 #include "dwfunctr.hxx"
101 #include "formdata.hxx"
102 //CHINA001 #include "tpview.hxx"
103 //CHINA001 #include "tpusrlst.hxx"
104 //CHINA001 #include "tpcalc.hxx"
105 #include "tpprint.hxx"
106 //CHINA001 #include "opredlin.hxx"
107 #include "transobj.hxx"
108 #include "detfunc.hxx"
109 #include "preview.hxx"
110 
111 #include <svx/xmlsecctrl.hxx>
112 
113 
114 #define ScModule
115 #include "scslots.hxx"
116 
117 #include "scabstdlg.hxx" //CHINA001
118 
119 #define SC_IDLE_MIN     150
120 #define SC_IDLE_MAX     3000
121 #define SC_IDLE_STEP    75
122 #define SC_IDLE_COUNT   50
123 
124 static sal_uInt16 nIdleCount = 0;
125 
126 //------------------------------------------------------------------
127 
128 SFX_IMPL_INTERFACE( ScModule, SfxShell, ScResId(RID_APPTITLE) )
129 {
130     SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_APPLICATION | SFX_VISIBILITY_DESKTOP | SFX_VISIBILITY_STANDARD | SFX_VISIBILITY_CLIENT | SFX_VISIBILITY_VIEWER,
131                                 ScResId(RID_OBJECTBAR_APP) );
132     SFX_STATUSBAR_REGISTRATION( ScResId(SCCFG_STATUSBAR) );     // nur ID wichtig
133     SFX_CHILDWINDOW_REGISTRATION( SvxHyperlinkDlgWrapper::GetChildWindowId() );
134 }
135 
136 //------------------------------------------------------------------
137 
138 ScModule::ScModule( SfxObjectFactory* pFact ) :
139     SfxModule( SfxApplication::CreateResManager( "sc" ), sal_False, pFact, NULL ),
140     pSelTransfer( NULL ),
141     pMessagePool( NULL ),
142     pRefInputHandler( NULL ),
143     pViewCfg( NULL ),
144     pDocCfg( NULL ),
145     pAppCfg( NULL ),
146     pInputCfg( NULL ),
147     pPrintCfg( NULL ),
148     pNavipiCfg( NULL ),
149     pAddInCfg( NULL ),
150     pColorConfig( NULL ),
151     pAccessOptions( NULL ),
152     pCTLOptions( NULL ),
153     pUserOptions( NULL ),
154     pErrorHdl( NULL ),
155     pSvxErrorHdl( NULL ),
156     pFormEditData( NULL ),
157     nCurRefDlgId( 0 ),
158     bIsWaterCan( sal_False ),
159     bIsInEditCommand( sal_False ),
160     bIsInExecuteDrop( sal_False ),
161     mbIsInSharedDocLoading( false ),
162     mbIsInSharedDocSaving( false )
163 {
164     //  im ctor ist der ResManager (DLL-Daten) noch nicht initialisiert!
165 
166     SetName(String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("StarCalc")));       // fuer Basic
167 
168     ResetDragObject();
169     SetClipObject( NULL, NULL );
170 
171     //  InputHandler braucht nicht mehr angelegt zu werden
172 
173     //  ErrorHandler anlegen - war in Init()
174     //  zwischen OfficeApplication::Init und ScGlobal::Init
175     SvxErrorHandler::Get();
176     pErrorHdl    = new SfxErrorHandler( RID_ERRHDLSC,
177                                         ERRCODE_AREA_SC,
178                                         ERRCODE_AREA_APP2-1,
179                                         GetResMgr() );
180 
181     aSpellTimer.SetTimeout(10);
182     aSpellTimer.SetTimeoutHdl( LINK( this, ScModule, SpellTimerHdl ) );
183     aIdleTimer.SetTimeout(SC_IDLE_MIN);
184     aIdleTimer.SetTimeoutHdl( LINK( this, ScModule, IdleHandler ) );
185     aIdleTimer.Start();
186 
187     pMessagePool = new ScMessagePool;
188     pMessagePool->FreezeIdRanges();
189     SetPool( pMessagePool );
190     ScGlobal::InitTextHeight( pMessagePool );
191 
192     StartListening( *SFX_APP() );       // for SFX_HINT_DEINITIALIZING
193 }
194 
195 ScModule::~ScModule()
196 {
197     DBG_ASSERT( !pSelTransfer, "Selection Transfer object not deleted" );
198 
199     //  InputHandler braucht nicht mehr geloescht zu werden (gibt keinen an der App mehr)
200 
201     SfxItemPool::Free(pMessagePool);
202 
203     DELETEZ( pFormEditData );
204 
205     delete pErrorHdl;
206 //  delete pSvxErrorHdl;
207 
208     ScGlobal::Clear();      // ruft auch ScDocumentPool::DeleteVersionMaps();
209 
210     DeleteCfg();            // wurde mal aus Exit() gerufen
211 }
212 
213 //------------------------------------------------------------------
214 void ScModule::ConfigurationChanged( utl::ConfigurationBroadcaster* p, sal_uInt32 )
215 {
216     if ( p == pColorConfig || p == pAccessOptions )
217     {
218         //  Test if detective objects have to be updated with new colors
219         //  (if the detective colors haven't been used yet, there's nothing to update)
220         if ( ScDetectiveFunc::IsColorsInitialized() )
221         {
222             const svtools::ColorConfig& rColors = GetColorConfig();
223             sal_Bool bArrows =
224                 ( ScDetectiveFunc::GetArrowColor() != (ColorData)rColors.GetColorValue(svtools::CALCDETECTIVE).nColor ||
225                   ScDetectiveFunc::GetErrorColor() != (ColorData)rColors.GetColorValue(svtools::CALCDETECTIVEERROR).nColor );
226             sal_Bool bComments =
227                 ( ScDetectiveFunc::GetCommentColor() != (ColorData)rColors.GetColorValue(svtools::CALCNOTESBACKGROUND).nColor );
228             if ( bArrows || bComments )
229             {
230                 ScDetectiveFunc::InitializeColors();        // get the new colors
231 
232                 //  update detective objects in all open documents
233                 SfxObjectShell* pObjSh = SfxObjectShell::GetFirst();
234                 while ( pObjSh )
235                 {
236                     if ( pObjSh->Type() == TYPE(ScDocShell) )
237                     {
238                         ScDocShell* pDocSh = ((ScDocShell*)pObjSh);
239                         if ( bArrows )
240                             ScDetectiveFunc( pDocSh->GetDocument(), 0 ).UpdateAllArrowColors();
241                         if ( bComments )
242                             ScDetectiveFunc::UpdateAllComments( *pDocSh->GetDocument() );
243                     }
244                     pObjSh = SfxObjectShell::GetNext( *pObjSh );
245                 }
246             }
247         }
248 
249         //  force all views to repaint, using the new options
250 
251         SfxViewShell* pViewShell = SfxViewShell::GetFirst();
252         while(pViewShell)
253         {
254             if ( pViewShell->ISA(ScTabViewShell) )
255             {
256                 ScTabViewShell* pViewSh = (ScTabViewShell*)pViewShell;
257                 pViewSh->PaintGrid();
258                 pViewSh->PaintTop();
259                 pViewSh->PaintLeft();
260                 pViewSh->PaintExtras();
261 
262                 ScInputHandler* pHdl = pViewSh->GetInputHandler();
263                 if ( pHdl )
264                     pHdl->ForgetLastPattern();  // EditEngine BackgroundColor may change
265             }
266             else if ( pViewShell->ISA(ScPreviewShell) )
267             {
268                 Window* pWin = pViewShell->GetWindow();
269                 if (pWin)
270                     pWin->Invalidate();
271             }
272             pViewShell = SfxViewShell::GetNext( *pViewShell );
273         }
274     }
275     else if ( p == pCTLOptions )
276     {
277         //  for all documents: set digit language for printer, recalc output factor, update row heights
278         SfxObjectShell* pObjSh = SfxObjectShell::GetFirst();
279         while ( pObjSh )
280         {
281             if ( pObjSh->Type() == TYPE(ScDocShell) )
282             {
283                 ScDocShell* pDocSh = ((ScDocShell*)pObjSh);
284                 OutputDevice* pPrinter = pDocSh->GetPrinter();
285                 if ( pPrinter )
286                     pPrinter->SetDigitLanguage( GetOptDigitLanguage() );
287 
288                 pDocSh->CalcOutputFactor();
289 
290                 SCTAB nTabCount = pDocSh->GetDocument()->GetTableCount();
291                 for (SCTAB nTab=0; nTab<nTabCount; nTab++)
292                     pDocSh->AdjustRowHeight( 0, MAXROW, nTab );
293             }
294             pObjSh = SfxObjectShell::GetNext( *pObjSh );
295         }
296 
297         //  for all views (table and preview): update digit language
298         SfxViewShell* pSh = SfxViewShell::GetFirst();
299         while ( pSh )
300         {
301             if ( pSh->ISA( ScTabViewShell ) )
302             {
303                 ScTabViewShell* pViewSh = (ScTabViewShell*)pSh;
304 
305                 //  set ref-device for EditEngine (re-evaluates digit settings)
306                 ScInputHandler* pHdl = GetInputHdl(pViewSh);
307                 if (pHdl)
308                     pHdl->UpdateRefDevice();
309 
310                 pViewSh->DigitLanguageChanged();
311                 pViewSh->PaintGrid();
312             }
313             else if ( pSh->ISA( ScPreviewShell ) )
314             {
315                 ScPreviewShell* pPreviewSh = (ScPreviewShell*)pSh;
316                 ScPreview* pPreview = pPreviewSh->GetPreview();
317 
318                 pPreview->SetDigitLanguage( GetOptDigitLanguage() );
319                 pPreview->Invalidate();
320             }
321 
322             pSh = SfxViewShell::GetNext( *pSh );
323         }
324     }
325 }
326 
327 void ScModule::Notify( SfxBroadcaster&, const SfxHint& rHint )
328 {
329     if ( rHint.ISA(SfxSimpleHint) )
330     {
331         sal_uLong nHintId = ((SfxSimpleHint&)rHint).GetId();
332         if ( nHintId == SFX_HINT_DEINITIALIZING )
333         {
334             //  ConfigItems must be removed before ConfigManager
335             DeleteCfg();
336         }
337     }
338 }
339 
340 //------------------------------------------------------------------
341 
342 void ScModule::DeleteCfg()
343 {
344     DELETEZ( pViewCfg ); // Speichern passiert vor Exit() automatisch
345     DELETEZ( pDocCfg );
346     DELETEZ( pAppCfg );
347     DELETEZ( pInputCfg );
348     DELETEZ( pPrintCfg );
349     DELETEZ( pNavipiCfg );
350     DELETEZ( pAddInCfg );
351 
352     if ( pColorConfig )
353     {
354         pColorConfig->RemoveListener(this);
355         DELETEZ( pColorConfig );
356     }
357     if ( pAccessOptions )
358     {
359         pAccessOptions->RemoveListener(this);
360         DELETEZ( pAccessOptions );
361     }
362     if ( pCTLOptions )
363     {
364         pCTLOptions->RemoveListener(this);
365         DELETEZ( pCTLOptions );
366     }
367     if( pUserOptions )
368     {
369         DELETEZ( pUserOptions );
370     }
371 }
372 
373 //------------------------------------------------------------------
374 //
375 //      von der Applikation verschoben:
376 //
377 //------------------------------------------------------------------
378 
379 void ScModule::Execute( SfxRequest& rReq )
380 {
381     SfxViewFrame* pViewFrm = SfxViewFrame::Current();
382     SfxBindings* pBindings = pViewFrm ? &pViewFrm->GetBindings() : NULL;
383 
384     const SfxItemSet*   pReqArgs    = rReq.GetArgs();
385     sal_uInt16              nSlot       = rReq.GetSlot();
386 
387     switch ( nSlot )
388     {
389         case SID_CHOOSE_DESIGN:
390             {
391                 String aMacroName =
392                     String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("Template.Samples.ShowStyles"));
393                 SfxApplication::CallAppBasic( aMacroName );
394             }
395             break;
396         case SID_EURO_CONVERTER:
397             {
398                 String aMacroName =
399                     String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("Euro.ConvertRun.Main"));
400                 SfxApplication::CallAppBasic( aMacroName );
401             }
402             break;
403         case SID_AUTOSPELL_CHECK:
404             {
405                 sal_Bool bSet;
406                 const SfxPoolItem* pItem;
407                 if ( pReqArgs && SFX_ITEM_SET == pReqArgs->GetItemState( nSlot, sal_True, &pItem ) )
408                     bSet = ((const SfxBoolItem*)pItem)->GetValue();
409                 else
410                 {                       //  Toggle
411                     ScDocShell* pDocSh = PTR_CAST(ScDocShell, SfxObjectShell::Current());
412                     if ( pDocSh )
413                         bSet = !pDocSh->GetDocument()->GetDocOptions().IsAutoSpell();
414                     else
415                         bSet = !GetDocOptions().IsAutoSpell();
416                 }
417 
418                 SfxItemSet aSet( GetPool(), SID_AUTOSPELL_CHECK, SID_AUTOSPELL_CHECK );
419                 aSet.Put( SfxBoolItem( SID_AUTOSPELL_CHECK, bSet ) );
420                 ModifyOptions( aSet );
421                 rReq.Done();
422             }
423             break;
424 
425         case SID_ATTR_METRIC:
426             {
427                 const SfxPoolItem* pItem;
428                 if ( pReqArgs && SFX_ITEM_SET == pReqArgs->GetItemState( nSlot, sal_True, &pItem ) )
429                 {
430                     FieldUnit eUnit = (FieldUnit)((const SfxUInt16Item*)pItem)->GetValue();
431                     switch( eUnit )
432                     {
433                         case FUNIT_MM:      // nur die Einheiten, die auch im Dialog stehen
434                         case FUNIT_CM:
435                         case FUNIT_INCH:
436                         case FUNIT_PICA:
437                         case FUNIT_POINT:
438                             {
439                                 PutItem( *pItem );
440                                 ScAppOptions aNewOpts( GetAppOptions() );
441                                 aNewOpts.SetAppMetric( eUnit );
442                                 SetAppOptions( aNewOpts );
443                                 rReq.Done();
444                             }
445                             break;
446                         default:
447                         {
448                             // added to avoid warnings
449                         }
450                     }
451                 }
452             }
453             break;
454 
455         case FID_AUTOCOMPLETE:
456             {
457                 ScAppOptions aNewOpts( GetAppOptions() );
458                 sal_Bool bNew = !aNewOpts.GetAutoComplete();
459                 aNewOpts.SetAutoComplete( bNew );
460                 SetAppOptions( aNewOpts );
461                 ScInputHandler::SetAutoComplete( bNew );
462                 if (pBindings)
463                     pBindings->Invalidate( FID_AUTOCOMPLETE );
464                 rReq.Done();
465             }
466             break;
467 
468         case SID_DETECTIVE_AUTO:
469             {
470                 ScAppOptions aNewOpts( GetAppOptions() );
471                 sal_Bool bNew = !aNewOpts.GetDetectiveAuto();
472                 SFX_REQUEST_ARG( rReq, pAuto, SfxBoolItem, SID_DETECTIVE_AUTO, sal_False );
473                 if ( pAuto )
474                     bNew = pAuto->GetValue();
475 
476                 aNewOpts.SetDetectiveAuto( bNew );
477                 SetAppOptions( aNewOpts );
478                 if (pBindings)
479                     pBindings->Invalidate( SID_DETECTIVE_AUTO );
480                 rReq.AppendItem( SfxBoolItem( SID_DETECTIVE_AUTO, bNew ) );
481                 rReq.Done();
482             }
483             break;
484 
485         case SID_PSZ_FUNCTION:
486             if (pReqArgs)
487             {
488                 const SfxUInt16Item& rItem = (const SfxUInt16Item&)pReqArgs->Get(SID_PSZ_FUNCTION);
489                 DBG_ASSERT(rItem.ISA(SfxUInt16Item),"falscher Parameter");
490 
491                 ScAppOptions aNewOpts( GetAppOptions() );
492                 aNewOpts.SetStatusFunc( rItem.GetValue() );
493                 SetAppOptions( aNewOpts );
494 
495                 if (pBindings)
496                 {
497                     pBindings->Invalidate( SID_TABLE_CELL );
498                     pBindings->Update( SID_TABLE_CELL );            // sofort
499 
500                     pBindings->Invalidate( SID_PSZ_FUNCTION );
501                     pBindings->Update( SID_PSZ_FUNCTION );
502                     // falls Menue gleich wieder aufgeklappt wird
503                 }
504             }
505             break;
506 
507         case SID_ATTR_LANGUAGE:
508         case SID_ATTR_CHAR_CJK_LANGUAGE:
509         case SID_ATTR_CHAR_CTL_LANGUAGE:
510             {
511                 const SfxPoolItem* pItem;
512                 if ( pReqArgs && SFX_ITEM_SET == pReqArgs->GetItemState( GetPool().GetWhich(nSlot), sal_True, &pItem ) )
513                 {
514                     ScDocShell* pDocSh = PTR_CAST(ScDocShell, SfxObjectShell::Current());
515                     ScDocument* pDoc = pDocSh ? pDocSh->GetDocument() : NULL;
516                     if ( pDoc )
517                     {
518                         LanguageType eNewLang = ((SvxLanguageItem*)pItem)->GetLanguage();
519                         LanguageType eLatin, eCjk, eCtl;
520                         pDoc->GetLanguage( eLatin, eCjk, eCtl );
521                         LanguageType eOld = ( nSlot == SID_ATTR_CHAR_CJK_LANGUAGE ) ? eCjk :
522                                             ( ( nSlot == SID_ATTR_CHAR_CTL_LANGUAGE ) ? eCtl : eLatin );
523                         if ( eNewLang != eOld )
524                         {
525                             if ( nSlot == SID_ATTR_CHAR_CJK_LANGUAGE )
526                                 eCjk = eNewLang;
527                             else if ( nSlot == SID_ATTR_CHAR_CTL_LANGUAGE )
528                                 eCtl = eNewLang;
529                             else
530                                 eLatin = eNewLang;
531 
532                             pDoc->SetLanguage( eLatin, eCjk, eCtl );
533 
534                             ScInputHandler* pInputHandler = GetInputHdl();
535                             if ( pInputHandler )
536                                 pInputHandler->UpdateSpellSettings();   // EditEngine-Flags
537                             ScTabViewShell* pViewSh = PTR_CAST(ScTabViewShell, SfxViewShell::Current());
538                             if ( pViewSh )
539                                 pViewSh->UpdateDrawTextOutliner();      // EditEngine-Flags
540 
541                             pDocSh->SetDocumentModified();
542                         }
543                     }
544                 }
545             }
546             break;
547 
548         case FID_FOCUS_POSWND:
549             {
550                 ScInputHandler* pHdl = GetInputHdl();
551                 if (pHdl)
552                 {
553                     ScInputWindow* pWin = pHdl->GetInputWindow();
554                     if (pWin)
555                         pWin->PosGrabFocus();
556                 }
557                 rReq.Done();
558             }
559             break;
560 
561         case SID_OPEN_XML_FILTERSETTINGS:
562         {
563             try
564             {
565                 com::sun::star::uno::Reference < ::com::sun::star::ui::dialogs::XExecutableDialog > xDialog(::comphelper::getProcessServiceFactory()->createInstance(rtl::OUString::createFromAscii("com.sun.star.comp.ui.XSLTFilterDialog")), com::sun::star::uno::UNO_QUERY);
566                 if( xDialog.is() )
567                 {
568                     xDialog->execute();
569                 }
570             }
571             catch( ::com::sun::star::uno::RuntimeException& )
572             {
573             }
574         }
575         break;
576 
577         default:
578             DBG_ERROR( "ScApplication: Unknown Message." );
579             break;
580     }
581 }
582 
583 void ScModule::GetState( SfxItemSet& rSet )
584 {
585     SfxWhichIter aIter(rSet);
586     sal_uInt16 nWhich = aIter.FirstWhich();
587     while ( nWhich )
588     {
589         switch ( nWhich )
590         {
591             case FID_AUTOCOMPLETE:
592                 rSet.Put( SfxBoolItem( nWhich, GetAppOptions().GetAutoComplete() ) );
593                 break;
594             case SID_DETECTIVE_AUTO:
595                 rSet.Put( SfxBoolItem( nWhich, GetAppOptions().GetDetectiveAuto() ) );
596                 break;
597             case SID_PSZ_FUNCTION:
598                 rSet.Put( SfxUInt16Item( nWhich, GetAppOptions().GetStatusFunc() ) );
599                 break;
600             case SID_ATTR_METRIC:
601                 rSet.Put( SfxUInt16Item( nWhich, sal::static_int_cast<sal_uInt16>(GetAppOptions().GetAppMetric()) ) );
602                 break;
603             case SID_AUTOSPELL_CHECK:
604                 {
605                     sal_Bool bAuto;
606                     ScDocShell* pDocSh = PTR_CAST(ScDocShell, SfxObjectShell::Current());
607                     if ( pDocSh )
608                         bAuto = pDocSh->GetDocument()->GetDocOptions().IsAutoSpell();
609                     else
610                     {
611                         sal_uInt16 nDummyLang, nDummyCjk, nDummyCtl;
612                         GetSpellSettings( nDummyLang, nDummyCjk, nDummyCtl, bAuto );
613                     }
614                     rSet.Put( SfxBoolItem( nWhich, bAuto ) );
615                 }
616                 break;
617             case SID_ATTR_LANGUAGE:
618             case ATTR_CJK_FONT_LANGUAGE:        // WID for SID_ATTR_CHAR_CJK_LANGUAGE
619             case ATTR_CTL_FONT_LANGUAGE:        // WID for SID_ATTR_CHAR_CTL_LANGUAGE
620                 {
621                     ScDocShell* pDocSh = PTR_CAST(ScDocShell, SfxObjectShell::Current());
622                     ScDocument* pDoc = pDocSh ? pDocSh->GetDocument() : NULL;
623                     if ( pDoc )
624                     {
625                         LanguageType eLatin, eCjk, eCtl;
626                         pDoc->GetLanguage( eLatin, eCjk, eCtl );
627                         LanguageType eLang = ( nWhich == ATTR_CJK_FONT_LANGUAGE ) ? eCjk :
628                                             ( ( nWhich == ATTR_CTL_FONT_LANGUAGE ) ? eCtl : eLatin );
629                         rSet.Put( SvxLanguageItem( eLang, nWhich ) );
630                     }
631                 }
632                 break;
633 
634         }
635         nWhich = aIter.NextWhich();
636     }
637 }
638 
639 
640 void ScModule::HideDisabledSlots( SfxItemSet& rSet )
641 {
642     if( SfxViewFrame* pViewFrm = SfxViewFrame::Current() )
643     {
644         SfxBindings& rBindings = pViewFrm->GetBindings();
645         SfxWhichIter aIter( rSet );
646         for( sal_uInt16 nWhich = aIter.FirstWhich(); nWhich != 0; nWhich = aIter.NextWhich() )
647         {
648             ScViewUtil::HideDisabledSlot( rSet, rBindings, nWhich );
649             // always disable the slots
650             rSet.DisableItem( nWhich );
651         }
652     }
653 }
654 
655 
656 //------------------------------------------------------------------
657 
658 void ScModule::ResetDragObject()
659 {
660     aDragData.pCellTransfer = NULL;
661     aDragData.pDrawTransfer = NULL;
662 
663     aDragData.aLinkDoc.Erase();
664     aDragData.aLinkTable.Erase();
665     aDragData.aLinkArea.Erase();
666     aDragData.pJumpLocalDoc = NULL;
667     aDragData.aJumpTarget.Erase();
668     aDragData.aJumpText.Erase();
669 }
670 
671 void ScModule::SetDragObject( ScTransferObj* pCellObj, ScDrawTransferObj* pDrawObj )
672 {
673     ResetDragObject();
674     aDragData.pCellTransfer = pCellObj;
675     aDragData.pDrawTransfer = pDrawObj;
676 }
677 
678 void ScModule::SetDragLink( const String& rDoc, const String& rTab, const String& rArea )
679 {
680     ResetDragObject();
681 
682     aDragData.aLinkDoc   = rDoc;
683     aDragData.aLinkTable = rTab;
684     aDragData.aLinkArea  = rArea;
685 }
686 
687 void ScModule::SetDragJump( ScDocument* pLocalDoc, const String& rTarget, const String& rText )
688 {
689     ResetDragObject();
690 
691     aDragData.pJumpLocalDoc = pLocalDoc;
692     aDragData.aJumpTarget = rTarget;
693     aDragData.aJumpText = rText;
694 }
695 
696 //------------------------------------------------------------------
697 
698 void ScModule::SetClipObject( ScTransferObj* pCellObj, ScDrawTransferObj* pDrawObj )
699 {
700     DBG_ASSERT( !pCellObj || !pDrawObj, "SetClipObject: not allowed to set both objects" );
701 
702     aClipData.pCellClipboard = pCellObj;
703     aClipData.pDrawClipboard = pDrawObj;
704 }
705 
706 ScDocument* ScModule::GetClipDoc()
707 {
708     //  called from document
709 
710     ScTransferObj* pObj = ScTransferObj::GetOwnClipboard( NULL );
711     if (pObj)
712         return pObj->GetDocument();
713 
714     return NULL;
715 }
716 
717 //------------------------------------------------------------------
718 
719 void ScModule::SetSelectionTransfer( ScSelectionTransferObj* pNew )
720 {
721     pSelTransfer = pNew;
722 }
723 
724 //------------------------------------------------------------------
725 
726 void ScModule::InitFormEditData()
727 {
728     pFormEditData = new ScFormEditData;
729 }
730 
731 void ScModule::ClearFormEditData()
732 {
733     DELETEZ( pFormEditData );
734 }
735 
736 //------------------------------------------------------------------
737 
738 void ScModule::SetViewOptions( const ScViewOptions& rOpt )
739 {
740     if ( !pViewCfg )
741         pViewCfg = new ScViewCfg;
742 
743     pViewCfg->SetOptions( rOpt );
744 }
745 
746 const ScViewOptions& ScModule::GetViewOptions()
747 {
748     if ( !pViewCfg )
749         pViewCfg = new ScViewCfg;
750 
751     return *pViewCfg;
752 }
753 
754 void ScModule::SetDocOptions( const ScDocOptions& rOpt )
755 {
756     if ( !pDocCfg )
757         pDocCfg = new ScDocCfg;
758 
759     pDocCfg->SetOptions( rOpt );
760 }
761 
762 const ScDocOptions& ScModule::GetDocOptions()
763 {
764     if ( !pDocCfg )
765         pDocCfg = new ScDocCfg;
766 
767     return *pDocCfg;
768 }
769 
770 #ifndef LRU_MAX
771 #define LRU_MAX 10
772 #endif
773 
774 void ScModule::InsertEntryToLRUList(sal_uInt16 nFIndex)
775 {
776     if(nFIndex != 0)
777     {
778         const ScAppOptions& rAppOpt = GetAppOptions();
779         sal_uInt16 nLRUFuncCount = Min( rAppOpt.GetLRUFuncListCount(), (sal_uInt16)LRU_MAX );
780         sal_uInt16* pLRUListIds = rAppOpt.GetLRUFuncList();
781 
782         sal_uInt16  aIdxList[LRU_MAX];
783         sal_uInt16  n = 0;
784         sal_Bool    bFound = sal_False;
785 
786         while ((n < LRU_MAX) && n<nLRUFuncCount)                        // alte Liste abklappern
787         {
788             if (!bFound && (pLRUListIds[n]== nFIndex))
789                 bFound = sal_True;                                          // erster! Treffer
790             else if (bFound)
791                 aIdxList[n  ] = pLRUListIds[n];                         // hinter Treffer kopieren
792             else if ((n+1) < LRU_MAX)
793                 aIdxList[n+1] = pLRUListIds[n];                         // vor Treffer verschieben
794             n++;
795         }
796         if (!bFound && (n < LRU_MAX))                                   // Eintrag nicht gefunden?
797             n++;                                                        //  einen mehr
798         aIdxList[0] = nFIndex;                                          // Current on Top
799 
800         ScAppOptions aNewOpts(rAppOpt);                                 // an App melden
801         aNewOpts.SetLRUFuncList(aIdxList, n);
802         SetAppOptions(aNewOpts);
803 
804         RecentFunctionsChanged();
805     }
806 }
807 
808 void ScModule::RecentFunctionsChanged()
809 {
810     //  update function list window
811     sal_uInt16 nFuncListID = ScFunctionChildWindow::GetChildWindowId();
812 
813     //! notify all views
814     SfxViewFrame* pViewFrm = SfxViewFrame::Current();
815     if ( pViewFrm && pViewFrm->HasChildWindow(nFuncListID) )
816     {
817         ScFunctionChildWindow* pWnd =(ScFunctionChildWindow*)pViewFrm->GetChildWindow( nFuncListID );
818 
819         ScFunctionDockWin* pFuncList=(ScFunctionDockWin*)pWnd->GetWindow();
820 
821         pFuncList->InitLRUList();
822     }
823 }
824 
825 void ScModule::SetAppOptions( const ScAppOptions& rOpt )
826 {
827     if ( !pAppCfg )
828         pAppCfg = new ScAppCfg;
829 
830     pAppCfg->SetOptions( rOpt );
831 }
832 
833 void global_InitAppOptions()
834 {
835     SC_MOD()->GetAppOptions();
836 }
837 
838 const ScAppOptions& ScModule::GetAppOptions()
839 {
840     if ( !pAppCfg )
841         pAppCfg = new ScAppCfg;
842 
843     return *pAppCfg;
844 }
845 
846 void ScModule::SetInputOptions( const ScInputOptions& rOpt )
847 {
848     if ( !pInputCfg )
849         pInputCfg = new ScInputCfg;
850 
851     pInputCfg->SetOptions( rOpt );
852 }
853 
854 const ScInputOptions& ScModule::GetInputOptions()
855 {
856     if ( !pInputCfg )
857         pInputCfg = new ScInputCfg;
858 
859     return *pInputCfg;
860 }
861 
862 void ScModule::SetPrintOptions( const ScPrintOptions& rOpt )
863 {
864     if ( !pPrintCfg )
865         pPrintCfg = new ScPrintCfg;
866 
867     pPrintCfg->SetOptions( rOpt );
868 }
869 
870 const ScPrintOptions& ScModule::GetPrintOptions()
871 {
872     if ( !pPrintCfg )
873         pPrintCfg = new ScPrintCfg;
874 
875     return *pPrintCfg;
876 }
877 
878 ScNavipiCfg& ScModule::GetNavipiCfg()
879 {
880     if ( !pNavipiCfg )
881         pNavipiCfg = new ScNavipiCfg;
882 
883     return *pNavipiCfg;
884 }
885 
886 ScAddInCfg& ScModule::GetAddInCfg()
887 {
888     if ( !pAddInCfg )
889         pAddInCfg = new ScAddInCfg;
890 
891     return *pAddInCfg;
892 }
893 
894 svtools::ColorConfig& ScModule::GetColorConfig()
895 {
896     if ( !pColorConfig )
897     {
898         pColorConfig = new svtools::ColorConfig;
899         pColorConfig->AddListener(this);
900     }
901 
902     return *pColorConfig;
903 }
904 
905 SvtAccessibilityOptions& ScModule::GetAccessOptions()
906 {
907     if ( !pAccessOptions )
908     {
909         pAccessOptions = new SvtAccessibilityOptions;
910         pAccessOptions->AddListener(this);
911     }
912 
913     return *pAccessOptions;
914 }
915 
916 SvtCTLOptions& ScModule::GetCTLOptions()
917 {
918     if ( !pCTLOptions )
919     {
920         pCTLOptions = new SvtCTLOptions;
921         pCTLOptions->AddListener(this);
922     }
923 
924     return *pCTLOptions;
925 }
926 
927 SvtUserOptions&  ScModule::GetUserOptions()
928 {
929     if( !pUserOptions )
930     {
931         pUserOptions = new SvtUserOptions;
932     }
933     return *pUserOptions;
934 }
935 
936 sal_uInt16 ScModule::GetOptDigitLanguage()
937 {
938     SvtCTLOptions::TextNumerals eNumerals = GetCTLOptions().GetCTLTextNumerals();
939     return ( eNumerals == SvtCTLOptions::NUMERALS_ARABIC ) ? LANGUAGE_ENGLISH_US :
940            ( eNumerals == SvtCTLOptions::NUMERALS_HINDI)   ? LANGUAGE_ARABIC_SAUDI_ARABIA :
941                                                              LANGUAGE_SYSTEM;
942 }
943 
944 //------------------------------------------------------------------
945 //
946 //                          Optionen
947 //
948 //------------------------------------------------------------------
949 
950 //
951 //      ModifyOptions - Items aus Calc-Options-Dialog
952 //                      und SID_AUTOSPELL_CHECK
953 //
954 
955 #define IS_AVAILABLE(w,item) (SFX_ITEM_SET==rOptSet.GetItemState((w),sal_True,&item))
956 
957 void ScModule::ModifyOptions( const SfxItemSet& rOptSet )
958 {
959     sal_uInt16 nOldSpellLang, nOldCjkLang, nOldCtlLang;
960     sal_Bool bOldAutoSpell;
961     GetSpellSettings( nOldSpellLang, nOldCjkLang, nOldCtlLang, bOldAutoSpell );
962 
963     if (!pAppCfg)
964         GetAppOptions();
965     DBG_ASSERT( pAppCfg, "AppOptions not initialised :-(" );
966 
967     if (!pInputCfg)
968         GetInputOptions();
969     DBG_ASSERT( pInputCfg, "InputOptions not initialised :-(" );
970 
971     //--------------------------------------------------------------
972 
973     SfxViewFrame* pViewFrm = SfxViewFrame::Current();
974     SfxBindings* pBindings = pViewFrm ? &pViewFrm->GetBindings() : NULL;
975 
976     ScTabViewShell*         pViewSh = PTR_CAST(ScTabViewShell, SfxViewShell::Current());
977     ScDocShell*             pDocSh  = PTR_CAST(ScDocShell, SfxObjectShell::Current());
978     ScDocument*             pDoc    = pDocSh ? pDocSh->GetDocument() : NULL;
979     const SfxPoolItem*      pItem   = NULL;
980     sal_Bool                    bRepaint            = sal_False;
981     sal_Bool                    bUpdateMarks        = sal_False;
982     sal_Bool                    bUpdateRefDev       = sal_False;
983     sal_Bool                    bCalcAll            = sal_False;
984     sal_Bool                    bSaveSpellCheck     = sal_False;
985     sal_Bool                    bSaveAppOptions     = sal_False;
986     sal_Bool                    bSaveInputOptions   = sal_False;
987 
988     //--------------------------------------------------------------------------
989 
990     //  SFX_APP()->SetOptions( rOptSet );
991 
992     //  Linguistik nicht mehr
993 
994     if ( IS_AVAILABLE(SID_ATTR_METRIC,pItem) )
995     {
996         PutItem( *pItem );
997         pAppCfg->SetAppMetric( (FieldUnit)((const SfxUInt16Item*)pItem)->GetValue() );
998         bSaveAppOptions = sal_True;
999     }
1000 
1001     if ( IS_AVAILABLE(SCITEM_USERLIST,pItem) )
1002     {
1003         ScGlobal::SetUserList( ((const ScUserListItem*)pItem)->GetUserList() );
1004         bSaveAppOptions = sal_True;
1005     }
1006 
1007     if ( IS_AVAILABLE(SID_SC_OPT_SYNCZOOM,pItem) )
1008     {
1009         pAppCfg->SetSynchronizeZoom( static_cast<const SfxBoolItem*>(pItem)->GetValue() );
1010         bSaveAppOptions = sal_True;
1011     }
1012 
1013     //============================================
1014     // ViewOptions
1015     //============================================
1016 
1017     if ( IS_AVAILABLE(SID_SCVIEWOPTIONS,pItem) )
1018     {
1019         const ScViewOptions& rNewOpt = ((const ScTpViewItem*)pItem)->GetViewOptions();
1020 
1021         if ( pViewSh )
1022         {
1023             ScViewData*             pViewData = pViewSh->GetViewData();
1024             const ScViewOptions&    rOldOpt   = pViewData->GetOptions();
1025 
1026             sal_Bool bAnchorList = ( rOldOpt.GetOption( VOPT_ANCHOR ) !=
1027                                  rNewOpt.GetOption( VOPT_ANCHOR ) );
1028 
1029             if ( rOldOpt != rNewOpt )
1030             {
1031                 pViewData->SetOptions( rNewOpt );   // veraendert rOldOpt
1032                 pViewData->GetDocument()->SetViewOptions( rNewOpt );
1033                 pDocSh->SetDocumentModified();
1034                 bRepaint = sal_True;
1035             }
1036             if ( bAnchorList )
1037                 pViewSh->UpdateAnchorHandles();
1038         }
1039         SetViewOptions( rNewOpt );
1040         if (pBindings)
1041             pBindings->Invalidate(SID_HELPLINES_MOVE);
1042     }
1043 
1044     //============================================
1045     // GridOptions, Auswertung nach ViewOptions,
1046     // da GridOptions Member der ViewOptions ist!
1047     //============================================
1048 
1049     if ( IS_AVAILABLE(SID_ATTR_GRID_OPTIONS,pItem) )
1050     {
1051         ScGridOptions aNewGridOpt( (const SvxOptionsGrid&)((const SvxGridItem&)*pItem) );
1052 
1053         if ( pViewSh )
1054         {
1055             ScViewData*          pViewData = pViewSh->GetViewData();
1056             ScViewOptions        aNewViewOpt( pViewData->GetOptions() );
1057             const ScGridOptions& rOldGridOpt = aNewViewOpt.GetGridOptions();
1058 
1059             if ( rOldGridOpt != aNewGridOpt )
1060             {
1061                 aNewViewOpt.SetGridOptions( aNewGridOpt );
1062                 pViewData->SetOptions( aNewViewOpt );
1063                 pViewData->GetDocument()->SetViewOptions( aNewViewOpt );
1064                 pDocSh->SetDocumentModified();
1065                 bRepaint = sal_True;
1066             }
1067         }
1068         ScViewOptions aNewViewOpt ( GetViewOptions() );
1069         aNewViewOpt.SetGridOptions( aNewGridOpt );
1070         SetViewOptions( aNewViewOpt );
1071         if (pBindings)
1072         {
1073             pBindings->Invalidate(SID_GRID_VISIBLE);
1074             pBindings->Invalidate(SID_GRID_USE);
1075         }
1076     }
1077 
1078 
1079     //============================================
1080     // DocOptions
1081     //============================================
1082 
1083     if ( IS_AVAILABLE(SID_SCDOCOPTIONS,pItem) )
1084     {
1085         const ScDocOptions& rNewOpt = ((const ScTpCalcItem*)pItem)->GetDocOptions();
1086 
1087         if ( pDoc )
1088         {
1089             const ScDocOptions& rOldOpt = pDoc->GetDocOptions();
1090 
1091             bRepaint = ( bRepaint || ( rOldOpt != rNewOpt )   );
1092             bCalcAll =   bRepaint &&
1093                          (  rOldOpt.IsIter()       != rNewOpt.IsIter()
1094                          || rOldOpt.GetIterCount() != rNewOpt.GetIterCount()
1095                          || rOldOpt.GetIterEps()   != rNewOpt.GetIterEps()
1096                          || rOldOpt.IsIgnoreCase() != rNewOpt.IsIgnoreCase()
1097                          || rOldOpt.IsCalcAsShown() != rNewOpt.IsCalcAsShown()
1098                          || (rNewOpt.IsCalcAsShown() &&
1099                             rOldOpt.GetStdPrecision() != rNewOpt.GetStdPrecision())
1100                          || rOldOpt.IsMatchWholeCell() != rNewOpt.IsMatchWholeCell()
1101                          || rOldOpt.GetYear2000()   != rNewOpt.GetYear2000()
1102                          || rOldOpt.IsFormulaRegexEnabled() != rNewOpt.IsFormulaRegexEnabled()
1103                          );
1104             pDoc->SetDocOptions( rNewOpt );
1105             pDocSh->SetDocumentModified();
1106         }
1107         SetDocOptions( rNewOpt );
1108     }
1109 
1110     // nach den eigentlichen DocOptions auch noch die TabDistance setzen
1111     if ( IS_AVAILABLE(SID_ATTR_DEFTABSTOP,pItem) )
1112     {
1113         sal_uInt16 nTabDist = ((SfxUInt16Item*)pItem)->GetValue();
1114         ScDocOptions aOpt(GetDocOptions());
1115         aOpt.SetTabDistance(nTabDist);
1116         SetDocOptions( aOpt );
1117 
1118         if ( pDoc )
1119         {
1120             ScDocOptions aDocOpt(pDoc->GetDocOptions());
1121             aDocOpt.SetTabDistance(nTabDist);
1122             pDoc->SetDocOptions( aDocOpt );
1123             pDocSh->SetDocumentModified();
1124             if(pDoc->GetDrawLayer())
1125                 pDoc->GetDrawLayer()->SetDefaultTabulator(nTabDist);
1126         }
1127     }
1128 
1129     //  AutoSpell nach den Doc-Options (weil Member)
1130 
1131     if ( IS_AVAILABLE(SID_AUTOSPELL_CHECK,pItem) )              // an Doc-Options
1132     {
1133         sal_Bool bDoAutoSpell = ((const SfxBoolItem*)pItem)->GetValue();
1134 
1135         if (pDoc)
1136         {
1137             ScDocOptions aNewOpt = pDoc->GetDocOptions();
1138             if ( aNewOpt.IsAutoSpell() != bDoAutoSpell )
1139             {
1140                 aNewOpt.SetAutoSpell( bDoAutoSpell );
1141                 pDoc->SetDocOptions( aNewOpt );
1142 
1143                 if (bDoAutoSpell)
1144                     pDoc->SetOnlineSpellPos( ScAddress(0,0,0) );    // vorne anfangen
1145                 else
1146                 {
1147                     WaitObject aWait( pDocSh->GetActiveDialogParent() );
1148                     pDoc->RemoveAutoSpellObj();     //  Edit-Text-Objekte wieder zurueckwandeln
1149                 }
1150 
1151                 //#92038#; don't set document modified, because this flag is no longer saved
1152 //              pDocSh->SetDocumentModified();
1153 
1154                 bRepaint = sal_True;            //  weil HideAutoSpell evtl. ungueltig
1155                                             //! alle Views painten ???
1156             }
1157         }
1158 
1159         if ( bOldAutoSpell != bDoAutoSpell )
1160         {
1161             SetAutoSpellProperty( bDoAutoSpell );
1162             bSaveSpellCheck = sal_True;
1163         }
1164         if ( pDocSh )
1165             pDocSh->PostPaintGridAll();                     // wegen Markierungen
1166         ScInputHandler* pInputHandler = GetInputHdl();
1167         if ( pInputHandler )
1168             pInputHandler->UpdateSpellSettings();           // EditEngine-Flags
1169         if ( pViewSh )
1170             pViewSh->UpdateDrawTextOutliner();              // EditEngine-Flags
1171 
1172         if (pBindings)
1173             pBindings->Invalidate( SID_AUTOSPELL_CHECK );
1174     }
1175 
1176     //============================================
1177     // InputOptions
1178     //============================================
1179 
1180     if ( IS_AVAILABLE(SID_SC_INPUT_SELECTIONPOS,pItem) )
1181     {
1182         pInputCfg->SetMoveDir( ((const SfxUInt16Item*)pItem)->GetValue() );
1183         bSaveInputOptions = sal_True;
1184     }
1185     if ( IS_AVAILABLE(SID_SC_INPUT_SELECTION,pItem) )
1186     {
1187         pInputCfg->SetMoveSelection( ((const SfxBoolItem*)pItem)->GetValue() );
1188         bSaveInputOptions = sal_True;
1189     }
1190     if ( IS_AVAILABLE(SID_SC_INPUT_EDITMODE,pItem) )
1191     {
1192         pInputCfg->SetEnterEdit( ((const SfxBoolItem*)pItem)->GetValue() );
1193         bSaveInputOptions = sal_True;
1194     }
1195     if ( IS_AVAILABLE(SID_SC_INPUT_FMT_EXPAND,pItem) )
1196     {
1197         pInputCfg->SetExtendFormat( ((const SfxBoolItem*)pItem)->GetValue() );
1198         bSaveInputOptions = sal_True;
1199     }
1200     if ( IS_AVAILABLE(SID_SC_INPUT_RANGEFINDER,pItem) )
1201     {
1202         pInputCfg->SetRangeFinder( ((const SfxBoolItem*)pItem)->GetValue() );
1203         bSaveInputOptions = sal_True;
1204     }
1205     if ( IS_AVAILABLE(SID_SC_INPUT_REF_EXPAND,pItem) )
1206     {
1207         pInputCfg->SetExpandRefs( ((const SfxBoolItem*)pItem)->GetValue() );
1208         bSaveInputOptions = sal_True;
1209     }
1210     if ( IS_AVAILABLE(SID_SC_INPUT_MARK_HEADER,pItem) )
1211     {
1212         pInputCfg->SetMarkHeader( ((const SfxBoolItem*)pItem)->GetValue() );
1213         bSaveInputOptions = sal_True;
1214         bUpdateMarks = sal_True;
1215     }
1216     if ( IS_AVAILABLE(SID_SC_INPUT_TEXTWYSIWYG,pItem) )
1217     {
1218         sal_Bool bNew = ((const SfxBoolItem*)pItem)->GetValue();
1219         if ( bNew != pInputCfg->GetTextWysiwyg() )
1220         {
1221             pInputCfg->SetTextWysiwyg( bNew );
1222             bSaveInputOptions = sal_True;
1223             bUpdateRefDev = sal_True;
1224         }
1225     }
1226     if( IS_AVAILABLE( SID_SC_INPUT_REPLCELLSWARN, pItem ) )
1227     {
1228         pInputCfg->SetReplaceCellsWarn( ((const SfxBoolItem*)pItem)->GetValue() );
1229         bSaveInputOptions = sal_True;
1230     }
1231 
1232     //============================================
1233     // PrintOptions
1234     //============================================
1235 
1236     if ( IS_AVAILABLE(SID_SCPRINTOPTIONS,pItem) )
1237     {
1238         const ScPrintOptions& rNewOpt = ((const ScTpPrintItem*)pItem)->GetPrintOptions();
1239         SetPrintOptions( rNewOpt );
1240 
1241         //  broadcast causes all previews to recalc page numbers
1242         SFX_APP()->Broadcast( SfxSimpleHint( SID_SCPRINTOPTIONS ) );
1243     }
1244 
1245     //----------------------------------------------------------
1246 
1247 //  if ( bSaveSpellCheck )
1248 //  {
1249         //  currently LinguProperties are saved only at program exit.
1250         //  if a save method becomes available, it should be called here.
1251 //  }
1252 
1253     if ( bSaveAppOptions )
1254         pAppCfg->OptionsChanged();
1255 
1256     if ( bSaveInputOptions )
1257         pInputCfg->OptionsChanged();
1258 
1259     // Neuberechnung anstossen?
1260 
1261     if ( pDoc && bCalcAll )
1262     {
1263         WaitObject aWait( pDocSh->GetActiveDialogParent() );
1264         pDoc->CalcAll();
1265         if ( pViewSh )
1266             pViewSh->UpdateCharts( sal_True );
1267         else
1268             ScDBFunc::DoUpdateCharts( ScAddress(), pDoc, sal_True );
1269         if (pBindings)
1270             pBindings->Invalidate( SID_ATTR_SIZE ); //SvxPosSize-StatusControl-Update
1271     }
1272 
1273     if ( pViewSh && bUpdateMarks )
1274         pViewSh->UpdateAutoFillMark();
1275 
1276     // View neuzeichnen?
1277 
1278     if ( pViewSh && bRepaint )
1279     {
1280         pViewSh->UpdateFixPos();
1281         pViewSh->PaintGrid();
1282         pViewSh->PaintTop();
1283         pViewSh->PaintLeft();
1284         pViewSh->PaintExtras();
1285         pViewSh->InvalidateBorder();
1286         if (pBindings)
1287         {
1288             pBindings->Invalidate( FID_TOGGLEHEADERS ); // -> Checks im Menue
1289             pBindings->Invalidate( FID_TOGGLESYNTAX );
1290         }
1291     }
1292 
1293     // update ref device (for all documents)
1294 
1295     if ( bUpdateRefDev )
1296     {
1297         //  for all documents: recalc output factor, update row heights
1298         SfxObjectShell* pObjSh = SfxObjectShell::GetFirst();
1299         while ( pObjSh )
1300         {
1301             if ( pObjSh->Type() == TYPE(ScDocShell) )
1302             {
1303                 ScDocShell* pOneDocSh = ((ScDocShell*)pObjSh);
1304                 pOneDocSh->CalcOutputFactor();
1305                 SCTAB nTabCount = pOneDocSh->GetDocument()->GetTableCount();
1306                 for (SCTAB nTab=0; nTab<nTabCount; nTab++)
1307                     pOneDocSh->AdjustRowHeight( 0, MAXROW, nTab );
1308             }
1309             pObjSh = SfxObjectShell::GetNext( *pObjSh );
1310         }
1311 
1312         //  for all (tab-) views:
1313         TypeId aScType = TYPE(ScTabViewShell);
1314         SfxViewShell* pSh = SfxViewShell::GetFirst( &aScType );
1315         while ( pSh )
1316         {
1317             ScTabViewShell* pOneViewSh = (ScTabViewShell*)pSh;
1318 
1319             //  set ref-device for EditEngine
1320             ScInputHandler* pHdl = GetInputHdl(pOneViewSh);
1321             if (pHdl)
1322                 pHdl->UpdateRefDevice();
1323 
1324             //  update view scale
1325             ScViewData* pViewData = pOneViewSh->GetViewData();
1326             pOneViewSh->SetZoom( pViewData->GetZoomX(), pViewData->GetZoomY(), sal_False );
1327 
1328             //  repaint
1329             pOneViewSh->PaintGrid();
1330             pOneViewSh->PaintTop();
1331             pOneViewSh->PaintLeft();
1332 
1333             pSh = SfxViewShell::GetNext( *pSh, &aScType );
1334         }
1335     }
1336 }
1337 
1338 #undef IS_AVAILABLE
1339 
1340 //------------------------------------------------------------------
1341 //
1342 //                      Input-Handler
1343 //
1344 //------------------------------------------------------------------
1345 
1346 ScInputHandler* ScModule::GetInputHdl( ScTabViewShell* pViewSh, sal_Bool bUseRef )
1347 {
1348     if ( pRefInputHandler && bUseRef )
1349         return pRefInputHandler;
1350 
1351     ScInputHandler* pHdl = NULL;
1352     if ( !pViewSh )
1353     {
1354         // in case a UIActive embedded object has no ViewShell ( UNO component )
1355         // the own calc view shell will be set as current, but no handling should happen
1356 
1357         ScTabViewShell* pCurViewSh = PTR_CAST( ScTabViewShell, SfxViewShell::Current() );
1358         if ( pCurViewSh && !pCurViewSh->GetUIActiveClient() )
1359             pViewSh = pCurViewSh;
1360     }
1361 
1362     if ( pViewSh )
1363         pHdl = pViewSh->GetInputHandler();      // Viewshell hat jetzt immer einen
1364 
1365     //  #57989# wenn keine ViewShell uebergeben oder aktiv, kann NULL herauskommen
1366     DBG_ASSERT( pHdl || !pViewSh, "GetInputHdl: kein InputHandler gefunden" );
1367     return pHdl;
1368 }
1369 
1370 void ScModule::ViewShellChanged()
1371 {
1372     ScInputHandler* pHdl   = GetInputHdl();
1373     ScTabViewShell* pShell = ScTabViewShell::GetActiveViewShell();
1374     if ( pShell && pHdl )
1375         pShell->UpdateInputHandler();
1376 }
1377 
1378 void ScModule::SetInputMode( ScInputMode eMode )
1379 {
1380     ScInputHandler* pHdl = GetInputHdl();
1381     if (pHdl)
1382         pHdl->SetMode( eMode );
1383 }
1384 
1385 sal_Bool ScModule::IsEditMode()
1386 {
1387     ScInputHandler* pHdl = GetInputHdl();
1388     return pHdl && pHdl->IsEditMode();
1389 }
1390 
1391 sal_Bool ScModule::IsInputMode()
1392 {
1393     ScInputHandler* pHdl = GetInputHdl();
1394     return pHdl && pHdl->IsInputMode();
1395 }
1396 
1397 sal_Bool ScModule::InputKeyEvent( const KeyEvent& rKEvt, sal_Bool bStartEdit )
1398 {
1399     ScInputHandler* pHdl = GetInputHdl();
1400     return ( pHdl ? pHdl->KeyInput( rKEvt, bStartEdit ) : sal_False );
1401 }
1402 
1403 void ScModule::InputEnterHandler( sal_uInt8 nBlockMode )
1404 {
1405     if ( !SFX_APP()->IsDowning() )                                  // nicht beim Programmende
1406     {
1407         ScInputHandler* pHdl = GetInputHdl();
1408         if (pHdl)
1409             pHdl->EnterHandler( nBlockMode );
1410     }
1411 }
1412 
1413 void ScModule::InputCancelHandler()
1414 {
1415     ScInputHandler* pHdl = GetInputHdl();
1416     if (pHdl)
1417         pHdl->CancelHandler();
1418 }
1419 
1420 void ScModule::InputSelection( EditView* pView )
1421 {
1422     ScInputHandler* pHdl = GetInputHdl();
1423     if (pHdl)
1424         pHdl->InputSelection( pView );
1425 }
1426 
1427 void ScModule::InputChanged( EditView* pView )
1428 {
1429     ScInputHandler* pHdl = GetInputHdl();
1430     if (pHdl)
1431         pHdl->InputChanged( pView );
1432 }
1433 
1434 void ScModule::ViewShellGone( ScTabViewShell* pViewSh )
1435 {
1436     ScInputHandler* pHdl = GetInputHdl();
1437     if (pHdl)
1438         pHdl->ViewShellGone( pViewSh );
1439 }
1440 
1441 void ScModule::SetRefInputHdl( ScInputHandler* pNew )
1442 {
1443     pRefInputHandler = pNew;
1444 }
1445 
1446 ScInputHandler* ScModule::GetRefInputHdl()
1447 {
1448     return pRefInputHandler;
1449 }
1450 
1451 //------------------------------------------------------------------------
1452 //  Olk's Krempel:
1453 
1454 void ScModule::InputGetSelection( xub_StrLen& rStart, xub_StrLen& rEnd )
1455 {
1456     ScInputHandler* pHdl = GetInputHdl();
1457     if (pHdl)
1458         pHdl->InputGetSelection( rStart, rEnd );
1459 }
1460 
1461 void ScModule::InputSetSelection( xub_StrLen nStart, xub_StrLen nEnd )
1462 {
1463     ScInputHandler* pHdl = GetInputHdl();
1464     if (pHdl)
1465         pHdl->InputSetSelection( nStart, nEnd );
1466 }
1467 
1468 void ScModule::InputReplaceSelection( const String& rStr )
1469 {
1470     ScInputHandler* pHdl = GetInputHdl();
1471     if (pHdl)
1472         pHdl->InputReplaceSelection( rStr );
1473 }
1474 
1475 String ScModule::InputGetFormulaStr()
1476 {
1477     ScInputHandler* pHdl = GetInputHdl();
1478     String aStr;
1479     if ( pHdl )
1480         aStr = pHdl->InputGetFormulaStr();
1481     return aStr;
1482 }
1483 
1484 void ScModule::ActivateInputWindow( const String* pStrFormula, sal_Bool bMatrix )
1485 {
1486     ScInputHandler* pHdl = GetInputHdl();
1487     if ( pHdl )
1488     {
1489         ScInputWindow* pWin = pHdl->GetInputWindow();
1490         if ( pStrFormula )
1491         {
1492             // Formel uebernehmen
1493             if ( pWin )
1494             {
1495                 pWin->SetFuncString( *pStrFormula, sal_False );
1496                 // SetSumAssignMode wegen sal_False nicht noetig
1497             }
1498             sal_uInt8 nMode = bMatrix ? SC_ENTER_MATRIX : SC_ENTER_NORMAL;
1499             pHdl->EnterHandler( nMode );
1500 
1501             //  ohne Invalidate bleibt die Selektion stehen, wenn die Formel unveraendert ist
1502             if (pWin)
1503                 pWin->TextInvalidate();
1504         }
1505         else
1506         {
1507             // Abbrechen
1508             if ( pWin )
1509             {
1510                 pWin->SetFuncString( EMPTY_STRING, sal_False );
1511                 // SetSumAssignMode wegen sal_False nicht noetig
1512             }
1513             pHdl->CancelHandler();
1514         }
1515     }
1516 }
1517 
1518 //------------------------------------------------------------------
1519 //
1520 //                  Referenz - Dialoge
1521 //
1522 //------------------------------------------------------------------
1523 
1524 void ScModule::SetRefDialog( sal_uInt16 nId, sal_Bool bVis, SfxViewFrame* pViewFrm )
1525 {
1526     //! move reference dialog handling to view
1527     //! (only keep function autopilot here for references to other documents)
1528 
1529     if(nCurRefDlgId==0 || (nId==nCurRefDlgId && !bVis))
1530     {
1531         if ( !pViewFrm )
1532             pViewFrm = SfxViewFrame::Current();
1533 
1534         // #79379# bindings update causes problems with update of stylist if
1535         // current style family has changed
1536         //if ( pViewFrm )
1537         //  pViewFrm->GetBindings().Update();       // to avoid trouble in LockDispatcher
1538 
1539         nCurRefDlgId = bVis ? nId : 0 ;             // before SetChildWindow
1540 
1541         if ( pViewFrm )
1542         {
1543             //  store the dialog id also in the view shell
1544             SfxViewShell* pViewSh = pViewFrm->GetViewShell();
1545             if ( pViewSh && pViewSh->ISA( ScTabViewShell ) )
1546                 ((ScTabViewShell*)pViewSh)->SetCurRefDlgId( nCurRefDlgId );
1547             else
1548             {
1549                 // no ScTabViewShell - possible for example from a Basic macro
1550                 bVis = sal_False;
1551                 nCurRefDlgId = 0;   // don't set nCurRefDlgId if no dialog is created
1552             }
1553 
1554             pViewFrm->SetChildWindow( nId, bVis );
1555         }
1556 
1557         SfxApplication* pSfxApp = SFX_APP();
1558         pSfxApp->Broadcast( SfxSimpleHint( FID_REFMODECHANGED ) );
1559     }
1560 }
1561 
1562 SfxChildWindow* lcl_GetChildWinFromAnyView( sal_uInt16 nId )
1563 {
1564     //  first try the current view
1565 
1566     SfxViewFrame* pViewFrm = SfxViewFrame::Current();
1567     // #i46999# current view frame can be null (for example, when closing help)
1568     SfxChildWindow* pChildWnd = pViewFrm ? pViewFrm->GetChildWindow( nId ) : NULL;
1569     if ( pChildWnd )
1570         return pChildWnd;           // found in the current view
1571 
1572     //  if not found there, get the child window from any open view
1573     //  it can be open only in one view because nCurRefDlgId is global
1574 
1575     pViewFrm = SfxViewFrame::GetFirst();
1576     while ( pViewFrm )
1577     {
1578         pChildWnd = pViewFrm->GetChildWindow( nId );
1579         if ( pChildWnd )
1580             return pChildWnd;       // found in any view
1581 
1582         pViewFrm = SfxViewFrame::GetNext( *pViewFrm );
1583     }
1584 
1585     return NULL;                    // none found
1586 }
1587 
1588 sal_Bool ScModule::IsModalMode(SfxObjectShell* pDocSh)
1589 {
1590     //! move reference dialog handling to view
1591     //! (only keep function autopilot here for references to other documents)
1592 
1593     sal_Bool bIsModal = sal_False;
1594 
1595     if ( nCurRefDlgId )
1596     {
1597         SfxChildWindow* pChildWnd = lcl_GetChildWinFromAnyView( nCurRefDlgId );
1598         if ( pChildWnd )
1599         {
1600             IAnyRefDialog* pRefDlg = dynamic_cast<IAnyRefDialog*>(pChildWnd->GetWindow());
1601             bIsModal = pChildWnd->IsVisible() &&
1602                 !( pRefDlg->IsRefInputMode() && pRefDlg->IsDocAllowed(pDocSh) );
1603         }
1604         else
1605         {
1606             // in 592 and above, the dialog isn't visible in other views
1607             //  if the dialog is open but can't be accessed, disable input
1608 
1609             bIsModal = sal_True;
1610         }
1611 
1612         //  pChildWnd kann 0 sein, wenn der Dialog nach dem Umschalten
1613         //  von einer anderen Shell noch nicht erzeugt wurde (z.B. in GetFocus)
1614     }
1615     else if (pDocSh)
1616     {
1617         ScInputHandler* pHdl = GetInputHdl();
1618         if ( pHdl )
1619             bIsModal = pHdl->IsModalMode(pDocSh);
1620     }
1621 
1622     return bIsModal;
1623 }
1624 
1625 sal_Bool ScModule::IsTableLocked()
1626 {
1627     //! move reference dialog handling to view
1628     //! (only keep function autopilot here for references to other documents)
1629 
1630     sal_Bool bLocked = sal_False;
1631 
1632     //  bisher nur bei ScAnyRefDlg
1633 
1634     if ( nCurRefDlgId )
1635     {
1636         SfxChildWindow* pChildWnd = lcl_GetChildWinFromAnyView( nCurRefDlgId );
1637         if ( pChildWnd )
1638             bLocked = dynamic_cast<IAnyRefDialog*>(pChildWnd->GetWindow())->IsTableLocked();
1639         else
1640             bLocked = sal_True;     // for other views, see IsModalMode
1641     }
1642 
1643     return bLocked;
1644 }
1645 
1646 sal_Bool ScModule::IsRefDialogOpen()
1647 {
1648     //! move reference dialog handling to view
1649     //! (only keep function autopilot here for references to other documents)
1650 
1651     sal_Bool bIsOpen = sal_False;
1652 
1653     if ( nCurRefDlgId )
1654     {
1655         SfxChildWindow* pChildWnd = lcl_GetChildWinFromAnyView( nCurRefDlgId );
1656         if ( pChildWnd )
1657             bIsOpen = pChildWnd->IsVisible();
1658         else
1659             bIsOpen = sal_True;     // for other views, see IsModalMode
1660     }
1661 
1662     return bIsOpen;
1663 }
1664 
1665 sal_Bool ScModule::IsFormulaMode()
1666 {
1667     //! move reference dialog handling to view
1668     //! (only keep function autopilot here for references to other documents)
1669 
1670     sal_Bool bIsFormula = sal_False;
1671 
1672     if ( nCurRefDlgId )
1673     {
1674         SfxChildWindow* pChildWnd = lcl_GetChildWinFromAnyView( nCurRefDlgId );
1675         if ( pChildWnd )
1676         {
1677             IAnyRefDialog* pRefDlg = dynamic_cast<IAnyRefDialog*>(pChildWnd->GetWindow());
1678             bIsFormula = pChildWnd->IsVisible() && pRefDlg->IsRefInputMode();
1679         }
1680     }
1681     else
1682     {
1683         ScInputHandler* pHdl = GetInputHdl();
1684         if ( pHdl )
1685             bIsFormula = pHdl->IsFormulaMode();
1686     }
1687 
1688     if (bIsInEditCommand)
1689         bIsFormula = sal_True;
1690 
1691     return bIsFormula;
1692 }
1693 
1694 void lcl_MarkedTabs( const ScMarkData& rMark, SCTAB& rStartTab, SCTAB& rEndTab )
1695 {
1696     if (rMark.GetSelectCount() > 1)
1697     {
1698         sal_Bool bFirst = sal_True;
1699         for (SCTAB i=0; i<=MAXTAB; i++)
1700             if (rMark.GetTableSelect(i))
1701             {
1702                 if (bFirst)
1703                     rStartTab = i;
1704                 rEndTab = i;
1705                 bFirst = sal_False;
1706             }
1707     }
1708 }
1709 
1710 void ScModule::SetReference( const ScRange& rRef, ScDocument* pDoc,
1711                                     const ScMarkData* pMarkData )
1712 {
1713     //! move reference dialog handling to view
1714     //! (only keep function autopilot here for references to other documents)
1715 
1716     //  in Ref-Dialogen wird hiermit auch das Zoom-In ausgeloest,
1717     //  wenn Start und Ende der Ref unterschiedlich sind
1718 
1719     ScRange aNew = rRef;
1720     aNew.Justify();                 // immer "richtig herum"
1721 
1722     if( nCurRefDlgId )
1723     {
1724         SfxChildWindow* pChildWnd = lcl_GetChildWinFromAnyView( nCurRefDlgId );
1725         DBG_ASSERT( pChildWnd, "NoChildWin" );
1726         if ( pChildWnd )
1727         {
1728             if ( nCurRefDlgId == SID_OPENDLG_CONSOLIDATE && pMarkData )
1729             {
1730                 SCTAB nStartTab = aNew.aStart.Tab();
1731                 SCTAB nEndTab   = aNew.aEnd.Tab();
1732                 lcl_MarkedTabs( *pMarkData, nStartTab, nEndTab );
1733                 aNew.aStart.SetTab(nStartTab);
1734                 aNew.aEnd.SetTab(nEndTab);
1735             }
1736 
1737             IAnyRefDialog* pRefDlg = dynamic_cast<IAnyRefDialog*>(pChildWnd->GetWindow());
1738 
1739             //  hide the (color) selection now instead of later from LoseFocus,
1740             //  don't abort the ref input that causes this call (bDoneRefMode = sal_False)
1741             pRefDlg->HideReference( sal_False );
1742             pRefDlg->SetReference( aNew, pDoc );
1743         }
1744     }
1745     else
1746     {
1747         ScInputHandler* pHdl = GetInputHdl();
1748         if (pHdl)
1749             pHdl->SetReference( aNew, pDoc );
1750         else
1751         {
1752             DBG_ERROR("SetReference ohne Empfaenger");
1753         }
1754     }
1755 }
1756 
1757 void ScModule::AddRefEntry()                        // "Mehrfachselektion"
1758 {
1759     //! move reference dialog handling to view
1760     //! (only keep function autopilot here for references to other documents)
1761 
1762     if ( nCurRefDlgId )
1763     {
1764         SfxChildWindow* pChildWnd = lcl_GetChildWinFromAnyView( nCurRefDlgId );
1765         DBG_ASSERT( pChildWnd, "NoChildWin" );
1766         if ( pChildWnd )
1767         {
1768             IAnyRefDialog* pRefDlg = dynamic_cast<IAnyRefDialog*>(pChildWnd->GetWindow());
1769             pRefDlg->AddRefEntry();
1770         }
1771     }
1772     else
1773     {
1774         ScInputHandler* pHdl = GetInputHdl();
1775         if (pHdl)
1776             pHdl->AddRefEntry();
1777     }
1778 }
1779 
1780 void ScModule::EndReference()
1781 {
1782     //! move reference dialog handling to view
1783     //! (only keep function autopilot here for references to other documents)
1784 
1785     //  in Ref-Dialogen wird hiermit auch das Zoom-In wieder aufgehoben
1786 
1787     //! ShowRefFrame am InputHdl, wenn der Funktions-AP offen ist ???
1788 
1789     if ( nCurRefDlgId )
1790     {
1791         SfxChildWindow* pChildWnd = lcl_GetChildWinFromAnyView( nCurRefDlgId );
1792         DBG_ASSERT( pChildWnd, "NoChildWin" );
1793         if ( pChildWnd )
1794         {
1795             IAnyRefDialog* pRefDlg = dynamic_cast<IAnyRefDialog*>(pChildWnd->GetWindow());
1796             pRefDlg->SetActive();
1797         }
1798     }
1799 }
1800 
1801 //------------------------------------------------------------------
1802 //
1803 //                  Idle / Online-Spelling
1804 //
1805 //------------------------------------------------------------------
1806 
1807 void ScModule::AnythingChanged()
1808 {
1809     sal_uLong nOldTime = aIdleTimer.GetTimeout();
1810     if ( nOldTime != SC_IDLE_MIN )
1811         aIdleTimer.SetTimeout( SC_IDLE_MIN );
1812 
1813     nIdleCount = 0;
1814 }
1815 
1816 void lcl_CheckNeedsRepaint( ScDocShell* pDocShell )
1817 {
1818     SfxViewFrame* pFrame = SfxViewFrame::GetFirst( pDocShell );
1819     while ( pFrame )
1820     {
1821         SfxViewShell* p = pFrame->GetViewShell();
1822         ScTabViewShell* pViewSh = PTR_CAST(ScTabViewShell,p);
1823         if ( pViewSh )
1824             pViewSh->CheckNeedsRepaint();
1825         pFrame = SfxViewFrame::GetNext( *pFrame, pDocShell );
1826     }
1827 }
1828 
1829 IMPL_LINK( ScModule, IdleHandler, Timer*, EMPTYARG )
1830 {
1831     if ( Application::AnyInput( INPUT_MOUSEANDKEYBOARD ) )
1832     {
1833         aIdleTimer.Start();         // Timeout unveraendert
1834         return 0;
1835     }
1836 
1837     sal_Bool bMore = sal_False;
1838     ScDocShell* pDocSh = PTR_CAST( ScDocShell, SfxObjectShell::Current() );
1839     if ( pDocSh )
1840     {
1841         ScDocument* pDoc = pDocSh->GetDocument();
1842 
1843         sal_Bool bLinks = pDoc->IdleCheckLinks();
1844         sal_Bool bWidth = pDoc->IdleCalcTextWidth();
1845         sal_Bool bSpell = pDoc->ContinueOnlineSpelling();
1846         if ( bSpell )
1847             aSpellTimer.Start();                    // da ist noch was
1848 
1849         bMore = bLinks || bWidth || bSpell;         // ueberhaupt noch was?
1850 
1851         //  While calculating a Basic formula, a paint event may have occured,
1852         //  so check the bNeedsRepaint flags for this document's views
1853         if (bWidth)
1854             lcl_CheckNeedsRepaint( pDocSh );
1855     }
1856 
1857     sal_uLong nOldTime = aIdleTimer.GetTimeout();
1858     sal_uLong nNewTime = nOldTime;
1859     if ( bMore )
1860     {
1861         nNewTime = SC_IDLE_MIN;
1862         nIdleCount = 0;
1863     }
1864     else
1865     {
1866         //  SC_IDLE_COUNT mal mit initialem Timeout, dann hochzaehlen
1867 
1868         if ( nIdleCount < SC_IDLE_COUNT )
1869             ++nIdleCount;
1870         else
1871         {
1872             nNewTime += SC_IDLE_STEP;
1873             if ( nNewTime > SC_IDLE_MAX )
1874                 nNewTime = SC_IDLE_MAX;
1875         }
1876     }
1877     if ( nNewTime != nOldTime )
1878         aIdleTimer.SetTimeout( nNewTime );
1879 
1880     aIdleTimer.Start();
1881     return 0;
1882 }
1883 
1884 IMPL_LINK( ScModule, SpellTimerHdl, Timer*, EMPTYARG )
1885 {
1886     if ( Application::AnyInput( INPUT_KEYBOARD ) )
1887     {
1888         aSpellTimer.Start();
1889         return 0;                   // dann spaeter wieder...
1890     }
1891 
1892     ScDocShell* pDocSh = PTR_CAST( ScDocShell, SfxObjectShell::Current() );
1893     if ( pDocSh )
1894     {
1895         ScDocument* pDoc = pDocSh->GetDocument();
1896         if ( pDoc->ContinueOnlineSpelling() )
1897             aSpellTimer.Start();
1898     }
1899     return 0;
1900 }
1901 
1902     //virtuelle Methoden fuer den Optionendialog
1903 SfxItemSet*  ScModule::CreateItemSet( sal_uInt16 nId )
1904 {
1905     SfxItemSet*  pRet = 0;
1906     if(SID_SC_EDITOPTIONS == nId)
1907     {
1908         pRet = new SfxItemSet( GetPool(),
1909                             // TP_CALC:
1910                             SID_SCDOCOPTIONS,       SID_SCDOCOPTIONS,
1911                             // TP_VIEW:
1912                             SID_SCVIEWOPTIONS,      SID_SCVIEWOPTIONS,
1913                             SID_SC_OPT_SYNCZOOM,    SID_SC_OPT_SYNCZOOM,
1914                             // TP_INPUT:
1915                             SID_SC_INPUT_SELECTION,SID_SC_INPUT_MARK_HEADER,
1916                             SID_SC_INPUT_TEXTWYSIWYG,SID_SC_INPUT_TEXTWYSIWYG,
1917                             SID_SC_INPUT_REPLCELLSWARN,SID_SC_INPUT_REPLCELLSWARN,
1918                             // TP_USERLISTS:
1919                             SCITEM_USERLIST,        SCITEM_USERLIST,
1920                             // TP_PRINT:
1921                             SID_SCPRINTOPTIONS, SID_SCPRINTOPTIONS,
1922                             // TP_GRID:
1923                             SID_ATTR_GRID_OPTIONS, SID_ATTR_GRID_OPTIONS,
1924                             //
1925                             SID_ATTR_METRIC,        SID_ATTR_METRIC,
1926                             SID_ATTR_DEFTABSTOP,    SID_ATTR_DEFTABSTOP,
1927                             0 );
1928 
1929         ScDocShell*     pDocSh = PTR_CAST(ScDocShell,
1930                                             SfxObjectShell::Current());
1931         ScDocOptions    aCalcOpt = pDocSh
1932                             ? pDocSh->GetDocument()->GetDocOptions()
1933                             : GetDocOptions();
1934 
1935         ScTabViewShell* pViewSh = PTR_CAST(ScTabViewShell,
1936                                             SfxViewShell::Current());
1937         ScViewOptions   aViewOpt = pViewSh
1938                             ? pViewSh->GetViewData()->GetOptions()
1939                             : GetViewOptions();
1940 
1941         ScUserListItem  aULItem( SCITEM_USERLIST );
1942         ScUserList*     pUL = ScGlobal::GetUserList();
1943 
1944         //  SFX_APP()->GetOptions( aSet );
1945 
1946         pRet->Put( SfxUInt16Item( SID_ATTR_METRIC,
1947                         sal::static_int_cast<sal_uInt16>(GetAppOptions().GetAppMetric()) ) );
1948 
1949         // TP_CALC
1950         pRet->Put( SfxUInt16Item( SID_ATTR_DEFTABSTOP,
1951                         aCalcOpt.GetTabDistance()));
1952         pRet->Put( ScTpCalcItem( SID_SCDOCOPTIONS, aCalcOpt ) );
1953 
1954         // TP_VIEW
1955         pRet->Put( ScTpViewItem( SID_SCVIEWOPTIONS, aViewOpt ) );
1956         pRet->Put( SfxBoolItem( SID_SC_OPT_SYNCZOOM, GetAppOptions().GetSynchronizeZoom() ) );
1957 
1958         // TP_INPUT
1959         const ScInputOptions& rInpOpt = GetInputOptions();
1960         pRet->Put( SfxUInt16Item( SID_SC_INPUT_SELECTIONPOS,
1961                     rInpOpt.GetMoveDir() ) );
1962         pRet->Put( SfxBoolItem( SID_SC_INPUT_SELECTION,
1963                     rInpOpt.GetMoveSelection() ) );
1964         pRet->Put( SfxBoolItem( SID_SC_INPUT_EDITMODE,
1965                     rInpOpt.GetEnterEdit() ) );
1966         pRet->Put( SfxBoolItem( SID_SC_INPUT_FMT_EXPAND,
1967                     rInpOpt.GetExtendFormat() ) );
1968         pRet->Put( SfxBoolItem( SID_SC_INPUT_RANGEFINDER,
1969                     rInpOpt.GetRangeFinder() ) );
1970         pRet->Put( SfxBoolItem( SID_SC_INPUT_REF_EXPAND,
1971                     rInpOpt.GetExpandRefs() ) );
1972         pRet->Put( SfxBoolItem( SID_SC_INPUT_MARK_HEADER,
1973                     rInpOpt.GetMarkHeader() ) );
1974         pRet->Put( SfxBoolItem( SID_SC_INPUT_TEXTWYSIWYG,
1975                     rInpOpt.GetTextWysiwyg() ) );
1976         pRet->Put( SfxBoolItem( SID_SC_INPUT_REPLCELLSWARN,
1977                     rInpOpt.GetReplaceCellsWarn() ) );
1978 
1979         // RID_SC_TP_PRINT
1980         pRet->Put( ScTpPrintItem( SID_SCPRINTOPTIONS, GetPrintOptions() ) );
1981 
1982         // TP_GRID
1983         SvxGridItem* pSvxGridItem = aViewOpt.CreateGridItem();
1984         pRet->Put( *pSvxGridItem );
1985         delete pSvxGridItem;
1986 
1987         // TP_USERLISTS
1988         if ( pUL )
1989             aULItem.SetUserList( *pUL );
1990         pRet->Put( aULItem );
1991 
1992     }
1993     return pRet;
1994 }
1995 
1996 void ScModule::ApplyItemSet( sal_uInt16 nId, const SfxItemSet& rSet )
1997 {
1998     if(SID_SC_EDITOPTIONS == nId)
1999     {
2000         ModifyOptions( rSet );
2001     }
2002 }
2003 
2004 SfxTabPage*  ScModule::CreateTabPage( sal_uInt16 nId, Window* pParent, const SfxItemSet& rSet )
2005 {
2006     SfxTabPage* pRet = NULL;
2007     ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
2008     DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001
2009     switch(nId)
2010     {
2011         case SID_SC_TP_LAYOUT:
2012                                 {
2013                                     //CHINA001 pRet = ScTpLayoutOptions::Create(pParent, rSet);
2014                                     ::CreateTabPage ScTpLayoutOptionsCreate = pFact->GetTabPageCreatorFunc( RID_SCPAGE_LAYOUT );
2015                                     if ( ScTpLayoutOptionsCreate )
2016                                         pRet =  (*ScTpLayoutOptionsCreate) (pParent, rSet);
2017                                 }
2018                                 break;
2019         case SID_SC_TP_CONTENT:
2020                                 {
2021                                     //CHINA001 pRet = ScTpContentOptions::Create(pParent, rSet);
2022                                     ::CreateTabPage ScTpContentOptionsCreate = pFact->GetTabPageCreatorFunc(RID_SCPAGE_CONTENT);
2023                                     if ( ScTpContentOptionsCreate )
2024                                         pRet = (*ScTpContentOptionsCreate)(pParent, rSet);
2025                                 }
2026                                 break;
2027         case SID_SC_TP_GRID:            pRet = SvxGridTabPage::Create(pParent, rSet); break;
2028         case SID_SC_TP_USERLISTS:
2029                                 {
2030                                     //CHINA001 pRet = ScTpUserLists::Create(pParent, rSet);
2031                                     ::CreateTabPage ScTpUserListsCreate = pFact->GetTabPageCreatorFunc( RID_SCPAGE_USERLISTS );
2032                                     if ( ScTpUserListsCreate )
2033                                             pRet = (*ScTpUserListsCreate)( pParent, rSet);
2034                                 }
2035                                 break;
2036         case SID_SC_TP_CALC:
2037                                 {   //CHINA001 pRet = ScTpCalcOptions::Create(pParent, rSet);
2038                                                     ::CreateTabPage ScTpCalcOptionsCreate = pFact->GetTabPageCreatorFunc( RID_SCPAGE_CALC );
2039                                                     if ( ScTpCalcOptionsCreate )
2040                                                         pRet = (*ScTpCalcOptionsCreate)(pParent, rSet);
2041                                 }
2042                                 break;
2043         case SID_SC_TP_CHANGES:
2044                                 {           //CHINA001 pRet = ScRedlineOptionsTabPage::Create(pParent, rSet);
2045                                             ::CreateTabPage ScRedlineOptionsTabPageCreate = pFact->GetTabPageCreatorFunc( RID_SCPAGE_OPREDLINE );
2046                                             if ( ScRedlineOptionsTabPageCreate )
2047                                                     pRet =(*ScRedlineOptionsTabPageCreate)(pParent, rSet);
2048                                 }
2049                         break;
2050         case RID_SC_TP_PRINT:
2051                                 {//CHINA001 pRet = ScTpPrintOptions::Create(pParent, rSet);
2052                                     ::CreateTabPage ScTpPrintOptionsCreate =    pFact->GetTabPageCreatorFunc( RID_SCPAGE_PRINT );
2053                                     if ( ScTpPrintOptionsCreate )
2054                                         pRet = (*ScTpPrintOptionsCreate)( pParent, rSet);
2055                                 }
2056             break;
2057         case RID_OFA_TP_INTERNATIONAL:
2058         {
2059             SfxAbstractDialogFactory* pSfxFact = SfxAbstractDialogFactory::Create();
2060             if ( pSfxFact )
2061             {
2062                 ::CreateTabPage fnCreatePage = pSfxFact->GetTabPageCreatorFunc( nId );
2063                 if ( fnCreatePage )
2064                     pRet = (*fnCreatePage)( pParent, rSet );
2065             }
2066         }
2067     }
2068 
2069     DBG_ASSERT( pRet, "ScModule::CreateTabPage(): no valid ID for TabPage!" );
2070 
2071     return pRet;
2072 }
2073 
2074 //------------------------------------------------------------------
2075 
2076 IMPL_LINK( ScModule, CalcFieldValueHdl, EditFieldInfo*, pInfo )
2077 {
2078     //! mit ScFieldEditEngine zusammenfassen !!!
2079 
2080     if (pInfo)
2081     {
2082         const SvxFieldItem& rField = pInfo->GetField();
2083         const SvxFieldData* pField = rField.GetField();
2084 
2085         if (pField && pField->ISA(SvxURLField))
2086         {
2087             /******************************************************************
2088             * URL-Field
2089             ******************************************************************/
2090 
2091             const SvxURLField* pURLField = (const SvxURLField*) pField;
2092             String aURL = pURLField->GetURL();
2093 
2094             switch ( pURLField->GetFormat() )
2095             {
2096                 case SVXURLFORMAT_APPDEFAULT: //!!! einstellbar an App???
2097                 case SVXURLFORMAT_REPR:
2098                 {
2099                     pInfo->SetRepresentation( pURLField->GetRepresentation() );
2100                 }
2101                 break;
2102 
2103                 case SVXURLFORMAT_URL:
2104                 {
2105                     pInfo->SetRepresentation( aURL );
2106                 }
2107                 break;
2108             }
2109 
2110             svtools::ColorConfigEntry eEntry =
2111                 INetURLHistory::GetOrCreate()->QueryUrl( aURL ) ? svtools::LINKSVISITED : svtools::LINKS;
2112             pInfo->SetTxtColor( GetColorConfig().GetColorValue(eEntry).nColor );
2113         }
2114         else
2115         {
2116             DBG_ERROR("unbekannter Feldbefehl");
2117             pInfo->SetRepresentation(String('?'));
2118         }
2119     }
2120 
2121     return 0;
2122 }
2123 
2124 sal_Bool ScModule::RegisterRefWindow( sal_uInt16 nSlotId, Window *pWnd )
2125 {
2126     std::list<Window*> & rlRefWindow = m_mapRefWindow[nSlotId];
2127 
2128     if( std::find( rlRefWindow.begin(), rlRefWindow.end(), pWnd ) == rlRefWindow.end() )
2129     {
2130         rlRefWindow.push_back( pWnd );
2131         return sal_True;
2132     }
2133 
2134     return sal_False;
2135 }
2136 
2137 sal_Bool  ScModule::UnregisterRefWindow( sal_uInt16 nSlotId, Window *pWnd )
2138 {
2139     std::map<sal_uInt16, std::list<Window*> >::iterator iSlot = m_mapRefWindow.find( nSlotId );
2140 
2141     if( iSlot == m_mapRefWindow.end() )
2142         return sal_False;
2143 
2144     std::list<Window*> & rlRefWindow = iSlot->second;
2145 
2146     std::list<Window*>::iterator i = std::find( rlRefWindow.begin(), rlRefWindow.end(), pWnd );
2147 
2148     if( i == rlRefWindow.end() )
2149         return sal_False;
2150 
2151     rlRefWindow.erase( i );
2152 
2153     if( !rlRefWindow.size() )
2154         m_mapRefWindow.erase( nSlotId );
2155 
2156     return sal_True;
2157 }
2158 
2159 sal_Bool  ScModule::IsAliveRefDlg( sal_uInt16 nSlotId, Window *pWnd )
2160 {
2161     std::map<sal_uInt16, std::list<Window*> >::iterator iSlot = m_mapRefWindow.find( nSlotId );
2162 
2163     if( iSlot == m_mapRefWindow.end() )
2164         return sal_False;
2165 
2166     std::list<Window*> & rlRefWindow = iSlot->second;
2167 
2168     return rlRefWindow.end() != std::find( rlRefWindow.begin(), rlRefWindow.end(), pWnd );
2169 }
2170 
2171 Window *  ScModule::Find1RefWindow( sal_uInt16 nSlotId, Window *pWndAncestor )
2172 {
2173     if (!pWndAncestor)
2174         return NULL;
2175 
2176     std::map<sal_uInt16, std::list<Window*> >::iterator iSlot = m_mapRefWindow.find( nSlotId );
2177 
2178     if( iSlot == m_mapRefWindow.end() )
2179         return NULL;
2180 
2181     std::list<Window*> & rlRefWindow = iSlot->second;
2182 
2183     while( Window *pParent = pWndAncestor->GetParent() ) pWndAncestor = pParent;
2184 
2185     for( std::list<Window*>::iterator i = rlRefWindow.begin(); i!=rlRefWindow.end(); i++ )
2186         if ( pWndAncestor->IsWindowOrChild( *i, (*i)->IsSystemWindow() ) )
2187             return *i;
2188 
2189     return NULL;
2190 }
2191 
2192 Window *  ScModule::Find1RefWindow( Window *pWndAncestor )
2193 {
2194     if (!pWndAncestor)
2195         return NULL;
2196 
2197     while( Window *pParent = pWndAncestor->GetParent() ) pWndAncestor = pParent;
2198 
2199     for( std::map<sal_uInt16, std::list<Window*> >::iterator i = m_mapRefWindow.begin();
2200         i!=m_mapRefWindow.end(); i++ )
2201         for( std::list<Window*>::iterator j = i->second.begin(); j!=i->second.end(); j++ )
2202             if ( pWndAncestor->IsWindowOrChild( *j, (*j)->IsSystemWindow() ) )
2203                 return *j;
2204 
2205     return NULL;
2206 }
2207 
2208