ooo-build r15068 - in trunk: . patches/dev300



Author: freuter
Date: Wed Jan 14 12:42:01 2009
New Revision: 15068
URL: http://svn.gnome.org/viewvc/ooo-build?rev=15068&view=rev

Log:
updated field stuff

Modified:
   trunk/ChangeLog
   trunk/patches/dev300/offapi-field-patch.diff
   trunk/patches/dev300/officecfg-field-patch.diff
   trunk/patches/dev300/svtools-field-patch.diff
   trunk/patches/dev300/sw-field-patch.diff
   trunk/patches/dev300/xmloff-field-patch.diff

Modified: trunk/patches/dev300/offapi-field-patch.diff
==============================================================================
--- trunk/patches/dev300/offapi-field-patch.diff	(original)
+++ trunk/patches/dev300/offapi-field-patch.diff	Wed Jan 14 12:42:01 2009
@@ -1,39 +1,26 @@
---- /dev/null
-+++ offapi/com/sun/star/text/XFormField.idl	Sat Jan 19 13:02:10 2008
-@@ -0,0 +1,24 @@
-+ #ifndef __com_sun_star_text_XFormField_idl__
-+ #define __com_sun_star_text_XFormField_idl__
-+ 
-+ #ifndef __com_sun_star_uno_XInterface_idl__
-+ #include <com/sun/star/uno/XInterface.idl>
-+ #endif
-+ 
-+ module com {  module sun {  module star {  module text { 
-+ 
-+ interface XFormField: com::sun::star::uno::XInterface
-+ {
-+ 	short getType();
-+ 	short getRes();
-+ 	string getDescription( ); 	
-+ 
-+ 	void setType([in] short fieldType );
-+ 	void setRes([in] short res );
-+ 	void setDescription([in] string description );
-+ 
-+ };
-+ 
-+ }; }; }; }; 
-+ 
-+ #endif
-diff --git a/offapi/com/sun/star/text/makefile.mk b/offapi/com/sun/star/text/makefile.mk
-index c9c2cd4..3f3b6c4 100644
---- offapi/com/sun/star/text/makefile.mk
-+++ offapi/com/sun/star/text/makefile.mk
-@@ -267,6 +267,7 @@ IDLFILES=\
-     XTextConvert.idl \
-     XTextAppendAndConvert.idl \
-     XTextAppend.idl \
-+    XFormField.idl \
-         XFlatParagraph.idl \
-         XFlatParagraphIterator.idl \
-         XFlatParagraphIteratorProvider.idl
+diff --git a/offapi/com/sun/star/text/XFormField.idl b/offapi/com/sun/star/text/XFormField.idl
+index 3ef65fa..755fafa 100644
+--- offapi/com/sun/star/text/XFormField.idl
++++ offapi/com/sun/star/text/XFormField.idl
+@@ -9,14 +9,13 @@
+  
+  interface XFormField: com::sun::star::uno::XInterface
+  {
+- 	short getType();
+- 	short getRes();
+- 	string getDescription( ); 	
+- 
+- 	void setType([in] short fieldType );
+- 	void setRes([in] short res );
+- 	void setDescription([in] string description );
+- 
++     string getFieldType();
++     void setFieldType([in] string fieldType);     
++
++     short getParamCount();
++     string getParamName([in] short i);
++     string getParamValue([in] short i);
++     void addParam([in] string name, [in] string value, [in] boolean replaceExisting);
+  };
+  
+  }; }; }; }; 

Modified: trunk/patches/dev300/officecfg-field-patch.diff
==============================================================================
--- trunk/patches/dev300/officecfg-field-patch.diff	(original)
+++ trunk/patches/dev300/officecfg-field-patch.diff	Wed Jan 14 12:42:01 2009
@@ -1,18 +0,0 @@
-diff --git a/officecfg/registry/schema/org/openoffice/Office/Common.xcs b/officecfg/registry/schema/org/openoffice/Office/Common.xcs
-index c753f23..3675b36 100644
---- officecfg/registry/schema/org/openoffice/Office/Common.xcs
-+++ officecfg/registry/schema/org/openoffice/Office/Common.xcs
-@@ -3979,6 +3979,13 @@ Dymamic border coloring means that when the mouse is hovered over a control, and
- 						</info>
- 						<value>true</value>
- 					</prop>
-+					<prop oor:name="ImportWWFieldsAsEnhancedFields" oor:type="xs:boolean">
-+						<info>
-+							<desc>Flag to control
-+							use of enhanced fields.</desc>
-+						</info>
-+						<value>true</value>
-+					</prop>
- 				</group>
- 				<group oor:name="Export">
- 					<info>

Modified: trunk/patches/dev300/svtools-field-patch.diff
==============================================================================
--- trunk/patches/dev300/svtools-field-patch.diff	(original)
+++ trunk/patches/dev300/svtools-field-patch.diff	Wed Jan 14 12:42:01 2009
@@ -1,78 +1,23 @@
-diff --git a/svtools/inc/fltrcfg.hxx b/svtools/inc/fltrcfg.hxx
-index ddc00a9..40fd314 100644
---- svtools/inc/fltrcfg.hxx
-+++ svtools/inc/fltrcfg.hxx
-@@ -76,6 +76,9 @@ public:
- 	sal_Bool IsWriter2WinWord() const;
- 	void SetWriter2WinWord( sal_Bool bFlag );
- 
-+        sal_Bool IsUseEnhancedFields() const;
-+        void SetUseEnhancedFields( sal_Bool  bFlag );
-+
- 	sal_Bool IsExcel2Calc() const;
- 	void SetExcel2Calc( sal_Bool bFlag );
- 	sal_Bool IsCalc2Excel() const;
 diff --git a/svtools/source/config/fltrcfg.cxx b/svtools/source/config/fltrcfg.cxx
-index f52ffa5..748757d 100644
+index be0c379..243eea1 100644
 --- svtools/source/config/fltrcfg.cxx
 +++ svtools/source/config/fltrcfg.cxx
-@@ -63,6 +63,8 @@ using namespace com::sun::star::uno;
- #define FILTERCFG_ENABLE_PPT_PREVIEW    0x20000
- #define FILTERCFG_ENABLE_EXCEL_PREVIEW  0x40000
- #define FILTERCFG_ENABLE_WORD_PREVIEW   0x80000
-+#define FILTERCFG_USE_ENHANCED_FIELDS	0x100000
-+
- 
- static SvtFilterOptions* pOptions=0;
- 
-@@ -210,7 +212,7 @@ struct SvtFilterOptions_Impl
- 					FILTERCFG_MATH_LOAD		| FILTERCFG_MATH_SAVE |
- 					FILTERCFG_WRITER_LOAD	| FILTERCFG_WRITER_SAVE |
- 					FILTERCFG_CALC_LOAD		| FILTERCFG_CALC_SAVE	|
--					FILTERCFG_IMPRESS_LOAD	| FILTERCFG_IMPRESS_SAVE;
-+					FILTERCFG_IMPRESS_LOAD	| FILTERCFG_IMPRESS_SAVE | FILTERCFG_USE_ENHANCED_FIELDS;
- 		   Load();
- 		}
- 
-@@ -288,7 +290,7 @@ const Sequence<OUString>& SvtFilterOptions::GetPropertyNames()
- 	static Sequence<OUString> aNames;
- 	if(!aNames.getLength())
- 	{
--		int nCount = 11;
-+		int nCount = 12;
- 		aNames.realloc(nCount);
- 		static const char* aPropNames[] =
- 		{
-@@ -303,6 +305,7 @@ const Sequence<OUString>& SvtFilterOptions::GetPropertyNames()
+@@ -312,7 +312,7 @@ const Sequence<OUString>& SvtFilterOptions::GetPropertyNames()
  			"Export/EnablePowerPointPreview",	//	8
  			"Export/EnableExcelPreview",		//	9
- 			"Export/EnableWordPreview"			// 10
-+			, "Import/ImportWWFieldsAsEnhancedFields" // 11
+ 			"Export/EnableWordPreview",			// 10
+-            "Import/ImportWWFieldsAsEnhancedFields" // 11
++			"Import/ImportWWFieldsAsEnhancedFields" // 11
  		};
  		OUString* pNames = aNames.getArray();
  		for(int i = 0; i < nCount; i++)
-@@ -327,6 +330,7 @@ static ULONG lcl_GetFlag(sal_Int32 nProp)
- 		case  8: nFlag = FILTERCFG_ENABLE_PPT_PREVIEW; break;
- 		case  9: nFlag = FILTERCFG_ENABLE_EXCEL_PREVIEW; break;
- 		case 10: nFlag = FILTERCFG_ENABLE_WORD_PREVIEW; break;
-+   	        case 11: nFlag = FILTERCFG_USE_ENHANCED_FIELDS; break;
+@@ -525,8 +525,7 @@ void SvtFilterOptions::SetWriter2WinWord( BOOL bFlag )
  
- 		default: DBG_ERROR("illegal value");
- 	}
-@@ -512,6 +516,16 @@ void SvtFilterOptions::SetWriter2WinWord( BOOL bFlag )
- 	SetModified();
+ BOOL SvtFilterOptions::IsUseEnhancedFields() const
+ {
+-    return false; // disable for now;
+-//	return pImp->IsFlag( FILTERCFG_USE_ENHANCED_FIELDS );
++    return pImp->IsFlag( FILTERCFG_USE_ENHANCED_FIELDS );
  }
  
-+BOOL SvtFilterOptions::IsUseEnhancedFields() const
-+{
-+	return pImp->IsFlag( FILTERCFG_USE_ENHANCED_FIELDS );
-+}
-+
-+void SvtFilterOptions::SetUseEnhancedFields( BOOL bFlag )
-+{
-+	pImp->SetFlag( FILTERCFG_USE_ENHANCED_FIELDS, bFlag );
-+	SetModified();
-+}
- 
- // -----------------------------------------------------------------------
- BOOL SvtFilterOptions::IsExcel2Calc() const
+ void SvtFilterOptions::SetUseEnhancedFields( BOOL bFlag )

Modified: trunk/patches/dev300/sw-field-patch.diff
==============================================================================
--- trunk/patches/dev300/sw-field-patch.diff	(original)
+++ trunk/patches/dev300/sw-field-patch.diff	Wed Jan 14 12:42:01 2009
@@ -1,58 +1,5 @@
-diff --git a/sw/inc/IDocumentBookmarkAccess.hxx b/sw/inc/IDocumentBookmarkAccess.hxx
-index 90ed40d..6521bdd 100644
---- sw/inc/IDocumentBookmarkAccess.hxx
-+++ sw/inc/IDocumentBookmarkAccess.hxx
-@@ -34,11 +34,13 @@
- #include <sal/types.h>
- 
- class SwBookmark;
-+class SwFieldBookmark;
- class SwBookmarks;
- class SwPaM;
- class KeyCode;
- class String;
- class SwTxtNode;
-+class SwPosition;
- 
- /** Provides access to the bookmarks of a document.
- */
-@@ -51,6 +53,9 @@ public:
-         MARK,
-         DDE_BOOKMARK,
-         UNO_BOOKMARK,
-+	FIELD_MARK,
-+	FORM_FIELDMARK_TEXT,
-+	FORM_FIELDMARK_NO_TEXT,
-         // --> OD 2007-10-11 #i81002# - bookmark type for cross-references
-         CROSSREF_BOOKMARK
-         // <--
-@@ -167,6 +172,12 @@ public:
-     */
-     virtual SwBookmark& getBookmark(  /*[in]*/sal_uInt16 nPos, /*[in]*/bool bBkmrk) = 0;
- 
-+
-+    virtual SwBookmark* getFieldBookmarkFor(const SwPosition &pos) const = 0;    
-+    virtual SwFieldBookmark* getFormFieldBookmarkFor(const SwPosition &pos) const = 0;    
-+    virtual SwBookmark* getNextFieldBookmarkFor(const SwPosition &pos) const = 0;    
-+    virtual SwBookmark* getPrevFieldBookmarkFor(const SwPosition &pos) const = 0;    
-+
-     /** Get cross-reference bookmark name for certain text node
- 
-         OD 2007-11-16 #i83479#
-diff --git a/sw/inc/IDocumentSettingAccess.hxx b/sw/inc/IDocumentSettingAccess.hxx
-index 0466286..2478dbf 100644
---- sw/inc/IDocumentSettingAccess.hxx
-+++ sw/inc/IDocumentSettingAccess.hxx
-@@ -80,6 +80,7 @@ namespace com { namespace sun { namespace star { namespace i18n { struct Forbidd
-          UNIX_FORCE_ZERO_EXT_LEADING,
-          USE_OLD_PRINTER_METRICS,
-          TABS_RELATIVE_TO_INDENT,
-+	 PROTECT_FORM,
-          // --> OD 2008-06-05 #i89181#
-          TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST,
-          // <--
 diff --git a/sw/inc/bookmrk.hxx b/sw/inc/bookmrk.hxx
-index ec2522d..a6d1871 100644
+index 63e5f26..f540b68 100644
 --- sw/inc/bookmrk.hxx
 +++ sw/inc/bookmrk.hxx
 @@ -54,6 +54,7 @@ struct SwPosition;	// fwd Decl. wg. UI
@@ -73,115 +20,101 @@
      // --> OD 2007-10-10 #i81002#
      // made virtual and thus no longer inline
      virtual const SwPosition& GetBookmarkPos() const;
-@@ -100,7 +104,7 @@ public:
- 	// falls man wirklich auf gleiche Position abfragen will.
+@@ -101,6 +105,8 @@ public:
  	BOOL IsEqualPos( const SwBookmark &rBM ) const;
  
--    BOOL IsBookMark() const    { return IDocumentBookmarkAccess::BOOKMARK == eMarkType; }
-+    BOOL IsBookMark() const 	{ return IDocumentBookmarkAccess::BOOKMARK == eMarkType || IDocumentBookmarkAccess::FORM_FIELDMARK_TEXT == eMarkType || IDocumentBookmarkAccess::FORM_FIELDMARK_NO_TEXT == eMarkType; }
+ 	BOOL IsFormFieldMark() const 	{ return IDocumentBookmarkAccess::FORM_FIELDMARK_TEXT == eMarkType || IDocumentBookmarkAccess::FORM_FIELDMARK_NO_TEXT == eMarkType; }
++    BOOL IsTabbedFormFieldMark() const;
++
+     BOOL IsBookMark() const 	{ return IDocumentBookmarkAccess::BOOKMARK == eMarkType || IDocumentBookmarkAccess::FORM_FIELDMARK_TEXT == eMarkType || IDocumentBookmarkAccess::FORM_FIELDMARK_NO_TEXT == eMarkType; }
  //    // --> OD 2007-10-17 #TESTING#
  //    BOOL IsBookMark() const
- //    {
-@@ -110,6 +114,7 @@ public:
- //    // <--
- 	BOOL IsMark() const 		{ return IDocumentBookmarkAccess::MARK == eMarkType; }
-     BOOL IsUNOMark() const      { return IDocumentBookmarkAccess::UNO_BOOKMARK == eMarkType; }
-+    BOOL IsFormFieldMark() const 	{ return IDocumentBookmarkAccess::FORM_FIELDMARK_TEXT == eMarkType || IDocumentBookmarkAccess::FORM_FIELDMARK_NO_TEXT == eMarkType; }
-     // --> OD 2007-10-11 #i81002# - bookmark type for cross-references
-     BOOL IsCrossRefMark() const { return IDocumentBookmarkAccess::CROSSREF_BOOKMARK == eMarkType; }
-     // <--
-@@ -160,5 +165,71 @@ public:
-     // <--
- };
- 
-+class SwFieldBookmark : public SwBookmark
-+{
-+private:
-+	int fftype; // Type: 0 = Text, 1 = Check Box, 2 = List
-+	int ffres;
-+    bool ffprot;
-+	bool ffsize; // 0 = Auto, 1=Exact (see ffhps)
-+	int fftypetxt; // Type of text field: 0 = Regular text, 1 = Number, 2 = Date, 3 = Current date, 4 = Current time, 5 = Calculation
-+	bool ffrecalc; 
-+	int ffmaxlen; // Number of characters for text field. Zero means unlimited.
-+	int ffhps; // Check box size (half-point sizes).
-+
-+	String ffname;
-+	String ffhelptext;
-+        std::vector<String> *ffListEntries;
-+
+@@ -153,55 +159,37 @@ public:
+             
+ class SwFieldBookmark : public SwBookmark
+ {
 +public:
-+    SwFieldBookmark(const SwPosition& aPos,
-+	       const KeyCode& rCode,
-+	       const String& rName, const String& rShortName,
-+		   IDocumentBookmarkAccess::BookmarkType eMark);
++    typedef  std::pair< ::rtl::OUString, ::rtl::OUString > ParamPair_t;
+ private:
+-	int fftype; // Type: 0 = Text, 1 = Check Box, 2 = List
+-	int ffres;
+-    bool ffprot;
+-	bool ffsize; // 0 = Auto, 1=Exact (see ffhps)
+-	int fftypetxt; // Type of text field: 0 = Regular text, 1 = Number, 2 = Date, 3 = Current date, 4 = Current time, 5 = Calculation
+-	bool ffrecalc; 
+-	int ffmaxlen; // Number of characters for text field. Zero means unlimited.
+-	int ffhps; // Check box size (half-point sizes).
+-
+-	String ffname;
+-	String ffhelptext;
++    ::rtl::OUString m_type;
++    std::vector<ParamPair_t> m_params;
+ 
+ public:
+     SwFieldBookmark(const SwPosition& aPos,
+ 	       const KeyCode& rCode,
+ 	       const String& rName, const String& rShortName,
+-		   IDocumentBookmarkAccess::BookmarkType eMark);
+-
+-	void SetFieldType(int fftype);
+-	int GetFieldType();
+-
+-	void SetChecked(bool checked);
+-	bool IsChecked();
+-
+-	void SetFFName(String aNewName) {
+-		this->ffname=aNewName;
+-	}
+-
+-	String GetFFName()
+-	{
+-		return ffname;
+-	}
+-
+-	int GetFFRes() {
+-		return ffres;
+-	}
+-
+-	void SetFFRes(int nNew) {
+-		this->ffres=nNew;
+-	}
+-
+-	void SetFFHelpText(String newffhelptext) {
+-		this->ffhelptext=newffhelptext;
+-	}
+-
+-	String GetFFHelpText() {
+-		return ffhelptext;
+-	}
++		    IDocumentBookmarkAccess::BookmarkType eMark);
 +
 +    virtual ~SwFieldBookmark();
-+
-+	void SetType(int fftype);
-+	int GetType();
-+
-+	void SetChecked(bool checked);
-+	bool IsChecked();
-+
-+	void SetFFName(String name) {
-+		this->ffname=name;
-+	}
-+
-+	String GetFFName()
-+	{
-+		return ffname;
-+	}
-+
-+	int GetFFRes() {
-+		return ffres;
-+	}
-+
-+	void SetFFRes(int res) {
-+		this->ffres=res;
-+	}
-+
-+	void SetFFHelpText(String helptext) {
-+		this->ffhelptext=helptext;
-+	}
-+
-+	String GetFFHelpText() {
-+		return ffhelptext;
-+	}
-+
-+        void invalidate();
-+
-+
-+        void addListItem(String item);
-+        int getListItems();
-+        String getListItem(int pos);
-+        void setCurrentListItem(int pos);
-+        int getCurrentListItem();
-+        String getCurrentListItemText();
-+
-+};
- 
- #endif
++    
++    void setTypeName(const ::rtl::OUString &typeName);
++    void invalidate();
++    SwPosition getSelectionStart();
++    SwPosition getSelectionEnd();
++
++    // field specific stuff
++    bool isTabbed() const;
++
++    // generic methods
++    bool isType(const char *type) const;
++    rtl::OUString getTypeName();
++    void addParam(::rtl::OUString paramName, ::rtl::OUString paramValue, bool replaceExisting=true);
++    void addParam(const char* paramName, int value);
++    int getNumOfParams();
++    ParamPair_t getParam(int pos);
++    ParamPair_t getParam(const char *name, const char *defaultValue=NULL);
++    void addParams(std::vector<ParamPair_t> &params);
+ };
+             
+ class SwUNOMark: public SwBookmark
 diff --git a/sw/inc/crsrsh.hxx b/sw/inc/crsrsh.hxx
-index bd77643..5830026 100644
+index c4748cf..720f5a9 100644
 --- sw/inc/crsrsh.hxx
 +++ sw/inc/crsrsh.hxx
-@@ -46,12 +46,14 @@
- #include <tblsel.hxx>
- #include <IDocumentBookmarkAccess.hxx>
- 
-+
- // einige Forward Deklarationen
- 
- class KeyCode;
- class SfxItemSet;
- class SfxPoolItem;
- class SwBookmark;
-+class SwFieldBookmark;
- class SwCntntFrm;
- class SwCrsrShell;
- class SwCursor;
-@@ -110,7 +112,8 @@ struct SwContentAtPos
+@@ -112,7 +112,8 @@ struct SwContentAtPos
          SW_REFMARK          = 0x0100,
          SW_NUMLABEL         = 0x0200, // #i23726#
          SW_CONTENT_CHECK    = 0x0400, // --> FME 2005-05-13 #i43742# <--
@@ -191,299 +124,110 @@
  #ifndef PRODUCT
  		,SW_CURR_ATTRS 		= 0x4000		// nur zum Debuggen
  		,SW_TABLEBOXVALUE	= 0x8000		// nur zum Debuggen
-@@ -122,6 +125,7 @@ struct SwContentAtPos
+@@ -124,6 +125,7 @@ struct SwContentAtPos
  		const SfxPoolItem* pAttr;
  		const SwRedline* pRedl;
          SwCntntNode * pNode; // #i23726#
-+   	        const SwFieldBookmark* pFldBookmark;
++	        const SwFieldBookmark* pFldBookmark;
  	} aFnd;
  
      int nDist; // #i23726#
-@@ -587,6 +591,13 @@ public:
- 		// werden, es wird dann bei gleichen Namen nur durchnumeriert.
- 	void MakeUniqueBookmarkName( String& rNm );
- 
-+        bool IsFormProtected();
-+        SwBookmark* IsInFieldBookmark();
-+        SwFieldBookmark* IsInFormFieldBookmark();
-+        SwBookmark* GetNextFieldBookmark();
-+        SwBookmark* GetPrevFieldBookmark();
-+        bool GotoFieldBookmark(SwBookmark *pBkmk);
-+
- 	// aktualisiere den Crsrs, d.H. setze ihn wieder in den Content.
- 	// Das sollte nur aufgerufen werden, wenn der Cursor z.B. beim
- 	// Loeschen von Rahmen irgendwohin gesetzt wurde. Die Position
 diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
-index bb76766..49e35c8 100644
+index e8b3e67..9261ee8 100644
 --- sw/inc/doc.hxx
 +++ sw/inc/doc.hxx
-@@ -600,6 +600,7 @@ private:
-     bool mbClipAsCharacterAnchoredWriterFlyFrames   : 1;   // OD 2006-04-13 #b6402800#
-     bool mbUnixForceZeroExtLeading                  : 1;   // FME 2006-10-09 #i60945#
-     bool mbOldPrinterMetrics                        : 1;   // FME 2007-05-14 #147385#
-+    bool mbProtectForm                              : 1;
-     bool mbTabRelativeToIndent;                            // #i24363# tab stops relative to indent
-     bool mbTabAtLeftIndentForParagraphsInList;             // OD 2008-06-05 #i89181# - see above
- 
-@@ -772,6 +773,11 @@ public:
+@@ -784,6 +784,14 @@ public:
      virtual void makeUniqueBookmarkName( /*[in/out]*/String& rName );
      virtual sal_uInt16 getBookmarkCount( /*[in]*/ bool bBkmrk ) const;
      virtual SwBookmark& getBookmark( /*[in]*/sal_uInt16 nPos, /*[in]*/bool bBkmrk );
-+    SwBookmark* getFieldBookmarkFor(const SwPosition &pos) const;
-+    SwBookmark* getNextFieldBookmarkFor(const SwPosition &pos) const;
-+    SwBookmark* getPrevFieldBookmarkFor(const SwPosition &pos) const;
-+    SwFieldBookmark* getFormFieldBookmarkFor(const SwPosition &pos) const;
++
++    SwFieldBookmark *makeFieldBookmark(/*[in]*/const SwPaM& rPaM, 
++				       /*[in]*/ const String& rName, 
++				       /*[in]*/ const rtl::OUString &rType);
++    SwFieldBookmark *makeNoTextFieldBookmark(/*[in]*/const SwPaM& rPaM, 
++					     /*[in]*/ const String& rName, 
++					     /*[in]*/ const rtl::OUString &rType);
 +
      virtual String getCrossRefBookmarkName(
              /*[in]*/const SwTxtNode& rTxtNode,
              /*[in]*/const CrossReferenceBookmarkSubType nCrossRefType ) const;
-@@ -958,6 +964,7 @@ public:
- 	/** IDocumentState
- 	*/
- 	virtual void SetModified();
-+        virtual void SetModified(SwPaM &rPaM);
- 	virtual void ResetModified();
- 	virtual bool IsModified() const;
- 	virtual bool IsLoaded() const;
+diff --git a/sw/inc/editsh.hxx b/sw/inc/editsh.hxx
+index aeec2f7..3ec7297 100644
+--- sw/inc/editsh.hxx
++++ sw/inc/editsh.hxx
+@@ -415,6 +415,9 @@ public:
+ 	const SwTOXType* 	GetTOXType(TOXTypes eTyp, USHORT nId) const;
+ 	void			 	InsertTOXType(const SwTOXType& rTyp);
+ 
++        // new field stuff
++        BOOL	UpdateField(SwFieldBookmark &fieldBM);
++
+ 	//AutoMark file
+ 	const String&	GetTOIAutoMarkURL() const;
+ 	void			SetTOIAutoMarkURL(const String& rSet);
 diff --git a/sw/inc/hintids.hxx b/sw/inc/hintids.hxx
-index 3d1406e..2662495 100644
+index 14fcf0b..8ac082f 100644
 --- sw/inc/hintids.hxx
 +++ sw/inc/hintids.hxx
-@@ -40,7 +40,16 @@
- #define CH_TXTATR_INWORD		((sal_Unicode)0x02)
- #define CH_TXTATR_TAB           ((sal_Unicode)'\t')
- #define CH_TXTATR_NEWLINE       ((sal_Unicode)'\n')
--
-+#define CH_TXT_ATR_FIELDSTART ((sal_Unicode)0x04)
-+#define CH_TXT_ATR_FIELDEND ((sal_Unicode)0x05)
-+#define CH_TXT_ATR_SUBST_FIELDSTART ("[")
-+#define CH_TXT_ATR_SUBST_FIELDEND ("]")
-+//#define CH_TXT_ATR_FORMELEMENT ((sal_Unicode)'#')
-+#define CH_TXT_ATR_FORMELEMENT ((sal_Unicode)0x06)
-+/*
-+#define FIELD_BOOKMARK_PREFIX "__"
-+#define FIELD_FORM_BOOKMARK_PREFIX "__FORM"
-+*/
+@@ -44,12 +44,8 @@
+ #define CH_TXT_ATR_FIELDEND ((sal_Unicode)0x05)
+ #define CH_TXT_ATR_SUBST_FIELDSTART ("[")
+ #define CH_TXT_ATR_SUBST_FIELDEND ("]")
+-//#define CH_TXT_ATR_FORMELEMENT ((sal_Unicode)'#')
+ #define CH_TXT_ATR_FORMELEMENT ((sal_Unicode)0x06)
+-/*
+-#define FIELD_BOOKMARK_PREFIX "__"
+-#define FIELD_FORM_BOOKMARK_PREFIX "__FORM"
+-*/
++
  /*
   * Hier kommen erst mal die enums fuer die Hints
   */
 diff --git a/sw/inc/pam.hxx b/sw/inc/pam.hxx
-index b9a9c43..5348fd7 100644
+index ea67c9d..e307f4b 100644
 --- sw/inc/pam.hxx
 +++ sw/inc/pam.hxx
-@@ -254,6 +254,8 @@ public:
+@@ -256,6 +256,7 @@ public:
  	DECL_FIXEDMEMPOOL_NEWDEL(SwPaM);
  
      String GetTxt() const;
-+
 +    void Invalidate();
  };
  
  
-diff --git a/sw/inc/unocoll.hxx b/sw/inc/unocoll.hxx
-index b2b3556..b7ace31 100644
---- sw/inc/unocoll.hxx
-+++ sw/inc/unocoll.hxx
-@@ -192,8 +192,10 @@ class SwUnoCollection
- #define SW_SERVICE_IMAP_POLYGON                         104
- #define SW_SERVICE_TYPE_TEXT_GRAPHIC                    105
- #define SW_SERVICE_CHART2_DATA_PROVIDER                 106
-+#define SW_SERVICE_TYPE_FIELDMARK                                     107 
-+#define SW_SERVICE_TYPE_FORMFIELDMARK                                 108 
- 
--#define SW_SERVICE_LAST                 SW_SERVICE_FIELDTYPE_DOCINFO_CUSTOM
-+#define SW_SERVICE_LAST                 SW_SERVICE_TYPE_FORMFIELDMARK
- 
- #define SW_SERVICE_INVALID			USHRT_MAX
- 
-@@ -469,7 +471,6 @@ public:
- 	static SwXBookmark* 	GetObject( SwBookmark& rBkm, SwDoc* pDoc );
- };
- 
--
- class SwXNumberingRulesCollection : public cppu::WeakImplHelper1
- <
-     ::com::sun::star::container::XIndexAccess
 diff --git a/sw/inc/unoobj.hxx b/sw/inc/unoobj.hxx
-index 98e3abe..5794183 100644
+index 226994d..bd39bef 100644
 --- sw/inc/unoobj.hxx
 +++ sw/inc/unoobj.hxx
-@@ -72,6 +72,7 @@
- #include <com/sun/star/text/XRedline.hpp>
- #include <cppuhelper/weak.hxx>
- #include <cppuhelper/factory.hxx>	// helper for factories
-+#include <cppuhelper/implbase1.hxx>	// helper for implementations
- #include <cppuhelper/implbase3.hxx>	// helper for implementations
- #include <cppuhelper/implbase4.hxx>	// helper for implementations
- #include <cppuhelper/implbase5.hxx>	// helper for implementations
-@@ -88,6 +89,10 @@
- #include <unomid.h>
- #include <tools/link.hxx>
+@@ -648,6 +648,7 @@ public:
+ 	SwXFieldmark(bool isReplacementObject, SwBookmark* pBkm = 0, SwDoc* pDoc = 0);
  
-+#include <IDocumentBookmarkAccess.hxx> 
-+#include <com/sun/star/text/XFormField.hpp> 
-+
-+
- class SwUnoCrsr;
- class SwCursor;
- class SwBookmark;
-@@ -579,6 +584,7 @@ SwRefBookmarkBaseClass;
- class SwXBookmark : public SwRefBookmarkBaseClass,
- 	public SwClient
- {
-+protected:
- 	SwEventListenerContainer	aLstnrCntnr;
- 	SwDoc*						pDoc;
- 	String 						m_aName;
-@@ -622,7 +628,8 @@ public:
-     virtual void SAL_CALL addVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
-     virtual void SAL_CALL removeVetoableChangeListener( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& aListener ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
- 
--	void attachToRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange)throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
-+         void attachToRangeEx(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange, IDocumentBookmarkAccess::BookmarkType eMark)throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
-+         virtual void attachToRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange)throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
- 
- 	//SwClient
- 	virtual void 	Modify( SfxPoolItem *pOld, SfxPoolItem *pNew);
-@@ -1458,6 +1465,30 @@ public:
- 	SwDoc*				GetDoc() const{return pDoc;}
- 	void				Invalidate();
- };
--#endif
+ 	virtual void attachToRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange)throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
++/*
+ 	virtual ::rtl::OUString SAL_CALL getDescription(void)  throw( ::com::sun::star::uno::RuntimeException );
+     virtual ::sal_Int16 SAL_CALL getType(  ) throw (::com::sun::star::uno::RuntimeException);
+     virtual ::sal_Int16 SAL_CALL getRes(  ) throw (::com::sun::star::uno::RuntimeException);
+@@ -655,7 +656,15 @@ public:
+     virtual void SAL_CALL setType( ::sal_Int16 fieldType ) throw (::com::sun::star::uno::RuntimeException);
+     virtual void SAL_CALL setRes( ::sal_Int16 res ) throw (::com::sun::star::uno::RuntimeException);
+     virtual void SAL_CALL setDescription( const ::rtl::OUString& description ) throw (::com::sun::star::uno::RuntimeException);
++*/
  
-+typedef cppu::ImplInheritanceHelper1< SwXBookmark, ::com::sun::star::text::XFormField > SwXFieldmark_BASE;
-+ 
-+class SwXFieldmark : public SwXFieldmark_BASE 
-+{
-+private:
-+    bool isReplacementObject;
-+public:
-+    SwXFieldmark(bool isReplacementObject, SwBookmark* pBkm = 0, SwDoc* pDoc = 0);
-+    
-+    virtual void attachToRange(const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > & xTextRange)throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
-+    virtual ::rtl::OUString SAL_CALL getDescription(void)  throw( ::com::sun::star::uno::RuntimeException );
-+    virtual ::sal_Int16 SAL_CALL getType(  ) throw (::com::sun::star::uno::RuntimeException);
-+    virtual ::sal_Int16 SAL_CALL getRes(  ) throw (::com::sun::star::uno::RuntimeException);
++    virtual ::rtl::OUString SAL_CALL getFieldType(void)  throw( ::com::sun::star::uno::RuntimeException );
++    virtual void SAL_CALL setFieldType( const ::rtl::OUString& description ) throw (::com::sun::star::uno::RuntimeException);
 +    
-+    virtual void SAL_CALL setType( ::sal_Int16 fieldType ) throw (::com::sun::star::uno::RuntimeException);
-+    virtual void SAL_CALL setRes( ::sal_Int16 res ) throw (::com::sun::star::uno::RuntimeException);
-+    virtual void SAL_CALL setDescription( const ::rtl::OUString& description ) throw (::com::sun::star::uno::RuntimeException);
-+    
-+    //    virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( ::com::sun::star::uno::Type const & rType ) throw (::com::sun::star::uno::RuntimeException);
-+    
-+};
-+
-+
-+
-+#endif
++    virtual ::sal_Int16 SAL_CALL getParamCount(  ) throw (::com::sun::star::uno::RuntimeException);
++    virtual ::rtl::OUString SAL_CALL getParamName(::sal_Int16 i)  throw( ::com::sun::star::uno::RuntimeException );
++    virtual ::rtl::OUString SAL_CALL getParamValue(::sal_Int16 i)  throw( ::com::sun::star::uno::RuntimeException );
++    virtual void SAL_CALL addParam( const ::rtl::OUString& name, const ::rtl::OUString& value, ::sal_Bool replaceExisting ) throw (::com::sun::star::uno::RuntimeException);
+ //    virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( ::com::sun::star::uno::Type const & rType ) throw (::com::sun::star::uno::RuntimeException);
  
-diff --git a/sw/inc/unoport.hxx b/sw/inc/unoport.hxx
-index ac52d30..102a9c1 100644
---- sw/inc/unoport.hxx
-+++ sw/inc/unoport.hxx
-@@ -72,7 +72,10 @@ enum SwTextPortionType
- 	PORTION_REDLINE_END,
- 	PORTION_RUBY_START,
- 	PORTION_RUBY_END,
--    PORTION_SOFT_PAGEBREAK
-+    PORTION_SOFT_PAGEBREAK,
-+	PORTION_FIELD_START,
-+	PORTION_FIELD_END,
-+	PORTION_FIELD_START_END
  };
