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