[Libreoffice-commits] core.git: include/sax include/xmloff sax/source xmloff/source

Noel Grandin (via logerrit) logerrit at kemper.freedesktop.org
Wed Nov 11 05:34:43 UTC 2020


 include/sax/fastattribs.hxx                 |    4 
 include/xmloff/formlayerimport.hxx          |    8 
 include/xmloff/xformsimport.hxx             |    2 
 include/xmloff/xmltoken.hxx                 |   23 +
 sax/source/tools/fastattribs.cxx            |   29 +
 xmloff/source/core/xmltoken.cxx             |   23 +
 xmloff/source/forms/controlelement.cxx      |   31 +
 xmloff/source/forms/controlelement.hxx      |    9 
 xmloff/source/forms/elementimport.cxx       |  589 ++++++++++++++--------------
 xmloff/source/forms/elementimport.hxx       |  202 ++++-----
 xmloff/source/forms/eventimport.cxx         |    4 
 xmloff/source/forms/eventimport.hxx         |    2 
 xmloff/source/forms/formattributes.cxx      |  170 +++++++-
 xmloff/source/forms/formattributes.hxx      |   56 +-
 xmloff/source/forms/formlayerimport.cxx     |   18 
 xmloff/source/forms/layerimport.cxx         |  125 ++---
 xmloff/source/forms/layerimport.hxx         |    9 
 xmloff/source/forms/officeforms.cxx         |   24 -
 xmloff/source/forms/officeforms.hxx         |   14 
 xmloff/source/forms/property_meta_data.cxx  |    9 
 xmloff/source/forms/property_meta_data.hxx  |    4 
 xmloff/source/forms/propertyimport.cxx      |   53 +-
 xmloff/source/forms/propertyimport.hxx      |   25 -
 xmloff/source/token/tokens.txt              |   23 +
 xmloff/source/xforms/TokenContext.cxx       |    9 
 xmloff/source/xforms/TokenContext.hxx       |    3 
 xmloff/source/xforms/XFormsModelContext.cxx |    6 
 xmloff/source/xforms/XFormsModelContext.hxx |    1 
 xmloff/source/xforms/xformsimport.cxx       |    6 
 29 files changed, 927 insertions(+), 554 deletions(-)

New commits:
commit 3de38e95561ab7ca114d9f3307702ba89c4e3e9a
Author:     Noel Grandin <noelgrandin at gmail.com>
AuthorDate: Tue Nov 10 19:20:06 2020 +0200
Commit:     Noel Grandin <noel.grandin at collabora.co.uk>
CommitDate: Wed Nov 11 06:33:53 2020 +0100

    use fastparser in forms
    
    Change-Id: I7d09d64857e24267b4b4baddb563e28ceea92f2e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/105560
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>

diff --git a/include/sax/fastattribs.hxx b/include/sax/fastattribs.hxx
index 8b8138d82e9b..a9bb67e62841 100644
--- a/include/sax/fastattribs.hxx
+++ b/include/sax/fastattribs.hxx
@@ -73,6 +73,7 @@ class SAX_DLLPUBLIC FastAttributeList final : public cppu::WeakImplHelper< css::
 {
 public:
     FastAttributeList( FastTokenHandlerBase *pTokenHandler );
+    FastAttributeList( const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList );
     virtual ~FastAttributeList() override;
 
     void clear();
@@ -81,6 +82,8 @@ public:
         maAttributeValues.reserve(nNumTokens+1);
         maAttributeTokens.reserve(nNumTokens);
     }
+    void add( const FastAttributeList& );
+    void add( const css::uno::Reference<css::xml::sax::XFastAttributeList>& );
     void add( sal_Int32 nToken, const char* pValue );
     void add( sal_Int32 nToken, const char* pValue, size_t nValueLength );
     void add( sal_Int32 nToken, const OString& rValue );
@@ -91,6 +94,7 @@ public:
     const std::vector< sal_Int32 >&  getFastAttributeTokens() const { return maAttributeTokens; }
     const char* getFastAttributeValue(size_t nIndex) const { return mpChunk + maAttributeValues[nIndex]; }
     sal_Int32 AttributeValueLength(size_t i) const { return maAttributeValues[i + 1] - maAttributeValues[i] - 1; }
+    size_t size() const { return maAttributeValues.size(); }
 
     // performance sensitive shortcuts to avoid allocation ...
     bool getAsInteger( sal_Int32 nToken, sal_Int32 &rInt) const;
diff --git a/include/xmloff/formlayerimport.hxx b/include/xmloff/formlayerimport.hxx
index 4834f85d19d9..d9797f0757ec 100644
--- a/include/xmloff/formlayerimport.hxx
+++ b/include/xmloff/formlayerimport.hxx
@@ -29,6 +29,7 @@
 namespace com::sun::star::beans { class XPropertySet; }
 namespace com::sun::star::drawing { class XDrawPage; }
 namespace com::sun::star::xml::sax { class XAttributeList; }
+namespace com::sun::star::xml::sax { class XFastAttributeList; }
 
 class SvXMLImport;
 class SvXMLImportContext;
@@ -68,6 +69,8 @@ namespace xmloff
             SvXMLImport& _rImport,
             sal_uInt16 _nPrefix,
             const OUString& _rLocalName);