- 
- class SwXRubyPortion;
-diff --git a/sw/source/core/crsr/crbm.cxx b/sw/source/core/crsr/crbm.cxx
-index a430392..4f870e0 100644
---- sw/source/core/crsr/crbm.cxx
-+++ sw/source/core/crsr/crbm.cxx
-@@ -40,6 +40,7 @@
- #include "callnk.hxx"
- #include "swcrsr.hxx"
- #include <IDocumentBookmarkAccess.hxx>
-+#include <IDocumentSettingAccess.hxx>
- 
- /*
-  * Methoden der SwCrsrShell fuer Bookmark
-@@ -165,6 +166,65 @@ BOOL SwCrsrShell::GoNextBookmark()
- 	return TRUE;
- }
- 
-+bool SwCrsrShell::IsFormProtected() {
-+    return getIDocumentSettingAccess()->get(IDocumentSettingAccess::PROTECT_FORM);
-+}
-+
-+SwBookmark* SwCrsrShell::IsInFieldBookmark() {
-+// Refactor
-+    SwPosition pos(*GetCrsr()->GetPoint());
-+    return getIDocumentBookmarkAccess()->getFieldBookmarkFor(pos);
-+}
-+
-+SwFieldBookmark* SwCrsrShell::IsInFormFieldBookmark() {
-+// Refactor
-+    SwPosition pos(*GetCrsr()->GetPoint());
-+    return (SwFieldBookmark*)getIDocumentBookmarkAccess()->getFormFieldBookmarkFor(pos);
-+}
-+
-+SwBookmark* SwCrsrShell::GetNextFieldBookmark() {
-+    SwPosition pos(*GetCrsr()->GetPoint());
-+    return getIDocumentBookmarkAccess()->getNextFieldBookmarkFor(pos);
-+}
-+
-+SwBookmark* SwCrsrShell::GetPrevFieldBookmark() {
-+    SwPosition pos(*GetCrsr()->GetPoint());
-+    return getIDocumentBookmarkAccess()->getPrevFieldBookmarkFor(pos);
-+}
-+
-+bool SwCrsrShell::GotoFieldBookmark(SwBookmark *pBkmk) 
-+{
-+        if(pBkmk==NULL)
-+	    return false;
-+	// Crsr-Moves ueberwachen, evt. Link callen
-+	bool bRet = true;
-+	SwCallLink aLk( *this );
-+	SwCursor* pCrsr = GetSwCrsr();
-+	SwCrsrSaveState aSaveState( *pCrsr );
-+	
-+	*pCrsr->GetPoint() = pBkmk->GetPos();
-+	if( pBkmk->GetOtherPos() )
-+	{
-+		pCrsr->SetMark();
-+		*pCrsr->GetMark() = *pBkmk->GetOtherPos();
-+		if( *pCrsr->GetMark() > *pCrsr->GetPoint() )
-+			pCrsr->Exchange();
-+	}
-+	pCrsr->GetPoint()->nContent--;
-+	pCrsr->GetMark()->nContent++;
-+
-+
-+	if( pCrsr->IsSelOvr( nsSwCursorSelOverFlags::SELOVER_CHECKNODESSECTION | nsSwCursorSelOverFlags::SELOVER_TOGGLE ) )
-+	{
-+		pCrsr->DeleteMark();
-+		pCrsr->RestoreSavePos();
-+		bRet = false;
-+	}
-+	else
-+	    UpdateCrsr(SwCrsrShell::SCROLLWIN|SwCrsrShell::CHKRANGE|SwCrsrShell::READONLY);
-+
-+	return bRet;
-+}
- 
- BOOL SwCrsrShell::GoPrevBookmark()
- {
 diff --git a/sw/source/core/crsr/crstrvl.cxx b/sw/source/core/crsr/crstrvl.cxx
-index 544c5f5..376329e 100644
+index 544c5f5..f784e89 100644
 --- sw/source/core/crsr/crstrvl.cxx
 +++ sw/source/core/crsr/crstrvl.cxx
-@@ -78,6 +78,7 @@
- #include <wrong.hxx>
- 
- #include <vcl/window.hxx>
-+#include <bookmrk.hxx>
- #include <docufld.hxx> // OD 2008-06-19 #i90516#
- 
- using namespace ::com::sun::star;
-@@ -1170,6 +1171,16 @@ BOOL SwCrsrShell::GetContentAtPos( const Point& rPt,
+@@ -1170,6 +1170,16 @@ BOOL SwCrsrShell::GetContentAtPos( const Point& rPt,
  					}
  				}
  
@@ -501,25 +245,31 @@
  				{
  					if( aTmpState.bFtnNoInfo )
 diff --git a/sw/source/core/crsr/pam.cxx b/sw/source/core/crsr/pam.cxx
-index 2f38a8a..4decb4f 100644
+index 04de143..db863b7 100644
 --- sw/source/core/crsr/pam.cxx
 +++ sw/source/core/crsr/pam.cxx
-@@ -55,6 +55,11 @@
- // <--
+@@ -56,6 +56,7 @@
  #include <ndtxt.hxx> // #111827#
  
-+#ifndef _BOOKMRK_HXX
-+#include <bookmrk.hxx>
-+#endif
+ #include <bookmrk.hxx>
 +#include <hints.hxx>
-+
+ 
  // fuer den dummen ?MSC-? Compiler
  inline xub_StrLen GetSttOrEnd( BOOL bCondition, const SwCntntNode& rNd )
- {
-@@ -765,6 +770,29 @@ BOOL SwPaM::HasReadonlySel( bool bFormView ) const
- 			}
+@@ -768,16 +769,29 @@ BOOL SwPaM::HasReadonlySel( bool bFormView ) const
  		}
  	}
+ // TODO: Form Protection when Enhanced Fields are enabled
+-//	if( !bRet )
+-//    {
+-//	    const SwDoc *pDoc=GetDoc();
+-//	    SwBookmark *pA = ( pDoc && pPoint ? pDoc->getFieldBookmarkFor( *pPoint ) : NULL );
+-//	    SwBookmark *pB = ( pDoc && pMark ? pDoc->getFieldBookmarkFor( *pMark ) : pA );
+-//	    bRet = ( pA != pB );
+-//	    bool bProtectForm = pDoc->get( IDocumentSettingAccess::PROTECT_FORM );
+-//	    if( bProtectForm )
+-//            bRet |= ( pA==NULL || pB==NULL );
+-//	}
 +	if (!bRet) {
 +	    const SwDoc *pDoc=GetDoc();
 +	    SwBookmark *pA=(pDoc&&pPoint?pDoc->getFieldBookmarkFor(*pPoint):NULL);
@@ -546,9 +296,9 @@
  	return bRet;
  }
  
-@@ -1136,3 +1164,15 @@ String SwPaM::GetTxt() const
- 
-     return aResult;
+@@ -1154,3 +1168,15 @@ BOOL SwPaM::Overlap(const SwPaM & a, const SwPaM & b)
+ {
+     return !(*b.End() <= *a.Start() || *a.End() <= *b.End());
  }
 +
 +void SwPaM::Invalidate()
@@ -562,47 +312,22 @@
 +	_pModify->Modify( 0, &aHint);
 +    }
 +}
-diff --git a/sw/source/core/doc/doc.cxx b/sw/source/core/doc/doc.cxx
-index 2ad2cea..cbb208a 100644
---- sw/source/core/doc/doc.cxx
-+++ sw/source/core/doc/doc.cxx
-@@ -180,6 +180,7 @@ bool SwDoc::get(/*[in]*/ DocumentSettingId id) const
-         case UNIX_FORCE_ZERO_EXT_LEADING: return mbUnixForceZeroExtLeading;
-         case USE_OLD_PRINTER_METRICS: return mbOldPrinterMetrics;
-         case TABS_RELATIVE_TO_INDENT : return mbTabRelativeToIndent;
-+	case PROTECT_FORM: return mbProtectForm;  
-         // --> OD 2008-06-05 #i89181#
-         case TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST: return mbTabAtLeftIndentForParagraphsInList;
-         // <--
-@@ -291,6 +292,9 @@ void SwDoc::set(/*[in]*/ DocumentSettingId id, /*[in]*/ bool value)
-         case UNIX_FORCE_ZERO_EXT_LEADING:
-             mbUnixForceZeroExtLeading = value;
-             break;
-+	case PROTECT_FORM:
-+	    mbProtectForm = value;
-+	    break;
- 
-         case USE_OLD_PRINTER_METRICS:
-             mbOldPrinterMetrics = value;
 diff --git a/sw/source/core/doc/docbm.cxx b/sw/source/core/doc/docbm.cxx
-index c20eaba..e53c617 100644
+index 59dd2a6..4545785 100644
 --- sw/source/core/doc/docbm.cxx
 +++ sw/source/core/doc/docbm.cxx
-@@ -61,6 +61,10 @@
+@@ -63,6 +63,7 @@
  // --> OD 2007-10-23 #i81002#
  #include <ndtxt.hxx>
  // <--
-+#include "swundo.hxx"
-+#include "hintids.hxx"
-+
-+static bool _checkFieldBookmarkSanity(const SwDoc *pDoc);
++#include "ecmaflds.hxx"
  
  SV_IMPL_OP_PTRARR_SORT(SwBookmarks, SwBookmarkPtr)
  
-@@ -87,6 +91,24 @@ SV_IMPL_OP_PTRARR_SORT(SwBookmarks, SwBookmarkPtr)
+@@ -88,6 +89,23 @@ SV_IMPL_OP_PTRARR_SORT(SwBookmarks, SwBookmarkPtr)
+         } while((_pStartShell=(ViewShell*)_pStartShell->GetNext())!= pEShell ); \
  	}
  
- 
 +static void lcl_docbm_FixPosition( SwPosition& rPos )
 +{
 +    // make sure the position has 1) the proper node, and 2) a proper index
@@ -620,15 +345,36 @@
 +    }
 +}
 +
-+
+ 
  /** IDocumentBookmarkAccess ssc
  */
