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