[ooo-build-commit] 2 commits - bin/create-gitignores.sh patches/dev300

Florian Reuter flr at kemper.freedesktop.org
Mon Jun 29 03:31:36 PDT 2009


 bin/create-gitignores.sh               |    1 
 patches/dev300/apply                   |    2 
 patches/dev300/experimental_ooapi.diff | 1092 +++++++++++++++++++++++++++++++++
 3 files changed, 1095 insertions(+)

New commits:
commit 9da1ae035a92e69dc8ecb9964b2f1083586517d7
Author: Florian Reuter <freuter at linux-cfjm.site>
Date:   Mon Jun 29 12:26:12 2009 +0200

    some weekend experiments with filter apis
    
    * bin/create-gitignores.sh:
    * patches/dev300/apply:
    * patches/dev300/experimental_ooapi.diff:

diff --git a/bin/create-gitignores.sh b/bin/create-gitignores.sh
index 4d727c2..6013de4 100755
--- a/bin/create-gitignores.sh
+++ b/bin/create-gitignores.sh
@@ -49,6 +49,7 @@ localize.sdf
 .svn
 /solver
 *.orig
+*~
 autom4te.cache/
 config.log
 config.parms
diff --git a/patches/dev300/experimental_ooapi.diff b/patches/dev300/experimental_ooapi.diff
new file mode 100644
index 0000000..083d82f
--- /dev/null
+++ b/patches/dev300/experimental_ooapi.diff
@@ -0,0 +1,1092 @@
+diff --git a/offapi/org/openoffice/DocumentBuilder.idl b/offapi/org/openoffice/DocumentBuilder.idl
+new file mode 100644
+index 0000000..36ebc14
+--- /dev/null
++++ b/offapi/org/openoffice/DocumentBuilder.idl
+@@ -0,0 +1,40 @@
++#ifndef org_openoffice_DocumentBuilder_idl
++#define org_openoffice_DocumentBuilder_idl
++
++/* builder factory: Positon... */
++
++module org { module openoffice { 
++
++      interface DocumentBuilder {
++	/*
++	void setFontWeight();
++	void getFontWeight();
++
++	void appendText();
++	void appendAPO();
++	void startRun();
++	void endRun();
++
++	void appendParagraph();
++
++	void startTable();
++	void endTable();
++	void startRow();
++	void endRow();
++	void startCell();
++	void endCell();
++	
++	void startField();
++	void endField();
++
++	void startBookmark();
++	void endBookmark();
++
++	void startSection();
++	void endSection();
++	*/
++      };
++
++}; };
++
++#endif
+diff --git a/offapi/org/openoffice/DocumentBuilderSupplier.idl b/offapi/org/openoffice/DocumentBuilderSupplier.idl
+new file mode 100644
+index 0000000..0af3886
+--- /dev/null
++++ b/offapi/org/openoffice/DocumentBuilderSupplier.idl
+@@ -0,0 +1,19 @@
++#ifndef org_openoffice_DocumentBuilderSupplier_idl
++#define org_openoffice_DocumentBuilderSupplier_idl
++
++#include <com/sun/star/uno/XInterface.idl>
++#include <org/openoffice/DocumentBuilder.idl>
++#include <org/openoffice/DocumentProvider.idl>
++
++module org { module openoffice { 
++
++      interface DocumentBuilderSupplier {
++
++	org::openoffice::DocumentBuilder createDocumentBuilder();
++	org::openoffice::DocumentProvider createDocumentProvider();
++
++      };
++
++}; };
++
++#endif 
+diff --git a/offapi/org/openoffice/DocumentProvider.idl b/offapi/org/openoffice/DocumentProvider.idl
+new file mode 100644
+index 0000000..70ed037
+--- /dev/null
++++ b/offapi/org/openoffice/DocumentProvider.idl
+@@ -0,0 +1,48 @@
++#ifndef org_openoffice_DocumentProvider_idl
++#define org_openoffice_DocumentProvider_idl
++
++#include <com/sun/star/uno/XInterface.idl>
++
++module org { module openoffice { 
++
++    interface DocumentProvider {
++
++      void moveToMainContent();      
++      boolean hasNode();
++      boolean isTxtNode();
++      boolean isTableNode();
++      void consume();
++      long getNodeIndex();
++
++      void getSectionPr([in]long idx, [out]sequence< long > dxaColumns);
++
++      long getColumns();
++      long getColumn([in] long i);
++      long getRows();
++      
++      DocumentProvider openCell([in] long row, [in] long column);
++      long getRowSpan([in] long row, [in] long column);
++      long getColSpan([in] long row, [in] long column);
++
++      string getTxt();
++      long getTxtLen();
++      long getTxtOfs();
++      long loadPortion([in] long ofs);
++
++      boolean checkFlys([inout] long ofsStart, [inout] long ofsEnd,
++			[inout] long flyStart, [inout] long flyEnd);
++      DocumentProvider openFly([in] long fly);
++      boolean getFlyPositionRelativeToPage([in] long fly,
++					   [out]long x, 
++					   [out]long y, 
++					   [out]long w,
++					   [out]long h);
++
++      byte getFontWeight();
++      
++    };
++
++}; };
++
++
++#endif 
+diff --git a/offapi/org/openoffice/makefile.mk b/offapi/org/openoffice/makefile.mk
+new file mode 100644
+index 0000000..343da37
+--- /dev/null
++++ b/offapi/org/openoffice/makefile.mk
+@@ -0,0 +1,22 @@
++PRJ=..$/..
++
++PRJNAME=offapi
++
++TARGET=ooapi
++PACKAGE=org$/openoffice
++
++# --- Settings -----------------------------------------------------
++.INCLUDE :  $(PRJ)$/util$/makefile.pmk
++
++# ------------------------------------------------------------------------
++
++IDLFILES=\
++    DocumentBuilder.idl\
++    DocumentProvider.idl\
++    DocumentBuilderSupplier.idl
++
++
++# ------------------------------------------------------------------
++
++.INCLUDE :  target.mk
++.INCLUDE :  $(PRJ)$/util$/target.pmk
+diff --git a/offapi/prj/build.lst b/offapi/prj/build.lst
+index 37c4880..01e8df1 100644
+--- a/offapi/prj/build.lst
++++ b/offapi/prj/build.lst
+@@ -103,4 +103,5 @@ oa	offapi\com\sun\star\geometry		    nmake	-	all	oa_geometry NULL
+ oa	offapi\com\sun\star\rendering	        nmake	-	all oa_rendering oa_geometry NULL
+ oa	offapi\com\sun\star\rdf	                nmake	-	all oa_rdf  oa_datatransfer oa_text NULL
+ oa	offapi\drafts\com\sun\star\form         nmake	-	all	oa_drafts_form NULL
+-oa  offapi\util                             nmake   -   all oa_util oa_auth oa_awt oa_awttree oa_chart oa_chart2 oa_chart2_data oa_config oa_configbootstrap oa_configbackend oa_configbackend_xml oa_datatrans_clip oa_datatrans_dnd oa_datatransfer oa_docu oa_draw oa_draw_framework oa_embed oa_fcomp oa_finsp oa_fcontr oa_fieldmaster oa_form oa_xforms oa_formula oa_frame oa_i18n oa_inst oa_ldap oa_ling2 oa_logging oa_mail oa_media oa_mozilla oa_packages oa_manifest oa_zippackage oa_plug oa_pres oa_animations oa_putil oa_resrc oa_sax oa_xml_input oa_scan oa_sdb oa_sdbtools oa_sdbapp oa_sdbc oa_sdbcx oa_setup oa_sheet oa_style oa_svg oa_sync oa_sync2 oa_system oa_table oa_task oa_text oa_textfield oa_docinfo oa_ucb oa_view oa_xml oa_xml_dom oa_xml_xpath oa_xml_views oa_xml_events oa_image oa_xsd oa_inspection oa_ui oa_ui_dialogs oa_accessibility oa_form_binding oa_form_validation oa_form_submission oa_fruntime oa_geometry oa_rendering oa_sfprovider oa_sfbrowse oa_drafts_form oa_deployment oa_deploymenttest oa_deployment_ui oa_frame_status oa_gallery oa_graphic oa_security oa_crypto_sax oa_crypto oa_csax oa_wrapper oa_script oa_smarttags oa_report oa_reportins oa_reportmeta oa_rdf oa_oooimprovement NULL
++oa	offapi\org\openoffice			nmake	-	all	oa_ooapi NULL
++oa  offapi\util                             nmake   -   all oa_util oa_auth oa_awt oa_awttree oa_chart oa_chart2 oa_chart2_data oa_config oa_configbootstrap oa_configbackend oa_configbackend_xml oa_datatrans_clip oa_datatrans_dnd oa_datatransfer oa_docu oa_draw oa_draw_framework oa_embed oa_fcomp oa_finsp oa_fcontr oa_fieldmaster oa_form oa_xforms oa_formula oa_frame oa_i18n oa_inst oa_ldap oa_ling2 oa_logging oa_mail oa_media oa_mozilla oa_packages oa_manifest oa_zippackage oa_plug oa_pres oa_animations oa_putil oa_resrc oa_sax oa_xml_input oa_scan oa_sdb oa_sdbtools oa_sdbapp oa_sdbc oa_sdbcx oa_setup oa_sheet oa_style oa_svg oa_sync oa_sync2 oa_system oa_table oa_task oa_text oa_textfield oa_docinfo oa_ucb oa_view oa_xml oa_xml_dom oa_xml_xpath oa_xml_views oa_xml_events oa_image oa_xsd oa_inspection oa_ui oa_ui_dialogs oa_accessibility oa_form_binding oa_form_validation oa_form_submission oa_fruntime oa_geometry oa_rendering oa_sfprovider oa_sfbrowse oa_drafts_form oa_deployment oa_deploymenttest oa_deployment_ui oa_frame_status oa_gallery oa_graphic oa_security oa_crypto_sax oa_crypto oa_csax oa_wrapper oa_script oa_smarttags oa_report oa_reportins oa_reportmeta oa_rdf oa_oooimprovement oa_ooapi NULL
+diff --git a/offapi/prj/d.lst b/offapi/prj/d.lst
+index e8982a5..a3a6d7b 100644
+--- a/offapi/prj/d.lst
++++ b/offapi/prj/d.lst
+@@ -112,6 +112,7 @@ mkdir: %COMMON_DEST%\idl%_EXT%\drafts\com
+ mkdir: %COMMON_DEST%\idl%_EXT%\drafts\com\sun
+ mkdir: %COMMON_DEST%\idl%_EXT%\drafts\com\sun\star
+ mkdir: %COMMON_DEST%\idl%_EXT%\drafts\com\sun\star\form
++mkdir: %COMMON_DEST%\idl%_EXT%\org\openoffice
+ 
+ 
+ ..\%__SRC%\ucr\offapi.db %_DEST%\bin%_EXT%\offapi.rdb
+@@ -224,3 +225,4 @@ mkdir: %COMMON_DEST%\idl%_EXT%\drafts\com\sun\star\form
+ ..\com\sun\star\xsd\*.idl %COMMON_DEST%\idl%_EXT%\com\sun\star\xsd
+ 
+ ..\drafts\com\sun\star\form\*.idl %COMMON_DEST%\idl%_EXT%\drafts\com\sun\star\form
++..\org\openoffice\*.idl %COMMON_DEST%\idl%_EXT%\org\openoffice
+\ No newline at end of file
+diff --git a/offapi/util/makefile.mk b/offapi/util/makefile.mk
+index b671bcc..e0edfa0 100644
+--- a/offapi/util/makefile.mk
++++ b/offapi/util/makefile.mk
+@@ -143,7 +143,8 @@ UNOIDLDBFILES= \
+     $(UCR)$/cssreport.db \
+     $(UCR)$/cssrptins.db \
+     $(UCR)$/cssrptmeta.db \
+-    $(UCR)$/cssrdf.db
++    $(UCR)$/cssrdf.db \
++    $(UCR)$/ooapi.db
+ 
+ 
+ REFERENCE_RDB=$(PRJ)$/type_reference$/types.rdb
+diff --git a/offuh/prj/d.lst b/offuh/prj/d.lst
+index fab4ddf..bc2f14b 100644
+--- a/offuh/prj/d.lst
++++ b/offuh/prj/d.lst
+@@ -130,6 +130,7 @@ mkdir: %_DEST%\inc%_EXT%\offuh\com\sun\star\xml\csax
+ mkdir: %_DEST%\inc%_EXT%\offuh\com\sun\star\xml\wrapper
+ #i20156 - end
+ mkdir: %_DEST%\inc%_EXT%\offuh\com\sun\star\rdf
++mkdir: %_DEST%\inc%_EXT%\offuh\org\openoffice
+ 
+ ..\%__SRC%\inc\offuh\com\sun\star\auth\*.hdl %_DEST%\inc%_EXT%\offuh\com\sun\star\auth\*.hdl
+ ..\%__SRC%\inc\offuh\com\sun\star\auth\*.hpp %_DEST%\inc%_EXT%\offuh\com\sun\star\auth\*.hpp
+@@ -372,3 +373,5 @@ mkdir: %_DEST%\inc%_EXT%\offuh\com\sun\star\rdf
+ ..\%__SRC%\inc\offuh\com\sun\star\rdf\*.hpp %_DEST%\inc%_EXT%\offuh\com\sun\star\rdf\*.hpp
+ ..\%__SRC%\inc\offuh\com\sun\star\rdf\*.hdl %_DEST%\inc%_EXT%\offuh\com\sun\star\rdf\*.hdl
+ 
++..\%__SRC%\inc\offuh\org\openoffice\*.hpp %_DEST%\inc%_EXT%\offuh\org\openoffice\*.hpp
++..\%__SRC%\inc\offuh\org\openoffice\*.hdl %_DEST%\inc%_EXT%\offuh\org\openoffice\*.hdl
+diff --git a/sw/inc/ooapi.hxx b/sw/inc/ooapi.hxx
+new file mode 100644
+index 0000000..a79bafc
+--- /dev/null
++++ b/sw/inc/ooapi.hxx
+@@ -0,0 +1,109 @@
++#ifndef _OOAPI_HXX
++#define _OOAPI_HXX
++
++#include <tools/solar.h>
++#include <org/openoffice/DocumentBuilder.hpp>
++#include <org/openoffice/DocumentProvider.hpp>
++#include <cppuhelper/implbase1.hxx>
++
++class SwDocShell;
++class SwDoc;
++class SwNodeIndex;
++class SwPosition;
++class SwAttrIter;
++class SwScriptInfo;
++class SfxItemSet;
++class SwTable;
++class SwTableLine;
++class SwPosFlyFrms;
++class SwTableBox;
++
++class SwDocumentBuilder : public ::cppu::WeakImplHelper1< ::org::openoffice::DocumentBuilder > {
++
++private:
++  SwDocShell* m_pShell;
++  SwDoc *m_pDoc;
++public:
++  SwDocumentBuilder(SwDocShell* pShell);
++  virtual ~SwDocumentBuilder();
++
++};
++
++class SwDocumentProvider : public ::cppu::WeakImplHelper1< ::org::openoffice::DocumentProvider > {
++private:
++  static const int MAXCELLX=65;
++
++private:
++  SwDocShell* m_pShell;
++  SwDoc *m_pDoc;
++  SwPosFlyFrms *m_pFlyFrms;
++
++  SwNodeIndex *m_pNodeIndex; // current node index
++  SwNodeIndex *m_pEndIndex;  // final index...
++  SwPosition *m_pPos;        // !=NULL when in a content node
++  sal_Int32 m_pFlyStart;           // index into m_pFlyFrms for the current
++  sal_Int32 m_pFlyEnd;             // node...
++
++  
++  SwAttrIter *m_pAttrItr;     // !=NULL when in a SwTxtNode
++  SwScriptInfo *m_pScriptInfo; // !=NULL when we have an SwAttrItr
++  SfxItemSet *m_pItemSet;   
++
++  int m_tableGridX[MAXCELLX];
++  int m_nTableGridX;
++
++  SwTableBox *m_pCachedBox; // !=NULL then all the members below are valid
++  SwTableBox *m_pCachedStartOfRowSpan;
++  int m_nChachedBoxRow;
++  int m_nChachedBoxCol;
++  int m_nChachedRowCellx[MAXCELLX];
++  int m_nChachedRowCells;
++  int m_nChachedBoxCellx;
++
++private:
++  void ensure(sal_Bool exp) throw (::com::sun::star::uno::RuntimeException);
++  void moveTo(SwNodeIndex *startIdx, SwNodeIndex *endIdx);
++  void update(xub_StrLen parOfs=0);
++  int calcCellXForRow(SwTable *pTable, SwTableLine *pRow, int *cellx);
++  int calcGridForTable(SwTable *pTable, int *cellx);
++  sal_Bool getFlys( sal_Int32& start, sal_Int32& end );
++  sal_Int32 getFlyAnchorTxtOfs( sal_Int32 fly );
++  void ensureCellCache(int row, int col);
++
++
++public:
++  SwDocumentProvider(SwDocShell* pShell, SwDocumentProvider *pParent=NULL);
++  virtual ~SwDocumentProvider();
++
++  virtual void SAL_CALL moveToMainContent(  ) throw (::com::sun::star::uno::RuntimeException);
++  virtual ::sal_Bool SAL_CALL hasNode(  ) throw (::com::sun::star::uno::RuntimeException);
++  virtual ::sal_Bool SAL_CALL isTxtNode(  ) throw (::com::sun::star::uno::RuntimeException);
++  virtual ::sal_Bool SAL_CALL isTableNode(  ) throw (::com::sun::star::uno::RuntimeException);
++  virtual void SAL_CALL consume(  ) throw (::com::sun::star::uno::RuntimeException);
++  virtual ::sal_Int32 SAL_CALL getNodeIndex(  ) throw (::com::sun::star::uno::RuntimeException);
++  virtual void SAL_CALL getSectionPr( ::sal_Int32 idx, ::com::sun::star::uno::Sequence< ::sal_Int32 >& dxaColumns ) throw (::com::sun::star::uno::RuntimeException);
++
++  virtual ::sal_Int32 SAL_CALL getColumns(  ) throw (::com::sun::star::uno::RuntimeException);
++  virtual ::sal_Int32 SAL_CALL getColumn( ::sal_Int32 i ) throw (::com::sun::star::uno::RuntimeException);
++  virtual ::sal_Int32 SAL_CALL getRows(  ) throw (::com::sun::star::uno::RuntimeException);
++  virtual ::sal_Int32 SAL_CALL getRowSpan( ::sal_Int32 row, ::sal_Int32 column ) throw (::com::sun::star::uno::RuntimeException);
++  virtual ::sal_Int32 SAL_CALL getColSpan( ::sal_Int32 row, ::sal_Int32 column ) throw (::com::sun::star::uno::RuntimeException);
++
++  virtual ::com::sun::star::uno::Reference< ::org::openoffice::DocumentProvider > SAL_CALL openCell( ::sal_Int32 row, ::sal_Int32 column ) throw (::com::sun::star::uno::RuntimeException) ;
++  
++  virtual ::com::sun::star::uno::Reference< ::org::openoffice::DocumentProvider > SAL_CALL openFly( ::sal_Int32 fly ) throw (::com::sun::star::uno::RuntimeException) ;
++  virtual ::sal_Bool SAL_CALL getFlyPositionRelativeToPage( ::sal_Int32 fly, ::sal_Int32& x, ::sal_Int32& y, ::sal_Int32& w, ::sal_Int32& h ) throw (::com::sun::star::uno::RuntimeException);
++  
++  virtual ::rtl::OUString SAL_CALL getTxt(  ) throw (::com::sun::star::uno::RuntimeException);
++  virtual ::sal_Int32 SAL_CALL getTxtLen(  ) throw (::com::sun::star::uno::RuntimeException);
++  virtual ::sal_Int32 SAL_CALL getTxtOfs(  ) throw (::com::sun::star::uno::RuntimeException);
++  virtual ::sal_Int32 SAL_CALL loadPortion( ::sal_Int32 ofs ) throw (::com::sun::star::uno::RuntimeException);
++  virtual ::sal_Bool SAL_CALL checkFlys( ::sal_Int32& ofsStart, ::sal_Int32& ofsEnd, ::sal_Int32& flyStart, ::sal_Int32& flyEnd ) throw (::com::sun::star::uno::RuntimeException);
++
++  virtual ::sal_Int8 SAL_CALL getFontWeight(  ) throw (::com::sun::star::uno::RuntimeException);
++  virtual ::sal_Int8 SAL_CALL getBreakType(  ) throw (::com::sun::star::uno::RuntimeException);
++};
++
++
++
++#endif /*  _OOAPI_HXX */
+diff --git a/sw/inc/unotxdoc.hxx b/sw/inc/unotxdoc.hxx
+index 7016cf0..119dcd9 100644
+--- a/sw/inc/unotxdoc.hxx
++++ b/sw/inc/unotxdoc.hxx
+@@ -71,6 +71,7 @@
+ #ifndef _COM_SUN_STAR_DOCUMENT_XDOCUMENTLANGUAGES_HPP
+ #include <com/sun/star/document/XDocumentLanguages.hpp>
+ #endif
++#include <org/openoffice/DocumentBuilderSupplier.hpp>
+ #include <svtools/itemprop.hxx>
+ #include <svx/fmdmod.hxx>
+ #include <svx/UnoForbiddenCharsTable.hxx>
+@@ -79,22 +80,22 @@
+ #include <cppuhelper/implbase4.hxx>	// helper for implementations
+ #include <RefreshListenerContainer.hxx>
+ 
+-#define __IFC31 Ifc1, Ifc2, Ifc3, Ifc4, Ifc5, Ifc6, Ifc7, Ifc8, Ifc9, Ifc10, Ifc11, Ifc12, Ifc13, Ifc14, Ifc15, Ifc16, \
+-Ifc17, Ifc18, Ifc19, Ifc20, Ifc21, Ifc22, Ifc23, Ifc24, Ifc25, Ifc26, Ifc27, Ifc28, Ifc29, Ifc30, Ifc31
++#define __IFC32 Ifc1, Ifc2, Ifc3, Ifc4, Ifc5, Ifc6, Ifc7, Ifc8, Ifc9, Ifc10, Ifc11, Ifc12, Ifc13, Ifc14, Ifc15, Ifc16, \
++Ifc17, Ifc18, Ifc19, Ifc20, Ifc21, Ifc22, Ifc23, Ifc24, Ifc25, Ifc26, Ifc27, Ifc28, Ifc29, Ifc30, Ifc31, Ifc32
+ 
+-#define __CLASS_IFC31 class Ifc1, class Ifc2, class Ifc3, class Ifc4, class Ifc5, class Ifc6, class Ifc7, \
++#define __CLASS_IFC32 class Ifc1, class Ifc2, class Ifc3, class Ifc4, class Ifc5, class Ifc6, class Ifc7, \
+ class Ifc8, class Ifc9, class Ifc10, class Ifc11, class Ifc12, class Ifc13, class Ifc14, class Ifc15, class Ifc16, \
+ class Ifc17, class Ifc18, class Ifc19, class Ifc20, class Ifc21, class Ifc22, class Ifc23, class Ifc24,\
+-class Ifc25, class Ifc26, class Ifc27, class Ifc28, class Ifc29, class Ifc30, class Ifc31
++class Ifc25, class Ifc26, class Ifc27, class Ifc28, class Ifc29, class Ifc30, class Ifc31, class Ifc32
+ 
+-#define __PUBLIC_IFC31 public Ifc1, public Ifc2, public Ifc3, public Ifc4, public Ifc5, public Ifc6, public Ifc7, public Ifc8, public Ifc9, public Ifc10, public Ifc11, public Ifc12, \
++#define __PUBLIC_IFC32 public Ifc1, public Ifc2, public Ifc3, public Ifc4, public Ifc5, public Ifc6, public Ifc7, public Ifc8, public Ifc9, public Ifc10, public Ifc11, public Ifc12, \
+ public Ifc13, public Ifc14, public Ifc15, public Ifc16, public Ifc17, public Ifc18, \
+ public Ifc19, public Ifc20, public Ifc21, public Ifc22, public Ifc23, public Ifc24, \
+ public Ifc25, public Ifc26, public Ifc27, public Ifc28, public Ifc29, public Ifc30, \
+-public Ifc31
++public Ifc31, public Ifc32
+ #include <cppuhelper/implbase_ex.hxx>
+ #include <cppuhelper/implbase_ex_pre.hxx>
+-#define __IFC_EX_TYPE_INIT31( class_cast ) \
++#define __IFC_EX_TYPE_INIT32( class_cast ) \
+     __IFC_EX_TYPE_INIT( class_cast, 1 ), __IFC_EX_TYPE_INIT( class_cast, 2 ), \
+     __IFC_EX_TYPE_INIT( class_cast, 3 ), __IFC_EX_TYPE_INIT( class_cast, 4 ), \
+     __IFC_EX_TYPE_INIT( class_cast, 5 ), __IFC_EX_TYPE_INIT( class_cast, 6 ), \
+@@ -110,10 +111,10 @@ public Ifc31
+     __IFC_EX_TYPE_INIT( class_cast, 25 ), __IFC_EX_TYPE_INIT( class_cast, 26 ), \
+     __IFC_EX_TYPE_INIT( class_cast, 27 ), __IFC_EX_TYPE_INIT( class_cast, 28 ), \
+     __IFC_EX_TYPE_INIT( class_cast, 29 ), __IFC_EX_TYPE_INIT( class_cast, 30 ), \
+-    __IFC_EX_TYPE_INIT( class_cast, 31)
++    __IFC_EX_TYPE_INIT( class_cast, 31 ), __IFC_EX_TYPE_INIT( class_cast, 32 )
+ #include <cppuhelper/implbase_ex_post.hxx>
+ 
+-__DEF_IMPLHELPER_EX( 31 )
++__DEF_IMPLHELPER_EX( 32 )
+ 
+ class SwDoc;
+ class SwDocShell;
+@@ -132,7 +133,7 @@ SV_DECL_PTRARR(ActionContextArr, UnoActionContextPtr, 4, 4)
+  ******************************************************************************/
+ 
+ 
+-typedef cppu::WeakImplHelper31
++typedef cppu::WeakImplHelper32
+ <
+     ::com::sun::star::text::XTextDocument,
+     ::com::sun::star::text::XLineNumberingProperties,
+@@ -164,7 +165,8 @@ typedef cppu::WeakImplHelper31
+     ::com::sun::star::view::XRenderable,
+     ::com::sun::star::xforms::XFormsSupplier,
+     ::com::sun::star::text::XFlatParagraphIteratorProvider,
+-    ::com::sun::star::document::XDocumentLanguages
++    ::com::sun::star::document::XDocumentLanguages,
++    ::org::openoffice::DocumentBuilderSupplier
+ >
+ SwXTextDocumentBaseClass;
+ 
+@@ -402,6 +404,10 @@ public:
+     // ::com::sun::star::text::XFlatParagraphIteratorProvider:
+     virtual ::com::sun::star::uno::Reference< ::com::sun::star::text::XFlatParagraphIterator > SAL_CALL getFlatParagraphIterator(::sal_Int32 nTextMarkupType, sal_Bool bAutomatic ) throw (::com::sun::star::uno::RuntimeException);
+ 
++    // ::org:openoffice::DocumentBuilderSupplier
++    virtual ::com::sun::star::uno::Reference< ::org::openoffice::DocumentBuilder > SAL_CALL createDocumentBuilder(  ) throw (::com::sun::star::uno::RuntimeException);
++    virtual ::com::sun::star::uno::Reference< ::org::openoffice::DocumentProvider > SAL_CALL createDocumentProvider(  ) throw (::com::sun::star::uno::RuntimeException);
++
+     //
+     void						Invalidate();
+     void						Reactivate(SwDocShell* pNewDocShell);
+diff --git a/sw/prj/build.lst b/sw/prj/build.lst
+index 0b5f70b..883335a 100644
+--- a/sw/prj/build.lst
++++ b/sw/prj/build.lst
+@@ -58,6 +58,7 @@ sw	sw\source\core\txtnode					nmake	-	all	sw_txtnd sw_inc NULL
+ sw	sw\source\core\undo						nmake	-	all	sw_undo sw_inc NULL
+ sw	sw\source\core\view						nmake	-	all	sw_view sw_inc NULL
+ sw	sw\source\core\unocore					nmake	-	all	sw_uco sw_inc NULL
++sw	sw\source\core\ooapi					nmake	-	all	sw_ooapi sw_inc NULL
+ sw      sw\source\core\objectpositioning                                nmake   -       all     sw_objpos sw_inc NULL
+ sw  sw\source\core\access                   nmake   -   all sw_acc sw_inc NULL
+ sw  sw\source\core\SwNumberTree             nmake   -   all sw_NumberTree sw_inc NULL
+diff --git a/sw/source/core/makefile.mk b/sw/source/core/makefile.mk
+index d9ea110..4db3fc7 100644
+--- a/sw/source/core/makefile.mk
++++ b/sw/source/core/makefile.mk
+@@ -69,6 +69,7 @@ SUBLIBS2= \
+ SUBLIBS3= \
+         $(SLB)$/docnode.lib \
+                 $(SLB)$/unocore.lib \
++		$(SLB)$/ooapi.lib \
+                 $(SLB)$/objectpositioning.lib \
+                 $(SLB)$/SwNumberTree.lib \
+                 $(SLB)$/tablecore.lib
+diff --git a/sw/source/core/ooapi/SwDocumentBuilder.cxx b/sw/source/core/ooapi/SwDocumentBuilder.cxx
+new file mode 100644
+index 0000000..9b728a6
+--- /dev/null
++++ b/sw/source/core/ooapi/SwDocumentBuilder.cxx
+@@ -0,0 +1,25 @@
++#include <ooapi.hxx>
++#include <wdocsh.hxx>
++#include <doc.hxx>
++#include <pam.hxx>
++#include <swtable.hxx>
++#include <swtblfmt.hxx>
++#include <poolfmt.hxx>
++
++
++#include <stdio.h>
++
++SwDocumentBuilder::SwDocumentBuilder(SwDocShell* pShell) 
++  : m_pShell(pShell), m_pDoc(pShell!=NULL?pShell->GetDoc():NULL) {
++  printf("DOCUMENT BUILDER!!!!\n");
++
++  SwNodeIndex nNode( m_pDoc->GetNodes().GetEndOfContent(), -1 );
++  SwPaM aPaM( nNode );
++  SwNodeIndex aIndex(*aPaM.GetNode());
++  m_pDoc->Insert(aPaM, String::CreateFromAscii("HELLO"), false);
++
++}
++
++SwDocumentBuilder::~SwDocumentBuilder() {
++
++}
+diff --git a/sw/source/core/ooapi/SwDocumentProvider.cxx b/sw/source/core/ooapi/SwDocumentProvider.cxx
+new file mode 100644
+index 0000000..1938a0c
+--- /dev/null
++++ b/sw/source/core/ooapi/SwDocumentProvider.cxx
+@@ -0,0 +1,554 @@
++#include <ooapi.hxx>
++#include <wdocsh.hxx>
++#include <doc.hxx>
++#include <pam.hxx>
++#include <swtable.hxx>
++#include <swtblfmt.hxx>
++#include <poolfmt.hxx>
++#include <ndhints.hxx>
++#include <ndtxt.hxx>
++#include <txatbase.hxx>
++#include <fmtautofmt.hxx>
++#include <hintids.hxx>
++#include <../text/itratr.hxx>
++#include <svx/wghtitem.hxx>
++#include <fmtfsize.hxx>
++#include <svx/lrspitem.hxx>
++#include <frmatr.hxx>
++#include <flypos.hxx>
++#include <fmtanchr.hxx>
++#include <section.hxx>
++#include <fmtclds.hxx>
++#include <pagedesc.hxx>
++#include <fmtcntnt.hxx>
++
++#include <stdio.h>
++
++int cmp_SwPosFlyFrm(const void *a, const void *b) {
++  const SwPosFlyFrm *pFly1=*((const SwPosFlyFrm **)a);
++  const SwPosFlyFrm *pFly2=*((const SwPosFlyFrm **)b);
++  int idx1=pFly1->GetNdIndex().GetIndex();
++  int idx2=pFly2->GetNdIndex().GetIndex();
++  if (idx1==idx2) {
++    const SwFrmFmt &rFlyFmt1=pFly1->GetFmt();
++    const SwFrmFmt &rFlyFmt2=pFly2->GetFmt();
++    const SwFmtAnchor &rFlyAnchor1=rFlyFmt1.GetAnchor();
++    const SwFmtAnchor &rFlyAnchor2=rFlyFmt2.GetAnchor();
++    const SwPosition *pFlyAnchorPos1=rFlyAnchor1.GetCntntAnchor();
++    const SwPosition *pFlyAnchorPos2=rFlyAnchor2.GetCntntAnchor();
++    int ofs1=(pFlyAnchorPos1!=NULL?(int)pFlyAnchorPos1->nContent.GetIndex():0);
++    int ofs2=(pFlyAnchorPos2!=NULL?(int)pFlyAnchorPos2->nContent.GetIndex():0);
++    if (ofs1==ofs2) {
++      return (int)(pFly1-pFly2);
++    } else {
++      return ofs1-ofs2;
++    }
++  } else {
++    return idx1-idx2;
++  }
++}
++
++SwDocumentProvider::SwDocumentProvider(SwDocShell* pShell, 
++				       SwDocumentProvider *pParent) 
++  : m_pShell(pShell), m_pDoc(pShell!=NULL?pShell->GetDoc():NULL),
++    m_pFlyFrms(NULL),
++    m_pNodeIndex(NULL), m_pEndIndex(NULL), m_pPos(NULL), 
++    m_pFlyStart(0), m_pFlyEnd(0),
++    m_pAttrItr(NULL), m_pScriptInfo(NULL), m_pItemSet(NULL), 
++    m_nTableGridX(0),
++    m_pCachedBox(NULL), m_nChachedBoxRow(0), m_nChachedBoxCol(0), m_nChachedRowCells(0) {
++  if (m_pDoc){ 
++    m_pItemSet=new SfxItemSet(m_pDoc->GetAttrPool(), TRUE);
++    m_pFlyFrms=new SwPosFlyFrms();
++    m_pDoc->GetAllFlyFmts(*m_pFlyFrms, NULL, sal_True);
++    const SwPosFlyFrm * const *pData=m_pFlyFrms->GetData();
++    qsort((void*)pData, 
++	  m_pFlyFrms->Count(), 
++	  sizeof(const SwPosFlyFrm *), 
++	  cmp_SwPosFlyFrm);
++    for(int i=0;i<(int)m_pFlyFrms->Count();i++) {
++      const SwPosFlyFrm *pFlyFrm=(*m_pFlyFrms)[i];
++      const SwFrmFmt &rFlyFmt=pFlyFrm->GetFmt();
++      SwRect aLayRect(rFlyFmt.FindLayoutRect());
++      const SwFmtAnchor &rFlyAnchor=rFlyFmt.GetAnchor();
++      const SwPosition *pFlyAnchorPos=rFlyAnchor.GetCntntAnchor();
++      SwRect aPageRect( pFlyFrm->GetNdIndex().GetNode().GetCntntNode()->FindPageFrmRect());
++      printf("#%i: %i %i[%i (%li, %li, %li, %li)(%li, %li, %li, %li)]:%p\n", i, (int)pFlyFrm->GetNdIndex().GetIndex(), 
++	     (pFlyAnchorPos!=NULL?(int)pFlyAnchorPos->nContent.GetIndex():-1),
++	     aLayRect.IsEmpty(), 
++	     aLayRect.Left(), aLayRect.Top(), aLayRect.Width(), aLayRect.Height(),
++	     aPageRect.Left(), aPageRect.Top(), aPageRect.Width(), aPageRect.Height(),
++	     pFlyFrm);
++    }    
++  }
++}
++
++SwDocumentProvider::~SwDocumentProvider() {
++  if (m_pNodeIndex!=NULL) {
++    delete m_pNodeIndex;
++  }
++  if (m_pEndIndex!=NULL) {
++    delete m_pEndIndex;
++  }
++  if (m_pPos!=NULL) {
++    delete m_pPos;
++  }
++  if (m_pAttrItr!=NULL) {
++    delete m_pAttrItr;
++  }
++  if (m_pScriptInfo!=NULL) {
++    delete m_pScriptInfo;
++  }
++  if (m_pItemSet!=NULL) {
++    delete m_pItemSet;
++  }
++  if (m_pFlyFrms!=NULL) {
++    delete m_pFlyFrms;
++  }
++}
++
++void SwDocumentProvider::ensure(sal_Bool exp) throw (::com::sun::star::uno::RuntimeException) {
++ 
++}
++
++int SwDocumentProvider::calcCellXForRow(SwTable *pTable, SwTableLine *pRow, int *cellx) {
++  int c=-1;
++  const SwFrmFmt *pTableFmt = pTable->GetFrmFmt();
++  cellx[0]=pTable->GetFrmFmt()->GetLRSpace().GetLeft();
++  for(c=0;c<pRow->GetTabBoxes().Count() && c<MAXCELLX;c++) {
++    SwTableBox *pBox=pRow->GetTabBoxes()[c];
++    int rowSpan=(int)pBox->getRowSpan();
++    const SwFrmFmt* pBoxFmt = pBox->GetFrmFmt();
++    //    Point aPt;
++    SwRect aBoxRect( pBoxFmt->FindLayoutRect( false /*,&aPt*/ ));
++    cellx[c+1]=cellx[c]+aBoxRect.Width();
++  }
++  return c+1;
++}
++
++int SwDocumentProvider::calcGridForTable(SwTable *pTable, int *cellx_) {
++    int gridx[2][MAXCELLX];
++    int ngridx[2] = {0 ,0 };
++    int ga=0;
++    int gn=1;
++    printf("pTable=%p\n", pTable);
++    printf("nRows=%i\n", (int)pTable->GetTabLines().Count());
++    for(int r=0;r<pTable->GetTabLines().Count();r++) {
++      SwTableLine *pRow=pTable->GetTabLines()[r];
++      int cellx[MAXCELLX];
++      int ncellx=calcCellXForRow(pTable, pRow, cellx);
++      ngridx[gn]=0;
++      int i=0;
++      int j=0;
++
++      printf("ngridx[ga]=%i\n", ngridx[ga]);
++      for(int k=0;k<ngridx[ga];k++) {
++	printf("<%i> ", gridx[ga][k]);
++      }
++      printf("\n");
++      for(int k=0;k<ncellx;k++) {
++	printf("%i ", cellx[k]);
++      }
++      printf("\n");
++
++
++      while(i<ncellx && j<ngridx[ga] && ngridx[gn]<MAXCELLX) {
++	if (cellx[i]==gridx[ga][j]) {
++	  gridx[gn][ngridx[gn]++]=cellx[i];
++	  i++; j++;
++	} else if (cellx[i]<gridx[ga][j]) {
++	  gridx[gn][ngridx[gn]++]=cellx[i];
++	  i++;
++	} else {
++	  gridx[gn][ngridx[gn]++]=gridx[ga][j];
++	  j++;
++	}
++      }
++      for(;i<ncellx  && ngridx[gn]<MAXCELLX;i++) {
++	  gridx[gn][ngridx[gn]++]=cellx[i];
++      }
++      for(;j<ngridx[ga] && ngridx[gn]<MAXCELLX;j++) {
++	  gridx[gn][ngridx[gn]++]=gridx[ga][j];
++      }
++      for(int k=0;k<ngridx[gn];k++) {
++	printf("<%i> ", gridx[gn][k]);
++      }
++      printf("\n");
++
++      { int dummy=gn; gn=ga; ga=dummy; }
++    }
++    printf("ngridx[ga]=%i\n", ngridx[ga]);
++    for(int i=0;i<ngridx[ga];i++) {
++      cellx_[i]=gridx[ga][i];
++      printf("[%i] ", gridx[ga][i]);
++    }
++    printf("\n");
++    return ngridx[ga];
++}
++
++
++
++void SwDocumentProvider::update(xub_StrLen parOfs) {
++  if (m_pAttrItr!=NULL) { delete m_pAttrItr; m_pAttrItr=NULL; }
++  if (m_pScriptInfo!=NULL) { delete m_pScriptInfo; m_pScriptInfo=NULL; }
++  if (m_pPos!=NULL) { delete m_pPos; m_pPos=NULL; }
++  m_pFlyStart=m_pFlyEnd=0;
++  m_pCachedBox=NULL;  m_nChachedBoxRow=m_nChachedBoxCol=0; m_nChachedRowCells=0;
++
++  if (m_pNodeIndex!=NULL && m_pNodeIndex->GetNode().GetCntntNode()!=NULL) {
++    m_pPos=new SwPosition(*m_pNodeIndex->GetNode().GetCntntNode(), SwIndex(m_pNodeIndex->GetNode().GetCntntNode(), parOfs));
++  }
++  
++  if (m_pPos!=NULL && m_pPos->nNode.GetNode().IsTxtNode()) {    
++    SwTxtNode *pTxtNode= m_pPos->nNode.GetNode().GetTxtNode();
++    m_pScriptInfo=new SwScriptInfo();
++    m_pAttrItr=new SwAttrIter(*pTxtNode, *m_pScriptInfo);    
++    getFlys(m_pFlyStart, m_pFlyEnd);
++  }
++
++  m_nTableGridX=0;
++  if (m_pNodeIndex!=NULL && m_pNodeIndex->GetNode().IsTableNode()) {
++    SwTable *pTable=&m_pNodeIndex->GetNode().GetTableNode()->GetTable();
++    m_nTableGridX=calcGridForTable(pTable, m_tableGridX);
++  }
++}
++
++void SAL_CALL SwDocumentProvider::moveToMainContent(  ) throw (::com::sun::star::uno::RuntimeException) {
++  moveTo(new SwNodeIndex( m_pDoc->GetNodes().GetEndOfExtras(), 2 ),
++	 new SwNodeIndex( m_pDoc->GetNodes().GetEndOfContent()));
++}
++
++void SwDocumentProvider::moveTo(SwNodeIndex *startIdx, SwNodeIndex *endIdx) {
++  if (m_pNodeIndex!=NULL) delete m_pNodeIndex;
++  if (m_pEndIndex!=NULL) delete m_pEndIndex;
++  m_pNodeIndex=startIdx;
++  m_pEndIndex=endIdx;
++  update();
++}
++
++::rtl::OUString SAL_CALL SwDocumentProvider::getTxt(  ) throw (::com::sun::star::uno::RuntimeException) {
++  ::rtl::OUString ret;
++  if (m_pPos!=NULL && m_pPos->nNode.GetNode().IsTxtNode()) {
++    ret=m_pPos->nNode.GetNode().GetTxtNode()->GetTxt();
++  }
++  return ret;
++}
++
++::sal_Int32 SAL_CALL SwDocumentProvider::getTxtLen(  ) throw (::com::sun::star::uno::RuntimeException) {
++  return (m_pPos!=NULL && m_pPos->nNode.GetNode().IsTxtNode()
++	  ? m_pPos->nNode.GetNode().GetTxtNode()->Len()
++	  : 0);
++}
++
++::sal_Int32 SAL_CALL SwDocumentProvider::getTxtOfs(  ) throw (::com::sun::star::uno::RuntimeException) {
++  return 0; //@TODO return ofs from pos..
++}
++
++::sal_Bool SAL_CALL SwDocumentProvider::checkFlys( ::sal_Int32& ofsStart, ::sal_Int32& ofsEnd, ::sal_Int32& flyStart, ::sal_Int32& flyEnd ) throw (::com::sun::star::uno::RuntimeException) {
++  printf("ofsStart=%i ofsEnd=%i\n", (int)ofsStart, (int)ofsEnd);
++  ::sal_Bool ret=sal_False;
++  flyStart=std::max(flyStart, m_pFlyStart);
++  flyEnd=flyStart;
++  if (m_pFlyStart<m_pFlyEnd) {
++    sal_Int32 flyOfs=ofsEnd;
++    while(flyStart<m_pFlyEnd && (flyOfs=getFlyAnchorTxtOfs(flyStart))<ofsStart) flyStart++;
++    if (flyStart<m_pFlyEnd && flyOfs==ofsStart && flyOfs<ofsEnd) {
++      // we have flys in the range      
++      flyEnd=flyStart+1;
++      while(flyEnd<m_pFlyEnd && (flyOfs=getFlyAnchorTxtOfs(flyEnd))==ofsStart) flyEnd++;
++      if (flyEnd<m_pFlyEnd)
++	ofsEnd=std::min(ofsEnd, flyOfs);
++      ret=sal_True;
++    } else if (flyStart<m_pFlyEnd && flyOfs>ofsStart && flyOfs<ofsEnd){
++      ofsEnd=flyOfs;
++      flyEnd=flyStart;
++    }
++  }
++  printf("ofsStart=%i ofsEnd=%i\n", (int)ofsStart, (int)ofsEnd);
++  return ret;
++}
++
++::sal_Int32 SAL_CALL SwDocumentProvider::loadPortion( ::sal_Int32 ofs ) throw (::com::sun::star::uno::RuntimeException) {
++  if (m_pPos!=NULL 
++      && m_pPos->nNode.GetNode().IsTxtNode() 
++      && m_pAttrItr!=NULL) {    
++    SwTxtNode *pTxtNode= m_pPos->nNode.GetNode().GetTxtNode();
++    const String &_txt=pTxtNode->GetTxt();
++    const sal_Unicode* _txtBuf=_txt.GetBuffer();
++    xub_StrLen txtLen=pTxtNode->Len();
++    m_pAttrItr->Seek(ofs);
++    xub_StrLen nextOfs=m_pAttrItr->GetNextAttr();
++    if (nextOfs>txtLen) nextOfs=txtLen;
++    { // looks for a special char
++      int _ofs=ofs;
++      while(_ofs<nextOfs && _txtBuf[_ofs]>=32) _ofs++;
++      if (_ofs==ofs && _ofs<nextOfs) _ofs++;
++      nextOfs=_ofs;
++    }
++    if (m_pItemSet!=NULL) {
++      m_pItemSet->ClearItem(0); // all
++      pTxtNode->GetAttr(*m_pItemSet, ofs, nextOfs);
++    }
++    return nextOfs;
++  } else {
++    return -1; 
++  }
++}
++
++::sal_Int8 SAL_CALL SwDocumentProvider::getFontWeight(  ) throw (::com::sun::star::uno::RuntimeException) {
++  ::sal_Int8 ret=0;
++  const SvxWeightItem * pWeight=(SvxWeightItem*)(m_pItemSet!=NULL?m_pItemSet->GetItem(RES_CHRATR_WEIGHT, FALSE):NULL);
++  if (pWeight!=NULL) {
++    switch(pWeight->GetWeight()) {
++    case WEIGHT_DONTKNOW: ret=0; break;
++    default: ret=100; break;
++    }
++  }
++  return ret;
++}
++
++
++::sal_Bool SAL_CALL SwDocumentProvider::hasNode(  ) throw (::com::sun::star::uno::RuntimeException) {
++  return m_pNodeIndex!=NULL && m_pEndIndex!=NULL
++    && *m_pNodeIndex<*m_pEndIndex;
++}
++
++::sal_Bool SAL_CALL SwDocumentProvider::isTxtNode(  ) throw (::com::sun::star::uno::RuntimeException) {
++  return m_pNodeIndex!=NULL && m_pNodeIndex->GetNode().IsTxtNode();
++}
++
++::sal_Bool SAL_CALL SwDocumentProvider::isTableNode(  ) throw (::com::sun::star::uno::RuntimeException) {
++  return m_pNodeIndex!=NULL && m_pNodeIndex->GetNode().IsTableNode();
++}
++
++::sal_Int32 SAL_CALL SwDocumentProvider::getNodeIndex(  ) throw (::com::sun::star::uno::RuntimeException) {
++  return m_pNodeIndex!=NULL?m_pNodeIndex->GetIndex():-1;
++}
++
++
++void SAL_CALL SwDocumentProvider::consume(  ) throw (::com::sun::star::uno::RuntimeException) {
++  if (m_pNodeIndex!=NULL && m_pEndIndex!=NULL && *m_pNodeIndex<*m_pEndIndex) {
++    if (m_pNodeIndex->GetNode().IsTableNode()) {
++      SwTableNode *pTableNode=m_pNodeIndex->GetNode().GetTableNode();
++      *m_pNodeIndex=*pTableNode->EndOfSectionNode();
++      (*m_pNodeIndex)++;
++    } else {
++      (*m_pNodeIndex)++; // consume node
++    }
++  }  
++  while(m_pNodeIndex!=NULL && m_pEndIndex!=NULL && // skip section and endnodes
++	*m_pNodeIndex<*m_pEndIndex && 
++	(m_pNodeIndex->GetNode().IsSectionNode() || 
++	 m_pNodeIndex->GetNode().IsEndNode())) {
++    (*m_pNodeIndex)++;
++  }
++  
++  update();
++}
++
++
++::sal_Int32 SAL_CALL SwDocumentProvider::getColumns(  ) throw (::com::sun::star::uno::RuntimeException) {
++  return m_nTableGridX-1;
++}
++
++
++::sal_Int32 SAL_CALL SwDocumentProvider::getColumn( ::sal_Int32 i ) throw (::com::sun::star::uno::RuntimeException) {
++  return 0;
++}
++
++::sal_Int32 SAL_CALL SwDocumentProvider::getRows(  ) throw (::com::sun::star::uno::RuntimeException) {
++ if (m_pNodeIndex!=NULL && m_pNodeIndex->GetNode().IsTableNode()) {
++   SwTable *pTable=&m_pNodeIndex->GetNode().GetTableNode()->GetTable();
++   return pTable->GetTabLines().Count();
++ } else {
++   return 0;
++ }
++}
++
++void SwDocumentProvider::ensureCellCache(int row, int col) {
++  if (m_pCachedBox!=NULL && m_nChachedBoxRow==row && m_nChachedBoxCol==col) {
++    // cache hit
++  } else {
++    if (m_pNodeIndex!=NULL && m_pNodeIndex->GetNode().IsTableNode()) {
++      SwTable *pTable=&m_pNodeIndex->GetNode().GetTableNode()->GetTable();
++      const SwFrmFmt *pTableFmt = (pTable!=NULL?pTable->GetFrmFmt():NULL);
++      if (pTable!=NULL && pTableFmt!=NULL && row>=0 && row<pTable->GetTabLines().Count() && col>0 && col<m_nTableGridX) {
++	SwTableLine *pRow=pTable->GetTabLines()[row];
++	if (pRow!=NULL) {    
++	  if (m_pCachedBox!=NULL && row==m_nChachedBoxRow) {
++	    // cache hit
++	  } else {
++	    m_nChachedRowCells=calcCellXForRow(pTable, pRow, m_nChachedRowCellx);
++	  }
++	  ensure(m_nChachedRowCells<=m_nTableGridX);
++	  int c=1;
++	  while(c<m_nChachedRowCells && m_nChachedRowCellx[c-1]<m_tableGridX[col-1]) c++;	  
++	  ensure(c>0 && c<m_nChachedRowCells); // is has to be in the grid!
++
++	  m_nChachedBoxCellx=c;
++	  m_nChachedBoxRow=row;
++	  m_nChachedBoxCol=col;
++	  m_pCachedBox=pRow->GetTabBoxes()[m_nChachedBoxCellx-1];
++	  m_pCachedStartOfRowSpan=&m_pCachedBox->FindStartOfRowSpan(*pTable);
++	}
++      }
++    }
++  }
++}
++
++::com::sun::star::uno::Reference< ::org::openoffice::DocumentProvider > SAL_CALL SwDocumentProvider::openCell( ::sal_Int32 row, ::sal_Int32 column ) throw (::com::sun::star::uno::RuntimeException) {
++  SwDocumentProvider *ret=NULL;
++  ensureCellCache(row, column+1); // +1 because cellx[0] is the left indent
++  if (m_pCachedBox!=NULL 
++      && m_pCachedBox==m_pCachedStartOfRowSpan // make sure this is not a covered cell
++      && m_nChachedRowCellx[m_nChachedBoxCellx-1]==m_tableGridX[column]) {
++    const SwStartNode *pCellStart=m_pCachedBox->GetSttNd();
++    const SwEndNode *pCellEnd=pCellStart->EndOfSectionNode();
++    ret=new SwDocumentProvider(m_pShell, this);
++    ret->moveTo(new SwNodeIndex(*pCellStart, 1), 
++		new SwNodeIndex(*pCellEnd));
++  }
++  return ret;
++}
++
++::sal_Int32 SAL_CALL SwDocumentProvider::getRowSpan( ::sal_Int32 row, ::sal_Int32 column ) throw (::com::sun::star::uno::RuntimeException) {
++  ensureCellCache(row, column+1);
++  if (m_pCachedBox!=NULL) {
++    return m_pCachedBox->getRowSpan();
++  } else {
++    return 0;
++  }
++}
++
++::sal_Int32 SAL_CALL SwDocumentProvider::getColSpan( ::sal_Int32 row, ::sal_Int32 column ) throw (::com::sun::star::uno::RuntimeException) {
++  ensureCellCache(row, column+1);
++  if (m_pCachedBox!=NULL) {
++    int span=1;
++    while(column+span<m_nTableGridX 
++	  && m_tableGridX[column+span]<m_nChachedRowCellx[m_nChachedBoxCellx]) 
++      span++;
++    return span;
++  } else {
++    return 0;
++  }
++}
++
++
++
++::sal_Bool SwDocumentProvider::getFlys( ::sal_Int32& start, ::sal_Int32& end ) {
++  start=m_pFlyFrms->Count();
++  end=m_pFlyFrms->Count();
++  if (m_pNodeIndex!=NULL && m_pNodeIndex->GetNode().IsCntntNode()) {
++    //@TODO!!! the m_pFlyFrms is sorted by the index, so a binary search
++    //         is the way to go here....
++    for(int i=0;i<m_pFlyFrms->Count();i++) {
++      const SwPosFlyFrm *pFlyFrm=(*m_pFlyFrms)[i];
++      if (pFlyFrm->GetNdIndex()==*m_pNodeIndex) {
++	start=i; break;
++      }      
++    }
++    if (start<m_pFlyFrms->Count()) {
++      end=start;
++      do {
++	end++;
++      } while(end<m_pFlyFrms->Count() && (*m_pFlyFrms)[end]->GetNdIndex()==*m_pNodeIndex);
++    }
++  } 
++  return start<end;
++}
++
++::com::sun::star::uno::Reference< ::org::openoffice::DocumentProvider > SAL_CALL SwDocumentProvider::openFly( ::sal_Int32 fly ) throw (::com::sun::star::uno::RuntimeException) {
++  SwDocumentProvider *ret=NULL;
++  const SwPosFlyFrm *pFlyFrm=(m_pFlyFrms!=NULL && fly>=0 && fly<m_pFlyFrms->Count()?(*m_pFlyFrms)[fly]:NULL);
++  if (pFlyFrm!=NULL) {
++    const SwFrmFmt &rFlyFmt=pFlyFrm->GetFmt();
++    const SwFmtCntnt &rCntnt = rFlyFmt.GetCntnt();
++    const SwNodeIndex *pStartIdx=rCntnt.GetCntntIdx();
++    if (pStartIdx!=NULL && pStartIdx->GetNode().IsStartNode()) {
++      const SwEndNode *pEndNode=pStartIdx->GetNode().GetStartNode()->EndOfSectionNode();
++      ret=new SwDocumentProvider(m_pShell, this);
++      ret->moveTo(new SwNodeIndex(*pStartIdx, 1), 
++      		  new SwNodeIndex(*pEndNode));
++    }
++  };
++
++  return ret;
++}
++
++::sal_Int32 SwDocumentProvider::getFlyAnchorTxtOfs( ::sal_Int32 fly ) {
++  ::sal_Int32 ret=-1;
++  const SwPosFlyFrm *pFlyFrm=(m_pFlyFrms!=NULL && fly>=0 && fly<m_pFlyFrms->Count()?(*m_pFlyFrms)[fly]:NULL);
++  if (pFlyFrm!=NULL) {
++    const SwFrmFmt &rFlyFmt=pFlyFrm->GetFmt();
++    const SwFmtAnchor &rFlyAnchor=rFlyFmt.GetAnchor();
++    const SwPosition *pFlyAnchorPos=rFlyAnchor.GetCntntAnchor();
++    ret=(pFlyAnchorPos!=NULL?pFlyAnchorPos->nContent.GetIndex():0);
++  };
++  return ret;
++}
++
++::sal_Bool SAL_CALL SwDocumentProvider::getFlyPositionRelativeToPage( ::sal_Int32 fly, ::sal_Int32& x, ::sal_Int32& y, ::sal_Int32& w, ::sal_Int32& h ) throw (::com::sun::star::uno::RuntimeException) {
++  ::sal_Bool ret=false;
++  const SwPosFlyFrm *pFlyFrm=(m_pFlyFrms!=NULL && fly>=0 && fly<m_pFlyFrms->Count()?(*m_pFlyFrms)[fly]:NULL);
++  if (pFlyFrm!=NULL) {
++    const SwFrmFmt &rFlyFmt=pFlyFrm->GetFmt();
++    SwRect aLayRect(rFlyFmt.FindLayoutRect());
++    SwRect aPageRect( pFlyFrm->GetNdIndex().GetNode().GetCntntNode()->FindPageFrmRect());
++    ret=!aLayRect.IsEmpty() && !aPageRect.IsEmpty();
++    if (ret) {
++      x=aLayRect.Left()-aPageRect.Left();
++      y=aLayRect.Top()-aPageRect.Top();
++      w=aLayRect.Width();
++      h=aLayRect.Height();
++    } else {
++      x=0; //@TODO: what if no layout is present???
++      y=0;
++      w=0;
++      h=0;
++    }
++  }  
++  return ret;
++}
++
++
++void SAL_CALL SwDocumentProvider::getSectionPr( ::sal_Int32 idx, ::com::sun::star::uno::Sequence< ::sal_Int32 >& dxaColumns ) throw (::com::sun::star::uno::RuntimeException) {
++  const SwFmtCol *pFmtCol=NULL;  
++  const SwFrmFmt *pPageFmt=NULL;
++  if (m_pDoc!=NULL && idx>=0) {
++    SwNodeIndex aNodeIndex(m_pDoc->GetNodes(), ULONG(idx));
++    const SwPageDesc *pPageDesc=SwPageDesc::GetPageDescOfNode(aNodeIndex.GetNode());
++    if (pPageDesc!=NULL) {
++      //@TODO figure out whether left page is used...
++      pPageFmt=&pPageDesc->GetMaster();
++      if (pPageFmt->GetCol().GetNumCols()>1) {
++	pFmtCol=&pPageFmt->GetCol();
++      }
++    }
++    if (pFmtCol==NULL) {
++      SwSection* pSection=NULL;
++      SwSectionNode *pSectionNode=NULL;
++      SwSectionNode *pTmpNode=aNodeIndex.GetNode().FindSectionNode();
++      SwSection* pTmp=(pTmpNode!=NULL&&pTmpNode->IsSectionNode()?&pTmpNode->GetSection():NULL);;
++      while(pTmp!=NULL) {
++	printf("%p \n", pTmp);
++	if(pTmp->GetFmt()->GetCol().GetNumCols()>1) {
++	  pFmtCol=&pTmp->GetFmt()->GetCol();	  
++	  pTmp=pTmp->GetParent();
++	}
++      }
++    }
++  }
++  if (pFmtCol!=NULL) {
++    printf("pFmtCol->GetWishWidth=%i\n", pFmtCol->GetWishWidth());
++    dxaColumns.realloc(pFmtCol->GetNumCols());
++    for (int i=0;i<dxaColumns.getLength();i++) {
++      dxaColumns[i]=pFmtCol->GetColumns()[i]->GetWishWidth();
++    }
++  } else {
++    //error...
++  }
++}
++
++::sal_Int8 SAL_CALL SwDocumentProvider::getBreakType(  ) throw (::com::sun::star::uno::RuntimeException) {
++  return 0; //@TODO check for section breaks...
++}
+diff --git a/sw/source/core/ooapi/makefile.mk b/sw/source/core/ooapi/makefile.mk
+new file mode 100644
+index 0000000..ddaff82
+--- /dev/null
++++ b/sw/source/core/ooapi/makefile.mk
+@@ -0,0 +1,27 @@
++PRJ=..$/..$/..
++
++PRJNAME=sw
++TARGET=ooapi
++
++# --- Settings -----------------------------------------------------
++#ENABLE_EXCEPTIONS=TRUE
++
++.INCLUDE :	$(PRJ)$/inc$/swpre.mk
++.INCLUDE :	settings.mk
++.INCLUDE :	$(PRJ)$/inc$/sw.mk
++
++CDEFS+=-I..$/text
++
++# --- Files --------------------------------------------------------
++EXCEPTIONSFILES=	\
++SRS1NAME=$(TARGET)
++SRC1FILES =
++SLOFILES =	\
++    $(SLO)$/SwDocumentBuilder.obj \
++    $(SLO)$/SwDocumentProvider.obj
++
++# --- Targets -------------------------------------------------------
++
++
++.INCLUDE :	target.mk
++
+diff --git a/sw/source/ui/uno/unotxdoc.cxx b/sw/source/ui/uno/unotxdoc.cxx
+index 7caf0a7..b5f3c4a 100644
+--- a/sw/source/ui/uno/unotxdoc.cxx
++++ b/sw/source/ui/uno/unotxdoc.cxx
+@@ -116,6 +116,7 @@
+ #include <EnhancedPDFExportHelper.hxx>
+ // <--
+ #include <numrule.hxx>
++#include <ooapi.hxx>
+ 
+ ///////////////////////////Modified on Jun. 14th//////////////////////////
+ ///////////////////////for getDocumentLanguages///////////////////////////
+@@ -2878,6 +2879,17 @@ uno::Reference< text::XFlatParagraphIterator > SAL_CALL SwXTextDocument::getFlat
+     return new SwXFlatParagraphIterator( *pDocShell->GetDoc(), nTextMarkupType, bAutomatic );
+ }
+ 
++/* --------------------------------------------------------------------------
++
++ ---------------------------------------------------------------------------*/
++uno::Reference< ::org::openoffice::DocumentBuilder > SAL_CALL SwXTextDocument::createDocumentBuilder(  ) throw (::com::sun::star::uno::RuntimeException) {
++  return new SwDocumentBuilder(pDocShell);
++}
++
++uno::Reference< ::org::openoffice::DocumentProvider > SAL_CALL SwXTextDocument::createDocumentProvider(  ) throw (::com::sun::star::uno::RuntimeException) {
++  return new SwDocumentProvider(pDocShell);
++}
++
+ /* -----------------------------20.06.00 09:54--------------------------------
+ 
+  ---------------------------------------------------------------------------*/
commit 1e903f1fceb4fa46838a01096182fcacc4b208f1
Author: Florian Reuter <freuter at linux-cfjm.site>
Date:   Mon Jun 29 12:29:31 2009 +0200

    resolved merge conflict
    
    * patches/dev300/apply:

diff --git a/patches/dev300/apply b/patches/dev300/apply
index 21d2ede..ad8d31b 100644
--- a/patches/dev300/apply
+++ b/patches/dev300/apply
@@ -3273,3 +3273,5 @@ crosswin32-tools-mingw.diff
 crosswin32-unotools-mingw.diff
 crosswin32-vcl-mingw.diff
 
+[ Experimental ]
+experimental_ooapi.diff, flr


More information about the ooo-build-commit mailing list