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/embed/XEmbeddedObject.hpp>
23 : #include <com/sun/star/frame/Desktop.hpp>
24 : #include <com/sun/star/frame/XComponentLoader.hpp>
25 :
26 : using namespace ::com::sun::star;
27 :
28 : #include <math.h>
29 :
30 : #include "scitems.hxx"
31 : #include <sfx2/fcontnr.hxx>
32 : #include <sfx2/objface.hxx>
33 : #include <sfx2/docfile.hxx>
34 : #include <svtools/ehdl.hxx>
35 : #include <basic/sbxcore.hxx>
36 : #include <svtools/sfxecode.hxx>
37 : #include <svx/ofaitem.hxx>
38 : #include <svl/whiter.hxx>
39 : #include <vcl/msgbox.hxx>
40 : #include <vcl/waitobj.hxx>
41 : #include <svx/dataaccessdescriptor.hxx>
42 : #include <svx/drawitem.hxx>
43 : #include <svx/fmshell.hxx>
44 : #include <svtools/xwindowitem.hxx>
45 : #include <sfx2/passwd.hxx>
46 : #include <sfx2/filedlghelper.hxx>
47 : #include <sfx2/dispatch.hxx>
48 : #include <svl/PasswordHelper.hxx>
49 : #include <svl/documentlockfile.hxx>
50 : #include <svl/sharecontrolfile.hxx>
51 :
52 : #include <comphelper/processfactory.hxx>
53 : #include "docuno.hxx"
54 :
55 : #include <com/sun/star/sdbc/XResultSet.hpp>
56 : #include "docsh.hxx"
57 : #include "docshimp.hxx"
58 : #include "docfunc.hxx"
59 : #include "sc.hrc"
60 : #include "stlsheet.hxx"
61 : #include "stlpool.hxx"
62 : #include "appoptio.hxx"
63 : #include "globstr.hrc"
64 : #include "global.hxx"
65 : #include "dbdocfun.hxx"
66 : #include "printfun.hxx"
67 : #include "viewdata.hxx"
68 : #include "tabvwsh.hxx"
69 : #include "impex.hxx"
70 : #include "attrib.hxx"
71 : #include "undodat.hxx"
72 : #include "autostyl.hxx"
73 : #include "undocell.hxx"
74 : #include "undotab.hxx"
75 : #include "inputhdl.hxx"
76 : #include "dbdata.hxx"
77 : #include "servobj.hxx"
78 : #include "rangenam.hxx"
79 : #include "scmod.hxx"
80 : #include "chgviset.hxx"
81 : #include "reffact.hxx"
82 : #include "chartlis.hxx"
83 : #include "chartpos.hxx"
84 : #include "waitoff.hxx"
85 : #include "tablink.hxx"
86 : #include "drwlayer.hxx"
87 : #include "docoptio.hxx"
88 : #include "undostyl.hxx"
89 : #include "rangeseq.hxx"
90 : #include "chgtrack.hxx"
91 : #include "printopt.hxx"
92 : #include <com/sun/star/document/UpdateDocMode.hpp>
93 : #include "scresid.hxx"
94 : #include "scabstdlg.hxx"
95 : #include "externalrefmgr.hxx"
96 : #include "sharedocdlg.hxx"
97 : #include "conditio.hxx"
98 : #include "sheetevents.hxx"
99 : #include <documentlinkmgr.hxx>
100 :
101 : #define IS_SHARE_HEADER(set) \
102 : ((SfxBoolItem&) \
103 : ((SvxSetItem&)(set).Get(ATTR_PAGE_HEADERSET)).GetItemSet(). \
104 : Get(ATTR_PAGE_SHARED)).GetValue()
105 :
106 : #define IS_SHARE_FOOTER(set) \
107 : ((SfxBoolItem&) \
108 : ((SvxSetItem&)(set).Get(ATTR_PAGE_FOOTERSET)).GetItemSet(). \
109 : Get(ATTR_PAGE_SHARED)).GetValue()
110 :
111 : #define SC_PREVIEW_SIZE_X 10000
112 : #define SC_PREVIEW_SIZE_Y 12400
113 :
114 :
115 0 : void ScDocShell::Execute( SfxRequest& rReq )
116 : {
117 : // SID_SC_RANGE (Range),
118 : // SID_SC_CELLTEXT (CellText),
119 : // SID_SC_CELLS (Cells) - removed (old Basic)
120 :
121 0 : const SfxItemSet* pReqArgs = rReq.GetArgs();
122 0 : SfxBindings* pBindings = GetViewBindings();
123 0 : sal_Bool bUndo (aDocument.IsUndoEnabled());
124 :
125 0 : sal_uInt16 nSlot = rReq.GetSlot();
126 0 : switch ( nSlot )
127 : {
128 : case SID_SC_SETTEXT:
129 : {
130 : const SfxPoolItem* pColItem;
131 : const SfxPoolItem* pRowItem;
132 : const SfxPoolItem* pTabItem;
133 : const SfxPoolItem* pTextItem;
134 0 : if( pReqArgs && pReqArgs->HasItem( FN_PARAM_1, &pColItem ) &&
135 0 : pReqArgs->HasItem( FN_PARAM_2, &pRowItem ) &&
136 0 : pReqArgs->HasItem( FN_PARAM_3, &pTabItem ) &&
137 0 : pReqArgs->HasItem( SID_SC_SETTEXT, &pTextItem ) )
138 : {
139 : // Parameter sind 1-based !!!
140 0 : SCCOL nCol = ((SfxInt16Item*)pColItem)->GetValue() - 1;
141 0 : SCROW nRow = ((SfxInt32Item*)pRowItem)->GetValue() - 1;
142 0 : SCTAB nTab = ((SfxInt16Item*)pTabItem)->GetValue() - 1;
143 :
144 0 : SCTAB nTabCount = aDocument.GetTableCount();
145 0 : if ( ValidCol(nCol) && ValidRow(nRow) && ValidTab(nTab,nTabCount) )
146 : {
147 0 : if ( aDocument.IsBlockEditable( nTab, nCol,nRow, nCol, nRow ) )
148 : {
149 0 : OUString aVal = ((const SfxStringItem*)pTextItem)->GetValue();
150 0 : aDocument.SetString( nCol, nRow, nTab, aVal );
151 :
152 0 : PostPaintCell( nCol, nRow, nTab );
153 0 : SetDocumentModified();
154 :
155 0 : rReq.Done();
156 0 : break;
157 : }
158 : else // geschuetzte Zelle
159 : {
160 : #ifndef DISABLE_SCRIPTING
161 0 : SbxBase::SetError( SbxERR_BAD_PARAMETER ); //! welchen Fehler ?
162 : #endif
163 0 : break;
164 : }
165 : }
166 : }
167 : #ifndef DISABLE_SCRIPTING
168 0 : SbxBase::SetError( SbxERR_NO_OBJECT );
169 : #endif
170 : }
171 0 : break;
172 :
173 : case SID_SBA_IMPORT:
174 : {
175 0 : if (pReqArgs)
176 : {
177 : const SfxPoolItem* pItem;
178 0 : svx::ODataAccessDescriptor aDesc;
179 0 : if ( pReqArgs->GetItemState( nSlot, true, &pItem ) == SFX_ITEM_SET )
180 : {
181 0 : uno::Any aAny = static_cast<const SfxUsrAnyItem*>(pItem)->GetValue();
182 0 : uno::Sequence<beans::PropertyValue> aProperties;
183 0 : if ( aAny >>= aProperties )
184 0 : aDesc.initializeFrom( aProperties );
185 : }
186 :
187 0 : OUString sTarget;
188 0 : if ( pReqArgs->GetItemState( FN_PARAM_1, true, &pItem ) == SFX_ITEM_SET )
189 0 : sTarget = ((const SfxStringItem*)pItem)->GetValue();
190 :
191 0 : sal_Bool bIsNewArea = sal_True; // Default sal_True (keine Nachfrage)
192 0 : if ( pReqArgs->GetItemState( FN_PARAM_2, true, &pItem ) == SFX_ITEM_SET )
193 0 : bIsNewArea = ((const SfxBoolItem*)pItem)->GetValue();
194 :
195 : // bei Bedarf neuen Datenbankbereich anlegen
196 0 : bool bMakeArea = false;
197 0 : if (bIsNewArea)
198 : {
199 0 : ScDBCollection* pDBColl = aDocument.GetDBCollection();
200 0 : if ( !pDBColl || !pDBColl->getNamedDBs().findByUpperName(ScGlobal::pCharClass->uppercase(sTarget)) )
201 : {
202 0 : ScAddress aPos;
203 0 : if ( aPos.Parse( sTarget, &aDocument, aDocument.GetAddressConvention() ) & SCA_VALID )
204 : {
205 0 : bMakeArea = true;
206 0 : if (bUndo)
207 : {
208 0 : OUString aStrImport = ScGlobal::GetRscString( STR_UNDO_IMPORTDATA );
209 0 : GetUndoManager()->EnterListAction( aStrImport, aStrImport );
210 : }
211 :
212 0 : ScDBData* pDBData = GetDBData( ScRange(aPos), SC_DB_IMPORT, SC_DBSEL_KEEP );
213 : OSL_ENSURE(pDBData, "kann DB-Daten nicht anlegen");
214 0 : sTarget = pDBData->GetName();
215 : }
216 : }
217 : }
218 :
219 : // nachfragen, bevor alter DB-Bereich ueberschrieben wird
220 0 : bool bDo = true;
221 0 : if (!bIsNewArea)
222 : {
223 0 : OUString aTemplate = ScGlobal::GetRscString( STR_IMPORT_REPLACE );
224 0 : OUString aMessage = aTemplate.getToken( 0, '#' );
225 0 : aMessage += sTarget;
226 0 : aMessage += aTemplate.getToken( 1, '#' );
227 :
228 0 : QueryBox aBox( 0, WinBits(WB_YES_NO | WB_DEF_YES), aMessage );
229 0 : bDo = ( aBox.Execute() == RET_YES );
230 : }
231 :
232 0 : if (bDo)
233 : {
234 0 : ScDBDocFunc(*this).UpdateImport( sTarget, aDesc );
235 0 : rReq.Done();
236 :
237 : // UpdateImport aktualisiert auch die internen Operationen
238 : }
239 : else
240 0 : rReq.Ignore();
241 :
242 0 : if ( bMakeArea && bUndo)
243 0 : GetUndoManager()->LeaveListAction();
244 : }
245 : else
246 : {
247 : OSL_FAIL( "arguments expected" );
248 : }
249 : }
250 0 : break;
251 :
252 : case SID_CHART_SOURCE:
253 : case SID_CHART_ADDSOURCE:
254 0 : if (pReqArgs)
255 : {
256 0 : ScDocument* pDoc = GetDocument();
257 : const SfxPoolItem* pItem;
258 0 : OUString aChartName, aRangeName;
259 :
260 0 : ScRange aSingleRange;
261 0 : ScRangeListRef aRangeListRef;
262 0 : sal_Bool bMultiRange = false;
263 :
264 0 : sal_Bool bColHeaders = sal_True;
265 0 : sal_Bool bRowHeaders = sal_True;
266 0 : sal_Bool bColInit = false;
267 0 : sal_Bool bRowInit = false;
268 0 : sal_Bool bAddRange = (nSlot == SID_CHART_ADDSOURCE);
269 :
270 0 : if( pReqArgs->HasItem( SID_CHART_NAME, &pItem ) )
271 0 : aChartName = ((const SfxStringItem*)pItem)->GetValue();
272 :
273 0 : if( pReqArgs->HasItem( SID_CHART_SOURCE, &pItem ) )
274 0 : aRangeName = ((const SfxStringItem*)pItem)->GetValue();
275 :
276 0 : if( pReqArgs->HasItem( FN_PARAM_1, &pItem ) )
277 : {
278 0 : bColHeaders = ((const SfxBoolItem*)pItem)->GetValue();
279 0 : bColInit = sal_True;
280 : }
281 0 : if( pReqArgs->HasItem( FN_PARAM_2, &pItem ) )
282 : {
283 0 : bRowHeaders = ((const SfxBoolItem*)pItem)->GetValue();
284 0 : bRowInit = sal_True;
285 : }
286 :
287 0 : ScAddress::Details aDetails(pDoc->GetAddressConvention(), 0, 0);
288 0 : sal_Bool bValid = ( aSingleRange.ParseAny( aRangeName, pDoc, aDetails ) & SCA_VALID ) != 0;
289 0 : if (!bValid)
290 : {
291 0 : aRangeListRef = new ScRangeList;
292 0 : aRangeListRef->Parse( aRangeName, pDoc );
293 0 : if ( !aRangeListRef->empty() )
294 : {
295 0 : bMultiRange = true;
296 0 : aSingleRange = *aRangeListRef->front(); // fuer Header
297 0 : bValid = true;
298 : }
299 : else
300 0 : aRangeListRef.Clear();
301 : }
302 :
303 0 : ScTabViewShell* pViewSh = ScTabViewShell::GetActiveViewShell();
304 0 : if (pViewSh && bValid && !aChartName.isEmpty() )
305 : {
306 0 : Window* pParent = pViewSh->GetDialogParent();
307 :
308 0 : SCCOL nCol1 = aSingleRange.aStart.Col();
309 0 : SCROW nRow1 = aSingleRange.aStart.Row();
310 0 : SCCOL nCol2 = aSingleRange.aEnd.Col();
311 0 : SCROW nRow2 = aSingleRange.aEnd.Row();
312 0 : SCTAB nTab = aSingleRange.aStart.Tab();
313 :
314 : //! immer oder gar nicht begrenzen ???
315 0 : if (!bMultiRange)
316 0 : aDocument.LimitChartArea( nTab, nCol1,nRow1, nCol2,nRow2 );
317 :
318 : // Dialog fuer Spalten/Zeilenkoepfe
319 0 : sal_Bool bOk = sal_True;
320 0 : if ( !bAddRange && ( !bColInit || !bRowInit ) )
321 : {
322 0 : ScChartPositioner aChartPositioner( &aDocument, nTab, nCol1,nRow1, nCol2,nRow2 );
323 0 : if (!bColInit)
324 0 : bColHeaders = aChartPositioner.HasColHeaders();
325 0 : if (!bRowInit)
326 0 : bRowHeaders = aChartPositioner.HasRowHeaders();
327 :
328 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
329 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
330 :
331 0 : AbstractScColRowLabelDlg* pDlg = pFact->CreateScColRowLabelDlg(pParent, bRowHeaders, bColHeaders);
332 : OSL_ENSURE(pDlg, "Dialog create fail!");
333 0 : if ( pDlg->Execute() == RET_OK )
334 : {
335 0 : bColHeaders = pDlg->IsRow();
336 0 : bRowHeaders = pDlg->IsCol();
337 :
338 0 : rReq.AppendItem(SfxBoolItem(FN_PARAM_1, bColHeaders));
339 0 : rReq.AppendItem(SfxBoolItem(FN_PARAM_2, bRowHeaders));
340 : }
341 : else
342 0 : bOk = false;
343 0 : delete pDlg;
344 : }
345 :
346 0 : if (bOk) // ausfuehren
347 : {
348 0 : if (bMultiRange)
349 : {
350 0 : if (bUndo)
351 : {
352 0 : GetUndoManager()->AddUndoAction(
353 : new ScUndoChartData( this, aChartName, aRangeListRef,
354 0 : bColHeaders, bRowHeaders, bAddRange ) );
355 : }
356 : aDocument.UpdateChartArea( aChartName, aRangeListRef,
357 0 : bColHeaders, bRowHeaders, bAddRange );
358 : }
359 : else
360 : {
361 0 : ScRange aNewRange( nCol1,nRow1,nTab, nCol2,nRow2,nTab );
362 0 : if (bUndo)
363 : {
364 0 : GetUndoManager()->AddUndoAction(
365 : new ScUndoChartData( this, aChartName, aNewRange,
366 0 : bColHeaders, bRowHeaders, bAddRange ) );
367 : }
368 : aDocument.UpdateChartArea( aChartName, aNewRange,
369 0 : bColHeaders, bRowHeaders, bAddRange );
370 : }
371 : }
372 : }
373 : else
374 : {
375 : OSL_FAIL("UpdateChartArea: keine ViewShell oder falsche Daten");
376 : }
377 0 : rReq.Done();
378 : }
379 : else
380 : {
381 : OSL_FAIL("SID_CHART_SOURCE ohne Argumente");
382 : }
383 0 : break;
384 :
385 : case FID_AUTO_CALC:
386 : {
387 : sal_Bool bNewVal;
388 : const SfxPoolItem* pItem;
389 0 : if ( pReqArgs && SFX_ITEM_SET == pReqArgs->GetItemState( nSlot, true, &pItem ) )
390 0 : bNewVal = ((const SfxBoolItem*)pItem)->GetValue();
391 : else
392 0 : bNewVal = !aDocument.GetAutoCalc(); // Toggle fuer Menue
393 0 : aDocument.SetAutoCalc( bNewVal );
394 0 : SetDocumentModified();
395 0 : if (pBindings)
396 : {
397 0 : pBindings->Invalidate( FID_AUTO_CALC );
398 : }
399 0 : rReq.AppendItem( SfxBoolItem( FID_AUTO_CALC, bNewVal ) );
400 0 : rReq.Done();
401 : }
402 0 : break;
403 : case FID_RECALC:
404 0 : DoRecalc( rReq.IsAPI() );
405 0 : rReq.Done();
406 0 : break;
407 : case FID_HARD_RECALC:
408 0 : DoHardRecalc( rReq.IsAPI() );
409 0 : rReq.Done();
410 0 : break;
411 : case SID_UPDATETABLINKS:
412 : {
413 0 : ScDocument* pDoc = GetDocument();
414 :
415 0 : ScLkUpdMode nSet=pDoc->GetLinkMode();
416 :
417 0 : sal_uInt16 nDlgRet=RET_NO;
418 0 : if(nSet==LM_UNKNOWN)
419 : {
420 0 : ScAppOptions aAppOptions=SC_MOD()->GetAppOptions();
421 0 : nSet=aAppOptions.GetLinkMode();
422 : }
423 :
424 0 : if (nCanUpdate == com::sun::star::document::UpdateDocMode::NO_UPDATE)
425 0 : nSet = LM_NEVER;
426 0 : else if (nCanUpdate == com::sun::star::document::UpdateDocMode::QUIET_UPDATE &&
427 : nSet == LM_ON_DEMAND)
428 0 : nSet = LM_NEVER;
429 0 : else if (nCanUpdate == com::sun::star::document::UpdateDocMode::FULL_UPDATE)
430 0 : nSet = LM_ALWAYS;
431 :
432 0 : if(nSet==LM_ON_DEMAND)
433 : {
434 : QueryBox aBox( GetActiveDialogParent(), WinBits(WB_YES_NO | WB_DEF_YES),
435 0 : ScGlobal::GetRscString(STR_RELOAD_TABLES) );
436 :
437 0 : nDlgRet=aBox.Execute();
438 : }
439 :
440 0 : if (nDlgRet == RET_YES || nSet==LM_ALWAYS)
441 : {
442 0 : ReloadTabLinks();
443 0 : aDocument.UpdateExternalRefLinks(GetActiveDialogParent());
444 :
445 0 : bool bAny = aDocument.GetDocLinkManager().updateDdeLinks(GetActiveDialogParent());
446 :
447 0 : if (bAny)
448 : {
449 : // Formeln berechnen und painten wie im TrackTimeHdl
450 0 : aDocument.TrackFormulas();
451 0 : Broadcast(SfxSimpleHint(FID_DATACHANGED));
452 :
453 : // wenn FID_DATACHANGED irgendwann mal asynchron werden sollte
454 : // (z.B. mit Invalidate am Window), muss hier ein Update erzwungen werden.
455 : }
456 :
457 0 : aDocument.UpdateAreaLinks();
458 :
459 : //! Test, ob Fehler
460 0 : rReq.Done();
461 : }
462 : else
463 0 : rReq.Ignore();
464 : }
465 0 : break;
466 :
467 : case SID_REIMPORT_AFTER_LOAD:
468 : {
469 : // wird nach dem Laden aufgerufen, wenn DB-Bereiche mit
470 : // weggelassenen Daten enthalten sind
471 :
472 0 : sal_Bool bDone = false;
473 0 : ScDBCollection* pDBColl = aDocument.GetDBCollection();
474 :
475 0 : if ((nCanUpdate != com::sun::star::document::UpdateDocMode::NO_UPDATE) &&
476 0 : (nCanUpdate != com::sun::star::document::UpdateDocMode::QUIET_UPDATE))
477 : {
478 0 : ScRange aRange;
479 0 : ScTabViewShell* pViewSh = GetBestViewShell();
480 : OSL_ENSURE(pViewSh,"SID_REIMPORT_AFTER_LOAD: keine View");
481 0 : if (pViewSh && pDBColl)
482 : {
483 : QueryBox aBox( GetActiveDialogParent(), WinBits(WB_YES_NO | WB_DEF_YES),
484 0 : ScGlobal::GetRscString(STR_REIMPORT_AFTER_LOAD) );
485 0 : if (aBox.Execute() == RET_YES)
486 : {
487 0 : ScDBCollection::NamedDBs& rDBs = pDBColl->getNamedDBs();
488 0 : ScDBCollection::NamedDBs::iterator itr = rDBs.begin(), itrEnd = rDBs.end();
489 0 : for (; itr != itrEnd; ++itr)
490 : {
491 0 : ScDBData& rDBData = *itr;
492 0 : if ( rDBData.IsStripData() &&
493 0 : rDBData.HasImportParam() && !rDBData.HasImportSelection() )
494 : {
495 0 : rDBData.GetArea(aRange);
496 0 : pViewSh->MarkRange(aRange);
497 :
498 : // Import und interne Operationen wie SID_REFRESH_DBAREA
499 : // (Abfrage auf Import hier nicht noetig)
500 :
501 0 : ScImportParam aImportParam;
502 0 : rDBData.GetImportParam( aImportParam );
503 0 : bool bContinue = pViewSh->ImportData( aImportParam );
504 0 : rDBData.SetImportParam( aImportParam );
505 :
506 : // markieren (Groesse kann sich geaendert haben)
507 0 : rDBData.GetArea(aRange);
508 0 : pViewSh->MarkRange(aRange);
509 :
510 0 : if ( bContinue ) // Fehler beim Import -> Abbruch
511 : {
512 : // interne Operationen, wenn welche gespeichert
513 :
514 0 : if ( rDBData.HasQueryParam() || rDBData.HasSortParam() ||
515 0 : rDBData.HasSubTotalParam() )
516 0 : pViewSh->RepeatDB();
517 :
518 : // Pivottabellen die den Bereich als Quelldaten haben
519 :
520 0 : RefreshPivotTables(aRange);
521 0 : }
522 : }
523 : }
524 0 : bDone = true;
525 0 : }
526 : }
527 : }
528 :
529 0 : if ( !bDone && pDBColl )
530 : {
531 : // wenn nicht, dann aber die abhaengigen Formeln updaten
532 : //! auch fuer einzelne Bereiche, die nicht aktualisiert werden koennen
533 :
534 0 : aDocument.CalcAll(); //! nur die abhaengigen
535 0 : PostDataChanged();
536 : }
537 :
538 0 : if (bDone)
539 0 : rReq.Done();
540 : else
541 0 : rReq.Ignore();
542 : }
543 0 : break;
544 :
545 :
546 : case SID_AUTO_STYLE:
547 : OSL_FAIL("use ScAutoStyleHint instead of SID_AUTO_STYLE");
548 0 : break;
549 :
550 : case SID_GET_COLORLIST:
551 : {
552 0 : SvxColorListItem* pColItem = (SvxColorListItem*)GetItem(SID_COLOR_TABLE);
553 0 : XColorListRef pList = pColItem->GetColorList();
554 0 : rReq.SetReturnValue(OfaRefItem<XColorList>(SID_GET_COLORLIST, pList));
555 : }
556 0 : break;
557 :
558 : case FID_CHG_RECORD:
559 : {
560 0 : ScDocument* pDoc = GetDocument();
561 0 : if(pDoc!=NULL)
562 : {
563 : // get argument (recorded macro)
564 0 : SFX_REQUEST_ARG( rReq, pItem, SfxBoolItem, FID_CHG_RECORD, false );
565 0 : sal_Bool bDo = sal_True;
566 :
567 : // xmlsec05/06:
568 : // getting real parent window when called from Security-Options TP
569 0 : Window* pParent = NULL;
570 : const SfxPoolItem* pParentItem;
571 0 : if( pReqArgs && SFX_ITEM_SET == pReqArgs->GetItemState( SID_ATTR_XWINDOW, false, &pParentItem ) )
572 0 : pParent = ( ( const XWindowItem* ) pParentItem )->GetWindowPtr();
573 :
574 : // desired state
575 0 : ScChangeTrack* pChangeTrack = pDoc->GetChangeTrack();
576 0 : sal_Bool bActivateTracking = (pChangeTrack == 0); // toggle
577 0 : if ( pItem )
578 0 : bActivateTracking = pItem->GetValue(); // from argument
579 :
580 0 : if ( !bActivateTracking )
581 : {
582 0 : if ( !pItem )
583 : {
584 : // no dialog on playing the macro
585 : WarningBox aBox( pParent ? pParent : GetActiveDialogParent(),
586 : WinBits(WB_YES_NO | WB_DEF_NO),
587 0 : ScGlobal::GetRscString( STR_END_REDLINING ) );
588 0 : bDo = ( aBox.Execute() == RET_YES );
589 : }
590 :
591 0 : if ( bDo )
592 : {
593 0 : if ( pChangeTrack->IsProtected() )
594 0 : bDo = ExecuteChangeProtectionDialog( NULL );
595 0 : if ( bDo )
596 : {
597 0 : pDoc->EndChangeTracking();
598 0 : PostPaintGridAll();
599 : }
600 : }
601 : }
602 : else
603 : {
604 0 : pDoc->StartChangeTracking();
605 0 : ScChangeViewSettings aChangeViewSet;
606 0 : aChangeViewSet.SetShowChanges(true);
607 0 : pDoc->SetChangeViewSettings(aChangeViewSet);
608 : }
609 :
610 0 : if ( bDo )
611 : {
612 0 : UpdateAcceptChangesDialog();
613 :
614 : // Slots invalidieren
615 0 : if (pBindings)
616 0 : pBindings->InvalidateAll(false);
617 0 : if ( !pItem )
618 0 : rReq.AppendItem( SfxBoolItem( FID_CHG_RECORD, bActivateTracking ) );
619 0 : rReq.Done();
620 : }
621 : else
622 0 : rReq.Ignore();
623 : }
624 : }
625 0 : break;
626 :
627 : case SID_CHG_PROTECT :
628 : {
629 0 : Window* pParent = NULL;
630 : const SfxPoolItem* pParentItem;
631 0 : if( pReqArgs && SFX_ITEM_SET == pReqArgs->GetItemState( SID_ATTR_XWINDOW, false, &pParentItem ) )
632 0 : pParent = ( ( const XWindowItem* ) pParentItem )->GetWindowPtr();
633 0 : if ( ExecuteChangeProtectionDialog( pParent ) )
634 : {
635 0 : rReq.Done();
636 0 : SetDocumentModified();
637 : }
638 : else
639 0 : rReq.Ignore();
640 : }
641 0 : break;
642 :
643 : case SID_DOCUMENT_MERGE:
644 : case SID_DOCUMENT_COMPARE:
645 : {
646 0 : sal_Bool bDo = sal_True;
647 0 : ScChangeTrack* pChangeTrack = aDocument.GetChangeTrack();
648 0 : if ( pChangeTrack && !pImpl->bIgnoreLostRedliningWarning )
649 : {
650 0 : if ( nSlot == SID_DOCUMENT_COMPARE )
651 : { //! old changes trace will be lost
652 : WarningBox aBox( GetActiveDialogParent(),
653 : WinBits(WB_YES_NO | WB_DEF_NO),
654 0 : ScGlobal::GetRscString( STR_END_REDLINING ) );
655 0 : if( aBox.Execute() == RET_YES )
656 0 : bDo = ExecuteChangeProtectionDialog( NULL, true );
657 : else
658 0 : bDo = false;
659 : }
660 : else // merge might reject some actions
661 0 : bDo = ExecuteChangeProtectionDialog( NULL, true );
662 : }
663 0 : if ( !bDo )
664 : {
665 0 : rReq.Ignore();
666 0 : break;
667 : }
668 0 : SfxApplication* pApp = SFX_APP();
669 : const SfxPoolItem* pItem;
670 0 : SfxMedium* pMed = NULL;
671 0 : if ( pReqArgs &&
672 0 : pReqArgs->GetItemState( SID_FILE_NAME, true, &pItem ) == SFX_ITEM_SET &&
673 0 : pItem->ISA(SfxStringItem) )
674 : {
675 : OUString aFileName =
676 0 : static_cast<const SfxStringItem*>(pItem)->GetValue();
677 :
678 0 : OUString aFilterName;
679 0 : if ( pReqArgs->GetItemState( SID_FILTER_NAME, true, &pItem ) == SFX_ITEM_SET &&
680 0 : pItem->ISA(SfxStringItem) )
681 : {
682 0 : aFilterName = static_cast<const SfxStringItem*>(pItem)->GetValue();
683 : }
684 0 : OUString aOptions;
685 0 : if ( pReqArgs->GetItemState( SID_FILE_FILTEROPTIONS, true, &pItem ) == SFX_ITEM_SET &&
686 0 : pItem->ISA(SfxStringItem) )
687 : {
688 0 : aOptions = static_cast<const SfxStringItem*>(pItem)->GetValue();
689 : }
690 0 : short nVersion = 0;
691 0 : if ( pReqArgs->GetItemState( SID_VERSION, true, &pItem ) == SFX_ITEM_SET &&
692 0 : pItem->ISA(SfxInt16Item) )
693 : {
694 0 : nVersion = static_cast<const SfxInt16Item*>(pItem)->GetValue();
695 : }
696 :
697 : // kein Filter angegeben -> Detection
698 0 : if (aFilterName.isEmpty())
699 0 : ScDocumentLoader::GetFilterName( aFileName, aFilterName, aOptions, true, false );
700 :
701 : // filter name from dialog contains application prefix,
702 : // GetFilter needs name without the prefix.
703 0 : ScDocumentLoader::RemoveAppPrefix( aFilterName );
704 :
705 0 : const SfxFilter* pFilter = ScDocShell::Factory().GetFilterContainer()->GetFilter4FilterName( aFilterName );
706 0 : SfxItemSet* pSet = new SfxAllItemSet( pApp->GetPool() );
707 0 : if (!aOptions.isEmpty())
708 0 : pSet->Put( SfxStringItem( SID_FILE_FILTEROPTIONS, aOptions ) );
709 0 : if ( nVersion != 0 )
710 0 : pSet->Put( SfxInt16Item( SID_VERSION, nVersion ) );
711 0 : pMed = new SfxMedium( aFileName, STREAM_STD_READ, pFilter, pSet );
712 : }
713 : else
714 : {
715 : // start file dialog asynchronous
716 0 : pImpl->bIgnoreLostRedliningWarning = true;
717 0 : delete pImpl->pRequest;
718 0 : pImpl->pRequest = new SfxRequest( rReq );
719 0 : delete pImpl->pDocInserter;
720 : pImpl->pDocInserter = new ::sfx2::DocumentInserter(
721 0 : OUString::createFromAscii( ScDocShell::Factory().GetShortName() ), false );
722 0 : pImpl->pDocInserter->StartExecuteModal( LINK( this, ScDocShell, DialogClosedHdl ) );
723 0 : return ;
724 : }
725 :
726 0 : if ( pMed ) // nun wirklich ausfuehren...
727 : {
728 0 : SfxErrorContext aEc( ERRCTX_SFX_OPENDOC, pMed->GetName() );
729 :
730 : // pOtherDocSh->DoClose() will be called explicitly later, but it is still more safe to use SfxObjectShellLock here
731 0 : ScDocShell* pOtherDocSh = new ScDocShell;
732 0 : SfxObjectShellLock aDocShTablesRef = pOtherDocSh;
733 0 : pOtherDocSh->DoLoad( pMed );
734 0 : sal_uLong nErr = pOtherDocSh->GetErrorCode();
735 0 : if (nErr)
736 0 : ErrorHandler::HandleError( nErr ); // auch Warnings
737 :
738 0 : if ( !pOtherDocSh->GetError() ) // nur Errors
739 : {
740 0 : sal_Bool bHadTrack = ( aDocument.GetChangeTrack() != NULL );
741 : #if HAVE_FEATURE_MULTIUSER_ENVIRONMENT
742 0 : sal_uLong nStart = 0;
743 0 : if ( nSlot == SID_DOCUMENT_MERGE && pChangeTrack )
744 : {
745 0 : nStart = pChangeTrack->GetActionMax() + 1;
746 : }
747 : #endif
748 0 : if ( nSlot == SID_DOCUMENT_COMPARE )
749 0 : CompareDocument( *pOtherDocSh->GetDocument() );
750 : else
751 0 : MergeDocument( *pOtherDocSh->GetDocument() );
752 :
753 : // show "accept changes" dialog
754 : //! get view for this document!
755 0 : if ( !IsDocShared() )
756 : {
757 0 : SfxViewFrame* pViewFrm = SfxViewFrame::Current();
758 0 : if ( pViewFrm )
759 : {
760 0 : pViewFrm->ShowChildWindow( ScAcceptChgDlgWrapper::GetChildWindowId(), true ); //@51669
761 : }
762 0 : if ( pBindings )
763 : {
764 0 : pBindings->Invalidate( FID_CHG_ACCEPT );
765 : }
766 : }
767 :
768 0 : rReq.SetReturnValue( SfxInt32Item( nSlot, 0 ) ); //! ???????
769 0 : rReq.Done();
770 :
771 0 : if (!bHadTrack) // neu eingeschaltet -> auch anzeigen
772 : {
773 0 : ScChangeViewSettings* pOldSet = aDocument.GetChangeViewSettings();
774 0 : if ( !pOldSet || !pOldSet->ShowChanges() )
775 : {
776 0 : ScChangeViewSettings aChangeViewSet;
777 0 : aChangeViewSet.SetShowChanges(true);
778 0 : aDocument.SetChangeViewSettings(aChangeViewSet);
779 : }
780 : }
781 : #if HAVE_FEATURE_MULTIUSER_ENVIRONMENT
782 0 : else if ( nSlot == SID_DOCUMENT_MERGE && IsDocShared() && pChangeTrack )
783 : {
784 0 : sal_uLong nEnd = pChangeTrack->GetActionMax();
785 0 : if ( nEnd >= nStart )
786 : {
787 : // only show changes from merged document
788 0 : ScChangeViewSettings aChangeViewSet;
789 0 : aChangeViewSet.SetShowChanges( true );
790 0 : aChangeViewSet.SetShowAccepted( true );
791 0 : aChangeViewSet.SetHasActionRange( true );
792 0 : aChangeViewSet.SetTheActionRange( nStart, nEnd );
793 0 : aDocument.SetChangeViewSettings( aChangeViewSet );
794 :
795 : // update view
796 0 : PostPaintExtras();
797 0 : PostPaintGridAll();
798 : }
799 : }
800 : #endif
801 : }
802 0 : pOtherDocSh->DoClose(); // delete passiert mit der Ref
803 : }
804 : }
805 0 : break;
806 :
807 : case SID_DELETE_SCENARIO:
808 0 : if (pReqArgs)
809 : {
810 : const SfxPoolItem* pItem;
811 0 : if ( pReqArgs->GetItemState( nSlot, true, &pItem ) == SFX_ITEM_SET )
812 : {
813 0 : if ( pItem->ISA(SfxStringItem) )
814 : {
815 0 : OUString aName = ((const SfxStringItem*)pItem)->GetValue();
816 : SCTAB nTab;
817 0 : if (aDocument.GetTable( aName, nTab ))
818 : {
819 : // DeleteTable von viewfunc nach docfunc verschieben!
820 :
821 0 : ScTabViewShell* pSh = GetBestViewShell();
822 0 : if ( pSh )
823 : {
824 : //! SetTabNo in DeleteTable weglassen?
825 0 : SCTAB nDispTab = pSh->GetViewData()->GetTabNo();
826 0 : pSh->DeleteTable( nTab );
827 0 : pSh->SetTabNo(nDispTab);
828 0 : rReq.Done();
829 : }
830 0 : }
831 : }
832 : }
833 : }
834 0 : break;
835 :
836 : case SID_EDIT_SCENARIO:
837 : {
838 : const SfxPoolItem* pItem;
839 0 : if ( pReqArgs->GetItemState( nSlot, true, &pItem ) == SFX_ITEM_SET )
840 : {
841 0 : if ( pItem->ISA(SfxStringItem) )
842 : {
843 0 : OUString aName = ((const SfxStringItem*)pItem)->GetValue();
844 : SCTAB nTab;
845 0 : if (aDocument.GetTable( aName, nTab ))
846 : {
847 0 : if (aDocument.IsScenario(nTab))
848 : {
849 0 : OUString aComment;
850 0 : Color aColor;
851 : sal_uInt16 nFlags;
852 0 : aDocument.GetScenarioData( nTab, aComment, aColor, nFlags );
853 :
854 : // Determine if the Sheet that the Scenario was created on
855 : // is protected. But first we need to find that Sheet.
856 : // Rewind back to the actual sheet.
857 0 : SCTAB nActualTab = nTab;
858 0 : do
859 : {
860 0 : nActualTab--;
861 : }
862 0 : while(aDocument.IsScenario(nActualTab));
863 0 : sal_Bool bSheetProtected = aDocument.IsTabProtected(nActualTab);
864 :
865 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
866 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
867 :
868 0 : AbstractScNewScenarioDlg* pNewDlg = pFact->CreateScNewScenarioDlg(GetActiveDialogParent(), aName, true, bSheetProtected);
869 : OSL_ENSURE(pNewDlg, "Dialog create fail!");
870 0 : pNewDlg->SetScenarioData( aName, aComment, aColor, nFlags );
871 0 : if ( pNewDlg->Execute() == RET_OK )
872 : {
873 0 : pNewDlg->GetScenarioData( aName, aComment, aColor, nFlags );
874 0 : ModifyScenario( nTab, aName, aComment, aColor, nFlags );
875 0 : rReq.Done();
876 : }
877 0 : delete pNewDlg;
878 : }
879 0 : }
880 : }
881 : }
882 : }
883 0 : break;
884 :
885 : case SID_ATTR_YEAR2000 :
886 : {
887 : const SfxPoolItem* pItem;
888 0 : if ( pReqArgs->GetItemState( nSlot, true, &pItem ) == SFX_ITEM_SET )
889 : {
890 0 : if ( pItem->ISA(SfxUInt16Item) )
891 : {
892 0 : sal_uInt16 nY2k = ((SfxUInt16Item*)pItem)->GetValue();
893 : // immer an den DocOptions setzen, damit das auch fuer SO50
894 : // gespeichert wird (und alle Abfragen bisher auch darauf laufen).
895 : // SetDocOptions propagiert das an den NumberFormatter
896 0 : ScDocOptions aDocOpt( aDocument.GetDocOptions() );
897 0 : aDocOpt.SetYear2000( nY2k );
898 0 : aDocument.SetDocOptions( aDocOpt );
899 : // die FormShell soll es mitbekommen
900 0 : ScTabViewShell* pSh = GetBestViewShell();
901 0 : if ( pSh )
902 : {
903 0 : FmFormShell* pFSh = pSh->GetFormShell();
904 0 : if ( pFSh )
905 0 : pFSh->SetY2KState( nY2k );
906 0 : }
907 : }
908 : }
909 : }
910 0 : break;
911 :
912 : #if HAVE_FEATURE_MULTIUSER_ENVIRONMENT
913 : case SID_SHARE_DOC:
914 : {
915 0 : ScViewData* pViewData = GetViewData();
916 0 : if ( !pViewData )
917 : {
918 0 : rReq.Ignore();
919 0 : break;
920 : }
921 :
922 0 : ScShareDocumentDlg aDlg( GetActiveDialogParent(), pViewData );
923 0 : if ( aDlg.Execute() == RET_OK )
924 : {
925 0 : bool bSetShared = aDlg.IsShareDocumentChecked();
926 0 : if ( bSetShared != static_cast< bool >( IsDocShared() ) )
927 : {
928 0 : if ( bSetShared )
929 : {
930 0 : bool bContinue = true;
931 0 : if ( HasName() )
932 : {
933 : QueryBox aBox( GetActiveDialogParent(), WinBits( WB_YES_NO | WB_DEF_YES ),
934 0 : ScGlobal::GetRscString( STR_DOC_WILLBESAVED ) );
935 0 : if ( aBox.Execute() == RET_NO )
936 : {
937 0 : bContinue = false;
938 0 : }
939 : }
940 0 : if ( bContinue )
941 : {
942 0 : EnableSharedSettings( true );
943 :
944 0 : SC_MOD()->SetInSharedDocSaving( true );
945 0 : if ( !SwitchToShared( true, true ) )
946 : {
947 : // TODO/LATER: what should be done in case the switch has failed?
948 : // for example in case the user has cancelled the saveAs operation
949 : }
950 :
951 0 : SC_MOD()->SetInSharedDocSaving( false );
952 :
953 0 : InvalidateName();
954 0 : GetUndoManager()->Clear();
955 :
956 0 : ScTabView* pTabView = dynamic_cast< ScTabView* >( pViewData->GetView() );
957 0 : if ( pTabView )
958 : {
959 0 : pTabView->UpdateLayerLocks();
960 : }
961 : }
962 : }
963 : else
964 : {
965 0 : uno::Reference< frame::XModel > xModel;
966 : try
967 : {
968 : // load shared file
969 0 : xModel.set( LoadSharedDocument(), uno::UNO_QUERY_THROW );
970 0 : uno::Reference< util::XCloseable > xCloseable( xModel, uno::UNO_QUERY_THROW );
971 :
972 : // check if shared flag is set in shared file
973 0 : bool bShared = false;
974 0 : ScModelObj* pDocObj = ScModelObj::getImplementation( xModel );
975 0 : if ( pDocObj )
976 : {
977 0 : ScDocShell* pDocShell = dynamic_cast< ScDocShell* >( pDocObj->GetEmbeddedObject() );
978 0 : if ( pDocShell )
979 : {
980 0 : bShared = pDocShell->HasSharedXMLFlagSet();
981 : }
982 : }
983 :
984 : // #i87870# check if shared status was disabled and enabled again
985 0 : bool bOwnEntry = false;
986 : try
987 : {
988 0 : ::svt::ShareControlFile aControlFile( GetSharedFileURL() );
989 0 : bOwnEntry = aControlFile.HasOwnEntry();
990 : }
991 0 : catch ( uno::Exception& )
992 : {
993 : }
994 :
995 0 : if ( bShared && bOwnEntry )
996 : {
997 0 : uno::Reference< frame::XStorable > xStorable( xModel, uno::UNO_QUERY_THROW );
998 0 : if ( xStorable->isReadonly() )
999 : {
1000 0 : xCloseable->close( sal_True );
1001 :
1002 0 : OUString aUserName( ScGlobal::GetRscString( STR_UNKNOWN_USER ) );
1003 : try
1004 : {
1005 0 : ::svt::DocumentLockFile aLockFile( GetSharedFileURL() );
1006 0 : uno::Sequence< OUString > aData = aLockFile.GetLockData();
1007 0 : if ( aData.getLength() > LOCKFILE_SYSUSERNAME_ID )
1008 : {
1009 0 : if ( !aData[LOCKFILE_OOOUSERNAME_ID].isEmpty() )
1010 : {
1011 0 : aUserName = aData[LOCKFILE_OOOUSERNAME_ID];
1012 : }
1013 0 : else if ( !aData[LOCKFILE_SYSUSERNAME_ID].isEmpty() )
1014 : {
1015 0 : aUserName = aData[LOCKFILE_SYSUSERNAME_ID];
1016 : }
1017 0 : }
1018 : }
1019 0 : catch ( uno::Exception& )
1020 : {
1021 : }
1022 0 : OUString aMessage( ScGlobal::GetRscString( STR_FILE_LOCKED_TRY_LATER ) );
1023 0 : aMessage = aMessage.replaceFirst( "%1", aUserName );
1024 :
1025 0 : WarningBox aBox( GetActiveDialogParent(), WinBits( WB_OK ), aMessage );
1026 0 : aBox.Execute();
1027 : }
1028 : else
1029 : {
1030 : WarningBox aBox( GetActiveDialogParent(), WinBits( WB_YES_NO | WB_DEF_YES ),
1031 0 : ScGlobal::GetRscString( STR_DOC_DISABLESHARED ) );
1032 0 : if ( aBox.Execute() == RET_YES )
1033 : {
1034 0 : xCloseable->close( sal_True );
1035 :
1036 0 : if ( !SwitchToShared( false, true ) )
1037 : {
1038 : // TODO/LATER: what should be done in case the switch has failed?
1039 : // for example in case the user has cancelled the saveAs operation
1040 : }
1041 :
1042 0 : EnableSharedSettings( false );
1043 :
1044 0 : if ( pBindings )
1045 : {
1046 0 : pBindings->ExecuteSynchron( SID_SAVEDOC );
1047 : }
1048 :
1049 0 : ScTabView* pTabView = dynamic_cast< ScTabView* >( pViewData->GetView() );
1050 0 : if ( pTabView )
1051 : {
1052 0 : pTabView->UpdateLayerLocks();
1053 : }
1054 : }
1055 : else
1056 : {
1057 0 : xCloseable->close( sal_True );
1058 0 : }
1059 0 : }
1060 : }
1061 : else
1062 : {
1063 0 : xCloseable->close( sal_True );
1064 : WarningBox aBox( GetActiveDialogParent(), WinBits( WB_OK ),
1065 0 : ScGlobal::GetRscString( STR_DOC_NOLONGERSHARED ) );
1066 0 : aBox.Execute();
1067 0 : }
1068 : }
1069 0 : catch ( uno::Exception& )
1070 : {
1071 : OSL_FAIL( "SID_SHARE_DOC: caught exception\n" );
1072 0 : SC_MOD()->SetInSharedDocSaving( false );
1073 :
1074 : try
1075 : {
1076 0 : uno::Reference< util::XCloseable > xClose( xModel, uno::UNO_QUERY_THROW );
1077 0 : xClose->close( sal_True );
1078 : }
1079 0 : catch ( uno::Exception& )
1080 : {
1081 : }
1082 0 : }
1083 : }
1084 : }
1085 : }
1086 0 : rReq.Done();
1087 : }
1088 0 : break;
1089 : #endif
1090 : case SID_OPEN_CALC:
1091 : {
1092 0 : SfxStringItem aApp(SID_DOC_SERVICE, OUString("com.sun.star.sheet.SpreadsheetDocument"));
1093 0 : SfxStringItem aTarget(SID_TARGETNAME, OUString("_blank"));
1094 0 : GetViewData()->GetDispatcher().Execute(
1095 0 : SID_OPENDOC, SFX_CALLMODE_API|SFX_CALLMODE_SYNCHRON, &aApp, &aTarget, 0L);
1096 : }
1097 0 : break;
1098 : default:
1099 : {
1100 : // kleiner (?) Hack -> forward der Slots an TabViewShell
1101 0 : ScTabViewShell* pSh = GetBestViewShell();
1102 0 : if ( pSh )
1103 0 : pSh->Execute( rReq );
1104 : #ifndef DISABLE_SCRIPTING
1105 : else
1106 0 : SbxBase::SetError( SbxERR_NO_ACTIVE_OBJECT );
1107 : #endif
1108 : }
1109 : }
1110 : }
1111 :
1112 :
1113 0 : void UpdateAcceptChangesDialog()
1114 : {
1115 : // update "accept changes" dialog
1116 : //! notify all views
1117 0 : SfxViewFrame* pViewFrm = SfxViewFrame::Current();
1118 0 : if ( pViewFrm && pViewFrm->HasChildWindow( FID_CHG_ACCEPT ) )
1119 : {
1120 0 : SfxChildWindow* pChild = pViewFrm->GetChildWindow( FID_CHG_ACCEPT );
1121 0 : if ( pChild )
1122 0 : ((ScAcceptChgDlgWrapper*)pChild)->ReInitDlg();
1123 : }
1124 0 : }
1125 :
1126 0 : bool ScDocShell::ExecuteChangeProtectionDialog( Window* _pParent, bool bJustQueryIfProtected )
1127 : {
1128 0 : bool bDone = false;
1129 0 : ScChangeTrack* pChangeTrack = aDocument.GetChangeTrack();
1130 0 : if ( pChangeTrack )
1131 : {
1132 0 : bool bProtected = pChangeTrack->IsProtected();
1133 0 : if ( bJustQueryIfProtected && !bProtected )
1134 0 : return true;
1135 :
1136 0 : OUString aTitle( ScResId( bProtected ? SCSTR_CHG_UNPROTECT : SCSTR_CHG_PROTECT ) );
1137 0 : OUString aText( ScResId( SCSTR_PASSWORD ) );
1138 0 : OUString aPassword;
1139 :
1140 : SfxPasswordDialog* pDlg = new SfxPasswordDialog(
1141 0 : _pParent ? _pParent : GetActiveDialogParent(), &aText );
1142 0 : pDlg->SetText( aTitle );
1143 0 : pDlg->SetMinLen( 1 );
1144 0 : pDlg->SetHelpId( GetStaticInterface()->GetSlot(SID_CHG_PROTECT)->GetCommand() );
1145 0 : pDlg->SetEditHelpId( HID_CHG_PROTECT );
1146 0 : if ( !bProtected )
1147 0 : pDlg->ShowExtras( SHOWEXTRAS_CONFIRM );
1148 0 : if ( pDlg->Execute() == RET_OK )
1149 0 : aPassword = pDlg->GetPassword();
1150 0 : delete pDlg;
1151 :
1152 0 : if (!aPassword.isEmpty())
1153 : {
1154 0 : if ( bProtected )
1155 : {
1156 0 : if ( SvPasswordHelper::CompareHashPassword(pChangeTrack->GetProtection(), aPassword) )
1157 : {
1158 0 : if ( bJustQueryIfProtected )
1159 0 : bDone = true;
1160 : else
1161 : pChangeTrack->SetProtection(
1162 0 : com::sun::star::uno::Sequence< sal_Int8 > (0) );
1163 : }
1164 : else
1165 : {
1166 : InfoBox aBox( GetActiveDialogParent(),
1167 0 : OUString( ScResId( SCSTR_WRONGPASSWORD ) ) );
1168 0 : aBox.Execute();
1169 : }
1170 : }
1171 : else
1172 : {
1173 0 : com::sun::star::uno::Sequence< sal_Int8 > aPass;
1174 0 : SvPasswordHelper::GetHashPassword( aPass, aPassword );
1175 0 : pChangeTrack->SetProtection( aPass );
1176 : }
1177 0 : if ( bProtected != pChangeTrack->IsProtected() )
1178 : {
1179 0 : UpdateAcceptChangesDialog();
1180 0 : bDone = true;
1181 : }
1182 0 : }
1183 : }
1184 0 : else if ( bJustQueryIfProtected )
1185 0 : bDone = true;
1186 0 : return bDone;
1187 : }
1188 :
1189 :
1190 0 : void ScDocShell::DoRecalc( bool bApi )
1191 : {
1192 0 : bool bDone = false;
1193 0 : ScTabViewShell* pSh = GetBestViewShell();
1194 0 : if ( pSh )
1195 : {
1196 0 : ScInputHandler* pHdl = SC_MOD()->GetInputHdl(pSh);
1197 0 : if ( pHdl && pHdl->IsInputMode() && pHdl->IsFormulaMode() && !bApi )
1198 : {
1199 0 : pHdl->FormulaPreview(); // Teilergebnis als QuickHelp
1200 0 : bDone = true;
1201 : }
1202 : else
1203 : {
1204 0 : pSh->UpdateInputLine(); // InputEnterHandler
1205 0 : pSh->UpdateInputHandler();
1206 : }
1207 : }
1208 0 : if (!bDone) // sonst Dokument neu berechnen
1209 : {
1210 0 : WaitObject aWaitObj( GetActiveDialogParent() );
1211 0 : aDocument.CalcFormulaTree();
1212 0 : if ( pSh )
1213 0 : pSh->UpdateCharts(true);
1214 :
1215 0 : aDocument.BroadcastUno( SfxSimpleHint( SFX_HINT_DATACHANGED ) );
1216 :
1217 : // Wenn es Charts gibt, dann alles painten, damit nicht
1218 : // PostDataChanged und die Charts nacheinander kommen und Teile
1219 : // doppelt gepainted werden.
1220 :
1221 0 : ScChartListenerCollection* pCharts = aDocument.GetChartListenerCollection();
1222 0 : if ( pCharts && pCharts->hasListeners() )
1223 0 : PostPaintGridAll();
1224 : else
1225 0 : PostDataChanged();
1226 : }
1227 0 : }
1228 :
1229 0 : void ScDocShell::DoHardRecalc( bool /* bApi */ )
1230 : {
1231 0 : WaitObject aWaitObj( GetActiveDialogParent() );
1232 0 : ScTabViewShell* pSh = GetBestViewShell();
1233 0 : if ( pSh )
1234 : {
1235 0 : pSh->UpdateInputLine(); // InputEnterHandler
1236 0 : pSh->UpdateInputHandler();
1237 : }
1238 0 : aDocument.CalcAll();
1239 0 : GetDocFunc().DetectiveRefresh(); // erzeugt eigenes Undo
1240 0 : if ( pSh )
1241 0 : pSh->UpdateCharts(true);
1242 :
1243 : // set notification flags for "calculate" event (used in SFX_HINT_DATACHANGED broadcast)
1244 : // (might check for the presence of any formulas on each sheet)
1245 0 : SCTAB nTabCount = aDocument.GetTableCount();
1246 : SCTAB nTab;
1247 0 : if (aDocument.HasAnySheetEventScript( SC_SHEETEVENT_CALCULATE, true )) // search also for VBA hendler
1248 0 : for (nTab=0; nTab<nTabCount; nTab++)
1249 0 : aDocument.SetCalcNotification(nTab);
1250 :
1251 : // CalcAll doesn't broadcast value changes, so SC_HINT_CALCALL is broadcasted globally
1252 : // in addition to SFX_HINT_DATACHANGED.
1253 0 : aDocument.BroadcastUno( SfxSimpleHint( SC_HINT_CALCALL ) );
1254 0 : aDocument.BroadcastUno( SfxSimpleHint( SFX_HINT_DATACHANGED ) );
1255 :
1256 : // use hard recalc also to disable stream-copying of all sheets
1257 : // (somewhat consistent with charts)
1258 0 : for (nTab=0; nTab<nTabCount; nTab++)
1259 0 : if (aDocument.IsStreamValid(nTab))
1260 0 : aDocument.SetStreamValid(nTab, false);
1261 :
1262 0 : PostPaintGridAll();
1263 0 : }
1264 :
1265 0 : void ScDocShell::DoAutoStyle( const ScRange& rRange, const OUString& rStyle )
1266 : {
1267 0 : ScStyleSheetPool* pStylePool = aDocument.GetStyleSheetPool();
1268 : ScStyleSheet* pStyleSheet =
1269 0 : pStylePool->FindCaseIns( rStyle, SFX_STYLE_FAMILY_PARA );
1270 0 : if (!pStyleSheet)
1271 : pStyleSheet = (ScStyleSheet*)
1272 0 : pStylePool->Find( ScGlobal::GetRscString(STR_STYLENAME_STANDARD), SFX_STYLE_FAMILY_PARA );
1273 0 : if (pStyleSheet)
1274 : {
1275 : OSL_ENSURE(rRange.aStart.Tab() == rRange.aEnd.Tab(),
1276 : "DoAutoStyle mit mehreren Tabellen");
1277 0 : SCTAB nTab = rRange.aStart.Tab();
1278 0 : SCCOL nStartCol = rRange.aStart.Col();
1279 0 : SCROW nStartRow = rRange.aStart.Row();
1280 0 : SCCOL nEndCol = rRange.aEnd.Col();
1281 0 : SCROW nEndRow = rRange.aEnd.Row();
1282 0 : aDocument.ApplyStyleAreaTab( nStartCol, nStartRow, nEndCol, nEndRow, nTab, *pStyleSheet );
1283 0 : aDocument.ExtendMerge( nStartCol, nStartRow, nEndCol, nEndRow, nTab );
1284 0 : PostPaint( nStartCol, nStartRow, nTab, nEndCol, nEndRow, nTab, PAINT_GRID );
1285 : }
1286 0 : }
1287 :
1288 0 : void ScDocShell::NotifyStyle( const SfxStyleSheetHint& rHint )
1289 : {
1290 0 : sal_uInt16 nId = rHint.GetHint();
1291 0 : const SfxStyleSheetBase* pStyle = rHint.GetStyleSheet();
1292 0 : if (!pStyle)
1293 0 : return;
1294 :
1295 0 : if ( pStyle->GetFamily() == SFX_STYLE_FAMILY_PAGE )
1296 : {
1297 0 : if ( nId == SFX_STYLESHEET_MODIFIED )
1298 : {
1299 0 : ScDocShellModificator aModificator( *this );
1300 :
1301 0 : OUString aNewName = pStyle->GetName();
1302 0 : OUString aOldName = aNewName;
1303 0 : sal_Bool bExtended = rHint.ISA(SfxStyleSheetHintExtended); // Name geaendert?
1304 0 : if (bExtended)
1305 0 : aOldName = ((SfxStyleSheetHintExtended&)rHint).GetOldName();
1306 :
1307 0 : if ( aNewName != aOldName )
1308 0 : aDocument.RenamePageStyleInUse( aOldName, aNewName );
1309 :
1310 0 : SCTAB nTabCount = aDocument.GetTableCount();
1311 0 : for (SCTAB nTab=0; nTab<nTabCount; nTab++)
1312 0 : if (aDocument.GetPageStyle(nTab) == aNewName) // schon auf neu angepasst
1313 : {
1314 0 : aDocument.PageStyleModified( nTab, aNewName );
1315 0 : ScPrintFunc aPrintFunc( this, GetPrinter(), nTab );
1316 0 : aPrintFunc.UpdatePages();
1317 : }
1318 :
1319 0 : aModificator.SetDocumentModified();
1320 :
1321 0 : if (bExtended)
1322 : {
1323 0 : SfxBindings* pBindings = GetViewBindings();
1324 0 : if (pBindings)
1325 : {
1326 0 : pBindings->Invalidate( SID_STATUS_PAGESTYLE );
1327 0 : pBindings->Invalidate( SID_STYLE_FAMILY4 );
1328 0 : pBindings->Invalidate( FID_RESET_PRINTZOOM );
1329 0 : pBindings->Invalidate( SID_ATTR_PARA_LEFT_TO_RIGHT );
1330 0 : pBindings->Invalidate( SID_ATTR_PARA_RIGHT_TO_LEFT );
1331 : }
1332 0 : }
1333 : }
1334 : }
1335 0 : else if ( pStyle->GetFamily() == SFX_STYLE_FAMILY_PARA )
1336 : {
1337 0 : if ( nId == SFX_STYLESHEET_MODIFIED)
1338 : {
1339 0 : OUString aNewName = pStyle->GetName();
1340 0 : OUString aOldName = aNewName;
1341 0 : sal_Bool bExtended = rHint.ISA(SfxStyleSheetHintExtended);
1342 0 : if (bExtended)
1343 0 : aOldName = ((SfxStyleSheetHintExtended&)rHint).GetOldName();
1344 0 : if ( aNewName != aOldName )
1345 : {
1346 0 : for(SCTAB i = 0; i < aDocument.GetTableCount(); ++i)
1347 : {
1348 0 : ScConditionalFormatList* pList = aDocument.GetCondFormList(i);
1349 0 : if (pList)
1350 0 : pList->RenameCellStyle( aOldName,aNewName );
1351 : }
1352 0 : }
1353 : }
1354 : }
1355 :
1356 : // alles andere geht ueber Slots...
1357 : }
1358 :
1359 : // wie in printfun.cxx
1360 : #define ZOOM_MIN 10
1361 :
1362 0 : void ScDocShell::SetPrintZoom( SCTAB nTab, sal_uInt16 nScale, sal_uInt16 nPages )
1363 : {
1364 0 : sal_Bool bUndo(aDocument.IsUndoEnabled());
1365 0 : OUString aStyleName = aDocument.GetPageStyle( nTab );
1366 0 : ScStyleSheetPool* pStylePool = aDocument.GetStyleSheetPool();
1367 0 : SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aStyleName, SFX_STYLE_FAMILY_PAGE );
1368 : OSL_ENSURE( pStyleSheet, "PageStyle not found" );
1369 0 : if ( pStyleSheet )
1370 : {
1371 0 : ScDocShellModificator aModificator( *this );
1372 :
1373 0 : SfxItemSet& rSet = pStyleSheet->GetItemSet();
1374 0 : if (bUndo)
1375 : {
1376 0 : sal_uInt16 nOldScale = ((const SfxUInt16Item&)rSet.Get(ATTR_PAGE_SCALE)).GetValue();
1377 0 : sal_uInt16 nOldPages = ((const SfxUInt16Item&)rSet.Get(ATTR_PAGE_SCALETOPAGES)).GetValue();
1378 0 : GetUndoManager()->AddUndoAction( new ScUndoPrintZoom(
1379 0 : this, nTab, nOldScale, nOldPages, nScale, nPages ) );
1380 : }
1381 :
1382 0 : rSet.Put( SfxUInt16Item( ATTR_PAGE_SCALE, nScale ) );
1383 0 : rSet.Put( SfxUInt16Item( ATTR_PAGE_SCALETOPAGES, nPages ) );
1384 :
1385 0 : ScPrintFunc aPrintFunc( this, GetPrinter(), nTab );
1386 0 : aPrintFunc.UpdatePages();
1387 0 : aModificator.SetDocumentModified();
1388 :
1389 0 : SfxBindings* pBindings = GetViewBindings();
1390 0 : if (pBindings)
1391 0 : pBindings->Invalidate( FID_RESET_PRINTZOOM );
1392 0 : }
1393 0 : }
1394 :
1395 0 : bool ScDocShell::AdjustPrintZoom( const ScRange& rRange )
1396 : {
1397 0 : bool bChange = false;
1398 0 : SCTAB nTab = rRange.aStart.Tab();
1399 :
1400 0 : OUString aStyleName = aDocument.GetPageStyle( nTab );
1401 0 : ScStyleSheetPool* pStylePool = aDocument.GetStyleSheetPool();
1402 0 : SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aStyleName, SFX_STYLE_FAMILY_PAGE );
1403 : OSL_ENSURE( pStyleSheet, "PageStyle not found" );
1404 0 : if ( pStyleSheet )
1405 : {
1406 0 : SfxItemSet& rSet = pStyleSheet->GetItemSet();
1407 0 : sal_Bool bHeaders = ((const SfxBoolItem&)rSet.Get(ATTR_PAGE_HEADERS)).GetValue();
1408 0 : sal_uInt16 nOldScale = ((const SfxUInt16Item&)rSet.Get(ATTR_PAGE_SCALE)).GetValue();
1409 0 : sal_uInt16 nOldPages = ((const SfxUInt16Item&)rSet.Get(ATTR_PAGE_SCALETOPAGES)).GetValue();
1410 0 : const ScRange* pRepeatCol = aDocument.GetRepeatColRange( nTab );
1411 0 : const ScRange* pRepeatRow = aDocument.GetRepeatRowRange( nTab );
1412 :
1413 : // benoetigte Skalierung fuer Selektion ausrechnen
1414 :
1415 0 : sal_uInt16 nNewScale = nOldScale;
1416 :
1417 0 : long nBlkTwipsX = 0;
1418 0 : if (bHeaders)
1419 0 : nBlkTwipsX += (long) PRINT_HEADER_WIDTH;
1420 0 : SCCOL nStartCol = rRange.aStart.Col();
1421 0 : SCCOL nEndCol = rRange.aEnd.Col();
1422 0 : if ( pRepeatCol && nStartCol >= pRepeatCol->aStart.Col() )
1423 : {
1424 0 : for (SCCOL i=pRepeatCol->aStart.Col(); i<=pRepeatCol->aEnd.Col(); i++ )
1425 0 : nBlkTwipsX += aDocument.GetColWidth( i, nTab );
1426 0 : if ( nStartCol <= pRepeatCol->aEnd.Col() )
1427 0 : nStartCol = pRepeatCol->aEnd.Col() + 1;
1428 : }
1429 : // legacy compilers' own scope for i
1430 : {
1431 0 : for ( SCCOL i=nStartCol; i<=nEndCol; i++ )
1432 0 : nBlkTwipsX += aDocument.GetColWidth( i, nTab );
1433 : }
1434 :
1435 0 : long nBlkTwipsY = 0;
1436 0 : if (bHeaders)
1437 0 : nBlkTwipsY += (long) PRINT_HEADER_HEIGHT;
1438 0 : SCROW nStartRow = rRange.aStart.Row();
1439 0 : SCROW nEndRow = rRange.aEnd.Row();
1440 0 : if ( pRepeatRow && nStartRow >= pRepeatRow->aStart.Row() )
1441 : {
1442 : nBlkTwipsY += aDocument.GetRowHeight( pRepeatRow->aStart.Row(),
1443 0 : pRepeatRow->aEnd.Row(), nTab );
1444 0 : if ( nStartRow <= pRepeatRow->aEnd.Row() )
1445 0 : nStartRow = pRepeatRow->aEnd.Row() + 1;
1446 : }
1447 0 : nBlkTwipsY += aDocument.GetRowHeight( nStartRow, nEndRow, nTab );
1448 :
1449 0 : Size aPhysPage;
1450 : long nHdr, nFtr;
1451 0 : ScPrintFunc aOldPrFunc( this, GetPrinter(), nTab );
1452 0 : aOldPrFunc.GetScaleData( aPhysPage, nHdr, nFtr );
1453 0 : nBlkTwipsY += nHdr + nFtr;
1454 :
1455 0 : if ( nBlkTwipsX == 0 ) // hidden columns/rows may lead to 0
1456 0 : nBlkTwipsX = 1;
1457 0 : if ( nBlkTwipsY == 0 )
1458 0 : nBlkTwipsY = 1;
1459 :
1460 0 : long nNeeded = std::min( aPhysPage.Width() * 100 / nBlkTwipsX,
1461 0 : aPhysPage.Height() * 100 / nBlkTwipsY );
1462 0 : if ( nNeeded < ZOOM_MIN )
1463 0 : nNeeded = ZOOM_MIN; // Begrenzung
1464 0 : if ( nNeeded < (long) nNewScale )
1465 0 : nNewScale = (sal_uInt16) nNeeded;
1466 :
1467 0 : bChange = ( nNewScale != nOldScale || nOldPages != 0 );
1468 0 : if ( bChange )
1469 0 : SetPrintZoom( nTab, nNewScale, 0 );
1470 : }
1471 0 : return bChange;
1472 : }
1473 :
1474 0 : void ScDocShell::PageStyleModified( const OUString& rStyleName, bool bApi )
1475 : {
1476 0 : ScDocShellModificator aModificator( *this );
1477 :
1478 0 : sal_Bool bWarn = false;
1479 :
1480 0 : SCTAB nTabCount = aDocument.GetTableCount();
1481 0 : SCTAB nUseTab = MAXTAB+1;
1482 0 : for (SCTAB nTab=0; nTab<nTabCount && nUseTab>MAXTAB; nTab++)
1483 0 : if ( aDocument.GetPageStyle(nTab) == rStyleName &&
1484 0 : ( !bApi || aDocument.GetPageSize(nTab).Width() ) )
1485 0 : nUseTab = nTab;
1486 : // bei bApi nur, wenn Umbrueche schon angezeigt
1487 :
1488 0 : if (ValidTab(nUseTab)) // nicht verwendet -> nichts zu tun
1489 : {
1490 0 : ScPrintFunc aPrintFunc( this, GetPrinter(), nUseTab ); //! ohne CountPages auskommen
1491 0 : if (!aPrintFunc.UpdatePages()) // setzt Umbrueche auf allen Tabs
1492 0 : bWarn = sal_True;
1493 :
1494 0 : if (bWarn && !bApi)
1495 : {
1496 0 : ScWaitCursorOff aWaitOff( GetActiveDialogParent() );
1497 : InfoBox aInfoBox(GetActiveDialogParent(),
1498 0 : ScGlobal::GetRscString(STR_PRINT_INVALID_AREA));
1499 0 : aInfoBox.Execute();
1500 0 : }
1501 : }
1502 :
1503 0 : aModificator.SetDocumentModified();
1504 :
1505 0 : SfxBindings* pBindings = GetViewBindings();
1506 0 : if (pBindings)
1507 : {
1508 0 : pBindings->Invalidate( FID_RESET_PRINTZOOM );
1509 0 : pBindings->Invalidate( SID_ATTR_PARA_LEFT_TO_RIGHT );
1510 0 : pBindings->Invalidate( SID_ATTR_PARA_RIGHT_TO_LEFT );
1511 0 : }
1512 0 : }
1513 :
1514 0 : void ScDocShell::ExecutePageStyle( SfxViewShell& rCaller,
1515 : SfxRequest& rReq,
1516 : SCTAB nCurTab )
1517 : {
1518 0 : const SfxItemSet* pReqArgs = rReq.GetArgs();
1519 :
1520 0 : switch ( rReq.GetSlot() )
1521 : {
1522 : case SID_STATUS_PAGESTYLE: // Click auf StatusBar-Control
1523 : case SID_FORMATPAGE:
1524 : {
1525 0 : if ( pReqArgs != NULL )
1526 : {
1527 : }
1528 0 : else if ( pReqArgs == NULL )
1529 : {
1530 0 : sal_Bool bUndo(aDocument.IsUndoEnabled());
1531 0 : OUString aOldName = aDocument.GetPageStyle( nCurTab );
1532 0 : ScStyleSheetPool* pStylePool = aDocument.GetStyleSheetPool();
1533 : SfxStyleSheetBase* pStyleSheet
1534 0 : = pStylePool->Find( aOldName, SFX_STYLE_FAMILY_PAGE );
1535 :
1536 : OSL_ENSURE( pStyleSheet, "PageStyle not found! :-/" );
1537 :
1538 0 : if ( pStyleSheet )
1539 : {
1540 0 : ScStyleSaveData aOldData;
1541 0 : if (bUndo)
1542 0 : aOldData.InitFromStyle( pStyleSheet );
1543 :
1544 0 : SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
1545 :
1546 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
1547 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
1548 :
1549 0 : SfxAbstractTabDialog* pDlg = pFact->CreateScStyleDlg( GetActiveDialogParent(), *pStyleSheet, RID_SCDLG_STYLES_PAGE, RID_SCDLG_STYLES_PAGE );
1550 : OSL_ENSURE(pDlg, "Dialog create fail!");
1551 :
1552 0 : if ( pDlg->Execute() == RET_OK )
1553 : {
1554 0 : const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
1555 :
1556 0 : WaitObject aWait( GetActiveDialogParent() );
1557 :
1558 0 : OUString aNewName = pStyleSheet->GetName();
1559 0 : if ( aNewName != aOldName &&
1560 0 : aDocument.RenamePageStyleInUse( aOldName, aNewName ) )
1561 : {
1562 0 : SfxBindings* pBindings = GetViewBindings();
1563 0 : if (pBindings)
1564 : {
1565 0 : pBindings->Invalidate( SID_STATUS_PAGESTYLE );
1566 0 : pBindings->Invalidate( FID_RESET_PRINTZOOM );
1567 : }
1568 : }
1569 :
1570 0 : if ( pOutSet )
1571 0 : aDocument.ModifyStyleSheet( *pStyleSheet, *pOutSet );
1572 :
1573 : // merken fuer GetState():
1574 0 : GetPageOnFromPageStyleSet( &rStyleSet, nCurTab, bHeaderOn, bFooterOn );
1575 0 : rCaller.GetViewFrame()->GetBindings().Invalidate( SID_HFEDIT );
1576 :
1577 0 : ScStyleSaveData aNewData;
1578 0 : aNewData.InitFromStyle( pStyleSheet );
1579 0 : if (bUndo)
1580 : {
1581 0 : GetUndoManager()->AddUndoAction(
1582 : new ScUndoModifyStyle( this, SFX_STYLE_FAMILY_PAGE,
1583 0 : aOldData, aNewData ) );
1584 : }
1585 :
1586 0 : PageStyleModified( aNewName, false );
1587 0 : rReq.Done();
1588 : }
1589 0 : delete pDlg;
1590 :
1591 0 : rStyleSet.ClearItem( ATTR_PAGE_PAPERTRAY );
1592 0 : }
1593 : }
1594 : }
1595 0 : break;
1596 :
1597 : case SID_HFEDIT:
1598 : {
1599 0 : if ( pReqArgs != NULL )
1600 : {
1601 : }
1602 0 : else if ( pReqArgs == NULL )
1603 : {
1604 0 : OUString aStr( aDocument.GetPageStyle( nCurTab ) );
1605 :
1606 : ScStyleSheetPool* pStylePool
1607 0 : = aDocument.GetStyleSheetPool();
1608 :
1609 : SfxStyleSheetBase* pStyleSheet
1610 0 : = pStylePool->Find( aStr, SFX_STYLE_FAMILY_PAGE );
1611 :
1612 : OSL_ENSURE( pStyleSheet, "PageStyle not found! :-/" );
1613 :
1614 0 : if ( pStyleSheet )
1615 : {
1616 0 : SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
1617 :
1618 : SvxPageUsage eUsage =
1619 : SvxPageUsage( ((const SvxPageItem&)
1620 0 : rStyleSet.Get( ATTR_PAGE )).
1621 0 : GetPageUsage() );
1622 0 : sal_Bool bShareHeader = IS_SHARE_HEADER(rStyleSet);
1623 0 : sal_Bool bShareFooter = IS_SHARE_FOOTER(rStyleSet);
1624 0 : sal_uInt16 nResId = 0;
1625 :
1626 0 : switch ( eUsage )
1627 : {
1628 : case SVX_PAGE_LEFT:
1629 : case SVX_PAGE_RIGHT:
1630 : {
1631 0 : if ( bHeaderOn && bFooterOn )
1632 0 : nResId = RID_SCDLG_HFEDIT;
1633 0 : else if ( SVX_PAGE_RIGHT == eUsage )
1634 : {
1635 0 : if ( !bHeaderOn && bFooterOn )
1636 0 : nResId = RID_SCDLG_HFEDIT_RIGHTFOOTER;
1637 0 : else if ( bHeaderOn && !bFooterOn )
1638 0 : nResId = RID_SCDLG_HFEDIT_RIGHTHEADER;
1639 : }
1640 : else
1641 : {
1642 : // #69193a# respect "shared" setting
1643 0 : if ( !bHeaderOn && bFooterOn )
1644 : nResId = bShareFooter ?
1645 : RID_SCDLG_HFEDIT_RIGHTFOOTER :
1646 0 : RID_SCDLG_HFEDIT_LEFTFOOTER;
1647 0 : else if ( bHeaderOn && !bFooterOn )
1648 : nResId = bShareHeader ?
1649 : RID_SCDLG_HFEDIT_RIGHTHEADER :
1650 0 : RID_SCDLG_HFEDIT_LEFTHEADER;
1651 : }
1652 : }
1653 0 : break;
1654 :
1655 : case SVX_PAGE_MIRROR:
1656 : case SVX_PAGE_ALL:
1657 : default:
1658 : {
1659 0 : if ( !bShareHeader && !bShareFooter )
1660 : {
1661 0 : if ( bHeaderOn && bFooterOn )
1662 0 : nResId = RID_SCDLG_HFEDIT_ALL;
1663 0 : else if ( !bHeaderOn && bFooterOn )
1664 0 : nResId = RID_SCDLG_HFEDIT_FOOTER;
1665 0 : else if ( bHeaderOn && !bFooterOn )
1666 0 : nResId = RID_SCDLG_HFEDIT_HEADER;
1667 : }
1668 0 : else if ( bShareHeader && bShareFooter )
1669 : {
1670 0 : if ( bHeaderOn && bFooterOn )
1671 0 : nResId = RID_SCDLG_HFEDIT;
1672 : else
1673 : {
1674 0 : if ( !bHeaderOn && bFooterOn )
1675 0 : nResId = RID_SCDLG_HFEDIT_RIGHTFOOTER;
1676 0 : else if ( bHeaderOn && !bFooterOn )
1677 0 : nResId = RID_SCDLG_HFEDIT_RIGHTHEADER;
1678 : }
1679 : }
1680 0 : else if ( !bShareHeader && bShareFooter )
1681 : {
1682 0 : if ( bHeaderOn && bFooterOn )
1683 0 : nResId = RID_SCDLG_HFEDIT_SFTR;
1684 0 : else if ( !bHeaderOn && bFooterOn )
1685 0 : nResId = RID_SCDLG_HFEDIT_RIGHTFOOTER;
1686 0 : else if ( bHeaderOn && !bFooterOn )
1687 0 : nResId = RID_SCDLG_HFEDIT_HEADER;
1688 : }
1689 0 : else if ( bShareHeader && !bShareFooter )
1690 : {
1691 0 : if ( bHeaderOn && bFooterOn )
1692 0 : nResId = RID_SCDLG_HFEDIT_SHDR;
1693 0 : else if ( !bHeaderOn && bFooterOn )
1694 0 : nResId = RID_SCDLG_HFEDIT_FOOTER;
1695 0 : else if ( bHeaderOn && !bFooterOn )
1696 0 : nResId = RID_SCDLG_HFEDIT_RIGHTHEADER;
1697 : }
1698 : }
1699 : }
1700 :
1701 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
1702 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
1703 :
1704 : SfxAbstractTabDialog* pDlg = pFact->CreateScHFEditDlg( SfxViewFrame::Current(),
1705 : GetActiveDialogParent(),
1706 : rStyleSet,
1707 : aStr,
1708 0 : nResId);
1709 : OSL_ENSURE(pDlg, "Dialog create fail!");
1710 0 : if ( pDlg->Execute() == RET_OK )
1711 : {
1712 0 : const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
1713 :
1714 0 : if ( pOutSet )
1715 0 : aDocument.ModifyStyleSheet( *pStyleSheet, *pOutSet );
1716 :
1717 0 : SetDocumentModified();
1718 0 : rReq.Done();
1719 : }
1720 0 : delete pDlg;
1721 0 : }
1722 : }
1723 : }
1724 0 : break;
1725 :
1726 : default:
1727 0 : break;
1728 : }
1729 0 : }
1730 :
1731 0 : void ScDocShell::GetStatePageStyle( SfxViewShell& /* rCaller */,
1732 : SfxItemSet& rSet,
1733 : SCTAB nCurTab )
1734 : {
1735 0 : SfxWhichIter aIter(rSet);
1736 0 : sal_uInt16 nWhich = aIter.FirstWhich();
1737 0 : while ( nWhich )
1738 : {
1739 0 : switch (nWhich)
1740 : {
1741 : case SID_STATUS_PAGESTYLE:
1742 0 : rSet.Put( SfxStringItem( nWhich, aDocument.GetPageStyle( nCurTab ) ) );
1743 0 : break;
1744 :
1745 : case SID_HFEDIT:
1746 : {
1747 0 : OUString aStr = aDocument.GetPageStyle( nCurTab );
1748 0 : ScStyleSheetPool* pStylePool = aDocument.GetStyleSheetPool();
1749 0 : SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aStr, SFX_STYLE_FAMILY_PAGE );
1750 :
1751 : OSL_ENSURE( pStyleSheet, "PageStyle not found! :-/" );
1752 :
1753 0 : if ( pStyleSheet )
1754 : {
1755 0 : SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
1756 0 : GetPageOnFromPageStyleSet( &rStyleSet, nCurTab, bHeaderOn, bFooterOn );
1757 :
1758 0 : if ( !bHeaderOn && !bFooterOn )
1759 0 : rSet.DisableItem( nWhich );
1760 0 : }
1761 : }
1762 0 : break;
1763 : }
1764 :
1765 0 : nWhich = aIter.NextWhich();
1766 0 : }
1767 0 : }
1768 :
1769 0 : void ScDocShell::GetState( SfxItemSet &rSet )
1770 : {
1771 0 : bool bTabView = GetBestViewShell(true) != NULL;
1772 :
1773 0 : SfxWhichIter aIter(rSet);
1774 0 : for (sal_uInt16 nWhich = aIter.FirstWhich(); nWhich; nWhich = aIter.NextWhich())
1775 : {
1776 0 : if (!bTabView)
1777 : {
1778 0 : rSet.DisableItem(nWhich);
1779 0 : continue;
1780 : }
1781 :
1782 0 : switch (nWhich)
1783 : {
1784 : case FID_AUTO_CALC:
1785 0 : if ( aDocument.GetHardRecalcState() )
1786 0 : rSet.DisableItem( nWhich );
1787 : else
1788 0 : rSet.Put( SfxBoolItem( nWhich, aDocument.GetAutoCalc() ) );
1789 0 : break;
1790 :
1791 : case FID_CHG_RECORD:
1792 0 : if ( IsDocShared() )
1793 0 : rSet.DisableItem( nWhich );
1794 : else
1795 : rSet.Put( SfxBoolItem( nWhich,
1796 0 : aDocument.GetChangeTrack() != NULL ) );
1797 0 : break;
1798 :
1799 : case SID_CHG_PROTECT:
1800 : {
1801 0 : ScChangeTrack* pChangeTrack = aDocument.GetChangeTrack();
1802 0 : if ( pChangeTrack && !IsDocShared() )
1803 : rSet.Put( SfxBoolItem( nWhich,
1804 0 : pChangeTrack->IsProtected() ) );
1805 : else
1806 0 : rSet.DisableItem( nWhich );
1807 : }
1808 0 : break;
1809 :
1810 : case SID_DOCUMENT_COMPARE:
1811 : {
1812 0 : if ( IsDocShared() )
1813 : {
1814 0 : rSet.DisableItem( nWhich );
1815 : }
1816 : }
1817 0 : break;
1818 :
1819 : // Wenn eine Formel editiert wird, muss FID_RECALC auf jeden Fall enabled sein.
1820 : // Recalc fuer das Doc war mal wegen eines Bugs disabled, wenn AutoCalc an war,
1821 : // ist jetzt wegen eines anderen Bugs aber auch immer enabled.
1822 :
1823 : case SID_TABLES_COUNT:
1824 0 : rSet.Put( SfxInt16Item( nWhich, aDocument.GetTableCount() ) );
1825 0 : break;
1826 :
1827 : case SID_ATTR_YEAR2000 :
1828 : rSet.Put( SfxUInt16Item( nWhich,
1829 0 : aDocument.GetDocOptions().GetYear2000() ) );
1830 0 : break;
1831 :
1832 : case SID_SHARE_DOC:
1833 : {
1834 0 : if ( IsReadOnly() )
1835 : {
1836 0 : rSet.DisableItem( nWhich );
1837 : }
1838 : }
1839 0 : break;
1840 :
1841 : default:
1842 : {
1843 : }
1844 0 : break;
1845 : }
1846 0 : }
1847 0 : }
1848 :
1849 0 : void ScDocShell::GetSbxState( SfxItemSet &rSet )
1850 : {
1851 : // SID_SC_SELECTION (Selection),
1852 : // SID_SC_ACTIVECELL (ActiveCell),
1853 : // SID_SC_ACTIVETAB (ActiveTable),
1854 : // SID_TABLES_GET (Tables),
1855 : // SID_PIVOT_GET (DataPilotTables) - removed (old Basic)
1856 :
1857 :
1858 : // Wenn hier Slots von der View-Shell executed werden, muss auch der
1859 : // GetState weitergeleitet werden!
1860 :
1861 :
1862 0 : ScTabViewShell* pVisibleSh = GetBestViewShell(); // sichtbare View
1863 0 : if ( pVisibleSh )
1864 0 : pVisibleSh->GetState( rSet );
1865 0 : }
1866 :
1867 0 : void ScDocShell::Draw( OutputDevice* pDev, const JobSetup & /* rSetup */, sal_uInt16 nAspect )
1868 : {
1869 :
1870 0 : SCTAB nVisTab = aDocument.GetVisibleTab();
1871 0 : if (!aDocument.HasTable(nVisTab))
1872 0 : return;
1873 :
1874 0 : sal_uLong nOldLayoutMode = pDev->GetLayoutMode();
1875 0 : pDev->SetLayoutMode( TEXT_LAYOUT_DEFAULT ); // even if it's the same, to get the metafile action
1876 :
1877 0 : if ( nAspect == ASPECT_THUMBNAIL )
1878 : {
1879 0 : Rectangle aBoundRect = GetVisArea( ASPECT_THUMBNAIL );
1880 0 : ScViewData aTmpData( this, NULL );
1881 0 : aTmpData.SetTabNo(nVisTab);
1882 0 : SnapVisArea( aBoundRect );
1883 0 : aTmpData.SetScreen( aBoundRect );
1884 0 : ScPrintFunc::DrawToDev( &aDocument, pDev, 1.0, aBoundRect, &aTmpData, true );
1885 : }
1886 : else
1887 : {
1888 0 : Rectangle aBoundRect = SfxObjectShell::GetVisArea();
1889 0 : ScViewData aTmpData( this, NULL );
1890 0 : aTmpData.SetTabNo(nVisTab);
1891 0 : SnapVisArea( aBoundRect );
1892 0 : aTmpData.SetScreen( aBoundRect );
1893 0 : ScPrintFunc::DrawToDev( &aDocument, pDev, 1.0, aBoundRect, &aTmpData, true );
1894 : }
1895 :
1896 0 : pDev->SetLayoutMode( nOldLayoutMode );
1897 : }
1898 :
1899 0 : Rectangle ScDocShell::GetVisArea( sal_uInt16 nAspect ) const
1900 : {
1901 0 : SfxObjectCreateMode eShellMode = GetCreateMode();
1902 0 : if ( eShellMode == SFX_CREATE_MODE_ORGANIZER )
1903 : {
1904 : // ohne Inhalte wissen wir auch nicht, wie gross die Inhalte sind
1905 : // leeres Rechteck zurueckgeben, das wird dann nach dem Laden berechnet
1906 0 : return Rectangle();
1907 : }
1908 :
1909 0 : if( nAspect == ASPECT_THUMBNAIL )
1910 : {
1911 0 : Rectangle aArea( 0,0, SC_PREVIEW_SIZE_X,SC_PREVIEW_SIZE_Y );
1912 0 : sal_Bool bNegativePage = aDocument.IsNegativePage( aDocument.GetVisibleTab() );
1913 0 : if ( bNegativePage )
1914 0 : ScDrawLayer::MirrorRectRTL( aArea );
1915 0 : SnapVisArea( aArea );
1916 0 : return aArea;
1917 : }
1918 0 : else if( nAspect == ASPECT_CONTENT && eShellMode != SFX_CREATE_MODE_EMBEDDED )
1919 : {
1920 : // Visarea holen wie nach Load
1921 :
1922 0 : SCTAB nVisTab = aDocument.GetVisibleTab();
1923 0 : if (!aDocument.HasTable(nVisTab))
1924 : {
1925 0 : nVisTab = 0;
1926 0 : ((ScDocShell*)this)->aDocument.SetVisibleTab(nVisTab);
1927 : }
1928 : SCCOL nStartCol;
1929 : SCROW nStartRow;
1930 0 : aDocument.GetDataStart( nVisTab, nStartCol, nStartRow );
1931 : SCCOL nEndCol;
1932 : SCROW nEndRow;
1933 0 : aDocument.GetPrintArea( nVisTab, nEndCol, nEndRow );
1934 0 : if (nStartCol>nEndCol)
1935 0 : nStartCol = nEndCol;
1936 0 : if (nStartRow>nEndRow)
1937 0 : nStartRow = nEndRow;
1938 : Rectangle aNewArea = ((ScDocument&)aDocument)
1939 0 : .GetMMRect( nStartCol,nStartRow, nEndCol,nEndRow, nVisTab );
1940 : //TODO/LATER: different methods for setting VisArea?!
1941 0 : ((ScDocShell*)this)->SfxObjectShell::SetVisArea( aNewArea );
1942 0 : return aNewArea;
1943 : }
1944 : else
1945 0 : return SfxObjectShell::GetVisArea( nAspect );
1946 : }
1947 :
1948 : namespace {
1949 :
1950 0 : void SnapHor( const ScDocument& rDoc, SCTAB nTab, long& rVal, SCCOL& rStartCol )
1951 : {
1952 0 : SCCOL nCol = 0;
1953 0 : long nTwips = (long) (rVal / HMM_PER_TWIPS);
1954 0 : long nSnap = 0;
1955 0 : while ( nCol<MAXCOL )
1956 : {
1957 0 : long nAdd = rDoc.GetColWidth(nCol, nTab);
1958 0 : if ( nSnap + nAdd/2 < nTwips || nCol < rStartCol )
1959 : {
1960 0 : nSnap += nAdd;
1961 0 : ++nCol;
1962 : }
1963 : else
1964 : break;
1965 : }
1966 0 : rVal = (long) ( nSnap * HMM_PER_TWIPS );
1967 0 : rStartCol = nCol;
1968 0 : }
1969 :
1970 0 : void SnapVer( const ScDocument& rDoc, SCTAB nTab, long& rVal, SCROW& rStartRow )
1971 : {
1972 0 : SCROW nRow = 0;
1973 0 : long nTwips = (long) (rVal / HMM_PER_TWIPS);
1974 0 : long nSnap = 0;
1975 :
1976 0 : bool bFound = false;
1977 0 : for (SCROW i = nRow; i <= MAXROW; ++i)
1978 : {
1979 : SCROW nLastRow;
1980 0 : if (rDoc.RowHidden(i, nTab, NULL, &nLastRow))
1981 : {
1982 0 : i = nLastRow;
1983 0 : continue;
1984 : }
1985 :
1986 0 : nRow = i;
1987 0 : long nAdd = rDoc.GetRowHeight(i, nTab);
1988 0 : if ( nSnap + nAdd/2 < nTwips || nRow < rStartRow )
1989 : {
1990 0 : nSnap += nAdd;
1991 0 : ++nRow;
1992 : }
1993 : else
1994 : {
1995 0 : bFound = true;
1996 0 : break;
1997 : }
1998 : }
1999 0 : if (!bFound)
2000 0 : nRow = MAXROW; // all hidden down to the bottom
2001 :
2002 0 : rVal = (long) ( nSnap * HMM_PER_TWIPS );
2003 0 : rStartRow = nRow;
2004 0 : }
2005 :
2006 :
2007 : }
2008 :
2009 0 : void ScDocShell::SnapVisArea( Rectangle& rRect ) const
2010 : {
2011 0 : SCTAB nTab = aDocument.GetVisibleTab();
2012 0 : bool bNegativePage = aDocument.IsNegativePage( nTab );
2013 0 : if ( bNegativePage )
2014 0 : ScDrawLayer::MirrorRectRTL( rRect ); // calculate with positive (LTR) values
2015 :
2016 0 : SCCOL nCol = 0;
2017 0 : SnapHor( aDocument, nTab, rRect.Left(), nCol );
2018 0 : ++nCol; // mindestens eine Spalte
2019 0 : SnapHor( aDocument, nTab, rRect.Right(), nCol );
2020 :
2021 0 : SCROW nRow = 0;
2022 0 : SnapVer( aDocument, nTab, rRect.Top(), nRow );
2023 0 : ++nRow; // mindestens eine Zeile
2024 0 : SnapVer( aDocument, nTab, rRect.Bottom(), nRow );
2025 :
2026 0 : if ( bNegativePage )
2027 0 : ScDrawLayer::MirrorRectRTL( rRect ); // back to real rectangle
2028 0 : }
2029 :
2030 0 : void ScDocShell::GetPageOnFromPageStyleSet( const SfxItemSet* pStyleSet,
2031 : SCTAB nCurTab,
2032 : bool& rbHeader,
2033 : bool& rbFooter )
2034 : {
2035 0 : if ( !pStyleSet )
2036 : {
2037 0 : ScStyleSheetPool* pStylePool = aDocument.GetStyleSheetPool();
2038 : SfxStyleSheetBase* pStyleSheet = pStylePool->
2039 : Find( aDocument.GetPageStyle( nCurTab ),
2040 0 : SFX_STYLE_FAMILY_PAGE );
2041 :
2042 : OSL_ENSURE( pStyleSheet, "PageStyle not found! :-/" );
2043 :
2044 0 : if ( pStyleSheet )
2045 0 : pStyleSet = &pStyleSheet->GetItemSet();
2046 : else
2047 0 : rbHeader = rbFooter = false;
2048 : }
2049 :
2050 : OSL_ENSURE( pStyleSet, "PageStyle-Set not found! :-(" );
2051 0 : if (!pStyleSet)
2052 0 : return;
2053 :
2054 0 : const SvxSetItem* pSetItem = NULL;
2055 0 : const SfxItemSet* pSet = NULL;
2056 :
2057 0 : pSetItem = (const SvxSetItem*) &pStyleSet->Get( ATTR_PAGE_HEADERSET );
2058 0 : pSet = &pSetItem->GetItemSet();
2059 0 : rbHeader = ((const SfxBoolItem&)pSet->Get(ATTR_PAGE_ON)).GetValue();
2060 :
2061 0 : pSetItem = (const SvxSetItem*) &pStyleSet->Get( ATTR_PAGE_FOOTERSET );
2062 0 : pSet = &pSetItem->GetItemSet();
2063 0 : rbFooter = ((const SfxBoolItem&)pSet->Get(ATTR_PAGE_ON)).GetValue();
2064 : }
2065 :
2066 0 : bool ScDocShell::DdeGetData( const OUString& rItem,
2067 : const OUString& rMimeType,
2068 : ::com::sun::star::uno::Any & rValue )
2069 : {
2070 0 : if( FORMAT_STRING == SotExchange::GetFormatIdFromMimeType( rMimeType ) )
2071 : {
2072 0 : if( rItem.equalsIgnoreAsciiCase( "Format" ) )
2073 : {
2074 : OString aFmtByte(OUStringToOString(aDdeTextFmt,
2075 0 : osl_getThreadTextEncoding()));
2076 0 : rValue <<= ::com::sun::star::uno::Sequence< sal_Int8 >(
2077 0 : (const sal_Int8*)aFmtByte.getStr(),
2078 0 : aFmtByte.getLength() + 1 );
2079 0 : return true;
2080 : }
2081 0 : ScImportExport aObj( &aDocument, rItem );
2082 0 : if ( !aObj.IsRef() )
2083 0 : return false; // ungueltiger Bereich
2084 :
2085 0 : if( aDdeTextFmt[0] == 'F' )
2086 0 : aObj.SetFormulas( true );
2087 0 : if( aDdeTextFmt == "SYLK" ||
2088 0 : aDdeTextFmt == "FSYLK" )
2089 : {
2090 0 : OString aData;
2091 0 : if( aObj.ExportByteString( aData, osl_getThreadTextEncoding(),
2092 0 : SOT_FORMATSTR_ID_SYLK ) )
2093 : {
2094 0 : rValue <<= ::com::sun::star::uno::Sequence< sal_Int8 >(
2095 0 : (const sal_Int8*)aData.getStr(),
2096 0 : aData.getLength() + 1 );
2097 0 : return true;
2098 : }
2099 : else
2100 0 : return false;
2101 : }
2102 0 : if( aDdeTextFmt == "CSV" ||
2103 0 : aDdeTextFmt == "FCSV" )
2104 0 : aObj.SetSeparator( ',' );
2105 0 : aObj.SetExportTextOptions( ScExportTextOptions( ScExportTextOptions::ToSpace, 0, false ) );
2106 0 : return aObj.ExportData( rMimeType, rValue );
2107 : }
2108 :
2109 0 : ScImportExport aObj( &aDocument, rItem );
2110 0 : aObj.SetExportTextOptions( ScExportTextOptions( ScExportTextOptions::ToSpace, 0, false ) );
2111 0 : return aObj.IsRef() && aObj.ExportData( rMimeType, rValue );
2112 : }
2113 :
2114 0 : bool ScDocShell::DdeSetData( const OUString& rItem,
2115 : const OUString& rMimeType,
2116 : const ::com::sun::star::uno::Any & rValue )
2117 : {
2118 0 : if( FORMAT_STRING == SotExchange::GetFormatIdFromMimeType( rMimeType ))
2119 : {
2120 0 : if( rItem.equalsIgnoreAsciiCase( "Format" ) )
2121 : {
2122 0 : if ( ScByteSequenceToString::GetString( aDdeTextFmt, rValue, osl_getThreadTextEncoding() ) )
2123 : {
2124 0 : aDdeTextFmt = aDdeTextFmt.toAsciiUpperCase();
2125 0 : return true;
2126 : }
2127 0 : return false;
2128 : }
2129 0 : ScImportExport aObj( &aDocument, rItem );
2130 0 : if( aDdeTextFmt[0] == 'F' )
2131 0 : aObj.SetFormulas( true );
2132 0 : if( aDdeTextFmt == "SYLK" ||
2133 0 : aDdeTextFmt == "FSYLK" )
2134 : {
2135 0 : OUString aData;
2136 0 : if ( ScByteSequenceToString::GetString( aData, rValue, osl_getThreadTextEncoding() ) )
2137 : {
2138 0 : return aObj.ImportString( aData, SOT_FORMATSTR_ID_SYLK );
2139 : }
2140 0 : return false;
2141 : }
2142 0 : if( aDdeTextFmt == "CSV" ||
2143 0 : aDdeTextFmt == "FCSV" )
2144 0 : aObj.SetSeparator( ',' );
2145 0 : return aObj.ImportData( rMimeType, rValue );
2146 : }
2147 0 : ScImportExport aObj( &aDocument, rItem );
2148 0 : return aObj.IsRef() && aObj.ImportData( rMimeType, rValue );
2149 : }
2150 :
2151 0 : ::sfx2::SvLinkSource* ScDocShell::DdeCreateLinkSource( const OUString& rItem )
2152 : {
2153 : // only check for valid item string - range is parsed again in ScServerObject ctor
2154 :
2155 : // named range?
2156 0 : OUString aPos = rItem;
2157 0 : ScRangeName* pRange = aDocument.GetRangeName();
2158 0 : if( pRange )
2159 : {
2160 0 : const ScRangeData* pData = pRange->findByUpperName(ScGlobal::pCharClass->uppercase(aPos));
2161 0 : if (pData)
2162 : {
2163 0 : if( pData->HasType( RT_REFAREA )
2164 0 : || pData->HasType( RT_ABSAREA )
2165 0 : || pData->HasType( RT_ABSPOS ) )
2166 0 : pData->GetSymbol( aPos ); // continue with the name's contents
2167 : }
2168 : }
2169 :
2170 : // Address in DDE function must be always parsed as CONV_OOO so that it
2171 : // would always work regardless of current address convension. We do this
2172 : // because the address item in a DDE entry is *not* normalized when saved
2173 : // into ODF.
2174 0 : ScRange aRange;
2175 0 : bool bValid = ( (aRange.Parse(aPos, &aDocument, formula::FormulaGrammar::CONV_OOO ) & SCA_VALID) ||
2176 0 : (aRange.aStart.Parse(aPos, &aDocument, formula::FormulaGrammar::CONV_OOO) & SCA_VALID) );
2177 :
2178 0 : ScServerObject* pObj = NULL; // NULL = error
2179 0 : if ( bValid )
2180 0 : pObj = new ScServerObject( this, rItem );
2181 :
2182 : // GetLinkManager()->InsertServer() is in the ScServerObject ctor
2183 :
2184 0 : return pObj;
2185 : }
2186 :
2187 0 : ScViewData* ScDocShell::GetViewData()
2188 : {
2189 0 : SfxViewShell* pCur = SfxViewShell::Current();
2190 0 : ScTabViewShell* pViewSh = PTR_CAST(ScTabViewShell,pCur);
2191 0 : return pViewSh ? pViewSh->GetViewData() : NULL;
2192 : }
2193 :
2194 0 : SCTAB ScDocShell::GetCurTab()
2195 : {
2196 : //! this must be made non-static and use a ViewShell from this document!
2197 :
2198 0 : ScViewData* pViewData = GetViewData();
2199 :
2200 0 : return pViewData ? pViewData->GetTabNo() : static_cast<SCTAB>(0);
2201 : }
2202 :
2203 0 : ScTabViewShell* ScDocShell::GetBestViewShell( bool bOnlyVisible )
2204 : {
2205 0 : ScTabViewShell* pViewSh = ScTabViewShell::GetActiveViewShell();
2206 : // falsches Doc?
2207 0 : if( pViewSh && pViewSh->GetViewData()->GetDocShell() != this )
2208 0 : pViewSh = NULL;
2209 0 : if( !pViewSh )
2210 : {
2211 : // 1. ViewShell suchen
2212 0 : SfxViewFrame* pFrame = SfxViewFrame::GetFirst( this, bOnlyVisible );
2213 0 : if( pFrame )
2214 : {
2215 0 : SfxViewShell* p = pFrame->GetViewShell();
2216 0 : pViewSh = PTR_CAST(ScTabViewShell,p);
2217 : }
2218 : }
2219 0 : return pViewSh;
2220 : }
2221 :
2222 0 : SfxBindings* ScDocShell::GetViewBindings()
2223 : {
2224 : // used to invalidate slots after changes to this document
2225 :
2226 0 : SfxViewShell* pViewSh = GetBestViewShell();
2227 0 : if (pViewSh)
2228 0 : return &pViewSh->GetViewFrame()->GetBindings();
2229 : else
2230 0 : return NULL;
2231 : }
2232 :
2233 0 : ScDocShell* ScDocShell::GetShellByNum( sal_uInt16 nDocNo ) // static
2234 : {
2235 0 : ScDocShell* pFound = NULL;
2236 0 : SfxObjectShell* pShell = SfxObjectShell::GetFirst();
2237 0 : sal_uInt16 nShellCnt = 0;
2238 :
2239 0 : while ( pShell && !pFound )
2240 : {
2241 0 : if ( pShell->Type() == TYPE(ScDocShell) )
2242 : {
2243 0 : if ( nShellCnt == nDocNo )
2244 0 : pFound = (ScDocShell*) pShell;
2245 : else
2246 0 : ++nShellCnt;
2247 : }
2248 0 : pShell = SfxObjectShell::GetNext( *pShell );
2249 : }
2250 :
2251 0 : return pFound;
2252 : }
2253 :
2254 0 : IMPL_LINK( ScDocShell, DialogClosedHdl, sfx2::FileDialogHelper*, _pFileDlg )
2255 : {
2256 : OSL_ENSURE( _pFileDlg, "ScDocShell::DialogClosedHdl(): no file dialog" );
2257 : OSL_ENSURE( pImpl->pDocInserter, "ScDocShell::DialogClosedHdl(): no document inserter" );
2258 :
2259 0 : if ( ERRCODE_NONE == _pFileDlg->GetError() )
2260 : {
2261 0 : sal_uInt16 nSlot = pImpl->pRequest->GetSlot();
2262 0 : SfxMedium* pMed = pImpl->pDocInserter->CreateMedium();
2263 : // #i87094# If a .odt was selected pMed is NULL.
2264 0 : if (pMed)
2265 : {
2266 0 : pImpl->pRequest->AppendItem( SfxStringItem( SID_FILE_NAME, pMed->GetName() ) );
2267 0 : if ( SID_DOCUMENT_COMPARE == nSlot )
2268 : {
2269 0 : if ( pMed->GetFilter() )
2270 : pImpl->pRequest->AppendItem(
2271 0 : SfxStringItem( SID_FILTER_NAME, pMed->GetFilter()->GetFilterName() ) );
2272 0 : OUString sOptions = ScDocumentLoader::GetOptions( *pMed );
2273 0 : if ( !sOptions.isEmpty() )
2274 0 : pImpl->pRequest->AppendItem( SfxStringItem( SID_FILE_FILTEROPTIONS, sOptions ) );
2275 : }
2276 0 : const SfxPoolItem* pItem = NULL;
2277 0 : SfxItemSet* pSet = pMed->GetItemSet();
2278 0 : if ( pSet &&
2279 0 : pSet->GetItemState( SID_VERSION, true, &pItem ) == SFX_ITEM_SET &&
2280 0 : pItem->ISA( SfxInt16Item ) )
2281 : {
2282 0 : pImpl->pRequest->AppendItem( *pItem );
2283 : }
2284 :
2285 0 : Execute( *(pImpl->pRequest) );
2286 : }
2287 : }
2288 :
2289 0 : pImpl->bIgnoreLostRedliningWarning = false;
2290 0 : return 0;
2291 : }
2292 :
2293 : #if HAVE_FEATURE_MULTIUSER_ENVIRONMENT
2294 :
2295 0 : void ScDocShell::EnableSharedSettings( bool bEnable )
2296 : {
2297 0 : SetDocumentModified();
2298 :
2299 0 : if ( bEnable )
2300 : {
2301 0 : aDocument.EndChangeTracking();
2302 0 : aDocument.StartChangeTracking();
2303 :
2304 : // hide accept or reject changes dialog
2305 0 : sal_uInt16 nId = ScAcceptChgDlgWrapper::GetChildWindowId();
2306 0 : SfxViewFrame* pViewFrame = SfxViewFrame::Current();
2307 0 : if ( pViewFrame && pViewFrame->HasChildWindow( nId ) )
2308 : {
2309 0 : pViewFrame->ToggleChildWindow( nId );
2310 0 : SfxBindings* pBindings = GetViewBindings();
2311 0 : if ( pBindings )
2312 : {
2313 0 : pBindings->Invalidate( FID_CHG_ACCEPT );
2314 : }
2315 : }
2316 : }
2317 : else
2318 : {
2319 0 : aDocument.EndChangeTracking();
2320 : }
2321 :
2322 0 : ScChangeViewSettings aChangeViewSet;
2323 0 : aChangeViewSet.SetShowChanges( false );
2324 0 : aDocument.SetChangeViewSettings( aChangeViewSet );
2325 0 : }
2326 :
2327 0 : uno::Reference< frame::XModel > ScDocShell::LoadSharedDocument()
2328 : {
2329 0 : uno::Reference< frame::XModel > xModel;
2330 : try
2331 : {
2332 0 : SC_MOD()->SetInSharedDocLoading( true );
2333 0 : uno::Reference< frame::XDesktop2 > xLoader = frame::Desktop::create( ::comphelper::getProcessComponentContext() );
2334 0 : uno::Sequence < beans::PropertyValue > aArgs( 1 );
2335 0 : aArgs[0].Name = "Hidden";
2336 0 : aArgs[0].Value <<= sal_True;
2337 :
2338 0 : if ( GetMedium() )
2339 : {
2340 0 : SFX_ITEMSET_ARG( GetMedium()->GetItemSet(), pPasswordItem, SfxStringItem, SID_PASSWORD, false);
2341 0 : if ( pPasswordItem && !pPasswordItem->GetValue().isEmpty() )
2342 : {
2343 0 : aArgs.realloc( 2 );
2344 0 : aArgs[1].Name = "Password";
2345 0 : aArgs[1].Value <<= pPasswordItem->GetValue();
2346 : }
2347 : }
2348 :
2349 : xModel.set(
2350 0 : xLoader->loadComponentFromURL( GetSharedFileURL(), OUString( "_blank" ), 0, aArgs ),
2351 0 : uno::UNO_QUERY_THROW );
2352 0 : SC_MOD()->SetInSharedDocLoading( false );
2353 : }
2354 0 : catch ( uno::Exception& )
2355 : {
2356 : OSL_FAIL( "ScDocShell::LoadSharedDocument(): caught exception\n" );
2357 0 : SC_MOD()->SetInSharedDocLoading( false );
2358 : try
2359 : {
2360 0 : uno::Reference< util::XCloseable > xClose( xModel, uno::UNO_QUERY_THROW );
2361 0 : xClose->close( sal_True );
2362 0 : return uno::Reference< frame::XModel >();
2363 : }
2364 0 : catch ( uno::Exception& )
2365 : {
2366 0 : return uno::Reference< frame::XModel >();
2367 : }
2368 : }
2369 0 : return xModel;
2370 0 : }
2371 :
2372 : #endif
2373 :
2374 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|