+        static SvXMLImportContext* createOfficeFormsContext(
+            SvXMLImport& _rImport);
 
         /** create an SvXMLImportContext instance which is able to import the <form:form>
             element.
@@ -78,9 +81,8 @@ namespace xmloff
             @see endPage
         */
         SvXMLImportContext* createContext(
-            const sal_uInt16 _nPrefix,
-            const OUString& _rLocalName,
-            const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttribs);
+            const sal_Int32 _nElement,
+            const css::uno::Reference< css::xml::sax::XFastAttributeList >& _rxAttribs);
 
         /** lookup a control given by id.
 
diff --git a/include/xmloff/xformsimport.hxx b/include/xmloff/xformsimport.hxx
index b580af57608b..b6b86044ce1b 100644
--- a/include/xmloff/xformsimport.hxx
+++ b/include/xmloff/xformsimport.hxx
@@ -39,6 +39,8 @@ XMLOFF_DLLPUBLIC SvXMLImportContext* createXFormsModelContext(
     SvXMLImport& rImport,
     sal_uInt16 nPrefix,
     const OUString& rLocalName );
+XMLOFF_DLLPUBLIC SvXMLImportContext* createXFormsModelContext(
+    SvXMLImport& rImport );
 
 /** perform the actual binding of an XForms-binding with the suitable control
  *  @param document which contains the XForms-model(s)
diff --git a/include/xmloff/xmltoken.hxx b/include/xmloff/xmltoken.hxx
index 6b2fed011a39..e0f3ef898c65 100644
--- a/include/xmloff/xmltoken.hxx
+++ b/include/xmloff/xmltoken.hxx
@@ -217,6 +217,9 @@ namespace xmloff::token {
         XML_ALIGN,
         XML_ALL,
         XML_ALLOW_EMPTY_CELL,
+        XML_ALLOW_DELETES,
+        XML_ALLOW_INSERTS,
+        XML_ALLOW_UPDATES,
         XML_ALPHABETICAL_INDEX,
         XML_ALPHABETICAL_INDEX_AUTO_MARK_FILE,
         XML_ALPHABETICAL_INDEX_ENTRY_TEMPLATE,
@@ -365,6 +368,7 @@ namespace xmloff::token {
         XML_BUTTON3,
         XML_BUTTON4,
         XML_BUTTONS,
+        XML_BUTTON_TYPE,
         XML_BVAR,
         XML_C,
         XML_CALCULATION_SETTINGS,
@@ -488,6 +492,7 @@ namespace xmloff::token {
         XML_CONTROL,
         XML_CONVERSION_MODE,
         XML_CONVERSION_TYPE,
+        XML_CONVERT_EMPTY_TO_NULL,
         XML_COPY_BACK,
         XML_COPY_FORMULAS,
         XML_COPY_OUTLINE_LEVELS,
@@ -612,6 +617,7 @@ namespace xmloff::token {
         XML_DECORATIVE,
         XML_DEEP,
         XML_DEFAULT,
+        XML_DEFAULT_BUTTON,
         XML_DEFAULT_CELL_STYLE_NAME,
         XML_DEFAULT_STYLE,
         XML_DEFAULT_STYLE_NAME,
@@ -684,6 +690,7 @@ namespace xmloff::token {
         XML_DROPDOWN,
         XML_DROP_CAP,
         XML_DYNAMIC,
+        XML_ECHO_CHAR,
         XML_EDGE_ROUNDING,
         XML_EDITABLE,
         XML_EDITING_CYCLES,
@@ -702,6 +709,7 @@ namespace xmloff::token {
         XML_ENABLE_NUMBERING,
         XML_ENABLED,
         XML_ENCODING,
+        XML_ENCTYPE,
         XML_END,
         XML_END_ANGLE,
         XML_END_CELL_ADDRESS,
@@ -809,6 +817,7 @@ namespace xmloff::token {
         XML_FLOOR,
         XML_FN,
         XML_FOCAL_LENGTH,
+        XML_FOCUS_ON_CLICK,
         XML_FONT_CHAR_WIDTH,
         XML_FONT_CHARSET,
         XML_FONT_CHARSET_ASIAN,
@@ -880,6 +889,7 @@ namespace xmloff::token {
         XML_FOOTNOTE_SEP,
         XML_FOOTNOTES_CONFIGURATION,
         XML_FOOTNOTES_POSITION,
+        XML_FOR,
         XML_FORALL,
         XML_FORCE_MANUAL,
         XML_FOREGROUND,
@@ -1021,6 +1031,7 @@ namespace xmloff::token {
         XML_IDEOGRAPH_ALPHA,
         XML_IGNORE_CASE,
         XML_IGNORE_EMPTY_ROWS,
+        XML_IGNORE_RESULT,
         XML_IGNORE_SELECTED_PAGE, // used for ODF compatibility
         XML_ILLUSTRATION_INDEX,
         XML_ILLUSTRATION_INDEX_ENTRY_TEMPLATE,
@@ -1055,6 +1066,7 @@ namespace xmloff::token {
         XML_INFORMATION,
         XML_INITIAL_CREATOR,
         XML_INPROCEEDINGS,
+        XML_INPUT_REQUIRED,
         XML_INSERT_COLUMNS,
         XML_INSERT_ROWS,
         XML_INSERTION,
@@ -1078,6 +1090,7 @@ namespace xmloff::token {
         XML_IS_SELECTION,
         XML_ISBN,
         XML_ITALIC,
+        XML_ITEM,
         XML_ITERATION,
         XML_JOURNAL,
         XML_JUSTIFIED,
@@ -1302,6 +1315,8 @@ namespace xmloff::token {
         XML_MTEXT,
         XML_MTR,
         XML_MULTI_DELETION_SPANNED,
+        XML_MULTI_LINE,
+        XML_MULTIPLE,
         XML_MUNDER,
         XML_MUNDEROVER,
         XML_NAME,
@@ -1309,6 +1324,7 @@ namespace xmloff::token {
         XML_NAMED_EXPRESSION,
         XML_NAMED_EXPRESSIONS,
         XML_NAMED_RANGE,
+        XML_NAVIGATION_MODE,
         XML_NAVY,
         XML_NEGATIVE_COLOR,
         XML_NEQ,
@@ -1416,6 +1432,7 @@ namespace xmloff::token {
         XML_PAGE_NUMBER,
         XML_PAGE_NUMBER_VISIBLE,
         XML_PAGE_START_MARGIN,
+        XML_PAGE_STEP_SIZE,
         XML_PAGE_STYLE_NAME,
         XML_PAGE_THUMBNAIL,
         XML_PAGE_USAGE,
@@ -1769,6 +1786,7 @@ namespace xmloff::token {
         XML_START_TABLE,
         XML_START_VALUE,
         XML_START_WITH_NAVIGATOR,
+        XML_STATE,
         XML_STATISTICS,
         XML_STATUS,
         XML_STAY_ON_TOP,
@@ -1823,6 +1841,8 @@ namespace xmloff::token {
         XML_SYMBOL_WIDTH,
         XML_SYSTEM,
         XML_TAB_COLOR,
+        XML_TAB_CYCLE,
+        XML_TAB_INDEX,
         XML_TAB_STOP,
         XML_TAB_STOP_DISTANCE,
         XML_TAB_STOPS,
@@ -1930,6 +1950,7 @@ namespace xmloff::token {
         XML_TOC_MARK,
         XML_TOC_MARK_END,
         XML_TOC_MARK_START,
+        XML_TOGGLE,
         XML_TOP,
         XML_TOP_LEFT,
         XML_TOP_PERCENT,
@@ -2012,6 +2033,7 @@ namespace xmloff::token {
         XML_USER_INDEX_SOURCE,
         XML_USER_TRANSFORMED,
         XML_USERNAME,
+        XML_VALIDATION,
         XML_VALUE,
         XML_VALUE_TYPE,
         XML_VALUES_CELL_RANGE_ADDRESS,
@@ -2051,6 +2073,7 @@ namespace xmloff::token {
         XML_VISIBLE_AREA_TOP,
         XML_VISIBLE_AREA_WIDTH,
         XML_VISITED_STYLE_NAME,
+        XML_VISUAL_EFFECT,
         XML_VOLATILE,
         XML_VOLUME,
         XML_VPN,
diff --git a/sax/source/tools/fastattribs.cxx b/sax/source/tools/fastattribs.cxx
index c021e892f91e..a8c3e57cae86 100644
--- a/sax/source/tools/fastattribs.cxx
+++ b/sax/source/tools/fastattribs.cxx
@@ -63,6 +63,19 @@ FastAttributeList::FastAttributeList( sax_fastparser::FastTokenHandlerBase *pTok
     maAttributeValues.push_back( 0 );
 }
 
+FastAttributeList::FastAttributeList( const css::uno::Reference< css::xml::sax::XFastAttributeList > & xAttrList )
+{
+    const auto& rOther = castToFastAttributeList(xAttrList);
+    mpTokenHandler = rOther.mpTokenHandler;
+    mpChunk = static_cast<char *>(malloc( rOther.mnChunkLength ));
+    mnChunkLength = rOther.mnChunkLength;
+    memcpy(mpChunk, rOther.mpChunk, rOther.mnChunkLength);
+    maAttributeValues = rOther.maAttributeValues;
+    maAttributeTokens = rOther.maAttributeTokens;
+    maUnknownAttributes = rOther.maUnknownAttributes;
+}
+
+
 FastAttributeList::~FastAttributeList()
 {
     free( mpChunk );
@@ -79,6 +92,8 @@ void FastAttributeList::clear()
 void FastAttributeList::add( sal_Int32 nToken, const char* pValue, size_t nValueLength )
 {
     assert(nToken != -1);
+    assert(nToken != 0);
+    assert(nValueLength < SAL_MAX_INT32); // protect against absurd values
     maAttributeTokens.push_back( nToken );
     sal_Int32 nWritePosition = maAttributeValues.back();
     maAttributeValues.push_back( maAttributeValues.back() + nValueLength + 1 );
@@ -123,6 +138,20 @@ void FastAttributeList::addUnknown( const OString& rName, const OString& value )
     maUnknownAttributes.emplace_back( rName, value );
 }
 
+void FastAttributeList::add( const css::uno::Reference<css::xml::sax::XFastAttributeList>& xAttrList )
+{
+    const auto& rOther = castToFastAttributeList(xAttrList);
+    add(rOther);
+}
+
+void FastAttributeList::add( const FastAttributeList& rOther )
+{
+    for (size_t i=0; i < rOther.maAttributeTokens.size(); ++i)
+        add(rOther.maAttributeTokens[i], rOther.getFastAttributeValue(i), rOther.AttributeValueLength(i));
+    for (const auto & i : rOther.maUnknownAttributes)
+        addUnknown(i.maNamespaceURL, i.maName, i.maValue);
+}
+
 // XFastAttributeList
 sal_Bool FastAttributeList::hasAttribute( ::sal_Int32 Token )
 {
diff --git a/xmloff/source/core/xmltoken.cxx b/xmloff/source/core/xmltoken.cxx
index f8cd9c9315c7..c64f51768cf3 100644
--- a/xmloff/source/core/xmltoken.cxx
+++ b/xmloff/source/core/xmltoken.cxx
@@ -222,6 +222,9 @@ namespace xmloff::token {
         TOKEN( "align",                           XML_ALIGN ),
         TOKEN( "all",                             XML_ALL ),
         TOKEN( "allow-empty-cell",                XML_ALLOW_EMPTY_CELL ),
+        TOKEN( "allow-deletes",                   XML_ALLOW_DELETES ),
+        TOKEN( "allow-inserts",                   XML_ALLOW_INSERTS ),
+        TOKEN( "allow-updates",                   XML_ALLOW_UPDATES ),
         TOKEN( "alphabetical-index",              XML_ALPHABETICAL_INDEX ),
         TOKEN( "alphabetical-index-auto-mark-file",       XML_ALPHABETICAL_INDEX_AUTO_MARK_FILE ),
         TOKEN( "alphabetical-index-entry-template",       XML_ALPHABETICAL_INDEX_ENTRY_TEMPLATE ),
@@ -370,6 +373,7 @@ namespace xmloff::token {
         TOKEN( "button3",                         XML_BUTTON3 ),
         TOKEN( "button4",                         XML_BUTTON4 ),
         TOKEN( "buttons",                         XML_BUTTONS ),
+        TOKEN( "button-type",                     XML_BUTTON_TYPE ),
         TOKEN( "bvar",                            XML_BVAR ),
         TOKEN( "c",                               XML_C ),
         TOKEN( "calculation-settings",            XML_CALCULATION_SETTINGS ),
@@ -493,6 +497,7 @@ namespace xmloff::token {
         TOKEN( "control",                         XML_CONTROL ),
         TOKEN( "conversion-mode",                 XML_CONVERSION_MODE ),
         TOKEN( "conversion-type",                 XML_CONVERSION_TYPE ),
+        TOKEN( "convert-empty-to-null",           XML_CONVERT_EMPTY_TO_NULL ),
         TOKEN( "copy-back",                       XML_COPY_BACK ),
         TOKEN( "copy-formulas",                   XML_COPY_FORMULAS ),
         TOKEN( "copy-outline-levels",             XML_COPY_OUTLINE_LEVELS ),
@@ -617,6 +622,7 @@ namespace xmloff::token {
         TOKEN( "decorative",                      XML_DECORATIVE ),
         TOKEN( "deep",                            XML_DEEP ),
         TOKEN( "default",                         XML_DEFAULT ),
+        TOKEN( "default-button",                  XML_DEFAULT_BUTTON ),
         TOKEN( "default-cell-style-name",         XML_DEFAULT_CELL_STYLE_NAME ),
         TOKEN( "default-style",                   XML_DEFAULT_STYLE ),
         TOKEN( "default-style-name",              XML_DEFAULT_STYLE_NAME ),
@@ -689,6 +695,7 @@ namespace xmloff::token {
         TOKEN( "dropdown",                        XML_DROPDOWN ),
         TOKEN( "drop-cap",                        XML_DROP_CAP ),
         TOKEN( "dynamic",                         XML_DYNAMIC ),
+        TOKEN( "echo-char",                       XML_ECHO_CHAR ),
         TOKEN( "edge-rounding",                   XML_EDGE_ROUNDING ),
         TOKEN( "editable",                        XML_EDITABLE ),
         TOKEN( "editing-cycles",                  XML_EDITING_CYCLES ),
@@ -707,6 +714,7 @@ namespace xmloff::token {
         TOKEN( "enable-numbering",                XML_ENABLE_NUMBERING ),
         TOKEN( "enabled",                         XML_ENABLED ),
         TOKEN( "encoding",                        XML_ENCODING ),
+        TOKEN( "enctype",                         XML_ENCTYPE ),
         TOKEN( "end",                             XML_END ),
         TOKEN( "end-angle",                       XML_END_ANGLE ),
         TOKEN( "end-cell-address",                XML_END_CELL_ADDRESS ),
@@ -814,6 +822,7 @@ namespace xmloff::token {
         TOKEN( "floor",                           XML_FLOOR ),
         TOKEN( "fn",                              XML_FN ),
         TOKEN( "focal-length",                    XML_FOCAL_LENGTH ),
+        TOKEN( "focus-on-click",                  XML_FOCUS_ON_CLICK ),
         TOKEN( "font-char-width",                 XML_FONT_CHAR_WIDTH ),
         TOKEN( "font-charset",                    XML_FONT_CHARSET ),
         TOKEN( "font-charset-asian",              XML_FONT_CHARSET_ASIAN ),
@@ -885,6 +894,7 @@ namespace xmloff::token {
         TOKEN( "footnote-sep",                    XML_FOOTNOTE_SEP ),
         TOKEN( "footnotes-configuration",         XML_FOOTNOTES_CONFIGURATION ),
         TOKEN( "footnotes-position",              XML_FOOTNOTES_POSITION ),
+        TOKEN( "for",                             XML_FOR ),
         TOKEN( "forall",                          XML_FORALL ),
         TOKEN( "force-manual",                    XML_FORCE_MANUAL ),
         TOKEN( "foreground",                      XML_FOREGROUND ),
@@ -1027,6 +1037,7 @@ namespace xmloff::token {
         TOKEN( "ideograph-alpha",                 XML_IDEOGRAPH_ALPHA ),
         TOKEN( "ignore-case",                     XML_IGNORE_CASE ),
         TOKEN( "ignore-empty-rows",               XML_IGNORE_EMPTY_ROWS ),
+        TOKEN( "ignore-result",                   XML_IGNORE_RESULT ),
         TOKEN( "ignore-selected-page",            XML_IGNORE_SELECTED_PAGE ),
         TOKEN( "illustration-index",              XML_ILLUSTRATION_INDEX ),
         TOKEN( "illustration-index-entry-template",       XML_ILLUSTRATION_INDEX_ENTRY_TEMPLATE ),
@@ -1061,6 +1072,7 @@ namespace xmloff::token {
         TOKEN( "information",                     XML_INFORMATION ),
         TOKEN( "initial-creator",                 XML_INITIAL_CREATOR ),
         TOKEN( "inproceedings",                   XML_INPROCEEDINGS ),
+        TOKEN( "input-required",                  XML_INPUT_REQUIRED ),
         TOKEN( "insert-columns",                  XML_INSERT_COLUMNS ),
         TOKEN( "insert-rows",                     XML_INSERT_ROWS ),
         TOKEN( "insertion",                       XML_INSERTION ),
@@ -1084,6 +1096,7 @@ namespace xmloff::token {
         TOKEN( "is-selection",                    XML_IS_SELECTION ),
         TOKEN( "isbn",                            XML_ISBN ),
         TOKEN( "italic",                          XML_ITALIC ),
+        TOKEN( "item",                            XML_ITEM ),
         TOKEN( "iteration",                       XML_ITERATION ),
         TOKEN( "journal",                         XML_JOURNAL ),
         TOKEN( "justified",                       XML_JUSTIFIED ),
@@ -1308,6 +1321,8 @@ namespace xmloff::token {
         TOKEN( "mtext",                           XML_MTEXT ),
         TOKEN( "mtr",                             XML_MTR ),
         TOKEN( "multi-deletion-spanned",          XML_MULTI_DELETION_SPANNED ),
+        TOKEN( "multi-line",                      XML_MULTI_LINE ),
+        TOKEN( "multiple",                        XML_MULTIPLE ),
         TOKEN( "munder",                          XML_MUNDER ),
         TOKEN( "munderover",                      XML_MUNDEROVER ),
         TOKEN( "name",                            XML_NAME ),
@@ -1315,6 +1330,7 @@ namespace xmloff::token {
         TOKEN( "named-expression",                XML_NAMED_EXPRESSION ),
         TOKEN( "named-expressions",               XML_NAMED_EXPRESSIONS ),
         TOKEN( "named-range",                     XML_NAMED_RANGE ),
+        TOKEN( "navigation-mode",                 XML_NAVIGATION_MODE ),
         TOKEN( "navy",                            XML_NAVY ),
         TOKEN( "negative-color",                   XML_NEGATIVE_COLOR ),
         TOKEN( "neq",                             XML_NEQ ),
@@ -1422,6 +1438,7 @@ namespace xmloff::token {
         TOKEN( "page-number",                     XML_PAGE_NUMBER ),
         TOKEN( "page-number-visible",             XML_PAGE_NUMBER_VISIBLE ),
         TOKEN( "page-start-margin",               XML_PAGE_START_MARGIN ),
+        TOKEN( "page-step-size",                  XML_PAGE_STEP_SIZE ),
         TOKEN( "page-style-name",                 XML_PAGE_STYLE_NAME ),
         TOKEN( "page-thumbnail",                  XML_PAGE_THUMBNAIL ),
         TOKEN( "page-usage",                      XML_PAGE_USAGE ),
@@ -1775,6 +1792,7 @@ namespace xmloff::token {
         TOKEN( "start-table",                     XML_START_TABLE ),
         TOKEN( "start-value",                     XML_START_VALUE ),
         TOKEN( "start-with-navigator",            XML_START_WITH_NAVIGATOR ),
+        TOKEN( "state",                           XML_STATE ),
         TOKEN( "statistics",                      XML_STATISTICS ),
         TOKEN( "status",                          XML_STATUS ),
         TOKEN( "stay-on-top",                     XML_STAY_ON_TOP ),
@@ -1829,6 +1847,8 @@ namespace xmloff::token {
         TOKEN( "symbol-width",                    XML_SYMBOL_WIDTH ),
         TOKEN( "system",                          XML_SYSTEM ),
         TOKEN( "tab-color",                       XML_TAB_COLOR ),
+        TOKEN( "tab-cycle",                       XML_TAB_CYCLE ),
+        TOKEN( "tab-index",                       XML_TAB_INDEX ),
         TOKEN( "tab-stop",                        XML_TAB_STOP ),
         TOKEN( "tab-stop-distance",               XML_TAB_STOP_DISTANCE ),
         TOKEN( "tab-stops",                       XML_TAB_STOPS ),
@@ -1936,6 +1956,7 @@ namespace xmloff::token {
         TOKEN( "toc-mark",                        XML_TOC_MARK ),
         TOKEN( "toc-mark-end",                    XML_TOC_MARK_END ),
         TOKEN( "toc-mark-start",                  XML_TOC_MARK_START ),
+        TOKEN( "toggle",                          XML_TOGGLE ),
         TOKEN( "top",                             XML_TOP ),
         TOKEN( "top-left",                        XML_TOP_LEFT ),
         TOKEN( "top percent",                     XML_TOP_PERCENT ),
@@ -2018,6 +2039,7 @@ namespace xmloff::token {
         TOKEN( "user-index-source",               XML_USER_INDEX_SOURCE ),
         TOKEN( "user-transformed",                XML_USER_TRANSFORMED ),
         TOKEN( "username",                        XML_USERNAME ),
+        TOKEN( "validation",                      XML_VALIDATION ),
         TOKEN( "value",                           XML_VALUE ),
         TOKEN( "value-type",                      XML_VALUE_TYPE ),
         TOKEN( "values-cell-range-address",       XML_VALUES_CELL_RANGE_ADDRESS ),
@@ -2057,6 +2079,7 @@ namespace xmloff::token {
         TOKEN( "visible-area-top",                XML_VISIBLE_AREA_TOP ),
         TOKEN( "visible-area-width",              XML_VISIBLE_AREA_WIDTH ),
         TOKEN( "visited-style-name",              XML_VISITED_STYLE_NAME ),
+        TOKEN( "visual-effect",              XML_VISUAL_EFFECT ),
         TOKEN( "volatile",                        XML_VOLATILE ),
         TOKEN( "volume",                          XML_VOLUME ),
         TOKEN( "vpn",                             XML_VPN ),
diff --git a/xmloff/source/forms/controlelement.cxx b/xmloff/source/forms/controlelement.cxx
index e7fc96e71e97..af752ae4bdc5 100644
--- a/xmloff/source/forms/controlelement.cxx
+++ b/xmloff/source/forms/controlelement.cxx
@@ -18,6 +18,9 @@
  */
 
 #include "controlelement.hxx"
