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