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