+#include <xmloff/xmltoken.hxx>
+
+using namespace ::xmloff::token;
 
 namespace xmloff
 {
@@ -51,6 +54,34 @@ namespace xmloff
         }
     }
 
+    sal_Int32 OControlElement::getElementToken(ElementType _eType)
+    {
+        switch (_eType)
+        {
+            case TEXT: return XML_TEXT;
+            case TEXT_AREA: return XML_TEXTAREA;
+            case PASSWORD: return XML_PASSWORD;
+            case FILE: return XML_FILE;
+            case FORMATTED_TEXT: return XML_FORMATTED_TEXT;
+            case FIXED_TEXT: return XML_FIXED_TEXT;
+            case COMBOBOX: return XML_COMBOBOX;
+            case LISTBOX: return XML_LISTBOX;
+            case BUTTON: return XML_BUTTON;
+            case IMAGE: return XML_IMAGE;
+            case CHECKBOX: return XML_CHECKBOX;
+            case RADIO: return XML_RADIO;
+            case FRAME: return XML_FRAME;
+            case IMAGE_FRAME: return XML_IMAGE_FRAME;
+            case HIDDEN: return XML_HIDDEN;
+            case GRID: return XML_GRID;
+            case VALUERANGE: return XML_VALUE_RANGE;
+            case TIME: return XML_TIME;
+            case DATE: return XML_DATE;
+
+            default: return XML_GENERIC_CONTROL;
+        }
+    }
+
 }   // namespace xmloff
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/xmloff/source/forms/controlelement.hxx b/xmloff/source/forms/controlelement.hxx
index 8a28ecaa3155..d384d9f048f7 100644
--- a/xmloff/source/forms/controlelement.hxx
+++ b/xmloff/source/forms/controlelement.hxx
@@ -73,6 +73,15 @@ namespace xmloff
                 the element type
         */
         static const char* getElementName(ElementType _eType);
+
+        /** retrieves the tag name to be used to describe a control of the given type
+
+            <p>The returned string is the pure token, without any namespace.</p>
+
+            @param  _eType
+                the element type
+        */
+        static sal_Int32 getElementToken(ElementType _eType);
     };
 
 }   // namespace xmloff
diff --git a/xmloff/source/forms/elementimport.cxx b/xmloff/source/forms/elementimport.cxx
index 225a68fa13a4..4c6640747ac0 100644
--- a/xmloff/source/forms/elementimport.cxx
+++ b/xmloff/source/forms/elementimport.cxx
@@ -66,6 +66,7 @@ namespace xmloff
     using namespace ::com::sun::star::lang;
     using namespace ::com::sun::star::form;
     using namespace ::com::sun::star::xml;
+    using namespace ::com::sun::star::xml::sax;
     using namespace ::com::sun::star::util;
     using namespace ::com::sun::star::text;
     using namespace ::comphelper;
@@ -90,6 +91,7 @@ namespace xmloff
 
     //= OElementNameMap
     OElementNameMap::MapString2Element  OElementNameMap::s_sElementTranslations;
+    std::map<sal_Int32, OControlElement::ElementType>  OElementNameMap::s_sElementTranslations2;
 
     const OControlElement::ElementType& operator ++(OControlElement::ElementType& _e)
     {
@@ -113,10 +115,24 @@ namespace xmloff
         return UNKNOWN;
     }
 
+    OControlElement::ElementType OElementNameMap::getElementType(sal_Int32 nElement)
+    {
+        if ( s_sElementTranslations2.empty() )
+        {   // initialize
+            for (ElementType eType=ElementType(0); eType<UNKNOWN; ++eType)
+                s_sElementTranslations2[getElementToken(eType)] = eType;
+        }
+        auto aPos = s_sElementTranslations2.find(nElement & TOKEN_MASK);
+        if (s_sElementTranslations2.end() != aPos)
+            return aPos->second;
+
+        return UNKNOWN;
+    }
+
     //= OElementImport
-    OElementImport::OElementImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+    OElementImport::OElementImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const Reference< XNameContainer >& _rxParentContainer)
-        :OPropertyImport(_rImport, _nPrefix, _rName)
+        :OPropertyImport(_rImport)
         ,m_rFormImport(_rImport)
         ,m_rEventManager(_rEventManager)
         ,m_pStyleElement( nullptr )
@@ -135,13 +151,11 @@ namespace xmloff
         return OUString();
     }
 
-    void OElementImport::StartElement(const Reference< XAttributeList >& _rxAttrList)
+    void OElementImport::startFastElement(sal_Int32 nElement, const Reference< css::xml::sax::XFastAttributeList >& _rxAttrList)
     {
         ENTER_LOG_CONTEXT( "xmloff::OElementImport - importing one element" );
 
-        const SvXMLNamespaceMap& rMap = m_rContext.getGlobalContext().GetNamespaceMap();
-        const OUString sImplNameAttribute = rMap.GetQNameByKey( XML_NAMESPACE_FORM, GetXMLToken( XML_CONTROL_IMPLEMENTATION ) );
-        const OUString sControlImplementation = _rxAttrList->getValueByName( sImplNameAttribute );
+        const OUString sControlImplementation = _rxAttrList->getValue( XML_ELEMENT(FORM, XML_CONTROL_IMPLEMENTATION) );
 
         // retrieve the service name
         if ( !sControlImplementation.isEmpty() )
@@ -163,16 +177,17 @@ namespace xmloff
             m_xInfo = m_xElement->getPropertySetInfo();
 
         // call the base class
-        OPropertyImport::StartElement( _rxAttrList );
+        OPropertyImport::startFastElement( nElement, _rxAttrList );
     }
 
-    SvXMLImportContextRef OElementImport::CreateChildContext(sal_uInt16 _nPrefix, const OUString& _rLocalName,
-        const Reference< XAttributeList >& _rxAttrList)
+    css::uno::Reference< css::xml::sax::XFastContextHandler > OElementImport::createFastChildContext(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& _rxAttrList )
     {
-        if( token::IsXMLToken(_rLocalName, token::XML_EVENT_LISTENERS) && (XML_NAMESPACE_OFFICE == _nPrefix))
-            return new OFormEventsImportContext(m_rFormImport.getGlobalContext(), _nPrefix, _rLocalName, *this);
+        if( nElement == XML_ELEMENT(OFFICE, XML_EVENT_LISTENERS) )
+            return new OFormEventsImportContext(m_rFormImport.getGlobalContext(), *this);
 
-        return OPropertyImport::CreateChildContext(_nPrefix, _rLocalName, _rxAttrList);
+        return OPropertyImport::createFastChildContext(nElement, _rxAttrList);
     }
 
     void OElementImport::endFastElement(sal_Int32 )
@@ -517,13 +532,64 @@ namespace xmloff
         return false;
     }
 
-    bool OElementImport::handleAttribute(sal_uInt16 _nNamespaceKey, const OUString& _rLocalName, const OUString& _rValue)
+    bool OElementImport::tryGenericAttribute( sal_Int32 nElement, const OUString& _rValue )
+    {
+        // the generic approach (which I hope all props will be migrated to, on the medium term): property handlers
+        const AttributeDescription attribute( metadata::getAttributeDescription( nElement ) );
+        if ( attribute.attributeToken != XML_TOKEN_INVALID )
+        {
+            PropertyGroups propertyGroups;
+            metadata::getPropertyGroupList( attribute, propertyGroups );
+            const PropertyGroups::const_iterator pos = impl_matchPropertyGroup( propertyGroups );
+            if ( pos == propertyGroups.end() )
+                return false;
+
+            do
+            {
+                const PropertyDescriptionList& rProperties( *pos );
+                const PropertyDescription* first = *rProperties.begin();
+                if ( !first )
+                {
+                    SAL_WARN( "xmloff.forms", "OElementImport::handleAttribute: invalid property description!" );
+                    break;
+                }
+
+                const PPropertyHandler handler = (*first->factory)( first->propertyId );
+                if ( !handler )
+                {
+                    SAL_WARN( "xmloff.forms", "OElementImport::handleAttribute: invalid property handler!" );
+                    break;
+                }
+
+                PropertyValues aValues;
+                for ( const auto& propDesc : rProperties )
+                {
+                    aValues[ propDesc->propertyId ] = Any();
+                }
+                if ( handler->getPropertyValues( _rValue, aValues ) )
+                {
+                    for ( const auto& propDesc : rProperties )
+                    {
+                        implPushBackPropertyValue( propDesc->propertyName, aValues[ propDesc->propertyId ] );
+                    }
+                }
+            }
+            while ( false );
+
+            // handled
+            return true;
+        }
+        return false;
+    }
+
+    bool OElementImport::handleAttribute(sal_Int32 nElement, const OUString& _rValue)
     {
-        if ( token::IsXMLToken( _rLocalName, token::XML_CONTROL_IMPLEMENTATION ) )
+        auto nLocal = nElement & TOKEN_MASK;
+        if ( nLocal == XML_CONTROL_IMPLEMENTATION )
             // ignore this, it has already been handled in OElementImport::StartElement
             return true;
 
-        if ( token::IsXMLToken( _rLocalName, token::XML_NAME ) )
+        if ( nLocal == XML_NAME )
         {
             if ( m_sName.isEmpty() )
                 // remember the name for later use in EndElement
@@ -532,7 +598,7 @@ namespace xmloff
         }
 
         // maybe it's the style attribute?
-        if ( token::IsXMLToken( _rLocalName, token::XML_TEXT_STYLE_NAME ) )
+        if ( nLocal == XML_TEXT_STYLE_NAME )
         {
             const SvXMLStyleContext* pStyleContext = m_rContext.getStyleElement( _rValue );
             OSL_ENSURE( pStyleContext, "OElementImport::handleAttribute: do not know the style!" );
@@ -542,11 +608,11 @@ namespace xmloff
         }
 
         if ( m_bImplicitGenericAttributeHandling )
-            if ( tryGenericAttribute( _nNamespaceKey, _rLocalName, _rValue ) )
+            if ( tryGenericAttribute( nElement, _rValue ) )
                 return true;
 
         // let the base class handle it
-        return OPropertyImport::handleAttribute(_nNamespaceKey, _rLocalName, _rValue);
+        return OPropertyImport::handleAttribute( nElement, _rValue);
     }
 
     Reference< XPropertySet > OElementImport::createElement()
