Difference between revisions of "Calc/Implementation/Filter in spreadsheet"

From Apache OpenOffice Wiki
Jump to: navigation, search
 
(8 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 +
[[Category:Calc]]
 +
[[Category:Implementation]]
 +
 
== The whole view of filter ==
 
== The whole view of filter ==
 
An in-memory Symphony document is represented by it's document model. On disk, the same document is represented as a file. An import component must turn the latter into the former as shown by this diagram.
 
An in-memory Symphony document is represented by it's document model. On disk, the same document is represented as a file. An import component must turn the latter into the former as shown by this diagram.
 +
 
[[File:Filter_structure.JPG]]
 
[[File:Filter_structure.JPG]]
 +
 
== Filter in symphony ==
 
== Filter in symphony ==
 
When open a file in symphony, the supported filters will be initialized by the class of SfxFilterContainer in sfx2\inc\sfx2.  
 
When open a file in symphony, the supported filters will be initialized by the class of SfxFilterContainer in sfx2\inc\sfx2.  
 
It contains a member of SfxFilterContainer_Impl *pImpl. Symphony uses this class to control every SfxFilter.
 
It contains a member of SfxFilterContainer_Impl *pImpl. Symphony uses this class to control every SfxFilter.
 +
 
[[File:SfxFilterContainer.JPG]]
 
[[File:SfxFilterContainer.JPG]]
 +
 
There are a global variable for storing SfxFilter, the name is  
 
There are a global variable for storing SfxFilter, the name is  
 
static SfxFilterList_Impl* pFilterArr = 0;  
 
static SfxFilterList_Impl* pFilterArr = 0;  
Line 23: Line 30:
 
The function is defined in filter\source\config\cache\filtercache.cxx
 
The function is defined in filter\source\config\cache\filtercache.cxx
 
A subset of document types is defined for a real filter. For example, to calc, it is defined in Basis\share\registry\modules\org\openoffice\TypeDetection\Filter\fcfg_calc_filters.xcu, here is an item for MS excel 97 file format.
 
A subset of document types is defined for a real filter. For example, to calc, it is defined in Basis\share\registry\modules\org\openoffice\TypeDetection\Filter\fcfg_calc_filters.xcu, here is an item for MS excel 97 file format.
 +
 
<node oor:name="MS Excel 97" oor:op="replace">
 
<node oor:name="MS Excel 97" oor:op="replace">
 +
 
<prop oor:name="Flags"><value>IMPORT EXPORT ALIEN PREFERRED</value></prop>
 
<prop oor:name="Flags"><value>IMPORT EXPORT ALIEN PREFERRED</value></prop>
 +
 
<prop oor:name="UIComponent"/>
 
<prop oor:name="UIComponent"/>
 +
 
<prop oor:name="FilterService"/>
 
<prop oor:name="FilterService"/>
 +
 
<prop oor:name="UserData"/>
 
<prop oor:name="UserData"/>
 +
 
<prop oor:name="UIName">
 
<prop oor:name="UIName">
 +
 
<value xml:lang="x-default">Microsoft Excel 97/2000/XP</value>
 
<value xml:lang="x-default">Microsoft Excel 97/2000/XP</value>
 +
 
</prop>
 
</prop>
 +
 
<prop oor:name="FileFormatVersion"><value>0</value></prop>
 
<prop oor:name="FileFormatVersion"><value>0</value></prop>
 +
 
<prop oor:name="Type"><value>calc_MS_Excel_97</value></prop>
 
<prop oor:name="Type"><value>calc_MS_Excel_97</value></prop>
 +
 
<prop oor:name="TemplateName"/>
 
<prop oor:name="TemplateName"/>
 +
 
<prop oor:name="DocumentService"><value>com.sun.star.sheet.SpreadsheetDocument</value></prop>
 
<prop oor:name="DocumentService"><value>com.sun.star.sheet.SpreadsheetDocument</value></prop>
 +
 
</node>
 
</node>
 +
 
The UIName defines the string of MS excel 97 displayed for open/save dialog.
 
The UIName defines the string of MS excel 97 displayed for open/save dialog.
 
The Type defines the string used in the internal code of Symphony.
 
The Type defines the string used in the internal code of Symphony.
 
The DocumentService defines which service is used to import/export such document.
 
The DocumentService defines which service is used to import/export such document.
 +
 
[[File:Callstack2.JPG]]
 
[[File:Callstack2.JPG]]
 +
 
*Deep detection
 
*Deep detection
 
Symphony uses the interface XExtendedFilterDetection to look into the document stream to detect the format. It belongs to :: com :: sun :: star :: document.
 
Symphony uses the interface XExtendedFilterDetection to look into the document stream to detect the format. It belongs to :: com :: sun :: star :: document.
Line 71: Line 94:
 
Chart is managed by the class of XclImpObjectManager in spreadsheet. The real implement is XclImpChartObj that is base on XclImplDrawObjBase.
 
Chart is managed by the class of XclImpObjectManager in spreadsheet. The real implement is XclImpChartObj that is base on XclImplDrawObjBase.
 
XclImpChart will import the parts of chart, for example, diagram, series, title, background, etc.
 
XclImpChart will import the parts of chart, for example, diagram, series, title, background, etc.
 +
 
[[File:Loadchart.JPG]]
 
[[File:Loadchart.JPG]]

Latest revision as of 06:25, 1 June 2012


The whole view of filter

An in-memory Symphony document is represented by it's document model. On disk, the same document is represented as a file. An import component must turn the latter into the former as shown by this diagram.

Filter structure.JPG

Filter in symphony

When open a file in symphony, the supported filters will be initialized by the class of SfxFilterContainer in sfx2\inc\sfx2. It contains a member of SfxFilterContainer_Impl *pImpl. Symphony uses this class to control every SfxFilter.

SfxFilterContainer.JPG

There are a global variable for storing SfxFilter, the name is static SfxFilterList_Impl* pFilterArr = 0; it is defined in sfx2\source\bastyp\fltfnc.cxx. Indeed SfxFilterList_Impl is a list defined by DECLARE_LIST( SfxFilterList_Impl, SfxFilter* ) in sfx2\inc\arrdecl.hxx. The detail can be traced by the call stack. Callstack.JPG

Get the correct filter to load a document

To import a real document, symphony should get the file type to use the correct filter. To get the filter, Symphony will use flat detection and deep detection. In few words the "flat detection" is a type detection based on document extension, for example,a document named "test.xls", it will get calc to load it by the extension of "xls". The "deep detection" is the detection that analyzes the document contents. For example, if a document named "test.xls",but it is presentation document, then the deep detection should be joined. In the file of filter\source\config\cache\typedetection.cxx, the function of TypeDetection::queryTypeByDescriptor is the entry for getting the filter to loading the document.

  • Flat detection

FilterCache::detectFlatForURL, it can get the correct filter by the extention of the document name. The function is defined in filter\source\config\cache\filtercache.cxx A subset of document types is defined for a real filter. For example, to calc, it is defined in Basis\share\registry\modules\org\openoffice\TypeDetection\Filter\fcfg_calc_filters.xcu, here is an item for MS excel 97 file format.

<node oor:name="MS Excel 97" oor:op="replace">

<prop oor:name="Flags"><value>IMPORT EXPORT ALIEN PREFERRED</value></prop>

<prop oor:name="UIComponent"/>

<prop oor:name="FilterService"/>

<prop oor:name="UserData"/>

<prop oor:name="UIName">

<value xml:lang="x-default">Microsoft Excel 97/2000/XP</value>

</prop>

<prop oor:name="FileFormatVersion"><value>0</value></prop>

<prop oor:name="Type"><value>calc_MS_Excel_97</value></prop>

<prop oor:name="TemplateName"/>

<prop oor:name="DocumentService"><value>com.sun.star.sheet.SpreadsheetDocument</value></prop>

</node>

The UIName defines the string of MS excel 97 displayed for open/save dialog. The Type defines the string used in the internal code of Symphony. The DocumentService defines which service is used to import/export such document.

Callstack2.JPG

  • Deep detection

Symphony uses the interface XExtendedFilterDetection to look into the document stream to detect the format. It belongs to :: com :: sun :: star :: document. This function is called by TypeDetection::impl_askDetectService in the file filter\source\config\cache\typedetection.cxx sDeepType = xDetector->detect(lDescriptor); In the step 3.1, Symphony has got the filters by the file's extention. The types matching to the given extention. Calc_MS_Excel_40 Calc_MS_Excel_95 Calc_MS_Excel_97 Calc_Text_txt_csv_StarCalc Calc_MS_Excel_5095 By the types, Symphony will do the deep detection. It is realized by a spreadsheet servcie of com.sun.star.comp.calc.FormatDetector.

In the function of TypeDetection::impl_askDetectService(), It calls xDetector->detect(lDescriptor); The real implement function is ScFilterDetect::detect() It is defined in sc\source\ui\unoobj\scdetect.cxx At first, make a SotStorage by the input stream of MS excel SotStorageRef aStorage = new SotStorage ( pStream, FALSE ); Then check the content of the file, if there is a sub stream named "Workbook" or "Book". String aStreamName(RTL_CONSTASCII_STRINGPARAM("Workbook")); BOOL bExcel97Stream = ( aStorage->IsStream( aStreamName ) );

aStreamName = String(RTL_CONSTASCII_STRINGPARAM("Book")); BOOL bExcel5Stream = ( aStorage->IsStream( aStreamName ) ); Deepdetect.jpg

  • Load a chart in spreadsheet filter

Chart is managed by the class of XclImpObjectManager in spreadsheet. The real implement is XclImpChartObj that is base on XclImplDrawObjBase. XclImpChart will import the parts of chart, for example, diagram, series, title, background, etc.

Loadchart.JPG

Personal tools