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