@@ -572,30 +638,29 @@ namespace xmloff
         m_rEventManager.registerEvents(m_xElement, _rEvents);
     }
 
-    void OElementImport::simulateDefaultedAttribute(const char* _pAttributeName, const OUString& _rPropertyName, const char* _pAttributeDefault)
+    void OElementImport::simulateDefaultedAttribute(sal_Int32 nElement, const OUString& _rPropertyName, const char* _pAttributeDefault)
     {
         OSL_ENSURE( m_xInfo.is(), "OPropertyImport::simulateDefaultedAttribute: the component should be more gossipy about it's properties!" );
 
         if ( !m_xInfo.is() || m_xInfo->hasPropertyByName( _rPropertyName ) )
         {
-            OUString sLocalAttrName = OUString::createFromAscii(_pAttributeName);
-            if ( !encounteredAttribute( sLocalAttrName ) )
-                OSL_VERIFY( handleAttribute( XML_NAMESPACE_FORM, sLocalAttrName, OUString::createFromAscii( _pAttributeDefault ) ) );
+            if ( !encounteredAttribute( nElement ) )
+                OSL_VERIFY( handleAttribute( XML_ELEMENT(FORM, (nElement & TOKEN_MASK)), OUString::createFromAscii( _pAttributeDefault ) ) );
         }
     }
 
     //= OControlImport
-    OControlImport::OControlImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+    OControlImport::OControlImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const Reference< XNameContainer >& _rxParentContainer)
-        :OElementImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer)
+        :OElementImport(_rImport, _rEventManager, _rxParentContainer)
         ,m_eElementType(OControlElement::UNKNOWN)
     {
         disableImplicitGenericAttributeHandling();
     }
 
-    OControlImport::OControlImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+    OControlImport::OControlImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const Reference< XNameContainer >& _rxParentContainer, OControlElement::ElementType _eType)
-        :OElementImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer)
+        :OElementImport(_rImport, _rEventManager, _rxParentContainer)
         ,m_eElementType(_eType)
     {
         disableImplicitGenericAttributeHandling();
@@ -632,23 +697,23 @@ namespace xmloff
         return OUString();
     }
 
-    void OControlImport::addOuterAttributes(const Reference< XAttributeList >& _rxOuterAttribs)
+    void OControlImport::addOuterAttributes(const Reference< XFastAttributeList >& _rxOuterAttribs)
     {
         OSL_ENSURE(!m_xOuterAttributes.is(), "OControlImport::addOuterAttributes: already have these attributes!");
         m_xOuterAttributes = _rxOuterAttribs;
     }
 