- const SwBookmarks& SwDoc::getBookmarks() const
-@@ -99,7 +121,23 @@ SwBookmark* SwDoc::makeBookmark( /*[in]*/const SwPaM& rPaM, /*[in]*/const KeyCod
+@@ -96,28 +114,27 @@ const SwBookmarks& SwDoc::getBookmarks() const
+     return *pBookmarkTbl;
+ }
+ 
++
+ SwBookmark* SwDoc::makeBookmark( /*[in]*/const SwPaM& rPaM, /*[in]*/const KeyCode& rCode,
+                                  /*[in]*/ const String& rName, /*[in]*/const String& rShortName,
                                   /*[in]*/IDocumentBookmarkAccess::BookmarkType eMark )
  {
      SwBookmark *pBM( 0 );
--	if( MARK == eMark )
+-    if (FORM_FIELDMARK_TEXT == eMark || FORM_FIELDMARK_NO_TEXT == eMark /* rName.CompareToAscii(FIELD_BOOKMARK_PREFIX, strlen(FIELD_BOOKMARK_PREFIX))==0 */)
+-    {
+-        pBM = new SwFieldBookmark(*rPaM.GetPoint(), rCode, rName, rShortName, eMark);
+-        if( rPaM.HasMark() )
+-            pBM->SetOtherBookmarkPos( rPaM.GetMark() );
+-        else
+-            pBM->SetOtherBookmarkPos( &pBM->GetBookmarkPos() );
+-
+-        // TODO: lcl_FixPosition( *pBM->pPos1 ); 
+-        // TODO: lcl_FixPosition( *pBM->pPos2 );
+-        if( *pBM->GetOtherBookmarkPos() < pBM->GetBookmarkPos() )
+-        {
+-            SwPosition _pos( pBM->GetBookmarkPos() );
+-            pBM->SetBookmarkPos( pBM->GetOtherBookmarkPos() );
+-            pBM->SetOtherBookmarkPos( &_pos );
+-        }
+-        //ASSERT(*pBM->pPos1<=*pBM->pPos2, "");
 +    if (FORM_FIELDMARK_TEXT == eMark || FORM_FIELDMARK_NO_TEXT == eMark) {
 +	pBM = new SwFieldBookmark(*rPaM.GetPoint(), rCode, rName, rShortName, eMark);
 +	if( rPaM.HasMark() )
@@ -644,15 +390,82 @@
 +	    pBM->pPos2=_pos;
 +	}
 +	ASSERT(*PBM->pPos1<=*pBM->pPos2, "");
-+    }
-+    else if( MARK == eMark )
+     }
+     else if( MARK == eMark )
+     {
+@@ -146,7 +163,7 @@ SwBookmark* SwDoc::makeBookmark( /*[in]*/const SwPaM& rPaM, /*[in]*/const KeyCod
+ //    }
+ //    // <--
+     else if( BOOKMARK == eMark || DDE_BOOKMARK == eMark)
+-    {
++	{
+         // --> OD 2007-09-26 #i81002#
+         pBM = new SwBookmark( rPaM, rCode, rName, rShortName);
+         if ( eMark == DDE_BOOKMARK )
+@@ -154,7 +171,7 @@ SwBookmark* SwDoc::makeBookmark( /*[in]*/const SwPaM& rPaM, /*[in]*/const KeyCod
+             pBM->SetType( eMark );
+         }
+         // <--
+-    }
++	}
+     // --> OD 2007-10-17 #i81002#
+     else if ( eMark == CROSSREF_BOOKMARK )
      {
-         pBM = new SwMark( *rPaM.GetPoint(), rCode, rName, rShortName );
+@@ -176,53 +193,56 @@ SwBookmark* SwDoc::makeBookmark( /*[in]*/const SwPaM& rPaM, /*[in]*/const KeyCod
+                     "<SwDoc::makeBookmark(..)> - creation of cross-reference bookmark with invalid PaM" );
+         }
      }
-@@ -167,6 +205,45 @@ SwBookmark* SwDoc::makeBookmark( /*[in]*/const SwPaM& rPaM, /*[in]*/const KeyCod
+-    else
+-    {
++    // <--
++	else
++	{
+         // --> OD 2007-09-26 #i81002#
+         pBM = new SwUNOMark( rPaM, rCode, rName, rShortName);
+         // <--
+-    }
++	}
+ 
      // --> OD 2007-10-18 #i81002#
      if ( pBM )
      {
+-        if (FORM_FIELDMARK_TEXT == eMark || FORM_FIELDMARK_NO_TEXT == eMark /* pBM->GetName().CompareToAscii(FIELD_BOOKMARK_PREFIX, strlen(FIELD_BOOKMARK_PREFIX))==0 */) 
+-        {
+-            StartUndo(UNDO_UI_REPLACE, NULL);
+-            //ASSERT(*PBM->pPos1<=*pBM->pPos2, "Bookmark positions not normalized!!!!");
+-            const SwTxtNode* pStartTxtNode=this->GetNodes()[pBM->GetBookmarkPos().nNode]->GetTxtNode();
+-            const SwTxtNode* pEndTxtNode=this->GetNodes()[pBM->GetOtherBookmarkPos()->nNode]->GetTxtNode();
+-            sal_Unicode ch_start=pStartTxtNode->GetTxt().GetChar(pBM->GetBookmarkPos().nContent.GetIndex());
+-            sal_Unicode ch_end=pEndTxtNode->GetTxt().GetChar(pBM->GetOtherBookmarkPos()->nContent.GetIndex()-1);
+-            bool form=(IDocumentBookmarkAccess::FORM_FIELDMARK_NO_TEXT==eMark);  /*(pBM->GetName().CompareToAscii(FIELD_FORM_BOOKMARK_PREFIX, strlen(FIELD_FORM_BOOKMARK_PREFIX))==0);*/
+-            if (form) 
+-            {
+-                if (ch_start!=CH_TXT_ATR_FORMELEMENT)
+-                {
+-                    const SwPaM rRg(pBM->GetBookmarkPos());
+-                    Insert(rRg, CH_TXT_ATR_FORMELEMENT);
+-                    SwPosition aTmp( pBM->GetBookmarkPos() );
+-                    aTmp.nContent--;
+-                    pBM->SetBookmarkPos( &aTmp );
+-                }
+-            }
+-            else
+-            {
+-                if (ch_start!=CH_TXT_ATR_FIELDSTART)
+-                {
+-                    const SwPaM rRg(pBM->GetBookmarkPos());
+-                    Insert(rRg, CH_TXT_ATR_FIELDSTART);
+-                    SwPosition aTmp( pBM->GetBookmarkPos() );
+-                    aTmp.nContent--;
+-                    pBM->SetBookmarkPos( &aTmp );
+-                }
+-                if (ch_end!=CH_TXT_ATR_FIELDEND)
+-                {
+-                    const SwPaM rRg(*pBM->GetOtherBookmarkPos());
+-                    Insert(rRg, CH_TXT_ATR_FIELDEND);
+-                }
+-            }
+-        } 
 + 	if (FORM_FIELDMARK_TEXT == eMark || FORM_FIELDMARK_NO_TEXT == eMark ) {
 + 	    StartUndo(UNDO_UI_REPLACE, NULL);
 + 	    ASSERT(*PBM->pPos1<=*pBM->pPos2, "Bookmark positions not normalized!!!!");
@@ -669,18 +482,18 @@
 + 	    sal_Unicode ch_end=pEndTxtNode->GetTxt().GetChar(ch_end_pos);
 + 	    bool form=(IDocumentBookmarkAccess::FORM_FIELDMARK_NO_TEXT==eMark);
 + 	    if (form) {
-+ 		if (ch_start!=CH_TXT_ATR_FORMELEMENT) {
++ 		if (1 || ch_start!=CH_TXT_ATR_FORMELEMENT) {
 +		    const SwPaM rRg(*pBM->pPos1);
 + 		    Insert(rRg, CH_TXT_ATR_FORMELEMENT);
 + 		    pBM->pPos1->nContent--;
 + 		}
 + 	    } else {
-+ 		if (ch_start!=CH_TXT_ATR_FIELDSTART) {
++ 		if (1 || ch_start!=CH_TXT_ATR_FIELDSTART) {
 +		    const SwPaM rRg(*pBM->pPos1);
 + 		    Insert(rRg, CH_TXT_ATR_FIELDSTART);
 + 		    pBM->pPos1->nContent--;
 + 		}
-+ 		if (ch_end!=CH_TXT_ATR_FIELDEND) {
++ 		if (1 ||  ch_end!=CH_TXT_ATR_FIELDEND) {
 +		    const SwPaM rRg(*pBM->pPos2);
 + 		    Insert(rRg, CH_TXT_ATR_FIELDEND);
 + 		}
@@ -695,300 +508,347 @@
          if ( !pBookmarkTbl->Insert( pBM ) )
              delete pBM, pBM = 0;
          else
-@@ -185,10 +262,121 @@ SwBookmark* SwDoc::makeBookmark( /*[in]*/const SwPaM& rPaM, /*[in]*/const KeyCod
+@@ -241,12 +261,38 @@ SwBookmark* SwDoc::makeBookmark( /*[in]*/const SwPaM& rPaM, /*[in]*/const KeyCod
                      SetModified();
              }
          }
+-        if (FORM_FIELDMARK_TEXT == eMark || FORM_FIELDMARK_NO_TEXT == eMark /*pBM->GetName().CompareToAscii(FIELD_BOOKMARK_PREFIX, strlen(FIELD_BOOKMARK_PREFIX))==0*/)
+-            EndUndo(UNDO_UI_REPLACE, NULL);
 +	if (FORM_FIELDMARK_TEXT == eMark || FORM_FIELDMARK_NO_TEXT == eMark ) {
 +	    EndUndo(UNDO_UI_REPLACE, NULL);
 +	}
-+    }
-+    return pBM;
-+}
-+
-+SwBookmark* SwDoc::getFieldBookmarkFor(const SwPosition &pos) const {
-+    //@TODO make impl recursive
-+    int nCount=pBookmarkTbl->Count();
-+    while(--nCount>=0) {
-+ 	SwBookmark *pBM=(*pBookmarkTbl)[nCount];
-+ 	if (pBM->GetOtherPos()!=NULL 
-+ 	    && FORM_FIELDMARK_TEXT==pBM->GetType() /* pBM->GetName().CompareToAscii(FIELD_BOOKMARK_PREFIX, strlen(FIELD_BOOKMARK_PREFIX))==0 */
-+ 	    && pBM->GetPos()<pos 
-+ 	    && pos < *(pBM->GetOtherPos())) {
-+ 	    return pBM;
-+ 	}
-+    }
-+    return NULL;
-+}
-+
-+SwFieldBookmark* SwDoc::getFormFieldBookmarkFor(const SwPosition &pos) const {
-+    //@TODO make impl recursive
-+    int nCount=pBookmarkTbl->Count();
-+    while(--nCount>=0) {
-+ 	SwBookmark *pBM=(*pBookmarkTbl)[nCount];
-+ 	if (pBM->GetOtherPos()!=NULL 
-+ 	    && FORM_FIELDMARK_NO_TEXT==pBM->GetType() /* pBM->GetName().CompareToAscii(FIELD_FORM_BOOKMARK_PREFIX, strlen(FIELD_FORM_BOOKMARK_PREFIX))==0 */
-+ 	    && pBM->GetPos()<=pos 
-+ 	    && pos <= *(pBM->GetOtherPos())) {
-+ 	    return (SwFieldBookmark*)pBM;
-+ 	}
      }
--	return pBM;
-+    return NULL;
+     return pBM;
  }
  
-+SwBookmark* SwDoc::getNextFieldBookmarkFor(const SwPosition &pos) const {
-+    int i=0;
-+    int nCount=pBookmarkTbl->Count();
-+    SwBookmark *pBM=NULL;
-+    while(i<nCount
-+ 	  && ((pBM=(*pBookmarkTbl)[i])==NULL
-+	      || !pBM->IsFormFieldMark() /* pBM->GetName().CompareToAscii(FIELD_BOOKMARK_PREFIX, strlen(FIELD_BOOKMARK_PREFIX))!=0 */
-+	      || pos >= pBM->GetPos() )) i++;
-+    
-+    if (i<nCount) {
-+ 	return pBM;
-+    } else {
-+ 	i=0; 
-+ 	while(i<nCount && (
-+		  (pBM=(*pBookmarkTbl)[i])==NULL
-+		  ||  !pBM->IsFormFieldMark() /*pBM->GetName().CompareToAscii(FIELD_BOOKMARK_PREFIX, strlen(FIELD_BOOKMARK_PREFIX))!=0*/ )) i++;
-+ 	return (i<nCount?pBM:NULL);
++
++SwFieldBookmark *SwDoc::makeFieldBookmark(/*[in]*/const SwPaM& rPaM, 
++				       /*[in]*/ const String& rName, 
++				       /*[in]*/ const rtl::OUString &rType)
++{
++    SwFieldBookmark *pFieldmark=(SwFieldBookmark*)makeBookmark(rPaM, KeyCode(), rName, String(), IDocumentBookmarkAccess::FORM_FIELDMARK_TEXT);    
++    pFieldmark->setTypeName(rType);
++    if (1) {
++	rtl::OString aName8 = ::rtl::OUStringToOString (rName, RTL_TEXTENCODING_UTF8);
++	rtl::OString aType8 = ::rtl::OUStringToOString (rType, RTL_TEXTENCODING_UTF8);
++	printf("makeFieldBookmark(\"%s\", \"%s\")\n", aName8.getStr(), aType8.getStr());
 +    }
++    return pFieldmark;
 +}
 +
-+SwBookmark* SwDoc::getPrevFieldBookmarkFor(const SwPosition &pos) const {
-+    int nCount=pBookmarkTbl->Count();
-+    int i=nCount-1;
-+    SwBookmark *pBM=NULL;
-+    while(i>=0
-+ 	  && ((pBM=(*pBookmarkTbl)[i])==NULL
-+	      || !pBM->IsFormFieldMark() /*pBM->GetName().CompareToAscii(FIELD_BOOKMARK_PREFIX, strlen(FIELD_BOOKMARK_PREFIX))!=0*/
-+	      || pBM->GetOtherPos()==NULL
-+	      || pos <= *pBM->GetOtherPos() )) i--;
-+    
-+    if (i>=0) {
-+ 	return pBM;
-+    } else {
-+ 	i=nCount-1; 
-+ 	while(i>=0 && (
-+		  (pBM=(*pBookmarkTbl)[i])==NULL
-+		  ||  !pBM->IsFormFieldMark() /*pBM->GetName().CompareToAscii(FIELD_BOOKMARK_PREFIX, strlen(FIELD_BOOKMARK_PREFIX))!=0*/ )) i--;
-+ 	return (i>=0?pBM:NULL);
-+    }
++SwFieldBookmark *SwDoc::makeNoTextFieldBookmark(/*[in]*/const SwPaM& rPaM, 
++				       /*[in]*/ const String& rName, 
++				       /*[in]*/ const rtl::OUString &rType)
++{
++    SwFieldBookmark *pFieldmark=(SwFieldBookmark*)makeBookmark(rPaM, KeyCode(), rName, String(), IDocumentBookmarkAccess::FORM_FIELDMARK_NO_TEXT);    
++    pFieldmark->setTypeName(rType);
++    return pFieldmark;
 +}
 +
-+/*
-+ bool SwDoc::isValidSelectionWrtFieldBookmarks(const SwPosition &posA, const SwPostion &posB) {
-+ //@TODO optimize this
-+     SwBookmark *pA=getFieldBookmarkFor(posA);
-+     SwBookmark *pB=getFieldBookmarkFor(posB);
-+     return pA==pB;    
-+ }
-+ */
-+ 
-+ // not finished yet, still neet to add this check
-+ bool _checkFieldBookmarkSanity(const SwDoc *pDoc) {
-+     int nCount=pDoc->getBookmarks().Count();
-+     while(--nCount>=0) {
-+	 SwBookmark *pBM=pDoc->getBookmarks()[nCount];
-+	 if (pBM->IsFormFieldMark() /* pBM->GetName().CompareToAscii(FIELD_BOOKMARK_PREFIX, strlen(FIELD_BOOKMARK_PREFIX))==0 */) {
-+	     {
-+		 rtl::OUString s(pBM->GetName());
-+		 rtl::OString aOString = ::rtl::OUStringToOString (s, RTL_TEXTENCODING_UTF8);
-+		 const SwTxtNode* pStartTxtNode=pDoc->GetNodes()[pBM->GetPos().nNode]->GetTxtNode();
-+		 const SwTxtNode* pEndTxtNode=pDoc->GetNodes()[pBM->GetOtherPos()->nNode]->GetTxtNode();
-+		 xub_StrLen ch_start_pos=pBM->GetPos().nContent.GetIndex();
-+		 xub_StrLen ch_end_pos=pBM->GetOtherPos()->nContent.GetIndex();
-+		 if (ch_end_pos==0 || ch_end_pos<=ch_start_pos) {
-+		     ch_end_pos=ch_start_pos;
-+		 } else {
-+ 		    ch_end_pos--;
-+		 }
-+		 sal_Unicode ch_start=pStartTxtNode->GetTxt().GetChar(ch_start_pos);
-+		 sal_Unicode ch_end=pEndTxtNode->GetTxt().GetChar(ch_end_pos);
-+		 // printf("CHECK(%s %p[%i/'%c'] %p[%i/'%c']);\n", aOString.getStr(), pStartTxtNode, ch_start, ch_start, pEndTxtNode, ch_end, ch_end);
-+	     }	    
-+	 }
-+     }
-+     return true;
-+ }
-+  
-+
- void SwDoc::deleteBookmark( /*[in]*/sal_uInt16 nPos )
- {
- 	SwBookmark *pBM = (*pBookmarkTbl)[nPos];
-@@ -761,6 +949,8 @@ int lcl_RelativePosition( const SwPosition& rPos, ULONG nNode, xub_StrLen nCntnt
-     return nReturn;
++
+ SwBookmark* SwDoc::getFieldBookmarkFor(const SwPosition &pos) const
+ {
+     //@TODO make impl recursive
+@@ -255,7 +301,7 @@ SwBookmark* SwDoc::getFieldBookmarkFor(const SwPosition &pos) const
+     {
+         SwBookmark *pBM=(*pBookmarkTbl)[static_cast<USHORT>(nCount)];
+         if (pBM->GetOtherBookmarkPos()!=NULL 
+-            && FORM_FIELDMARK_TEXT==pBM->GetType() /* pBM->GetName().CompareToAscii(FIELD_BOOKMARK_PREFIX, strlen(FIELD_BOOKMARK_PREFIX))==0 */
++            && FORM_FIELDMARK_TEXT==pBM->GetType()
+             && pBM->GetBookmarkPos()<pos 
+             && pos < *(pBM->GetOtherBookmarkPos()))
+             return pBM;
+@@ -286,7 +332,7 @@ SwBookmark* SwDoc::getNextFieldBookmarkFor(const SwPosition &pos) const
+     SwBookmark *pBM=NULL;
+     while(i<nCount
+         && ((pBM=(*pBookmarkTbl)[i])==NULL
+-        || !pBM->IsFormFieldMark() /* pBM->GetName().CompareToAscii(FIELD_BOOKMARK_PREFIX, strlen(FIELD_BOOKMARK_PREFIX))!=0 */
++        || !pBM->IsTabbedFormFieldMark() 
+         || pos >= pBM->GetBookmarkPos() ))
+         i++;
+ 
+@@ -296,7 +342,7 @@ SwBookmark* SwDoc::getNextFieldBookmarkFor(const SwPosition &pos) const
+     {
+         i=0;
+         while(i<nCount
+-            && ((pBM=(*pBookmarkTbl)[i])==NULL || !pBM->IsFormFieldMark() /*pBM->GetName().CompareToAscii(FIELD_BOOKMARK_PREFIX, strlen(FIELD_BOOKMARK_PREFIX))!=0*/ ))
++            && ((pBM=(*pBookmarkTbl)[i])==NULL || !pBM->IsTabbedFormFieldMark() ))
+             i++;
+         return (i<nCount?pBM:NULL);
+     }
+@@ -309,7 +355,7 @@ SwBookmark* SwDoc::getPrevFieldBookmarkFor(const SwPosition &pos) const
+     SwBookmark *pBM=NULL;
+     while(i>=0
+         && ((pBM=(*pBookmarkTbl)[static_cast<USHORT>(i)])==NULL
+-        || !pBM->IsFormFieldMark() /*pBM->GetName().CompareToAscii(FIELD_BOOKMARK_PREFIX, strlen(FIELD_BOOKMARK_PREFIX))!=0*/
++        || !pBM->IsTabbedFormFieldMark()
+         || pBM->GetOtherBookmarkPos()==NULL
+         || pos <= *pBM->GetOtherBookmarkPos()))
+         i--;
+@@ -320,7 +366,7 @@ SwBookmark* SwDoc::getPrevFieldBookmarkFor(const SwPosition &pos) const
+     {
+         i=nCount-1; 
+         while(i>=0
+-            && ((pBM=(*pBookmarkTbl)[static_cast<USHORT>(i)])==NULL ||  !pBM->IsFormFieldMark() /*pBM->GetName().CompareToAscii(FIELD_BOOKMARK_PREFIX, strlen(FIELD_BOOKMARK_PREFIX))!=0*/ ))
++            && ((pBM=(*pBookmarkTbl)[static_cast<USHORT>(i)])==NULL ||  !pBM->IsTabbedFormFieldMark() ))
+             i--;
+         return (i>=0?pBM:NULL);
+     }
+@@ -1299,45 +1345,6 @@ void _RestoreCntntIdx( SwDoc* pDoc, SvULongs& rSaveArr,
+ 	}
  }
  
-+
-+
- void _SaveCntntIdx( SwDoc* pDoc, ULONG nNode, xub_StrLen nCntnt,
- 					SvULongs& rSaveArr, BYTE nSaveFly )
+-SwFieldBookmark::SwFieldBookmark(const SwPosition& aPos,
+-		const KeyCode& rCode,
+-		const String& rName, const String& rShortName,
+-		IDocumentBookmarkAccess::BookmarkType eMark)
+-    : SwBookmark(aPos, rCode, rName, rShortName),
+-		fftype(0), // Type: 0 = Text, 1 = Check Box, 2 = List
+-		ffres(0),
+-		ffprot(0),
+-		ffsize(0), // 0 = Auto, 1=Exact (see ffhps)
+-		fftypetxt(0), // Type of text field: 0 = Regular text, 1 = Number, 2 = Date, 3 = Current date, 4 = Current time, 5 = Calculation
+-		ffrecalc(0), 
+-		ffmaxlen(0), // Number of characters for text field. Zero means unlimited.
+-		ffhps(24) // Check box size (half-point sizes).
+-{
+-	eMarkType = eMark;
+-}
+-
+-void SwFieldBookmark::SetChecked(bool checked)
+-{
+-	ASSERT(fftype==1, "This method is for checkboxes only...");
+-	ffres=(checked?1:0);
+-}
+-
+-bool SwFieldBookmark::IsChecked()
+-{
+-	ASSERT(fftype==1, "This method is for checkboxes only...");
+-	return ffres!=0;
+-}
+-
+-void SwFieldBookmark::SetFieldType(int newfftype)
+-{
+-	this->fftype=newfftype;
+-}
+-
+-int SwFieldBookmark::GetFieldType()
+-{
+-	return fftype;
+-}
+-
+ void _RestoreCntntIdx( SvULongs& rSaveArr, const SwNode& rNd,
+ 						xub_StrLen nLen, xub_StrLen nChkLen )
  {
-@@ -1375,3 +1565,93 @@ namespace bookmarkfunc
+@@ -1581,3 +1588,118 @@ namespace bookmarkfunc
      }
  }
  // <--
 +
 +
++
 +SwFieldBookmark::SwFieldBookmark(const SwPosition& aPos,
 +				 const KeyCode& rCode,
 +				 const String& rName, const String& rShortName,
 +				 IDocumentBookmarkAccess::BookmarkType eMark)
-+    : SwBookmark(aPos, rCode, rName, rShortName),
-+      fftype(0), // Type: 0 = Text, 1 = Check Box, 2 = List
-+      ffres(0),
-+      ffprot(0),
-+      ffsize(0), // 0 = Auto, 1=Exact (see ffhps)
-+      fftypetxt(0), // Type of text field: 0 = Regular text, 1 = Number, 2 = Date, 3 = Current date, 4 = Current time, 5 = Calculation
-+      ffrecalc(0), 
-+      ffmaxlen(0), // Number of characters for text field. Zero means unlimited.
-+      ffhps(24), // Check box size (half-point sizes).
-+      ffListEntries(NULL)
++    : SwBookmark(aPos, rCode, rName, rShortName)
 +{
 +    eMarkType = eMark;
 +}
 +
 +SwFieldBookmark::~SwFieldBookmark()
 +{
-+    if (ffListEntries!=NULL) {
-+	delete ffListEntries;
-+    }
++
 +}
 +
-+void SwFieldBookmark::SetChecked(bool checked)
++void SwFieldBookmark::invalidate() 
 +{
-+    ASSERT(fftype==1, "This method is for checkboxes only...");
-+    ffres=(checked?1:0);
++    SwPaM aPaM(this->GetPos(), *this->GetOtherPos());
++    aPaM.Invalidate();
 +}
 +
-+bool SwFieldBookmark::IsChecked()
++SwPosition SwFieldBookmark::getSelectionStart() 
 +{
-+    ASSERT(fftype==1, "This method is for checkboxes only...");
-+    return ffres!=0;
++    SwPosition aPos=GetPos();
++    aPos.nContent++;
++    return aPos;
 +}
 +
-+void SwFieldBookmark::SetType(int type)
++SwPosition SwFieldBookmark::getSelectionEnd()
 +{
-+    this->fftype=type;
++    SwPosition aPos=*GetOtherPos();
++    aPos.nContent--;
++    return aPos;
 +}
 +
-+int SwFieldBookmark::GetType()
++
++void SwFieldBookmark::setTypeName(const ::rtl::OUString &typeName)
 +{
-+    return fftype;
++    m_type=typeName;
 +}
 +
-+void SwFieldBookmark::addListItem(String item)
++BOOL SwBookmark::IsTabbedFormFieldMark() const
 +{
-+    if (ffListEntries==NULL) {
-+	ffListEntries=new std::vector<String>();
-+    }
-+    assert(ffListEntries!=NULL);
-+    ffListEntries->push_back(item);
++    return IsFormFieldMark() && ((const SwFieldBookmark*)this)->isTabbed();
 +}
 +
-+int SwFieldBookmark::getListItems()
++bool SwFieldBookmark::isTabbed() const
 +{
-+    return (ffListEntries!=NULL?ffListEntries->size():0);
++    return isType(ECMA_FORMTEXT) || isType(ECMA_FORMCHECKBOX)  || isType(ECMA_FORMDROPDOWN);
 +}
 +
-+String SwFieldBookmark::getListItem(int pos)
++bool SwFieldBookmark::isType(const char *type) const
 +{
-+    return (ffListEntries!=NULL?(*ffListEntries)[pos]:String());
++    return m_type.compareToAscii(type)==0;
++}
++
++rtl::OUString SwFieldBookmark::getTypeName() {
++    return m_type;
 +}
 +
-+void SwFieldBookmark::setCurrentListItem(int pos)
++void SwFieldBookmark::addParam(::rtl::OUString paramName, ::rtl::OUString paramValue, bool replaceExisting) 
 +{
-+    if (ffListEntries!=NULL && (size_t)pos<ffListEntries->size()) {
-+	ffres=pos;
++    if (replaceExisting) {
++	bool replaced=false;
++	const int len=m_params.size();
++	for(int i=0;i<len;i++) {
++	    if (m_params[i].first.compareTo(paramName)==0) {
++		m_params[i]=ParamPair_t(paramName, paramValue);
++		replaced=true;
++	    }
++	}
++	if (!replaced) {
++	    m_params.push_back(ParamPair_t(paramName, paramValue));
++	}
++    } else {
++	m_params.push_back(ParamPair_t(paramName, paramValue));
 +    }
 +}
 +
-+int SwFieldBookmark::getCurrentListItem()
++void SwFieldBookmark::addParam(const char* paramName, int value)
 +{
-+    return ffres;
++    rtl::OUString sName=rtl::OUString::createFromAscii(paramName);
++    rtl::OUString sValue=::rtl::OUString::valueOf((sal_Int32)value);
++    addParam(sName, sValue);
 +}
 +
-+String SwFieldBookmark::getCurrentListItemText()
++void SwFieldBookmark::addParams(std::vector<ParamPair_t> &params)
 +{
-+    return getListItem(ffres);
++    for(std::vector<ParamPair_t>::iterator i=params.begin();i!=params.end();i++) {
++	m_params.push_back(*i);
++    }
 +}
 +
-+void SwFieldBookmark::invalidate() 
++int SwFieldBookmark::getNumOfParams() 
 +{
-+    SwPaM aPaM(this->GetPos(), *this->GetOtherPos());
-+    aPaM.Invalidate();
++    return m_params.size();
 +}
-diff --git a/sw/source/core/doc/docedt.cxx b/sw/source/core/doc/docedt.cxx
-index ea83635..824c414 100644
---- sw/source/core/doc/docedt.cxx
-+++ sw/source/core/doc/docedt.cxx
-@@ -827,6 +827,12 @@ bool SwDoc::Insert( const SwPaM &rRg, sal_Unicode c )
- |*	  Beschreibung		Zeichen ueberschreiben
- *************************************************************************/
- 
-+void SwDoc::SetModified(SwPaM &rPaM)
-+{
-+    SwDataChanged aTmp( rPaM, 0 );
-+    SetModified();
-+}
-+
- bool SwDoc::Overwrite( const SwPaM &rRg, sal_Unicode c )
- {
- 	SwPosition& rPt = *(SwPosition*)rRg.GetPoint();
-diff --git a/sw/source/core/doc/docnew.cxx b/sw/source/core/doc/docnew.cxx
-index 84150be..403acf8 100644
---- sw/source/core/doc/docnew.cxx
-+++ sw/source/core/doc/docnew.cxx
-@@ -319,6 +319,7 @@ SwDoc::SwDoc() :
-     mbUnixForceZeroExtLeading               = false;        // hidden
-     mbOldPrinterMetrics                     = false;        // hidden
-     mbTabRelativeToIndent                   = true;         // hidden
-+    mbProtectForm                           = false;        // hidden
-     // --> OD 2008-06-05 #i89181#
-     mbTabAtLeftIndentForParagraphsInList    = false;        // hidden
-     // <--
-diff --git a/sw/source/core/layout/trvlfrm.cxx b/sw/source/core/layout/trvlfrm.cxx
-index 258aaf7..7becfed 100644
---- sw/source/core/layout/trvlfrm.cxx
-+++ sw/source/core/layout/trvlfrm.cxx
-@@ -1628,6 +1628,13 @@ BOOL SwRootFrm::IsDummyPage( USHORT nPageNum ) const
- |*************************************************************************/
- BOOL SwFrm::IsProtected() const
- {
-+	if (this->IsCntntFrm() && ((SwCntntFrm*)this)->GetNode()) {
-+		const SwDoc *pDoc=((SwCntntFrm*)this)->GetNode()->GetDoc();
-+		bool isFormProtected=pDoc->get(IDocumentSettingAccess::PROTECT_FORM );
-+		if (isFormProtected) {
-+			return FALSE; // a hack for now, well deal with it laster, I we return true here we have a "double" locking 
-+		}
++
++SwFieldBookmark::ParamPair_t SwFieldBookmark::getParam(int pos)
++{
++    return m_params[pos];
++}
++
++SwFieldBookmark::ParamPair_t SwFieldBookmark::getParam(const char *name, const char *defaultValue) 
++{
++    for(std::vector<ParamPair_t>::iterator i=m_params.begin();i!=m_params.end();i++) {
++	if (i->first.compareToAscii(name)==0) {
++	    return *i;
 +	}
- 	//Der Frm kann in Rahmen, Zellen oder Bereichen geschuetzt sein.
- 	//Geht auch FlyFrms rekursiv hoch. Geht auch von Fussnoten zum Anker.
- 	const SwFrm *pFrm = this;
-diff --git a/sw/source/core/text/inftxt.cxx b/sw/source/core/text/inftxt.cxx
-index 7d240ee..06ec52c 100644
---- sw/source/core/text/inftxt.cxx
-+++ sw/source/core/text/inftxt.cxx
-@@ -84,6 +84,9 @@
- 
- #include <unomid.h>
- 
-+#include <doc.hxx>
-+#include <pam.hxx>
++    }
++    return ParamPair_t(rtl::OUString(), (defaultValue? ::rtl::OUString::createFromAscii(defaultValue)  : ::rtl::OUString()));
++}
 +
+diff --git a/sw/source/core/edit/edtox.cxx b/sw/source/core/edit/edtox.cxx
+index 125489c..03872f4 100644
+--- sw/source/core/edit/edtox.cxx
++++ sw/source/core/edit/edtox.cxx
+@@ -60,6 +60,9 @@
+ #ifndef _STATSTR_HRC
+ #include <statstr.hrc>
+ #endif
++#include <bookmrk.hxx>
++#include <ecmaflds.hxx>
++ 
+ 
  using namespace ::com::sun::star;
- using namespace ::com::sun::star::linguistic2;
- using namespace ::com::sun::star::uno;
-@@ -1172,6 +1175,41 @@ void SwTxtPaintInfo::_DrawBackBrush( const SwLinePortion &rPor ) const
- {
- 	ASSERT( pFnt->GetBackColor(), "DrawBackBrush: Lost Color" );
+ using namespace ::com::sun::star::i18n;
+@@ -232,6 +235,19 @@ BOOL SwEditShell::UpdateTableOf( const SwTOXBase& rTOX, const SfxItemSet* pSet )
+ 	return bRet;
+ }
  
-+    {
-+	SwRect aIntersect;
-+	CalcRect( rPor, &aIntersect, 0 );
++BOOL SwEditShell::UpdateField(SwFieldBookmark &fieldBM) 
++{
++//    SwDocShell* pDocSh = pDoc->GetDocShell();
++    //@TODO implement me...; add undo etc...
++    if (pDoc && fieldBM.GetOtherBookmarkPos()!=NULL) {
++	SwPaM aPaM(fieldBM.getSelectionStart(), fieldBM.getSelectionEnd());
++	pDoc->Delete(aPaM);
++        pDoc->Insert(aPaM, String::CreateFromAscii("Implement me ;-)"), false);
++    }
++    return TRUE;
++}
++
++
+ /*--------------------------------------------------------------------
+ 	 Beschreibung: Aktuelles Verzeichnis vor oder in dem der Cursor
+ 								   steht
+diff --git a/sw/source/core/text/inftxt.cxx b/sw/source/core/text/inftxt.cxx
+index d96b2db..57ad903 100644
+--- sw/source/core/text/inftxt.cxx
++++ sw/source/core/text/inftxt.cxx
+@@ -1147,13 +1147,15 @@ void SwTxtPaintInfo::DrawCheckBox( const SwFieldFormPortion &rPor, bool checked)
+     SwRect aIntersect;
+     CalcRect( rPor, &aIntersect, 0 );
+     if ( aIntersect.HasArea() ) {
+-	if (OnWin()) {
+-	    OutputDevice* pOutDev = (OutputDevice*)GetOut();
+-	    pOutDev->Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );
+-	    pOutDev->SetLineColor( Color(220, 233, 245));
+-	    pOutDev->SetFillColor( Color(220, 233, 245));
+-	    pOutDev->DrawRect( aIntersect.SVRect() );
+-	    pOutDev->Pop();
++	if (OnWin() && SwViewOption::IsFieldShadings() && !GetOpt().IsPagePreview()) {
++	    OutputDevice* pOut_ = (OutputDevice*)GetOut();
++	    pOut_->Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );
++	    pOut_->SetFillColor( SwViewOption::GetFieldShadingsColor() );
++	    pOut_->SetLineColor();
++//	    pOut_->SetLineColor( Color(220, 233, 245));
++//	    pOut_->SetFillColor( Color(220, 233, 245));
++	    pOut_->DrawRect( aIntersect.SVRect() );
++	    pOut_->Pop();
+ 	}
+ 	const int delta=10;
+ 	Rectangle r(aIntersect.Left()+delta, aIntersect.Top()+delta, aIntersect.Right()-delta, aIntersect.Bottom()-delta);
+@@ -1205,31 +1207,30 @@ void SwTxtPaintInfo::_DrawBackBrush( const SwLinePortion &rPor ) const
+     {
+         SwRect aIntersect;
+         CalcRect( rPor, &aIntersect, 0 );
+-        SwTxtNode *pNd = pFrm->GetTxtNode();
+-        SwBookmark *pBM=NULL;   
+-        if ( aIntersect.HasArea() )
+-        {
+-            if (pNd)
+-            {
+-                const SwDoc *doc=pNd->GetDoc();
+-                if (doc!=NULL)
+-                {
+-                    SwIndex aIndex( pNd, GetIdx() );
+-                    SwPosition aPosition(*pNd, aIndex);
+-                    pBM=doc->getFieldBookmarkFor(aPosition);
+-                }
+-            }
+-            bool bIsStartMark=(1==GetLen() && CH_TXT_ATR_FIELDSTART==GetTxt().GetChar(GetIdx()));
+-            if (OnWin() && (pBM!=NULL || bIsStartMark))
+-            {
+-                OutputDevice* pOutDev = (OutputDevice*)GetOut();
+-                pOutDev->Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );
+-                pOutDev->SetLineColor( Color(220, 233, 245));
+-                pOutDev->SetFillColor( Color(220, 233, 245));
+-                pOutDev->DrawRect( aIntersect.SVRect() );
+-                pOutDev->Pop();
+-            }
+-        }
 +	SwTxtNode *pNd = pFrm->GetTxtNode();
 +	SwBookmark *pBM=NULL;	
 +	if ( aIntersect.HasArea() )
@@ -1003,334 +863,96 @@
 +	    }
 +	    bool bIsStartMark=(1==GetLen() && CH_TXT_ATR_FIELDSTART==GetTxt().GetChar(GetIdx()));
 +	    if (OnWin() && (pBM!=NULL || bIsStartMark) && SwViewOption::IsFieldShadings() && !GetOpt().IsPagePreview()) {
-+		OutputDevice* pOut = (OutputDevice*)GetOut();
-+		pOut->Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );
-+		pOut->SetFillColor( SwViewOption::GetFieldShadingsColor() );
-+		pOut->SetLineColor();
-+//		pOut->SetLineColor( Color(220, 233, 245));
-+//		pOut->SetFillColor( Color(220, 233, 245));
-+		pOut->DrawRect( aIntersect.SVRect() );
-+		pOut->Pop();
++		OutputDevice* pOut_ = (OutputDevice*)GetOut();
++		pOut_->Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );
++		pOut_->SetFillColor( SwViewOption::GetFieldShadingsColor() );
++		pOut_->SetLineColor();
++//		pOut_->SetLineColor( Color(220, 233, 245));
++//		pOut_->SetFillColor( Color(220, 233, 245));
++		pOut_->DrawRect( aIntersect.SVRect() );
++		pOut_->Pop();
 +	    }
 +	}
-+
-+    }
-+
-+
-+
-+    if( !pFnt->GetBackColor() )
-+	return;
-+
-     SwRect aIntersect;
-     CalcRect( rPor, 0, &aIntersect );
- 
-@@ -1194,6 +1232,36 @@ void SwTxtPaintInfo::_DrawBackBrush( const SwLinePortion &rPor ) const
      }
- }
- 
-+
-+void SwTxtPaintInfo::DrawCheckBox( const SwFieldFormPortion &rPor, bool checked) const
-+{
-+    SwRect aIntersect;
-+    CalcRect( rPor, &aIntersect, 0 );
-+    if ( aIntersect.HasArea() ) {
-+	if (OnWin() && SwViewOption::IsFieldShadings() && !GetOpt().IsPagePreview()) {
-+	    OutputDevice* pOut = (OutputDevice*)GetOut();
-+	    pOut->Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );
-+	    pOut->SetFillColor( SwViewOption::GetFieldShadingsColor() );
-+	    pOut->SetLineColor();
-+//	    pOut->SetLineColor( Color(220, 233, 245));
-+//	    pOut->SetFillColor( Color(220, 233, 245));
-+	    pOut->DrawRect( aIntersect.SVRect() );
-+	    pOut->Pop();
-+	}
-+	const int delta=10;
-+	Rectangle r(aIntersect.Left()+delta, aIntersect.Top()+delta, aIntersect.Right()-delta, aIntersect.Bottom()-delta);
-+	pOut->Push( PUSH_LINECOLOR | PUSH_FILLCOLOR );	    
-+	pOut->SetLineColor( Color(0, 0, 0));
-+	pOut->SetFillColor();
-+	pOut->DrawRect( r );
-+	if (checked) {
-+	    pOut->DrawLine(r.TopLeft(), r.BottomRight());
-+	    pOut->DrawLine(r.TopRight(), r.BottomLeft());
-+	    pOut->Pop();
-+	}
-+    }
-+}
-+
- /*************************************************************************
-  *					   SwTxtPaintInfo::DrawViewOpt()
-  *************************************************************************/
-@@ -1228,6 +1296,7 @@ void SwTxtPaintInfo::DrawViewOpt( const SwLinePortion &rPor,
- 			default:
- 			{
- 				ASSERT( !this, "SwTxtPaintInfo::DrawViewOpt: don't know how to draw this" );
-+				// printf("SwTxtPaintInfo::DrawViewOpt %04X\n", (int)nWhich);
- 				break;
- 			}
- 		}
-diff --git a/sw/source/core/text/inftxt.hxx b/sw/source/core/text/inftxt.hxx
-index 5a2518a..1796f40 100644
---- sw/source/core/text/inftxt.hxx
-+++ sw/source/core/text/inftxt.hxx
-@@ -471,7 +471,9 @@ public:
- 	void DrawBackground( const SwLinePortion &rPor ) const;
- 	void DrawViewOpt( const SwLinePortion &rPor, const MSHORT nWhich ) const;
- 	inline void DrawBackBrush( const SwLinePortion &rPor ) const
--		{ if( pFnt->GetBackColor() ) _DrawBackBrush( rPor ); }
-+	{ /* if( pFnt->GetBackColor() ) */ _DrawBackBrush( rPor ); }
-+
-+        void DrawCheckBox( const SwFieldFormPortion &rPor, bool checked) const;
- 
- 	inline void NotifyURL( const SwLinePortion &rPor ) const
- 		{ if( URLNotify() ) _NotifyURL( rPor ); }
-diff --git a/sw/source/core/text/itratr.cxx b/sw/source/core/text/itratr.cxx
-index b1faa94..af34e9e 100644
---- sw/source/core/text/itratr.cxx
-+++ sw/source/core/text/itratr.cxx
-@@ -346,6 +346,17 @@ xub_StrLen SwAttrIter::GetNextAttr( ) const
- 			if ( nNextEnd<nNext ) nNext = nNextEnd; // Wer ist naeher?
- 		}
- 	}
-+	if (m_pTxtNode!=NULL) {
-+	    //TODO maybe use hints like FieldHints for this instead of looking at the text...
-+	    int l=(nNext<m_pTxtNode->Len()?nNext:m_pTxtNode->Len());
-+	    int p=nPos;
-+	    const sal_Unicode *txt=m_pTxtNode->GetTxt().GetBuffer();
-+	    while(p<l && txt[p]!=CH_TXT_ATR_FIELDSTART && txt[p]!=CH_TXT_ATR_FIELDEND && txt[p]!=CH_TXT_ATR_FORMELEMENT) p++;
-+	    if ((p<l && p>nPos) || nNext<=p)
-+		nNext=p;
-+	    else
-+		nNext=p+1;
-+	}	
-     if( pRedln )
- 		return pRedln->GetNextRedln( nNext );
- 	return nNext;
-diff --git a/sw/source/core/text/itratr.hxx b/sw/source/core/text/itratr.hxx
-index 719ac63..b0f1354 100644
---- sw/source/core/text/itratr.hxx
-+++ sw/source/core/text/itratr.hxx
-@@ -75,18 +75,19 @@ private:
- 	inline void SetFnt( SwFont* pNew ) { pFnt = pNew; }
- 	const void* aMagicNo[ SW_SCRIPTS ];
- 	MSHORT aFntIdx[ SW_SCRIPTS ];
-+	const SwTxtNode* m_pTxtNode;
- 
- protected:
- 	void Chg( SwTxtAttr *pHt );
- 	void Rst( SwTxtAttr *pHt );
-     void CtorInitAttrIter( SwTxtNode& rTxtNode, SwScriptInfo& rScrInf, SwTxtFrm* pFrm = 0 );
--    inline SwAttrIter()
--		: pShell(0), pFnt(0), pLastOut(0),	nChgCnt(0), pRedln(0), nPropFont(0) {}
-+    inline SwAttrIter(SwTxtNode* pTxtNode) 
-+		: pShell(0), pFnt(0), pLastOut(0),	nChgCnt(0), pRedln(0), nPropFont(0), m_pTxtNode(pTxtNode) {}
- 
- public:
- 	// Konstruktor, Destruktor
-     inline SwAttrIter( SwTxtNode& rTxtNode, SwScriptInfo& rScrInf )
--		: pShell(0), pFnt(0), pHints(0), pScriptInfo(0), pLastOut(0), nChgCnt(0), pRedln(0),nPropFont(0)
-+		: pShell(0), pFnt(0), pHints(0), pScriptInfo(0), pLastOut(0), nChgCnt(0), pRedln(0),nPropFont(0), m_pTxtNode(&rTxtNode)
-         { CtorInitAttrIter( rTxtNode, rScrInf ); }
- 
- 	virtual ~SwAttrIter();
-diff --git a/sw/source/core/text/itrform2.cxx b/sw/source/core/text/itrform2.cxx
-index 239ba28..7feb1e1 100644
---- sw/source/core/text/itrform2.cxx
-+++ sw/source/core/text/itrform2.cxx
-@@ -837,14 +837,23 @@ SwTxtPortion *SwTxtFormatter::WhichTxtPor( SwTxtFormatInfo &rInf ) const
- 			// Erst zum Schluss !
- 			// Wenn pCurr keine Breite hat, kann sie trotzdem schon Inhalt haben,
- 			// z.B. bei nicht darstellbaren Zeichen.
-+if (rInf.GetLen()>0 && rInf.GetTxt().GetChar(rInf.GetIdx())==CH_TXT_ATR_FIELDSTART) {
-+				pPor = new SwFieldMarkPortion();
-+			    } else if (rInf.GetLen()>0 && rInf.GetTxt().GetChar(rInf.GetIdx())==CH_TXT_ATR_FIELDEND) {
-+				pPor = new SwFieldMarkPortion();
-+			    } else if (rInf.GetLen()>0 && rInf.GetTxt().GetChar(rInf.GetIdx())==CH_TXT_ATR_FORMELEMENT) {
-+				pPor = new SwFieldFormPortion();
-+			    } else
- 			if( !rInf.X() && !pCurr->GetPortion() && !pCurr->GetLen() &&
--				!GetFnt()->IsURL() )
--				pPor = pCurr;
--			else
-+			    !GetFnt()->IsURL() ) {
-+			    pPor = pCurr;
-+			 } else
- 			{
-+			     {
- 				pPor = new SwTxtPortion;
--				if( GetFnt()->IsURL() )
--					pPor->SetWhichPor( POR_URL );
-+			    }   
-+			    if( GetFnt()->IsURL() )
-+				pPor->SetWhichPor( POR_URL );
- 			}
- 		}
- 	}
-diff --git a/sw/source/core/text/itrform2.hxx b/sw/source/core/text/itrform2.hxx
-index 134f0bf..21667ab 100644
---- sw/source/core/text/itrform2.hxx
-+++ sw/source/core/text/itrform2.hxx
-@@ -139,7 +139,7 @@ public:
- 	sal_Bool CalcOnceMore();
- 
- 	void CtorInitTxtFormatter( SwTxtFrm *pFrm, SwTxtFormatInfo *pInf );
--    inline SwTxtFormatter( SwTxtFrm *pTxtFrm, SwTxtFormatInfo *pTxtFmtInf )
-+    inline SwTxtFormatter( SwTxtFrm *pTxtFrm, SwTxtFormatInfo *pTxtFmtInf ) : SwTxtPainter(pTxtFrm!=NULL?pTxtFrm->GetTxtNode():NULL)
-            { CtorInitTxtFormatter( pTxtFrm, pTxtFmtInf ); }
- 	~SwTxtFormatter();
- 
-diff --git a/sw/source/core/text/itrpaint.hxx b/sw/source/core/text/itrpaint.hxx
-index af542fb..d6bc99d 100644
---- sw/source/core/text/itrpaint.hxx
-+++ sw/source/core/text/itrpaint.hxx
-@@ -47,9 +47,10 @@ class SwTxtPainter : public SwTxtCursor
-                                 long nAdjustBaseLine = 0 );
- protected:
- 	void CtorInitTxtPainter( SwTxtFrm *pFrm, SwTxtPaintInfo *pInf );
--	inline SwTxtPainter() { }
-+	inline SwTxtPainter(SwTxtNode* pTxtNode) : SwTxtCursor(pTxtNode) { }
-+
- public:
--    inline SwTxtPainter( SwTxtFrm *pTxtFrm, SwTxtPaintInfo *pTxtPaintInf )
-+	inline SwTxtPainter( SwTxtFrm *pTxtFrm, SwTxtPaintInfo *pTxtPaintInf ) : SwTxtCursor(pTxtFrm!=NULL?pTxtFrm->GetTxtNode():NULL)
-            { CtorInitTxtPainter( pTxtFrm, pTxtPaintInf ); }
- 	void DrawTextLine( const SwRect &rPaint, SwSaveClip &rClip,
- 					   const sal_Bool bUnderSz );
-diff --git a/sw/source/core/text/itrtxt.hxx b/sw/source/core/text/itrtxt.hxx
-index 5a23f5d..5a529ab 100644
---- sw/source/core/text/itrtxt.hxx
-+++ sw/source/core/text/itrtxt.hxx
-@@ -68,10 +68,10 @@ protected:
- 	// Zuruecksetzen in die erste Zeile.
- 	void Init();
- 	void CtorInitTxtIter( SwTxtFrm *pFrm, SwTxtInfo *pInf );
--	inline SwTxtIter() { }
-+	inline SwTxtIter(SwTxtNode* pTxtNode) : SwAttrIter(pTxtNode) { }
+     if( !pFnt->GetBackColor() ) return;
  
- public:
--    inline SwTxtIter( SwTxtFrm *pTxtFrm, SwTxtInfo *pTxtInf )
-+    inline SwTxtIter( SwTxtFrm *pTxtFrm, SwTxtInfo *pTxtInf ) : SwAttrIter(pTxtFrm!=NULL?pTxtFrm->GetTxtNode():NULL)
-            { CtorInitTxtIter( pTxtFrm, pTxtInf ); }
- 	inline const SwLineLayout *GetCurr() const { return pCurr; } // niemals 0!
- 	inline const SwLineLayout *GetNext() const { return pCurr->GetNext(); }
-@@ -157,9 +157,9 @@ protected:
- 	inline void SetDropLeft( const KSHORT nNew ) { nDropLeft = nNew; }
- 
- 	void CtorInitTxtMargin( SwTxtFrm *pFrm, SwTxtSizeInfo *pInf );
--	inline SwTxtMargin() { }
-+	inline SwTxtMargin(SwTxtNode* pTxtNode) : SwTxtIter(pTxtNode) { }
- public:
--    inline SwTxtMargin( SwTxtFrm *pTxtFrm, SwTxtSizeInfo *pTxtSizeInf )
-+    inline SwTxtMargin( SwTxtFrm *pTxtFrm, SwTxtSizeInfo *pTxtSizeInf ) : SwTxtIter(pTxtFrm!=NULL?pTxtFrm->GetTxtNode():NULL)
-            { CtorInitTxtMargin( pTxtFrm, pTxtSizeInf ); }
- 	inline SwTwips GetLeftMargin() const;
- 	inline SwTwips Left() const;
-@@ -227,13 +227,13 @@ class SwTxtAdjuster : public SwTxtMargin
- 								  const SwRect &rCurrRect );
- 
- protected:
--	inline SwTxtAdjuster() { }
-+	inline SwTxtAdjuster(SwTxtNode* pTxtNode) : SwTxtMargin(pTxtNode) { }
- 	// spannt beim Blocksatz die Glues auf.
- 	void CalcNewBlock( SwLineLayout *pCurr, const SwLinePortion *pStopAt,
- 		SwTwips nReal = 0 );
-     SwTwips CalcKanaAdj( SwLineLayout *pCurr );
- public:
--    inline SwTxtAdjuster( SwTxtFrm *pTxtFrm, SwTxtSizeInfo *pTxtSizeInf )
-+    inline SwTxtAdjuster( SwTxtFrm *pTxtFrm, SwTxtSizeInfo *pTxtSizeInf ) : SwTxtMargin(pTxtFrm!=NULL?pTxtFrm->GetTxtNode():NULL)
-            { CtorInitTxtMargin( pTxtFrm, pTxtSizeInf ); }
- 
- 	// wird von SwTxtFormatter wegen UpdatePos ueberladen
-@@ -266,9 +266,9 @@ class SwTxtCursor : public SwTxtAdjuster
- 	void _GetCharRect(SwRect *, const xub_StrLen, SwCrsrMoveState* );
- protected:
- 	void CtorInitTxtCursor( SwTxtFrm *pFrm, SwTxtSizeInfo *pInf );
--	inline SwTxtCursor() { }
-+	inline SwTxtCursor(SwTxtNode* pTxtNode) : SwTxtAdjuster(pTxtNode) { }
- public:
--    inline SwTxtCursor( SwTxtFrm *pTxtFrm, SwTxtSizeInfo *pTxtSizeInf )
-+    inline SwTxtCursor( SwTxtFrm *pTxtFrm, SwTxtSizeInfo *pTxtSizeInf ) : SwTxtAdjuster(pTxtFrm!=NULL?pTxtFrm->GetTxtNode():NULL)
-            { CtorInitTxtCursor( pTxtFrm, pTxtSizeInf ); }
- 	sal_Bool GetCharRect(SwRect *, const xub_StrLen, SwCrsrMoveState* = 0,
- 		const long nMax = 0 );
 diff --git a/sw/source/core/text/portxt.cxx b/sw/source/core/text/portxt.cxx
-index b7d0ddc..e6ecf6e 100644
+index 12943e2..bf2ad12 100644
 --- sw/source/core/text/portxt.cxx
 +++ sw/source/core/text/portxt.cxx
-@@ -52,6 +52,10 @@
- #include <IDocumentSettingAccess.hxx>
- #include <viewopt.hxx>  // SwViewOptions
+@@ -55,6 +55,7 @@
+ #include <bookmrk.hxx>
+ #include <pam.hxx>
+ #include <doc.hxx>
++#include <ecmaflds.hxx>
  
-+#include <bookmrk.hxx>
-+#include <pam.hxx>
-+#include <doc.hxx>
-+
  #if OSL_DEBUG_LEVEL > 1
  const sal_Char *GetLangName( const MSHORT nLang );
- #endif
-@@ -564,7 +568,17 @@ SwPosSize SwTxtPortion::GetTxtSize( const SwTxtSizeInfo &rInf ) const
- 
- void SwTxtPortion::Paint( const SwTxtPaintInfo &rInf ) const
- {
--	if( GetLen() )
-+	if (rInf.OnWin() && 1==rInf.GetLen() && CH_TXT_ATR_FIELDEND==rInf.GetTxt().GetChar(rInf.GetIdx())) {
-+	    rInf.DrawBackBrush( *this );
-+	    const XubString aTxt = XubString::CreateFromAscii(CH_TXT_ATR_SUBST_FIELDEND);
-+	    rInf.DrawText( aTxt, *this, 0, aTxt.Len(), false );	  
-+	}
-+	else if (rInf.OnWin() && 1==rInf.GetLen() && CH_TXT_ATR_FIELDSTART==rInf.GetTxt().GetChar(rInf.GetIdx())) {
-+	    rInf.DrawBackBrush( *this );
-+	    const XubString aTxt = XubString::CreateFromAscii(CH_TXT_ATR_SUBST_FIELDSTART);
-+	    rInf.DrawText( aTxt, *this, 0, aTxt.Len(), false );	  
-+	}
-+	else if( GetLen() )
- 	{
-         rInf.DrawBackBrush( *this );
- 
-@@ -750,3 +764,75 @@ void SwHolePortion::HandlePortion( SwPortionHandler& rPH ) const
-     rPH.Text( GetLen(), GetWhichPor() );
+@@ -778,36 +779,74 @@ sal_Bool SwFieldMarkPortion::Format( SwTxtFormatInfo & )
+     return ret;
  }
  
++namespace ecma {
++    static int getCurrentListIndex(SwFieldBookmark *pBM, ::rtl::OUString *currentText=NULL) {
++	int currentIndex=pBM->getParam(ECMA_FORMDROPDOWN_RESULT, "0").second.toInt32();
++	int idx=0;	
++	for(int i=0;i<pBM->getNumOfParams();i++) {
++	    SwFieldBookmark::ParamPair_t p=pBM->getParam(i);
++	    if (p.first.compareToAscii(ECMA_FORMDROPDOWN_LISTENTRY)==0) {
++		if (idx==currentIndex) {
++	    if (currentText!=NULL) *currentText=p.second;
++		    break;
++		} else
++		    idx++;
++	    }			       
++	}	
++    return idx;
++    }
++} /* ecma */
 +
-+void SwFieldMarkPortion::Paint( const SwTxtPaintInfo &rInf ) const
-+{
-+//	SwTxtPortion::Paint(rInf);
-+}
-+
-+sal_Bool SwFieldMarkPortion::Format( SwTxtFormatInfo &rInf ) 
-+{
-+    sal_Bool ret=0;
-+	Width(0);
-+    return ret;
-+}
-+
-+
-+void SwFieldFormPortion::Paint( const SwTxtPaintInfo &rInf ) const
-+{
-+//	SwTxtPortion::Paint(rInf);
-+    SwTxtNode *pNd=const_cast<SwTxtNode*>(rInf.GetTxtFrm()->GetTxtNode());
-+    const SwDoc *doc=pNd->GetDoc();
-+    SwIndex aIndex( pNd, rInf.GetIdx() );
-+    SwPosition aPosition(*pNd, aIndex);
-+    SwFieldBookmark *pBM=doc->getFormFieldBookmarkFor(aPosition);
-+    ASSERT(pBM!=NULL, "Where is my form field bookmark???");
+ 
+ void SwFieldFormPortion::Paint( const SwTxtPaintInfo &rInf ) const
+ {
+-//	SwTxtPortion::Paint(rInf);
+     SwTxtNode *pNd=const_cast<SwTxtNode*>(rInf.GetTxtFrm()->GetTxtNode());
+     const SwDoc *doc=pNd->GetDoc();
+     SwIndex aIndex( pNd, rInf.GetIdx() );
+     SwPosition aPosition(*pNd, aIndex);
+     SwFieldBookmark *pBM=doc->getFormFieldBookmarkFor(aPosition);
+     ASSERT(pBM!=NULL, "Where is my form field bookmark???");
+-    bool checked=(pBM!=NULL?pBM->IsChecked():false);
+-    rInf.DrawCheckBox( *this , checked);
+-//    const XubString aTxt = XubString::CreateFromAscii("[ ]");
+-//    rInf.DrawText( aTxt, *this, 0, aTxt.Len(), false );	  
 +    if (pBM!=NULL) {
-+	if (pBM->GetType()==1) { // a checkbox...	    
-+	    bool checked=pBM->IsChecked();
++	if (pBM->isType(ECMA_FORMCHECKBOX)==1) { // a checkbox...	    
++	    bool checked=pBM->getParam(ECMA_FORMCHECKBOX_CHECKED).second.compareToAscii("on")==0;
 +	    rInf.DrawCheckBox( *this , checked);
-+	} else if (pBM->GetType()==2) { // a list...
-+	    const XubString aTxt(pBM->getCurrentListItemText());
++	} else if (pBM->isType(ECMA_FORMDROPDOWN)) { // a list...
++	    rtl::OUString aTxt;
++	    int index=ecma::getCurrentListIndex(pBM, &aTxt);
 +	    rInf.DrawViewOpt( *this, POR_FLD );
-+	    rInf.DrawText( aTxt, *this, 0, aTxt.Len(), false );	  
++	    rInf.DrawText( aTxt, *this, 0, aTxt.getLength(), false );	  
 +	} else {
 +	    assert(0); // unknown type...
 +	}
 +    }
-+}
-+
-+sal_Bool SwFieldFormPortion::Format( SwTxtFormatInfo &rInf ) 
-+{
-+    sal_Bool ret=0;
+ }
+ 
+ sal_Bool SwFieldFormPortion::Format( SwTxtFormatInfo &rInf ) 
+ {
+     sal_Bool ret=0;
+-//	ret=SwTxtPortion::Format(rInf);
+-
+-	Width(rInf.GetTxtHeight());
+-	Height(rInf.GetTxtHeight());
+-	SetAscent(rInf.GetAscent());
+-	//int h=rInf.GetTxtHeight();
+-	
+-/*
+-	Height(100);
+-	SetAscent(100);
+-*/
 +    SwTxtNode *pNd=const_cast<SwTxtNode*>(rInf.GetTxtFrm()->GetTxtNode());
 +    const SwDoc *doc=pNd->GetDoc();
 +    SwIndex aIndex( pNd, rInf.GetIdx() );
@@ -1338,12 +960,13 @@
 +    SwFieldBookmark *pBM=doc->getFormFieldBookmarkFor(aPosition);
 +    ASSERT(pBM!=NULL, "Where is my form field bookmark???");
 +    if (pBM!=NULL) {
-+	if (pBM->GetType()==1) { // a checkbox...	    
++	if (pBM->isType(ECMA_FORMCHECKBOX)) {
 +	    Width(rInf.GetTxtHeight());
 +	    Height(rInf.GetTxtHeight());
 +	    SetAscent(rInf.GetAscent());
-+	} else if (pBM->GetType()==2) { // a list...
-+	    const XubString aTxt(pBM->getCurrentListItemText());
++        } else if (pBM->isType(ECMA_FORMDROPDOWN)) {
++	    ::rtl::OUString aTxt;
++	    ecma::getCurrentListIndex(pBM, &aTxt);
 +	    SwPosSize aPosSize=rInf.GetTxtSize(aTxt);
 +	    Width(aPosSize.Width());
 +	    Height(aPosSize.Height());
@@ -1353,1188 +976,776 @@
 +	}
 +
 +    }
-+//	ret=SwTxtPortion::Format(rInf);
-+#if 0
-+//	int h=rInf.GetTxtHeight();
-+#endif
-+/*
-+	Height(100);
-+	SetAscent(100);
-+*/
-+    return ret;
-+}
-diff --git a/sw/source/core/text/portxt.hxx b/sw/source/core/text/portxt.hxx
-index 819d285..0ab463e 100644
---- sw/source/core/text/portxt.hxx
-+++ sw/source/core/text/portxt.hxx
-@@ -95,8 +95,30 @@ public:
- 	DECL_FIXEDMEMPOOL_NEWDEL(SwHolePortion)
- };
- 
-+class SwFieldMarkPortion : public SwTxtPortion {
-+public:
-+    inline SwFieldMarkPortion() : SwTxtPortion() {
-+
-+    }
-+    virtual void Paint( const SwTxtPaintInfo &rInf ) const;
-+    virtual sal_Bool Format( SwTxtFormatInfo &rInf );
-+};
-+
-+class SwFieldFormPortion : public SwTxtPortion {
-+public:
-+    inline SwFieldFormPortion() : SwTxtPortion() {
-+
-+    }
-+    virtual void Paint( const SwTxtPaintInfo &rInf ) const;
-+    virtual sal_Bool Format( SwTxtFormatInfo &rInf );
-+};
-+
-+
- CLASSIO( SwTxtPortion )
- CLASSIO( SwHolePortion )
- 
- 
-+
-+
-+
- #endif
-diff --git a/sw/source/core/txtnode/swfont.cxx b/sw/source/core/txtnode/swfont.cxx
-index 8be8c0e..6009f71 100644
---- sw/source/core/txtnode/swfont.cxx
-+++ sw/source/core/txtnode/swfont.cxx
-@@ -795,6 +795,32 @@ Size SwSubFont::_GetTxtSize( SwDrawTextInfo& rInf )
- 		}
- 	}
- 
-+
-+	if (1==rInf.GetLen() && CH_TXT_ATR_FIELDSTART==rInf.GetText().GetChar(rInf.GetIdx())) {
-+	    xub_StrLen nOldIdx(rInf.GetIdx());
-+	    xub_StrLen nOldLen(rInf.GetLen());
-+	    String aNewText=String::CreateFromAscii(CH_TXT_ATR_SUBST_FIELDSTART);
-+	    rInf.SetText( aNewText );
-+	    rInf.SetIdx( 0 );
-+	    rInf.SetLen( aNewText.Len() );
-+	    aTxtSize = pLastFont->GetTextSize( rInf );	    
-+	    rInf.SetIdx( nOldIdx );
-+	    rInf.SetLen( nOldLen );
-+	}
-+	else
-+	if (1==rInf.GetLen() && CH_TXT_ATR_FIELDEND==rInf.GetText().GetChar(rInf.GetIdx())) {
-+	    xub_StrLen nOldIdx(rInf.GetIdx());
-+	    xub_StrLen nOldLen(rInf.GetLen());
-+	    String aNewText=String::CreateFromAscii(CH_TXT_ATR_SUBST_FIELDEND);
-+	    rInf.SetText( aNewText );
-+	    rInf.SetIdx( 0 );
-+	    rInf.SetLen( aNewText.Len() );
-+	    aTxtSize = pLastFont->GetTextSize( rInf );	    
-+	    rInf.SetIdx( nOldIdx );
-+	    rInf.SetLen( nOldLen );	
-+	}
-+
-+
- 	return aTxtSize;
+     return ret;
  }
  
 diff --git a/sw/source/core/unocore/unobkm.cxx b/sw/source/core/unocore/unobkm.cxx
-index 5667bd6..f2e41ed 100644
+index 26f40ec..755e6f8 100644
 --- sw/source/core/unocore/unobkm.cxx
 +++ sw/source/core/unocore/unobkm.cxx
-@@ -101,7 +101,7 @@ SwXBookmark::~SwXBookmark()
- /*-- 10.12.98 10:14:39---------------------------------------------------
- 
-   -----------------------------------------------------------------------*/
--void SwXBookmark::attachToRange(const uno::Reference< text::XTextRange > & xTextRange)
-+void SwXBookmark::attachToRangeEx(const uno::Reference< text::XTextRange > & xTextRange, IDocumentBookmarkAccess::BookmarkType eMark)
- 										throw( lang::IllegalArgumentException, uno::RuntimeException )
- {
- 	if(!bIsDescriptor)
-@@ -137,7 +137,7 @@ void SwXBookmark::attachToRange(const uno::Reference< text::XTextRange > & xText
-             IDocumentBookmarkAccess::BookmarkType eBkmkType =
-                                     pDoc->isCrossRefBookmarkName( m_aName )
-                                     ? IDocumentBookmarkAccess::CROSSREF_BOOKMARK
--                                    : IDocumentBookmarkAccess::BOOKMARK;
+@@ -7,7 +7,7 @@
+  * OpenOffice.org - a multi-platform office productivity suite
+  *
+  * $RCSfile: unobkm.cxx,v $
+- * $Revision: 1.17 $
++ * $Revision: 1.16 $
+  *
+  * This file is part of OpenOffice.org.
+  *
+@@ -134,14 +134,15 @@ void SwXBookmark::attachToRangeEx(const uno::Reference< text::XTextRange > & xTe
+ 				 m_aName =  C2S("Bookmark");
+             // --> OD 2007-10-23 #i81002#
+             // determine bookmark type due to its proposed name
+-            if( eMark == IDocumentBookmarkAccess::BOOKMARK &&
+-                pDoc->isCrossRefBookmarkName( m_aName ) )
+-                eMark = IDocumentBookmarkAccess::CROSSREF_BOOKMARK;
++            IDocumentBookmarkAccess::BookmarkType eBkmkType =
++                                    pDoc->isCrossRefBookmarkName( m_aName )
++                                    ? IDocumentBookmarkAccess::CROSSREF_BOOKMARK
 +                                    : eMark;
              // <--
              if( USHRT_MAX != pDoc->findBookmark(m_aName) )
                  pDoc->makeUniqueBookmarkName( m_aName );
-@@ -163,6 +163,118 @@ void SwXBookmark::attachToRange(const uno::Reference< text::XTextRange > & xText
- 	else
- 		throw lang::IllegalArgumentException();
+ 			KeyCode aCode;
+-            pBkm = pDoc->makeBookmark( aPam, aCode, m_aName, aEmptyStr, eMark);
++            pBkm = pDoc->makeBookmark( aPam, aCode, m_aName, aEmptyStr, eBkmkType);
+             // --> OD 2007-10-23 #i81002#
+             // Check, if bookmark has been created.
+             // E.g., the creation of a cross-reference bookmark is suppress,
+@@ -164,109 +165,87 @@ void SwXBookmark::attachToRangeEx(const uno::Reference< text::XTextRange > & xTe
  }
-+
-+void SwXBookmark::attachToRange(const uno::Reference< text::XTextRange > & xTextRange)
+ 
+ void SwXBookmark::attachToRange(const uno::Reference< text::XTextRange > & xTextRange)
+-    throw( lang::IllegalArgumentException, uno::RuntimeException )
 +										throw( lang::IllegalArgumentException, uno::RuntimeException )
-+{
-+	attachToRangeEx(xTextRange, IDocumentBookmarkAccess::BOOKMARK);
-+}
-+
+ {
+ 	attachToRangeEx(xTextRange, IDocumentBookmarkAccess::BOOKMARK);
+ }
+ 
+-SwXFieldmark::SwXFieldmark(bool _isReplacementObject, SwBookmark* pBkm, SwDoc* pDc)
+-    : SwXFieldmark_BASE(pBkm, pDc)
+-    , isReplacementObject(_isReplacementObject)
+-{ }
+-
+-
+-void SwXFieldmark::attachToRange(const uno::Reference< text::XTextRange > & xTextRange)
+-    throw( lang::IllegalArgumentException, uno::RuntimeException )
 +SwXFieldmark::SwXFieldmark(bool _isReplacementObject, SwBookmark* pBkm, SwDoc* pDc) : SwXFieldmark_BASE(pBkm, pDc),
 +isReplacementObject(_isReplacementObject)
-+{
-+}
-+
-+
+ {
+-    attachToRangeEx(xTextRange, (isReplacementObject?IDocumentBookmarkAccess::FORM_FIELDMARK_NO_TEXT:IDocumentBookmarkAccess::FORM_FIELDMARK_TEXT));
+ }
+ 
+-::rtl::OUString SwXFieldmark::getDescription(void) throw( ::com::sun::star::uno::RuntimeException )
++::rtl::OUString SwXFieldmark::getFieldType(void)  throw( ::com::sun::star::uno::RuntimeException )
+ {
+     vos::OGuard aGuard(Application::GetSolarMutex());
+     SwFieldBookmark* pBkm = (SwFieldBookmark*)GetBookmark();
+-    OUString sRet;
+     if(pBkm)
+-        sRet = pBkm->GetFFHelpText();
+-    /* //@TODO implement...
+-    else if(bIsDescriptor)
+-        sRet = m_aName;
+-        */
++	return pBkm->getTypeName();
+     else
+         throw uno::RuntimeException();
+-    return sRet;
+ }
+ 
+-::sal_Int16 SAL_CALL SwXFieldmark::getType(  ) throw (::com::sun::star::uno::RuntimeException)
++void SwXFieldmark::setFieldType( const ::rtl::OUString& fieldType ) throw (::com::sun::star::uno::RuntimeException)
+ {
+     vos::OGuard aGuard(Application::GetSolarMutex());
+     SwFieldBookmark* pBkm = (SwFieldBookmark*)GetBookmark();
+-    ::sal_Int16 sRet;
+-    if(pBkm)
+-        sRet = static_cast<sal_Int16>(pBkm->GetFieldType());
+-    /* //@TODO implement...
+-    else if(bIsDescriptor)
+-        sRet = m_aName;
+-        */
++    if (pBkm)
++        pBkm->setTypeName(fieldType);
+     else
+-        throw uno::RuntimeException();
+-    return sRet;
++        throw uno::RuntimeException();    
+ }
+ 
+-::sal_Int16 SAL_CALL SwXFieldmark::getRes(  ) throw (::com::sun::star::uno::RuntimeException)
++::sal_Int16 SwXFieldmark::getParamCount(  ) throw (::com::sun::star::uno::RuntimeException)
+ {
+     vos::OGuard aGuard(Application::GetSolarMutex());
+     SwFieldBookmark* pBkm = (SwFieldBookmark*)GetBookmark();
+-    ::sal_Int16 sRet;
+     if(pBkm)
+-        sRet = static_cast<sal_Int16>(pBkm->GetFFRes());
+-    /* //@TODO implement...
+-    else if(bIsDescriptor)
+-        sRet = m_aName;
+-        */
++	return pBkm->getNumOfParams();
+     else
+         throw uno::RuntimeException();
+-    return sRet;
+ }
+ 
+-
+-void SAL_CALL SwXFieldmark::setType( ::sal_Int16 fieldType ) throw (::com::sun::star::uno::RuntimeException)
++::rtl::OUString SwXFieldmark::getParamName(::sal_Int16 i)  throw( ::com::sun::star::uno::RuntimeException )
+ {
+     vos::OGuard aGuard(Application::GetSolarMutex());
+     SwFieldBookmark* pBkm = (SwFieldBookmark*)GetBookmark();
+-    if (pBkm)
+-        pBkm->SetFieldType(fieldType);
++    if(pBkm)
++	return pBkm->getParam(i).first;
+     else
+         throw uno::RuntimeException();
+ }
+ 
+-void SAL_CALL SwXFieldmark::setRes( ::sal_Int16 res ) throw (::com::sun::star::uno::RuntimeException)
++::rtl::OUString SwXFieldmark::getParamValue(::sal_Int16 i)  throw( ::com::sun::star::uno::RuntimeException )
+ {
+     vos::OGuard aGuard(Application::GetSolarMutex());
+     SwFieldBookmark* pBkm = (SwFieldBookmark*)GetBookmark();
+-    if (pBkm)
+-        pBkm->SetFFRes(res);
++    if(pBkm)
++	return pBkm->getParam(i).second;
+     else
+         throw uno::RuntimeException();
+ }
+ 
+-void SAL_CALL SwXFieldmark::setDescription( const ::rtl::OUString& description ) throw (::com::sun::star::uno::RuntimeException)
++void SwXFieldmark::addParam( const ::rtl::OUString& name, const ::rtl::OUString& value, ::sal_Bool replaceExisting ) throw (::com::sun::star::uno::RuntimeException)
+ {
+     vos::OGuard aGuard(Application::GetSolarMutex());
+     SwFieldBookmark* pBkm = (SwFieldBookmark*)GetBookmark();
+     if (pBkm)
+-        pBkm->SetFFHelpText(description);
++        pBkm->addParam(name, value, replaceExisting);
+     else
+-        throw uno::RuntimeException();
++        throw uno::RuntimeException();    
+ }
+ 
+-
 +void SwXFieldmark::attachToRange(const uno::Reference< text::XTextRange > & xTextRange)
 +										throw( lang::IllegalArgumentException, uno::RuntimeException )
 +{
 +	attachToRangeEx(xTextRange, (isReplacementObject?IDocumentBookmarkAccess::FORM_FIELDMARK_NO_TEXT:IDocumentBookmarkAccess::FORM_FIELDMARK_TEXT));
 +}
-+
-+::rtl::OUString SwXFieldmark::getDescription(void) throw( ::com::sun::star::uno::RuntimeException )
-+{
-+	vos::OGuard aGuard(Application::GetSolarMutex());
-+	SwFieldBookmark* pBkm = (SwFieldBookmark*)GetBookmark();
-+	OUString sRet;
-+	if(pBkm)
-+		sRet = pBkm->GetFFHelpText();
-+	/* //@TODO implement...
-+	else if(bIsDescriptor)
-+		sRet = m_aName;
-+		*/
-+	else
-+		throw uno::RuntimeException();
-+	return sRet;
-+}
-+
-+::sal_Int16 SAL_CALL SwXFieldmark::getType(  ) throw (::com::sun::star::uno::RuntimeException)
-+{
-+	vos::OGuard aGuard(Application::GetSolarMutex());
-+	SwFieldBookmark* pBkm = (SwFieldBookmark*)GetBookmark();
-+	::sal_Int16 sRet;
-+	if(pBkm)
-+		sRet = pBkm->GetType();
-+	/* //@TODO implement...
-+	else if(bIsDescriptor)
-+		sRet = m_aName;
-+		*/
-+	else
-+		throw uno::RuntimeException();
-+	return sRet;
-+}
-+
-+::sal_Int16 SAL_CALL SwXFieldmark::getRes(  ) throw (::com::sun::star::uno::RuntimeException)
-+{
-+	vos::OGuard aGuard(Application::GetSolarMutex());
-+	SwFieldBookmark* pBkm = (SwFieldBookmark*)GetBookmark();
-+	::sal_Int16 sRet;
-+	if(pBkm)
-+		sRet = pBkm->GetFFRes();
-+	/* //@TODO implement...
-+	else if(bIsDescriptor)
-+		sRet = m_aName;
-+		*/
-+	else
-+		throw uno::RuntimeException();
-+	return sRet;
-+}
-+
-+
-+void SAL_CALL SwXFieldmark::setType( ::sal_Int16 fieldType ) throw (::com::sun::star::uno::RuntimeException)
-+{
-+	vos::OGuard aGuard(Application::GetSolarMutex());
-+	SwFieldBookmark* pBkm = (SwFieldBookmark*)GetBookmark();
-+	if (pBkm) {
-+		pBkm->SetType(fieldType);
-+	} else {
-+		throw uno::RuntimeException();
-+	}
-+}
-+
-+void SAL_CALL SwXFieldmark::setRes( ::sal_Int16 res ) throw (::com::sun::star::uno::RuntimeException)
-+{
-+	vos::OGuard aGuard(Application::GetSolarMutex());
-+	SwFieldBookmark* pBkm = (SwFieldBookmark*)GetBookmark();
-+	if (pBkm) {
-+		pBkm->SetFFRes(res);
-+	} else {
-+		throw uno::RuntimeException();
-+	}
-+}
-+
-+void SAL_CALL SwXFieldmark::setDescription( const ::rtl::OUString& description ) throw (::com::sun::star::uno::RuntimeException)
-+{
-+	vos::OGuard aGuard(Application::GetSolarMutex());
-+	SwFieldBookmark* pBkm = (SwFieldBookmark*)GetBookmark();
-+	if (pBkm) {
-+		pBkm->SetFFHelpText(description);
-+	} else {
-+		throw uno::RuntimeException();
-+	}
-+}
-+
-+
-+
-+/*
-+
-+::com::sun::star::uno::Any SAL_CALL SwXFieldmark::queryInterface( ::com::sun::star::uno::Type const & rType ) throw (::com::sun::star::uno::RuntimeException)
-+{
+ 
+ /*
+ 
+ ::com::sun::star::uno::Any SAL_CALL SwXFieldmark::queryInterface( ::com::sun::star::uno::Type const & rType ) throw (::com::sun::star::uno::RuntimeException)
+ {
+-        return SwXBookmark::queryInterface(rType);
 +		return SwXBookmark::queryInterface(rType);
-+}
-+*/
-+
-+
- /* -----------------18.02.99 13:31-------------------
-  *
-  * --------------------------------------------------*/
-diff --git a/sw/source/core/unocore/unocoll.cxx b/sw/source/core/unocore/unocoll.cxx
-index ba8fa57..dc4b53c 100644
---- sw/source/core/unocore/unocoll.cxx
-+++ sw/source/core/unocore/unocoll.cxx
-@@ -201,6 +201,8 @@ const ProvNamesId_Type __FAR_DATA aProvNamesId[] =
-     { "com.sun.star.image.ImageMapPolygonObject",             SW_SERVICE_IMAP_POLYGON },
-     { "com.sun.star.text.TextGraphicObject",                  SW_SERVICE_TYPE_TEXT_GRAPHIC },
-     { "com.sun.star.chart2.data.DataProvider",                SW_SERVICE_CHART2_DATA_PROVIDER },
-+    { "org.go-oo.text.Fieldmark",                             SW_SERVICE_TYPE_FIELDMARK },
-+    { "org.go-oo.text.FormFieldmark",                         SW_SERVICE_TYPE_FORMFIELDMARK },
- 
-     // case-correct versions of the service names (see #i67811)
-     { CSS_TEXT_TEXTFIELD_DATE_TIME,                   SW_SERVICE_FIELDTYPE_DATETIME },
-@@ -369,6 +371,18 @@ uno::Reference< uno::XInterface >  	SwXServiceProvider::MakeInstance(sal_uInt16
- 			xRet =  (cppu::OWeakObject*)pBookmark;
- 		}
- 		break;
-+		case  SW_SERVICE_TYPE_FIELDMARK :
-+		{
-+			SwXFieldmark* pFieldmark = new SwXFieldmark(false);
-+			xRet =  (cppu::OWeakObject*)pFieldmark;
-+		}
-+		break;
-+		case  SW_SERVICE_TYPE_FORMFIELDMARK :
-+		{
-+			SwXFieldmark* pFieldmark = new SwXFieldmark(true);
-+			xRet =  (cppu::OWeakObject*)pFieldmark;
-+		}
-+		break;
- 		case  SW_SERVICE_TYPE_FOOTNOTE :
- 			xRet =  (cppu::OWeakObject*)new SwXFootnote(sal_False);
- 		break;
-@@ -1569,8 +1583,15 @@ SwXBookmark* 	SwXBookmarks::GetObject( SwBookmark& rBkm, SwDoc* pDoc )
- {
- 	SwXBookmark* pBkm = (SwXBookmark*)SwClientIter( rBkm ).
- 									First( TYPE( SwXBookmark ));
--	if( !pBkm )
--		pBkm = new SwXBookmark(&rBkm, pDoc);
-+	if( !pBkm ) {
-+		if (IDocumentBookmarkAccess::FORM_FIELDMARK_TEXT==rBkm.GetType()) {
-+			pBkm = new SwXFieldmark(false, &rBkm, pDoc);
-+		} else if (IDocumentBookmarkAccess::FORM_FIELDMARK_NO_TEXT==rBkm.GetType()) {
-+			pBkm = new SwXFieldmark(true, &rBkm, pDoc);
-+		} else {
-+			pBkm = new SwXBookmark(&rBkm, pDoc);
-+		}
-+	}
- 	return pBkm;
  }
- /******************************************************************
-diff --git a/sw/source/core/unocore/unoport.cxx b/sw/source/core/unocore/unoport.cxx
-index ef8f73f..05fefba 100644
---- sw/source/core/unocore/unoport.cxx
-+++ sw/source/core/unocore/unoport.cxx
-@@ -314,6 +314,9 @@ void SwXTextPortion::GetPropertyValue(
-                 case PORTION_RUBY_START:
-                 case PORTION_RUBY_END:      pRet = "Ruby";break;
-                 case PORTION_SOFT_PAGEBREAK:pRet = "SoftPageBreak";break;
-+                case PORTION_FIELD_START:pRet = "TextFieldStart";break;
-+                case PORTION_FIELD_END:pRet = "TextFieldEnd";break;
-+                case PORTION_FIELD_START_END:pRet = "TextFieldStartEnd";break;
-                 default:
-                     pRet = 0;
-                 }
-@@ -357,6 +360,8 @@ void SwXTextPortion::GetPropertyValue(
-                     case PORTION_REDLINE_END :
-                     case PORTION_RUBY_START:
-                     case PORTION_RUBY_END:
-+                    case PORTION_FIELD_START:
-+                    case PORTION_FIELD_END:
-                         rVal.setValue(&bIsCollapsed, ::getBooleanCppuType());
-                     break;
-                     default:
-@@ -374,6 +379,7 @@ void SwXTextPortion::GetPropertyValue(
-                     case PORTION_TOXMARK_START:
-                     case PORTION_REDLINE_START:
-                     case PORTION_RUBY_START:
-+                    case PORTION_FIELD_START:
-                     break;
- 
-                     case PORTION_REFMARK_END:
-@@ -381,6 +387,7 @@ void SwXTextPortion::GetPropertyValue(
-                     case PORTION_BOOKMARK_END:
-                     case PORTION_REDLINE_END:
-                     case PORTION_RUBY_END:
-+                    case PORTION_FIELD_END:
-                         bStart = FALSE;
-                     break;
-                     default:
+ */
+ 
 diff --git a/sw/source/core/unocore/unoportenum.cxx b/sw/source/core/unocore/unoportenum.cxx
-index 17c144e..4371eed 100644
+index fc11495..c4160ba 100644
 --- sw/source/core/unocore/unoportenum.cxx
 +++ sw/source/core/unocore/unoportenum.cxx
-@@ -658,6 +658,10 @@ void lcl_FillBookmarkArray(SwDoc& rDoc,SwUnoCrsr& rUnoCrsr, SwXBookmarkPortion_I
-                  !dynamic_cast<SwCrossRefBookmark*>(pMark) )
- 				continue;
- 
-+	    if (pMark!=NULL && pMark->IsFormFieldMark()) {
-+		continue;
-+	    }
-+
-             const SwPosition& rPos1 = pMark->GetBookmarkPos();
-             // --> OD 2007-10-23 #i81002#
- //            const SwPosition* pPos2 = pMark->GetOtherBookmarkPos();
-@@ -981,8 +985,78 @@ void SwXTextPortionEnumeration::CreatePortions()
- 							}
- 						}
- 					}
--					if(!xRef.is() && pUnoCrsr->HasMark() )
--                        xRef = new SwXTextPortion(pUnoCrsr, xParent, ePortionType);
-+					if(!xRef.is() && pUnoCrsr->HasMark() ) {
-+						//flr: maybe its a good idea to add a special hint to the hints array and rely on the hint segmentation....
-+						xub_StrLen start=pUnoCrsr->GetMark()->nContent.GetIndex();
-+						xub_StrLen end=pUnoCrsr->GetPoint()->nContent.GetIndex();
-+						ASSERT(start<=end, "hmm --- why is this different");
-+						xub_StrLen startMarkerPos=pTxtNode->GetTxt().Search(CH_TXT_ATR_FIELDSTART, start);
-+						xub_StrLen endMarkerPos=pTxtNode->GetTxt().Search(CH_TXT_ATR_FIELDEND, start);
-+						xub_StrLen formMarkerPos=pTxtNode->GetTxt().Search(CH_TXT_ATR_FORMELEMENT, start);
-+						xub_StrLen markerPos=STRING_LEN;
-+						if (startMarkerPos>=start && startMarkerPos<end) {
-+							markerPos=startMarkerPos;
-+						}
-+						if (endMarkerPos>=start && endMarkerPos<end) {
-+							if (endMarkerPos<markerPos) {
-+								markerPos=endMarkerPos;
-+							}
-+						}
-+						if (formMarkerPos>=start && formMarkerPos<end) {
-+							if (formMarkerPos<markerPos) {
-+								markerPos=formMarkerPos;
-+							}
-+						}
-+						if (markerPos<end) {
-+							if (start==markerPos)
-+								end = markerPos+1;
-+							else
-+								end = markerPos;
-+							bAtEnd = sal_False;
-+							pUnoCrsr->GetPoint()->nContent = end;
-+						}
-+						if (start+1==end && pTxtNode->GetTxt().GetChar(start)==CH_TXT_ATR_FIELDSTART) {
-+						    SwDoc* pDoc = pUnoCrsr->GetDoc();
-+							SwBookmark* pFieldmark=NULL;
-+							if (pDoc && pUnoCrsr->GetPoint()) {
-+								pFieldmark=pDoc->getFieldBookmarkFor(*pUnoCrsr->GetPoint());
-+							}
-+							SwXTextPortion* pPortion=NULL;
-+							xRef = (pPortion=new SwXTextPortion(pUnoCrsr, xParent, PORTION_FIELD_START));
-+							if (pPortion && pFieldmark && pDoc) {
-+								pPortion->SetBookmark(new SwXFieldmark(false, pFieldmark, pDoc));
-+							}
-+						} else if (start+1==end && pTxtNode->GetTxt().GetChar(start)==CH_TXT_ATR_FIELDEND) {
-+						    SwDoc* pDoc = pUnoCrsr->GetDoc();
-+							SwBookmark* pFieldmark=NULL;
-+							if (pDoc && pUnoCrsr->GetPoint()) {
-+								SwPosition aPos(*pUnoCrsr->GetPoint());
-+								aPos.nContent=markerPos;
-+								pFieldmark=pDoc->getFieldBookmarkFor(aPos);
-+							}
-+							SwXTextPortion* pPortion=NULL;
-+							xRef = (pPortion = new SwXTextPortion(pUnoCrsr, xParent, PORTION_FIELD_END));
-+							if (pPortion && pFieldmark && pDoc) {
-+								pPortion->SetBookmark(new SwXFieldmark(false, pFieldmark, pDoc));
-+							}
-+						} else if (start+1==end && pTxtNode->GetTxt().GetChar(start)==CH_TXT_ATR_FORMELEMENT) {
-+						    SwDoc* pDoc = pUnoCrsr->GetDoc();
-+							SwFieldBookmark* pFieldmark=NULL;
-+							if (pDoc && pUnoCrsr->GetPoint()) {
-+								SwPosition aPos(*pUnoCrsr->GetPoint());
-+								aPos.nContent=markerPos;
-+								pFieldmark=pDoc->getFormFieldBookmarkFor(aPos);
-+							}
-+							SwXTextPortion* pPortion=NULL;							
-+							xRef = (pPortion = new SwXTextPortion(pUnoCrsr, xParent, PORTION_FIELD_START_END));
-+							if (pPortion && pFieldmark && pDoc) {
-+								pPortion->SetBookmark(new SwXFieldmark(true, pFieldmark, pDoc));
-+							}
-+						} else {
-+							xRef = new SwXTextPortion(pUnoCrsr, xParent, ePortionType);
-+						}
-+						
-+					}
- 					if(xRef.is())
- 						aPortionArr.Insert(new Reference<XTextRange>(xRef), aPortionArr.Count());
- 				}
-diff --git a/sw/source/filter/inc/fltshell.hxx b/sw/source/filter/inc/fltshell.hxx
-index 1a13705..5bee930 100644
---- sw/source/filter/inc/fltshell.hxx
-+++ sw/source/filter/inc/fltshell.hxx
-@@ -80,6 +80,7 @@ public:
- 	BOOL bOld;			// to mark Attributes *before* skipping field results
- 	BOOL bLocked;
- 	BOOL bCopied;
-+	BOOL bConsumedByField;
- 
- 	SwFltStackEntry(const SwPosition & rStartPos, SfxPoolItem* pHt );
- 	SwFltStackEntry(const SwFltStackEntry& rEntry);
-@@ -128,7 +129,7 @@ public:
- 
- 	void NewAttr(const SwPosition& rPos, const SfxPoolItem & rAttr );
- 
--	virtual void SetAttr(const SwPosition& rPos, USHORT nAttrId=0, BOOL bTstEnde=TRUE, long nHand = LONG_MAX);
-+	virtual void SetAttr(const SwPosition& rPos, USHORT nAttrId=0, BOOL bTstEnde=TRUE, long nHand = LONG_MAX, BOOL consumedByField=FALSE);
- 
- 	void StealAttr(const SwPosition* pPos, USHORT nAttrId = 0);
- 	void MarkAllAttrsOld();
-diff --git a/sw/source/filter/ww1/fltshell.cxx b/sw/source/filter/ww1/fltshell.cxx
-index bd671f7..4779d61 100644
---- sw/source/filter/ww1/fltshell.cxx
-+++ sw/source/filter/ww1/fltshell.cxx
-@@ -106,6 +106,7 @@ SwFltStackEntry::SwFltStackEntry(const SwPosition& rStartPos, SfxPoolItem* pHt )
- 	bOld	= FALSE;	// used for marking Attributes *before* skipping field results
- 	bLocked = TRUE; 	// locke das Attribut --> darf erst
- 	bCopied = FALSE;	// gesetzt werden, wenn es wieder geunlocked ist
-+	bConsumedByField = FALSE;
- }
- 
- SwFltStackEntry::SwFltStackEntry(const SwFltStackEntry& rEntry) :
-@@ -116,6 +117,7 @@ SwFltStackEntry::SwFltStackEntry(const SwFltStackEntry& rEntry) :
- 	nMkCntnt= rEntry.nMkCntnt;
- 	bOld	= rEntry.bOld;
- 	bLocked	= bCopied = TRUE; // when rEntry were NOT bLocked we would never have been called
-+	bConsumedByField = rEntry.bConsumedByField;
- }
- 
- 
-@@ -302,7 +304,7 @@ void SwFltControlStack::KillUnlockedAttrs(const SwPosition& pPos)
- // Returned, ob das gesuchte Attribut / die gesuchten Attribute
- // ueberhaupt auf dem Stack standen
- void SwFltControlStack::SetAttr(const SwPosition& rPos, USHORT nAttrId,
--								BOOL bTstEnde, long nHand )
-+								BOOL bTstEnde, long nHand, BOOL consumedByField )
- {
- 	ASSERT(!nAttrId ||
- 		(POOLATTR_BEGIN <= nAttrId && POOLATTR_END > nAttrId) ||
-@@ -330,8 +332,10 @@ void SwFltControlStack::SetAttr(const SwPosition& rPos, USHORT nAttrId,
- 					bF = true;
- 				}
- 			}
--			if (bF)
-+			if (bF) {
-+				pEntry->bConsumedByField = consumedByField;
- 				pEntry->SetEndPos(rPos);
-+			}
- 			continue;
- 		}
+@@ -653,15 +653,7 @@ void lcl_FillBookmarkArray(SwDoc& rDoc,SwUnoCrsr& rUnoCrsr, SwXBookmarkPortion_I
+         for( sal_uInt16 n = 0; n < nArrLen; ++n )
+         {
+             SwBookmark* pMark = rMarks.GetObject( n );
+-            /*
+-            if (pMark!=NULL && pMark->GetName().CompareToAscii(FIELD_BOOKMARK_PREFIX, strlen(FIELD_BOOKMARK_PREFIX))==0) {
+-                continue;
+-            }
  
-@@ -503,7 +507,7 @@ void SwFltControlStack::SetAttrInDoc(const SwPosition& rTmpPos, SwFltStackEntry*
- 				}
- 			}
- 			if( !pB->IsOnlyRef() &&
--				( !IsFlagSet(HYPO) || IsFlagSet(BOOK_AND_REF) ) )
-+				( !IsFlagSet(HYPO) || IsFlagSet(BOOK_AND_REF) ) && !pEntry->bConsumedByField)
- 			{
- 				MakeBookRegionOrPoint(pEntry, pDoc, aRegion, TRUE);
-                 pDoc->makeBookmark( aRegion, aEmptyKeyCode, rName, aEmptyStr, IDocumentBookmarkAccess::BOOKMARK);
+-            if (pMark!=NULL && pMark->GetName().CompareToAscii(FIELD_FORM_BOOKMARK_PREFIX, strlen(FIELD_FORM_BOOKMARK_PREFIX))==0) {
+-                continue;
+-            }
+-            */
+             if (pMark!=NULL && pMark->IsFormFieldMark())
+             {
+                 continue;
 diff --git a/sw/source/filter/ww8/wrtw8nds.cxx b/sw/source/filter/ww8/wrtw8nds.cxx
-index bbb2d97..b25a1b6 100644
+index 555ec8d..19a06fa 100644
 --- sw/source/filter/ww8/wrtw8nds.cxx
 +++ sw/source/filter/ww8/wrtw8nds.cxx
-@@ -104,6 +104,10 @@
- #include "wrtww8.hxx"
- #include "ww8par.hxx"
+@@ -112,6 +112,45 @@ using namespace sw::util;
+ using namespace sw::types;
+ using namespace nsFieldFlags;
  
-+#ifndef _BOOKMRK_HXX
-+#include <bookmrk.hxx>
-+#endif
 +
- using namespace ::com::sun::star;
- using namespace ::com::sun::star::i18n;
- using namespace sw::util;
-@@ -288,12 +292,22 @@ xub_StrLen WW8_SwAttrIter::SearchNext( xub_StrLen nStartPos )
-     xub_StrLen nMinPos = STRING_MAXLEN;
-     xub_StrLen i=0;
++static String lcl_getFieldCode(SwFieldBookmark* pFieldmark) {
++    ASSERT(pFieldmark!=NULL, "where is my fieldmark???");
++    if (pFieldmark->isType(ECMA_FORMTEXT)) {
++	return String::CreateFromAscii(" FORMTEXT ");
++    } else if (pFieldmark->isType(ECMA_FORMDROPDOWN)) {
++	return String::CreateFromAscii(" FORMDROPDOWN ");
++    } else if (pFieldmark->isType(ECMA_FORMCHECKBOX)) {
++	return String::CreateFromAscii(" FORMCHECKBOX ");
++    } else if (pFieldmark->isType(ECMA_TOC)) {
++	return String::CreateFromAscii(" TOC ");
++    } else if (pFieldmark->isType(ECMA_HYPERLINK)) {
++	return String::CreateFromAscii(" HYPERLINK ");
++    } else if (pFieldmark->isType(ECMA_PAGEREF)) {
++	return String::CreateFromAscii(" PAGEREF ");
++    } else {
++	return pFieldmark->getTypeName();
++    }
++}
++
++ww::eField lcl_getFieldId(SwFieldBookmark* pFieldmark) {
++    ASSERT(pFieldmark!=NULL, "where is my fieldmark???");
++    if (pFieldmark->isType(ECMA_FORMTEXT)) {
++	return ww::eFORMTEXT;
++    } else if (pFieldmark->isType(ECMA_FORMDROPDOWN)) {
++	return ww::eFORMCHECKBOX;
++    } else if (pFieldmark->isType(ECMA_FORMCHECKBOX)) {
++	return ww::eFORMDROPDOWN;
++    } else if (pFieldmark->isType(ECMA_TOC)) {
++	return ww::eTOC;
++    } else if (pFieldmark->isType(ECMA_HYPERLINK)) {
++	return ww::eHYPERLINK;
++    } else if (pFieldmark->isType(ECMA_PAGEREF)) {
++	return ww::ePAGEREF;
++    } else {
++	return ww::eUNKNOWN;
++    }    
++}
++
+ /*  */
  
-+	const String aTxt = rNd.GetTxt();
-+	xub_StrLen pos=aTxt.Search(CH_TXT_ATR_FIELDSTART, nStartPos);
+ WW8_AttrIter::WW8_AttrIter(SwWW8Writer& rWr)
+@@ -288,19 +327,17 @@ xub_StrLen WW8_SwAttrIter::SearchNext( xub_StrLen nStartPos )
+ {
+     xub_StrLen nPos;
+     xub_StrLen nMinPos = STRING_MAXLEN;
++    xub_StrLen i=0;
++
+ 	const String aTxt = rNd.GetTxt();
+ 	xub_StrLen pos = aTxt.Search(CH_TXT_ATR_FIELDSTART, nStartPos);
+-	if( pos==STRING_NOTFOUND )
+-    {
+-		pos = aTxt.Search(CH_TXT_ATR_FIELDEND, nStartPos);
+-        if( pos==STRING_NOTFOUND )
+-            pos = aTxt.Search(CH_TXT_ATR_FORMELEMENT, nStartPos);
+-    }
+-	if( pos!=STRING_NOTFOUND )
 +	if (pos==STRING_NOTFOUND) 
 +		pos=aTxt.Search(CH_TXT_ATR_FIELDEND, nStartPos);
 +	if (pos==STRING_NOTFOUND) 
 +		pos=aTxt.Search(CH_TXT_ATR_FORMELEMENT, nStartPos);
 +	if (pos!=STRING_NOTFOUND)  
-+		nMinPos=pos;
-+
+ 		nMinPos=pos;
+ 
+-    xub_StrLen i=0;
+-
      // first the redline, then the attributes
      if( pCurRedline )
      {
-         const SwPosition* pEnd = pCurRedline->End();
-         if (pEnd->nNode == rNd && ((i = pEnd->nContent.GetIndex()) >= nStartPos))
--            nMinPos = i;
-+			if (i<nMinPos)
-+				nMinPos = i;
-     }
- 
-     if( nCurRedlinePos < rWrt.pDoc->GetRedlineTbl().Count() )
-@@ -1526,8 +1540,65 @@ Writer& OutWW8_SwTxtNode( Writer& rWrt, SwCntntNode& rNode )
-         xub_StrLen nLen = nNextAttr - nAktPos;
-         if (!bTxtAtr && nLen)
-         {
--            String aSnippet(aAttrIter.GetSnippet(aStr, nAktPos, nLen));
--            if ((rWW8Wrt.nTxtTyp == TXT_EDN || rWW8Wrt.nTxtTyp == TXT_FTN) && nAktPos ==0)
-+			sal_Unicode ch=aStr.GetChar(nAktPos);
-+			int ofs=(ch==CH_TXT_ATR_FIELDSTART || ch==CH_TXT_ATR_FIELDEND || ch==CH_TXT_ATR_FORMELEMENT?1:0);
-+
-+			if (ch==CH_TXT_ATR_FIELDSTART) {
-+				SwPosition aPosition( *pNd, SwIndex( (SwTxtNode*)pNd, nAktPos+1 ) );
-+				SwFieldBookmark* pFieldmark=(SwFieldBookmark*)rWW8Wrt.pDoc->getFieldBookmarkFor( aPosition );
-+				ASSERT(pFieldmark!=NULL, "Looks like this doc is broken...; where is the Fieldmark for the FIELDSTART??");
-+
-+				if (pFieldmark!=NULL) {
-+					rWW8Wrt.AppendBookmark( pFieldmark->GetName(), 1);
-+				}
-+				rWW8Wrt.OutField(NULL, ww::eFORMTEXT, String::CreateFromAscii(" FORMTEXT "), WRITEFIELD_START | WRITEFIELD_CMD_START);	
-+				if (pFieldmark!=NULL) {
-+					rWW8Wrt.WriteFormData( *pFieldmark );
-+				}
-+				rWW8Wrt.OutField(NULL, ww::eFORMTEXT, String(), WRITEFIELD_CMD_END);
-+			} else if (ch==CH_TXT_ATR_FIELDEND) {
-+				SwPosition aPosition( *pNd, SwIndex( (SwTxtNode*)pNd, nAktPos ) );
-+				SwFieldBookmark* pFieldmark=(SwFieldBookmark*)rWW8Wrt.pDoc->getFieldBookmarkFor( aPosition );
-+				ASSERT(pFieldmark!=NULL, "Looks like this doc is broken...; where is the Fieldmark for the FIELDSTART??");
-+				rWW8Wrt.OutField(NULL, ww::eFORMTEXT, String(), WRITEFIELD_CLOSE);
-+				if (pFieldmark!=NULL) {
-+					rWW8Wrt.AppendBookmark( pFieldmark->GetName(), 0);
-+				}
-+			} else if (ch==CH_TXT_ATR_FORMELEMENT) {
-+				SwPosition aPosition( *pNd, SwIndex( (SwTxtNode*)pNd, nAktPos ) );
-+				SwFieldBookmark* pFieldmark=rWW8Wrt.pDoc->getFormFieldBookmarkFor( aPosition );
-+				ASSERT(pFieldmark!=NULL, "Looks like this doc is broken...; where is the Fieldmark for the FIELDSTART??");
-+				if (pFieldmark!=NULL) {
-+					rWW8Wrt.AppendBookmark( pFieldmark->GetName(), 1);
-+				}
-+				if (pFieldmark!=NULL) {
-+				    switch (pFieldmark->GetType()) {
-+					case 0: assert(0); /* should not happend*/ break;
-+					case 1: /* CHECKBOX */ 
-+					    rWW8Wrt.OutField(NULL, ww::eFORMCHECKBOX, String::CreateFromAscii(" FORMCHECKBOX "), WRITEFIELD_START | WRITEFIELD_CMD_START);
-+					    
-+					    rWW8Wrt.WriteFormData( *pFieldmark );
-+					    rWW8Wrt.OutField(NULL, ww::eFORMCHECKBOX, String(), WRITEFIELD_CMD_END | WRITEFIELD_CLOSE);
-+					    break;
-+					case 2: /* LIST */ 
-+					    rWW8Wrt.OutField(NULL, ww::eFORMDROPDOWN, String::CreateFromAscii(" FORMDROPDOWN "), WRITEFIELD_START | WRITEFIELD_CMD_START);
-+					    
-+					    rWW8Wrt.WriteFormData( *pFieldmark );
-+					    rWW8Wrt.OutField(NULL, ww::eFORMDROPDOWN, String(), WRITEFIELD_CMD_END | WRITEFIELD_CLOSE);
-+					    break;
-+					default:
-+					    break;
-+
-+
+@@ -1553,39 +1590,46 @@ Writer& OutWW8_SwTxtNode( Writer& rWrt, SwCntntNode& rNode )
+ 				SwPosition aPosition( *pNd, SwIndex( (SwTxtNode*)pNd, nAktPos+1 ) );
+ 				SwFieldBookmark* pFieldmark=(SwFieldBookmark*)rWW8Wrt.pDoc->getFieldBookmarkFor( aPosition );
+ 				ASSERT(pFieldmark!=NULL, "Looks like this doc is broken...; where is the Fieldmark for the FIELDSTART??");
+-
+ 				if (pFieldmark!=NULL) {
++				    if (pFieldmark->isType(ECMA_FORMTEXT)) {
+ 					rWW8Wrt.AppendBookmark( pFieldmark->GetName(), 1);
+-				}
+-				rWW8Wrt.OutField(NULL, ww::eFORMTEXT, String::CreateFromAscii(" FORMTEXT "), WRITEFIELD_START | WRITEFIELD_CMD_START);	
+-				if (pFieldmark!=NULL) {
 +				    }
-+				}
-+				if (pFieldmark!=NULL) {
-+					rWW8Wrt.AppendBookmark( pFieldmark->GetName(), 0);
-+				}
-+			}
-+			nLen-=ofs;
-+			String aSnippet(aAttrIter.GetSnippet(aStr, nAktPos+ofs, nLen));
-+            if ((rWW8Wrt.nTxtTyp == TXT_EDN || rWW8Wrt.nTxtTyp == TXT_FTN) && nAktPos ==0 && nLen>0)
-             {
-                 // Insert tab for aesthetic puposes #i24762#
-                 if (aSnippet.GetChar(0) != 0x09)
-@@ -1535,7 +1606,7 @@ Writer& OutWW8_SwTxtNode( Writer& rWrt, SwCntntNode& rNode )
-                     nLen++;
-                     aSnippet.Insert(0x09,0);
-                 }
--            }
-+			}
-             rWW8Wrt.OutSwString(aSnippet, 0, nLen, bUnicode, eChrSet );
-         }
- 
++				    rWW8Wrt.OutField(NULL, lcl_getFieldId(pFieldmark), lcl_getFieldCode(pFieldmark), WRITEFIELD_START | WRITEFIELD_CMD_START);	
++				    if (pFieldmark->isType(ECMA_FORMTEXT)) {
+ 					rWW8Wrt.WriteFormData( *pFieldmark );
++				    }
++				    if (pFieldmark->isType(ECMA_HYPERLINK)) {
++					rWW8Wrt.WriteHyperlinkData( *pFieldmark );
++				    }
++				    rWW8Wrt.OutField(NULL, lcl_getFieldId(pFieldmark), String(), WRITEFIELD_CMD_END);
+ 				}
+-				rWW8Wrt.OutField(NULL, ww::eFORMTEXT, String(), WRITEFIELD_CMD_END);
+ 			} else if (ch==CH_TXT_ATR_FIELDEND) {
+ 				SwPosition aPosition( *pNd, SwIndex( (SwTxtNode*)pNd, nAktPos ) );
+ 				SwFieldBookmark* pFieldmark=(SwFieldBookmark*)rWW8Wrt.pDoc->getFieldBookmarkFor( aPosition );
+ 				ASSERT(pFieldmark!=NULL, "Looks like this doc is broken...; where is the Fieldmark for the FIELDSTART??");
+-				rWW8Wrt.OutField(NULL, ww::eFORMTEXT, String(), WRITEFIELD_CLOSE);
+ 				if (pFieldmark!=NULL) {
++				    rWW8Wrt.OutField(NULL, lcl_getFieldId(pFieldmark), String(), WRITEFIELD_CLOSE);
++				    if (pFieldmark->isType(ECMA_FORMTEXT)) {
+ 					rWW8Wrt.AppendBookmark( pFieldmark->GetName(), 0);
++				    }
+ 				}
+ 			} else if (ch==CH_TXT_ATR_FORMELEMENT) {
+ 				SwPosition aPosition( *pNd, SwIndex( (SwTxtNode*)pNd, nAktPos ) );
+ 				SwFieldBookmark* pFieldmark=rWW8Wrt.pDoc->getFormFieldBookmarkFor( aPosition );
+ 				ASSERT(pFieldmark!=NULL, "Looks like this doc is broken...; where is the Fieldmark for the FIELDSTART??");
+ 				if (pFieldmark!=NULL) {
++				    if (pFieldmark->isType(ECMA_FORMDROPDOWN) || pFieldmark->isType(ECMA_FORMCHECKBOX)) {
+ 					rWW8Wrt.AppendBookmark( pFieldmark->GetName(), 1);
+-				}
+-				rWW8Wrt.OutField(NULL, ww::eFORMCHECKBOX, String::CreateFromAscii(" FORMCHECKBOX "), WRITEFIELD_START | WRITEFIELD_CMD_START);
+-				if (pFieldmark!=NULL) {
+-
++				    }
++				    rWW8Wrt.OutField(NULL, lcl_getFieldId(pFieldmark), lcl_getFieldCode(pFieldmark), WRITEFIELD_START | WRITEFIELD_CMD_START);
++				    if (pFieldmark->isType(ECMA_FORMCHECKBOX) || pFieldmark->isType(ECMA_FORMDROPDOWN)) {
+ 					rWW8Wrt.WriteFormData( *pFieldmark );
+-				}
+-				rWW8Wrt.OutField(NULL, ww::eFORMCHECKBOX, String(), WRITEFIELD_CMD_END | WRITEFIELD_CLOSE);
+-				if (pFieldmark!=NULL) {
++				    }
++				    rWW8Wrt.OutField(NULL, lcl_getFieldId(pFieldmark), String(), WRITEFIELD_CMD_END | WRITEFIELD_CLOSE);
++				    if (pFieldmark->isType(ECMA_FORMDROPDOWN) || pFieldmark->isType(ECMA_FORMCHECKBOX)) {
+ 					rWW8Wrt.AppendBookmark( pFieldmark->GetName(), 0);
+-				}
++				    }
++				}		
+ 			}
+ 			nLen-=static_cast<USHORT>(ofs);
+ 			String aSnippet(aAttrIter.GetSnippet(aStr, nAktPos+static_cast<USHORT>(ofs), nLen));
 diff --git a/sw/source/filter/ww8/wrtww8.cxx b/sw/source/filter/ww8/wrtww8.cxx
-index 4f1ba07..935d5c6 100644
+index cb5bf18..16c53ca 100644
 --- sw/source/filter/ww8/wrtww8.cxx
 +++ sw/source/filter/ww8/wrtww8.cxx
-@@ -103,6 +103,10 @@
- #include <com/sun/star/document/XDocumentProperties.hpp>
- 
+@@ -108,9 +108,8 @@
+ #include "writerhelper.hxx"
+ #include "writerwordglue.hxx"
  
-+#ifndef IDOCUMENTBOOKMARKACCESS_HXX_INCLUDED
-+#include <IDocumentBookmarkAccess.hxx>
-+#endif
-+
- using namespace sw::util;
- using namespace sw::types;
- 
-@@ -185,7 +189,7 @@ public:
-     WW8_WrtBookmarks();
-     ~WW8_WrtBookmarks();
- 
--    void Append( WW8_CP nStartCp, const String& rNm );
-+    void Append( WW8_CP nStartCp, const String& rNm, const SwBookmark* pBkmk=NULL );
-     void Write( SwWW8Writer& rWrt );
-     void MoveFieldBookmarks(ULONG nFrom,ULONG nTo);
+-#ifndef IDOCUMENTBOOKMARKACCESS_HXX_INCLUDED
+ #include <IDocumentBookmarkAccess.hxx>
+-#endif
++#include <ecmaflds.hxx>
  
-@@ -1222,7 +1226,7 @@ WW8_WrtBookmarks::~WW8_WrtBookmarks()
- {
- }
+ #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
+ #include <com/sun/star/document/XDocumentProperties.hpp>
+@@ -2280,7 +2279,7 @@ void SwWW8Writer::OutWW8TableBackgrounds
  
--void WW8_WrtBookmarks::Append( WW8_CP nStartCp, const String& rNm )
-+void WW8_WrtBookmarks::Append( WW8_CP nStartCp, const String& rNm,  const SwBookmark* pBkmk)
+ void SwWW8Writer::WriteText()
  {
-     USHORT nPos = GetPos( rNm );
-     if( USHRT_MAX == nPos )
-@@ -1254,7 +1258,7 @@ void WW8_WrtBookmarks::Append( WW8_CP nStartCp, const String& rNm )
-         if (aFieldBookmarks[nPos])
-             --nStartCp;
- 
--        aEndCps.Replace( nStartCp, nPos );
-+		aEndCps.Replace( nStartCp, nPos );
-     }
- }
+-#ifdef DEBUG
++#ifndef NDEBUG
+     ::std::clog << "<WriteText>" << ::std::endl;
+     ::std::clog << dbg_out(pCurPam->GetDoc()->GetNodes()) << ::std::endl;
+ #endif
+@@ -3159,8 +3158,17 @@ void SwWW8Writer::WriteFormData(SwFieldBookmark &rFieldmark)
+ 	ASSERT(bWrtWW8, "No 95 export yet");
+ 	if (!bWrtWW8) return;
+ 
+-	int type=rFieldmark.GetFieldType();
+-	const String ffname=rFieldmark.GetFFName();
++	ASSERT(rFieldmark.isType(ECMA_FORMTEXT) || rFieldmark.isType(ECMA_FORMDROPDOWN) || rFieldmark.isType(ECMA_FORMCHECKBOX), "Unknown field type!!!");
++	if (!(rFieldmark.isType(ECMA_FORMTEXT) || rFieldmark.isType(ECMA_FORMDROPDOWN) || rFieldmark.isType(ECMA_FORMCHECKBOX)))
++	    return;
++
++	int type=0;
++	if (rFieldmark.isType(ECMA_FORMCHECKBOX))
++	    type=1;
++	if (rFieldmark.isType(ECMA_FORMDROPDOWN))
++	    type=2;
++	
++	const String ffname=rFieldmark.getParam("name").second;
  
-@@ -1352,6 +1356,9 @@ void SwWW8Writer::AppendBookmarks( const SwTxtNode& rNd,
-         for( USHORT n = 0; n < aArr.Count(); ++n )
-         {
-             const SwBookmark& rBkmk = *(SwBookmark*)aArr[ n ];
-+	    if (rBkmk.IsFormFieldMark()) {
-+		continue;
-+	    }
-             const SwPosition* pPos = &rBkmk.GetBookmarkPos(),
-                             * pOPos = rBkmk.GetOtherBookmarkPos();
-             if( pOPos && pOPos->nNode == pPos->nNode &&
-@@ -1366,14 +1373,14 @@ void SwWW8Writer::AppendBookmarks( const SwTxtNode& rNd,
-                 nCntnt < nAktEnd ) )
-             {
-                 ULONG nCp = nSttCP + pPos->nContent.GetIndex() - nAktPos;
--                pBkmks->Append(nCp, BookmarkToWord(rBkmk.GetName()));
-+                pBkmks->Append(nCp, BookmarkToWord(rBkmk.GetName()), &rBkmk);
-             }
--            if( pOPos && nNd == pOPos->nNode.GetIndex() &&
-+			if( pOPos && nNd == pOPos->nNode.GetIndex() &&
-                 ( nCntnt = pOPos->nContent.GetIndex() ) >= nAktPos &&
-                 nCntnt < nAktEnd )
-             {
-                 ULONG nCp = nSttCP + pOPos->nContent.GetIndex() - nAktPos;
--                pBkmks->Append(nCp, BookmarkToWord(rBkmk.GetName()));
-+                pBkmks->Append(nCp, BookmarkToWord(rBkmk.GetName()), &rBkmk);
-             }
-         }
-     }
-@@ -1565,6 +1572,17 @@ void SwWW8Writer::WriteString16(SvStream& rStrm, const String& rStr,
-         rStrm.Write(&aBytes[0], aBytes.size());
- }
+ 	ULONG nDataStt = pDataStrm->Tell();
+     pChpPlc->AppendFkpEntry( Strm().Tell() );
+@@ -3182,13 +3190,29 @@ void SwWW8Writer::WriteFormData(SwFieldBookmark &rFieldmark)
+ 	sal_uInt8 aFldHeader[] = 
+ 	{
+ 		0xFF, 0xFF, 0xFF, 0xFF, // Unicode Marker...
+-		0, 0, 0, 0//, 0, 0, 0, 0
++		0, 0, 0, 0, 0, 0 //, 0, 0
+ 	};
  
-+void SwWW8Writer::WriteString_xstz(SvStream& rStrm, const String& rStr, bool bAddZero)
-+{
-+    ww::bytes aBytes;
-+    SwWW8Writer::InsUInt16(aBytes, rStr.Len());
-+    SwWW8Writer::InsAsString16(aBytes, rStr);
-+	if (bAddZero) 
-+		SwWW8Writer::InsUInt16(aBytes, 0);
-+	rStrm.Write(&aBytes[0], aBytes.size());
-+}
-+
+ 	aFldHeader[4] |= (type & 0x03);
+-	int ffres=rFieldmark.GetFFRes();
++	int ffres=0;
++	if (type==1) { // checkbox
++	    ffres=rFieldmark.getParam(ECMA_FORMCHECKBOX_CHECKED).second.compareToAscii("on")==0;
++	} else if (type==2) { // drop down
++	    ffres=rFieldmark.getParam(ECMA_FORMDROPDOWN_RESULT, "0").second.toInt32();
++	}
 +
- void SwWW8Writer::WriteString8(SvStream& rStrm, const String& rStr,
-     bool bAddZero, rtl_TextEncoding eCodeSet)
- {
-@@ -2580,5 +2598,118 @@ void SwWW8Writer::RestoreMacroCmds()
-     pFib->lcbCmds = pTableStrm->Tell() - pFib->fcCmds;
- }
+ 	aFldHeader[4] |= ((ffres<<2) & 0x7C);
  
-+void SwWW8Writer::WriteFormData(SwFieldBookmark &rFieldmark)
-+{
-+	ASSERT(bWrtWW8, "No 95 export yet");
-+	if (!bWrtWW8) return;
-+
-+	int type=rFieldmark.GetType();
-+	const String ffname=rFieldmark.GetFFName();
-+
-+	ULONG nDataStt = pDataStrm->Tell();
-+    pChpPlc->AppendFkpEntry( Strm().Tell() );
-+
-+    WriteChar( 0x01 );
-+    static BYTE aArr1[] = {
-+        0x03, 0x6a, 0,0,0,0,    // sprmCPicLocation
 +
-+        0x06, 0x08, 0x01,       // sprmCFData
-+        0x55, 0x08, 0x01,       // sprmCFSpec
-+        0x02, 0x08, 0x01        // sprmCFFldVanish
-+    };
-+    BYTE* pDataAdr = aArr1 + 2;
-+    Set_UInt32( pDataAdr, nDataStt );
-+
-+    pChpPlc->AppendFkpEntry(Strm().Tell(),
-+                sizeof( aArr1 ), aArr1 );
-+
-+	sal_uInt8 aFldHeader[] = 
-+	{
-+		0xFF, 0xFF, 0xFF, 0xFF, // Unicode Marker...
-+		0, 0, 0, 0, 0, 0 //, 0, 0
-+	};
-+
-+	aFldHeader[4] |= (type & 0x03);
-+	int ffres=rFieldmark.GetFFRes();
-+	aFldHeader[4] |= ((ffres<<2) & 0x7C);
-+
-+
-+	if (rFieldmark.GetType()==2) {
++	std::vector< ::rtl::OUString > aListItems;
++	if (type==2) {
 +	    aFldHeader[5] |= 0x80; // ffhaslistbox
++	    for(int i=0;i<rFieldmark.getNumOfParams();i++) {
++		if (rFieldmark.getParam(i).first.compareToAscii(ECMA_FORMDROPDOWN_LISTENTRY)==0)
++		    aListItems.push_back(rFieldmark.getParam(i).second);
++	    }
 +	}
 +
-+	const String ffdeftext;
-+	const String ffformat;
-+	const String ffhelptext;
-+	const String ffstattext;
-+	const String ffentrymcr;
-+	const String ffexitmcr;
+ 	const String ffdeftext;
+ 	const String ffformat;
+ 	const String ffhelptext;
+@@ -3196,6 +3220,7 @@ void SwWW8Writer::WriteFormData(SwFieldBookmark &rFieldmark)
+ 	const String ffentrymcr;
+ 	const String ffexitmcr;
+ 
 +
-+    const sal_uInt8 aFldData[] =
-+    {
-+        0,0,0,0,        // len of struct
-+        0x44,0,         // the start of "next" data             
-+        0,0,0,0,0,0,0,0,0,0,                // PIC-Structure!  /10
-+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    //  |              /16
-+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    //  |              /16
-+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,    //  |              /16
-+        0,0,0,0,                            // /               /4
-+    };
-+	int slen=sizeof(aFldData)
-+		+sizeof(aFldHeader)
-+		+2*ffname.Len()+4
-+		+2*ffdeftext.Len()+4
-+		+2*ffformat.Len()+4
-+		+2*ffhelptext.Len()+4
-+		+2*ffstattext.Len()+4
-+		+2*ffentrymcr.Len()+4
-+		+2*ffexitmcr.Len()+4;
+     const sal_uInt8 aFldData[] =
+     {
+         0,0,0,0,        // len of struct
+@@ -3215,6 +3240,15 @@ void SwWW8Writer::WriteFormData(SwFieldBookmark &rFieldmark)
+ 		+2*ffstattext.Len()+4
+ 		+2*ffentrymcr.Len()+4
+ 		+2*ffexitmcr.Len()+4;
 +	if (type==2) {
 +	    slen+=2; // for 0xFF, 0xFF
 +	    slen+=4; // for num of list items
-+	    const int items=rFieldmark.getListItems();
++	    const int items=aListItems.size();
 +	    for(int i=0;i<items;i++) {
-+		String item=rFieldmark.getListItem(i);
++		String item=aListItems[i];
 +		slen+=2*item.Len()+2;
 +	    }
 +	}
-+#ifdef OSL_BIGENDIAN
-+	slen=SWAPLONG(slen);
-+#endif // OSL_BIGENDIAN
-+	*((sal_uInt32 *)aFldData)=slen;
-+	int len=sizeof(aFldData) ;
-+	assert(len==0x44);
-+    pDataStrm->Write( aFldData, len);
-+
-+	len=sizeof(aFldHeader);
-+	assert(len==8);
+ #ifdef OSL_BIGENDIAN
+ 	slen=SWAPLONG(slen);
+ #endif // OSL_BIGENDIAN
+@@ -3225,14 +3259,14 @@ void SwWW8Writer::WriteFormData(SwFieldBookmark &rFieldmark)
+ 
+ 	len=sizeof(aFldHeader);
+ 	assert(len==8);
+-    pDataStrm->Write( aFldHeader, len);
 +	pDataStrm->Write( aFldHeader, len);
-+
+ 
+-    WriteString_xstz( *pDataStrm, ffname, true); // Form field name
 +	WriteString_xstz( *pDataStrm, ffname, true); // Form field name
-+
-+	if (type==0) {
+ 
+ 	if (type==0) {
+-		WriteString_xstz( *pDataStrm, ffdeftext, true);
 +	    WriteString_xstz( *pDataStrm, ffdeftext, true);
-+	} else {
+ 	} else {
+-		pDataStrm->WriteNumber((sal_uInt16)0);
 +	    *pDataStrm<<(sal_uInt16)0;
-+	}	
-+	WriteString_xstz( *pDataStrm, ffformat, true);
-+	WriteString_xstz( *pDataStrm, ffhelptext, true);
-+	WriteString_xstz( *pDataStrm, ffstattext, true);
-+	WriteString_xstz( *pDataStrm, ffentrymcr, true);
-+	WriteString_xstz( *pDataStrm, ffexitmcr, true);
-+	if (type==2) {
+ 	}	
+ 	WriteString_xstz( *pDataStrm, ffformat, true);
+ 	WriteString_xstz( *pDataStrm, ffhelptext, true);
+@@ -3240,13 +3274,26 @@ void SwWW8Writer::WriteFormData(SwFieldBookmark &rFieldmark)
+ 	WriteString_xstz( *pDataStrm, ffentrymcr, true);
+ 	WriteString_xstz( *pDataStrm, ffexitmcr, true);
+ 	if (type==2) {
+-		// 0xFF, 0xFF
+-		// sal_uInt32 number of strings
+-		// (sal_uInt16 len; sal_uInt16 unicode char[len])*num of strings
 +	    *pDataStrm<<(sal_uInt16)0xFFFF;
-+	    const int items=rFieldmark.getListItems();
++	    const int items=aListItems.size();
 +	    *pDataStrm<<(sal_uInt32)items;
 +	    for(int i=0;i<items;i++) {
-+		String item=rFieldmark.getListItem(i);
++		String item=aListItems[i];
 +		WriteString_xstz( *pDataStrm, item, false);
 +	    }
 +	    // 0xFF, 0xFF
 +	    // sal_uInt32 number of strings
 +	    // (sal_uInt16 len; sal_uInt16 unicode char[len])*num of strings
-+	}
+ 	}
+ 
+ }
+ 
 +
++void SwWW8Writer::WriteHyperlinkData(SwFieldBookmark &rFieldmark)
++{
++    //@TODO implement me !!!
 +}
- 
- /* vi:set tabstop=4 shiftwidth=4 expandtab: */
++
+ void SwWW8Writer::OutWW8_SwEndNode(SwNode * pNode)
+ {
+     ww8::WW8TableNodeInfo::Pointer_t pNodeInfo = 
 diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx
-index a7ca0c1..9d47ee3 100644
+index 3b3f758..66236ed 100644
 --- sw/source/filter/ww8/wrtww8.hxx
 +++ sw/source/filter/ww8/wrtww8.hxx
-@@ -654,6 +654,7 @@ public:
-     static void WriteString8(SvStream& rStrm, const String& rStr,
-         bool bAddZero, rtl_TextEncoding eCodeSet);
- 
-+	static void WriteString_xstz(SvStream& rStrm, const String& rStr, bool bAddZero);
- #if 1
-     //Prefer ww::bytes to WW8Bytes, migrate away from the other ones.
-     static void InsUInt16(ww::bytes &rO, sal_uInt16 n);
-@@ -710,6 +711,8 @@ public:
-     void AddLinkTarget(const String& rURL);
-     void CollectOutlineBookmarks(const SwDoc &rDoc);
+@@ -729,6 +729,7 @@ public:
      void AddBookmark(String sBkmkName);
-+
-+	void WriteFormData(SwFieldBookmark &rFieldmark);
+ 
+ 	void WriteFormData(SwFieldBookmark &rFieldmark);
++	void WriteHyperlinkData(SwFieldBookmark &rFieldmark);
  private:
      //No copying
      SwWW8Writer(const SwWW8Writer&);
 diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx
-index 45f0396..16bad6c 100644
+index cc284e1..121bed0 100644
 --- sw/source/filter/ww8/ww8par.cxx
 +++ sw/source/filter/ww8/ww8par.cxx
-@@ -139,6 +139,8 @@
- #include <com/sun/star/document/XDocumentProperties.hpp>
- #   include <svtools/itemiter.hxx>  //SfxItemIter
- 
-+#include <stdio.h>
-+
- #define MM_250 1417             // WW-Default fuer Hor. Seitenraender: 2.5 cm
- #define MM_200 1134             // WW-Default fuer u.Seitenrand: 2.0 cm
- 
-@@ -1508,6 +1510,12 @@ void SwWW8ImplReader::ImportDop()
-         }
-     }
- 
-+    const SvtFilterOptions* pOpt = SvtFilterOptions::Get();
-+    sal_Bool bUseEnhFields=(pOpt && pOpt->IsUseEnhancedFields());
-+    if (bUseEnhFields) {
-+	rDoc.set(IDocumentSettingAccess::PROTECT_FORM, pWDop->fProtEnabled );
-+    }
-+
-     maTracer.LeaveEnvironment(sw::log::eDocumentProperties);
- }
- 
-@@ -1614,6 +1622,7 @@ WW8ReaderSave::WW8ReaderSave(SwWW8ImplReader* pRdr ,WW8_CP nStartCp) :
+@@ -1627,7 +1627,6 @@ WW8ReaderSave::WW8ReaderSave(SwWW8ImplReader* pRdr ,WW8_CP nStartCp) :
      maOldApos.push_back(false);
      maOldApos.swap(pRdr->maApos);
      maOldFieldStack.swap(pRdr->maFieldStack);
-+	maFieldCtxStack.swap(pRdr->maNewFieldCtxStack);
+-	maFieldCtxStack.swap(pRdr->maNewFieldCtxStack);
  }
  
  void WW8ReaderSave::Restore( SwWW8ImplReader* pRdr )
-@@ -1660,6 +1669,7 @@ void WW8ReaderSave::Restore( SwWW8ImplReader* pRdr )
+@@ -1674,7 +1673,6 @@ void WW8ReaderSave::Restore( SwWW8ImplReader* pRdr )
          pRdr->pPlcxMan->RestoreAllPLCFx(maPLCFxSave);
      pRdr->maApos.swap(maOldApos);
      pRdr->maFieldStack.swap(maOldFieldStack);
-+	pRdr->maNewFieldCtxStack.swap(maFieldCtxStack);
+-	pRdr->maNewFieldCtxStack.swap(maFieldCtxStack);
  }
  
  void SwWW8ImplReader::Read_HdFtFtnText( const SwNodeIndex* pSttIdx,
-@@ -2674,6 +2684,22 @@ bool SwWW8ImplReader::ReadChar(long nPosCp, long nCpOfs)
+@@ -2689,22 +2687,6 @@ bool SwWW8ImplReader::ReadChar(long nPosCp, long nCpOfs)
          case 0x15:
              if( !bSpec )        // Juristenparagraph
                  cInsert = '\xa7';
-+			else { //0x15 is special --> so it's our field end mark...; hmmm what about field marks not handled by us??, maybe a problem with nested fields; probably an area of bugs... [well release quick and release often....]
-+				if (!maNewFieldCtxStack.empty() && pPaM!=NULL && pPaM->GetPoint()!=NULL) {
-+					WW8NewFieldCtx *pFieldCtx=maNewFieldCtxStack.back();
-+					maNewFieldCtxStack.pop_back();
-+					SwPosition aEndPos = *pPaM->GetPoint();
-+					SwPaM aFldPam( pFieldCtx->GetPtNode(), pFieldCtx->GetPtCntnt(), aEndPos.nNode, aEndPos.nContent.GetIndex());
-+					SwFieldBookmark *pFieldmark=(SwFieldBookmark*)rDoc.makeBookmark(aFldPam, KeyCode(), pFieldCtx->GetBookmarkName(), String(), IDocumentBookmarkAccess::FORM_FIELDMARK_TEXT);
-+					ASSERT(pFieldmark!=NULL, "hmmm; why was the bookmark not created?");
-+					if (pFieldmark!=NULL) {
-+						pFieldmark->SetType(0); // 0==Text
-+						// set field data here...
-+						pFieldCtx->SetCurrentFieldParamsTo(*pFieldmark);
-+					}
-+					delete pFieldCtx;
-+				}
-+			}
+-			else { //0x15 is special --> so it's our field end mark...; hmmm what about field marks not handled by us??, maybe a problem with nested fields; probably an area of bugs... [well release quick and release often....]
+-				if (!maNewFieldCtxStack.empty() && pPaM!=NULL && pPaM->GetPoint()!=NULL) {
+-					WW8NewFieldCtx *pFieldCtx=maNewFieldCtxStack.back();
+-					maNewFieldCtxStack.pop_back();
+-					SwPosition aEndPos = *pPaM->GetPoint();
+-					SwPaM aFldPam( pFieldCtx->GetPtNode(), pFieldCtx->GetPtCntnt(), aEndPos.nNode, aEndPos.nContent.GetIndex());
+-					SwFieldBookmark *pFieldmark=(SwFieldBookmark*)rDoc.makeBookmark(aFldPam, KeyCode(), pFieldCtx->GetBookmarkName(), String(), IDocumentBookmarkAccess::FORM_FIELDMARK_TEXT);
+-					ASSERT(pFieldmark!=NULL, "hmmm; why was the bookmark not created?");
+-					if (pFieldmark!=NULL) {
+-						pFieldmark->SetFieldType(0); // 0==Text
+-						// set field data here...
+-						pFieldCtx->SetCurrentFieldParamsTo(*pFieldmark);
+-					}
+-					delete pFieldCtx;
+-				}
+-			}
              break;
          case 0x9:
              cInsert = '\x9';    // Tab
-@@ -3461,6 +3487,8 @@ bool wwSectionManager::IsNewDoc() const
- 
- void wwSectionManager::InsertSegments()
- {
-+    const SvtFilterOptions* pOpt = SvtFilterOptions::Get();
-+    sal_Bool bUseEnhFields=(pOpt && pOpt->IsUseEnhancedFields());
-     mySegIter aEnd = maSegments.end();
-     mySegIter aStart = maSegments.begin();
-     for (mySegIter aIter = aStart; aIter != aEnd; ++aIter)
-@@ -3475,7 +3503,7 @@ void wwSectionManager::InsertSegments()
+@@ -3519,7 +3501,14 @@ void wwSectionManager::InsertSegments()
  
          bool bInsertSection = (aIter != aStart) ? (aIter->IsContinous() &&  bThisAndPreviousAreCompatible): false;
          bool bInsertPageDesc = !bInsertSection;
--        bool bProtected = SectionIsProtected(*aIter);
-+        bool bProtected = !bUseEnhFields && SectionIsProtected(*aIter); // do we really  need this ?? I guess I have a different logic in editshell which disales this...
- 
+-        bool bProtected = !bUseEnhFields && SectionIsProtected(*aIter); // do we really  need this ?? I guess I have a different logic in editshell which disales this...
++        bool bProtected = SectionIsProtected(*aIter); // do we really  need this ?? I guess I have a different logic in editshell which disales this...
++	if (bUseEnhFields && mrReader.pWDop->fProtEnabled && aIter->IsNotProtected()) {
++	    // here we have the special case that the whole document is protected, with the execption of this section.
++	    // I want to address this when I do the section rework, so for the moment we disable the overall protection then...
++	    mrReader.rDoc.set(IDocumentSettingAccess::PROTECT_FORM, false );
++	}
++
++
          if (bInsertPageDesc)
          {
+             /*
 diff --git a/sw/source/filter/ww8/ww8par.hxx b/sw/source/filter/ww8/ww8par.hxx
-index 1f8446c..f7c8871 100644
+index f887bc1..5404e49 100644
 --- sw/source/filter/ww8/ww8par.hxx
 +++ sw/source/filter/ww8/ww8par.hxx
-@@ -365,6 +365,32 @@ public:
-     void Swap(FieldEntry &rOther) throw();
- };
+@@ -61,6 +61,8 @@
+ #include "ww8scan.hxx"  // WW8Fib
+ #include "ww8glsy.hxx"
+ #include "../inc/msfilter.hxx"
++#include <ecmaflds.hxx>
++#include <bookmrk.hxx>
  
-+class WW8NewFieldCtx
-+{
-+private:
-+	SwNodeIndex maPtNode;
-+    xub_StrLen mnPtCntnt;
-+	::rtl::OUString sBookmarkName;
-+	::rtl::OUString sBookmarkType;
-+	typedef ::std::pair< ::rtl::OUString, ::rtl::OUString> Param_t;
-+	typedef ::std::vector< Param_t > Params_t;
-+	Params_t maParams;
-+  SwPaM * mpPaM;
-+
-+public:
-+	WW8NewFieldCtx(SwPosition &aStartPos, ::rtl::OUString sBookmarkName, ::rtl::OUString sBookmarkType);
-+	~WW8NewFieldCtx();
-+
-+	SwNodeIndex GetPtNode() { return maPtNode; };
-+	xub_StrLen GetPtCntnt() { return mnPtCntnt; };
-+	::rtl::OUString GetBookmarkName();
-+	::rtl::OUString GetBookmarkType();
-+	void AddParam(::rtl::OUString name, ::rtl::OUString value);
-+	void SetCurrentFieldParamsTo(SwFieldBookmark &rFieldBookmark);
-+
-+};
-+
-+
- //-----------------------------------------
- //    Mini-Merker fuer einige Flags
- //-----------------------------------------
-@@ -397,6 +423,7 @@ private:
-     bool mbWasParaEnd;
-     bool mbHasBorder;
-     bool mbFirstPara;
-+	std::deque<WW8NewFieldCtx *> maFieldCtxStack;
+ class SwDoc;
+ class SwPaM;
+@@ -352,6 +354,8 @@ namespace sw
+             Position(const SwPosition &rPos);
+             Position(const Position &rPos);
+             operator SwPosition() const;
++	    SwNodeIndex GetPtNode() { return maPtNode; };
++	    xub_StrLen GetPtCntnt() { return mnPtCntnt; };        
+         };
+     }
+ }
+@@ -359,40 +363,31 @@ namespace sw
+ class FieldEntry
+ {
  public:
-     WW8ReaderSave(SwWW8ImplReader* pRdr, WW8_CP nStart=-1);
-     void Restore(SwWW8ImplReader* pRdr);
-@@ -851,6 +878,9 @@ private:
-     std::deque<FieldEntry> maFieldStack;
-     typedef std::deque<FieldEntry>::const_iterator mycFieldIter;
+-    sw::hack::Position maStartPos;
+-    sal_uInt16 mnFieldId;
+-    FieldEntry(SwPosition &rPos, sal_uInt16 nFieldId) throw();
+-    FieldEntry(const FieldEntry &rOther) throw();
+-    FieldEntry &operator=(const FieldEntry &rOther) throw();
+-    void Swap(FieldEntry &rOther) throw();
+-};
++	typedef ::std::vector<SwFieldBookmark::ParamPair_t> Params_t;
  
-+	typedef std::deque<WW8NewFieldCtx *> WW8NewFieldCtxStack_t;
-+	WW8NewFieldCtxStack_t maNewFieldCtxStack;
-+
-     /*
-     A stack of open footnotes. Should only be one in it at any time.
-     */
-diff --git a/sw/source/filter/ww8/ww8par3.cxx b/sw/source/filter/ww8/ww8par3.cxx
-index ce79eaf..ea3b681 100644
---- sw/source/filter/ww8/ww8par3.cxx
-+++ sw/source/filter/ww8/ww8par3.cxx
-@@ -94,9 +94,58 @@
- #include "ww8par.hxx"
- #include "ww8par2.hxx"  // wg. Listen-Attributen in Styles
+-class WW8NewFieldCtx
+-{
+ private:
+-	SwNodeIndex maPtNode;
+-    xub_StrLen mnPtCntnt;
+ 	::rtl::OUString sBookmarkName;
+ 	::rtl::OUString sBookmarkType;
+-	typedef ::std::pair< ::rtl::OUString, ::rtl::OUString> Param_t;
+-	typedef ::std::vector< Param_t > Params_t;
+ 	Params_t maParams;
+-  SwPaM * mpPaM;
+-
+ public:
+-	WW8NewFieldCtx(SwPosition &aStartPos, ::rtl::OUString sBookmarkName, ::rtl::OUString sBookmarkType);
+-	~WW8NewFieldCtx();
++    sw::hack::Position maStartPos;
++    sal_uInt16 mnFieldId;
++    FieldEntry(SwPosition &rPos, sal_uInt16 nFieldId) throw();
++    FieldEntry(const FieldEntry &rOther) throw();
++    FieldEntry &operator=(const FieldEntry &rOther) throw();
++    void Swap(FieldEntry &rOther) throw();
+ 
+-	SwNodeIndex GetPtNode() { return maPtNode; };
+-	xub_StrLen GetPtCntnt() { return mnPtCntnt; };
+-	::rtl::OUString GetBookmarkName();
+-	::rtl::OUString GetBookmarkType();
+-	void AddParam(::rtl::OUString name, ::rtl::OUString value);
+-	void SetCurrentFieldParamsTo(SwFieldBookmark &rFieldBookmark);
++    SwNodeIndex GetPtNode() { return maStartPos.GetPtNode(); };
++    xub_StrLen GetPtCntnt() { return maStartPos.GetPtCntnt(); };
+ 
++    ::rtl::OUString GetBookmarkName();
++    ::rtl::OUString GetBookmarkType();
++    void SetBookmarkName(::rtl::OUString bookmarkName);
++    void SetBookmarkType(::rtl::OUString bookmarkType);
++    void AddParam(::rtl::OUString name, ::rtl::OUString value);
++    Params_t &getParams();
+ };
  
-+#include <bookmrk.hxx>	
-+#include <svtools/fltrcfg.hxx>
-+
-+#include <stdio.h>
-+
- using namespace com::sun::star;
- using namespace sw::util;
- using namespace sw::types;
-+
-+WW8NewFieldCtx::WW8NewFieldCtx(SwPosition &aStartPos, ::rtl::OUString sBookmarkName, ::rtl::OUString sBookmarkType)
-+: maPtNode(aStartPos.nNode), mnPtCntnt(aStartPos.nContent.GetIndex()), 
-+  sBookmarkName(sBookmarkName),
-+  sBookmarkType(sBookmarkType), mpPaM(NULL)
-+{
-+}
-+
-+
-+WW8NewFieldCtx::~WW8NewFieldCtx()
-+{
-+	if (mpPaM) delete mpPaM;
-+}
-+
-+::rtl::OUString WW8NewFieldCtx::GetBookmarkName()
-+{
-+	return sBookmarkName;
-+}
-+
-+::rtl::OUString WW8NewFieldCtx::GetBookmarkType()
-+{
-+	return sBookmarkType;
-+}
-+
-+void WW8NewFieldCtx::AddParam(::rtl::OUString name, ::rtl::OUString value)
-+{
-+	maParams.push_back( Param_t(name, value) );
-+}
-+
-+void WW8NewFieldCtx::SetCurrentFieldParamsTo(SwFieldBookmark &rFieldBookmark)
-+{
-+	for(Params_t::iterator i=maParams.begin();i!=maParams.end();i++) {
-+		::rtl::OUString aName=i->first;
-+		::rtl::OUString aValue=i->second;
-+		if (aName.compareToAscii("Description")==0) {
-+			rFieldBookmark.SetFFHelpText(aValue);
-+		} else if (aName.compareToAscii("Name")==0) {
-+			rFieldBookmark.SetFFName(aValue);
-+		} else if (aName.compareToAscii("Result")==0) {
-+			rFieldBookmark.SetFFRes( aValue.toInt32() );
-+		}
-+	}
-+}
-+
+-
  //-----------------------------------------
- //            UNO-Controls
+ //    Mini-Merker fuer einige Flags
  //-----------------------------------------
-@@ -114,8 +163,9 @@ eF_ResT SwWW8ImplReader::Read_F_FormTextBox( WW8FieldDesc* pF, String& rStr )
- {
-     WW8FormulaEditBox aFormula(*this);
- 
--    if (0x01 == rStr.GetChar(writer_cast<xub_StrLen>(pF->nLCode-1)))
-+    if (0x01 == rStr.GetChar(writer_cast<xub_StrLen>(pF->nLCode-1))) {
-         ImportFormulaControl(aFormula,pF->nSCode+pF->nLCode-1, WW8_CT_EDIT);
-+    }
+@@ -425,7 +420,6 @@ private:
+     bool mbWasParaEnd;
+     bool mbHasBorder;
+     bool mbFirstPara;
+-	std::deque<WW8NewFieldCtx *> maFieldCtxStack;
+ public:
+     WW8ReaderSave(SwWW8ImplReader* pRdr, WW8_CP nStart=-1);
+     void Restore(SwWW8ImplReader* pRdr);
+@@ -880,9 +874,6 @@ private:
+     std::deque<FieldEntry> maFieldStack;
+     typedef std::deque<FieldEntry>::const_iterator mycFieldIter;
  
-     /* #80205#
-     Here we have a small complication. This formula control contains
-@@ -127,23 +177,58 @@ eF_ResT SwWW8ImplReader::Read_F_FormTextBox( WW8FieldDesc* pF, String& rStr )
-     the field result into the formula here in place of the default
-     text.
+-	typedef std::deque<WW8NewFieldCtx *> WW8NewFieldCtxStack_t;
+-	WW8NewFieldCtxStack_t maNewFieldCtxStack;
+-
+     /*
+     A stack of open footnotes. Should only be one in it at any time.
      */
--    aFormula.sDefault = GetFieldResult(pF);
+diff --git a/sw/source/filter/ww8/ww8par3.cxx b/sw/source/filter/ww8/ww8par3.cxx
+index 8915eaf..1c225ec 100644
+--- sw/source/filter/ww8/ww8par3.cxx
++++ sw/source/filter/ww8/ww8par3.cxx
+@@ -96,6 +96,7 @@
  
--    //substituting Unicode spacing 0x2002 with double space for layout
--#if 0
--    aFormula.sDefault.SearchAndReplaceAll(
--        String(static_cast< sal_Unicode >(0x2002)),
--        CREATE_CONST_ASC("  "));
--#endif
-+    const SvtFilterOptions* pOpt = SvtFilterOptions::Get();
-+    sal_Bool bUseEnhFields=(pOpt && pOpt->IsUseEnhancedFields());
+ #include <bookmrk.hxx>	
+ #include <svtools/fltrcfg.hxx>
++#include <ecmaflds.hxx>
  
--    SwInputField aFld((SwInputFieldType*)rDoc.GetSysFldType( RES_INPUTFLD ),
--        aFormula.sDefault , aFormula.sTitle , INP_TXT, 0 );
--    aFld.SetHelp(aFormula.sHelp);
--    aFld.SetToolTip(aFormula.sToolTip);
-+    if (!bUseEnhFields) {
-+	aFormula.sDefault = GetFieldResult(pF);
+ #include <stdio.h>
  
--    rDoc.Insert(*pPaM, SwFmtFld(aFld), 0);
-+#if 0 // why not? (flr)
-+    //substituting Unicode spacing 0x2002 with double space for layout
-+	aFormula.sDefault.SearchAndReplaceAll(
-+	    String(static_cast< sal_Unicode >(0x2002)),
-+	    CREATE_CONST_ASC("  "));
-+#endif
+@@ -103,49 +104,6 @@ using namespace com::sun::star;
+ using namespace sw::util;
+ using namespace sw::types;
  
--    return FLD_OK;
-+	SwInputField aFld((SwInputFieldType*)rDoc.GetSysFldType( RES_INPUTFLD ),
-+			  aFormula.sDefault , aFormula.sTitle , INP_TXT, 0 );
-+	aFld.SetHelp(aFormula.sHelp);
-+	aFld.SetToolTip(aFormula.sToolTip);
-+
-+	rDoc.Insert(*pPaM, SwFmtFld(aFld), 0); 
-+	return FLD_OK;
-+    } else {
-+	WW8PLCFx_Book* pB = pPlcxMan->GetBook();
-+	String aBookmarkName;
-+	if (pB!=NULL) {
-+		WW8_CP currentCP=pF->nSCode;
-+		WW8_CP currentLen=pF->nLen;
-+
-+		USHORT bkmFindIdx;
-+		String aBookmarkFind=pB->GetBookmark(currentCP-1, currentCP+currentLen-1, bkmFindIdx);
-+
-+		if (aBookmarkFind.Len()>0) { 
-+			pB->SetStatus(bkmFindIdx, BOOK_FIELD); // mark bookmark as consumed, such that tl'll not get inserted as a "normal" bookmark again
-+			if (aBookmarkFind.Len()>0) {
-+				aBookmarkName=aBookmarkFind;
-+			}
-+		}
-+	}
-+
-+	if (pB!=NULL && aBookmarkName.Len()==0) {
-+		aBookmarkName=pB->GetUniqueBookmarkName(aFormula.sTitle);
-+	}
-+
-+
-+	if (aBookmarkName.Len()>0) {
-+		WW8NewFieldCtx *pFieldCtx=new WW8NewFieldCtx(*pPaM->GetPoint(), aBookmarkName, ::rtl::OUString::createFromAscii("ecma.office-open-xml.field.FORMTEXT"));
-+		maNewFieldCtxStack.push_back(pFieldCtx);
-+		pFieldCtx->AddParam(::rtl::OUString::createFromAscii("Description"), aFormula.sToolTip);
-+		pFieldCtx->AddParam(::rtl::OUString::createFromAscii("Name"), aFormula.sTitle);
-+	}
-+	return FLD_TEXT;
-+    }
- }
+-WW8NewFieldCtx::WW8NewFieldCtx(SwPosition &aStartPos, ::rtl::OUString _sBookmarkName, ::rtl::OUString _sBookmarkType)
+-: maPtNode(aStartPos.nNode), mnPtCntnt(aStartPos.nContent.GetIndex()), 
+-  sBookmarkName(_sBookmarkName),
+-  sBookmarkType(_sBookmarkType), mpPaM(NULL)
+-{
+-}
+-
+-
+-WW8NewFieldCtx::~WW8NewFieldCtx()
+-{
+-	if (mpPaM) delete mpPaM;
+-}
+-
+-::rtl::OUString WW8NewFieldCtx::GetBookmarkName()
+-{
+-	return sBookmarkName;
+-}
+-
+-::rtl::OUString WW8NewFieldCtx::GetBookmarkType()
+-{
+-	return sBookmarkType;
+-}
+-
+-void WW8NewFieldCtx::AddParam(::rtl::OUString name, ::rtl::OUString value)
+-{
+-	maParams.push_back( Param_t(name, value) );
+-}
+-
+-void WW8NewFieldCtx::SetCurrentFieldParamsTo(SwFieldBookmark &rFieldBookmark)
+-{
+-	for(Params_t::iterator i=maParams.begin();i!=maParams.end();i++) {
+-		::rtl::OUString aName=i->first;
+-		::rtl::OUString aValue=i->second;
+-		if (aName.compareToAscii("Description")==0) {
+-			rFieldBookmark.SetFFHelpText(aValue);
+-		} else if (aName.compareToAscii("Name")==0) {
+-			rFieldBookmark.SetFFName(aValue);
+-		} else if (aName.compareToAscii("Result")==0) {
+-			rFieldBookmark.SetFFRes( aValue.toInt32() );
+-		}
+-	}
+-}
+-
+ //-----------------------------------------
+ //            UNO-Controls
+ //-----------------------------------------
+@@ -222,10 +180,10 @@ eF_ResT SwWW8ImplReader::Read_F_FormTextBox( WW8FieldDesc* pF, String& rStr )
  
- eF_ResT SwWW8ImplReader::Read_F_FormCheckBox( WW8FieldDesc* pF, String& rStr )
-@@ -155,9 +240,47 @@ eF_ResT SwWW8ImplReader::Read_F_FormCheckBox( WW8FieldDesc* pF, String& rStr )
  
-     if (0x01 == rStr.GetChar(writer_cast<xub_StrLen>(pF->nLCode-1)))
-         ImportFormulaControl(aFormula,pF->nSCode+pF->nLCode-1, WW8_CT_CHECKBOX);
--
--    pFormImpl->InsertFormula(aFormula);
--    return FLD_OK;
-+    const SvtFilterOptions* pOpt = SvtFilterOptions::Get();
-+    sal_Bool bUseEnhFields=(pOpt && pOpt->IsUseEnhancedFields());
-+
-+    if (!bUseEnhFields) {
-+	pFormImpl->InsertFormula(aFormula); 
-+	return FLD_OK;
-+    } else {
-+	String aBookmarkName;
-+	WW8PLCFx_Book* pB = pPlcxMan->GetBook();
-+	if (pB!=NULL) {
-+		WW8_CP currentCP=pF->nSCode;
-+		WW8_CP currentLen=pF->nLen;
-+
-+		USHORT bkmFindIdx;
-+		String aBookmarkFind=pB->GetBookmark(currentCP-1, currentCP+currentLen-1, bkmFindIdx);
-+
-+		if (aBookmarkFind.Len()>0) { 
-+			pB->SetStatus(bkmFindIdx, BOOK_FIELD); // mark as consumed by field
-+			if (aBookmarkFind.Len()>0) {
-+				aBookmarkName=aBookmarkFind;
-+			}
-+		}
-+	}
-+
-+	if (pB!=NULL && aBookmarkName.Len()==0) {
-+		aBookmarkName=pB->GetUniqueBookmarkName(aFormula.sTitle);
-+	}
-+
-+	if (aBookmarkName.Len()>0) {
-+		SwFieldBookmark *pFieldmark=(SwFieldBookmark*)rDoc.makeBookmark(*pPaM, KeyCode(), aBookmarkName, String(), IDocumentBookmarkAccess::FORM_FIELDMARK_NO_TEXT);
-+		ASSERT(pFieldmark!=NULL, "hmmm; why was the bookmark not created?");
-+		if (pFieldmark!=NULL) {
-+			pFieldmark->SetType(1); // 0==Checkbox
-+			pFieldmark->SetFFName(aFormula.sTitle);
-+			pFieldmark->SetFFHelpText(aFormula.sToolTip);
-+			pFieldmark->SetChecked(aFormula.nChecked!=0);
-+			// set field data here...
-+		}
-+	}
-+	return FLD_OK;
-+    }
- }
+ 	if (aBookmarkName.Len()>0) {
+-		WW8NewFieldCtx *pFieldCtx=new WW8NewFieldCtx(*pPaM->GetPoint(), aBookmarkName, ::rtl::OUString::createFromAscii("ecma.office-open-xml.field.FORMTEXT"));
+-		maNewFieldCtxStack.push_back(pFieldCtx);
+-		pFieldCtx->AddParam(::rtl::OUString::createFromAscii("Description"), aFormula.sToolTip);
+-		pFieldCtx->AddParam(::rtl::OUString::createFromAscii("Name"), aFormula.sTitle);
++	    maFieldStack.back().SetBookmarkName(aBookmarkName);
++	    maFieldStack.back().SetBookmarkType(::rtl::OUString::createFromAscii(ECMA_FORMTEXT));
++	    maFieldStack.back().AddParam(::rtl::OUString::createFromAscii("Description"), aFormula.sToolTip);
++	    maFieldStack.back().AddParam(::rtl::OUString::createFromAscii("Name"), aFormula.sTitle);
+ 	}
+ 	return FLD_TEXT;
+     }
+@@ -269,15 +227,14 @@ eF_ResT SwWW8ImplReader::Read_F_FormCheckBox( WW8FieldDesc* pF, String& rStr )
+ 	}
  
- eF_ResT SwWW8ImplReader::Read_F_FormListBox( WW8FieldDesc* pF, String& rStr)
-@@ -167,24 +290,72 @@ eF_ResT SwWW8ImplReader::Read_F_FormListBox( WW8FieldDesc* pF, String& rStr)
+ 	if (aBookmarkName.Len()>0) {
+-		SwFieldBookmark *pFieldmark=(SwFieldBookmark*)rDoc.makeBookmark(*pPaM, KeyCode(), aBookmarkName, String(), IDocumentBookmarkAccess::FORM_FIELDMARK_NO_TEXT);
+-		ASSERT(pFieldmark!=NULL, "hmmm; why was the bookmark not created?");
+-		if (pFieldmark!=NULL) {
+-			pFieldmark->SetFieldType(1); // 0==Checkbox
+-			pFieldmark->SetFFName(aFormula.sTitle);
+-			pFieldmark->SetFFHelpText(aFormula.sToolTip);
+-			pFieldmark->SetChecked(aFormula.nChecked!=0);
+-			// set field data here...
+-		}
++	    SwFieldBookmark *pFieldmark=(SwFieldBookmark*)rDoc.makeNoTextFieldBookmark(*pPaM, aBookmarkName, rtl::OUString::createFromAscii(ECMA_FORMCHECKBOX));
++	    ASSERT(pFieldmark!=NULL, "hmmm; why was the bookmark not created?");
++	    if (pFieldmark!=NULL) {
++		pFieldmark->addParam(rtl::OUString::createFromAscii(ECMA_FORMCHECKBOX_NAME), aFormula.sTitle);
++		pFieldmark->addParam(rtl::OUString::createFromAscii(ECMA_FORMCHECKBOX_HELPTEXT), aFormula.sToolTip);
++		pFieldmark->addParam(rtl::OUString::createFromAscii(ECMA_FORMCHECKBOX_CHECKED), ::rtl::OUString::createFromAscii(aFormula.nChecked!=0?"on":"off"));
++		// set field data here...
++	    }
+ 	}
+ 	return FLD_OK;
+     }
+@@ -290,24 +247,70 @@ eF_ResT SwWW8ImplReader::Read_F_FormListBox( WW8FieldDesc* pF, String& rStr)
      if (0x01 == rStr.GetChar(writer_cast<xub_StrLen>(pF->nLCode-1)))
          ImportFormulaControl(aFormula,pF->nSCode+pF->nLCode-1, WW8_CT_DROPDOWN);
  
 -    SwDropDownField aFld(
 -        (SwDropDownFieldType*)rDoc.GetSysFldType(RES_DROPDOWN));
--
++    const SvtFilterOptions* pOpt = SvtFilterOptions::Get();
++    sal_Bool bUseEnhFields=(pOpt && pOpt->IsUseEnhancedFields());
+ 
 -    aFld.SetName(aFormula.sTitle);
 -    aFld.SetHelp(aFormula.sHelp);
 -    aFld.SetToolTip(aFormula.sToolTip);
--
++    if (!bUseEnhFields) {
++	SwDropDownField aFld(
++	    (SwDropDownFieldType*)rDoc.GetSysFldType(RES_DROPDOWN));
+ 
 -    if (!aFormula.maListEntries.empty())
 -    {
 -        aFld.SetItems(aFormula.maListEntries);
 -        int nIndex = aFormula.fDropdownIndex  < aFormula.maListEntries.size()
 -            ? aFormula.fDropdownIndex : 0;
 -        aFld.SetSelectedItem(aFormula.maListEntries[nIndex]);
-+    const SvtFilterOptions* pOpt = SvtFilterOptions::Get();
-+    sal_Bool bUseEnhFields=(pOpt && pOpt->IsUseEnhancedFields());
-+
-+    if (!bUseEnhFields) {
-+	SwDropDownField aFld(
-+	    (SwDropDownFieldType*)rDoc.GetSysFldType(RES_DROPDOWN));
-+
+-    }
 +	aFld.SetName(aFormula.sTitle);
 +	aFld.SetHelp(aFormula.sHelp);
 +	aFld.SetToolTip(aFormula.sToolTip);
@@ -2569,269 +1780,285 @@
 +			}
 +		}
 +	}
-+
+ 
+-    rDoc.Insert(*pPaM, SwFmtFld(aFld), 0);
 +	if (pB!=NULL && aBookmarkName.Len()==0) {
 +		aBookmarkName=pB->GetUniqueBookmarkName(aFormula.sTitle);
 +	}
 +
 +	if (aBookmarkName.Len()>0) {
-+		SwFieldBookmark *pFieldmark=(SwFieldBookmark*)rDoc.makeBookmark(*pPaM, KeyCode(), aBookmarkName, String(), IDocumentBookmarkAccess::FORM_FIELDMARK_NO_TEXT);
-+		ASSERT(pFieldmark!=NULL, "hmmm; why was the bookmark not created?");
-+		if (pFieldmark!=NULL) {
-+			pFieldmark->SetType(2); // 0==Checkbox
-+//			pFieldmark->SetFFName(aFormula.sTitle);
-+//			pFieldmark->SetFFHelpText(aFormula.sToolTip);
-+//			pFieldmark->SetChecked(aFormula.nChecked!=0);
-+			// set field data here...
-+			std::vector<String>::iterator it=aFormula.maListEntries.begin();
-+			for(;it!=aFormula.maListEntries.end();it++) {
-+			    pFieldmark->addListItem(*it);
-+			}
-+			pFieldmark->setCurrentListItem(aFormula.fDropdownIndex);
++	    SwFieldBookmark *pFieldmark=(SwFieldBookmark*)rDoc.makeNoTextFieldBookmark(*pPaM, aBookmarkName, ::rtl::OUString::createFromAscii(ECMA_FORMDROPDOWN));
++	    ASSERT(pFieldmark!=NULL, "hmmm; why was the bookmark not created?");
++	    if (pFieldmark!=NULL) {
++		rtl::OUString sListEntry=rtl::OUString::createFromAscii(ECMA_FORMDROPDOWN_LISTENTRY);
++		std::vector<String>::iterator it=aFormula.maListEntries.begin();
++		for(;it!=aFormula.maListEntries.end();it++) {
++		    pFieldmark->addParam(sListEntry, *it, false);
 +		}
++		int nIndex = aFormula.fDropdownIndex  < aFormula.maListEntries.size() ? aFormula.fDropdownIndex : 0;
++		pFieldmark->addParam(ECMA_FORMDROPDOWN_RESULT, nIndex);
++		// set field data here...
++	    }
 +	}
 +
 +	return FLD_OK;
-     }
++    }
  
