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