-    bool OControlImport::handleAttribute(sal_uInt16 _nNamespaceKey, const OUString& _rLocalName, const OUString& _rValue)
+    bool OControlImport::handleAttribute(sal_Int32 nElement, const OUString& _rValue)
     {
-        static const char* pLinkedCellAttributeName = OAttributeMetaData::getBindingAttributeName(BAFlags::LinkedCell);
+        static sal_Int32 nLinkedCellAttributeName = OAttributeMetaData::getBindingAttributeToken(BAFlags::LinkedCell);
 
-        if (IsXMLToken(_rLocalName, XML_ID))
+        if ((nElement & TOKEN_MASK) == XML_ID)
         {   // it's the control id
-            if (XML_NAMESPACE_XML == _nNamespaceKey)
+            if (IsTokenInNamespace(nElement, XML_NAMESPACE_XML))
             {
                 m_sControlId = _rValue;
             }
-            else if (XML_NAMESPACE_FORM == _nNamespaceKey)
+            else if (IsTokenInNamespace(nElement, XML_NAMESPACE_FORM))
             {
                 if (m_sControlId.isEmpty())
                 {
@@ -658,66 +723,61 @@ namespace xmloff
             return true;
         }
 
-        if ( _rLocalName.equalsAscii( pLinkedCellAttributeName ) )
+        if ( (nElement & TOKEN_MASK) == nLinkedCellAttributeName )
         {   // it's the address of a spreadsheet cell
             m_sBoundCellAddress = _rValue;
             return true;
         }
 
-        if ( _nNamespaceKey == XML_NAMESPACE_XFORMS && IsXMLToken( _rLocalName, XML_BIND ) )
+        if ( nElement == XML_ELEMENT(XFORMS, XML_BIND ) )
         {
             m_sBindingID = _rValue;
             return true;
         }
 
-        if ( _nNamespaceKey == XML_NAMESPACE_FORM && IsXMLToken( _rLocalName, XML_XFORMS_LIST_SOURCE )  )
+        if ( nElement == XML_ELEMENT(FORM, XML_XFORMS_LIST_SOURCE)  )
         {
             m_sListBindingID = _rValue;
             return true;
         }
 
-        if  (   (   ( _nNamespaceKey == XML_NAMESPACE_FORM )
-                &&  IsXMLToken( _rLocalName, XML_XFORMS_SUBMISSION )
-                )
-            ||  (   ( _nNamespaceKey == XML_NAMESPACE_XFORMS )
-                &&  IsXMLToken( _rLocalName, XML_SUBMISSION )
-                )
-            )
+        if  (   nElement == XML_ELEMENT(FORM, XML_XFORMS_SUBMISSION)
+            ||  nElement == XML_ELEMENT(XFORMS, XML_SUBMISSION) )
         {
             m_sSubmissionID = _rValue;
             return true;
         }
 
-        if ( OElementImport::tryGenericAttribute( _nNamespaceKey, _rLocalName, _rValue ) )
+        if ( OElementImport::tryGenericAttribute( nElement, _rValue ) )
             return true;
 
-        static const char* pValueAttributeName = OAttributeMetaData::getCommonControlAttributeName(CCAFlags::Value);
-        static const char* pCurrentValueAttributeName = OAttributeMetaData::getCommonControlAttributeName(CCAFlags::CurrentValue);
-        static const char* pMinValueAttributeName = OAttributeMetaData::getSpecialAttributeName(SCAFlags::MinValue);
-        static const char* pMaxValueAttributeName = OAttributeMetaData::getSpecialAttributeName(SCAFlags::MaxValue);
-        static const char* pRepeatDelayAttributeName = OAttributeMetaData::getSpecialAttributeName( SCAFlags::RepeatDelay );
+        static const sal_Int32 nValueAttributeName = OAttributeMetaData::getCommonControlAttributeToken(CCAFlags::Value);
+        static const sal_Int32 nCurrentValueAttributeName = OAttributeMetaData::getCommonControlAttributeToken(CCAFlags::CurrentValue);
+        static const sal_Int32 nMinValueAttributeName = OAttributeMetaData::getSpecialAttributeToken(SCAFlags::MinValue);
+        static const sal_Int32 nMaxValueAttributeName = OAttributeMetaData::getSpecialAttributeToken(SCAFlags::MaxValue);
+        static const sal_Int32 nRepeatDelayAttributeName = OAttributeMetaData::getSpecialAttributeToken( SCAFlags::RepeatDelay );
 
         sal_Int32 nHandle = -1;
-        if ( _rLocalName.equalsAscii( pValueAttributeName ) )
+        if ( (nElement & TOKEN_MASK) == nValueAttributeName )
             nHandle = PROPID_VALUE;
-        else if ( _rLocalName.equalsAscii( pCurrentValueAttributeName ) )
+        else if ( (nElement & TOKEN_MASK) == nCurrentValueAttributeName )
             nHandle = PROPID_CURRENT_VALUE;
-        else if ( _rLocalName.equalsAscii( pMinValueAttributeName ) )
+        else if ( (nElement & TOKEN_MASK) == nMinValueAttributeName )
             nHandle = PROPID_MIN_VALUE;
-        else if ( _rLocalName.equalsAscii( pMaxValueAttributeName ) )
+        else if ( (nElement & TOKEN_MASK) == nMaxValueAttributeName )
             nHandle = PROPID_MAX_VALUE;
         if ( nHandle != -1 )
         {
             // for the moment, simply remember the name and the value
             PropertyValue aProp;
-            aProp.Name = _rLocalName;
+            aProp.Name = SvXMLImport::getNameFromToken(nElement);
             aProp.Handle = nHandle;
             aProp.Value <<= _rValue;
             m_aValueProperties.push_back(aProp);
             return true;
         }
 
-        if ( _rLocalName.equalsAscii( pRepeatDelayAttributeName ) )
+        if ( (nElement & TOKEN_MASK) == nRepeatDelayAttributeName )
         {
             util::Duration aDuration;
             if (::sax::Converter::convertDuration(aDuration, _rValue))
@@ -734,29 +794,27 @@ namespace xmloff
             return true;
         }
 
-        return OElementImport::handleAttribute( _nNamespaceKey, _rLocalName, _rValue );
+        return OElementImport::handleAttribute( nElement, _rValue );
     }
 
-    void OControlImport::StartElement(const Reference< XAttributeList >& _rxAttrList)
+    void OControlImport::startFastElement(sal_Int32 nElement, const Reference< css::xml::sax::XFastAttributeList >& _rxAttrList)
     {
-        css::uno::Reference< css::xml::sax::XAttributeList > xAttributes;
+        css::uno::Reference< css::xml::sax::XFastAttributeList > xMergedAttributes;
         if( m_xOuterAttributes.is() )
         {
-            // merge the attribute lists
-            OAttribListMerger* pMerger = new OAttribListMerger;
-            // our own one
-            pMerger->addList(_rxAttrList);
+            // merge the attribute lists, our own one
+            rtl::Reference<sax_fastparser::FastAttributeList> xMerger(new sax_fastparser::FastAttributeList(_rxAttrList));
             // and the ones of our enclosing element
-            pMerger->addList(m_xOuterAttributes);
-            xAttributes = pMerger;
+            xMerger->add(m_xOuterAttributes);
+            xMergedAttributes = xMerger.get();
         }
         else
         {
-            xAttributes = _rxAttrList;
+            xMergedAttributes = _rxAttrList;
         }
 
         // let the base class handle all the attributes
-        OElementImport::StartElement(xAttributes);
+        OElementImport::startFastElement(nElement, xMergedAttributes);
 
         if ( m_aValueProperties.empty() || !m_xElement.is())
             return;
@@ -1050,26 +1108,26 @@ namespace xmloff
 
     //= OImagePositionImport
     OImagePositionImport::OImagePositionImport( OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
-        sal_uInt16 _nPrefix, const OUString& _rName, const Reference< XNameContainer >& _rxParentContainer,
+        const Reference< XNameContainer >& _rxParentContainer,
         OControlElement::ElementType _eType )
-        :OControlImport( _rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, _eType )
+        :OControlImport( _rImport, _rEventManager, _rxParentContainer, _eType )
         ,m_nImagePosition( -1 )
         ,m_nImageAlign( 0 )
         ,m_bHaveImagePosition( false )
     {
     }
 
-    bool OImagePositionImport::handleAttribute( sal_uInt16 _nNamespaceKey, const OUString& _rLocalName,
+    bool OImagePositionImport::handleAttribute( sal_Int32 nElement,
         const OUString& _rValue )
     {
-        static const char* s_pImageDataAttributeName = OAttributeMetaData::getCommonControlAttributeName(CCAFlags::ImageData);
+        static const sal_Int32 s_nImageDataAttributeName = OAttributeMetaData::getCommonControlAttributeToken(CCAFlags::ImageData);
 
-        if (_rLocalName.equalsAscii(s_pImageDataAttributeName))
+        if ( (nElement & TOKEN_MASK) == s_nImageDataAttributeName)
         {
             m_xGraphic = m_rContext.getGlobalContext().loadGraphicByURL(_rValue);
             return true;
         }
-        else if ( _rLocalName == GetXMLToken( XML_IMAGE_POSITION ) )
+        else if ( (nElement & TOKEN_MASK) == XML_IMAGE_POSITION )
         {
             OSL_VERIFY( PropertyConversion::convertString(
                 cppu::UnoType<decltype(m_nImagePosition)>::get(),
@@ -1078,7 +1136,7 @@ namespace xmloff
             m_bHaveImagePosition = true;
             return true;
         }
-        else if ( _rLocalName == GetXMLToken( XML_IMAGE_ALIGN ) )
+        else if ( (nElement & TOKEN_MASK) == XML_IMAGE_ALIGN )
         {
             OSL_VERIFY( PropertyConversion::convertString(
                 cppu::UnoType<decltype(m_nImageAlign)>::get(),
@@ -1087,12 +1145,12 @@ namespace xmloff
             return true;
         }
 
-        return OControlImport::handleAttribute( _nNamespaceKey, _rLocalName, _rValue );
+        return OControlImport::handleAttribute( nElement, _rValue );
     }
 
-    void OImagePositionImport::StartElement(const Reference< XAttributeList >& _rxAttrList)
+    void OImagePositionImport::startFastElement(sal_Int32 nElement, const Reference< XFastAttributeList >& _rxAttrList)
     {
-        OControlImport::StartElement( _rxAttrList );
+        OControlImport::startFastElement( nElement, _rxAttrList );
 
         if (m_xGraphic.is())
         {
@@ -1120,44 +1178,44 @@ namespace xmloff
 
     //= OReferredControlImport
     OReferredControlImport::OReferredControlImport(
-            OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+            OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const Reference< XNameContainer >& _rxParentContainer )
-        :OControlImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer)
+        :OControlImport(_rImport, _rEventManager, _rxParentContainer)
     {
     }
 
-    void OReferredControlImport::StartElement(const Reference< XAttributeList >& _rxAttrList)
+    void OReferredControlImport::startFastElement(sal_Int32 nElement, const Reference< XFastAttributeList >& _rxAttrList)
     {
-        OControlImport::StartElement(_rxAttrList);
+        OControlImport::startFastElement(nElement, _rxAttrList);
 
         // the base class should have created the control, so we can register it
         if ( !m_sReferringControls.isEmpty() )
             m_rFormImport.registerControlReferences(m_xElement, m_sReferringControls);
     }
 
-    bool OReferredControlImport::handleAttribute(sal_uInt16 _nNamespaceKey, const OUString& _rLocalName,
+    bool OReferredControlImport::handleAttribute(sal_Int32 nElement,
         const OUString& _rValue)
     {
-        static const char * s_sReferenceAttributeName = OAttributeMetaData::getCommonControlAttributeName(CCAFlags::For);
-        if (_rLocalName.equalsAscii(s_sReferenceAttributeName))
+        static const sal_Int32 s_nReferenceAttributeName = OAttributeMetaData::getCommonControlAttributeToken(CCAFlags::For);
+        if ((nElement & TOKEN_MASK) == s_nReferenceAttributeName)
         {
             m_sReferringControls = _rValue;
             return true;
         }
-        return OControlImport::handleAttribute(_nNamespaceKey, _rLocalName, _rValue);
+        return OControlImport::handleAttribute(nElement, _rValue);
     }
 
     //= OPasswordImport
-    OPasswordImport::OPasswordImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+    OPasswordImport::OPasswordImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const Reference< XNameContainer >& _rxParentContainer, OControlElement::ElementType _eType)
-        :OControlImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, _eType)
+        :OControlImport(_rImport, _rEventManager, _rxParentContainer, _eType)
     {
     }
 
-    bool OPasswordImport::handleAttribute(sal_uInt16 _nNamespaceKey, const OUString& _rLocalName, const OUString& _rValue)
+    bool OPasswordImport::handleAttribute(sal_Int32 nElement, const OUString& _rValue)
     {
-        static const char * s_sEchoCharAttributeName = OAttributeMetaData::getSpecialAttributeName(SCAFlags::EchoChar);
-        if (_rLocalName.equalsAscii(s_sEchoCharAttributeName))
+        static const sal_Int32 s_nEchoCharAttributeName = OAttributeMetaData::getSpecialAttributeToken(SCAFlags::EchoChar);
+        if ((nElement & TOKEN_MASK) == s_nEchoCharAttributeName)
         {
             // need a special handling for the EchoChar property
             PropertyValue aEchoChar;
@@ -1171,28 +1229,28 @@ namespace xmloff
             implPushBackPropertyValue(aEchoChar);
             return true;
         }
-        return OControlImport::handleAttribute(_nNamespaceKey, _rLocalName, _rValue);
+        return OControlImport::handleAttribute(nElement, _rValue);
     }
 
     //= ORadioImport
-    ORadioImport::ORadioImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+    ORadioImport::ORadioImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const Reference< XNameContainer >& _rxParentContainer, OControlElement::ElementType _eType)
-        :OImagePositionImport( _rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, _eType )
+        :OImagePositionImport( _rImport, _rEventManager, _rxParentContainer, _eType )
     {
     }
 
-    bool ORadioImport::handleAttribute(sal_uInt16 _nNamespaceKey, const OUString& _rLocalName, const OUString& _rValue)
+    bool ORadioImport::handleAttribute(sal_Int32 nElement, const OUString& _rValue)
     {
         // need special handling for the State & CurrentState properties:
         // they're stored as booleans, but expected to be int16 properties
-        static const char* pCurrentSelectedAttributeName = OAttributeMetaData::getCommonControlAttributeName(CCAFlags::CurrentSelected);
-        static const char* pSelectedAttributeName = OAttributeMetaData::getCommonControlAttributeName(CCAFlags::Selected);
-        if  (  _rLocalName.equalsAscii( pCurrentSelectedAttributeName )
-            || _rLocalName.equalsAscii( pSelectedAttributeName )
+        static const sal_Int32 nCurrentSelectedAttributeName = OAttributeMetaData::getCommonControlAttributeToken(CCAFlags::CurrentSelected);
+        static const sal_Int32 nSelectedAttributeName = OAttributeMetaData::getCommonControlAttributeToken(CCAFlags::Selected);
+        if  (  (nElement & TOKEN_MASK) == nCurrentSelectedAttributeName
+            || (nElement & TOKEN_MASK) == nSelectedAttributeName
             )
         {
-            const OAttribute2Property::AttributeAssignment* pProperty = m_rContext.getAttributeMap().getAttributeTranslation(_rLocalName);
-            OSL_ENSURE(pProperty, "ORadioImport::handleAttribute: invalid property map!");
+            const OAttribute2Property::AttributeAssignment* pProperty = m_rContext.getAttributeMap().getAttributeTranslation(nElement & TOKEN_MASK);
+            assert(pProperty && "ORadioImport::handleAttribute: invalid property map!");
             if (pProperty)
             {
                 const Any aBooleanValue( PropertyConversion::convertString(pProperty->aPropertyType, _rValue, pProperty->pEnumMap) );
@@ -1206,28 +1264,28 @@ namespace xmloff
             }
             return true;
         }
-        return OImagePositionImport::handleAttribute( _nNamespaceKey, _rLocalName, _rValue );
+        return OImagePositionImport::handleAttribute( nElement, _rValue );
     }
 
     //= OURLReferenceImport
-    OURLReferenceImport::OURLReferenceImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+    OURLReferenceImport::OURLReferenceImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const Reference< XNameContainer >& _rxParentContainer,
             OControlElement::ElementType _eType)
-        :OImagePositionImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, _eType)
+        :OImagePositionImport(_rImport, _rEventManager, _rxParentContainer, _eType)
     {
     }
 
-    bool OURLReferenceImport::handleAttribute(sal_uInt16 _nNamespaceKey, const OUString& _rLocalName, const OUString& _rValue)
+    bool OURLReferenceImport::handleAttribute(sal_Int32 nElement, const OUString& _rValue)
     {
-        static const char* s_pTargetLocationAttributeName   = OAttributeMetaData::getCommonControlAttributeName( CCAFlags::TargetLocation );
-        static const char* s_pImageDataAttributeName        = OAttributeMetaData::getCommonControlAttributeName( CCAFlags::ImageData );
+        static const sal_Int32 s_nTargetLocationAttributeName   = OAttributeMetaData::getCommonControlAttributeToken( CCAFlags::TargetLocation );
+        static const sal_Int32 s_nImageDataAttributeName        = OAttributeMetaData::getCommonControlAttributeToken( CCAFlags::ImageData );
 
         // need to make the URL absolute if
         // * it's the image-data attribute
         // * it's the target-location attribute, and we're dealing with an object which has the respective property
         bool bMakeAbsolute =
-                _rLocalName.equalsAscii( s_pImageDataAttributeName )
-            ||  (   _rLocalName.equalsAscii( s_pTargetLocationAttributeName )
+                (nElement & TOKEN_MASK) == s_nImageDataAttributeName
+            ||  (   (nElement & TOKEN_MASK) == s_nTargetLocationAttributeName
                 &&  (   ( OControlElement::BUTTON == m_eElementType )
                     ||  ( OControlElement::IMAGE == m_eElementType )
                     )
@@ -1236,53 +1294,53 @@ namespace xmloff
         if (bMakeAbsolute && !_rValue.isEmpty())
         {
             OUString sAdjustedValue = _rValue;
-            if (!_rLocalName.equalsAscii(s_pImageDataAttributeName))
+            if ((nElement & TOKEN_MASK) != s_nImageDataAttributeName)
                 sAdjustedValue = m_rContext.getGlobalContext().GetAbsoluteReference( _rValue );
-            return OImagePositionImport::handleAttribute( _nNamespaceKey, _rLocalName, sAdjustedValue );
+            return OImagePositionImport::handleAttribute( nElement, sAdjustedValue );
         }
 
-        return OImagePositionImport::handleAttribute( _nNamespaceKey, _rLocalName, _rValue );
+        return OImagePositionImport::handleAttribute( nElement, _rValue );
     }
 
     //= OButtonImport
-    OButtonImport::OButtonImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+    OButtonImport::OButtonImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const Reference< XNameContainer >& _rxParentContainer,
             OControlElement::ElementType _eType)
-        :OURLReferenceImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, _eType)
+        :OURLReferenceImport(_rImport, _rEventManager, _rxParentContainer, _eType)
     {
         enableTrackAttributes();
     }
 
-    void OButtonImport::StartElement(const Reference< XAttributeList >& _rxAttrList)
+    void OButtonImport::startFastElement(sal_Int32 nElement, const Reference< XFastAttributeList >& _rxAttrList)
     {
-        OURLReferenceImport::StartElement(_rxAttrList);
+        OURLReferenceImport::startFastElement(nElement, _rxAttrList);
 
         // handle the target-frame attribute
-        simulateDefaultedAttribute(OAttributeMetaData::getCommonControlAttributeName(CCAFlags::TargetFrame), PROPERTY_TARGETFRAME, "_blank");
+        simulateDefaultedAttribute(OAttributeMetaData::getCommonControlAttributeToken(CCAFlags::TargetFrame), PROPERTY_TARGETFRAME, "_blank");
     }
 
     //= OValueRangeImport
-    OValueRangeImport::OValueRangeImport( OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+    OValueRangeImport::OValueRangeImport( OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const Reference< XNameContainer >& _rxParentContainer, OControlElement::ElementType _eType )
-        :OControlImport( _rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, _eType )
+        :OControlImport( _rImport, _rEventManager, _rxParentContainer, _eType )
         ,m_nStepSizeValue( 1 )
     {
 
     }
 
-    bool OValueRangeImport::handleAttribute( sal_uInt16 _nNamespaceKey, const OUString& _rLocalName, const OUString& _rValue )
+    bool OValueRangeImport::handleAttribute( sal_Int32 nElement, const OUString& _rValue )
     {
-        if ( _rLocalName.equalsAscii( OAttributeMetaData::getSpecialAttributeName( SCAFlags::StepSize ) ) )
+        if ( (nElement & TOKEN_MASK) == OAttributeMetaData::getSpecialAttributeToken( SCAFlags::StepSize ) )
         {
             ::sax::Converter::convertNumber( m_nStepSizeValue, _rValue );
             return true;
         }
-        return OControlImport::handleAttribute( _nNamespaceKey, _rLocalName, _rValue );
+        return OControlImport::handleAttribute( nElement, _rValue );
     }
 
-    void OValueRangeImport::StartElement( const Reference< XAttributeList >& _rxAttrList )
+    void OValueRangeImport::startFastElement( sal_Int32 nElement, const Reference< XFastAttributeList >& _rxAttrList )
     {
-        OControlImport::StartElement( _rxAttrList );
+        OControlImport::startFastElement( nElement, _rxAttrList );
 
         if ( m_xInfo.is() )
         {
@@ -1294,10 +1352,10 @@ namespace xmloff
     }
 
     //= OTextLikeImport
-    OTextLikeImport::OTextLikeImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+    OTextLikeImport::OTextLikeImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const Reference< XNameContainer >& _rxParentContainer,
             OControlElement::ElementType _eType)
-        :OControlImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, _eType)
+        :OControlImport(_rImport, _rEventManager, _rxParentContainer, _eType)
         ,m_bEncounteredTextPara( false )
     {
         enableTrackAttributes();
@@ -1340,19 +1398,19 @@ namespace xmloff
             }
         }
 
-        return OControlImport::CreateChildContext( _nPrefix, _rLocalName, _rxAttrList );
+        return nullptr;
     }
 
-    void OTextLikeImport::StartElement(const Reference< XAttributeList >& _rxAttrList)
+    void OTextLikeImport::startFastElement(sal_Int32 nElement, const Reference< css::xml::sax::XFastAttributeList >& _rxAttrList)
     {
-        OControlImport::StartElement(_rxAttrList);
+        OControlImport::startFastElement(nElement, _rxAttrList);
 
         // handle the convert-empty-to-null attribute, whose default is different from the property default
         // unfortunately, different classes are imported by this class ('cause they're represented by the
         // same XML element), though not all of them know this property.
         // So we have to do a check ...
         if (m_xElement.is() && m_xInfo.is() && m_xInfo->hasPropertyByName(PROPERTY_EMPTY_IS_NULL) )
-            simulateDefaultedAttribute(OAttributeMetaData::getDatabaseAttributeName(DAFlags::ConvertEmpty), PROPERTY_EMPTY_IS_NULL, "false");
+            simulateDefaultedAttribute(OAttributeMetaData::getDatabaseAttributeToken(DAFlags::ConvertEmpty), PROPERTY_EMPTY_IS_NULL, "false");
     }
 
     namespace {
@@ -1473,10 +1531,10 @@ namespace xmloff
     }
 
     //= OListAndComboImport
-    OListAndComboImport::OListAndComboImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+    OListAndComboImport::OListAndComboImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const Reference< XNameContainer >& _rxParentContainer,
             OControlElement::ElementType _eType)
-        :OControlImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer, _eType)
+        :OControlImport(_rImport, _rEventManager, _rxParentContainer, _eType)
         ,m_nEmptyListItems( 0 )
         ,m_nEmptyValueItems( 0 )
         ,m_bEncounteredLSAttrib( false )
@@ -1486,36 +1544,37 @@ namespace xmloff
             enableTrackAttributes();
     }
 
-    SvXMLImportContextRef OListAndComboImport::CreateChildContext(sal_uInt16 _nPrefix, const OUString& _rLocalName,
-            const Reference< XAttributeList >& _rxAttrList)
+    css::uno::Reference< css::xml::sax::XFastContextHandler > OListAndComboImport::createFastChildContext(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& _rxAttrList )
     {
         // is it the "option" sub tag of a listbox ?
-        if (_rLocalName == "option")
-            return new OListOptionImport(GetImport(), _nPrefix, _rLocalName, this);
+        if ((nElement & TOKEN_MASK) == XML_OPTION)
+            return new OListOptionImport(GetImport(), this);
 
         // is it the "item" sub tag of a combobox ?
-        if (_rLocalName == "item")
-            return new OComboItemImport(GetImport(), _nPrefix, _rLocalName, this);
+        if ((nElement & TOKEN_MASK) == XML_ITEM)
+            return new OComboItemImport(GetImport(), this);
 
         // everything else
-        return OControlImport::CreateChildContext(_nPrefix, _rLocalName, _rxAttrList);
+        return OControlImport::createFastChildContext(nElement, _rxAttrList);
     }
 
-    void OListAndComboImport::StartElement(const Reference< XAttributeList >& _rxAttrList)
+    void OListAndComboImport::startFastElement(sal_Int32 nElement, const Reference< XFastAttributeList >& _rxAttrList)
     {
         m_bLinkWithIndexes = false;
 
-        OControlImport::StartElement(_rxAttrList);
+        OControlImport::startFastElement(nElement, _rxAttrList);
 
         if (OControlElement::COMBOBOX == m_eElementType)
         {
             // for the auto-completion
             // the attribute default does not equal the property default, so in case we did not read this attribute,
             // we have to simulate it
-            simulateDefaultedAttribute( OAttributeMetaData::getSpecialAttributeName( SCAFlags::AutoCompletion ), PROPERTY_AUTOCOMPLETE, "false");
+            simulateDefaultedAttribute( OAttributeMetaData::getSpecialAttributeToken( SCAFlags::AutoCompletion ), PROPERTY_AUTOCOMPLETE, "false");
 
             // same for the convert-empty-to-null attribute, which's default is different from the property default
-            simulateDefaultedAttribute( OAttributeMetaData::getDatabaseAttributeName( DAFlags::ConvertEmpty ), PROPERTY_EMPTY_IS_NULL, "false");
+            simulateDefaultedAttribute( OAttributeMetaData::getDatabaseAttributeToken( DAFlags::ConvertEmpty ), PROPERTY_EMPTY_IS_NULL, "false");
         }
     }
 
@@ -1577,10 +1636,10 @@ namespace xmloff
         OControlImport::doRegisterCellValueBinding( sBoundCellAddress );
     }
 
