diff options
131 files changed, 9796 insertions, 1767 deletions
diff --git a/editeng/source/editeng/impedit4.cxx b/editeng/source/editeng/impedit4.cxx index 482cd6d71338..5a54c054016b 100755 --- a/editeng/source/editeng/impedit4.cxx +++ b/editeng/source/editeng/impedit4.cxx @@ -1458,7 +1458,11 @@ Reference< XSpellChecker1 > ImpEditEngine::GetSpeller() SpellInfo * ImpEditEngine::CreateSpellInfo( const EditSelection &rSel, bool bMultipleDocs ) { - pSpellInfo = new SpellInfo; + if (!pSpellInfo) + pSpellInfo = new SpellInfo; + else + *pSpellInfo = SpellInfo(); // reset to default values + pSpellInfo->bMultipleDoc = bMultipleDocs; EditSelection aSentenceSel( SelectSentence( rSel ) ); // pSpellInfo->aSpellStart = CreateEPaM( aSentenceSel.Min() ); @@ -2023,7 +2027,6 @@ bool ImpEditEngine::SpellSentence(EditView& rEditView, #else bool bRet = false; EditSelection aCurSel( rEditView.pImpEditView->GetEditSelection() ); - //the pSpellInfo has to be created on demand if(!pSpellInfo) pSpellInfo = CreateSpellInfo( aCurSel, true ); pSpellInfo->aCurSentenceStart = aCurSel.Min(); @@ -2191,8 +2194,12 @@ void ImpEditEngine::ApplyChangedSentence(EditView& rEditView, { #ifdef SVX_LIGHT #else + // Note: rNewPortions.size() == 0 is valid and happens when the whole + // sentence got removed in the dialog + DBG_ASSERT(pSpellInfo, "pSpellInfo not initialized"); - if(pSpellInfo) + if (pSpellInfo && + pSpellInfo->aLastSpellPortions.size() > 0) // no portions -> no text to be changed { // get current paragraph length to calculate later on how the sentence length changed, // in order to place the cursor at the end of the sentence again @@ -2202,6 +2209,10 @@ void ImpEditEngine::ApplyChangedSentence(EditView& rEditView, UndoActionStart( EDITUNDO_INSERT ); if(pSpellInfo->aLastSpellPortions.size() == rNewPortions.size()) { + DBG_ASSERT( rNewPortions.size() > 0, "rNewPortions should not be empty here" ); + DBG_ASSERT( pSpellInfo->aLastSpellPortions.size() == pSpellInfo->aLastSpellContentSelections.size(), + "aLastSpellPortions and aLastSpellContentSelections size mismatch" ); + //the simple case: the same number of elements on both sides //each changed element has to be applied to the corresponding source element svx::SpellPortions::const_iterator aCurrentNewPortion = rNewPortions.end(); @@ -2252,6 +2263,8 @@ void ImpEditEngine::ApplyChangedSentence(EditView& rEditView, } else { + DBG_ASSERT( pSpellInfo->aLastSpellContentSelections.size() > 0, "aLastSpellContentSelections should not be empty here" ); + //select the complete sentence SpellContentSelections::const_iterator aCurrentEndPosition = pSpellInfo->aLastSpellContentSelections.end(); --aCurrentEndPosition; diff --git a/extras/source/wordbook/standard.dic b/extras/source/wordbook/standard.dic Binary files differindex 7eadfdb77c7c..5b8b235b5dd0 100644 --- a/extras/source/wordbook/standard.dic +++ b/extras/source/wordbook/standard.dic diff --git a/i18npool/source/isolang/mslangid.cxx b/i18npool/source/isolang/mslangid.cxx index da9da0ff8646..a03d24e6fcdb 100644 --- a/i18npool/source/isolang/mslangid.cxx +++ b/i18npool/source/isolang/mslangid.cxx @@ -373,6 +373,7 @@ sal_Int16 MsLangId::getScriptType( LanguageType nLang ) case LANGUAGE_USER_BODO_INDIA: case LANGUAGE_USER_DOGRI_INDIA: case LANGUAGE_USER_MAITHILI_INDIA: + case LANGUAGE_UIGHUR_CHINA: nScript = ::com::sun::star::i18n::ScriptType::COMPLEX; break; diff --git a/instsetoo_native/util/pack.lst b/instsetoo_native/util/pack.lst index fc835cfcca76..c19039118909 100755 --- a/instsetoo_native/util/pack.lst +++ b/instsetoo_native/util/pack.lst @@ -9,16 +9,16 @@ OpenOffice unxlngi6.pro,unxmacxi.pro,unxsoli4.pro,unxsols4.pro,wntmsci12.pro,unxlngx6.pro en-US openoffice OpenOffice unxlngi6,unxmacxi,unxsoli4,unxsols4,wntmsci12 en-US openoffice -BrOffice pt-BR broffice +#BrOffice pt-BR broffice #OpenOffice_wJRE unxlngi6.pro,unxsoli4.pro,unxsols4.pro,wntmsci12.pro,wntmsci12 en-US openofficewithjre #BrOffice_wJRE pt-BR brofficewithjre OpenOffice_Dev unxlngi6.pro,unxsoli4.pro,unxsols4.pro,wntmsci12.pro,unxmacxi.pro,unxlngx6.pro en-US openofficedev #BrOffice_Dev pt-BR brofficedev -OpenOffice_SDK unxlngi6.pro,unxmacxi.pro,unxsoli4.pro,unxsols4.pro,wntmsci12.pro,unxlngx6.pro en-US sdkoo -OpenOffice_Dev_SDK unxlngi6.pro,unxmacxi.pro,unxsoli4.pro,unxsols4.pro,wntmsci12.pro,unxlngx6.pro en-US sdkoodev +#OpenOffice_SDK unxlngi6.pro,unxmacxi.pro,unxsoli4.pro,unxsols4.pro,wntmsci12.pro,unxlngx6.pro,unxlngi6,unxmacxi,unxsoli4,unxsols4,wntmsci12 en-US sdkoo +OpenOffice_Dev_SDK unxlngi6.pro,unxmacxi.pro,unxsoli4.pro,unxsols4.pro,wntmsci12.pro,unxlngx6.pro,unxlngi6,unxmacxi,unxsoli4,unxsols4,wntmsci12 en-US sdkoodev #URE unxlngi6.pro,unxsoli4.pro,unxsols4.pro,wntmsci12.pro,unxlngi6,unxsoli4,unxsols4,wntmsci12 en-US ure -OpenOfficeLanguagepack unxlngi6.pro,unxsoli4.pro,unxsols4.pro,wntmsci12.pro,unxlngx6.pro,unxmacxi.pro de|ja ooolanguagepack -#OpenOfficeLanguagepack unxlngi6,unxsoli4,unxsols4,wntmsci12,unxmacxi de ooolanguagepack -OpenOfficeDevLanguagepack unxlngi6.pro,unxsoli4.pro,unxsols4.pro,wntmsci12.pro,unxlngx6.pro,unxmacxi.pro ar|as|ast|bg|bn|ca|ca-XV|cs|da|de|dz|el|en-GB|es|et|eu|fi|fr|ga|gl|gu|he|hi|hu|id|is|it|ja|km|kn|ko|lt|lv|mk|ml|mr|my|nb|nl|nn|oc|om|or|pa-IN|pl|pt|pt-BR|ru|sh|si|sk|sl|sr|sv|ta|te|th|tr|ug|uk|vi|zh-CN|zh-TW ooodevlanguagepack +OpenOfficeLanguagepack unxlngi6.pro,unxsoli4.pro,unxsols4.pro,wntmsci12.pro,unxlngx6.pro,unxmacxi.pro de ooolanguagepack +OpenOfficeLanguagepack unxlngi6,unxsoli4,unxsols4,wntmsci12,unxmacxi de ooolanguagepack +OpenOfficeDevLanguagepack unxlngi6.pro,unxsoli4.pro,unxsols4.pro,wntmsci12.pro,unxlngx6.pro,unxmacxi.pro de|fr|ja|ar|ru ooodevlanguagepack #BrOfficeLanguagepack unxlngi6.pro,unxsoli4.pro,unxsols4.pro,wntmsci12.pro,unxlngx6.pro pt-BR broolanguagepack diff --git a/more_fonts/fonts/ttf_liberation/makefile.mk b/more_fonts/fonts/ttf_liberation/makefile.mk index de711a644690..a49c568e2770 100644 --- a/more_fonts/fonts/ttf_liberation/makefile.mk +++ b/more_fonts/fonts/ttf_liberation/makefile.mk @@ -36,8 +36,8 @@ TARGET=ttf_liberation # --- Files -------------------------------------------------------- -TARFILE_NAME=liberation-fonts-ttf-1.05.3.20100427 -TARFILE_MD5=ef9ab6c1740682fbd730606d5f6922e6 +TARFILE_NAME=liberation-fonts-ttf-1.06.0.20100721 +TARFILE_MD5=ca4870d899fd7e943ffc310a5421ad4d TARFILE_ROOTDIR=. PATCH_FILES= diff --git a/more_fonts/prj/d.lst b/more_fonts/prj/d.lst index 0bc15242b086..261aae0b2d28 100644 --- a/more_fonts/prj/d.lst +++ b/more_fonts/prj/d.lst @@ -1,9 +1,10 @@ mkdir: %COMMON_DEST%\pck%_EXT% ..\fonts\fc_local.conf %COMMON_DEST%\pck%_EXT%\fc_local.conf +# TODO: replace explicit versions by wildcard when the build system learns to handle them ..\%__SRC%\misc\build\dejavu-fonts-ttf-2.30\ttf\*.ttf %COMMON_DEST%\pck%_EXT%\*.ttf ..\%__SRC%\misc\build\dejavu-fonts-ttf-2.30\LICENSE %COMMON_DEST%\pck%_EXT%\LICENSE_dejavu -..\%__SRC%\misc\build\Liberation*.ttf %COMMON_DEST%\pck%_EXT%\*.ttf -..\%__SRC%\misc\build\License.txt %COMMON_DEST%\pck%_EXT%\LICENSE_liberation +..\%__SRC%\misc\build\liberation-fonts-ttf-1.06.0.20100721/Liberation*.ttf %COMMON_DEST%\pck%_EXT%\*.ttf +..\%__SRC%\misc\build\liberation-fonts-ttf-1.06.0.20100721/License.txt %COMMON_DEST%\pck%_EXT%\LICENSE_liberation ..\%__SRC%\misc\build\gentiumbasic-fonts-1.10\*.ttf %COMMON_DEST%\pck%_EXT%\*.ttf ..\%__SRC%\misc\build\gentiumbasic-fonts-1.10\OFL.txt %COMMON_DEST%\pck%_EXT%\LICENSE_gentium diff --git a/officecfg/registry/data/org/openoffice/Office/Math.xcu b/officecfg/registry/data/org/openoffice/Office/Math.xcu index 6778873e3386..b65c2422c433 100644..100755 --- a/officecfg/registry/data/org/openoffice/Office/Math.xcu +++ b/officecfg/registry/data/org/openoffice/Office/Math.xcu @@ -48,6 +48,8 @@ <value>0</value> </prop> </node> + + <!-- only used for symbols with the 'Greek' symbol set name --> <node oor:name="Id2" oor:op="replace"> <prop oor:name="Name"> <value>OpenSymbol</value> @@ -65,10 +67,11 @@ <value>0</value> </prop> <prop oor:name="Italic"> - <value>2</value> + <value>0</value> </prop> </node> </node> + <node oor:name="SymbolList"> <node oor:name="alpha" oor:op="replace"> <prop oor:name="Char"> diff --git a/officecfg/registry/schema/org/openoffice/Office/Math.xcs b/officecfg/registry/schema/org/openoffice/Office/Math.xcs index caa8726b7c72..31f6e00a230a 100644 --- a/officecfg/registry/schema/org/openoffice/Office/Math.xcs +++ b/officecfg/registry/schema/org/openoffice/Office/Math.xcs @@ -402,7 +402,28 @@ </info> <value>false</value> </prop> - <prop oor:name="ScaleNormalBracket" oor:type="xs:boolean"> + <prop oor:name="GreekCharStyle" oor:type="xs:short"> + <!-- UIHints: n/a yet --> + <info> + <author>TL</author> + <desc>Specifies the default layout for symbols from the 'Greek' symbol set.</desc> + <label>Greek character style</label> + </info> + <constraints> + <minInclusive oor:value="0"> + <info> + <desc>Specifies the minimum value allowed</desc> + </info> + </minInclusive> + <maxInclusive oor:value="2"> + <info> + <desc>Specifies the maximum value allowed</desc> + </info> + </maxInclusive> + </constraints> + <value>0</value> + </prop> + <prop oor:name="ScaleNormalBracket" oor:type="xs:boolean"> <!-- OldPath: Math/StandardFormat --> <!-- OldLocation: Soffice.cfg --> <!-- UIHints: Format - Spacing - Category - Brackets - Scale all brackets --> @@ -15,7 +15,7 @@ http://hg.services.openoffice.org/binaries 2ae988b339daec234019a7066f96733e-commons-lang-2.3-src.tar.gz 2c9b0f83ed5890af02c0df1c1776f39b-commons-httpclient-3.1-src.tar.gz 2f6ecca935948f7db92d925d88d0d078-icu4c-4_0_1-src.tgz -ef9ab6c1740682fbd730606d5f6922e6-liberation-fonts-ttf-1.05.3.20100427.zip +ca4870d899fd7e943ffc310a5421ad4d-liberation-fonts-ttf-1.06.0.20100721.tar.gz 35c94d2df8893241173de1d16b6034c0-swingExSrc.zip 35efabc239af896dfb79be7ebdd6e6b9-gentiumbasic-fonts-1.10.zip 377a60170e5185eb63d3ed2fae98e621-README_silgraphite-2.3.1.txt diff --git a/package/source/zipapi/ZipFile.cxx b/package/source/zipapi/ZipFile.cxx index 2238cf870d02..f01b7ce06f4b 100644 --- a/package/source/zipapi/ZipFile.cxx +++ b/package/source/zipapi/ZipFile.cxx @@ -1051,11 +1051,7 @@ void ZipFile::getSizeAndCRC( sal_Int32 nOffset, sal_Int32 nCompressedSize, sal_I nRealSize += nInBlock; } - if( aInflaterLocal.finished() ) - { - *nSize = nRealSize; - *nCRC = aCRC.getValue(); - } - else - *nSize = *nCRC = 0; + *nSize = nRealSize; + *nCRC = aCRC.getValue(); } + diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx index 5f42a2f37247..63cefe22626a 100644 --- a/sc/inc/table.hxx +++ b/sc/inc/table.hxx @@ -683,6 +683,8 @@ public: void UpdatePageBreaks( const ScRange* pUserArea ); void RemoveManualBreaks(); BOOL HasManualBreaks() const; + void SetRowManualBreaks( const ::std::set<SCROW>& rBreaks ); + void SetColManualBreaks( const ::std::set<SCCOL>& rBreaks ); void GetAllRowBreaks(::std::set<SCROW>& rBreaks, bool bPage, bool bManual) const; void GetAllColBreaks(::std::set<SCCOL>& rBreaks, bool bPage, bool bManual) const; diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx index b8bd9037c900..d54e16b8cbd7 100644 --- a/sc/source/core/data/table2.cxx +++ b/sc/source/core/data/table2.cxx @@ -155,6 +155,22 @@ void ScTable::InsertRow( SCCOL nStartCol, SCCOL nEndCol, SCROW nStartRow, SCSIZE mpFilteredRows->insertSegment(nStartRow, nSize, true); mpHiddenRows->insertSegment(nStartRow, nSize, true); + + if (!maRowManualBreaks.empty()) + { + std::set<SCROW>::reverse_iterator rit = maRowManualBreaks.rbegin(); + while (rit != maRowManualBreaks.rend()) + { + SCROW nRow = *rit; + if (nRow < nStartRow) + break; // while + else + { + maRowManualBreaks.erase( (++rit).base()); + maRowManualBreaks.insert( static_cast<SCROW>( nRow + nSize)); + } + } + } } for (SCCOL j=nStartCol; j<=nEndCol; j++) @@ -185,6 +201,18 @@ void ScTable::DeleteRow( SCCOL nStartCol, SCCOL nEndCol, SCROW nStartRow, SCSIZE mpFilteredRows->removeSegment(nStartRow, nStartRow+nSize); mpHiddenRows->removeSegment(nStartRow, nStartRow+nSize); + + if (!maRowManualBreaks.empty()) + { + std::set<SCROW>::iterator it = maRowManualBreaks.upper_bound( static_cast<SCROW>( nStartRow + nSize - 1)); + maRowManualBreaks.erase( maRowManualBreaks.lower_bound( nStartRow), it); + while (it != maRowManualBreaks.end()) + { + SCROW nRow = *it; + maRowManualBreaks.erase( it++); + maRowManualBreaks.insert( static_cast<SCROW>( nRow - nSize)); + } + } } { // scope for bulk broadcast @@ -233,6 +261,22 @@ void ScTable::InsertCol( SCCOL nStartCol, SCROW nStartRow, SCROW nEndRow, SCSIZE mpHiddenCols->insertSegment(nStartCol, static_cast<SCCOL>(nSize), true); mpFilteredCols->insertSegment(nStartCol, static_cast<SCCOL>(nSize), true); + + if (!maColManualBreaks.empty()) + { + std::set<SCCOL>::reverse_iterator rit = maColManualBreaks.rbegin(); + while (rit != maColManualBreaks.rend()) + { + SCCOL nCol = *rit; + if (nCol < nStartCol) + break; // while + else + { + maColManualBreaks.erase( (++rit).base()); + maColManualBreaks.insert( static_cast<SCCOL>( nCol + nSize)); + } + } + } } @@ -291,6 +335,18 @@ void ScTable::DeleteCol( SCCOL nStartCol, SCROW nStartRow, SCROW nEndRow, SCSIZE SCCOL nRmSize = nStartCol + static_cast<SCCOL>(nSize); mpHiddenCols->removeSegment(nStartCol, nRmSize); mpFilteredCols->removeSegment(nStartCol, nRmSize); + + if (!maColManualBreaks.empty()) + { + std::set<SCCOL>::iterator it = maColManualBreaks.upper_bound( static_cast<SCCOL>( nStartCol + nSize - 1)); + maColManualBreaks.erase( maColManualBreaks.lower_bound( nStartCol), it); + while (it != maColManualBreaks.end()) + { + SCCOL nCol = *it; + maColManualBreaks.erase( it++); + maColManualBreaks.insert( static_cast<SCCOL>( nCol - nSize)); + } + } } @@ -688,6 +744,7 @@ void ScTable::CopyToTable(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, pDestTab->IncRecalcLevel(); if (bWidth) + { for (SCCOL i=nCol1; i<=nCol2; i++) { bool bThisHidden = ColHidden(i); @@ -703,6 +760,8 @@ void ScTable::CopyToTable(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, if (bChange) bFlagChange = true; } + pDestTab->SetColManualBreaks( maColManualBreaks); + } if (bHeight) { @@ -754,6 +813,7 @@ void ScTable::CopyToTable(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, pDestTab->SetRowFiltered(i, nLastRow, bFiltered); i = nLastRow; } + pDestTab->SetRowManualBreaks( maRowManualBreaks); } pDestTab->DecRecalcLevel(); } @@ -791,11 +851,17 @@ void ScTable::UndoToTable(SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2, if (bWidth||bHeight) { if (bWidth) + { for (SCCOL i=nCol1; i<=nCol2; i++) pDestTab->pColWidth[i] = pColWidth[i]; + pDestTab->SetColManualBreaks( maColManualBreaks); + } if (bHeight) + { pDestTab->CopyRowHeight(*this, nRow1, nRow2, 0); - DecRecalcLevel(); + pDestTab->SetRowManualBreaks( maRowManualBreaks); + } + DecRecalcLevel(); } } } diff --git a/sc/source/core/data/table5.cxx b/sc/source/core/data/table5.cxx index e7ee96367785..7c13756aab38 100644 --- a/sc/source/core/data/table5.cxx +++ b/sc/source/core/data/table5.cxx @@ -326,6 +326,22 @@ BOOL ScTable::HasManualBreaks() const return !maRowManualBreaks.empty() || !maColManualBreaks.empty(); } +void ScTable::SetRowManualBreaks( const ::std::set<SCROW>& rBreaks ) +{ + maRowManualBreaks = rBreaks; + InvalidatePageBreaks(); + if (IsStreamValid()) + SetStreamValid(FALSE); +} + +void ScTable::SetColManualBreaks( const ::std::set<SCCOL>& rBreaks ) +{ + maColManualBreaks = rBreaks; + InvalidatePageBreaks(); + if (IsStreamValid()) + SetStreamValid(FALSE); +} + void ScTable::GetAllRowBreaks(set<SCROW>& rBreaks, bool bPage, bool bManual) const { if (bPage) diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx index 8e78f64b2090..ae5a7bcebe66 100644 --- a/sc/source/filter/xml/xmlcelli.cxx +++ b/sc/source/filter/xml/xmlcelli.cxx @@ -487,21 +487,31 @@ void ScXMLTableRowCellContext::DoMerge(const com::sun::star::table::CellAddress& uno::Reference<table::XCellRange> xCellRange(rXMLImport.GetTables().GetCurrentXCellRange()); if ( xCellRange.is() ) { - table::CellRangeAddress aCellAddress; - if (IsMerged(xCellRange, aCellPos.Column, aCellPos.Row, aCellAddress)) + // Stored merge range may actually be of a larger extend than what + // we support, in which case getCellRangeByPosition() throws + // IndexOutOfBoundsException. Do nothing then. + try { - //unmerge + table::CellRangeAddress aCellAddress; + if (IsMerged(xCellRange, aCellPos.Column, aCellPos.Row, aCellAddress)) + { + //unmerge + uno::Reference <util::XMergeable> xMergeable (xCellRange->getCellRangeByPosition(aCellAddress.StartColumn, aCellAddress.StartRow, + aCellAddress.EndColumn, aCellAddress.EndRow), uno::UNO_QUERY); + if (xMergeable.is()) + xMergeable->merge(sal_False); + } + + //merge uno::Reference <util::XMergeable> xMergeable (xCellRange->getCellRangeByPosition(aCellAddress.StartColumn, aCellAddress.StartRow, - aCellAddress.EndColumn, aCellAddress.EndRow), uno::UNO_QUERY); + aCellAddress.EndColumn + nCols, aCellAddress.EndRow + nRows), uno::UNO_QUERY); if (xMergeable.is()) - xMergeable->merge(sal_False); + xMergeable->merge(sal_True); + } + catch ( lang::IndexOutOfBoundsException & ) + { + DBG_ERRORFILE("ScXMLTableRowCellContext::DoMerge: range to be merged larger than what we support"); } - - //merge - uno::Reference <util::XMergeable> xMergeable (xCellRange->getCellRangeByPosition(aCellAddress.StartColumn, aCellAddress.StartRow, - aCellAddress.EndColumn + nCols, aCellAddress.EndRow + nRows), uno::UNO_QUERY); - if (xMergeable.is()) - xMergeable->merge(sal_True); } } } diff --git a/sc/source/ui/cctrl/dpcontrol.cxx b/sc/source/ui/cctrl/dpcontrol.cxx index 2f23166966b6..82c276d98f2c 100644 --- a/sc/source/ui/cctrl/dpcontrol.cxx +++ b/sc/source/ui/cctrl/dpcontrol.cxx @@ -975,7 +975,7 @@ ScDPFieldPopupWindow::ScDPFieldPopupWindow(Window* pParent, ScDocument* pDoc) : mnCurTabStop(0), mpExtendedData(NULL), mpOKAction(NULL), - maWndSize(160, 330), + maWndSize(240, 330), mePrevToggleAllState(STATE_DONTKNOW) { maTabStopCtrls.reserve(7); @@ -1048,7 +1048,7 @@ void ScDPFieldPopupWindow::getSectionPosSize(Point& rPos, Size& rSize, SectionTy const sal_uInt16 nMenuHeight = 60; const sal_uInt16 nSingleItemBtnAreaHeight = 32; // height of the middle area below the list box where the single-action buttons are. const sal_uInt16 nBottomBtnAreaHeight = 50; // height of the bottom area where the OK and Cancel buttons are. - const sal_uInt16 nBtnWidth = 60; + const sal_uInt16 nBtnWidth = 90; const sal_uInt16 nLabelHeight = static_cast< sal_uInt16 >( getLabelFont().GetHeight() ); const sal_uInt16 nBtnHeight = nLabelHeight*2; const sal_uInt16 nBottomMargin = 10; @@ -1105,7 +1105,7 @@ void ScDPFieldPopupWindow::getSectionPosSize(Point& rPos, Size& rSize, SectionTy { long h = 26; rPos = Point(nListBoxMargin, nSingleBtnAreaY); - rPos.X() += 75; + rPos.X() += 150; rPos.Y() += (nSingleItemBtnAreaHeight - h)/2; rSize = Size(h, h); } @@ -1114,7 +1114,7 @@ void ScDPFieldPopupWindow::getSectionPosSize(Point& rPos, Size& rSize, SectionTy { long h = 26; rPos = Point(nListBoxMargin, nSingleBtnAreaY); - rPos.X() += 75 + h + 10; + rPos.X() += 150 + h + 10; rPos.Y() += (nSingleItemBtnAreaHeight - h)/2; rSize = Size(h, h); } diff --git a/sc/source/ui/dbgui/textimportoptions.src b/sc/source/ui/dbgui/textimportoptions.src index fff3c4b40749..69e2d69b3142 100644 --- a/sc/source/ui/dbgui/textimportoptions.src +++ b/sc/source/ui/dbgui/textimportoptions.src @@ -33,34 +33,34 @@ ModalDialog RID_SCDLG_TEXT_IMPORT_OPTIONS { Text [ en-US ] = "Import Options" ; - Size = MAP_APPFONT ( 190 , 101 ) ; + Size = MAP_APPFONT ( 230 , 101 ) ; Moveable = TRUE ; Closeable = TRUE ; OutputSize = TRUE ; OKButton BTN_OK { - Pos = MAP_APPFONT ( 135, 6 ) ; + Pos = MAP_APPFONT ( 175, 6 ) ; Size = MAP_APPFONT ( 50, 14 ) ; DefButton = TRUE ; }; CancelButton BTN_CANCEL { - Pos = MAP_APPFONT ( 135, 23 ) ; + Pos = MAP_APPFONT ( 175, 23 ) ; Size = MAP_APPFONT ( 50, 14 ) ; }; HelpButton BTN_HELP { - Pos = MAP_APPFONT ( 135, 43 ) ; + Pos = MAP_APPFONT ( 175, 43 ) ; Size = MAP_APPFONT ( 50, 14 ) ; }; FixedLine FL_CHOOSE_LANG { Pos = MAP_APPFONT( 6, 3 ) ; - Size = MAP_APPFONT( 125, 14 ) ; + Size = MAP_APPFONT( 165, 14 ) ; Text [ en-US ] = "Select the language to use for import" ; }; @@ -68,7 +68,7 @@ ModalDialog RID_SCDLG_TEXT_IMPORT_OPTIONS RadioButton RB_AUTOMATIC { Pos = MAP_APPFONT( 12, 20 ) ; - Size = MAP_APPFONT( 50, 10 ) ; + Size = MAP_APPFONT( 159, 10 ) ; TabStop = TRUE ; Text [ en-US ] = "Automatic" ; @@ -77,7 +77,7 @@ ModalDialog RID_SCDLG_TEXT_IMPORT_OPTIONS RadioButton RB_CUSTOM { Pos = MAP_APPFONT( 12, 34 ) ; - Size = MAP_APPFONT( 50, 10 ) ; + Size = MAP_APPFONT( 159, 10 ) ; TabStop = TRUE ; Text [ en-US ] = "Custom" ; @@ -86,7 +86,7 @@ ModalDialog RID_SCDLG_TEXT_IMPORT_OPTIONS ListBox LB_CUSTOM_LANG { Pos = MAP_APPFONT( 20, 50 ) ; - Size = MAP_APPFONT( 100, 55 ) ; + Size = MAP_APPFONT( 140, 120 ) ; TabStop = TRUE ; DropDown = TRUE ; Sort = TRUE ; @@ -94,19 +94,17 @@ ModalDialog RID_SCDLG_TEXT_IMPORT_OPTIONS FixedLine FL_OPTION { - Pos = MAP_APPFONT( 6, 70 ); - Size = MAP_APPFONT( 125, 14 ); - - Text [ en-US ] = "Options" ; + Pos = MAP_APPFONT( 6, 70 ); + Size = MAP_APPFONT( 165, 14 ); + Text [ en-US ] = "Options" ; }; CheckBox BTN_CONVERT_DATE { Pos = MAP_APPFONT( 12, 86 ); - Size = MAP_APPFONT( 125, 10 ); - TabStop = TRUE ; - - Text [ en-US ] = "Detect special numbers (such as dates)." ; + Size = MAP_APPFONT( 159, 10 ); + TabStop = TRUE ; + Text [ en-US ] = "Detect special numbers (such as dates)." ; }; }; diff --git a/sc/source/ui/docshell/externalrefmgr.cxx b/sc/source/ui/docshell/externalrefmgr.cxx index 0569e95605b1..7fa31246275a 100644 --- a/sc/source/ui/docshell/externalrefmgr.cxx +++ b/sc/source/ui/docshell/externalrefmgr.cxx @@ -2024,7 +2024,7 @@ SfxObjectShellRef ScExternalRefManager::loadSrcDocument(sal_uInt16 nFileId, Stri if (!isFileLoadable(aFile)) return NULL; - String aOptions; + String aOptions( pFileData->maFilterOptions ); ScDocumentLoader::GetFilterName(aFile, rFilter, aOptions, true, false); const SfxFilter* pFilter = ScDocShell::Factory().GetFilterContainer()->GetFilter4FilterName(rFilter); @@ -2040,9 +2040,6 @@ SfxObjectShellRef ScExternalRefManager::loadSrcDocument(sal_uInt16 nFileId, Stri setRelativeFileName(nFileId, aStr); } - // Update the filter data now that we are loading it again. - setFilterData(nFileId, rFilter, aOptions); - SfxItemSet* pSet = new SfxAllItemSet(SFX_APP()->GetPool()); if (aOptions.Len()) pSet->Put(SfxStringItem(SID_FILE_FILTEROPTIONS, aOptions)); @@ -2077,6 +2074,13 @@ SfxObjectShellRef ScExternalRefManager::loadSrcDocument(sal_uInt16 nFileId, Stri pExtOptNew->GetDocSettings().mnLinkCnt = nLinkCount + 1; pNewShell->DoLoad(pMedium.release()); + + // with UseInteractionHandler, options may be set by dialog during DoLoad + String aNew = ScDocumentLoader::GetOptions(*pNewShell->GetMedium()); + if (aNew.Len() && aNew != aOptions) + aOptions = aNew; + setFilterData(nFileId, rFilter, aOptions); // update the filter data, including the new options + return aRef; } diff --git a/sc/source/ui/src/optdlg.src b/sc/source/ui/src/optdlg.src index ea7cabf7716d..4c64e312bc2d 100644 --- a/sc/source/ui/src/optdlg.src +++ b/sc/source/ui/src/optdlg.src @@ -152,13 +152,13 @@ TabPage RID_SCPAGE_CALC CheckBox BTN_GENERAL_PREC { Pos = MAP_APPFONT ( 12 , 147 ) ; - Size = MAP_APPFONT ( 136 , 10 ) ; + Size = MAP_APPFONT ( 148 , 10 ) ; Text [ en-US ] = "Limit decimals for general number format" ; }; FixedText FT_PREC { - Pos = MAP_APPFONT ( 150 , 148 ) ; - Size = MAP_APPFONT ( 72 , 8 ) ; + Pos = MAP_APPFONT ( 138 , 148 ) ; + Size = MAP_APPFONT ( 84 , 8 ) ; Text [ en-US ] = "~Decimal places" ; Right = TRUE ; }; diff --git a/sc/source/ui/unoobj/confuno.cxx b/sc/source/ui/unoobj/confuno.cxx index 75e415b8f018..a680185a1d1c 100644 --- a/sc/source/ui/unoobj/confuno.cxx +++ b/sc/source/ui/unoobj/confuno.cxx @@ -193,11 +193,14 @@ void SAL_CALL ScDocumentConfiguration::setPropertyValue( if (pPrinter) { String aString(sPrinterName); - SfxPrinter* pNewPrinter = new SfxPrinter( pPrinter->GetOptions().Clone(), aString ); - if (pNewPrinter->IsKnown()) - pDocShell->SetPrinter( pNewPrinter, SFX_PRINTER_PRINTER ); - else - delete pNewPrinter; + if (pPrinter->GetName() != aString) + { + SfxPrinter* pNewPrinter = new SfxPrinter( pPrinter->GetOptions().Clone(), aString ); + if (pNewPrinter->IsKnown()) + pDocShell->SetPrinter( pNewPrinter, SFX_PRINTER_PRINTER ); + else + delete pNewPrinter; + } } else throw uno::RuntimeException(); diff --git a/sc/uiconfig/scalc/toolbar/findbar.xml b/sc/uiconfig/scalc/toolbar/findbar.xml index 9ef9d8a1a78f..0338d3156195 100644 --- a/sc/uiconfig/scalc/toolbar/findbar.xml +++ b/sc/uiconfig/scalc/toolbar/findbar.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> <toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink" toolbar:id="toolbar"> - <toolbar:toolbaritem xlink:href=".uno:FindText" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:DownSearch" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:UpSearch" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:SearchDialog" toolbar:text="Find & Replace" toolbar:visible="false" toolbar:helpid="helpid:100105"/> + <toolbar:toolbaritem xlink:href=".uno:FindText"/> + <toolbar:toolbaritem xlink:href=".uno:DownSearch"/> + <toolbar:toolbaritem xlink:href=".uno:UpSearch"/> + <toolbar:toolbaritem xlink:href=".uno:SearchDialog" toolbar:visible="false"/> </toolbar:toolbar> diff --git a/sd/uiconfig/sdraw/toolbar/findbar.xml b/sd/uiconfig/sdraw/toolbar/findbar.xml index 9ef9d8a1a78f..078c0fc5bed5 100644 --- a/sd/uiconfig/sdraw/toolbar/findbar.xml +++ b/sd/uiconfig/sdraw/toolbar/findbar.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> <toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink" toolbar:id="toolbar"> - <toolbar:toolbaritem xlink:href=".uno:FindText" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:DownSearch" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:UpSearch" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:SearchDialog" toolbar:text="Find & Replace" toolbar:visible="false" toolbar:helpid="helpid:100105"/> + <toolbar:toolbaritem xlink:href=".uno:FindText"/> + <toolbar:toolbaritem xlink:href=".uno:DownSearch"/> + <toolbar:toolbaritem xlink:href=".uno:UpSearch"/> + <toolbar:toolbaritem xlink:href=".uno:SearchDialog" toolbar:visible="false"/> </toolbar:toolbar> diff --git a/sd/uiconfig/simpress/toolbar/findbar.xml b/sd/uiconfig/simpress/toolbar/findbar.xml index 9ef9d8a1a78f..0338d3156195 100644 --- a/sd/uiconfig/simpress/toolbar/findbar.xml +++ b/sd/uiconfig/simpress/toolbar/findbar.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> <toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink" toolbar:id="toolbar"> - <toolbar:toolbaritem xlink:href=".uno:FindText" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:DownSearch" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:UpSearch" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:SearchDialog" toolbar:text="Find & Replace" toolbar:visible="false" toolbar:helpid="helpid:100105"/> + <toolbar:toolbaritem xlink:href=".uno:FindText"/> + <toolbar:toolbaritem xlink:href=".uno:DownSearch"/> + <toolbar:toolbaritem xlink:href=".uno:UpSearch"/> + <toolbar:toolbaritem xlink:href=".uno:SearchDialog" toolbar:visible="false"/> </toolbar:toolbar> diff --git a/sfx2/source/dialog/securitypage.cxx b/sfx2/source/dialog/securitypage.cxx index d32ee843cbf2..2ac8f6a43fee 100755..100644 --- a/sfx2/source/dialog/securitypage.cxx +++ b/sfx2/source/dialog/securitypage.cxx @@ -245,6 +245,36 @@ SfxSecurityPage_Impl::SfxSecurityPage_Impl( SfxSecurityPage &rTabPage, const Sfx m_aRecordChangesCB.SetStyle( m_aRecordChangesCB.GetStyle() | WB_EARLYTOGGLE ); m_aRecordChangesCB.SetToggleHdl( LINK( this, SfxSecurityPage_Impl, RecordChangesCBToggleHdl ) ); m_aChangeProtectionPB.SetClickHdl( LINK( this, SfxSecurityPage_Impl, ChangeProtectionPBHdl ) ); + + + // #i112277: for the time being (OOO 3.3) the following options should not + // be available. In the long run however it is planned to implement the yet + // missing functionality. Thus now we hide them and move the remaining ones up. + m_aNewPasswordToOpenFL.Hide(); + m_aNewPasswordToOpenFT.Hide(); + m_aNewPasswordToOpenED.Hide(); + m_aConfirmPasswordToOpenFT.Hide(); + m_aConfirmPasswordToOpenED.Hide(); + m_aNewPasswordInfoFT.Hide(); + m_aNewPasswordToModifyFL.Hide(); + m_aNewPasswordToModifyFT.Hide(); + m_aNewPasswordToModifyED.Hide(); + m_aConfirmPasswordToModifyFT.Hide(); + m_aConfirmPasswordToModifyED.Hide(); + const long nDelta = m_aOptionsFL.GetPosPixel().Y() - m_aNewPasswordToOpenFL.GetPosPixel().Y(); + Point aPos; + aPos = m_aOptionsFL.GetPosPixel(); + aPos.Y() -= nDelta; + m_aOptionsFL.SetPosPixel( aPos ); + aPos = m_aOpenReadonlyCB.GetPosPixel(); + aPos.Y() -= nDelta; + m_aOpenReadonlyCB.SetPosPixel( aPos ); + aPos = m_aRecordChangesCB.GetPosPixel(); + aPos.Y() -= nDelta; + m_aRecordChangesCB.SetPosPixel( aPos ); + aPos = m_aChangeProtectionPB.GetPosPixel(); + aPos.Y() -= nDelta; + m_aChangeProtectionPB.SetPosPixel( aPos ); } diff --git a/sfx2/source/dialog/securitypage.src b/sfx2/source/dialog/securitypage.src index fee60404d01c..fee60404d01c 100755..100644 --- a/sfx2/source/dialog/securitypage.src +++ b/sfx2/source/dialog/securitypage.src diff --git a/sfx2/source/doc/sfxbasemodel.cxx b/sfx2/source/doc/sfxbasemodel.cxx index b5a9536b12c5..7ef9fe0d2f19 100644 --- a/sfx2/source/doc/sfxbasemodel.cxx +++ b/sfx2/source/doc/sfxbasemodel.cxx @@ -977,6 +977,8 @@ sal_Bool SAL_CALL SfxBaseModel::attachResource( const ::rtl::OUString& aArgs.remove( "BreakMacroSignature" ); aArgs.remove( "Stream" ); aArgs.remove( "InputStream" ); + aArgs.remove( "URL" ); + aArgs.remove( "Frame" ); // TODO/LATER: all the parameters that are accepted by ItemSet of the DocShell must be removed here @@ -988,6 +990,10 @@ sal_Bool SAL_CALL SfxBaseModel::attachResource( const ::rtl::OUString& SfxAllItemSet aSet( pObjectShell->GetPool() ); TransformParameters( SID_OPENDOC, rArgs, aSet ); + // the arguments are not allowed to reach the medium + aSet.ClearItem( SID_FILE_NAME ); + aSet.ClearItem( SID_FILLFRAME ); + pMedium->GetItemSet()->Put( aSet ); SFX_ITEMSET_ARG( &aSet, pItem, SfxStringItem, SID_FILTER_NAME, sal_False ); if ( pItem ) diff --git a/sfx2/source/view/viewfrm.cxx b/sfx2/source/view/viewfrm.cxx index 035fd3f794de..ed924623c700 100644 --- a/sfx2/source/view/viewfrm.cxx +++ b/sfx2/source/view/viewfrm.cxx @@ -813,6 +813,13 @@ void SfxViewFrame::ExecReload_Impl( SfxRequest& rReq ) xNewObj->SetModifyPasswordEntered( sal_False ); xNewObj->SetReadOnly(); } + else if ( rReq.GetSlot() == SID_EDITDOC && bForEdit && !xNewObj->IsReadOnlyMedium() ) + { + // the filter might request setting of the document to readonly state + // but in case of SID_EDITDOC it should not happen if the document + // can be opened for editing + xNewObj->SetReadOnlyUI( sal_False ); + } if ( xNewObj->IsDocShared() ) { @@ -2144,6 +2151,8 @@ SfxViewShell* SfxViewFrame::LoadViewIntoFrame_Impl( const SfxObjectShell& i_rDoc aTransformLoadArgs.remove( "Hidden" ); ::rtl::OUString sURL( RTL_CONSTASCII_USTRINGPARAM( "private:object" ) ); + if ( !sURL.getLength() ) + sURL = i_rDoc.GetFactory().GetFactoryURL(); Reference< XComponentLoader > xLoader( i_rFrame, UNO_QUERY_THROW ); xLoader->loadComponentFromURL( sURL, ::rtl::OUString::createFromAscii( "_self" ), 0, diff --git a/smoketestoo_native/smoketest.cxx b/smoketestoo_native/smoketest.cxx index e2cb51127f47..41baeddf9edb 100644 --- a/smoketestoo_native/smoketest.cxx +++ b/smoketestoo_native/smoketest.cxx @@ -28,6 +28,8 @@ #include "sal/config.h" #include "boost/noncopyable.hpp" +#include "com/sun/star/awt/XCallback.hpp" +#include "com/sun/star/awt/XRequestCallback.hpp" #include "com/sun/star/beans/PropertyState.hpp" #include "com/sun/star/beans/PropertyValue.hpp" #include "com/sun/star/document/MacroExecMode.hpp" @@ -40,6 +42,7 @@ #include "com/sun/star/frame/XModel.hpp" #include "com/sun/star/frame/XNotifyingDispatch.hpp" #include "com/sun/star/lang/EventObject.hpp" +#include "com/sun/star/uno/Any.hxx" #include "com/sun/star/uno/Reference.hxx" #include "com/sun/star/uno/RuntimeException.hpp" #include "com/sun/star/uno/Sequence.hxx" @@ -94,6 +97,29 @@ void Listener::dispatchFinished(css::frame::DispatchResultEvent const & Result) result_->condition.set(); } +class Callback: public cppu::WeakImplHelper1< css::awt::XCallback > { +public: + Callback( + css::uno::Reference< css::frame::XNotifyingDispatch > const & dispatch, + css::util::URL const & url, + css::uno::Sequence< css::beans::PropertyValue > const & arguments, + css::uno::Reference< css::frame::XDispatchResultListener > const & + listener): + dispatch_(dispatch), url_(url), arguments_(arguments), + listener_(listener) + { OSL_ASSERT(dispatch.is()); } + +private: + virtual void SAL_CALL notify(css::uno::Any const &) + throw (css::uno::RuntimeException) + { dispatch_->dispatchWithNotification(url_, arguments_, listener_); } + + css::uno::Reference< css::frame::XNotifyingDispatch > dispatch_; + css::util::URL url_; + css::uno::Sequence< css::beans::PropertyValue > arguments_; + css::uno::Reference< css::frame::XDispatchResultListener > listener_; +}; + class Test: public CppUnit::TestFixture { public: virtual void setUp(); @@ -135,8 +161,7 @@ void Test::test() { RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.script:Standard.Global.StartTestWithDefaultOptions?" "language=Basic&location=document")); - Result result; - css::uno::Reference< css::frame::XNotifyingDispatch >( + css::uno::Reference< css::frame::XNotifyingDispatch > disp( css::uno::Reference< css::frame::XDispatchProvider >( css::uno::Reference< css::frame::XController >( css::uno::Reference< css::frame::XModel >( @@ -154,9 +179,18 @@ void Test::test() { css::uno::UNO_SET_THROW)->getFrame(), css::uno::UNO_QUERY_THROW)->queryDispatch( url, rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_self")), 0), - css::uno::UNO_QUERY_THROW)->dispatchWithNotification( - url, css::uno::Sequence< css::beans::PropertyValue >(), - new Listener(&result)); + css::uno::UNO_QUERY_THROW); + Result result; + // Shifted to main thread to work around potential deadlocks (i112867): + css::uno::Reference< css::awt::XRequestCallback >( + connection_.getFactory()->createInstance( //TODO: AsyncCallback ctor + rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM("com.sun.star.awt.AsyncCallback"))), + css::uno::UNO_QUERY_THROW)->addCallback( + new Callback( + disp, url, css::uno::Sequence< css::beans::PropertyValue >(), + new Listener(&result)), + css::uno::Any()); result.condition.wait(); CPPUNIT_ASSERT(result.success); CPPUNIT_ASSERT_EQUAL(rtl::OUString(), result.result); diff --git a/solenv/bin/build.pl b/solenv/bin/build.pl index 66afeec6e2c7..d7bc7df26442 100755 --- a/solenv/bin/build.pl +++ b/solenv/bin/build.pl @@ -45,6 +45,7 @@ use lib ("$ENV{SOLARENV}/bin/modules"); use SourceConfig; + use RepositoryHelper; my $in_so_env = 0; if (defined $ENV{COMMON_ENV_TOOLS}) { @@ -139,6 +140,8 @@ $html = ''; @ignored_errors = (); %incompatibles = (); + %skip_modules = (); + %exclude_branches = (); $only_platform = ''; # the only platform to prepare $only_common = ''; # the only common output tree to delete when preparing %build_modes = (); @@ -167,8 +170,8 @@ $html_last_updated = 0; %jobs_hash = (); $html_path = undef; - $html_file = CorrectPath($ENV{SOLARSRC} . '/' . $ENV{INPATH}. '.build.html'); $build_finished = 0; + $html_file = ''; %had_error = (); # hack for misteriuos windows problems - try run dmake 2 times if first time there was an error $mkout = CorrectPath("$ENV{SOLARENV}/bin/mkout.pl"); %weights_hash = (); # hash contains info about how many modules are dependent from one module @@ -209,7 +212,6 @@ get_options(); - $html_file = CorrectPath($html_path . '/' . $ENV{INPATH}. '.build.html') if (defined $html_path); # my $temp_html_file = CorrectPath($tmp_dir. '/' . $ENV{INPATH}. '.build.html'); get_build_modes(); %deliver_env = (); @@ -225,12 +227,26 @@ $deliver_env{'OUTPATH'}++; $deliver_env{'L10N_framework'}++; }; + $StandDir = get_stand_dir(); # This also sets $initial_module + $source_config = SourceConfig -> new($StandDir); + + if ($html) { + if (defined $html_path) { + $html_file = CorrectPath($html_path . '/' . $ENV{INPATH}. '.build.html'); + } else { + my $log_directory = Cwd::realpath(CorrectPath($StandDir . '/../log')); + if ((!-d $log_directory) && (!mkdir($log_directory))) { + print_error("Cannot create $log_directory for writing html file\n"); + }; + $html_file = $log_directory . '/' . $ENV{INPATH}. '.build.html'; + print "\nPath to html status page: $html_file\n"; + }; + }; if ($generate_config && ($clear_config || (scalar keys %remove_from_config)||(scalar keys %add_to_config))) { generate_config_file(); exit 0; } - $StandDir = get_stand_dir(); # This also sets $initial_module get_module_and_buildlist_paths(); provide_consistency() if (defined $ENV{CWS_WORK_STAMP} && defined($ENV{COMMON_ENV_TOOLS})); @@ -342,7 +358,6 @@ sub rename_file { }; sub generate_config_file { - my $source_config = SourceConfig->new(); $source_config->add_active_modules([keys %add_to_config], 1) if (scalar %add_to_config); $source_config->remove_activated_modules([keys %remove_from_config], 1) if (scalar %remove_from_config); $source_config->remove_all_activated_modules() if ($clear_config); @@ -556,23 +571,36 @@ sub get_build_list_path { # Get dependencies hash of the current and all parent projects # sub get_parent_deps { - my (%parents_deps_hash, $module, $parent); my $prj_dir = shift; my $deps_hash = shift; - my @unresolved_parents = get_parents_array($prj_dir); - $parents_deps_hash{$_}++ foreach (@unresolved_parents); - $$deps_hash{$prj_dir} = \%parents_deps_hash; - while ($module = pop(@unresolved_parents)) { + my @unresolved_parents = ($prj_dir); + my %skipped_branches = (); + while (my $module = pop(@unresolved_parents)) { + next if (defined $$deps_hash{$module}); my %parents_deps_hash = (); - $parents_deps_hash{$_}++ foreach (get_parents_array($module)); + foreach (get_parents_array($module)) { + if (defined $exclude_branches{$_}) { + $skipped_branches{$_}++; + next; + }; + $parents_deps_hash{$_}++; + } $$deps_hash{$module} = \%parents_deps_hash; foreach $Parent (keys %parents_deps_hash) { - if (!defined($$deps_hash{$Parent})) { + if (!defined($$deps_hash{$Parent}) && (!defined $exclude_branches{$module})) { push (@unresolved_parents, $Parent); }; }; }; check_deps_hash($deps_hash); + foreach (keys %skipped_branches) { + print $echo . "Skipping module's $_ branch\n"; + delete $exclude_branches{$_}; + }; + my @missing_branches = keys %exclude_branches; + if (scalar @missing_branches) { + print_error("For $prj_dir branche(s): \"@missing_branches\" not found\n"); + }; }; sub store_weights { @@ -605,18 +633,18 @@ sub expand_dependencies { }; # -# This procedure fills out the %reversed_dependencies hash, -# the hash contaninig the info about modules "waiting" for the module +# This procedure fills the second hash with reversed dependencies, +# ie, with info about modules "waiting" for the module # sub reverse_dependensies { - my $deps_hash = shift; + my ($deps_hash, $reversed) = @_; foreach my $module (keys %$deps_hash) { foreach (keys %{$$deps_hash{$module}}) { - if (defined $reversed_dependencies{$_}) { - ${$reversed_dependencies{$_}}{$module}++ + if (defined $$reversed{$_}) { + ${$$reversed{$_}}{$module}++ } else { my %single_module_dep_hash = ($module => 1); - $reversed_dependencies{$_} = \%single_module_dep_hash; + $$reversed{$_} = \%single_module_dep_hash; }; }; }; @@ -635,8 +663,12 @@ sub build_all { }; modules_classify(keys %global_deps_hash); expand_dependencies (\%global_deps_hash); -# prepare_build_from(\%global_deps_hash) if (scalar keys %incompatibles); - prepare_incompatible_build(\%global_deps_hash) if ($incompatible); + prepare_incompatible_build(\%global_deps_hash) if ($incompatible && (!$build_from_with_branches)); + if ($build_from_with_branches) { + my %reversed_full_deps_hash = (); + reverse_dependensies(\%global_deps_hash, \%reversed_full_deps_hash); + prepare_build_from_with_branches(\%global_deps_hash, \%reversed_full_deps_hash); + } if ($build_all_cont || $build_since) { prepare_build_all_cont(\%global_deps_hash); }; @@ -653,13 +685,13 @@ sub build_all { print_error("There are modules:\n@missing_modules\n\nthat should be built, but they are not activated. Please, verify your $source_config_file.\n"); }; }; - foreach my $module (%dead_parents) { + foreach my $module (keys %dead_parents, keys %skip_modules) { remove_from_dependencies($module, \%global_deps_hash); delete ($global_deps_hash{$module}) if (defined $global_deps_hash{$module}); }; store_weights(\%global_deps_hash); backup_deps_hash(\%global_deps_hash, \%global_deps_hash_backup); - reverse_dependensies(\%global_deps_hash_backup); + reverse_dependensies(\%global_deps_hash_backup, \%reversed_dependencies); $modules_number = scalar keys %global_deps_hash; initialize_html_info($_) foreach (keys %global_deps_hash); if ($processes_to_run) { @@ -1100,6 +1132,7 @@ sub get_commands { while ($arg = pop(@dmake_args)) { $dmake .= ' '.$arg; }; + $dmake .= ' verbose=true' if ($html); }; # @@ -1110,34 +1143,44 @@ sub get_stand_dir { $ENV{mk_tmp} = ''; die "No environment set\n"; }; - my $StandDir; - if ( defined $ENV{PWD} ) { - $StandDir = $ENV{PWD}; - } elsif (defined $ENV{_cwd}) { - $StandDir = $ENV{_cwd}; - } else { - $StandDir = cwd(); - }; - my $previous_dir = ''; - do { - foreach (@possible_build_lists) {# ('build.lst', 'build.xlist'); - if (-e $StandDir . '/prj/'.$_) { - $initial_module = File::Basename::basename($StandDir); - $build_list_paths{$initial_module} =$StandDir . '/prj/'.$_; - $StandDir = File::Basename::dirname($StandDir); - $module_paths{$initial_module} = $StandDir . "/$initial_module"; + my $repository_helper = RepositoryHelper->new(); + my $StandDir = $repository_helper->get_repository_root(); + my $initial_dir = $repository_helper->get_initial_directory(); + if ($StandDir eq $initial_dir) { + print_error('Found no project to build'); + }; + $initial_module = substr($initial_dir, length($StandDir) + 1); + if ($initial_module =~ /\\|\//) { + $initial_module = File::Basename::dirname($initial_module); + }; + $module_paths{$initial_module} = $StandDir . "/$initial_module"; +# $build_list_paths{$initial_module} =$StandDir . '/prj/'.$_; +# if ( defined $ENV{PWD} ) { +# $StandDir = $ENV{PWD}; +# } elsif (defined $ENV{_cwd}) { +# $StandDir = $ENV{_cwd}; +# } else { +# $StandDir = cwd(); +# }; +# my $previous_dir = ''; +# do { +# foreach (@possible_build_lists) {# ('build.lst', 'build.xlist'); +# if (-e $StandDir . '/prj/'.$_) { +# $initial_module = File::Basename::basename($StandDir); +# $build_list_paths{$initial_module} =$StandDir . '/prj/'.$_; +# $StandDir = File::Basename::dirname($StandDir); +# $module_paths{$initial_module} = $StandDir . "/$initial_module"; return $StandDir; - } elsif ($StandDir eq $previous_dir) { - $ENV{mk_tmp} = ''; - print_error('Found no project to build'); - }; - }; - $previous_dir = $StandDir; - $StandDir = File::Basename::dirname(Cwd::realpath($StandDir)); - print_error('Found no project to build') if (!$StandDir); - } -# while (chdir '..'); - while (chdir "$StandDir"); +# } elsif ($StandDir eq $previous_dir) { +# $ENV{mk_tmp} = ''; +# print_error('Found no project to build'); +# }; +# }; +# $previous_dir = $StandDir; +# $StandDir = File::Basename::dirname(Cwd::realpath($StandDir)); +# print_error('Found no project to build') if (!$StandDir); +# } +# while (chdir "$StandDir"); }; # @@ -1236,7 +1279,7 @@ sub check_deps_hash { $jobs_hash{$key} = { SHORT_NAME => $string, BUILD_NUMBER => $build_number, STATUS => 'waiting', - LOG_PATH => $module . "/$ENV{INPATH}/misc/logs/$log_name", + LOG_PATH => '../' . $source_config->get_module_repository($module) . "/$module/$ENV{INPATH}/misc/logs/$log_name", LONG_LOG_PATH => CorrectPath($module_paths{$module} . "/$ENV{INPATH}/misc/logs/$log_name"), START_TIME => 0, FINISH_TIME => 0, @@ -1392,7 +1435,7 @@ sub print_error { sub usage { print STDERR "\nbuild\n"; - print STDERR "Syntax: build [--all|-a[:prj_name]]|[--from|-f prj_name1[:prj_name2] [prj_name3 [...]]]|[--since|-c prj_name] [--with_branches|-b]|[--prepare|-p][:platform] [--deliver|-d [--dlv_switch deliver_switch]]] [-P processes|--server [--setenvstring \"string\"] [--client_timeout MIN] [--port port1[:port2:...:portN]]] [--show|-s] [--help|-h] [--file|-F] [--ignore|-i] [--version|-V] [--mode|-m OOo[,SO[,EXT]] [--html [--html_path html_file_path] [--dontgraboutput]] [--pre_job=pre_job_sring] [--job=job_string|-j] [--post_job=post_job_sring] [--stoponerror] [--genconf [--removeall|--clear|--remove|--add [module1,module2[,...,moduleN]]]] [--interactive]\n"; + print STDERR "Syntax: build [--all|-a[:prj_name]]|[--from|-f prj_name1[:prj_name2] [prj_name3 [...]]]|[--since|-c prj_name] [--with_branches prj_name1[:prj_name2] [--skip prj_name1[:prj_name2] [prj_name3 [...]] [prj_name3 [...]|-b]|[--prepare|-p][:platform] [--deliver|-d [--dlv_switch deliver_switch]]] [-P processes|--server [--setenvstring \"string\"] [--client_timeout MIN] [--port port1[:port2:...:portN]]] [--show|-s] [--help|-h] [--file|-F] [--ignore|-i] [--version|-V] [--mode|-m OOo[,SO[,EXT]] [--html [--html_path html_file_path] [--dontgraboutput]] [--pre_job=pre_job_sring] [--job=job_string|-j] [--post_job=post_job_sring] [--stoponerror] [--genconf [--removeall|--clear|--remove|--add [module1,module2[,...,moduleN]]]] [--exclude_branch_from prj_name1[:prj_name2] [prj_name3 [...]]] [--interactive]\n"; print STDERR "Example1: build --from sfx2\n"; print STDERR " - build all projects dependent from sfx2, starting with sfx2, finishing with the current module\n"; print STDERR "Example2: build --all:sfx2\n"; @@ -1405,9 +1448,11 @@ sub usage { print STDERR "\nSwitches:\n"; print STDERR " --all - build all projects from very beginning till current one\n"; print STDERR " --from - build all projects dependent from the specified (including it) till current one\n"; + print STDERR " --exclude_branch_from - exclude module(s) and its branch from the build\n"; print STDERR " --mode OOo - build only projects needed for OpenOffice.org\n"; print STDERR " --prepare - clear all projects for incompatible build from prj_name till current one [for platform] (cws version)\n"; - print STDERR " --with_branches- build all projects in neighbour branches and current branch starting from actual project\n"; + print STDERR " --with_branches- the same as \"--from\" but with build all projects in neighbour branches\n"; + print STDERR " --skip - do not build certain module(s)\n"; print STDERR " --since - build all projects beginning from the specified till current one (the same as \"--all:prj_name\", but skipping prj_name)\n"; print STDERR " --checkmodules - check if all required parent projects are availlable\n"; print STDERR " --show - show what is going to be built\n"; @@ -1462,19 +1507,25 @@ sub get_options { $arg =~ /^--dlv_switch$/ and $dlv_switch = shift @ARGV and next; $arg =~ /^--file$/ and $cmd_file = shift @ARGV and next; $arg =~ /^-F$/ and $cmd_file = shift @ARGV and next; + $arg =~ /^--skip$/ and get_modules_passed(\%skip_modules) and next; - $arg =~ /^--with_branches$/ and $build_all_parents = 1 - and $build_from_with_branches = shift @ARGV and next; - $arg =~ /^-b$/ and $build_all_parents = 1 - and $build_from_with_branches = shift @ARGV and next; - + if ($arg =~ /^--with_branches$/ || $arg =~ /^-b$/) { + $build_from_with_branches = 1; + $build_all_parents = 1; + get_modules_passed(\%incompatibles); + next; + }; $arg =~ /^--all:(\S+)$/ and $build_all_parents = 1 and $build_all_cont = $1 and next; $arg =~ /^-a:(\S+)$/ and $build_all_parents = 1 and $build_all_cont = $1 and next; if ($arg =~ /^--from$/ || $arg =~ /^-f$/) { $build_all_parents = 1; - get_incomp_projects(); + get_modules_passed(\%incompatibles); + next; + }; + if ($arg =~ /^--exclude_branch_from$/) { + get_modules_passed(\%exclude_branches); next; }; $arg =~ /^--prepare$/ and $prepare = 1 and next; @@ -1527,8 +1578,12 @@ sub get_options { print_error("\"--html_path\" switch is used only with \"--html\"") if ($html_path); print_error("\"--dontgraboutput\" switch is used only with \"--html\"") if ($dont_grab_output); }; + if ((scalar keys %exclude_branches) && !$build_all_parents) { + print_error("\"--exclude_branch_from\" is not applicable for one module builds!!"); + }; $grab_output = 0 if ($dont_grab_output); print_error('Switches --with_branches and --all collision') if ($build_from_with_branches && $build_all_cont); + print_error('Switch --skip is for building multiple modules only!!') if ((scalar keys %skip_modules) && (!$build_all_parents)); # print_error('Please prepare the workspace on one of UNIX platforms') if ($prepare && ($ENV{GUI} ne 'UNX')); print_error('Switches --with_branches and --since collision') if ($build_from_with_branches && $build_since); if ($show) { @@ -1593,7 +1648,6 @@ sub get_options { sub get_module_and_buildlist_paths { if ($build_all_parents || $checkparents) { - my $source_config = SourceConfig -> new($StandDir); $source_config_file = $source_config->get_config_file_path(); $active_modules{$_}++ foreach ($source_config->get_active_modules()); my %active_modules_copy = %active_modules; @@ -1652,7 +1706,13 @@ sub cancel_build { $message_part .= "--from @broken_modules_names\n"; }; } else { - $message_part .= "--all:@broken_modules_names\n"; + if ($processes_to_run) { + $message_part .= "--from "; + } else { + $message_part .= "--all:"; + }; + $message_part .= "@broken_modules_names\n"; + }; if ($broken_modules_number && $build_all_parents) { print "\n"; @@ -2109,12 +2169,12 @@ sub modules_classify { # # This procedure provides consistency for cws -# and optimized build (ie in case of -with_branches, -all:prj_name +# and optimized build (ie in case of --with_branches, -all:prj_name # and -since switches) # sub provide_consistency { check_dir(); - foreach $var_ref (\$build_from_with_branches, \$build_all_cont, \$build_since) { + foreach $var_ref (\$build_all_cont, \$build_since) { if ($$var_ref) { return if (defined $module_paths{$$var_ref}); print_error("Cannot find module '$$var_ref'", 9); @@ -2257,6 +2317,20 @@ sub fix_permissions { chmod '0664', $file; }; +sub prepare_build_from_with_branches { + ($full_deps_hash, $reversed_full_deps_hash) = @_; + foreach my $prerequisite (keys %$full_deps_hash) { + foreach my $dependent_module (keys %incompatibles) { + if (defined ${$$reversed_full_deps_hash{$prerequisite}}{$dependent_module}) { + remove_from_dependencies($prerequisite, $full_deps_hash); + delete $$full_deps_hash{$prerequisite}; +# print "Removed $prerequisite\n"; + last; + }; + }; + }; +}; + # # Removes projects which it is not necessary to build # in incompatible build @@ -2268,7 +2342,6 @@ sub prepare_incompatible_build { if (!defined $$deps_hash{$module}) { print_error("The module $initial_module is independent from $module\n"); } - delete $incompatibles{$module}; $incompatibles{$module} = $$deps_hash{$module}; delete $$deps_hash{$module}; } @@ -2286,8 +2359,8 @@ sub prepare_incompatible_build { @modules_built = keys %$deps_hash; %add_to_config = %$deps_hash; if ($prepare) { - if ((!defined $ENV{UPDATER}) || (defined $ENV{CWS_WORK_STAMP})) { - SourceConfig->new()->add_active_modules([keys %add_to_config], 0); + if ((!(defined $ENV{UPDATER} && (!defined $ENV{CWS_WORK_STAMP}))) || (defined $ENV{CWS_WORK_STAMP})) { + $source_config->add_active_modules([keys %add_to_config], 0); } clear_delivered(); } @@ -2332,21 +2405,6 @@ sub prepare_incompatible_build { # # Removes projects which it is not necessary to build -# with -with_branches switch -# -#sub prepare_build_from { -# my ($prj, $deps_hash); -# $deps_hash = shift; -# my %from_deps_hash = (); # hash of dependencies of the -from project -# get_parent_deps($build_from_with_branches, \%from_deps_hash); -# foreach $prj (keys %from_deps_hash) { -# delete $$deps_hash{$prj}; -# remove_from_dependencies($prj, $deps_hash); -# }; -#}; - -# -# Removes projects which it is not necessary to build # with --all:prj_name or --since switch # sub prepare_build_all_cont { @@ -2412,7 +2470,8 @@ sub get_list_of_modules { # }; }; -sub get_incomp_projects { +sub get_modules_passed { + my $hash_ref = shift; my $option = ''; while ($option = shift @ARGV) { if ($option =~ /^-+/) { @@ -2424,7 +2483,7 @@ sub get_incomp_projects { print_error("\'--from\' switch collision") if ($build_all_cont); $build_all_cont = $'; }; - $incompatibles{$option}++; + $$hash_ref{$option}++; }; }; }; diff --git a/solenv/bin/modules/RepositoryHelper.pm b/solenv/bin/modules/RepositoryHelper.pm new file mode 100644 index 000000000000..7677376be70e --- /dev/null +++ b/solenv/bin/modules/RepositoryHelper.pm @@ -0,0 +1,205 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +#************************************************************************* +# +# RepositoryHelper - Perl for working with repositories and underlying SCM +# +# usage: see below +# +#************************************************************************* + +package RepositoryHelper; + +use strict; + + +use Carp; +use Cwd qw (cwd); +use File::Basename; +#use File::Temp qw(tmpnam); + +my $debug = 0; + +##### profiling ##### + +##### ctor ##### + +sub new { + my $proto = shift; + my $class = ref($proto) || $proto; + my $initial_directory = shift; + if ($initial_directory) { + $initial_directory = Cwd::realpath($initial_directory); + } else { + if ( defined $ENV{PWD} ) { + $initial_directory = $ENV{PWD}; + } elsif (defined $ENV{_cwd}) { + $initial_directory = $ENV{_cwd}; + } else { + $initial_directory = cwd(); + }; + }; + my $self = {}; + $self->{INITIAL_DIRECTORY} = $initial_directory; + $self->{REPOSITORY_ROOT} = undef; + $self->{REPOSITORY_NAME} = undef; + $self->{SCM_NAME} = undef; + detect_repository($self); + bless($self, $class); + return $self; +} + +##### methods ##### +sub get_repository_root +{ + my $self = shift; + return $self->{REPOSITORY_ROOT}; +} + +sub get_initial_directory +{ + my $self = shift; + return $self->{INITIAL_DIRECTORY}; +} + +sub get_scm_name +{ + my $self = shift; + return$self->{SCM_NAME}; +} + +##### private methods ##### +sub search_for_hg { + my $self = shift; + my $hg_root; + my $scm_name = 'hg'; + if (open(COMMAND, "$scm_name root 2>&1 |")) { + foreach (<COMMAND>) { + next if (/^Not trusting file/); + chomp; + $hg_root = $_; + last; + }; + close COMMAND; + chomp $hg_root; + if ($hg_root !~ /There is no Mercurial repository here/) { + $self->{REPOSITORY_ROOT} = $hg_root; + $self->{SCM_NAME} = $scm_name; + return 1; + }; + }; + return 0; +}; + +sub search_via_build_lst { + my $self = shift; + my @possible_build_lists = ('build.lst', 'build.xlist'); # build lists names + my $previous_dir = ''; + my $rep_root_candidate = $self->{INITIAL_DIRECTORY}; + do { + foreach (@possible_build_lists) {# ('build.lst', 'build.xlist'); + if (-e $rep_root_candidate . '/prj/'.$_) { + $self->{REPOSITORY_ROOT} = File::Basename::dirname($rep_root_candidate); + return 1; + } elsif ($rep_root_candidate eq $previous_dir) { + return 0; + }; + }; + $previous_dir = $rep_root_candidate; + $rep_root_candidate = File::Basename::dirname(Cwd::realpath($rep_root_candidate)); + return 0 if (!$rep_root_candidate); + } + while (chdir "$rep_root_candidate"); +}; + +sub detect_repository { + my $self = shift; + return if (search_via_build_lst($self)); + chdir $self->{INITIAL_DIRECTORY}; + return if (search_for_hg($self)); + croak('Cannot determine source directory/repository for ' . $self->{INITIAL_DIRECTORY}); +}; + +##### finish ##### + +1; # needed by use or require + +__END__ + +=head1 NAME + +RepositoryHelper - Perl module for working with repositories and underlying SCM + +=head1 SYNOPSIS + + # example that will analyze sources and return the source root directory + + use RepositoryHelper; + + # Create a new instance: + $a = RepositoryHelper->new(); + + # Get repositories for the actual workspace: + $a->get_repository_root(); + + +=head1 DESCRIPTION + +RepositoryHelper is a perlPerl module for working with repositories and underlying SCM +in the database. + +Methods: + +RepositoryHelper::new() + +Creates a new instance of RepositoryHelper. Can be initialized by: some path which likely to belong to a repository, default - empty, the current dir will be taken. + +RepositoryHelper::get_repository_root() + +Returns the repository root, retrieved by SCM methods or on educated guess... + +RepositoryHelper::get_initial_directory() + +Returns full path to the initialistion directory. + +=head2 EXPORT + +RepositoryHelper::new() +RepositoryHelper::get_repository_root() +RepositoryHelper::get_scm_name() +RepositoryHelper::get_initial_directory() + +=head1 AUTHOR + +Vladimir Glazunov, vg@openoffice.org + +=head1 SEE ALSO + +perl(1). + +=cut diff --git a/solenv/bin/modules/SourceConfig.pm b/solenv/bin/modules/SourceConfig.pm index 9379b7764d0a..dfaa797d8f48 100644..100755 --- a/solenv/bin/modules/SourceConfig.pm +++ b/solenv/bin/modules/SourceConfig.pm @@ -38,10 +38,11 @@ package SourceConfig; use strict; use constant SOURCE_CONFIG_FILE_NAME => 'source_config'; -use constant SOURCE_CONFIG_VERSION => 2; +use constant SOURCE_CONFIG_VERSION => 3; use Carp; use Cwd; +use RepositoryHelper; use File::Basename; use File::Temp qw(tmpnam); @@ -75,8 +76,9 @@ sub new { $source_root .= '/..'; } } else { - $source_root = Cwd::realpath($ENV{SOURCE_ROOT_DIR}); + $source_root = $ENV{SOURCE_ROOT_DIR}; }; + $source_root = Cwd::realpath($source_root); $self->{SOURCE_ROOT} = $source_root; $self->{DEBUG} = 0; $self->{VERBOSE} = 0; @@ -94,14 +96,16 @@ sub new { $self->{WARNINGS} = []; $self->{REPORT_MESSAGES} = []; $self->{CONFIG_FILE_CONTENT} = []; - $self->{DEFAULT_REPOSITORY} = undef; if (defined $self->{USER_SOURCE_ROOT}) { ${$self->{REPOSITORIES}}{File::Basename::basename($self->{USER_SOURCE_ROOT})} = $self->{USER_SOURCE_ROOT}; - $self->{DEFAULT_REPOSITORY} = File::Basename::basename($self->{USER_SOURCE_ROOT}); }; $self->{SOURCE_CONFIG_FILE} = get_config_file($self->{SOURCE_ROOT}) if (!defined $self->{SOURCE_CONFIG_FILE}); $self->{SOURCE_CONFIG_DEFAULT} = $self->{SOURCE_ROOT} .'/'.SOURCE_CONFIG_FILE_NAME; + if (defined $self->{USER_SOURCE_ROOT}) { + ${$self->{REPOSITORIES}}{File::Basename::basename($self->{USER_SOURCE_ROOT})} = $self->{USER_SOURCE_ROOT}; + }; read_config_file($self); + get_module_paths($self); bless($self, $class); return $self; } @@ -118,6 +122,19 @@ sub get_repositories return sort keys %{$self->{REPOSITORIES}}; } +sub add_repository +{ + my $self = shift; + my $new_rep_path = shift; + $new_rep_path = Cwd::realpath($new_rep_path); + my $new_rep_name = File::Basename::basename($new_rep_path); + if (defined ${$self->{REPOSITORIES}}{$new_rep_name}) { + croak("Repository $new_rep_name is already defined!!"); + }; + ${$self->{REPOSITORIES}}{$new_rep_name} = $new_rep_path; + $self -> get_repository_module_paths($new_rep_name); +} + sub get_config_file_default_path { my $self = shift; return $self->{SOURCE_CONFIG_DEFAULT}; @@ -131,7 +148,6 @@ sub get_config_file_path { sub get_module_repository { my $self = shift; my $module = shift; - $self -> get_module_paths() if (!scalar keys %{$self->{MODULE_PATHS}}); if (defined ${$self->{MODULE_REPOSITORY}}{$module}) { return ${$self->{MODULE_REPOSITORY}}{$module}; } else { @@ -143,7 +159,6 @@ sub get_module_repository { sub get_module_path { my $self = shift; my $module = shift; - $self -> get_module_paths() if (!scalar keys %{$self->{MODULE_PATHS}}); if (defined ${$self->{MODULE_PATHS}}{$module}) { return ${$self->{MODULE_PATHS}}{$module}; } else { @@ -155,10 +170,17 @@ sub get_module_path { sub get_module_build_list { my $self = shift; my $module = shift; - $self -> get_buildlist_paths() if (!scalar keys %{$self->{MODULE_BUILD_LIST_PATHS}}); if (defined ${$self->{MODULE_BUILD_LIST_PATHS}}{$module}) { return ${$self->{MODULE_BUILD_LIST_PATHS}}{$module}; } else { + my @possible_build_lists = ('build.lst', 'build.xlist'); # build lists names + foreach (@possible_build_lists) { + my $possible_path = ${$self->{MODULE_PATHS}}{$module} . "/prj/$_"; + if (-e $possible_path) { + ${$self->{MODULE_BUILD_LIST_PATHS}}{$module} = $possible_path; + return $possible_path; + }; + }; Carp::cluck("No build list in module $module found!!\n") if ($self->{DEBUG}); return undef; }; @@ -168,7 +190,6 @@ sub get_all_modules { my $self = shift; my $module = shift; - $self -> get_module_paths() if (!scalar keys %{$self->{MODULE_PATHS}}); return sort keys %{$self->{MODULE_PATHS}}; }; @@ -178,7 +199,6 @@ sub get_active_modules if (scalar keys %{$self->{ACTIVATED_MODULES}}) { return sort keys %{$self->{ACTIVATED_MODULES}}; } - $self -> get_module_paths() if (!scalar keys %{$self->{MODULE_PATHS}}); return sort keys %{$self->{REAL_MODULES}}; } @@ -189,49 +209,42 @@ sub is_active if (scalar keys %{$self->{ACTIVATED_MODULES}}) { return exists ($self->{ACTIVATED_MODULES}{$module}); } - $self -> get_module_paths() if (!scalar keys %{$self->{MODULE_PATHS}}); return exists ($self->{REAL_MODULES}{$module}); } ##### private methods ##### -sub get_buildlist_paths { +sub get_repository_module_paths { my $self = shift; - $self -> get_module_paths() if (!scalar keys %{$self->{MODULE_PATHS}}); - my @possible_build_lists = ('build.lst', 'build.xlist'); # build lists names - foreach my $module (keys %{$self->{MODULE_PATHS}}) { - foreach (@possible_build_lists) { - my $possible_path = ${$self->{MODULE_PATHS}}{$module} . "/prj/$_"; - ${$self->{MODULE_BUILD_LIST_PATHS}}{$module} = $possible_path if (-e $possible_path); + my $repository = shift; + my $repository_path = ${$self->{REPOSITORIES}}{$repository}; + if (opendir DIRHANDLE, $repository_path) { + foreach my $module (readdir(DIRHANDLE)) { + next if (($module =~ /^\.+/) || (!-d "$repository_path/$module")); + my $module_entry = $module; + if (($module !~ s/\.lnk$//) && ($module !~ s/\.link$//)) { + $self->{REAL_MODULES}{$module}++; + } + my $possible_path = "$repository_path/$module_entry"; + if (-d $possible_path) { + if (defined ${$self->{MODULE_PATHS}}{$module}) { + close DIRHANDLE; + croak("Ambiguous paths for module $module: $possible_path and " . ${$self->{MODULE_PATHS}}{$module}); + }; + ${$self->{MODULE_PATHS}}{$module} = $possible_path; + ${$self->{MODULE_REPOSITORY}}{$module} = $repository; + } }; + close DIRHANDLE; + } else { + croak("Cannot read $repository_path repository content"); }; }; sub get_module_paths { my $self = shift; foreach my $repository (keys %{$self->{REPOSITORIES}}) { - my $repository_path = ${$self->{REPOSITORIES}}{$repository}; - if (opendir DIRHANDLE, $repository_path) { - foreach my $module (readdir(DIRHANDLE)) { - next if (($module =~ /^\.+/) || (!-d "$repository_path/$module")); - my $module_entry = $module; - if (($module !~ s/\.lnk$//) && ($module !~ s/\.link$//)) { - $self->{REAL_MODULES}{$module}++; - } - my $possible_path = "$repository_path/$module_entry"; - if (-d $possible_path) { - if (defined ${$self->{MODULE_PATHS}}{$module}) { - close DIRHANDLE; - croak("Ambiguous paths for module $module: $possible_path and " . ${$self->{MODULE_PATHS}}{$module}); - }; - ${$self->{MODULE_PATHS}}{$module} = $possible_path; - ${$self->{MODULE_REPOSITORY}}{$module} = $repository; - } - }; - close DIRHANDLE; - } else { - croak("Cannot read $_ repository content"); - }; + get_repository_module_paths($self, $repository); }; my @false_actives = (); foreach (keys %{$self->{ACTIVATED_MODULES}}) { @@ -248,31 +261,21 @@ sub get_config_file { return ''; }; -sub get_hg_root { +# +# Fallback - fallback repository is based on RepositoryHelper educated guess +# +sub get_fallback_repository { my $self = shift; - return $self->{USER_SOURCE_ROOT} if (defined $self->{USER_SOURCE_ROOT}); - my $hg_root; - if (open(COMMAND, "hg root 2>&1 |")) { - foreach (<COMMAND>) { - next if (/^Not trusting file/); - chomp; - $hg_root = $_; - last; - }; - close COMMAND; - chomp $hg_root; - if ($hg_root !~ /There is no Mercurial repository here/) { - return $hg_root; - }; - }; - croak('Cannot open find source_config and/or determine hg root directory for ' . cwd()); + my $repository_root = RepositoryHelper->new()->get_repository_root(); + ${$self->{REPOSITORIES}}{File::Basename::basename($repository_root)} = $repository_root; }; sub read_config_file { my $self = shift; if (!$self->{SOURCE_CONFIG_FILE}) { - my $repository_root = get_hg_root($self); - ${$self->{REPOSITORIES}}{File::Basename::basename($repository_root)} = $repository_root; + if (!defined $self->{USER_SOURCE_ROOT}) { + get_fallback_repository($self); + }; return; }; my $repository_section = 0; @@ -304,11 +307,9 @@ sub read_config_file { my $repository_source_path = $self->{SOURCE_ROOT} . "/$1"; if (defined $ENV{UPDMINOREXT}) { $repository_source_path .= $ENV{UPDMINOREXT}; - }; - if ((defined $self->{DEFAULT_REPOSITORY}) && (${$self->{REPOSITORIES}}{$self->{DEFAULT_REPOSITORY}} eq $repository_source_path)) { - delete ${$self->{REPOSITORIES}}{$self->{DEFAULT_REPOSITORY}}; - $self->{DEFAULT_REPOSITORY} = undef; - + if (defined ${$self->{REPOSITORIES}}{$1.$ENV{UPDMINOREXT}}) { + delete ${$self->{REPOSITORIES}}{$1.$ENV{UPDMINOREXT}}; + }; }; ${$self->{REPOSITORIES}}{$1} = $repository_source_path; ${$self->{ACTIVATED_REPOSITORIES}}{$1}++; @@ -323,9 +324,7 @@ sub read_config_file { }; close SOURCE_CONFIG_FILE; if (!scalar keys %{$self->{REPOSITORIES}}) { - # Fallback - default repository is the directory where is our module... - my $hg_root = get_hg_root($self); - ${$self->{REPOSITORIES}}{File::Basename::basename($hg_root)} = $hg_root; + get_fallback_repository($self); }; } else { croak('Cannot open ' . $self->{SOURCE_CONFIG_FILE} . 'for reading'); @@ -379,15 +378,18 @@ sub remove_activated_modules { sub add_active_repositories { my $self = shift; $self->{NEW_REPOSITORIES} = shift; - croak('Empty module list passed for adding to source_config') if (!scalar @{$self->{NEW_REPOSITORIES}}); + croak('Empty repository list passed for addition to source_config') if (!scalar @{$self->{NEW_REPOSITORIES}}); $self->{VERBOSE} = shift; + foreach (@{$self->{NEW_REPOSITORIES}}) { + $self->add_repository($_); + }; generate_config_file($self); }; sub add_active_modules { my $self = shift; $self->{NEW_MODULES} = shift; - croak('Empty module list passed for adding to source_config') if (!scalar @{$self->{NEW_MODULES}}); + croak('Empty module list passed for addition to source_config') if (!scalar @{$self->{NEW_MODULES}}); $self->{VERBOSE} = shift; generate_config_file($self); }; @@ -535,6 +537,8 @@ SourceConfig - Perl extension for parsing general info databases # Get repositories for the actual workspace: $a->get_repositories(); + # Add a repository new_repository for the actual workspace (via full path): + $a->add_repository(/DEV300/new_repository); =head1 DESCRIPTION @@ -559,6 +563,11 @@ SourceConfig::get_repositories() Returns sorted list of active repositories for the actual workspace +SourceConfig::add_repository(REPOSITORY_PATH) + +Adds a repository to the list of active repositories + + SourceConfig::get_active_modules() Returns a sorted list of active modules @@ -622,6 +631,7 @@ Removes all activated repositories from the source_config file SourceConfig::new() SourceConfig::get_version() SourceConfig::get_repositories() +SourceConfig::add_repository() SourceConfig::get_active_modules() SourceConfig::get_all_modules() SourceConfig::get_module_path($module) diff --git a/solenv/inc/minor.mk b/solenv/inc/minor.mk index a4d473a07001..f2458486a3b1 100644 --- a/solenv/inc/minor.mk +++ b/solenv/inc/minor.mk @@ -1,5 +1,5 @@ RSCVERSION=330 -RSCREVISION=330m3(Build:9519) -BUILD=9519 -LAST_MINOR=m3 +RSCREVISION=330m4(Build:9520) +BUILD=9520 +LAST_MINOR=m4 SOURCEVERSION=OOO330 diff --git a/starmath/inc/format.hxx b/starmath/inc/format.hxx index f632131d834f..4d13ea48185e 100644..100755 --- a/starmath/inc/format.hxx +++ b/starmath/inc/format.hxx @@ -109,6 +109,7 @@ class SmFormat : public SfxBroadcaster USHORT vSize[SIZ_END + 1]; USHORT vDist[DIS_END + 1]; SmHorAlign eHorAlign; + INT16 nGreekCharStyle; BOOL bIsTextmode, bScaleNormalBrackets; @@ -138,6 +139,9 @@ public: BOOL IsTextmode() const { return bIsTextmode; } void SetTextmode(BOOL bVal) { bIsTextmode = bVal; } + INT16 GetGreekCharStyle() const { return nGreekCharStyle; } + void SetGreekCharStyle(INT16 nVal) { nGreekCharStyle = nVal; } + BOOL IsScaleNormalBrackets() const { return bScaleNormalBrackets; } void SetScaleNormalBrackets(BOOL bVal) { bScaleNormalBrackets = bVal; } diff --git a/starmath/inc/node.hxx b/starmath/inc/node.hxx index 6ef89ea5ec1b..92c9d4621292 100644 --- a/starmath/inc/node.hxx +++ b/starmath/inc/node.hxx @@ -311,19 +311,10 @@ class SmTextNode : public SmVisibleNode USHORT nFontDesc; protected: - SmTextNode(SmNodeType eNodeType, const SmToken &rNodeToken, USHORT nFontDescP) - : SmVisibleNode(eNodeType, rNodeToken) - { - nFontDesc = nFontDescP; - } + SmTextNode(SmNodeType eNodeType, const SmToken &rNodeToken, USHORT nFontDescP ); public: - SmTextNode(const SmToken &rNodeToken, USHORT nFontDescP) - : SmVisibleNode(NTEXT, rNodeToken) - { - nFontDesc = nFontDescP; - } - + SmTextNode(const SmToken &rNodeToken, USHORT nFontDescP ); USHORT GetFontDesc() const { return nFontDesc; } void SetText(const XubString &rText) { aText = rText; } @@ -347,15 +338,13 @@ public: class SmSpecialNode : public SmTextNode { + bool bIsFromGreekSymbolSet; + protected: - SmSpecialNode(SmNodeType eNodeType, const SmToken &rNodeToken, USHORT _nFontDesc) - : SmTextNode(eNodeType, rNodeToken, _nFontDesc) - {} + SmSpecialNode(SmNodeType eNodeType, const SmToken &rNodeToken, USHORT _nFontDesc); public: - SmSpecialNode(const SmToken &rNodeToken) - : SmTextNode(NSPECIAL, rNodeToken, FNT_MATH) //! default Font nicht immer richtig - {} + SmSpecialNode(const SmToken &rNodeToken); virtual void Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell); virtual void Arrange(const OutputDevice &rDev, const SmFormat &rFormat); diff --git a/starmath/inc/symbol.hxx b/starmath/inc/symbol.hxx index 503859485095..51e8ad0b8642 100644 --- a/starmath/inc/symbol.hxx +++ b/starmath/inc/symbol.hxx @@ -38,7 +38,10 @@ #include <map> #include <vector> #include <set> +#include <functional> +#include <algorithm> +#include "unomodel.hxx" #include "utility.hxx" #include "smmod.hxx" @@ -133,6 +136,15 @@ typedef std::map< String, SmSym, lt_String > SymbolMap_t; // vector of pointers to the actual symbols in the above container typedef std::vector< const SmSym * > SymbolPtrVec_t; +struct lt_SmSymPtr : public std::binary_function< const SmSym *, const SmSym *, bool > +{ + bool operator() ( const SmSym *pSym1, const SmSym *pSym2 ) + { + return pSym1->GetCharacter() < pSym2->GetCharacter(); + } +}; + + class SmSymbolManager : public SfxListener { SymbolMap_t m_aSymbols; diff --git a/starmath/source/cfgitem.cxx b/starmath/source/cfgitem.cxx index bf62157a30d3..43c0fbe27dd0 100644 --- a/starmath/source/cfgitem.cxx +++ b/starmath/source/cfgitem.cxx @@ -42,7 +42,6 @@ using namespace com::sun::star; using namespace com::sun::star::uno; using namespace com::sun::star::beans; -#define A2OU(x) rtl::OUString::createFromAscii( x ) static const char* aRootName = "Office.Math"; @@ -127,6 +126,7 @@ static const char * aMathPropNames[] = static const char * aFormatPropNames[] = { "StandardFormat/Textmode", + "StandardFormat/GreekCharStyle", "StandardFormat/ScaleNormalBracket", "StandardFormat/HorizontalAlignment", "StandardFormat/BaseSize", @@ -994,6 +994,10 @@ void SmMathConfig::LoadFormat() if (pVal->hasValue() && (*pVal >>= bTmp)) pFormat->SetTextmode( bTmp ); ++pVal; + // StandardFormat/GreekCharStyle + if (pVal->hasValue() && (*pVal >>= nTmp16)) + pFormat->SetGreekCharStyle( nTmp16 ); + ++pVal; // StandardFormat/ScaleNormalBracket if (pVal->hasValue() && (*pVal >>= bTmp)) pFormat->SetScaleNormalBrackets( bTmp ); @@ -1069,6 +1073,8 @@ void SmMathConfig::SaveFormat() // StandardFormat/Textmode *pValue++ <<= (BOOL) pFormat->IsTextmode(); + // StandardFormat/GreekCharStyle + *pValue++ <<= (INT16) pFormat->GetGreekCharStyle(); // StandardFormat/ScaleNormalBracket *pValue++ <<= (BOOL) pFormat->IsScaleNormalBrackets(); // StandardFormat/HorizontalAlignment diff --git a/starmath/source/dialog.cxx b/starmath/source/dialog.cxx index 037f2fc1dff8..0dc58c8ed640 100644 --- a/starmath/source/dialog.cxx +++ b/starmath/source/dialog.cxx @@ -1485,6 +1485,7 @@ IMPL_LINK( SmSymbolDialog, GetClickHdl, Button *, EMPTYARG pButton ) { XubString aText ('%'); aText += pSym->GetName(); + aText += (sal_Unicode)' '; rViewSh.GetViewFrame()->GetDispatcher()->Execute( SID_INSERTTEXT, SFX_CALLMODE_STANDARD, @@ -1600,6 +1601,9 @@ BOOL SmSymbolDialog::SelectSymbolSet(const XubString &rSymbolSetName) aSymbolSetName = rSymbolSetName; aSymbolSet = rSymbolMgr.GetSymbolSet( aSymbolSetName ); + // sort symbols by Unicode position (useful for displaying Greek characters alphabetically) + std::sort( aSymbolSet.begin(), aSymbolSet.end(), lt_SmSymPtr() ); + aSymbolSetDisplay.SetSymbolSet( aSymbolSet ); if (aSymbolSet.size() > 0) SelectSymbol(0); diff --git a/starmath/source/document.cxx b/starmath/source/document.cxx index 49739af72972..ab1382b97879 100644 --- a/starmath/source/document.cxx +++ b/starmath/source/document.cxx @@ -131,9 +131,9 @@ void SmDocShell::SFX_NOTIFY(SfxBroadcaster&, const TypeId&, { case HINT_FORMATCHANGED: SetFormulaArranged(FALSE); - nModifyCount++; //! merkwuerdig... - // ohne dies wird die Grafik letztlich - // nicht geupdatet + + nModifyCount++; //! see comment for SID_GAPHIC_SM in SmDocShell::GetState + Repaint(); break; } @@ -211,11 +211,19 @@ void SmDocShell::SetFormat(SmFormat& rFormat) RTL_LOGFILE_CONTEXT( aLog, "starmath: SmDocShell::SetFormat" ); aFormat = rFormat; - SetFormulaArranged(FALSE); - SmViewShell *pViewSh = SmGetActiveView(); - if (pViewSh) - pViewSh->GetViewFrame()->GetBindings().Invalidate(SID_GAPHIC_SM); - SetModified(TRUE); + SetFormulaArranged( FALSE ); + SetModified( TRUE ); + + nModifyCount++; //! see comment for SID_GAPHIC_SM in SmDocShell::GetState + + // don't use SmGetActiveView since the view shell might not be active (0 pointer) + // if for example the Basic Macro dialog currently has the focus. Thus: + SfxViewFrame* pFrm = SfxViewFrame::GetFirst( this ); + while (pFrm) + { + pFrm->GetBindings().Invalidate(SID_GAPHIC_SM); + pFrm = SfxViewFrame::GetNext( *pFrm, this ); + } } String SmDocShell::GetAccessibleText() @@ -241,7 +249,7 @@ void SmDocShell::Parse() delete pTree; ReplaceBadChars(); pTree = aInterpreter.Parse(aText); - nModifyCount++; + nModifyCount++; //! see comment for SID_GAPHIC_SM in SmDocShell::GetState SetFormulaArranged( FALSE ); } @@ -1123,13 +1131,9 @@ void SmDocShell::Execute(SfxRequest& rReq) case SID_TEXT: { - const SfxStringItem& rItem = - (const SfxStringItem&)rReq.GetArgs()->Get(SID_TEXT); - + const SfxStringItem& rItem = (const SfxStringItem&)rReq.GetArgs()->Get(SID_TEXT); if (GetText() != rItem.GetValue()) - { SetText(rItem.GetValue()); - } } break; @@ -1222,6 +1226,10 @@ void SmDocShell::GetState(SfxItemSet &rSet) break; case SID_GAPHIC_SM: + //! very old (pre UNO) and ugly hack to invalidate the SmGraphicWindow. + //! If nModifyCount gets changed then the call below will implicitly notify + //! SmGraphicController::StateChanged and there the window gets invalidated. + //! Thus all the 'nModifyCount++' before invalidating this slot. rSet.Put(SfxInt16Item(SID_GAPHIC_SM, nModifyCount)); break; diff --git a/starmath/source/edit.cxx b/starmath/source/edit.cxx index f7093f9c3815..020376c05dfb 100644 --- a/starmath/source/edit.cxx +++ b/starmath/source/edit.cxx @@ -252,6 +252,7 @@ IMPL_LINK( SmEditWindow, ModifyTimerHdl, Timer *, EMPTYARG /*pTimer*/ ) SmModule *pp = SM_MOD(); if (pp->GetConfig()->IsAutoRedraw()) Flush(); + aModifyTimer.Stop(); return 0; } @@ -279,6 +280,7 @@ IMPL_LINK(SmEditWindow, CursorMoveTimerHdl, Timer *, EMPTYARG /*pTimer*/) aOldSelection = aNewSelection; } } + aCursorMoveTimer.Stop(); return 0; } @@ -435,7 +437,7 @@ void SmEditWindow::KeyInput(const KeyEvent& rKEvt) SmViewShell *pView = GetView(); if ( pView && !pView->KeyInput(rKEvt) ) { - /* fuert bei F1 (Hilfe) zum Zerstoeren von this! */ + /* fuert bei F1 (Hilfe) zum Zerstoeren von this! */ Flush(); if ( aModifyTimer.IsActive() ) aModifyTimer.Stop(); @@ -734,6 +736,9 @@ void SmEditWindow::InsertCommand(USHORT nCommand) pEditView->SetSelection(aSelection); } + aModifyTimer.Start(); + aCursorMoveTimer.Start(); + GrabFocus(); } } @@ -917,7 +922,11 @@ void SmEditWindow::InsertText(const String& Text) { DBG_ASSERT( pEditView, "EditView missing" ); if (pEditView) + { pEditView->InsertText(Text); + aModifyTimer.Start(); + aCursorMoveTimer.Start(); + } } void SmEditWindow::Flush() @@ -928,9 +937,11 @@ void SmEditWindow::Flush() pEditEngine->ClearModifyFlag(); SmViewShell *pViewSh = rCmdBox.GetView(); if (pViewSh) + { pViewSh->GetViewFrame()->GetDispatcher()->Execute( SID_TEXT, SFX_CALLMODE_STANDARD, new SfxStringItem(SID_TEXT, GetText()), 0L); + } } if (aCursorMoveTimer.IsActive()) diff --git a/starmath/source/format.cxx b/starmath/source/format.cxx index 18aaed4c841c..e92d1a5e97aa 100644 --- a/starmath/source/format.cxx +++ b/starmath/source/format.cxx @@ -112,8 +112,9 @@ SmFormat::SmFormat() { nVersion = SM_FMT_VERSION_NOW; - eHorAlign = AlignCenter; - bIsTextmode = bScaleNormalBrackets = FALSE; + eHorAlign = AlignCenter; + nGreekCharStyle = 0; + bIsTextmode = bScaleNormalBrackets = FALSE; vSize[SIZ_TEXT] = 100; vSize[SIZ_INDEX] = 60; @@ -191,6 +192,7 @@ SmFormat & SmFormat::operator = (const SmFormat &rFormat) SetVersion (rFormat.GetVersion()); SetHorAlign(rFormat.GetHorAlign()); SetTextmode(rFormat.IsTextmode()); + SetGreekCharStyle(rFormat.GetGreekCharStyle()); SetScaleNormalBrackets(rFormat.IsScaleNormalBrackets()); USHORT i; @@ -212,6 +214,7 @@ BOOL SmFormat::operator == (const SmFormat &rFormat) const { BOOL bRes = aBaseSize == rFormat.aBaseSize && eHorAlign == rFormat.eHorAlign && + nGreekCharStyle == rFormat.nGreekCharStyle && bIsTextmode == rFormat.bIsTextmode && bScaleNormalBrackets == rFormat.bScaleNormalBrackets; diff --git a/starmath/source/makefile.mk b/starmath/source/makefile.mk index 596060397e18..a409e55d2462 100644 --- a/starmath/source/makefile.mk +++ b/starmath/source/makefile.mk @@ -36,6 +36,8 @@ LIBTARGET=NO # --- Settings ----------------------------------------------------- +ENABLE_EXCEPTIONS=TRUE + .INCLUDE : settings.mk # --- Files -------------------------------------------------------- @@ -84,24 +86,6 @@ SLOFILES = \ $(SLO1FILES) \ $(SLO2FILES) -EXCEPTIONSFILES = \ - $(SLO)$/register.obj \ - $(SLO)$/accessibility.obj \ - $(SLO)$/cfgitem.obj \ - $(SLO)$/dialog.obj \ - $(SLO)$/document.obj \ - $(SLO)$/node.obj \ - $(SLO)$/parse.obj \ - $(SLO)$/mathmlimport.obj \ - $(SLO)$/mathmlexport.obj \ - $(SLO)$/mathtype.obj \ - $(SLO)$/smdll.obj \ - $(SLO)$/view.obj \ - $(SLO)$/unomodel.obj \ - $(SLO)$/smdetect.obj \ - $(SLO)$/symbol.obj \ - $(SLO)$/unodoc.obj - LIB1TARGET = \ $(SLB)$/$(TARGET).lib diff --git a/starmath/source/mathmlexport.cxx b/starmath/source/mathmlexport.cxx index 36eb9d3884b5..bec69eb01b95 100644 --- a/starmath/source/mathmlexport.cxx +++ b/starmath/source/mathmlexport.cxx @@ -75,7 +75,6 @@ #include <memory> #include "mathmlexport.hxx" -#include "mathtype.hxx" #include <starmath.hrc> #include <unomodel.hxx> #include <document.hxx> diff --git a/starmath/source/mathmlimport.cxx b/starmath/source/mathmlimport.cxx index dd90caaf6d45..36c009757eac 100644 --- a/starmath/source/mathmlimport.cxx +++ b/starmath/source/mathmlimport.cxx @@ -71,7 +71,6 @@ one go*/ #include <memory> #include "mathmlimport.hxx" -#include "mathtype.hxx" #include <starmath.hrc> #include <unomodel.hxx> #include <document.hxx> diff --git a/starmath/source/node.cxx b/starmath/source/node.cxx index 4601b2f84fec..b986a046b205 100644..100755 --- a/starmath/source/node.cxx +++ b/starmath/source/node.cxx @@ -28,7 +28,14 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_starmath.hxx" -#define APPEND(str,ascii) str.AppendAscii(RTL_CONSTASCII_STRINGPARAM(ascii)) +#include "node.hxx" +#include "rect.hxx" +#include "symbol.hxx" +#include "smmod.hxx" +#include "document.hxx" +#include "view.hxx" +#include "mathtype.hxx" + #include <tools/gen.hxx> #include <tools/fract.hxx> #include <rtl/math.hxx> @@ -38,23 +45,14 @@ #include <vcl/outdev.hxx> #include <sfx2/module.hxx> - -#include "node.hxx" -#include <rect.hxx> -#include "symbol.hxx" -#include "smmod.hxx" -#include <document.hxx> -#include <view.hxx> -#ifndef _MATHTYPE_HXX -#include "mathtype.hxx" -#endif - #include <math.h> #include <float.h> // define this to draw rectangles for debugging //#define SM_RECT_DEBUG +#define APPEND(str,ascii) str.AppendAscii(RTL_CONSTASCII_STRINGPARAM(ascii)) + //////////////////////////////////////// // SmTmpDevice // Allows for font and color changes. The original settings will be restored @@ -2355,6 +2353,20 @@ void SmRectangleNode::Draw(OutputDevice &rDev, const Point &rPosition) const /**************************************************************************/ +SmTextNode::SmTextNode( SmNodeType eNodeType, const SmToken &rNodeToken, USHORT nFontDescP ) : + SmVisibleNode(eNodeType, rNodeToken) +{ + nFontDesc = nFontDescP; +} + + +SmTextNode::SmTextNode( const SmToken &rNodeToken, USHORT nFontDescP ) : + SmVisibleNode(NTEXT, rNodeToken) +{ + nFontDesc = nFontDescP; +} + + void SmTextNode::Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell) { SmNode::Prepare(rFormat, rDocShell); @@ -2798,6 +2810,36 @@ void SmAttributNode::CreateTextFromNode(String &rText) /**************************************************************************/ +bool lcl_IsFromGreekSymbolSet( const String &rTokenText ) +{ + bool bRes = false; + + // valid symbol name needs to have a '%' at pos 0 and at least an additonal char + if (rTokenText.Len() > 2 && rTokenText.GetBuffer()[0] == (sal_Unicode)'%') + { + String aName( rTokenText.Copy(1) ); + SmSym *pSymbol = SM_MOD()->GetSymbolManager().GetSymbolByName( aName ); + if (pSymbol && GetExportSymbolSetName( pSymbol->GetSymbolSetName() ).EqualsAscii( "Greek" ) ) + bRes = true; + } + + return bRes; +} + + +SmSpecialNode::SmSpecialNode(SmNodeType eNodeType, const SmToken &rNodeToken, USHORT _nFontDesc) : + SmTextNode(eNodeType, rNodeToken, _nFontDesc) +{ + bIsFromGreekSymbolSet = lcl_IsFromGreekSymbolSet( rNodeToken.aText ); +} + + +SmSpecialNode::SmSpecialNode(const SmToken &rNodeToken) : + SmTextNode(NSPECIAL, rNodeToken, FNT_MATH) //! default Font nicht immer richtig +{ + bIsFromGreekSymbolSet = lcl_IsFromGreekSymbolSet( rNodeToken.aText ); +} + void SmSpecialNode::Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell) { @@ -2806,7 +2848,8 @@ void SmSpecialNode::Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell const SmSym *pSym; SmModule *pp = SM_MOD(); - if (NULL != (pSym = pp->GetSymbolManager().GetSymbolByName(GetToken().aText))) + String aName( GetToken().aText.Copy(1) ); + if (NULL != (pSym = pp->GetSymbolManager().GetSymbolByName( aName ))) { SetText( pSym->GetCharacter() ); GetFont() = pSym->GetFace(); @@ -2832,6 +2875,33 @@ void SmSpecialNode::Prepare(const SmFormat &rFormat, const SmDocShell &rDocShell SetAttribut(ATTR_BOLD); Flags() |= FLG_FONT; + + if (bIsFromGreekSymbolSet) + { + DBG_ASSERT( GetText().Len() == 1, "a symbol should only consist of 1 char!" ); + bool bItalic = false; + INT16 nStyle = rFormat.GetGreekCharStyle(); + DBG_ASSERT( nStyle >= 0 && nStyle <= 2, "unexpected value for GreekCharStyle" ); + if (nStyle == 1) + bItalic = true; + else if (nStyle == 2) + { + String aTmp( GetText() ); + if (aTmp.Len() > 0) + { + const sal_Unicode cUppercaseAlpha = 0x0391; + const sal_Unicode cUppercaseOmega = 0x03A9; + sal_Unicode cChar = aTmp.GetBuffer()[0]; + // uppercase letters should be straight and lowercase letters italic + bItalic = !(cUppercaseAlpha <= cChar && cChar <= cUppercaseOmega); + } + } + + if (bItalic) + Attributes() |= ATTR_ITALIC; + else + Attributes() &= ~ATTR_ITALIC;; + } }; diff --git a/starmath/source/parse.cxx b/starmath/source/parse.cxx index 15971d0c38af..d12f3df07400 100755 --- a/starmath/source/parse.cxx +++ b/starmath/source/parse.cxx @@ -741,14 +741,14 @@ void SmParser::NextToken() CurToken.nLevel = 5; CurToken.aText = String(); CurToken.nRow = sal::static_int_cast< xub_StrLen >(Row); - CurToken.nCol = nTmpStart - ColOff + 1; + CurToken.nCol = nTmpStart - ColOff; if (aTmpRes.TokenType & KParseType::IDENTNAME) { xub_StrLen n = sal::static_int_cast< xub_StrLen >(aTmpRes.EndPos - nTmpStart); CurToken.eType = TSPECIAL; - CurToken.aText = BufferString.Copy( sal::static_int_cast< xub_StrLen >(nTmpStart), n ); + CurToken.aText = BufferString.Copy( sal::static_int_cast< xub_StrLen >(nTmpStart-1), n+1 ); DBG_ASSERT( aTmpRes.EndPos > rnEndPos, "empty identifier" ); diff --git a/starmath/source/symbol.cxx b/starmath/source/symbol.cxx index e248f9726629..5208ce3644ce 100644 --- a/starmath/source/symbol.cxx +++ b/starmath/source/symbol.cxx @@ -290,6 +290,28 @@ void SmSymbolManager::Load() DBG_ERROR( "no symbol set found" ); m_bModified = false; } + + // now add a %i... symbol to the 'iGreek' set for every symbol found in the 'Greek' set. + SmLocalizedSymbolData aLocalizedData; + const String aGreekSymbolSetName( aLocalizedData.GetUiSymbolSetName( A2OU("Greek") ) ); + const SymbolPtrVec_t aGreekSymbols( GetSymbolSet( aGreekSymbolSetName ) ); + String aSymbolSetName( (sal_Unicode) 'i' ); + aSymbolSetName += aGreekSymbolSetName; + size_t nSymbols = aGreekSymbols.size(); + for (size_t i = 0; i < nSymbols; ++i) + { + // make the new symbol a copy but with ITALIC_NORMAL, and add it to iGreek + const SmSym &rSym = *aGreekSymbols[i]; + Font aFont( rSym.GetFace() ); + DBG_ASSERT( aFont.GetItalic() == ITALIC_NONE, "expected Font with ITALIC_NONE, failed." ); + aFont.SetItalic( ITALIC_NORMAL ); + String aSymbolName( (sal_Unicode)'i' ); + aSymbolName += rSym.GetName(); + SmSym aSymbol( aSymbolName, aFont, rSym.GetCharacter(), + aSymbolSetName, TRUE /*bIsPredefined*/ ); + + AddOrReplaceSymbol( aSymbol ); + } } void SmSymbolManager::Save() @@ -314,10 +336,21 @@ void SmSymbolManager::Save() } DBG_ASSERT(pSym - pSymbols == nSaveSymbolCnt, "wrong number of symbols" ); #endif + + // prepare to skip symbols from iGreek on saving + SmLocalizedSymbolData aLocalizedData; + String aSymbolSetName( (sal_Unicode) 'i' ); + aSymbolSetName += aLocalizedData.GetUiSymbolSetName( A2OU("Greek") ); + SymbolPtrVec_t aTmp( GetSymbols() ); std::vector< SmSym > aSymbols; for (size_t i = 0; i < aTmp.size(); ++i) - aSymbols.push_back( *aTmp[i] ); + { + // skip symbols from iGreek set since those symbols always get added + // by computational means in SmSymbolManager::Load + if (aTmp[i]->GetSymbolSetName() != aSymbolSetName) + aSymbols.push_back( *aTmp[i] ); + } rCfg.SetSymbols( aSymbols ); #if 0 delete [] pSymbols; diff --git a/starmath/source/types.cxx b/starmath/source/types.cxx index a861db5a0c79..e63d46c79e9b 100644 --- a/starmath/source/types.cxx +++ b/starmath/source/types.cxx @@ -38,7 +38,7 @@ sal_Unicode ConvertMathPrivateUseAreaToUnicode( sal_Unicode cChar ) if (IsInPrivateUseArea( cChar )) { DBG_ASSERT( 0, "Error: private use area characters should no longer be in use!" ); - cRes = (sal_Unicode) '&'; // just some character that should easily be notice as odd in the context + cRes = (sal_Unicode) '@'; // just some character that should easily be notice as odd in the context } return cRes; } diff --git a/starmath/source/unomodel.cxx b/starmath/source/unomodel.cxx index 013831f6e44e..9d008f326d2f 100755 --- a/starmath/source/unomodel.cxx +++ b/starmath/source/unomodel.cxx @@ -203,6 +203,7 @@ enum SmModelPropertyHandles HANDLE_RELATIVE_FONT_HEIGHT_OPERATORS, HANDLE_RELATIVE_FONT_HEIGHT_LIMITS, HANDLE_IS_TEXT_MODE, + HANDLE_GREEK_CHAR_STYLE, HANDLE_ALIGNMENT, HANDLE_RELATIVE_SPACING, HANDLE_RELATIVE_LINE_SPACING, @@ -273,6 +274,7 @@ PropertySetInfo * lcl_createModelPropertyInfo () { RTL_CONSTASCII_STRINGPARAM( "Formula" ), HANDLE_FORMULA , &::getCppuType((const OUString*)0), PROPERTY_NONE, 0}, { RTL_CONSTASCII_STRINGPARAM( "IsScaleAllBrackets" ), HANDLE_IS_SCALE_ALL_BRACKETS , &::getBooleanCppuType(), PROPERTY_NONE, 0}, { RTL_CONSTASCII_STRINGPARAM( "IsTextMode" ), HANDLE_IS_TEXT_MODE , &::getBooleanCppuType(), PROPERTY_NONE, 0}, + { RTL_CONSTASCII_STRINGPARAM( "GreekCharStyle" ), HANDLE_GREEK_CHAR_STYLE, &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, 0}, { RTL_CONSTASCII_STRINGPARAM( "LeftMargin" ), HANDLE_LEFT_MARGIN , &::getCppuType((const sal_Int16*)0), PROPERTY_NONE, DIS_LEFTSPACE }, { RTL_CONSTASCII_STRINGPARAM( "PrinterName" ), HANDLE_PRINTER_NAME , &::getCppuType((const OUString*)0), PROPERTY_NONE, 0 }, { RTL_CONSTASCII_STRINGPARAM( "PrinterSetup" ), HANDLE_PRINTER_SETUP , &::getCppuType((const Sequence < sal_Int8 >*)0), PROPERTY_NONE, 0 }, @@ -593,6 +595,16 @@ void SmModel::_setPropertyValues(const PropertyMapEntry** ppEntries, const Any* } break; + case HANDLE_GREEK_CHAR_STYLE : + { + sal_Int16 nVal = 0; + *pValues >>= nVal; + if (nVal < 0 || nVal > 2) + throw IllegalArgumentException(); + aFormat.SetGreekCharStyle( nVal ); + } + break; + case HANDLE_ALIGNMENT : { // SmHorAlign uses the same values as HorizontalAlignment @@ -824,6 +836,10 @@ void SmModel::_getPropertyValues( const PropertyMapEntry **ppEntries, Any *pValu } break; + case HANDLE_GREEK_CHAR_STYLE : + *pValue <<= (sal_Int16)aFormat.GetGreekCharStyle(); + break; + case HANDLE_ALIGNMENT : // SmHorAlign uses the same values as HorizontalAlignment *pValue <<= (sal_Int16)aFormat.GetHorAlign(); diff --git a/starmath/source/view.cxx b/starmath/source/view.cxx index 886d409931b2..0087595703ca 100755 --- a/starmath/source/view.cxx +++ b/starmath/source/view.cxx @@ -1545,8 +1545,7 @@ void SmViewShell::Execute(SfxRequest& rReq) case SID_INSERTTEXT: { const SfxStringItem& rItem = - (const SfxStringItem&)rReq.GetArgs()->Get(SID_INSERTTEXT); - + (const SfxStringItem&)rReq.GetArgs()->Get(SID_INSERTTEXT); if (pWin) pWin->InsertText(rItem.GetValue()); break; diff --git a/sw/source/core/edit/edlingu.cxx b/sw/source/core/edit/edlingu.cxx index d99293071048..c9ab4a591383 100644 --- a/sw/source/core/edit/edlingu.cxx +++ b/sw/source/core/edit/edlingu.cxx @@ -1318,8 +1318,12 @@ void SwEditShell::MoveContinuationPosToEndOfCheckedSentence() void SwEditShell::ApplyChangedSentence(const ::svx::SpellPortions& rNewPortions, bool bRecheck) { + // Note: rNewPortions.size() == 0 is valid and happens when the whole + // sentence got removed in the dialog + ASSERT( pSpellIter, "SpellIter missing" ); - if(pSpellIter) + if(pSpellIter && + pSpellIter->GetLastPortions().size() > 0) // no portions -> no text to be changed { const SpellPortions& rLastPortions = pSpellIter->GetLastPortions(); const SpellContentPositions rLastPositions = pSpellIter->GetLastPositions(); @@ -1330,9 +1334,6 @@ void SwEditShell::ApplyChangedSentence(const ::svx::SpellPortions& rNewPortions, // iterate over the new portions, beginning at the end to take advantage of the previously // saved content positions - if(!rLastPortions.size()) - return; - pDoc->StartUndo( UNDO_OVERWRITE, NULL ); StartAction(); @@ -1344,6 +1345,10 @@ void SwEditShell::ApplyChangedSentence(const ::svx::SpellPortions& rNewPortions, sal_uInt32 nRedlinePortions = lcl_CountRedlines(rLastPortions); if((rLastPortions.size() - nRedlinePortions) == rNewPortions.size()) { + DBG_ASSERT( rNewPortions.size() > 0, "rNewPortions should not be empty here" ); + DBG_ASSERT( rLastPortions.size() > 0, "rLastPortions should not be empty here" ); + DBG_ASSERT( rLastPositions.size() > 0, "rLastPositions should not be empty here" ); + //the simple case: the same number of elements on both sides //each changed element has to be applied to the corresponding source element svx::SpellPortions::const_iterator aCurrentNewPortion = rNewPortions.end(); @@ -1357,8 +1362,17 @@ void SwEditShell::ApplyChangedSentence(const ::svx::SpellPortions& rNewPortions, //jump over redline portions while(aCurrentOldPortion->bIsHidden) { - --aCurrentOldPortion; - --aCurrentOldPosition; + if (aCurrentOldPortion != rLastPortions.begin() && + aCurrentOldPosition != rLastPositions.begin()) + { + --aCurrentOldPortion; + --aCurrentOldPosition; + } + else + { + DBG_ASSERT( 0, "ApplyChangedSentence: iterator positions broken" ); + break; + } } if ( !pCrsr->HasMark() ) pCrsr->SetMark(); @@ -1398,6 +1412,8 @@ void SwEditShell::ApplyChangedSentence(const ::svx::SpellPortions& rNewPortions, } else { + DBG_ASSERT( rLastPositions.size() > 0, "rLastPositions should not be empty here" ); + //select the complete sentence SpellContentPositions::const_iterator aCurrentEndPosition = rLastPositions.end(); --aCurrentEndPosition; diff --git a/sw/source/filter/ww8/ww8par.cxx b/sw/source/filter/ww8/ww8par.cxx index ba932c33c479..24f36b047a4e 100644 --- a/sw/source/filter/ww8/ww8par.cxx +++ b/sw/source/filter/ww8/ww8par.cxx @@ -1857,7 +1857,7 @@ void SwWW8ImplReader::Read_HdFt(bool bIsTitle, int nSect, bool wwSectionManager::SectionIsProtected(const wwSection &rSection) const { - return (!rSection.IsNotProtected()); + return (mrReader.pWwFib->fReadOnlyRecommended && !rSection.IsNotProtected()); } void wwSectionManager::SetHdFt(wwSection &rSection, int nSect, diff --git a/sw/source/filter/ww8/ww8par.hxx b/sw/source/filter/ww8/ww8par.hxx index 025cf0f588f4..c87035f208a1 100644 --- a/sw/source/filter/ww8/ww8par.hxx +++ b/sw/source/filter/ww8/ww8par.hxx @@ -1164,6 +1164,7 @@ private: bool GetFontParams(USHORT, FontFamily&, String&, FontPitch&, rtl_TextEncoding&); bool SetNewFontAttr(USHORT nFCode, bool bSetEnums, USHORT nWhich); + USHORT CorrectResIdForCharset(CharSet nCharSet, USHORT nWhich); void ResetCharSetVars(); void ResetCJKCharSetVars(); diff --git a/sw/source/filter/ww8/ww8par6.cxx b/sw/source/filter/ww8/ww8par6.cxx index 1588944e179b..b298f3721b00 100644 --- a/sw/source/filter/ww8/ww8par6.cxx +++ b/sw/source/filter/ww8/ww8par6.cxx @@ -3551,6 +3551,23 @@ bool SwWW8ImplReader::GetFontParams( USHORT nFCode, FontFamily& reFamily, return true; } +USHORT SwWW8ImplReader::CorrectResIdForCharset(CharSet nCharSet, USHORT nWhich) +{ + USHORT nResult = 0; + + switch (nCharSet) { + case RTL_TEXTENCODING_MS_932: + nResult = RES_CHRATR_CJK_FONT; + break; + + default: + nResult = nWhich; + break; + } + + return nResult; +} + bool SwWW8ImplReader::SetNewFontAttr(USHORT nFCode, bool bSetEnums, USHORT nWhich) { @@ -3600,6 +3617,8 @@ bool SwWW8ImplReader::SetNewFontAttr(USHORT nFCode, bool bSetEnums, SvxFontItem aFont( eFamily, aName, aEmptyStr, ePitch, eDstCharSet, nWhich); + nWhich = CorrectResIdForCharset(eSrcCharSet, nWhich); + if( bSetEnums ) { if( pAktColl ) // StyleDef diff --git a/sw/uiconfig/sglobal/toolbar/findbar.xml b/sw/uiconfig/sglobal/toolbar/findbar.xml index 9ef9d8a1a78f..078c0fc5bed5 100644 --- a/sw/uiconfig/sglobal/toolbar/findbar.xml +++ b/sw/uiconfig/sglobal/toolbar/findbar.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> <toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink" toolbar:id="toolbar"> - <toolbar:toolbaritem xlink:href=".uno:FindText" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:DownSearch" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:UpSearch" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:SearchDialog" toolbar:text="Find & Replace" toolbar:visible="false" toolbar:helpid="helpid:100105"/> + <toolbar:toolbaritem xlink:href=".uno:FindText"/> + <toolbar:toolbaritem xlink:href=".uno:DownSearch"/> + <toolbar:toolbaritem xlink:href=".uno:UpSearch"/> + <toolbar:toolbaritem xlink:href=".uno:SearchDialog" toolbar:visible="false"/> </toolbar:toolbar> diff --git a/sw/uiconfig/sweb/toolbar/findbar.xml b/sw/uiconfig/sweb/toolbar/findbar.xml index 9ef9d8a1a78f..0338d3156195 100644 --- a/sw/uiconfig/sweb/toolbar/findbar.xml +++ b/sw/uiconfig/sweb/toolbar/findbar.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> <toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink" toolbar:id="toolbar"> - <toolbar:toolbaritem xlink:href=".uno:FindText" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:DownSearch" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:UpSearch" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:SearchDialog" toolbar:text="Find & Replace" toolbar:visible="false" toolbar:helpid="helpid:100105"/> + <toolbar:toolbaritem xlink:href=".uno:FindText"/> + <toolbar:toolbaritem xlink:href=".uno:DownSearch"/> + <toolbar:toolbaritem xlink:href=".uno:UpSearch"/> + <toolbar:toolbaritem xlink:href=".uno:SearchDialog" toolbar:visible="false"/> </toolbar:toolbar> diff --git a/sw/uiconfig/swriter/toolbar/findbar.xml b/sw/uiconfig/swriter/toolbar/findbar.xml index 9ef9d8a1a78f..0338d3156195 100644 --- a/sw/uiconfig/swriter/toolbar/findbar.xml +++ b/sw/uiconfig/swriter/toolbar/findbar.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> <toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink" toolbar:id="toolbar"> - <toolbar:toolbaritem xlink:href=".uno:FindText" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:DownSearch" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:UpSearch" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:SearchDialog" toolbar:text="Find & Replace" toolbar:visible="false" toolbar:helpid="helpid:100105"/> + <toolbar:toolbaritem xlink:href=".uno:FindText"/> + <toolbar:toolbaritem xlink:href=".uno:DownSearch"/> + <toolbar:toolbaritem xlink:href=".uno:UpSearch"/> + <toolbar:toolbaritem xlink:href=".uno:SearchDialog" toolbar:visible="false"/> </toolbar:toolbar> diff --git a/sw/uiconfig/swxform/toolbar/findbar.xml b/sw/uiconfig/swxform/toolbar/findbar.xml index 9ef9d8a1a78f..0338d3156195 100644 --- a/sw/uiconfig/swxform/toolbar/findbar.xml +++ b/sw/uiconfig/swxform/toolbar/findbar.xml @@ -1,8 +1,8 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE toolbar:toolbar PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "toolbar.dtd"> <toolbar:toolbar xmlns:toolbar="http://openoffice.org/2001/toolbar" xmlns:xlink="http://www.w3.org/1999/xlink" toolbar:id="toolbar"> - <toolbar:toolbaritem xlink:href=".uno:FindText" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:DownSearch" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:UpSearch" toolbar:helpid="helpid:100105" /> - <toolbar:toolbaritem xlink:href=".uno:SearchDialog" toolbar:text="Find & Replace" toolbar:visible="false" toolbar:helpid="helpid:100105"/> + <toolbar:toolbaritem xlink:href=".uno:FindText"/> + <toolbar:toolbaritem xlink:href=".uno:DownSearch"/> + <toolbar:toolbaritem xlink:href=".uno:UpSearch"/> + <toolbar:toolbaritem xlink:href=".uno:SearchDialog" toolbar:visible="false"/> </toolbar:toolbar> diff --git a/vcl/aqua/source/gdi/salprn.cxx b/vcl/aqua/source/gdi/salprn.cxx index 1c0401f769b5..ff4edcbf83f9 100644 --- a/vcl/aqua/source/gdi/salprn.cxx +++ b/vcl/aqua/source/gdi/salprn.cxx @@ -445,7 +445,7 @@ ULONG AquaSalInfoPrinter::GetCapabilities( const ImplJobSetup* i_pSetupData, USH case PRINTER_CAPABILITIES_COPIES: return 0xffff; case PRINTER_CAPABILITIES_COLLATECOPIES: - return 0; + return 0xffff; case PRINTER_CAPABILITIES_SETORIENTATION: return 1; case PRINTER_CAPABILITIES_SETDUPLEX: @@ -634,6 +634,8 @@ BOOL AquaSalInfoPrinter::StartJob( const String* i_pFileName, } [pPrintDict setObject: [[NSNumber numberWithInt: nCopies] autorelease] forKey: NSPrintCopies]; + if( nCopies > 1 ) + [pPrintDict setObject: [[NSNumber numberWithBool: pPrinter->IsCollateCopy()] autorelease] forKey: NSPrintMustCollate]; [pPrintDict setObject: [[NSNumber numberWithBool: YES] autorelease] forKey: NSPrintDetailedErrorReporting]; [pPrintDict setObject: [[NSNumber numberWithInt: 1] autorelease] forKey: NSPrintFirstPage]; // #i103253# weird: for some reason, autoreleasing the value below like the others above diff --git a/vcl/source/gdi/print3.cxx b/vcl/source/gdi/print3.cxx index 191f8f26dc75..0aeb928856fc 100644..100755 --- a/vcl/source/gdi/print3.cxx +++ b/vcl/source/gdi/print3.cxx @@ -594,12 +594,20 @@ bool Printer::StartJob( const rtl::OUString& i_rJobName, boost::shared_ptr<vcl:: i_pController->jobStarted(); int nJobs = 1; - int nRepeatCount = bUserCopy ? mnCopyCount : 1; + int nOuterRepeatCount = 1; + int nInnerRepeatCount = 1; + if( bUserCopy ) + { + if( mbCollateCopy ) + nOuterRepeatCount = mnCopyCount; + else + nInnerRepeatCount = mnCopyCount; + } if( bSinglePrintJobs ) { nJobs = mnCopyCount; nCopies = 1; - nRepeatCount = 1; + nOuterRepeatCount = nInnerRepeatCount = 1; } for( int nJobIteration = 0; nJobIteration < nJobs; nJobIteration++ ) @@ -616,13 +624,21 @@ bool Printer::StartJob( const rtl::OUString& i_rJobName, boost::shared_ptr<vcl:: mbJobActive = TRUE; i_pController->createProgressDialog(); int nPages = i_pController->getFilteredPageCount(); - for( int nIteration = 0; nIteration < nRepeatCount; nIteration++ ) + for( int nOuterIteration = 0; nOuterIteration < nOuterRepeatCount; nOuterIteration++ ) { for( int nPage = 0; nPage < nPages; nPage++ ) { - if( nPage == nPages-1 && nIteration == nRepeatCount-1 && nJobIteration == nJobs-1 ) - i_pController->setLastPage( sal_True ); - i_pController->printFilteredPage( nPage ); + for( int nInnerIteration = 0; nInnerIteration < nInnerRepeatCount; nInnerIteration++ ) + { + if( nPage == nPages-1 && + nOuterIteration == nOuterRepeatCount-1 && + nInnerIteration == nInnerRepeatCount-1 && + nJobIteration == nJobs-1 ) + { + i_pController->setLastPage( sal_True ); + } + i_pController->printFilteredPage( nPage ); + } } // FIXME: duplex ? } diff --git a/vcl/source/window/printdlg.cxx b/vcl/source/window/printdlg.cxx index 52f54db0e50e..d0fae33acf3b 100644 --- a/vcl/source/window/printdlg.cxx +++ b/vcl/source/window/printdlg.cxx @@ -498,8 +498,10 @@ void PrintDialog::NUpTabPage::showAdvancedControls( bool i_bShow ) void PrintDialog::NUpTabPage::setupLayout() { - Size aBorder( LogicToPixel( Size( 5, 5 ), MapMode( MAP_APPFONT ) ) ); - long nIndent = 3*aBorder.Width(); + Size aBorder( LogicToPixel( Size( 6, 6 ), MapMode( MAP_APPFONT ) ) ); + /* According to OOo style guide, the horizontal indentation of child + elements to their parent element should always be 6 map units. */ + long nIndent = aBorder.Width(); maLayout.setParentWindow( this ); maLayout.setOuterBorder( aBorder.Width() ); diff --git a/writerfilter/inc/dmapper/DomainMapper.hxx b/writerfilter/inc/dmapper/DomainMapper.hxx index d119e0e84312..99602ceab924 100644 --- a/writerfilter/inc/dmapper/DomainMapper.hxx +++ b/writerfilter/inc/dmapper/DomainMapper.hxx @@ -145,8 +145,6 @@ private: rtl::OUString getBracketStringFromEnum(const sal_Int32 nIntValue, const bool bIsPrefix = true); com::sun::star::style::TabAlign getTabAlignFromValue(const sal_Int32 nIntValue); sal_Unicode getFillCharFromValue(const sal_Int32 nIntValue); - void resolveAttributeProperties(Value & val); - void resolveSprmProps(Sprm & sprm_); sal_Int32 mnBackgroundColor; bool mbIsHighlightSet; }; diff --git a/writerfilter/inc/resourcemodel/Protocol.hxx b/writerfilter/inc/resourcemodel/Protocol.hxx index d0405861f695..2f4c9f6261ba 100644 --- a/writerfilter/inc/resourcemodel/Protocol.hxx +++ b/writerfilter/inc/resourcemodel/Protocol.hxx @@ -30,6 +30,8 @@ #ifndef INCLUDE_WRITERFILTER_PROTOCOL_HXX #define INCLUDE_WRITERFILTER_PROTOCOL_HXX +#ifdef DEBUG + #include <boost/shared_ptr.hpp> #include "WW8ResourceModel.hxx" #include "TagLogger.hxx" @@ -95,4 +97,6 @@ public: }; } + +#endif // DEBUG #endif // INCLUDE_WRITERFILTER_PROTOCOL_HXX diff --git a/writerfilter/source/doctok/doctokutil.cxx b/writerfilter/inc/resourcemodel/ResourceModelHelper.hxx index 7d94b525550b..c1c500545055 100644 --- a/writerfilter/source/doctok/doctokutil.cxx +++ b/writerfilter/inc/resourcemodel/ResourceModelHelper.hxx @@ -24,30 +24,17 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ +#ifndef INCLUDED_RESOURCE_MODEL_HELPER_HXX +#define INCLUDED_RESOURCE_MODEL_HELPER_HXX -#include <util.hxx> - -using namespace ::std; +#include <resourcemodel/WW8ResourceModel.hxx> namespace writerfilter { -namespace doctok { -void util_assert(bool bTest) -{ - if (! bTest) - clog << "ASSERT!\n" << endl; -} +namespace resourcemodel { -void printBytes(ostream & o, const string & str) -{ - unsigned int nCount = str.size(); - for (unsigned int n = 0; n < nCount; ++n) - { - unsigned char c = static_cast<unsigned char>(str[n]); - if (c < 128 && isprint(c)) - o << str[n]; - else - o << "."; - } -} +void WRITERFILTER_DLLPUBLIC resolveSprmProps(Properties & rHandler, Sprm & rSprm); +void WRITERFILTER_DLLPUBLIC resolveAttributeProperties(Properties & rHandler, Value & rValue); }} + +#endif // INCLUDED_RESOURCE_MODEL_HELPER_HXX diff --git a/writerfilter/inc/resourcemodel/TagLogger.hxx b/writerfilter/inc/resourcemodel/TagLogger.hxx index cf58dc3be8c3..055656832761 100644 --- a/writerfilter/inc/resourcemodel/TagLogger.hxx +++ b/writerfilter/inc/resourcemodel/TagLogger.hxx @@ -28,7 +28,10 @@ #ifndef INCLUDED_TAG_LOGGER_HXX #define INCLUDED_TAG_LOGGER_HXX +#ifdef DEBUG + #include <rtl/ustring.hxx> +#include <com/sun/star/beans/XPropertySet.hpp> #include <WriterFilterDllApi.hxx> #include <resourcemodel/WW8ResourceModel.hxx> #include <string> @@ -76,8 +79,10 @@ namespace writerfilter void addAttr(string name, string value); void addAttr(string name, const ::rtl::OUString & value); void addAttr(string name, sal_uInt32 nValue); + void addAttr(string name, uno::Any rAny); void addTag(Pointer_t pTag); void chars(const string & rChars); + void chars(const ::rtl::OUString & rChars); const string & getTag() const; string toString() const; @@ -93,6 +98,7 @@ namespace writerfilter stack<XMLTag::Pointer_t> mTags; XMLTag::Pointer_t currentTag() const; XMLTag::Pointer_t mpRoot; + string mFileName; TagLogger(); @@ -101,12 +107,15 @@ namespace writerfilter static Pointer_t getInstance(const char * name); + void setFileName(const string & rName); + void startDocument(); void element(const string & name); void startElement(const string & name); void attribute(const string & name, const string & value); void attribute(const string & name, const ::rtl::OUString & value); void attribute(const string & name, sal_uInt32 value); + void attribute(const string & name, const uno::Any aAny); void addTag(XMLTag::Pointer_t pTag); void chars(const string & chars); void chars(const ::rtl::OUString & chars); @@ -142,5 +151,9 @@ namespace writerfilter virtual void attribute(Id name, Value & val); virtual void sprm(Sprm & sprm); }; + +WRITERFILTER_DLLPUBLIC XMLTag::Pointer_t unoPropertySetToTag(uno::Reference<beans::XPropertySet> rPropSet); } + +#endif // DEBUG #endif // INCLUDED_TAG_LOGGER_HXX diff --git a/writerfilter/inc/resourcemodel/util.hxx b/writerfilter/inc/resourcemodel/util.hxx index 360dfc3d4113..0a700513576a 100644 --- a/writerfilter/inc/resourcemodel/util.hxx +++ b/writerfilter/inc/resourcemodel/util.hxx @@ -39,10 +39,12 @@ namespace writerfilter string WRITERFILTER_DLLPUBLIC xmlify(const string & str); +#ifdef DEBUG string WRITERFILTER_DLLPUBLIC propertysetToString (uno::Reference<beans::XPropertySet> const & rProps); string toString(uno::Reference< text::XTextRange > textRange); string toString(const string & rString); +#endif } #endif // INCLUDED_RESOURCEMODEL_UTIL_HXX diff --git a/writerfilter/qa/complex/ooxml/LoadDocuments.java b/writerfilter/qa/complex/ooxml/LoadDocuments.java new file mode 100644 index 000000000000..6f05391b6d21 --- /dev/null +++ b/writerfilter/qa/complex/ooxml/LoadDocuments.java @@ -0,0 +1,51 @@ + +package complex.ooxml; +import com.sun.star.lang.XMultiServiceFactory; +import complexlib.ComplexTestCase; +import java.io.File; +import com.sun.star.text.XTextDocument; + +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +/** + * + * @author hb137859 + */ +public class LoadDocuments extends ComplexTestCase { + private XMultiServiceFactory m_xMSF; + + @Override + public String[] getTestMethodNames() { + return new String [] { + "test1" + }; + } + + public void before() throws Exception { + m_xMSF = (XMultiServiceFactory) param.getMSF(); + } + + public void test1() { + String testDocumentsPath = util.utils.getFullTestDocName(""); + log.println("Test documents in:" + testDocumentsPath); + + File dir = new File(testDocumentsPath); + String [] files = dir.list(); + + if (files != null) { + for (int i = 0; i < files.length; ++i) { + log.println(files[i]); + String url = util.utils.getFullTestURL(files[i]); + log.println(url); + + XTextDocument xDoc = util.WriterTools.loadTextDoc(m_xMSF, url); + util.DesktopTools.closeDoc(xDoc); + } + } else { + failed(); + } + } +} diff --git a/writerfilter/qa/complex/ooxml/makefile.mk b/writerfilter/qa/complex/ooxml/makefile.mk new file mode 100644 index 000000000000..b57a0f5279f5 --- /dev/null +++ b/writerfilter/qa/complex/ooxml/makefile.mk @@ -0,0 +1,90 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.5.198.1 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ = ..$/..$/.. +TARGET = PropertyValues +PRJNAME = $(TARGET) +PACKAGE = complex$/ooxml + +# --- Settings ----------------------------------------------------- +.INCLUDE: settings.mk + + +#----- compile .java files ----------------------------------------- + +JARFILES = mysql.jar ridl.jar unoil.jar jurt.jar juh.jar java_uno.jar OOoRunner.jar +JAVAFILES = LoadDocuments.java +JAVACLASSFILES = $(foreach,i,$(JAVAFILES) $(CLASSDIR)$/$(PACKAGE)$/$(i:b).class) + +#----- make a jar from compiled files ------------------------------ + +MAXLINELENGTH = 100000 + +JARCLASSDIRS = $(PACKAGE) +JARTARGET = $(TARGET).jar +JARCOMPRESS = TRUE + +# --- Parameters for the test -------------------------------------- + +# start an office if the parameter is set for the makefile +.IF "$(OFFICE)" == "" +CT_APPEXECCOMMAND = +.ELSE +CT_APPEXECCOMMAND = -AppExecutionCommand "$(OFFICE)$/soffice -accept=socket,host=localhost,port=8100;urp;" +.ENDIF + +# test base is java complex +CT_TESTBASE = -TestBase java_complex + +# build package name with "." instead of $/ +CT_PACKAGE = -o $(PACKAGE:s\$/\.\) + +# start the runner application +CT_APP = org.openoffice.Runner + +# --- Targets ------------------------------------------------------ + +.IF "$(depend)" == "" +ALL: ALLTAR +.ELSE +ALL: ALLDEP +.ENDIF + +.INCLUDE : target.mk + +run: \ + LoadDocuments + +RUN: run + +LoadDocuments: + +java -cp $(CLASSPATH) $(CT_APP) $(CT_APPEXECCOMMAND) $(CT_TESTBASE) -tdoc $(PWD)$/testdocuments $(CT_PACKAGE).LoadDocuments + diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx index 64af3a953eef..65dfb4c5fcec 100644 --- a/writerfilter/source/dmapper/DomainMapper.cxx +++ b/writerfilter/source/dmapper/DomainMapper.cxx @@ -27,6 +27,7 @@ #include "PageBordersHandler.hxx" #include <dmapper/DomainMapper.hxx> +#include <resourcemodel/ResourceModelHelper.hxx> #include <DomainMapper_Impl.hxx> #include <ConversionHelper.hxx> #include <NumberingManager.hxx> @@ -69,6 +70,7 @@ #include <com/sun/star/text/TextGridMode.hpp> #include <com/sun/star/text/XDocumentIndexesSupplier.hpp> #include <com/sun/star/text/WritingMode.hpp> +#include <com/sun/star/text/WritingMode2.hpp> #include <com/sun/star/text/XFootnote.hpp> #include <com/sun/star/style/NumberingType.hpp> #include <comphelper/types.hxx> @@ -98,6 +100,10 @@ using namespace ::com::sun::star; using namespace ::rtl; namespace writerfilter { + +using resourcemodel::resolveSprmProps; +using resourcemodel::resolveAttributeProperties; + namespace dmapper{ #ifdef DEBUG_DOMAINMAPPER @@ -198,6 +204,9 @@ void DomainMapper::attribute(Id nName, Value & val) static ::rtl::OUString sLocalBookmarkName; sal_Int32 nIntValue = val.getInt(); rtl::OUString sStringValue = val.getString(); + + SectionPropertyMap * pSectionContext = m_pImpl->GetSectionContext(); + // printf ( "DomainMapper::attribute(0x%.4x, 0x%.4x) [%s]\n", (unsigned int)nName, (unsigned int)nIntValue, ::rtl::OUStringToOString(sStringValue, RTL_TEXTENCODING_DONTKNOW).getStr()); if( nName >= NS_rtf::LN_WIDENT && nName <= NS_rtf::LN_LCBSTTBFUSSR ) m_pImpl->GetFIB().SetData( nName, nIntValue ); @@ -1459,7 +1468,7 @@ void DomainMapper::attribute(Id nName, Value & val) case NS_rtf::LN_sed: /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ //section properties - resolveAttributeProperties(val); + resolveAttributeProperties(*this, val); break; case NS_rtf::LN_tbdAdd: /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ @@ -2133,6 +2142,36 @@ void DomainMapper::attribute(Id nName, Value & val) case NS_ooxml::LN_endtrackchange: m_pImpl->RemoveCurrentRedline( ); break; + case NS_ooxml::LN_CT_DocGrid_linePitch: + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ + { + //see SwWW8ImplReader::SetDocumentGrid + OSL_ENSURE(pSectionContext, "SectionContext unavailable!"); + if(pSectionContext) + { + pSectionContext->SetGridLinePitch( ConversionHelper::convertTwipToMM100( nIntValue ) ); + } + } + break; + case NS_ooxml::LN_CT_DocGrid_charSpace: + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ + { + OSL_ENSURE(pSectionContext, "SectionContext unavailable!"); + if(pSectionContext) + { + pSectionContext->SetDxtCharSpace( nIntValue ); + } + } + break; + case NS_ooxml::LN_CT_DocGrid_type: + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ + { + if (pSectionContext != NULL) + { + pSectionContext->SetGridType(nIntValue); + } + } + break; default: { #if OSL_DEBUG_LEVEL > 0 @@ -2167,7 +2206,7 @@ void DomainMapper::sprm(Sprm & rSprm) void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmType ) { #ifdef DEBUG_DOMAINMAPPER - dmapper_logger->startElement("sprm"); + dmapper_logger->startElement("DomainMapper.sprm"); dmapper_logger->chars(rSprm.toString()); #endif OSL_ENSURE(rContext.get(), "PropertyMap has to be valid!"); @@ -2176,14 +2215,7 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp sal_uInt32 nSprmId = rSprm.getId(); //needed for page properties - SectionPropertyMap* pSectionContext = 0; - //the section context is not availabe before the first call of startSectionGroup() - if( !m_pImpl->IsAnyTableImport() ) - { - PropertyMapPtr pContext = m_pImpl->GetTopContextOfType(CONTEXT_SECTION); - OSL_ENSURE(pContext.get(), "Section context is not in the stack!"); - pSectionContext = dynamic_cast< SectionPropertyMap* >( pContext.get() ); - } + SectionPropertyMap * pSectionContext = m_pImpl->GetSectionContext(); //TODO: In rtl-paragraphs the meaning of left/right are to be exchanged bool bExchangeLeftRight = false; @@ -2221,8 +2253,9 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp break; // sprmPFSideBySide case NS_sprm::LN_PFKeep: // sprmPFKeep - /* WRITERFILTERSTATUS: done: 0, planned: 3, spent: 0 */ + /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ /* WRITERFILTERSTATUS: comment: */ + rContext->Insert(PROP_PARA_SPLIT, true, uno::makeAny(nIntValue ? false : true)); break; case NS_sprm::LN_PFKeepFollow: // sprmPFKeepFollow /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 1 */ @@ -2297,7 +2330,7 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp } //create a new tab stop property - this is done with the contained properties - resolveSprmProps(rSprm); + resolveSprmProps(*this, rSprm); //add this property rContext->Insert(PROP_PARA_TAB_STOPS, true, uno::makeAny( m_pImpl->GetCurrentTabStopAndClear())); } @@ -2430,7 +2463,7 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp case NS_ooxml::LN_CT_PrBase_pBdr: //paragraph border /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ - resolveSprmProps(rSprm); + resolveSprmProps(*this, rSprm); break; /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ case NS_sprm::LN_PBrcTop: // sprmPBrcTop @@ -2584,7 +2617,7 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp break; // sprmPFLocked case NS_sprm::LN_PFWidowControl: case NS_ooxml::LN_CT_PPrBase_widowControl: - /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ { uno::Any aVal( uno::makeAny( sal_Int8(nIntValue ? 2 : 0 ))); rContext->Insert( PROP_PARA_WIDOWS, true, aVal ); @@ -2641,8 +2674,16 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp } break; // sprmPOutLvl case NS_sprm::LN_PFBiDi: - /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ + rContext->Insert(PROP_WRITING_MODE, false, uno::makeAny( text::WritingMode2::RL_TB )); + rContext->Insert(PROP_PARA_ADJUST, false, uno::makeAny( style::ParagraphAdjust_RIGHT )); + break; // sprmPFBiDi + case NS_ooxml::LN_EG_SectPrContents_bidi: + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ + if (pSectionContext != NULL) + pSectionContext->Insert(PROP_WRITING_MODE,false, uno::makeAny( text::WritingMode2::RL_TB)); + break; case NS_sprm::LN_PFNumRMIns: /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ break; // sprmPFNumRMIns @@ -2692,7 +2733,7 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp break; // sprmCChs case NS_sprm::LN_CSymbol: // sprmCSymbol /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ - resolveSprmProps(rSprm); //resolves LN_FONT and LN_CHAR + resolveSprmProps(*this, rSprm); //resolves LN_FONT and LN_CHAR break; case NS_sprm::LN_CFOle2: /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ @@ -2701,7 +2742,7 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ break; // sprmCIdCharType case NS_sprm::LN_CHighlight: - /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ { sal_Int32 nColor = 0; if(true ==( mbIsHighlightSet = getColorFromIndex(nIntValue, nColor))) @@ -2729,7 +2770,7 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ break; // sprmCPlain case NS_sprm::LN_CKcd: - /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ rContext->Insert(PROP_CHAR_EMPHASIS, true, uno::makeAny ( getEmphasisValue (nIntValue))); break; // sprmCKcd case NS_sprm::LN_CFEmboss:// sprmCFEmboss @@ -2843,6 +2884,13 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp /* WRITERFILTERSTATUS: */ { uno::Any aBold( uno::makeAny( nIntValue ? awt::FontWeight::BOLD : awt::FontWeight::NORMAL ) ); + +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->startElement("charWeight"); + dmapper_logger->attribute("weight", nIntValue ? awt::FontWeight::BOLD : awt::FontWeight::NORMAL); + dmapper_logger->endElement("charWeight"); +#endif + rContext->Insert(ePropertyId, true, aBold ); if( nSprmId != NS_sprm::LN_CFBoldBi ) // sprmCFBoldBi rContext->Insert(PROP_CHAR_WEIGHT_ASIAN, true, aBold ); @@ -3079,7 +3127,7 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ break; // sprmCPropRMark case NS_sprm::LN_CSfxText: - /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ // The file-format has many character animations. We have only // one, so we use it always. Suboptimal solution though. if (nIntValue) @@ -3109,7 +3157,7 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ break; // sprmCBrc case NS_sprm::LN_CShd: - /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ + /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ break; // sprmCShd case NS_sprm::LN_CIdslRMarkDel: /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ @@ -3515,7 +3563,7 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp break; case NS_sprm::LN_SDxtCharSpace: { - /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ OSL_ENSURE(pSectionContext, "SectionContext unavailable!"); if(pSectionContext) { @@ -3525,7 +3573,7 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp break; // sprmSDxtCharSpace case NS_sprm::LN_SDyaLinePitch: // sprmSDyaLinePitch { - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ //see SwWW8ImplReader::SetDocumentGrid OSL_ENSURE(pSectionContext, "SectionContext unavailable!"); if(pSectionContext) @@ -3570,8 +3618,9 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp } break; // sprmSClm case NS_sprm::LN_STextFlow: - { + case NS_ooxml::LN_EG_SectPrContents_textDirection: /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ + { /* 0 HoriLR 1 Vert TR 2 Vert TR 3 Vert TT 4 HoriLT only 0 and 1 can be imported correctly */ @@ -3589,7 +3638,16 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp break; default:; } - rContext->Insert(PROP_WRITING_MODE, false, uno::makeAny( nDirection ) ); + + PropertyMap * pTargetContext = rContext.get(); + + if (pSectionContext != NULL && + nSprmId == NS_ooxml::LN_EG_SectPrContents_textDirection) + { + pTargetContext = pSectionContext; + } + + pTargetContext->Insert(PROP_WRITING_MODE, false, uno::makeAny( nDirection ) ); } break; // sprmSTextFlow case NS_sprm::LN_TJc: // sprmTJc @@ -3718,11 +3776,11 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp break;//undocumented section properties case NS_sprm::LN_CEastAsianLayout: /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ - resolveSprmProps(rSprm); + resolveSprmProps(*this, rSprm); break; case NS_ooxml::LN_CT_Tabs_tab: /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ - resolveSprmProps(rSprm); + resolveSprmProps(*this, rSprm); m_pImpl->IncorporateTabStop(m_pImpl->m_aCurrentTabStop); m_pImpl->m_aCurrentTabStop = DeletableTabStop(); break; @@ -3739,58 +3797,58 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp m_pImpl->InitTabStopFromStyle( aStyleTabStops ); } } - resolveSprmProps(rSprm); + resolveSprmProps(*this, rSprm); rContext->Insert(PROP_PARA_TAB_STOPS, true, uno::makeAny( m_pImpl->GetCurrentTabStopAndClear())); } break; case NS_ooxml::LN_CT_PPr_sectPr: - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ case NS_ooxml::LN_EG_RPrBase_color: - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ case NS_ooxml::LN_EG_RPrBase_rFonts: - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ case NS_ooxml::LN_EG_RPrBase_bdr: - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ case NS_ooxml::LN_EG_RPrBase_eastAsianLayout: - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ case NS_ooxml::LN_EG_RPrBase_u: - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ case NS_ooxml::LN_EG_RPrBase_lang: - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ case NS_ooxml::LN_CT_PPrBase_spacing: - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ case NS_ooxml::LN_CT_PPrBase_ind: - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ case NS_ooxml::LN_CT_RPrDefault_rPr: - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ case NS_ooxml::LN_CT_PPrDefault_pPr: - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ case NS_ooxml::LN_CT_DocDefaults_pPrDefault: - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ case NS_ooxml::LN_CT_DocDefaults_rPrDefault: - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ case NS_ooxml::LN_CT_Style_pPr: - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ case NS_ooxml::LN_CT_Style_rPr: - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ case NS_ooxml::LN_CT_PPr_rPr: - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ case NS_ooxml::LN_CT_PPrBase_numPr: - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ - resolveSprmProps(rSprm); + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ + resolveSprmProps(*this, rSprm); break; case NS_ooxml::LN_EG_SectPrContents_footnotePr: - /* WRITERFILTERSTATUS: done: 1ß0, planned: 0.5, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ case NS_ooxml::LN_EG_SectPrContents_endnotePr: /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ m_pImpl->SetInFootnoteProperties( NS_ooxml::LN_EG_SectPrContents_footnotePr == nSprmId ); - resolveSprmProps(rSprm); + resolveSprmProps(*this, rSprm); break; case NS_ooxml::LN_EG_SectPrContents_lnNumType: /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ { - resolveSprmProps(rSprm); + resolveSprmProps(*this, rSprm); LineNumberSettings aSettings = m_pImpl->GetLineNumberSettings(); aSettings.bIsOn = true; m_pImpl->SetLineNumberSettings( aSettings ); @@ -3827,7 +3885,7 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp { //TODO: What about style sheet import of frame properties } - resolveSprmProps(rSprm); + resolveSprmProps(*this, rSprm); } break; case NS_ooxml::LN_EG_SectPrContents_pgSz: @@ -3839,7 +3897,7 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp CT_PageSz.h = aLetter.getHeight(); } CT_PageSz.orient = false; - resolveSprmProps(rSprm); + resolveSprmProps(*this, rSprm); OSL_ENSURE(pSectionContext, "SectionContext unavailable!"); if(pSectionContext) { @@ -3853,7 +3911,7 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp case NS_ooxml::LN_EG_SectPrContents_pgMar: /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ m_pImpl->InitPageMargins(); - resolveSprmProps(rSprm); + resolveSprmProps(*this, rSprm); OSL_ENSURE(pSectionContext, "SectionContext unavailable!"); if(pSectionContext) { @@ -3908,6 +3966,9 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp } } break; + case NS_ooxml::LN_EG_SectPrContents_docGrid: + resolveSprmProps(*this, rSprm); + break; case NS_ooxml::LN_EG_SectPrContents_pgBorders: { writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps(); @@ -3960,7 +4021,7 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp case NS_ooxml::LN_CT_TblPrBase_tblCellMar: //cell margins /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ { - resolveSprmProps(rSprm);//contains LN_CT_TblCellMar_top, LN_CT_TblCellMar_left, LN_CT_TblCellMar_bottom, LN_CT_TblCellMar_right + resolveSprmProps(*this, rSprm);//contains LN_CT_TblCellMar_top, LN_CT_TblCellMar_left, LN_CT_TblCellMar_bottom, LN_CT_TblCellMar_right } break; case NS_ooxml::LN_CT_TblCellMar_top: @@ -4003,7 +4064,7 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp } break; case NS_sprm::LN_CFNoProof: //0x875 no grammar and spell checking, unsupported - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ break; case NS_ooxml::LN_anchor_anchor: // at_character drawing /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ @@ -4104,7 +4165,7 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp /* WRITERFILTERSTATUS: done: 100, planned: 5, spent: 0 */ { m_pImpl->AddNewRedline( ); - resolveSprmProps( rSprm ); + resolveSprmProps(*this, rSprm ); // now the properties author, date and id should be available sal_Int32 nToken = m_pImpl->GetCurrentRedlineToken(); switch( nToken & 0xffff ) @@ -4160,7 +4221,21 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp //TODO: determines whether top/bottom paragraph spacing is added if equal styles are following - unsupported break; case NS_ooxml::LN_EG_SectPrContents_formProt: //section protection, only form editing is enabled - unsupported - /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ + case NS_ooxml::LN_EG_SectPrContents_vAlign: + case NS_ooxml::LN_EG_RPrBase_fitText: + /* WRITERFILTERSTATUS: done: 0, planned: 0, spent: 0 */ + break; + case NS_ooxml::LN_ffdata: + { + writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps(); + if (pProperties.get() != NULL) + { + FFDataHandler::Pointer_t pFFDataHandler(new FFDataHandler()); + + pProperties->resolve(*pFFDataHandler); + m_pImpl->SetFieldFFData(pFFDataHandler); + } + } break; default: { @@ -4173,7 +4248,8 @@ void DomainMapper::sprm( Sprm& rSprm, PropertyMapPtr rContext, SprmType eSprmTyp } #ifdef DEBUG_DOMAINMAPPER - dmapper_logger->endElement("sprm"); + dmapper_logger->addTag(rContext->toTag()); + dmapper_logger->endElement("DomainMapper.sprm"); #endif } /*-- 09.06.2006 09:52:13--------------------------------------------------- @@ -4183,13 +4259,13 @@ void DomainMapper::entry(int /*pos*/, writerfilter::Reference<Properties>::Pointer_t ref) { #ifdef DEBUG_DOMAINMAPPER - dmapper_logger->startElement("entry"); + dmapper_logger->startElement("DomainMapper.entry"); #endif ref->resolve(*this); #ifdef DEBUG_DOMAINMAPPER - dmapper_logger->endElement("entry"); + dmapper_logger->endElement("DomainMapper.entry"); #endif } /*-- 09.06.2006 09:52:13--------------------------------------------------- @@ -4357,6 +4433,12 @@ void DomainMapper::text(const sal_uInt8 * data_, size_t len) { //TODO: Determine the right text encoding (FIB?) ::rtl::OUString sText( (const sal_Char*) data_, len, RTL_TEXTENCODING_MS_1252 ); +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->startElement("text"); + dmapper_logger->chars(sText); + dmapper_logger->endElement("text"); +#endif + try { if(len == 1) @@ -4423,11 +4505,6 @@ void DomainMapper::text(const sal_uInt8 * data_, size_t len) pContext.reset(new PropertyMap()); m_pImpl->appendTextPortion( sText, pContext ); -#ifdef DEBUG_DOMAINMAPPER - dmapper_logger->startElement("text"); - dmapper_logger->chars(sText); - dmapper_logger->endElement("text"); -#endif } } catch( const uno::RuntimeException& ) @@ -4819,21 +4896,6 @@ rtl::OUString DomainMapper::getBracketStringFromEnum(const sal_Int32 nIntValue, } } -void DomainMapper::resolveSprmProps(Sprm & rSprm) -{ - writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps(); - if( pProperties.get()) - pProperties->resolve(*this); -} - -void DomainMapper::resolveAttributeProperties(Value & val) -{ - writerfilter::Reference<Properties>::Pointer_t pProperties = val.getProperties(); - if( pProperties.get()) - pProperties->resolve(*this); -} - - com::sun::star::style::TabAlign DomainMapper::getTabAlignFromValue(const sal_Int32 nIntValue) { switch (nIntValue) diff --git a/writerfilter/source/dmapper/DomainMapperTableManager.cxx b/writerfilter/source/dmapper/DomainMapperTableManager.cxx index 452391fe6300..8783421faaaf 100644 --- a/writerfilter/source/dmapper/DomainMapperTableManager.cxx +++ b/writerfilter/source/dmapper/DomainMapperTableManager.cxx @@ -99,14 +99,14 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) sal_Int32 nIntValue = ((pValue.get() != NULL) ? pValue->getInt() : 0); switch ( nSprmId ) { - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ case 0xf661: //sprmTTRLeft left table indent - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ case 0xf614: // sprmTTPreferredWidth - preferred table width - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ case NS_ooxml::LN_CT_TblPrBase_tblW: //90722; - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ case NS_ooxml::LN_CT_TblPrBase_tblInd: //90725 + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ { //contains unit and value writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps(); @@ -132,9 +132,9 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) } } break; - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ case 0x3404:// sprmTTableHeader case NS_ooxml::LN_CT_TrPrBase_tblHeader: //90704 + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ // if nIntValue == 1 then the row is a repeated header line // to prevent later rows from increasing the repeating m_nHeaderRepeat is set to NULL when repeating stops if( nIntValue > 0 && m_nHeaderRepeat >= 0 ) @@ -147,8 +147,8 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) else m_nHeaderRepeat = -1; break; - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ case 0xd608: // TDefTable + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ { writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps(); if( pProperties.get()) @@ -178,8 +178,8 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) } } break; - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ case 0xD605: // sprmTTableBorders + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ { writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps(); if( pProperties.get()) @@ -193,14 +193,14 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) } } break; - /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ case 0xd632 : //sprmTNewSpacing - /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ + /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ case 0xd634 : //sprmTNewSpacing + /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ //TODO: sprms contain default (TNew) and actual border spacing of cells - not resolvable yet break; - /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ case 0xd613: //sprmTGridLineProps + /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ // TODO: needs a handler /*contains: GridLineProps"> @@ -216,8 +216,8 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) */ break; - /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ case 0x740a : //sprmTTlp + /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ //TODO: Table look specifier break; case 0x6816 : //unknown @@ -227,10 +227,11 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) case 0x7479 : //unknown case 0xf617 : //unknown case 0xf618 : //unknown + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ bRet = false; break; - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ case NS_ooxml::LN_CT_TblPrBase_tblStyle: //table style name + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ { m_sTableStyleName = pValue->getString(); TablePropertyMapPtr pPropMap( new TablePropertyMap ); @@ -238,14 +239,14 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) insertTableProps(pPropMap); } break; - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ case NS_ooxml::LN_CT_TblGridBase_gridCol: + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ { getCurrentGrid()->push_back( ConversionHelper::convertTwipToMM100( nIntValue ) ); } break; - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ case NS_ooxml::LN_CT_TcPrBase_vMerge : //vertical merge + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ { // values can be: LN_Value_ST_Merge_restart, LN_Value_ST_Merge_continue, in reality the second one is a 0 TablePropertyMapPtr pMergeProps( new TablePropertyMap ); @@ -253,8 +254,8 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) cellProps( pMergeProps); } break; - /* WRITERFILTERSTATUS: done: 1, planned: 2, spent: 0 */ case NS_ooxml::LN_CT_TcPrBase_gridSpan: //number of grid positions spanned by this cell + /* WRITERFILTERSTATUS: done: 100, planned: 2, spent: 0 */ { #if DEBUG_DOMAINMAPPER dmapper_logger->startElement("tablemanager.GridSpan"); @@ -264,13 +265,14 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) m_nGridSpan = nIntValue; } break; - /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ case NS_ooxml::LN_CT_TblPrBase_tblLook: + /* WRITERFILTERSTATUS: done: 0, planned: 2, spent: 0 */ break; //todo: table look specifier - /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ case NS_ooxml::LN_CT_TcPrBase_tcW: + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ break; //fixed column width is not supported case NS_ooxml::LN_CT_TrPrBase_cnfStyle: + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ { TablePropertyMapPtr pProps( new TablePropertyMap ); pProps->Insert( PROP_CNF_STYLE, true, uno::makeAny( pValue->getString( ) ) ); @@ -278,9 +280,11 @@ bool DomainMapperTableManager::sprm(Sprm & rSprm) } break; case NS_ooxml::LN_CT_PPrBase_cnfStyle: + /* WRITERFILTERSTATUS: done: 0, planned: 0.5, spent: 0 */ // TODO cnfStyle on a paragraph break; case NS_ooxml::LN_CT_TcPrBase_cnfStyle: + /* WRITERFILTERSTATUS: done: 100, planned: 0.5, spent: 0 */ { TablePropertyMapPtr pProps( new TablePropertyMap ); pProps->Insert( PROP_CNF_STYLE, true, uno::makeAny( pValue->getString( ) ) ); diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx index c6d347a37281..4c176b59b4ef 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx @@ -69,6 +69,7 @@ #include <com/sun/star/util/XNumberFormats.hpp> #include <rtl/ustrbuf.hxx> #include <rtl/string.h> +#include "FieldTypes.hxx" #include <tools/string.hxx> #ifdef DEBUG_DOMAINMAPPER @@ -89,269 +90,6 @@ using namespace ::com::sun::star; using namespace ::rtl; namespace writerfilter { namespace dmapper{ -/*-- 08.09.2006 09:39:50--------------------------------------------------- - - -----------------------------------------------------------------------*/ -//defaultswitch { Upper FirstCap Lower } -//Numberingswitch { Arabic, ALPHABETIC, ...} see lcl_ParseNumberingType -enum FieldId -{ - /* ADDRESSBLOCK \d \* MERGEFORMAT -> Addressblock completely unsupported*/ - FIELD_ADDRESSBLOCK - /* ADVANCE \d downvalue \l leftvalue \r rightvalue \u upvalue \x xvalue \y yvalue -> unsupported*/ - ,FIELD_ADVANCE - /* ASK bookmarkname "hint" \d defaultanswer \o \* MERGEFORMAT -> - the hint is not always quoted, inputfield with default answer, prompt before merge (\o) - */ - ,FIELD_ASK - /* AUTONUM \* Numberingswitch -> - mapped to sequence field "AutoNr" - */ - ,FIELD_AUTONUM - /* AUTONUMLGL \* Numberingswitch -> - mapped to sequence field "AutoNr" - */ - ,FIELD_AUTONUMLGL - /* AUTONUMOUT \* Numberingswitch -> - mapped to sequence field "AutoNr" - */ - ,FIELD_AUTONUMOUT - /* AUTHOR NewAuthor \* defaultswitch \* MERGEFORMAT -> - mapped to sequence field "AutoNr" - */ - ,FIELD_AUTHOR - /* COMMENTS "comment" \* MERGEFORMAT -> - Docinfo-Comments - */ - ,FIELD_COMMENTS - /* CREATEDATE \h \* MERGEFORMAT -> - docinfo-created-date - */ - ,FIELD_CREATEDATE - /* DATE \@ "number format" \s \* MERGEFORMAT -> - ww8filterimprovement: multiple languages now supported - */ - ,FIELD_DATE - /* DOCPROPERTY propertyname \* MERGEFORMAT -> - ww8filterimprovement: some fields imported as functionally equivalent fields if possible, - the others imported as UserField - */ - ,FIELD_DOCPROPERTY - /* DOCVARIABLE Name \* MERGEFORMAT -> - ww8filterimprovement: now imported as user fields - */ - ,FIELD_DOCVARIABLE - /* EDITTIME \# "displayformat" \* Numberingswitch \* MERGEFORMAT -> - DocInfo-Modified-Date - ww8filterimprovement: multiple languages now supported - */ - ,FIELD_EDITTIME - /* FILLIN "text to fill in" \d defaultanswer \o \* MERGEFORMAT -> - Function-InputField - */ - ,FIELD_FILLIN - /* FILENAME \p \* * MERGEFORMAT -> - file name (\p with path) - */ - ,FIELD_FILENAME - /* FILESIZE \* NumberingType \* MERGEFORMAT -> - not imported in old ww8 filter, see lcl_ParseNumberingType - todo find alternative field - */ - ,FIELD_FILESIZE - /* =formula \# "number format" - todo find alternative field - */ - ,FIELD_FORMULA - /* GOTOBUTTON text \* MERGEFORMAT -> - not imported in old ww8 filter - todo find alternative field - */ - ,FIELD_GOTOBUTTON - /* HYPERLINK "link" \* MERGEFORMAT -> - not imported in old ww8 filter - ww8filterimprovement: now imported as hyperlink - */ - ,FIELD_HYPERLINK - /* IF condition "then text" "else text" -> - not imported in old ww8 filter - ww8filterimprovement: now imported - todo: condition, if text, else text still missing - */ - ,FIELD_IF - /* INFO NameOfInfo \* MERGEFORMAT -> old - todo: filter imports wrong? - */ - ,FIELD_INFO - /* INCLUDEPICTURE path \* MERGEFORMAT-> - old filter imports an embedded picture - todo: not yet supported - */ - ,FIELD_INCLUDEPICTURE - /* KEYWORDS keyword \* defaultswitch \* Numberingswitch \* MERGEFORMAT -> - DocInfo Keywords - */ - ,FIELD_KEYWORDS - /* LASTSAVEDBY \* MERGEFORMAT -> - DocInfo-Modified-Author - */ - ,FIELD_LASTSAVEDBY - /* MACROBUTTON MacroName quick help text -> - Macro field - */ - ,FIELD_MACROBUTTON - /* MERGEFIELD ColumName \b prefix \f suffix \* MERGEFORMAT -> - ww8filterimprovement: column-only API now upporterd - */ - ,FIELD_MERGEFIELD - /* MERGEREC \* MERGEFORMAT -> - RecordNumber field, maybe without db name - todo: currently unchecked - */ - ,FIELD_MERGEREC - /* MERGESEQ \* MERGEFORMAT -> - not imported in old ww8 filter - ww8filterimprovement: now imported - todo: currently unchecked - */ - ,FIELD_MERGESEQ - /* NEXT text -> - Next record - todo: currently unchecked - */ - ,FIELD_NEXT - /* NEXTIF condition - todo: condition not imported - */ - ,FIELD_NEXTIF - /* PAGE \* Numberingswitch \* MERGEFORMAT -> - see lcl_ParseNumberingType - */ - ,FIELD_PAGE - /* REF targetbkm \f \* MERGEFORMAT -> - imports a ShowVariable (bookmarkname)? - \h hyerlink to paragraph - \p relative to para above/below - \f refenence number - \d separator number separator - \n paragraph number - \r paragraph number in relative context - \t suppres non delimiters - \w paragraph number in full context - \* Upper/Lower... - */ - ,FIELD_REF // - /* REVNUM \* Numberingswitch \* MERGEFORMAT -> - DocInfo-revision number - */ - ,FIELD_REVNUM - /* SAVEDATE \@ "NumberFormat"\* MERGEFORMAT -> - DocInfo-modified-date - */ - ,FIELD_SAVEDATE - /* SECTION \* NumberFormat \* MERGEFORMAT -> - not imported in old ww8 filter see lcl_ParseNumberingType - todo: find alternative - */ - ,FIELD_SECTION - /* SECTIONPAGES \* NumberFormat \* MERGEFORMAT -> - not imported in old ww8 filter see lcl_ParseNumberingType - todo: find alternative - */ - ,FIELD_SECTIONPAGES - /* SEQ sequencename \h \c \n \r \s \* MERGEFORMAT -> - number range name:sequencename value:sequencename+1 - todo: only partially implemented, switches unsupported - */ - ,FIELD_SEQ - /* SET bookmarkname newtext \* MERGEFORMAT -> - SetVariable bookmarkname = newtext - todo: not implemented yet - */ - ,FIELD_SET - /* SKIPIF condition \* MERGEFORMAT -> - ?? - todo: not implemented yet - */ - ,FIELD_SKIPIF - /* STYLEREF stylename \* MERGEFORMAT -> - not imported in old ww8 filter - todo: add an equivalent field type - */ - ,FIELD_STYLEREF - /* SUBJECT subject \* Defaultswitch \* MERGEFORMAT -> - DocInfo - subject - */ - ,FIELD_SUBJECT - /* SYMBOL symbolnumber \* MERGEFORMAT -> - inserts a special char (symbolnumber) - todo: find alternative - */ - ,FIELD_SYMBOL - /* TEMPLATE \* Defaultswitch \* MERGEFORMAT - TemplateName field - */ - ,FIELD_TEMPLATE - /* TIME \@ "number format" \* MERGEFORMAT - ww8filterimprovement: multiple languages now supported - */ - ,FIELD_TIME - /* TITLE \* Defaultswitch \* MERGEFORMAT -> - DocInfo-title - */ - ,FIELD_TITLE - /* USERINITIALS newinitials \* MERGEFORMAT -> - ExtendedUser field (SHORTCUT) - */ - ,FIELD_USERINITIALS - /* USERADDRESS \* MERGEFORMAT -> - not imported in old ww8 filter - todo: find alternative - */ - ,FIELD_USERADDRESS - /* USERNAME newusername \* MERGEFORMAT -> - not imported in old ww8 filter - todo: import as extended user field(s) - */ - ,FIELD_USERNAME - /* - TOC options: - \a Builds a table of figures but does not include the captions's label and number - \b Uses a bookmark to specify area of document from which to build table of contents - \c Builds a table of figures of the given label - \d Defines the separator between sequence and page numbers - \f Builds a table of contents using TC entries instead of outline levels - \h Hyperlinks the entries and page numbers within the table of contents - \l Defines the TC entries field level used to build a table of contents - \n Builds a table of contents or a range of entries, sucah as “1-9”, in a table of contents without page numbers - \o Builds a table of contents by using outline levels instead of TC entries - \p Defines the separator between the table entry and its page number - \s Builds a table of contents by using a sequence type - \t Builds a table of contents by using style names other than the standard outline styles - \u Builds a table of contents by using the applied paragraph outline level - \w Preserve tab characters within table entries - \x Preserve newline characters within table entries - \z Hides page numbers within the table of contens when shown in Web Layout View - */ - ,FIELD_TOC - /* - TOC entry: “text” - \f TC entry in doc with multiple tables - \l Outline Level - \n Suppress page numbers - example: TOC "EntryText \f \l 2 \n - */ - ,FIELD_TC - /* document statistic - number of characters - */ - ,FIELD_NUMCHARS - /* document statistic - number of words - */ - ,FIELD_NUMWORDS - /* document statistic - number of pages - */ - ,FIELD_NUMPAGES -}; struct FieldConversion { ::rtl::OUString sWordCommand; @@ -2543,6 +2281,10 @@ uno::Reference< beans::XPropertySet > DomainMapper_Impl::FindOrCreateFieldMaster -----------------------------------------------------------------------*/ void DomainMapper_Impl::PushFieldContext() { +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->element("pushFieldContext"); +#endif + uno::Reference< text::XTextAppend > xTextAppend = m_aTextAppendStack.top().xTextAppend; //insert a dummy char to make sure the start range doesn't move together with the to-be-appended text xTextAppend->appendTextPortion(::rtl::OUString( '-' ), uno::Sequence< beans::PropertyValue >() ); @@ -2585,11 +2327,74 @@ void FieldContext::AppendCommand(const ::rtl::OUString& rPart) { m_sCommand += rPart; } + +::std::vector<rtl::OUString> FieldContext::GetCommandParts() const +{ + ::std::vector<rtl::OUString> aResult; + sal_Int32 nIndex = 0; + bool bInString = false; + OUString sPart; + while (nIndex != -1) + { + OUString sToken = GetCommand().getToken(0, ' ', nIndex); + bool bInStringNext = bInString; + + if (sToken.getLength() == 0) + continue; + + if (sToken.getStr()[0] == '"') + { + bInStringNext = true; + sToken = sToken.copy(1); + } + if (sToken.getStr()[sToken.getLength() - 1] == '"') + { + bInStringNext = false; + sToken = sToken.copy(0, sToken.getLength() - 1); + } + + if (bInString) + { + if (bInStringNext) + { + sPart += OUString(' '); + sPart += sToken; + } + else + { + sPart += sToken; + aResult.push_back(sPart); + } + } + else + { + if (bInStringNext) + { + sPart = sToken; + } + else + { + aResult.push_back(sToken); + } + } + + bInString = bInStringNext; + } + + return aResult; +} + /*-- 29.01.2007 11:33:15--------------------------------------------------- //collect the pieces of the command -----------------------------------------------------------------------*/ void DomainMapper_Impl::AppendFieldCommand(::rtl::OUString& rPartOfCommand) { +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->startElement("appendFieldCommand"); + dmapper_logger->chars(rPartOfCommand); + dmapper_logger->endElement("appendFieldCommand"); +#endif + FieldContextPtr pContext = m_aFieldStack.top(); OSL_ENSURE( pContext.get(), "no field context available"); if( pContext.get() ) @@ -2601,89 +2406,499 @@ void DomainMapper_Impl::AppendFieldCommand(::rtl::OUString& rPartOfCommand) -----------------------------------------------------------------------*/ typedef std::multimap < sal_Int32, ::rtl::OUString > TOCStyleMap; + +const FieldConversionMap_t & lcl_GetFieldConversion() +{ +static FieldConversionMap_t aFieldConversionMap; +static bool bFilled = false; +if(!bFilled) +{ + static const FieldConversion aFields[] = + { +// {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ADDRESSBLOCK")), "", "", FIELD_ADDRESSBLOCK }, +// {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ADVANCE")), "", "", FIELD_ADVANCE }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ASK")), "SetExpression", "SetExpression", FIELD_ASK }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AUTONUM")), "SetExpression", "SetExpression", FIELD_AUTONUM }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AUTONUMLGL")), "SetExpression", "SetExpression", FIELD_AUTONUMLGL }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AUTONUMOUT")), "SetExpression", "SetExpression", FIELD_AUTONUMOUT }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AUTHOR")), "Author", "", FIELD_AUTHOR }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DATE")), "DateTime", "", FIELD_DATE }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("COMMENTS")), "DocInfo.Description", "", FIELD_COMMENTS }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CREATEDATE")), "DocInfo.CreateDateTime", "", FIELD_CREATEDATE }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DOCPROPERTY")), "", "", FIELD_DOCPROPERTY }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DOCVARIABLE")), "User", "", FIELD_DOCVARIABLE }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("EDITTIME")), "DocInfo.EditTime", "", FIELD_EDITTIME }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FILLIN")), "Input", "", FIELD_FILLIN }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FILENAME")), "FileName", "", FIELD_FILENAME }, +// {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FILESIZE")), "", "", FIELD_FILESIZE }, +// {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FORMULA")), "", "", FIELD_FORMULA }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FORMCHECKBOX")), "", "", FIELD_FORMCHECKBOX}, +// {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FORMDROPDOWN")), "", "", FIELD_FORMDROWDOWN}, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FORMTEXT")), "Input", "", FIELD_FORMTEXT}, +// {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("GOTOBUTTON")), "", "", FIELD_GOTOBUTTON }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HYPERLINK")), "", "", FIELD_HYPERLINK }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IF")), "ConditionalText", "", FIELD_IF }, +// {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("INFO")), "","", FIELD_INFO }, +// {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("INCLUDEPICTURE")), "", "", FIELD_INCLUDEPICTURE}, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("KEYWORDS")), "DocInfo.KeyWords", "", FIELD_KEYWORDS }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("LASTSAVEDBY")), "DocInfo.ChangeAuthor", "", FIELD_LASTSAVEDBY }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MACROBUTTON")), "Macro", "", FIELD_MACROBUTTON }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MERGEFIELD")), "Database", "Database", FIELD_MERGEFIELD}, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MERGEREC")), "DatabaseNumberOfSet", "", FIELD_MERGEREC }, +// {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MERGESEQ")), "", "", FIELD_MERGESEQ }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NEXT")), "DatabaseNextSet", "", FIELD_NEXT }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NEXTIF")), "DatabaseNextSet", "", FIELD_NEXTIF }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PAGE")), "PageNumber", "", FIELD_PAGE }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("REF")), "GetReference", "", FIELD_REF }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("REVNUM")), "DocInfo.Revision", "", FIELD_REVNUM }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SAVEDATE")), "DocInfo.Change", "", FIELD_SAVEDATE }, +// {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SECTION")), "", "", FIELD_SECTION }, +// {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SECTIONPAGES")), "", "", FIELD_SECTIONPAGES }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SEQ")), "SetExpression", "SetExpression", FIELD_SEQ }, +// {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SET")), "","", FIELD_SET }, +// {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SKIPIF")),"", "", FIELD_SKIPIF }, +// {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("STYLEREF")),"", "", FIELD_STYLEREF }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SUBJECT")), "DocInfo.Subject", "", FIELD_SUBJECT }, +// {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SYMBOL")),"", "", FIELD_SYMBOL }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TEMPLATE")), "TemplateName", "", FIELD_TEMPLATE}, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TIME")), "DateTime", "", FIELD_TIME }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TITLE")), "DocInfo.Title", "", FIELD_TITLE }, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("USERINITIALS")), "ExtendedUser", "", FIELD_USERINITIALS}, +// {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("USERADDRESS")), "", "", FIELD_USERADDRESS }, +// {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("USERNAME")), "ExtendedUser", "", FIELD_USERNAME } + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TOC")), "com.sun.star.text.ContentIndex", "", FIELD_TOC}, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TC")), "com.sun.star.text.ContentIndexMark", "", FIELD_TC}, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NUMCHARS")), "CharacterCount", "", FIELD_NUMCHARS}, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NUMWORDS")), "WordCount", "", FIELD_NUMWORDS}, + {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NUMPAGES")), "PageCount", "", FIELD_NUMPAGES}, + +// {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("")), "", "", FIELD_}, + + }; + size_t nConversions = sizeof(aFields)/sizeof(FieldConversion); + for( size_t nConversion = 0; nConversion < nConversions; ++nConversion) + { + aFieldConversionMap.insert( FieldConversionMap_t::value_type( + aFields[nConversion].sWordCommand, + aFields[nConversion] )); + } + + bFilled = true; + } + + return aFieldConversionMap; +} + +void DomainMapper_Impl::handleFieldAsk + (FieldContextPtr pContext, + PropertyNameSupplier& rPropNameSupplier, + uno::Reference< uno::XInterface > & xFieldInterface, + uno::Reference< beans::XPropertySet > xFieldProperties) +{ + //doesn the command contain a variable name? + ::rtl::OUString sVariable, sHint; + + sVariable = lcl_ExctractAskVariableAndHint( pContext->GetCommand(), + sHint ); + if(sVariable.getLength()) + { + // determine field master name + uno::Reference< beans::XPropertySet > xMaster = + FindOrCreateFieldMaster + ("com.sun.star.text.FieldMaster.SetExpression", sVariable ); + + // attach the master to the field + uno::Reference< text::XDependentTextField > xDependentField + ( xFieldInterface, uno::UNO_QUERY_THROW ); + xDependentField->attachTextFieldMaster( xMaster ); + + // set input flag at the field + xFieldProperties->setPropertyValue( + rPropNameSupplier.GetName(PROP_IS_INPUT), uno::makeAny( true )); + // set the prompt + xFieldProperties->setPropertyValue( + rPropNameSupplier.GetName(PROP_HINT), + uno::makeAny( sHint )); + } + else + { + //don't insert the field + //todo: maybe import a 'normal' input field here? + xFieldInterface = 0; + } +} + +void DomainMapper_Impl::handleAutoNum + (FieldContextPtr pContext, + PropertyNameSupplier& rPropNameSupplier, + uno::Reference< uno::XInterface > & xFieldInterface, + uno::Reference< beans::XPropertySet > xFieldProperties) +{ + //create a sequence field master "AutoNr" + uno::Reference< beans::XPropertySet > xMaster = + FindOrCreateFieldMaster + ("com.sun.star.text.FieldMaster.SetExpression", + rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AutoNr") )); + + xMaster->setPropertyValue( rPropNameSupplier.GetName(PROP_SUB_TYPE), + uno::makeAny(text::SetVariableType::SEQUENCE)); + + //apply the numbering type + xFieldProperties->setPropertyValue( + rPropNameSupplier.GetName(PROP_NUMBERING_TYPE), + uno::makeAny( lcl_ParseNumberingType(pContext->GetCommand()) )); + // attach the master to the field + uno::Reference< text::XDependentTextField > xDependentField + ( xFieldInterface, uno::UNO_QUERY_THROW ); + xDependentField->attachTextFieldMaster( xMaster ); +} + +void DomainMapper_Impl::handleAuthor + (FieldContextPtr pContext, + PropertyNameSupplier& rPropNameSupplier, + uno::Reference< uno::XInterface > & /*xFieldInterface*/, + uno::Reference< beans::XPropertySet > xFieldProperties) +{ + xFieldProperties->setPropertyValue + ( rPropNameSupplier.GetName(PROP_FULL_NAME), uno::makeAny( true )); + ::rtl::OUString sParam = + lcl_ExtractParameter(pContext->GetCommand(), sizeof(" AUTHOR") ); + if(sParam.getLength()) + { + xFieldProperties->setPropertyValue( + rPropNameSupplier.GetName( PROP_IS_FIXED ), + uno::makeAny( true )); + //PROP_CURRENT_PRESENTATION is set later anyway + } +} + + void DomainMapper_Impl::handleDocProperty + (FieldContextPtr pContext, + PropertyNameSupplier& rPropNameSupplier, + uno::Reference< uno::XInterface > & xFieldInterface, + uno::Reference< beans::XPropertySet > xFieldProperties) +{ + //some docproperties should be imported as document statistic fields, some as DocInfo fields + //others should be user fields + ::rtl::OUString sParam = + lcl_ExtractParameter(pContext->GetCommand(), sizeof(" DOCPROPERTY") ); + + if(sParam.getLength()) + { + #define SET_ARABIC 0x01 + #define SET_FULL_NAME 0x02 + struct DocPropertyMap + { + const sal_Char* pDocPropertyName; + const sal_Char* pServiceName; + sal_uInt8 nFlags; + }; + static const DocPropertyMap aDocProperties[] = + { + {"Author", "Author", SET_FULL_NAME}, + {"CreateTime", "DocInfo.CreateDateTime", 0}, + {"Characters", "CharacterCount", SET_ARABIC}, + {"Comments", "DocInfo.Description", 0}, + {"Keywords", "DocInfo.KeyWords", 0}, + {"LastPrinted", "DocInfo.PrintDateTime", 0}, + {"LastSavedBy", "DocInfo.ChangeAuthor", 0}, + {"LastSavedTime", "DocInfo.ChangeDateTime", 0}, + {"Paragraphs", "ParagraphCount", SET_ARABIC}, + {"RevisionNumber", "DocInfo.Revision", 0}, + {"Subject", "DocInfo.Subject", 0}, + {"Template", "TemplateName", 0}, + {"Title", "DocInfo.Title", 0}, + {"TotalEditingTime", "DocInfo.EditTime", 9}, + {"Words", "WordCount", SET_ARABIC} + + //other available DocProperties: + //Bytes, Category, CharactersWithSpaces, Company + //HyperlinkBase, + //Lines, Manager, NameofApplication, ODMADocId, Pages, + //Security, + }; + //search for a field mapping + ::rtl::OUString sFieldServiceName; + sal_uInt16 nMap = 0; + for( ; nMap < sizeof(aDocProperties) / sizeof(DocPropertyMap); + ++nMap ) + { + if(sParam.equalsAscii(aDocProperties[nMap].pDocPropertyName)) + { + sFieldServiceName = + ::rtl::OUString::createFromAscii + (aDocProperties[nMap].pServiceName); + break; + } + } + ::rtl::OUString sServiceName(RTL_CONSTASCII_USTRINGPARAM + ("com.sun.star.text.TextField.")); + bool bIsCustomField = false; + if(!sFieldServiceName.getLength()) + { + //create a custom property field + sServiceName += + ::rtl::OUString::createFromAscii("DocInfo.Custom"); + bIsCustomField = true; + } + else + { + sServiceName += sFieldServiceName; + } + xFieldInterface = m_xTextFactory->createInstance(sServiceName); + xFieldProperties = + uno::Reference< beans::XPropertySet >( xFieldInterface, + uno::UNO_QUERY_THROW); + if( bIsCustomField ) + xFieldProperties->setPropertyValue( + rPropNameSupplier.GetName(PROP_NAME), uno::makeAny( sParam )); + else + { + if(0 != (aDocProperties[nMap].nFlags & SET_ARABIC)) + xFieldProperties->setPropertyValue( + rPropNameSupplier.GetName(PROP_NUMBERING_TYPE), + uno::makeAny( style::NumberingType::ARABIC )); + else if(0 != (aDocProperties[nMap].nFlags & SET_FULL_NAME)) + xFieldProperties->setPropertyValue( + rPropNameSupplier.GetName(PROP_FULL_NAME), + uno::makeAny( true )); + } + } + +#undef SET_ARABIC +#undef SET_FULL_NAME +} + +void DomainMapper_Impl::handleToc + (FieldContextPtr pContext, + PropertyNameSupplier& rPropNameSupplier, + uno::Reference< uno::XInterface > & /*xFieldInterface*/, + uno::Reference< beans::XPropertySet > /*xFieldProperties*/, + const ::rtl::OUString & sTOCServiceName) +{ + ::rtl::OUString sValue; + bool bTableOfFigures = false; + bool bHyperlinks = false; + bool bFromOutline = false; + bool bFromEntries = false; + sal_Int16 nMaxLevel = 10; + ::rtl::OUString sTemplate; + ::rtl::OUString sChapterNoSeparator; +// \a Builds a table of figures but does not include the captions's label and number + if( lcl_FindInCommand( pContext->GetCommand(), 'a', sValue )) + { //make it a table of figures + bTableOfFigures = true; + } +// \b Uses a bookmark to specify area of document from which to build table of contents +// if( lcl_FindInCommand( pContext->GetCommand(), 'b', sValue )) +// { //todo: sValue contains the bookmark name - unsupported feature +// } + if( lcl_FindInCommand( pContext->GetCommand(), 'c', sValue )) +// \c Builds a table of figures of the given label + { + //todo: sValue contains the label's name + bTableOfFigures = true; + } +// \d Defines the separator between sequence and page numbers + if( lcl_FindInCommand( pContext->GetCommand(), 'd', sValue )) + { + //todo: insert the chapter number into each level and insert the separator additionally + sChapterNoSeparator = sValue; + } +// \f Builds a table of contents using TC entries instead of outline levels + if( lcl_FindInCommand( pContext->GetCommand(), 'f', sValue )) + { + //todo: sValue can contain a TOC entry identifier - use unclear + bFromEntries = true; + } +// \h Hyperlinks the entries and page numbers within the table of contents + if( lcl_FindInCommand( pContext->GetCommand(), 'h', sValue )) + { + //todo: make all entries to hyperlinks + bHyperlinks = true; + } +// \l Defines the TC entries field level used to build a table of contents +// if( lcl_FindInCommand( pContext->GetCommand(), 'l', sValue )) +// { + //todo: entries can only be included completely +// } +// \n Builds a table of contents or a range of entries, sucah as “1-9”, in a table of contents without page numbers +// if( lcl_FindInCommand( pContext->GetCommand(), 'n', sValue )) +// { + //todo: what does the description mean? +// } +// \o Builds a table of contents by using outline levels instead of TC entries + if( lcl_FindInCommand( pContext->GetCommand(), 'o', sValue )) + { + bFromOutline = true; + UniString sParam( sValue ); + xub_StrLen nIndex = 0; + sParam.GetToken( 0, '-', nIndex ); + nMaxLevel = sal_Int16( sParam.Copy( nIndex ).ToInt32( ) ); + } +// \p Defines the separator between the table entry and its page number + if( lcl_FindInCommand( pContext->GetCommand(), 'p', sValue )) + { } +// \s Builds a table of contents by using a sequence type + if( lcl_FindInCommand( pContext->GetCommand(), 's', sValue )) + { } +// \t Builds a table of contents by using style names other than the standard outline styles + if( lcl_FindInCommand( pContext->GetCommand(), 't', sValue )) + { + sal_Int32 nPos = 0; + ::rtl::OUString sToken = sValue.getToken( 1, '"', nPos); + sTemplate = sToken.getLength() ? sToken : sValue; + } +// \u Builds a table of contents by using the applied paragraph outline level + if( lcl_FindInCommand( pContext->GetCommand(), 'u', sValue )) + { + bFromOutline = true; + //todo: what doesn 'the applied paragraph outline level' refer to? + } +// \w Preserve tab characters within table entries +// if( lcl_FindInCommand( pContext->GetCommand(), 'w', sValue )) +// { + //todo: not supported +// } +// \x Preserve newline characters within table entries +// if( lcl_FindInCommand( pContext->GetCommand(), 'x', sValue )) +// { + //todo: unsupported +// } +// \z Hides page numbers within the table of contens when shown in Web Layout View +// if( lcl_FindInCommand( pContext->GetCommand(), 'z', sValue )) +// { //todo: unsupported feature } + + //if there's no option then it should be created from outline + if( !bFromOutline && !bFromEntries && !sTemplate.getLength() ) + bFromOutline = true; + + uno::Reference< beans::XPropertySet > xTOC( + m_xTextFactory->createInstance + ( bTableOfFigures ? + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM + ("com.sun.star.text.IllustrationsIndex")) + : sTOCServiceName), + uno::UNO_QUERY_THROW); + xTOC->setPropertyValue(rPropNameSupplier.GetName( PROP_TITLE ), uno::makeAny(::rtl::OUString())); + if( !bTableOfFigures ) + { + xTOC->setPropertyValue( rPropNameSupplier.GetName( PROP_LEVEL ), uno::makeAny( nMaxLevel ) ); + xTOC->setPropertyValue( rPropNameSupplier.GetName( PROP_CREATE_FROM_OUTLINE ), uno::makeAny( bFromOutline )); + xTOC->setPropertyValue( rPropNameSupplier.GetName( PROP_CREATE_FROM_MARKS ), uno::makeAny( bFromEntries )); + if( sTemplate.getLength() ) + { + //the string contains comma separated the names and related levels + //like: "Heading 1,1,Heading 2,2" + TOCStyleMap aMap; + sal_Int32 nLevel; + sal_Int32 nPosition = 0; + while( nPosition >= 0) + { + ::rtl::OUString sStyleName = sTemplate.getToken( 0, ',', nPosition ); + //empty tokens should be skipped + while( !sStyleName.getLength() && nPosition > 0 ) + sStyleName = sTemplate.getToken( 0, ',', nPosition ); + nLevel = sTemplate.getToken( 0, ',', nPosition ).toInt32(); + if( !nLevel ) + nLevel = 1; + if( sStyleName.getLength() ) + aMap.insert( TOCStyleMap::value_type(nLevel, sStyleName) ); + } + uno::Reference< container::XIndexReplace> xParaStyles; + xTOC->getPropertyValue(rPropNameSupplier.GetName(PROP_LEVEL_PARAGRAPH_STYLES)) >>= xParaStyles; + for( nLevel = 1; nLevel < 10; ++nLevel) + { + sal_Int32 nLevelCount = aMap.count( nLevel ); + if( nLevelCount ) + { + TOCStyleMap::iterator aTOCStyleIter = aMap.find( nLevel ); + + uno::Sequence< rtl::OUString> aStyles( nLevelCount ); + for ( sal_Int32 nStyle = 0; nStyle < nLevelCount; ++nStyle, ++aTOCStyleIter ) + { + aStyles[nStyle] = aTOCStyleIter->second; + } + xParaStyles->replaceByIndex(nLevel - 1, uno::makeAny(aStyles)); + } + } + xTOC->setPropertyValue(rPropNameSupplier.GetName(PROP_CREATE_FROM_LEVEL_PARAGRAPH_STYLES), uno::makeAny( true )); + + } + if(bHyperlinks || sChapterNoSeparator.getLength()) + { + uno::Reference< container::XIndexReplace> xLevelFormats; + xTOC->getPropertyValue(rPropNameSupplier.GetName(PROP_LEVEL_FORMAT)) >>= xLevelFormats; + sal_Int32 nLevelCount = xLevelFormats->getCount(); + //start with level 1, 0 is the header level + for( sal_Int32 nLevel = 1; nLevel < nLevelCount; ++nLevel) + { + uno::Sequence< beans::PropertyValues > aLevel; + xLevelFormats->getByIndex( nLevel ) >>= aLevel; + //create a copy of the level and add two new entries - hyperlink start and end + bool bChapterNoSeparator = sChapterNoSeparator.getLength() > 0; + sal_Int32 nAdd = (bHyperlinks && bChapterNoSeparator) ? 4 : 2; + uno::Sequence< beans::PropertyValues > aNewLevel( aLevel.getLength() + nAdd); + beans::PropertyValues* pNewLevel = aNewLevel.getArray(); + if( bHyperlinks ) + { + beans::PropertyValues aHyperlink(1); + aHyperlink[0].Name = rPropNameSupplier.GetName( PROP_TOKEN_TYPE ); + aHyperlink[0].Value <<= rPropNameSupplier.GetName( PROP_TOKEN_HYPERLINK_START ); + pNewLevel[0] = aHyperlink; + aHyperlink[0].Value <<= rPropNameSupplier.GetName( PROP_TOKEN_HYPERLINK_END ); + pNewLevel[aNewLevel.getLength() -1] = aHyperlink; + } + if( bChapterNoSeparator ) + { + beans::PropertyValues aChapterNo(2); + aChapterNo[0].Name = rPropNameSupplier.GetName( PROP_TOKEN_TYPE ); + aChapterNo[0].Value <<= rPropNameSupplier.GetName( PROP_TOKEN_CHAPTER_INFO ); + aChapterNo[1].Name = rPropNameSupplier.GetName( PROP_CHAPTER_FORMAT ); + //todo: is ChapterFormat::Number correct? + aChapterNo[1].Value <<= (sal_Int16)text::ChapterFormat::NUMBER; + pNewLevel[aNewLevel.getLength() - (bHyperlinks ? 4 : 2) ] = aChapterNo; + + beans::PropertyValues aChapterSeparator(2); + aChapterSeparator[0].Name = rPropNameSupplier.GetName( PROP_TOKEN_TYPE ); + aChapterSeparator[0].Value <<= rPropNameSupplier.GetName( PROP_TOKEN_TEXT ); + aChapterSeparator[1].Name = rPropNameSupplier.GetName( PROP_TEXT ); + aChapterSeparator[1].Value <<= sChapterNoSeparator; + pNewLevel[aNewLevel.getLength() - (bHyperlinks ? 3 : 1)] = aChapterSeparator; + } + //copy the 'old' entries except the last (page no) + for( sal_Int32 nToken = 0; nToken < aLevel.getLength() - 1; ++nToken) + { + pNewLevel[nToken + 1] = aLevel[nToken]; + } + //copy page no entry (last or last but one depending on bHyperlinks + sal_Int32 nPageNo = aNewLevel.getLength() - (bHyperlinks ? 2 : 3); + pNewLevel[nPageNo] = aLevel[aLevel.getLength() - 1]; + + xLevelFormats->replaceByIndex( nLevel, uno::makeAny( aNewLevel ) ); + } + } + } + pContext->SetTOC( xTOC ); +} + + /*-- 29.01.2007 11:33:16--------------------------------------------------- //the field command has to be closed (0x14 appeared) -----------------------------------------------------------------------*/ void DomainMapper_Impl::CloseFieldCommand() { +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->element("closeFieldCommand"); +#endif + FieldContextPtr pContext = m_aFieldStack.top(); OSL_ENSURE( pContext.get(), "no field context available"); if( pContext.get() ) { - static FieldConversionMap_t aFieldConversionMap; - static bool bFilled = false; m_bSetUserFieldContent = false; - if(!bFilled) - { - static const FieldConversion aFields[] = - { - // {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ADDRESSBLOCK")), "", "", FIELD_ADDRESSBLOCK }, - // {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ADVANCE")), "", "", FIELD_ADVANCE }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ASK")), "SetExpression", "SetExpression", FIELD_ASK }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AUTONUM")), "SetExpression", "SetExpression", FIELD_AUTONUM }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AUTONUMLGL")), "SetExpression", "SetExpression", FIELD_AUTONUMLGL }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AUTONUMOUT")), "SetExpression", "SetExpression", FIELD_AUTONUMOUT }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AUTHOR")), "Author", "", FIELD_AUTHOR }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DATE")), "DateTime", "", FIELD_DATE }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("COMMENTS")), "DocInfo.Description", "", FIELD_COMMENTS }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("CREATEDATE")), "DocInfo.CreateDateTime", "", FIELD_CREATEDATE }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DOCPROPERTY")), "", "", FIELD_DOCPROPERTY }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DOCVARIABLE")), "User", "", FIELD_DOCVARIABLE }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("EDITTIME")), "DocInfo.EditTime", "", FIELD_EDITTIME }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FILLIN")), "Input", "", FIELD_FILLIN }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FILENAME")), "FileName", "", FIELD_FILENAME }, - // {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FILESIZE")), "", "", FIELD_FILESIZE }, - // {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("FORMULA")), "", "", FIELD_FORMULA - // {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("GOTOBUTTON")), "", "", FIELD_GOTOBUTTON }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HYPERLINK")), "", "", FIELD_HYPERLINK }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("IF")), "ConditionalText", "", FIELD_IF }, - // {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("INFO")), "","", FIELD_INFO }, - // {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("INCLUDEPICTURE")), "", "", FIELD_INCLUDEPICTURE}, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("KEYWORDS")), "DocInfo.KeyWords", "", FIELD_KEYWORDS }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("LASTSAVEDBY")), "DocInfo.ChangeAuthor", "", FIELD_LASTSAVEDBY }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MACROBUTTON")), "Macro", "", FIELD_MACROBUTTON }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MERGEFIELD")), "Database", "Database", FIELD_MERGEFIELD}, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MERGEREC")), "DatabaseNumberOfSet", "", FIELD_MERGEREC }, - // {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("MERGESEQ")), "", "", FIELD_MERGESEQ }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NEXT")), "DatabaseNextSet", "", FIELD_NEXT }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NEXTIF")), "DatabaseNextSet", "", FIELD_NEXTIF }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PAGE")), "PageNumber", "", FIELD_PAGE }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("REF")), "GetReference", "", FIELD_REF }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("REVNUM")), "DocInfo.Revision", "", FIELD_REVNUM }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SAVEDATE")), "DocInfo.Change", "", FIELD_SAVEDATE }, - // {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SECTION")), "", "", FIELD_SECTION }, - // {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SECTIONPAGES")), "", "", FIELD_SECTIONPAGES }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SEQ")), "SetExpression", "SetExpression", FIELD_SEQ }, - // {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SET")), "","", FIELD_SET }, - // {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SKIPIF")),"", "", FIELD_SKIPIF }, - // {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("STYLEREF")),"", "", FIELD_STYLEREF }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SUBJECT")), "DocInfo.Subject", "", FIELD_SUBJECT }, - // {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SYMBOL")),"", "", FIELD_SYMBOL }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TEMPLATE")), "TemplateName", "", FIELD_TEMPLATE}, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TIME")), "DateTime", "", FIELD_TIME }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TITLE")), "DocInfo.Title", "", FIELD_TITLE }, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("USERINITIALS")), "ExtendedUser", "", FIELD_USERINITIALS}, - // {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("USERADDRESS")), "", "", FIELD_USERADDRESS }, - // {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("USERNAME")), "ExtendedUser", "", FIELD_USERNAME } - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TOC")), "com.sun.star.text.ContentIndex", "", FIELD_TOC}, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("TC")), "com.sun.star.text.ContentIndexMark", "", FIELD_TC}, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NUMCHARS")), "CharacterCount", "", FIELD_NUMCHARS}, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NUMWORDS")), "WordCount", "", FIELD_NUMWORDS}, - {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("NUMPAGES")), "PageCount", "", FIELD_NUMPAGES}, - - // {::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("")), "", "", FIELD_}, - - }; - size_t nConversions = sizeof(aFields)/sizeof(FieldConversion); - for( size_t nConversion = 0; nConversion < nConversions; ++nConversion) - { - aFieldConversionMap.insert( FieldConversionMap_t::value_type( - aFields[nConversion].sWordCommand, - aFields[nConversion] )); - } + FieldConversionMap_t aFieldConversionMap = lcl_GetFieldConversion(); - bFilled = true; - } try { uno::Reference< uno::XInterface > xFieldInterface; @@ -2697,14 +2912,31 @@ void DomainMapper_Impl::CloseFieldCommand() if(aIt != aFieldConversionMap.end()) { uno::Reference< beans::XPropertySet > xFieldProperties; - if( FIELD_HYPERLINK != aIt->second.eFieldId && - FIELD_DOCPROPERTY != aIt->second.eFieldId && - FIELD_TOC != aIt->second.eFieldId && - FIELD_TC != aIt->second.eFieldId) + bool bCreateField = true; + switch (aIt->second.eFieldId) + { + case FIELD_HYPERLINK: + case FIELD_DOCPROPERTY: + case FIELD_TOC: + case FIELD_TC: + case FIELD_FORMCHECKBOX: + bCreateField = false; + break; + default: + break; + } + if( bCreateField) { //add the service prefix OUString sServiceName(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextField.")); sServiceName += ::rtl::OUString::createFromAscii(aIt->second.cFieldServiceName ); + +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->startElement("fieldService"); + dmapper_logger->chars(sServiceName); + dmapper_logger->endElement("fieldService"); +#endif + xFieldInterface = m_xTextFactory->createInstance(sServiceName); xFieldProperties = uno::Reference< beans::XPropertySet >( xFieldInterface, uno::UNO_QUERY_THROW); } @@ -2714,69 +2946,15 @@ void DomainMapper_Impl::CloseFieldCommand() case FIELD_ADDRESSBLOCK: break; case FIELD_ADVANCE : break; case FIELD_ASK : - { - //doesn the command contain a variable name? - ::rtl::OUString sVariable, sHint; - - sVariable = lcl_ExctractAskVariableAndHint( pContext->GetCommand(), sHint ); - if(sVariable.getLength()) - { - // determine field master name - uno::Reference< beans::XPropertySet > xMaster = FindOrCreateFieldMaster( - "com.sun.star.text.FieldMaster.SetExpression", sVariable ); - - // attach the master to the field - uno::Reference< text::XDependentTextField > xDependentField( xFieldInterface, uno::UNO_QUERY_THROW ); - xDependentField->attachTextFieldMaster( xMaster ); - - // set input flag at the field - xFieldProperties->setPropertyValue( - rPropNameSupplier.GetName(PROP_IS_INPUT), uno::makeAny( true )); - // set the prompt - xFieldProperties->setPropertyValue( - rPropNameSupplier.GetName(PROP_HINT), - uno::makeAny( sHint )); - } - else - { - //don't insert the field - //todo: maybe import a 'normal' input field here? - xFieldInterface = 0; - } - } + handleFieldAsk(pContext, rPropNameSupplier, xFieldInterface, xFieldProperties); break; case FIELD_AUTONUM : case FIELD_AUTONUMLGL : case FIELD_AUTONUMOUT : - { - //create a sequence field master "AutoNr" - uno::Reference< beans::XPropertySet > xMaster = FindOrCreateFieldMaster( - "com.sun.star.text.FieldMaster.SetExpression", - rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("AutoNr") )); - - xMaster->setPropertyValue( rPropNameSupplier.GetName(PROP_SUB_TYPE), - uno::makeAny(text::SetVariableType::SEQUENCE)); - - //apply the numbering type - xFieldProperties->setPropertyValue( - rPropNameSupplier.GetName(PROP_NUMBERING_TYPE), - uno::makeAny( lcl_ParseNumberingType(pContext->GetCommand()) )); - // attach the master to the field - uno::Reference< text::XDependentTextField > xDependentField( xFieldInterface, uno::UNO_QUERY_THROW ); - xDependentField->attachTextFieldMaster( xMaster ); - } + handleAutoNum(pContext, rPropNameSupplier, xFieldInterface, xFieldProperties); break; case FIELD_AUTHOR : - { - xFieldProperties->setPropertyValue( rPropNameSupplier.GetName(PROP_FULL_NAME), uno::makeAny( true )); - ::rtl::OUString sParam = lcl_ExtractParameter(pContext->GetCommand(), sizeof(" AUTHOR") ); - if(sParam.getLength()) - { - xFieldProperties->setPropertyValue( - rPropNameSupplier.GetName( PROP_IS_FIXED ), uno::makeAny( true )); - //PROP_CURRENT_PRESENTATION is set later anyway - } - } + handleAuthor(pContext, rPropNameSupplier, xFieldInterface, xFieldProperties); break; case FIELD_DATE: { @@ -2807,86 +2985,7 @@ void DomainMapper_Impl::CloseFieldCommand() } break; case FIELD_DOCPROPERTY : - { - //some docproperties should be imported as document statistic fields, some as DocInfo fields - //others should be user fields - ::rtl::OUString sParam = lcl_ExtractParameter(pContext->GetCommand(), sizeof(" DOCPROPERTY") ); - if(sParam.getLength()) - { - #define SET_ARABIC 0x01 - #define SET_FULL_NAME 0x02 - struct DocPropertyMap - { - const sal_Char* pDocPropertyName; - const sal_Char* pServiceName; - sal_uInt8 nFlags; - }; - static const DocPropertyMap aDocProperties[] = - { - {"Author", "Author", SET_FULL_NAME}, - {"CreateTime", "DocInfo.CreateDateTime", 0}, - {"Characters", "CharacterCount", SET_ARABIC}, - {"Comments", "DocInfo.Description", 0}, - {"Keywords", "DocInfo.KeyWords", 0}, - {"LastPrinted", "DocInfo.PrintDateTime", 0}, - {"LastSavedBy", "DocInfo.ChangeAuthor", 0}, - {"LastSavedTime", "DocInfo.ChangeDateTime", 0}, - {"Paragraphs", "ParagraphCount", SET_ARABIC}, - {"RevisionNumber", "DocInfo.Revision", 0}, - {"Subject", "DocInfo.Subject", 0}, - {"Template", "TemplateName", 0}, - {"Title", "DocInfo.Title", 0}, - {"TotalEditingTime", "DocInfo.EditTime", 9}, - {"Words", "WordCount", SET_ARABIC} - - //other available DocProperties: - //Bytes, Category, CharactersWithSpaces, Company - //HyperlinkBase, - //Lines, Manager, NameofApplication, ODMADocId, Pages, - //Security, - }; - //search for a field mapping - ::rtl::OUString sFieldServiceName; - sal_uInt16 nMap = 0; - for( ; nMap < sizeof(aDocProperties) / sizeof(DocPropertyMap); ++nMap ) - { - if(sParam.equalsAscii(aDocProperties[nMap].pDocPropertyName)) - { - sFieldServiceName = ::rtl::OUString::createFromAscii(aDocProperties[nMap].pServiceName); - break; - } - } - ::rtl::OUString sServiceName(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.TextField.")); - bool bIsCustomField = false; - if(!sFieldServiceName.getLength()) - { - //create a custom property field - sServiceName += ::rtl::OUString::createFromAscii("DocInfo.Custom"); - bIsCustomField = true; - } - else - { - sServiceName += sFieldServiceName; - } - xFieldInterface = m_xTextFactory->createInstance(sServiceName); - xFieldProperties = uno::Reference< beans::XPropertySet >( xFieldInterface, uno::UNO_QUERY_THROW); - if( bIsCustomField ) - xFieldProperties->setPropertyValue( - rPropNameSupplier.GetName(PROP_NAME), uno::makeAny( sParam )); - else - { - if(0 != (aDocProperties[nMap].nFlags & SET_ARABIC)) - xFieldProperties->setPropertyValue( - rPropNameSupplier.GetName(PROP_NUMBERING_TYPE), - uno::makeAny( style::NumberingType::ARABIC )); - else if(0 != (aDocProperties[nMap].nFlags & SET_FULL_NAME)) - xFieldProperties->setPropertyValue( - rPropNameSupplier.GetName(PROP_FULL_NAME), uno::makeAny( true )); - } - } - } - #undef SET_ARABIC - #undef SET_FULL_NAME + handleDocProperty(pContext, rPropNameSupplier, xFieldInterface, xFieldProperties); break; case FIELD_DOCVARIABLE : { @@ -2919,13 +3018,79 @@ void DomainMapper_Impl::CloseFieldCommand() break; case FIELD_FILESIZE : break; case FIELD_FORMULA : break; + case FIELD_FORMCHECKBOX : + { + FFDataHandler::Pointer_t + pFFDataHandler(pContext->getFFDataHandler()); + FormControlHelper::Pointer_t + pFormControlHelper(new FormControlHelper + (FIELD_FORMCHECKBOX, + m_xTextDocument, pFFDataHandler)); + pContext->setFormControlHelper(pFormControlHelper); + } + break; + case FIELD_FORMDROPDOWN : break; + case FIELD_FORMTEXT : + { + FFDataHandler::Pointer_t pFFDataHandler + (pContext->getFFDataHandler()); + + xFieldProperties->setPropertyValue + (rPropNameSupplier.GetName(PROP_HINT), + uno::makeAny(pFFDataHandler->getStatusText())); + xFieldProperties->setPropertyValue + (rPropNameSupplier.GetName(PROP_HELP), + uno::makeAny(pFFDataHandler->getHelpText())); + xFieldProperties->setPropertyValue + (rPropNameSupplier.GetName(PROP_CONTENT), + uno::makeAny(pFFDataHandler->getTextDefault())); + } + break; case FIELD_GOTOBUTTON : break; case FIELD_HYPERLINK: { - sal_Int32 nStartQuote = pContext->GetCommand().indexOf( '\"' ); - sal_Int32 nEndQuote = nStartQuote < pContext->GetCommand().getLength() + 1 ? pContext->GetCommand().indexOf( '\"', nStartQuote + 1) : -1; - if( nEndQuote > 0) - pContext->SetHyperlinkURL( pContext->GetCommand().copy(nStartQuote + 1, nEndQuote - nStartQuote - 1) ); + ::std::vector<rtl::OUString> aParts = pContext->GetCommandParts(); + ::std::vector<rtl::OUString>::const_iterator aItEnd = aParts.end(); + ::std::vector<rtl::OUString>::const_iterator aPartIt = aParts.begin(); + + OUString sURL; + + while (aPartIt != aItEnd) + { + if (aPartIt->equalsAscii("\\l")) + { + aPartIt++; + + if (aPartIt == aItEnd) + break; + + sURL = OUString('#'); + sURL += *aPartIt; + } + else if (aPartIt->equalsAscii("\\m") || + aPartIt->equalsAscii("\\n")) + { + } + else if (aPartIt->equalsAscii("\\o") || + aPartIt->equalsAscii("\\t")) + { + aPartIt++; + + if (aPartIt == aItEnd) + break; + } + else + { + sURL = *aPartIt; + } + + aPartIt++; + } + + if (sURL.getLength() > 0) + { + pContext->SetHyperlinkURL(sURL); + } } break; case FIELD_IF : break; @@ -3065,211 +3230,8 @@ void DomainMapper_Impl::CloseFieldCommand() case FIELD_USERNAME : //todo: user name is firstname + lastname break; case FIELD_TOC: - { - ::rtl::OUString sValue; - bool bTableOfFigures = false; - bool bHyperlinks = false; - bool bFromOutline = false; - bool bFromEntries = false; - sal_Int16 nMaxLevel = 10; - ::rtl::OUString sTemplate; - ::rtl::OUString sChapterNoSeparator; - // \a Builds a table of figures but does not include the captions's label and number - if( lcl_FindInCommand( pContext->GetCommand(), 'a', sValue )) - { //make it a table of figures - bTableOfFigures = true; - } - // \b Uses a bookmark to specify area of document from which to build table of contents - // if( lcl_FindInCommand( pContext->GetCommand(), 'b', sValue )) - // { //todo: sValue contains the bookmark name - unsupported feature - // } - if( lcl_FindInCommand( pContext->GetCommand(), 'c', sValue )) - // \c Builds a table of figures of the given label - { - //todo: sValue contains the label's name - bTableOfFigures = true; - } - // \d Defines the separator between sequence and page numbers - if( lcl_FindInCommand( pContext->GetCommand(), 'd', sValue )) - { - //todo: insert the chapter number into each level and insert the separator additionally - sChapterNoSeparator = sValue; - } - // \f Builds a table of contents using TC entries instead of outline levels - if( lcl_FindInCommand( pContext->GetCommand(), 'f', sValue )) - { - //todo: sValue can contain a TOC entry identifier - use unclear - bFromEntries = true; - } - // \h Hyperlinks the entries and page numbers within the table of contents - if( lcl_FindInCommand( pContext->GetCommand(), 'h', sValue )) - { - //todo: make all entries to hyperlinks - bHyperlinks = true; - } - // \l Defines the TC entries field level used to build a table of contents - // if( lcl_FindInCommand( pContext->GetCommand(), 'l', sValue )) - // { - //todo: entries can only be included completely - // } - // \n Builds a table of contents or a range of entries, sucah as “1-9”, in a table of contents without page numbers - // if( lcl_FindInCommand( pContext->GetCommand(), 'n', sValue )) - // { - //todo: what does the description mean? - // } - // \o Builds a table of contents by using outline levels instead of TC entries - if( lcl_FindInCommand( pContext->GetCommand(), 'o', sValue )) - { - bFromOutline = true; - UniString sParam( sValue ); - xub_StrLen nIndex = 0; - sParam.GetToken( 0, '-', nIndex ); - nMaxLevel = sal_Int16( sParam.Copy( nIndex ).ToInt32( ) ); - } - // \p Defines the separator between the table entry and its page number - if( lcl_FindInCommand( pContext->GetCommand(), 'p', sValue )) - { } - // \s Builds a table of contents by using a sequence type - if( lcl_FindInCommand( pContext->GetCommand(), 's', sValue )) - { } - // \t Builds a table of contents by using style names other than the standard outline styles - if( lcl_FindInCommand( pContext->GetCommand(), 't', sValue )) - { - sal_Int32 nPos = 0; - ::rtl::OUString sToken = sValue.getToken( 1, '"', nPos); - sTemplate = sToken.getLength() ? sToken : sValue; - } - // \u Builds a table of contents by using the applied paragraph outline level - if( lcl_FindInCommand( pContext->GetCommand(), 'u', sValue )) - { - bFromOutline = true; - //todo: what doesn 'the applied paragraph outline level' refer to? - } - // \w Preserve tab characters within table entries - // if( lcl_FindInCommand( pContext->GetCommand(), 'w', sValue )) - // { - //todo: not supported - // } - // \x Preserve newline characters within table entries - // if( lcl_FindInCommand( pContext->GetCommand(), 'x', sValue )) - // { - //todo: unsupported - // } - // \z Hides page numbers within the table of contens when shown in Web Layout View - // if( lcl_FindInCommand( pContext->GetCommand(), 'z', sValue )) - // { //todo: unsupported feature } - - //if there's no option then it should be created from outline - if( !bFromOutline && !bFromEntries && !sTemplate.getLength() ) - bFromOutline = true; - - uno::Reference< beans::XPropertySet > xTOC( - m_xTextFactory->createInstance( - bTableOfFigures ? - ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.text.IllustrationsIndex")) : - ::rtl::OUString::createFromAscii(aIt->second.cFieldServiceName)), - uno::UNO_QUERY_THROW); - xTOC->setPropertyValue(rPropNameSupplier.GetName( PROP_TITLE ), uno::makeAny(::rtl::OUString())); - if( !bTableOfFigures ) - { - xTOC->setPropertyValue( rPropNameSupplier.GetName( PROP_LEVEL ), uno::makeAny( nMaxLevel ) ); - xTOC->setPropertyValue( rPropNameSupplier.GetName( PROP_CREATE_FROM_OUTLINE ), uno::makeAny( bFromOutline )); - xTOC->setPropertyValue( rPropNameSupplier.GetName( PROP_CREATE_FROM_MARKS ), uno::makeAny( bFromEntries )); - if( sTemplate.getLength() ) - { - //the string contains comma separated the names and related levels - //like: "Heading 1,1,Heading 2,2" - TOCStyleMap aMap; - sal_Int32 nLevel; - sal_Int32 nPosition = 0; - while( nPosition >= 0) - { - ::rtl::OUString sStyleName = sTemplate.getToken( 0, ',', nPosition ); - //empty tokens should be skipped - while( !sStyleName.getLength() && nPosition > 0 ) - sStyleName = sTemplate.getToken( 0, ',', nPosition ); - nLevel = sTemplate.getToken( 0, ',', nPosition ).toInt32(); - if( !nLevel ) - nLevel = 1; - if( sStyleName.getLength() ) - aMap.insert( TOCStyleMap::value_type(nLevel, sStyleName) ); - } - uno::Reference< container::XIndexReplace> xParaStyles; - xTOC->getPropertyValue(rPropNameSupplier.GetName(PROP_LEVEL_PARAGRAPH_STYLES)) >>= xParaStyles; - for( nLevel = 1; nLevel < 10; ++nLevel) - { - sal_Int32 nLevelCount = aMap.count( nLevel ); - if( nLevelCount ) - { - TOCStyleMap::iterator aTOCStyleIter = aMap.find( nLevel ); - - uno::Sequence< rtl::OUString> aStyles( nLevelCount ); - for ( sal_Int32 nStyle = 0; nStyle < nLevelCount; ++nStyle, ++aTOCStyleIter ) - { - aStyles[nStyle] = aTOCStyleIter->second; - } - xParaStyles->replaceByIndex(nLevel - 1, uno::makeAny(aStyles)); - } - } - xTOC->setPropertyValue(rPropNameSupplier.GetName(PROP_CREATE_FROM_LEVEL_PARAGRAPH_STYLES), uno::makeAny( true )); - - } - if(bHyperlinks || sChapterNoSeparator.getLength()) - { - uno::Reference< container::XIndexReplace> xLevelFormats; - xTOC->getPropertyValue(rPropNameSupplier.GetName(PROP_LEVEL_FORMAT)) >>= xLevelFormats; - sal_Int32 nLevelCount = xLevelFormats->getCount(); - //start with level 1, 0 is the header level - for( sal_Int32 nLevel = 1; nLevel < nLevelCount; ++nLevel) - { - uno::Sequence< beans::PropertyValues > aLevel; - xLevelFormats->getByIndex( nLevel ) >>= aLevel; - //create a copy of the level and add two new entries - hyperlink start and end - bool bChapterNoSeparator = sChapterNoSeparator.getLength() > 0; - sal_Int32 nAdd = (bHyperlinks && bChapterNoSeparator) ? 4 : 2; - uno::Sequence< beans::PropertyValues > aNewLevel( aLevel.getLength() + nAdd); - beans::PropertyValues* pNewLevel = aNewLevel.getArray(); - if( bHyperlinks ) - { - beans::PropertyValues aHyperlink(1); - aHyperlink[0].Name = rPropNameSupplier.GetName( PROP_TOKEN_TYPE ); - aHyperlink[0].Value <<= rPropNameSupplier.GetName( PROP_TOKEN_HYPERLINK_START ); - pNewLevel[0] = aHyperlink; - aHyperlink[0].Value <<= rPropNameSupplier.GetName( PROP_TOKEN_HYPERLINK_END ); - pNewLevel[aNewLevel.getLength() -1] = aHyperlink; - } - if( bChapterNoSeparator ) - { - beans::PropertyValues aChapterNo(2); - aChapterNo[0].Name = rPropNameSupplier.GetName( PROP_TOKEN_TYPE ); - aChapterNo[0].Value <<= rPropNameSupplier.GetName( PROP_TOKEN_CHAPTER_INFO ); - aChapterNo[1].Name = rPropNameSupplier.GetName( PROP_CHAPTER_FORMAT ); - //todo: is ChapterFormat::Number correct? - aChapterNo[1].Value <<= (sal_Int16)text::ChapterFormat::NUMBER; - pNewLevel[aNewLevel.getLength() - (bHyperlinks ? 4 : 2) ] = aChapterNo; - - beans::PropertyValues aChapterSeparator(2); - aChapterSeparator[0].Name = rPropNameSupplier.GetName( PROP_TOKEN_TYPE ); - aChapterSeparator[0].Value <<= rPropNameSupplier.GetName( PROP_TOKEN_TEXT ); - aChapterSeparator[1].Name = rPropNameSupplier.GetName( PROP_TEXT ); - aChapterSeparator[1].Value <<= sChapterNoSeparator; - pNewLevel[aNewLevel.getLength() - (bHyperlinks ? 3 : 1)] = aChapterSeparator; - } - //copy the 'old' entries except the last (page no) - for( sal_Int32 nToken = 0; nToken < aLevel.getLength() - 1; ++nToken) - { - pNewLevel[nToken + 1] = aLevel[nToken]; - } - //copy page no entry (last or last but one depending on bHyperlinks - sal_Int32 nPageNo = aNewLevel.getLength() - (bHyperlinks ? 2 : 3); - pNewLevel[nPageNo] = aLevel[aLevel.getLength() - 1]; - - xLevelFormats->replaceByIndex( nLevel, uno::makeAny( aNewLevel ) ); - } - } - } - pContext->SetTOC( xTOC ); - } + handleToc(pContext, rPropNameSupplier, xFieldInterface, xFieldProperties, + ::rtl::OUString::createFromAscii(aIt->second.cFieldServiceName)); break; case FIELD_TC : { @@ -3343,6 +3305,11 @@ bool DomainMapper_Impl::IsFieldResultAsString() -----------------------------------------------------------------------*/ void DomainMapper_Impl::SetFieldResult( ::rtl::OUString& rResult ) { +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->startElement("setFieldResult"); + dmapper_logger->chars(rResult); +#endif + FieldContextPtr pContext = m_aFieldStack.top(); OSL_ENSURE( pContext.get(), "no field context available"); if( pContext.get() ) @@ -3388,11 +3355,32 @@ void DomainMapper_Impl::SetFieldResult( ::rtl::OUString& rResult ) } } +void DomainMapper_Impl::SetFieldFFData(FFDataHandler::Pointer_t pFFDataHandler) +{ +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->startElement("setFieldFFData"); +#endif + + FieldContextPtr pContext = m_aFieldStack.top(); + if (pContext.get()) + { + pContext->setFFDataHandler(pFFDataHandler); + } + +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->endElement("setFieldFFData"); +#endif +} + /*-- 29.01.2007 11:33:17--------------------------------------------------- //the end of field is reached (0x15 appeared) - the command might still be open -----------------------------------------------------------------------*/ void DomainMapper_Impl::PopFieldContext() { +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->element("popFieldContext"); +#endif + FieldContextPtr pContext = m_aFieldStack.top(); OSL_ENSURE( pContext.get(), "no field context available"); if( pContext.get() ) @@ -3426,15 +3414,23 @@ void DomainMapper_Impl::PopFieldContext() uno::Reference< text::XTextAppendAndConvert > xTextAppendAndConvert( xTextAppend, uno::UNO_QUERY_THROW ); xTextAppendAndConvert->appendTextContent( xToInsert, uno::Sequence< beans::PropertyValue >() ); } - else if(pContext->GetHyperlinkURL().getLength()) + else { - PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier(); - xCrsr->gotoEnd( true ); + FormControlHelper::Pointer_t pFormControlHelper(pContext->getFormControlHelper()); + if (pFormControlHelper.get() != NULL) + { + uno::Reference<text::XTextRange> xTxtRange(xCrsr, uno::UNO_QUERY); + pFormControlHelper->insertControl(xTxtRange); + } + else if(pContext->GetHyperlinkURL().getLength()) + { + PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier(); + xCrsr->gotoEnd( true ); - uno::Reference< beans::XPropertySet > xCrsrProperties( xCrsr, uno::UNO_QUERY_THROW ); - xCrsrProperties->setPropertyValue( - rPropNameSupplier.GetName(PROP_HYPER_LINK_U_R_L), uno:: - makeAny(pContext->GetHyperlinkURL())); + uno::Reference< beans::XPropertySet > xCrsrProperties( xCrsr, uno::UNO_QUERY_THROW ); + xCrsrProperties->setPropertyValue(rPropNameSupplier.GetName(PROP_HYPER_LINK_U_R_L), uno:: + makeAny(pContext->GetHyperlinkURL())); + } } } } @@ -3757,4 +3753,19 @@ void DomainMapper_Impl::ApplySettingsTable() } } } + +SectionPropertyMap * DomainMapper_Impl::GetSectionContext() +{ + SectionPropertyMap* pSectionContext = 0; + //the section context is not availabe before the first call of startSectionGroup() + if( !IsAnyTableImport() ) + { + PropertyMapPtr pContext = GetTopContextOfType(CONTEXT_SECTION); + OSL_ENSURE(pContext.get(), "Section context is not in the stack!"); + pSectionContext = dynamic_cast< SectionPropertyMap* >( pContext.get() ); + } + + return pSectionContext; +} + }} diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx index 00881d45968f..145e19412a75 100644 --- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx +++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx @@ -52,6 +52,8 @@ #include <SettingsTable.hxx> #include <GraphicImport.hxx> #include <OLEHandler.hxx> +#include <FFDataHandler.hxx> +#include <FormControlHelper.hxx> #include <map> #include <string.h> @@ -134,6 +136,8 @@ class FieldContext ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > m_xTOC;//TOX ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > m_xTC;//TOX entry ::rtl::OUString m_sHyperlinkURL; + FFDataHandler::Pointer_t m_pFFDataHandler; + FormControlHelper::Pointer_t m_pFormControlHelper; public: FieldContext(::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > xStart); @@ -159,6 +163,13 @@ public: void SetHyperlinkURL( const ::rtl::OUString& rURL ) { m_sHyperlinkURL = rURL; } const ::rtl::OUString& GetHyperlinkURL() { return m_sHyperlinkURL; } + void setFFDataHandler(FFDataHandler::Pointer_t pFFDataHandler) { m_pFFDataHandler = pFFDataHandler; } + FFDataHandler::Pointer_t getFFDataHandler() const { return m_pFFDataHandler; } + + void setFormControlHelper(FormControlHelper::Pointer_t pFormControlHelper) { m_pFormControlHelper = pFormControlHelper; } + FormControlHelper::Pointer_t getFormControlHelper() const { return m_pFormControlHelper; } + + ::std::vector<rtl::OUString> GetCommandParts() const; }; struct TextAppendContext @@ -487,12 +498,40 @@ public: bool IsOpenField() const; //collect the pieces of the command void AppendFieldCommand(::rtl::OUString& rPartOfCommand); + void handleFieldAsk + (FieldContextPtr pContext, + PropertyNameSupplier& rPropNameSupplier, + uno::Reference< uno::XInterface > & xFieldInterface, + uno::Reference< beans::XPropertySet > xFieldProperties); + void handleAutoNum + (FieldContextPtr pContext, + PropertyNameSupplier& rPropNameSupplier, + uno::Reference< uno::XInterface > & xFieldInterface, + uno::Reference< beans::XPropertySet > xFieldProperties); + void handleAuthor + (FieldContextPtr pContext, + PropertyNameSupplier& rPropNameSupplier, + uno::Reference< uno::XInterface > & xFieldInterface, + uno::Reference< beans::XPropertySet > xFieldProperties); + void handleDocProperty + (FieldContextPtr pContext, + PropertyNameSupplier& rPropNameSupplier, + uno::Reference< uno::XInterface > & xFieldInterface, + uno::Reference< beans::XPropertySet > xFieldProperties); + void handleToc + (FieldContextPtr pContext, + PropertyNameSupplier& rPropNameSupplier, + uno::Reference< uno::XInterface > & xFieldInterface, + uno::Reference< beans::XPropertySet > xFieldProperties, + const ::rtl::OUString & sTOCServiceName); //the field command has to be closed (0x14 appeared) void CloseFieldCommand(); //the _current_ fields require a string type result while TOCs accept richt results bool IsFieldResultAsString(); //apply the result text to the related field void SetFieldResult( ::rtl::OUString& rResult ); + // set FFData of top field context + void SetFieldFFData( FFDataHandler::Pointer_t pFFDataHandler ); //the end of field is reached (0x15 appeared) - the command might still be open void PopFieldContext(); @@ -557,7 +596,7 @@ public: void ResetParaRedline( ); void ApplySettingsTable(); - + SectionPropertyMap * GetSectionContext(); }; } //namespace dmapper } //namespace writerfilter diff --git a/writerfilter/source/dmapper/FFData.xml b/writerfilter/source/dmapper/FFData.xml new file mode 100644 index 000000000000..525f59391dc4 --- /dev/null +++ b/writerfilter/source/dmapper/FFData.xml @@ -0,0 +1,58 @@ +<model> + <class name="FFDataHandler"> + <parent name="Properties"/> + <typedef name="Pointer_t" type="shared_ptr"/> + <typedef name="DropDownEntries_t"> + <vector type="OUString"/> + </typedef> + <member name="name" type="OUString"/> + <member name="enabled" type="bool"/> + <member name="calcOnExit" type="bool"/> + <member name="entryMacro" type="OUString"/> + <member name="exitMacro" type="OUString"/> + <member name="helpTextType" type="sal_uInt32"/> + <member name="helpText" type="OUString"/> + <member name="statusTextType" type="sal_uInt32"/> + <member name="statusText" type="OUString"/> + <member name="checkboxHeight" type="sal_uInt32"/> + <member name="checkboxAutoHeight" type="bool"/> + <member name="checkboxDefault" type="bool"/> + <member name="checkboxChecked" type="bool"/> + <member name="dropDownResult" type="OUString"/> + <member name="dropDownDefault" type="OUString"/> + <member name="dropDownEntries" type="DropDownEntries_t"/> + <member name="textType" type="sal_uInt32"/> + <member name="textMaxLength" type="sal_uInt32"/> + <member name="textDefault" type="OUString"/> + <member name="textFormat" type="OUString"/> + <sprm> + <element name="name" action="set" id="NS_ooxml::LN_CT_FFData_name"/> + <element name="enabled" action="set" id="NS_ooxml::LN_CT_FFData_enabled"/> + <element name="calcOnExit" action="set" id="NS_ooxml::LN_CT_FFData_calcOnExit"/> + <element name="entryMacro" action="set" id="NS_ooxml::LN_CT_FFData_entryMacro"/> + <element name="exitMacro" action="set" id="NS_ooxml::LN_CT_FFData_exitMacro"/> + <element name="helpText" action="resolve" id="NS_ooxml::LN_CT_FFData_helpText"/> + <element name="statusText" action="resolve" id="NS_ooxml::LN_CT_FFData_statusText"/> + <element name="size" member="checkboxHeight" action="set" id="NS_ooxml::LN_CT_FFCheckBox_size"/> + <element name="sizeAuto" member="checkboxAutoHeight" action="set" id="NS_ooxml::LN_CT_FFCheckBox_sizeAuto"/> + <element name="default" member="checkboxDefault" action="set" id="NS_ooxml::LN_CT_FFCheckBox_default"/> + <element name="checked" member="checkboxChecked" action="set" id="NS_ooxml::LN_CT_FFCheckBox_checked"/> + <element name="checkBox" action="resolve" id="NS_ooxml::LN_CT_FFData_checkBox"/> + <element name="result" member="dropDownResult" action="set" id="NS_ooxml::LN_CT_FFDDList_result"/> + <element name="default" member="dropDownDefault" action="set" id="NS_ooxml::LN_CT_FFDDList_default"/> + <element name="listEntry" member="dropDownEntries" action="pushback" id="NS_ooxml::LN_CT_FFDDList_listEntry"/> + <element name="ddList" action="resolve" id="NS_ooxml::LN_CT_FFData_ddList"/> + <element name="type" member="textType" action="set" id="NS_ooxml::LN_CT_FFTextInput_type"/> + <element name="default" member="textDefault" action="set" id="NS_ooxml::LN_CT_FFTextInput_default"/> + <element name="maxLength" member="textMaxLength" action="set" id="NS_ooxml::LN_CT_FFTextInput_maxLength"/> + <element name="format" member="textFormat" action="set" id="NS_ooxml::LN_CT_FFTextInput_format"/> + <element name="textInput" action="resolve" id="NS_ooxml::LN_CT_FFData_textInput"/> + </sprm> + <attribute> + <attribute name="helpText:type" member="helpTextType" id="NS_ooxml::LN_CT_FFHelpText_type"/> + <attribute name="helpText:val" member="helpText" id="NS_ooxml::LN_CT_FFHelpText_val"/> + <attribute name="statusText:type" member="statusTextType" id="NS_ooxml::LN_CT_FFStatusText_type"/> + <attribute name="statusText:val" member="statusText" id="NS_ooxml::LN_CT_FFStatusText_val"/> + </attribute> + </class> +</model>
\ No newline at end of file diff --git a/writerfilter/source/dmapper/FFDataHandler.cxx b/writerfilter/source/dmapper/FFDataHandler.cxx new file mode 100644 index 000000000000..9f9430401161 --- /dev/null +++ b/writerfilter/source/dmapper/FFDataHandler.cxx @@ -0,0 +1,483 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: PropertyMap.hxx,v $ + * $Revision: 1.18 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#include "FFDataHandler.hxx" + +#include <ooxml/resourceids.hxx> +#ifdef DEBUG_DOMAINMAPPER +#include <resourcemodel/QNameToString.hxx> +#include "dmapperLoggers.hxx" +#endif +namespace writerfilter { +namespace dmapper { + +/************************ + * class: FFDataHandler * + ************************/ + +FFDataHandler::FFDataHandler() +: m_bEnabled(false), + m_bCalcOnExit(false), + m_nHelpTextType(0), + m_nStatusTextType(0), + m_nCheckboxHeight(0), + m_bCheckboxAutoHeight(false), + m_bCheckboxDefault(false), + m_bCheckboxChecked(false), + m_nTextType(0), + m_nTextMaxLength(0) +{ +} + + +FFDataHandler::~FFDataHandler() +{ +} + +// member: FFDataHandler::name +void FFDataHandler::setName(const rtl::OUString & r_sName) +{ + m_sName = r_sName; +} + +const rtl::OUString & FFDataHandler::getName() const +{ + return m_sName; +} + +// member: FFDataHandler::enabled +void FFDataHandler::setEnabled(bool r_enabled) +{ + m_bEnabled = r_enabled; +} + +bool FFDataHandler::getEnabled() const +{ + return m_bEnabled; +} + +// member: FFDataHandler::calcOnExit +void FFDataHandler::setCalcOnExit(bool r_calcOnExit) +{ + m_bCalcOnExit = r_calcOnExit; +} + +bool FFDataHandler::getCalcOnExit() const +{ + return m_bCalcOnExit; +} + +// member: FFDataHandler::entryMacro +void FFDataHandler::setEntryMacro(const rtl::OUString & r_sEntryMacro) +{ + m_sEntryMacro = r_sEntryMacro; +} + +const rtl::OUString & FFDataHandler::getEntryMacro() const +{ + return m_sEntryMacro; +} + +// member: FFDataHandler::exitMacro +void FFDataHandler::setExitMacro(const rtl::OUString & r_sExitMacro) +{ + m_sExitMacro = r_sExitMacro; +} + +const rtl::OUString & FFDataHandler::getExitMacro() const +{ + return m_sExitMacro; +} + +// member: FFDataHandler::helpTextType +void FFDataHandler::setHelpTextType(sal_uInt32 r_helpTextType) +{ + m_nHelpTextType = r_helpTextType; +} + +sal_uInt32 FFDataHandler::getHelpTextType() const +{ + return m_nHelpTextType; +} + +// member: FFDataHandler::helpText +void FFDataHandler::setHelpText(const rtl::OUString & r_sHelpText) +{ + m_sHelpText = r_sHelpText; +} + +const rtl::OUString & FFDataHandler::getHelpText() const +{ + return m_sHelpText; +} + +// member: FFDataHandler::statusTextType +void FFDataHandler::setStatusTextType(sal_uInt32 r_statusTextType) +{ + m_nStatusTextType = r_statusTextType; +} + +sal_uInt32 FFDataHandler::getStatusTextType() const +{ + return m_nStatusTextType; +} + +// member: FFDataHandler::statusText +void FFDataHandler::setStatusText(const rtl::OUString & r_sStatusText) +{ + m_sStatusText = r_sStatusText; +} + +const rtl::OUString & FFDataHandler::getStatusText() const +{ + return m_sStatusText; +} + +// member: FFDataHandler::checkboxHeight +void FFDataHandler::setCheckboxHeight(sal_uInt32 r_checkboxHeight) +{ + m_nCheckboxHeight = r_checkboxHeight; +} + +sal_uInt32 FFDataHandler::getCheckboxHeight() const +{ + return m_nCheckboxHeight; +} + +// member: FFDataHandler::checkboxAutoHeight +void FFDataHandler::setCheckboxAutoHeight(bool r_checkboxAutoHeight) +{ + m_bCheckboxAutoHeight = r_checkboxAutoHeight; +} + +bool FFDataHandler::getCheckboxAutoHeight() const +{ + return m_bCheckboxAutoHeight; +} + +// member: FFDataHandler::checkboxDefault +void FFDataHandler::setCheckboxDefault(bool r_checkboxDefault) +{ + m_bCheckboxDefault = r_checkboxDefault; +} + +bool FFDataHandler::getCheckboxDefault() const +{ + return m_bCheckboxDefault; +} + +// member: FFDataHandler::checkboxChecked +void FFDataHandler::setCheckboxChecked(bool r_checkboxChecked) +{ + m_bCheckboxChecked = r_checkboxChecked; +} + +bool FFDataHandler::getCheckboxChecked() const +{ + return m_bCheckboxChecked; +} + +// member: FFDataHandler::dropDownResult +void FFDataHandler::setDropDownResult(const rtl::OUString & r_sDropDownResult) +{ + m_sDropDownResult = r_sDropDownResult; +} + +const rtl::OUString & FFDataHandler::getDropDownResult() const +{ + return m_sDropDownResult; +} + +// member: FFDataHandler::dropDownDefault +void FFDataHandler::setDropDownDefault(const rtl::OUString & r_sDropDownDefault) +{ + m_sDropDownDefault = r_sDropDownDefault; +} + +const rtl::OUString & FFDataHandler::getDropDownDefault() const +{ + return m_sDropDownDefault; +} + +// member: FFDataHandler::dropDownEntries +void FFDataHandler::setDropDownEntries(const FFDataHandler::DropDownEntries_t & r_dropDownEntries) +{ + m_DropDownEntries = r_dropDownEntries; +} + +const FFDataHandler::DropDownEntries_t & FFDataHandler::getDropDownEntries() const +{ + return m_DropDownEntries; +} + +void FFDataHandler::dropDownEntriesPushBack(const rtl::OUString & r_Element) +{ + m_DropDownEntries.push_back(r_Element); +} + +// member: FFDataHandler::textType +void FFDataHandler::setTextType(sal_uInt32 r_textType) +{ + m_nTextType = r_textType; +} + +sal_uInt32 FFDataHandler::getTextType() const +{ + return m_nTextType; +} + +// member: FFDataHandler::textMaxLength +void FFDataHandler::setTextMaxLength(sal_uInt32 r_textMaxLength) +{ + m_nTextMaxLength = r_textMaxLength; +} + +sal_uInt32 FFDataHandler::getTextMaxLength() const +{ + return m_nTextMaxLength; +} + +// member: FFDataHandler::textDefault +void FFDataHandler::setTextDefault(const rtl::OUString & r_sTextDefault) +{ + m_sTextDefault = r_sTextDefault; +} + +const rtl::OUString & FFDataHandler::getTextDefault() const +{ + return m_sTextDefault; +} + +// member: FFDataHandler::textFormat +void FFDataHandler::setTextFormat(const rtl::OUString & r_sTextFormat) +{ + m_sTextFormat = r_sTextFormat; +} + +const rtl::OUString & FFDataHandler::getTextFormat() const +{ + return m_sTextFormat; +} + + +void FFDataHandler::sprm(Sprm & r_Sprm) +{ +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->startElement("FFDataHandler.sprm"); + dmapper_logger->chars(r_Sprm.toString()); +#endif + switch(r_Sprm.getId()) + { + case NS_ooxml::LN_CT_FFData_name: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_sName = r_Sprm.getValue()->getString(); + } + break; + case NS_ooxml::LN_CT_FFData_enabled: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_bEnabled = r_Sprm.getValue()->getInt(); + } + break; + case NS_ooxml::LN_CT_FFData_calcOnExit: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_bCalcOnExit = r_Sprm.getValue()->getInt(); + } + break; + case NS_ooxml::LN_CT_FFData_entryMacro: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_sEntryMacro = r_Sprm.getValue()->getString(); + } + break; + case NS_ooxml::LN_CT_FFData_exitMacro: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_sExitMacro = r_Sprm.getValue()->getString(); + } + break; + case NS_ooxml::LN_CT_FFData_helpText: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + resolveSprm(r_Sprm); + } + break; + case NS_ooxml::LN_CT_FFData_statusText: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + resolveSprm(r_Sprm); + } + break; + case NS_ooxml::LN_CT_FFCheckBox_size: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_nCheckboxHeight = r_Sprm.getValue()->getInt(); + } + break; + case NS_ooxml::LN_CT_FFCheckBox_sizeAuto: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_bCheckboxAutoHeight = r_Sprm.getValue()->getInt(); + } + break; + case NS_ooxml::LN_CT_FFCheckBox_default: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_bCheckboxDefault = r_Sprm.getValue()->getInt(); + } + break; + case NS_ooxml::LN_CT_FFCheckBox_checked: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_bCheckboxChecked = r_Sprm.getValue()->getInt(); + } + break; + case NS_ooxml::LN_CT_FFData_checkBox: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + resolveSprm(r_Sprm); + } + break; + case NS_ooxml::LN_CT_FFDDList_result: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_sDropDownResult = r_Sprm.getValue()->getString(); + } + break; + case NS_ooxml::LN_CT_FFDDList_default: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_sDropDownDefault = r_Sprm.getValue()->getString(); + } + break; + case NS_ooxml::LN_CT_FFDDList_listEntry: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_DropDownEntries.push_back(r_Sprm.getValue()->getString());; + } + break; + case NS_ooxml::LN_CT_FFData_ddList: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + resolveSprm(r_Sprm); + } + break; + case NS_ooxml::LN_CT_FFTextInput_type: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_nTextType = r_Sprm.getValue()->getInt(); + } + break; + case NS_ooxml::LN_CT_FFTextInput_default: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_sTextDefault = r_Sprm.getValue()->getString(); + } + break; + case NS_ooxml::LN_CT_FFTextInput_maxLength: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_nTextMaxLength = r_Sprm.getValue()->getInt(); + } + break; + case NS_ooxml::LN_CT_FFTextInput_format: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_sTextFormat = r_Sprm.getValue()->getString(); + } + break; + case NS_ooxml::LN_CT_FFData_textInput: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + resolveSprm(r_Sprm); + } + break; + default: +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->element("unhandled"); +#endif + break; + } +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->endElement("FFDataHandler.sprm"); +#endif +} + +void FFDataHandler::resolveSprm(Sprm & r_Sprm) +{ + writerfilter::Reference<Properties>::Pointer_t pProperties = r_Sprm.getProps(); + if( pProperties.get()) + pProperties->resolve(*this); +} + +void FFDataHandler::attribute(Id name, Value & val) +{ +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->startElement("FFDataHandler.attribute"); + dmapper_logger->attribute("name", (*QNameToString::Instance())(name)); + dmapper_logger->attribute("value", val.toString()); + dmapper_logger->endElement("FFDataHandler.attribute"); +#endif + switch (name) + { + case NS_ooxml::LN_CT_FFHelpText_type: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_nHelpTextType = val.getInt(); + } + break; + case NS_ooxml::LN_CT_FFHelpText_val: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_sHelpText = val.getString(); + } + break; + case NS_ooxml::LN_CT_FFStatusText_type: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_nStatusTextType = val.getInt(); + } + break; + case NS_ooxml::LN_CT_FFStatusText_val: + /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */ + { + m_sStatusText = val.getString(); + } + break; + default: +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->element("unhandled"); +#endif + break; + } +} + +}} diff --git a/writerfilter/source/dmapper/FFDataHandler.hxx b/writerfilter/source/dmapper/FFDataHandler.hxx new file mode 100644 index 000000000000..fb7a4ccee950 --- /dev/null +++ b/writerfilter/source/dmapper/FFDataHandler.hxx @@ -0,0 +1,161 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: PropertyMap.hxx,v $ + * $Revision: 1.18 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef INCLUDED_FFDataHandler_HXX +#define INCLUDED_FFDataHandler_HXX +#include <resourcemodel/WW8ResourceModel.hxx> +#include <rtl/ustring.hxx> +namespace writerfilter { +namespace dmapper { +class FFDataHandler : public Properties +{ +public: + // typedefs + typedef ::boost::shared_ptr<FFDataHandler> Pointer_t; + typedef ::std::vector<rtl::OUString> DropDownEntries_t; + + // constructor + FFDataHandler(); + // destructor + virtual ~FFDataHandler(); + + // member: name + void setName(const rtl::OUString & r_sName); + const rtl::OUString & getName() const; + + // member: enabled + void setEnabled(bool r_enabled); + bool getEnabled() const; + + // member: calcOnExit + void setCalcOnExit(bool r_calcOnExit); + bool getCalcOnExit() const; + + // member: entryMacro + void setEntryMacro(const rtl::OUString & r_sEntryMacro); + const rtl::OUString & getEntryMacro() const; + + // member: exitMacro + void setExitMacro(const rtl::OUString & r_sExitMacro); + const rtl::OUString & getExitMacro() const; + + // member: helpTextType + void setHelpTextType(sal_uInt32 r_helpTextType); + sal_uInt32 getHelpTextType() const; + + // member: helpText + void setHelpText(const rtl::OUString & r_sHelpText); + const rtl::OUString & getHelpText() const; + + // member: statusTextType + void setStatusTextType(sal_uInt32 r_statusTextType); + sal_uInt32 getStatusTextType() const; + + // member: statusText + void setStatusText(const rtl::OUString & r_sStatusText); + const rtl::OUString & getStatusText() const; + + // member: checkboxHeight + void setCheckboxHeight(sal_uInt32 r_checkboxHeight); + sal_uInt32 getCheckboxHeight() const; + + // member: checkboxAutoHeight + void setCheckboxAutoHeight(bool r_checkboxAutoHeight); + bool getCheckboxAutoHeight() const; + + // member: checkboxDefault + void setCheckboxDefault(bool r_checkboxDefault); + bool getCheckboxDefault() const; + + // member: checkboxChecked + void setCheckboxChecked(bool r_checkboxChecked); + bool getCheckboxChecked() const; + + // member: dropDownResult + void setDropDownResult(const rtl::OUString & r_sDropDownResult); + const rtl::OUString & getDropDownResult() const; + + // member: dropDownDefault + void setDropDownDefault(const rtl::OUString & r_sDropDownDefault); + const rtl::OUString & getDropDownDefault() const; + + // member: dropDownEntries + void setDropDownEntries(const DropDownEntries_t & r_dropDownEntries); + const DropDownEntries_t & getDropDownEntries() const; + void dropDownEntriesPushBack(const rtl::OUString & r_Element); + + // member: textType + void setTextType(sal_uInt32 r_textType); + sal_uInt32 getTextType() const; + + // member: textMaxLength + void setTextMaxLength(sal_uInt32 r_textMaxLength); + sal_uInt32 getTextMaxLength() const; + + // member: textDefault + void setTextDefault(const rtl::OUString & r_sTextDefault); + const rtl::OUString & getTextDefault() const; + + // member: textFormat + void setTextFormat(const rtl::OUString & r_sTextFormat); + const rtl::OUString & getTextFormat() const; + + // sprm + void sprm(Sprm & r_sprm); + void resolveSprm(Sprm & r_sprm); + + // attribute + void attribute(Id name, Value & val); + +private: + rtl::OUString m_sName; + bool m_bEnabled; + bool m_bCalcOnExit; + rtl::OUString m_sEntryMacro; + rtl::OUString m_sExitMacro; + sal_uInt32 m_nHelpTextType; + rtl::OUString m_sHelpText; + sal_uInt32 m_nStatusTextType; + rtl::OUString m_sStatusText; + sal_uInt32 m_nCheckboxHeight; + bool m_bCheckboxAutoHeight; + bool m_bCheckboxDefault; + bool m_bCheckboxChecked; + rtl::OUString m_sDropDownResult; + rtl::OUString m_sDropDownDefault; + DropDownEntries_t m_DropDownEntries; + sal_uInt32 m_nTextType; + sal_uInt32 m_nTextMaxLength; + rtl::OUString m_sTextDefault; + rtl::OUString m_sTextFormat; +}; + + +}} +#endif //INCLUDED_FFDataHandler_HXX diff --git a/writerfilter/source/dmapper/FieldTypes.hxx b/writerfilter/source/dmapper/FieldTypes.hxx new file mode 100644 index 000000000000..d0a98efcb0fb --- /dev/null +++ b/writerfilter/source/dmapper/FieldTypes.hxx @@ -0,0 +1,299 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef INCLUDED_FIELD_TYPES_HXX +#define INCLUDED_FIELD_TYPES_HXX + +namespace writerfilter { +namespace dmapper { + +enum FieldId +{ + /* ADDRESSBLOCK \d \* MERGEFORMAT -> Addressblock completely unsupported*/ + FIELD_ADDRESSBLOCK + /* ADVANCE \d downvalue \l leftvalue \r rightvalue \u upvalue \x xvalue \y yvalue -> unsupported*/ + ,FIELD_ADVANCE + /* ASK bookmarkname "hint" \d defaultanswer \o \* MERGEFORMAT -> + the hint is not always quoted, inputfield with default answer, prompt before merge (\o) + */ + ,FIELD_ASK + /* AUTONUM \* Numberingswitch -> + mapped to sequence field "AutoNr" + */ + ,FIELD_AUTONUM + /* AUTONUMLGL \* Numberingswitch -> + mapped to sequence field "AutoNr" + */ + ,FIELD_AUTONUMLGL + /* AUTONUMOUT \* Numberingswitch -> + mapped to sequence field "AutoNr" + */ + ,FIELD_AUTONUMOUT + /* AUTHOR NewAuthor \* defaultswitch \* MERGEFORMAT -> + mapped to sequence field "AutoNr" + */ + ,FIELD_AUTHOR + /* COMMENTS "comment" \* MERGEFORMAT -> + Docinfo-Comments + */ + ,FIELD_COMMENTS + /* CREATEDATE \h \* MERGEFORMAT -> + docinfo-created-date + */ + ,FIELD_CREATEDATE + /* DATE \@ "number format" \s \* MERGEFORMAT -> + ww8filterimprovement: multiple languages now supported + */ + ,FIELD_DATE + /* DOCPROPERTY propertyname \* MERGEFORMAT -> + ww8filterimprovement: some fields imported as functionally equivalent fields if possible, + the others imported as UserField + */ + ,FIELD_DOCPROPERTY + /* DOCVARIABLE Name \* MERGEFORMAT -> + ww8filterimprovement: now imported as user fields + */ + ,FIELD_DOCVARIABLE + /* EDITTIME \# "displayformat" \* Numberingswitch \* MERGEFORMAT -> + DocInfo-Modified-Date + ww8filterimprovement: multiple languages now supported + */ + ,FIELD_EDITTIME + /* FILLIN "text to fill in" \d defaultanswer \o \* MERGEFORMAT -> + Function-InputField + */ + ,FIELD_FILLIN + /* FILENAME \p \* * MERGEFORMAT -> + file name (\p with path) + */ + ,FIELD_FILENAME + /* FILESIZE \* NumberingType \* MERGEFORMAT -> + not imported in old ww8 filter, see lcl_ParseNumberingType + todo find alternative field + */ + ,FIELD_FILESIZE + /* =formula \# "number format" + todo find alternative field + */ + ,FIELD_FORMULA + /* FORMCHECKBOX */ + ,FIELD_FORMCHECKBOX + /* FORMDROPDOWN */ + ,FIELD_FORMDROPDOWN + /* FORMTEXT */ + ,FIELD_FORMTEXT + /* GOTOBUTTON text \* MERGEFORMAT -> + not imported in old ww8 filter + todo find alternative field + */ + ,FIELD_GOTOBUTTON + /* HYPERLINK "link" \* MERGEFORMAT -> + not imported in old ww8 filter + ww8filterimprovement: now imported as hyperlink + */ + ,FIELD_HYPERLINK + /* IF condition "then text" "else text" -> + not imported in old ww8 filter + ww8filterimprovement: now imported + todo: condition, if text, else text still missing + */ + ,FIELD_IF + /* INFO NameOfInfo \* MERGEFORMAT -> old + todo: filter imports wrong? + */ + ,FIELD_INFO + /* INCLUDEPICTURE path \* MERGEFORMAT-> + old filter imports an embedded picture + todo: not yet supported + */ + ,FIELD_INCLUDEPICTURE + /* KEYWORDS keyword \* defaultswitch \* Numberingswitch \* MERGEFORMAT -> + DocInfo Keywords + */ + ,FIELD_KEYWORDS + /* LASTSAVEDBY \* MERGEFORMAT -> + DocInfo-Modified-Author + */ + ,FIELD_LASTSAVEDBY + /* MACROBUTTON MacroName quick help text -> + Macro field + */ + ,FIELD_MACROBUTTON + /* MERGEFIELD ColumName \b prefix \f suffix \* MERGEFORMAT -> + ww8filterimprovement: column-only API now upporterd + */ + ,FIELD_MERGEFIELD + /* MERGEREC \* MERGEFORMAT -> + RecordNumber field, maybe without db name + todo: currently unchecked + */ + ,FIELD_MERGEREC + /* MERGESEQ \* MERGEFORMAT -> + not imported in old ww8 filter + ww8filterimprovement: now imported + todo: currently unchecked + */ + ,FIELD_MERGESEQ + /* NEXT text -> + Next record + todo: currently unchecked + */ + ,FIELD_NEXT + /* NEXTIF condition + todo: condition not imported + */ + ,FIELD_NEXTIF + /* PAGE \* Numberingswitch \* MERGEFORMAT -> + see lcl_ParseNumberingType + */ + ,FIELD_PAGE + /* REF targetbkm \f \* MERGEFORMAT -> + imports a ShowVariable (bookmarkname)? + \h hyerlink to paragraph + \p relative to para above/below + \f refenence number + \d separator number separator + \n paragraph number + \r paragraph number in relative context + \t suppres non delimiters + \w paragraph number in full context + \* Upper/Lower... + */ + ,FIELD_REF // + /* REVNUM \* Numberingswitch \* MERGEFORMAT -> + DocInfo-revision number + */ + ,FIELD_REVNUM + /* SAVEDATE \@ "NumberFormat"\* MERGEFORMAT -> + DocInfo-modified-date + */ + ,FIELD_SAVEDATE + /* SECTION \* NumberFormat \* MERGEFORMAT -> + not imported in old ww8 filter see lcl_ParseNumberingType + todo: find alternative + */ + ,FIELD_SECTION + /* SECTIONPAGES \* NumberFormat \* MERGEFORMAT -> + not imported in old ww8 filter see lcl_ParseNumberingType + todo: find alternative + */ + ,FIELD_SECTIONPAGES + /* SEQ sequencename \h \c \n \r \s \* MERGEFORMAT -> + number range name:sequencename value:sequencename+1 + todo: only partially implemented, switches unsupported + */ + ,FIELD_SEQ + /* SET bookmarkname newtext \* MERGEFORMAT -> + SetVariable bookmarkname = newtext + todo: not implemented yet + */ + ,FIELD_SET + /* SKIPIF condition \* MERGEFORMAT -> + ?? + todo: not implemented yet + */ + ,FIELD_SKIPIF + /* STYLEREF stylename \* MERGEFORMAT -> + not imported in old ww8 filter + todo: add an equivalent field type + */ + ,FIELD_STYLEREF + /* SUBJECT subject \* Defaultswitch \* MERGEFORMAT -> + DocInfo - subject + */ + ,FIELD_SUBJECT + /* SYMBOL symbolnumber \* MERGEFORMAT -> + inserts a special char (symbolnumber) + todo: find alternative + */ + ,FIELD_SYMBOL + /* TEMPLATE \* Defaultswitch \* MERGEFORMAT + TemplateName field + */ + ,FIELD_TEMPLATE + /* TIME \@ "number format" \* MERGEFORMAT + ww8filterimprovement: multiple languages now supported + */ + ,FIELD_TIME + /* TITLE \* Defaultswitch \* MERGEFORMAT -> + DocInfo-title + */ + ,FIELD_TITLE + /* USERINITIALS newinitials \* MERGEFORMAT -> + ExtendedUser field (SHORTCUT) + */ + ,FIELD_USERINITIALS + /* USERADDRESS \* MERGEFORMAT -> + not imported in old ww8 filter + todo: find alternative + */ + ,FIELD_USERADDRESS + /* USERNAME newusername \* MERGEFORMAT -> + not imported in old ww8 filter + todo: import as extended user field(s) + */ + ,FIELD_USERNAME + /* + TOC options: + \a Builds a table of figures but does not include the captions's label and number + \b Uses a bookmark to specify area of document from which to build table of contents + \c Builds a table of figures of the given label + \d Defines the separator between sequence and page numbers + \f Builds a table of contents using TC entries instead of outline levels + \h Hyperlinks the entries and page numbers within the table of contents + \l Defines the TC entries field level used to build a table of contents + \n Builds a table of contents or a range of entries, sucah as “1-9”, in a table of contents without page numbers + \o Builds a table of contents by using outline levels instead of TC entries + \p Defines the separator between the table entry and its page number + \s Builds a table of contents by using a sequence type + \t Builds a table of contents by using style names other than the standard outline styles + \u Builds a table of contents by using the applied paragraph outline level + \w Preserve tab characters within table entries + \x Preserve newline characters within table entries + \z Hides page numbers within the table of contens when shown in Web Layout View + */ + ,FIELD_TOC + /* + TOC entry: “text” + \f TC entry in doc with multiple tables + \l Outline Level + \n Suppress page numbers + example: TOC "EntryText \f \l 2 \n + */ + ,FIELD_TC + /* document statistic - number of characters + */ + ,FIELD_NUMCHARS + /* document statistic - number of words + */ + ,FIELD_NUMWORDS + /* document statistic - number of pages + */ + ,FIELD_NUMPAGES +}; + +}} +#endif // INCLUDED_FIELD_TYPES_HXX diff --git a/writerfilter/source/dmapper/FormControlHelper.cxx b/writerfilter/source/dmapper/FormControlHelper.cxx new file mode 100644 index 000000000000..eebf921f4963 --- /dev/null +++ b/writerfilter/source/dmapper/FormControlHelper.cxx @@ -0,0 +1,309 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include <math.h> + +#include <com/sun/star/awt/XControlModel.hpp> +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/container/XIndexContainer.hpp> +#include <com/sun/star/drawing/XControlShape.hpp> +#include <com/sun/star/drawing/XDrawPage.hpp> +#include <com/sun/star/drawing/XDrawPageSupplier.hpp> +#include <com/sun/star/form/XForm.hpp> +#include <com/sun/star/form/XFormComponent.hpp> +#include <com/sun/star/form/XFormsSupplier.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <com/sun/star/text/TextContentAnchorType.hpp> +#include <com/sun/star/text/VertOrientation.hpp> +#include <com/sun/star/uno/Any.hxx> +#include <com/sun/star/uno/Type.hxx> + +#include "FormControlHelper.hxx" + +namespace writerfilter { +namespace dmapper { + +using namespace ::com::sun::star; + +struct FormControlHelper::FormControlHelper_Impl +{ + FieldId m_eFieldId; + awt::Size aSize; + uno::Reference<drawing::XDrawPage> rDrawPage; + uno::Reference<form::XForm> rForm; + uno::Reference<form::XFormComponent> rFormComponent; + uno::Reference<lang::XMultiServiceFactory> rServiceFactory; + uno::Reference<text::XTextDocument> rTextDocument; + + uno::Reference<drawing::XDrawPage> getDrawPage(); + uno::Reference<lang::XMultiServiceFactory> getServiceFactory(); + uno::Reference<form::XForm> getForm(); + uno::Reference<container::XIndexContainer> getFormComps(); +}; + +uno::Reference<drawing::XDrawPage> FormControlHelper::FormControlHelper_Impl::getDrawPage() +{ + if (! rDrawPage.is()) + { + uno::Reference<drawing::XDrawPageSupplier> + xDrawPageSupplier(rTextDocument, uno::UNO_QUERY); + if (xDrawPageSupplier.is()) + rDrawPage = xDrawPageSupplier->getDrawPage(); + } + + return rDrawPage; +} + +uno::Reference<lang::XMultiServiceFactory> FormControlHelper::FormControlHelper_Impl::getServiceFactory() +{ + if (! rServiceFactory.is()) + rServiceFactory = uno::Reference<lang::XMultiServiceFactory>(rTextDocument, uno::UNO_QUERY); + + return rServiceFactory; +} + +uno::Reference<form::XForm> FormControlHelper::FormControlHelper_Impl::getForm() +{ + if (! rForm.is()) + { + uno::Reference<form::XFormsSupplier> xFormsSupplier(getDrawPage(), uno::UNO_QUERY); + + if (xFormsSupplier.is()) + { + uno::Reference<container::XNameContainer> xFormsNamedContainer(xFormsSupplier->getForms()); + static ::rtl::OUString sDOCXForm(RTL_CONSTASCII_USTRINGPARAM("DOCX-Standard")); + + ::rtl::OUString sFormName(sDOCXForm); + sal_uInt16 nUnique = 0; + + while (xFormsNamedContainer->hasByName(sFormName)) + { + ++nUnique; + sFormName = sDOCXForm; + sFormName += ::rtl::OUString::valueOf(nUnique); + } + + uno::Reference<uno::XInterface> + xForm(getServiceFactory()->createInstance + (::rtl::OUString + (RTL_CONSTASCII_USTRINGPARAM + ("com.sun.star.form.component.Form")))); + if (xForm.is()) + { + uno::Reference<beans::XPropertySet> + xFormProperties(xForm, uno::UNO_QUERY); + uno::Any aAny(sFormName); + static ::rtl::OUString sName(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Name"))); + xFormProperties->setPropertyValue(sName, aAny); + } + + rForm = uno::Reference<form::XForm>(xForm, uno::UNO_QUERY); + + uno::Reference<container::XIndexContainer> xForms(xFormsNamedContainer, uno::UNO_QUERY); + uno::Any aAny(xForm); + xForms->insertByIndex(xForms->getCount(), aAny); + } + } + + return rForm; +} + +uno::Reference<container::XIndexContainer> FormControlHelper::FormControlHelper_Impl::getFormComps() +{ + uno::Reference<container::XIndexContainer> xIndexContainer(getForm(), uno::UNO_QUERY); + + return xIndexContainer; +} + +FormControlHelper::FormControlHelper(FieldId eFieldId, + uno::Reference<text::XTextDocument> rTextDocument, + FFDataHandler::Pointer_t pFFData) + : m_pFFData(pFFData), m_pImpl(new FormControlHelper_Impl) +{ + m_pImpl->m_eFieldId = eFieldId; + m_pImpl->rTextDocument = rTextDocument; +} + +FormControlHelper::~FormControlHelper() +{ +} + +bool FormControlHelper::createCheckbox(uno::Reference<text::XTextRange> xTextRange, + const ::rtl::OUString & rControlName) +{ + uno::Reference<lang::XMultiServiceFactory> + xServiceFactory(m_pImpl->getServiceFactory()); + + if (! xServiceFactory.is()) + return false; + + uno::Reference<uno::XInterface> xInterface = + xServiceFactory->createInstance + (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.form.component.CheckBox"))); + + if (!xInterface.is()) + return false; + + m_pImpl->rFormComponent = uno::Reference<form::XFormComponent>(xInterface, uno::UNO_QUERY); + if (!m_pImpl->rFormComponent.is()) + return false; + + uno::Reference<beans::XPropertySet> xPropSet(xInterface, uno::UNO_QUERY); + + sal_uInt32 nCheckBoxHeight = 16 * m_pFFData->getCheckboxHeight(); + + if (m_pFFData->getCheckboxAutoHeight()) + { + uno::Reference<beans::XPropertySet> xTextRangeProps(xTextRange, uno::UNO_QUERY); + + try + { + static ::rtl::OUString sCharHeight(RTL_CONSTASCII_USTRINGPARAM("CharHeight")); + float fCheckBoxHeight = 0.0; + xTextRangeProps->getPropertyValue(sCharHeight) >>= fCheckBoxHeight; + nCheckBoxHeight = floor(fCheckBoxHeight * 35.3); + } + catch (beans::UnknownPropertyException & rException) + { + } + } + + m_pImpl->aSize.Width = nCheckBoxHeight; + m_pImpl->aSize.Height = m_pImpl->aSize.Width; + + uno::Any aAny; + if (m_pFFData->getStatusText().getLength()) + { + aAny <<= m_pFFData->getStatusText(); + + xPropSet->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HelpText")), aAny); + } + + aAny <<= m_pFFData->getCheckboxChecked(); + xPropSet->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("DefaultState")), aAny); + + if (m_pFFData->getHelpText().getLength()) + { + aAny <<= m_pFFData->getHelpText(); + xPropSet->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HelpF1Text")), aAny); + } + + aAny <<= rControlName; + xPropSet->setPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Name")), aAny); + + return true; +} + +bool FormControlHelper::insertControl(uno::Reference<text::XTextRange> xTextRange) +{ + bool bCreated = false; + + uno::Reference<container::XNameContainer> xFormCompsByName(m_pImpl->getForm(), uno::UNO_QUERY); + uno::Reference<container::XIndexContainer> xFormComps(m_pImpl->getFormComps()); + if (! xFormComps.is()) + return false; + + static ::rtl::OUString sControl(RTL_CONSTASCII_USTRINGPARAM("Control")); + + sal_Int32 nControl = 0; + bool bDone = false; + ::rtl::OUString sControlName; + + do + { + ::rtl::OUString sTmp(sControl); + sTmp += ::rtl::OUString::valueOf(nControl); + + nControl++; + if (! xFormCompsByName->hasByName(sTmp)) + { + sControlName = sTmp; + bDone = true; + } + } + while (! bDone); + + switch (m_pImpl->m_eFieldId) + { + case FIELD_FORMCHECKBOX: + bCreated = createCheckbox(xTextRange, sControlName); + break; + default: + break; + } + + if (!bCreated) + return false; + + uno::Any aAny(m_pImpl->rFormComponent); + xFormComps->insertByIndex(xFormComps->getCount(), aAny); + + if (! m_pImpl->getServiceFactory().is()) + return false; + + uno::Reference<uno::XInterface> xInterface = + m_pImpl->getServiceFactory()->createInstance + (::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.drawing.ControlShape"))); + + if (! xInterface.is()) + return false; + + uno::Reference<drawing::XShape> xShape(xInterface, uno::UNO_QUERY); + + if (! xShape.is()) + return false; + + xShape->setSize(m_pImpl->aSize); + + uno::Reference<beans::XPropertySet> xShapeProps(xShape, uno::UNO_QUERY); + + sal_uInt16 nTmp = text::TextContentAnchorType_AS_CHARACTER; + aAny <<= nTmp; + + static const ::rtl::OUString sAnchorType(RTL_CONSTASCII_USTRINGPARAM("AnchorType")); + xShapeProps->setPropertyValue(sAnchorType, aAny); + + static const ::rtl::OUString sVertOrient(RTL_CONSTASCII_USTRINGPARAM("VertOrient")); + nTmp = text::VertOrientation::CENTER; + aAny <<= nTmp; + xShapeProps->setPropertyValue(sVertOrient, aAny); + + aAny <<= xTextRange; + + static const ::rtl::OUString sTextRange(RTL_CONSTASCII_USTRINGPARAM("TextRange")); + xShapeProps->setPropertyValue(sTextRange, aAny); + + uno::Reference<drawing::XControlShape> xControlShape(xShape, uno::UNO_QUERY); + uno::Reference<awt::XControlModel> xControlModel(m_pImpl->rFormComponent, uno::UNO_QUERY); + xControlShape->setControl(xControlModel); + + m_pImpl->getDrawPage()->add(xShape); + + return true; +} + +}} diff --git a/writerfilter/source/dmapper/FormControlHelper.hxx b/writerfilter/source/dmapper/FormControlHelper.hxx new file mode 100644 index 000000000000..21b50912a039 --- /dev/null +++ b/writerfilter/source/dmapper/FormControlHelper.hxx @@ -0,0 +1,64 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +#ifndef INCLUDED_FORM_CONTROL_HELPER_HXX +#define INCLUDED_FORM_CONTROL_HELPER_HXX + +#include <FFDataHandler.hxx> +#include <com/sun/star/text/XTextDocument.hpp> +#include <com/sun/star/uno/Reference.hxx> +#include "FieldTypes.hxx" + +namespace writerfilter { +namespace dmapper { + +using namespace ::com::sun::star; + +class FormControlHelper +{ +public: + typedef boost::shared_ptr<FormControlHelper> Pointer_t; + FormControlHelper(FieldId eFieldId, + uno::Reference<text::XTextDocument> rTextDocument, + FFDataHandler::Pointer_t pFFData); + ~FormControlHelper(); + + bool insertControl(uno::Reference<text::XTextRange> xTextRange); + +private: + FFDataHandler::Pointer_t m_pFFData; + struct FormControlHelper_Impl; + typedef boost::shared_ptr<FormControlHelper_Impl> ImplPointer_t; + ImplPointer_t m_pImpl; + + bool createCheckbox(uno::Reference<text::XTextRange> xTextRange, + const ::rtl::OUString & rControlName); +}; + +} +} + +#endif // INCLUDED_FORM_CONTROL_HELPER_HXX diff --git a/writerfilter/source/dmapper/PropertyIds.cxx b/writerfilter/source/dmapper/PropertyIds.cxx index fb99f254ef86..abb2ca46a9c9 100644 --- a/writerfilter/source/dmapper/PropertyIds.cxx +++ b/writerfilter/source/dmapper/PropertyIds.cxx @@ -320,6 +320,8 @@ const rtl::OUString& PropertyNameSupplier::GetName( PropertyIds eId ) const case PROP_OUTLINE_LEVEL : sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("OutlineLevel")); break; case PROP_LISTTAB_STOP_POSITION : sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ListtabStopPosition")); break; case PROP_POSITION_AND_SPACE_MODE : sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("PositionAndSpaceMode")); break; + case PROP_PARA_SPLIT: sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ParaSplit")); break; + case PROP_HELP: sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Help")); break; case PROP_HEADING_STYLE_NAME: sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("HeadingStyleName")); break; // case : sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("")); break; // case : sName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("")); break; diff --git a/writerfilter/source/dmapper/PropertyIds.hxx b/writerfilter/source/dmapper/PropertyIds.hxx index 1d5992cc212c..2066cf58f530 100644 --- a/writerfilter/source/dmapper/PropertyIds.hxx +++ b/writerfilter/source/dmapper/PropertyIds.hxx @@ -284,6 +284,8 @@ enum PropertyIds /*248*/ ,PROP_LISTTAB_STOP_POSITION /*249*/ ,PROP_POSITION_AND_SPACE_MODE /*250*/ ,PROP_HEADING_STYLE_NAME +/*251*/ ,PROP_PARA_SPLIT +/*252*/ ,PROP_HELP }; struct PropertyNameSupplier_Impl; class PropertyNameSupplier diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx index aa8a29c5e6a2..11930fb01972 100644 --- a/writerfilter/source/dmapper/PropertyMap.cxx +++ b/writerfilter/source/dmapper/PropertyMap.cxx @@ -40,6 +40,7 @@ #include <com/sun/star/text/WritingMode.hpp> #include <com/sun/star/text/XTextColumns.hpp> #include <com/sun/star/text/XText.hpp> +#include <com/sun/star/text/TextGridMode.hpp> #include <com/sun/star/text/XTextCopy.hpp> #include "dmapperLoggers.hxx" #include "PropertyMapHelper.hxx" @@ -155,6 +156,18 @@ XMLTag::Pointer_t PropertyMap::toTag() const sal_Int32 aInt; aMapIter->second >>= aInt; pTag->addAttr("value", aInt); + + sal_uInt32 auInt; + aMapIter->second >>= auInt; + pTag->addAttr("unsignedValue", auInt); + + float aFloat; + aMapIter->second >>= aFloat; + pTag->addAttr("floatValue", aFloat); + + ::rtl::OUString aStr; + aMapIter->second >>= auInt; + pTag->addAttr("stringValue", aStr); } catch (...) { } @@ -244,6 +257,7 @@ SectionPropertyMap::SectionPropertyMap(bool bIsFirstSection) : ,m_nDzaGutter( 0 ) ,m_bGutterRTL( false ) ,m_bSFBiDi( false ) + ,m_nGridType(0) ,m_nGridLinePitch( 1 ) ,m_nDxtCharSpace( 0 ) ,m_nLnnMod( 0 ) @@ -274,7 +288,7 @@ SectionPropertyMap::SectionPropertyMap(bool bIsFirstSection) : uno::Any aFalse( ::uno::makeAny( false ) ); Insert( PROP_GRID_DISPLAY, false, aFalse); Insert( PROP_GRID_PRINT, false, aFalse); - + Insert( PROP_GRID_MODE, false, uno::makeAny(text::TextGridMode::NONE)); if( m_bIsFirstSection ) @@ -908,6 +922,22 @@ void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl ) nRubyHeight = 0; operator[]( PropertyDefinition( PROP_GRID_RUBY_HEIGHT, false )) = uno::makeAny( nRubyHeight ); + sal_Int16 nGridMode = text::TextGridMode::NONE; + + switch (m_nGridType) + { + case NS_ooxml::LN_Value_wordprocessingml_ST_DocGrid_lines: + nGridMode = text::TextGridMode::LINES; + break; + case NS_ooxml::LN_Value_wordprocessingml_ST_DocGrid_linesAndChars: + nGridMode = text::TextGridMode::LINES_AND_CHARS; + break; + default: + break; + } + + operator[](PropertyDefinition(PROP_GRID_MODE, false)) = uno::makeAny(nGridMode); + _ApplyProperties( xFollowPageStyle ); //todo: creating a "First Page" style depends on HasTitlePage und _fFacingPage_ diff --git a/writerfilter/source/dmapper/PropertyMap.hxx b/writerfilter/source/dmapper/PropertyMap.hxx index 0efe7e3ba433..16886530f324 100644 --- a/writerfilter/source/dmapper/PropertyMap.hxx +++ b/writerfilter/source/dmapper/PropertyMap.hxx @@ -193,6 +193,7 @@ class SectionPropertyMap : public PropertyMap bool m_bGutterRTL; bool m_bSFBiDi; + sal_Int32 m_nGridType; sal_Int32 m_nGridLinePitch; sal_Int32 m_nDxtCharSpace; @@ -266,6 +267,7 @@ public: void SetDzaGutter( sal_Int32 nSet ) {m_nDzaGutter = nSet; } void SetSFBiDi( bool bSet ) { m_bSFBiDi = bSet;} + void SetGridType(sal_Int32 nSet) { m_nGridType = nSet; } void SetGridLinePitch( sal_Int32 nSet ) { m_nGridLinePitch = nSet; } void SetDxtCharSpace( sal_Int32 nSet ) { m_nDxtCharSpace = nSet; } diff --git a/writerfilter/source/dmapper/PropertyMapHelper.cxx b/writerfilter/source/dmapper/PropertyMapHelper.cxx index 555003774113..4fb4c759289d 100644 --- a/writerfilter/source/dmapper/PropertyMapHelper.cxx +++ b/writerfilter/source/dmapper/PropertyMapHelper.cxx @@ -32,6 +32,7 @@ #include <resourcemodel/TagLogger.hxx> #include "PropertyMapHelper.hxx" +#ifdef DEBUG namespace writerfilter { namespace dmapper @@ -39,7 +40,7 @@ namespace dmapper using namespace ::com::sun::star; - XMLTag::Pointer_t lcl_TableColumnSeparatorsToTag(const uno::Any & rTableColumnSeparators) +XMLTag::Pointer_t lcl_TableColumnSeparatorsToTag(const uno::Any & rTableColumnSeparators) { uno::Sequence<text::TableColumnSeparator> aSeq; rTableColumnSeparators >>= aSeq; @@ -127,3 +128,4 @@ XMLTag::Pointer_t lcl_PropertyValueSeqSeqToTag(PropertyValueSeqSeq_t rPropValSeq } } +#endif // DEBUG diff --git a/writerfilter/source/dmapper/PropertyMapHelper.hxx b/writerfilter/source/dmapper/PropertyMapHelper.hxx index fc9ea0a85bb4..4a528f1736c0 100644 --- a/writerfilter/source/dmapper/PropertyMapHelper.hxx +++ b/writerfilter/source/dmapper/PropertyMapHelper.hxx @@ -28,6 +28,7 @@ * ************************************************************************/ +#ifdef DEBUG #include "PropertyMap.hxx" #include <com/sun/star/beans/PropertyValues.hpp> @@ -46,3 +47,4 @@ typedef uno::Sequence<PropertyValueSeq_t> PropertyValueSeqSeq_t; XMLTag::Pointer_t lcl_PropertyValueSeqSeqToTag(PropertyValueSeqSeq_t & rPropValSeqSeq); } } +#endif // DEBUG diff --git a/writerfilter/source/dmapper/SettingsTable.cxx b/writerfilter/source/dmapper/SettingsTable.cxx index deb65c7c8cba..e711240b65d0 100644 --- a/writerfilter/source/dmapper/SettingsTable.cxx +++ b/writerfilter/source/dmapper/SettingsTable.cxx @@ -28,6 +28,7 @@ * ************************************************************************/ +#include <resourcemodel/ResourceModelHelper.hxx> #include <com/sun/star/beans/XPropertySet.hpp> #include <SettingsTable.hxx> @@ -37,7 +38,15 @@ #include <ConversionHelper.hxx> #include <rtl/ustring.hxx> +#ifdef DEBUG_DOMAINMAPPER +#include <resourcemodel/QNameToString.hxx> +#include "dmapperLoggers.hxx" +#endif + namespace writerfilter { + +using resourcemodel::resolveSprmProps; + namespace dmapper { @@ -56,6 +65,21 @@ struct SettingsTable_Impl bool m_bNoPunctuationKerning; bool m_doNotIncludeSubdocsInStats; // Do Not Include Content in Text Boxes, Footnotes, and Endnotes in Document Statistics) bool m_bRecordChanges; + int m_nEdit; + bool m_bFormatting; + bool m_bEnforcement; + int m_nCryptProviderType; + int m_nCryptAlgorithmClass; + int m_nCryptAlgorithmType; + ::rtl::OUString m_sCryptAlgorithmSid; + int m_nCryptSpinCount; + ::rtl::OUString m_sCryptProvider; + ::rtl::OUString m_sAlgIdExt; + ::rtl::OUString m_sAlgIdExtSource; + ::rtl::OUString m_sCryptProviderTypeExt; + ::rtl::OUString m_sCryptProviderTypeExtSource; + ::rtl::OUString m_sHash; + ::rtl::OUString m_sSalt; SettingsTable_Impl( DomainMapper& rDMapper, const uno::Reference< lang::XMultiServiceFactory > xTextFactory ) : m_rDMapper( rDMapper ) @@ -65,6 +89,13 @@ struct SettingsTable_Impl , m_bNoPunctuationKerning(false) , m_doNotIncludeSubdocsInStats(false) , m_bRecordChanges(false) + , m_nEdit(NS_ooxml::LN_Value_wordprocessingml_ST_DocProtect_none) + , m_bFormatting(false) + , m_bEnforcement(false) + , m_nCryptProviderType(NS_ooxml::LN_Value_wordprocessingml_ST_CryptProv_rsaAES) + , m_nCryptAlgorithmClass(NS_ooxml::LN_Value_wordprocessingml_ST_AlgClass_hash) + , m_nCryptAlgorithmType(NS_ooxml::LN_Value_wordprocessingml_ST_AlgType_typeAny) + , m_nCryptSpinCount(0) {} }; @@ -79,8 +110,15 @@ SettingsTable::~SettingsTable() delete m_pImpl; } -void SettingsTable::attribute(Id /*Name*/, Value & val) +void SettingsTable::attribute(Id nName, Value & val) { +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->startElement("SettingsTable.attribute"); + dmapper_logger->attribute("name", (*QNameToString::Instance())(nName)); + dmapper_logger->attribute("value", val.toString()); +#endif + + (void) nName; int nIntValue = val.getInt(); (void)nIntValue; ::rtl::OUString sValue = val.getString(); @@ -99,10 +137,18 @@ void SettingsTable::attribute(Id /*Name*/, Value & val) } } #endif +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->endElement("SettingsTable.attribute"); +#endif } void SettingsTable::sprm(Sprm& rSprm) { +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->startElement("SettingsTable.sprm"); + dmapper_logger->chars(rSprm.toString()); +#endif + sal_uInt32 nSprmId = rSprm.getId(); Value::Pointer_t pValue = rSprm.getValue(); @@ -184,11 +230,20 @@ void SettingsTable::sprm(Sprm& rSprm) m_pImpl->m_bRecordChanges = bool(rSprm.getValue( )->getInt( ) ); } break; + case NS_ooxml::LN_CT_Settings_documentProtection: + { + resolveSprmProps(*this, rSprm); + } + break; default: { OSL_ENSURE( false, "unknown sprmid in SettingsTable::sprm()"); } } + +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->endElement("SettingsTable.sprm"); +#endif } void SettingsTable::entry(int /*pos*/, writerfilter::Reference<Properties>::Pointer_t ref) diff --git a/writerfilter/source/dmapper/StyleSheetTable.cxx b/writerfilter/source/dmapper/StyleSheetTable.cxx index 8b2dbc4d9756..5f2e2268abb8 100644 --- a/writerfilter/source/dmapper/StyleSheetTable.cxx +++ b/writerfilter/source/dmapper/StyleSheetTable.cxx @@ -417,6 +417,7 @@ void StyleSheetTable::attribute(Id Name, Value & val) #ifdef DEBUG_DOMAINMAPPER dmapper_logger->startElement("StyleSheetTable.attribute"); dmapper_logger->attribute("name", (*QNameToString::Instance())(Name)); + dmapper_logger->attribute("value", val.toString()); #endif OSL_ENSURE( m_pImpl->m_pCurrentEntry, "current entry has to be set here"); @@ -534,10 +535,9 @@ void StyleSheetTable::attribute(Id Name, Value & val) break; default: { - //----> debug - int nVal = val.getInt(); - ++nVal; - //<---- debug +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->element("unhandled"); +#endif } break; } @@ -599,7 +599,6 @@ void StyleSheetTable::sprm(Sprm & rSprm) break; case NS_ooxml::LN_CT_Style_tblPr: //contains table properties case NS_ooxml::LN_CT_Style_tblStylePr: //contains to table properties - case NS_ooxml::LN_CT_DocDefaults_pPrDefault: case NS_ooxml::LN_CT_DocDefaults_rPrDefault: case NS_ooxml::LN_CT_TblPrBase_tblInd: //table properties - at least width value and type case NS_ooxml::LN_EG_RPrBase_rFonts: //table fonts @@ -682,19 +681,30 @@ void StyleSheetTable::sprm(Sprm & rSprm) break; case NS_ooxml::LN_CT_Style_pPr: /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ + // no break case NS_ooxml::LN_CT_Style_rPr: /* WRITERFILTERSTATUS: done: 100, planned: 0, spent: 0 */ + // no break default: - if (!m_pImpl->m_pCurrentEntry) - break; - TablePropertiesHandlerPtr pTblHandler( new TablePropertiesHandler( true ) ); - pTblHandler->SetProperties( m_pImpl->m_pCurrentEntry->pProperties ); - if ( !pTblHandler->sprm( rSprm ) ) { - m_pImpl->m_rDMapper.PushStyleSheetProperties( m_pImpl->m_pCurrentEntry->pProperties ); - m_pImpl->m_rDMapper.sprm( rSprm ); - m_pImpl->m_rDMapper.PopStyleSheetProperties( ); + if (!m_pImpl->m_pCurrentEntry) + break; + + TablePropertiesHandlerPtr pTblHandler( new TablePropertiesHandler( true ) ); + pTblHandler->SetProperties( m_pImpl->m_pCurrentEntry->pProperties ); + if ( !pTblHandler->sprm( rSprm ) ) + { + m_pImpl->m_rDMapper.PushStyleSheetProperties( m_pImpl->m_pCurrentEntry->pProperties ); + + PropertyMapPtr pProps(new PropertyMap()); + m_pImpl->m_rDMapper.sprm( rSprm, pProps ); + + m_pImpl->m_pCurrentEntry->pProperties->insert(pProps); + + m_pImpl->m_rDMapper.PopStyleSheetProperties( ); + } } + break; } #ifdef DEBUG_DOMAINMAPPER @@ -798,6 +808,10 @@ uno::Sequence< ::rtl::OUString > PropValVector::getNames() -----------------------------------------------------------------------*/ void StyleSheetTable::ApplyStyleSheets( FontTablePtr rFontTable ) { +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->startElement("applyStyleSheets"); +#endif + try { uno::Reference< style::XStyleFamiliesSupplier > xStylesSupplier( m_pImpl->m_xTextDocument, uno::UNO_QUERY_THROW ); @@ -956,11 +970,24 @@ void StyleSheetTable::ApplyStyleSheets( FontTablePtr rFontTable ) PropValVector aSortedPropVals; for( sal_Int32 nProp = 0; nProp < aPropValues.getLength(); ++nProp) { - // Don't add the style name properties +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->startElement("propvalue"); + dmapper_logger->attribute("name", aPropValues[nProp].Name); + dmapper_logger->attribute("value", aPropValues[nProp].Value); +#endif + // Don't add the style name properties bool bIsParaStyleName = aPropValues[nProp].Name.equalsAscii( "ParaStyleName" ); bool bIsCharStyleName = aPropValues[nProp].Name.equalsAscii( "CharStyleName" ); - if ( !bInsert && !bIsParaStyleName && !bIsCharStyleName ) + if ( !bIsParaStyleName && !bIsCharStyleName ) + { +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->element("insert"); +#endif aSortedPropVals.Insert( aPropValues[nProp] ); + } +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->endElement("propvalue"); +#endif } if(bAddFollowStyle) { @@ -1009,7 +1036,15 @@ void StyleSheetTable::ApplyStyleSheets( FontTablePtr rFontTable ) } } if(bInsert) + { xStyles->insertByName( sConvertedStyleName, uno::makeAny( xStyle) ); +#ifdef DEBUG_DOMAINMAPPER + uno::Reference<beans::XPropertySet> xProps(xStyle, uno::UNO_QUERY); + dmapper_logger->startElement("insertStyle"); + dmapper_logger->addTag(unoPropertySetToTag(xProps)); + dmapper_logger->endElement("insertStyle"); +#endif + } } ++aIt; } @@ -1020,6 +1055,10 @@ void StyleSheetTable::ApplyStyleSheets( FontTablePtr rFontTable ) (void)rEx; OSL_ENSURE( false, "Styles could not be imported completely"); } + +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->endElement("applyStyleSheets"); +#endif } /*-- 22.06.2006 15:56:56--------------------------------------------------- diff --git a/writerfilter/source/dmapper/ThemeTable.cxx b/writerfilter/source/dmapper/ThemeTable.cxx index ec9d8ea9d5a5..0f0becf06552 100755..100644 --- a/writerfilter/source/dmapper/ThemeTable.cxx +++ b/writerfilter/source/dmapper/ThemeTable.cxx @@ -31,6 +31,10 @@ #include <ooxml/resourceids.hxx> #endif #include <stdio.h> +#ifdef DEBUG_DOMAINMAPPER +#include "dmapperLoggers.hxx" +#include <resourcemodel/QNameToString.hxx> +#endif namespace writerfilter { namespace dmapper @@ -59,6 +63,11 @@ ThemeTable::~ThemeTable() void ThemeTable::attribute(Id Name, Value & val) { +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->startElement("ThemeTable.attribute"); + dmapper_logger->attribute("name", (*QNameToString::Instance())(Name)); + dmapper_logger->attribute("value", val.toString()); +#endif // int nIntValue = val.getInt(); ::rtl::OUString sValue = val.getString(); // printf ( "ThemeTable::attribute(0x%.4x, 0x%.4x) [%s]\n", (unsigned int)Name, (unsigned int)nIntValue, ::rtl::OUStringToOString(sValue, RTL_TEXTENCODING_DONTKNOW).getStr()); @@ -72,12 +81,23 @@ void ThemeTable::attribute(Id Name, Value & val) break; default: { +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->element("unhandled"); +#endif } } +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->endElement("ThemeTable.attribute"); +#endif } void ThemeTable::sprm(Sprm& rSprm) { +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->startElement("ThemeTable.sprm"); + dmapper_logger->chars(rSprm.toString()); +#endif + sal_uInt32 nSprmId = rSprm.getId(); (void)nSprmId; @@ -126,14 +146,27 @@ void ThemeTable::sprm(Sprm& rSprm) break; default: { +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->element("unhandled"); +#endif } } +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->endElement("ThemeTable.sprm"); +#endif } void ThemeTable::entry(int /*pos*/, writerfilter::Reference<Properties>::Pointer_t ref) { - // printf ( "ThemeTable::entry\n"); +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->startElement("ThemeTable.entry"); +#endif + ref->resolve(*this); + +#ifdef DEBUG_DOMAINMAPPER + dmapper_logger->endElement("ThemeTable.entry"); +#endif } const ::rtl::OUString ThemeTable::getFontNameForTheme(const Id id) const diff --git a/writerfilter/source/dmapper/dmapperLoggers.hxx b/writerfilter/source/dmapper/dmapperLoggers.hxx index a19ff4832370..fd9ed722de4a 100644 --- a/writerfilter/source/dmapper/dmapperLoggers.hxx +++ b/writerfilter/source/dmapper/dmapperLoggers.hxx @@ -31,6 +31,7 @@ #ifndef INCLUDED_DMAPPER_LOGGERS_HXX #define INCLUDED_DMAPPER_LOGGERS_HXX +#ifdef DEBUG #include <resourcemodel/TagLogger.hxx> namespace writerfilter { @@ -38,4 +39,5 @@ namespace writerfilter { extern TagLogger::Pointer_t dmapper_logger; } } +#endif // DEBUG #endif // INCLUDED_DMAPPER_LOGGERS_HXX diff --git a/writerfilter/source/dmapper/genclass.xsl b/writerfilter/source/dmapper/genclass.xsl new file mode 100644 index 000000000000..eaddab52ea0e --- /dev/null +++ b/writerfilter/source/dmapper/genclass.xsl @@ -0,0 +1,707 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsl:stylesheet + version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:rng="http://relaxng.org/ns/structure/1.0" + xmlns:xalan="http://xml.apache.org/xalan" + exclude-result-prefixes = "xalan" + xml:indent="true"> + <xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/> + + <xsl:template match="/"> + <xsl:for-each select="/model/class"> + <xsl:choose> + <xsl:when test="$filetype='inc'"> + <xsl:call-template name="incfile"/> + </xsl:when> + <xsl:when test="$filetype='impl'"> + <xsl:call-template name="implfile"/> + </xsl:when> + </xsl:choose> + </xsl:for-each> + </xsl:template> + + <xsl:template name="license"> + <xsl:text>/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: PropertyMap.hxx,v $ + * $Revision: 1.18 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/
</xsl:text> + </xsl:template> + + <xsl:template name="memberid"> + <xsl:variable name="member"> + <xsl:choose> + <xsl:when test="@member"> + <xsl:value-of select="@member"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="@name"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:for-each select="ancestor::class/member[@name=$member]"> + <xsl:choose> + <xsl:when test="@type='bool'"> + <xsl:text>m_b</xsl:text> + </xsl:when> + <xsl:when test="@type='OUString'"> + <xsl:text>m_s</xsl:text> + </xsl:when> + <xsl:when test="@type='sal_uInt32'"> + <xsl:text>m_n</xsl:text> + </xsl:when> + <xsl:otherwise> + <xsl:text>m_</xsl:text> + </xsl:otherwise> + </xsl:choose> + </xsl:for-each> + <xsl:call-template name="capfirst"> + <xsl:with-param name="string" select="$member"/> + </xsl:call-template> + </xsl:template> + + <xsl:template name="incfile"> + <xsl:call-template name="license"/> + <xsl:for-each select="//class"> + <xsl:variable name="includeguard"> + <xsl:text>INCLUDED_</xsl:text> + <xsl:value-of select="@name"/> + <xsl:text>_HXX</xsl:text> + </xsl:variable> + <xsl:text>#ifndef </xsl:text> + <xsl:value-of select="$includeguard"/> + <xsl:text>
#define </xsl:text> + <xsl:value-of select="$includeguard"/> + <xsl:text>
#include <resourcemodel/WW8ResourceModel.hxx></xsl:text> + <xsl:text>
#include <rtl/ustring.hxx></xsl:text> + <xsl:text>
namespace writerfilter {</xsl:text> + <xsl:text>
namespace dmapper {</xsl:text> + <xsl:call-template name="classdecl"/> + <xsl:text>
}}</xsl:text> + <xsl:text>
#endif //</xsl:text> + <xsl:value-of select="$includeguard"/> + <xsl:text>
</xsl:text> + </xsl:for-each> + </xsl:template> + + <xsl:template name="implfile"> + <xsl:call-template name="license"/> + <xsl:for-each select="//class"> + <xsl:text>#include "</xsl:text> + <xsl:value-of select="@name"/> + <xsl:text>.hxx"
</xsl:text> + <xsl:text>
#include <ooxml/resourceids.hxx></xsl:text> + <xsl:text>
#ifdef DEBUG_DOMAINMAPPER</xsl:text> + <xsl:text>
#include <resourcemodel/QNameToString.hxx></xsl:text> + <xsl:text>
#include "dmapperLoggers.hxx"</xsl:text> + <xsl:text>
#endif</xsl:text> + <xsl:text>
namespace writerfilter {</xsl:text> + <xsl:text>
namespace dmapper {
</xsl:text> + <xsl:call-template name="classimpl"/> + <xsl:text>}}
</xsl:text> + </xsl:for-each> + </xsl:template> + + <xsl:template name="classdecl"> + <xsl:text>
class </xsl:text> + <xsl:value-of select="@name"/> + <xsl:if test="parent"> + <xsl:text> : public </xsl:text> + </xsl:if> + <xsl:for-each select="parent"> + <xsl:if test="position() > 1"> + <xsl:text>, </xsl:text> + </xsl:if> + <xsl:value-of select="@name"/> + </xsl:for-each> + <xsl:text>
{</xsl:text> + <xsl:text>
public:</xsl:text> + <xsl:call-template name="typedefs"/> + <xsl:text>
 // constructor</xsl:text> + <xsl:text>
 </xsl:text> + <xsl:value-of select="@name"/> + <xsl:text>();</xsl:text> + <xsl:text>
 // destructor</xsl:text> + <xsl:text>
 virtual ~</xsl:text> + <xsl:value-of select="@name"/> + <xsl:text>();
</xsl:text> + <xsl:call-template name="memberfuncdecls"/> + <xsl:for-each select="sprm"> + <xsl:text>
 // sprm</xsl:text> + <xsl:text>
 void sprm(Sprm & r_sprm);</xsl:text> + <xsl:text>
 void resolveSprm(Sprm & r_sprm);
</xsl:text> + </xsl:for-each> + <xsl:for-each select="attribute"> + <xsl:text>
 // attribute</xsl:text> + <xsl:text>
 void attribute(Id name, Value & val);
</xsl:text> + </xsl:for-each> + <xsl:text>
private:</xsl:text> + <xsl:call-template name="memberdecls"/> + <xsl:text>
};

</xsl:text> + </xsl:template> + + <xsl:template name="type"> + <xsl:param name="name"/> + <xsl:choose> + <xsl:when test="$name='OUString'"> + <xsl:text>::rtl::OUString</xsl:text> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$name"/> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template name="typedefs"> + <xsl:text>
 // typedefs</xsl:text> + <xsl:for-each select="typedef"> + <xsl:text>
 typedef </xsl:text> + <xsl:choose> + <xsl:when test="@type = 'shared_ptr'"> + <xsl:text>::boost::shared_ptr<</xsl:text> + <xsl:value-of select="ancestor::class/@name"/> + <xsl:text>></xsl:text> + </xsl:when> + <xsl:otherwise> + </xsl:otherwise> + </xsl:choose> + <xsl:for-each select="vector"> + <xsl:text>::std::vector<</xsl:text> + <xsl:call-template name="cctype"/> + <xsl:text>></xsl:text> + </xsl:for-each> + <xsl:text> </xsl:text> + <xsl:value-of select="@name"/> + <xsl:text>;</xsl:text> + </xsl:for-each> + <xsl:text>
</xsl:text> + </xsl:template> + + <xsl:template name="settername"> + <xsl:text>set</xsl:text> + <xsl:call-template name="capfirst"> + <xsl:with-param name="string" select="@name"/> + </xsl:call-template> + </xsl:template> + + <xsl:template name="gettername"> + <xsl:text>get</xsl:text> + <xsl:call-template name="capfirst"> + <xsl:with-param name="string" select="@name"/> + </xsl:call-template> + </xsl:template> + + <xsl:template name="pushbackname"> + <xsl:value-of select="@name"/> + <xsl:text>PushBack</xsl:text> + </xsl:template> + + <xsl:template name="settersig"> + <xsl:param name="classname"/> + <xsl:variable name="impl"> + <xsl:if test="string-length($classname) > 0"> + <xsl:text>true</xsl:text> + </xsl:if> + </xsl:variable> + <xsl:text>void </xsl:text> + <xsl:if test="string-length($classname) > 0"> + <xsl:value-of select="$classname"/> + <xsl:text>::</xsl:text> + </xsl:if> + <xsl:call-template name="settername"/> + <xsl:text>(</xsl:text> + <xsl:call-template name="constcctyperef"> + <xsl:with-param name="impl" select="$impl"/> + </xsl:call-template> + <xsl:text> </xsl:text> + <xsl:call-template name="paramname"/> + <xsl:text>)</xsl:text> + </xsl:template> + + <xsl:template name="gettersig"> + <xsl:param name="classname"/> + <xsl:variable name="impl"> + <xsl:if test="string-length($classname) > 0"> + <xsl:text>true</xsl:text> + </xsl:if> + </xsl:variable> + <xsl:variable name="type" select="@type"/> + <xsl:call-template name="constcctyperef"> + <xsl:with-param name="impl" select="$impl"/> + </xsl:call-template> + <xsl:text> </xsl:text> + <xsl:if test="string-length($classname) > 0"> + <xsl:value-of select="$classname"/> + <xsl:text>::</xsl:text> + </xsl:if> + <xsl:call-template name="gettername"/> + <xsl:text>() const</xsl:text> + </xsl:template> + + <xsl:template name="pushbacksig"> + <xsl:param name="classname"/> + <xsl:variable name="pushback"> + <xsl:call-template name="pushbackname"/> + </xsl:variable> + <xsl:variable name="type" select="@type"/> + <xsl:for-each select="ancestor::class/typedef[@name=$type]"> + <xsl:for-each select="vector"> + <xsl:text>void </xsl:text> + <xsl:if test="string-length($classname) > 0"> + <xsl:value-of select="$classname"/> + <xsl:text>::</xsl:text> + </xsl:if> + <xsl:value-of select="$pushback"/> + <xsl:text>(</xsl:text> + <xsl:call-template name="constcctyperef"> + <xsl:with-param name="deep">true</xsl:with-param> + </xsl:call-template> + <xsl:text> r_Element</xsl:text> + <xsl:text>)</xsl:text> + </xsl:for-each> + </xsl:for-each> + </xsl:template> + + <xsl:template name="memberfuncdecls"> + <xsl:for-each select="member"> + <xsl:text>
 // member: </xsl:text> + <xsl:value-of select="@name"/> + <xsl:text>
 </xsl:text> + <xsl:call-template name="settersig"/> + <xsl:text>;</xsl:text> + <xsl:text>
 </xsl:text> + <xsl:call-template name="gettersig"/> + <xsl:text>;
 </xsl:text> + <xsl:variable name="pushback"> + <xsl:call-template name="pushbacksig"/> + </xsl:variable> + <xsl:if test="string-length($pushback) > 0"> + <xsl:value-of select="$pushback"/> + <xsl:text>;
</xsl:text> + </xsl:if> + </xsl:for-each> + </xsl:template> + + <xsl:template name="memberdecls"> + <xsl:for-each select="member"> + <xsl:text>
 </xsl:text> + <xsl:call-template name="cctype"/> + <xsl:text> </xsl:text> + <xsl:call-template name="memberid"/> + <xsl:text>;</xsl:text> + </xsl:for-each> + </xsl:template> + + <xsl:template name="cctype"> + <xsl:param name="deep"/> + <xsl:param name="impl"/> + <xsl:variable name="type" select="@type"/> + <xsl:variable name="try1"> + <xsl:if test="$deep='true'"> + <xsl:for-each select="ancestor::class/typedef[@name=$type]"> + <xsl:for-each select="vector"> + <xsl:call-template name="cctype"> + <xsl:with-param name="impl" select="$impl"/> + <xsl:with-param name="deep" select="$deep"/> + </xsl:call-template> + </xsl:for-each> + </xsl:for-each> + </xsl:if> + </xsl:variable> + <xsl:choose> + <xsl:when test="string-length($try1) > 0"> + <xsl:value-of select="$try1"/> + </xsl:when> + <xsl:when test="@type='OUString'"> + <xsl:text>rtl::OUString</xsl:text> + </xsl:when> + <xsl:otherwise> + <xsl:if test="$impl='true'"> + <xsl:for-each select="ancestor::class"> + <xsl:variable name="classname" select="@name"/> + <xsl:for-each select="typedef[@name=$type]"> + <xsl:value-of select="$classname"/> + <xsl:text>::</xsl:text> + </xsl:for-each> + </xsl:for-each> + </xsl:if> + <xsl:value-of select="@type"/> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template name="constcctype"> + <xsl:param name="impl"/> + <xsl:choose> + <xsl:when test="@type='bool' or @type='sal_uInt32'"> + <xsl:value-of select="@type"/> + </xsl:when> + <xsl:otherwise> + <xsl:text>const </xsl:text> + <xsl:call-template name="cctype"> + <xsl:with-param name="impl" select="$impl"/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template name="constcctyperef"> + <xsl:param name="impl"/> + <xsl:choose> + <xsl:when test="@type='bool' or @type='sal_uInt32'"> + <xsl:value-of select="@type"/> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="constcctype"> + <xsl:with-param name="impl" select="$impl"/> + </xsl:call-template> + <xsl:text> &</xsl:text> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template name="capfirst"> + <xsl:param name="string"/> + <xsl:variable name="first" select="translate(substring($string, 1,1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/> + <xsl:value-of select="concat($first, substring($string, 2))"/> + </xsl:template> + + <xsl:template name="paramname"> + <xsl:choose> + <xsl:when test="@type='OUString'"> + <xsl:text>r_s</xsl:text> + <xsl:call-template name="capfirst"> + <xsl:with-param name="string" select="@name"/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:text>r_</xsl:text> + <xsl:value-of select="@name"/> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template name="setterimpl"> + <xsl:call-template name="settersig"> + <xsl:with-param name="classname" select="ancestor::class/@name"/> + </xsl:call-template> + <xsl:text>
{</xsl:text> + <xsl:text>
 </xsl:text> + <xsl:call-template name="memberid"/> + <xsl:text> = </xsl:text> + <xsl:call-template name="paramname"/> + <xsl:text>;</xsl:text> + <xsl:text>
}

</xsl:text> + </xsl:template> + + <xsl:template name="getterimpl"> + <xsl:call-template name="gettersig"> + <xsl:with-param name="classname" select="ancestor::class/@name"/> + </xsl:call-template> + <xsl:text>
{</xsl:text> + <xsl:text>
 return </xsl:text> + <xsl:call-template name="memberid"/> + <xsl:text>;</xsl:text> + <xsl:text>
}

</xsl:text> + </xsl:template> + + <xsl:template name="pushbackimpl"> + <xsl:variable name="sig"> + <xsl:call-template name="pushbacksig"> + <xsl:with-param name="classname" select="ancestor::class/@name"/> + </xsl:call-template> + </xsl:variable> + <xsl:if test="string-length($sig) > 0"> + <xsl:value-of select="$sig"/> + <xsl:text>
{</xsl:text> + <xsl:text>
 </xsl:text> + <xsl:call-template name="memberid"/> + <xsl:text>.push_back(r_Element);</xsl:text> + <xsl:text>
}

</xsl:text> + </xsl:if> + </xsl:template> + + <xsl:template name="getvalue"> + <xsl:param name="valuePrefix"/> + <xsl:choose> + <xsl:when test="@type='OUString'"> + <xsl:value-of select="$valuePrefix"/> + <xsl:text>getString()</xsl:text> + </xsl:when> + <xsl:when test="@type='bool' or @type='sal_uInt32'"> + <xsl:value-of select="$valuePrefix"/> + <xsl:text>getInt()</xsl:text> + </xsl:when> + <xsl:when test="@type"> + <xsl:variable name="type" select="@type"/> + <xsl:for-each select="ancestor::class/typedef[@name=$type]"> + <xsl:call-template name="getvalue"> + <xsl:with-param name="valuePrefix" select="$valuePrefix"/> + </xsl:call-template> + </xsl:for-each> + </xsl:when> + <xsl:otherwise> + <xsl:variable name="member"> + <xsl:choose> + <xsl:when test="@member"> + <xsl:value-of select="@member"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="@name"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + <xsl:for-each select="ancestor::class/member[@name=$member]"> + <xsl:call-template name="getvalue"> + <xsl:with-param name="valuePrefix" select="$valuePrefix"/> + </xsl:call-template> + </xsl:for-each> + </xsl:otherwise> + </xsl:choose> + <xsl:for-each select="vector"> + <xsl:call-template name="getvalue"> + <xsl:with-param name="valuePrefix" select="$valuePrefix"/> + </xsl:call-template> + </xsl:for-each> + </xsl:template> + + <xsl:template name="sprmactionset"> + <xsl:param name="valuePrefix"/> + <xsl:text>
 {</xsl:text> + <xsl:text>
 </xsl:text> + <xsl:call-template name="memberid"/> + <xsl:text> = </xsl:text> + <xsl:call-template name="getvalue"> + <xsl:with-param name="valuePrefix" select="$valuePrefix"/> + </xsl:call-template> + <xsl:text>;
 }</xsl:text> + </xsl:template> + + <xsl:template name="sprmactionpushback"> + <xsl:param name="valuePrefix"/> + <xsl:text>
 {</xsl:text> + <xsl:text>
 </xsl:text> + <xsl:call-template name="memberid"/> + <xsl:text>.push_back(</xsl:text> + <xsl:call-template name="getvalue"> + <xsl:with-param name="valuePrefix" select="$valuePrefix"/> + </xsl:call-template> + <xsl:text>);</xsl:text> + <xsl:text>;
 }</xsl:text> + </xsl:template> + + <xsl:template name="sprmactionresolve"> + <xsl:text>
 {</xsl:text> + <xsl:text>
 resolveSprm(r_Sprm);</xsl:text> + <xsl:text>
 }</xsl:text> + </xsl:template> + + <xsl:template name="sprmaction"> + <xsl:param name="valuePrefix"/> + <xsl:choose> + <xsl:when test="@action='set'"> + <xsl:call-template name="sprmactionset"> + <xsl:with-param name="valuePrefix" select="$valuePrefix"/> + </xsl:call-template> + </xsl:when> + <xsl:when test="@action='pushback'"> + <xsl:call-template name="sprmactionpushback"> + <xsl:with-param name="valuePrefix" select="$valuePrefix"/> + </xsl:call-template> + </xsl:when> + <xsl:when test="@action='resolve'"> + <xsl:call-template name="sprmactionresolve"/> + </xsl:when> + <xsl:otherwise/> + </xsl:choose> + </xsl:template> + + <xsl:template name="sprmimpl"> + <xsl:for-each select="sprm"> + <xsl:text>
void </xsl:text> + <xsl:variable name="classname" select="ancestor::class/@name"/> + <xsl:value-of select="$classname"/> + <xsl:text>::sprm(Sprm & r_Sprm)</xsl:text> + <xsl:text>
{</xsl:text> + <xsl:text>
#ifdef DEBUG_DOMAINMAPPER</xsl:text> + <xsl:text>
 dmapper_logger->startElement("</xsl:text> + <xsl:value-of select="$classname"/> + <xsl:text>.sprm");</xsl:text> + <xsl:text>
 dmapper_logger->chars(r_Sprm.toString());</xsl:text> + <xsl:text>
#endif</xsl:text> + <xsl:text>
 switch(r_Sprm.getId())</xsl:text> + <xsl:text>
 {</xsl:text> + <xsl:for-each select="element"> + <xsl:text>
 case </xsl:text> + <xsl:value-of select="@id"/> + <xsl:text>:</xsl:text> + <xsl:text>
 /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */</xsl:text> + <xsl:call-template name="sprmaction"> + <xsl:with-param name="valuePrefix">r_Sprm.getValue()-></xsl:with-param> + </xsl:call-template> + <xsl:text>
 break;</xsl:text> + </xsl:for-each> + <xsl:text>
 default:</xsl:text> + <xsl:text>
#ifdef DEBUG_DOMAINMAPPER</xsl:text> + <xsl:text>
 dmapper_logger->element("unhandled");</xsl:text> + <xsl:text>
#endif DEBUG_DOMAINMAPPER</xsl:text> + <xsl:text>
 break;</xsl:text> + <xsl:text>
 }</xsl:text> + <xsl:text>
#ifdef DEBUG_DOMAINMAPPER</xsl:text> + <xsl:text>
 dmapper_logger->endElement("</xsl:text> + <xsl:value-of select="$classname"/> + <xsl:text>.sprm");</xsl:text> + <xsl:text>
#endif</xsl:text> + <xsl:text>
}
</xsl:text> + <xsl:text>
void </xsl:text> + <xsl:value-of select="ancestor::class/@name"/> + <xsl:text>::resolveSprm(Sprm & r_Sprm)</xsl:text> + <xsl:text>
{</xsl:text> + <xsl:text>
 writerfilter::Reference<Properties>::Pointer_t pProperties = r_Sprm.getProps();</xsl:text> + <xsl:text>
 if( pProperties.get())</xsl:text> + <xsl:text>
 pProperties->resolve(*this);</xsl:text> + <xsl:text>
}
</xsl:text> + </xsl:for-each> + </xsl:template> + + <xsl:template name="attrimpl"> + <xsl:for-each select="attribute"> + <xsl:text>
void </xsl:text> + <xsl:variable name="classname" select="ancestor::class/@name"/> + <xsl:value-of select="$classname"/> + <xsl:text>::</xsl:text> + <xsl:text>attribute(Id name, Value & val)</xsl:text> + <xsl:text>
{</xsl:text> + <xsl:text>
#ifdef DEBUG_DOMAINMAPPER</xsl:text> + <xsl:text>
 dmapper_logger->startElement("</xsl:text> + <xsl:value-of select="$classname"/> + <xsl:text>.attribute");</xsl:text> + <xsl:text>
 dmapper_logger->attribute("name", (*QNameToString::Instance())(name));</xsl:text> + <xsl:text>
 dmapper_logger->attribute("value", val.toString());</xsl:text> + <xsl:text>
 dmapper_logger->endElement("</xsl:text> + <xsl:value-of select="$classname"/> + <xsl:text>.attribute");</xsl:text> + <xsl:text>
#endif</xsl:text> + <xsl:text>
 switch (name)</xsl:text> + <xsl:text>
 {</xsl:text> + <xsl:for-each select="attribute"> + <xsl:text>
 case </xsl:text> + <xsl:value-of select="@id"/> + <xsl:text>:</xsl:text> + <xsl:text>
 /* WRITERFILTERSTATUS done: 100, planned: 2, spent: 0 */</xsl:text> + <xsl:call-template name="sprmactionset"> + <xsl:with-param name="valuePrefix">val.</xsl:with-param> + </xsl:call-template> + <xsl:text>
 break;</xsl:text> + </xsl:for-each> + <xsl:text>
 default:</xsl:text> + <xsl:text>
#ifdef DEBUG_DOMAINMAPPER</xsl:text> + <xsl:text>
 dmapper_logger->element("unhandled");</xsl:text> + <xsl:text>
#endif DEBUG_DOMAINMAPPER</xsl:text> + <xsl:text>
 break;</xsl:text> + <xsl:text>
 }</xsl:text> + <xsl:text>
}

</xsl:text> + </xsl:for-each> + </xsl:template> + + <xsl:template name="constructorimpl"> + <xsl:text>
</xsl:text> + <xsl:value-of select="@name"/> + <xsl:text>::</xsl:text> + <xsl:value-of select="@name"/> + <xsl:text>()</xsl:text> + <xsl:variable name="memberinits"> + <xsl:for-each select="member[@type='sal_uInt32' or @type='bool']"> + <xsl:if test="position() > 1"> + <xsl:text>,</xsl:text> + <xsl:text>
 </xsl:text> + </xsl:if> + <xsl:call-template name="memberid"/> + <xsl:choose> + <xsl:when test="@type='sal_uInt32'"> + <xsl:text>(0)</xsl:text> + </xsl:when> + <xsl:when test="@type='bool'"> + <xsl:text>(false)</xsl:text> + </xsl:when> + </xsl:choose> + </xsl:for-each> + </xsl:variable> + <xsl:if test="string-length($memberinits) > 0"> + <xsl:text>
: </xsl:text> + <xsl:value-of select="$memberinits"/> + </xsl:if> + <xsl:text>
{</xsl:text> + <xsl:text>
}

</xsl:text> + </xsl:template> + + <xsl:template name="destructorimpl"> + <xsl:text>
</xsl:text> + <xsl:value-of select="@name"/> + <xsl:text>::~</xsl:text> + <xsl:value-of select="@name"/> + <xsl:text>()</xsl:text> + <xsl:text>
{</xsl:text> + <xsl:text>
}

</xsl:text> + </xsl:template> + + <xsl:template name="classimpl"> + <xsl:variable name="classname" select="@name"/> + <xsl:variable name="comment"> + <xsl:text>class: </xsl:text> + <xsl:value-of select="$classname"/> + </xsl:variable> + <xsl:variable name="commentfill"> + <xsl:value-of select="translate($comment, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ: ', + '******************************************************')"/> + </xsl:variable> + <xsl:text>
/***</xsl:text> + <xsl:value-of select="$commentfill"/> + <xsl:text>*</xsl:text> + <xsl:text>
 * </xsl:text> + <xsl:value-of select="$comment"/> + <xsl:text> *</xsl:text> + <xsl:text>
 **</xsl:text> + <xsl:value-of select="$commentfill"/> + <xsl:text>**/
</xsl:text> + <xsl:call-template name="constructorimpl"/> + <xsl:call-template name="destructorimpl"/> + <xsl:for-each select="member"> + <xsl:text>// member: </xsl:text> + <xsl:value-of select="$classname"/> + <xsl:text>::</xsl:text> + <xsl:value-of select="@name"/> + <xsl:text>
</xsl:text> + <xsl:call-template name="setterimpl"/> + <xsl:call-template name="getterimpl"/> + <xsl:call-template name="pushbackimpl"/> + </xsl:for-each> + <xsl:call-template name="sprmimpl"/> + <xsl:call-template name="attrimpl"/> + </xsl:template> +</xsl:stylesheet> diff --git a/writerfilter/source/dmapper/makefile.mk b/writerfilter/source/dmapper/makefile.mk index 4b9636855562..300dfb31d959 100644 --- a/writerfilter/source/dmapper/makefile.mk +++ b/writerfilter/source/dmapper/makefile.mk @@ -47,6 +47,8 @@ SLOFILES= \ $(SLO)$/DomainMapperTableHandler.obj \ $(SLO)$/DomainMapperTableManager.obj \ $(SLO)$/DomainMapper_Impl.obj \ + $(SLO)$/FFDataHandler.obj \ + $(SLO)$/FormControlHelper.obj \ $(SLO)$/FontTable.obj \ $(SLO)$/GraphicHelpers.obj \ $(SLO)$/GraphicImport.obj \ diff --git a/writerfilter/source/doctok/WW8DocumentImpl.cxx b/writerfilter/source/doctok/WW8DocumentImpl.cxx index 27dfd68e4eb8..fee0abc85fe7 100644 --- a/writerfilter/source/doctok/WW8DocumentImpl.cxx +++ b/writerfilter/source/doctok/WW8DocumentImpl.cxx @@ -157,6 +157,7 @@ WW8Document::~WW8Document() { } +#ifdef DEBUG class WW8IdToString : public IdToString { public: @@ -173,6 +174,7 @@ public: return s; } }; +#endif WW8DocumentImpl::~WW8DocumentImpl() { @@ -185,6 +187,9 @@ mbInSection(false), mbInParagraphGroup(false), mbInCharacterGroup(false) mpDocStream = getSubStream(::rtl::OUString::createFromAscii ("WordDocument")); + mpSummaryInformationStream = getSubStream(::rtl::OUString::createFromAscii + ("\5SummaryInformation")); + try { mpDataStream = getSubStream(::rtl::OUString::createFromAscii @@ -1077,6 +1082,24 @@ writerfilter::Reference<Table>::Pointer_t WW8DocumentImpl::getStyleSheet() const return pResult; } +writerfilter::Reference<Table>::Pointer_t WW8DocumentImpl::getAssocTable() const +{ + writerfilter::Reference<Table>::Pointer_t pResult; + + if (mpFib->get_lcbSttbfAssoc() > 0) + { + WW8Sttbf::Pointer_t pSttbfAssoc + (new WW8Sttbf(*mpTableStream, + mpFib->get_fcSttbfAssoc(), + mpFib->get_lcbSttbfAssoc())); + + pResult = writerfilter::Reference<Table>::Pointer_t + (new WW8SttbTableResource(pSttbfAssoc)); + } + + return pResult; +} + sal_uInt32 WW8DocumentImpl::getHeaderCount() const { sal_uInt32 nResult = 0; @@ -1281,6 +1304,19 @@ WW8DocumentImpl::getField(const CpAndFc & rCpAndFc) const return mpFieldHelper->getField(rCpAndFc); } +writerfilter::Reference<Properties>::Pointer_t +WW8DocumentImpl::getDocumentProperties() const +{ + writerfilter::Reference<Properties>::Pointer_t pResult; + + if (mpFib->get_lcbDop() > 0) + { + pResult.reset(new WW8DopBase(*mpTableStream, mpFib->get_fcDop(), mpFib->get_lcbDop())); + } + + return pResult; +} + WW8FLD::Pointer_t WW8DocumentImpl::getCurrentFLD() const { return mpFLD; @@ -1632,7 +1668,7 @@ void WW8DocumentImpl::resolve(Stream & rStream) //output.addItem(mTextboxHeaderEndCpAndFc.toString()); -#if 0 +#if 1 output.addItem("<substream-names>"); output.addItem(mpStream->getSubStreamNames()); output.addItem("</substream-names>"); @@ -1641,6 +1677,11 @@ void WW8DocumentImpl::resolve(Stream & rStream) { mpDocStream->dump(output); } + + if (mpSummaryInformationStream.get() != NULL) + { + mpSummaryInformationStream->dump(output); + } #endif writerfilter::Reference<Properties>::Pointer_t pFib @@ -1743,6 +1784,11 @@ void WW8DocumentImpl::resolve(Stream & rStream) clog << e.getText() << endl; } + writerfilter::Reference<Table>::Pointer_t pAssocTable = getAssocTable(); + + if (pAssocTable.get() != NULL) + rStream.table(NS_rtf::LN_SttbAssoc, pAssocTable); + writerfilter::Reference<Table>::Pointer_t pListTable = getListTable(); if (pListTable.get() != NULL) @@ -1845,6 +1891,9 @@ void WW8DocumentImpl::resolve(Stream & rStream) startSectionGroup(rStream); rStream.info(pIt->toString()); + if (nSectionIndex == 0) + rStream.props(getDocumentProperties()); + sal_uInt32 nHeaderStartIndex = 6 + nSectionIndex * 6; sal_uInt32 nHeaderEndIndex = nHeaderStartIndex + 6; diff --git a/writerfilter/source/doctok/WW8DocumentImpl.hxx b/writerfilter/source/doctok/WW8DocumentImpl.hxx index 9b123ae54cde..a1f7e8abb2b4 100644 --- a/writerfilter/source/doctok/WW8DocumentImpl.hxx +++ b/writerfilter/source/doctok/WW8DocumentImpl.hxx @@ -284,6 +284,9 @@ class WW8DocumentImpl : public WW8Document /// pointer to the compound object stream of the document WW8Stream::Pointer_t mpCompObjStream; + /// pointer to the summayry information stream of the document + WW8Stream::Pointer_t mpSummaryInformationStream; + /// pointer to the piece table WW8PieceTable::Pointer_t mpPieceTable; @@ -554,6 +557,11 @@ public: writerfilter::Reference<Table>::Pointer_t getStyleSheet() const; /** + Return reference to associated data. + */ + writerfilter::Reference<Table>::Pointer_t getAssocTable() const; + + /** Return count of headers/footers. */ sal_uInt32 getHeaderCount() const; @@ -677,6 +685,13 @@ public: getField(const CpAndFc & rCpAndFc) const; /** + Return document properties. + + */ + writerfilter::Reference<Properties>::Pointer_t + getDocumentProperties() const; + + /** Return current field descriptor. */ WW8FLD::Pointer_t getCurrentFLD() const; diff --git a/writerfilter/source/doctok/WW8FontTable.cxx b/writerfilter/source/doctok/WW8FontTable.cxx index f29d2ea4a343..7391763f347e 100644 --- a/writerfilter/source/doctok/WW8FontTable.cxx +++ b/writerfilter/source/doctok/WW8FontTable.cxx @@ -52,11 +52,6 @@ void WW8FontTable::initPayload() mnPlcfPayloadOffset = nOffset; } -sal_uInt32 WW8FontTable::calcPayloadOffset() -{ - return 0; -} - sal_uInt32 WW8FontTable::getEntryCount() { return entryOffsets.size() - 1; diff --git a/writerfilter/source/doctok/WW8LFOTable.cxx b/writerfilter/source/doctok/WW8LFOTable.cxx index 2164c4887c8b..1197ef7f190d 100644 --- a/writerfilter/source/doctok/WW8LFOTable.cxx +++ b/writerfilter/source/doctok/WW8LFOTable.cxx @@ -62,13 +62,6 @@ void WW8LFOTable::initPayload() payloadOffsets.push_back(nOffsetLFOData); } -sal_uInt32 WW8LFOTable::calcPayloadOffset() -{ - sal_uInt32 nResult = 4 + getEntryCount() * WW8LFO::getSize(); - - return nResult; -} - sal_uInt32 WW8LFOTable::getEntryCount() { return getU32(0); diff --git a/writerfilter/source/doctok/WW8ListTable.cxx b/writerfilter/source/doctok/WW8ListTable.cxx index f70c7740dff2..15ef3039d8da 100644 --- a/writerfilter/source/doctok/WW8ListTable.cxx +++ b/writerfilter/source/doctok/WW8ListTable.cxx @@ -68,11 +68,6 @@ void WW8ListTable::initPayload() entryOffsets.push_back(nOffset); } -sal_uInt32 WW8ListTable::calcPayloadOffset() -{ - return 0; -} - sal_uInt32 WW8ListTable::getEntryCount() { return getU16(0); diff --git a/writerfilter/source/doctok/WW8ResourceModelImpl.cxx b/writerfilter/source/doctok/WW8ResourceModelImpl.cxx index a576640905ce..da72435d5efb 100644 --- a/writerfilter/source/doctok/WW8ResourceModelImpl.cxx +++ b/writerfilter/source/doctok/WW8ResourceModelImpl.cxx @@ -27,7 +27,6 @@ #include <WW8ResourceModelImpl.hxx> #include <resources.hxx> -#include <util.hxx> #include <WW8OutputWithDepth.hxx> #include <resourcemodel/TableManager.hxx> #include <rtl/string.hxx> diff --git a/writerfilter/source/doctok/WW8StreamImpl.cxx b/writerfilter/source/doctok/WW8StreamImpl.cxx index 4418839919d4..585673bfa887 100644 --- a/writerfilter/source/doctok/WW8StreamImpl.cxx +++ b/writerfilter/source/doctok/WW8StreamImpl.cxx @@ -39,7 +39,9 @@ namespace doctok { using namespace ::com::sun::star; - TagLogger::Pointer_t debug_logger(TagLogger::getInstance("DEBUG")); +#ifdef DEBUG +TagLogger::Pointer_t debug_logger(TagLogger::getInstance("DEBUG")); +#endif WW8Stream::~WW8Stream() { diff --git a/writerfilter/source/doctok/WW8StructBase.cxx b/writerfilter/source/doctok/WW8StructBase.cxx index 7d03e8763c69..746034f4b177 100644 --- a/writerfilter/source/doctok/WW8StructBase.cxx +++ b/writerfilter/source/doctok/WW8StructBase.cxx @@ -26,7 +26,6 @@ ************************************************************************/ #include <WW8StructBase.hxx> -#include <util.hxx> namespace writerfilter { namespace doctok { diff --git a/writerfilter/source/doctok/WW8StyleSheet.cxx b/writerfilter/source/doctok/WW8StyleSheet.cxx index 797554f984e3..3bf08eee430c 100644 --- a/writerfilter/source/doctok/WW8StyleSheet.cxx +++ b/writerfilter/source/doctok/WW8StyleSheet.cxx @@ -46,11 +46,6 @@ void WW8StyleSheet::initPayload() entryOffsets.push_back(nOffset); } -sal_uInt32 WW8StyleSheet::calcPayloadOffset() -{ - return 0; -} - sal_uInt32 WW8StyleSheet::calcSize() { return getCount(); diff --git a/writerfilter/source/doctok/doctokLoggers.hxx b/writerfilter/source/doctok/doctokLoggers.hxx index 8df90348a249..b7dc7e0aa48f 100644 --- a/writerfilter/source/doctok/doctokLoggers.hxx +++ b/writerfilter/source/doctok/doctokLoggers.hxx @@ -28,6 +28,8 @@ #ifndef INCLUDED_DOCTOK_LOGGERS_HXX #define INCLUDED_DOCTOK_LOGGERS_HXX +#ifdef DEBUG + #include <resourcemodel/TagLogger.hxx> namespace writerfilter { @@ -36,5 +38,5 @@ namespace writerfilter { } } - +#endif // DEBUG #endif // INCLUDED_DOCTOK_LOGGERS_HXX diff --git a/writerfilter/source/doctok/dopbase.xml b/writerfilter/source/doctok/dopbase.xml new file mode 100644 index 000000000000..8beb21d8cf08 --- /dev/null +++ b/writerfilter/source/doctok/dopbase.xml @@ -0,0 +1,91 @@ +<model> + <ww8resource name="DopBase" resource="Properties"> + <bitfield size="4" type="U32"> + <bits name="fFacingPages" bits="1" token="rtf:fFacingPages"/> + <bits name="unused1" bits="1" token="rtf:unused1"/> + <bits name="fPMHMainDoc" bits="1" token="rtf:fPMHMainDoc"/> + <bits name="unused2" bits="2" token="rtf:unused2"/> + <bits name="fpc" bits="2" token="rtf:fpc"/> + <bits name="unused3" bits="1" token="rtf:unused3"/> + <bits name="unused4" bits="8" token="rtf:unused4"/> + <bits name="rncFtn" bits="2" token="rtf:rncFtn"/> + <bits name="nFtn" bits="14" token="rtf:nFtn"/> + </bitfield> + <bitfield size="4" type="U32"> + <bits name="unused5" bits="1" token="rtf:unused5"/> + <bits name="unused6" bits="1" token="rtf:unused6"/> + <bits name="unused7" bits="1" token="rtf:unused7"/> + <bits name="unused8" bits="1" token="rtf:unused8"/> + <bits name="unused9" bits="1" token="rtf:unused9"/> + <bits name="unused10" bits="1" token="rtf:unused10"/> + <bits name="fSplAllDone" bits="1" token="rtf:fSplAllDone"/> + <bits name="fSplAllClean" bits="1" token="rtf:fSplAllClean"/> + <bits name="fSplHideErrors" bits="1" token="rtf:fSplHideErrors"/> + <bits name="fGramHideErrors" bits="1" token="rtf:fGramHideErrors"/> + <bits name="fLabelDoc" bits="1" token="rtf:fLabelDoc"/> + <bits name="fHyphCapitals" bits="1" token="rtf:fHyphCapitals"/> + <bits name="fAutoHyphen" bits="1" token="rtf:fAutoHyphen"/> + <bits name="fFormNoFields" bits="1" token="rtf:fFormNoFields"/> + <bits name="fLinkStyles" bits="1" token="rtf:fLinkStyles"/> + <bits name="fRevMarking" bits="1" token="rtf:fRevMarking"/> + <bits name="unused11" bits="1" token="rtf:unused11"/> + <bits name="fExactCWords" bits="1" token="rtf:fExactCWords"/> + <bits name="fPagHidden" bits="1" token="rtf:fPagHidden"/> + <bits name="fPagResults" bits="1" token="rtf:fPagResults"/> + <bits name="fLockAtn" bits="1" token="rtf:fLockAtn"/> + <bits name="fMirrorMargins" bits="1" token="rtf:fMirrorMargins"/> + <bits name="fWord97Compat" bits="1" token="rtf:fWord97Compat"/> + <bits name="unused12" bits="1" token="rtf:unused12"/> + <bits name="unused13" bits="1" token="rtf:unused13"/> + <bits name="fProtEnabled" bits="1" token="rtf:fProtEnabled"/> + <bits name="fDispFormFldSel" bits="1" token="rtf:fDispFormFldSel"/> + <bits name="fRMView" bits="1" token="rtf:fRMView"/> + <bits name="fRMPrint" bits="1" token="rtf:fRMPrint"/> + <bits name="fLockVbaProj" bits="1" token="rtf:fLockVbaProj"/> + <bits name="fLockRev" bits="1" token="rtf:fLockRev"/> + <bits name="fEmbedFonts" bits="1" token="rtf:fEmbedFonts"/> + </bitfield> + <attribute name="copts60" type="U16" size="2" token="rtf:copts60"/> + <attribute name="dxaTab" type="U16" size="2" token="rtf:dxaTab"/> + <attribute name="cpgWebOpt" type="U16" size="2" token="rtf:cpgWebOpt"/> + <attribute name="dxaHotZ" type="U16" size="2" token="rtf:dxaHotZ"/> + <attribute name="cConsecHypLim" type="U16" size="2" token="rtf:cConsecHypLim"/> + <attribute name="wSpare2" type="U16" size="2" token="rtf:wSpare2"/> + <attribute name="dttmCreated" type="U32" size="4" token="rtf:dttmCreated"/> + <attribute name="dttmRevised" type="U32" size="4" token="rtf:dttmRevised"/> + <attribute name="dttmLastPrint" type="U32" size="4" token="rtf:dttmLastPrint"/> + <attribute name="nRevision" type="U16" size="2" token="rtf:nRevision"/> + <attribute name="tmEdited" type="U32" size="4" token="rtf:tmEdited"/> + <attribute name="cWords" type="U32" size="4" token="rtf:cWords"/> + <attribute name="cCh" type="U32" size="4" token="rtf:cCh"/> + <attribute name="cPg" type="U16" size="2" token="rtf:cPg"/> + <attribute name="cParas" type="U32" size="4" token="rtf:cParas"/> + <bitfield size="4" type="U32"> + <bits name="rncEdn" bits="2" token="rtf:rncEdn"/> + <bits name="nEdn" bits="14" token="rtf:"/> + <bits name="epc" bits="2" token="rtf:"/> + <bits name="unused14" bits="4" token="rtf:unused14"/> + <bits name="unused15" bits="4" token="rtf:unused15"/> + <bits name="fPrintFormData" bits="1" token="rtf:fPrintFormData"/> + <bits name="fSaveFormData" bits="1" token="rtf:fSaveFormData"/> + <bits name="fShadeFormData" bits="1" token="rtf:fShadeFormData"/> + <bits name="fShadeMergeFields" bits="1" token="rtf:fShadeMergeFields"/> + <bits name="reserved2" bits="1" token="rtf:reserved2"/> + <bits name="fIncludeSubdocsInStats" bits="1" token="rtf:fIncludeSubdocsInStats"/> + </bitfield> + <attribute name="cLines" type="U32" size="4" token="rtf:cLines"/> + <attribute name="cWordsWithSubdocs" type="U32" size="4" token="rtf:cWordsWithSubdocs"/> + <attribute name="cChWithSubdocs" type="U32" size="4" token="rtf:cChWithSubdocs"/> + <attribute name="cPgWithSubdocs" type="U16" size="2" token="rtf:cPgWithSubdocs"/> + <attribute name="cParasWithSubdocs" type="U32" size="4" token="rtf:cParasWithSubdocs"/> + <attribute name="cLinesWithSubdocs" type="U32" size="4" token="rtf:cLinesWithSubdocs"/> + <attribute name="lKeyProtDoc" type="U32" size="4" token="rtf:lKeyProtDoc"/> + <bitfield size="2" type="U16"> + <bits name="wvkoSaved" bits="3" token="rtf:wvkoSaved"/> + <bits name="pctWwdSaved" bits="9" token="rtf:pctWwdSaved"/> + <bits name="zkSaved" bits="2" token="rtf:zkSaved"/> + <bits name="unused16" bits="1" token="rtf:unused16"/> + <bits name="iGutterPos" bits="1" token="rtf:iGutterPos"/> + </bitfield> + </ww8resource> +</model>
\ No newline at end of file diff --git a/writerfilter/source/doctok/makefile.mk b/writerfilter/source/doctok/makefile.mk index 6a407a0b91ea..ff03079f2c7a 100644 --- a/writerfilter/source/doctok/makefile.mk +++ b/writerfilter/source/doctok/makefile.mk @@ -58,7 +58,6 @@ SLOFILES= \ $(SLO)$/WW8LFOTable.obj \ $(SLO)$/WW8ListTable.obj \ $(SLO)$/resources.obj \ - $(SLO)$/doctokutil.obj \ $(SLO)$/WW8CpAndFc.obj \ $(SLO)$/WW8StructBase.obj \ $(SLO)$/WW8Clx.obj \ diff --git a/writerfilter/source/doctok/resources.xmi b/writerfilter/source/doctok/resources.xmi index cfcd2ac7e67e..926e046d37b9 100644 --- a/writerfilter/source/doctok/resources.xmi +++ b/writerfilter/source/doctok/resources.xmi @@ -552,6 +552,21 @@ </UML:ModelElement.stereotype> </UML:Attribute> </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="SttbAssoc"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:SttbAssoc</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> </UML:Class> <!--Class dummy--> <!--Classes without stereotype--> @@ -578,6 +593,4611 @@ </UML:Class> <!--Resources--> <!--WW8 resources--> + <!--Class DopBase--> + <UML:Class xmi.id="DopBase" name="DopBase"> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="ww8resource"/> + </UML:ModelElement.stereotype> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>84</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="size"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:Classifier.feature> + <UML:Attribute name="fFacingPages"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>31</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x80000000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fFacingPages</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="unused1"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>30</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x40000000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:unused1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fPMHMainDoc"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>29</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x20000000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fPMHMainDoc</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="unused2"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>27</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x18000000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>2</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:unused2</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fpc"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>25</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x6000000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>2</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fpc</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="unused3"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>24</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x000000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:unused3</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="unused4"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>16</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0xff0000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>8</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:unused4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="rncFtn"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>14</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0xc000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>2</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:rncFtn</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="nFtn"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x3fff</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>14</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:nFtn</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="unused5"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>31</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x80000000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:unused5</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="unused6"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>30</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x40000000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:unused6</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="unused7"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>29</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x20000000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:unused7</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="unused8"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>28</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x0000000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:unused8</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="unused9"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>27</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x8000000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:unused9</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="unused10"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>26</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x4000000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:unused10</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fSplAllDone"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>25</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x2000000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fSplAllDone</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fSplAllClean"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>24</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x000000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fSplAllClean</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fSplHideErrors"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>23</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x800000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fSplHideErrors</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fGramHideErrors"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>22</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x400000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fGramHideErrors</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fLabelDoc"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>21</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x200000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fLabelDoc</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fHyphCapitals"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>20</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x00000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fHyphCapitals</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fAutoHyphen"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>19</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x80000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fAutoHyphen</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fFormNoFields"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>18</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x40000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fFormNoFields</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fLinkStyles"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>17</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x20000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fLinkStyles</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fRevMarking"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>16</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x0000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fRevMarking</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="unused11"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>15</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x8000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:unused11</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fExactCWords"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>14</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x4000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fExactCWords</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fPagHidden"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>13</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x2000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fPagHidden</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fPagResults"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>12</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fPagResults</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fLockAtn"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>11</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x800</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fLockAtn</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fMirrorMargins"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>10</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x400</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fMirrorMargins</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fWord97Compat"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>9</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x200</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fWord97Compat</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="unused12"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>8</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x00</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:unused12</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="unused13"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>7</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x80</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:unused13</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fProtEnabled"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>6</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x40</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fProtEnabled</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fDispFormFldSel"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>5</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x20</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fDispFormFldSel</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fRMView"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x0</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fRMView</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fRMPrint"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>3</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x8</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fRMPrint</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fLockVbaProj"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>2</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fLockVbaProj</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fLockRev"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x2</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fLockRev</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fEmbedFonts"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fEmbedFonts</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="copts60"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>8</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:copts60</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U16"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="dxaTab"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>10</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:dxaTab</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U16"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="cpgWebOpt"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>12</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:cpgWebOpt</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U16"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="dxaHotZ"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>14</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:dxaHotZ</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U16"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="cConsecHypLim"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>16</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:cConsecHypLim</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U16"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="wSpare2"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>18</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:wSpare2</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U16"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="dttmCreated"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>20</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:dttmCreated</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="dttmRevised"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>24</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:dttmRevised</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="dttmLastPrint"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>28</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:dttmLastPrint</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="nRevision"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>32</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:nRevision</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U16"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="tmEdited"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>34</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:tmEdited</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="cWords"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>38</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:cWords</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="cCh"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>42</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:cCh</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="cPg"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>46</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:cPg</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U16"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="cParas"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>48</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:cParas</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="rncEdn"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>52</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>30</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0xc0000000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>2</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:rncEdn</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="nEdn"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>52</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>16</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x3fff0000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>14</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="epc"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>52</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>14</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0xc000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>2</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="unused14"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>52</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>10</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x3c00</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:unused14</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="unused15"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>52</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>6</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x3c0</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:unused15</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fPrintFormData"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>52</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>5</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x20</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fPrintFormData</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fSaveFormData"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>52</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x0</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fSaveFormData</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fShadeFormData"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>52</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>3</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x8</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fShadeFormData</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fShadeMergeFields"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>52</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>2</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fShadeMergeFields</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="reserved2"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>52</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x2</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:reserved2</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="fIncludeSubdocsInStats"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>52</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:fIncludeSubdocsInStats</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="cLines"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>56</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:cLines</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="cWordsWithSubdocs"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>60</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:cWordsWithSubdocs</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="cChWithSubdocs"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>64</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:cChWithSubdocs</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="cPgWithSubdocs"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>68</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:cPgWithSubdocs</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U16"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="cParasWithSubdocs"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>70</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:cParasWithSubdocs</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="cLinesWithSubdocs"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>74</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:cLinesWithSubdocs</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="lKeyProtDoc"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>78</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:lKeyProtDoc</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U32"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="wvkoSaved"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>82</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>13</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0xe000</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>3</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:wvkoSaved</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U16"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="pctWwdSaved"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>82</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>4</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x1ff0</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>9</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:pctWwdSaved</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U16"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="zkSaved"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>82</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>2</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0xc</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>2</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:zkSaved</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U16"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="unused16"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>82</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x2</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:unused16</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U16"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + <UML:Classifier.feature> + <UML:Attribute name="iGutterPos"> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue/> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="comment"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>82</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="offset"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="shift"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>0x1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="mask"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>1</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="bits"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:ModelElement.taggedValue> + <UML:TaggedValue> + <UML:TaggedValue.dataValue>rtf:iGutterPos</UML:TaggedValue.dataValue> + <UML:TaggedValue.type> + <UML:TagDefinition xmi.idref="attrid"/> + </UML:TaggedValue.type> + </UML:TaggedValue> + </UML:ModelElement.taggedValue> + <UML:StructuralFeature.type> + <UML:DataType xmi.idref="U16"/> + </UML:StructuralFeature.type> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="attribute"/> + </UML:ModelElement.stereotype> + </UML:Attribute> + </UML:Classifier.feature> + </UML:Class> + <UML:Generalization isSpecification="false" xmi.id="DopBase-Properties"> + <UML:Generalization.child> + <UML:Class xmi.idref="DopBase"/> + </UML:Generalization.child> + <UML:Generalization.parent> + <UML:Class xmi.idref="Properties"/> + </UML:Generalization.parent> + </UML:Generalization> + <!--Class DopBase--> <!--Class ListLevel--> <UML:Class xmi.id="ListLevel" name="ListLevel"> <UML:ModelElement.stereotype> @@ -2322,6 +6942,9 @@ <UML:ModelElement.stereotype> <UML:Stereotype xmi.idref="plcf"/> </UML:ModelElement.stereotype> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="ww8nopayloadoffset"/> + </UML:ModelElement.stereotype> <UML:ModelElement.taggedValue> <UML:TaggedValue> <UML:TaggedValue.dataValue>rtf:LISTTABLE</UML:TaggedValue.dataValue> @@ -3116,6 +7739,9 @@ <UML:ModelElement.stereotype> <UML:Stereotype xmi.idref="plcf"/> </UML:ModelElement.stereotype> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="ww8nopayloadoffset"/> + </UML:ModelElement.stereotype> <UML:ModelElement.taggedValue> <UML:TaggedValue> <UML:TaggedValue.dataValue>rtf:LFOTABLE</UML:TaggedValue.dataValue> @@ -3140,6 +7766,9 @@ <UML:Stereotype xmi.idref="ww8resource"/> </UML:ModelElement.stereotype> <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="ww8nopayloadoffset"/> + </UML:ModelElement.stereotype> + <UML:ModelElement.stereotype> <UML:Stereotype xmi.idref="plcf"/> </UML:ModelElement.stereotype> <UML:ModelElement.taggedValue> @@ -4784,7 +9413,13 @@ <UML:ModelElement.stereotype> <UML:Stereotype xmi.idref="plcf"/> </UML:ModelElement.stereotype> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="ww8nopayloadoffset"/> + </UML:ModelElement.stereotype> <UML:Classifier.feature> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="ww8nocalcsize"/> + </UML:ModelElement.stereotype> <UML:Attribute name="size"> <UML:ModelElement.taggedValue> <UML:TaggedValue> @@ -22897,6 +27532,9 @@ <UML:ModelElement.stereotype> <UML:Stereotype xmi.idref="ww8resource"/> </UML:ModelElement.stereotype> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="ww8nocalcsize"/> + </UML:ModelElement.stereotype> <UML:ModelElement.taggedValue> <UML:TaggedValue> <UML:TaggedValue.dataValue>10</UML:TaggedValue.dataValue> @@ -32214,6 +36852,9 @@ <UML:ModelElement.stereotype> <UML:Stereotype xmi.idref="ww8resource"/> </UML:ModelElement.stereotype> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="ww8nopayloadoffset"/> + </UML:ModelElement.stereotype> <UML:ModelElement.taggedValue> <UML:TaggedValue> <UML:TaggedValue.dataValue>0xC60D</UML:TaggedValue.dataValue> @@ -38863,6 +43504,9 @@ <UML:ModelElement.stereotype> <UML:Stereotype xmi.idref="ww8resource"/> </UML:ModelElement.stereotype> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="ww8nocalcsize"/> + </UML:ModelElement.stereotype> <UML:ModelElement.taggedValue> <UML:TaggedValue> <UML:TaggedValue.dataValue>0xD609</UML:TaggedValue.dataValue> @@ -40194,6 +44838,9 @@ <UML:ModelElement.stereotype> <UML:Stereotype xmi.idref="ww8resource"/> </UML:ModelElement.stereotype> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="ww8nocalcsize"/> + </UML:ModelElement.stereotype> <UML:ModelElement.taggedValue> <UML:TaggedValue> <UML:TaggedValue.dataValue>0xD61A</UML:TaggedValue.dataValue> @@ -40258,6 +44905,9 @@ <UML:ModelElement.stereotype> <UML:Stereotype xmi.idref="ww8resource"/> </UML:ModelElement.stereotype> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="ww8nocalcsize"/> + </UML:ModelElement.stereotype> <UML:ModelElement.taggedValue> <UML:TaggedValue> <UML:TaggedValue.dataValue>0xD61B</UML:TaggedValue.dataValue> @@ -40322,6 +44972,9 @@ <UML:ModelElement.stereotype> <UML:Stereotype xmi.idref="ww8resource"/> </UML:ModelElement.stereotype> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="ww8nocalcsize"/> + </UML:ModelElement.stereotype> <UML:ModelElement.taggedValue> <UML:TaggedValue> <UML:TaggedValue.dataValue>0xD61C</UML:TaggedValue.dataValue> @@ -40386,6 +45039,9 @@ <UML:ModelElement.stereotype> <UML:Stereotype xmi.idref="ww8resource"/> </UML:ModelElement.stereotype> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="ww8nocalcsize"/> + </UML:ModelElement.stereotype> <UML:ModelElement.taggedValue> <UML:TaggedValue> <UML:TaggedValue.dataValue>0xD61D</UML:TaggedValue.dataValue> @@ -40450,6 +45106,9 @@ <UML:ModelElement.stereotype> <UML:Stereotype xmi.idref="ww8resource"/> </UML:ModelElement.stereotype> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="ww8nocalcsize"/> + </UML:ModelElement.stereotype> <UML:ModelElement.taggedValue> <UML:TaggedValue> <UML:TaggedValue.dataValue>0xD613</UML:TaggedValue.dataValue> @@ -40963,6 +45622,9 @@ <UML:ModelElement.stereotype> <UML:Stereotype xmi.idref="ww8sprm"/> </UML:ModelElement.stereotype> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="ww8nocalcsize"/> + </UML:ModelElement.stereotype> <UML:ModelElement.taggedValue> <UML:TaggedValue> <UML:TaggedValue.dataValue>0xd670</UML:TaggedValue.dataValue> @@ -43371,7 +48033,7 @@ </UML:ModelElement.taggedValue> <UML:ModelElement.taggedValue> <UML:TaggedValue> - <UML:TaggedValue.dataValue>0</UML:TaggedValue.dataValue> + <UML:TaggedValue.dataValue>2</UML:TaggedValue.dataValue> <UML:TaggedValue.type> <UML:TagDefinition xmi.idref="offset"/> </UML:TaggedValue.type> @@ -43429,7 +48091,7 @@ </UML:ModelElement.taggedValue> <UML:ModelElement.taggedValue> <UML:TaggedValue> - <UML:TaggedValue.dataValue>0</UML:TaggedValue.dataValue> + <UML:TaggedValue.dataValue>2</UML:TaggedValue.dataValue> <UML:TaggedValue.type> <UML:TagDefinition xmi.idref="offset"/> </UML:TaggedValue.type> @@ -43487,7 +48149,7 @@ </UML:ModelElement.taggedValue> <UML:ModelElement.taggedValue> <UML:TaggedValue> - <UML:TaggedValue.dataValue>0</UML:TaggedValue.dataValue> + <UML:TaggedValue.dataValue>2</UML:TaggedValue.dataValue> <UML:TaggedValue.type> <UML:TagDefinition xmi.idref="offset"/> </UML:TaggedValue.type> diff --git a/writerfilter/source/doctok/resources.xsl b/writerfilter/source/doctok/resources.xsl index e1fc68ba5323..5ff0efe0edd1 100644 --- a/writerfilter/source/doctok/resources.xsl +++ b/writerfilter/source/doctok/resources.xsl @@ -301,14 +301,15 @@ class </xsl:text> */ static sal_uInt32 getSize() { return </xsl:text> <xsl:value-of select='$size'/> - <xsl:text>; } - + <xsl:text>; }</xsl:text> + <xsl:if test="not(.//UML:Stereotype[@xmi.ref='ww8nocalcsize'])"> + <xsl:text> /** Calculate actual size. */ - sal_uInt32 calcSize(); - - </xsl:text> + sal_uInt32 calcSize(); + </xsl:text> + </xsl:if> <xsl:if test='.//UML:Stereotype[@xmi.idref ="plcf"]'> <xsl:text> /** @@ -319,13 +320,15 @@ class </xsl:text> sal_uInt32 getEntryOffset(sal_uInt32 nIndex) { return entryOffsets[nIndex]; - } - + }</xsl:text> + <xsl:if test="not(.//UML:Stereotype[@xmi.idref='ww8nopayloadoffset'])"> + <xsl:text> /** Calculate offset for payload. */ - sal_uInt32 calcPayloadOffset(); - + sal_uInt32 calcPayloadOffset();</xsl:text> + </xsl:if> + <xsl:text> /** Set offset for payloads. diff --git a/writerfilter/source/doctok/xmigen.xsl b/writerfilter/source/doctok/xmigen.xsl index d6eab5846fd4..f184dcfed4d2 100644 --- a/writerfilter/source/doctok/xmigen.xsl +++ b/writerfilter/source/doctok/xmigen.xsl @@ -184,6 +184,76 @@ </UML:Generalization> </xsl:template> + <xsl:template match="sprm"> + <xsl:variable name="isww8resource"> + <xsl:choose> + <xsl:when test="count(*) > 0">YES</xsl:when> + <xsl:otherwise>NO</xsl:otherwise> + </xsl:choose> + </xsl:variable> + <UML:Class> + <xsl:attribute name="xmi.id"> + <xsl:value-of select="@name"/> + </xsl:attribute> + <xsl:attribute name="name"> + <xsl:value-of select="@name"/> + </xsl:attribute> + <xsl:if test="$isww8resource='YES'"> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="ww8resource"/> + </UML:ModelElement.stereotype> + </xsl:if> + <UML:ModelElement.stereotype> + <UML:Stereotype xmi.idref="ww8sprm"/> + </UML:ModelElement.stereotype> + <xsl:call-template name="taggedvalue"> + <xsl:with-param name="type">sprmcode</xsl:with-param> + <xsl:with-param name="value" select="@code"/> + </xsl:call-template> + <xsl:call-template name="taggedvalue"> + <xsl:with-param name="type">sprmid</xsl:with-param> + <xsl:with-param name="value" select="@token"/> + </xsl:call-template> + <xsl:call-template name="taggedvalue"> + <xsl:with-param name="type">kind</xsl:with-param> + <xsl:with-param name="value" select="@kind"/> + </xsl:call-template> + <xsl:apply-templates select="*"/> + </UML:Class> + <xsl:if test="$isww8resource='YES'"> + <xsl:call-template name="generalization"> + <xsl:with-param name="parent">Properties</xsl:with-param> + <xsl:with-param name="child" select="@name"/> + </xsl:call-template> + </xsl:if> + </xsl:template> + + <xsl:template name="generalization"> + <xsl:param name="parent"/> + <xsl:param name="child"/> + <UML:Generalization isSpecification="false"> + <xsl:attribute name="xmi.id"> + <xsl:value-of select="$child"/> + <xsl:text>-</xsl:text> + <xsl:value-of select="$parent"/> + </xsl:attribute> + <UML:Generalization.child> + <UML:Class> + <xsl:attribute name="xmi.idref"> + <xsl:value-of select="$child"/> + </xsl:attribute> + </UML:Class> + </UML:Generalization.child> + <UML:Generalization.parent> + <UML:Class xmi.idref="Properties"> + <xsl:attribute name="xmi.idref"> + <xsl:value-of select="$parent"/> + </xsl:attribute> + </UML:Class> + </UML:Generalization.parent> + </UML:Generalization> + </xsl:template> + <xsl:template name="taggedvalue"> <xsl:param name="type"/> <xsl:param name="value"/> @@ -278,7 +348,7 @@ <xsl:template match="bitfield"> <xsl:variable name="offset"> - <xsl:value-of select="sum(preceding-sibling::*/@size)"/> + <xsl:call-template name="calcoffset"/> </xsl:variable> <xsl:for-each select="bits"> <xsl:call-template name="bits"> diff --git a/writerfilter/source/filter/ImportFilter.cxx b/writerfilter/source/filter/ImportFilter.cxx index 911689996b07..10e7cefa591f 100644 --- a/writerfilter/source/filter/ImportFilter.cxx +++ b/writerfilter/source/filter/ImportFilter.cxx @@ -87,13 +87,18 @@ sal_Bool WriterFilter::filter( const uno::Sequence< beans::PropertyValue >& aDes } #ifdef DEBUG_ELEMENT - writerfilter::TagLogger::Pointer_t debugLogger - (writerfilter::TagLogger::getInstance("DEBUG")); - debugLogger->startDocument(); - - writerfilter::TagLogger::Pointer_t dmapperLogger - (writerfilter::TagLogger::getInstance("DOMAINMAPPER")); - dmapperLogger->startDocument(); + OUString sURL = aMediaDesc.getUnpackedValueOrDefault( MediaDescriptor::PROP_URL(), OUString() ); + ::std::string sURLc = OUStringToOString(sURL, RTL_TEXTENCODING_ASCII_US).getStr(); + + writerfilter::TagLogger::Pointer_t debugLogger + (writerfilter::TagLogger::getInstance("DEBUG")); + debugLogger->setFileName(sURLc); + debugLogger->startDocument(); + + writerfilter::TagLogger::Pointer_t dmapperLogger + (writerfilter::TagLogger::getInstance("DOMAINMAPPER")); + dmapperLogger->setFileName(sURLc); + dmapperLogger->startDocument(); #endif writerfilter::dmapper::SourceDocumentType eType = diff --git a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx index 2700a28959cc..248334136de5 100644 --- a/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx +++ b/writerfilter/source/ooxml/OOXMLDocumentImpl.cxx @@ -42,7 +42,11 @@ using ::com::sun::star::xml::sax::SAXException; namespace writerfilter { namespace ooxml { + +#ifdef DEBUG TagLogger::Pointer_t debug_logger(TagLogger::getInstance("DEBUG")); +#endif + using namespace ::std; OOXMLDocumentImpl::OOXMLDocumentImpl diff --git a/writerfilter/source/ooxml/OOXMLFactory.cxx b/writerfilter/source/ooxml/OOXMLFactory.cxx index 6fac03898e42..964d9e1cb5ee 100755..100644 --- a/writerfilter/source/ooxml/OOXMLFactory.cxx +++ b/writerfilter/source/ooxml/OOXMLFactory.cxx @@ -263,7 +263,13 @@ OOXMLFactory::createFastChildContext(OOXMLFastContextHandler * pHandler, OOXMLFactory_ns::Pointer_t pFactory = getFactoryForNamespace(nDefine); - return createFastChildContextFromFactory(pHandler, pFactory, Element); + uno::Reference< xml::sax::XFastContextHandler> ret; + + //Avoid handling unknown tokens and recursing to death + if ((Element & 0xffff) < OOXML_FAST_TOKENS_END) + ret = createFastChildContextFromFactory(pHandler, pFactory, Element); + + return ret; } void OOXMLFactory::characters(OOXMLFastContextHandler * pHandler, diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx index 4fbcff0de0a7..20ee49258c00 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx @@ -100,7 +100,7 @@ static string resourceToString set<OOXMLFastContextHandler *> aSetContexts; - +#ifdef DEBUG class OOXMLIdToString : public IdToString { public: @@ -119,6 +119,7 @@ public: return s; } }; +#endif /* class OOXMLFastContextHandler @@ -136,8 +137,7 @@ OOXMLFastContextHandler::OOXMLFastContextHandler mnTableDepth(0), mnInstanceNumber(mnInstanceCount), mnRefCount(0), - m_xContext(context), - mbFallback(false) + m_xContext(context) { mnInstanceCount++; aSetContexts.insert(this); @@ -159,7 +159,7 @@ OOXMLFastContextHandler::OOXMLFastContextHandler mnTableDepth(0), mnInstanceNumber(mnInstanceCount), mnRefCount(0), - mbFallback(false) + m_xContext(pContext->m_xContext) { if (pContext != NULL) { @@ -182,29 +182,6 @@ OOXMLFastContextHandler::~OOXMLFastContextHandler() aSetContexts.erase(this); } -void OOXMLFastContextHandler::dumpOpenContexts() -{ - debug_logger->startElement("open-contexts"); - XMLTag aTag("open-contexts"); - - set<OOXMLFastContextHandler *>::iterator aIt(aSetContexts.begin()); - while (aIt != aSetContexts.end()) - { - debug_logger->startElement("open-context"); - debug_logger->addTag((*aIt)->toTag()); - debug_logger->endElement("open-context"); - - aIt++; - } - - static char buffer[256]; - snprintf(buffer, sizeof(buffer), "%" SAL_PRI_SIZET "u", - aSetContexts.size()); - - debug_logger->attribute("count", buffer); - debug_logger->endElement("open-contexts"); -} - #ifdef DEBUG_MEMORY void SAL_CALL OOXMLFastContextHandler::acquire() throw () @@ -232,11 +209,6 @@ void SAL_CALL OOXMLFastContextHandler::release() } #endif -sal_uInt32 OOXMLFastContextHandler::getInstanceNumber() const -{ - return mnInstanceNumber; -} - // ::com::sun::star::xml::sax::XFastContextHandler: void SAL_CALL OOXMLFastContextHandler::startFastElement (Token_t Element, @@ -462,6 +434,7 @@ void OOXMLFastContextHandler::lcl_endAction(Token_t Element) OOXMLFactory::getInstance()->endAction(this, Element); } +#ifdef DEBUG XMLTag::Pointer_t OOXMLFastContextHandler::toPropertiesTag (OOXMLPropertySet::Pointer_t pProps) { @@ -511,6 +484,7 @@ string OOXMLFastContextHandler::toString() const { return toTag()->toString(); } +#endif string OOXMLFastContextHandler::getResourceString() const { @@ -548,16 +522,6 @@ Id OOXMLFastContextHandler::getDefine() const return mnDefine; } -void OOXMLFastContextHandler::setFallback(bool bFallback) -{ - mbFallback = bFallback; -} - -bool OOXMLFastContextHandler::isFallback() const -{ - return mbFallback; -} - OOXMLParserState::Pointer_t OOXMLFastContextHandler::getParserState() const { return mpParserState; @@ -1030,26 +994,6 @@ void OOXMLFastContextHandler::sendTableProperties() #endif } -void OOXMLFastContextHandler::clearCellProps() -{ -#ifdef DEBUG_ELEMENT - debug_logger->element("clearCellProps"); -#endif - - mpParserState->setCellProperties(OOXMLPropertySet::Pointer_t - (new OOXMLPropertySetImpl())); -} - -void OOXMLFastContextHandler::clearRowProps() -{ -#ifdef DEBUG_ELEMENT - debug_logger->element("clearRowProps"); -#endif - - mpParserState->setRowProperties(OOXMLPropertySet::Pointer_t - (new OOXMLPropertySetImpl())); -} - void OOXMLFastContextHandler::clearTableProps() { #ifdef DEBUG_ELEMENT @@ -1107,11 +1051,6 @@ void OOXMLFastContextHandler::setDefaultStringValue() { } -const ::rtl::OUString & OOXMLFastContextHandler::getText() const -{ - return aEmptyStr; -} - void OOXMLFastContextHandler::setDocument(OOXMLDocument * pDocument) { mpParserState->setDocument(pDocument); @@ -1296,19 +1235,6 @@ OOXMLFastContextHandler::getComponentContext() } /* - class OOXMLFastContextHandlerNoResource - */ -OOXMLFastContextHandlerNoResource::OOXMLFastContextHandlerNoResource -(OOXMLFastContextHandler * pContext) -: OOXMLFastContextHandler(pContext) -{ -} - -OOXMLFastContextHandlerNoResource::~OOXMLFastContextHandlerNoResource() -{ -} - -/* class OOXMLFastContextHandlerStream */ @@ -1352,12 +1278,6 @@ void OOXMLFastContextHandlerStream::sendProperty(Id nId) sText.getLength()); } -void OOXMLFastContextHandlerStream::setPropertySetAttrs -(OOXMLPropertySet::Pointer_t pPropertySetAttrs) -{ - mpPropertySetAttrs = pPropertySetAttrs; -} - OOXMLPropertySet::Pointer_t OOXMLFastContextHandlerStream::getPropertySetAttrs() const { @@ -1439,6 +1359,7 @@ OOXMLValue::Pointer_t OOXMLFastContextHandlerProperties::getValue() const return OOXMLValue::Pointer_t(new OOXMLPropertySetValue(mpPropertySet)); } +#ifdef DEBUG XMLTag::Pointer_t OOXMLFastContextHandlerProperties::toTag() const { XMLTag::Pointer_t pTag(OOXMLFastContextHandler::toTag()); @@ -1446,6 +1367,7 @@ XMLTag::Pointer_t OOXMLFastContextHandlerProperties::toTag() const return pTag; } +#endif void OOXMLFastContextHandlerProperties::newProperty (const Id & rId, OOXMLValue::Pointer_t pVal) @@ -1980,72 +1902,6 @@ void OOXMLFastContextHandlerTextTable::lcl_endFastElement class OOXMLFastContextHandlerShape */ -class ShapesNoAdd: - public ::cppu::WeakImplHelper1< - drawing::XShapes> -{ -public: - explicit ShapesNoAdd(uno::Reference< uno::XComponentContext > const & context, uno::Reference< drawing::XShapes> const & xShapes); - -private: - // container::XElementAccess: - virtual uno::Type SAL_CALL getElementType() throw (uno::RuntimeException); - virtual ::sal_Bool SAL_CALL hasElements() throw (uno::RuntimeException); - - // container::XIndexAccess: - virtual ::sal_Int32 SAL_CALL getCount() throw (uno::RuntimeException); - virtual uno::Any SAL_CALL getByIndex(::sal_Int32 Index) throw (uno::RuntimeException, lang::IndexOutOfBoundsException, lang::WrappedTargetException); - - // drawing::XShapes: - virtual void SAL_CALL add(const uno::Reference< drawing::XShape > & xShape) throw (uno::RuntimeException); - virtual void SAL_CALL remove(const uno::Reference< drawing::XShape > & xShape) throw (uno::RuntimeException); - - ShapesNoAdd(ShapesNoAdd &); // not defined - void operator =(ShapesNoAdd &); // not defined - - virtual ~ShapesNoAdd() {} - - uno::Reference< uno::XComponentContext > m_xContext; - uno::Reference< drawing::XShapes > m_xShapes; -}; - -ShapesNoAdd::ShapesNoAdd(uno::Reference< uno::XComponentContext > const & context, uno::Reference< drawing::XShapes> const & xShapes) : -m_xContext(context), m_xShapes(xShapes) -{} - -// container::XElementAccess: -uno::Type SAL_CALL ShapesNoAdd::getElementType() throw (uno::RuntimeException) -{ - return m_xShapes->getElementType(); -} - -::sal_Bool SAL_CALL ShapesNoAdd::hasElements() throw (uno::RuntimeException) -{ - return m_xShapes->hasElements(); -} - -// container::XIndexAccess: -::sal_Int32 SAL_CALL ShapesNoAdd::getCount() throw (uno::RuntimeException) -{ - return m_xShapes->getCount(); -} - -uno::Any SAL_CALL ShapesNoAdd::getByIndex(::sal_Int32 Index) throw (uno::RuntimeException, lang::IndexOutOfBoundsException, lang::WrappedTargetException) -{ - return m_xShapes->getByIndex(Index); -} - -// drawing::XShapes: -void SAL_CALL ShapesNoAdd::add(const uno::Reference< drawing::XShape > & - ) throw (uno::RuntimeException) -{ -} - -void SAL_CALL ShapesNoAdd::remove(const uno::Reference< drawing::XShape > & xShape) throw (uno::RuntimeException) -{ - m_xShapes->remove(xShape); -} - OOXMLFastContextHandlerShape::OOXMLFastContextHandlerShape (OOXMLFastContextHandler * pContext) : OOXMLFastContextHandlerProperties(pContext), m_bShapeSent( false ), diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx index b67f86fda3e7..0c441f62a180 100644 --- a/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx +++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.hxx @@ -132,10 +132,6 @@ public: virtual ResourceEnum_t getResource() const { return STREAM; } - static XMLTag::Pointer_t toPropertiesTag(OOXMLPropertySet::Pointer_t); - virtual XMLTag::Pointer_t toTag() const; - virtual string toString() const; - virtual void attributes (const uno::Reference< xml::sax::XFastAttributeList > & Attribs) throw (uno::RuntimeException, xml::sax::SAXException); @@ -179,18 +175,9 @@ public: void setDefine(Id nDefine); Id getDefine() const; - void setFallback(bool bFallbac); - bool isFallback() const; OOXMLParserState::Pointer_t getParserState() const; -#ifdef DEBUG_MEMORY - virtual void SAL_CALL acquire() throw(); - virtual void SAL_CALL release() throw(); -#endif - - sal_uInt32 getInstanceNumber() const; - void sendTableDepth() const; void setHandle(); @@ -227,8 +214,6 @@ public: void sendCellProperties(); void sendRowProperties(); void sendTableProperties(); - void clearCellProps(); - void clearRowProps(); void clearTableProps(); void clearProps(); @@ -237,10 +222,18 @@ public: virtual void setDefaultHexValue(); virtual void setDefaultStringValue(); - const ::rtl::OUString & getText() const; - void sendPropertyToParent(); - static void dumpOpenContexts(); + +#ifdef DEBUG + static XMLTag::Pointer_t toPropertiesTag(OOXMLPropertySet::Pointer_t); + virtual XMLTag::Pointer_t toTag() const; + virtual string toString() const; +#endif + +#ifdef DEBUG_MEMORY + virtual void SAL_CALL acquire() throw(); + virtual void SAL_CALL release() throw(); +#endif protected: OOXMLFastContextHandler * mpParent; @@ -302,14 +295,6 @@ private: static sal_uInt32 mnInstanceCount; - bool mbFallback; -}; - -class OOXMLFastContextHandlerNoResource : public OOXMLFastContextHandler -{ -public: - OOXMLFastContextHandlerNoResource(OOXMLFastContextHandler * pContext); - virtual ~OOXMLFastContextHandlerNoResource(); }; class OOXMLFastContextHandlerStream : public OOXMLFastContextHandler @@ -329,10 +314,10 @@ public: void handleHyperlink(); protected: - void setPropertySetAttrs(OOXMLPropertySet::Pointer_t pPropertySetAttrs); virtual void resolvePropertySetAttrs(); virtual void lcl_characters(const ::rtl::OUString & aChars) throw (uno::RuntimeException, xml::sax::SAXException); + private: mutable OOXMLPropertySet::Pointer_t mpPropertySetAttrs; }; @@ -346,8 +331,6 @@ public: virtual OOXMLValue::Pointer_t getValue() const; virtual ResourceEnum_t getResource() const { return PROPERTIES; } - virtual XMLTag::Pointer_t toTag() const; - virtual void newProperty(const Id & nId, OOXMLValue::Pointer_t pVal); void handleXNotes(); @@ -360,6 +343,10 @@ public: virtual void setPropertySet(OOXMLPropertySet::Pointer_t pPropertySet); virtual OOXMLPropertySet::Pointer_t getPropertySet() const; +#ifdef DEBUG + virtual XMLTag::Pointer_t toTag() const; +#endif + protected: /// the properties OOXMLPropertySet::Pointer_t mpPropertySet; diff --git a/writerfilter/source/ooxml/OOXMLFastDocumentHandler.cxx b/writerfilter/source/ooxml/OOXMLFastDocumentHandler.cxx index 7007a2b6c436..1768d486c80d 100644 --- a/writerfilter/source/ooxml/OOXMLFastDocumentHandler.cxx +++ b/writerfilter/source/ooxml/OOXMLFastDocumentHandler.cxx @@ -152,13 +152,6 @@ uno::Reference< xml::sax::XFastContextHandler > SAL_CALL return OOXMLFactory::getInstance()->createFastChildContextFromStart(getContextHandler().get(), Element); } -OOXMLParserState::Pointer_t OOXMLFastDocumentHandler::getParserState() const -{ - OOXMLParserState::Pointer_t pParserState; - - return getContextHandler()->getParserState(); -} - uno::Reference< xml::sax::XFastContextHandler > SAL_CALL OOXMLFastDocumentHandler::createUnknownChildContext (const ::rtl::OUString & diff --git a/writerfilter/source/ooxml/OOXMLFastDocumentHandler.hxx b/writerfilter/source/ooxml/OOXMLFastDocumentHandler.hxx index 9a7fc611e3a9..ca322e0c2098 100644 --- a/writerfilter/source/ooxml/OOXMLFastDocumentHandler.hxx +++ b/writerfilter/source/ooxml/OOXMLFastDocumentHandler.hxx @@ -95,8 +95,6 @@ public: void setDocument(OOXMLDocument * pDocument); void setXNoteId(const ::rtl::OUString & rXNoteId); - OOXMLParserState::Pointer_t getParserState() const; - void setIsSubstream( bool bSubstream ); private: diff --git a/writerfilter/source/ooxml/OOXMLFastHelper.hxx b/writerfilter/source/ooxml/OOXMLFastHelper.hxx index 2d21083487ff..5d4587922a54 100644 --- a/writerfilter/source/ooxml/OOXMLFastHelper.hxx +++ b/writerfilter/source/ooxml/OOXMLFastHelper.hxx @@ -84,8 +84,6 @@ OOXMLFastHelper<T>::createAndSetParent debug_logger->attribute("context", pHandler->getType()); debug_logger->attribute("token", fastTokenToId(pTmp->getToken())); debug_logger->attribute("id", (*QNameToString::Instance())(nId)); - if (pTmp->isFallback()) - debug_logger->attribute("fallback", "yes"); debug_logger->startElement("created"); debug_logger->addTag(pTmp->toTag()); @@ -119,8 +117,6 @@ OOXMLFastHelper<T>::createAndSetParentAndDefine snprintf(buffer, sizeof(buffer), "0x%08" SAL_PRIxUINT32, nId); debug_logger->attribute("idnum", buffer); - if (pTmp->isFallback()) - debug_logger->attribute("fallback", "yes"); debug_logger->startElement("created"); debug_logger->addTag(pTmp->toTag()); @@ -158,9 +154,6 @@ OOXMLFastHelper<T>::createAndSetParentRef debug_logger->attribute("context", pHandler->getType()); debug_logger->attribute("type", fastTokenToId(nToken)); - if (pTmp->isFallback()) - debug_logger->attribute("fallback", "yes"); - debug_logger->startElement("created"); debug_logger->chars(pTmp->getType()); debug_logger->endElement("created"); diff --git a/writerfilter/source/ooxml/OOXMLParserState.cxx b/writerfilter/source/ooxml/OOXMLParserState.cxx index e38593777a55..fb347d02048e 100644 --- a/writerfilter/source/ooxml/OOXMLParserState.cxx +++ b/writerfilter/source/ooxml/OOXMLParserState.cxx @@ -103,11 +103,6 @@ bool OOXMLParserState::isForwardEvents() const return mbForwardEvents; } -void OOXMLParserState::incContextCount() -{ - mnContexts++; -} - const string OOXMLParserState::getHandle() const { char sBuffer[256]; @@ -122,11 +117,6 @@ void OOXMLParserState::setHandle() mnHandle = mnContexts; } -unsigned int OOXMLParserState::getContextCount() const -{ - return mnContexts; -} - void OOXMLParserState::setDocument(OOXMLDocument * pDocument) { mpDocument = pDocument; @@ -147,44 +137,11 @@ const rtl::OUString & OOXMLParserState::getXNoteId() const return mpDocument->getXNoteId(); } -void OOXMLParserState::setXNoteType(const Id & rId) -{ - mpDocument->setXNoteType(rId); -} - -const Id & OOXMLParserState::getXNoteType() const -{ - return mpDocument->getXNoteType(); -} - const ::rtl::OUString & OOXMLParserState::getTarget() const { return mpDocument->getTarget(); } -void OOXMLParserState::newCharacterProperty(const Id & rId, - OOXMLValue::Pointer_t pVal) -{ - if (rId != 0x0) - { - if (mpCharacterProps.get() == NULL) - mpCharacterProps = - OOXMLPropertySet::Pointer_t(new OOXMLPropertySetImpl()); - - OOXMLPropertyImpl::Pointer_t pProperty - (new OOXMLPropertyImpl(rId, pVal, OOXMLPropertyImpl::ATTRIBUTE)); - -#ifdef DEBUG_PROPERTIES - debug_logger->startElement("<newCharacterProperty"); - debug_logger->chars(pProperty->toString()); - debug_logger->endElement("newCharacterProperty"); -#endif - - mpCharacterProps->add(pProperty); - } - -} - void OOXMLParserState::resolveCharacterProperties(Stream & rStream) { if (mpCharacterProps.get() != NULL) @@ -202,11 +159,6 @@ void OOXMLParserState::resolveCharacterProperties(Stream & rStream) } } -OOXMLPropertySet::Pointer_t OOXMLParserState::getCharacterProperties() const -{ - return mpCharacterProps; -} - void OOXMLParserState::setCharacterProperties (OOXMLPropertySet::Pointer_t pProps) { @@ -317,6 +269,22 @@ void OOXMLParserState::endTable() mTableProps.pop(); } +void OOXMLParserState::incContextCount() +{ + mnContexts++; +} + +#ifdef DEBUG +unsigned int OOXMLParserState::getContextCount() const +{ + return mnContexts; +} + +string OOXMLParserState::toString() const +{ + return toTag()->toString(); +} + XMLTag::Pointer_t OOXMLParserState::toTag() const { XMLTag::Pointer_t pTag(new XMLTag("parserstate")); @@ -352,10 +320,6 @@ XMLTag::Pointer_t OOXMLParserState::toTag() const return pTag; } - -string OOXMLParserState::toString() const -{ - return toTag()->toString(); -} +#endif }} diff --git a/writerfilter/source/ooxml/OOXMLParserState.hxx b/writerfilter/source/ooxml/OOXMLParserState.hxx index affdd7dbe61c..2dd118a5b96b 100644 --- a/writerfilter/source/ooxml/OOXMLParserState.hxx +++ b/writerfilter/source/ooxml/OOXMLParserState.hxx @@ -29,9 +29,12 @@ #include <stack> #include <ooxml/OOXMLDocument.hxx> -#include <resourcemodel/TagLogger.hxx> #include "OOXMLPropertySetImpl.hxx" +#ifdef DEBUG +#include <resourcemodel/TagLogger.hxx> +#endif + namespace writerfilter { namespace ooxml { @@ -76,24 +79,18 @@ public: void setForwardEvents(bool bForwardEvents); bool isForwardEvents() const; - void incContextCount(); const string getHandle() const; void setHandle(); - unsigned int getContextCount() const; void setDocument(OOXMLDocument * pDocument); OOXMLDocument * getDocument() const; void setXNoteId(const rtl::OUString & rId); const rtl::OUString & getXNoteId() const; - void setXNoteType(const Id & rId); - const Id & getXNoteType() const; const rtl::OUString & getTarget() const; - void newCharacterProperty(const Id & rId, OOXMLValue::Pointer_t pVal); void resolveCharacterProperties(Stream & rStream); - OOXMLPropertySet::Pointer_t getCharacterProperties() const; void setCharacterProperties(OOXMLPropertySet::Pointer_t pProps); void resolveCellProperties(Stream & rStream); void setCellProperties(OOXMLPropertySet::Pointer_t pProps); @@ -105,8 +102,15 @@ public: void startTable(); void endTable(); + void incContextCount(); + +#ifdef DEBUG +public: + unsigned int getContextCount() const; string toString() const; XMLTag::Pointer_t toTag() const; +#endif + }; }} diff --git a/writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx b/writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx index 2f8844f1af01..f106972b23c0 100644 --- a/writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx +++ b/writerfilter/source/ooxml/OOXMLPropertySetImpl.cxx @@ -198,10 +198,6 @@ OOXMLValue::OOXMLValue() { } -OOXMLValue::OOXMLValue(const rtl::OUString & /*rValue*/) -{ -} - OOXMLValue::~OOXMLValue() { } @@ -659,24 +655,6 @@ string OOXMLHexValue::toString() const } /* - class OOXMLListValue -*/ -OOXMLListValue::OOXMLListValue() -: OOXMLIntegerValue(0) -{ -} - -OOXMLListValue::OOXMLListValue(sal_Int32 nValue) -: OOXMLIntegerValue(nValue) -{ -} - - -OOXMLListValue::~OOXMLListValue() -{ -} - -/* class OOXMLShapeValue */ diff --git a/writerfilter/source/ooxml/OOXMLPropertySetImpl.hxx b/writerfilter/source/ooxml/OOXMLPropertySetImpl.hxx index 78c39b79d515..a04fc5f5d1af 100644 --- a/writerfilter/source/ooxml/OOXMLPropertySetImpl.hxx +++ b/writerfilter/source/ooxml/OOXMLPropertySetImpl.hxx @@ -48,7 +48,6 @@ class OOXMLValue : public Value { public: typedef boost::shared_ptr<OOXMLValue> Pointer_t; - OOXMLValue(const rtl::OUString & rValue); OOXMLValue(); virtual ~OOXMLValue(); @@ -222,14 +221,6 @@ public: virtual OOXMLValue * clone() const; }; -class OOXMLListValue : public OOXMLIntegerValue -{ -public: - OOXMLListValue(); - OOXMLListValue(sal_Int32 nValue); - virtual ~OOXMLListValue(); -}; - class OOXMLShapeValue : public OOXMLValue { protected: diff --git a/writerfilter/source/ooxml/OOXMLStreamImpl.cxx b/writerfilter/source/ooxml/OOXMLStreamImpl.cxx index 91188eeda701..8b879f4b0aec 100644 --- a/writerfilter/source/ooxml/OOXMLStreamImpl.cxx +++ b/writerfilter/source/ooxml/OOXMLStreamImpl.cxx @@ -69,22 +69,6 @@ OOXMLStreamImpl::OOXMLStreamImpl } OOXMLStreamImpl::OOXMLStreamImpl -(uno::Reference<uno::XComponentContext> xContext, - uno::Reference<io::XInputStream> xStorageStream, const rtl::OUString & rId) -: mxContext(xContext), - mxStorageStream(xStorageStream), - mnStreamType(UNKNOWN), - msId(rId) -{ - mxStorage.set - (comphelper::OStorageHelper::GetStorageOfFormatFromInputStream - (OFOPXML_STORAGE_FORMAT_STRING, mxStorageStream)); - mxRelationshipAccess.set(mxStorage, uno::UNO_QUERY_THROW); - - init(); -} - -OOXMLStreamImpl::OOXMLStreamImpl (OOXMLStreamImpl & rOOXMLStream, const rtl::OUString & rId) : mxContext(rOOXMLStream.mxContext), mxStorageStream(rOOXMLStream.mxStorageStream), diff --git a/writerfilter/source/ooxml/OOXMLStreamImpl.hxx b/writerfilter/source/ooxml/OOXMLStreamImpl.hxx index 64682fab250c..15409fe8ae2a 100644 --- a/writerfilter/source/ooxml/OOXMLStreamImpl.hxx +++ b/writerfilter/source/ooxml/OOXMLStreamImpl.hxx @@ -71,10 +71,6 @@ public: uno::Reference<io::XInputStream> xStorageStream, StreamType_t nType); OOXMLStreamImpl(OOXMLStreamImpl & rStream, const rtl::OUString & rId); - OOXMLStreamImpl - (uno::Reference<uno::XComponentContext> xContext, - uno::Reference<io::XInputStream> xStorageStream, - const rtl::OUString & rId); virtual ~OOXMLStreamImpl(); diff --git a/writerfilter/source/ooxml/attrsprm.xsl b/writerfilter/source/ooxml/attrsprm.xsl new file mode 100644 index 000000000000..9351b1b874c9 --- /dev/null +++ b/writerfilter/source/ooxml/attrsprm.xsl @@ -0,0 +1,142 @@ +<?xml version="1.0" encoding="utf-8"?> +<xsl:stylesheet + version="1.0" + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:rng="http://relaxng.org/ns/structure/1.0" + xmlns:xalan="http://xml.apache.org/xalan" + exclude-result-prefixes = "xalan" + xml:indent="true"> + <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="no"/> + + <xsl:include href="factorytools.xsl"/> + + <xsl:template match="/"> + <class> + <xsl:for-each select="//rng:define[@name='CT_FFData']"> + <xsl:call-template name="sprm"/> + <xsl:call-template name="attribute"/> + </xsl:for-each> + </class> + </xsl:template> + + <xsl:template name="sprminner"> + <xsl:variable name="defname" select="@name"/> + <xsl:for-each select=".//rng:ref[not(ancestor::rng:element or ancestor::rng:attribute)]"> + <xsl:call-template name="sprminner"/> + </xsl:for-each> + <xsl:for-each select=".//rng:element"> + <xsl:for-each select="rng:ref"> + <xsl:variable name="refname" select="@name"/> + <xsl:for-each select="ancestor::namespace/rng:grammar/rng:define[@name=$refname]"> + <xsl:call-template name="sprminner"/> + </xsl:for-each> + </xsl:for-each> + <element> + <xsl:variable name="elementname" select="@name"/> + <xsl:attribute name="name"> + <xsl:value-of select="@name"/> + </xsl:attribute> + <xsl:for-each select="rng:ref"> + <xsl:variable name="refname" select="@name"/> + <xsl:for-each select="ancestor::namespace/resource[@name=$refname]"> + <xsl:attribute name="action"> + <xsl:choose> + <xsl:when test="@resource='Properties'"> + <xsl:text>resolve</xsl:text> + </xsl:when> + <xsl:otherwise> + <xsl:text>set</xsl:text> + </xsl:otherwise> + </xsl:choose> + </xsl:attribute> + </xsl:for-each> + <xsl:for-each select="ancestor::namespace/resource[@name=$defname]"> + <xsl:for-each select="element[@name=$elementname]"> + <xsl:attribute name="id"> + <xsl:call-template name="idtoqname"> + <xsl:with-param name="id"> + <xsl:value-of select="@tokenid"/> + </xsl:with-param> + </xsl:call-template> + </xsl:attribute> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + </element> + </xsl:for-each> + </xsl:template> + + <xsl:template name="sprm"> + <sprm> + <xsl:call-template name="sprminner"/> + </sprm> + </xsl:template> + + <xsl:template name="attributeinner"> + <xsl:param name="parent"/> + <xsl:for-each select=".//rng:ref[not(ancestor::rng:element or ancestor::rng:attribute)]"> + <xsl:variable name="refname" select="@name"/> + <xsl:comment><xsl:value-of select="$newparent"/></xsl:comment> + <xsl:for-each select="ancestor::namespace/rng:grammar/rng:define[@name=$refname]"> + <xsl:call-template name="attributeinner"> + <xsl:with-param name="parent" select="$parent"/> + </xsl:call-template> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select=".//rng:element"> + <xsl:variable name="newparent"> + <xsl:if test="string-length($parent)"> + <xsl:value-of select="$parent"/> + <xsl:text>:</xsl:text> + </xsl:if> + <xsl:value-of select="@name"/> + </xsl:variable> + <xsl:for-each select="rng:ref"> + <xsl:variable name="refname" select="@name"/> + <xsl:for-each select="ancestor::namespace/rng:grammar/rng:define[@name=$refname]"> + <xsl:call-template name="attributeinner"> + <xsl:with-param name="parent" select="$newparent"/> + </xsl:call-template> + </xsl:for-each> + </xsl:for-each> + </xsl:for-each> + <xsl:variable name="defname" select="@name"/> + <xsl:variable name="resource"> + <xsl:for-each select="ancestor::namespace/resource[@name=$defname]"> + <xsl:value-of select="@resource"/> + </xsl:for-each> + </xsl:variable> + <xsl:if test="$resource='Properties'"> + <xsl:for-each select=".//rng:attribute"> + <xsl:variable name="attrname" select="@name"/> + <attribute> + <xsl:attribute name="name"> + <xsl:if test="string-length($parent) > 0"> + <xsl:value-of select="$parent"/> + <xsl:text>:</xsl:text> + </xsl:if> + <xsl:value-of select="$attrname"/> + </xsl:attribute> + <xsl:for-each select="ancestor::namespace/resource[@name=$defname]"> + <xsl:for-each select="attribute[@name=$attrname]"> + <xsl:attribute name="id"> + <xsl:call-template name="idtoqname"> + <xsl:with-param name="id"> + <xsl:value-of select="@tokenid"/> + </xsl:with-param> + </xsl:call-template> + </xsl:attribute> + </xsl:for-each> + </xsl:for-each> + </attribute> + </xsl:for-each> + </xsl:if> + </xsl:template> + + <xsl:template name="attribute"> + <attribute> + <xsl:call-template name="attributeinner"/> + </attribute> + </xsl:template> + +</xsl:stylesheet>
\ No newline at end of file diff --git a/writerfilter/source/ooxml/dummyannotate.xsl b/writerfilter/source/ooxml/dummyannotate.xsl index 029fd6aef569..0fcc1e0dcbc7 100644 --- a/writerfilter/source/ooxml/dummyannotate.xsl +++ b/writerfilter/source/ooxml/dummyannotate.xsl @@ -838,7 +838,7 @@ sed "s/wml/</xsl:text> <xsl:template match="/"> <out> - <xsl:apply-templates select="//rng:define[@name='OLEObject']" + <xsl:apply-templates select="//rng:define[@name='CT_DocGrid']" mode='resourcesPropertySetValue'/> </out> </xsl:template> diff --git a/writerfilter/source/ooxml/factoryimpl_ns.xsl b/writerfilter/source/ooxml/factoryimpl_ns.xsl index 55d986932aec..533c3d16ae23 100644 --- a/writerfilter/source/ooxml/factoryimpl_ns.xsl +++ b/writerfilter/source/ooxml/factoryimpl_ns.xsl @@ -150,7 +150,20 @@ for a rng:define --> <xsl:template name="factoryattributetoresourcemapinner"> + <xsl:variable name="defname" select="@name"/> + <xsl:for-each select=".//rng:ref[not(ancestor::rng:element or ancestor::rng:attribute)]"> + <xsl:variable name="name" select="@name"/> + <xsl:for-each select="ancestor::namespace/rng:grammar/rng:define[@name=$name]"> + <xsl:call-template name="factoryattributetoresourcemapinner"/> + </xsl:for-each> + </xsl:for-each> + <xsl:for-each select=".//rng:attribute"> + <xsl:if test="position()=1"> + <xsl:text> + // </xsl:text> + <xsl:value-of select="$defname"/> + </xsl:if> <xsl:variable name="mynsid" select="generate-id(ancestor::namespace)"/> <xsl:variable name="resource"> <xsl:for-each select="rng:ref"> @@ -161,6 +174,9 @@ for a rng:define <xsl:for-each select=".//rng:text"> <xsl:text>String</xsl:text> </xsl:for-each> + <xsl:for-each select=".//rng:data[@type='base64Binary']"> + <xsl:text>String</xsl:text> + </xsl:for-each> </xsl:variable> <xsl:variable name="refdefine1"> @@ -201,13 +217,6 @@ for a rng:define </xsl:choose> </xsl:for-each> - - <xsl:for-each select=".//rng:ref[not(ancestor::rng:element or ancestor::rng:attribute)]"> - <xsl:variable name="name" select="@name"/> - <xsl:for-each select="ancestor::namespace/rng:grammar/rng:define[@name=$name]"> - <xsl:call-template name="factoryattributetoresourcemapinner"/> - </xsl:for-each> - </xsl:for-each> </xsl:template> <!-- factoryattributetoresourcemap --> @@ -283,25 +292,6 @@ ListValueMapPointer </xsl:text> <!-- factoryelementtoresorucemapinner --> <xsl:template name="factorycreateelementmapinner"> - <xsl:for-each select=".//rng:element"> - <xsl:variable name="resource"> - <xsl:for-each select="rng:ref"> - <xsl:call-template name="contextresource"/> - </xsl:for-each> - </xsl:variable> - <xsl:if test="string-length($resource) > 0"> - <xsl:text> - (*pMap)[</xsl:text> - <xsl:call-template name="fasttoken"/> - <xsl:text>] = CreateElement(RT_</xsl:text> - <xsl:value-of select="$resource"/> - <xsl:text>, </xsl:text> - <xsl:for-each select="rng:ref"> - <xsl:call-template name="idforref"/> - </xsl:for-each> - <xsl:text>);</xsl:text> - </xsl:if> - </xsl:for-each> <xsl:for-each select=".//rng:ref[not(ancestor::rng:element or ancestor::rng:attribute)]"> <xsl:variable name="name" select="@name"/> <xsl:variable name="block"> @@ -329,6 +319,25 @@ ListValueMapPointer </xsl:text> <xsl:value-of select="$block1"/> </xsl:if> </xsl:for-each> + <xsl:for-each select=".//rng:element"> + <xsl:variable name="resource"> + <xsl:for-each select="rng:ref"> + <xsl:call-template name="contextresource"/> + </xsl:for-each> + </xsl:variable> + <xsl:if test="string-length($resource) > 0"> + <xsl:text> + (*pMap)[</xsl:text> + <xsl:call-template name="fasttoken"/> + <xsl:text>] = CreateElement(RT_</xsl:text> + <xsl:value-of select="$resource"/> + <xsl:text>, </xsl:text> + <xsl:for-each select="rng:ref"> + <xsl:call-template name="idforref"/> + </xsl:for-each> + <xsl:text>);</xsl:text> + </xsl:if> + </xsl:for-each> </xsl:template> <xsl:template name="factorycreateelementmapfromstart"> @@ -610,6 +619,25 @@ string </xsl:text> <xsl:template name="factorytokentoidmapinner"> <xsl:variable name="name" select="@name"/> + <xsl:for-each select=".//rng:ref[not(ancestor::rng:element or ancestor::rng:attribute)]"> + <xsl:variable name="refname" select="@name"/> + <xsl:variable name="refblock1"> + <xsl:for-each + select="ancestor::rng:grammar/rng:define[@name=$refname]"> + <xsl:call-template name="factorytokentoidmapinner"/> + </xsl:for-each> + </xsl:variable> + <xsl:choose> + <xsl:when test="string-length($refblock1) = 0"> + <xsl:for-each select="ancestor::model/namespace/rng:grammar/rng:define[@name=$refname]"> + <xsl:call-template name="factorytokentoidmapinner"/> + </xsl:for-each> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$refblock1"/> + </xsl:otherwise> + </xsl:choose> + </xsl:for-each> <xsl:variable name="body"> <xsl:for-each select="ancestor::namespace/resource[@name=$name]"> <xsl:for-each select="element[@tokenid]|attribute[@tokenid]"> @@ -630,25 +658,6 @@ string </xsl:text> <xsl:value-of select="$name"/> <xsl:value-of select="$body"/> </xsl:if> - <xsl:for-each select=".//rng:ref[not(ancestor::rng:element or ancestor::rng:attribute)]"> - <xsl:variable name="refname" select="@name"/> - <xsl:variable name="refblock1"> - <xsl:for-each - select="ancestor::rng:grammar/rng:define[@name=$refname]"> - <xsl:call-template name="factorytokentoidmapinner"/> - </xsl:for-each> - </xsl:variable> - <xsl:choose> - <xsl:when test="string-length($refblock1) = 0"> - <xsl:for-each select="ancestor::model/namespace/rng:grammar/rng:define[@name=$refname]"> - <xsl:call-template name="factorytokentoidmapinner"/> - </xsl:for-each> - </xsl:when> - <xsl:otherwise> - <xsl:value-of select="$refblock1"/> - </xsl:otherwise> - </xsl:choose> - </xsl:for-each> </xsl:template> <xsl:template name="factorytokentoidmap"> diff --git a/writerfilter/source/ooxml/fastresourcesimpl_dml-shapeProperties.xsl b/writerfilter/source/ooxml/fastresourcesimpl_dml-shapeProperties.xsl deleted file mode 100644 index 9904907317cc..000000000000 --- a/writerfilter/source/ooxml/fastresourcesimpl_dml-shapeProperties.xsl +++ /dev/null @@ -1,93 +0,0 @@ -<!-- -/************************************************************************* - * - DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - - Copyright 2000, 2010 Oracle and/or its affiliates. - - OpenOffice.org - a multi-platform office productivity suite - - This file is part of OpenOffice.org. - - OpenOffice.org is free software: you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License version 3 - only, as published by the Free Software Foundation. - - OpenOffice.org is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Lesser General Public License version 3 for more details - (a copy is included in the LICENSE file that accompanied this code). - - You should have received a copy of the GNU Lesser General Public License - version 3 along with OpenOffice.org. If not, see - <http://www.openoffice.org/license.html> - for a copy of the LGPLv3 License. - - ************************************************************************/ - ---> -<xsl:stylesheet - version="1.0" - xmlns:xsl="http://www.w3.org/1999/XSL/Transform" - xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" - xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" - xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" - xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" - xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" - xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" - xmlns:xlink="http://www.w3.org/1999/xlink" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" - xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" - xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" - xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" - xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" - xmlns:math="http://www.w3.org/1998/Math/MathML" - xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" - xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" - xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" - xmlns:ooo="http://openoffice.org/2004/office" - xmlns:ooow="http://openoffice.org/2004/writer" - xmlns:oooc="http://openoffice.org/2004/calc" - xmlns:dom="http://www.w3.org/2001/xml-events" - xmlns:xforms="http://www.w3.org/2002/xforms" - xmlns:xsd="http://www.w3.org/2001/XMLSchema" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:rng="http://relaxng.org/ns/structure/1.0" - xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" - xmlns:UML = 'org.omg.xmi.namespace.UML' xml:space="default"> - <xsl:output method="text" /> - <xsl:param name="prefix"/> - - <xsl:include href="resourcestools.xsl"/> - - <xsl:template match="/"> - <out xml:space="preserve"> - <xsl:call-template name="licenseheader"/> - <xsl:text> -#include <iostream> -#include <doctok/resourceids.hxx> -#include <ooxml/resourceids.hxx> -#include "OOXMLfastresources.hxx" -#include "OOXMLFastTokens.hxx" -#include "OOXMLFastHelper.hxx" -#include "OOXMLvalues.hxx" -#include "Handler.hxx" - -/// @cond GENERATED - -namespace writerfilter { -namespace ooxml { -using namespace ::std; - - </xsl:text> - <xsl:call-template name="fastcontextimpls"><xsl:with-param name="ns">dml-shapeProperties</xsl:with-param></xsl:call-template> - <xsl:text> -}} -/// @endcond GENERATED -
</xsl:text></out></xsl:template> - - <xsl:template match="*"/> -</xsl:stylesheet> diff --git a/writerfilter/source/ooxml/model.xml b/writerfilter/source/ooxml/model.xml index 15bb57e18087..b7046a495bd8 100644 --- a/writerfilter/source/ooxml/model.xml +++ b/writerfilter/source/ooxml/model.xml @@ -19,6 +19,7 @@ <token tokenid="ooxml:trackchange"/> <token tokenid="ooxml:object"/> <token tokenid="ooxml:tblStart"/> + <token tokenid="ooxml:ffdata"/> <namespace name="dml-stylesheet" url="http://schemas.openxmlformats.org/drawingml/2006/main" file="dml-stylesheet.rng"> <start name="theme"/> <start name="themeOverride"/> @@ -14105,7 +14106,7 @@ <xs:documentation>Cryptographic Hashing Algorithm</xs:documentation> </attribute> <attribute name="cryptSpinCount"> - <text/> + <ref name="ST_DecimalNumber"/> <xs:documentation>Iterations to Run Hashing Algorithm</xs:documentation> </attribute> <attribute name="cryptProvider"> @@ -15079,7 +15080,7 @@ </define> <define name="CT_FFTextType"> <attribute name="val"> - <text/> + <ref name="ST_FFName"/> <xs:documentation>Text Box Form Field Type Values</xs:documentation> </attribute> </define> @@ -15206,7 +15207,7 @@ </define> <define name="CT_FFHelpText"> <attribute name="type"> - <text/> + <ref name="ST_InfoTextType"/> <xs:documentation>Help Text Type</xs:documentation> </attribute> <attribute name="val"> @@ -15216,7 +15217,7 @@ </define> <define name="CT_FFStatusText"> <attribute name="type"> - <text/> + <ref name="ST_InfoTextType"/> <xs:documentation>Status Text Type</xs:documentation> </attribute> <attribute name="val"> @@ -15750,15 +15751,15 @@ </define> <define name="CT_DocGrid"> <attribute name="type"> - <text/> + <ref name="ST_DocGrid"/> <xs:documentation>Document Grid Type</xs:documentation> </attribute> <attribute name="linePitch"> - <text/> + <ref name="ST_DecimalNumber"/> <xs:documentation>Document Grid Line Pitch</xs:documentation> </attribute> <attribute name="charSpace"> - <text/> + <ref name="ST_DecimalNumber"/> <xs:documentation>Document Grid Character Pitch</xs:documentation> </attribute> </define> @@ -21754,11 +21755,11 @@ <attribute name="val" tokenid="ooxml:CT_Kinsoku_val"/> </resource> <resource name="ST_TextDirection" resource="List"> - <value tokenid="ooxml:Value_ST_TextDirection_lrTb">lrTb</value> - <value tokenid="ooxml:Value_ST_TextDirection_tbRl">tbRl</value> - <value tokenid="ooxml:Value_ST_TextDirection_btLr">btLr</value> - <value tokenid="ooxml:Value_ST_TextDirection_lrTbV">lrTbV</value> - <value tokenid="ooxml:Value_ST_TextDirection_tbRlV">tbRlV</value> + <value tokenid="0">lrTb</value> + <value tokenid="1">tbRl</value> + <value tokenid="3">btLr</value> + <value tokenid="4">lrTbV</value> + <value tokenid="5">tbRlV</value> <value tokenid="ooxml:Value_ST_TextDirection_tbLrV">tbLrV</value> </resource> <resource name="CT_TextDirection" resource="Value"> @@ -21855,6 +21856,24 @@ <action name="start" action="clearProps"/> <action name="end" action="mark" sendtokenid="ooxml:endtrackchange"/> </resource> + <resource name="EG_RangeMarkupElements" resource="Properties"> + <element name="bookmarkStart" tokenid="ooxml:EG_RangeMarkupElements_bookmarkStart"/> + <element name="bookmarkEnd" tokenid="ooxml:EG_RangeMarkupElements_bookmarkEnd"/> + <element name="moveFromRangeStart" tokenid="ooxml:EG_RangeMarkupElements_moveFromRangeStart"/> + <element name="moveFromRangeEnd" tokenid="ooxml:EG_RangeMarkupElements_moveFromRangeEnd"/> + <element name="moveToRangeStart" tokenid="ooxml:EG_RangeMarkupElements_moveToRangeStart"/> + <element name="moveToRangeEnd" tokenid="ooxml:EG_RangeMarkupElements_moveToRangeEnd"/> + <element name="commentRangeStart" tokenid="ooxml:EG_RangeMarkupElements_commentRangeStart"/> + <element name="commentRangeEnd" tokenid="ooxml:EG_RangeMarkupElements_commentRangeEnd"/> + <element name="customXmlInsRangeStart" tokenid="ooxml:EG_RangeMarkupElements_customXmlInsRangeStart"/> + <element name="customXmlInsRangeEnd" tokenid="ooxml:EG_RangeMarkupElements_customXmlInsRangeEnd"/> + <element name="customXmlDelRangeStart" tokenid="ooxml:EG_RangeMarkupElements_customXmlDelRangeStart"/> + <element name="customXmlDelRangeEnd" tokenid="ooxml:EG_RangeMarkupElements_customXmlDelRangeEnd"/> + <element name="customXmlMoveFromRangeStart" tokenid="ooxml:EG_RangeMarkupElements_customXmlMoveFromRangeStart"/> + <element name="customXmlMoveFromRangeEnd" tokenid="ooxml:EG_RangeMarkupElements_customXmlMoveFromRangeEnd"/> + <element name="customXmlMoveToRangeStart" tokenid="ooxml:EG_RangeMarkupElements_customXmlMoveToRangeStart"/> + <element name="customXmlMoveToRangeEnd" tokenid="ooxml:EG_RangeMarkupElements_customXmlMoveToRangeEnd"/> + </resource> <resource name="CT_NumPr" resource="Properties"> <kind name="paragraph"/> <element name="ilvl" tokenid="sprm:PIlvl"/> @@ -22037,6 +22056,8 @@ <element name="checkBox" tokenid="ooxml:CT_FFData_checkBox"/> <element name="ddList" tokenid="ooxml:CT_FFData_ddList"/> <element name="textInput" tokenid="ooxml:CT_FFData_textInput"/> + <action name="end" action="propagateCharacterPropertiesAsSet" sendtokenid="ooxml:ffdata"/> + <action name="end" action="clearProps"/> </resource> <resource name="CT_FFHelpText" resource="Properties"> <attribute name="type" tokenid="ooxml:CT_FFHelpText_type"/> @@ -22046,6 +22067,23 @@ <attribute name="type" tokenid="ooxml:CT_FFStatusText_type"/> <attribute name="val" tokenid="ooxml:CT_FFStatusText_val"/> </resource> + <resource name="CT_FFCheckBox" resource="Properties"> + <element name="size" tokenid="ooxml:CT_FFCheckBox_size"/> + <element name="sizeAuto" tokenid="ooxml:CT_FFCheckBox_sizeAuto"/> + <element name="default" tokenid="ooxml:CT_FFCheckBox_default"/> + <element name="checked" tokenid="ooxml:CT_FFCheckBox_checked"/> + </resource> + <resource name="CT_FFDDList" resource="Properties"> + <element name="result" tokenid="ooxml:CT_FFDDList_result"/> + <element name="default" tokenid="ooxml:CT_FFDDList_default"/> + <element name="listEntry" tokenid="ooxml:CT_FFDDList_listEntry"/> + </resource> + <resource name="CT_FFTextInput" resource="Properties"> + <element name="type" tokenid="ooxml:CT_FFTextInput_type"/> + <element name="default" tokenid="ooxml:CT_FFTextInput_default"/> + <element name="maxLength" tokenid="ooxml:CT_FFTextInput_maxLength"/> + <element name="format" tokenid="ooxml:CT_FFTextInput_format"/> + </resource> <resource name="ST_SectionMark" resource="List"> <value tokenid="0">continuous</value> <value tokenid="1">nextColumn</value> @@ -22209,6 +22247,11 @@ <value name="linesAndChars" tokenid="ooxml:Value_wordprocessingml_ST_DocGrid_linesAndChars">linesAndChars</value> <value name="snapToChars" tokenid="ooxml:Value_wordprocessingml_ST_DocGrid_snapToChars">snapToChars</value> </resource> + <resource name="CT_DocGrid" resource="Properties"> + <attribute name="type" tokenid="ooxml:CT_DocGrid_type"/> + <attribute name="linePitch" tokenid="ooxml:CT_DocGrid_linePitch"/> + <attribute name="charSpace" tokenid="ooxml:CT_DocGrid_charSpace"/> + </resource> <resource name="ST_HdrFtr" resource="List"> <value tokenid="ooxml:Value_ST_HrdFtr_even">even</value> <value tokenid="ooxml:Value_ST_HrdFtr_default">default</value> @@ -22429,10 +22472,10 @@ <element name="u" tokenid="ooxml:EG_RPrBase_u"/> <element name="effect" tokenid="sprm:CSfxText"/> <element name="bdr" tokenid="ooxml:EG_RPrBase_bdr"/> - <element name="shd" tokenid="ooxml:EG_RPrBase_shd"/> + <element name="shd" tokenid="sprm:CShd"/> <element name="fitText" tokenid="ooxml:EG_RPrBase_fitText"/> <element name="vertAlign" tokenid="ooxml:EG_RPrBase_vertAlign"/> - <element name="rtl" tokenid="ooxml:EG_RPrBase_rtl"/> + <element name="rtl" tokenid="sprm:CFBiDi"/> <element name="cs" tokenid="sprm:CComplexScript"/> <element name="em" tokenid="sprm:CKcd"/> <element name="lang" tokenid="ooxml:EG_RPrBase_lang"/> diff --git a/writerfilter/source/ooxml/ooxmlLoggers.hxx b/writerfilter/source/ooxml/ooxmlLoggers.hxx index b58a41bdabcd..54191244b968 100644 --- a/writerfilter/source/ooxml/ooxmlLoggers.hxx +++ b/writerfilter/source/ooxml/ooxmlLoggers.hxx @@ -28,6 +28,8 @@ #ifndef INCLUDED_OOXML_LOGGERS_HXX #define INCLUDED_OOXML_LOGGERS_HXX +#ifdef DEBUG + #include <resourcemodel/TagLogger.hxx> namespace writerfilter { @@ -35,4 +37,5 @@ namespace writerfilter { extern TagLogger::Pointer_t debug_logger; } } +#endif #endif // INCLUDED_OOXML_LOGGERS_HXX diff --git a/writerfilter/source/ooxml/status.sh b/writerfilter/source/ooxml/status.sh index e06382b13aa1..c36ad0d65a37 100755..100644 --- a/writerfilter/source/ooxml/status.sh +++ b/writerfilter/source/ooxml/status.sh @@ -8,15 +8,13 @@ echo "<stage1>" xsltproc analyzemodel.xsl model.xml | tail -n +2 -mdfind -onlyin $SEARCHIN "case NS_" | -xargs -J % grep -A 1 -n "case NS_" % | -grep "cxx" | +find $SEARCHIN -name "*.cxx" -exec grep -nH -A 1 "case NS_" {} \; | grep -v "//.*case NS_" | sed 's#'$SEARCHIN'##' | sed 's#\(^[^:]*\):\([0-9]*\):#<qname file="\1" line="\2"#' | sed 's#[/* ]*case \(NS_.*\):.*# qname="\1"/>#' | sed 's#.*WRITERFILTERSTATUS: done: \([0-9]*\), planned: \([0-9.]*\), spent: \([0-9.]*\).*#<status done="\1" planned="\2" spent="\3"/>#' | -grep -v "WRITERFILTERSTATUS:" | +sed 's#.*WRITERFILTERSTATUS:.*#<status done="100"/>#' | sed 's#^.*-[0-9][0-9]*-.*$#<nostatus/>#' | grep -v "^--" diff --git a/writerfilter/source/resourcemodel/Protocol.cxx b/writerfilter/source/resourcemodel/Protocol.cxx index 7ae3c06f2675..51d12eb4f2d6 100644 --- a/writerfilter/source/resourcemodel/Protocol.cxx +++ b/writerfilter/source/resourcemodel/Protocol.cxx @@ -28,6 +28,7 @@ * ************************************************************************/ +#ifdef DEBUG #include <stdio.h> #include <rtl/ustrbuf.hxx> #include <resourcemodel/Protocol.hxx> @@ -214,3 +215,4 @@ void TableProtocol::entry(int pos, } } +#endif // DEBUG diff --git a/writerfilter/source/doctok/util.hxx b/writerfilter/source/resourcemodel/ResourceModelHelper.cxx index df534b28a5bc..fee286fb4570 100644 --- a/writerfilter/source/doctok/util.hxx +++ b/writerfilter/source/resourcemodel/ResourceModelHelper.cxx @@ -25,33 +25,24 @@ * ************************************************************************/ -#ifndef INCLUDED_UTIL_HXX -#define INCLUDED_UTIL_HXX - -#include <string> -#include <iostream> +#include "resourcemodel/ResourceModelHelper.hxx" namespace writerfilter { -namespace doctok { -using namespace ::std; - -/** - Assertion +namespace resourcemodel { - @bTest if false the assertion is raised -*/ -void util_assert(bool bTest); +void resolveSprmProps(Properties & rHandler, Sprm & rSprm) +{ + writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps(); + if( pProperties.get()) + pProperties->resolve(rHandler); +} -/** - Print string to ostream. +void resolveAttributeProperties(Properties & rHandler, Value & val) +{ + writerfilter::Reference<Properties>::Pointer_t pProperties = val.getProperties(); + if( pProperties.get()) + pProperties->resolve(rHandler); +} - Printable characters are passed without change. Non-printable - characters are replaced by '.'. - @param o ostream for output - @param str string to print - */ -void printBytes(ostream & o, const string & str); }} - -#endif // INCLUDED_UTIL_HXX diff --git a/writerfilter/source/resourcemodel/TagLogger.cxx b/writerfilter/source/resourcemodel/TagLogger.cxx index 1d9b23623e56..f19bef7c01d1 100644 --- a/writerfilter/source/resourcemodel/TagLogger.cxx +++ b/writerfilter/source/resourcemodel/TagLogger.cxx @@ -25,6 +25,7 @@ * ************************************************************************/ +#ifdef DEBUG #include <fstream> #include <string.h> #include <resourcemodel/TagLogger.hxx> @@ -51,11 +52,65 @@ namespace writerfilter void XMLTag::addAttr(string sName, sal_uInt32 nValue) { - char buffer[256]; + static char buffer[256]; snprintf(buffer, sizeof(buffer), "%" SAL_PRIdINT32, nValue); addAttr(sName, buffer); } +void XMLTag::addAttr(string sName, uno::Any aAny) +{ + string aTmpStrInt; + string aTmpStrFloat; + string aTmpStrString; + + static char buffer[256]; + + try + { + sal_Int32 nInt = 0; + aAny >>= nInt; + + snprintf(buffer, sizeof(buffer), "%" SAL_PRIdINT32, + nInt); + + aTmpStrInt = buffer; + } + catch (uno::Exception aExcept) + { + aTmpStrInt = "exception"; + } + + try + { + float nFloat = 0.0; + aAny >>= nFloat; + + snprintf(buffer, sizeof(buffer), "%f", + nFloat); + + aTmpStrFloat = buffer; + } + catch (uno::Exception aExcept) + { + aTmpStrFloat = "exception"; + } + + try + { + ::rtl::OUString aStr; + aAny >>= aStr; + + aTmpStrString = OUStringToOString(aStr, RTL_TEXTENCODING_ASCII_US).getStr(); + } + catch (uno::Exception aExcept) + { + aTmpStrString = "exception"; + } + + addAttr(sName, "i:" + aTmpStrInt + " f:" + aTmpStrFloat + " s:" + + aTmpStrString); +} + void XMLTag::addTag(XMLTag::Pointer_t pTag) { if (pTag != XMLTag::Pointer_t()) @@ -64,9 +119,14 @@ namespace writerfilter void XMLTag::chars(const string & rChars) { - mChars = rChars; + mChars += rChars; } +void XMLTag::chars(const ::rtl::OUString & rChars) +{ + chars(OUStringToOString(rChars, RTL_TEXTENCODING_ASCII_US).getStr()); +} + const string & XMLTag::getTag() const { return mTag; @@ -162,6 +222,7 @@ namespace writerfilter static TagLoggerHashMap_t * tagLoggers = NULL; TagLogger::TagLogger() + : mFileName("writerfilter") { } @@ -169,6 +230,11 @@ namespace writerfilter { } + void TagLogger::setFileName(const string & rName) + { + mFileName = rName; + } + TagLogger::Pointer_t TagLogger::getInstance(const char * name) { if (tagLoggers == NULL) @@ -233,6 +299,11 @@ namespace writerfilter currentTag()->addAttr(name, value); } +void TagLogger::attribute(const string & name, const uno::Any aAny) +{ + currentTag()->addAttr(name, aAny); +} + void TagLogger::addTag(XMLTag::Pointer_t pTag) { currentTag()->addTag(pTag); @@ -287,7 +358,18 @@ namespace writerfilter else fileName += "/tmp"; - fileName += "/writerfilter."; + string sPrefix = aIt->second->mFileName; + size_t nLastSlash = sPrefix.find_last_of('/'); + size_t nLastBackslash = sPrefix.find_last_of('\\'); + size_t nCutPos = nLastSlash; + if (nLastBackslash < nCutPos) + nCutPos = nLastBackslash; + if (nCutPos < sPrefix.size()) + sPrefix = sPrefix.substr(nCutPos + 1); + + fileName += "/"; + fileName += sPrefix; + fileName +="."; fileName += name; fileName += ".xml"; @@ -336,7 +418,7 @@ namespace writerfilter static char sBuffer[256]; snprintf(sBuffer, sizeof(sBuffer), - "0x%" SAL_PRIxUINT32 "x, %" SAL_PRIxUINT32 "d", rSprm.getId(), + "0x%" SAL_PRIxUINT32 ", %" SAL_PRIuUINT32, rSprm.getId(), rSprm.getId()); pTag->addAttr("id", sBuffer); pTag->addAttr("value", rSprm.getValue()->toString()); @@ -347,4 +429,39 @@ namespace writerfilter } +XMLTag::Pointer_t unoPropertySetToTag(uno::Reference<beans::XPropertySet> rPropSet) +{ + uno::Reference<beans::XPropertySetInfo> xPropSetInfo(rPropSet->getPropertySetInfo()); + uno::Sequence<beans::Property> aProps(xPropSetInfo->getProperties()); + + XMLTag::Pointer_t pResult(new XMLTag("unoPropertySet")); + + for (int i = 0; i < aProps.getLength(); ++i) + { + XMLTag::Pointer_t pPropTag(new XMLTag("property")); + + ::rtl::OUString sName(aProps[i].Name); + + pPropTag->addAttr("name", sName); + try + { + pPropTag->addAttr("value", rPropSet->getPropertyValue(sName)); + } + catch (uno::Exception aException) + { + XMLTag::Pointer_t pException(new XMLTag("exception")); + + pException->chars("getPropertyValue(\""); + pException->chars(sName); + pException->chars("\")"); + pPropTag->addTag(pException); + } + + pResult->addTag(pPropTag); + } + + return pResult; +} + } +#endif // DEBUG diff --git a/writerfilter/source/resourcemodel/makefile.mk b/writerfilter/source/resourcemodel/makefile.mk index f3869f30611b..bb5bc05ac1bd 100644 --- a/writerfilter/source/resourcemodel/makefile.mk +++ b/writerfilter/source/resourcemodel/makefile.mk @@ -54,6 +54,7 @@ SLOFILES= \ $(SLO)$/resourcemodel.obj \ $(SLO)$/util.obj \ $(SLO)$/TagLogger.obj \ + $(SLO)$/ResourceModelHelper.obj \ $(SLO)$/WW8Analyzer.obj \ $(SLO)$/Protocol.obj diff --git a/writerfilter/source/resourcemodel/resourcemodel.cxx b/writerfilter/source/resourcemodel/resourcemodel.cxx index 9b45834c5ce3..096792c76b8e 100644 --- a/writerfilter/source/resourcemodel/resourcemodel.cxx +++ b/writerfilter/source/resourcemodel/resourcemodel.cxx @@ -481,12 +481,6 @@ void WW8PropertiesHandler::attribute(Id name, Value & val) output.addItem("</attribute>"); } -bool WW8PropertiesHandler::compare(SprmSharedPointer_t sprm1, - SprmSharedPointer_t sprm2) -{ - return sprm1->getId() < sprm2->getId(); -} - void WW8PropertiesHandler::sprm(Sprm & sprm_) { string tmpStr = "<sprm id=\""; diff --git a/writerfilter/source/resourcemodel/resourcemodel.hxx b/writerfilter/source/resourcemodel/resourcemodel.hxx index b316f4c912f9..9f59e68b9e1f 100644 --- a/writerfilter/source/resourcemodel/resourcemodel.hxx +++ b/writerfilter/source/resourcemodel/resourcemodel.hxx @@ -76,8 +76,6 @@ public: void dumpSprm(SprmSharedPointer_t sprm); void dumpSprms(); - - static bool compare(SprmSharedPointer_t sprm1, SprmSharedPointer_t sprm2); }; class WW8BinaryObjHandler : public BinaryObj diff --git a/writerfilter/source/resourcemodel/util.cxx b/writerfilter/source/resourcemodel/util.cxx index 47d325654d5b..3d041d18c126 100644 --- a/writerfilter/source/resourcemodel/util.cxx +++ b/writerfilter/source/resourcemodel/util.cxx @@ -64,6 +64,37 @@ void logger(string prefix, string message) logger_stream().flush(); } + string xmlify(const string & str) + { + string result = ""; + char sBuffer[16]; + + for (string::const_iterator aIt = str.begin(); aIt != str.end(); ++aIt) + { + char c = *aIt; + + if (isprint(c) && c != '\"') + { + if (c == '<') + result += "<"; + else if (c == '>') + result += ">"; + else if (c == '&') + result += "&"; + else + result += c; + } + else + { + snprintf(sBuffer, sizeof(sBuffer), "\\%03d", c); + result += sBuffer; + } + } + + return result; + } + +#ifdef DEBUG string propertysetToString(uno::Reference<beans::XPropertySet> const & xPropSet) { string sResult; @@ -368,57 +399,29 @@ string propertysetToString(uno::Reference<beans::XPropertySet> const & xPropSet) return sResult; } - string xmlify(const string & str) - { - string result = ""; - char sBuffer[16]; - - for (string::const_iterator aIt = str.begin(); aIt != str.end(); ++aIt) - { - char c = *aIt; - - if (isprint(c) && c != '\"') - { - if (c == '<') - result += "<"; - else if (c == '>') - result += ">"; - else if (c == '&') - result += "&"; - else - result += c; - } - else - { - snprintf(sBuffer, sizeof(sBuffer), "\\%03d", c); - result += sBuffer; - } - } - return result; - } +string toString(uno::Reference< text::XTextRange > textRange) +{ + string result; - string toString(uno::Reference< text::XTextRange > textRange) + if (textRange.get()) { - string result; - - if (textRange.get()) - { - rtl::OUString aOUStr = textRange->getString(); - rtl::OString aOStr(aOUStr.getStr(), aOUStr.getLength(), RTL_TEXTENCODING_ASCII_US ); - - result = aOStr.getStr(); - } - else - { - result="(nil)"; - } + rtl::OUString aOUStr = textRange->getString(); + rtl::OString aOStr(aOUStr.getStr(), aOUStr.getLength(), RTL_TEXTENCODING_ASCII_US ); - return result; + result = aOStr.getStr(); } - - string toString(const string & rString) + else { - return rString; + result="(nil)"; } + + return result; +} + +string toString(const string & rString) +{ + return rString; +} +#endif } |