xref: /trunk/main/sc/source/filter/excel/xlroot.cxx (revision b77af630)
1b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3b3f79822SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4b3f79822SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5b3f79822SAndrew Rist  * distributed with this work for additional information
6b3f79822SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7b3f79822SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8b3f79822SAndrew Rist  * "License"); you may not use this file except in compliance
9b3f79822SAndrew Rist  * with the License.  You may obtain a copy of the License at
10b3f79822SAndrew Rist  *
11b3f79822SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12b3f79822SAndrew Rist  *
13b3f79822SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14b3f79822SAndrew Rist  * software distributed under the License is distributed on an
15b3f79822SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16b3f79822SAndrew Rist  * KIND, either express or implied.  See the License for the
17b3f79822SAndrew Rist  * specific language governing permissions and limitations
18b3f79822SAndrew Rist  * under the License.
19b3f79822SAndrew Rist  *
20b3f79822SAndrew Rist  *************************************************************/
21b3f79822SAndrew Rist 
22b3f79822SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25*b77af630Sdamjan #include "precompiled_scfilt.hxx"
26cdf0e10cSrcweir #include "xlroot.hxx"
27cdf0e10cSrcweir #include <com/sun/star/awt/XDevice.hpp>
28cdf0e10cSrcweir #include <com/sun/star/frame/XFrame.hpp>
29cdf0e10cSrcweir #include <com/sun/star/frame/XFramesSupplier.hpp>
30cdf0e10cSrcweir #include <com/sun/star/i18n/ScriptType.hpp>
31cdf0e10cSrcweir #include <comphelper/processfactory.hxx>
32cdf0e10cSrcweir #include <vcl/svapp.hxx>
33cdf0e10cSrcweir #include <svl/stritem.hxx>
34cdf0e10cSrcweir #include <svl/languageoptions.hxx>
35cdf0e10cSrcweir #include <sfx2/objsh.hxx>
36cdf0e10cSrcweir #include <sfx2/printer.hxx>
37cdf0e10cSrcweir #include <sfx2/docfile.hxx>
38cdf0e10cSrcweir #include <vcl/font.hxx>
39cdf0e10cSrcweir #include <editeng/editstat.hxx>
40cdf0e10cSrcweir #include "scitems.hxx"
41cdf0e10cSrcweir #include <editeng/eeitem.hxx>
42cdf0e10cSrcweir #include "document.hxx"
43cdf0e10cSrcweir #include "docpool.hxx"
44cdf0e10cSrcweir #include "docuno.hxx"
45cdf0e10cSrcweir #include "editutil.hxx"
46cdf0e10cSrcweir #include "drwlayer.hxx"
47cdf0e10cSrcweir #include "scextopt.hxx"
48cdf0e10cSrcweir #include "patattr.hxx"
49cdf0e10cSrcweir #include "fapihelper.hxx"
50cdf0e10cSrcweir #include "xlconst.hxx"
51cdf0e10cSrcweir #include "xlstyle.hxx"
52cdf0e10cSrcweir #include "xlchart.hxx"
53cdf0e10cSrcweir #include "xltracer.hxx"
54cdf0e10cSrcweir #include <unotools/useroptions.hxx>
55cdf0e10cSrcweir #include "root.hxx"
56cdf0e10cSrcweir 
57cdf0e10cSrcweir namespace ApiScriptType = ::com::sun::star::i18n::ScriptType;
58cdf0e10cSrcweir 
59cdf0e10cSrcweir using ::rtl::OUString;
60cdf0e10cSrcweir using ::com::sun::star::uno::Exception;
61cdf0e10cSrcweir using ::com::sun::star::uno::Reference;
62cdf0e10cSrcweir using ::com::sun::star::uno::UNO_QUERY_THROW;
63cdf0e10cSrcweir using ::com::sun::star::uno::UNO_SET_THROW;
64cdf0e10cSrcweir using ::com::sun::star::awt::XDevice;
65cdf0e10cSrcweir using ::com::sun::star::awt::DeviceInfo;
66cdf0e10cSrcweir using ::com::sun::star::frame::XFrame;
67cdf0e10cSrcweir using ::com::sun::star::frame::XFramesSupplier;
68cdf0e10cSrcweir using ::com::sun::star::lang::XMultiServiceFactory;
69cdf0e10cSrcweir 
70cdf0e10cSrcweir using namespace ::com::sun::star;
71cdf0e10cSrcweir 
72cdf0e10cSrcweir // Global data ================================================================
73cdf0e10cSrcweir 
74cdf0e10cSrcweir #ifdef DBG_UTIL
~XclDebugObjCounter()75cdf0e10cSrcweir XclDebugObjCounter::~XclDebugObjCounter()
76cdf0e10cSrcweir {
77cdf0e10cSrcweir     DBG_ASSERT( mnObjCnt == 0, "XclDebugObjCounter::~XclDebugObjCounter - wrong root object count" );
78cdf0e10cSrcweir }
79cdf0e10cSrcweir #endif
80cdf0e10cSrcweir 
81cdf0e10cSrcweir // ----------------------------------------------------------------------------
82cdf0e10cSrcweir 
XclRootData(XclBiff eBiff,SfxMedium & rMedium,SotStorageRef xRootStrg,ScDocument & rDoc,rtl_TextEncoding eTextEnc,bool bExport)83cdf0e10cSrcweir XclRootData::XclRootData( XclBiff eBiff, SfxMedium& rMedium,
84cdf0e10cSrcweir         SotStorageRef xRootStrg, ScDocument& rDoc, rtl_TextEncoding eTextEnc, bool bExport ) :
85cdf0e10cSrcweir     meBiff( eBiff ),
86cdf0e10cSrcweir     meOutput( EXC_OUTPUT_BINARY ),
87cdf0e10cSrcweir     mrMedium( rMedium ),
88cdf0e10cSrcweir     mxRootStrg( xRootStrg ),
89cdf0e10cSrcweir     mrDoc( rDoc ),
90cdf0e10cSrcweir     maDefPassword( CREATE_STRING( "VelvetSweatshop" ) ),
91cdf0e10cSrcweir     meTextEnc( eTextEnc ),
92cdf0e10cSrcweir     meSysLang( Application::GetSettings().GetLanguage() ),
93cdf0e10cSrcweir     meDocLang( Application::GetSettings().GetLanguage() ),
94cdf0e10cSrcweir     meUILang( Application::GetSettings().GetUILanguage() ),
95cdf0e10cSrcweir     mnDefApiScript( ApiScriptType::LATIN ),
96cdf0e10cSrcweir     maScMaxPos( MAXCOL, MAXROW, MAXTAB ),
97cdf0e10cSrcweir     maXclMaxPos( EXC_MAXCOL2, EXC_MAXROW2, EXC_MAXTAB2 ),
98cdf0e10cSrcweir     maMaxPos( EXC_MAXCOL2, EXC_MAXROW2, EXC_MAXTAB2 ),
99cdf0e10cSrcweir     mxFontPropSetHlp( new XclFontPropSetHelper ),
100cdf0e10cSrcweir     mxChPropSetHlp( new XclChPropSetHelper ),
101cdf0e10cSrcweir     mxRD( new RootData ),//!
102cdf0e10cSrcweir     mfScreenPixelX( 50.0 ),
103cdf0e10cSrcweir     mfScreenPixelY( 50.0 ),
104cdf0e10cSrcweir     mnCharWidth( 110 ),
105cdf0e10cSrcweir     mnScTab( 0 ),
106cdf0e10cSrcweir     mbExport( bExport )
107cdf0e10cSrcweir {
108cdf0e10cSrcweir  maUserName = SvtUserOptions().GetLastName();
109cdf0e10cSrcweir     if( maUserName.Len() == 0 )
110cdf0e10cSrcweir         maUserName = CREATE_STRING( "Calc" );
111cdf0e10cSrcweir 
112cdf0e10cSrcweir     switch( ScGlobal::GetDefaultScriptType() )
113cdf0e10cSrcweir     {
114cdf0e10cSrcweir         case SCRIPTTYPE_LATIN:      mnDefApiScript = ApiScriptType::LATIN;      break;
115cdf0e10cSrcweir         case SCRIPTTYPE_ASIAN:      mnDefApiScript = ApiScriptType::ASIAN;      break;
116cdf0e10cSrcweir         case SCRIPTTYPE_COMPLEX:    mnDefApiScript = ApiScriptType::COMPLEX;    break;
117cdf0e10cSrcweir         default:    DBG_ERRORFILE( "XclRootData::XclRootData - unknown script type" );
118cdf0e10cSrcweir     }
119cdf0e10cSrcweir 
120cdf0e10cSrcweir     // maximum cell position
121cdf0e10cSrcweir     switch( meBiff )
122cdf0e10cSrcweir     {
123cdf0e10cSrcweir         case EXC_BIFF2: maXclMaxPos.Set( EXC_MAXCOL2, EXC_MAXROW2, EXC_MAXTAB2 );   break;
124cdf0e10cSrcweir         case EXC_BIFF3: maXclMaxPos.Set( EXC_MAXCOL3, EXC_MAXROW3, EXC_MAXTAB3 );   break;
125cdf0e10cSrcweir         case EXC_BIFF4: maXclMaxPos.Set( EXC_MAXCOL4, EXC_MAXROW4, EXC_MAXTAB4 );   break;
126cdf0e10cSrcweir         case EXC_BIFF5: maXclMaxPos.Set( EXC_MAXCOL5, EXC_MAXROW5, EXC_MAXTAB5 );   break;
127cdf0e10cSrcweir         case EXC_BIFF8: maXclMaxPos.Set( EXC_MAXCOL8, EXC_MAXROW8, EXC_MAXTAB8 );   break;
128cdf0e10cSrcweir         default:        DBG_ERROR_BIFF();
129cdf0e10cSrcweir     }
130cdf0e10cSrcweir     maMaxPos.SetCol( ::std::min( maScMaxPos.Col(), maXclMaxPos.Col() ) );
131cdf0e10cSrcweir     maMaxPos.SetRow( ::std::min( maScMaxPos.Row(), maXclMaxPos.Row() ) );
132cdf0e10cSrcweir     maMaxPos.SetTab( ::std::min( maScMaxPos.Tab(), maXclMaxPos.Tab() ) );
133cdf0e10cSrcweir 
134cdf0e10cSrcweir     // document URL and path
135cdf0e10cSrcweir     if( const SfxItemSet* pItemSet = mrMedium.GetItemSet() )
136cdf0e10cSrcweir         if( const SfxStringItem* pItem = static_cast< const SfxStringItem* >( pItemSet->GetItem( SID_FILE_NAME ) ) )
137cdf0e10cSrcweir             maDocUrl = pItem->GetValue();
138cdf0e10cSrcweir     maBasePath = maDocUrl.Copy( 0, maDocUrl.SearchBackward( '/' ) + 1 );
139cdf0e10cSrcweir 
140cdf0e10cSrcweir     // extended document options - always own object, try to copy existing data from document
141cdf0e10cSrcweir     if( const ScExtDocOptions* pOldDocOpt = mrDoc.GetExtDocOptions() )
142cdf0e10cSrcweir         mxExtDocOpt.reset( new ScExtDocOptions( *pOldDocOpt ) );
143cdf0e10cSrcweir     else
144cdf0e10cSrcweir         mxExtDocOpt.reset( new ScExtDocOptions );
145cdf0e10cSrcweir 
146cdf0e10cSrcweir     // screen pixel size
147cdf0e10cSrcweir     try
148cdf0e10cSrcweir     {
149cdf0e10cSrcweir         Reference< XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory(), UNO_SET_THROW );
150cdf0e10cSrcweir         Reference< XFramesSupplier > xFramesSupp( xFactory->createInstance( CREATE_OUSTRING( "com.sun.star.frame.Desktop" ) ), UNO_QUERY_THROW );
151cdf0e10cSrcweir         Reference< XFrame > xFrame( xFramesSupp->getActiveFrame(), UNO_SET_THROW );
152cdf0e10cSrcweir         Reference< XDevice > xDevice( xFrame->getContainerWindow(), UNO_QUERY_THROW );
153cdf0e10cSrcweir         DeviceInfo aDeviceInfo = xDevice->getInfo();
154cdf0e10cSrcweir         mfScreenPixelX = (aDeviceInfo.PixelPerMeterX > 0) ? (100000.0 / aDeviceInfo.PixelPerMeterX) : 50.0;
155cdf0e10cSrcweir         mfScreenPixelY = (aDeviceInfo.PixelPerMeterY > 0) ? (100000.0 / aDeviceInfo.PixelPerMeterY) : 50.0;
156cdf0e10cSrcweir     }
157cdf0e10cSrcweir     catch( Exception& )
158cdf0e10cSrcweir     {
159cdf0e10cSrcweir         OSL_ENSURE( false, "XclRootData::XclRootData - cannot get output device info" );
160cdf0e10cSrcweir     }
161cdf0e10cSrcweir }
162cdf0e10cSrcweir 
~XclRootData()163cdf0e10cSrcweir XclRootData::~XclRootData()
164cdf0e10cSrcweir {
165cdf0e10cSrcweir }
166cdf0e10cSrcweir 
167cdf0e10cSrcweir // ----------------------------------------------------------------------------
168cdf0e10cSrcweir 
XclRoot(XclRootData & rRootData)169cdf0e10cSrcweir XclRoot::XclRoot( XclRootData& rRootData ) :
170cdf0e10cSrcweir     mrData( rRootData )
171cdf0e10cSrcweir {
172cdf0e10cSrcweir #ifdef DBG_UTIL
173cdf0e10cSrcweir     ++mrData.mnObjCnt;
174cdf0e10cSrcweir #endif
175cdf0e10cSrcweir 
176cdf0e10cSrcweir     // filter tracer
177cdf0e10cSrcweir     // do not use CREATE_OUSTRING for conditional expression
178cdf0e10cSrcweir     mrData.mxTracer.reset( new XclTracer( GetDocUrl(), OUString::createFromAscii(
179cdf0e10cSrcweir         IsExport() ? "Office.Tracing/Export/Excel" : "Office.Tracing/Import/Excel" ) ) );
180cdf0e10cSrcweir }
181cdf0e10cSrcweir 
XclRoot(const XclRoot & rRoot)182cdf0e10cSrcweir XclRoot::XclRoot( const XclRoot& rRoot ) :
183cdf0e10cSrcweir     mrData( rRoot.mrData )
184cdf0e10cSrcweir {
185cdf0e10cSrcweir #ifdef DBG_UTIL
186cdf0e10cSrcweir     ++mrData.mnObjCnt;
187cdf0e10cSrcweir #endif
188cdf0e10cSrcweir }
189cdf0e10cSrcweir 
~XclRoot()190cdf0e10cSrcweir XclRoot::~XclRoot()
191cdf0e10cSrcweir {
192cdf0e10cSrcweir #ifdef DBG_UTIL
193cdf0e10cSrcweir     --mrData.mnObjCnt;
194cdf0e10cSrcweir #endif
195cdf0e10cSrcweir }
196cdf0e10cSrcweir 
operator =(const XclRoot & rRoot)197cdf0e10cSrcweir XclRoot& XclRoot::operator=( const XclRoot& rRoot )
198cdf0e10cSrcweir {
199cdf0e10cSrcweir     (void)rRoot;    // avoid compiler warning
200cdf0e10cSrcweir     // allowed for assignment in derived classes - but test if the same root data is used
201cdf0e10cSrcweir     DBG_ASSERT( &mrData == &rRoot.mrData, "XclRoot::operator= - incompatible root data" );
202cdf0e10cSrcweir     return *this;
203cdf0e10cSrcweir }
204cdf0e10cSrcweir 
SetTextEncoding(rtl_TextEncoding eTextEnc)205cdf0e10cSrcweir void XclRoot::SetTextEncoding( rtl_TextEncoding eTextEnc )
206cdf0e10cSrcweir {
207cdf0e10cSrcweir     if( eTextEnc != RTL_TEXTENCODING_DONTKNOW )
208cdf0e10cSrcweir         mrData.meTextEnc = eTextEnc;
209cdf0e10cSrcweir }
210cdf0e10cSrcweir 
SetCharWidth(const XclFontData & rFontData)211cdf0e10cSrcweir void XclRoot::SetCharWidth( const XclFontData& rFontData )
212cdf0e10cSrcweir {
213cdf0e10cSrcweir     mrData.mnCharWidth = 0;
214cdf0e10cSrcweir     if( OutputDevice* pPrinter = GetPrinter() )
215cdf0e10cSrcweir     {
216cdf0e10cSrcweir         Font aFont( rFontData.maName, Size( 0, rFontData.mnHeight ) );
217cdf0e10cSrcweir         aFont.SetFamily( rFontData.GetScFamily( GetTextEncoding() ) );
218cdf0e10cSrcweir         aFont.SetCharSet( rFontData.GetFontEncoding() );
219cdf0e10cSrcweir         aFont.SetWeight( rFontData.GetScWeight() );
220cdf0e10cSrcweir         pPrinter->SetFont( aFont );
221cdf0e10cSrcweir         mrData.mnCharWidth = pPrinter->GetTextWidth( String( '0' ) );
222cdf0e10cSrcweir     }
223cdf0e10cSrcweir     if( mrData.mnCharWidth <= 0 )
224cdf0e10cSrcweir     {
225cdf0e10cSrcweir         // #i48717# Win98 with HP LaserJet returns 0
226cdf0e10cSrcweir         DBG_ERRORFILE( "XclRoot::SetCharWidth - invalid character width (no printer?)" );
227cdf0e10cSrcweir         mrData.mnCharWidth = 11 * rFontData.mnHeight / 20;
228cdf0e10cSrcweir     }
229cdf0e10cSrcweir }
230cdf0e10cSrcweir 
GetHmmFromPixelX(double fPixelX) const231cdf0e10cSrcweir sal_Int32 XclRoot::GetHmmFromPixelX( double fPixelX ) const
232cdf0e10cSrcweir {
233cdf0e10cSrcweir     return static_cast< sal_Int32 >( fPixelX * mrData.mfScreenPixelX + 0.5 );
234cdf0e10cSrcweir }
235cdf0e10cSrcweir 
GetHmmFromPixelY(double fPixelY) const236cdf0e10cSrcweir sal_Int32 XclRoot::GetHmmFromPixelY( double fPixelY ) const
237cdf0e10cSrcweir {
238cdf0e10cSrcweir     return static_cast< sal_Int32 >( fPixelY * mrData.mfScreenPixelY + 0.5 );
239cdf0e10cSrcweir }
240cdf0e10cSrcweir 
RequestEncryptionData(::comphelper::IDocPasswordVerifier & rVerifier) const241cdf0e10cSrcweir uno::Sequence< beans::NamedValue > XclRoot::RequestEncryptionData( ::comphelper::IDocPasswordVerifier& rVerifier ) const
242cdf0e10cSrcweir {
243cdf0e10cSrcweir     ::std::vector< OUString > aDefaultPasswords;
244cdf0e10cSrcweir     aDefaultPasswords.push_back( mrData.maDefPassword );
245cdf0e10cSrcweir     return ScfApiHelper::QueryEncryptionDataForMedium( mrData.mrMedium, rVerifier, &aDefaultPasswords );
246cdf0e10cSrcweir }
247cdf0e10cSrcweir 
HasVbaStorage() const248cdf0e10cSrcweir bool XclRoot::HasVbaStorage() const
249cdf0e10cSrcweir {
250cdf0e10cSrcweir     SotStorageRef xRootStrg = GetRootStorage();
251cdf0e10cSrcweir     return xRootStrg.Is() && xRootStrg->IsContained( EXC_STORAGE_VBA_PROJECT );
252cdf0e10cSrcweir }
253cdf0e10cSrcweir 
OpenStorage(SotStorageRef xStrg,const String & rStrgName) const254cdf0e10cSrcweir SotStorageRef XclRoot::OpenStorage( SotStorageRef xStrg, const String& rStrgName ) const
255cdf0e10cSrcweir {
256cdf0e10cSrcweir     return mrData.mbExport ?
257cdf0e10cSrcweir         ScfTools::OpenStorageWrite( xStrg, rStrgName ) :
258cdf0e10cSrcweir         ScfTools::OpenStorageRead( xStrg, rStrgName );
259cdf0e10cSrcweir }
260cdf0e10cSrcweir 
OpenStorage(const String & rStrgName) const261cdf0e10cSrcweir SotStorageRef XclRoot::OpenStorage( const String& rStrgName ) const
262cdf0e10cSrcweir {
263cdf0e10cSrcweir     return OpenStorage( GetRootStorage(), rStrgName );
264cdf0e10cSrcweir }
265cdf0e10cSrcweir 
OpenStream(SotStorageRef xStrg,const String & rStrmName) const266cdf0e10cSrcweir SotStorageStreamRef XclRoot::OpenStream( SotStorageRef xStrg, const String& rStrmName ) const
267cdf0e10cSrcweir {
268cdf0e10cSrcweir     return mrData.mbExport ?
269cdf0e10cSrcweir         ScfTools::OpenStorageStreamWrite( xStrg, rStrmName ) :
270cdf0e10cSrcweir         ScfTools::OpenStorageStreamRead( xStrg, rStrmName );
271cdf0e10cSrcweir }
272cdf0e10cSrcweir 
OpenStream(const String & rStrmName) const273cdf0e10cSrcweir SotStorageStreamRef XclRoot::OpenStream( const String& rStrmName ) const
274cdf0e10cSrcweir {
275cdf0e10cSrcweir     return OpenStream( GetRootStorage(), rStrmName );
276cdf0e10cSrcweir }
277cdf0e10cSrcweir 
GetDocShell() const278cdf0e10cSrcweir SfxObjectShell* XclRoot::GetDocShell() const
279cdf0e10cSrcweir {
280cdf0e10cSrcweir     return GetDoc().GetDocumentShell();
281cdf0e10cSrcweir }
282cdf0e10cSrcweir 
GetDocModelObj() const283cdf0e10cSrcweir ScModelObj* XclRoot::GetDocModelObj() const
284cdf0e10cSrcweir {
285cdf0e10cSrcweir     SfxObjectShell* pDocShell = GetDocShell();
286cdf0e10cSrcweir     return pDocShell ? ScModelObj::getImplementation( pDocShell->GetModel() ) : 0;
287cdf0e10cSrcweir }
288cdf0e10cSrcweir 
GetPrinter() const289cdf0e10cSrcweir OutputDevice* XclRoot::GetPrinter() const
290cdf0e10cSrcweir {
291cdf0e10cSrcweir     return GetDoc().GetRefDevice();
292cdf0e10cSrcweir }
293cdf0e10cSrcweir 
GetStyleSheetPool() const294cdf0e10cSrcweir ScStyleSheetPool& XclRoot::GetStyleSheetPool() const
295cdf0e10cSrcweir {
296cdf0e10cSrcweir     return *GetDoc().GetStyleSheetPool();
297cdf0e10cSrcweir }
298cdf0e10cSrcweir 
GetNamedRanges() const299cdf0e10cSrcweir ScRangeName& XclRoot::GetNamedRanges() const
300cdf0e10cSrcweir {
301cdf0e10cSrcweir     return *GetDoc().GetRangeName();
302cdf0e10cSrcweir }
303cdf0e10cSrcweir 
GetDatabaseRanges() const304cdf0e10cSrcweir ScDBCollection& XclRoot::GetDatabaseRanges() const
305cdf0e10cSrcweir {
306cdf0e10cSrcweir     return *GetDoc().GetDBCollection();
307cdf0e10cSrcweir }
308cdf0e10cSrcweir 
GetSdrPage(SCTAB nScTab) const309cdf0e10cSrcweir SdrPage* XclRoot::GetSdrPage( SCTAB nScTab ) const
310cdf0e10cSrcweir {
311cdf0e10cSrcweir     return ((nScTab >= 0) && GetDoc().GetDrawLayer()) ?
312cdf0e10cSrcweir         GetDoc().GetDrawLayer()->GetPage( static_cast< sal_uInt16 >( nScTab ) ) : 0;
313cdf0e10cSrcweir }
314cdf0e10cSrcweir 
GetFormatter() const315cdf0e10cSrcweir SvNumberFormatter& XclRoot::GetFormatter() const
316cdf0e10cSrcweir {
317cdf0e10cSrcweir     return *GetDoc().GetFormatTable();
318cdf0e10cSrcweir }
319cdf0e10cSrcweir 
GetNullDate() const320cdf0e10cSrcweir DateTime XclRoot::GetNullDate() const
321cdf0e10cSrcweir {
322cdf0e10cSrcweir     return *GetFormatter().GetNullDate();
323cdf0e10cSrcweir }
324cdf0e10cSrcweir 
GetBaseYear() const325cdf0e10cSrcweir sal_uInt16 XclRoot::GetBaseYear() const
326cdf0e10cSrcweir {
327cdf0e10cSrcweir     // return 1904 for 1904-01-01, and 1900 for 1899-12-30
328cdf0e10cSrcweir     return (GetNullDate().GetYear() == 1904) ? 1904 : 1900;
329cdf0e10cSrcweir }
330cdf0e10cSrcweir 
GetDoubleFromDateTime(const DateTime & rDateTime) const331cdf0e10cSrcweir double XclRoot::GetDoubleFromDateTime( const DateTime& rDateTime ) const
332cdf0e10cSrcweir {
333cdf0e10cSrcweir     double fValue = rDateTime - GetNullDate();
334cdf0e10cSrcweir     // adjust dates before 1900-03-01 to get correct time values in the range [0.0,1.0)
335cdf0e10cSrcweir     if( rDateTime < DateTime( Date( 1, 3, 1900 ) ) )
336cdf0e10cSrcweir         fValue -= 1.0;
337cdf0e10cSrcweir     return fValue;
338cdf0e10cSrcweir }
339cdf0e10cSrcweir 
GetDateTimeFromDouble(double fValue) const340cdf0e10cSrcweir DateTime XclRoot::GetDateTimeFromDouble( double fValue ) const
341cdf0e10cSrcweir {
342cdf0e10cSrcweir     DateTime aDateTime = GetNullDate() + fValue;
343cdf0e10cSrcweir     // adjust dates before 1900-03-01 to get correct time values
344cdf0e10cSrcweir     if( aDateTime < DateTime( Date( 1, 3, 1900 ) ) )
345cdf0e10cSrcweir         aDateTime += 1L;
346cdf0e10cSrcweir     return aDateTime;
347cdf0e10cSrcweir }
348cdf0e10cSrcweir 
GetEditEngine() const349cdf0e10cSrcweir ScEditEngineDefaulter& XclRoot::GetEditEngine() const
350cdf0e10cSrcweir {
351cdf0e10cSrcweir     if( !mrData.mxEditEngine.get() )
352cdf0e10cSrcweir     {
353cdf0e10cSrcweir         mrData.mxEditEngine.reset( new ScEditEngineDefaulter( GetDoc().GetEnginePool() ) );
354cdf0e10cSrcweir         ScEditEngineDefaulter& rEE = *mrData.mxEditEngine;
355cdf0e10cSrcweir         rEE.SetRefMapMode( MAP_100TH_MM );
356cdf0e10cSrcweir         rEE.SetEditTextObjectPool( GetDoc().GetEditPool() );
357cdf0e10cSrcweir         rEE.SetUpdateMode( sal_False );
358cdf0e10cSrcweir         rEE.EnableUndo( sal_False );
359cdf0e10cSrcweir         rEE.SetControlWord( rEE.GetControlWord() & ~EE_CNTRL_ALLOWBIGOBJS );
360cdf0e10cSrcweir     }
361cdf0e10cSrcweir     return *mrData.mxEditEngine;
362cdf0e10cSrcweir }
363cdf0e10cSrcweir 
GetHFEditEngine() const364cdf0e10cSrcweir ScHeaderEditEngine& XclRoot::GetHFEditEngine() const
365cdf0e10cSrcweir {
366cdf0e10cSrcweir     if( !mrData.mxHFEditEngine.get() )
367cdf0e10cSrcweir     {
368cdf0e10cSrcweir         mrData.mxHFEditEngine.reset( new ScHeaderEditEngine( EditEngine::CreatePool(), sal_True ) );
369cdf0e10cSrcweir         ScHeaderEditEngine& rEE = *mrData.mxHFEditEngine;
370cdf0e10cSrcweir         rEE.SetRefMapMode( MAP_TWIP );  // headers/footers use twips as default metric
371cdf0e10cSrcweir         rEE.SetUpdateMode( sal_False );
372cdf0e10cSrcweir         rEE.EnableUndo( sal_False );
373cdf0e10cSrcweir         rEE.SetControlWord( rEE.GetControlWord() & ~EE_CNTRL_ALLOWBIGOBJS );
374cdf0e10cSrcweir 
375cdf0e10cSrcweir         // set Calc header/footer defaults
376cdf0e10cSrcweir         SfxItemSet* pEditSet = new SfxItemSet( rEE.GetEmptyItemSet() );
377cdf0e10cSrcweir         SfxItemSet aItemSet( *GetDoc().GetPool(), ATTR_PATTERN_START, ATTR_PATTERN_END );
378cdf0e10cSrcweir         ScPatternAttr::FillToEditItemSet( *pEditSet, aItemSet );
379cdf0e10cSrcweir         // FillToEditItemSet() adjusts font height to 1/100th mm, we need twips
380cdf0e10cSrcweir         pEditSet->Put( aItemSet.Get( ATTR_FONT_HEIGHT ), EE_CHAR_FONTHEIGHT );
381cdf0e10cSrcweir         pEditSet->Put( aItemSet.Get( ATTR_CJK_FONT_HEIGHT ), EE_CHAR_FONTHEIGHT_CJK );
382cdf0e10cSrcweir         pEditSet->Put( aItemSet.Get( ATTR_CTL_FONT_HEIGHT ), EE_CHAR_FONTHEIGHT_CTL );
383cdf0e10cSrcweir         rEE.SetDefaults( pEditSet );    // takes ownership
384cdf0e10cSrcweir    }
385cdf0e10cSrcweir     return *mrData.mxHFEditEngine;
386cdf0e10cSrcweir }
387cdf0e10cSrcweir 
GetDrawEditEngine() const388cdf0e10cSrcweir EditEngine& XclRoot::GetDrawEditEngine() const
389cdf0e10cSrcweir {
390cdf0e10cSrcweir     if( !mrData.mxDrawEditEng.get() )
391cdf0e10cSrcweir     {
392cdf0e10cSrcweir         mrData.mxDrawEditEng.reset( new EditEngine( &GetDoc().GetDrawLayer()->GetItemPool() ) );
393cdf0e10cSrcweir         EditEngine& rEE = *mrData.mxDrawEditEng;
394cdf0e10cSrcweir         rEE.SetRefMapMode( MAP_100TH_MM );
395cdf0e10cSrcweir         rEE.SetUpdateMode( sal_False );
396cdf0e10cSrcweir         rEE.EnableUndo( sal_False );
397cdf0e10cSrcweir         rEE.SetControlWord( rEE.GetControlWord() & ~EE_CNTRL_ALLOWBIGOBJS );
398cdf0e10cSrcweir     }
399cdf0e10cSrcweir     return *mrData.mxDrawEditEng;
400cdf0e10cSrcweir }
401cdf0e10cSrcweir 
GetFontPropSetHelper() const402cdf0e10cSrcweir XclFontPropSetHelper& XclRoot::GetFontPropSetHelper() const
403cdf0e10cSrcweir {
404cdf0e10cSrcweir     return *mrData.mxFontPropSetHlp;
405cdf0e10cSrcweir }
406cdf0e10cSrcweir 
GetChartPropSetHelper() const407cdf0e10cSrcweir XclChPropSetHelper& XclRoot::GetChartPropSetHelper() const
408cdf0e10cSrcweir {
409cdf0e10cSrcweir     return *mrData.mxChPropSetHlp;
410cdf0e10cSrcweir }
411cdf0e10cSrcweir 
GetExtDocOptions() const412cdf0e10cSrcweir ScExtDocOptions& XclRoot::GetExtDocOptions() const
413cdf0e10cSrcweir {
414cdf0e10cSrcweir     return *mrData.mxExtDocOpt;
415cdf0e10cSrcweir }
416cdf0e10cSrcweir 
GetTracer() const417cdf0e10cSrcweir XclTracer& XclRoot::GetTracer() const
418cdf0e10cSrcweir {
419cdf0e10cSrcweir     return *mrData.mxTracer;
420cdf0e10cSrcweir }
421cdf0e10cSrcweir 
422cdf0e10cSrcweir // ============================================================================
423cdf0e10cSrcweir 
424