-    bool OListAndComboImport::handleAttribute(sal_uInt16 _nNamespaceKey, const OUString& _rLocalName, const OUString& _rValue)
+    bool OListAndComboImport::handleAttribute(sal_Int32 nElement, const OUString& _rValue)
     {
-        static const char* pListSourceAttributeName = OAttributeMetaData::getDatabaseAttributeName(DAFlags::ListSource);
-        if ( _rLocalName.equalsAscii(pListSourceAttributeName) )
+        static const sal_Int32 nListSourceAttributeName = OAttributeMetaData::getDatabaseAttributeToken(DAFlags::ListSource);
+        if ( (nElement & TOKEN_MASK) == nListSourceAttributeName )
         {
             PropertyValue aListSource;
             aListSource.Name = PROPERTY_LISTSOURCE;
@@ -1604,13 +1663,13 @@ namespace xmloff
             return true;
         }
 
-        if ( _rLocalName.equalsAscii( OAttributeMetaData::getBindingAttributeName( BAFlags::ListCellRange ) ) )
+        if ( (nElement & TOKEN_MASK) == OAttributeMetaData::getBindingAttributeToken( BAFlags::ListCellRange ) )
         {
             m_sCellListSource = _rValue;
             return true;
         }
 
-        if ( _rLocalName.equalsAscii( OAttributeMetaData::getBindingAttributeName( BAFlags::ListLinkingType ) ) )
+        if ( (nElement & TOKEN_MASK) == OAttributeMetaData::getBindingAttributeToken( BAFlags::ListLinkingType ) )
         {
             sal_Int16 nLinkageType = 0;
             PropertyConversion::convertString(
@@ -1623,7 +1682,7 @@ namespace xmloff
             return true;
         }
 
-        return OControlImport::handleAttribute(_nNamespaceKey, _rLocalName, _rValue);
+        return OControlImport::handleAttribute(nElement, _rValue);
     }
 
     void OListAndComboImport::implPushBackLabel(const OUString& _rLabel)
@@ -1677,29 +1736,22 @@ namespace xmloff
     }
 
     //= OListOptionImport
-    OListOptionImport::OListOptionImport(SvXMLImport& _rImport, sal_uInt16 _nPrefix, const OUString& _rName,
+    OListOptionImport::OListOptionImport(SvXMLImport& _rImport,
             const OListAndComboImportRef& _rListBox)
-        :SvXMLImportContext(_rImport, _nPrefix, _rName)
+        :SvXMLImportContext(_rImport)
         ,m_xListBoxImport(_rListBox)
     {
     }
 
-    void OListOptionImport::StartElement(const Reference< XAttributeList >& _rxAttrList)
+    void OListOptionImport::startFastElement(sal_Int32 nElement, const Reference< XFastAttributeList >& _rxAttrList)
     {
         // the label and the value
-        const SvXMLNamespaceMap& rMap = GetImport().GetNamespaceMap();
-        const OUString sLabelAttribute = rMap.GetQNameByKey(
-            GetPrefix(), "label");
-        const OUString sValueAttribute = rMap.GetQNameByKey(
-            GetPrefix(), "value");
+        const sal_Int32 nLabelAttribute = (nElement & ~TOKEN_MASK) | XML_LABEL;
+        const sal_Int32 nValueAttribute = (nElement & ~TOKEN_MASK) | XML_VALUE;
 
         // the label attribute
-        OUString sValue = _rxAttrList->getValueByName(sLabelAttribute);
-        bool bNonexistentAttribute = false;
-        if (sValue.isEmpty())
-            if (_rxAttrList->getTypeByName(sLabelAttribute).isEmpty())
-                // this attribute does not really exist
-                bNonexistentAttribute = true;
+        OUString sValue = _rxAttrList->getOptionalValue(nLabelAttribute);
+        bool bNonexistentAttribute = !_rxAttrList->hasAttribute(nLabelAttribute);
 
         if (bNonexistentAttribute)
             m_xListBoxImport->implEmptyLabelFound();
@@ -1707,12 +1759,8 @@ namespace xmloff
             m_xListBoxImport->implPushBackLabel( sValue );
 
         // the value attribute
-        sValue = _rxAttrList->getValueByName(sValueAttribute);
-        bNonexistentAttribute = false;
-        if (sValue.isEmpty())
-            if (_rxAttrList->getTypeByName(sValueAttribute).isEmpty())
-                // this attribute does not really exist
-                bNonexistentAttribute = true;
+        sValue = _rxAttrList->getOptionalValue(nValueAttribute);
+        bNonexistentAttribute = !_rxAttrList->hasAttribute(nValueAttribute);
 
         if (bNonexistentAttribute)
             m_xListBoxImport->implEmptyValueFound();
@@ -1720,54 +1768,54 @@ namespace xmloff
             m_xListBoxImport->implPushBackValue( sValue );
 
         // the current-selected and selected
-        const OUString sSelectedAttribute = rMap.GetQNameByKey(
-            GetPrefix(), OUString::createFromAscii(OAttributeMetaData::getCommonControlAttributeName(CCAFlags::CurrentSelected)));
-        const OUString sDefaultSelectedAttribute = rMap.GetQNameByKey(
-            GetPrefix(), OUString::createFromAscii(OAttributeMetaData::getCommonControlAttributeName(CCAFlags::Selected)));
+        const sal_Int32 nSelectedAttribute = (nElement & ~TOKEN_MASK) | OAttributeMetaData::getCommonControlAttributeToken(CCAFlags::CurrentSelected);
+        const sal_Int32 nDefaultSelectedAttribute = (nElement & ~TOKEN_MASK) | OAttributeMetaData::getCommonControlAttributeToken(CCAFlags::Selected);
 
         // propagate the selected flag
         bool bSelected(false);
         (void)::sax::Converter::convertBool(bSelected,
-            _rxAttrList->getValueByName(sSelectedAttribute));
+            _rxAttrList->getOptionalValue(nSelectedAttribute));
         if (bSelected)
             m_xListBoxImport->implSelectCurrentItem();
 
         // same for the default selected
         bool bDefaultSelected(false);
         (void)::sax::Converter::convertBool(bDefaultSelected,
-            _rxAttrList->getValueByName(sDefaultSelectedAttribute));
+            _rxAttrList->getOptionalValue(nDefaultSelectedAttribute));
         if (bDefaultSelected)
             m_xListBoxImport->implDefaultSelectCurrentItem();
     }
 
     //= OComboItemImport
