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