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 occurred,
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