-    OComboItemImport::OComboItemImport(SvXMLImport& _rImport, sal_uInt16 _nPrefix, const OUString& _rName,
+    OComboItemImport::OComboItemImport(SvXMLImport& _rImport,
             const OListAndComboImportRef& _rListBox)
-        :SvXMLImportContext(_rImport, _nPrefix, _rName)
+        :SvXMLImportContext(_rImport)
         ,m_xListBoxImport(_rListBox)
     {
     }
 
-    void OComboItemImport::StartElement(const Reference< XAttributeList >& _rxAttrList)
+    void OComboItemImport::startFastElement(sal_Int32 nElement, const Reference< XFastAttributeList >& _rxAttrList)
     {
-        const OUString sLabelAttributeName = GetImport().GetNamespaceMap().GetQNameByKey(
-            GetPrefix(), OUString::createFromAscii(OAttributeMetaData::getCommonControlAttributeName(CCAFlags::Label)));
-        m_xListBoxImport->implPushBackLabel(_rxAttrList->getValueByName(sLabelAttributeName));
+        const sal_Int32 nLabelAttributeName = (nElement & ~TOKEN_MASK) |
+            OAttributeMetaData::getCommonControlAttributeToken(CCAFlags::Label);
+        m_xListBoxImport->implPushBackLabel(_rxAttrList->getOptionalValue(nLabelAttributeName));
     }
 
     //= OColumnWrapperImport
-    OColumnWrapperImport::OColumnWrapperImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+    OColumnWrapperImport::OColumnWrapperImport(OFormLayerXMLImport_Impl& _rImport,
+            IEventAttacherManager& _rEventManager, sal_Int32 /*nElement*/,
             const Reference< XNameContainer >& _rxParentContainer)
-        :SvXMLImportContext(_rImport.getGlobalContext(), _nPrefix, _rName)
+        :SvXMLImportContext(_rImport.getGlobalContext())
         ,m_xParentContainer(_rxParentContainer)
         ,m_rFormImport(_rImport)
         ,m_rEventManager(_rEventManager)
     {
     }
-    SvXMLImportContextRef OColumnWrapperImport::CreateChildContext(sal_uInt16 _nPrefix, const OUString& _rLocalName,
-        const Reference< XAttributeList >&)
+    css::uno::Reference< css::xml::sax::XFastContextHandler > OColumnWrapperImport::createFastChildContext(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >&  )
     {
-        OControlImport* pReturn = implCreateChildContext(_nPrefix, _rLocalName, OElementNameMap::getElementType(_rLocalName));
+        OControlImport* pReturn = implCreateChildContext(nElement, OElementNameMap::getElementType(nElement & TOKEN_MASK));
         if (pReturn)
         {
             OSL_ENSURE(m_xOwnAttributes.is(), "OColumnWrapperImport::CreateChildContext: had no form:column element!");
@@ -1775,7 +1823,7 @@ namespace xmloff
         }
         return pReturn;
     }
-    void OColumnWrapperImport::StartElement(const Reference< XAttributeList >& _rxAttrList)
+    void OColumnWrapperImport::startFastElement(sal_Int32 /*nElement*/, const Reference< XFastAttributeList >& _rxAttrList)
     {
         OSL_ENSURE(!m_xOwnAttributes.is(), "OColumnWrapperImport::StartElement: already have the cloned list!");
 
@@ -1788,7 +1836,7 @@ namespace xmloff
     }
 
     OControlImport* OColumnWrapperImport::implCreateChildContext(
-            sal_uInt16 _nPrefix, const OUString& _rLocalName,
+            sal_Int32 /*nElement*/,
             OControlElement::ElementType _eType)
     {
         OSL_ENSURE( (OControlElement::TEXT == _eType)
@@ -1805,39 +1853,39 @@ namespace xmloff
         {
             case OControlElement::COMBOBOX:
             case OControlElement::LISTBOX:
-                return new OColumnImport<OListAndComboImport>(m_rFormImport, m_rEventManager, _nPrefix, _rLocalName, m_xParentContainer, _eType );
+                return new OColumnImport<OListAndComboImport>(m_rFormImport, m_rEventManager, m_xParentContainer, _eType );
 
             case OControlElement::PASSWORD:
-                return new OColumnImport<OPasswordImport>(m_rFormImport, m_rEventManager, _nPrefix, _rLocalName, m_xParentContainer, _eType );
+                return new OColumnImport<OPasswordImport>(m_rFormImport, m_rEventManager, m_xParentContainer, _eType );
 
             case OControlElement::TEXT:
             case OControlElement::TEXT_AREA:
             case OControlElement::FORMATTED_TEXT:
-                return new OColumnImport< OTextLikeImport >( m_rFormImport, m_rEventManager, _nPrefix, _rLocalName, m_xParentContainer, _eType );
+                return new OColumnImport< OTextLikeImport >( m_rFormImport, m_rEventManager, m_xParentContainer, _eType );
 
             default:
-                return new OColumnImport<OControlImport>(m_rFormImport, m_rEventManager, _nPrefix, _rLocalName, m_xParentContainer, _eType );
+                return new OColumnImport<OControlImport>(m_rFormImport, m_rEventManager, m_xParentContainer, _eType );
         }
     }
 
     //= OGridImport
-    OGridImport::OGridImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+    OGridImport::OGridImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const Reference< XNameContainer >& _rxParentContainer,
             OControlElement::ElementType _eType)
-        :OControlImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer)
+        :OControlImport(_rImport, _rEventManager, _rxParentContainer)
     {
         setElementType(_eType);
     }
 
-    SvXMLImportContextRef OGridImport::CreateChildContext(
-        sal_uInt16 _nPrefix, const OUString& _rLocalName,
-        const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList)
+    css::uno::Reference< css::xml::sax::XFastContextHandler > OGridImport::createFastChildContext(
+        sal_Int32 nElement,
+        const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
     {
         // maybe it's a sub control
-        if (_rLocalName == "column")
+        if ((nElement & TOKEN_MASK) == XML_COLUMN)
         {
             if (m_xMeAsContainer.is())
-                return new OColumnWrapperImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer);
+                return new OColumnWrapperImport(m_rFormImport, *this, nElement, m_xMeAsContainer);
             else
             {
                 OSL_FAIL("OGridImport::CreateChildContext: don't have an element!");
@@ -1845,7 +1893,7 @@ namespace xmloff
             }
         }
 
-        return OControlImport::CreateChildContext(_nPrefix, _rLocalName, _rxAttrList);
+        return OControlImport::createFastChildContext(nElement, xAttrList);
     }
 
     void OGridImport::endFastElement(sal_Int32 nElement)
@@ -1877,38 +1925,67 @@ namespace xmloff
     }
 
     //= OFormImport
-    OFormImport::OFormImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+    OFormImport::OFormImport(OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const Reference< XNameContainer >& _rxParentContainer)
-        :OElementImport(_rImport, _rEventManager, _nPrefix, _rName, _rxParentContainer)
+        :OElementImport(_rImport, _rEventManager, _rxParentContainer)
     {
         enableTrackAttributes();
     }
 
-    SvXMLImportContextRef OFormImport::CreateChildContext(sal_uInt16 _nPrefix, const OUString& _rLocalName,
-        const Reference< XAttributeList >& _rxAttrList)
+    css::uno::Reference< css::xml::sax::XFastContextHandler > OFormImport::createFastChildContext(
+        sal_Int32 nElement,
+        const uno::Reference< xml::sax::XFastAttributeList>& _rxAttrList )
     {
-        if( token::IsXMLToken(_rLocalName, token::XML_FORM) )
-            return new OFormImport( m_rFormImport, *this, _nPrefix, _rLocalName,
-                                    m_xMeAsContainer);
-        else if ( token::IsXMLToken(_rLocalName, token::XML_CONNECTION_RESOURCE) )
-            return new OXMLDataSourceImport(GetImport(), _nPrefix, _rLocalName, _rxAttrList,m_xElement);
-        else if( (token::IsXMLToken(_rLocalName, token::XML_EVENT_LISTENERS) &&
-                 (XML_NAMESPACE_OFFICE == _nPrefix)) ||
-                 token::IsXMLToken( _rLocalName, token::XML_PROPERTIES) )
-            return OElementImport::CreateChildContext( _nPrefix, _rLocalName,
-                                                       _rxAttrList );
+        auto nToken = (nElement & TOKEN_MASK);
+        if( nToken == XML_FORM )
+            return new OFormImport( m_rFormImport, *this, m_xMeAsContainer);
+        else if ( nToken == XML_CONNECTION_RESOURCE )
+            return new OXMLDataSourceImport(GetImport(), _rxAttrList, m_xElement);
+        else if( nElement == XML_ELEMENT(OFFICE, XML_EVENT_LISTENERS) ||
+                 nToken == XML_PROPERTIES )
+            return OElementImport::createFastChildContext( nElement, _rxAttrList );
         else
-            return implCreateChildContext( _nPrefix, _rLocalName,
-                        OElementNameMap::getElementType(_rLocalName) );
+        {
+            OControlElement::ElementType eType = OElementNameMap::getElementType(nToken);
+            switch (eType)
+            {
+                case OControlElement::TEXT:
+                case OControlElement::TEXT_AREA:
+                case OControlElement::FORMATTED_TEXT:
+                    return new OTextLikeImport(m_rFormImport, *this, m_xMeAsContainer, eType);
+                case OControlElement::GRID:
+                    return new OGridImport(m_rFormImport, *this, m_xMeAsContainer, eType);
+                case OControlElement::COMBOBOX:
+                case OControlElement::LISTBOX:
+                    return new OListAndComboImport(m_rFormImport, *this, m_xMeAsContainer, eType);
+                case OControlElement::PASSWORD:
+                    return new OPasswordImport(m_rFormImport, *this, m_xMeAsContainer, eType);
+                case OControlElement::BUTTON:
+                case OControlElement::IMAGE:
+                case OControlElement::IMAGE_FRAME:
+                    return new OButtonImport( m_rFormImport, *this, m_xMeAsContainer, eType );
+                case OControlElement::RADIO:
+                    return new ORadioImport(m_rFormImport, *this, m_xMeAsContainer, eType);
+                case OControlElement::CHECKBOX:
+                    return new OImagePositionImport(m_rFormImport, *this, m_xMeAsContainer, eType);
+                case OControlElement::FRAME:
+                case OControlElement::FIXED_TEXT:
+                    return new OReferredControlImport(m_rFormImport, *this, m_xMeAsContainer);
+                case OControlElement::VALUERANGE:
+                    return new OValueRangeImport( m_rFormImport, *this, m_xMeAsContainer, eType );
+                default:
+                    return new OControlImport(m_rFormImport, *this, m_xMeAsContainer, eType);
+            }
+        }
     }
 
-    void OFormImport::StartElement(const Reference< XAttributeList >& _rxAttrList)
+    void OFormImport::startFastElement(sal_Int32 nElement, const Reference< XFastAttributeList >& _rxAttrList)
     {
         m_rFormImport.enterEventContext();
-        OElementImport::StartElement(_rxAttrList);
+        OElementImport::startFastElement(nElement, _rxAttrList);
 
         // handle the target-frame attribute
-        simulateDefaultedAttribute(OAttributeMetaData::getCommonControlAttributeName(CCAFlags::TargetFrame), PROPERTY_TARGETFRAME, "_blank");
+        simulateDefaultedAttribute(OAttributeMetaData::getCommonControlAttributeToken(CCAFlags::TargetFrame), PROPERTY_TARGETFRAME, "_blank");
     }
 
     void OFormImport::endFastElement(sal_Int32 nElement)
@@ -1941,25 +2018,25 @@ namespace xmloff
         return xReturn;
     }
 
-    bool OFormImport::handleAttribute(sal_uInt16 _nNamespaceKey, const OUString& _rLocalName, const OUString& _rValue)
+    bool OFormImport::handleAttribute(sal_Int32 nElement, const OUString& _rValue)
     {
         // handle the master/details field attributes (they're way too special to let the OPropertyImport handle them)
-        static const char* s_sMasterFieldsAttributeName = OAttributeMetaData::getFormAttributeName(faMasterFields);
-        static const char* s_sDetailFieldsAttributeName = OAttributeMetaData::getFormAttributeName(faDetailFields);
+        static const sal_Int32 s_nMasterFieldsAttributeName = OAttributeMetaData::getFormAttributeToken(faMasterFields);
+        static const sal_Int32 s_nDetailFieldsAttributeName = OAttributeMetaData::getFormAttributeToken(faDetailFields);
 
-        if ( _rLocalName.equalsAscii(s_sMasterFieldsAttributeName) )
+        if ( (nElement & TOKEN_MASK) == s_nMasterFieldsAttributeName)
         {
             implTranslateStringListProperty(PROPERTY_MASTERFIELDS, _rValue);
             return true;
         }
 
-        if ( _rLocalName.equalsAscii(s_sDetailFieldsAttributeName) )
+        if ( (nElement & TOKEN_MASK) == s_nDetailFieldsAttributeName)
         {
             implTranslateStringListProperty(PROPERTY_DETAILFIELDS, _rValue);
             return true;
         }
 
-        return OElementImport::handleAttribute(_nNamespaceKey, _rLocalName, _rValue);
+        return OElementImport::handleAttribute(nElement, _rValue);
     }
 
     void OFormImport::implTranslateStringListProperty(const OUString& _rPropertyName, const OUString& _rValue)
@@ -2025,27 +2102,16 @@ namespace xmloff
     //= OXMLDataSourceImport
     OXMLDataSourceImport::OXMLDataSourceImport(
                     SvXMLImport& _rImport
-                    ,sal_uInt16 nPrfx
-                    , const OUString& _sLocalName
-                    ,const Reference< css::xml::sax::XAttributeList > & _xAttrList
+                    ,const Reference< css::xml::sax::XFastAttributeList > & _xAttrList
                     ,const css::uno::Reference< css::beans::XPropertySet >& _xElement) :
