xref: /aoo4110/main/starmath/source/symbol.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_starmath.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski #include <vector>
29*b1cdbd2cSJim Jagielski #include <osl/mutex.hxx>
30*b1cdbd2cSJim Jagielski #include <ucbhelper/content.hxx>
31*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski #include <sfx2/dispatch.hxx>
34*b1cdbd2cSJim Jagielski #include <sfx2/docfile.hxx>
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski #include <map>
37*b1cdbd2cSJim Jagielski #include <vector>
38*b1cdbd2cSJim Jagielski #include <iterator>
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski #include "symbol.hxx"
41*b1cdbd2cSJim Jagielski #include "view.hxx"
42*b1cdbd2cSJim Jagielski #include "utility.hxx"
43*b1cdbd2cSJim Jagielski #include "dialog.hxx"
44*b1cdbd2cSJim Jagielski #include "config.hxx"
45*b1cdbd2cSJim Jagielski #include "cfgitem.hxx"
46*b1cdbd2cSJim Jagielski #include "smmod.hxx"
47*b1cdbd2cSJim Jagielski #include "starmath.hrc"
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
51*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::ucb;
52*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
53*b1cdbd2cSJim Jagielski using namespace ::rtl;
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski 
56*b1cdbd2cSJim Jagielski /**************************************************************************/
57*b1cdbd2cSJim Jagielski 
SmSym()58*b1cdbd2cSJim Jagielski SmSym::SmSym() :
59*b1cdbd2cSJim Jagielski     m_aName(C2S("unknown")),
60*b1cdbd2cSJim Jagielski     m_aSetName(C2S("unknown")),
61*b1cdbd2cSJim Jagielski     m_cChar('\0'),
62*b1cdbd2cSJim Jagielski     m_bPredefined(sal_False),
63*b1cdbd2cSJim Jagielski     m_bDocSymbol(sal_False)
64*b1cdbd2cSJim Jagielski {
65*b1cdbd2cSJim Jagielski     m_aExportName = m_aName;
66*b1cdbd2cSJim Jagielski     m_aFace.SetTransparent(sal_True);
67*b1cdbd2cSJim Jagielski     m_aFace.SetAlign(ALIGN_BASELINE);
68*b1cdbd2cSJim Jagielski }
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski 
SmSym(const SmSym & rSymbol)71*b1cdbd2cSJim Jagielski SmSym::SmSym(const SmSym& rSymbol)
72*b1cdbd2cSJim Jagielski {
73*b1cdbd2cSJim Jagielski     *this = rSymbol;
74*b1cdbd2cSJim Jagielski }
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski 
SmSym(const String & rName,const Font & rFont,sal_UCS4 cChar,const String & rSet,sal_Bool bIsPredefined)77*b1cdbd2cSJim Jagielski SmSym::SmSym(const String& rName, const Font& rFont, sal_UCS4 cChar,
78*b1cdbd2cSJim Jagielski 			 const String& rSet, sal_Bool bIsPredefined)
79*b1cdbd2cSJim Jagielski {
80*b1cdbd2cSJim Jagielski     m_aName     = m_aExportName   = rName;
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski     m_aFace     = rFont;
83*b1cdbd2cSJim Jagielski     m_aFace.SetTransparent(sal_True);
84*b1cdbd2cSJim Jagielski     m_aFace.SetAlign(ALIGN_BASELINE);
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski     m_cChar   = cChar;
87*b1cdbd2cSJim Jagielski //! according to HDU this should not be used anymore now
88*b1cdbd2cSJim Jagielski //! since this was necessary in the early days but should
89*b1cdbd2cSJim Jagielski //! not be done now since this is handled now at a more
90*b1cdbd2cSJim Jagielski //! bottom layer by HDU.
91*b1cdbd2cSJim Jagielski //! He can still imagine scenarios where this will be wrong
92*b1cdbd2cSJim Jagielski //! now though, for example when importing *some* old documents.
93*b1cdbd2cSJim Jagielski //! But overall it should be a large improvement, and
94*b1cdbd2cSJim Jagielski //! likely everything will still work... #_- (eyes shut and "go"!)
95*b1cdbd2cSJim Jagielski //
96*b1cdbd2cSJim Jagielski //    if (RTL_TEXTENCODING_SYMBOL == rFont.GetCharSet())
97*b1cdbd2cSJim Jagielski //        Character |= 0xF000;
98*b1cdbd2cSJim Jagielski     m_aSetName      = rSet;
99*b1cdbd2cSJim Jagielski     m_bPredefined   = bIsPredefined;
100*b1cdbd2cSJim Jagielski     m_bDocSymbol    = sal_False;
101*b1cdbd2cSJim Jagielski }
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski 
operator =(const SmSym & rSymbol)104*b1cdbd2cSJim Jagielski SmSym& SmSym::operator = (const SmSym& rSymbol)
105*b1cdbd2cSJim Jagielski {
106*b1cdbd2cSJim Jagielski     m_aName         = rSymbol.m_aName;
107*b1cdbd2cSJim Jagielski     m_aExportName   = rSymbol.m_aExportName;
108*b1cdbd2cSJim Jagielski     m_cChar         = rSymbol.m_cChar;
109*b1cdbd2cSJim Jagielski     m_aFace         = rSymbol.m_aFace;
110*b1cdbd2cSJim Jagielski     m_aSetName      = rSymbol.m_aSetName;
111*b1cdbd2cSJim Jagielski     m_bPredefined   = rSymbol.m_bPredefined;
112*b1cdbd2cSJim Jagielski     m_bDocSymbol    = rSymbol.m_bDocSymbol;
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski     SmSymbolManager * pSymSetManager = &SM_MOD()->GetSymbolManager();
115*b1cdbd2cSJim Jagielski     if (pSymSetManager)
116*b1cdbd2cSJim Jagielski         pSymSetManager->SetModified(true);
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski 	return *this;
119*b1cdbd2cSJim Jagielski }
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski 
IsEqualInUI(const SmSym & rSymbol) const122*b1cdbd2cSJim Jagielski bool SmSym::IsEqualInUI( const SmSym& rSymbol ) const
123*b1cdbd2cSJim Jagielski {
124*b1cdbd2cSJim Jagielski     return  m_aName == rSymbol.m_aName &&
125*b1cdbd2cSJim Jagielski             m_aFace == rSymbol.m_aFace &&
126*b1cdbd2cSJim Jagielski             m_cChar == rSymbol.m_cChar;
127*b1cdbd2cSJim Jagielski }
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski /**************************************************************************/
130*b1cdbd2cSJim Jagielski 
SFX_NOTIFY(SfxBroadcaster &,const TypeId & rBCType,const SfxHint &,const TypeId & rHintType)131*b1cdbd2cSJim Jagielski void SmSymbolManager::SFX_NOTIFY(SfxBroadcaster& /*rBC*/, const TypeId& rBCType,
132*b1cdbd2cSJim Jagielski                               const SfxHint& /*rHint*/, const TypeId& rHintType)
133*b1cdbd2cSJim Jagielski {
134*b1cdbd2cSJim Jagielski }
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski 
Init()137*b1cdbd2cSJim Jagielski void SmSymbolManager::Init()
138*b1cdbd2cSJim Jagielski {
139*b1cdbd2cSJim Jagielski     SmModule *pp = SM_MOD();
140*b1cdbd2cSJim Jagielski 	StartListening(*pp->GetConfig());
141*b1cdbd2cSJim Jagielski }
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski 
Exit()144*b1cdbd2cSJim Jagielski void SmSymbolManager::Exit()
145*b1cdbd2cSJim Jagielski {
146*b1cdbd2cSJim Jagielski     SmModule *pp = SM_MOD();
147*b1cdbd2cSJim Jagielski 	EndListening(*pp->GetConfig());
148*b1cdbd2cSJim Jagielski }
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski 
SmSymbolManager()151*b1cdbd2cSJim Jagielski SmSymbolManager::SmSymbolManager()
152*b1cdbd2cSJim Jagielski {
153*b1cdbd2cSJim Jagielski     m_bModified     = false;
154*b1cdbd2cSJim Jagielski }
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski 
SmSymbolManager(const SmSymbolManager & rSymbolSetManager)157*b1cdbd2cSJim Jagielski SmSymbolManager::SmSymbolManager(const SmSymbolManager& rSymbolSetManager) :
158*b1cdbd2cSJim Jagielski     SfxListener()
159*b1cdbd2cSJim Jagielski {
160*b1cdbd2cSJim Jagielski     m_aSymbols      = rSymbolSetManager.m_aSymbols;
161*b1cdbd2cSJim Jagielski     m_bModified     = true;
162*b1cdbd2cSJim Jagielski }
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski 
~SmSymbolManager()165*b1cdbd2cSJim Jagielski SmSymbolManager::~SmSymbolManager()
166*b1cdbd2cSJim Jagielski {
167*b1cdbd2cSJim Jagielski }
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski 
operator =(const SmSymbolManager & rSymbolSetManager)170*b1cdbd2cSJim Jagielski SmSymbolManager& SmSymbolManager::operator = (const SmSymbolManager& rSymbolSetManager)
171*b1cdbd2cSJim Jagielski {
172*b1cdbd2cSJim Jagielski     m_aSymbols      = rSymbolSetManager.m_aSymbols;
173*b1cdbd2cSJim Jagielski     m_bModified     = true;
174*b1cdbd2cSJim Jagielski 	return *this;
175*b1cdbd2cSJim Jagielski }
176*b1cdbd2cSJim Jagielski 
177*b1cdbd2cSJim Jagielski 
GetSymbolByName(const String & rSymbolName)178*b1cdbd2cSJim Jagielski SmSym *SmSymbolManager::GetSymbolByName(const String& rSymbolName)
179*b1cdbd2cSJim Jagielski {
180*b1cdbd2cSJim Jagielski     SmSym *pRes = NULL;
181*b1cdbd2cSJim Jagielski     SymbolMap_t::iterator aIt( m_aSymbols.find( rSymbolName ) );
182*b1cdbd2cSJim Jagielski     if (aIt != m_aSymbols.end())
183*b1cdbd2cSJim Jagielski         pRes = &aIt->second;
184*b1cdbd2cSJim Jagielski     return pRes;
185*b1cdbd2cSJim Jagielski }
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 
GetSymbols() const188*b1cdbd2cSJim Jagielski const SymbolPtrVec_t SmSymbolManager::GetSymbols() const
189*b1cdbd2cSJim Jagielski {
190*b1cdbd2cSJim Jagielski     SymbolPtrVec_t aRes;
191*b1cdbd2cSJim Jagielski     SymbolMap_t::const_iterator aIt( m_aSymbols.begin() );
192*b1cdbd2cSJim Jagielski     for ( ; aIt != m_aSymbols.end(); ++aIt)
193*b1cdbd2cSJim Jagielski         aRes.push_back( &aIt->second );
194*b1cdbd2cSJim Jagielski //    DBG_ASSERT( sSymbols.size() == m_aSymbols.size(), "number of symbols mismatch " );
195*b1cdbd2cSJim Jagielski     return aRes;
196*b1cdbd2cSJim Jagielski }
197*b1cdbd2cSJim Jagielski 
198*b1cdbd2cSJim Jagielski 
AddOrReplaceSymbol(const SmSym & rSymbol,bool bForceChange)199*b1cdbd2cSJim Jagielski bool SmSymbolManager::AddOrReplaceSymbol( const SmSym &rSymbol, bool bForceChange )
200*b1cdbd2cSJim Jagielski {
201*b1cdbd2cSJim Jagielski     bool bAdded = false;
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski     const String aSymbolName( rSymbol.GetName() );
204*b1cdbd2cSJim Jagielski     if (aSymbolName.Len() > 0 && rSymbol.GetSymbolSetName().Len() > 0)
205*b1cdbd2cSJim Jagielski     {
206*b1cdbd2cSJim Jagielski         const SmSym *pFound = GetSymbolByName( aSymbolName );
207*b1cdbd2cSJim Jagielski         const bool bSymbolConflict = pFound && !pFound->IsEqualInUI( rSymbol );
208*b1cdbd2cSJim Jagielski 
209*b1cdbd2cSJim Jagielski         // avoid having the same symbol name twice but with different symbols in use
210*b1cdbd2cSJim Jagielski         if (!pFound || bForceChange)
211*b1cdbd2cSJim Jagielski         {
212*b1cdbd2cSJim Jagielski             m_aSymbols[ aSymbolName ] = rSymbol;
213*b1cdbd2cSJim Jagielski             bAdded = true;
214*b1cdbd2cSJim Jagielski         }
215*b1cdbd2cSJim Jagielski         else if (pFound && !bForceChange && bSymbolConflict)
216*b1cdbd2cSJim Jagielski         {
217*b1cdbd2cSJim Jagielski             // TODO: to solve this a document owned symbol manager would be required ...
218*b1cdbd2cSJim Jagielski             // But for now we have a global one to easily support availability of all
219*b1cdbd2cSJim Jagielski             // symbols in all formulas. A copy of the global one would be needed here
220*b1cdbd2cSJim Jagielski             // and then the new symbol has to be forcefully applied. This would keep
221*b1cdbd2cSJim Jagielski             // the current formula intact but will leave the set of symbols in the
222*b1cdbd2cSJim Jagielski             // global symbol manager somewhat to chance.
223*b1cdbd2cSJim Jagielski             DBG_ASSERT( 0, "symbol conflict, different symbol with same name found!" );
224*b1cdbd2cSJim Jagielski         }
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski         if (bAdded)
227*b1cdbd2cSJim Jagielski             m_bModified = true;
228*b1cdbd2cSJim Jagielski         DBG_ASSERT( bAdded || (pFound && !bSymbolConflict), "AddOrReplaceSymbol: unresolved symbol conflict" );
229*b1cdbd2cSJim Jagielski     }
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski     return bAdded;
232*b1cdbd2cSJim Jagielski }
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski 
RemoveSymbol(const String & rSymbolName)235*b1cdbd2cSJim Jagielski void SmSymbolManager::RemoveSymbol( const String & rSymbolName )
236*b1cdbd2cSJim Jagielski {
237*b1cdbd2cSJim Jagielski     if (rSymbolName.Len() > 0)
238*b1cdbd2cSJim Jagielski     {
239*b1cdbd2cSJim Jagielski         size_t nOldSize = m_aSymbols.size();
240*b1cdbd2cSJim Jagielski         m_aSymbols.erase( rSymbolName );
241*b1cdbd2cSJim Jagielski         m_bModified = nOldSize != m_aSymbols.size();
242*b1cdbd2cSJim Jagielski     }
243*b1cdbd2cSJim Jagielski }
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski 
GetSymbolSetNames() const246*b1cdbd2cSJim Jagielski std::set< String > SmSymbolManager::GetSymbolSetNames() const
247*b1cdbd2cSJim Jagielski {
248*b1cdbd2cSJim Jagielski     std::set< String >  aRes;
249*b1cdbd2cSJim Jagielski     SymbolMap_t::const_iterator aIt( m_aSymbols.begin() );
250*b1cdbd2cSJim Jagielski     for ( ; aIt != m_aSymbols.end(); ++aIt )
251*b1cdbd2cSJim Jagielski         aRes.insert( aIt->second.GetSymbolSetName() );
252*b1cdbd2cSJim Jagielski     return aRes;
253*b1cdbd2cSJim Jagielski }
254*b1cdbd2cSJim Jagielski 
255*b1cdbd2cSJim Jagielski 
GetSymbolSet(const String & rSymbolSetName)256*b1cdbd2cSJim Jagielski const SymbolPtrVec_t SmSymbolManager::GetSymbolSet( const String& rSymbolSetName )
257*b1cdbd2cSJim Jagielski {
258*b1cdbd2cSJim Jagielski     SymbolPtrVec_t aRes;
259*b1cdbd2cSJim Jagielski     if (rSymbolSetName.Len() > 0)
260*b1cdbd2cSJim Jagielski     {
261*b1cdbd2cSJim Jagielski         SymbolMap_t::const_iterator aIt( m_aSymbols.begin() );
262*b1cdbd2cSJim Jagielski         for ( ; aIt != m_aSymbols.end(); ++aIt )
263*b1cdbd2cSJim Jagielski         {
264*b1cdbd2cSJim Jagielski             if (aIt->second.GetSymbolSetName() == rSymbolSetName)
265*b1cdbd2cSJim Jagielski                 aRes.push_back( &aIt->second );
266*b1cdbd2cSJim Jagielski         }
267*b1cdbd2cSJim Jagielski     }
268*b1cdbd2cSJim Jagielski     return aRes;
269*b1cdbd2cSJim Jagielski }
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski 
Load()272*b1cdbd2cSJim Jagielski void SmSymbolManager::Load()
273*b1cdbd2cSJim Jagielski {
274*b1cdbd2cSJim Jagielski     std::vector< SmSym > aSymbols;
275*b1cdbd2cSJim Jagielski     SmMathConfig &rCfg = *SM_MOD()->GetConfig();
276*b1cdbd2cSJim Jagielski     rCfg.GetSymbols( aSymbols );
277*b1cdbd2cSJim Jagielski     size_t nSymbolCount = aSymbols.size();
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski     m_aSymbols.clear();
280*b1cdbd2cSJim Jagielski     for (size_t i = 0;  i < nSymbolCount;  ++i)
281*b1cdbd2cSJim Jagielski     {
282*b1cdbd2cSJim Jagielski         const SmSym &rSym = aSymbols[i];
283*b1cdbd2cSJim Jagielski         DBG_ASSERT( rSym.GetName().Len() > 0, "symbol without name!" );
284*b1cdbd2cSJim Jagielski         if (rSym.GetName().Len() > 0)
285*b1cdbd2cSJim Jagielski             AddOrReplaceSymbol( rSym );
286*b1cdbd2cSJim Jagielski     }
287*b1cdbd2cSJim Jagielski     m_bModified = true;
288*b1cdbd2cSJim Jagielski 
289*b1cdbd2cSJim Jagielski     if (0 == nSymbolCount)
290*b1cdbd2cSJim Jagielski     {
291*b1cdbd2cSJim Jagielski         DBG_ERROR( "no symbol set found" );
292*b1cdbd2cSJim Jagielski         m_bModified = false;
293*b1cdbd2cSJim Jagielski     }
294*b1cdbd2cSJim Jagielski 
295*b1cdbd2cSJim Jagielski     // now add a %i... symbol to the 'iGreek' set for every symbol found in the 'Greek' set.
296*b1cdbd2cSJim Jagielski     SmLocalizedSymbolData   aLocalizedData;
297*b1cdbd2cSJim Jagielski     const String aGreekSymbolSetName( aLocalizedData.GetUiSymbolSetName( A2OU("Greek") ) );
298*b1cdbd2cSJim Jagielski     const SymbolPtrVec_t    aGreekSymbols( GetSymbolSet( aGreekSymbolSetName ) );
299*b1cdbd2cSJim Jagielski     String aSymbolSetName( (sal_Unicode) 'i' );
300*b1cdbd2cSJim Jagielski     aSymbolSetName += aGreekSymbolSetName;
301*b1cdbd2cSJim Jagielski     size_t nSymbols = aGreekSymbols.size();
302*b1cdbd2cSJim Jagielski     for (size_t i = 0;  i < nSymbols;  ++i)
303*b1cdbd2cSJim Jagielski     {
304*b1cdbd2cSJim Jagielski         // make the new symbol a copy but with ITALIC_NORMAL, and add it to iGreek
305*b1cdbd2cSJim Jagielski         const SmSym &rSym = *aGreekSymbols[i];
306*b1cdbd2cSJim Jagielski         Font aFont( rSym.GetFace() );
307*b1cdbd2cSJim Jagielski         DBG_ASSERT( aFont.GetItalic() == ITALIC_NONE, "expected Font with ITALIC_NONE, failed." );
308*b1cdbd2cSJim Jagielski         aFont.SetItalic( ITALIC_NORMAL );
309*b1cdbd2cSJim Jagielski         String aSymbolName( (sal_Unicode)'i' );
310*b1cdbd2cSJim Jagielski         aSymbolName += rSym.GetName();
311*b1cdbd2cSJim Jagielski         SmSym aSymbol( aSymbolName, aFont, rSym.GetCharacter(),
312*b1cdbd2cSJim Jagielski 		        aSymbolSetName, sal_True /*bIsPredefined*/ );
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski         AddOrReplaceSymbol( aSymbol );
315*b1cdbd2cSJim Jagielski     }
316*b1cdbd2cSJim Jagielski }
317*b1cdbd2cSJim Jagielski 
Save()318*b1cdbd2cSJim Jagielski void SmSymbolManager::Save()
319*b1cdbd2cSJim Jagielski {
320*b1cdbd2cSJim Jagielski     if (m_bModified)
321*b1cdbd2cSJim Jagielski     {
322*b1cdbd2cSJim Jagielski         SmMathConfig &rCfg = *SM_MOD()->GetConfig();
323*b1cdbd2cSJim Jagielski 
324*b1cdbd2cSJim Jagielski #if 0
325*b1cdbd2cSJim Jagielski         sal_uInt16 nSymbolCount     = GetSymbolCount();
326*b1cdbd2cSJim Jagielski         sal_uInt16 nSaveSymbolCnt   = 0;
327*b1cdbd2cSJim Jagielski         const SmSym **pSymbols  = new const SmSym* [ nSymbolCount ];
328*b1cdbd2cSJim Jagielski         const SmSym **pSym      = pSymbols;
329*b1cdbd2cSJim Jagielski         for (sal_uInt16 j = 0;  j < nSymbolCount;  ++j)
330*b1cdbd2cSJim Jagielski         {
331*b1cdbd2cSJim Jagielski             const SmSym &rSym = *pSymSet->GetSymbol( j );
332*b1cdbd2cSJim Jagielski             if (!rSym.IsDocSymbol())
333*b1cdbd2cSJim Jagielski             {
334*b1cdbd2cSJim Jagielski                 *pSym++ = &rSym;
335*b1cdbd2cSJim Jagielski                 ++nSaveSymbolCnt;
336*b1cdbd2cSJim Jagielski             }
337*b1cdbd2cSJim Jagielski         }
338*b1cdbd2cSJim Jagielski         DBG_ASSERT(pSym - pSymbols == nSaveSymbolCnt, "wrong number of symbols" );
339*b1cdbd2cSJim Jagielski #endif
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski         // prepare to skip symbols from iGreek on saving
342*b1cdbd2cSJim Jagielski         SmLocalizedSymbolData   aLocalizedData;
343*b1cdbd2cSJim Jagielski         String aSymbolSetName( (sal_Unicode) 'i' );
344*b1cdbd2cSJim Jagielski         aSymbolSetName += aLocalizedData.GetUiSymbolSetName( A2OU("Greek") );
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski         SymbolPtrVec_t aTmp( GetSymbols() );
347*b1cdbd2cSJim Jagielski         std::vector< SmSym > aSymbols;
348*b1cdbd2cSJim Jagielski         for (size_t i = 0; i < aTmp.size(); ++i)
349*b1cdbd2cSJim Jagielski         {
350*b1cdbd2cSJim Jagielski             // skip symbols from iGreek set since those symbols always get added
351*b1cdbd2cSJim Jagielski             // by computational means in SmSymbolManager::Load
352*b1cdbd2cSJim Jagielski             if (aTmp[i]->GetSymbolSetName() != aSymbolSetName)
353*b1cdbd2cSJim Jagielski                 aSymbols.push_back( *aTmp[i] );
354*b1cdbd2cSJim Jagielski         }
355*b1cdbd2cSJim Jagielski         rCfg.SetSymbols( aSymbols );
356*b1cdbd2cSJim Jagielski #if 0
357*b1cdbd2cSJim Jagielski         delete [] pSymbols;
358*b1cdbd2cSJim Jagielski #endif
359*b1cdbd2cSJim Jagielski 
360*b1cdbd2cSJim Jagielski         m_bModified = false;
361*b1cdbd2cSJim Jagielski     }
362*b1cdbd2cSJim Jagielski }
363*b1cdbd2cSJim Jagielski 
364*b1cdbd2cSJim Jagielski 
365