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