-        SvXMLImportContext( _rImport, nPrfx, _sLocalName )
+        SvXMLImportContext( _rImport)
     {
-        OSL_ENSURE(_xAttrList.is(),"Attribute list is NULL!");
-        const SvXMLNamespaceMap& rMap = _rImport.GetNamespaceMap();
-
-        sal_Int16 nLength = (_xElement.is() && _xAttrList.is()) ? _xAttrList->getLength() : 0;
-        for(sal_Int16 i = 0; i < nLength; ++i)
+        for( auto& aIter : sax_fastparser::castToFastAttributeList(_xAttrList) )
         {
-            OUString sLocalName;
-            OUString sAttrName = _xAttrList->getNameByIndex( i );
-            sal_uInt16 nPrefix = rMap.GetKeyByAttrName( sAttrName, &sLocalName );
-
-            if  (   ( nPrefix == OAttributeMetaData::getCommonControlAttributeNamespace( CCAFlags::TargetLocation ) )
-                &&  ( sLocalName.equalsAscii( OAttributeMetaData::getCommonControlAttributeName( CCAFlags::TargetLocation ) ) )
-                )
+            if  (  aIter.getToken() ==
+                    XML_ELEMENT(XLINK, OAttributeMetaData::getCommonControlAttributeToken( CCAFlags::TargetLocation ) ) )
             {
-                OUString sValue = _xAttrList->getValueByIndex( i );
+                OUString sValue = aIter.toString();
                 sValue = _rImport.GetAbsoluteReference(sValue);
                 INetURLObject aURL(sValue);
                 if ( aURL.GetProtocol() == INetProtocol::File )
@@ -2054,49 +2120,8 @@ namespace xmloff
                     _xElement->setPropertyValue(PROPERTY_URL,makeAny(sValue)); // the url is the "sdbc:" string
                 break;
             }
-        }
-    }
-    OControlImport* OFormImport::implCreateChildContext(
-            sal_uInt16 _nPrefix, const OUString& _rLocalName,
-            OControlElement::ElementType _eType )
-    {
-        switch (_eType)
-        {
-            case OControlElement::TEXT:
-            case OControlElement::TEXT_AREA:
-            case OControlElement::FORMATTED_TEXT:
-                return new OTextLikeImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer, _eType);
-
-            case OControlElement::BUTTON:
-            case OControlElement::IMAGE:
-            case OControlElement::IMAGE_FRAME:
-                return new OButtonImport( m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer, _eType );
-
-            case OControlElement::COMBOBOX:
-            case OControlElement::LISTBOX:
-                return new OListAndComboImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer, _eType);
-
-            case OControlElement::RADIO:
-                return new ORadioImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer, _eType);
-
-            case OControlElement::CHECKBOX:
-                return new OImagePositionImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer, _eType);
-
-            case OControlElement::PASSWORD:
-                return new OPasswordImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer, _eType);
-
-            case OControlElement::FRAME:
-            case OControlElement::FIXED_TEXT:
-                return new OReferredControlImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer);
-
-            case OControlElement::GRID:
-                return new OGridImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer, _eType);
-
-            case OControlElement::VALUERANGE:
-                return new OValueRangeImport( m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer, _eType );
-
-            default:
-                return new OControlImport(m_rFormImport, *this, _nPrefix, _rLocalName, m_xMeAsContainer, _eType);
+            else
+                SAL_WARN("xmloff", "unknown attribute " << SvXMLImport::getPrefixAndNameFromToken(aIter.getToken()) << "=" << aIter.toString());
         }
     }
 
diff --git a/xmloff/source/forms/elementimport.hxx b/xmloff/source/forms/elementimport.hxx
index 62bf61152597..50fcd185c7da 100644
--- a/xmloff/source/forms/elementimport.hxx
+++ b/xmloff/source/forms/elementimport.hxx
@@ -53,11 +53,13 @@ namespace xmloff
     {
         typedef std::map<OUString, ElementType> MapString2Element;
         static MapString2Element    s_sElementTranslations;
+        static std::map<sal_Int32, ElementType>    s_sElementTranslations2;
 
         OElementNameMap() = delete;
 
     public:
         static ElementType getElementType(const OUString& _rName);
+        static ElementType getElementType(sal_Int32 nToken);
     };
 
     //= OElementImport
@@ -95,10 +97,6 @@ namespace xmloff
                 the importer
             @param _rEventManager
                 the event attacher manager for the control being imported
-            @param _nPrefix
-                the namespace prefix
-            @param _rName
-                the element name
             @param _rAttributeMap
                 the attribute map to be used for translating attributes into properties
             @param _rxParentContainer
@@ -106,24 +104,20 @@ namespace xmloff
         */
         OElementImport(
             OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
-            sal_uInt16 _nPrefix, const OUString& _rName,
             const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer
         );
         virtual ~OElementImport() override;
 
     protected:
         // SvXMLImportContext overridables
-        virtual void StartElement(
-            const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
-        virtual SvXMLImportContextRef CreateChildContext(
-            sal_uInt16 _nPrefix, const OUString& _rLocalName,
-            const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
+        virtual void SAL_CALL startFastElement( sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
         virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
+        virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
+            sal_Int32 nElement,
+            const css::uno::Reference< css::xml::sax::XFastAttributeList >& AttrList ) override;
 
         // OPropertyImport overridables
-        virtual bool    handleAttribute(sal_uInt16 _nNamespaceKey,
-            const OUString& _rLocalName,
-            const OUString& _rValue) override;
+        virtual bool handleAttribute(sal_Int32 nElement, const OUString& _rValue) override;
 
         // IEventAttacher
         virtual void registerEvents(
@@ -145,13 +139,18 @@ namespace xmloff
             property value as if the attribute was encountered.</p>
             @see encounteredAttribute
         */
-        void        simulateDefaultedAttribute(const char* _pAttributeName, const OUString& _rPropertyName, const char* _pAttributeDefault);
+        void        simulateDefaultedAttribute(sal_Int32 nElement, const OUString& _rPropertyName, const char* _pAttributeDefault);
 
         /** to be called from within handleAttribute, checks whether the given attribute is covered by our generic
             attribute handler mechanisms
         */
         bool        tryGenericAttribute( sal_uInt16 _nNamespaceKey, const OUString& _rLocalName, const OUString& _rValue );
 
+        /** to be called from within handleAttribute, checks whether the given attribute is covered by our generic
+            attribute handler mechanisms
+        */
+        bool        tryGenericAttribute( sal_Int32 nElement, const OUString& _rValue );
+
         /** controls whether |handleAttribute| implicitly calls |tryGenericAttribute|, or whether the derived class
             must do this explicitly at a suitable place in its own |handleAttribute|
         */
@@ -184,7 +183,7 @@ namespace xmloff
 
         // we fake the attributes our base class gets: we add the attributes of the outer wrapper
         // element which encloses us
-        css::uno::Reference< css::xml::sax::XAttributeList >
+        css::uno::Reference< css::xml::sax::XFastAttributeList >
                                         m_xOuterAttributes;
 
         /** the address of the calc cell which the control model should be bound to,
@@ -205,29 +204,24 @@ namespace xmloff
         // for use by derived classes only
         OControlImport(
             OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
-            sal_uInt16 _nPrefix, const OUString& _rName,
             const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer
             );
 
     public:
         OControlImport(
             OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
-            sal_uInt16 _nPrefix, const OUString& _rName,
             const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer,
             OControlElement::ElementType _eType
         );
 
         // SvXMLImportContext overridables
-        virtual void StartElement(
-            const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
+        virtual void SAL_CALL startFastElement( sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override;
         virtual void SAL_CALL endFastElement(sal_Int32 nElement) override;
 
         // OPropertyImport overridables
-        virtual bool    handleAttribute(sal_uInt16 _nNamespaceKey,
-            const OUString& _rLocalName,
-            const OUString& _rValue) override;
+        virtual bool handleAttribute(sal_Int32 nElement, const OUString& _rValue) override;
 
-        void addOuterAttributes(const css::uno::Reference< css::xml::sax::XAttributeList >& _rxOuterAttribs);
+        void addOuterAttributes(const css::uno::Reference< css::xml::sax::XFastAttributeList >& _rxOuterAttribs);
 
     protected:
         void setElementType(OControlElement::ElementType _eType) { m_eElementType = _eType; }
@@ -282,21 +276,19 @@ namespace xmloff
 
     public:
         OImagePositionImport(
-            OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+            OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer,
             OControlElement::ElementType _eType
         );
 
     protected:
         // SvXMLImportContext overridables
-        virtual void StartElement(
-            const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
+        virtual void SAL_CALL startFastElement(
+            sal_Int32 nElement,
+            const css::uno::Reference< css::xml::sax::XFastAttributeList >& _rxAttrList) override;
 
         // OPropertyImport overridables
-        virtual bool    handleAttribute( sal_uInt16 _nNamespaceKey,
-            const OUString& _rLocalName,
-            const OUString& _rValue
-       ) override;
+        virtual bool handleAttribute(sal_Int32 nElement, const OUString& _rValue) override;
     };
 
     //= OReferredControlImport
@@ -306,18 +298,17 @@ namespace xmloff
 
     public:
         OReferredControlImport(
-            OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+            OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer
         );
 
         // SvXMLImportContext overridables
-        virtual void StartElement(
-            const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
+        virtual void SAL_CALL startFastElement(
+            sal_Int32 nElement,
+            const css::uno::Reference< css::xml::sax::XFastAttributeList >& _rxAttrList) override;
 
         // OPropertyImport overridables
-        virtual bool    handleAttribute(sal_uInt16 _nNamespaceKey,
-            const OUString& _rLocalName,
-            const OUString& _rValue) override;
+        virtual bool handleAttribute(sal_Int32 nElement, const OUString& _rValue) override;
     };
 
     //= OPasswordImport
@@ -325,15 +316,13 @@ namespace xmloff
     {
     public:
         OPasswordImport(
-            OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+            OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer,
             OControlElement::ElementType _eType
         );
 
         // OPropertyImport overridables
-        virtual bool    handleAttribute(sal_uInt16 _nNamespaceKey,
-            const OUString& _rLocalName,
-            const OUString& _rValue) override;
+        virtual bool handleAttribute(sal_Int32 nElement, const OUString& _rValue) override;
     };
 
     //= ORadioImport
@@ -341,16 +330,14 @@ namespace xmloff
     {
     public:
         ORadioImport(
-            OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+            OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer,
             OControlElement::ElementType _eType
         );
 
     protected:
         // OPropertyImport overridables
-        virtual bool    handleAttribute(sal_uInt16 _nNamespaceKey,
-            const OUString& _rLocalName,
-            const OUString& _rValue) override;
+        virtual bool handleAttribute(sal_Int32 nElement, const OUString& _rValue) override;
     };
 
     //= OURLReferenceImport
@@ -361,16 +348,14 @@ namespace xmloff
     {
     public:
         OURLReferenceImport(
-            OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+            OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer,
             OControlElement::ElementType _eType
         );
 
     protected:
         // OPropertyImport overridables
-        virtual bool    handleAttribute(sal_uInt16 _nNamespaceKey,
-            const OUString& _rLocalName,
-            const OUString& _rValue) override;
+        virtual bool handleAttribute(sal_Int32 nElement, const OUString& _rValue) override;
     };
 
     //= OButtonImport
@@ -381,15 +366,16 @@ namespace xmloff
     {
     public:
         OButtonImport(
-            OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+            OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer,
             OControlElement::ElementType _eType
         );
 
     protected:
         // SvXMLImportContext overridables
-        virtual void StartElement(
-            const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
+        virtual void SAL_CALL startFastElement(
+            sal_Int32 nElement,
+            const css::uno::Reference< css::xml::sax::XFastAttributeList >& _rxAttrList) override;
     };
 
     //= OValueRangeImport
@@ -403,20 +389,19 @@ namespace xmloff
 
     public:
         OValueRangeImport(
-            OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+            OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer,
             OControlElement::ElementType _eType
         );
 
     protected:
         // SvXMLImportContext overridables
-        virtual void StartElement(
-            const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList ) override;
+        virtual void SAL_CALL startFastElement(
+            sal_Int32 nElement,
+            const css::uno::Reference< css::xml::sax::XFastAttributeList >& _rxAttrList ) override;
 
         // OPropertyImport overridables
-        virtual bool    handleAttribute( sal_uInt16 _nNamespaceKey,
-            const OUString& _rLocalName,
-            const OUString& _rValue ) override;
+        virtual bool handleAttribute(sal_Int32 nElement, const OUString& _rValue) override;
     };
 
     //= OTextLikeImport
@@ -432,14 +417,15 @@ namespace xmloff
 
     public:
         OTextLikeImport(
-            OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager, sal_uInt16 _nPrefix, const OUString& _rName,
+            OFormLayerXMLImport_Impl& _rImport, IEventAttacherManager& _rEventManager,
             const css::uno::Reference< css::container::XNameContainer >& _rxParentContainer,
             OControlElement::ElementType _eType
         );
 
         // SvXMLImportContext overridables
-        virtual void StartElement(
-            const css::uno::Reference< css::xml::sax::XAttributeList >& _rxAttrList) override;
+        virtual void SAL_CALL startFastElement(
+            sal_Int32 nElement,
+            const css::uno::Reference< css::xml::sax::XFastAttributeList >& _rxAttrList) override;
         virtual SvXMLImportContextRef CreateChildContext(
             sal_uInt16 _nPrefix, const OUString& _rLocalName,

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list