--    rDoc.Insert(*pPaM, SwFmtFld(aFld), 0);
--
 -    return FLD_OK;
  }
  
  void SwWW8ImplReader::DeleteFormImpl()
-@@ -1968,6 +2139,18 @@ bool SwWW8ImplReader::ImportFormulaControl(WW8FormulaControl &aFormula,
+@@ -2097,11 +2100,18 @@ bool SwWW8ImplReader::ImportFormulaControl(WW8FormulaControl &aFormula,
+ 
      if((aPic.lcb > 0x3A) && !pDataStream->GetError() )
      {
-         pDataStream->Seek( nPicLocFc + aPic.cbHeader );
+-        pDataStream->Seek( nPicLocFc + aPic.cbHeader );
 +#if 0 // some debug fun; remove this later...
-+		int len=aPic.lcb-aPic.cbHeader;
-+		char *pBuf=(char*)malloc(len);
-+		pDataStream->Read( pBuf, len);
+ 		int len=aPic.lcb-aPic.cbHeader;
+ 		char *pBuf=(char*)malloc(len);
+ 		pDataStream->Read( pBuf, len);
 +	static int _h=0;
 +	char fname[255];
 +	sprintf(fname, "data%03i.data", _h++);
 +	FILE *out=fopen(fname, "wb");
 +	fwrite(pBuf, len, 1, out);
 +	fclose(out);
-+        pDataStream->Seek( nPicLocFc + aPic.cbHeader );
+         pDataStream->Seek( nPicLocFc + aPic.cbHeader );
 +#endif
          aFormula.FormulaRead(nWhich,pDataStream);
          bRet = true;
      }
 diff --git a/sw/source/filter/ww8/ww8par5.cxx b/sw/source/filter/ww8/ww8par5.cxx
-index c71044b..eca252a 100644
+index ff6bf5b..3c103bb 100644
 --- sw/source/filter/ww8/ww8par5.cxx
 +++ sw/source/filter/ww8/ww8par5.cxx
-@@ -323,7 +323,7 @@ long SwWW8ImplReader::Read_Book(WW8PLCFManResult*)
-     if (pB->GetIsEnd())
-     {
-         pReffedStck->SetAttr(*pPaM->GetPoint(), RES_FLTR_BOOKMARK, true,
--            pB->GetHandle());
-+            pB->GetHandle(), (eB & BOOK_FIELD)!=0);
+@@ -96,6 +96,7 @@
+ #include "ww8par2.hxx"
+ #include "writerhelper.hxx"
+ #include "fields.hxx"
++#include <svtools/fltrcfg.hxx>
+ 
+ #include <algorithm> // #i24377#
+ 
+@@ -329,9 +330,11 @@ long SwWW8ImplReader::Read_Book(WW8PLCFManResult*)
+ 
+     //"_Toc*" and "_Hlt*" are unnecessary
+     const String* pName = pB->GetName();
++#if 0
+     if(    !pName || pName->EqualsIgnoreCaseAscii( "_Toc", 0, 4 )
+         || pName->EqualsIgnoreCaseAscii( "_Hlt", 0, 4 ) )
          return 0;
-     }
++#endif 
  
-diff --git a/sw/source/filter/ww8/ww8scan.cxx b/sw/source/filter/ww8/ww8scan.cxx
-index 6050423..a9cdb03 100644
---- sw/source/filter/ww8/ww8scan.cxx
-+++ sw/source/filter/ww8/ww8scan.cxx
-@@ -3951,7 +3951,7 @@ void WW8ReadSTTBF(bool bVer8, SvStream& rStrm, UINT32 nStart, INT32 nLen,
- }
- 
- WW8PLCFx_Book::WW8PLCFx_Book(SvStream* pTblSt, const WW8Fib& rFib)
--    : WW8PLCFx(rFib.GetFIBVersion(), false), pStatus(0), nIsEnd(0)
-+    : WW8PLCFx(rFib.GetFIBVersion(), false), pStatus(0), nIsEnd(0), nBookmarkId(1)
- {
-     if( !rFib.fcPlcfbkf || !rFib.lcbPlcfbkf || !rFib.fcPlcfbkl ||
-         !rFib.lcbPlcfbkl || !rFib.fcSttbfbkmk || !rFib.lcbSttbfbkmk )
-@@ -4162,6 +4162,26 @@ String WW8PLCFx_Book::GetBookmark(long nStart,long nEnd, USHORT &nIndex)
-     return bFound ? aBookNames[i] : aEmptyStr;
- }
- 
-+String WW8PLCFx_Book::GetUniqueBookmarkName(String &suggestedName)
-+{
-+	String aRet=(suggestedName.Len()==0?String::CreateFromAscii("Unnamed"):suggestedName);
-+	int i=0;
-+	while(i<aBookNames.size()) {
-+		String &s=aBookNames[i];
-+		if (aRet.CompareTo(s)==0) {
-+			int len=aRet.Len();
-+			int p=len-1;
-+			while(p>0 && aRet.GetChar(p)>='0' && aRet.GetChar(p)<='9') p--;
-+			aRet=String(aRet, 0, p+1);
-+			aRet += String::CreateFromInt32( nBookmarkId++ );
-+			i=0; // start search from beginning
-+		} else {
-+			i++;
+     //JP 16.11.98: ToUpper darf auf keinen Fall gemacht werden, weil der
+     //Bookmark- name ein Hyperlink-Ziel sein kann!
+@@ -673,6 +676,9 @@ sal_uInt16 SwWW8ImplReader::End_Field()
+     if (!pF || !pF->EndPosIsFieldEnd())
+         return nRet;
+ 
++    const SvtFilterOptions* pOpt = SvtFilterOptions::Get();
++    sal_Bool bUseEnhFields=(pOpt && pOpt->IsUseEnhancedFields());
++
+     ASSERT(!maFieldStack.empty(), "Empty field stack\n");
+     if (!maFieldStack.empty())
+     {
+@@ -684,8 +690,34 @@ sal_uInt16 SwWW8ImplReader::End_Field()
+         nRet = maFieldStack.back().mnFieldId;
+         switch (nRet)
+         {
+-            case 88:
+-                pCtrlStck->SetAttr(*pPaM->GetPoint(),RES_TXTATR_INETFMT);
++	    case 70:
++		if (bUseEnhFields && pPaM!=NULL && pPaM->GetPoint()!=NULL) {
++		    SwPosition aEndPos = *pPaM->GetPoint();
++		    SwPaM aFldPam( maFieldStack.back().GetPtNode(), maFieldStack.back().GetPtCntnt(), aEndPos.nNode, aEndPos.nContent.GetIndex());
++		    SwFieldBookmark *pFieldmark=(SwFieldBookmark*)rDoc.makeFieldBookmark(aFldPam, maFieldStack.back().GetBookmarkName(), ::rtl::OUString::createFromAscii(ECMA_FORMTEXT));
++		    ASSERT(pFieldmark!=NULL, "hmmm; why was the bookmark not created?");
++		    if (pFieldmark!=NULL) {
++			pFieldmark->addParams(maFieldStack.back().getParams());
++		    }
 +		}
-+	}
-+	return aRet;
++		break;
++	    case 8: // TOX_INDEX
++	    case 13: // TOX_CONTENT
++	    case 88: // HYPERLINK
++	    case 37: // REF
++		if (pPaM!=NULL && pPaM->GetPoint()!=NULL) {
++		    
++		    SwPosition aEndPos = *pPaM->GetPoint();
++		    SwPaM aFldPam( maFieldStack.back().GetPtNode(), maFieldStack.back().GetPtCntnt(), aEndPos.nNode, aEndPos.nContent.GetIndex());
++		    SwFieldBookmark *pFieldmark=(SwFieldBookmark*)rDoc.makeFieldBookmark(aFldPam, maFieldStack.back().GetBookmarkName(), maFieldStack.back().GetBookmarkType());
++		    ASSERT(pFieldmark!=NULL, "hmmm; why was the bookmark not created?");
++		    if (pFieldmark!=NULL) {
++			pFieldmark->addParams(maFieldStack.back().getParams());
++		    }
++		}
++		break;	       
++//            case 88:
++//                pCtrlStck->SetAttr(*pPaM->GetPoint(),RES_TXTATR_INETFMT);
+             break;
+             case 36:
+             case 68:
+@@ -704,6 +736,8 @@ bool AcceptableNestedField(sal_uInt16 nFieldCode)
+ {
+     switch (nFieldCode)
+     {
++	case 8:  // allow recursive field in TOC...
++	case 13: // allow recursive field in TOC...
+         case 36:
+         case 68:
+         case 79:
+@@ -742,6 +776,36 @@ FieldEntry &FieldEntry::operator=(const FieldEntry &rOther) throw()
+     return *this;
+ }
+ 
++::rtl::OUString FieldEntry::GetBookmarkName()
++{
++	return sBookmarkName;
 +}
 +
- bool WW8PLCFx_Book::MapName(String& rName)
- {
-     if( !pBook[0] || !pBook[1] )
-diff --git a/sw/source/filter/ww8/ww8scan.hxx b/sw/source/filter/ww8/ww8scan.hxx
-index c20a112..b43ad9d 100644
---- sw/source/filter/ww8/ww8scan.hxx
-+++ sw/source/filter/ww8/ww8scan.hxx
-@@ -707,7 +707,7 @@ public:
-     bool GetPara(long nIdx, WW8FieldDesc& rF);
- };
++::rtl::OUString FieldEntry::GetBookmarkType()
++{
++	return sBookmarkType;
++}
++
++void FieldEntry::SetBookmarkName(::rtl::OUString bookmarkName) 
++{
++    sBookmarkName=bookmarkName;
++}
++
++void FieldEntry::SetBookmarkType(::rtl::OUString bookmarkType)
++{
++    sBookmarkType=bookmarkType;
++}
++
++void FieldEntry::AddParam(::rtl::OUString name, ::rtl::OUString value)
++{
++    maParams.push_back( SwFieldBookmark::ParamPair_t(name, value) );
++}
++
++FieldEntry::Params_t &FieldEntry::getParams() {
++    return maParams;
++}
++
++
+ // Read_Field liest ein Feld ein oder, wenn es nicht gelesen werden kann,
+ // wird 0 zurueckgegeben, so dass das Feld vom Aufrufer textuell gelesen wird.
+ // Returnwert: Gesamtlaenge des Feldes ( zum UEberlesen )
+@@ -2066,6 +2130,16 @@ eF_ResT SwWW8ImplReader::Read_F_PgRef( WW8FieldDesc*, String& rStr )
  
--enum eBookStatus { BOOK_NORMAL = 0, BOOK_IGNORE = 0x1 };
-+enum eBookStatus { BOOK_NORMAL = 0, BOOK_IGNORE = 0x1, BOOK_FIELD = 0x2 };
+     String sName(GetMappedBookmark(sOrigName));
  
- // Iterator for Booknotes
- class WW8PLCFx_Book : public WW8PLCFx
-@@ -718,6 +718,7 @@ private:
-     eBookStatus* pStatus;
-     long nIMax;                         // Number of Booknotes
-     USHORT nIsEnd;
-+	int nBookmarkId; // counter incremented by GetUniqueBookmarkName.
-     
-     //No copying
-     WW8PLCFx_Book(const WW8PLCFx_Book&);
-@@ -744,6 +745,7 @@ public:
-     bool MapName(String& rName);
-     String GetBookmark(long nStart,long nEnd, USHORT &nIndex);
-     eBookStatus GetStatus() const;
-+	String GetUniqueBookmarkName(String &suggestedName);
- };
++    if (1) {
++	::rtl::OUString aBookmarkName=::rtl::OUString::createFromAscii("_REF");
++	maFieldStack.back().SetBookmarkName(aBookmarkName);
++	maFieldStack.back().SetBookmarkType(::rtl::OUString::createFromAscii(ECMA_PAGEREF));
++	maFieldStack.back().AddParam(rtl::OUString(), sName);
++	return FLD_TEXT;
++    }
++
++
++
+     SwGetRefField aFld(
+         (SwGetRefFieldType*)rDoc.GetSysFldType( RES_GETREFFLD ), sName,
+         REF_BOOKMARK, 0, REF_PAGE );
+@@ -2728,6 +2802,14 @@ bool wwSectionManager::WillHavePageDescHere(SwNodeIndex aIdx) const
+ 
+ eF_ResT SwWW8ImplReader::Read_F_Tox( WW8FieldDesc* pF, String& rStr )
+ {
++    if (1) {
++	::rtl::OUString aBookmarkName=::rtl::OUString::createFromAscii("_TOC");
++	maFieldStack.back().SetBookmarkName(aBookmarkName);
++	maFieldStack.back().SetBookmarkType(::rtl::OUString::createFromAscii(ECMA_TOC));
++//     maFieldStack.back().AddParam(::rtl::OUString::createFromAscii("Description"), aFormula.sToolTip);
++	return FLD_TEXT;
++    }
++
+     if (pF->nLRes < 3)
+         return FLD_TEXT;      // ignore (#i25440#)
  
- /*
+@@ -3245,6 +3327,14 @@ eF_ResT SwWW8ImplReader::Read_F_Shape(WW8FieldDesc* /*pF*/, String& /*rStr*/)
+ 
+ eF_ResT SwWW8ImplReader::Read_F_Hyperlink( WW8FieldDesc* /*pF*/, String& rStr )
+ {
++    if (1) {
++	::rtl::OUString aBookmarkName=::rtl::OUString::createFromAscii("_HYPERLINK");
++	maFieldStack.back().SetBookmarkName(aBookmarkName);
++	maFieldStack.back().SetBookmarkType(::rtl::OUString::createFromAscii(ECMA_HYPERLINK));
++//     maFieldStack.back().AddParam(::rtl::OUString::createFromAscii("Description"), aFormula.sToolTip);
++	return FLD_TEXT;
++    }
++
+     String sURL, sTarget, sMark;
+     bool bDataImport = false;
+     //HYPERLINk "filename" [switches]
 diff --git a/sw/source/ui/docvw/edtwin.cxx b/sw/source/ui/docvw/edtwin.cxx
-index b288da4..1e57a48 100644
+index 1cd517c..7d509f0 100644
 --- sw/source/ui/docvw/edtwin.cxx
 +++ sw/source/ui/docvw/edtwin.cxx
-@@ -152,6 +152,9 @@
- #include "PostItMgr.hxx"
- #include "postit.hxx"
+@@ -151,6 +151,7 @@
  
-+#include <bookmrk.hxx>
-+#include <doc.hxx>
-+
- //JP 11.10.2001: enable test code for bug fix 91313
- #if !defined( PRODUCT ) && (OSL_DEBUG_LEVEL > 1)
- //#define TEST_FOR_BUG91313
-@@ -1449,6 +1452,10 @@ void SwEditWin::KeyInput(const KeyEvent &rKEvt)
-                        KS_Fly_Change, KS_Draw_Change,
-                        KS_SpecialInsert,
-                        KS_EnterCharCell,
-+
-+		       KS_GotoNextFieldBookmark,
-+		       KS_GotoPrevFieldBookmark,
-+
-                        KS_Ende };
+ #include <bookmrk.hxx>
+ #include <doc.hxx>
++#include <ecmaflds.hxx>
  
- 	SW_KeyState eKeyState = bIsDocReadOnly ? KS_CheckDocReadOnlyKeys
-@@ -1863,10 +1870,15 @@ KEYINPUT_CHECKTABLE_INSDEL:
- 					}
-                 case KEY_TAB:
- 				{
-+				    sal_Unicode ch=rSh.GetChar();
-+
- #ifdef SW_CRSR_TIMER
- 					BOOL bOld = rSh.ChgCrsrTimerFlag( FALSE );
- #endif
--					if( rSh.GetCurNumRule() && rSh.IsSttOfPara() &&
-+					if (rSh.IsFormProtected() || rSh.IsInFieldBookmark()!=NULL || rSh.GetChar(FALSE)==CH_TXT_ATR_FORMELEMENT) {
-+					    eKeyState=KS_GotoNextFieldBookmark; 
-+					}
-+					else if( rSh.GetCurNumRule() && rSh.IsSttOfPara() &&
- 						!rSh.HasReadonlySel() )
-                     {
-                         // --> OD 2007-10-02 #b660435#
-@@ -1915,8 +1927,11 @@ KEYINPUT_CHECKTABLE_INSDEL:
- #ifdef SW_CRSR_TIMER
- 					BOOL bOld = rSh.ChgCrsrTimerFlag( FALSE );
- #endif
--					if( rSh.GetCurNumRule() && rSh.IsSttOfPara() &&
--						!rSh.HasReadonlySel() )
-+					if (rSh.IsFormProtected() || rSh.IsInFieldBookmark()!=NULL || rSh.GetChar(FALSE)==CH_TXT_ATR_FORMELEMENT) {
-+					    eKeyState=KS_GotoPrevFieldBookmark; 
-+					}
-+					else if( rSh.GetCurNumRule() && rSh.IsSttOfPara() &&
-+						 !rSh.HasReadonlySel() )
-                     {
-                         // --> OD 2007-10-02 #b660435#
- //                        if (rSh.IsFirstOfNumRule()) // #i23725#
-@@ -2180,7 +2195,37 @@ KEYINPUT_CHECKTABLE_INSDEL:
- 			aCh = '\t';
- 			// kein break!
- 		case KS_InsChar:
--		if( !rSh.HasReadonlySel() )
-+		if (rSh.GetChar(FALSE)==CH_TXT_ATR_FORMELEMENT) {
-+		    SwFieldBookmark *fieldBM=rSh.IsInFormFieldBookmark(); //$flr refactor!!!
-+   		    ASSERT(fieldBM!=NULL, "Where is my FieldBookmark??");
-+		    if (fieldBM!=NULL) {
-+			switch (fieldBM->GetType()) {
-+			    case 0: // TEXT
-+				assert(0); // should not happen; since "TEXT" should never get CH_TXT_ATR_FORMELEMENT...
-+				break;
-+			    case 1: // CHECKBOX
-+				fieldBM->SetChecked(!fieldBM->IsChecked());
-+				fieldBM->invalidate();
-+				rSh.InvalidateWindows(rView.GetVisArea());
-+				break;
-+			    case 2: // LIST
-+				if (fieldBM && fieldBM->getListItems()>0) {
-+				    int li=fieldBM->getCurrentListItem()+1;
-+				    if (li>=fieldBM->getListItems()) {
-+					li=0;
-+				    }
-+				    fieldBM->setCurrentListItem(li);
-+				}
-+				fieldBM->invalidate();
-+				rSh.InvalidateWindows(rView.GetVisArea());
-+				break;
-+			    default:
-+				break;				
-+			}			
-+		    }
-+//		    rSh.Overwrite(String('X'));
-+		    eKeyState = KS_Ende;
-+		} else if( !rSh.HasReadonlySel() )
- 		{
- 			BOOL bIsNormalChar = GetAppCharClass().isLetterNumeric(
- 														String( aCh ), 0 );
-@@ -2291,6 +2336,24 @@ KEYINPUT_CHECKTABLE_INSDEL:
-                 nKS_NUMINDENTINC_Count = 2;
-                 break;
- 
-+	    case KS_GotoNextFieldBookmark:	    
-+	    {
-+		SwBookmark *pBM=rSh.GetNextFieldBookmark();
-+		if (pBM!=NULL) {
-+		    rSh.GotoFieldBookmark(pBM);
-+		}
-+	    }
-+	        break;
-+
-+	    case KS_GotoPrevFieldBookmark:	    
-+	    {
-+		SwBookmark *pBM=rSh.GetPrevFieldBookmark();
-+		if (pBM!=NULL) {
-+		    rSh.GotoFieldBookmark(pBM);
-+		}
-+	    }
-+	        break;
-+
-             case KS_NumIndentDec:
-                 // --> OD 2008-06-16 #i90078#
-                 rSh.ChangeIndentOfAllListLevels(-360);
-@@ -4094,7 +4157,8 @@ void SwEditWin::MouseButtonUp(const MouseEvent& rMEvt)
+ #include "PostItMgr.hxx"
+ #include "postit.hxx"
+@@ -2220,21 +2221,31 @@ KEYINPUT_CHECKTABLE_INSDEL:
+ 		    SwFieldBookmark *fieldBM=rSh.IsInFormFieldBookmark(); //$flr refactor!!!
+    		    ASSERT(fieldBM!=NULL, "Where is my FieldBookmark??");
+ 		    if (fieldBM!=NULL) {
+-			fieldBM->SetChecked(!fieldBM->IsChecked());
+-			SwDocShell* pDocSh = rView.GetDocShell();
+-			SwDoc *pDoc=pDocSh->GetDoc();
+-			ASSERT(fieldBM->GetOtherBookmarkPos()!=NULL, "where is the otherpos?");
+-			if (fieldBM->GetOtherBookmarkPos()!=NULL) {
+-			    SwPaM aPaM(fieldBM->GetBookmarkPos(), *fieldBM->GetOtherBookmarkPos());
+-			    if (0) {
+-				rSh.StartAllAction();  //$flr TODO: understand why this not works
+-				pDoc->SetModified(aPaM);
+-				rSh.EndAllAction();
+-			    } else {
+-				rSh.CalcLayout(); // workaround
++			if (fieldBM->isType(ECMA_FORMCHECKBOX)) {
++			    bool isChecked=fieldBM->getParam(ECMA_FORMCHECKBOX_CHECKED).second.compareToAscii("on")==0;
++			    printf("checked-before=%i\n", isChecked);
++			    isChecked=!isChecked; // swap it...
++			    printf("checked-after=%i\n", isChecked);
++			    fieldBM->addParam(rtl::OUString::createFromAscii(ECMA_FORMCHECKBOX_CHECKED), rtl::OUString::createFromAscii(isChecked?"on":"off"));
++			    printf("checked-after-add=%i\n", fieldBM->getParam(ECMA_FORMCHECKBOX_CHECKED).second.compareToAscii("on")==0);
++			    fieldBM->invalidate();
++			}
++			if (fieldBM->isType(ECMA_FORMDROPDOWN)) {
++			    int currentIndex=fieldBM->getParam(ECMA_FORMDROPDOWN_RESULT, "0").second.toInt32();
++			    int entries=0;
++			    for(int i=0;i<fieldBM->getNumOfParams();i++) {
++				SwFieldBookmark::ParamPair_t p=fieldBM->getParam(i);
++				if (p.first.compareToAscii(ECMA_FORMDROPDOWN_LISTENTRY)==0)
++				    entries++;
++			    }
++			    currentIndex++;
++			    if (currentIndex>=entries) {
++				currentIndex=0;
+ 			    }
++			    fieldBM->addParam(ECMA_FORMDROPDOWN_RESULT, currentIndex);
++			    fieldBM->invalidate();
++			    rSh.InvalidateWindows(rView.GetVisArea());
+ 			}
+-			
+ 		    }
+ //		    rSh.Overwrite(String('X'));
+ 		    eKeyState = KS_Ende;
+@@ -4170,7 +4181,7 @@ void SwEditWin::MouseButtonUp(const MouseEvent& rMEvt)
  
                          SwContentAtPos aCntntAtPos( SwContentAtPos::SW_CLICKFIELD |
  													SwContentAtPos::SW_INETATTR |
 -                                                    SwContentAtPos::SW_SMARTTAG );
-+                                                    SwContentAtPos::SW_SMARTTAG |
-+			    SwContentAtPos::SW_FORMCTRL);
++                                                    SwContentAtPos::SW_SMARTTAG  | SwContentAtPos::SW_FORMCTRL);
  
  						if( rSh.GetContentAtPos( aDocPt, aCntntAtPos, TRUE ) )
  						{
-@@ -4115,7 +4179,34 @@ void SwEditWin::MouseButtonUp(const MouseEvent& rMEvt)
+@@ -4191,7 +4202,29 @@ void SwEditWin::MouseButtonUp(const MouseEvent& rMEvt)
                                      if ( bExecSmarttags && SwSmartTagMgr::Get().IsSmartTagsEnabled() )
                                          rView.ExecSmartTagPopup( aDocPt );
                              }
@@ -2843,24 +2070,19 @@
 +				    SwFieldBookmark *fieldBM=const_cast<SwFieldBookmark *>(aCntntAtPos.aFnd.pFldBookmark);
 +				    SwDocShell* pDocSh = rView.GetDocShell();
 +				    SwDoc *pDoc=pDocSh->GetDoc();
-+				    switch(fieldBM->GetType()) {
-+					case 0: // Text
-+					    assert(0); // should not happend; a "text" has not SW_FORMCTRL content pos...
-+					    break;
-+					case 1: // CheckBox
-+					    fieldBM->SetChecked(!fieldBM->IsChecked());
-+					    fieldBM->invalidate();
-+					    rSh.InvalidateWindows(rView.GetVisArea());
-+					    break;
-+					case 2: // List
-+					    rView.ExecFieldPopup( aDocPt, fieldBM );
-+					    fieldBM->invalidate();
-+					    rSh.InvalidateWindows(rView.GetVisArea());
-+					    break;
-+					default: 
-+					    break;
++				    if (fieldBM->isType(ECMA_FORMCHECKBOX)) {
++					bool isChecked=fieldBM->getParam(ECMA_FORMCHECKBOX_CHECKED).second.compareToAscii("on")==0;
++					isChecked=!isChecked; // swap it...
++					fieldBM->addParam(rtl::OUString::createFromAscii(ECMA_FORMCHECKBOX_CHECKED), rtl::OUString::createFromAscii(isChecked?"on":"off"));
++					fieldBM->invalidate();
++					rSh.InvalidateWindows(rView.GetVisArea());
++				    } else if (fieldBM->isType(ECMA_FORMDROPDOWN)) {
++					rView.ExecFieldPopup( aDocPt, fieldBM );
++					fieldBM->invalidate();
++					rSh.InvalidateWindows(rView.GetVisArea());
++				    } else {
++					// unknown type..
 +				    }
-+
 +				}
 +			    }
 +			    else // if ( SwContentAtPos::SW_INETATTR == aCntntAtPos.eCntntAtPos )
@@ -2868,7 +2090,7 @@
                                  if ( bExecHyperlinks )
                                      rSh.ClickToINetAttr( *(SwFmtINetFmt*)aCntntAtPos.aFnd.pAttr, nFilter );
 diff --git a/sw/source/ui/inc/view.hxx b/sw/source/ui/inc/view.hxx
-index dc74558..1fe66b1 100644
+index dc74558..83334eb 100644
 --- sw/source/ui/inc/view.hxx
 +++ sw/source/ui/inc/view.hxx
 @@ -93,6 +93,7 @@ struct SwConversionArgs;
@@ -2879,43 +2101,48 @@
  	
  namespace com{ namespace sun { namespace star {
  	namespace view{ class XSelectionSupplier; }
-@@ -463,6 +464,7 @@ public:
+@@ -462,7 +463,7 @@ public:
+ 
  	DECL_LINK( SpellError, LanguageType * );
  	BOOL 			ExecSpellPopup( const Point& rPt );
- 
-+        BOOL            ExecFieldPopup( const Point& rPt, SwFieldBookmark *fieldBM );
+-
++    BOOL            ExecFieldPopup( const Point& rPt, SwFieldBookmark *fieldBM );
      // SMARTTAGS
      BOOL            ExecSmartTagPopup( const Point& rPt );
  
 diff --git a/sw/source/ui/inc/wrtsh.hxx b/sw/source/ui/inc/wrtsh.hxx
-index a4273e5..e4ee381 100644
+index 437101a..aedd1ca 100644
 --- sw/source/ui/inc/wrtsh.hxx
 +++ sw/source/ui/inc/wrtsh.hxx
-@@ -415,6 +415,8 @@ typedef BOOL (SwWrtShell:: *FNSimpleMove)();
- 
- 	BOOL GotoField( const SwFmtFld& rFld );
- 
-+        bool GotoFieldBookmark(SwBookmark *pBkmk);
-+
- 	// jump to the next / previous hyperlink - inside text and also
- 	// on graphics
- 	BOOL SelectNextPrevHyperlink( BOOL bNext = TRUE );
+@@ -319,6 +319,9 @@ typedef BOOL (SwWrtShell:: *FNSimpleMove)();
+ 	void	InsertTableOf(const SwTOXBase& rTOX, const SfxItemSet* pSet = 0);
+ 	BOOL	UpdateTableOf(const SwTOXBase& rTOX, const SfxItemSet* pSet = 0);
+ 
++        //  new fields
++	BOOL	UpdateField(SwFieldBookmark &fieldBM);
++
+ 	// Numerierung und Bullets
+     /**
+        Turns on numbering or bullets.
 diff --git a/sw/source/ui/uiview/viewling.cxx b/sw/source/ui/uiview/viewling.cxx
-index 9d89f6b..894b3c1 100644
+index 8c30848..319b1e0 100644
 --- sw/source/ui/uiview/viewling.cxx
 +++ sw/source/ui/uiview/viewling.cxx
-@@ -101,6 +101,7 @@
+@@ -114,6 +114,8 @@
  #include <svx/dialogs.hrc>
  
  #include <unomid.h>
 +#include <bookmrk.hxx>
++#include <ecmaflds.hxx>
  
- using namespace ::com::sun::star;
- using namespace ::com::sun::star::beans;
-@@ -798,3 +799,143 @@ sal_Bool SwView::ExecSmartTagPopup( const Point& rPt )
+ #include <memory>
+ 
+@@ -931,3 +933,138 @@ sal_Bool SwView::ExecSmartTagPopup( const Point& rPt )
      return bRet;
  }
  
++
++
 +class SwFieldPopup : public PopupMenu
 +{
 +public:
@@ -2961,22 +2188,14 @@
 +
 +	assert(fieldBM!=NULL);
 +	if (fieldBM!=NULL) {
-+	    int listitems=fieldBM->getListItems();
-+	    for(int i=0;i<listitems;i++) {
-+		aListBox.InsertEntry(fieldBM->getListItem(i));
++	    int items=fieldBM->getNumOfParams();	    
++	    for(int i=0;i<items;i++) {
++		SwFieldBookmark::ParamPair_t p=fieldBM->getParam(i);
++		if (p.first.compareToAscii(ECMA_FORMDROPDOWN_LISTENTRY)==0) {
++		    aListBox.InsertEntry(p.second);
++		}
 +	    }
 +	}
-+/*
-+	aListBox.InsertEntry(::rtl::OUString::createFromAscii("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXY"));
-+	aListBox.InsertEntry(::rtl::OUString::createFromAscii("Hello"));
-+	aListBox.InsertEntry(::rtl::OUString::createFromAscii("World"));
-+	aListBox.InsertEntry(::rtl::OUString::createFromAscii("Red"));
-+	aListBox.InsertEntry(::rtl::OUString::createFromAscii("Green"));
-+	aListBox.InsertEntry(::rtl::OUString::createFromAscii("Blue"));
-+	aListBox.InsertEntry(::rtl::OUString::createFromAscii("Pink"));
-+	aListBox.InsertEntry(::rtl::OUString::createFromAscii("Orange"));
-+*/
-+//	aListBox.SetPosPixel(Size(0, 0));
 +	Size lbSize=aListBox.GetOptimalSize(WINDOWSIZE_PREFERRED);
 +	lbSize.Width()+=50;
 +	lbSize.Height()+=20;
@@ -3047,7 +2266,7 @@
 +	short ret=aFldDlg.Execute();
 +	int selection=aFldDlg.getSelection();
 +	if (selection>=0) {
-+	    fieldBM->setCurrentListItem((unsigned int)selection);
++	    fieldBM->addParam(ECMA_FORMDROPDOWN_RESULT, selection);
 +	}
 +    }
 +
@@ -3056,59 +2275,13 @@
 +
 +    return bRet;
 +}
-diff --git a/sw/source/ui/uno/SwXDocumentSettings.cxx b/sw/source/ui/uno/SwXDocumentSettings.cxx
-index 1240531..d187c0e 100644
---- sw/source/ui/uno/SwXDocumentSettings.cxx
-+++ sw/source/ui/uno/SwXDocumentSettings.cxx
-@@ -127,6 +127,7 @@ enum SwDocumentSettingsPropertyHandles
-     HANDLE_UNIX_FORCE_ZERO_EXT_LEADING,
-     HANDLE_USE_OLD_PRINTER_METRICS,
-     HANDLE_TABS_RELATIVE_TO_INDENT,
-+    HANDLE_PROTECT_FORM,
-     // --> OD 2008-06-05 #i89181#
-     HANDLE_TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST
-     // <--
-@@ -180,6 +181,7 @@ MasterPropertySetInfo * lcl_createSettingsInfo()
-         { RTL_CONSTASCII_STRINGPARAM("UnxForceZeroExtLeading"), HANDLE_UNIX_FORCE_ZERO_EXT_LEADING, CPPUTYPE_BOOLEAN, 0, 0},
-         { RTL_CONSTASCII_STRINGPARAM("UseOldPrinterMetrics"), HANDLE_USE_OLD_PRINTER_METRICS, CPPUTYPE_BOOLEAN, 0, 0},
-         { RTL_CONSTASCII_STRINGPARAM("TabsRelativeToIndent"), HANDLE_TABS_RELATIVE_TO_INDENT, CPPUTYPE_BOOLEAN, 0, 0},
-+	{ RTL_CONSTASCII_STRINGPARAM("ProtectForm"), HANDLE_PROTECT_FORM, CPPUTYPE_BOOLEAN, 0, 0},
-         // --> OD 2008-06-05 #i89181#
-         { RTL_CONSTASCII_STRINGPARAM("TabAtLeftIndentForParagraphsInList"), HANDLE_TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST, CPPUTYPE_BOOLEAN, 0, 0},
- 
-@@ -662,6 +664,12 @@ void SwXDocumentSettings::_setSingleValue( const comphelper::PropertyInfo & rInf
-             mpDoc->set(IDocumentSettingAccess::TABS_RELATIVE_TO_INDENT, bTmp);
-         }
-         break;
-+	case HANDLE_PROTECT_FORM:
-+        {
-+	    sal_Bool bTmp = *(sal_Bool*)rValue.getValue();
-+	    mpDoc->set(IDocumentSettingAccess::PROTECT_FORM, bTmp);
-+	}
-+	break;
-         // --> OD 2008-06-05 #i89181#
-         case HANDLE_TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST:
-         {
-@@ -983,7 +991,12 @@ void SwXDocumentSettings::_getSingleValue( const comphelper::PropertyInfo & rInf
-             rValue.setValue( &bTmp, ::getBooleanCppuType() );
-         }
-         break;
--        // --> OD 2008-06-05 #i89181#
-+        case HANDLE_PROTECT_FORM:
-+	{
-+             sal_Bool bTmp = mpDoc->get(IDocumentSettingAccess::PROTECT_FORM);
-+             rValue.setValue( &bTmp, ::getBooleanCppuType() );
-+	}
-+	break;        // --> OD 2008-06-05 #i89181#
-         case HANDLE_TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST:
-         {
-             sal_Bool bTmp = mpDoc->get(IDocumentSettingAccess::TAB_AT_LEFT_INDENT_FOR_PARA_IN_LIST);
++
 diff --git a/sw/source/ui/wrtsh/wrtsh1.cxx b/sw/source/ui/wrtsh/wrtsh1.cxx
-index 18c8feb..e7caf1b 100644
+index 0c98804..0e85b07 100644
 --- sw/source/ui/wrtsh/wrtsh1.cxx
 +++ sw/source/ui/wrtsh/wrtsh1.cxx
-@@ -1706,6 +1706,12 @@ SwWrtShell::SwWrtShell( SwDoc& rDoc, Window *_pWin, SwView &rShell,
- 	SET_CURR_SHELL( this );
+@@ -1720,6 +1720,12 @@ SwWrtShell::SwWrtShell( SwWrtShell& rSh, Window *_pWin, SwView &rShell )
+ 
  	SetSfxViewShell( (SfxViewShell *)&rShell );
  	SetFlyMacroLnk( LINK(this, SwWrtShell, ExecFlyMac) );
 +
@@ -3119,42 +2292,22 @@
 +	}
  }
  
- /*
-diff --git a/sw/source/ui/wrtsh/wrtsh3.cxx b/sw/source/ui/wrtsh/wrtsh3.cxx
-index 79f165b..183ae92 100644
---- sw/source/ui/wrtsh/wrtsh3.cxx
-+++ sw/source/ui/wrtsh/wrtsh3.cxx
-@@ -51,6 +51,7 @@
- #include "bookmrk.hxx"
- #include "doc.hxx"
- #include "wrtsh.hrc"
-+#include "docsh.hxx"
- 
- #include <unomid.h>
  
-@@ -109,6 +110,25 @@ BOOL SwWrtShell::GotoField( const SwFmtFld& rFld )
- 	return bRet;
+diff --git a/sw/source/ui/wrtsh/wrtsh2.cxx b/sw/source/ui/wrtsh/wrtsh2.cxx
+index 7a551df..13e1935 100644
+--- sw/source/ui/wrtsh/wrtsh2.cxx
++++ sw/source/ui/wrtsh/wrtsh2.cxx
+@@ -248,6 +248,13 @@ BOOL SwWrtShell::UpdateTableOf(const SwTOXBase& rTOX, const SfxItemSet* pSet)
+     return bResult;
  }
  
-+bool SwWrtShell::GotoFieldBookmark(SwBookmark *pBkmk)
++BOOL SwWrtShell::UpdateField(SwFieldBookmark &fieldBM)
 +{
-+   (this->*fnKillSel)( 0, sal_False );
-+
-+    bool bRet = SwCrsrShell::GotoFieldBookmark(pBkmk);
-+    if( bRet && IsSelFrmMode() )
-+    {
-+        UnSelectFrm();
-+        LeaveSelFrmMode();
-+    }
-+    if( IsSelection() )
-+    {
-+        fnKillSel = &SwWrtShell::ResetSelect;
-+        fnSetCrsr = &SwWrtShell::SetCrsrKillSel;
-+    }
-+    return bRet;
++    return SwEditShell::UpdateField(fieldBM);
 +}
 +
 +
- /*--------------------------------------------------------------------
-     Beschreibung: FontWork-Slots invalidieren
-  --------------------------------------------------------------------*/
++
+ 	// ein Klick aus das angegebene Feld. Der Cursor steht auf diesem.
+ 	// Fuehre die vor definierten Aktionen aus.
+ 

Modified: trunk/patches/dev300/xmloff-field-patch.diff
==============================================================================
--- trunk/patches/dev300/xmloff-field-patch.diff	(original)
+++ trunk/patches/dev300/xmloff-field-patch.diff	Wed Jan 14 12:42:01 2009
@@ -1,844 +1,175 @@
-diff --git a/xmloff/inc/xmlnmspe.hxx b/xmloff/inc/xmlnmspe.hxx
-index 69dac26..cc17d30 100644
---- xmloff/inc/xmlnmspe.hxx
-+++ xmloff/inc/xmlnmspe.hxx
-@@ -93,4 +93,8 @@ XML_OLD_NAMESPACE( TEXT,	4U )
- XML_OLD_NAMESPACE( TABLE,	5U )
- XML_OLD_NAMESPACE( META,	6U )
- 
-+// experimental namespaces
-+XML_NAMESPACE( FIELD,			100U )
-+
-+
- #endif	//  _XMLOFF_XMLNMSPE_HXX
-diff --git a/xmloff/inc/xmloff/txtimp.hxx b/xmloff/inc/xmloff/txtimp.hxx
-index cd7001a..10848b6 100644
---- xmloff/inc/xmloff/txtimp.hxx
-+++ xmloff/inc/xmloff/txtimp.hxx
-@@ -51,6 +51,11 @@
- class XMLTextListsHelper;
- // <--
- 
-+#ifndef _COM_SUN_STAR_TEXT_XFORMFIELD_HPP_
-+#include <com/sun/star/text/XFormField.hpp>
-+#endif
-+
-+
- class SvXMLImport;
- class SvXMLStylesContext;
- class XMLTextListBlockContext;
-@@ -238,6 +243,11 @@ enum XMLTextPElemTokens
- 	XML_TOK_DRAW_DATE_TIME,
- 	XML_TOK_TEXT_PAGE_CONTINUATION,
- 
-+
-+	XML_TOK_TEXT_FIELDMARK,
-+	XML_TOK_TEXT_FIELDMARK_START,
-+	XML_TOK_TEXT_FIELDMARK_END,
-+
- 	XML_TOK_TEXT_P_ELEM_END=XML_TOK_UNKNOWN
- };
- 
-@@ -404,6 +414,8 @@ class XMLOFF_DLLPUBLIC XMLTextImportHelper : public UniRefBase
-                         ::com::sun::star::text::XTextRange>,
-                     ::rtl::OUString>,
-                 ::comphelper::UStringLess> aBookmarkStartRanges;
-+	typedef ::std::vector< ::rtl::OUString> BookmarkVector_t;
-+	BookmarkVector_t aBookmarkVector;
- 
- 	/// backpatcher for references to footnotes and endnotes
- 	XMLPropertyBackpatcher<sal_Int16> * pFootnoteBackpatcher;
-@@ -468,6 +480,14 @@ class XMLOFF_DLLPUBLIC XMLTextImportHelper : public UniRefBase
- 	// Code is implemented in XMLPropertyBackpatcher.cxx
- 	SAL_DLLPRIVATE void _FinitBackpatcher();
- 
-+	typedef ::std::pair< ::rtl::OUString, ::rtl::OUString> field_name_type_t;
-+	typedef ::std::pair< ::rtl::OUString, ::rtl::OUString > field_param_t;
-+	typedef ::std::vector< field_param_t > field_params_t;
-+	typedef ::std::pair< field_name_type_t, field_params_t > field_stack_item_t;
-+	typedef ::std::stack< field_stack_item_t > field_stack_t;
-+
-+	field_stack_t aFieldStack;
-+
- protected:
- 	virtual SvXMLImportContext *CreateTableChildContext(
- 				SvXMLImport& rImport,
-@@ -745,6 +765,18 @@ public:
- 				::com::sun::star::text::XTextRange> & o_rRange,
-         ::rtl::OUString& o_rXmlId);
- 
-+	::rtl::OUString FindActiveBookmarkName();
-+	::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > GetRangeFor(::rtl::OUString &sName);
-+
-+	void pushFieldCtx( ::rtl::OUString name, ::rtl::OUString type );
-+	void popFieldCtx();
-+	void addFieldParam( ::rtl::OUString name, ::rtl::OUString value );
-+	void setCurrentFieldParamsTo(::com::sun::star::uno::Reference< ::com::sun::star::text::XFormField> &xFormField);
-+	::rtl::OUString getCurrentFieldName();
-+	::rtl::OUString getCurrentFieldType();
-+	bool hasCurrentFieldCtx();
-+
-+
- 	/// insert new footnote ID.
- 	/// Also fixup open references from the backpatch list to this ID.
- 	// Code is implemented in XMLPropertyBackpatcher.cxx
-diff --git a/xmloff/inc/xmloff/txtparae.hxx b/xmloff/inc/xmloff/txtparae.hxx
-index 588952e..5e56e13 100644
---- xmloff/inc/xmloff/txtparae.hxx
-+++ xmloff/inc/xmloff/txtparae.hxx
-@@ -214,7 +214,9 @@ protected:
- 	const ::rtl::OUString sVisitedCharStyleName;
- 	const ::rtl::OUString sWidth;
- 	const ::rtl::OUString sWidthType;
--
-+	const ::rtl::OUString sTextFieldStart;
-+	const ::rtl::OUString sTextFieldEnd;
-+	const ::rtl::OUString sTextFieldStartEnd;
- 
- 	SinglePropertySetInfoCache aCharStyleNamesPropInfoCache;
- 
-diff --git a/xmloff/inc/xmloff/xmltoken.hxx b/xmloff/inc/xmloff/xmltoken.hxx
-index f03fba5..ea7854e 100644
---- xmloff/inc/xmloff/xmltoken.hxx
-+++ xmloff/inc/xmloff/xmltoken.hxx
-@@ -3005,7 +3005,12 @@ namespace xmloff { namespace token {
-         XML_CHARACTER_SET,
-         XML_APPLICATION_CONNECTION_SETTINGS,
-         XML_TABLE_INCLUDE_FILTER,
--		XML_DEFAULT_ROW_STYLE_NAME,
-+        XML_FIELDMARK, 
-+        XML_FIELDMARK_START, 
-+        XML_FIELDMARK_END, 
-+        XML_N_FIELD, 
-+        XML_NP_FIELD, 
-+	XML_DEFAULT_ROW_STYLE_NAME,
-         XML_ANGLE_OFFSET,
-         // --> OD 2007-09-14 #i81002#
-         XML_NUMBER_NO_SUPERIOR,
-diff --git a/xmloff/source/core/xmlexp.cxx b/xmloff/source/core/xmlexp.cxx
-index d164a7c..1c3f4b1 100644
---- xmloff/source/core/xmlexp.cxx
-+++ xmloff/source/core/xmlexp.cxx
-@@ -106,6 +106,7 @@
- 
- #include <com/sun/star/rdf/XMetadatable.hpp>
- 
-+#include <assert.h>
- 
- using ::rtl::OUString;
- 
-@@ -306,6 +307,7 @@ void SvXMLExport::_InitCtor()
- 		mpNamespaceMap->Add( GetXMLToken(XML_NP_XFORMS_1_0), GetXMLToken(XML_N_XFORMS_1_0), XML_NAMESPACE_XFORMS );
- 		mpNamespaceMap->Add( GetXMLToken(XML_NP_XSD), GetXMLToken(XML_N_XSD), XML_NAMESPACE_XSD );
- 		mpNamespaceMap->Add( GetXMLToken(XML_NP_XSI), GetXMLToken(XML_N_XSI), XML_NAMESPACE_XSI );
-+		mpNamespaceMap->Add( GetXMLToken(XML_NP_FIELD), GetXMLToken(XML_N_FIELD), XML_NAMESPACE_FIELD );
- 	}
- 	if( (getExportFlags() & (EXPORT_STYLES|EXPORT_AUTOSTYLES|EXPORT_MASTERSTYLES|EXPORT_CONTENT) ) != 0 )
- 	{
-diff --git a/xmloff/source/core/xmlimp.cxx b/xmloff/source/core/xmlimp.cxx
-index 3d25e07..bc3f69a 100644
---- xmloff/source/core/xmlimp.cxx
-+++ xmloff/source/core/xmlimp.cxx
-@@ -114,6 +114,7 @@ sal_Char __READONLY_DATA sXML_np__db[] = "_db";
- sal_Char __READONLY_DATA sXML_np__xforms[] = "_xforms";
- sal_Char __READONLY_DATA sXML_np__xsd[] = "_xsd";
- sal_Char __READONLY_DATA sXML_np__xsi[] = "_xsi";
-+sal_Char __READONLY_DATA sXML_np__field[] = "_field";
- 
- sal_Char __READONLY_DATA sXML_np__fo_old[] = "__fo";
- sal_Char __READONLY_DATA sXML_np__xlink_old[] = "__xlink";
-@@ -294,8 +295,9 @@ void SvXMLImport::_InitCtor()
-                             XML_NAMESPACE_XFORMS );
- 		mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__ooow ) ), GetXMLToken(XML_N_OOOW), XML_NAMESPACE_OOOW );
- 		mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__oooc ) ), GetXMLToken(XML_N_OOOC), XML_NAMESPACE_OOOC );
--		mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__of ) ),
--                            GetXMLToken(XML_N_OF), XML_NAMESPACE_OF );
-+		mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__of ) ),  GetXMLToken(XML_N_OF), XML_NAMESPACE_OF );
-+	        mpNamespaceMap->Add( OUString( RTL_CONSTASCII_USTRINGPARAM ( sXML_np__field ) ), GetXMLToken(XML_N_FIELD), XML_NAMESPACE_FIELD );
-+		    
- 	}
- 
- 	msPackageProtocol = OUString( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.Package:" ) );
-diff --git a/xmloff/source/core/xmltoken.cxx b/xmloff/source/core/xmltoken.cxx
-index 323d59b..29be41c 100644
---- xmloff/source/core/xmltoken.cxx
-+++ xmloff/source/core/xmltoken.cxx
-@@ -3005,6 +3005,11 @@ namespace xmloff { namespace token {
-         TOKEN( "character-set",         XML_CHARACTER_SET ),
-         TOKEN( "application-connection-settings",         XML_APPLICATION_CONNECTION_SETTINGS ),
-         TOKEN( "table-include-filter",         XML_TABLE_INCLUDE_FILTER ),
-+	TOKEN( "fieldmark",             XML_FIELDMARK ),
-+	TOKEN( "fieldmark-start",       XML_FIELDMARK_START ),
-+	TOKEN( "fieldmark-end",         XML_FIELDMARK_END ),
-+	TOKEN( "urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:field:1.0",   XML_N_FIELD ),
-+        TOKEN( "field",         XML_NP_FIELD ),
-         TOKEN( "default-row-style-name", XML_DEFAULT_ROW_STYLE_NAME),
-         TOKEN( "angle-offset",          XML_ANGLE_OFFSET ),
-         // --> OD 2007-09-14 #i81002#
 diff --git a/xmloff/source/text/XMLTextMarkImportContext.cxx b/xmloff/source/text/XMLTextMarkImportContext.cxx
-index 3feae43..c421300 100644
+index 2dece10..21bd4cc 100644
 --- xmloff/source/text/XMLTextMarkImportContext.cxx
 +++ xmloff/source/text/XMLTextMarkImportContext.cxx
-@@ -49,7 +49,7 @@
- #include <com/sun/star/beans/XPropertySet.hpp>
- #include <com/sun/star/lang/XMultiServiceFactory.hpp>
- #include <com/sun/star/container/XNamed.hpp>
--
-+#include <com/sun/star/text/XFormField.hpp>
- 
- using ::rtl::OUString;
- using ::rtl::OUStringBuffer;
-@@ -62,6 +62,49 @@ using namespace ::com::sun::star::container;
- using namespace ::com::sun::star::xml::sax;
- using namespace ::xmloff::token;
- 
-+
-+ 
-+XMLFieldParamImportContext::XMLFieldParamImportContext(
-+    SvXMLImport& rImport, 
-+    XMLTextImportHelper& rHlp,
-+    sal_uInt16 nPrefix,
-+    const OUString& rLocalName ) :
-+    SvXMLImportContext(rImport, nPrefix, rLocalName),
-+    rHelper(rHlp)
-+{
-+}
-+
-+
-+void XMLFieldParamImportContext::StartElement(const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList> & xAttrList)
-+{
-+    SvXMLImport& rImport = GetImport();
-+    ::rtl::OUString sName;
-+    ::rtl::OUString sValue;
-+    
-+    sal_Int16 nLength = xAttrList->getLength();
-+    for(sal_Int16 nAttr = 0; nAttr < nLength; nAttr++)
-+    {
-+	OUString sLocalName;
-+	sal_uInt16 nPrefix = rImport.GetNamespaceMap().
-+	    GetKeyByAttrName( xAttrList->getNameByIndex(nAttr), 
-+			      &sLocalName );
-+	
-+	if ( (XML_NAMESPACE_FIELD == nPrefix) &&
-+	     IsXMLToken(sLocalName, XML_NAME)   )
-+	{
-+	    sName = xAttrList->getValueByIndex(nAttr);
-+	}
-+	if ( (XML_NAMESPACE_FIELD == nPrefix) &&
-+	     IsXMLToken(sLocalName, XML_VALUE)   )
-+	{
-+	    sValue = xAttrList->getValueByIndex(nAttr);
-+	}
-+    }
-+    if (rHelper.hasCurrentFieldCtx() && sName.getLength()>0) {
-+	rHelper.addFieldParam(sName, sValue);
-+    }
-+}
-+
- TYPEINIT1( XMLTextMarkImportContext, SvXMLImportContext);
+@@ -50,6 +50,7 @@
  
- XMLTextMarkImportContext::XMLTextMarkImportContext(
-@@ -75,7 +118,8 @@ XMLTextMarkImportContext::XMLTextMarkImportContext(
- }
+ #include <com/sun/star/text/XFormField.hpp>
  
- enum lcl_MarkType { TypeReference, TypeReferenceStart, TypeReferenceEnd,
--					TypeBookmark, TypeBookmarkStart, TypeBookmarkEnd };
-+		    TypeBookmark, TypeBookmarkStart, TypeBookmarkEnd,
-+		    TypeFieldmark, TypeFieldmarkStart, TypeFieldmarkEnd};
++#include <../../../sw/inc/ecmaflds.hxx>  // HACKYYYYYYYYY
  
- static SvXMLEnumMapEntry __READONLY_DATA lcl_aMarkTypeMap[] =
- {
-@@ -85,109 +129,177 @@ static SvXMLEnumMapEntry __READONLY_DATA lcl_aMarkTypeMap[] =
- 	{ XML_BOOKMARK,				    TypeBookmark },
- 	{ XML_BOOKMARK_START,			TypeBookmarkStart },
- 	{ XML_BOOKMARK_END,			    TypeBookmarkEnd },
-+ 	{ XML_FIELDMARK,				TypeFieldmark },
-+ 	{ XML_FIELDMARK_START,			TypeFieldmarkStart },
-+ 	{ XML_FIELDMARK_END,			 TypeFieldmarkEnd },
+ using ::rtl::OUString;
+ using ::rtl::OUStringBuffer;
+@@ -136,6 +137,33 @@ static SvXMLEnumMapEntry __READONLY_DATA lcl_aMarkTypeMap[] =
  	{ XML_TOKEN_INVALID,    		0 },
  };
  
- void XMLTextMarkImportContext::StartElement(
- 	const Reference<XAttributeList> & xAttrList)
- {
--	const OUString sAPI_reference_mark(
--		RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.ReferenceMark"));
--	const OUString sAPI_bookmark(
--		RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.Bookmark"));
--
--
--	OUString sName;
--	OUString sXmlId;
-+    if (!FindName(GetImport(), xAttrList, sBookmarkName, sXmlId, &sFieldName)) {
-+	sBookmarkName=OUString();
-+    }
-+    
-+    if (IsXMLToken(GetLocalName(), XML_FIELDMARK_END)) {
-+	sBookmarkName=rHelper.FindActiveBookmarkName();
-+    } 
-+    if (IsXMLToken(GetLocalName(), XML_FIELDMARK_START) || IsXMLToken(GetLocalName(), XML_FIELDMARK)) {
-+	if (sBookmarkName.getLength()==0) {
-+	    sBookmarkName=::rtl::OUString::createFromAscii("Unknown");
-+	}
-+	rHelper.pushFieldCtx( sBookmarkName, sFieldName );
-+    }
-+}
-+    
- 
--	if (FindName(GetImport(), xAttrList, sName, sXmlId))
-+void XMLTextMarkImportContext::EndElement()
-+{
-+    SvXMLImportContext::EndElement();
-+    const OUString sAPI_reference_mark(
-+	RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.ReferenceMark"));
-+     const OUString sAPI_bookmark(
-+	RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.Bookmark"));
-+    const OUString sAPI_fieldmark(
-+	RTL_CONSTASCII_USTRINGPARAM("org.go-oo.text.Fieldmark"));
-+    const OUString sAPI_formfieldmark(
-+	RTL_CONSTASCII_USTRINGPARAM("org.go-oo.text.FormFieldmark"));
-+
-+    
-+    if (sBookmarkName.getLength()>0)
- 	{
--		sal_uInt16 nTmp;
--		if (SvXMLUnitConverter::convertEnum(nTmp, GetLocalName(), 
--											lcl_aMarkTypeMap))
-+	    sal_uInt16 nTmp;
-+	    if (SvXMLUnitConverter::convertEnum(nTmp, GetLocalName(), 
-+						lcl_aMarkTypeMap))
-+	    {
-+		switch ((lcl_MarkType)nTmp)
- 		{
--			switch ((lcl_MarkType)nTmp)
-+		    case TypeReference:
-+			// export point reference mark
-+			CreateAndInsertMark(GetImport(),
-+					    sAPI_reference_mark,
-+					    sBookmarkName,
-+					    rHelper.GetCursorAsRange()->getStart(),
-+					    ::rtl::OUString());
-+			break;
 +
-+		    case TypeFieldmark:
-+		    case TypeBookmark:
-+		    {
-+			bool bImportAsField=((lcl_MarkType)nTmp==TypeFieldmark && sFieldName.compareToAscii("ecma.office-open-xml.field.FORMCHECKBOX")==0); // for now only import FORMCHECKBOX boxes
-+			// export point bookmark
-+			Reference<XInterface> xIfc=CreateAndInsertMark(GetImport(),
-+					    (bImportAsField?sAPI_formfieldmark:sAPI_bookmark),
-+					    sBookmarkName,
-+					    rHelper.GetCursorAsRange()->getStart(),
-+					    sXmlId);
-+			if ((lcl_MarkType)nTmp==TypeFieldmark) {
-+			    if (xIfc.is() && bImportAsField) {
-+				// setup fieldmark...
-+				Reference< ::com::sun::star::text::XFormField> xFormField(xIfc, UNO_QUERY);
-+				xFormField->setType(1); // Checkbox...
-+				if (xFormField.is() && rHelper.hasCurrentFieldCtx()) {
-+//									xFormField->setDescription(::rtl::OUString::createFromAscii("HELLO CHECKBOX"));
-+//									xFormField->setRes(1); 
-+				    rHelper.setCurrentFieldParamsTo(xFormField);
-+				}
-+			    }
-+			    rHelper.popFieldCtx();
-+			}
-+		    }
-+		    break;
-+			
-+		    case TypeFieldmarkStart:
-+		    case TypeBookmarkStart:
-+			// save XTextRange for later construction of bookmark
-+			rHelper.InsertBookmarkStartRange(
-+			    sBookmarkName, rHelper.GetCursorAsRange()->getStart(), sXmlId);
-+			break;
-+			
-+		    case TypeFieldmarkEnd:
-+		    case TypeBookmarkEnd:
-+		    {
-+			// get old range, and construct
-+			Reference<XTextRange> xStartRange;
-+			if (rHelper.FindAndRemoveBookmarkStartRange(sBookmarkName,
-+								    xStartRange, sXmlId))
- 			{
--				case TypeReference:
--					// export point reference mark
--					CreateAndInsertMark(GetImport(),
--										sAPI_reference_mark,
--										sName,
--									   rHelper.GetCursorAsRange()->getStart(),
--									   ::rtl::OUString());
--					break;
--
--				case TypeBookmark:
--					// export point bookmark
--					CreateAndInsertMark(GetImport(),
--										sAPI_bookmark,
--										sName,
--									   rHelper.GetCursorAsRange()->getStart(),
--									   sXmlId);
--					break;
--
--				case TypeBookmarkStart:
--					// save XTextRange for later construction of bookmark
--					rHelper.InsertBookmarkStartRange(
--						sName, rHelper.GetCursorAsRange()->getStart(), sXmlId);
--					break;
--
--				case TypeBookmarkEnd:
--				{
--					// get old range, and construct
--					Reference<XTextRange> xStartRange;
--					if (rHelper.FindAndRemoveBookmarkStartRange(sName,
--                            xStartRange, sXmlId))
--					{
--						Reference<XTextRange> xEndRange(
--							rHelper.GetCursorAsRange()->getStart());
--
--						// check if beginning and end are in same XText
--						if (xStartRange->getText() == xEndRange->getText())
--						{
--							// create range for insertion
--							Reference<XTextCursor> xInsertionCursor =
--								rHelper.GetText()->createTextCursorByRange(
--									xEndRange);
--							xInsertionCursor->gotoRange(xStartRange, sal_True);
--
--							//DBG_ASSERT(! xInsertionCursor->isCollapsed(), 
--							// 				"we want no point mark");
--							// can't assert, because someone could
--							// create a file with subsequence
--							// start/end elements
--
--							Reference<XTextRange> xInsertionRange(
--								xInsertionCursor, UNO_QUERY);
-+			    Reference<XTextRange> xEndRange(
-+				rHelper.GetCursorAsRange()->getStart());
-+			    
-+			    // check if beginning and end are in same XText
-+			    if (xStartRange->getText() == xEndRange->getText())
-+			    {
-+				// create range for insertion
-+				Reference<XTextCursor> xInsertionCursor =
-+				    rHelper.GetText()->createTextCursorByRange(
-+					xEndRange);
-+				xInsertionCursor->gotoRange(xStartRange, sal_True);
-+				
-+				//DBG_ASSERT(! xInsertionCursor->isCollapsed(), 
-+				// 				"we want no point mark");
-+				// can't assert, because someone could
-+				// create a file with subsequence
-+				// start/end elements
-+				
-+				Reference<XTextRange> xInsertionRange(
-+				    xInsertionCursor, UNO_QUERY);
-+				
-+				bool bImportAsField=((lcl_MarkType)nTmp==TypeFieldmarkEnd && rHelper.hasCurrentFieldCtx());
-+				if (bImportAsField) {
-+				    ::rtl::OUString currentFieldType=rHelper.getCurrentFieldType();
-+				    bImportAsField=currentFieldType.compareToAscii("ecma.office-open-xml.field.FORMTEXT")==0; // for now only import FORMTEXT boxes
-+				}
- 
--							// insert reference
--							CreateAndInsertMark(GetImport(),
--												sAPI_bookmark,
--												sName,
--												xInsertionRange,
--												sXmlId);
--						}
--						// else: beginning/end in different XText -> ignore!
-+				// insert reference
-+				Reference<XInterface> xIfc=CreateAndInsertMark(GetImport(),
-+						    (bImportAsField?sAPI_fieldmark:sAPI_bookmark),
-+						    sBookmarkName,
-+						    xInsertionRange,
-+						    sXmlId);
-+				
-+				if ((lcl_MarkType)nTmp==TypeFieldmarkEnd) {
-+				    if (xIfc.is() && bImportAsField) {
-+					// setup fieldmark...
-+					Reference< ::com::sun::star::text::XFormField> xFormField(xIfc, UNO_QUERY);
-+					xFormField->setType(0); // Text
-+					if (xFormField.is() && rHelper.hasCurrentFieldCtx()) {
-+					    rHelper.setCurrentFieldParamsTo(xFormField);
-+//									xFormField->setDescription(::rtl::OUString::createFromAscii("HELLO"));
- 					}
--					// else: no start found -> ignore!
--					break;
-+				    }
-+				    rHelper.popFieldCtx();
- 				}
--
--				case TypeReferenceStart:
--				case TypeReferenceEnd:	
--					DBG_ERROR("reference start/end are handled in txtparai !");
--					break;
--
--				default:
--					DBG_ERROR("unknown mark type");
--					break;
-+			    }
-+			    // else: beginning/end in different XText -> ignore!
- 			}
-+			// else: no start found -> ignore!
-+			break;
-+		    }
-+		    
-+		    case TypeReferenceStart:
-+		    case TypeReferenceEnd:	
-+			DBG_ERROR("reference start/end are handled in txtparai !");
-+			break;
-+			
-+		    default:
-+			DBG_ERROR("unknown mark type");
-+			break;
- 		}
-+	    }
- 	}
- }
-+ 
-+SvXMLImportContext *XMLTextMarkImportContext::CreateChildContext( USHORT nPrefix,
-+                                        const ::rtl::OUString& rLocalName,
-+                                        const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList )
++static const char *lcl_getFormFieldmarkName(rtl::OUString &name) 
 +{
-+	return new XMLFieldParamImportContext(GetImport(), rHelper, nPrefix, rLocalName);
++    static const char sCheckbox[]=ECMA_FORMCHECKBOX;
++    static const char sFormDropDown[]=ECMA_FORMDROPDOWN;
++    if (name.compareToAscii("msoffice.field.FORMCHECKBOX")==0)
++	return sCheckbox;
++    else if (name.compareToAscii(ECMA_FORMCHECKBOX)==0)
++	return sCheckbox;
++    if (name.compareToAscii(ECMA_FORMDROPDOWN)==0)
++	return sFormDropDown;
++    else
++	return NULL;
++}
++
++static rtl::OUString lcl_getFieldmarkName(rtl::OUString &name) 
++{
++    static const char sFormtext[]=ECMA_FORMTEXT;
++    if (name.compareToAscii("msoffice.field.FORMTEXT")==0)
++	return rtl::OUString::createFromAscii(sFormtext);
++    else if (name.compareToAscii(ECMA_FORMTEXT)==0)
++	return rtl::OUString::createFromAscii(sFormtext);
++    else
++	return name;
 +}
- 
- 
--void XMLTextMarkImportContext::CreateAndInsertMark(
-+Reference<XInterface> XMLTextMarkImportContext::CreateAndInsertMark(
- 	SvXMLImport& rImport,
- 	const OUString& sServiceName,
- 	const OUString& sMarkName,
-@@ -226,14 +338,16 @@ void XMLTextMarkImportContext::CreateAndInsertMark(
- 				}
- 			}
- 		}
--	}
-+		return xIfc;
-+	} else return NULL;
- }
- 
- sal_Bool XMLTextMarkImportContext::FindName(
- 	SvXMLImport& rImport,
- 	const Reference<XAttributeList> & xAttrList,
- 	OUString& sName,
--	OUString& o_rXmlId)
-+	OUString& o_rXmlId,
-+	OUString *pFieldName)
- {
- 	sal_Bool bNameOK = sal_False;
- 
-@@ -258,6 +372,12 @@ sal_Bool XMLTextMarkImportContext::FindName(
- 			o_rXmlId = xAttrList->getValueByIndex(nAttr);
- 		}
- //FIXME: RDFa (text:bookmark-start)
-+ 		if ( pFieldName!=NULL &&
-+		     (XML_NAMESPACE_FIELD == nPrefix) &&
-+		     IsXMLToken(sLocalName, XML_TYPE)   )
-+ 		{
-+		    *pFieldName = xAttrList->getValueByIndex(nAttr);
-+ 		}
- 	}
- 
- 	return bNameOK;
-diff --git a/xmloff/source/text/XMLTextMarkImportContext.hxx b/xmloff/source/text/XMLTextMarkImportContext.hxx
-index 9028379..48fc08e 100644
---- xmloff/source/text/XMLTextMarkImportContext.hxx
-+++ xmloff/source/text/XMLTextMarkImportContext.hxx
-@@ -49,6 +49,21 @@ namespace rtl {
- }
- class XMLTextImportHelper;
- 
-+class XMLFieldParamImportContext : public SvXMLImportContext
-+{
-+	XMLTextImportHelper& rHelper;
-+public:
-+	XMLFieldParamImportContext(
-+		SvXMLImport& rImport, 
-+		XMLTextImportHelper& rHlp,
-+		sal_uInt16 nPrfx,
-+		const ::rtl::OUString& rLocalName );
 +
-+	virtual void StartElement(
-+		const ::com::sun::star::uno::Reference< 
-+			::com::sun::star::xml::sax::XAttributeList> & xAttrList);
-+};
 +
- 
- /**
-  * import bookmarks and reference marks
-@@ -61,6 +76,9 @@ class XMLTextMarkImportContext : public SvXMLImportContext
+ void XMLTextMarkImportContext::StartElement(
+ 	const Reference<XAttributeList> & xAttrList)
  {
- 
- 	XMLTextImportHelper& rHelper;
-+	::rtl::OUString sBookmarkName;
-+        ::rtl::OUString sXmlId;
-+	::rtl::OUString sFieldName;
- 
- public:
- 
-@@ -72,14 +90,20 @@ public:
- 		sal_uInt16 nPrfx,
- 		const ::rtl::OUString& rLocalName );
- 
-+
- protected:
- 
- 	virtual void StartElement(
- 		const ::com::sun::star::uno::Reference< 
- 			::com::sun::star::xml::sax::XAttributeList> & xAttrList);
-+	virtual void EndElement();
-+
-+    virtual SvXMLImportContext *CreateChildContext( USHORT nPrefix,
-+                                                    const ::rtl::OUString& rLocalName,
-+                                                    const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XAttributeList >& xAttrList );
- 
- public:
--	static void CreateAndInsertMark(
-+	static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > CreateAndInsertMark(
- 		SvXMLImport& rImport,
- 		const ::rtl::OUString& sServiceName,
- 		const ::rtl::OUString& sMarkName,
-@@ -92,7 +116,8 @@ public:
- 		const ::com::sun::star::uno::Reference<
- 			::com::sun::star::xml::sax::XAttributeList> & xAttrList,
- 		::rtl::OUString& sName,
--        ::rtl::OUString& o_rXmlId);
-+        ::rtl::OUString& o_rXmlId,
-+	::rtl::OUString *pFieldName=NULL);
- };
- 
- #endif
+@@ -187,7 +215,8 @@ void XMLTextMarkImportContext::EndElement()
+ 				case TypeFieldmark:
+ 				case TypeBookmark:
+ 					{
+-						bool bImportAsField=((lcl_MarkType)nTmp==TypeFieldmark && sFieldName.compareToAscii("msoffice.field.FORMCHECKBOX")==0); // for now only import FORMCHECKBOX boxes
++					        const char *formFieldmarkName=lcl_getFormFieldmarkName(sFieldName);
++						bool bImportAsField=((lcl_MarkType)nTmp==TypeFieldmark && formFieldmarkName!=NULL); //@TODO handle abbreviation cases..
+ 						// export point bookmark
+ 						Reference<XInterface> xIfc=CreateAndInsertMark(GetImport(),
+ 										(bImportAsField?sAPI_formfieldmark:sAPI_bookmark),
+@@ -198,10 +227,8 @@ void XMLTextMarkImportContext::EndElement()
+ 							if (xIfc.is() && bImportAsField) {
+ 								// setup fieldmark...
+ 								Reference< ::com::sun::star::text::XFormField> xFormField(xIfc, UNO_QUERY);
+-								xFormField->setType(1); // Checkbox...
++								xFormField->setFieldType(rtl::OUString::createFromAscii(formFieldmarkName)); 
+ 								if (xFormField.is() && rHelper.hasCurrentFieldCtx()) {
+-//									xFormField->setDescription(::rtl::OUString::createFromAscii("HELLO CHECKBOX"));
+-//									xFormField->setRes(1); 
+ 									rHelper.setCurrentFieldParamsTo(xFormField);
+ 								}
+ 							}
+@@ -248,10 +275,6 @@ void XMLTextMarkImportContext::EndElement()
+ 								xInsertionCursor, UNO_QUERY);
+ 
+ 							bool bImportAsField=((lcl_MarkType)nTmp==TypeFieldmarkEnd && rHelper.hasCurrentFieldCtx());
+-							if (bImportAsField) {
+-								::rtl::OUString currentFieldType=rHelper.getCurrentFieldType();
+-								bImportAsField=currentFieldType.compareToAscii("msoffice.field.FORMTEXT")==0; // for now only import FORMTEXT boxes
+-							}
+ 
+ 							// insert reference
+ 							Reference<XInterface> xIfc=CreateAndInsertMark(GetImport(),
+@@ -264,10 +287,12 @@ void XMLTextMarkImportContext::EndElement()
+ 								if (xIfc.is() && bImportAsField) {
+ 									// setup fieldmark...
+ 									Reference< ::com::sun::star::text::XFormField> xFormField(xIfc, UNO_QUERY);
+-									xFormField->setType(0); // Text
+ 									if (xFormField.is() && rHelper.hasCurrentFieldCtx()) {
+-										rHelper.setCurrentFieldParamsTo(xFormField);
+-//									xFormField->setDescription(::rtl::OUString::createFromAscii("HELLO"));
++									    rtl::OUString givenTypeName=rHelper.getCurrentFieldType();
++									    rtl::OUString fieldmarkTypeName=lcl_getFieldmarkName(givenTypeName);
++									    
++									    xFormField->setFieldType(fieldmarkTypeName); 
++									    rHelper.setCurrentFieldParamsTo(xFormField);
+ 									}
+ 								}
+ 								rHelper.popFieldCtx();
 diff --git a/xmloff/source/text/txtimp.cxx b/xmloff/source/text/txtimp.cxx
-index 3ade8c1..b6de7ff 100644
+index f0889dd..c4f1530 100644
 --- xmloff/source/text/txtimp.cxx
 +++ xmloff/source/text/txtimp.cxx
-@@ -331,6 +331,11 @@ static __FAR_DATA SvXMLTokenMapEntry aTextPElemTokenMap[] =
- 	{ XML_NAMESPACE_PRESENTATION, XML_DATE_TIME, XML_TOK_DRAW_DATE_TIME },
- 	{ XML_NAMESPACE_TEXT, XML_PAGE_CONTINUATION, XML_TOK_TEXT_PAGE_CONTINUATION },
- 
-+	{ XML_NAMESPACE_FIELD, XML_FIELDMARK, XML_TOK_TEXT_FIELDMARK },
-+	{ XML_NAMESPACE_FIELD, XML_FIELDMARK_START, XML_TOK_TEXT_FIELDMARK_START },
-+	{ XML_NAMESPACE_FIELD, XML_FIELDMARK_END, XML_TOK_TEXT_FIELDMARK_END },
-+
-+
- 	XML_TOKEN_MAP_END
- };
- 
-@@ -648,6 +653,8 @@ XMLTextImportHelper::~XMLTextImportHelper()
-     delete [] mpOutlineStylesCandidates;
-     // <--
- 
-+	aBookmarkVector.clear(); 
-+		
- 	_FinitBackpatcher();
- }
- 
-@@ -2144,6 +2151,7 @@ void XMLTextImportHelper::InsertBookmarkStartRange(
- 	const OUString& i_rXmlId)
- {
- 	aBookmarkStartRanges[sName] = std::make_pair(rRange, i_rXmlId);
-+	aBookmarkVector.push_back(sName);
- }
- 
- sal_Bool XMLTextImportHelper::FindAndRemoveBookmarkStartRange(
-@@ -2156,6 +2164,13 @@ sal_Bool XMLTextImportHelper::FindAndRemoveBookmarkStartRange(
- 		o_rRange.set(aBookmarkStartRanges[sName].first);
- 		o_rXmlId = aBookmarkStartRanges[sName].second;
- 		aBookmarkStartRanges.erase(sName);
-+		BookmarkVector_t::iterator it=aBookmarkVector.begin();
-+		while(it!=aBookmarkVector.end() && it->compareTo(sName)!=0) {
-+			it++;
-+		}
-+		if (it!=aBookmarkVector.end()) {
-+			aBookmarkVector.erase(it);
-+		}
- 		return sal_True;
- 	}
- 	else
-@@ -2164,6 +2179,76 @@ sal_Bool XMLTextImportHelper::FindAndRemoveBookmarkStartRange(
+@@ -2235,14 +2235,10 @@ void XMLTextImportHelper::setCurrentFieldParamsTo(::com::sun::star::uno::Referen
+ 	if (!aFieldStack.empty() && xFormField.is()) {
+ 		field_params_t &params=aFieldStack.top().second;
+ 		for (field_params_t::iterator i=params.begin();i!=params.end();i++) {
+-			rtl::OUString name=i->first;
+-			rtl::OUString value=i->second;
+-			if (name.compareToAscii("Description")==0){
+-				xFormField->setDescription(value);
+-			} else if (name.compareToAscii("Result")==0){
+-				xFormField->setRes((sal_Int16)value.toInt32());
+-			}
+-
++		    rtl::OString aOString1 = ::rtl::OUStringToOString (i->first, RTL_TEXTENCODING_UTF8);
++		    rtl::OString aOString2 = ::rtl::OUStringToOString (i->second, RTL_TEXTENCODING_UTF8);
++		    printf("param[\"%s\"]=\"%s\"\n", aOString1.getStr(), aOString2.getStr());
++		    xFormField->addParam(i->first, i->second, false);
+ 		}
  	}
  }
- 
-+::rtl::OUString XMLTextImportHelper::FindActiveBookmarkName()
-+{
-+	if (aBookmarkVector.size()>0) {
-+		return aBookmarkVector.back();
-+	} else return ::rtl::OUString(); // return the empty string on error...
-+}
-+
-+::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > XMLTextImportHelper::GetRangeFor(::rtl::OUString &sName)
-+{
-+	return aBookmarkStartRanges[sName].first;
-+}
-+
-+
-+void XMLTextImportHelper::pushFieldCtx( ::rtl::OUString name, ::rtl::OUString type )
-+{
-+	aFieldStack.push(field_stack_item_t(field_name_type_t(name, type), field_params_t()));
-+}
-+
-+void XMLTextImportHelper::popFieldCtx()
-+{
-+	aFieldStack.pop();
-+}
-+
-+void XMLTextImportHelper::addFieldParam( ::rtl::OUString name, ::rtl::OUString value )
-+{
-+	DBG_ASSERT(!aFieldStack.empty(), "stack is empty: not good! Do a pushFieldCtx before...");
-+	if (!aFieldStack.empty()) {
-+		field_stack_item_t &aFieldStackItem=aFieldStack.top();
-+		aFieldStackItem.second.push_back(field_param_t( name, value ));
-+	}
-+}
-+::rtl::OUString XMLTextImportHelper::getCurrentFieldName()
-+{
-+	DBG_ASSERT(!aFieldStack.empty(), "stack is empty: not good! Do a pushFieldCtx before...");
-+	if (!aFieldStack.empty()) {
-+		return aFieldStack.top().first.first;
-+	} else  return ::rtl::OUString();
-+}
-+
-+::rtl::OUString XMLTextImportHelper::getCurrentFieldType()
-+{
-+	DBG_ASSERT(!aFieldStack.empty(), "stack is empty: not good! Do a pushFieldCtx before...");
-+	if (!aFieldStack.empty()) {
-+		return aFieldStack.top().first.second;
-+	} else  return ::rtl::OUString();
-+}
-+
-+bool XMLTextImportHelper::hasCurrentFieldCtx()
-+{
-+	return !aFieldStack.empty();
-+}
-+
-+void XMLTextImportHelper::setCurrentFieldParamsTo(::com::sun::star::uno::Reference< ::com::sun::star::text::XFormField> &xFormField)
-+{
-+	DBG_ASSERT(!aFieldStack.empty(), "stack is empty: not good! Do a pushFieldCtx before...");
-+	if (!aFieldStack.empty() && xFormField.is()) {
-+		field_params_t &params=aFieldStack.top().second;
-+		for (field_params_t::iterator i=params.begin();i!=params.end();i++) {
-+			rtl::OUString name=i->first;
-+			rtl::OUString value=i->second;
-+			if (name.compareToAscii("Description")==0){
-+				xFormField->setDescription(value);
-+			} else if (name.compareToAscii("Result")==0){
-+				xFormField->setRes(value.toInt32());
-+			}
-+
-+		}
-+	}
-+}
-+
- 
- void XMLTextImportHelper::ConnectFrameChains(
- 		const OUString& rFrmName,
 diff --git a/xmloff/source/text/txtparae.cxx b/xmloff/source/text/txtparae.cxx
-index 48dbeff..a1e2dd6 100644
+index d93d797..ad6f544 100644
 --- xmloff/source/text/txtparae.cxx
 +++ xmloff/source/text/txtparae.cxx
-@@ -123,6 +123,11 @@
- #include <xmloff/formlayerexport.hxx>
- #include "XMLTextCharStyleNamesElementExport.hxx"
- 
-+#include <com/sun/star/text/XBookmarksSupplier.hpp>
-+#include <com/sun/star/text/XFormField.hpp>
-+
-+#include <stdio.h>
-+
- // --> OD 2008-04-25 #refactorlists#
- #include <txtlists.hxx>
- // <--
-@@ -977,6 +982,9 @@ XMLTextParagraphExport::XMLTextParagraphExport(
- 	sVisitedCharStyleName(RTL_CONSTASCII_USTRINGPARAM("VisitedCharStyleName")),
- 	sWidth(RTL_CONSTASCII_USTRINGPARAM("Width")),
- 	sWidthType( RTL_CONSTASCII_USTRINGPARAM( "WidthType" ) ),
-+ 	sTextFieldStart( RTL_CONSTASCII_USTRINGPARAM( "TextFieldStart" ) ),
-+ 	sTextFieldEnd( RTL_CONSTASCII_USTRINGPARAM( "TextFieldEnd" ) ),
-+ 	sTextFieldStartEnd( RTL_CONSTASCII_USTRINGPARAM( "TextFieldStartEnd" ) ),
- 	aCharStyleNamesPropInfoCache( sCharStyleNames )
- {
- 	UniReference < XMLPropertySetMapper > xPropMapper(new XMLTextPropertySetMapper( TEXT_PROP_MAP_PARA ));
-@@ -2204,6 +2212,62 @@ void XMLTextParagraphExport::exportTextRangeEnumeration(
- 			{
- 				exportRuby(xPropSet, bAutoStyles);
+@@ -2277,14 +2277,16 @@ void XMLTextParagraphExport::exportTextRangeEnumeration(
+ 				}
+ 				Reference< ::com::sun::star::text::XFormField > xFormField(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
+ 				if (xFormField.is()) {
+-					GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_TYPE, ::rtl::OUString::createFromAscii("msoffice.field.FORMTEXT"));
++					GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_TYPE, xFormField->getFieldType());
+ 				}
+ 				GetExport().StartElement(XML_NAMESPACE_FIELD, XML_FIELDMARK_START, sal_False);
+ 				if (xFormField.is()) {
+-					GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_NAME, ::rtl::OUString::createFromAscii("Description"));
+-					GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_VALUE, xFormField->getDescription());
++				    for(sal_Int16 i=0;i<xFormField->getParamCount();i++) {
++					GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_NAME, xFormField->getParamName(i));
++					GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_VALUE, xFormField->getParamValue(i));
+ 					GetExport().StartElement(XML_NAMESPACE_FIELD, XML_PARAM, sal_False);
+ 					GetExport().EndElement(XML_NAMESPACE_FIELD, XML_PARAM, sal_False);
++				    }
+ 				}
+ 				GetExport().EndElement(XML_NAMESPACE_FIELD, XML_FIELDMARK_START, sal_False);
+ 			}
+@@ -2301,27 +2303,16 @@ void XMLTextParagraphExport::exportTextRangeEnumeration(
+ 				}
+ 				Reference< ::com::sun::star::text::XFormField > xFormField(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
+ 				if (xFormField.is()) {
+-					sal_Int16 fftype=xFormField->getType();
+-					switch (fftype) {
+-						case 1:
+-							GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_TYPE, ::rtl::OUString::createFromAscii("msoffice.field.FORMCHECKBOX"));
+-						break;
+-						default:
+-							DBG_ASSERT(false, "hey ---- add your export stuff here!!");
+-						break;
+-					}
++				    GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_TYPE, xFormField->getFieldType());
+ 				}
+ 				GetExport().StartElement(XML_NAMESPACE_FIELD, XML_FIELDMARK, sal_False);
+ 				if (xFormField.is()) {
+-					GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_NAME, ::rtl::OUString::createFromAscii("Description"));
+-					GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_VALUE, xFormField->getDescription());
+-					GetExport().StartElement(XML_NAMESPACE_FIELD, XML_PARAM, sal_False);
+-					GetExport().EndElement(XML_NAMESPACE_FIELD, XML_PARAM, sal_False);
+-
+-					GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_NAME, ::rtl::OUString::createFromAscii("Result"));
+-					GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_VALUE, ::rtl::OUString::valueOf((sal_Int32 )xFormField->getRes()));
++				    for(sal_Int16 i=0;i<xFormField->getParamCount();i++) {
++					GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_NAME, xFormField->getParamName(i));
++					GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_VALUE, xFormField->getParamValue(i));
+ 					GetExport().StartElement(XML_NAMESPACE_FIELD, XML_PARAM, sal_False);
+ 					GetExport().EndElement(XML_NAMESPACE_FIELD, XML_PARAM, sal_False);
++				    }
+ 				}
+ 				GetExport().EndElement(XML_NAMESPACE_FIELD, XML_FIELDMARK, sal_False);
  			}
-+			else if (sType.equals(sTextFieldStart)) 
-+			{
-+				Reference<XNamed> xBookmark(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
-+				if (xBookmark.is()) {
-+					GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_NAME, xBookmark->getName());
-+				}
-+				Reference< ::com::sun::star::text::XFormField > xFormField(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
-+				if (xFormField.is()) {
-+					GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_TYPE, ::rtl::OUString::createFromAscii("ecma.office-open-xml.field.FORMTEXT"));
-+				}
-+				GetExport().StartElement(XML_NAMESPACE_FIELD, XML_FIELDMARK_START, sal_False);
-+				if (xFormField.is()) {
-+					GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_NAME, ::rtl::OUString::createFromAscii("Description"));
-+					GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_VALUE, xFormField->getDescription());
-+					GetExport().StartElement(XML_NAMESPACE_FIELD, XML_PARAM, sal_False);
-+					GetExport().EndElement(XML_NAMESPACE_FIELD, XML_PARAM, sal_False);
-+				}
-+				GetExport().EndElement(XML_NAMESPACE_FIELD, XML_FIELDMARK_START, sal_False);
-+			}
-+			else if (sType.equals(sTextFieldEnd))
-+			{
-+				GetExport().StartElement(XML_NAMESPACE_FIELD, XML_FIELDMARK_END, sal_False);
-+				GetExport().EndElement(XML_NAMESPACE_FIELD, XML_FIELDMARK_END, sal_False);
-+			}
-+			else if (sType.equals(sTextFieldStartEnd))
-+			{
-+				Reference<XNamed> xBookmark(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
-+				if (xBookmark.is()) {
-+					GetExport().AddAttribute(XML_NAMESPACE_TEXT, XML_NAME, xBookmark->getName());
-+				}
-+				Reference< ::com::sun::star::text::XFormField > xFormField(xPropSet->getPropertyValue(sBookmark), UNO_QUERY);
-+				if (xFormField.is()) {
-+					sal_Int16 fftype=xFormField->getType();
-+					switch (fftype) {
-+						case 1:
-+							GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_TYPE, ::rtl::OUString::createFromAscii("ecma.office-open-xml.field.FORMCHECKBOX"));
-+						break;
-+						default:
-+							DBG_ASSERT(false, "hey ---- add your export stuff here!!");
-+						break;
-+					}
-+				}
-+				GetExport().StartElement(XML_NAMESPACE_FIELD, XML_FIELDMARK, sal_False);
-+				if (xFormField.is()) {
-+					GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_NAME, ::rtl::OUString::createFromAscii("Description"));
-+					GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_VALUE, xFormField->getDescription());
-+					GetExport().StartElement(XML_NAMESPACE_FIELD, XML_PARAM, sal_False);
-+					GetExport().EndElement(XML_NAMESPACE_FIELD, XML_PARAM, sal_False);
-+
-+					GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_NAME, ::rtl::OUString::createFromAscii("Result"));
-+					GetExport().AddAttribute(XML_NAMESPACE_FIELD, XML_VALUE, ::rtl::OUString::valueOf((sal_Int32 )xFormField->getRes()));
-+					GetExport().StartElement(XML_NAMESPACE_FIELD, XML_PARAM, sal_False);
-+					GetExport().EndElement(XML_NAMESPACE_FIELD, XML_PARAM, sal_False);
-+				}
-+				GetExport().EndElement(XML_NAMESPACE_FIELD, XML_FIELDMARK, sal_False);
-+			}
- 			else if (sType.equals(sSoftPageBreak))
- 			{
- 				exportSoftPageBreak(xPropSet,	bAutoStyles);
-diff --git a/xmloff/source/text/txtparai.cxx b/xmloff/source/text/txtparai.cxx
-index accc470..7fa1b1e 100644
---- xmloff/source/text/txtparai.cxx
-+++ xmloff/source/text/txtparai.cxx
-@@ -1478,6 +1478,14 @@ SvXMLImportContext *XMLImpSpanContext_Impl::CreateChildContext(
- 												 nPrefix, rLocalName );
- 		break;
- 
-+	case XML_TOK_TEXT_FIELDMARK:
-+	case XML_TOK_TEXT_FIELDMARK_START:
-+	case XML_TOK_TEXT_FIELDMARK_END:
-+		pContext = new XMLTextMarkImportContext( rImport,
-+												 *rImport.GetTextImport().get(),
-+												 nPrefix, rLocalName );
-+		break;
-+
- 	case XML_TOK_TEXT_REFERENCE_START:
- 		pContext = new XMLStartReferenceContext_Impl( rImport,
- 													  nPrefix, rLocalName,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]