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