xref: /AOO41X/main/sc/source/ui/docshell/docsh.cxx (revision 577c0052d6abf034578ac9c5775082c46c25eec4)
1b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3b3f79822SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4b3f79822SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5b3f79822SAndrew Rist  * distributed with this work for additional information
6b3f79822SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7b3f79822SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8b3f79822SAndrew Rist  * "License"); you may not use this file except in compliance
9b3f79822SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11b3f79822SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13b3f79822SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14b3f79822SAndrew Rist  * software distributed under the License is distributed on an
15b3f79822SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16b3f79822SAndrew Rist  * KIND, either express or implied.  See the License for the
17b3f79822SAndrew Rist  * specific language governing permissions and limitations
18b3f79822SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20b3f79822SAndrew Rist  *************************************************************/
21b3f79822SAndrew Rist 
22b3f79822SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sc.hxx"
26cdf0e10cSrcweir // System - Includes -----------------------------------------------------
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include "scitems.hxx"
29cdf0e10cSrcweir #include <editeng/eeitem.hxx>
30cdf0e10cSrcweir #include <editeng/svxenum.hxx>
31cdf0e10cSrcweir #include <svx/algitem.hxx>
32cdf0e10cSrcweir 
33cdf0e10cSrcweir #include <sot/clsids.hxx>
34cdf0e10cSrcweir #include <unotools/securityoptions.hxx>
35cdf0e10cSrcweir #include <tools/stream.hxx>
36cdf0e10cSrcweir #include <tools/string.hxx>
37cdf0e10cSrcweir #include <tools/urlobj.hxx>
38cdf0e10cSrcweir #include <vcl/msgbox.hxx>
39cdf0e10cSrcweir #include <vcl/virdev.hxx>
40cdf0e10cSrcweir #include <vcl/waitobj.hxx>
41cdf0e10cSrcweir #include <svtools/ctrltool.hxx>
42cdf0e10cSrcweir #include <svtools/sfxecode.hxx>
43cdf0e10cSrcweir #include <svl/zforlist.hxx>
44cdf0e10cSrcweir #include <svl/PasswordHelper.hxx>
45cdf0e10cSrcweir #include <sfx2/app.hxx>
46cdf0e10cSrcweir #include <sfx2/bindings.hxx>
47cdf0e10cSrcweir #include <sfx2/dinfdlg.hxx>
48cdf0e10cSrcweir #include <sfx2/docfile.hxx>
49cdf0e10cSrcweir #include <sfx2/docfilt.hxx>
50cdf0e10cSrcweir #include <sfx2/fcontnr.hxx>
51cdf0e10cSrcweir #include <sfx2/evntconf.hxx>
52cdf0e10cSrcweir #include <sfx2/sfx.hrc>
53cdf0e10cSrcweir #include <sfx2/objface.hxx>
54cdf0e10cSrcweir #include <svl/srchitem.hxx>
55cdf0e10cSrcweir #include <unotools/fltrcfg.hxx>
56cdf0e10cSrcweir #include <svl/documentlockfile.hxx>
57cdf0e10cSrcweir #include <svl/sharecontrolfile.hxx>
58cdf0e10cSrcweir #include <unotools/charclass.hxx>
59cdf0e10cSrcweir #include <vcl/virdev.hxx>
60cdf0e10cSrcweir #include "chgtrack.hxx"
61cdf0e10cSrcweir #include "chgviset.hxx"
62cdf0e10cSrcweir #include <sfx2/request.hxx>
63cdf0e10cSrcweir #include <com/sun/star/container/XContentEnumerationAccess.hpp>
64cdf0e10cSrcweir #include <com/sun/star/document/UpdateDocMode.hpp>
65cdf0e10cSrcweir #include <com/sun/star/script/vba/VBAEventId.hpp>
66cdf0e10cSrcweir #include <com/sun/star/script/vba/XVBAEventProcessor.hpp>
67cdf0e10cSrcweir #include <com/sun/star/sheet/XSpreadsheetView.hpp>
68cdf0e10cSrcweir #include <com/sun/star/task/XJob.hpp>
69*577c0052SWang Lei #include <com/sun/star/embed/EmbedStates.hpp>
70cdf0e10cSrcweir #include <basic/sbstar.hxx>
71cdf0e10cSrcweir #include <basic/basmgr.hxx>
72cdf0e10cSrcweir 
73cdf0e10cSrcweir #include "scabstdlg.hxx" //CHINA001
74cdf0e10cSrcweir #include <sot/formats.hxx>
75cdf0e10cSrcweir #define SOT_FORMATSTR_ID_STARCALC_30 SOT_FORMATSTR_ID_STARCALC
76cdf0e10cSrcweir 
77cdf0e10cSrcweir // INCLUDE ---------------------------------------------------------------
78cdf0e10cSrcweir 
79cdf0e10cSrcweir #include "cell.hxx"
80cdf0e10cSrcweir #include "global.hxx"
81cdf0e10cSrcweir #include "filter.hxx"
82cdf0e10cSrcweir #include "scmod.hxx"
83cdf0e10cSrcweir #include "tabvwsh.hxx"
84cdf0e10cSrcweir #include "docfunc.hxx"
85cdf0e10cSrcweir #include "imoptdlg.hxx"
86cdf0e10cSrcweir #include "impex.hxx"
87cdf0e10cSrcweir #include "scresid.hxx"
88cdf0e10cSrcweir #include "sc.hrc"
89cdf0e10cSrcweir #include "globstr.hrc"
90cdf0e10cSrcweir #include "scerrors.hxx"
91cdf0e10cSrcweir #include "brdcst.hxx"
92cdf0e10cSrcweir #include "stlpool.hxx"
93cdf0e10cSrcweir #include "autostyl.hxx"
94cdf0e10cSrcweir #include "attrib.hxx"
95cdf0e10cSrcweir #include "asciiopt.hxx"
96cdf0e10cSrcweir #include "waitoff.hxx"
97cdf0e10cSrcweir #include "docpool.hxx"		// LoadCompleted
98cdf0e10cSrcweir #include "progress.hxx"
99cdf0e10cSrcweir #include "pntlock.hxx"
100cdf0e10cSrcweir #include "collect.hxx"
101cdf0e10cSrcweir #include "docuno.hxx"
102cdf0e10cSrcweir #include "appoptio.hxx"
103cdf0e10cSrcweir #include "detdata.hxx"
104cdf0e10cSrcweir #include "printfun.hxx"
105cdf0e10cSrcweir #include "dociter.hxx"
106cdf0e10cSrcweir #include "cellform.hxx"
107cdf0e10cSrcweir #include "chartlis.hxx"
108cdf0e10cSrcweir #include "hints.hxx"
109cdf0e10cSrcweir #include "xmlwrap.hxx"
110cdf0e10cSrcweir #include "drwlayer.hxx"
111cdf0e10cSrcweir #include "refreshtimer.hxx"
112cdf0e10cSrcweir #include "dbcolect.hxx"
113cdf0e10cSrcweir #include "scextopt.hxx"
114cdf0e10cSrcweir #include "compiler.hxx"
115cdf0e10cSrcweir #include "cfgids.hxx"
116cdf0e10cSrcweir #include "warnpassword.hxx"
117cdf0e10cSrcweir #include "optsolver.hxx"
118cdf0e10cSrcweir #include "sheetdata.hxx"
119cdf0e10cSrcweir #include "tabprotection.hxx"
120cdf0e10cSrcweir #include "dpobject.hxx"
121cdf0e10cSrcweir 
122cdf0e10cSrcweir #include "docsh.hxx"
123cdf0e10cSrcweir #include "docshimp.hxx"
124cdf0e10cSrcweir #include <rtl/logfile.hxx>
125cdf0e10cSrcweir 
126cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
127cdf0e10cSrcweir #include "uiitems.hxx"
128cdf0e10cSrcweir #include "cellsuno.hxx"
129cdf0e10cSrcweir 
130cdf0e10cSrcweir using namespace com::sun::star;
131cdf0e10cSrcweir using ::rtl::OUString;
132cdf0e10cSrcweir using ::rtl::OUStringBuffer;
133cdf0e10cSrcweir 
134cdf0e10cSrcweir // STATIC DATA -----------------------------------------------------------
135cdf0e10cSrcweir 
136cdf0e10cSrcweir //	Stream-Namen im Storage
137cdf0e10cSrcweir 
138cdf0e10cSrcweir const sal_Char __FAR_DATA ScDocShell::pStarCalcDoc[] = STRING_SCSTREAM;		// "StarCalcDocument"
139cdf0e10cSrcweir const sal_Char __FAR_DATA ScDocShell::pStyleName[] = "SfxStyleSheets";
140cdf0e10cSrcweir 
141cdf0e10cSrcweir //	Filter-Namen (wie in sclib.cxx)
142cdf0e10cSrcweir 
143cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterSc50[]		= "StarCalc 5.0";
144cdf0e10cSrcweir //static const sal_Char __FAR_DATA pFilterSc50Temp[]	= "StarCalc 5.0 Vorlage/Template";
145cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterSc40[]		= "StarCalc 4.0";
146cdf0e10cSrcweir //static const sal_Char __FAR_DATA pFilterSc40Temp[]	= "StarCalc 4.0 Vorlage/Template";
147cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterSc30[]		= "StarCalc 3.0";
148cdf0e10cSrcweir //static const sal_Char __FAR_DATA pFilterSc30Temp[]	= "StarCalc 3.0 Vorlage/Template";
149cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterSc10[]		= "StarCalc 1.0";
150cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterXML[]		= "StarOffice XML (Calc)";
151cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterAscii[]		= "Text - txt - csv (StarCalc)";
152cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterLotus[]		= "Lotus";
153cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterQPro6[]		= "Quattro Pro 6.0";
154cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterExcel4[]	= "MS Excel 4.0";
155cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterEx4Temp[]	= "MS Excel 4.0 Vorlage/Template";
156cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterExcel5[]	= "MS Excel 5.0/95";
157cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterEx5Temp[]	= "MS Excel 5.0/95 Vorlage/Template";
158cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterExcel95[]	= "MS Excel 95";
159cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterEx95Temp[]	= "MS Excel 95 Vorlage/Template";
160cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterExcel97[]	= "MS Excel 97";
161cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterEx97Temp[]	= "MS Excel 97 Vorlage/Template";
162cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterEx07Xml[]   = "MS Excel 2007 XML";
163cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterDBase[]		= "dBase";
164cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterDif[]		= "DIF";
165cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterSylk[]		= "SYLK";
166cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterHtml[]		= "HTML (StarCalc)";
167cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterHtmlWebQ[]	= "calc_HTML_WebQuery";
168cdf0e10cSrcweir static const sal_Char __FAR_DATA pFilterRtf[]		= "Rich Text Format (StarCalc)";
169cdf0e10cSrcweir 
170cdf0e10cSrcweir //----------------------------------------------------------------------
171cdf0e10cSrcweir 
172cdf0e10cSrcweir #define ScDocShell
173cdf0e10cSrcweir #include "scslots.hxx"
174cdf0e10cSrcweir 
175*577c0052SWang Lei namespace
176*577c0052SWang Lei {
177*577c0052SWang Lei     template< bool bByName >
178*577c0052SWang Lei     inline sal_uInt8 GetMediumFlag( const String & rName )
179*577c0052SWang Lei     {
180*577c0052SWang Lei         sal_uInt8 bResult = E_MEDIUM_FLAG_NONE;
181*577c0052SWang Lei 
182*577c0052SWang Lei #define SFX2_FILTER_ENTRY( entry ) { #entry, (sizeof #entry)/sizeof((#entry)[0]) - 1 },
183*577c0052SWang Lei         static const struct
184*577c0052SWang Lei         {
185*577c0052SWang Lei             const char * mpFilterTypeName;
186*577c0052SWang Lei             unsigned mnFilterTypeLen;
187*577c0052SWang Lei         } szMSFilterTypes [] =
188*577c0052SWang Lei         {
189*577c0052SWang Lei             SFX2_FILTER_ENTRY(calc_MS_Excel_40)
190*577c0052SWang Lei             SFX2_FILTER_ENTRY(calc_MS_Excel_40_VorlageTemplate)
191*577c0052SWang Lei             SFX2_FILTER_ENTRY(calc_MS_Excel_5095)
192*577c0052SWang Lei             SFX2_FILTER_ENTRY(calc_MS_Excel_5095_VorlageTemplate)
193*577c0052SWang Lei             SFX2_FILTER_ENTRY(calc_MS_Excel_95)
194*577c0052SWang Lei             SFX2_FILTER_ENTRY(calc_MS_Excel_95_VorlageTemplate)
195*577c0052SWang Lei             SFX2_FILTER_ENTRY(calc_MS_Excel_97)
196*577c0052SWang Lei             SFX2_FILTER_ENTRY(calc_MS_Excel_97_VorlageTemplate)
197*577c0052SWang Lei             SFX2_FILTER_ENTRY(calc_MS_Excel_2003_XML)
198*577c0052SWang Lei             SFX2_FILTER_ENTRY(MS Excel 2007 XML)
199*577c0052SWang Lei             SFX2_FILTER_ENTRY(MS Excel 2007 XML Template)
200*577c0052SWang Lei             SFX2_FILTER_ENTRY(MS Excel 2007 Binary)
201*577c0052SWang Lei         };
202*577c0052SWang Lei 
203*577c0052SWang Lei         static const struct
204*577c0052SWang Lei         {
205*577c0052SWang Lei             const char * mpFilterName;
206*577c0052SWang Lei             unsigned mnFilterNameLen;
207*577c0052SWang Lei         } szMSFilterNames [] =
208*577c0052SWang Lei         {
209*577c0052SWang Lei             { pFilterExcel4, strlen( pFilterExcel4 ) },
210*577c0052SWang Lei             { pFilterEx4Temp, strlen( pFilterEx4Temp ) },
211*577c0052SWang Lei             { pFilterExcel95, strlen( pFilterExcel95 ) },
212*577c0052SWang Lei             { pFilterEx95Temp, strlen( pFilterEx95Temp ) },
213*577c0052SWang Lei             { pFilterExcel5, strlen( pFilterExcel5 ) },
214*577c0052SWang Lei             { pFilterEx5Temp, strlen( pFilterEx5Temp ) },
215*577c0052SWang Lei             { pFilterExcel97, strlen( pFilterExcel97 ) },
216*577c0052SWang Lei             { pFilterEx97Temp, strlen( pFilterEx97Temp ) },
217*577c0052SWang Lei             SFX2_FILTER_ENTRY(Microsoft Excel 2003 XML)
218*577c0052SWang Lei             { pFilterEx07Xml, strlen( pFilterEx07Xml ) },
219*577c0052SWang Lei             SFX2_FILTER_ENTRY(Microsoft Excel 2007 XML Template)
220*577c0052SWang Lei             SFX2_FILTER_ENTRY(Microsoft Excel 2007 Binary)
221*577c0052SWang Lei         };
222*577c0052SWang Lei 
223*577c0052SWang Lei         enum{
224*577c0052SWang Lei             e_calc_MS_Excel_40,
225*577c0052SWang Lei             e_calc_MS_Excel_40_VorlageTemplate,
226*577c0052SWang Lei             e_calc_MS_Excel_5095,
227*577c0052SWang Lei             e_calc_MS_Excel_5095_VorlageTemplate,
228*577c0052SWang Lei             e_calc_MS_Excel_95,
229*577c0052SWang Lei             Se_calc_MS_Excel_95_VorlageTemplate,
230*577c0052SWang Lei             e_calc_MS_Excel_97,
231*577c0052SWang Lei             e_calc_MS_Excel_97_VorlageTemplate,
232*577c0052SWang Lei             e_calc_MS_Excel_2003_XML,
233*577c0052SWang Lei             e_MS_Excel_2007_XML,
234*577c0052SWang Lei             e_MS_Excel_2007_XML_Template,
235*577c0052SWang Lei             e_MS_Excel_2007_Binary
236*577c0052SWang Lei         };
237*577c0052SWang Lei 
238*577c0052SWang Lei #undef SFX2_FILTER_ENTRY
239*577c0052SWang Lei 
240*577c0052SWang Lei         if( bByName )
241*577c0052SWang Lei         {
242*577c0052SWang Lei             for( unsigned i = 0; i < (sizeof szMSFilterNames)/sizeof(szMSFilterNames[0] ); i++ )
243*577c0052SWang Lei                 if( rName.Len() == szMSFilterNames[i].mnFilterNameLen
244*577c0052SWang Lei                     && std::equal( szMSFilterNames[i].mpFilterName, szMSFilterNames[i].mpFilterName + szMSFilterNames[i].mnFilterNameLen, rName.GetBuffer() ) )
245*577c0052SWang Lei                     bResult |= ( E_MEDIUM_FLAG_EXCEL | ( ( i == e_MS_Excel_2007_XML ) * E_MEDIUM_FLAG_MSXML ) );
246*577c0052SWang Lei         }
247*577c0052SWang Lei         else
248*577c0052SWang Lei         {
249*577c0052SWang Lei             for( unsigned i = 0; i < (sizeof szMSFilterTypes)/sizeof(szMSFilterTypes[0] ); i++ )
250*577c0052SWang Lei                 if( rName.Len() == szMSFilterTypes[i].mnFilterTypeLen
251*577c0052SWang Lei                     && std::equal( szMSFilterTypes[i].mpFilterTypeName, szMSFilterTypes[i].mpFilterTypeName + szMSFilterTypes[i].mnFilterTypeLen, rName.GetBuffer() ) )
252*577c0052SWang Lei                     bResult |= ( E_MEDIUM_FLAG_EXCEL | ( ( i == e_MS_Excel_2007_XML ) * E_MEDIUM_FLAG_MSXML ) );
253*577c0052SWang Lei         }
254*577c0052SWang Lei 
255*577c0052SWang Lei         return bResult;
256*577c0052SWang Lei     }
257*577c0052SWang Lei 
258*577c0052SWang Lei     inline sal_uInt8 GetMediumFlag( const SfxMedium * pMedium )
259*577c0052SWang Lei     {
260*577c0052SWang Lei         if( const SfxFilter * pFilter = pMedium ? pMedium->GetFilter() : NULL )
261*577c0052SWang Lei             return GetMediumFlag<false>( pFilter->GetTypeName() );
262*577c0052SWang Lei 
263*577c0052SWang Lei         return E_MEDIUM_FLAG_NONE;
264*577c0052SWang Lei     }
265*577c0052SWang Lei }
266cdf0e10cSrcweir 
267cdf0e10cSrcweir SFX_IMPL_INTERFACE(ScDocShell,SfxObjectShell, ScResId(SCSTR_DOCSHELL))
268cdf0e10cSrcweir {
269cdf0e10cSrcweir 	SFX_CHILDWINDOW_REGISTRATION( SID_HYPERLINK_INSERT );
270cdf0e10cSrcweir }
271cdf0e10cSrcweir 
272cdf0e10cSrcweir //	GlobalName der aktuellen Version:
273cdf0e10cSrcweir SFX_IMPL_OBJECTFACTORY( ScDocShell, SvGlobalName(SO3_SC_CLASSID), SFXOBJECTSHELL_STD_NORMAL, "scalc" )
274cdf0e10cSrcweir 
275cdf0e10cSrcweir TYPEINIT1( ScDocShell, SfxObjectShell );		// SfxInPlaceObject: kein Type-Info ?
276cdf0e10cSrcweir 
277cdf0e10cSrcweir //------------------------------------------------------------------
278cdf0e10cSrcweir 
279cdf0e10cSrcweir void __EXPORT ScDocShell::FillClass( SvGlobalName* pClassName,
280cdf0e10cSrcweir 										sal_uInt32* pFormat,
281cdf0e10cSrcweir                                         String* /* pAppName */,
282cdf0e10cSrcweir 										String* pFullTypeName,
283cdf0e10cSrcweir 										String* pShortTypeName,
284cdf0e10cSrcweir                                         sal_Int32 nFileFormat,
285cdf0e10cSrcweir                                         sal_Bool bTemplate /* = sal_False */) const
286cdf0e10cSrcweir {
287cdf0e10cSrcweir 	if ( nFileFormat == SOFFICE_FILEFORMAT_60 )
288cdf0e10cSrcweir 	{
289cdf0e10cSrcweir 		*pClassName		= SvGlobalName( SO3_SC_CLASSID_60 );
290cdf0e10cSrcweir 		*pFormat		= SOT_FORMATSTR_ID_STARCALC_60;
291cdf0e10cSrcweir 		*pFullTypeName	= String( ScResId( SCSTR_LONG_SCDOC_NAME ) );
292cdf0e10cSrcweir 		*pShortTypeName	= String( ScResId( SCSTR_SHORT_SCDOC_NAME ) );
293cdf0e10cSrcweir 	}
294cdf0e10cSrcweir 	else if ( nFileFormat == SOFFICE_FILEFORMAT_8 )
295cdf0e10cSrcweir 	{
296cdf0e10cSrcweir 		*pClassName		= SvGlobalName( SO3_SC_CLASSID_60 );
297cdf0e10cSrcweir         *pFormat		= bTemplate ? SOT_FORMATSTR_ID_STARCALC_8_TEMPLATE : SOT_FORMATSTR_ID_STARCALC_8;
298cdf0e10cSrcweir 		*pFullTypeName	= String( RTL_CONSTASCII_USTRINGPARAM("calc8") );
299cdf0e10cSrcweir 		*pShortTypeName	= String( ScResId( SCSTR_SHORT_SCDOC_NAME ) );
300cdf0e10cSrcweir 	}
301cdf0e10cSrcweir 	else
302cdf0e10cSrcweir 	{
303cdf0e10cSrcweir 		DBG_ERROR("wat fuer ne Version?");
304cdf0e10cSrcweir 	}
305cdf0e10cSrcweir }
306cdf0e10cSrcweir 
307cdf0e10cSrcweir //------------------------------------------------------------------
308cdf0e10cSrcweir 
309cdf0e10cSrcweir void ScDocShell::DoEnterHandler()
310cdf0e10cSrcweir {
311cdf0e10cSrcweir 	ScTabViewShell* pViewSh = ScTabViewShell::GetActiveViewShell();
312cdf0e10cSrcweir 	if (pViewSh)
313cdf0e10cSrcweir 		if (pViewSh->GetViewData()->GetDocShell() == this)
314cdf0e10cSrcweir 			SC_MOD()->InputEnterHandler();
315cdf0e10cSrcweir }
316cdf0e10cSrcweir 
317cdf0e10cSrcweir //------------------------------------------------------------------
318cdf0e10cSrcweir 
319cdf0e10cSrcweir SCTAB ScDocShell::GetSaveTab()
320cdf0e10cSrcweir {
321cdf0e10cSrcweir 	SCTAB nTab = 0;
322cdf0e10cSrcweir 	ScTabViewShell* pSh = GetBestViewShell();
323cdf0e10cSrcweir 	if (pSh)
324cdf0e10cSrcweir 	{
325cdf0e10cSrcweir 		const ScMarkData& rMark = pSh->GetViewData()->GetMarkData();
326cdf0e10cSrcweir 		for ( nTab = 0; nTab <= MAXTAB; nTab++ )	// erste markierte Tabelle
327cdf0e10cSrcweir 			if ( rMark.GetTableSelect( nTab ) )
328cdf0e10cSrcweir 				break;
329cdf0e10cSrcweir 	}
330cdf0e10cSrcweir 	return nTab;
331cdf0e10cSrcweir }
332cdf0e10cSrcweir 
333cdf0e10cSrcweir sal_uInt16 ScDocShell::GetHiddenInformationState( sal_uInt16 nStates )
334cdf0e10cSrcweir {
335cdf0e10cSrcweir 	// get global state like HIDDENINFORMATION_DOCUMENTVERSIONS
336cdf0e10cSrcweir     sal_uInt16 nState = SfxObjectShell::GetHiddenInformationState( nStates );
337cdf0e10cSrcweir 
338cdf0e10cSrcweir 	if ( nStates & HIDDENINFORMATION_RECORDEDCHANGES )
339cdf0e10cSrcweir     {
340cdf0e10cSrcweir         if ( aDocument.GetChangeTrack() && aDocument.GetChangeTrack()->GetFirst() )
341cdf0e10cSrcweir           nState |= HIDDENINFORMATION_RECORDEDCHANGES;
342cdf0e10cSrcweir     }
343cdf0e10cSrcweir     if ( nStates & HIDDENINFORMATION_NOTES )
344cdf0e10cSrcweir     {
345cdf0e10cSrcweir         SCTAB nTableCount = aDocument.GetTableCount();
346cdf0e10cSrcweir         SCTAB nTable = 0;
347cdf0e10cSrcweir         sal_Bool bFound(sal_False);
348cdf0e10cSrcweir 	    while ( nTable < nTableCount && !bFound )
349cdf0e10cSrcweir 	    {
350cdf0e10cSrcweir             ScCellIterator aCellIter( &aDocument, 0,0, nTable, MAXCOL,MAXROW, nTable );
351cdf0e10cSrcweir             for( ScBaseCell* pCell = aCellIter.GetFirst(); pCell && !bFound; pCell = aCellIter.GetNext() )
352cdf0e10cSrcweir                 if (pCell->HasNote())
353cdf0e10cSrcweir                     bFound = sal_True;
354cdf0e10cSrcweir             nTable++;
355cdf0e10cSrcweir         }
356cdf0e10cSrcweir 
357cdf0e10cSrcweir         if (bFound)
358cdf0e10cSrcweir             nState |= HIDDENINFORMATION_NOTES;
359cdf0e10cSrcweir     }
360cdf0e10cSrcweir 
361cdf0e10cSrcweir 	return nState;
362cdf0e10cSrcweir }
363cdf0e10cSrcweir 
364cdf0e10cSrcweir void ScDocShell::BeforeXMLLoading()
365cdf0e10cSrcweir {
366cdf0e10cSrcweir     aDocument.DisableIdle( sal_True );
367cdf0e10cSrcweir 
368cdf0e10cSrcweir     // prevent unnecessary broadcasts and updates
369cdf0e10cSrcweir     DBG_ASSERT(pModificator == NULL, "The Modificator should not exist");
370cdf0e10cSrcweir 	pModificator = new ScDocShellModificator( *this );
371cdf0e10cSrcweir 
372cdf0e10cSrcweir     aDocument.SetImportingXML( sal_True );
373cdf0e10cSrcweir     aDocument.EnableExecuteLink( false );   // #i101304# to be safe, prevent nested loading from external references
374cdf0e10cSrcweir     aDocument.EnableUndo( sal_False );
375cdf0e10cSrcweir 	// prevent unnecessary broadcasts and "half way listeners"
376cdf0e10cSrcweir 	aDocument.SetInsertingFromOtherDoc( sal_True );
377cdf0e10cSrcweir 
378cdf0e10cSrcweir 	if (GetCreateMode() != SFX_CREATE_MODE_ORGANIZER)
379cdf0e10cSrcweir 		ScColumn::bDoubleAlloc = sal_True;
380cdf0e10cSrcweir }
381cdf0e10cSrcweir 
382cdf0e10cSrcweir void ScDocShell::AfterXMLLoading(sal_Bool bRet)
383cdf0e10cSrcweir {
384cdf0e10cSrcweir 	if (GetCreateMode() != SFX_CREATE_MODE_ORGANIZER)
385cdf0e10cSrcweir 	{
386cdf0e10cSrcweir 		UpdateLinks();
387cdf0e10cSrcweir 		// don't prevent establishing of listeners anymore
388cdf0e10cSrcweir 		aDocument.SetInsertingFromOtherDoc( sal_False );
389cdf0e10cSrcweir 		if ( bRet )
390cdf0e10cSrcweir 		{
391cdf0e10cSrcweir 			ScChartListenerCollection* pChartListener = aDocument.GetChartListenerCollection();
392cdf0e10cSrcweir 			if (pChartListener)
393cdf0e10cSrcweir 				pChartListener->UpdateDirtyCharts();
394cdf0e10cSrcweir 
395cdf0e10cSrcweir 			// #95582#; set the table names of linked tables to the new path
396cdf0e10cSrcweir 			SCTAB nTabCount = aDocument.GetTableCount();
397cdf0e10cSrcweir 			for (SCTAB i = 0; i < nTabCount; ++i)
398cdf0e10cSrcweir 			{
399cdf0e10cSrcweir 				if (aDocument.IsLinked( i ))
400cdf0e10cSrcweir 				{
401cdf0e10cSrcweir 					String aName;
402cdf0e10cSrcweir 					aDocument.GetName(i, aName);
403cdf0e10cSrcweir 					String aLinkTabName = aDocument.GetLinkTab(i);
404cdf0e10cSrcweir 					xub_StrLen nLinkTabNameLength = aLinkTabName.Len();
405cdf0e10cSrcweir 					xub_StrLen nNameLength = aName.Len();
406cdf0e10cSrcweir 					if (nLinkTabNameLength < nNameLength)
407cdf0e10cSrcweir 					{
408cdf0e10cSrcweir 
409cdf0e10cSrcweir 						// remove the quottes on begin and end of the docname and restore the escaped quotes
410cdf0e10cSrcweir 						const sal_Unicode* pNameBuffer = aName.GetBuffer();
411cdf0e10cSrcweir 						if ( *pNameBuffer == '\'' && // all docnames have to have a ' character on the first pos
412cdf0e10cSrcweir 							ScGlobal::UnicodeStrChr( pNameBuffer, SC_COMPILER_FILE_TAB_SEP ) )
413cdf0e10cSrcweir 						{
414cdf0e10cSrcweir 							rtl::OUStringBuffer aDocURLBuffer;
415cdf0e10cSrcweir 							sal_Bool bQuote = sal_True;			// Dokumentenname ist immer quoted
416cdf0e10cSrcweir 							++pNameBuffer;
417cdf0e10cSrcweir 							while ( bQuote && *pNameBuffer )
418cdf0e10cSrcweir 							{
419cdf0e10cSrcweir 								if ( *pNameBuffer == '\'' && *(pNameBuffer-1) != '\\' )
420cdf0e10cSrcweir 									bQuote = sal_False;
421cdf0e10cSrcweir 								else if( !(*pNameBuffer == '\\' && *(pNameBuffer+1) == '\'') )
422cdf0e10cSrcweir 									aDocURLBuffer.append(*pNameBuffer);		// falls escaped Quote: nur Quote in den Namen
423cdf0e10cSrcweir 								++pNameBuffer;
424cdf0e10cSrcweir 							}
425cdf0e10cSrcweir 
426cdf0e10cSrcweir 
427cdf0e10cSrcweir 							if( *pNameBuffer == SC_COMPILER_FILE_TAB_SEP )  // after the last quote of the docname should be the # char
428cdf0e10cSrcweir 							{
429cdf0e10cSrcweir 								xub_StrLen nIndex = nNameLength - nLinkTabNameLength;
430cdf0e10cSrcweir 								INetURLObject aINetURLObject(aDocURLBuffer.makeStringAndClear());
431cdf0e10cSrcweir 								if(	aName.Equals(aLinkTabName, nIndex, nLinkTabNameLength) &&
432cdf0e10cSrcweir 									(aName.GetChar(nIndex - 1) == '#') && // before the table name should be the # char
433cdf0e10cSrcweir 									!aINetURLObject.HasError()) // the docname should be a valid URL
434cdf0e10cSrcweir 								{
435cdf0e10cSrcweir                         	    	aName = ScGlobal::GetDocTabName( aDocument.GetLinkDoc( i ), aDocument.GetLinkTab( i ) );
436cdf0e10cSrcweir 	                            	aDocument.RenameTab(i, aName, sal_True, sal_True);
437cdf0e10cSrcweir 								}
438cdf0e10cSrcweir 								// else;  nothing has to happen, because it is a user given name
439cdf0e10cSrcweir 							}
440cdf0e10cSrcweir 							// else;  nothing has to happen, because it is a user given name
441cdf0e10cSrcweir 						}
442cdf0e10cSrcweir 						// else;  nothing has to happen, because it is a user given name
443cdf0e10cSrcweir 					}
444cdf0e10cSrcweir 					// else;  nothing has to happen, because it is a user given name
445cdf0e10cSrcweir 				}
446cdf0e10cSrcweir 			}
447cdf0e10cSrcweir 
448cdf0e10cSrcweir             // #i94570# DataPilot table names have to be unique, or the tables can't be accessed by API.
449cdf0e10cSrcweir             // If no name (or an invalid name, skipped in ScXMLDataPilotTableContext::EndElement) was set, create a new name.
450cdf0e10cSrcweir             ScDPCollection* pDPCollection = aDocument.GetDPCollection();
451cdf0e10cSrcweir             if ( pDPCollection )
452cdf0e10cSrcweir             {
453cdf0e10cSrcweir                 sal_uInt16 nDPCount = pDPCollection->GetCount();
454cdf0e10cSrcweir                 for (sal_uInt16 nDP=0; nDP<nDPCount; nDP++)
455cdf0e10cSrcweir                 {
456cdf0e10cSrcweir                     ScDPObject* pDPObj = (*pDPCollection)[nDP];
457cdf0e10cSrcweir                     if ( !pDPObj->GetName().Len() )
458cdf0e10cSrcweir                         pDPObj->SetName( pDPCollection->CreateNewName() );
459cdf0e10cSrcweir                 }
460cdf0e10cSrcweir             }
461cdf0e10cSrcweir 		}
462cdf0e10cSrcweir 		ScColumn::bDoubleAlloc = sal_False;
463cdf0e10cSrcweir     }
464cdf0e10cSrcweir     else
465cdf0e10cSrcweir 		aDocument.SetInsertingFromOtherDoc( sal_False );
466cdf0e10cSrcweir 
467cdf0e10cSrcweir 	aDocument.SetImportingXML( sal_False );
468cdf0e10cSrcweir     aDocument.EnableExecuteLink( true );
469cdf0e10cSrcweir     aDocument.EnableUndo( sal_True );
470cdf0e10cSrcweir     bIsEmpty = sal_False;
471cdf0e10cSrcweir 
472cdf0e10cSrcweir     if (pModificator)
473cdf0e10cSrcweir     {
474cdf0e10cSrcweir         delete pModificator;
475cdf0e10cSrcweir         pModificator = NULL;
476cdf0e10cSrcweir     }
477cdf0e10cSrcweir     else
478cdf0e10cSrcweir     {
479cdf0e10cSrcweir         DBG_ERROR("The Modificator should exist");
480cdf0e10cSrcweir     }
481cdf0e10cSrcweir 
482cdf0e10cSrcweir     aDocument.DisableIdle( sal_False );
483cdf0e10cSrcweir }
484cdf0e10cSrcweir 
485cdf0e10cSrcweir sal_Bool ScDocShell::LoadXML( SfxMedium* pLoadMedium, const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStor )
486cdf0e10cSrcweir {
487cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "sb99857", "ScDocShell::LoadXML" );
488cdf0e10cSrcweir 
489cdf0e10cSrcweir 	//	MacroCallMode is no longer needed, state is kept in SfxObjectShell now
490cdf0e10cSrcweir 
491cdf0e10cSrcweir 	// no Seek(0) here - always loading from storage, GetInStream must not be called
492cdf0e10cSrcweir 
493cdf0e10cSrcweir     BeforeXMLLoading();
494cdf0e10cSrcweir 
495cdf0e10cSrcweir     // #i62677# BeforeXMLLoading is also called from ScXMLImport::startDocument when invoked
496cdf0e10cSrcweir     // from an external component. The XMLFromWrapper flag is only set here, when called
497cdf0e10cSrcweir     // through ScDocShell.
498cdf0e10cSrcweir     aDocument.SetXMLFromWrapper( sal_True );
499cdf0e10cSrcweir 
500cdf0e10cSrcweir     ScXMLImportWrapper aImport( aDocument, pLoadMedium, xStor );
501cdf0e10cSrcweir 
502cdf0e10cSrcweir     sal_Bool bRet(sal_False);
503cdf0e10cSrcweir     ErrCode nError = ERRCODE_NONE;
504cdf0e10cSrcweir 	if (GetCreateMode() != SFX_CREATE_MODE_ORGANIZER)
505cdf0e10cSrcweir         bRet = aImport.Import(sal_False, nError);
506cdf0e10cSrcweir 	else
507cdf0e10cSrcweir         bRet = aImport.Import(sal_True, nError);
508cdf0e10cSrcweir 
509cdf0e10cSrcweir     if ( nError )
510cdf0e10cSrcweir         pLoadMedium->SetError( nError, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ) );
511cdf0e10cSrcweir 
512cdf0e10cSrcweir     aDocument.SetXMLFromWrapper( sal_False );
513cdf0e10cSrcweir     AfterXMLLoading(bRet);
514cdf0e10cSrcweir 
515cdf0e10cSrcweir 	//!	row heights...
516cdf0e10cSrcweir 
517cdf0e10cSrcweir 	return bRet;
518cdf0e10cSrcweir }
519cdf0e10cSrcweir 
520cdf0e10cSrcweir sal_Bool ScDocShell::SaveXML( SfxMedium* pSaveMedium, const ::com::sun::star::uno::Reference< ::com::sun::star::embed::XStorage >& xStor )
521cdf0e10cSrcweir {
522cdf0e10cSrcweir     RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "sb99857", "ScDocShell::SaveXML" );
523cdf0e10cSrcweir 
524cdf0e10cSrcweir     aDocument.DisableIdle( sal_True );
525cdf0e10cSrcweir 
526cdf0e10cSrcweir     ScXMLImportWrapper aImport( aDocument, pSaveMedium, xStor );
527cdf0e10cSrcweir 	sal_Bool bRet(sal_False);
528cdf0e10cSrcweir 	if (GetCreateMode() != SFX_CREATE_MODE_ORGANIZER)
529cdf0e10cSrcweir 		bRet = aImport.Export(sal_False);
530cdf0e10cSrcweir 	else
531cdf0e10cSrcweir 		bRet = aImport.Export(sal_True);
532cdf0e10cSrcweir 
533cdf0e10cSrcweir     aDocument.DisableIdle( sal_False );
534cdf0e10cSrcweir 
535cdf0e10cSrcweir     return bRet;
536cdf0e10cSrcweir }
537cdf0e10cSrcweir 
538cdf0e10cSrcweir sal_Bool __EXPORT ScDocShell::Load( SfxMedium& rMedium )
539cdf0e10cSrcweir {
540cdf0e10cSrcweir 	RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "nn93723", "ScDocShell::Load" );
541cdf0e10cSrcweir 
542cdf0e10cSrcweir 	ScRefreshTimerProtector( aDocument.GetRefreshTimerControlAddress() );
543cdf0e10cSrcweir 
544cdf0e10cSrcweir 	//	only the latin script language is loaded
545cdf0e10cSrcweir 	//	-> initialize the others from options (before loading)
546cdf0e10cSrcweir     InitOptions(true);
547cdf0e10cSrcweir 
548cdf0e10cSrcweir 	GetUndoManager()->Clear();
549cdf0e10cSrcweir 
550cdf0e10cSrcweir     sal_Bool bRet = SfxObjectShell::Load( rMedium );
551cdf0e10cSrcweir 	if( bRet )
552cdf0e10cSrcweir 	{
553cdf0e10cSrcweir         if (GetMedium())
554cdf0e10cSrcweir         {
555cdf0e10cSrcweir             SFX_ITEMSET_ARG( rMedium.GetItemSet(), pUpdateDocItem, SfxUInt16Item, SID_UPDATEDOCMODE, sal_False);
556cdf0e10cSrcweir             nCanUpdate = pUpdateDocItem ? pUpdateDocItem->GetValue() : com::sun::star::document::UpdateDocMode::NO_UPDATE;
557cdf0e10cSrcweir         }
558cdf0e10cSrcweir 
559cdf0e10cSrcweir 		{
560cdf0e10cSrcweir 			//	prepare a valid document for XML filter
561cdf0e10cSrcweir 			//	(for ConvertFrom, InitNew is called before)
562cdf0e10cSrcweir 			aDocument.MakeTable(0);
563cdf0e10cSrcweir 			aDocument.GetStyleSheetPool()->CreateStandardStyles();
564cdf0e10cSrcweir 			aDocument.UpdStlShtPtrsFrmNms();
565cdf0e10cSrcweir 
566cdf0e10cSrcweir             bRet = LoadXML( &rMedium, NULL );
567cdf0e10cSrcweir 		}
568cdf0e10cSrcweir 	}
569cdf0e10cSrcweir 
570cdf0e10cSrcweir     if (!bRet && !rMedium.GetError())
571cdf0e10cSrcweir         rMedium.SetError( SVSTREAM_FILEFORMAT_ERROR, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ) );
572cdf0e10cSrcweir 
573cdf0e10cSrcweir     if (rMedium.GetError())
574cdf0e10cSrcweir         SetError( rMedium.GetError(), ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ) );
575cdf0e10cSrcweir 
576cdf0e10cSrcweir 	InitItems();
577cdf0e10cSrcweir 	CalcOutputFactor();
578cdf0e10cSrcweir 
579cdf0e10cSrcweir 	// #73762# invalidate eventually temporary table areas
580cdf0e10cSrcweir 	if ( bRet )
581cdf0e10cSrcweir 		aDocument.InvalidateTableArea();
582cdf0e10cSrcweir 
583cdf0e10cSrcweir 	bIsEmpty = sal_False;
584cdf0e10cSrcweir 	FinishedLoading( SFX_LOADED_MAINDOCUMENT | SFX_LOADED_IMAGES );
585cdf0e10cSrcweir 	return bRet;
586cdf0e10cSrcweir }
587cdf0e10cSrcweir 
588cdf0e10cSrcweir void __EXPORT ScDocShell::Notify( SfxBroadcaster&, const SfxHint& rHint )
589cdf0e10cSrcweir {
590cdf0e10cSrcweir     if (rHint.ISA(ScTablesHint) )
591cdf0e10cSrcweir     {
592cdf0e10cSrcweir         const ScTablesHint& rScHint = static_cast< const ScTablesHint& >( rHint );
593cdf0e10cSrcweir         if (rScHint.GetId() == SC_TAB_INSERTED)
594cdf0e10cSrcweir         {
595cdf0e10cSrcweir             uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents = aDocument.GetVbaEventProcessor();
596cdf0e10cSrcweir             if ( xVbaEvents.is() ) try
597cdf0e10cSrcweir             {
598cdf0e10cSrcweir                 uno::Sequence< uno::Any > aArgs( 1 );
599cdf0e10cSrcweir                 aArgs[0] <<= rScHint.GetTab1();
600cdf0e10cSrcweir                 xVbaEvents->processVbaEvent( script::vba::VBAEventId::WORKBOOK_NEWSHEET, aArgs );
601cdf0e10cSrcweir             }
602cdf0e10cSrcweir             catch( uno::Exception& )
603cdf0e10cSrcweir             {
604cdf0e10cSrcweir             }
605cdf0e10cSrcweir         }
606cdf0e10cSrcweir     }
607cdf0e10cSrcweir 
608cdf0e10cSrcweir 	if (rHint.ISA(SfxSimpleHint))								// ohne Parameter
609cdf0e10cSrcweir 	{
610cdf0e10cSrcweir 		sal_uLong nSlot = ((const SfxSimpleHint&)rHint).GetId();
611cdf0e10cSrcweir 		switch ( nSlot )
612cdf0e10cSrcweir 		{
613cdf0e10cSrcweir 			case SFX_HINT_TITLECHANGED:
614cdf0e10cSrcweir 				aDocument.SetName( SfxShell::GetName() );
615cdf0e10cSrcweir 				//	RegisterNewTargetNames gibts nicht mehr
616cdf0e10cSrcweir 				SFX_APP()->Broadcast(SfxSimpleHint( SC_HINT_DOCNAME_CHANGED ));	// Navigator
617cdf0e10cSrcweir 				break;
618cdf0e10cSrcweir 		}
619cdf0e10cSrcweir 	}
620cdf0e10cSrcweir 	else if (rHint.ISA(SfxStyleSheetHint))						// Vorlagen geaendert
621cdf0e10cSrcweir 		NotifyStyle((const SfxStyleSheetHint&) rHint);
622cdf0e10cSrcweir 	else if (rHint.ISA(ScAutoStyleHint))
623cdf0e10cSrcweir 	{
624cdf0e10cSrcweir 		//!	direct call for AutoStyles
625cdf0e10cSrcweir 
626cdf0e10cSrcweir 		//	this is called synchronously from ScInterpreter::ScStyle,
627cdf0e10cSrcweir 		//	modifying the document must be asynchronous
628cdf0e10cSrcweir 		//	(handled by AddInitial)
629cdf0e10cSrcweir 
630cdf0e10cSrcweir 		ScAutoStyleHint& rStlHint = (ScAutoStyleHint&)rHint;
631cdf0e10cSrcweir 		ScRange aRange = rStlHint.GetRange();
632cdf0e10cSrcweir 		String aName1 = rStlHint.GetStyle1();
633cdf0e10cSrcweir 		String aName2 = rStlHint.GetStyle2();
634cdf0e10cSrcweir 		sal_uInt32 nTimeout = rStlHint.GetTimeout();
635cdf0e10cSrcweir 
636cdf0e10cSrcweir 		if (!pAutoStyleList)
637cdf0e10cSrcweir 			pAutoStyleList = new ScAutoStyleList(this);
638cdf0e10cSrcweir 		pAutoStyleList->AddInitial( aRange, aName1, nTimeout, aName2 );
639cdf0e10cSrcweir 	}
640cdf0e10cSrcweir     else if ( rHint.ISA( SfxEventHint ) )
641cdf0e10cSrcweir     {
642cdf0e10cSrcweir         sal_uLong nEventId = ((SfxEventHint&)rHint).GetEventId();
643cdf0e10cSrcweir         switch ( nEventId )
644cdf0e10cSrcweir         {
645cdf0e10cSrcweir             case SFX_EVENT_LOADFINISHED:
646cdf0e10cSrcweir                 {
647cdf0e10cSrcweir                     // the readonly documents should not be opened in shared mode
648cdf0e10cSrcweir                     if ( HasSharedXMLFlagSet() && !SC_MOD()->IsInSharedDocLoading() && !IsReadOnly() )
649cdf0e10cSrcweir                     {
650cdf0e10cSrcweir                         if ( SwitchToShared( sal_True, sal_False ) )
651cdf0e10cSrcweir                         {
652cdf0e10cSrcweir                             ScViewData* pViewData = GetViewData();
653cdf0e10cSrcweir                             ScTabView* pTabView = ( pViewData ? dynamic_cast< ScTabView* >( pViewData->GetView() ) : NULL );
654cdf0e10cSrcweir                             if ( pTabView )
655cdf0e10cSrcweir                             {
656cdf0e10cSrcweir                                 pTabView->UpdateLayerLocks();
657cdf0e10cSrcweir                             }
658cdf0e10cSrcweir                         }
659cdf0e10cSrcweir                         else
660cdf0e10cSrcweir                         {
661cdf0e10cSrcweir                             // switching to shared mode has failed, the document should be opened readonly
662cdf0e10cSrcweir                             // TODO/LATER: And error message should be shown here probably
663cdf0e10cSrcweir                             SetReadOnlyUI( sal_True );
664cdf0e10cSrcweir                         }
665cdf0e10cSrcweir                     }
666cdf0e10cSrcweir                 }
667cdf0e10cSrcweir                 break;
668cdf0e10cSrcweir             case SFX_EVENT_VIEWCREATED:
669cdf0e10cSrcweir                 {
670cdf0e10cSrcweir                     if ( IsDocShared() && !SC_MOD()->IsInSharedDocLoading() )
671cdf0e10cSrcweir                     {
672cdf0e10cSrcweir                         ScAppOptions aAppOptions = SC_MOD()->GetAppOptions();
673cdf0e10cSrcweir                         if ( aAppOptions.GetShowSharedDocumentWarning() )
674cdf0e10cSrcweir                         {
675cdf0e10cSrcweir                             WarningBox aBox( GetActiveDialogParent(), WinBits( WB_OK ),
676cdf0e10cSrcweir                                 ScGlobal::GetRscString( STR_SHARED_DOC_WARNING ) );
677cdf0e10cSrcweir                             aBox.SetDefaultCheckBoxText();
678cdf0e10cSrcweir                             aBox.Execute();
679cdf0e10cSrcweir                             sal_Bool bChecked = aBox.GetCheckBoxState();
680cdf0e10cSrcweir                             if ( bChecked )
681cdf0e10cSrcweir                             {
682cdf0e10cSrcweir                                 aAppOptions.SetShowSharedDocumentWarning( !bChecked );
683cdf0e10cSrcweir                                 SC_MOD()->SetAppOptions( aAppOptions );
684cdf0e10cSrcweir                             }
685cdf0e10cSrcweir                         }
686cdf0e10cSrcweir                     }
687cdf0e10cSrcweir 
688cdf0e10cSrcweir                     try
689cdf0e10cSrcweir                     {
690cdf0e10cSrcweir                         uno::Reference< uno::XComponentContext > xContext;
691cdf0e10cSrcweir                         uno::Reference< lang::XMultiServiceFactory > xServiceManager = ::comphelper::getProcessServiceFactory();
692cdf0e10cSrcweir                         uno::Reference< beans::XPropertySet > xProp( xServiceManager, uno::UNO_QUERY_THROW );
693cdf0e10cSrcweir                         xProp->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "DefaultContext" ) ) ) >>= xContext;
694cdf0e10cSrcweir                         if ( xContext.is() )
695cdf0e10cSrcweir                         {
696cdf0e10cSrcweir                             uno::Reference< container::XContentEnumerationAccess > xEnumAccess( xServiceManager, uno::UNO_QUERY_THROW );
697cdf0e10cSrcweir                             uno::Reference< container::XEnumeration> xEnum = xEnumAccess->createContentEnumeration(
698cdf0e10cSrcweir                                 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sheet.SpreadsheetDocumentJob" ) ) );
699cdf0e10cSrcweir                             if ( xEnum.is() )
700cdf0e10cSrcweir                             {
701cdf0e10cSrcweir                                 while ( xEnum->hasMoreElements() )
702cdf0e10cSrcweir                                 {
703cdf0e10cSrcweir                                     uno::Any aAny = xEnum->nextElement();
704cdf0e10cSrcweir                                     uno::Reference< lang::XSingleComponentFactory > xFactory;
705cdf0e10cSrcweir                                     aAny >>= xFactory;
706cdf0e10cSrcweir                                     if ( xFactory.is() )
707cdf0e10cSrcweir                                     {
708cdf0e10cSrcweir                                         uno::Reference< task::XJob > xJob( xFactory->createInstanceWithContext( xContext ), uno::UNO_QUERY_THROW );
709cdf0e10cSrcweir                                         uno::Sequence< beans::NamedValue > aArgsForJob(1);
710cdf0e10cSrcweir                                         ScViewData* pViewData = GetViewData();
711cdf0e10cSrcweir                                         SfxViewShell* pViewShell = ( pViewData ? pViewData->GetViewShell() : NULL );
712cdf0e10cSrcweir                                         SfxViewFrame* pViewFrame = ( pViewShell ? pViewShell->GetViewFrame() : NULL );
713cdf0e10cSrcweir                                         SfxFrame* pFrame = ( pViewFrame ? &pViewFrame->GetFrame() : NULL );
714cdf0e10cSrcweir                                         uno::Reference< frame::XController > xController = ( pFrame ? pFrame->GetController() : 0 );
715cdf0e10cSrcweir                                         uno::Reference< sheet::XSpreadsheetView > xSpreadsheetView( xController, uno::UNO_QUERY_THROW );
716cdf0e10cSrcweir                                         aArgsForJob[0] = beans::NamedValue( ::rtl::OUString::createFromAscii( "SpreadsheetView" ),
717cdf0e10cSrcweir                                             uno::makeAny( xSpreadsheetView ) );
718cdf0e10cSrcweir                                         xJob->execute( aArgsForJob );
719cdf0e10cSrcweir                                     }
720cdf0e10cSrcweir                                 }
721cdf0e10cSrcweir                             }
722cdf0e10cSrcweir                         }
723cdf0e10cSrcweir                     }
724cdf0e10cSrcweir                     catch ( uno::Exception & )
725cdf0e10cSrcweir                     {
726cdf0e10cSrcweir                     }
727cdf0e10cSrcweir                 }
728cdf0e10cSrcweir                 break;
729cdf0e10cSrcweir             case SFX_EVENT_SAVEDOC:
730cdf0e10cSrcweir                 {
731cdf0e10cSrcweir                     if ( IsDocShared() && !SC_MOD()->IsInSharedDocSaving() )
732cdf0e10cSrcweir                     {
733cdf0e10cSrcweir                         bool bSuccess = false;
734cdf0e10cSrcweir                         bool bRetry = true;
735cdf0e10cSrcweir                         while ( bRetry )
736cdf0e10cSrcweir                         {
737cdf0e10cSrcweir                             bRetry = false;
738cdf0e10cSrcweir                             uno::Reference< frame::XModel > xModel;
739cdf0e10cSrcweir                             try
740cdf0e10cSrcweir                             {
741cdf0e10cSrcweir                                 // load shared file
742cdf0e10cSrcweir                                 xModel.set( LoadSharedDocument(), uno::UNO_QUERY_THROW );
743cdf0e10cSrcweir                                 uno::Reference< util::XCloseable > xCloseable( xModel, uno::UNO_QUERY_THROW );
744cdf0e10cSrcweir 
745cdf0e10cSrcweir                                 // check if shared flag is set in shared file
746cdf0e10cSrcweir                                 bool bShared = false;
747cdf0e10cSrcweir                                 ScModelObj* pDocObj = ScModelObj::getImplementation( xModel );
748cdf0e10cSrcweir                                 ScDocShell* pSharedDocShell = ( pDocObj ? dynamic_cast< ScDocShell* >( pDocObj->GetObjectShell() ) : NULL );
749cdf0e10cSrcweir                                 if ( pSharedDocShell )
750cdf0e10cSrcweir                                 {
751cdf0e10cSrcweir                                     bShared = pSharedDocShell->HasSharedXMLFlagSet();
752cdf0e10cSrcweir                                 }
753cdf0e10cSrcweir 
754cdf0e10cSrcweir                                 // #i87870# check if shared status was disabled and enabled again
755cdf0e10cSrcweir                                 bool bOwnEntry = false;
756cdf0e10cSrcweir                                 bool bEntriesNotAccessible = false;
757cdf0e10cSrcweir                                 try
758cdf0e10cSrcweir                                 {
759cdf0e10cSrcweir                                     ::svt::ShareControlFile aControlFile( GetSharedFileURL() );
760cdf0e10cSrcweir                                     bOwnEntry = aControlFile.HasOwnEntry();
761cdf0e10cSrcweir                                 }
762cdf0e10cSrcweir                                 catch ( uno::Exception& )
763cdf0e10cSrcweir                                 {
764cdf0e10cSrcweir                                     bEntriesNotAccessible = true;
765cdf0e10cSrcweir                                 }
766cdf0e10cSrcweir 
767cdf0e10cSrcweir                                 if ( bShared && bOwnEntry )
768cdf0e10cSrcweir                                 {
769cdf0e10cSrcweir                                     uno::Reference< frame::XStorable > xStorable( xModel, uno::UNO_QUERY_THROW );
770cdf0e10cSrcweir 
771cdf0e10cSrcweir                                     if ( xStorable->isReadonly() )
772cdf0e10cSrcweir                                     {
773cdf0e10cSrcweir                                         xCloseable->close( sal_True );
774cdf0e10cSrcweir 
775cdf0e10cSrcweir                                         String aUserName( ScGlobal::GetRscString( STR_UNKNOWN_USER ) );
776cdf0e10cSrcweir                                         bool bNoLockAccess = false;
777cdf0e10cSrcweir                                         try
778cdf0e10cSrcweir                                         {
779cdf0e10cSrcweir                                             ::svt::DocumentLockFile aLockFile( GetSharedFileURL() );
780cdf0e10cSrcweir                                             uno::Sequence< ::rtl::OUString > aData = aLockFile.GetLockData();
781cdf0e10cSrcweir                                             if ( aData.getLength() > LOCKFILE_SYSUSERNAME_ID )
782cdf0e10cSrcweir                                             {
783cdf0e10cSrcweir                                                 if ( aData[LOCKFILE_OOOUSERNAME_ID].getLength() > 0 )
784cdf0e10cSrcweir                                                 {
785cdf0e10cSrcweir                                                     aUserName = aData[LOCKFILE_OOOUSERNAME_ID];
786cdf0e10cSrcweir                                                 }
787cdf0e10cSrcweir                                                 else if ( aData[LOCKFILE_SYSUSERNAME_ID].getLength() > 0 )
788cdf0e10cSrcweir                                                 {
789cdf0e10cSrcweir                                                     aUserName = aData[LOCKFILE_SYSUSERNAME_ID];
790cdf0e10cSrcweir                                                 }
791cdf0e10cSrcweir                                             }
792cdf0e10cSrcweir                                         }
793cdf0e10cSrcweir                                         catch ( uno::Exception& )
794cdf0e10cSrcweir                                         {
795cdf0e10cSrcweir                                             bNoLockAccess = true;
796cdf0e10cSrcweir                                         }
797cdf0e10cSrcweir 
798cdf0e10cSrcweir                                         if ( bNoLockAccess )
799cdf0e10cSrcweir                                         {
800cdf0e10cSrcweir                                             // TODO/LATER: in future an error regarding impossibility to open file for writing could be shown
801cdf0e10cSrcweir                                             ErrorHandler::HandleError( ERRCODE_IO_GENERAL );
802cdf0e10cSrcweir                                         }
803cdf0e10cSrcweir                                         else
804cdf0e10cSrcweir                                         {
805cdf0e10cSrcweir                                             String aMessage( ScGlobal::GetRscString( STR_FILE_LOCKED_SAVE_LATER ) );
806cdf0e10cSrcweir                                             aMessage.SearchAndReplaceAscii( "%1", aUserName );
807cdf0e10cSrcweir 
808cdf0e10cSrcweir                                             WarningBox aBox( GetActiveDialogParent(), WinBits( WB_RETRY_CANCEL | WB_DEF_RETRY ), aMessage );
809cdf0e10cSrcweir                                             if ( aBox.Execute() == RET_RETRY )
810cdf0e10cSrcweir                                             {
811cdf0e10cSrcweir                                                 bRetry = true;
812cdf0e10cSrcweir                                             }
813cdf0e10cSrcweir                                         }
814cdf0e10cSrcweir                                     }
815cdf0e10cSrcweir                                     else
816cdf0e10cSrcweir                                     {
817cdf0e10cSrcweir                                         // merge changes from shared file into temp file
818cdf0e10cSrcweir                                         bool bSaveToShared = false;
819cdf0e10cSrcweir                                         if ( pSharedDocShell )
820cdf0e10cSrcweir                                         {
821cdf0e10cSrcweir                                             bSaveToShared = MergeSharedDocument( pSharedDocShell );
822cdf0e10cSrcweir                                         }
823cdf0e10cSrcweir 
824cdf0e10cSrcweir                                         // close shared file
825cdf0e10cSrcweir                                         xCloseable->close( sal_True );
826cdf0e10cSrcweir 
827cdf0e10cSrcweir                                         // TODO: keep file lock on shared file
828cdf0e10cSrcweir 
829cdf0e10cSrcweir                                         // store to shared file
830cdf0e10cSrcweir                                         if ( bSaveToShared )
831cdf0e10cSrcweir                                         {
832cdf0e10cSrcweir                                             bool bChangedViewSettings = false;
833cdf0e10cSrcweir                                             ScChangeViewSettings* pChangeViewSet = aDocument.GetChangeViewSettings();
834cdf0e10cSrcweir                                             if ( pChangeViewSet && pChangeViewSet->ShowChanges() )
835cdf0e10cSrcweir                                             {
836cdf0e10cSrcweir                                                 pChangeViewSet->SetShowChanges( sal_False );
837cdf0e10cSrcweir                                                 pChangeViewSet->SetShowAccepted( sal_False );
838cdf0e10cSrcweir                                                 aDocument.SetChangeViewSettings( *pChangeViewSet );
839cdf0e10cSrcweir                                                 bChangedViewSettings = true;
840cdf0e10cSrcweir                                             }
841cdf0e10cSrcweir 
842cdf0e10cSrcweir                                             uno::Reference< frame::XStorable > xStor( GetModel(), uno::UNO_QUERY_THROW );
843cdf0e10cSrcweir                                             // TODO/LATER: More entries from the MediaDescriptor might be interesting for the merge
844cdf0e10cSrcweir                                             uno::Sequence< beans::PropertyValue > aValues(1);
845cdf0e10cSrcweir                                             aValues[0].Name = ::rtl::OUString::createFromAscii( "FilterName" );
846cdf0e10cSrcweir                                             aValues[0].Value <<= ::rtl::OUString( GetMedium()->GetFilter()->GetFilterName() );
847cdf0e10cSrcweir 
848cdf0e10cSrcweir                                             SFX_ITEMSET_ARG( GetMedium()->GetItemSet(), pPasswordItem, SfxStringItem, SID_PASSWORD, sal_False);
849cdf0e10cSrcweir                                             if ( pPasswordItem && pPasswordItem->GetValue().Len() )
850cdf0e10cSrcweir                                             {
851cdf0e10cSrcweir                                                 aValues.realloc( 2 );
852cdf0e10cSrcweir                                                 aValues[1].Name = ::rtl::OUString::createFromAscii( "Password" );
853cdf0e10cSrcweir                                                 aValues[1].Value <<= ::rtl::OUString( pPasswordItem->GetValue() );
854cdf0e10cSrcweir                                             }
855cdf0e10cSrcweir 
856cdf0e10cSrcweir                                             SC_MOD()->SetInSharedDocSaving( true );
857cdf0e10cSrcweir                                             xStor->storeToURL( GetSharedFileURL(), aValues );
858cdf0e10cSrcweir                                             SC_MOD()->SetInSharedDocSaving( false );
859cdf0e10cSrcweir 
860cdf0e10cSrcweir                                             if ( bChangedViewSettings )
861cdf0e10cSrcweir                                             {
862cdf0e10cSrcweir                                                 pChangeViewSet->SetShowChanges( sal_True );
863cdf0e10cSrcweir                                                 pChangeViewSet->SetShowAccepted( sal_True );
864cdf0e10cSrcweir                                                 aDocument.SetChangeViewSettings( *pChangeViewSet );
865cdf0e10cSrcweir                                             }
866cdf0e10cSrcweir                                         }
867cdf0e10cSrcweir 
868cdf0e10cSrcweir                                         bSuccess = true;
869cdf0e10cSrcweir                                         GetUndoManager()->Clear();
870cdf0e10cSrcweir                                     }
871cdf0e10cSrcweir                                 }
872cdf0e10cSrcweir                                 else
873cdf0e10cSrcweir                                 {
874cdf0e10cSrcweir                                     xCloseable->close( sal_True );
875cdf0e10cSrcweir 
876cdf0e10cSrcweir                                     if ( bEntriesNotAccessible )
877cdf0e10cSrcweir                                     {
878cdf0e10cSrcweir                                         // TODO/LATER: in future an error regarding impossibility to write to share control file could be shown
879cdf0e10cSrcweir                                         ErrorHandler::HandleError( ERRCODE_IO_GENERAL );
880cdf0e10cSrcweir                                     }
881cdf0e10cSrcweir                                     else
882cdf0e10cSrcweir                                     {
883cdf0e10cSrcweir                                         WarningBox aBox( GetActiveDialogParent(), WinBits( WB_OK ),
884cdf0e10cSrcweir                                             ScGlobal::GetRscString( STR_DOC_NOLONGERSHARED ) );
885cdf0e10cSrcweir                                         aBox.Execute();
886cdf0e10cSrcweir 
887cdf0e10cSrcweir                                         SfxBindings* pBindings = GetViewBindings();
888cdf0e10cSrcweir                                         if ( pBindings )
889cdf0e10cSrcweir                                         {
890cdf0e10cSrcweir                                             pBindings->ExecuteSynchron( SID_SAVEASDOC );
891cdf0e10cSrcweir                                         }
892cdf0e10cSrcweir                                     }
893cdf0e10cSrcweir                                 }
894cdf0e10cSrcweir                             }
895cdf0e10cSrcweir                             catch ( uno::Exception& )
896cdf0e10cSrcweir                             {
897cdf0e10cSrcweir                                 DBG_ERROR( "SFX_EVENT_SAVEDOC: caught exception\n" );
898cdf0e10cSrcweir                                 SC_MOD()->SetInSharedDocSaving( false );
899cdf0e10cSrcweir 
900cdf0e10cSrcweir                                 try
901cdf0e10cSrcweir                                 {
902cdf0e10cSrcweir                                     uno::Reference< util::XCloseable > xClose( xModel, uno::UNO_QUERY_THROW );
903cdf0e10cSrcweir                                     xClose->close( sal_True );
904cdf0e10cSrcweir                                 }
905cdf0e10cSrcweir                                 catch ( uno::Exception& )
906cdf0e10cSrcweir                                 {
907cdf0e10cSrcweir                                 }
908cdf0e10cSrcweir                             }
909cdf0e10cSrcweir                         }
910cdf0e10cSrcweir 
911cdf0e10cSrcweir                         if ( !bSuccess )
912cdf0e10cSrcweir                             SetError( ERRCODE_IO_ABORT, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ) ); // this error code will produce no error message, but will break the further saving process
913cdf0e10cSrcweir                     }
914cdf0e10cSrcweir                     if (pSheetSaveData)
915cdf0e10cSrcweir                         pSheetSaveData->SetInSupportedSave(true);
916cdf0e10cSrcweir                 }
917cdf0e10cSrcweir                 break;
918cdf0e10cSrcweir             case SFX_EVENT_SAVEASDOC:
919cdf0e10cSrcweir             case SFX_EVENT_SAVETODOC:
920cdf0e10cSrcweir                 // #i108978# If no event is sent before saving, there will also be no "...DONE" event,
921cdf0e10cSrcweir                 // and SAVE/SAVEAS can't be distinguished from SAVETO. So stream copying is only enabled
922cdf0e10cSrcweir                 // if there is a SAVE/SAVEAS/SAVETO event first.
923cdf0e10cSrcweir                 if (pSheetSaveData)
924cdf0e10cSrcweir                     pSheetSaveData->SetInSupportedSave(true);
925cdf0e10cSrcweir                 break;
926cdf0e10cSrcweir             case SFX_EVENT_SAVEDOCDONE:
927cdf0e10cSrcweir                 {
928cdf0e10cSrcweir                     if ( IsDocShared() && !SC_MOD()->IsInSharedDocSaving() )
929cdf0e10cSrcweir                     {
930cdf0e10cSrcweir                     }
931cdf0e10cSrcweir                     UseSheetSaveEntries();      // use positions from saved file for next saving
932cdf0e10cSrcweir                     if (pSheetSaveData)
933cdf0e10cSrcweir                         pSheetSaveData->SetInSupportedSave(false);
934cdf0e10cSrcweir                 }
935cdf0e10cSrcweir                 break;
936cdf0e10cSrcweir             case SFX_EVENT_SAVEASDOCDONE:
937cdf0e10cSrcweir                 // new positions are used after "save" and "save as", but not "save to"
938cdf0e10cSrcweir                 UseSheetSaveEntries();      // use positions from saved file for next saving
939cdf0e10cSrcweir                 if (pSheetSaveData)
940cdf0e10cSrcweir                     pSheetSaveData->SetInSupportedSave(false);
941cdf0e10cSrcweir                 break;
942cdf0e10cSrcweir             case SFX_EVENT_SAVETODOCDONE:
943cdf0e10cSrcweir                 // only reset the flag, don't use the new positions
944cdf0e10cSrcweir                 if (pSheetSaveData)
945cdf0e10cSrcweir                     pSheetSaveData->SetInSupportedSave(false);
946cdf0e10cSrcweir                 break;
947cdf0e10cSrcweir             default:
948cdf0e10cSrcweir                 {
949cdf0e10cSrcweir                 }
950cdf0e10cSrcweir                 break;
951cdf0e10cSrcweir         }
952cdf0e10cSrcweir     }
953cdf0e10cSrcweir }
954cdf0e10cSrcweir 
955cdf0e10cSrcweir 	// Inhalte fuer Organizer laden
956cdf0e10cSrcweir 
957cdf0e10cSrcweir 
958cdf0e10cSrcweir sal_Bool __EXPORT ScDocShell::LoadFrom( SfxMedium& rMedium )
959cdf0e10cSrcweir {
960cdf0e10cSrcweir 	RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "nn93723", "ScDocShell::LoadFrom" );
961cdf0e10cSrcweir 
962cdf0e10cSrcweir 	ScRefreshTimerProtector( aDocument.GetRefreshTimerControlAddress() );
963cdf0e10cSrcweir 
964cdf0e10cSrcweir 	WaitObject aWait( GetActiveDialogParent() );
965cdf0e10cSrcweir 
966cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
967cdf0e10cSrcweir 
968cdf0e10cSrcweir     if (GetMedium())
969cdf0e10cSrcweir     {
970cdf0e10cSrcweir         SFX_ITEMSET_ARG( rMedium.GetItemSet(), pUpdateDocItem, SfxUInt16Item, SID_UPDATEDOCMODE, sal_False);
971cdf0e10cSrcweir         nCanUpdate = pUpdateDocItem ? pUpdateDocItem->GetValue() : com::sun::star::document::UpdateDocMode::NO_UPDATE;
972cdf0e10cSrcweir     }
973cdf0e10cSrcweir 
974cdf0e10cSrcweir     //  until loading/saving only the styles in XML is implemented,
975cdf0e10cSrcweir     //  load the whole file
976cdf0e10cSrcweir     bRet = LoadXML( &rMedium, NULL );
977cdf0e10cSrcweir     InitItems();
978cdf0e10cSrcweir 
979cdf0e10cSrcweir     SfxObjectShell::LoadFrom( rMedium );
980cdf0e10cSrcweir 
981cdf0e10cSrcweir 	return bRet;
982cdf0e10cSrcweir }
983cdf0e10cSrcweir 
984cdf0e10cSrcweir static void lcl_parseHtmlFilterOption(const OUString& rOption, LanguageType& rLang, bool& rDateConvert)
985cdf0e10cSrcweir {
986cdf0e10cSrcweir     OUStringBuffer aBuf;
987cdf0e10cSrcweir     OUString aTokens[2];
988cdf0e10cSrcweir     sal_Int32 n = rOption.getLength();
989cdf0e10cSrcweir     const sal_Unicode* p = rOption.getStr();
990cdf0e10cSrcweir     sal_Int32 nTokenId = 0;
991cdf0e10cSrcweir     for (sal_Int32 i = 0; i < n; ++i)
992cdf0e10cSrcweir     {
993cdf0e10cSrcweir         const sal_Unicode c = p[i];
994cdf0e10cSrcweir         if (c == sal_Unicode(' '))
995cdf0e10cSrcweir         {
996cdf0e10cSrcweir             if (aBuf.getLength())
997cdf0e10cSrcweir                 aTokens[nTokenId++] = aBuf.makeStringAndClear();
998cdf0e10cSrcweir         }
999cdf0e10cSrcweir         else
1000cdf0e10cSrcweir             aBuf.append(c);
1001cdf0e10cSrcweir 
1002cdf0e10cSrcweir         if (nTokenId >= 2)
1003cdf0e10cSrcweir             break;
1004cdf0e10cSrcweir     }
1005cdf0e10cSrcweir 
1006cdf0e10cSrcweir     if (aBuf.getLength())
1007cdf0e10cSrcweir         aTokens[nTokenId] = aBuf.makeStringAndClear();
1008cdf0e10cSrcweir 
1009cdf0e10cSrcweir     rLang = static_cast<LanguageType>(aTokens[0].toInt32());
1010cdf0e10cSrcweir     rDateConvert = static_cast<bool>(aTokens[1].toInt32());
1011cdf0e10cSrcweir }
1012cdf0e10cSrcweir 
1013cdf0e10cSrcweir namespace {
1014cdf0e10cSrcweir 
1015cdf0e10cSrcweir class LoadMediumGuard
1016cdf0e10cSrcweir {
1017cdf0e10cSrcweir public:
1018cdf0e10cSrcweir     explicit LoadMediumGuard(ScDocument* pDoc) :
1019cdf0e10cSrcweir         mpDoc(pDoc)
1020cdf0e10cSrcweir     {
1021cdf0e10cSrcweir         mpDoc->SetLoadingMedium(true);
1022cdf0e10cSrcweir     }
1023cdf0e10cSrcweir 
1024cdf0e10cSrcweir     ~LoadMediumGuard()
1025cdf0e10cSrcweir     {
1026cdf0e10cSrcweir         mpDoc->SetLoadingMedium(false);
1027cdf0e10cSrcweir     }
1028cdf0e10cSrcweir private:
1029cdf0e10cSrcweir     ScDocument* mpDoc;
1030cdf0e10cSrcweir };
1031cdf0e10cSrcweir 
1032cdf0e10cSrcweir }
1033cdf0e10cSrcweir 
1034cdf0e10cSrcweir sal_Bool __EXPORT ScDocShell::ConvertFrom( SfxMedium& rMedium )
1035cdf0e10cSrcweir {
1036cdf0e10cSrcweir 	RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "nn93723", "ScDocShell::ConvertFrom" );
1037cdf0e10cSrcweir 
1038cdf0e10cSrcweir     LoadMediumGuard aLoadGuard(&aDocument);
1039cdf0e10cSrcweir 
1040cdf0e10cSrcweir 	sal_Bool bRet = sal_False;				// sal_False heisst Benutzerabbruch !!
1041cdf0e10cSrcweir 									// bei Fehler: Fehler am Stream setzen!!
1042cdf0e10cSrcweir 
1043cdf0e10cSrcweir 	ScRefreshTimerProtector( aDocument.GetRefreshTimerControlAddress() );
1044cdf0e10cSrcweir 
1045cdf0e10cSrcweir 	GetUndoManager()->Clear();
1046cdf0e10cSrcweir 
1047cdf0e10cSrcweir 	// ob nach dem Import optimale Spaltenbreiten gesetzt werden sollen
1048cdf0e10cSrcweir 	sal_Bool bSetColWidths = sal_False;
1049cdf0e10cSrcweir 	sal_Bool bSetSimpleTextColWidths = sal_False;
1050cdf0e10cSrcweir 	sal_Bool bSimpleColWidth[MAXCOLCOUNT];
1051cdf0e10cSrcweir 	memset( bSimpleColWidth, 1, (MAXCOLCOUNT) * sizeof(sal_Bool) );
1052cdf0e10cSrcweir 	ScRange aColWidthRange;
1053cdf0e10cSrcweir 	// ob nach dem Import optimale Zeilenhoehen gesetzt werden sollen
1054cdf0e10cSrcweir 	sal_Bool bSetRowHeights = sal_False;
1055cdf0e10cSrcweir 
1056cdf0e10cSrcweir 	aConvFilterName.Erase(); //@ #BugId 54198
1057cdf0e10cSrcweir 
1058cdf0e10cSrcweir 	//	Alle Filter brauchen die komplette Datei am Stueck (nicht asynchron),
1059cdf0e10cSrcweir 	//	darum vorher per CreateFileStream dafuer sorgen, dass die komplette
1060cdf0e10cSrcweir 	//	Datei uebertragen wird.
1061cdf0e10cSrcweir 	rMedium.GetPhysicalName();	//! CreateFileStream direkt rufen, wenn verfuegbar
1062cdf0e10cSrcweir 
1063cdf0e10cSrcweir     SFX_ITEMSET_ARG( rMedium.GetItemSet(), pUpdateDocItem, SfxUInt16Item, SID_UPDATEDOCMODE, sal_False);
1064cdf0e10cSrcweir     nCanUpdate = pUpdateDocItem ? pUpdateDocItem->GetValue() : com::sun::star::document::UpdateDocMode::NO_UPDATE;
1065cdf0e10cSrcweir 
1066cdf0e10cSrcweir     const SfxFilter* pFilter = rMedium.GetFilter();
1067cdf0e10cSrcweir 	if (pFilter)
1068cdf0e10cSrcweir 	{
1069cdf0e10cSrcweir 		String aFltName = pFilter->GetFilterName();
1070cdf0e10cSrcweir 
1071cdf0e10cSrcweir 		aConvFilterName=aFltName; //@ #BugId 54198
1072cdf0e10cSrcweir 
1073cdf0e10cSrcweir 		sal_Bool bCalc3 = ( aFltName.EqualsAscii(pFilterSc30) );
1074cdf0e10cSrcweir 		sal_Bool bCalc4 = ( aFltName.EqualsAscii(pFilterSc40) );
1075cdf0e10cSrcweir 		if (!bCalc3 && !bCalc4)
1076cdf0e10cSrcweir 			aDocument.SetInsertingFromOtherDoc( sal_True );
1077cdf0e10cSrcweir 
1078cdf0e10cSrcweir         if (aFltName.EqualsAscii(pFilterXML))
1079cdf0e10cSrcweir 			bRet = LoadXML( &rMedium, NULL );
1080cdf0e10cSrcweir 		else if (aFltName.EqualsAscii(pFilterSc10))
1081cdf0e10cSrcweir 		{
1082cdf0e10cSrcweir 			SvStream* pStream = rMedium.GetInStream();
1083cdf0e10cSrcweir 			if (pStream)
1084cdf0e10cSrcweir 			{
1085cdf0e10cSrcweir 				FltError eError = ScFormatFilter::Get().ScImportStarCalc10( *pStream, &aDocument );
1086cdf0e10cSrcweir 				if (eError != eERR_OK)
1087cdf0e10cSrcweir 				{
1088cdf0e10cSrcweir 					if (!GetError())
1089cdf0e10cSrcweir 						SetError(eError, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
1090cdf0e10cSrcweir 				}
1091cdf0e10cSrcweir 				else
1092cdf0e10cSrcweir 					bRet = sal_True;
1093cdf0e10cSrcweir 			}
1094cdf0e10cSrcweir 		}
1095cdf0e10cSrcweir 		else if (aFltName.EqualsAscii(pFilterLotus))
1096cdf0e10cSrcweir 		{
1097cdf0e10cSrcweir 			String sItStr;
1098cdf0e10cSrcweir 			SfxItemSet*	 pSet = rMedium.GetItemSet();
1099cdf0e10cSrcweir 			const SfxPoolItem* pItem;
1100cdf0e10cSrcweir 			if ( pSet && SFX_ITEM_SET ==
1101cdf0e10cSrcweir 				 pSet->GetItemState( SID_FILE_FILTEROPTIONS, sal_True, &pItem ) )
1102cdf0e10cSrcweir 			{
1103cdf0e10cSrcweir 				sItStr = ((const SfxStringItem*)pItem)->GetValue();
1104cdf0e10cSrcweir 			}
1105cdf0e10cSrcweir 
1106cdf0e10cSrcweir 			if (sItStr.Len() == 0)
1107cdf0e10cSrcweir 			{
1108cdf0e10cSrcweir 				//	default for lotus import (from API without options):
1109cdf0e10cSrcweir 				//	IBM_437 encoding
1110cdf0e10cSrcweir 				sItStr = ScGlobal::GetCharsetString( RTL_TEXTENCODING_IBM_437 );
1111cdf0e10cSrcweir 			}
1112cdf0e10cSrcweir 
1113cdf0e10cSrcweir 			ScColumn::bDoubleAlloc = sal_True;
1114cdf0e10cSrcweir 			FltError eError = ScFormatFilter::Get().ScImportLotus123( rMedium, &aDocument,
1115cdf0e10cSrcweir 												ScGlobal::GetCharsetValue(sItStr));
1116cdf0e10cSrcweir 			ScColumn::bDoubleAlloc = sal_False;
1117cdf0e10cSrcweir 			if (eError != eERR_OK)
1118cdf0e10cSrcweir 			{
1119cdf0e10cSrcweir 				if (!GetError())
1120cdf0e10cSrcweir 					SetError(eError, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
1121cdf0e10cSrcweir 
1122cdf0e10cSrcweir 				if( ( eError & ERRCODE_WARNING_MASK ) == ERRCODE_WARNING_MASK )
1123cdf0e10cSrcweir 					bRet = sal_True;
1124cdf0e10cSrcweir 			}
1125cdf0e10cSrcweir 			else
1126cdf0e10cSrcweir 				bRet = sal_True;
1127cdf0e10cSrcweir 			bSetColWidths = sal_True;
1128cdf0e10cSrcweir 			bSetRowHeights = sal_True;
1129cdf0e10cSrcweir 		}
1130cdf0e10cSrcweir 		else if ( aFltName.EqualsAscii(pFilterExcel4) || aFltName.EqualsAscii(pFilterExcel5) ||
1131cdf0e10cSrcweir 				   aFltName.EqualsAscii(pFilterExcel95) || aFltName.EqualsAscii(pFilterExcel97) ||
1132cdf0e10cSrcweir 				   aFltName.EqualsAscii(pFilterEx4Temp) || aFltName.EqualsAscii(pFilterEx5Temp) ||
1133cdf0e10cSrcweir 				   aFltName.EqualsAscii(pFilterEx95Temp) || aFltName.EqualsAscii(pFilterEx97Temp) )
1134cdf0e10cSrcweir 		{
1135cdf0e10cSrcweir 			EXCIMPFORMAT eFormat = EIF_AUTO;
1136cdf0e10cSrcweir 			if ( aFltName.EqualsAscii(pFilterExcel4) || aFltName.EqualsAscii(pFilterEx4Temp) )
1137cdf0e10cSrcweir 				eFormat = EIF_BIFF_LE4;
1138cdf0e10cSrcweir 			else if ( aFltName.EqualsAscii(pFilterExcel5) || aFltName.EqualsAscii(pFilterExcel95) ||
1139cdf0e10cSrcweir 					  aFltName.EqualsAscii(pFilterEx5Temp) || aFltName.EqualsAscii(pFilterEx95Temp) )
1140cdf0e10cSrcweir 				eFormat = EIF_BIFF5;
1141cdf0e10cSrcweir 			else if ( aFltName.EqualsAscii(pFilterExcel97) || aFltName.EqualsAscii(pFilterEx97Temp) )
1142cdf0e10cSrcweir 				eFormat = EIF_BIFF8;
1143cdf0e10cSrcweir 
1144cdf0e10cSrcweir 			MakeDrawLayer();				//! im Filter
1145cdf0e10cSrcweir             CalcOutputFactor();             // #93255# prepare update of row height
1146cdf0e10cSrcweir 			ScColumn::bDoubleAlloc = sal_True;
1147cdf0e10cSrcweir 			FltError eError = ScFormatFilter::Get().ScImportExcel( rMedium, &aDocument, eFormat );
1148cdf0e10cSrcweir 			ScColumn::bDoubleAlloc = sal_False;
1149cdf0e10cSrcweir 			aDocument.UpdateFontCharSet();
1150cdf0e10cSrcweir 			if ( aDocument.IsChartListenerCollectionNeedsUpdate() )
1151cdf0e10cSrcweir 				aDocument.UpdateChartListenerCollection();				//! fuer alle Importe?
1152cdf0e10cSrcweir 
1153cdf0e10cSrcweir 			// #75299# all graphics objects must have names
1154cdf0e10cSrcweir 			aDocument.EnsureGraphicNames();
1155cdf0e10cSrcweir 
1156cdf0e10cSrcweir 			if (eError == SCWARN_IMPORT_RANGE_OVERFLOW)
1157cdf0e10cSrcweir 			{
1158cdf0e10cSrcweir 				if (!GetError())
1159cdf0e10cSrcweir 					SetError(eError, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
1160cdf0e10cSrcweir 				bRet = sal_True;
1161cdf0e10cSrcweir 			}
1162cdf0e10cSrcweir 			else if (eError != eERR_OK)
1163cdf0e10cSrcweir 			{
1164cdf0e10cSrcweir 				if (!GetError())
1165cdf0e10cSrcweir 					SetError(eError, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
1166cdf0e10cSrcweir 			}
1167cdf0e10cSrcweir 			else
1168cdf0e10cSrcweir 				bRet = sal_True;
1169cdf0e10cSrcweir 
1170cdf0e10cSrcweir             // #93255# update of row height done inside of Excel filter to speed up chart import
1171cdf0e10cSrcweir //            bSetRowHeights = sal_True;      //  #75357# optimal row heights must be updated
1172cdf0e10cSrcweir 		}
1173cdf0e10cSrcweir 		else if (aFltName.EqualsAscii(pFilterAscii))
1174cdf0e10cSrcweir 		{
1175cdf0e10cSrcweir 			SfxItemSet*	 pSet = rMedium.GetItemSet();
1176cdf0e10cSrcweir 			const SfxPoolItem* pItem;
1177cdf0e10cSrcweir 			ScAsciiOptions aOptions;
1178cdf0e10cSrcweir 			sal_Bool bOptInit = sal_False;
1179cdf0e10cSrcweir 
1180cdf0e10cSrcweir 			if ( pSet && SFX_ITEM_SET ==
1181cdf0e10cSrcweir 				 pSet->GetItemState( SID_FILE_FILTEROPTIONS, sal_True, &pItem ) )
1182cdf0e10cSrcweir 			{
1183cdf0e10cSrcweir 				aOptions.ReadFromString( ((const SfxStringItem*)pItem)->GetValue() );
1184cdf0e10cSrcweir 				bOptInit = sal_True;
1185cdf0e10cSrcweir 			}
1186cdf0e10cSrcweir 
1187cdf0e10cSrcweir 			if ( !bOptInit )
1188cdf0e10cSrcweir 			{
1189cdf0e10cSrcweir 				//	default for ascii import (from API without options):
1190cdf0e10cSrcweir 				//	ISO8859-1/MS_1252 encoding, comma, double quotes
1191cdf0e10cSrcweir 
1192cdf0e10cSrcweir 				aOptions.SetCharSet( RTL_TEXTENCODING_MS_1252 );
1193cdf0e10cSrcweir 				aOptions.SetFieldSeps( (sal_Unicode) ',' );
1194cdf0e10cSrcweir 				aOptions.SetTextSep( (sal_Unicode) '"' );
1195cdf0e10cSrcweir 			}
1196cdf0e10cSrcweir 
1197cdf0e10cSrcweir 			FltError eError = eERR_OK;
1198cdf0e10cSrcweir 			sal_Bool bOverflow = sal_False;
1199cdf0e10cSrcweir 
1200cdf0e10cSrcweir 			if( ! rMedium.IsStorage() )
1201cdf0e10cSrcweir 			{
1202cdf0e10cSrcweir 				ScImportExport	aImpEx( &aDocument );
1203cdf0e10cSrcweir 				aImpEx.SetExtOptions( aOptions );
1204cdf0e10cSrcweir 
1205cdf0e10cSrcweir 				SvStream* pInStream = rMedium.GetInStream();
1206cdf0e10cSrcweir 				if (pInStream)
1207cdf0e10cSrcweir 				{
1208cdf0e10cSrcweir 					pInStream->SetStreamCharSet( aOptions.GetCharSet() );
1209cdf0e10cSrcweir 					pInStream->Seek( 0 );
1210cdf0e10cSrcweir                     bRet = aImpEx.ImportStream( *pInStream, rMedium.GetBaseURL() );
1211cdf0e10cSrcweir 					eError = bRet ? eERR_OK : SCERR_IMPORT_CONNECT;
1212cdf0e10cSrcweir 					aDocument.StartAllListeners();
1213cdf0e10cSrcweir 					aDocument.SetDirty();
1214cdf0e10cSrcweir 					bOverflow = aImpEx.IsOverflow();
1215cdf0e10cSrcweir 				}
1216cdf0e10cSrcweir 				else
1217cdf0e10cSrcweir 				{
1218cdf0e10cSrcweir 					DBG_ERROR( "No Stream" );
1219cdf0e10cSrcweir 				}
1220cdf0e10cSrcweir 			}
1221cdf0e10cSrcweir 
1222cdf0e10cSrcweir 			if (eError != eERR_OK)
1223cdf0e10cSrcweir 			{
1224cdf0e10cSrcweir 				if (!GetError())
1225cdf0e10cSrcweir 					SetError(eError, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
1226cdf0e10cSrcweir 			}
1227cdf0e10cSrcweir 			else if ( bOverflow )
1228cdf0e10cSrcweir 			{
1229cdf0e10cSrcweir 				if (!GetError())
1230cdf0e10cSrcweir 					SetError(SCWARN_IMPORT_RANGE_OVERFLOW, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
1231cdf0e10cSrcweir 			}
1232cdf0e10cSrcweir 			bSetColWidths = sal_True;
1233cdf0e10cSrcweir 			bSetSimpleTextColWidths = sal_True;
1234cdf0e10cSrcweir 		}
1235cdf0e10cSrcweir 		else if (aFltName.EqualsAscii(pFilterDBase))
1236cdf0e10cSrcweir 		{
1237cdf0e10cSrcweir 			String sItStr;
1238cdf0e10cSrcweir 			SfxItemSet*	 pSet = rMedium.GetItemSet();
1239cdf0e10cSrcweir 			const SfxPoolItem* pItem;
1240cdf0e10cSrcweir 			if ( pSet && SFX_ITEM_SET ==
1241cdf0e10cSrcweir 				 pSet->GetItemState( SID_FILE_FILTEROPTIONS, sal_True, &pItem ) )
1242cdf0e10cSrcweir 			{
1243cdf0e10cSrcweir 				sItStr = ((const SfxStringItem*)pItem)->GetValue();
1244cdf0e10cSrcweir 			}
1245cdf0e10cSrcweir 
1246cdf0e10cSrcweir 			if (sItStr.Len() == 0)
1247cdf0e10cSrcweir 			{
1248cdf0e10cSrcweir 				//	default for dBase import (from API without options):
1249cdf0e10cSrcweir 				//	IBM_850 encoding
1250cdf0e10cSrcweir 
1251cdf0e10cSrcweir 				sItStr = ScGlobal::GetCharsetString( RTL_TEXTENCODING_IBM_850 );
1252cdf0e10cSrcweir 			}
1253cdf0e10cSrcweir 
1254cdf0e10cSrcweir 			sal_uLong eError = DBaseImport( rMedium.GetPhysicalName(),
1255cdf0e10cSrcweir 					ScGlobal::GetCharsetValue(sItStr), bSimpleColWidth );
1256cdf0e10cSrcweir 
1257cdf0e10cSrcweir 			if (eError != eERR_OK)
1258cdf0e10cSrcweir 			{
1259cdf0e10cSrcweir 				if (!GetError())
1260cdf0e10cSrcweir 					SetError(eError, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
1261cdf0e10cSrcweir 				bRet = ( eError == SCWARN_IMPORT_RANGE_OVERFLOW );
1262cdf0e10cSrcweir 			}
1263cdf0e10cSrcweir 			else
1264cdf0e10cSrcweir 				bRet = sal_True;
1265cdf0e10cSrcweir 
1266cdf0e10cSrcweir 			aColWidthRange.aStart.SetRow( 1 );	// Spaltenheader nicht
1267cdf0e10cSrcweir 			bSetColWidths = sal_True;
1268cdf0e10cSrcweir 			bSetSimpleTextColWidths = sal_True;
1269cdf0e10cSrcweir 			// Memo-Felder fuehren zu einem bSimpleColWidth[nCol]==FALSE
1270cdf0e10cSrcweir 			for ( SCCOL nCol=0; nCol <= MAXCOL && !bSetRowHeights; nCol++ )
1271cdf0e10cSrcweir 			{
1272cdf0e10cSrcweir 				if ( !bSimpleColWidth[nCol] )
1273cdf0e10cSrcweir 					bSetRowHeights = sal_True;
1274cdf0e10cSrcweir 			}
1275cdf0e10cSrcweir 		}
1276cdf0e10cSrcweir 		else if (aFltName.EqualsAscii(pFilterDif))
1277cdf0e10cSrcweir 		{
1278cdf0e10cSrcweir 			SvStream* pStream = rMedium.GetInStream();
1279cdf0e10cSrcweir 			if (pStream)
1280cdf0e10cSrcweir 			{
1281cdf0e10cSrcweir 				FltError eError;
1282cdf0e10cSrcweir 				String sItStr;
1283cdf0e10cSrcweir 				SfxItemSet*	 pSet = rMedium.GetItemSet();
1284cdf0e10cSrcweir 				const SfxPoolItem* pItem;
1285cdf0e10cSrcweir 				if ( pSet && SFX_ITEM_SET ==
1286cdf0e10cSrcweir 					 pSet->GetItemState( SID_FILE_FILTEROPTIONS, sal_True, &pItem ) )
1287cdf0e10cSrcweir 				{
1288cdf0e10cSrcweir 					sItStr = ((const SfxStringItem*)pItem)->GetValue();
1289cdf0e10cSrcweir 				}
1290cdf0e10cSrcweir 
1291cdf0e10cSrcweir 				if (sItStr.Len() == 0)
1292cdf0e10cSrcweir 				{
1293cdf0e10cSrcweir 					//	default for DIF import (from API without options):
1294cdf0e10cSrcweir 					//	ISO8859-1/MS_1252 encoding
1295cdf0e10cSrcweir 
1296cdf0e10cSrcweir 					sItStr = ScGlobal::GetCharsetString( RTL_TEXTENCODING_MS_1252 );
1297cdf0e10cSrcweir 				}
1298cdf0e10cSrcweir 
1299cdf0e10cSrcweir 				eError = ScFormatFilter::Get().ScImportDif( *pStream, &aDocument, ScAddress(0,0,0),
1300cdf0e10cSrcweir 									ScGlobal::GetCharsetValue(sItStr));
1301cdf0e10cSrcweir 				if (eError != eERR_OK)
1302cdf0e10cSrcweir 				{
1303cdf0e10cSrcweir 					if (!GetError())
1304cdf0e10cSrcweir 						SetError(eError, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
1305cdf0e10cSrcweir 
1306cdf0e10cSrcweir 					if( ( eError & ERRCODE_WARNING_MASK ) == ERRCODE_WARNING_MASK )
1307cdf0e10cSrcweir 						bRet = sal_True;
1308cdf0e10cSrcweir 				}
1309cdf0e10cSrcweir 				else
1310cdf0e10cSrcweir 					bRet = sal_True;
1311cdf0e10cSrcweir 			}
1312cdf0e10cSrcweir 			bSetColWidths = sal_True;
1313cdf0e10cSrcweir 			bSetSimpleTextColWidths = sal_True;
1314cdf0e10cSrcweir 			bSetRowHeights = sal_True;
1315cdf0e10cSrcweir 		}
1316cdf0e10cSrcweir 		else if (aFltName.EqualsAscii(pFilterSylk))
1317cdf0e10cSrcweir 		{
1318cdf0e10cSrcweir 			FltError eError = SCERR_IMPORT_UNKNOWN;
1319cdf0e10cSrcweir 			if( !rMedium.IsStorage() )
1320cdf0e10cSrcweir 			{
1321cdf0e10cSrcweir 				ScImportExport aImpEx( &aDocument );
1322cdf0e10cSrcweir 
1323cdf0e10cSrcweir 				SvStream* pInStream = rMedium.GetInStream();
1324cdf0e10cSrcweir 				if (pInStream)
1325cdf0e10cSrcweir 				{
1326cdf0e10cSrcweir 					pInStream->Seek( 0 );
1327cdf0e10cSrcweir                     bRet = aImpEx.ImportStream( *pInStream, rMedium.GetBaseURL(), SOT_FORMATSTR_ID_SYLK );
1328cdf0e10cSrcweir 					eError = bRet ? eERR_OK : SCERR_IMPORT_UNKNOWN;
1329cdf0e10cSrcweir 					aDocument.StartAllListeners();
1330cdf0e10cSrcweir 					aDocument.SetDirty();
1331cdf0e10cSrcweir 				}
1332cdf0e10cSrcweir 				else
1333cdf0e10cSrcweir 				{
1334cdf0e10cSrcweir 					DBG_ERROR( "No Stream" );
1335cdf0e10cSrcweir 				}
1336cdf0e10cSrcweir 			}
1337cdf0e10cSrcweir 
1338cdf0e10cSrcweir 			if ( eError != eERR_OK && !GetError() )
1339cdf0e10cSrcweir 				SetError(eError, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
1340cdf0e10cSrcweir 			bSetColWidths = sal_True;
1341cdf0e10cSrcweir 			bSetSimpleTextColWidths = sal_True;
1342cdf0e10cSrcweir 			bSetRowHeights = sal_True;
1343cdf0e10cSrcweir 		}
1344cdf0e10cSrcweir 		else if (aFltName.EqualsAscii(pFilterQPro6))
1345cdf0e10cSrcweir         {
1346cdf0e10cSrcweir             ScColumn::bDoubleAlloc = sal_True;
1347cdf0e10cSrcweir             FltError eError = ScFormatFilter::Get().ScImportQuattroPro( rMedium, &aDocument);
1348cdf0e10cSrcweir             ScColumn::bDoubleAlloc = sal_False;
1349cdf0e10cSrcweir             if (eError != eERR_OK)
1350cdf0e10cSrcweir             {
1351cdf0e10cSrcweir                 if (!GetError())
1352cdf0e10cSrcweir                     SetError( eError, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ) );
1353cdf0e10cSrcweir                 if( ( eError & ERRCODE_WARNING_MASK ) == ERRCODE_WARNING_MASK )
1354cdf0e10cSrcweir                     bRet = sal_True;
1355cdf0e10cSrcweir             }
1356cdf0e10cSrcweir             else
1357cdf0e10cSrcweir                 bRet = sal_True;
1358cdf0e10cSrcweir             // TODO: Filter should set column widths. Not doing it here, it may
1359cdf0e10cSrcweir             // result in very narrow or wide columns, depending on content.
1360cdf0e10cSrcweir             // Setting row heights makes cells with font size attribution or
1361cdf0e10cSrcweir             // wrapping enabled look nicer..
1362cdf0e10cSrcweir             bSetRowHeights = sal_True;
1363cdf0e10cSrcweir         }
1364cdf0e10cSrcweir 		else if (aFltName.EqualsAscii(pFilterRtf))
1365cdf0e10cSrcweir 		{
1366cdf0e10cSrcweir 			FltError eError = SCERR_IMPORT_UNKNOWN;
1367cdf0e10cSrcweir 			if( !rMedium.IsStorage() )
1368cdf0e10cSrcweir 			{
1369cdf0e10cSrcweir 				SvStream* pInStream = rMedium.GetInStream();
1370cdf0e10cSrcweir 				if (pInStream)
1371cdf0e10cSrcweir 				{
1372cdf0e10cSrcweir 					pInStream->Seek( 0 );
1373cdf0e10cSrcweir 					ScRange aRange;
1374cdf0e10cSrcweir                     eError = ScFormatFilter::Get().ScImportRTF( *pInStream, rMedium.GetBaseURL(), &aDocument, aRange );
1375cdf0e10cSrcweir 					if (eError != eERR_OK)
1376cdf0e10cSrcweir 					{
1377cdf0e10cSrcweir 						if (!GetError())
1378cdf0e10cSrcweir 							SetError(eError, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
1379cdf0e10cSrcweir 
1380cdf0e10cSrcweir 						if( ( eError & ERRCODE_WARNING_MASK ) == ERRCODE_WARNING_MASK )
1381cdf0e10cSrcweir 							bRet = sal_True;
1382cdf0e10cSrcweir 					}
1383cdf0e10cSrcweir 					else
1384cdf0e10cSrcweir 						bRet = sal_True;
1385cdf0e10cSrcweir 					aDocument.StartAllListeners();
1386cdf0e10cSrcweir 					aDocument.SetDirty();
1387cdf0e10cSrcweir 					bSetColWidths = sal_True;
1388cdf0e10cSrcweir 					bSetRowHeights = sal_True;
1389cdf0e10cSrcweir 				}
1390cdf0e10cSrcweir 				else
1391cdf0e10cSrcweir 				{
1392cdf0e10cSrcweir 					DBG_ERROR( "No Stream" );
1393cdf0e10cSrcweir 				}
1394cdf0e10cSrcweir 			}
1395cdf0e10cSrcweir 
1396cdf0e10cSrcweir 			if ( eError != eERR_OK && !GetError() )
1397cdf0e10cSrcweir 				SetError(eError, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
1398cdf0e10cSrcweir 		}
1399cdf0e10cSrcweir 		else if (aFltName.EqualsAscii(pFilterHtml) || aFltName.EqualsAscii(pFilterHtmlWebQ))
1400cdf0e10cSrcweir 		{
1401cdf0e10cSrcweir 			FltError eError = SCERR_IMPORT_UNKNOWN;
1402cdf0e10cSrcweir 			sal_Bool bWebQuery = aFltName.EqualsAscii(pFilterHtmlWebQ);
1403cdf0e10cSrcweir 			if( !rMedium.IsStorage() )
1404cdf0e10cSrcweir 			{
1405cdf0e10cSrcweir 				SvStream* pInStream = rMedium.GetInStream();
1406cdf0e10cSrcweir 				if (pInStream)
1407cdf0e10cSrcweir 				{
1408cdf0e10cSrcweir                     LanguageType eLang = LANGUAGE_SYSTEM;
1409cdf0e10cSrcweir                     bool bDateConvert = false;
1410cdf0e10cSrcweir                     SfxItemSet*	 pSet = rMedium.GetItemSet();
1411cdf0e10cSrcweir                     const SfxPoolItem* pItem;
1412cdf0e10cSrcweir                     if ( pSet && SFX_ITEM_SET ==
1413cdf0e10cSrcweir                          pSet->GetItemState( SID_FILE_FILTEROPTIONS, sal_True, &pItem ) )
1414cdf0e10cSrcweir                     {
1415cdf0e10cSrcweir                         String aFilterOption = (static_cast<const SfxStringItem*>(pItem))->GetValue();
1416cdf0e10cSrcweir                         lcl_parseHtmlFilterOption(aFilterOption, eLang, bDateConvert);
1417cdf0e10cSrcweir                     }
1418cdf0e10cSrcweir 
1419cdf0e10cSrcweir 					pInStream->Seek( 0 );
1420cdf0e10cSrcweir 					ScRange aRange;
1421cdf0e10cSrcweir 					// HTML macht eigenes ColWidth/RowHeight
1422cdf0e10cSrcweir 					CalcOutputFactor();
1423cdf0e10cSrcweir                     SvNumberFormatter aNumFormatter(aDocument.GetServiceManager(), eLang);
1424cdf0e10cSrcweir                     eError = ScFormatFilter::Get().ScImportHTML( *pInStream, rMedium.GetBaseURL(), &aDocument, aRange,
1425cdf0e10cSrcweir 											GetOutputFactor(), !bWebQuery, &aNumFormatter, bDateConvert );
1426cdf0e10cSrcweir 					if (eError != eERR_OK)
1427cdf0e10cSrcweir 					{
1428cdf0e10cSrcweir 						if (!GetError())
1429cdf0e10cSrcweir 							SetError(eError, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
1430cdf0e10cSrcweir 
1431cdf0e10cSrcweir 						if( ( eError & ERRCODE_WARNING_MASK ) == ERRCODE_WARNING_MASK )
1432cdf0e10cSrcweir 							bRet = sal_True;
1433cdf0e10cSrcweir 					}
1434cdf0e10cSrcweir 					else
1435cdf0e10cSrcweir 						bRet = sal_True;
1436cdf0e10cSrcweir 					aDocument.StartAllListeners();
1437cdf0e10cSrcweir 					aDocument.SetDirty();
1438cdf0e10cSrcweir 				}
1439cdf0e10cSrcweir 				else
1440cdf0e10cSrcweir 				{
1441cdf0e10cSrcweir 					DBG_ERROR( "No Stream" );
1442cdf0e10cSrcweir 				}
1443cdf0e10cSrcweir 			}
1444cdf0e10cSrcweir 
1445cdf0e10cSrcweir 			if ( eError != eERR_OK && !GetError() )
1446cdf0e10cSrcweir 				SetError(eError, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
1447cdf0e10cSrcweir 		}
1448cdf0e10cSrcweir 		else
1449cdf0e10cSrcweir 		{
1450cdf0e10cSrcweir 			if (!GetError())
1451cdf0e10cSrcweir 				SetError(SCERR_IMPORT_NI, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
1452cdf0e10cSrcweir 		}
1453cdf0e10cSrcweir 
1454cdf0e10cSrcweir 		if (!bCalc3)
1455cdf0e10cSrcweir 			aDocument.SetInsertingFromOtherDoc( sal_False );
1456cdf0e10cSrcweir 	}
1457cdf0e10cSrcweir 	else
1458cdf0e10cSrcweir 	{
1459cdf0e10cSrcweir 		DBG_ERROR("Kein Filter bei ConvertFrom");
1460cdf0e10cSrcweir 	}
1461cdf0e10cSrcweir 
1462cdf0e10cSrcweir 	InitItems();
1463cdf0e10cSrcweir 	CalcOutputFactor();
1464cdf0e10cSrcweir 	if ( bRet && (bSetColWidths || bSetRowHeights) )
1465cdf0e10cSrcweir 	{	// Spaltenbreiten/Zeilenhoehen anpassen, Basis 100% Zoom
1466cdf0e10cSrcweir 		Fraction aZoom( 1, 1 );
1467cdf0e10cSrcweir 		double nPPTX = ScGlobal::nScreenPPTX * (double) aZoom
1468cdf0e10cSrcweir 			/ GetOutputFactor();	// Faktor ist Drucker zu Bildschirm
1469cdf0e10cSrcweir 		double nPPTY = ScGlobal::nScreenPPTY * (double) aZoom;
1470cdf0e10cSrcweir 		VirtualDevice aVirtDev;
1471cdf0e10cSrcweir 		//	all sheets (for Excel import)
1472cdf0e10cSrcweir 		SCTAB nTabCount = aDocument.GetTableCount();
1473cdf0e10cSrcweir 		for (SCTAB nTab=0; nTab<nTabCount; nTab++)
1474cdf0e10cSrcweir 		{
1475cdf0e10cSrcweir             SCCOL nEndCol;
1476cdf0e10cSrcweir             SCROW nEndRow;
1477cdf0e10cSrcweir             aDocument.GetCellArea( nTab, nEndCol, nEndRow );
1478cdf0e10cSrcweir 			aColWidthRange.aEnd.SetCol( nEndCol );
1479cdf0e10cSrcweir 			aColWidthRange.aEnd.SetRow( nEndRow );
1480cdf0e10cSrcweir 			ScMarkData aMark;
1481cdf0e10cSrcweir 			aMark.SetMarkArea( aColWidthRange );
1482cdf0e10cSrcweir 			aMark.MarkToMulti();
1483cdf0e10cSrcweir 			// Reihenfolge erst Breite dann Hoehe ist wichtig (vergl. hund.rtf)
1484cdf0e10cSrcweir 			if ( bSetColWidths )
1485cdf0e10cSrcweir 			{
1486cdf0e10cSrcweir 				for ( SCCOL nCol=0; nCol <= nEndCol; nCol++ )
1487cdf0e10cSrcweir 				{
1488cdf0e10cSrcweir 					sal_uInt16 nWidth = aDocument.GetOptimalColWidth(
1489cdf0e10cSrcweir 						nCol, nTab, &aVirtDev, nPPTX, nPPTY, aZoom, aZoom, sal_False, &aMark,
1490cdf0e10cSrcweir 						(bSetSimpleTextColWidths && bSimpleColWidth[nCol]) );
1491cdf0e10cSrcweir 					aDocument.SetColWidth( nCol, nTab,
1492cdf0e10cSrcweir 						nWidth + (sal_uInt16)ScGlobal::nLastColWidthExtra );
1493cdf0e10cSrcweir 				}
1494cdf0e10cSrcweir 			}
1495cdf0e10cSrcweir //			if ( bSetRowHeights )
1496cdf0e10cSrcweir //			{
1497cdf0e10cSrcweir //				//	nExtra must be 0
1498cdf0e10cSrcweir //				aDocument.SetOptimalHeight(	0, nEndRow, nTab, 0, &aVirtDev,
1499cdf0e10cSrcweir //					nPPTX, nPPTY, aZoom, aZoom, sal_False );
1500cdf0e10cSrcweir //			}
1501cdf0e10cSrcweir 		}
1502cdf0e10cSrcweir 		if ( bSetRowHeights )
1503cdf0e10cSrcweir 			UpdateAllRowHeights();		// with vdev or printer, depending on configuration
1504cdf0e10cSrcweir 	}
1505cdf0e10cSrcweir 	FinishedLoading( SFX_LOADED_MAINDOCUMENT | SFX_LOADED_IMAGES );
1506cdf0e10cSrcweir 
1507ce7b8fbeSLei De Bin 	GetUndoManager()->Clear();
1508cdf0e10cSrcweir 	// #73762# invalidate eventually temporary table areas
1509cdf0e10cSrcweir 	if ( bRet )
1510cdf0e10cSrcweir 		aDocument.InvalidateTableArea();
1511cdf0e10cSrcweir 
1512cdf0e10cSrcweir 	bIsEmpty = sal_False;
1513cdf0e10cSrcweir 
1514cdf0e10cSrcweir 	return bRet;
1515cdf0e10cSrcweir }
1516cdf0e10cSrcweir 
1517cdf0e10cSrcweir 
1518cdf0e10cSrcweir ScDocShell::PrepareSaveGuard::PrepareSaveGuard( ScDocShell& rDocShell )
1519cdf0e10cSrcweir     : mrDocShell( rDocShell)
1520cdf0e10cSrcweir {
1521cdf0e10cSrcweir     // DoEnterHandler not here (because of AutoSave), is in ExecuteSave.
1522cdf0e10cSrcweir 
1523cdf0e10cSrcweir     ScChartListenerCollection* pCharts = mrDocShell.aDocument.GetChartListenerCollection();
1524cdf0e10cSrcweir     if (pCharts)
1525cdf0e10cSrcweir         pCharts->UpdateDirtyCharts();                           // Charts to be updated.
1526cdf0e10cSrcweir     mrDocShell.aDocument.StopTemporaryChartLock();
1527cdf0e10cSrcweir     if (mrDocShell.pAutoStyleList)
1528cdf0e10cSrcweir         mrDocShell.pAutoStyleList->ExecuteAllNow();             // Execute template timeouts now.
1529cdf0e10cSrcweir     if (mrDocShell.aDocument.HasExternalRefManager())
1530cdf0e10cSrcweir     {
1531cdf0e10cSrcweir         ScExternalRefManager* pRefMgr = mrDocShell.aDocument.GetExternalRefManager();
1532cdf0e10cSrcweir         if (pRefMgr && pRefMgr->hasExternalData())
1533cdf0e10cSrcweir         {
1534cdf0e10cSrcweir             pRefMgr->setAllCacheTableReferencedStati( false);
1535cdf0e10cSrcweir             mrDocShell.aDocument.MarkUsedExternalReferences();  // Mark tables of external references to be written.
1536cdf0e10cSrcweir         }
1537cdf0e10cSrcweir     }
1538cdf0e10cSrcweir     if (mrDocShell.GetCreateMode()== SFX_CREATE_MODE_STANDARD)
1539cdf0e10cSrcweir         mrDocShell.SfxObjectShell::SetVisArea( Rectangle() );   // "Normally" worked on => no VisArea.
1540cdf0e10cSrcweir }
1541cdf0e10cSrcweir 
1542cdf0e10cSrcweir ScDocShell::PrepareSaveGuard::~PrepareSaveGuard()
1543cdf0e10cSrcweir {
1544cdf0e10cSrcweir     if (mrDocShell.aDocument.HasExternalRefManager())
1545cdf0e10cSrcweir     {
1546cdf0e10cSrcweir         ScExternalRefManager* pRefMgr = mrDocShell.aDocument.GetExternalRefManager();
1547cdf0e10cSrcweir         if (pRefMgr && pRefMgr->hasExternalData())
1548cdf0e10cSrcweir         {
1549cdf0e10cSrcweir             // Prevent accidental data loss due to lack of knowledge.
1550cdf0e10cSrcweir             pRefMgr->setAllCacheTableReferencedStati( true);
1551cdf0e10cSrcweir         }
1552cdf0e10cSrcweir     }
1553cdf0e10cSrcweir }
1554cdf0e10cSrcweir 
1555cdf0e10cSrcweir 
1556cdf0e10cSrcweir sal_Bool __EXPORT ScDocShell::Save()
1557cdf0e10cSrcweir {
1558cdf0e10cSrcweir 	RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "nn93723", "ScDocShell::Save" );
1559cdf0e10cSrcweir 
1560cdf0e10cSrcweir 	ScRefreshTimerProtector( aDocument.GetRefreshTimerControlAddress() );
1561cdf0e10cSrcweir 
1562cdf0e10cSrcweir     PrepareSaveGuard aPrepareGuard( *this);
1563cdf0e10cSrcweir 
1564cdf0e10cSrcweir 	//	wait cursor is handled with progress bar
1565cdf0e10cSrcweir     sal_Bool bRet = SfxObjectShell::Save();
1566cdf0e10cSrcweir 	if( bRet )
1567cdf0e10cSrcweir         bRet = SaveXML( GetMedium(), NULL );
1568cdf0e10cSrcweir 	return bRet;
1569cdf0e10cSrcweir }
1570cdf0e10cSrcweir 
1571cdf0e10cSrcweir 
1572cdf0e10cSrcweir sal_Bool __EXPORT ScDocShell::SaveAs( SfxMedium& rMedium )
1573cdf0e10cSrcweir {
1574cdf0e10cSrcweir 	RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "nn93723", "ScDocShell::SaveAs" );
1575cdf0e10cSrcweir 
1576cdf0e10cSrcweir #if ENABLE_SHEET_PROTECTION
1577cdf0e10cSrcweir     ScTabViewShell* pViewShell = GetBestViewShell();
1578cdf0e10cSrcweir     if (pViewShell && ScPassHashHelper::needsPassHashRegen(aDocument, PASSHASH_OOO))
1579cdf0e10cSrcweir     {
1580cdf0e10cSrcweir         if (!pViewShell->ExecuteRetypePassDlg(PASSHASH_OOO))
1581cdf0e10cSrcweir             // password re-type cancelled.  Don't save the document.
1582cdf0e10cSrcweir             return false;
1583cdf0e10cSrcweir     }
1584cdf0e10cSrcweir #endif
1585cdf0e10cSrcweir 
1586cdf0e10cSrcweir 	ScRefreshTimerProtector( aDocument.GetRefreshTimerControlAddress() );
1587cdf0e10cSrcweir 
1588cdf0e10cSrcweir     PrepareSaveGuard aPrepareGuard( *this);
1589cdf0e10cSrcweir 
1590cdf0e10cSrcweir 	//	wait cursor is handled with progress bar
1591cdf0e10cSrcweir     sal_Bool bRet = SfxObjectShell::SaveAs( rMedium );
1592cdf0e10cSrcweir 	if( bRet )
1593cdf0e10cSrcweir         bRet = SaveXML( &rMedium, NULL );
1594cdf0e10cSrcweir 
1595cdf0e10cSrcweir 	return bRet;
1596cdf0e10cSrcweir }
1597cdf0e10cSrcweir 
1598cdf0e10cSrcweir 
1599cdf0e10cSrcweir sal_Bool __EXPORT ScDocShell::IsInformationLost()
1600cdf0e10cSrcweir {
1601cdf0e10cSrcweir /*
1602cdf0e10cSrcweir 	const SfxFilter *pFilt = GetMedium()->GetFilter();
1603cdf0e10cSrcweir 	sal_Bool bRet = pFilt && pFilt->IsAlienFormat() && bNoInformLost;
1604cdf0e10cSrcweir 	if (bNoInformLost)					// nur einmal!!
1605cdf0e10cSrcweir 		bNoInformLost = sal_False;
1606cdf0e10cSrcweir 	return bRet;
1607cdf0e10cSrcweir */
1608cdf0e10cSrcweir 	//!!! bei Gelegenheit ein korrekte eigene Behandlung einbauen
1609cdf0e10cSrcweir 
1610cdf0e10cSrcweir 	return SfxObjectShell::IsInformationLost();
1611cdf0e10cSrcweir }
1612cdf0e10cSrcweir 
1613cdf0e10cSrcweir 
1614cdf0e10cSrcweir // Xcl-like column width measured in characters of standard font.
1615cdf0e10cSrcweir xub_StrLen lcl_ScDocShell_GetColWidthInChars( sal_uInt16 nWidth )
1616cdf0e10cSrcweir {
1617cdf0e10cSrcweir     // double fColScale = 1.0;
1618cdf0e10cSrcweir 	double	f = nWidth;
1619cdf0e10cSrcweir 	f *= 1328.0 / 25.0;
1620cdf0e10cSrcweir 	f += 90.0;
1621cdf0e10cSrcweir 	f *= 1.0 / 23.0;
1622cdf0e10cSrcweir 	// f /= fColScale * 256.0;
1623cdf0e10cSrcweir 	f /= 256.0;
1624cdf0e10cSrcweir 
1625cdf0e10cSrcweir 	return xub_StrLen( f );
1626cdf0e10cSrcweir }
1627cdf0e10cSrcweir 
1628cdf0e10cSrcweir 
1629cdf0e10cSrcweir void lcl_ScDocShell_GetFixedWidthString( String& rStr, const ScDocument& rDoc,
1630cdf0e10cSrcweir         SCTAB nTab, SCCOL nCol, sal_Bool bValue, SvxCellHorJustify eHorJust )
1631cdf0e10cSrcweir {
1632cdf0e10cSrcweir     xub_StrLen nLen = lcl_ScDocShell_GetColWidthInChars(
1633cdf0e10cSrcweir             rDoc.GetColWidth( nCol, nTab ) );
1634cdf0e10cSrcweir     if ( nLen < rStr.Len() )
1635cdf0e10cSrcweir     {
1636cdf0e10cSrcweir         if ( bValue )
1637cdf0e10cSrcweir             rStr.AssignAscii( "###" );
1638cdf0e10cSrcweir         rStr.Erase( nLen );
1639cdf0e10cSrcweir     }
1640cdf0e10cSrcweir     if ( nLen > rStr.Len() )
1641cdf0e10cSrcweir     {
1642cdf0e10cSrcweir         if ( bValue && eHorJust == SVX_HOR_JUSTIFY_STANDARD )
1643cdf0e10cSrcweir             eHorJust = SVX_HOR_JUSTIFY_RIGHT;
1644cdf0e10cSrcweir         switch ( eHorJust )
1645cdf0e10cSrcweir         {
1646cdf0e10cSrcweir             case SVX_HOR_JUSTIFY_RIGHT:
1647cdf0e10cSrcweir             {
1648cdf0e10cSrcweir                 String aTmp;
1649cdf0e10cSrcweir                 aTmp.Fill( nLen - rStr.Len() );
1650cdf0e10cSrcweir                 rStr.Insert( aTmp, 0 );
1651cdf0e10cSrcweir             }
1652cdf0e10cSrcweir             break;
1653cdf0e10cSrcweir             case SVX_HOR_JUSTIFY_CENTER:
1654cdf0e10cSrcweir             {
1655cdf0e10cSrcweir                 xub_StrLen nLen2 = (nLen - rStr.Len()) / 2;
1656cdf0e10cSrcweir                 String aTmp;
1657cdf0e10cSrcweir                 aTmp.Fill( nLen2 );
1658cdf0e10cSrcweir                 rStr.Insert( aTmp, 0 );
1659cdf0e10cSrcweir                 rStr.Expand( nLen );
1660cdf0e10cSrcweir             }
1661cdf0e10cSrcweir             break;
1662cdf0e10cSrcweir             default:
1663cdf0e10cSrcweir                 rStr.Expand( nLen );
1664cdf0e10cSrcweir         }
1665cdf0e10cSrcweir     }
1666cdf0e10cSrcweir }
1667cdf0e10cSrcweir 
1668cdf0e10cSrcweir 
1669cdf0e10cSrcweir void lcl_ScDocShell_WriteEmptyFixedWidthString( SvStream& rStream,
1670cdf0e10cSrcweir         const ScDocument& rDoc, SCTAB nTab, SCCOL nCol )
1671cdf0e10cSrcweir {
1672cdf0e10cSrcweir     String aString;
1673cdf0e10cSrcweir     lcl_ScDocShell_GetFixedWidthString( aString, rDoc, nTab, nCol, sal_False,
1674cdf0e10cSrcweir             SVX_HOR_JUSTIFY_STANDARD );
1675cdf0e10cSrcweir     rStream.WriteUnicodeOrByteText( aString );
1676cdf0e10cSrcweir }
1677cdf0e10cSrcweir 
1678cdf0e10cSrcweir 
1679cdf0e10cSrcweir void ScDocShell::AsciiSave( SvStream& rStream, const ScImportOptions& rAsciiOpt )
1680cdf0e10cSrcweir {
1681cdf0e10cSrcweir     sal_Unicode cDelim    = rAsciiOpt.nFieldSepCode;
1682cdf0e10cSrcweir     sal_Unicode cStrDelim = rAsciiOpt.nTextSepCode;
1683cdf0e10cSrcweir     CharSet eCharSet      = rAsciiOpt.eCharSet;
1684cdf0e10cSrcweir     sal_Bool bFixedWidth      = rAsciiOpt.bFixedWidth;
1685cdf0e10cSrcweir     sal_Bool bSaveAsShown     = rAsciiOpt.bSaveAsShown;
1686cdf0e10cSrcweir 
1687cdf0e10cSrcweir 	CharSet eOldCharSet = rStream.GetStreamCharSet();
1688cdf0e10cSrcweir 	rStream.SetStreamCharSet( eCharSet );
1689cdf0e10cSrcweir 	sal_uInt16 nOldNumberFormatInt = rStream.GetNumberFormatInt();
1690cdf0e10cSrcweir     ByteString aStrDelimEncoded;    // only used if not Unicode
1691cdf0e10cSrcweir     UniString aStrDelimDecoded;     // only used if context encoding
1692cdf0e10cSrcweir     ByteString aDelimEncoded;
1693cdf0e10cSrcweir     UniString aDelimDecoded;
1694cdf0e10cSrcweir     sal_Bool bContextOrNotAsciiEncoding;
1695cdf0e10cSrcweir 	if ( eCharSet == RTL_TEXTENCODING_UNICODE )
1696cdf0e10cSrcweir     {
1697cdf0e10cSrcweir 		rStream.StartWritingUnicodeText();
1698cdf0e10cSrcweir         bContextOrNotAsciiEncoding = sal_False;
1699cdf0e10cSrcweir     }
1700cdf0e10cSrcweir     else
1701cdf0e10cSrcweir     {
1702cdf0e10cSrcweir         aStrDelimEncoded = ByteString( cStrDelim, eCharSet );
1703cdf0e10cSrcweir         aDelimEncoded = ByteString( cDelim, eCharSet );
1704cdf0e10cSrcweir         rtl_TextEncodingInfo aInfo;
1705cdf0e10cSrcweir         aInfo.StructSize = sizeof(aInfo);
1706cdf0e10cSrcweir         if ( rtl_getTextEncodingInfo( eCharSet, &aInfo ) )
1707cdf0e10cSrcweir         {
1708cdf0e10cSrcweir             bContextOrNotAsciiEncoding =
1709cdf0e10cSrcweir                 (((aInfo.Flags & RTL_TEXTENCODING_INFO_CONTEXT) != 0) ||
1710cdf0e10cSrcweir                  ((aInfo.Flags & RTL_TEXTENCODING_INFO_ASCII) == 0));
1711cdf0e10cSrcweir             if ( bContextOrNotAsciiEncoding )
1712cdf0e10cSrcweir             {
1713cdf0e10cSrcweir                 aStrDelimDecoded = String( aStrDelimEncoded, eCharSet );
1714cdf0e10cSrcweir                 aDelimDecoded = String( aDelimEncoded, eCharSet );
1715cdf0e10cSrcweir             }
1716cdf0e10cSrcweir         }
1717cdf0e10cSrcweir         else
1718cdf0e10cSrcweir             bContextOrNotAsciiEncoding = sal_False;
1719cdf0e10cSrcweir     }
1720cdf0e10cSrcweir 
1721cdf0e10cSrcweir 	SCCOL nStartCol = 0;
1722cdf0e10cSrcweir 	SCROW nStartRow = 0;
1723cdf0e10cSrcweir 	SCTAB nTab = GetSaveTab();
1724cdf0e10cSrcweir 	SCCOL nEndCol;
1725cdf0e10cSrcweir 	SCROW nEndRow;
1726cdf0e10cSrcweir 	aDocument.GetCellArea( nTab, nEndCol, nEndRow );
1727cdf0e10cSrcweir 
1728cdf0e10cSrcweir 	ScProgress aProgress( this, ScGlobal::GetRscString( STR_SAVE_DOC ), nEndRow );
1729cdf0e10cSrcweir 
1730cdf0e10cSrcweir 	String aString;
1731cdf0e10cSrcweir 
1732cdf0e10cSrcweir 	ScTabViewShell*	pViewSh = PTR_CAST(ScTabViewShell, SfxViewShell::Current());
1733cdf0e10cSrcweir 	const ScViewOptions& rOpt = (pViewSh)
1734cdf0e10cSrcweir 								? pViewSh->GetViewData()->GetOptions()
1735cdf0e10cSrcweir 								: aDocument.GetViewOptions();
1736cdf0e10cSrcweir 	sal_Bool bShowFormulas = rOpt.GetOption( VOPT_FORMULAS );
1737cdf0e10cSrcweir 	sal_Bool bTabProtect = aDocument.IsTabProtected( nTab );
1738cdf0e10cSrcweir 
1739cdf0e10cSrcweir 	SCCOL nCol;
1740cdf0e10cSrcweir 	SCROW nRow;
1741cdf0e10cSrcweir 	SCCOL nNextCol = nStartCol;
1742cdf0e10cSrcweir 	SCROW nNextRow = nStartRow;
1743cdf0e10cSrcweir 	SCCOL nEmptyCol;
1744cdf0e10cSrcweir 	SCROW nEmptyRow;
1745cdf0e10cSrcweir 	SvNumberFormatter& rFormatter = *aDocument.GetFormatTable();
1746cdf0e10cSrcweir 
1747cdf0e10cSrcweir 	ScHorizontalCellIterator aIter( &aDocument, nTab, nStartCol, nStartRow,
1748cdf0e10cSrcweir 		nEndCol, nEndRow );
1749cdf0e10cSrcweir 	ScBaseCell* pCell;
1750cdf0e10cSrcweir     while ( ( pCell = aIter.GetNext( nCol, nRow ) ) != NULL )
1751cdf0e10cSrcweir     {
1752cdf0e10cSrcweir         sal_Bool bProgress = sal_False;		// only upon line change
1753cdf0e10cSrcweir         if ( nNextRow < nRow )
1754cdf0e10cSrcweir         {   // empty rows or/and empty columns up to end of row
1755cdf0e10cSrcweir             bProgress = sal_True;
1756cdf0e10cSrcweir             for ( nEmptyCol = nNextCol; nEmptyCol < nEndCol; nEmptyCol++ )
1757cdf0e10cSrcweir             {   // remaining columns of last row
1758cdf0e10cSrcweir                 if ( bFixedWidth )
1759cdf0e10cSrcweir                     lcl_ScDocShell_WriteEmptyFixedWidthString( rStream,
1760cdf0e10cSrcweir                             aDocument, nTab, nEmptyCol );
1761cdf0e10cSrcweir                 else if ( cDelim != 0 )
1762cdf0e10cSrcweir                     rStream.WriteUniOrByteChar( cDelim );
1763cdf0e10cSrcweir             }
1764cdf0e10cSrcweir             endlub( rStream );
1765cdf0e10cSrcweir             nNextRow++;
1766cdf0e10cSrcweir             for ( nEmptyRow = nNextRow; nEmptyRow < nRow; nEmptyRow++ )
1767cdf0e10cSrcweir             {   // completely empty rows
1768cdf0e10cSrcweir                 for ( nEmptyCol = nStartCol; nEmptyCol < nEndCol; nEmptyCol++ )
1769cdf0e10cSrcweir                 {
1770cdf0e10cSrcweir                     if ( bFixedWidth )
1771cdf0e10cSrcweir                         lcl_ScDocShell_WriteEmptyFixedWidthString( rStream,
1772cdf0e10cSrcweir                                 aDocument, nTab, nEmptyCol );
1773cdf0e10cSrcweir                     else if ( cDelim != 0 )
1774cdf0e10cSrcweir                         rStream.WriteUniOrByteChar( cDelim );
1775cdf0e10cSrcweir                 }
1776cdf0e10cSrcweir                 endlub( rStream );
1777cdf0e10cSrcweir             }
1778cdf0e10cSrcweir             for ( nEmptyCol = nStartCol; nEmptyCol < nCol; nEmptyCol++ )
1779cdf0e10cSrcweir             {   // empty columns at beginning of row
1780cdf0e10cSrcweir                 if ( bFixedWidth )
1781cdf0e10cSrcweir                     lcl_ScDocShell_WriteEmptyFixedWidthString( rStream,
1782cdf0e10cSrcweir                             aDocument, nTab, nEmptyCol );
1783cdf0e10cSrcweir                 else if ( cDelim != 0 )
1784cdf0e10cSrcweir                     rStream.WriteUniOrByteChar( cDelim );
1785cdf0e10cSrcweir             }
1786cdf0e10cSrcweir             nNextRow = nRow;
1787cdf0e10cSrcweir         }
1788cdf0e10cSrcweir         else if ( nNextCol < nCol )
1789cdf0e10cSrcweir         {   // empty columns in same row
1790cdf0e10cSrcweir             for ( nEmptyCol = nNextCol; nEmptyCol < nCol; nEmptyCol++ )
1791cdf0e10cSrcweir             {   // columns in between
1792cdf0e10cSrcweir                 if ( bFixedWidth )
1793cdf0e10cSrcweir                     lcl_ScDocShell_WriteEmptyFixedWidthString( rStream,
1794cdf0e10cSrcweir                             aDocument, nTab, nEmptyCol );
1795cdf0e10cSrcweir                 else if ( cDelim != 0 )
1796cdf0e10cSrcweir                     rStream.WriteUniOrByteChar( cDelim );
1797cdf0e10cSrcweir             }
1798cdf0e10cSrcweir         }
1799cdf0e10cSrcweir         if ( nCol == nEndCol )
1800cdf0e10cSrcweir         {
1801cdf0e10cSrcweir             bProgress = sal_True;
1802cdf0e10cSrcweir             nNextCol = nStartCol;
1803cdf0e10cSrcweir             nNextRow = nRow + 1;
1804cdf0e10cSrcweir         }
1805cdf0e10cSrcweir         else
1806cdf0e10cSrcweir             nNextCol = nCol + 1;
1807cdf0e10cSrcweir 
1808cdf0e10cSrcweir         CellType eType = pCell->GetCellType();
1809cdf0e10cSrcweir         if ( bTabProtect )
1810cdf0e10cSrcweir         {
1811cdf0e10cSrcweir             const ScProtectionAttr* pProtAttr =
1812cdf0e10cSrcweir                 (const ScProtectionAttr*) aDocument.GetAttr(
1813cdf0e10cSrcweir                                                             nCol, nRow, nTab, ATTR_PROTECTION );
1814cdf0e10cSrcweir             if ( pProtAttr->GetHideCell() ||
1815cdf0e10cSrcweir                     ( eType == CELLTYPE_FORMULA && bShowFormulas &&
1816cdf0e10cSrcweir                       pProtAttr->GetHideFormula() ) )
1817cdf0e10cSrcweir                 eType = CELLTYPE_NONE;	// hide
1818cdf0e10cSrcweir         }
1819cdf0e10cSrcweir         sal_Bool bString;
1820cdf0e10cSrcweir         switch ( eType )
1821cdf0e10cSrcweir         {
1822cdf0e10cSrcweir             case CELLTYPE_NOTE:
1823cdf0e10cSrcweir             case CELLTYPE_NONE:
1824cdf0e10cSrcweir                 aString.Erase();
1825cdf0e10cSrcweir                 bString = sal_False;
1826cdf0e10cSrcweir                 break;
1827cdf0e10cSrcweir             case CELLTYPE_FORMULA :
1828cdf0e10cSrcweir                 {
1829cdf0e10cSrcweir                     sal_uInt16 nErrCode;
1830cdf0e10cSrcweir                     if ( bShowFormulas )
1831cdf0e10cSrcweir                     {
1832cdf0e10cSrcweir                         ((ScFormulaCell*)pCell)->GetFormula( aString );
1833cdf0e10cSrcweir                         bString = sal_True;
1834cdf0e10cSrcweir                     }
1835cdf0e10cSrcweir                     else if ( ( nErrCode = ((ScFormulaCell*)pCell)->GetErrCode() ) != 0 )
1836cdf0e10cSrcweir                     {
1837cdf0e10cSrcweir                         aString = ScGlobal::GetErrorString( nErrCode );
1838cdf0e10cSrcweir                         bString = sal_True;
1839cdf0e10cSrcweir                     }
1840cdf0e10cSrcweir                     else if ( ((ScFormulaCell*)pCell)->IsValue() )
1841cdf0e10cSrcweir                     {
1842cdf0e10cSrcweir                         sal_uInt32 nFormat;
1843cdf0e10cSrcweir                         aDocument.GetNumberFormat( nCol, nRow, nTab, nFormat );
1844cdf0e10cSrcweir                         if ( bFixedWidth || bSaveAsShown )
1845cdf0e10cSrcweir                         {
1846cdf0e10cSrcweir                             Color* pDummy;
1847cdf0e10cSrcweir                             ScCellFormat::GetString( pCell, nFormat, aString, &pDummy, rFormatter );
1848cdf0e10cSrcweir                             bString = bSaveAsShown && rFormatter.IsTextFormat( nFormat);
1849cdf0e10cSrcweir                         }
1850cdf0e10cSrcweir                         else
1851cdf0e10cSrcweir                         {
1852cdf0e10cSrcweir                             ScCellFormat::GetInputString( pCell, nFormat, aString, rFormatter );
1853cdf0e10cSrcweir                             bString = sal_False;
1854cdf0e10cSrcweir                         }
1855cdf0e10cSrcweir                     }
1856cdf0e10cSrcweir                     else
1857cdf0e10cSrcweir                     {
1858cdf0e10cSrcweir                         if ( bSaveAsShown )
1859cdf0e10cSrcweir                         {
1860cdf0e10cSrcweir                             sal_uInt32 nFormat;
1861cdf0e10cSrcweir                             aDocument.GetNumberFormat( nCol, nRow, nTab, nFormat );
1862cdf0e10cSrcweir                             Color* pDummy;
1863cdf0e10cSrcweir                             ScCellFormat::GetString( pCell, nFormat, aString, &pDummy, rFormatter );
1864cdf0e10cSrcweir                         }
1865cdf0e10cSrcweir                         else
1866cdf0e10cSrcweir                             ((ScFormulaCell*)pCell)->GetString( aString );
1867cdf0e10cSrcweir                         bString = sal_True;
1868cdf0e10cSrcweir                     }
1869cdf0e10cSrcweir                 }
1870cdf0e10cSrcweir                 break;
1871cdf0e10cSrcweir             case CELLTYPE_STRING :
1872cdf0e10cSrcweir                 if ( bSaveAsShown )
1873cdf0e10cSrcweir                 {
1874cdf0e10cSrcweir                     sal_uInt32 nFormat;
1875cdf0e10cSrcweir                     aDocument.GetNumberFormat( nCol, nRow, nTab, nFormat );
1876cdf0e10cSrcweir                     Color* pDummy;
1877cdf0e10cSrcweir                     ScCellFormat::GetString( pCell, nFormat, aString, &pDummy, rFormatter );
1878cdf0e10cSrcweir                 }
1879cdf0e10cSrcweir                 else
1880cdf0e10cSrcweir                     ((ScStringCell*)pCell)->GetString( aString );
1881cdf0e10cSrcweir                 bString = sal_True;
1882cdf0e10cSrcweir                 break;
1883cdf0e10cSrcweir             case CELLTYPE_EDIT :
1884cdf0e10cSrcweir                 {
1885cdf0e10cSrcweir                     const EditTextObject* pObj;
1886cdf0e10cSrcweir                     static_cast<const ScEditCell*>(pCell)->GetData( pObj);
1887cdf0e10cSrcweir                     EditEngine& rEngine = aDocument.GetEditEngine();
1888cdf0e10cSrcweir                     rEngine.SetText( *pObj);
1889cdf0e10cSrcweir                     aString = rEngine.GetText();  // including LF
1890cdf0e10cSrcweir                     bString = sal_True;
1891cdf0e10cSrcweir                 }
1892cdf0e10cSrcweir                 break;
1893cdf0e10cSrcweir             case CELLTYPE_VALUE :
1894cdf0e10cSrcweir                 {
1895cdf0e10cSrcweir                     sal_uInt32 nFormat;
1896cdf0e10cSrcweir                     aDocument.GetNumberFormat( nCol, nRow, nTab, nFormat );
1897cdf0e10cSrcweir                     if ( bFixedWidth || bSaveAsShown )
1898cdf0e10cSrcweir                     {
1899cdf0e10cSrcweir                         Color* pDummy;
1900cdf0e10cSrcweir                         ScCellFormat::GetString( pCell, nFormat, aString, &pDummy, rFormatter );
1901cdf0e10cSrcweir                         bString = bSaveAsShown && rFormatter.IsTextFormat( nFormat);
1902cdf0e10cSrcweir                     }
1903cdf0e10cSrcweir                     else
1904cdf0e10cSrcweir                     {
1905cdf0e10cSrcweir                         ScCellFormat::GetInputString( pCell, nFormat, aString, rFormatter );
1906cdf0e10cSrcweir                         bString = sal_False;
1907cdf0e10cSrcweir                     }
1908cdf0e10cSrcweir                 }
1909cdf0e10cSrcweir                 break;
1910cdf0e10cSrcweir             default:
1911cdf0e10cSrcweir                 DBG_ERROR( "ScDocShell::AsciiSave: unknown CellType" );
1912cdf0e10cSrcweir                 aString.Erase();
1913cdf0e10cSrcweir                 bString = sal_False;
1914cdf0e10cSrcweir         }
1915cdf0e10cSrcweir 
1916cdf0e10cSrcweir         if ( bFixedWidth )
1917cdf0e10cSrcweir         {
1918cdf0e10cSrcweir             SvxCellHorJustify eHorJust = (SvxCellHorJustify)
1919cdf0e10cSrcweir                 ((const SvxHorJustifyItem*) aDocument.GetAttr( nCol, nRow,
1920cdf0e10cSrcweir                 nTab, ATTR_HOR_JUSTIFY ))->GetValue();
1921cdf0e10cSrcweir             lcl_ScDocShell_GetFixedWidthString( aString, aDocument, nTab, nCol,
1922cdf0e10cSrcweir                     !bString, eHorJust );
1923cdf0e10cSrcweir             rStream.WriteUnicodeOrByteText( aString );
1924cdf0e10cSrcweir         }
1925cdf0e10cSrcweir         else
1926cdf0e10cSrcweir         {
1927cdf0e10cSrcweir             if (!bString && cStrDelim != 0 && aString.Len() > 0)
1928cdf0e10cSrcweir             {
1929cdf0e10cSrcweir                 sal_Unicode c = aString.GetChar(0);
1930cdf0e10cSrcweir                 bString = (c == cStrDelim || c == ' ' ||
1931cdf0e10cSrcweir                         aString.GetChar( aString.Len()-1) == ' ' ||
1932cdf0e10cSrcweir                         aString.Search( cStrDelim) != STRING_NOTFOUND);
1933cdf0e10cSrcweir                 if (!bString && cDelim != 0)
1934cdf0e10cSrcweir                     bString = (aString.Search( cDelim) != STRING_NOTFOUND);
1935cdf0e10cSrcweir             }
1936cdf0e10cSrcweir             if ( bString )
1937cdf0e10cSrcweir             {
1938cdf0e10cSrcweir                 if ( cStrDelim != 0 ) //@ BugId 55355
1939cdf0e10cSrcweir                 {
1940cdf0e10cSrcweir                     if ( eCharSet == RTL_TEXTENCODING_UNICODE )
1941cdf0e10cSrcweir                     {
1942cdf0e10cSrcweir                         xub_StrLen nPos = aString.Search( cStrDelim );
1943cdf0e10cSrcweir                         // #i116636# quotes are needed if text delimiter (quote), field delimiter, or LF is in the cell text
1944cdf0e10cSrcweir                         bool bNeedQuotes = rAsciiOpt.bQuoteAllText ||
1945cdf0e10cSrcweir                                             ( nPos != STRING_NOTFOUND ) ||
1946cdf0e10cSrcweir                                             ( aString.Search( cDelim ) != STRING_NOTFOUND ) ||
1947cdf0e10cSrcweir                                             ( aString.Search( sal_Unicode(_LF) ) != STRING_NOTFOUND );
1948cdf0e10cSrcweir                         while ( nPos != STRING_NOTFOUND )
1949cdf0e10cSrcweir                         {
1950cdf0e10cSrcweir                             aString.Insert( cStrDelim, nPos );
1951cdf0e10cSrcweir                             nPos = aString.Search( cStrDelim, nPos+2 );
1952cdf0e10cSrcweir                         }
1953cdf0e10cSrcweir                         if ( bNeedQuotes )
1954cdf0e10cSrcweir                             rStream.WriteUniOrByteChar( cStrDelim, eCharSet );
1955cdf0e10cSrcweir                         rStream.WriteUnicodeText( aString );
1956cdf0e10cSrcweir                         if ( bNeedQuotes )
1957cdf0e10cSrcweir                             rStream.WriteUniOrByteChar( cStrDelim, eCharSet );
1958cdf0e10cSrcweir                     }
1959cdf0e10cSrcweir                     else
1960cdf0e10cSrcweir                     {
1961cdf0e10cSrcweir                         // #105549# This is nasty. The Unicode to byte encoding
1962cdf0e10cSrcweir                         // may convert typographical quotation marks to ASCII
1963cdf0e10cSrcweir                         // quotation marks, which may interfer with the delimiter,
1964cdf0e10cSrcweir                         // so we have to escape delimiters after the string has
1965cdf0e10cSrcweir                         // been encoded. Since this may happen also with UTF-8
1966cdf0e10cSrcweir                         // encoded typographical quotation marks if such was
1967cdf0e10cSrcweir                         // specified as a delimiter we have to check for the full
1968cdf0e10cSrcweir                         // encoded delimiter string, not just one character.
1969cdf0e10cSrcweir                         // Now for RTL_TEXTENCODING_ISO_2022_... and similar brain
1970cdf0e10cSrcweir                         // dead encodings where one code point (and especially a
1971cdf0e10cSrcweir                         // low ASCII value) may represent different characters, we
1972cdf0e10cSrcweir                         // have to convert forth and back and forth again. Same for
1973cdf0e10cSrcweir                         // UTF-7 since it is a context sensitive encoding too.
1974cdf0e10cSrcweir 
1975cdf0e10cSrcweir                         if ( bContextOrNotAsciiEncoding )
1976cdf0e10cSrcweir                         {
1977cdf0e10cSrcweir                             // to byte encoding
1978cdf0e10cSrcweir                             ByteString aStrEnc( aString, eCharSet );
1979cdf0e10cSrcweir                             // back to Unicode
1980cdf0e10cSrcweir                             UniString aStrDec( aStrEnc, eCharSet );
1981cdf0e10cSrcweir                             // search on re-decoded string
1982cdf0e10cSrcweir                             xub_StrLen nPos = aStrDec.Search( aStrDelimDecoded );
1983cdf0e10cSrcweir                             bool bNeedQuotes = rAsciiOpt.bQuoteAllText ||
1984cdf0e10cSrcweir                                                 ( nPos != STRING_NOTFOUND ) ||
1985cdf0e10cSrcweir                                                 ( aStrDec.Search( aDelimDecoded ) != STRING_NOTFOUND ) ||
1986cdf0e10cSrcweir                                                 ( aStrDec.Search( sal_Unicode(_LF) ) != STRING_NOTFOUND );
1987cdf0e10cSrcweir                             while ( nPos != STRING_NOTFOUND )
1988cdf0e10cSrcweir                             {
1989cdf0e10cSrcweir                                 aStrDec.Insert( aStrDelimDecoded, nPos );
1990cdf0e10cSrcweir                                 nPos = aStrDec.Search( aStrDelimDecoded,
1991cdf0e10cSrcweir                                         nPos+1+aStrDelimDecoded.Len() );
1992cdf0e10cSrcweir                             }
1993cdf0e10cSrcweir                             // write byte re-encoded
1994cdf0e10cSrcweir                             if ( bNeedQuotes )
1995cdf0e10cSrcweir                                 rStream.WriteUniOrByteChar( cStrDelim, eCharSet );
1996cdf0e10cSrcweir                             rStream.WriteUnicodeOrByteText( aStrDec, eCharSet );
1997cdf0e10cSrcweir                             if ( bNeedQuotes )
1998cdf0e10cSrcweir                                 rStream.WriteUniOrByteChar( cStrDelim, eCharSet );
1999cdf0e10cSrcweir                         }
2000cdf0e10cSrcweir                         else
2001cdf0e10cSrcweir                         {
2002cdf0e10cSrcweir                             ByteString aStrEnc( aString, eCharSet );
2003cdf0e10cSrcweir                             // search on encoded string
2004cdf0e10cSrcweir                             xub_StrLen nPos = aStrEnc.Search( aStrDelimEncoded );
2005cdf0e10cSrcweir                             bool bNeedQuotes = rAsciiOpt.bQuoteAllText ||
2006cdf0e10cSrcweir                                                 ( nPos != STRING_NOTFOUND ) ||
2007cdf0e10cSrcweir                                                 ( aStrEnc.Search( aDelimEncoded ) != STRING_NOTFOUND ) ||
2008cdf0e10cSrcweir                                                 ( aStrEnc.Search( sal_Char(_LF) ) != STRING_NOTFOUND );
2009cdf0e10cSrcweir                             while ( nPos != STRING_NOTFOUND )
2010cdf0e10cSrcweir                             {
2011cdf0e10cSrcweir                                 aStrEnc.Insert( aStrDelimEncoded, nPos );
2012cdf0e10cSrcweir                                 nPos = aStrEnc.Search( aStrDelimEncoded,
2013cdf0e10cSrcweir                                         nPos+1+aStrDelimEncoded.Len() );
2014cdf0e10cSrcweir                             }
2015cdf0e10cSrcweir                             // write byte encoded
2016cdf0e10cSrcweir                             if ( bNeedQuotes )
2017cdf0e10cSrcweir                                 rStream.Write( aStrDelimEncoded.GetBuffer(),
2018cdf0e10cSrcweir                                         aStrDelimEncoded.Len() );
2019cdf0e10cSrcweir                             rStream.Write( aStrEnc.GetBuffer(), aStrEnc.Len() );
2020cdf0e10cSrcweir                             if ( bNeedQuotes )
2021cdf0e10cSrcweir                                 rStream.Write( aStrDelimEncoded.GetBuffer(),
2022cdf0e10cSrcweir                                         aStrDelimEncoded.Len() );
2023cdf0e10cSrcweir                         }
2024cdf0e10cSrcweir                     }
2025cdf0e10cSrcweir                 }
2026cdf0e10cSrcweir                 else
2027cdf0e10cSrcweir                     rStream.WriteUnicodeOrByteText( aString );
2028cdf0e10cSrcweir             }
2029cdf0e10cSrcweir             else
2030cdf0e10cSrcweir                 rStream.WriteUnicodeOrByteText( aString );
2031cdf0e10cSrcweir         }
2032cdf0e10cSrcweir 
2033cdf0e10cSrcweir         if( nCol < nEndCol )
2034cdf0e10cSrcweir         {
2035cdf0e10cSrcweir             if(cDelim!=0) //@ BugId 55355
2036cdf0e10cSrcweir                 rStream.WriteUniOrByteChar( cDelim );
2037cdf0e10cSrcweir         }
2038cdf0e10cSrcweir         else
2039cdf0e10cSrcweir             endlub( rStream );
2040cdf0e10cSrcweir 
2041cdf0e10cSrcweir         if ( bProgress )
2042cdf0e10cSrcweir             aProgress.SetStateOnPercent( nRow );
2043cdf0e10cSrcweir     }
2044cdf0e10cSrcweir 
2045cdf0e10cSrcweir 	// write out empty if requested
2046cdf0e10cSrcweir 	if ( nNextRow <= nEndRow )
2047cdf0e10cSrcweir 	{
2048cdf0e10cSrcweir         for ( nEmptyCol = nNextCol; nEmptyCol < nEndCol; nEmptyCol++ )
2049cdf0e10cSrcweir         {	// remaining empty columns of last row
2050cdf0e10cSrcweir             if ( bFixedWidth )
2051cdf0e10cSrcweir                 lcl_ScDocShell_WriteEmptyFixedWidthString( rStream,
2052cdf0e10cSrcweir                         aDocument, nTab, nEmptyCol );
2053cdf0e10cSrcweir             else if ( cDelim != 0 )
2054cdf0e10cSrcweir                 rStream.WriteUniOrByteChar( cDelim );
2055cdf0e10cSrcweir         }
2056cdf0e10cSrcweir 		endlub( rStream );
2057cdf0e10cSrcweir 		nNextRow++;
2058cdf0e10cSrcweir 	}
2059cdf0e10cSrcweir 	for ( nEmptyRow = nNextRow; nEmptyRow <= nEndRow; nEmptyRow++ )
2060cdf0e10cSrcweir 	{	// entire empty rows
2061cdf0e10cSrcweir         for ( nEmptyCol = nStartCol; nEmptyCol < nEndCol; nEmptyCol++ )
2062cdf0e10cSrcweir         {
2063cdf0e10cSrcweir             if ( bFixedWidth )
2064cdf0e10cSrcweir                 lcl_ScDocShell_WriteEmptyFixedWidthString( rStream,
2065cdf0e10cSrcweir                         aDocument, nTab, nEmptyCol );
2066cdf0e10cSrcweir             else if ( cDelim != 0 )
2067cdf0e10cSrcweir                 rStream.WriteUniOrByteChar( cDelim );
2068cdf0e10cSrcweir         }
2069cdf0e10cSrcweir 		endlub( rStream );
2070cdf0e10cSrcweir 	}
2071cdf0e10cSrcweir 
2072cdf0e10cSrcweir 	rStream.SetStreamCharSet( eOldCharSet );
2073cdf0e10cSrcweir 	rStream.SetNumberFormatInt( nOldNumberFormatInt );
2074cdf0e10cSrcweir }
2075cdf0e10cSrcweir 
2076cdf0e10cSrcweir sal_Bool __EXPORT ScDocShell::ConvertTo( SfxMedium &rMed )
2077cdf0e10cSrcweir {
2078cdf0e10cSrcweir 	RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "nn93723", "ScDocShell::ConvertTo" );
2079cdf0e10cSrcweir 
2080cdf0e10cSrcweir 	ScRefreshTimerProtector( aDocument.GetRefreshTimerControlAddress() );
2081cdf0e10cSrcweir 
2082cdf0e10cSrcweir     //  #i6500# don't call DoEnterHandler here (doesn't work with AutoSave),
2083cdf0e10cSrcweir     //  it's already in ExecuteSave (as for Save and SaveAs)
2084cdf0e10cSrcweir 
2085cdf0e10cSrcweir 	if (pAutoStyleList)
2086cdf0e10cSrcweir 		pAutoStyleList->ExecuteAllNow();				// Vorlagen-Timeouts jetzt ausfuehren
2087cdf0e10cSrcweir 	if (GetCreateMode()== SFX_CREATE_MODE_STANDARD)
2088cdf0e10cSrcweir         SfxObjectShell::SetVisArea( Rectangle() );     // normal bearbeitet -> keine VisArea
2089cdf0e10cSrcweir 
2090cdf0e10cSrcweir 	DBG_ASSERT( rMed.GetFilter(), "Filter == 0" );
2091cdf0e10cSrcweir 
2092cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
2093cdf0e10cSrcweir 	String aFltName = rMed.GetFilter()->GetFilterName();
2094cdf0e10cSrcweir 
2095cdf0e10cSrcweir /*
2096cdf0e10cSrcweir 	if (aFltName.EqualsAscii(pFilterLotus))
2097cdf0e10cSrcweir 	{
2098cdf0e10cSrcweir 		SvStream* pStream = rMed.GetOutStream();
2099cdf0e10cSrcweir 		if (pStream)
2100cdf0e10cSrcweir 		{
2101cdf0e10cSrcweir 			FltError eError = ScFormatFilter::Get().ScExportLotus123( *pStream, &aDocument, ExpWK1,
2102cdf0e10cSrcweir 												CHARSET_IBMPC_437 );
2103cdf0e10cSrcweir 			bRet = eError == eERR_OK;
2104cdf0e10cSrcweir 		}
2105cdf0e10cSrcweir 	}
2106cdf0e10cSrcweir 	else
2107cdf0e10cSrcweir */
2108cdf0e10cSrcweir     if (aFltName.EqualsAscii(pFilterXML))
2109cdf0e10cSrcweir 	{
2110cdf0e10cSrcweir         //TODO/LATER: this shouldn't happen!
2111cdf0e10cSrcweir         DBG_ERROR("XML filter in ConvertFrom?!");
2112cdf0e10cSrcweir 		bRet = SaveXML( &rMed, NULL );
2113cdf0e10cSrcweir 	}
2114cdf0e10cSrcweir 	else if (aFltName.EqualsAscii(pFilterExcel5) || aFltName.EqualsAscii(pFilterExcel95) ||
2115cdf0e10cSrcweir 			 aFltName.EqualsAscii(pFilterExcel97) || aFltName.EqualsAscii(pFilterEx5Temp) ||
2116cdf0e10cSrcweir 			 aFltName.EqualsAscii(pFilterEx95Temp) || aFltName.EqualsAscii(pFilterEx97Temp) ||
2117cdf0e10cSrcweir 			 aFltName.EqualsAscii(pFilterEx07Xml))
2118cdf0e10cSrcweir 	{
2119cdf0e10cSrcweir 		WaitObject aWait( GetActiveDialogParent() );
2120cdf0e10cSrcweir 
2121cdf0e10cSrcweir         bool bDoSave = true;
2122cdf0e10cSrcweir         if( ScTabViewShell* pViewShell = GetBestViewShell() )
2123cdf0e10cSrcweir         {
2124cdf0e10cSrcweir             ScExtDocOptions* pExtDocOpt = aDocument.GetExtDocOptions();
2125cdf0e10cSrcweir             if( !pExtDocOpt )
2126cdf0e10cSrcweir                 aDocument.SetExtDocOptions( pExtDocOpt = new ScExtDocOptions );
2127cdf0e10cSrcweir             pViewShell->GetViewData()->WriteExtOptions( *pExtDocOpt );
2128cdf0e10cSrcweir 
2129cdf0e10cSrcweir             /*  #115980# #i104990# If the imported document contains a medium
2130cdf0e10cSrcweir                 password, determine if we can save it, otherwise ask the users
2131cdf0e10cSrcweir                 whether they want to save without it. */
2132cdf0e10cSrcweir             if( (rMed.GetFilter()->GetFilterFlags() & SFX_FILTER_ENCRYPTION) == 0 )
2133cdf0e10cSrcweir             {
2134cdf0e10cSrcweir                 SfxItemSet* pItemSet = rMed.GetItemSet();
2135cdf0e10cSrcweir                 const SfxPoolItem* pItem = 0;
2136cdf0e10cSrcweir                 if( pItemSet && pItemSet->GetItemState( SID_PASSWORD, sal_True, &pItem ) == SFX_ITEM_SET )
2137cdf0e10cSrcweir                 {
2138cdf0e10cSrcweir                     bDoSave = ScWarnPassword::WarningOnPassword( rMed );
2139cdf0e10cSrcweir                     // #i42858# remove password from medium (warn only one time)
2140cdf0e10cSrcweir                     if( bDoSave )
2141cdf0e10cSrcweir                         pItemSet->ClearItem( SID_PASSWORD );
2142cdf0e10cSrcweir                 }
2143cdf0e10cSrcweir             }
2144cdf0e10cSrcweir 
2145cdf0e10cSrcweir #if ENABLE_SHEET_PROTECTION
2146cdf0e10cSrcweir             if( bDoSave )
2147cdf0e10cSrcweir             {
2148cdf0e10cSrcweir                 bool bNeedRetypePassDlg = ScPassHashHelper::needsPassHashRegen( aDocument, PASSHASH_XL );
2149cdf0e10cSrcweir                 bDoSave = !bNeedRetypePassDlg || pViewShell->ExecuteRetypePassDlg( PASSHASH_XL );
2150cdf0e10cSrcweir             }
2151cdf0e10cSrcweir #endif
2152cdf0e10cSrcweir         }
2153cdf0e10cSrcweir 
2154cdf0e10cSrcweir         if( bDoSave )
2155cdf0e10cSrcweir         {
2156cdf0e10cSrcweir             ExportFormatExcel eFormat = ExpBiff5;
2157cdf0e10cSrcweir             if( aFltName.EqualsAscii( pFilterExcel97 ) || aFltName.EqualsAscii( pFilterEx97Temp ) )
2158cdf0e10cSrcweir                 eFormat = ExpBiff8;
2159cdf0e10cSrcweir             if( aFltName.EqualsAscii( pFilterEx07Xml ) )
2160cdf0e10cSrcweir                 eFormat = Exp2007Xml;
2161cdf0e10cSrcweir             FltError eError = ScFormatFilter::Get().ScExportExcel5( rMed, &aDocument, eFormat, RTL_TEXTENCODING_MS_1252 );
2162cdf0e10cSrcweir 
2163cdf0e10cSrcweir             if( eError && !GetError() )
2164cdf0e10cSrcweir                 SetError( eError, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ) );
2165cdf0e10cSrcweir 
2166cdf0e10cSrcweir             // don't return false for warnings
2167cdf0e10cSrcweir             bRet = ((eError & ERRCODE_WARNING_MASK) == ERRCODE_WARNING_MASK) || (eError == eERR_OK);
2168cdf0e10cSrcweir         }
2169cdf0e10cSrcweir         else
2170cdf0e10cSrcweir         {
2171cdf0e10cSrcweir             // export aborted, i.e. "Save without password" warning
2172cdf0e10cSrcweir             SetError( ERRCODE_ABORT, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ) );
2173cdf0e10cSrcweir         }
2174cdf0e10cSrcweir     }
2175cdf0e10cSrcweir 	else if (aFltName.EqualsAscii(pFilterAscii))
2176cdf0e10cSrcweir 	{
2177cdf0e10cSrcweir 		SvStream* pStream = rMed.GetOutStream();
2178cdf0e10cSrcweir 		if (pStream)
2179cdf0e10cSrcweir 		{
2180cdf0e10cSrcweir 			String sItStr;
2181cdf0e10cSrcweir 			SfxItemSet*	 pSet = rMed.GetItemSet();
2182cdf0e10cSrcweir 			const SfxPoolItem* pItem;
2183cdf0e10cSrcweir 			if ( pSet && SFX_ITEM_SET ==
2184cdf0e10cSrcweir 				 pSet->GetItemState( SID_FILE_FILTEROPTIONS, sal_True, &pItem ) )
2185cdf0e10cSrcweir 			{
2186cdf0e10cSrcweir 				sItStr = ((const SfxStringItem*)pItem)->GetValue();
2187cdf0e10cSrcweir 			}
2188cdf0e10cSrcweir 
2189cdf0e10cSrcweir 			if ( sItStr.Len() == 0 )
2190cdf0e10cSrcweir 			{
2191cdf0e10cSrcweir 				//	default for ascii export (from API without options):
2192cdf0e10cSrcweir 				//	ISO8859-1/MS_1252 encoding, comma, double quotes
2193cdf0e10cSrcweir 
2194cdf0e10cSrcweir 				ScImportOptions aDefOptions( ',', '"', RTL_TEXTENCODING_MS_1252 );
2195cdf0e10cSrcweir 				sItStr = aDefOptions.BuildString();
2196cdf0e10cSrcweir 			}
2197cdf0e10cSrcweir 
2198cdf0e10cSrcweir 			WaitObject aWait( GetActiveDialogParent() );
2199cdf0e10cSrcweir 			ScImportOptions aOptions( sItStr );
2200cdf0e10cSrcweir 			AsciiSave( *pStream, aOptions );
2201cdf0e10cSrcweir 			bRet = sal_True;
2202cdf0e10cSrcweir 
2203cdf0e10cSrcweir 			if (aDocument.GetTableCount() > 1)
2204cdf0e10cSrcweir 				if (!rMed.GetError())
2205cdf0e10cSrcweir 					rMed.SetError(SCWARN_EXPORT_ASCII, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
2206cdf0e10cSrcweir 		}
2207cdf0e10cSrcweir 	}
2208cdf0e10cSrcweir 	else if (aFltName.EqualsAscii(pFilterDBase))
2209cdf0e10cSrcweir 	{
2210cdf0e10cSrcweir 		String sCharSet;
2211cdf0e10cSrcweir 		SfxItemSet*	pSet = rMed.GetItemSet();
2212cdf0e10cSrcweir 		const SfxPoolItem* pItem;
2213cdf0e10cSrcweir 		if ( pSet && SFX_ITEM_SET ==
2214cdf0e10cSrcweir 			 pSet->GetItemState( SID_FILE_FILTEROPTIONS, sal_True, &pItem ) )
2215cdf0e10cSrcweir 		{
2216cdf0e10cSrcweir 			sCharSet = ((const SfxStringItem*)pItem)->GetValue();
2217cdf0e10cSrcweir 		}
2218cdf0e10cSrcweir 
2219cdf0e10cSrcweir 		if (sCharSet.Len() == 0)
2220cdf0e10cSrcweir 		{
2221cdf0e10cSrcweir 			//	default for dBase export (from API without options):
2222cdf0e10cSrcweir 			//	IBM_850 encoding
2223cdf0e10cSrcweir 
2224cdf0e10cSrcweir 			sCharSet = ScGlobal::GetCharsetString( RTL_TEXTENCODING_IBM_850 );
2225cdf0e10cSrcweir 		}
2226cdf0e10cSrcweir 
2227cdf0e10cSrcweir 		WaitObject aWait( GetActiveDialogParent() );
2228cdf0e10cSrcweir // HACK damit Sba geoffnetes TempFile ueberschreiben kann
2229cdf0e10cSrcweir 		rMed.CloseOutStream();
2230cdf0e10cSrcweir 		sal_Bool bHasMemo = sal_False;
2231cdf0e10cSrcweir 
2232cdf0e10cSrcweir 		sal_uLong eError = DBaseExport( rMed.GetPhysicalName(),
2233cdf0e10cSrcweir 						ScGlobal::GetCharsetValue(sCharSet), bHasMemo );
2234cdf0e10cSrcweir 
2235cdf0e10cSrcweir 		if ( eError != eERR_OK && (eError & ERRCODE_WARNING_MASK) )
2236cdf0e10cSrcweir 		{
2237cdf0e10cSrcweir //!			if ( !rMed.GetError() )
2238cdf0e10cSrcweir //!				rMed.SetError( eError, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ) );
2239cdf0e10cSrcweir 			eError = eERR_OK;
2240cdf0e10cSrcweir 		}
2241cdf0e10cSrcweir //!		else if ( aDocument.GetTableCount() > 1 && !rMed.GetError() )
2242cdf0e10cSrcweir //!			rMed.SetError( SCWARN_EXPORT_ASCII, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ) );
2243cdf0e10cSrcweir 
2244cdf0e10cSrcweir 		INetURLObject aTmpFile( rMed.GetPhysicalName(), INET_PROT_FILE );
2245cdf0e10cSrcweir 		if ( bHasMemo )
2246cdf0e10cSrcweir 			aTmpFile.setExtension( String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("dbt")) );
2247cdf0e10cSrcweir 		if ( eError != eERR_OK )
2248cdf0e10cSrcweir 		{
2249cdf0e10cSrcweir 			if (!GetError())
2250cdf0e10cSrcweir 				SetError(eError, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
2251cdf0e10cSrcweir 			if ( bHasMemo && IsDocument( aTmpFile ) )
2252cdf0e10cSrcweir 				KillFile( aTmpFile );
2253cdf0e10cSrcweir 		}
2254cdf0e10cSrcweir 		else
2255cdf0e10cSrcweir 		{
2256cdf0e10cSrcweir 			bRet = sal_True;
2257cdf0e10cSrcweir 			if ( bHasMemo )
2258cdf0e10cSrcweir 			{
2259cdf0e10cSrcweir 				SfxStringItem* pNameItem =
2260cdf0e10cSrcweir 					(SfxStringItem*) rMed.GetItemSet()->GetItem( SID_FILE_NAME );
2261cdf0e10cSrcweir 				INetURLObject aDbtFile( pNameItem->GetValue(), INET_PROT_FILE );
2262cdf0e10cSrcweir 				aDbtFile.setExtension( String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("dbt")) );
2263cdf0e10cSrcweir 				if ( IsDocument( aDbtFile ) && !KillFile( aDbtFile ) )
2264cdf0e10cSrcweir 					bRet = sal_False;
2265cdf0e10cSrcweir 				if ( bRet && !MoveFile( aTmpFile, aDbtFile ) )
2266cdf0e10cSrcweir 					bRet = sal_False;
2267cdf0e10cSrcweir 				if ( !bRet )
2268cdf0e10cSrcweir 				{
2269cdf0e10cSrcweir 					KillFile( aTmpFile );
2270cdf0e10cSrcweir 					if ( !GetError() )
2271cdf0e10cSrcweir 						SetError( SCERR_EXPORT_DATA, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ) );
2272cdf0e10cSrcweir 				}
2273cdf0e10cSrcweir 			}
2274cdf0e10cSrcweir 		}
2275cdf0e10cSrcweir 	}
2276cdf0e10cSrcweir 	else if (aFltName.EqualsAscii(pFilterDif))
2277cdf0e10cSrcweir 	{
2278cdf0e10cSrcweir 		SvStream* pStream = rMed.GetOutStream();
2279cdf0e10cSrcweir 		if (pStream)
2280cdf0e10cSrcweir 		{
2281cdf0e10cSrcweir 			String sItStr;
2282cdf0e10cSrcweir 			SfxItemSet*	 pSet = rMed.GetItemSet();
2283cdf0e10cSrcweir 			const SfxPoolItem* pItem;
2284cdf0e10cSrcweir 			if ( pSet && SFX_ITEM_SET ==
2285cdf0e10cSrcweir 				 pSet->GetItemState( SID_FILE_FILTEROPTIONS, sal_True, &pItem ) )
2286cdf0e10cSrcweir 			{
2287cdf0e10cSrcweir 				sItStr = ((const SfxStringItem*)pItem)->GetValue();
2288cdf0e10cSrcweir 			}
2289cdf0e10cSrcweir 
2290cdf0e10cSrcweir 			if (sItStr.Len() == 0)
2291cdf0e10cSrcweir 			{
2292cdf0e10cSrcweir 				//	default for DIF export (from API without options):
2293cdf0e10cSrcweir 				//	ISO8859-1/MS_1252 encoding
2294cdf0e10cSrcweir 
2295cdf0e10cSrcweir 				sItStr = ScGlobal::GetCharsetString( RTL_TEXTENCODING_MS_1252 );
2296cdf0e10cSrcweir 			}
2297cdf0e10cSrcweir 
2298cdf0e10cSrcweir 			WaitObject aWait( GetActiveDialogParent() );
2299cdf0e10cSrcweir 			ScFormatFilter::Get().ScExportDif( *pStream, &aDocument, ScAddress(0,0,0),
2300cdf0e10cSrcweir 				ScGlobal::GetCharsetValue(sItStr) );
2301cdf0e10cSrcweir 			bRet = sal_True;
2302cdf0e10cSrcweir 
2303cdf0e10cSrcweir 			if (aDocument.GetTableCount() > 1)
2304cdf0e10cSrcweir 				if (!rMed.GetError())
2305cdf0e10cSrcweir 					rMed.SetError(SCWARN_EXPORT_ASCII, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ));
2306cdf0e10cSrcweir 		}
2307cdf0e10cSrcweir 	}
2308cdf0e10cSrcweir 	else if (aFltName.EqualsAscii(pFilterSylk))
2309cdf0e10cSrcweir 	{
2310cdf0e10cSrcweir 		SvStream* pStream = rMed.GetOutStream();
2311cdf0e10cSrcweir 		if ( pStream )
2312cdf0e10cSrcweir 		{
2313cdf0e10cSrcweir 			WaitObject aWait( GetActiveDialogParent() );
2314cdf0e10cSrcweir 
2315cdf0e10cSrcweir             SCCOL nEndCol;
2316cdf0e10cSrcweir             SCROW nEndRow;
2317cdf0e10cSrcweir             aDocument.GetCellArea( 0, nEndCol, nEndRow );
2318cdf0e10cSrcweir 			ScRange aRange( 0,0,0, nEndCol,nEndRow,0 );
2319cdf0e10cSrcweir 
2320cdf0e10cSrcweir 			ScImportExport aImExport( &aDocument, aRange );
2321cdf0e10cSrcweir             aImExport.SetFormulas( sal_True );
2322cdf0e10cSrcweir             bRet = aImExport.ExportStream( *pStream, rMed.GetBaseURL( true ), SOT_FORMATSTR_ID_SYLK );
2323cdf0e10cSrcweir 		}
2324cdf0e10cSrcweir 	}
2325cdf0e10cSrcweir 	else if (aFltName.EqualsAscii(pFilterHtml))
2326cdf0e10cSrcweir 	{
2327cdf0e10cSrcweir 		SvStream* pStream = rMed.GetOutStream();
2328cdf0e10cSrcweir 		if ( pStream )
2329cdf0e10cSrcweir 		{
2330cdf0e10cSrcweir             WaitObject aWait( GetActiveDialogParent() );
2331cdf0e10cSrcweir 			ScImportExport aImExport( &aDocument );
2332cdf0e10cSrcweir 			aImExport.SetStreamPath( rMed.GetName() );
2333cdf0e10cSrcweir             bRet = aImExport.ExportStream( *pStream, rMed.GetBaseURL( true ), SOT_FORMATSTR_ID_HTML );
2334cdf0e10cSrcweir             if ( bRet && aImExport.GetNonConvertibleChars().Len() )
2335cdf0e10cSrcweir                 SetError( *new StringErrorInfo(
2336cdf0e10cSrcweir                     SCWARN_EXPORT_NONCONVERTIBLE_CHARS,
2337cdf0e10cSrcweir                     aImExport.GetNonConvertibleChars(),
2338cdf0e10cSrcweir                     ERRCODE_BUTTON_OK | ERRCODE_MSG_INFO ), ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ) );
2339cdf0e10cSrcweir 		}
2340cdf0e10cSrcweir 	}
2341cdf0e10cSrcweir 	else
2342cdf0e10cSrcweir 	{
2343cdf0e10cSrcweir 		if (GetError())
2344cdf0e10cSrcweir 			SetError(SCERR_IMPORT_NI, ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( OSL_LOG_PREFIX ) ) );
2345cdf0e10cSrcweir 	}
2346cdf0e10cSrcweir 	return bRet;
2347cdf0e10cSrcweir }
2348cdf0e10cSrcweir 
2349cdf0e10cSrcweir 
2350cdf0e10cSrcweir sal_Bool __EXPORT ScDocShell::SaveCompleted( const uno::Reference < embed::XStorage >& xStor )
2351cdf0e10cSrcweir {
2352cdf0e10cSrcweir     return SfxObjectShell::SaveCompleted( xStor );
2353cdf0e10cSrcweir }
2354cdf0e10cSrcweir 
2355cdf0e10cSrcweir 
2356cdf0e10cSrcweir sal_Bool __EXPORT ScDocShell::DoSaveCompleted( SfxMedium * pNewStor )
2357cdf0e10cSrcweir {
2358cdf0e10cSrcweir 	sal_Bool bRet = SfxObjectShell::DoSaveCompleted( pNewStor );
2359cdf0e10cSrcweir 
2360cdf0e10cSrcweir 	//	SC_HINT_DOC_SAVED fuer Wechsel ReadOnly -> Read/Write
2361cdf0e10cSrcweir 	Broadcast( SfxSimpleHint( SC_HINT_DOC_SAVED ) );
2362cdf0e10cSrcweir 	return bRet;
2363cdf0e10cSrcweir }
2364cdf0e10cSrcweir 
2365cdf0e10cSrcweir 
2366cdf0e10cSrcweir sal_Bool ScDocShell::QuerySlotExecutable( sal_uInt16 nSlotId )
2367cdf0e10cSrcweir {
2368cdf0e10cSrcweir     // #i112634# ask VBA event handlers whether to save or print the document
2369cdf0e10cSrcweir 
2370cdf0e10cSrcweir     using namespace ::com::sun::star::script::vba;
2371cdf0e10cSrcweir 
2372cdf0e10cSrcweir     sal_Int32 nVbaEventId = VBAEventId::NO_EVENT;
2373cdf0e10cSrcweir     uno::Sequence< uno::Any > aArgs;
2374cdf0e10cSrcweir     switch( nSlotId )
2375cdf0e10cSrcweir     {
2376cdf0e10cSrcweir         case SID_SAVEDOC:
2377cdf0e10cSrcweir         case SID_SAVEASDOC:
2378cdf0e10cSrcweir             nVbaEventId = VBAEventId::WORKBOOK_BEFORESAVE;
2379cdf0e10cSrcweir             aArgs.realloc( 1 );
2380cdf0e10cSrcweir             aArgs[ 0 ] <<= (nSlotId == SID_SAVEASDOC);
2381cdf0e10cSrcweir         break;
2382cdf0e10cSrcweir         case SID_PRINTDOC:
2383cdf0e10cSrcweir         case SID_PRINTDOCDIRECT:
2384cdf0e10cSrcweir             nVbaEventId = VBAEventId::WORKBOOK_BEFOREPRINT;
2385cdf0e10cSrcweir         break;
2386cdf0e10cSrcweir     }
2387cdf0e10cSrcweir 
2388cdf0e10cSrcweir     sal_Bool bSlotExecutable = sal_True;
2389cdf0e10cSrcweir     if( nVbaEventId != VBAEventId::NO_EVENT ) try
2390cdf0e10cSrcweir     {
2391cdf0e10cSrcweir         uno::Reference< XVBAEventProcessor > xEventProcessor( aDocument.GetVbaEventProcessor(), uno::UNO_QUERY_THROW );
2392cdf0e10cSrcweir         xEventProcessor->processVbaEvent( nVbaEventId, aArgs );
2393cdf0e10cSrcweir     }
2394cdf0e10cSrcweir     catch( util::VetoException& )
2395cdf0e10cSrcweir     {
2396cdf0e10cSrcweir         bSlotExecutable = sal_False;
2397cdf0e10cSrcweir     }
2398cdf0e10cSrcweir     catch( uno::Exception& )
2399cdf0e10cSrcweir     {
2400cdf0e10cSrcweir     }
2401cdf0e10cSrcweir     return bSlotExecutable;
2402cdf0e10cSrcweir }
2403cdf0e10cSrcweir 
2404cdf0e10cSrcweir 
2405cdf0e10cSrcweir sal_uInt16 __EXPORT ScDocShell::PrepareClose( sal_Bool bUI, sal_Bool bForBrowsing )
2406cdf0e10cSrcweir {
2407cdf0e10cSrcweir 	if(SC_MOD()->GetCurRefDlgId()>0)
2408cdf0e10cSrcweir 	{
2409cdf0e10cSrcweir 		SfxViewFrame* pFrame = SfxViewFrame::GetFirst( this );
2410cdf0e10cSrcweir 		if( pFrame )
2411cdf0e10cSrcweir 		{
2412cdf0e10cSrcweir 			SfxViewShell* p = pFrame->GetViewShell();
2413cdf0e10cSrcweir 			ScTabViewShell* pViewSh = PTR_CAST(ScTabViewShell,p);
2414cdf0e10cSrcweir 			if(pViewSh!=NULL)
2415cdf0e10cSrcweir 			{
2416cdf0e10cSrcweir 				Window *pWin=pViewSh->GetWindow();
2417cdf0e10cSrcweir 				if(pWin!=NULL) pWin->GrabFocus();
2418cdf0e10cSrcweir 			}
2419cdf0e10cSrcweir 		}
2420cdf0e10cSrcweir 
2421cdf0e10cSrcweir 		return sal_False;
2422cdf0e10cSrcweir 	}
2423cdf0e10cSrcweir 	if ( aDocument.IsInLinkUpdate() || aDocument.IsInInterpreter() )
2424cdf0e10cSrcweir 	{
2425cdf0e10cSrcweir 		ErrorMessage(STR_CLOSE_ERROR_LINK);
2426cdf0e10cSrcweir 		return sal_False;
2427cdf0e10cSrcweir 	}
2428cdf0e10cSrcweir 
2429cdf0e10cSrcweir 	DoEnterHandler();
2430cdf0e10cSrcweir 
2431cdf0e10cSrcweir 	// start 'Workbook_BeforeClose' VBA event handler for possible veto
2432cdf0e10cSrcweir     if( !IsInPrepareClose() )
2433cdf0e10cSrcweir     {
2434cdf0e10cSrcweir         try
2435cdf0e10cSrcweir         {
2436cdf0e10cSrcweir             uno::Reference< script::vba::XVBAEventProcessor > xVbaEvents( aDocument.GetVbaEventProcessor(), uno::UNO_SET_THROW );
2437cdf0e10cSrcweir             uno::Sequence< uno::Any > aArgs;
2438cdf0e10cSrcweir             xVbaEvents->processVbaEvent( script::vba::VBAEventId::WORKBOOK_BEFORECLOSE, aArgs );
2439cdf0e10cSrcweir         }
2440cdf0e10cSrcweir         catch( util::VetoException& )
2441cdf0e10cSrcweir         {
2442cdf0e10cSrcweir             // if event processor throws VetoException, macro has vetoed close
2443cdf0e10cSrcweir 		    return sal_False;
2444cdf0e10cSrcweir 		}
2445cdf0e10cSrcweir         catch( uno::Exception& )
2446cdf0e10cSrcweir         {
2447cdf0e10cSrcweir         }
2448cdf0e10cSrcweir     }
2449cdf0e10cSrcweir 	// end handler code
2450cdf0e10cSrcweir 
2451cdf0e10cSrcweir 	sal_uInt16 nRet = SfxObjectShell::PrepareClose( bUI, bForBrowsing );
2452cdf0e10cSrcweir 	if (nRet == sal_True)						// sal_True = schliessen
2453cdf0e10cSrcweir 		aDocument.DisableIdle(sal_True);		// nicht mehr drin rumpfuschen !!!
2454cdf0e10cSrcweir 
2455cdf0e10cSrcweir 	return nRet;
2456cdf0e10cSrcweir }
2457cdf0e10cSrcweir 
2458cdf0e10cSrcweir void ScDocShell::PrepareReload()
2459cdf0e10cSrcweir {
2460cdf0e10cSrcweir 	SfxObjectShell::PrepareReload();	// tut nichts?
2461cdf0e10cSrcweir 
2462cdf0e10cSrcweir 	//	Das Disconnect von DDE-Links kann Reschedule ausloesen.
2463cdf0e10cSrcweir 	//	Wenn die DDE-Links erst im Dokument-dtor geloescht werden, kann beim Reload
2464cdf0e10cSrcweir 	//	aus diesem Reschedule das DDE-Link-Update fuer das neue Dokument ausgeloest
2465cdf0e10cSrcweir 	//	werden. Dabei verklemmt sicht dann irgendwas.
2466cdf0e10cSrcweir 	//	-> Beim Reload die DDE-Links des alten Dokuments vorher disconnecten
2467cdf0e10cSrcweir 
2468cdf0e10cSrcweir 	aDocument.DisconnectDdeLinks();
2469cdf0e10cSrcweir }
2470cdf0e10cSrcweir 
2471cdf0e10cSrcweir 
2472cdf0e10cSrcweir String ScDocShell::GetOwnFilterName()			// static
2473cdf0e10cSrcweir {
2474cdf0e10cSrcweir 	return String::CreateFromAscii(pFilterSc50);
2475cdf0e10cSrcweir }
2476cdf0e10cSrcweir 
2477cdf0e10cSrcweir String ScDocShell::GetHtmlFilterName()
2478cdf0e10cSrcweir {
2479cdf0e10cSrcweir     return String::CreateFromAscii(pFilterHtml);
2480cdf0e10cSrcweir }
2481cdf0e10cSrcweir 
2482cdf0e10cSrcweir String ScDocShell::GetWebQueryFilterName()		// static
2483cdf0e10cSrcweir {
2484cdf0e10cSrcweir 	return String::CreateFromAscii(pFilterHtmlWebQ);
2485cdf0e10cSrcweir }
2486cdf0e10cSrcweir 
2487cdf0e10cSrcweir String ScDocShell::GetAsciiFilterName()			// static
2488cdf0e10cSrcweir {
2489cdf0e10cSrcweir 	return String::CreateFromAscii(pFilterAscii);
2490cdf0e10cSrcweir }
2491cdf0e10cSrcweir 
2492cdf0e10cSrcweir String ScDocShell::GetLotusFilterName()			// static
2493cdf0e10cSrcweir {
2494cdf0e10cSrcweir 	return String::CreateFromAscii(pFilterLotus);
2495cdf0e10cSrcweir }
2496cdf0e10cSrcweir 
2497cdf0e10cSrcweir String ScDocShell::GetDBaseFilterName()			// static
2498cdf0e10cSrcweir {
2499cdf0e10cSrcweir 	return String::CreateFromAscii(pFilterDBase);
2500cdf0e10cSrcweir }
2501cdf0e10cSrcweir 
2502cdf0e10cSrcweir String ScDocShell::GetDifFilterName()			// static
2503cdf0e10cSrcweir {
2504cdf0e10cSrcweir 	return String::CreateFromAscii(pFilterDif);
2505cdf0e10cSrcweir }
2506cdf0e10cSrcweir 
2507cdf0e10cSrcweir sal_Bool ScDocShell::HasAutomaticTableName( const String& rFilter )		// static
2508cdf0e10cSrcweir {
2509cdf0e10cSrcweir 	//	sal_True for those filters that keep the default table name
2510cdf0e10cSrcweir 	//	(which is language specific)
2511cdf0e10cSrcweir 
2512cdf0e10cSrcweir 	return rFilter.EqualsAscii( pFilterAscii )
2513cdf0e10cSrcweir 		|| rFilter.EqualsAscii( pFilterLotus )
2514cdf0e10cSrcweir 		|| rFilter.EqualsAscii( pFilterExcel4 )
2515cdf0e10cSrcweir 		|| rFilter.EqualsAscii( pFilterEx4Temp )
2516cdf0e10cSrcweir 		|| rFilter.EqualsAscii( pFilterDBase )
2517cdf0e10cSrcweir 		|| rFilter.EqualsAscii( pFilterDif )
2518cdf0e10cSrcweir 		|| rFilter.EqualsAscii( pFilterSylk )
2519cdf0e10cSrcweir 		|| rFilter.EqualsAscii( pFilterHtml )
2520cdf0e10cSrcweir 		|| rFilter.EqualsAscii( pFilterRtf );
2521cdf0e10cSrcweir }
2522cdf0e10cSrcweir 
2523cdf0e10cSrcweir //==================================================================
2524cdf0e10cSrcweir 
2525cdf0e10cSrcweir #define __SCDOCSHELL_INIT \
2526cdf0e10cSrcweir 		aDocument		( SCDOCMODE_DOCUMENT, this ), \
2527cdf0e10cSrcweir         aDdeTextFmt(String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("TEXT"))), \
2528cdf0e10cSrcweir 		nPrtToScreenFactor( 1.0 ), \
2529cdf0e10cSrcweir         pImpl           ( new DocShell_Impl ), \
2530cdf0e10cSrcweir 		bHeaderOn		( sal_True ), \
2531cdf0e10cSrcweir 		bFooterOn		( sal_True ), \
2532cdf0e10cSrcweir         bNoInformLost   ( sal_True ), \
2533cdf0e10cSrcweir 		bIsEmpty		( sal_True ), \
2534cdf0e10cSrcweir 		bIsInUndo		( sal_False ), \
2535cdf0e10cSrcweir 		bDocumentModifiedPending( sal_False ), \
2536cdf0e10cSrcweir 		nDocumentLock	( 0 ), \
2537cdf0e10cSrcweir         nCanUpdate (com::sun::star::document::UpdateDocMode::ACCORDING_TO_CONFIG), \
2538cdf0e10cSrcweir         bUpdateEnabled  ( sal_True ), \
2539cdf0e10cSrcweir         pOldAutoDBRange ( NULL ), \
2540cdf0e10cSrcweir 		pDocHelper 		( NULL ), \
2541cdf0e10cSrcweir 		pAutoStyleList	( NULL ), \
2542cdf0e10cSrcweir 		pPaintLockData	( NULL ), \
2543cdf0e10cSrcweir 		pOldJobSetup	( NULL ), \
2544cdf0e10cSrcweir         pSolverSaveData ( NULL ), \
2545cdf0e10cSrcweir         pSheetSaveData  ( NULL ), \
2546cdf0e10cSrcweir         pModificator    ( NULL )
2547cdf0e10cSrcweir 
2548cdf0e10cSrcweir //------------------------------------------------------------------
2549cdf0e10cSrcweir 
2550cdf0e10cSrcweir ScDocShell::ScDocShell( const ScDocShell& rShell )
2551cdf0e10cSrcweir     :   SvRefBase(),
2552cdf0e10cSrcweir         SotObject(),
2553cdf0e10cSrcweir 	    SfxObjectShell( rShell.GetCreateMode() ),
2554cdf0e10cSrcweir         SfxListener(),
2555cdf0e10cSrcweir 		__SCDOCSHELL_INIT
2556cdf0e10cSrcweir {
2557cdf0e10cSrcweir 	RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "nn93723", "ScDocShell::ScDocShell" );
2558cdf0e10cSrcweir 
2559cdf0e10cSrcweir 	SetPool( &SC_MOD()->GetPool() );
2560cdf0e10cSrcweir 
2561cdf0e10cSrcweir 	bIsInplace = rShell.bIsInplace;
2562cdf0e10cSrcweir 
2563cdf0e10cSrcweir 	pDocFunc = new ScDocFunc(*this);
2564cdf0e10cSrcweir 
2565cdf0e10cSrcweir 	//	SetBaseModel needs exception handling
2566cdf0e10cSrcweir 	ScModelObj::CreateAndSet( this );
2567cdf0e10cSrcweir 
2568cdf0e10cSrcweir 	StartListening(*this);
2569cdf0e10cSrcweir 	SfxStyleSheetPool* pStlPool = aDocument.GetStyleSheetPool();
2570cdf0e10cSrcweir 	if (pStlPool)
2571cdf0e10cSrcweir 		StartListening(*pStlPool);
2572cdf0e10cSrcweir 
2573cdf0e10cSrcweir 	GetPageOnFromPageStyleSet( NULL, 0, bHeaderOn, bFooterOn );
2574cdf0e10cSrcweir 	SetHelpId( HID_SCSHELL_DOCSH );
2575cdf0e10cSrcweir 
2576cdf0e10cSrcweir 	//	InitItems und CalcOutputFactor werden jetzt nach bei Load/ConvertFrom/InitNew gerufen
2577cdf0e10cSrcweir }
2578cdf0e10cSrcweir 
2579cdf0e10cSrcweir //------------------------------------------------------------------
2580cdf0e10cSrcweir 
2581cdf0e10cSrcweir ScDocShell::ScDocShell( const sal_uInt64 i_nSfxCreationFlags )
2582cdf0e10cSrcweir 	:	SfxObjectShell( i_nSfxCreationFlags )
2583cdf0e10cSrcweir     ,   __SCDOCSHELL_INIT
2584cdf0e10cSrcweir {
2585cdf0e10cSrcweir 	RTL_LOGFILE_CONTEXT_AUTHOR ( aLog, "sc", "nn93723", "ScDocShell::ScDocShell" );
2586cdf0e10cSrcweir 
2587cdf0e10cSrcweir 	SetPool( &SC_MOD()->GetPool() );
2588cdf0e10cSrcweir 
2589cdf0e10cSrcweir 	bIsInplace = (GetCreateMode() == SFX_CREATE_MODE_EMBEDDED);
2590cdf0e10cSrcweir 	//	wird zurueckgesetzt, wenn nicht inplace
2591cdf0e10cSrcweir 
2592cdf0e10cSrcweir 	pDocFunc = new ScDocFunc(*this);
2593cdf0e10cSrcweir 
2594cdf0e10cSrcweir 	//	SetBaseModel needs exception handling
2595cdf0e10cSrcweir 	ScModelObj::CreateAndSet( this );
2596cdf0e10cSrcweir 
2597cdf0e10cSrcweir 	StartListening(*this);
2598cdf0e10cSrcweir 	SfxStyleSheetPool* pStlPool = aDocument.GetStyleSheetPool();
2599cdf0e10cSrcweir 	if (pStlPool)
2600cdf0e10cSrcweir 		StartListening(*pStlPool);
2601cdf0e10cSrcweir 	SetHelpId( HID_SCSHELL_DOCSH );
2602cdf0e10cSrcweir 
2603cdf0e10cSrcweir 	aDocument.GetDBCollection()->SetRefreshHandler(
2604cdf0e10cSrcweir 		LINK( this, ScDocShell, RefreshDBDataHdl ) );
2605cdf0e10cSrcweir 
2606cdf0e10cSrcweir 	//	InitItems und CalcOutputFactor werden jetzt nach bei Load/ConvertFrom/InitNew gerufen
2607cdf0e10cSrcweir }
2608cdf0e10cSrcweir 
2609cdf0e10cSrcweir //------------------------------------------------------------------
2610cdf0e10cSrcweir 
2611cdf0e10cSrcweir __EXPORT ScDocShell::~ScDocShell()
2612cdf0e10cSrcweir {
2613cdf0e10cSrcweir 	ResetDrawObjectShell();	// #55570# falls der Drawing-Layer noch versucht, darauf zuzugreifen
2614cdf0e10cSrcweir 
2615cdf0e10cSrcweir 	SfxStyleSheetPool* pStlPool = aDocument.GetStyleSheetPool();
2616cdf0e10cSrcweir 	if (pStlPool)
2617cdf0e10cSrcweir 		EndListening(*pStlPool);
2618cdf0e10cSrcweir 	EndListening(*this);
2619cdf0e10cSrcweir 
2620cdf0e10cSrcweir 	delete pAutoStyleList;
2621cdf0e10cSrcweir 
2622cdf0e10cSrcweir 	SfxApplication *pSfxApp = SFX_APP();
2623cdf0e10cSrcweir 	if ( pSfxApp->GetDdeService() )				// DDE vor Dokument loeschen
2624cdf0e10cSrcweir 		pSfxApp->RemoveDdeTopic( this );
2625cdf0e10cSrcweir 
2626cdf0e10cSrcweir 	delete pDocFunc;
2627cdf0e10cSrcweir 	delete aDocument.mpUndoManager;
2628cdf0e10cSrcweir 	aDocument.mpUndoManager = 0;
2629cdf0e10cSrcweir     delete pImpl;
2630cdf0e10cSrcweir 
2631cdf0e10cSrcweir 	delete pPaintLockData;
2632cdf0e10cSrcweir 
2633cdf0e10cSrcweir 	delete pOldJobSetup;		// gesetzt nur bei Fehler in StartJob()
2634cdf0e10cSrcweir 
2635cdf0e10cSrcweir     delete pSolverSaveData;
2636cdf0e10cSrcweir     delete pSheetSaveData;
2637cdf0e10cSrcweir     delete pOldAutoDBRange;
2638cdf0e10cSrcweir 
2639cdf0e10cSrcweir     if (pModificator)
2640cdf0e10cSrcweir     {
2641cdf0e10cSrcweir         DBG_ERROR("The Modificator should not exist");
2642cdf0e10cSrcweir         delete pModificator;
2643cdf0e10cSrcweir     }
2644cdf0e10cSrcweir }
2645cdf0e10cSrcweir 
2646cdf0e10cSrcweir //------------------------------------------------------------------
2647cdf0e10cSrcweir 
2648cdf0e10cSrcweir ::svl::IUndoManager* __EXPORT ScDocShell::GetUndoManager()
2649cdf0e10cSrcweir {
2650cdf0e10cSrcweir 	return aDocument.GetUndoManager();
2651cdf0e10cSrcweir }
2652cdf0e10cSrcweir 
2653cdf0e10cSrcweir void ScDocShell::SetModified( sal_Bool bModified )
2654cdf0e10cSrcweir {
2655cdf0e10cSrcweir     if ( SfxObjectShell::IsEnableSetModified() )
2656cdf0e10cSrcweir 	{
2657cdf0e10cSrcweir     	SfxObjectShell::SetModified( bModified );
2658cdf0e10cSrcweir 		Broadcast( SfxSimpleHint( SFX_HINT_DOCCHANGED ) );
2659cdf0e10cSrcweir 	}
2660cdf0e10cSrcweir }
2661cdf0e10cSrcweir 
2662cdf0e10cSrcweir 
2663cdf0e10cSrcweir void ScDocShell::SetDocumentModified( sal_Bool bIsModified /* = sal_True */ )
2664cdf0e10cSrcweir {
2665cdf0e10cSrcweir 	//	BroadcastUno muss auch mit pPaintLockData sofort passieren
2666cdf0e10cSrcweir 	//!	auch bei SetDrawModified, wenn Drawing angebunden ist
2667cdf0e10cSrcweir 	//!	dann eigener Hint???
2668cdf0e10cSrcweir 
2669cdf0e10cSrcweir 	if ( pPaintLockData && bIsModified )
2670cdf0e10cSrcweir 	{
2671cdf0e10cSrcweir         // #i115009# broadcast BCA_BRDCST_ALWAYS, so a component can read recalculated results
2672cdf0e10cSrcweir         // of RecalcModeAlways formulas (like OFFSET) after modifying cells
2673cdf0e10cSrcweir         aDocument.Broadcast( SC_HINT_DATACHANGED, BCA_BRDCST_ALWAYS, NULL );
2674cdf0e10cSrcweir         aDocument.InvalidateTableArea();    // #i105279# needed here
2675cdf0e10cSrcweir         aDocument.BroadcastUno( SfxSimpleHint( SFX_HINT_DATACHANGED ) );
2676cdf0e10cSrcweir 
2677cdf0e10cSrcweir 		pPaintLockData->SetModified();			// spaeter...
2678cdf0e10cSrcweir 		return;
2679cdf0e10cSrcweir 	}
2680cdf0e10cSrcweir 
2681cdf0e10cSrcweir 	SetDrawModified( bIsModified );
2682cdf0e10cSrcweir 
2683cdf0e10cSrcweir 	if ( bIsModified )
2684cdf0e10cSrcweir 	{
2685cdf0e10cSrcweir 		if ( aDocument.IsAutoCalcShellDisabled() )
2686cdf0e10cSrcweir 			SetDocumentModifiedPending( sal_True );
2687cdf0e10cSrcweir 		else
2688cdf0e10cSrcweir 		{
2689cdf0e10cSrcweir 			SetDocumentModifiedPending( sal_False );
2690cdf0e10cSrcweir             aDocument.InvalidateStyleSheetUsage();
2691cdf0e10cSrcweir 			aDocument.InvalidateTableArea();
2692cdf0e10cSrcweir             aDocument.InvalidateLastTableOpParams();
2693cdf0e10cSrcweir 			aDocument.Broadcast( SC_HINT_DATACHANGED, BCA_BRDCST_ALWAYS, NULL );
2694cdf0e10cSrcweir 			if ( aDocument.IsForcedFormulaPending() && aDocument.GetAutoCalc() )
2695cdf0e10cSrcweir 				aDocument.CalcFormulaTree( sal_True );
2696cdf0e10cSrcweir 			PostDataChanged();
2697cdf0e10cSrcweir 
2698cdf0e10cSrcweir 			//	Detective AutoUpdate:
2699cdf0e10cSrcweir 			//	Update if formulas were modified (DetectiveDirty) or the list contains
2700cdf0e10cSrcweir 			//	"Trace Error" entries (#75362# - Trace Error can look completely different
2701cdf0e10cSrcweir 			//	after changes to non-formula cells).
2702cdf0e10cSrcweir 
2703cdf0e10cSrcweir 			ScDetOpList* pList = aDocument.GetDetOpList();
2704cdf0e10cSrcweir 			if ( pList && ( aDocument.IsDetectiveDirty() || pList->HasAddError() ) &&
2705cdf0e10cSrcweir 				 pList->Count() && !IsInUndo() && SC_MOD()->GetAppOptions().GetDetectiveAuto() )
2706cdf0e10cSrcweir 			{
2707cdf0e10cSrcweir 				GetDocFunc().DetectiveRefresh(sal_True);	// sal_True = caused by automatic update
2708cdf0e10cSrcweir 			}
2709cdf0e10cSrcweir 			aDocument.SetDetectiveDirty(sal_False);			// always reset, also if not refreshed
2710cdf0e10cSrcweir 		}
2711cdf0e10cSrcweir 
2712cdf0e10cSrcweir         // #b6697848# notify UNO objects after BCA_BRDCST_ALWAYS etc.
2713cdf0e10cSrcweir         aDocument.BroadcastUno( SfxSimpleHint( SFX_HINT_DATACHANGED ) );
2714cdf0e10cSrcweir 	}
2715cdf0e10cSrcweir }
2716cdf0e10cSrcweir 
2717cdf0e10cSrcweir //	SetDrawModified - ohne Formel-Update
2718cdf0e10cSrcweir //	(Drawing muss auch beim normalen SetDocumentModified upgedated werden,
2719cdf0e10cSrcweir //	 z.B. bei Tabelle loeschen etc.)
2720cdf0e10cSrcweir 
2721cdf0e10cSrcweir void ScDocShell::SetDrawModified( sal_Bool bIsModified /* = sal_True */ )
2722cdf0e10cSrcweir {
2723cdf0e10cSrcweir 	sal_Bool bUpdate = ( bIsModified != IsModified() );
2724cdf0e10cSrcweir 
2725cdf0e10cSrcweir 	SetModified( bIsModified );
2726cdf0e10cSrcweir 
2727cdf0e10cSrcweir     SfxBindings* pBindings = GetViewBindings();
2728cdf0e10cSrcweir 	if (bUpdate)
2729cdf0e10cSrcweir 	{
2730cdf0e10cSrcweir 		if (pBindings)
2731cdf0e10cSrcweir 		{
2732cdf0e10cSrcweir 			pBindings->Invalidate( SID_SAVEDOC );
2733cdf0e10cSrcweir 			pBindings->Invalidate( SID_DOC_MODIFIED );
2734cdf0e10cSrcweir 		}
2735cdf0e10cSrcweir 	}
2736cdf0e10cSrcweir 
2737cdf0e10cSrcweir 	if (bIsModified)
2738cdf0e10cSrcweir 	{
2739cdf0e10cSrcweir         if (pBindings)
2740cdf0e10cSrcweir         {
2741cdf0e10cSrcweir             // #i105960# Undo etc used to be volatile.
2742cdf0e10cSrcweir             // They always have to be invalidated, including drawing layer or row height changes
2743cdf0e10cSrcweir             // (but not while pPaintLockData is set).
2744cdf0e10cSrcweir             pBindings->Invalidate( SID_UNDO );
2745cdf0e10cSrcweir             pBindings->Invalidate( SID_REDO );
2746cdf0e10cSrcweir             pBindings->Invalidate( SID_REPEAT );
2747cdf0e10cSrcweir         }
2748cdf0e10cSrcweir 
2749cdf0e10cSrcweir 		if ( aDocument.IsChartListenerCollectionNeedsUpdate() )
2750cdf0e10cSrcweir 		{
2751cdf0e10cSrcweir 			aDocument.UpdateChartListenerCollection();
2752cdf0e10cSrcweir 			SFX_APP()->Broadcast(SfxSimpleHint( SC_HINT_DRAW_CHANGED ));	// Navigator
2753cdf0e10cSrcweir 		}
2754cdf0e10cSrcweir 		SC_MOD()->AnythingChanged();
2755cdf0e10cSrcweir 	}
2756cdf0e10cSrcweir }
2757cdf0e10cSrcweir 
2758cdf0e10cSrcweir void ScDocShell::SetInUndo(sal_Bool bSet)
2759cdf0e10cSrcweir {
2760cdf0e10cSrcweir 	bIsInUndo = bSet;
2761cdf0e10cSrcweir }
2762cdf0e10cSrcweir 
2763cdf0e10cSrcweir 
2764cdf0e10cSrcweir void ScDocShell::GetDocStat( ScDocStat& rDocStat )
2765cdf0e10cSrcweir {
2766cdf0e10cSrcweir 	SfxPrinter* pPrinter = GetPrinter();
2767cdf0e10cSrcweir 
2768cdf0e10cSrcweir 	aDocument.GetDocStat( rDocStat );
2769cdf0e10cSrcweir 	rDocStat.nPageCount = 0;
2770cdf0e10cSrcweir 
2771cdf0e10cSrcweir 	if ( pPrinter )
2772cdf0e10cSrcweir 		for ( SCTAB i=0; i<rDocStat.nTableCount; i++ )
2773cdf0e10cSrcweir             rDocStat.nPageCount = sal::static_int_cast<sal_uInt16>( rDocStat.nPageCount +
2774cdf0e10cSrcweir                 (sal_uInt16) ScPrintFunc( this, pPrinter, i ).GetTotalPages() );
2775cdf0e10cSrcweir }
2776cdf0e10cSrcweir 
2777cdf0e10cSrcweir 
2778cdf0e10cSrcweir SfxDocumentInfoDialog* __EXPORT ScDocShell::CreateDocumentInfoDialog(
2779cdf0e10cSrcweir 										 Window *pParent, const SfxItemSet &rSet )
2780cdf0e10cSrcweir {
2781cdf0e10cSrcweir 	SfxDocumentInfoDialog* pDlg   = new SfxDocumentInfoDialog( pParent, rSet );
2782cdf0e10cSrcweir 	ScDocShell*			   pDocSh = PTR_CAST(ScDocShell,SfxObjectShell::Current());
2783cdf0e10cSrcweir 
2784cdf0e10cSrcweir 	//nur mit Statistik, wenn dieses Doc auch angezeigt wird, nicht
2785cdf0e10cSrcweir 	//aus dem Doc-Manager
2786cdf0e10cSrcweir 
2787cdf0e10cSrcweir 	if( pDocSh == this )
2788cdf0e10cSrcweir 	{
2789cdf0e10cSrcweir 		ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
2790cdf0e10cSrcweir 		DBG_ASSERT(pFact, "ScAbstractFactory create fail!");//CHINA001
2791cdf0e10cSrcweir 		::CreateTabPage ScDocStatPageCreate = 	pFact->GetTabPageCreatorFunc( RID_SCPAGE_STAT );
2792cdf0e10cSrcweir 		DBG_ASSERT(ScDocStatPageCreate, "Tabpage create fail!");//CHINA001
2793cdf0e10cSrcweir 		pDlg->AddTabPage( 42,
2794cdf0e10cSrcweir 			ScGlobal::GetRscString( STR_DOC_STAT ),
2795cdf0e10cSrcweir 			ScDocStatPageCreate,
2796cdf0e10cSrcweir 			NULL);
2797cdf0e10cSrcweir //CHINA001		pDlg->AddTabPage( 42,
2798cdf0e10cSrcweir //CHINA001		ScGlobal::GetRscString( STR_DOC_STAT ),
2799cdf0e10cSrcweir //CHINA001		ScDocStatPage::Create,
2800cdf0e10cSrcweir //CHINA001		NULL );
2801cdf0e10cSrcweir 	}
2802cdf0e10cSrcweir 	return pDlg;
2803cdf0e10cSrcweir }
2804cdf0e10cSrcweir 
2805cdf0e10cSrcweir Window* ScDocShell::GetActiveDialogParent()
2806cdf0e10cSrcweir {
2807cdf0e10cSrcweir 	ScTabViewShell* pViewSh	= ScTabViewShell::GetActiveViewShell();
2808cdf0e10cSrcweir 	if ( pViewSh )
2809cdf0e10cSrcweir 		return pViewSh->GetDialogParent();
2810cdf0e10cSrcweir 	else
2811cdf0e10cSrcweir 		return Application::GetDefDialogParent();
2812cdf0e10cSrcweir }
2813cdf0e10cSrcweir 
2814cdf0e10cSrcweir void ScDocShell::SetSolverSaveData( const ScOptSolverSave& rData )
2815cdf0e10cSrcweir {
2816cdf0e10cSrcweir     delete pSolverSaveData;
2817cdf0e10cSrcweir     pSolverSaveData = new ScOptSolverSave( rData );
2818cdf0e10cSrcweir }
2819cdf0e10cSrcweir 
2820cdf0e10cSrcweir ScSheetSaveData* ScDocShell::GetSheetSaveData()
2821cdf0e10cSrcweir {
2822cdf0e10cSrcweir     if (!pSheetSaveData)
2823cdf0e10cSrcweir         pSheetSaveData = new ScSheetSaveData;
2824cdf0e10cSrcweir 
2825cdf0e10cSrcweir     return pSheetSaveData;
2826cdf0e10cSrcweir }
2827cdf0e10cSrcweir 
2828cdf0e10cSrcweir void ScDocShell::UseSheetSaveEntries()
2829cdf0e10cSrcweir {
2830cdf0e10cSrcweir     if (pSheetSaveData)
2831cdf0e10cSrcweir     {
2832cdf0e10cSrcweir         pSheetSaveData->UseSaveEntries();   // use positions from saved file for next saving
2833cdf0e10cSrcweir 
2834cdf0e10cSrcweir         bool bHasEntries = false;
2835cdf0e10cSrcweir         SCTAB nTabCount = aDocument.GetTableCount();
2836cdf0e10cSrcweir         SCTAB nTab;
2837cdf0e10cSrcweir         for (nTab = 0; nTab < nTabCount; ++nTab)
2838cdf0e10cSrcweir             if (pSheetSaveData->HasStreamPos(nTab))
2839cdf0e10cSrcweir                 bHasEntries = true;
2840cdf0e10cSrcweir 
2841cdf0e10cSrcweir         if (!bHasEntries)
2842cdf0e10cSrcweir         {
2843cdf0e10cSrcweir             // if no positions were set (for example, export to other format),
2844cdf0e10cSrcweir             // reset all "valid" flags
2845cdf0e10cSrcweir 
2846cdf0e10cSrcweir             for (nTab = 0; nTab < nTabCount; ++nTab)
2847cdf0e10cSrcweir                 if (aDocument.IsStreamValid(nTab))
2848cdf0e10cSrcweir                     aDocument.SetStreamValid(nTab, sal_False);
2849cdf0e10cSrcweir         }
2850cdf0e10cSrcweir     }
2851cdf0e10cSrcweir }
2852cdf0e10cSrcweir 
2853cdf0e10cSrcweir // --- ScDocShellModificator ------------------------------------------
2854cdf0e10cSrcweir 
2855cdf0e10cSrcweir ScDocShellModificator::ScDocShellModificator( ScDocShell& rDS )
2856cdf0e10cSrcweir 		:
2857cdf0e10cSrcweir 		rDocShell( rDS ),
2858cdf0e10cSrcweir 		aProtector( rDS.GetDocument()->GetRefreshTimerControlAddress() )
2859cdf0e10cSrcweir {
2860cdf0e10cSrcweir 	ScDocument* pDoc = rDocShell.GetDocument();
2861cdf0e10cSrcweir 	bAutoCalcShellDisabled = pDoc->IsAutoCalcShellDisabled();
2862cdf0e10cSrcweir 	bIdleDisabled = pDoc->IsIdleDisabled();
2863cdf0e10cSrcweir 	pDoc->SetAutoCalcShellDisabled( sal_True );
2864cdf0e10cSrcweir 	pDoc->DisableIdle( sal_True );
2865cdf0e10cSrcweir }
2866cdf0e10cSrcweir 
2867cdf0e10cSrcweir 
2868cdf0e10cSrcweir ScDocShellModificator::~ScDocShellModificator()
2869cdf0e10cSrcweir {
2870cdf0e10cSrcweir 	ScDocument* pDoc = rDocShell.GetDocument();
2871cdf0e10cSrcweir 	pDoc->SetAutoCalcShellDisabled( bAutoCalcShellDisabled );
2872cdf0e10cSrcweir 	if ( !bAutoCalcShellDisabled && rDocShell.IsDocumentModifiedPending() )
2873cdf0e10cSrcweir 		rDocShell.SetDocumentModified();	// last one shuts off the lights
2874cdf0e10cSrcweir 	pDoc->DisableIdle( bIdleDisabled );
2875cdf0e10cSrcweir }
2876cdf0e10cSrcweir 
2877cdf0e10cSrcweir 
2878cdf0e10cSrcweir void ScDocShellModificator::SetDocumentModified()
2879cdf0e10cSrcweir {
2880cdf0e10cSrcweir 	ScDocument* pDoc = rDocShell.GetDocument();
2881cdf0e10cSrcweir 	if ( !pDoc->IsImportingXML() )
2882cdf0e10cSrcweir 	{
2883cdf0e10cSrcweir 		// AutoCalcShellDisabled temporaer restaurieren
2884cdf0e10cSrcweir 		sal_Bool bDisabled = pDoc->IsAutoCalcShellDisabled();
2885cdf0e10cSrcweir 		pDoc->SetAutoCalcShellDisabled( bAutoCalcShellDisabled );
2886cdf0e10cSrcweir 		rDocShell.SetDocumentModified();
2887cdf0e10cSrcweir 		pDoc->SetAutoCalcShellDisabled( bDisabled );
2888cdf0e10cSrcweir 	}
2889cdf0e10cSrcweir 	else
2890cdf0e10cSrcweir 	{
2891cdf0e10cSrcweir 		// uno broadcast is necessary for api to work
2892cdf0e10cSrcweir 		// -> must also be done during xml import
2893cdf0e10cSrcweir 		pDoc->BroadcastUno( SfxSimpleHint( SFX_HINT_DATACHANGED ) );
2894cdf0e10cSrcweir 	}
2895cdf0e10cSrcweir }
2896cdf0e10cSrcweir 
2897cdf0e10cSrcweir //<!--Added by PengYunQuan for Validity Cell Range Picker
2898cdf0e10cSrcweir sal_Bool ScDocShell::AcceptStateUpdate() const
2899cdf0e10cSrcweir {
2900cdf0e10cSrcweir 	if( SfxObjectShell::AcceptStateUpdate() )
2901cdf0e10cSrcweir 		return sal_True;
2902cdf0e10cSrcweir 
2903cdf0e10cSrcweir 	if( SC_MOD()->Find1RefWindow( SFX_APP()->GetTopWindow() ) )
2904cdf0e10cSrcweir 		return sal_True;
2905cdf0e10cSrcweir 
2906cdf0e10cSrcweir 	return sal_False;
2907cdf0e10cSrcweir }
2908cdf0e10cSrcweir //-->Added by PengYunQuan for Validity Cell Range Picker
2909cdf0e10cSrcweir 
2910cdf0e10cSrcweir 
2911cdf0e10cSrcweir bool ScDocShell::IsChangeRecording() const
2912cdf0e10cSrcweir {
2913cdf0e10cSrcweir     ScChangeTrack* pChangeTrack = aDocument.GetChangeTrack();
2914cdf0e10cSrcweir     return pChangeTrack != NULL;
2915cdf0e10cSrcweir }
2916cdf0e10cSrcweir 
2917cdf0e10cSrcweir 
2918cdf0e10cSrcweir bool ScDocShell::HasChangeRecordProtection() const
2919cdf0e10cSrcweir {
2920cdf0e10cSrcweir     bool bRes = false;
2921cdf0e10cSrcweir     ScChangeTrack* pChangeTrack = aDocument.GetChangeTrack();
2922cdf0e10cSrcweir     if (pChangeTrack)
2923cdf0e10cSrcweir         bRes = pChangeTrack->IsProtected();
2924cdf0e10cSrcweir     return bRes;
2925cdf0e10cSrcweir }
2926cdf0e10cSrcweir 
2927cdf0e10cSrcweir 
2928cdf0e10cSrcweir void ScDocShell::SetChangeRecording( bool bActivate )
2929cdf0e10cSrcweir {
2930cdf0e10cSrcweir     bool bOldChangeRecording = IsChangeRecording();
2931cdf0e10cSrcweir 
2932cdf0e10cSrcweir     if (bActivate)
2933cdf0e10cSrcweir     {
2934cdf0e10cSrcweir         aDocument.StartChangeTracking();
2935cdf0e10cSrcweir         ScChangeViewSettings aChangeViewSet;
2936cdf0e10cSrcweir         aChangeViewSet.SetShowChanges(sal_True);
2937cdf0e10cSrcweir         aDocument.SetChangeViewSettings(aChangeViewSet);
2938cdf0e10cSrcweir     }
2939cdf0e10cSrcweir     else
2940cdf0e10cSrcweir     {
2941cdf0e10cSrcweir         aDocument.EndChangeTracking();
2942cdf0e10cSrcweir         PostPaintGridAll();
2943cdf0e10cSrcweir     }
2944cdf0e10cSrcweir 
2945cdf0e10cSrcweir     if (bOldChangeRecording != IsChangeRecording())
2946cdf0e10cSrcweir     {
2947cdf0e10cSrcweir         UpdateAcceptChangesDialog();
2948cdf0e10cSrcweir         // Slots invalidieren
2949cdf0e10cSrcweir         SfxBindings* pBindings = GetViewBindings();
2950cdf0e10cSrcweir         if (pBindings)
2951cdf0e10cSrcweir             pBindings->InvalidateAll(sal_False);
2952cdf0e10cSrcweir     }
2953cdf0e10cSrcweir }
2954cdf0e10cSrcweir 
2955cdf0e10cSrcweir 
2956cdf0e10cSrcweir bool ScDocShell::SetProtectionPassword( const String &rNewPassword )
2957cdf0e10cSrcweir {
2958cdf0e10cSrcweir     bool bRes = false;
2959cdf0e10cSrcweir     ScChangeTrack* pChangeTrack = aDocument.GetChangeTrack();
2960cdf0e10cSrcweir     if (pChangeTrack)
2961cdf0e10cSrcweir     {
2962cdf0e10cSrcweir         sal_Bool bProtected = pChangeTrack->IsProtected();
2963cdf0e10cSrcweir 
2964cdf0e10cSrcweir         if (rNewPassword.Len())
2965cdf0e10cSrcweir         {
2966cdf0e10cSrcweir             // when password protection is applied change tracking must always be active
2967cdf0e10cSrcweir             SetChangeRecording( true );
2968cdf0e10cSrcweir 
2969cdf0e10cSrcweir             ::com::sun::star::uno::Sequence< sal_Int8 > aProtectionHash;
2970cdf0e10cSrcweir             SvPasswordHelper::GetHashPassword( aProtectionHash, rNewPassword );
2971cdf0e10cSrcweir             pChangeTrack->SetProtection( aProtectionHash );
2972cdf0e10cSrcweir         }
2973cdf0e10cSrcweir         else
2974cdf0e10cSrcweir         {
2975cdf0e10cSrcweir             pChangeTrack->SetProtection( ::com::sun::star::uno::Sequence< sal_Int8 >() );
2976cdf0e10cSrcweir         }
2977cdf0e10cSrcweir         bRes = true;
2978cdf0e10cSrcweir 
2979cdf0e10cSrcweir         if ( bProtected != pChangeTrack->IsProtected() )
2980cdf0e10cSrcweir         {
2981cdf0e10cSrcweir             UpdateAcceptChangesDialog();
2982cdf0e10cSrcweir             SetDocumentModified();
2983cdf0e10cSrcweir         }
2984cdf0e10cSrcweir     }
2985cdf0e10cSrcweir 
2986cdf0e10cSrcweir     return bRes;
2987cdf0e10cSrcweir }
2988cdf0e10cSrcweir 
2989cdf0e10cSrcweir 
2990cdf0e10cSrcweir bool ScDocShell::GetProtectionHash( /*out*/ ::com::sun::star::uno::Sequence< sal_Int8 > &rPasswordHash )
2991cdf0e10cSrcweir {
2992cdf0e10cSrcweir     bool bRes = false;
2993cdf0e10cSrcweir     ScChangeTrack* pChangeTrack = aDocument.GetChangeTrack();
2994cdf0e10cSrcweir     if (pChangeTrack && pChangeTrack->IsProtected())
2995cdf0e10cSrcweir     {
2996cdf0e10cSrcweir         rPasswordHash = pChangeTrack->GetProtection();
2997cdf0e10cSrcweir         bRes = true;
2998cdf0e10cSrcweir     }
2999cdf0e10cSrcweir     return bRes;
3000cdf0e10cSrcweir }
3001cdf0e10cSrcweir 
3002*577c0052SWang Lei void ScDocShell::BeforeLoading( SfxMedium& rMedium, const ::rtl::OUString & rstrTypeName, const ::rtl::OUString & rstrFilterName )
3003*577c0052SWang Lei {
3004*577c0052SWang Lei     const sal_uInt8 nMediumFlag = GetMediumFlag<false>( rstrTypeName );
3005*577c0052SWang Lei 
3006*577c0052SWang Lei     if( nMediumFlag & E_MEDIUM_FLAG_MSXML )
3007*577c0052SWang Lei     {
3008*577c0052SWang Lei         aDocument.SetImportingMSXML( true );
3009*577c0052SWang Lei 
3010*577c0052SWang Lei         if ( GetCreateMode() != SFX_CREATE_MODE_ORGANIZER )
3011*577c0052SWang Lei             ScColumn::bDoubleAlloc = sal_True;
3012*577c0052SWang Lei     }
3013*577c0052SWang Lei }
3014*577c0052SWang Lei 
3015*577c0052SWang Lei void ScDocShell::AfterLoading( SfxMedium& rMedium, const ::rtl::OUString & rstrTypeName, const ::rtl::OUString & rstrFilterName )
3016*577c0052SWang Lei {
3017*577c0052SWang Lei     const sal_uInt8 nMediumFlag = GetMediumFlag<false>( rstrTypeName );
3018*577c0052SWang Lei 
3019*577c0052SWang Lei 	if( nMediumFlag & E_MEDIUM_FLAG_MSXML )
3020*577c0052SWang Lei 	{
3021*577c0052SWang Lei         aDocument.SetImportingMSXML( false );
3022*577c0052SWang Lei 
3023*577c0052SWang Lei         if ( GetCreateMode() != SFX_CREATE_MODE_ORGANIZER )
3024*577c0052SWang Lei             ScColumn::bDoubleAlloc = sal_False;
3025*577c0052SWang Lei 
3026*577c0052SWang Lei 		// After loading, the XEmbeddedObject was probably set modified flag, so reset the flag to false.
3027*577c0052SWang Lei 		uno::Sequence < ::rtl::OUString > aNames = GetEmbeddedObjectContainer().GetObjectNames();
3028*577c0052SWang Lei 		for ( sal_Int32 n = 0; n < aNames.getLength(); n++ )
3029*577c0052SWang Lei 		{
3030*577c0052SWang Lei 			::rtl::OUString	aName = aNames[n];
3031*577c0052SWang Lei 			uno::Reference < embed::XEmbeddedObject > xObj = GetEmbeddedObjectContainer().GetEmbeddedObject( aName );
3032*577c0052SWang Lei 			OSL_ENSURE( xObj.is(), "An empty entry in the embedded objects list!\n" );
3033*577c0052SWang Lei 			if ( xObj.is() )
3034*577c0052SWang Lei 			{
3035*577c0052SWang Lei 				try
3036*577c0052SWang Lei 				{
3037*577c0052SWang Lei 					sal_Int32 nState = xObj->getCurrentState();
3038*577c0052SWang Lei 					if ( nState != embed::EmbedStates::LOADED )
3039*577c0052SWang Lei 					{
3040*577c0052SWang Lei 						uno::Reference< util::XModifiable > xModifiable( xObj->getComponent(), uno::UNO_QUERY );
3041*577c0052SWang Lei 						if ( xModifiable.is() )
3042*577c0052SWang Lei 							xModifiable->setModified(sal_False);
3043*577c0052SWang Lei 					}
3044*577c0052SWang Lei 				}
3045*577c0052SWang Lei 				catch( uno::Exception& )
3046*577c0052SWang Lei 				{}
3047*577c0052SWang Lei 			}
3048*577c0052SWang Lei 		}
3049*577c0052SWang Lei 	}
3050*577c0052SWang Lei }
3051cdf0e10cSrcweir 
3052