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