| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_starmath.hxx" |
| |
| |
| #include <vcl/svapp.hxx> |
| |
| #include "cfgitem.hxx" |
| |
| #include "starmath.hrc" |
| #include "smdll.hxx" |
| #include "format.hxx" |
| |
| using namespace rtl; |
| using namespace com::sun::star; |
| using namespace com::sun::star::uno; |
| using namespace com::sun::star::beans; |
| |
| |
| static const char* aRootName = "Office.Math"; |
| |
| #define SYMBOL_LIST "SymbolList" |
| #define FONT_FORMAT_LIST "FontFormatList" |
| |
| ///////////////////////////////////////////////////////////////// |
| |
| |
| static Sequence< OUString > lcl_GetFontPropertyNames() |
| { |
| static const char * aPropNames[] = |
| { |
| "Name", |
| "CharSet", |
| "Family", |
| "Pitch", |
| "Weight", |
| "Italic", |
| 0 |
| }; |
| |
| const char** ppPropName = aPropNames; |
| |
| Sequence< OUString > aNames( 6 ); |
| OUString *pNames = aNames.getArray(); |
| for( sal_Int32 i = 0; *ppPropName; ++i, ++ppPropName ) |
| { |
| pNames[i] = A2OU( *ppPropName ); |
| } |
| //aNames.realloc( i ); |
| return aNames; |
| } |
| |
| ///////////////////////////////////////////////////////////////// |
| |
| |
| static Sequence< OUString > lcl_GetSymbolPropertyNames() |
| { |
| static const char * aPropNames[] = |
| { |
| "Char", |
| "Set", |
| "Predefined", |
| "FontFormatId", |
| 0 |
| }; |
| |
| const char** ppPropName = aPropNames; |
| |
| Sequence< OUString > aNames( 4 ); |
| OUString *pNames = aNames.getArray(); |
| for( sal_Int32 i = 0; *ppPropName; ++i, ++ppPropName ) |
| { |
| pNames[i] = A2OU( *ppPropName ); |
| } |
| //aNames.realloc( i ); |
| return aNames; |
| } |
| |
| ///////////////////////////////////////////////////////////////// |
| |
| static const char * aMathPropNames[] = |
| { |
| "Print/Title", |
| "Print/FormulaText", |
| "Print/Frame", |
| "Print/Size", |
| "Print/ZoomFactor", |
| "LoadSave/IsSaveOnlyUsedSymbols", |
| //"Misc/NoSymbolsWarning", @deprecated |
| "Misc/IgnoreSpacesRight", |
| "View/ToolboxVisible", |
| "View/AutoRedraw", |
| "View/FormulaCursor" |
| }; |
| |
| |
| //! Beware of order according to *_BEGIN *_END defines in format.hxx ! |
| //! see respective load/save routines here |
| static const char * aFormatPropNames[] = |
| { |
| "StandardFormat/Textmode", |
| "StandardFormat/GreekCharStyle", |
| "StandardFormat/ScaleNormalBracket", |
| "StandardFormat/HorizontalAlignment", |
| "StandardFormat/BaseSize", |
| "StandardFormat/TextSize", |
| "StandardFormat/IndexSize", |
| "StandardFormat/FunctionSize", |
| "StandardFormat/OperatorSize", |
| "StandardFormat/LimitsSize", |
| "StandardFormat/Distance/Horizontal", |
| "StandardFormat/Distance/Vertical", |
| "StandardFormat/Distance/Root", |
| "StandardFormat/Distance/SuperScript", |
| "StandardFormat/Distance/SubScript", |
| "StandardFormat/Distance/Numerator", |
| "StandardFormat/Distance/Denominator", |
| "StandardFormat/Distance/Fraction", |
| "StandardFormat/Distance/StrokeWidth", |
| "StandardFormat/Distance/UpperLimit", |
| "StandardFormat/Distance/LowerLimit", |
| "StandardFormat/Distance/BracketSize", |
| "StandardFormat/Distance/BracketSpace", |
| "StandardFormat/Distance/MatrixRow", |
| "StandardFormat/Distance/MatrixColumn", |
| "StandardFormat/Distance/OrnamentSize", |
| "StandardFormat/Distance/OrnamentSpace", |
| "StandardFormat/Distance/OperatorSize", |
| "StandardFormat/Distance/OperatorSpace", |
| "StandardFormat/Distance/LeftSpace", |
| "StandardFormat/Distance/RightSpace", |
| "StandardFormat/Distance/TopSpace", |
| "StandardFormat/Distance/BottomSpace", |
| "StandardFormat/Distance/NormalBracketSize", |
| "StandardFormat/VariableFont", |
| "StandardFormat/FunctionFont", |
| "StandardFormat/NumberFont", |
| "StandardFormat/TextFont", |
| "StandardFormat/SerifFont", |
| "StandardFormat/SansFont", |
| "StandardFormat/FixedFont" |
| }; |
| |
| |
| static Sequence< OUString > lcl_GetPropertyNames( |
| const char * aPropNames[], sal_uInt16 nCount ) |
| { |
| |
| const char** ppPropName = aPropNames; |
| |
| Sequence< OUString > aNames( nCount ); |
| OUString *pNames = aNames.getArray(); |
| for (sal_Int32 i = 0; i < nCount; ++i, ++ppPropName) |
| { |
| pNames[i] = A2OU( *ppPropName ); |
| } |
| //aNames.realloc( i ); |
| return aNames; |
| } |
| |
| |
| static Sequence< OUString > GetFormatPropertyNames() |
| { |
| sal_uInt16 nCnt = sizeof(aFormatPropNames) / sizeof(aFormatPropNames[0]); |
| return lcl_GetPropertyNames( aFormatPropNames, nCnt ); |
| } |
| |
| |
| static Sequence< OUString > GetOtherPropertyNames() |
| { |
| sal_uInt16 nCnt = sizeof(aMathPropNames) / sizeof(aMathPropNames[0]); |
| return lcl_GetPropertyNames( aMathPropNames, nCnt ); |
| } |
| |
| ///////////////////////////////////////////////////////////////// |
| |
| struct SmCfgOther |
| { |
| SmPrintSize ePrintSize; |
| sal_uInt16 nPrintZoomFactor; |
| sal_Bool bPrintTitle; |
| sal_Bool bPrintFormulaText; |
| sal_Bool bPrintFrame; |
| sal_Bool bIsSaveOnlyUsedSymbols; |
| sal_Bool bIgnoreSpacesRight; |
| sal_Bool bToolboxVisible; |
| sal_Bool bAutoRedraw; |
| sal_Bool bFormulaCursor; |
| //sal_Bool bNoSymbolsWarning; |
| |
| SmCfgOther(); |
| }; |
| |
| |
| SmCfgOther::SmCfgOther() |
| { |
| ePrintSize = PRINT_SIZE_NORMAL; |
| nPrintZoomFactor = 100; |
| bPrintTitle = bPrintFormulaText = |
| bPrintFrame = bIgnoreSpacesRight = |
| bToolboxVisible = bAutoRedraw = |
| bFormulaCursor = bIsSaveOnlyUsedSymbols = sal_True; |
| } |
| |
| ///////////////////////////////////////////////////////////////// |
| |
| |
| SmFontFormat::SmFontFormat() |
| { |
| aName.AssignAscii( FONTNAME_MATH ); |
| nCharSet = RTL_TEXTENCODING_UNICODE; |
| nFamily = FAMILY_DONTKNOW; |
| nPitch = PITCH_DONTKNOW; |
| nWeight = WEIGHT_DONTKNOW; |
| nItalic = ITALIC_NONE; |
| } |
| |
| |
| SmFontFormat::SmFontFormat( const Font &rFont ) |
| { |
| aName = rFont.GetName(); |
| nCharSet = (sal_Int16) rFont.GetCharSet(); |
| nFamily = (sal_Int16) rFont.GetFamily(); |
| nPitch = (sal_Int16) rFont.GetPitch(); |
| nWeight = (sal_Int16) rFont.GetWeight(); |
| nItalic = (sal_Int16) rFont.GetItalic(); |
| } |
| |
| |
| const Font SmFontFormat::GetFont() const |
| { |
| Font aRes; |
| aRes.SetName( aName ); |
| aRes.SetCharSet( (rtl_TextEncoding) nCharSet ); |
| aRes.SetFamily( (FontFamily) nFamily ); |
| aRes.SetPitch( (FontPitch) nPitch ); |
| aRes.SetWeight( (FontWeight) nWeight ); |
| aRes.SetItalic( (FontItalic) nItalic ); |
| return aRes; |
| } |
| |
| |
| sal_Bool SmFontFormat::operator == ( const SmFontFormat &rFntFmt ) const |
| { |
| return aName == rFntFmt.aName && |
| nCharSet == rFntFmt.nCharSet && |
| nFamily == rFntFmt.nFamily && |
| nPitch == rFntFmt.nPitch && |
| nWeight == rFntFmt.nWeight && |
| nItalic == rFntFmt.nItalic; |
| } |
| |
| |
| ///////////////////////////////////////////////////////////////// |
| |
| SmFntFmtListEntry::SmFntFmtListEntry( const String &rId, const SmFontFormat &rFntFmt ) : |
| aId (rId), |
| aFntFmt (rFntFmt) |
| { |
| } |
| |
| |
| SmFontFormatList::SmFontFormatList() |
| { |
| bModified = sal_False; |
| } |
| |
| |
| void SmFontFormatList::Clear() |
| { |
| if (!aEntries.empty()) |
| { |
| aEntries.clear(); |
| SetModified( sal_True ); |
| } |
| } |
| |
| |
| void SmFontFormatList::AddFontFormat( const String &rFntFmtId, |
| const SmFontFormat &rFntFmt ) |
| { |
| const SmFontFormat *pFntFmt = GetFontFormat( rFntFmtId ); |
| DBG_ASSERT( !pFntFmt, "FontFormatId already exists" ); |
| if (!pFntFmt) |
| { |
| SmFntFmtListEntry aEntry( rFntFmtId, rFntFmt ); |
| aEntries.push_back( aEntry ); |
| SetModified( sal_True ); |
| } |
| } |
| |
| |
| void SmFontFormatList::RemoveFontFormat( const String &rFntFmtId ) |
| { |
| |
| // search for entry |
| for (size_t i = 0; i < aEntries.size(); ++i) |
| { |
| if (aEntries[i].aId == rFntFmtId) |
| { |
| // remove entry if found |
| aEntries.erase( aEntries.begin() + i ); |
| SetModified( sal_True ); |
| break; |
| } |
| } |
| } |
| |
| |
| const SmFontFormat * SmFontFormatList::GetFontFormat( const String &rFntFmtId ) const |
| { |
| const SmFontFormat *pRes = 0; |
| |
| for (size_t i = 0; i < aEntries.size(); ++i) |
| { |
| if (aEntries[i].aId == rFntFmtId) |
| { |
| pRes = &aEntries[i].aFntFmt; |
| break; |
| } |
| } |
| |
| return pRes; |
| } |
| |
| |
| |
| const SmFontFormat * SmFontFormatList::GetFontFormat( size_t nPos ) const |
| { |
| const SmFontFormat *pRes = 0; |
| if (nPos < aEntries.size()) |
| pRes = &aEntries[nPos].aFntFmt; |
| return pRes; |
| } |
| |
| |
| const String SmFontFormatList::GetFontFormatId( const SmFontFormat &rFntFmt ) const |
| { |
| String aRes; |
| |
| for (size_t i = 0; i < aEntries.size(); ++i) |
| { |
| if (aEntries[i].aFntFmt == rFntFmt) |
| { |
| aRes = aEntries[i].aId; |
| break; |
| } |
| } |
| |
| return aRes; |
| } |
| |
| |
| const String SmFontFormatList::GetFontFormatId( const SmFontFormat &rFntFmt, sal_Bool bAdd ) |
| { |
| String aRes( GetFontFormatId( rFntFmt) ); |
| if (0 == aRes.Len() && bAdd) |
| { |
| aRes = GetNewFontFormatId(); |
| AddFontFormat( aRes, rFntFmt ); |
| } |
| return aRes; |
| } |
| |
| |
| const String SmFontFormatList::GetFontFormatId( size_t nPos ) const |
| { |
| String aRes; |
| if (nPos < aEntries.size()) |
| aRes = aEntries[nPos].aId; |
| return aRes; |
| } |
| |
| |
| const String SmFontFormatList::GetNewFontFormatId() const |
| { |
| // returns first unused FormatId |
| |
| String aRes; |
| |
| String aPrefix( RTL_CONSTASCII_STRINGPARAM( "Id" ) ); |
| sal_Int32 nCnt = GetCount(); |
| for (sal_Int32 i = 1; i <= nCnt + 1; ++i) |
| { |
| String aTmpId( aPrefix ); |
| aTmpId += String::CreateFromInt32( i ); |
| if (!GetFontFormat( aTmpId )) |
| { |
| aRes = aTmpId; |
| break; |
| } |
| } |
| DBG_ASSERT( 0 != aRes.Len(), "failed to create new FontFormatId" ); |
| |
| return aRes; |
| } |
| |
| ///////////////////////////////////////////////////////////////// |
| |
| SmMathConfig::SmMathConfig() : |
| ConfigItem( String::CreateFromAscii( aRootName )) |
| { |
| pFormat = 0; |
| pOther = 0; |
| pFontFormatList = 0; |
| pSymbolMgr = 0; |
| |
| bIsOtherModified = bIsFormatModified = sal_False; |
| } |
| |
| |
| SmMathConfig::~SmMathConfig() |
| { |
| Save(); |
| delete pFormat; |
| delete pOther; |
| delete pFontFormatList; |
| delete pSymbolMgr; |
| } |
| |
| |
| void SmMathConfig::SetOtherModified( sal_Bool bVal ) |
| { |
| bIsOtherModified = bVal; |
| } |
| |
| |
| void SmMathConfig::SetFormatModified( sal_Bool bVal ) |
| { |
| bIsFormatModified = bVal; |
| } |
| |
| |
| void SmMathConfig::SetFontFormatListModified( sal_Bool bVal ) |
| { |
| if (pFontFormatList) |
| pFontFormatList->SetModified( bVal ); |
| } |
| |
| |
| void SmMathConfig::ReadSymbol( SmSym &rSymbol, |
| const rtl::OUString &rSymbolName, |
| const rtl::OUString &rBaseNode ) const |
| { |
| Sequence< OUString > aNames = lcl_GetSymbolPropertyNames(); |
| sal_Int32 nProps = aNames.getLength(); |
| |
| OUString aDelim( OUString::valueOf( (sal_Unicode) '/' ) ); |
| OUString *pName = aNames.getArray(); |
| for (sal_Int32 i = 0; i < nProps; ++i) |
| { |
| OUString &rName = pName[i]; |
| OUString aTmp( rName ); |
| rName = rBaseNode; |
| rName += aDelim; |
| rName += rSymbolName; |
| rName += aDelim; |
| rName += aTmp; |
| } |
| |
| const Sequence< Any > aValues = ((SmMathConfig*) this)->GetProperties( aNames ); |
| |
| if (nProps && aValues.getLength() == nProps) |
| { |
| const Any * pValue = aValues.getConstArray(); |
| Font aFont; |
| sal_UCS4 cChar = '\0'; |
| String aSet; |
| sal_Bool bPredefined = sal_False; |
| |
| OUString aTmpStr; |
| sal_Int32 nTmp32 = 0; |
| sal_Bool bTmp = sal_False; |
| |
| sal_Bool bOK = sal_True; |
| if (pValue->hasValue() && (*pValue >>= nTmp32)) |
| cChar = static_cast< sal_UCS4 >( nTmp32 ); |
| else |
| bOK = sal_False; |
| ++pValue; |
| if (pValue->hasValue() && (*pValue >>= aTmpStr)) |
| aSet = aTmpStr; |
| else |
| bOK = sal_False; |
| ++pValue; |
| if (pValue->hasValue() && (*pValue >>= bTmp)) |
| bPredefined = bTmp; |
| else |
| bOK = sal_False; |
| ++pValue; |
| if (pValue->hasValue() && (*pValue >>= aTmpStr)) |
| { |
| const SmFontFormat *pFntFmt = GetFontFormatList().GetFontFormat( aTmpStr ); |
| DBG_ASSERT( pFntFmt, "unknown FontFormat" ); |
| if (pFntFmt) |
| aFont = pFntFmt->GetFont(); |
| } |
| else |
| bOK = sal_False; |
| ++pValue; |
| |
| if (bOK) |
| { |
| String aUiName( rSymbolName ); |
| String aUiSetName( aSet ); |
| if (bPredefined) |
| { |
| String aTmp; |
| aTmp = GetUiSymbolName( rSymbolName ); |
| DBG_ASSERT( aTmp.Len(), "localized symbol-name not found" ); |
| if (aTmp.Len()) |
| aUiName = aTmp; |
| aTmp = GetUiSymbolSetName( aSet ); |
| DBG_ASSERT( aTmp.Len(), "localized symbolset-name not found" ); |
| if (aTmp.Len()) |
| aUiSetName = aTmp; |
| } |
| |
| rSymbol = SmSym( aUiName, aFont, cChar, aUiSetName, bPredefined ); |
| if (aUiName != String(rSymbolName)) |
| rSymbol.SetExportName( rSymbolName ); |
| } |
| else |
| { |
| DBG_ERROR( "symbol read error" ); |
| } |
| } |
| } |
| |
| |
| SmSymbolManager & SmMathConfig::GetSymbolManager() |
| { |
| if (!pSymbolMgr) |
| { |
| pSymbolMgr = new SmSymbolManager; |
| pSymbolMgr->Load(); |
| } |
| return *pSymbolMgr; |
| } |
| |
| |
| void SmMathConfig::Commit() |
| { |
| Save(); |
| } |
| |
| |
| void SmMathConfig::Save() |
| { |
| SaveOther(); |
| SaveFormat(); |
| SaveFontFormatList(); |
| } |
| |
| |
| void SmMathConfig::GetSymbols( std::vector< SmSym > &rSymbols ) const |
| { |
| Sequence< OUString > aNodes( ((SmMathConfig*) this)->GetNodeNames( A2OU( SYMBOL_LIST ) ) ); |
| const OUString *pNode = aNodes.getConstArray(); |
| sal_Int32 nNodes = aNodes.getLength(); |
| |
| rSymbols.resize( nNodes ); |
| std::vector< SmSym >::iterator aIt( rSymbols.begin() ); |
| std::vector< SmSym >::iterator aEnd( rSymbols.end() ); |
| while (aIt != aEnd) |
| { |
| ReadSymbol( *aIt++, *pNode++, A2OU( SYMBOL_LIST ) ); |
| } |
| } |
| |
| |
| void SmMathConfig::SetSymbols( const std::vector< SmSym > &rNewSymbols ) |
| { |
| sal_uIntPtr nCount = rNewSymbols.size(); |
| |
| Sequence< OUString > aNames = lcl_GetSymbolPropertyNames(); |
| const OUString *pNames = aNames.getConstArray(); |
| sal_uIntPtr nSymbolProps = sal::static_int_cast< sal_uInt32 >(aNames.getLength()); |
| |
| Sequence< PropertyValue > aValues( nCount * nSymbolProps ); |
| PropertyValue *pValues = aValues.getArray(); |
| |
| PropertyValue *pVal = pValues; |
| OUString aDelim( OUString::valueOf( (sal_Unicode) '/' ) ); |
| std::vector< SmSym >::const_iterator aIt( rNewSymbols.begin() ); |
| std::vector< SmSym >::const_iterator aEnd( rNewSymbols.end() ); |
| while (aIt != aEnd) |
| { |
| const SmSym &rSymbol = *aIt++; |
| //const Font &rFont = rSymbol.GetFace(); |
| OUString aNodeNameDelim( A2OU( SYMBOL_LIST ) ); |
| aNodeNameDelim += aDelim; |
| aNodeNameDelim += rSymbol.GetExportName(); |
| aNodeNameDelim += aDelim; |
| |
| const OUString *pName = pNames; |
| |
| // Char |
| pVal->Name = aNodeNameDelim; |
| pVal->Name += *pName++; |
| pVal->Value <<= static_cast< sal_UCS4 >( rSymbol.GetCharacter() ); |
| pVal++; |
| // Set |
| pVal->Name = aNodeNameDelim; |
| pVal->Name += *pName++; |
| OUString aTmp( rSymbol.GetSymbolSetName() ); |
| if (rSymbol.IsPredefined()) |
| aTmp = GetExportSymbolSetName( aTmp ); |
| pVal->Value <<= aTmp; |
| pVal++; |
| // Predefined |
| pVal->Name = aNodeNameDelim; |
| pVal->Name += *pName++; |
| pVal->Value <<= (sal_Bool) rSymbol.IsPredefined(); |
| pVal++; |
| // FontFormatId |
| SmFontFormat aFntFmt( rSymbol.GetFace() ); |
| String aFntFmtId( GetFontFormatList().GetFontFormatId( aFntFmt, sal_True ) ); |
| DBG_ASSERT( aFntFmtId.Len(), "FontFormatId not found" ); |
| pVal->Name = aNodeNameDelim; |
| pVal->Name += *pName++; |
| pVal->Value <<= OUString( aFntFmtId ); |
| pVal++; |
| } |
| DBG_ASSERT( pVal - pValues == sal::static_int_cast< ptrdiff_t >(nCount * nSymbolProps), "properties missing" ); |
| ReplaceSetProperties( A2OU( SYMBOL_LIST ) , aValues ); |
| |
| StripFontFormatList( rNewSymbols ); |
| SaveFontFormatList(); |
| } |
| |
| |
| SmFontFormatList & SmMathConfig::GetFontFormatList() |
| { |
| if (!pFontFormatList) |
| { |
| LoadFontFormatList(); |
| } |
| return *pFontFormatList; |
| } |
| |
| |
| void SmMathConfig::LoadFontFormatList() |
| { |
| if (!pFontFormatList) |
| pFontFormatList = new SmFontFormatList; |
| else |
| pFontFormatList->Clear(); |
| |
| Sequence< OUString > aNodes( GetNodeNames( A2OU( FONT_FORMAT_LIST ) ) ); |
| const OUString *pNode = aNodes.getConstArray(); |
| sal_Int32 nNodes = aNodes.getLength(); |
| |
| for (sal_Int32 i = 0; i < nNodes; ++i) |
| { |
| SmFontFormat aFntFmt; |
| ReadFontFormat( aFntFmt, pNode[i], A2OU( FONT_FORMAT_LIST ) ); |
| if (!pFontFormatList->GetFontFormat( pNode[i] )) |
| { |
| DBG_ASSERT( 0 == pFontFormatList->GetFontFormat( pNode[i] ), |
| "FontFormat ID already exists" ); |
| pFontFormatList->AddFontFormat( pNode[i], aFntFmt ); |
| } |
| } |
| pFontFormatList->SetModified( sal_False ); |
| } |
| |
| |
| void SmMathConfig::ReadFontFormat( SmFontFormat &rFontFormat, |
| const OUString &rSymbolName, const OUString &rBaseNode ) const |
| { |
| Sequence< OUString > aNames = lcl_GetFontPropertyNames(); |
| sal_Int32 nProps = aNames.getLength(); |
| |
| OUString aDelim( OUString::valueOf( (sal_Unicode) '/' ) ); |
| OUString *pName = aNames.getArray(); |
| for (sal_Int32 i = 0; i < nProps; ++i) |
| { |
| OUString &rName = pName[i]; |
| OUString aTmp( rName ); |
| rName = rBaseNode; |
| rName += aDelim; |
| rName += rSymbolName; |
| rName += aDelim; |
| rName += aTmp; |
| } |
| |
| const Sequence< Any > aValues = ((SmMathConfig*) this)->GetProperties( aNames ); |
| |
| if (nProps && aValues.getLength() == nProps) |
| { |
| const Any * pValue = aValues.getConstArray(); |
| |
| OUString aTmpStr; |
| sal_Int16 nTmp16 = 0; |
| |
| sal_Bool bOK = sal_True; |
| if (pValue->hasValue() && (*pValue >>= aTmpStr)) |
| rFontFormat.aName = aTmpStr; |
| else |
| bOK = sal_False; |
| ++pValue; |
| if (pValue->hasValue() && (*pValue >>= nTmp16)) |
| rFontFormat.nCharSet = nTmp16; // 6.0 file-format GetSOLoadTextEncoding not needed |
| else |
| bOK = sal_False; |
| ++pValue; |
| if (pValue->hasValue() && (*pValue >>= nTmp16)) |
| rFontFormat.nFamily = nTmp16; |
| else |
| bOK = sal_False; |
| ++pValue; |
| if (pValue->hasValue() && (*pValue >>= nTmp16)) |
| rFontFormat.nPitch = nTmp16; |
| else |
| bOK = sal_False; |
| ++pValue; |
| if (pValue->hasValue() && (*pValue >>= nTmp16)) |
| rFontFormat.nWeight = nTmp16; |
| else |
| bOK = sal_False; |
| ++pValue; |
| if (pValue->hasValue() && (*pValue >>= nTmp16)) |
| rFontFormat.nItalic = nTmp16; |
| else |
| bOK = sal_False; |
| ++pValue; |
| |
| DBG_ASSERT( bOK, "read FontFormat failed" ); |
| } |
| } |
| |
| |
| void SmMathConfig::SaveFontFormatList() |
| { |
| SmFontFormatList &rFntFmtList = GetFontFormatList(); |
| |
| if (!rFntFmtList.IsModified()) |
| return; |
| |
| Sequence< OUString > aNames = lcl_GetFontPropertyNames(); |
| sal_Int32 nSymbolProps = aNames.getLength(); |
| |
| size_t nCount = rFntFmtList.GetCount(); |
| |
| Sequence< PropertyValue > aValues( nCount * nSymbolProps ); |
| PropertyValue *pValues = aValues.getArray(); |
| |
| PropertyValue *pVal = pValues; |
| OUString aDelim( OUString::valueOf( (sal_Unicode) '/' ) ); |
| for (size_t i = 0; i < nCount; ++i) |
| { |
| String aFntFmtId( rFntFmtList.GetFontFormatId( i ) ); |
| const SmFontFormat aFntFmt( *rFntFmtList.GetFontFormat( aFntFmtId ) ); |
| |
| OUString aNodeNameDelim( A2OU( FONT_FORMAT_LIST ) ); |
| aNodeNameDelim += aDelim; |
| aNodeNameDelim += aFntFmtId; |
| aNodeNameDelim += aDelim; |
| |
| const OUString *pName = aNames.getConstArray();; |
| |
| // Name |
| pVal->Name = aNodeNameDelim; |
| pVal->Name += *pName++; |
| pVal->Value <<= OUString( aFntFmt.aName ); |
| pVal++; |
| // CharSet |
| pVal->Name = aNodeNameDelim; |
| pVal->Name += *pName++; |
| pVal->Value <<= (sal_Int16) aFntFmt.nCharSet; // 6.0 file-format GetSOStoreTextEncoding not needed |
| pVal++; |
| // Family |
| pVal->Name = aNodeNameDelim; |
| pVal->Name += *pName++; |
| pVal->Value <<= (sal_Int16) aFntFmt.nFamily; |
| pVal++; |
| // Pitch |
| pVal->Name = aNodeNameDelim; |
| pVal->Name += *pName++; |
| pVal->Value <<= (sal_Int16) aFntFmt.nPitch; |
| pVal++; |
| // Weight |
| pVal->Name = aNodeNameDelim; |
| pVal->Name += *pName++; |
| pVal->Value <<= (sal_Int16) aFntFmt.nWeight; |
| pVal++; |
| // Italic |
| pVal->Name = aNodeNameDelim; |
| pVal->Name += *pName++; |
| pVal->Value <<= (sal_Int16) aFntFmt.nItalic; |
| pVal++; |
| } |
| DBG_ASSERT( static_cast<size_t>(pVal - pValues) == (nCount * nSymbolProps), |
| "properties missing" ); |
| ReplaceSetProperties( A2OU( FONT_FORMAT_LIST ) , aValues ); |
| |
| rFntFmtList.SetModified( sal_False ); |
| } |
| |
| |
| void SmMathConfig::StripFontFormatList( const std::vector< SmSym > &rSymbols ) |
| { |
| size_t i; |
| |
| // build list of used font-formats only |
| //!! font-format IDs may be different !! |
| SmFontFormatList aUsedList; |
| for (i = 0; i < rSymbols.size(); ++i) |
| { |
| DBG_ASSERT( rSymbols[i].GetName().Len() > 0, "non named symbol" ); |
| aUsedList.GetFontFormatId( SmFontFormat( rSymbols[i].GetFace() ) , sal_True ); |
| } |
| const SmFormat & rStdFmt = GetStandardFormat(); |
| for (i = FNT_BEGIN; i <= FNT_END; ++i) |
| { |
| aUsedList.GetFontFormatId( SmFontFormat( rStdFmt.GetFont( i ) ) , sal_True ); |
| } |
| |
| // remove unused font-formats from list |
| SmFontFormatList &rFntFmtList = GetFontFormatList(); |
| size_t nCnt = rFntFmtList.GetCount(); |
| SmFontFormat *pTmpFormat = new SmFontFormat[ nCnt ]; |
| String *pId = new String [ nCnt ]; |
| size_t k; |
| for (k = 0; k < nCnt; ++k) |
| { |
| pTmpFormat[k] = *rFntFmtList.GetFontFormat( k ); |
| pId[k] = rFntFmtList.GetFontFormatId( k ); |
| } |
| for (k = 0; k < nCnt; ++k) |
| { |
| if (0 == aUsedList.GetFontFormatId( pTmpFormat[k] ).Len()) |
| { |
| rFntFmtList.RemoveFontFormat( pId[k] ); |
| } |
| } |
| delete [] pId; |
| delete [] pTmpFormat; |
| } |
| |
| |
| void SmMathConfig::LoadOther() |
| { |
| if (!pOther) |
| pOther = new SmCfgOther; |
| |
| Sequence< OUString > aNames( GetOtherPropertyNames() ); |
| sal_Int32 nProps = aNames.getLength(); |
| |
| Sequence< Any > aValues( GetProperties( aNames ) ); |
| if (nProps && aValues.getLength() == nProps) |
| { |
| const Any *pValues = aValues.getConstArray(); |
| const Any *pVal = pValues; |
| |
| sal_Int16 nTmp16 = 0; |
| sal_Bool bTmp = sal_False; |
| |
| // Print/Title |
| if (pVal->hasValue() && (*pVal >>= bTmp)) |
| pOther->bPrintTitle = bTmp; |
| ++pVal; |
| // Print/FormulaText |
| if (pVal->hasValue() && (*pVal >>= bTmp)) |
| pOther->bPrintFormulaText = bTmp; |
| ++pVal; |
| // Print/Frame |
| if (pVal->hasValue() && (*pVal >>= bTmp)) |
| pOther->bPrintFrame = bTmp; |
| ++pVal; |
| // Print/Size |
| if (pVal->hasValue() && (*pVal >>= nTmp16)) |
| pOther->ePrintSize = (SmPrintSize) nTmp16; |
| ++pVal; |
| // Print/ZoomFactor |
| if (pVal->hasValue() && (*pVal >>= nTmp16)) |
| pOther->nPrintZoomFactor = nTmp16; |
| ++pVal; |
| // LoadSave/IsSaveOnlyUsedSymbols |
| if (pVal->hasValue() && (*pVal >>= bTmp)) |
| pOther->bIsSaveOnlyUsedSymbols = bTmp; |
| /* ++pVal; |
| // Misc/NoSymbolsWarning |
| if (pVal->hasValue() && (*pVal >>= bTmp)) |
| pOther->bNoSymbolsWarning = bTmp; |
| */ |
| ++pVal; |
| // Misc/IgnoreSpacesRight |
| if (pVal->hasValue() && (*pVal >>= bTmp)) |
| pOther->bIgnoreSpacesRight = bTmp; |
| ++pVal; |
| // View/ToolboxVisible |
| if (pVal->hasValue() && (*pVal >>= bTmp)) |
| pOther->bToolboxVisible = bTmp; |
| ++pVal; |
| // View/AutoRedraw |
| if (pVal->hasValue() && (*pVal >>= bTmp)) |
| pOther->bAutoRedraw = bTmp; |
| ++pVal; |
| // View/FormulaCursor |
| if (pVal->hasValue() && (*pVal >>= bTmp)) |
| pOther->bFormulaCursor = bTmp; |
| ++pVal; |
| |
| DBG_ASSERT( pVal - pValues == nProps, "property mismatch" ); |
| SetOtherModified( sal_False ); |
| } |
| } |
| |
| |
| void SmMathConfig::SaveOther() |
| { |
| if (!pOther || !IsOtherModified()) |
| return; |
| |
| const Sequence< OUString > aNames( GetOtherPropertyNames() ); |
| sal_Int32 nProps = aNames.getLength(); |
| |
| Sequence< Any > aValues( nProps ); |
| Any *pValues = aValues.getArray(); |
| Any *pValue = pValues; |
| |
| // Print/Title |
| *pValue++ <<= (sal_Bool) pOther->bPrintTitle; |
| // Print/FormulaText |
| *pValue++ <<= (sal_Bool) pOther->bPrintFormulaText; |
| // Print/Frame |
| *pValue++ <<= (sal_Bool) pOther->bPrintFrame; |
| // Print/Size |
| *pValue++ <<= (sal_Int16) pOther->ePrintSize; |
| // Print/ZoomFactor |
| *pValue++ <<= (sal_Int16) pOther->nPrintZoomFactor; |
| // LoadSave/IsSaveOnlyUsedSymbols |
| *pValue++ <<= (sal_Bool) pOther->bIsSaveOnlyUsedSymbols; |
| /* // Misc/NoSymbolsWarning |
| *pValue++ <<= (sal_Bool) pOther->bNoSymbolsWarning; |
| */ |
| // Misc/IgnoreSpacesRight |
| *pValue++ <<= (sal_Bool) pOther->bIgnoreSpacesRight; |
| // View/ToolboxVisible |
| *pValue++ <<= (sal_Bool) pOther->bToolboxVisible; |
| // View/AutoRedraw |
| *pValue++ <<= (sal_Bool) pOther->bAutoRedraw; |
| // View/FormulaCursor |
| *pValue++ <<= (sal_Bool) pOther->bFormulaCursor; |
| |
| DBG_ASSERT( pValue - pValues == nProps, "property mismatch" ); |
| PutProperties( aNames , aValues ); |
| |
| SetOtherModified( sal_False ); |
| } |
| |
| void SmMathConfig::LoadFormat() |
| { |
| if (!pFormat) |
| pFormat = new SmFormat; |
| |
| |
| Sequence< OUString > aNames( GetFormatPropertyNames() ); |
| sal_Int32 nProps = aNames.getLength(); |
| |
| Sequence< Any > aValues( GetProperties( aNames ) ); |
| if (nProps && aValues.getLength() == nProps) |
| { |
| const Any *pValues = aValues.getConstArray(); |
| const Any *pVal = pValues; |
| |
| OUString aTmpStr; |
| sal_Int16 nTmp16 = 0; |
| sal_Bool bTmp = sal_False; |
| |
| // StandardFormat/Textmode |
| 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 ); |
| ++pVal; |
| // StandardFormat/HorizontalAlignment |
| if (pVal->hasValue() && (*pVal >>= nTmp16)) |
| pFormat->SetHorAlign( (SmHorAlign) nTmp16 ); |
| ++pVal; |
| // StandardFormat/BaseSize |
| if (pVal->hasValue() && (*pVal >>= nTmp16)) |
| pFormat->SetBaseSize( Size(0, SmPtsTo100th_mm( nTmp16 )) ); |
| ++pVal; |
| |
| sal_uInt16 i; |
| for (i = SIZ_BEGIN; i <= SIZ_END; ++i) |
| { |
| if (pVal->hasValue() && (*pVal >>= nTmp16)) |
| pFormat->SetRelSize( i, nTmp16 ); |
| ++pVal; |
| } |
| |
| for (i = DIS_BEGIN; i <= DIS_END; ++i) |
| { |
| if (pVal->hasValue() && (*pVal >>= nTmp16)) |
| pFormat->SetDistance( i, nTmp16 ); |
| ++pVal; |
| } |
| |
| LanguageType nLang = Application::GetSettings().GetUILanguage(); |
| for (i = FNT_BEGIN; i < FNT_END; ++i) |
| { |
| Font aFnt; |
| sal_Bool bUseDefaultFont = sal_True; |
| if (pVal->hasValue() && (*pVal >>= aTmpStr)) |
| { |
| bUseDefaultFont = 0 == aTmpStr.getLength(); |
| if (bUseDefaultFont) |
| { |
| aFnt = pFormat->GetFont( i ); |
| aFnt.SetName( GetDefaultFontName( nLang, i ) ); |
| } |
| else |
| { |
| const SmFontFormat *pFntFmt = GetFontFormatList().GetFontFormat( aTmpStr ); |
| DBG_ASSERT( pFntFmt, "unknown FontFormat" ); |
| if (pFntFmt) |
| aFnt = pFntFmt->GetFont(); |
| } |
| } |
| ++pVal; |
| |
| aFnt.SetSize( pFormat->GetBaseSize() ); |
| pFormat->SetFont( i, aFnt, bUseDefaultFont ); |
| } |
| |
| DBG_ASSERT( pVal - pValues == nProps, "property mismatch" ); |
| SetFormatModified( sal_False ); |
| } |
| } |
| |
| |
| void SmMathConfig::SaveFormat() |
| { |
| if (!pFormat || !IsFormatModified()) |
| return; |
| |
| const Sequence< OUString > aNames( GetFormatPropertyNames() ); |
| sal_Int32 nProps = aNames.getLength(); |
| |
| Sequence< Any > aValues( nProps ); |
| Any *pValues = aValues.getArray(); |
| Any *pValue = pValues; |
| |
| // StandardFormat/Textmode |
| *pValue++ <<= (sal_Bool) pFormat->IsTextmode(); |
| // StandardFormat/GreekCharStyle |
| *pValue++ <<= (sal_Int16) pFormat->GetGreekCharStyle(); |
| // StandardFormat/ScaleNormalBracket |
| *pValue++ <<= (sal_Bool) pFormat->IsScaleNormalBrackets(); |
| // StandardFormat/HorizontalAlignment |
| *pValue++ <<= (sal_Int16) pFormat->GetHorAlign(); |
| // StandardFormat/BaseSize |
| *pValue++ <<= (sal_Int16) SmRoundFraction( Sm100th_mmToPts( |
| pFormat->GetBaseSize().Height() ) ); |
| |
| sal_uInt16 i; |
| for (i = SIZ_BEGIN; i <= SIZ_END; ++i) |
| *pValue++ <<= (sal_Int16) pFormat->GetRelSize( i ); |
| |
| for (i = DIS_BEGIN; i <= DIS_END; ++i) |
| *pValue++ <<= (sal_Int16) pFormat->GetDistance( i ); |
| |
| for (i = FNT_BEGIN; i < FNT_END; ++i) |
| { |
| OUString aFntFmtId; |
| |
| if (!pFormat->IsDefaultFont( i )) |
| { |
| SmFontFormat aFntFmt( pFormat->GetFont( i ) ); |
| aFntFmtId = GetFontFormatList().GetFontFormatId( aFntFmt, sal_True ); |
| DBG_ASSERT( aFntFmtId.getLength(), "FontFormatId not found" ); |
| } |
| |
| *pValue++ <<= aFntFmtId; |
| } |
| |
| DBG_ASSERT( pValue - pValues == nProps, "property mismatch" ); |
| PutProperties( aNames , aValues ); |
| |
| SetFormatModified( sal_False ); |
| } |
| |
| |
| const SmFormat & SmMathConfig::GetStandardFormat() const |
| { |
| if (!pFormat) |
| ((SmMathConfig *) this)->LoadFormat(); |
| return *pFormat; |
| } |
| |
| |
| void SmMathConfig::SetStandardFormat( const SmFormat &rFormat, sal_Bool bSaveFontFormatList ) |
| { |
| if (!pFormat) |
| LoadFormat(); |
| if (rFormat != *pFormat) |
| { |
| *pFormat = rFormat; |
| SetFormatModified( sal_True ); |
| SaveFormat(); |
| |
| if (bSaveFontFormatList) |
| { |
| // needed for SmFontTypeDialog's DefaultButtonClickHdl |
| SetFontFormatListModified( sal_True ); |
| SaveFontFormatList(); |
| } |
| } |
| } |
| |
| |
| SmPrintSize SmMathConfig::GetPrintSize() const |
| { |
| if (!pOther) |
| ((SmMathConfig *) this)->LoadOther(); |
| return pOther->ePrintSize; |
| } |
| |
| |
| void SmMathConfig::SetPrintSize( SmPrintSize eSize ) |
| { |
| if (!pOther) |
| LoadOther(); |
| if (eSize != pOther->ePrintSize) |
| { |
| pOther->ePrintSize = eSize; |
| SetOtherModified( sal_True ); |
| } |
| } |
| |
| |
| sal_uInt16 SmMathConfig::GetPrintZoomFactor() const |
| { |
| if (!pOther) |
| ((SmMathConfig *) this)->LoadOther(); |
| return pOther->nPrintZoomFactor; |
| } |
| |
| |
| void SmMathConfig::SetPrintZoomFactor( sal_uInt16 nVal ) |
| { |
| if (!pOther) |
| LoadOther(); |
| if (nVal != pOther->nPrintZoomFactor) |
| { |
| pOther->nPrintZoomFactor = nVal; |
| SetOtherModified( sal_True ); |
| } |
| } |
| |
| |
| void SmMathConfig::SetOtherIfNotEqual( sal_Bool &rbItem, sal_Bool bNewVal ) |
| { |
| if (bNewVal != rbItem) |
| { |
| rbItem = bNewVal; |
| SetOtherModified( sal_True ); |
| } |
| } |
| |
| |
| sal_Bool SmMathConfig::IsPrintTitle() const |
| { |
| if (!pOther) |
| ((SmMathConfig *) this)->LoadOther(); |
| return pOther->bPrintTitle; |
| } |
| |
| |
| void SmMathConfig::SetPrintTitle( sal_Bool bVal ) |
| { |
| if (!pOther) |
| LoadOther(); |
| SetOtherIfNotEqual( pOther->bPrintTitle, bVal ); |
| } |
| |
| |
| sal_Bool SmMathConfig::IsPrintFormulaText() const |
| { |
| if (!pOther) |
| ((SmMathConfig *) this)->LoadOther(); |
| return pOther->bPrintFormulaText; |
| } |
| |
| |
| void SmMathConfig::SetPrintFormulaText( sal_Bool bVal ) |
| { |
| if (!pOther) |
| LoadOther(); |
| SetOtherIfNotEqual( pOther->bPrintFormulaText, bVal ); |
| } |
| |
| |
| sal_Bool SmMathConfig::IsPrintFrame() const |
| { |
| if (!pOther) |
| ((SmMathConfig *) this)->LoadOther(); |
| return pOther->bPrintFrame; |
| } |
| |
| |
| void SmMathConfig::SetPrintFrame( sal_Bool bVal ) |
| { |
| if (!pOther) |
| LoadOther(); |
| SetOtherIfNotEqual( pOther->bPrintFrame, bVal ); |
| } |
| |
| |
| sal_Bool SmMathConfig::IsSaveOnlyUsedSymbols() const |
| { |
| if (!pOther) |
| ((SmMathConfig *) this)->LoadOther(); |
| return pOther->bIsSaveOnlyUsedSymbols; |
| } |
| |
| |
| void SmMathConfig::SetSaveOnlyUsedSymbols( sal_Bool bVal ) |
| { |
| if (!pOther) |
| LoadOther(); |
| SetOtherIfNotEqual( pOther->bIsSaveOnlyUsedSymbols, bVal ); |
| } |
| |
| |
| sal_Bool SmMathConfig::IsIgnoreSpacesRight() const |
| { |
| if (!pOther) |
| ((SmMathConfig *) this)->LoadOther(); |
| return pOther->bIgnoreSpacesRight; |
| } |
| |
| |
| void SmMathConfig::SetIgnoreSpacesRight( sal_Bool bVal ) |
| { |
| if (!pOther) |
| LoadOther(); |
| SetOtherIfNotEqual( pOther->bIgnoreSpacesRight, bVal ); |
| } |
| |
| |
| sal_Bool SmMathConfig::IsAutoRedraw() const |
| { |
| if (!pOther) |
| ((SmMathConfig *) this)->LoadOther(); |
| return pOther->bAutoRedraw; |
| } |
| |
| |
| void SmMathConfig::SetAutoRedraw( sal_Bool bVal ) |
| { |
| if (!pOther) |
| LoadOther(); |
| SetOtherIfNotEqual( pOther->bAutoRedraw, bVal ); |
| } |
| |
| |
| sal_Bool SmMathConfig::IsShowFormulaCursor() const |
| { |
| if (!pOther) |
| ((SmMathConfig *) this)->LoadOther(); |
| return pOther->bFormulaCursor; |
| } |
| |
| |
| void SmMathConfig::SetShowFormulaCursor( sal_Bool bVal ) |
| { |
| if (!pOther) |
| LoadOther(); |
| SetOtherIfNotEqual( pOther->bFormulaCursor, bVal ); |
| } |
| |
| void SmMathConfig::Notify( const com::sun::star::uno::Sequence< rtl::OUString >& ) |
| {} |
| |
| ///////////////////////////////////////////////////////////////// |
| |