xref: /aoo41x/main/starmath/source/dialog.cxx (revision d107581f)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_starmath.hxx"
26 
27 
28 #define SMDLL 1
29 #include "tools/rcid.h"
30 #include <svl/eitem.hxx>
31 #include <svl/intitem.hxx>
32 #include <svl/stritem.hxx>
33 #include <sfx2/app.hxx>
34 #include <vcl/msgbox.hxx>
35 #include <svtools/ctrltool.hxx>
36 #include <sfx2/printer.hxx>
37 #include <vcl/sound.hxx>
38 #include <vcl/sndstyle.hxx>
39 #include <vcl/waitobj.hxx>
40 #include <vcl/settings.hxx>
41 #include <vcl/wall.hxx>
42 #include <sfx2/dispatch.hxx>
43 #include <sfx2/sfx.hrc>
44 #include <tools/string.hxx>
45 #include <tools/debug.hxx>
46 #include <svx/ucsubset.hxx>
47 
48 
49 #include "dialog.hxx"
50 #include "starmath.hrc"
51 #include "config.hxx"
52 #include "dialog.hrc"
53 #include "smmod.hxx"
54 #include "symbol.hxx"
55 #include "view.hxx"
56 #include "document.hxx"
57 #include "unomodel.hxx"
58 
59 
60 using ::rtl::OUString;
61 
62 ////////////////////////////////////////
63 //
64 // Da der FontStyle besser ueber die Attribute gesetzt/abgefragt wird als ueber
65 // den StyleName bauen wir uns hier unsere eigene Uebersetzung
66 // Attribute <-> StyleName
67 //
68 
69 class SmFontStyles
70 {
71     String  aNormal;
72     String  aBold;
73     String  aItalic;
74     String  aBoldItalic;
75     String  aEmpty;
76 
77 public:
78     SmFontStyles();
79 
80     sal_uInt16          GetCount() const    { return 4; }
81     const String &  GetStyleName( const Font &rFont ) const;
82     const String &  GetStyleName( sal_uInt16 nIdx ) const;
83 };
84 
85 
86 SmFontStyles::SmFontStyles() :
87     aNormal ( ResId( RID_FONTREGULAR, *SM_MOD()->GetResMgr() ) ),
88     aBold   ( ResId( RID_FONTBOLD,    *SM_MOD()->GetResMgr() ) ),
89     aItalic ( ResId( RID_FONTITALIC,  *SM_MOD()->GetResMgr() ) )
90 {
91 //    SM_MOD()->GetResMgr().FreeResource();
92 
93     aBoldItalic = aBold;
94     aBoldItalic.AppendAscii( ", " );
95     aBoldItalic += aItalic;
96 }
97 
98 
99 const String & SmFontStyles::GetStyleName( const Font &rFont ) const
100 {
101     //! compare also SmSpecialNode::Prepare
102     sal_Bool bBold   = IsBold( rFont ),
103          bItalic = IsItalic( rFont );
104 
105     if (bBold && bItalic)
106         return aBoldItalic;
107     else if (bItalic)
108         return aItalic;
109     else if (bBold)
110         return aBold;
111     else
112         return aNormal;
113 }
114 
115 
116 const String & SmFontStyles::GetStyleName( sal_uInt16 nIdx ) const
117 {
118     // 0 = "normal",  1 = "italic",
119     // 2 = "bold",    3 = "bold italic"
120 
121 #if OSL_DEBUG_LEVEL > 1
122     DBG_ASSERT( nIdx < GetCount(), "index out of range" );
123 #endif
124     switch (nIdx)
125     {
126         case 0 : return aNormal;
127         case 1 : return aItalic;
128         case 2 : return aBold;
129         case 3 : return aBoldItalic;
130     }
131     return aEmpty;
132 }
133 
134 
135 const SmFontStyles & GetFontStyles()
136 {
137     static const SmFontStyles aImpl;
138     return aImpl;
139 }
140 
141 /////////////////////////////////////////////////////////////////
142 
143 void SetFontStyle(const XubString &rStyleName, Font &rFont)
144 {
145 	// finden des Index passend zum StyleName fuer den leeren StyleName wird
146 	// 0 (nicht bold nicht italic) angenommen.
147 	sal_uInt16  nIndex = 0;
148 	if (rStyleName.Len())
149 	{
150 		sal_uInt16 i;
151         const SmFontStyles &rStyles = GetFontStyles();
152         for (i = 0;  i < rStyles.GetCount();  i++)
153             if (rStyleName.CompareTo( rStyles.GetStyleName(i) ) == COMPARE_EQUAL)
154 				break;
155 #if OSL_DEBUG_LEVEL > 1
156         DBG_ASSERT(i < rStyles.GetCount(), "style-name unknown");
157 #endif
158 		nIndex = i;
159 	}
160 
161 	rFont.SetItalic((nIndex & 0x1) ? ITALIC_NORMAL : ITALIC_NONE);
162 	rFont.SetWeight((nIndex & 0x2) ? WEIGHT_BOLD : WEIGHT_NORMAL);
163 }
164 
165 
166 /**************************************************************************/
167 
168 IMPL_LINK_INLINE_START( SmPrintOptionsTabPage, SizeButtonClickHdl, Button *, EMPTYARG/*pButton*/ )
169 {
170 	aZoom.Enable(aSizeZoomed.IsChecked());
171 	return 0;
172 }
173 IMPL_LINK_INLINE_END( SmPrintOptionsTabPage, SizeButtonClickHdl, Button *, pButton )
174 
175 
176 SmPrintOptionsTabPage::SmPrintOptionsTabPage(Window *pParent, const SfxItemSet &rOptions)
177 	: SfxTabPage(pParent, SmResId(RID_PRINTOPTIONPAGE), rOptions),
178     aFixedLine1     (this, SmResId( FL_PRINTOPTIONS )),
179 	aTitle		   	(this, SmResId( CB_TITLEROW )),
180 	aText		   	(this, SmResId( CB_EQUATION_TEXT )),
181 	aFrame		   	(this, SmResId( CB_FRAME )),
182     aFixedLine2     (this, SmResId( FL_PRINT_FORMAT )),
183 	aSizeNormal    	(this, SmResId( RB_ORIGINAL_SIZE )),
184 	aSizeScaled    	(this, SmResId( RB_FIT_TO_PAGE )),
185 	aSizeZoomed    	(this, SmResId( RB_ZOOM )),
186 	aZoom		   	(this, SmResId( MF_ZOOM )),
187     aFixedLine3     (this, SmResId( FL_MISC_OPTIONS )),
188     aNoRightSpaces  (this, SmResId( CB_IGNORE_SPACING )),
189     aSaveOnlyUsedSymbols  (this, SmResId( CB_SAVE_ONLY_USED_SYMBOLS ))
190 {
191 	FreeResource();
192 
193 	aSizeNormal.SetClickHdl(LINK(this, SmPrintOptionsTabPage, SizeButtonClickHdl));
194 	aSizeScaled.SetClickHdl(LINK(this, SmPrintOptionsTabPage, SizeButtonClickHdl));
195 	aSizeZoomed.SetClickHdl(LINK(this, SmPrintOptionsTabPage, SizeButtonClickHdl));
196 
197 	Reset(rOptions);
198 }
199 
200 
201 sal_Bool SmPrintOptionsTabPage::FillItemSet(SfxItemSet& rSet)
202 {
203 	sal_uInt16  nPrintSize;
204 	if (aSizeNormal.IsChecked())
205 		nPrintSize = PRINT_SIZE_NORMAL;
206 	else if (aSizeScaled.IsChecked())
207 		nPrintSize = PRINT_SIZE_SCALED;
208 	else
209 		nPrintSize = PRINT_SIZE_ZOOMED;
210 
211 	rSet.Put(SfxUInt16Item(GetWhich(SID_PRINTSIZE), (sal_uInt16) nPrintSize));
212 	rSet.Put(SfxUInt16Item(GetWhich(SID_PRINTZOOM), (sal_uInt16) aZoom.GetValue()));
213 	rSet.Put(SfxBoolItem(GetWhich(SID_PRINTTITLE), aTitle.IsChecked()));
214 	rSet.Put(SfxBoolItem(GetWhich(SID_PRINTTEXT), aText.IsChecked()));
215 	rSet.Put(SfxBoolItem(GetWhich(SID_PRINTFRAME), aFrame.IsChecked()));
216 	rSet.Put(SfxBoolItem(GetWhich(SID_NO_RIGHT_SPACES), aNoRightSpaces.IsChecked()));
217     rSet.Put(SfxBoolItem(GetWhich(SID_SAVE_ONLY_USED_SYMBOLS), aSaveOnlyUsedSymbols.IsChecked()));
218 
219 	return sal_True;
220 }
221 
222 
223 void SmPrintOptionsTabPage::Reset(const SfxItemSet& rSet)
224 {
225 	SmPrintSize ePrintSize = (SmPrintSize)((const SfxUInt16Item &)rSet.Get(GetWhich(SID_PRINTSIZE))).GetValue();
226 
227 	aSizeNormal.Check(ePrintSize == PRINT_SIZE_NORMAL);
228 	aSizeScaled.Check(ePrintSize == PRINT_SIZE_SCALED);
229 	aSizeZoomed.Check(ePrintSize == PRINT_SIZE_ZOOMED);
230 
231 	aZoom.Enable(aSizeZoomed.IsChecked());
232 
233 	aZoom.SetValue(((const SfxUInt16Item &)rSet.Get(GetWhich(SID_PRINTZOOM))).GetValue());
234 
235 	aTitle.Check(((const SfxBoolItem &)rSet.Get(GetWhich(SID_PRINTTITLE))).GetValue());
236 	aText.Check(((const SfxBoolItem &)rSet.Get(GetWhich(SID_PRINTTEXT))).GetValue());
237 	aFrame.Check(((const SfxBoolItem &)rSet.Get(GetWhich(SID_PRINTFRAME))).GetValue());
238 	aNoRightSpaces.Check(((const SfxBoolItem &)rSet.Get(GetWhich(SID_NO_RIGHT_SPACES))).GetValue());
239     aSaveOnlyUsedSymbols.Check(((const SfxBoolItem &)rSet.Get(GetWhich(SID_SAVE_ONLY_USED_SYMBOLS))).GetValue());
240 }
241 
242 
243 SfxTabPage* SmPrintOptionsTabPage::Create(Window* pWindow, const SfxItemSet& rSet)
244 {
245 	return (new SmPrintOptionsTabPage(pWindow, rSet));
246 }
247 
248 /**************************************************************************/
249 
250 
251 void SmShowFont::Paint(const Rectangle& rRect )
252 {
253     Control::Paint( rRect );
254 
255 	XubString	Text (GetFont().GetName());
256 	Size	TextSize(GetTextWidth(Text), GetTextHeight());
257 
258 	DrawText(Point((GetOutputSize().Width()  - TextSize.Width())  / 2,
259 				   (GetOutputSize().Height() - TextSize.Height()) / 2), Text);
260 }
261 
262 
263 void SmShowFont::SetFont(const Font& rFont)
264 {
265     Color aTxtColor( GetTextColor() );
266 	Font aFont (rFont);
267 
268 	Invalidate();
269 	aFont.SetSize(Size(0, 24));
270 	aFont.SetAlign(ALIGN_TOP);
271 	Control::SetFont(aFont);
272 
273     // keep old text color (new font may have different color)
274     SetTextColor( aTxtColor );
275 }
276 
277 
278 IMPL_LINK_INLINE_START( SmFontDialog, FontSelectHdl, ComboBox *, pComboBox )
279 {
280 	Face.SetName(pComboBox->GetText());
281 	aShowFont.SetFont(Face);
282 	return 0;
283 }
284 IMPL_LINK_INLINE_END( SmFontDialog, FontSelectHdl, ComboBox *, pComboBox )
285 
286 
287 IMPL_LINK( SmFontDialog, FontModifyHdl, ComboBox *, pComboBox )
288 {
289 	// if font is available in list then use it
290 	sal_uInt16 nPos = pComboBox->GetEntryPos( pComboBox->GetText() );
291 	if (COMBOBOX_ENTRY_NOTFOUND != nPos)
292 	{
293 		FontSelectHdl( pComboBox );
294 	}
295 	return 0;
296 }
297 
298 
299 IMPL_LINK( SmFontDialog, AttrChangeHdl, CheckBox *, EMPTYARG /*pCheckBox*/ )
300 {
301 	if (aBoldCheckBox.IsChecked())
302 		Face.SetWeight(FontWeight(WEIGHT_BOLD));
303 	else
304 		Face.SetWeight(FontWeight(WEIGHT_NORMAL));
305 
306 	if (aItalicCheckBox.IsChecked())
307 		Face.SetItalic(ITALIC_NORMAL);
308 	else
309 		Face.SetItalic(ITALIC_NONE);
310 
311 	aShowFont.SetFont(Face);
312 	return 0;
313 }
314 
315 
316 void SmFontDialog::SetFont(const Font &rFont)
317 {
318 	Face = rFont;
319 
320     aFontBox.SetText( Face.GetName() );
321     aBoldCheckBox.Check( IsBold( Face ) );
322     aItalicCheckBox.Check( IsItalic( Face ) );
323 
324 	aShowFont.SetFont(Face);
325 }
326 
327 
328 SmFontDialog::SmFontDialog(Window * pParent,
329         OutputDevice *pFntListDevice, sal_Bool bHideCheckboxes, sal_Bool bFreeRes)
330 	: ModalDialog(pParent,SmResId(RID_FONTDIALOG)),
331 	aFixedText1 	(this, SmResId(1)),
332 	aFontBox		(this, SmResId(1)),
333 	aBoldCheckBox	(this, SmResId(1)),
334 	aItalicCheckBox (this, SmResId(2)),
335 	aOKButton1		(this, SmResId(1)),
336 	aCancelButton1	(this, SmResId(1)),
337 	aShowFont		(this, SmResId(1)),
338     aFixedText2     (this, SmResId(2))
339 {
340 	if (bFreeRes)
341 		FreeResource();
342 
343 	{
344 		WaitObject( this );
345 
346         FontList aFontList( pFntListDevice );
347 
348         sal_uInt16  nCount = aFontList.GetFontNameCount();
349 		for (sal_uInt16 i = 0;  i < nCount;  i++)
350             aFontBox.InsertEntry( aFontList.GetFontName(i).GetName() );
351 
352 		Face.SetSize(Size(0, 24));
353 		Face.SetWeight(WEIGHT_NORMAL);
354 		Face.SetItalic(ITALIC_NONE);
355 		Face.SetFamily(FAMILY_DONTKNOW);
356 		Face.SetPitch(PITCH_DONTKNOW);
357 		Face.SetCharSet(RTL_TEXTENCODING_DONTKNOW);
358 		Face.SetTransparent(sal_True);
359 
360         InitColor_Impl();
361 
362         // preview like controls should have a 2D look
363         aShowFont.SetBorderStyle( WINDOW_BORDER_MONO );
364 	}
365 
366 	aFontBox.SetSelectHdl(LINK(this, SmFontDialog, FontSelectHdl));
367 	aFontBox.SetModifyHdl(LINK(this, SmFontDialog, FontModifyHdl));
368 	aBoldCheckBox.SetClickHdl(LINK(this, SmFontDialog, AttrChangeHdl));
369 	aItalicCheckBox.SetClickHdl(LINK(this, SmFontDialog, AttrChangeHdl));
370 
371     if (bHideCheckboxes)
372     {
373         aBoldCheckBox.Check( sal_False );
374         aBoldCheckBox.Enable( sal_False );
375         aBoldCheckBox.Show( sal_False );
376         aItalicCheckBox.Check( sal_False );
377         aItalicCheckBox.Enable( sal_False );
378         aItalicCheckBox.Show( sal_False );
379         aFixedText2.Show( sal_False );
380 
381         Size  aSize( aFontBox.GetSizePixel() );
382         long nComboBoxBottom = aFontBox.GetPosPixel().Y() + aFontBox.GetSizePixel().Height();
383         long nCheckBoxBottom = aItalicCheckBox.GetPosPixel().Y() + aItalicCheckBox.GetSizePixel().Height();
384         aSize.Height() += nCheckBoxBottom - nComboBoxBottom;
385         aFontBox.SetSizePixel( aSize );
386     }
387 }
388 
389 void SmFontDialog::InitColor_Impl()
390 {
391 #if OSL_DEBUG_LEVEL > 1
392     Color aBC( GetDisplayBackground().GetColor() );
393 #endif
394     ColorData   nBgCol  = COL_WHITE,
395                 nTxtCol = COL_BLACK;
396     const StyleSettings &rS = GetSettings().GetStyleSettings();
397     if (rS.GetHighContrastMode())
398     {
399         nBgCol  = rS.GetFieldColor().GetColor();
400         nTxtCol = rS.GetFieldTextColor().GetColor();
401     }
402 
403     Color aTmpColor( nBgCol );
404     Wallpaper aWall( aTmpColor );
405     Color aTxtColor( nTxtCol );
406     aShowFont.SetBackground( aWall );
407     aShowFont.SetTextColor( aTxtColor );
408 }
409 
410 
411 void SmFontDialog::DataChanged( const DataChangedEvent& rDCEvt )
412 {
413     if ( rDCEvt.GetType() == DATACHANGED_SETTINGS  &&
414          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
415             InitColor_Impl();
416 
417     ModalDialog::DataChanged( rDCEvt );
418 }
419 
420 /**************************************************************************/
421 
422 
423 IMPL_LINK( SmFontSizeDialog, DefaultButtonClickHdl, Button *, EMPTYARG /*pButton*/ )
424 {
425 	QueryBox *pQueryBox = new QueryBox(this, SmResId(RID_DEFAULTSAVEQUERY));
426 
427 	if (pQueryBox->Execute() == RET_YES)
428 	{
429         SmModule *pp = SM_MOD();
430         SmFormat aFmt( pp->GetConfig()->GetStandardFormat() );
431         WriteTo( aFmt );
432         pp->GetConfig()->SetStandardFormat( aFmt );
433 	}
434 
435 	delete pQueryBox;
436 	return 0;
437 }
438 
439 
440 SmFontSizeDialog::SmFontSizeDialog(Window * pParent, sal_Bool bFreeRes)
441 	: ModalDialog(pParent, SmResId(RID_FONTSIZEDIALOG)),
442 	aFixedText1(this, SmResId(1)),
443 	aBaseSize(this, SmResId(1)),
444 	aFixedText4(this, SmResId(4)),
445 	aTextSize(this, SmResId(4)),
446 	aFixedText5(this, SmResId(5)),
447 	aIndexSize(this, SmResId(5)),
448 	aFixedText6(this, SmResId(6)),
449 	aFunctionSize(this, SmResId(6)),
450 	aFixedText7(this, SmResId(7)),
451 	aOperatorSize(this, SmResId(7)),
452 	aFixedText8(this, SmResId(8)),
453 	aBorderSize(this, SmResId(8)),
454     aFixedLine1(this, SmResId(1)),
455 	aOKButton1(this, SmResId(1)),
456 	aCancelButton1(this, SmResId(1)),
457 	aDefaultButton(this, SmResId(1))
458 {
459 	if (bFreeRes)
460 		FreeResource();
461 
462 	aDefaultButton.SetClickHdl(LINK(this, SmFontSizeDialog, DefaultButtonClickHdl));
463 }
464 
465 
466 void SmFontSizeDialog::ReadFrom(const SmFormat &rFormat)
467 {
468 	//! aufpassen: richtig runden!
469 	aBaseSize.SetValue( SmRoundFraction(
470 		Sm100th_mmToPts( rFormat.GetBaseSize().Height() ) ) );
471 
472 	aTextSize    .SetValue( rFormat.GetRelSize(SIZ_TEXT) );
473 	aIndexSize   .SetValue( rFormat.GetRelSize(SIZ_INDEX) );
474 	aFunctionSize.SetValue( rFormat.GetRelSize(SIZ_FUNCTION) );
475 	aOperatorSize.SetValue( rFormat.GetRelSize(SIZ_OPERATOR) );
476 	aBorderSize  .SetValue( rFormat.GetRelSize(SIZ_LIMITS) );
477 }
478 
479 
480 void SmFontSizeDialog::WriteTo(SmFormat &rFormat) const
481 {
482     rFormat.SetBaseSize( Size(0, SmPtsTo100th_mm( static_cast< long >(aBaseSize.GetValue()))) );
483 
484 	rFormat.SetRelSize(SIZ_TEXT, 	 (sal_uInt16) aTextSize    .GetValue());
485 	rFormat.SetRelSize(SIZ_INDEX,	 (sal_uInt16) aIndexSize   .GetValue());
486 	rFormat.SetRelSize(SIZ_FUNCTION, (sal_uInt16) aFunctionSize.GetValue());
487 	rFormat.SetRelSize(SIZ_OPERATOR, (sal_uInt16) aOperatorSize.GetValue());
488 	rFormat.SetRelSize(SIZ_LIMITS,	 (sal_uInt16) aBorderSize  .GetValue());
489 
490 	const Size aTmp (rFormat.GetBaseSize());
491 	for (sal_uInt16  i = FNT_BEGIN;  i <= FNT_END;  i++)
492         rFormat.SetFontSize(i, aTmp);
493 
494 	rFormat.RequestApplyChanges();
495 }
496 
497 
498 /**************************************************************************/
499 
500 
501 IMPL_LINK( SmFontTypeDialog, MenuSelectHdl, Menu *, pMenu )
502 {
503 	SmFontPickListBox *pActiveListBox;
504 
505     sal_Bool bHideCheckboxes = sal_False;
506 	switch (pMenu->GetCurItemId())
507 	{
508         case 1: pActiveListBox = &aVariableFont; break;
509 		case 2: pActiveListBox = &aFunctionFont; break;
510 		case 3: pActiveListBox = &aNumberFont;	 break;
511 		case 4: pActiveListBox = &aTextFont;	 break;
512         case 5: pActiveListBox = &aSerifFont; bHideCheckboxes = sal_True;   break;
513         case 6: pActiveListBox = &aSansFont;  bHideCheckboxes = sal_True;   break;
514         case 7: pActiveListBox = &aFixedFont; bHideCheckboxes = sal_True;   break;
515 		default:pActiveListBox = NULL;
516 	}
517 
518 	if (pActiveListBox)
519 	{
520         SmFontDialog *pFontDialog = new SmFontDialog(this, pFontListDev, bHideCheckboxes);
521 
522 		pActiveListBox->WriteTo(*pFontDialog);
523 		if (pFontDialog->Execute() == RET_OK)
524 			pActiveListBox->ReadFrom(*pFontDialog);
525 		delete pFontDialog;
526 	}
527 	return 0;
528 }
529 
530 
531 IMPL_LINK_INLINE_START( SmFontTypeDialog, DefaultButtonClickHdl, Button *, EMPTYARG /*pButton*/ )
532 {
533 	QueryBox *pQueryBox = new QueryBox(this, SmResId(RID_DEFAULTSAVEQUERY));
534 	if (pQueryBox->Execute() == RET_YES)
535 	{
536         SmModule *pp = SM_MOD();
537         SmFormat aFmt( pp->GetConfig()->GetStandardFormat() );
538         WriteTo( aFmt );
539         pp->GetConfig()->SetStandardFormat( aFmt, sal_True );
540 	}
541 
542 	delete pQueryBox;
543 	return 0;
544 }
545 IMPL_LINK_INLINE_END( SmFontTypeDialog, DefaultButtonClickHdl, Button *, pButton )
546 
547 
548 SmFontTypeDialog::SmFontTypeDialog(Window * pParent, OutputDevice *pFntListDevice, sal_Bool bFreeRes)
549 	: ModalDialog(pParent, SmResId(RID_FONTTYPEDIALOG)),
550 	aFixedText1    (this, SmResId(1)),
551 	aVariableFont  (this, SmResId(1)),
552 	aFixedText2    (this, SmResId(2)),
553 	aFunctionFont  (this, SmResId(2)),
554 	aFixedText3    (this, SmResId(3)),
555 	aNumberFont    (this, SmResId(3)),
556 	aFixedText4    (this, SmResId(4)),
557 	aTextFont	   (this, SmResId(4)),
558 	aFixedText5    (this, SmResId(5)),
559 	aSerifFont	   (this, SmResId(5)),
560 	aFixedText6    (this, SmResId(6)),
561 	aSansFont	   (this, SmResId(6)),
562 	aFixedText7    (this, SmResId(7)),
563 	aFixedFont	   (this, SmResId(7)),
564     aFixedLine1    (this, SmResId(1)),
565     aFixedLine2    (this, SmResId(2)),
566 	aOKButton1	   (this, SmResId(1)),
567 	aCancelButton1 (this, SmResId(1)),
568 	aMenuButton    (this, SmResId(1)),
569     aDefaultButton (this, SmResId(2)),
570     pFontListDev    (pFntListDevice)
571 {
572 	if (bFreeRes)
573 		FreeResource();
574 
575 	aDefaultButton.SetClickHdl(LINK(this, SmFontTypeDialog, DefaultButtonClickHdl));
576 
577 	aMenuButton.GetPopupMenu()->SetSelectHdl(LINK(this, SmFontTypeDialog, MenuSelectHdl));
578 }
579 
580 void SmFontTypeDialog::ReadFrom(const SmFormat &rFormat)
581 {
582     SmModule *pp = SM_MOD();
583 
584 	aVariableFont = pp->GetConfig()->GetFontPickList(FNT_VARIABLE);
585 	aFunctionFont = pp->GetConfig()->GetFontPickList(FNT_FUNCTION);
586 	aNumberFont   = pp->GetConfig()->GetFontPickList(FNT_NUMBER);
587 	aTextFont	  = pp->GetConfig()->GetFontPickList(FNT_TEXT);
588 	aSerifFont	  = pp->GetConfig()->GetFontPickList(FNT_SERIF);
589 	aSansFont	  = pp->GetConfig()->GetFontPickList(FNT_SANS);
590 	aFixedFont	  = pp->GetConfig()->GetFontPickList(FNT_FIXED);
591 
592 	aVariableFont.Insert( rFormat.GetFont(FNT_VARIABLE) );
593 	aFunctionFont.Insert( rFormat.GetFont(FNT_FUNCTION) );
594 	aNumberFont  .Insert( rFormat.GetFont(FNT_NUMBER) );
595 	aTextFont    .Insert( rFormat.GetFont(FNT_TEXT) );
596 	aSerifFont   .Insert( rFormat.GetFont(FNT_SERIF) );
597 	aSansFont    .Insert( rFormat.GetFont(FNT_SANS) );
598 	aFixedFont   .Insert( rFormat.GetFont(FNT_FIXED) );
599 }
600 
601 
602 void SmFontTypeDialog::WriteTo(SmFormat &rFormat) const
603 {
604     SmModule *pp = SM_MOD();
605 
606 	pp->GetConfig()->GetFontPickList(FNT_VARIABLE) = aVariableFont;
607 	pp->GetConfig()->GetFontPickList(FNT_FUNCTION) = aFunctionFont;
608 	pp->GetConfig()->GetFontPickList(FNT_NUMBER)   = aNumberFont;
609 	pp->GetConfig()->GetFontPickList(FNT_TEXT)	   = aTextFont;
610 	pp->GetConfig()->GetFontPickList(FNT_SERIF)    = aSerifFont;
611 	pp->GetConfig()->GetFontPickList(FNT_SANS)	   = aSansFont;
612 	pp->GetConfig()->GetFontPickList(FNT_FIXED)    = aFixedFont;
613 
614 	rFormat.SetFont( FNT_VARIABLE, aVariableFont.Get(0) );
615 	rFormat.SetFont( FNT_FUNCTION, aFunctionFont.Get(0) );
616 	rFormat.SetFont( FNT_NUMBER,   aNumberFont  .Get(0) );
617 	rFormat.SetFont( FNT_TEXT,     aTextFont    .Get(0) );
618 	rFormat.SetFont( FNT_SERIF,    aSerifFont   .Get(0) );
619 	rFormat.SetFont( FNT_SANS,     aSansFont    .Get(0) );
620 	rFormat.SetFont( FNT_FIXED,    aFixedFont   .Get(0) );
621 
622 	rFormat.RequestApplyChanges();
623 }
624 
625 /**************************************************************************/
626 
627 struct FieldMinMax
628 {
629 	sal_uInt16 nMin, nMax;
630 };
631 
632 // Data for min and max values of the 4 metric fields
633 // for each of the 10 categories
634 static const FieldMinMax pMinMaxData[10][4] =
635 {
636 	// 0
637 	{{ 0, 200 },	{ 0, 200 },		{ 0, 100 },		{ 0, 0 }},
638 	// 1
639 	{{ 0, 100 },	{ 0, 100 },		{ 0, 0 },		{ 0, 0 }},
640 	// 2
641 	{{ 0, 100 },	{ 0, 100 },		{ 0, 0 },		{ 0, 0 }},
642 	// 3
643 	{{ 0, 100 },	{ 1, 100 },		{ 0, 0 },		{ 0, 0 }},
644 	// 4
645 	{{ 0, 100 },	{ 0, 100 },		{ 0, 0 },		{ 0, 0 }},
646 	// 5
647 	{{ 0, 100 },	{ 0, 100 },		{ 0, 0 },		{ 0, 100 }},
648 	// 6
649 	{{ 0, 300 },	{ 0, 300 },		{ 0, 0 },		{ 0, 0 }},
650 	// 7
651 	{{ 0, 100 },	{ 0, 100 },		{ 0, 0 },		{ 0, 0 }},
652 	// 8
653 	{{ 0, 100 },	{ 0, 100 },		{ 0, 0 },		{ 0, 0 }},
654 	// 9
655 	{{ 0, 10000 },	{ 0, 10000 },	{ 0, 10000 },	{ 0, 10000 }}
656 };
657 
658 SmCategoryDesc::SmCategoryDesc(const ResId& rResId, sal_uInt16 nCategoryIdx) :
659     Resource(rResId),
660     bIsHighContrast(sal_False)
661 {
662 	if (IsAvailableRes(ResId(1,*rResId.GetResMgr()).SetRT(RSC_STRING)))
663 	{
664 		Name = XubString(ResId(1,*rResId.GetResMgr()));
665 
666 		int i;
667 		for (i = 0; i < 4; i++)
668 		{
669 			int nI2 = i + 2;
670 
671 			if (IsAvailableRes(ResId(nI2,*rResId.GetResMgr()).SetRT(RSC_STRING)))
672 			{
673 				Strings  [i] = new XubString(ResId(nI2,*rResId.GetResMgr()));
674 				Graphics [i] = new Bitmap(ResId(10*nI2,*rResId.GetResMgr()));
675 				GraphicsH[i] = new Bitmap(ResId(10*nI2+1,*rResId.GetResMgr()));
676 			}
677 			else
678 			{
679 				Strings  [i] = 0;
680 				Graphics [i] = 0;
681 				GraphicsH[i] = 0;
682 			}
683 		}
684 
685 		for (i = 0; i < 4; i++)
686 		{
687 			const FieldMinMax &rMinMax = pMinMaxData[ nCategoryIdx ][i];
688 			Value[i] = Minimum[i] = rMinMax.nMin;
689 			Maximum[i] = rMinMax.nMax;
690 		}
691 	}
692 
693 	FreeResource();
694 }
695 
696 
697 SmCategoryDesc::~SmCategoryDesc()
698 {
699 	for (int i = 0; i < 4; i++)
700 	{
701         delete Strings  [i];
702         delete Graphics [i];
703         delete GraphicsH[i];
704 	}
705 }
706 
707 /**************************************************************************/
708 
709 IMPL_LINK( SmDistanceDialog, GetFocusHdl, Control *, pControl )
710 {
711 	if (Categories[nActiveCategory])
712 	{
713 		sal_uInt16	i;
714 
715 		if (pControl == &aMetricField1)
716 			i = 0;
717 		else if (pControl == &aMetricField2)
718 			i = 1;
719 		else if (pControl == &aMetricField3)
720 			i = 2;
721 		else if (pControl == &aMetricField4)
722 			i = 3;
723 		else
724 			return 0;
725 		aBitmap.SetBitmap(*(Categories[nActiveCategory]->GetGraphic(i)));
726 	}
727 	return 0;
728 }
729 
730 IMPL_LINK( SmDistanceDialog, MenuSelectHdl, Menu *, pMenu )
731 {
732 	SetCategory(pMenu->GetCurItemId() - 1);
733 	return 0;
734 }
735 
736 
737 IMPL_LINK( SmDistanceDialog, DefaultButtonClickHdl, Button *, EMPTYARG /*pButton*/ )
738 {
739 	QueryBox *pQueryBox = new QueryBox(this, SmResId(RID_DEFAULTSAVEQUERY));
740 
741 	if (pQueryBox->Execute() == RET_YES)
742 	{
743         SmModule *pp = SM_MOD();
744         SmFormat aFmt( pp->GetConfig()->GetStandardFormat() );
745         WriteTo( aFmt );
746         pp->GetConfig()->SetStandardFormat( aFmt );
747 	}
748 	delete pQueryBox;
749 	return 0;
750 }
751 
752 
753 IMPL_LINK( SmDistanceDialog, CheckBoxClickHdl, CheckBox *, pCheckBox )
754 {
755 	if (pCheckBox == &aCheckBox1)
756 	{
757 		aCheckBox1.Toggle();
758 
759 		sal_Bool bChecked = aCheckBox1.IsChecked();
760 		aFixedText4  .Enable( bChecked );
761 		aMetricField4.Enable( bChecked );
762 	}
763 	return 0;
764 }
765 
766 
767 void SmDistanceDialog::SetHelpId(MetricField &rField, const rtl::OString& sHelpId)
768 {
769     //! HelpID's die auf diese Weise explizit gesetzt werden, muessen im
770 	//! util Verzeichnis im File "hidother.src" mit Hilfe von "hidspecial"
771 	//! definiert werden!
772 
773 	const XubString aEmptyText;
774 #if OSL_DEBUG_LEVEL > 1
775 	DBG_ASSERT(aEmptyText.Len() == 0, "Sm: Ooops...");
776 #endif
777 
778 	rField.SetHelpId(sHelpId);
779 	rField.SetHelpText(aEmptyText);
780 
781 	// since MetricField inherits from SpinField which has a sub Edit field
782 	// (which is actually the one we modify) we have to set the help-id
783 	// for it too.
784 	Edit *pSubEdit = rField.GetSubEdit();
785 	if (pSubEdit)
786 	{
787 	    pSubEdit->SetHelpId(sHelpId);
788 		pSubEdit->SetHelpText(aEmptyText);
789 	}
790 }
791 
792 
793 void SmDistanceDialog::SetCategory(sal_uInt16 nCategory)
794 {
795 #if OSL_DEBUG_LEVEL > 1
796 	DBG_ASSERT(/*0 <= nCategory  &&*/  nCategory < NOCATEGORIES,
797 		"Sm: falsche Kategorienummer in SmDistanceDialog");
798 #endif
799 
800 	// array to convert category- and metricfield-number in help ids.
801 	// 0 is used in case of unused combinations.
802 #if OSL_DEBUG_LEVEL > 1
803     DBG_ASSERT(NOCATEGORIES == 10, "Sm : Array passt nicht zu Anzahl der Kategorien");
804 #endif
805     const char* __READONLY_DATA  aCatMf2Hid[10][4] =
806 	{
807         { HID_SMA_DEFAULT_DIST,         HID_SMA_LINE_DIST,          HID_SMA_ROOT_DIST, 0 },
808         { HID_SMA_SUP_DIST,             HID_SMA_SUB_DIST ,          0, 0 },
809         { HID_SMA_NUMERATOR_DIST,       HID_SMA_DENOMINATOR_DIST,   0, 0 },
810         { HID_SMA_FRACLINE_EXCWIDTH,    HID_SMA_FRACLINE_LINEWIDTH, 0, 0 },
811         { HID_SMA_UPPERLIMIT_DIST,      HID_SMA_LOWERLIMIT_DIST,    0, 0 },
812         { HID_SMA_BRACKET_EXCHEIGHT,    HID_SMA_BRACKET_DIST,       0, HID_SMA_BRACKET_EXCHEIGHT2 },
813         { HID_SMA_MATRIXROW_DIST,       HID_SMA_MATRIXCOL_DIST,     0, 0 },
814         { HID_SMA_ATTRIBUT_DIST,        HID_SMA_INTERATTRIBUT_DIST, 0, 0 },
815         { HID_SMA_OPERATOR_EXCHEIGHT,   HID_SMA_OPERATOR_DIST,      0, 0 },
816         { HID_SMA_LEFTBORDER_DIST,      HID_SMA_RIGHTBORDER_DIST,   HID_SMA_UPPERBORDER_DIST, HID_SMA_LOWERBORDER_DIST }
817 	};
818 
819 	// array to help iterate over the controls
820 	Window * __READONLY_DATA  aWin[4][2] =
821 	{
822         { &aFixedText1,  &aMetricField1 },
823         { &aFixedText2,  &aMetricField2 },
824         { &aFixedText3,  &aMetricField3 },
825         { &aFixedText4,  &aMetricField4 }
826 	};
827 
828 	SmCategoryDesc *pCat;
829 
830 	// merken der (evtl neuen) Einstellungen der aktiven SmCategoryDesc
831 	// bevor zu der neuen gewechselt wird.
832 	if (nActiveCategory != CATEGORY_NONE)
833 	{
834 		pCat = Categories[nActiveCategory];
835 		pCat->SetValue(0, (sal_uInt16) aMetricField1.GetValue());
836 		pCat->SetValue(1, (sal_uInt16) aMetricField2.GetValue());
837 		pCat->SetValue(2, (sal_uInt16) aMetricField3.GetValue());
838 		pCat->SetValue(3, (sal_uInt16) aMetricField4.GetValue());
839 
840 		if (nActiveCategory == 5)
841 			bScaleAllBrackets = aCheckBox1.IsChecked();
842 
843 		aMenuButton.GetPopupMenu()->CheckItem(nActiveCategory + 1, sal_False);
844 	}
845 
846     // aktivieren/deaktivieren der zugehoerigen Controls in Abhaengigkeit von der
847     // gewaehlten Kategorie.
848 	sal_Bool  bActive;
849     for (sal_uInt16 i = 0;  i < 4;  i++)
850 	{
851 		FixedText   *pFT = (FixedText * const)   aWin[i][0];
852 		MetricField *pMF = (MetricField * const) aWin[i][1];
853 
854 		// Um feststellen welche Controls aktiv sein sollen wird das
855         // vorhandensein einer zugehoerigen HelpID ueberprueft.
856 		bActive = aCatMf2Hid[nCategory][i] != 0;
857 
858 		pFT->Show(bActive);
859 		pFT->Enable(bActive);
860 		pMF->Show(bActive);
861 		pMF->Enable(bActive);
862 
863         // setzen von Masseinheit und Anzahl der Nachkommastellen
864 		FieldUnit  eUnit;
865 		sal_uInt16     nDigits;
866 		if (nCategory < 9)
867 		{
868 			eUnit   = FUNIT_CUSTOM;
869 			nDigits = 0;
870 			pMF->SetCustomUnitText( '%' );
871 		}
872 		else
873 		{
874 			eUnit   = FUNIT_100TH_MM;
875 			nDigits = 2;
876 		}
877         pMF->SetUnit(eUnit);            //! veraendert den Wert
878 		pMF->SetDecimalDigits(nDigits);
879 
880 		if (bActive)
881 		{
882 			pCat = Categories[nCategory];
883 			pFT->SetText(*pCat->GetString(i));
884 
885 			pMF->SetMin(pCat->GetMinimum(i));
886 			pMF->SetMax(pCat->GetMaximum(i));
887 			pMF->SetValue(pCat->GetValue(i));
888 
889 			SetHelpId(*pMF, aCatMf2Hid[nCategory][i]);
890 		}
891 	}
892     // nun noch die CheckBox und das zugehoerige MetricField genau dann aktivieren,
893 	// falls es sich um das Klammer Menu handelt.
894 	bActive = nCategory == 5;
895 	aCheckBox1.Show(bActive);
896 	aCheckBox1.Enable(bActive);
897 	if (bActive)
898 	{
899 		aCheckBox1.Check( bScaleAllBrackets );
900 
901 		sal_Bool bChecked = aCheckBox1.IsChecked();
902 		aFixedText4  .Enable( bChecked );
903 		aMetricField4.Enable( bChecked );
904 	}
905 
906 	aMenuButton.GetPopupMenu()->CheckItem(nCategory + 1, sal_True);
907     aFixedLine.SetText(Categories[nCategory]->GetName());
908 
909 	nActiveCategory = nCategory;
910 
911 	aMetricField1.GrabFocus();
912 	Invalidate();
913 	Update();
914 }
915 
916 
917 SmDistanceDialog::SmDistanceDialog(Window *pParent, sal_Bool bFreeRes)
918 	: ModalDialog(pParent, SmResId(RID_DISTANCEDIALOG)),
919     aFixedText1    (this, SmResId(1)),
920     aMetricField1  (this, SmResId(1)),
921     aFixedText2    (this, SmResId(2)),
922     aMetricField2  (this, SmResId(2)),
923     aFixedText3    (this, SmResId(3)),
924     aMetricField3  (this, SmResId(3)),
925     aCheckBox1     (this, SmResId(1)),
926     aFixedText4    (this, SmResId(4)),
927     aMetricField4  (this, SmResId(4)),
928     aOKButton1     (this, SmResId(1)),
929     aCancelButton1 (this, SmResId(1)),
930     aMenuButton    (this, SmResId(1)),
931     aDefaultButton (this, SmResId(1)),
932     aBitmap        (this, SmResId(1)),
933     aFixedLine     (this, SmResId(1))
934 {
935     for (sal_uInt16 i = 0; i < NOCATEGORIES; i++)
936 		Categories[i] = new SmCategoryDesc(SmResId(i + 1), i);
937 	nActiveCategory   = CATEGORY_NONE;
938 	bScaleAllBrackets = sal_False;
939 
940 	if (bFreeRes)
941 		FreeResource();
942 
943     ApplyImages();
944 
945     // preview like controls should have a 2D look
946     aBitmap.SetBorderStyle( WINDOW_BORDER_MONO );
947 
948 	aMetricField1.SetGetFocusHdl(LINK(this, SmDistanceDialog, GetFocusHdl));
949 	aMetricField2.SetGetFocusHdl(LINK(this, SmDistanceDialog, GetFocusHdl));
950 	aMetricField3.SetGetFocusHdl(LINK(this, SmDistanceDialog, GetFocusHdl));
951 	aMetricField4.SetGetFocusHdl(LINK(this, SmDistanceDialog, GetFocusHdl));
952 	aCheckBox1.SetClickHdl(LINK(this, SmDistanceDialog, CheckBoxClickHdl));
953 
954 	aMenuButton.GetPopupMenu()->SetSelectHdl(LINK(this, SmDistanceDialog, MenuSelectHdl));
955 
956 	aDefaultButton.SetClickHdl(LINK(this, SmDistanceDialog, DefaultButtonClickHdl));
957 }
958 
959 
960 SmDistanceDialog::~SmDistanceDialog()
961 {
962 	for (int i = 0; i < NOCATEGORIES; i++)
963 		DELETEZ(Categories[i]);
964 }
965 
966 void SmDistanceDialog::ApplyImages()
967 {
968     sal_Bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
969     for (int i = 0;  i < NOCATEGORIES;  ++i)
970     {
971         SmCategoryDesc *pCat = Categories[i];
972         if (pCat)
973             pCat->SetHighContrast( bHighContrast );
974     }
975 }
976 
977 void SmDistanceDialog::DataChanged( const DataChangedEvent &rEvt )
978 {
979     if ( (rEvt.GetType() == DATACHANGED_SETTINGS) && (rEvt.GetFlags() & SETTINGS_STYLE) )
980             ApplyImages();
981 
982     ModalDialog::DataChanged( rEvt );
983 }
984 
985 void SmDistanceDialog::ReadFrom(const SmFormat &rFormat)
986 {
987 	Categories[0]->SetValue(0, rFormat.GetDistance(DIS_HORIZONTAL));
988 	Categories[0]->SetValue(1, rFormat.GetDistance(DIS_VERTICAL));
989 	Categories[0]->SetValue(2, rFormat.GetDistance(DIS_ROOT));
990 	Categories[1]->SetValue(0, rFormat.GetDistance(DIS_SUPERSCRIPT));
991 	Categories[1]->SetValue(1, rFormat.GetDistance(DIS_SUBSCRIPT));
992 	Categories[2]->SetValue(0, rFormat.GetDistance(DIS_NUMERATOR));
993 	Categories[2]->SetValue(1, rFormat.GetDistance(DIS_DENOMINATOR));
994 	Categories[3]->SetValue(0, rFormat.GetDistance(DIS_FRACTION));
995 	Categories[3]->SetValue(1, rFormat.GetDistance(DIS_STROKEWIDTH));
996 	Categories[4]->SetValue(0, rFormat.GetDistance(DIS_UPPERLIMIT));
997 	Categories[4]->SetValue(1, rFormat.GetDistance(DIS_LOWERLIMIT));
998 	Categories[5]->SetValue(0, rFormat.GetDistance(DIS_BRACKETSIZE));
999 	Categories[5]->SetValue(1, rFormat.GetDistance(DIS_BRACKETSPACE));
1000 	Categories[5]->SetValue(3, rFormat.GetDistance(DIS_NORMALBRACKETSIZE));
1001 	Categories[6]->SetValue(0, rFormat.GetDistance(DIS_MATRIXROW));
1002 	Categories[6]->SetValue(1, rFormat.GetDistance(DIS_MATRIXCOL));
1003 	Categories[7]->SetValue(0, rFormat.GetDistance(DIS_ORNAMENTSIZE));
1004 	Categories[7]->SetValue(1, rFormat.GetDistance(DIS_ORNAMENTSPACE));
1005 	Categories[8]->SetValue(0, rFormat.GetDistance(DIS_OPERATORSIZE));
1006 	Categories[8]->SetValue(1, rFormat.GetDistance(DIS_OPERATORSPACE));
1007 	Categories[9]->SetValue(0, rFormat.GetDistance(DIS_LEFTSPACE));
1008 	Categories[9]->SetValue(1, rFormat.GetDistance(DIS_RIGHTSPACE));
1009 	Categories[9]->SetValue(2, rFormat.GetDistance(DIS_TOPSPACE));
1010 	Categories[9]->SetValue(3, rFormat.GetDistance(DIS_BOTTOMSPACE));
1011 
1012 	bScaleAllBrackets = rFormat.IsScaleNormalBrackets();
1013 
1014 	// force update (even of category 0) by setting nActiveCategory to a
1015 	// non-existent category number
1016 	nActiveCategory = CATEGORY_NONE;
1017 	SetCategory(0);
1018 }
1019 
1020 
1021 void SmDistanceDialog::WriteTo(SmFormat &rFormat) /*const*/
1022 {
1023     // hmm... koennen die tatsaechlich unterschiedlich sein?
1024     // wenn nicht kann oben naemlich das const stehen!
1025 	SetCategory(nActiveCategory);
1026 
1027 	rFormat.SetDistance( DIS_HORIZONTAL,    	Categories[0]->GetValue(0) );
1028 	rFormat.SetDistance( DIS_VERTICAL,  		Categories[0]->GetValue(1) );
1029 	rFormat.SetDistance( DIS_ROOT,  			Categories[0]->GetValue(2) );
1030 	rFormat.SetDistance( DIS_SUPERSCRIPT,   	Categories[1]->GetValue(0) );
1031 	rFormat.SetDistance( DIS_SUBSCRIPT,     	Categories[1]->GetValue(1) );
1032 	rFormat.SetDistance( DIS_NUMERATOR,     	Categories[2]->GetValue(0) );
1033 	rFormat.SetDistance( DIS_DENOMINATOR,   	Categories[2]->GetValue(1) );
1034 	rFormat.SetDistance( DIS_FRACTION,  		Categories[3]->GetValue(0) );
1035 	rFormat.SetDistance( DIS_STROKEWIDTH,   	Categories[3]->GetValue(1) );
1036 	rFormat.SetDistance( DIS_UPPERLIMIT,    	Categories[4]->GetValue(0) );
1037 	rFormat.SetDistance( DIS_LOWERLIMIT,    	Categories[4]->GetValue(1) );
1038 	rFormat.SetDistance( DIS_BRACKETSIZE,   	Categories[5]->GetValue(0) );
1039 	rFormat.SetDistance( DIS_BRACKETSPACE,  	Categories[5]->GetValue(1) );
1040 	rFormat.SetDistance( DIS_MATRIXROW,     	Categories[6]->GetValue(0) );
1041 	rFormat.SetDistance( DIS_MATRIXCOL,     	Categories[6]->GetValue(1) );
1042 	rFormat.SetDistance( DIS_ORNAMENTSIZE,  	Categories[7]->GetValue(0) );
1043 	rFormat.SetDistance( DIS_ORNAMENTSPACE, 	Categories[7]->GetValue(1) );
1044 	rFormat.SetDistance( DIS_OPERATORSIZE,  	Categories[8]->GetValue(0) );
1045 	rFormat.SetDistance( DIS_OPERATORSPACE, 	Categories[8]->GetValue(1) );
1046 	rFormat.SetDistance( DIS_LEFTSPACE,     	Categories[9]->GetValue(0) );
1047 	rFormat.SetDistance( DIS_RIGHTSPACE,    	Categories[9]->GetValue(1) );
1048 	rFormat.SetDistance( DIS_TOPSPACE,  		Categories[9]->GetValue(2) );
1049 	rFormat.SetDistance( DIS_BOTTOMSPACE,   	Categories[9]->GetValue(3) );
1050 	rFormat.SetDistance( DIS_NORMALBRACKETSIZE, Categories[5]->GetValue(3) );
1051 
1052 	rFormat.SetScaleNormalBrackets( bScaleAllBrackets );
1053 
1054 	rFormat.RequestApplyChanges();
1055 }
1056 
1057 
1058 /**************************************************************************/
1059 
1060 
1061 IMPL_LINK( SmAlignDialog, DefaultButtonClickHdl, Button *, EMPTYARG /*pButton*/ )
1062 {
1063    QueryBox *pQueryBox = new QueryBox(this, SmResId(RID_DEFAULTSAVEQUERY));
1064 
1065 	if (pQueryBox->Execute() == RET_YES)
1066 	{
1067         SmModule *pp = SM_MOD();
1068         SmFormat aFmt( pp->GetConfig()->GetStandardFormat() );
1069         WriteTo( aFmt );
1070         pp->GetConfig()->SetStandardFormat( aFmt );
1071 	}
1072 
1073 	delete pQueryBox;
1074 	return 0;
1075 }
1076 
1077 
1078 SmAlignDialog::SmAlignDialog(Window * pParent, sal_Bool bFreeRes)
1079 	: ModalDialog(pParent, SmResId(RID_ALIGNDIALOG)),
1080 	aLeft		   (this, SmResId(1)),
1081 	aCenter 	   (this, SmResId(2)),
1082 	aRight		   (this, SmResId(3)),
1083     aFixedLine1    (this, SmResId(1)),
1084 	aOKButton1	   (this, SmResId(1)),
1085 	aCancelButton1 (this, SmResId(1)),
1086 	aDefaultButton (this, SmResId(1))
1087 {
1088 	if (bFreeRes)
1089 		FreeResource();
1090 
1091 	aDefaultButton.SetClickHdl(LINK(this, SmAlignDialog, DefaultButtonClickHdl));
1092 }
1093 
1094 
1095 void SmAlignDialog::ReadFrom(const SmFormat &rFormat)
1096 {
1097 	switch (rFormat.GetHorAlign())
1098 	{
1099 		case AlignLeft:
1100 			aLeft  .Check(sal_True);
1101 			aCenter.Check(sal_False);
1102 			aRight .Check(sal_False);
1103 			break;
1104 
1105 		case AlignCenter:
1106 			aLeft  .Check(sal_False);
1107 			aCenter.Check(sal_True);
1108 			aRight .Check(sal_False);
1109 			break;
1110 
1111 		case AlignRight:
1112 			aLeft  .Check(sal_False);
1113 			aCenter.Check(sal_False);
1114 			aRight .Check(sal_True);
1115 			break;
1116 	}
1117 }
1118 
1119 
1120 void SmAlignDialog::WriteTo(SmFormat &rFormat) const
1121 {
1122 	if (aLeft.IsChecked())
1123 		rFormat.SetHorAlign(AlignLeft);
1124 	else if (aRight.IsChecked())
1125 		rFormat.SetHorAlign(AlignRight);
1126 	else
1127 		rFormat.SetHorAlign(AlignCenter);
1128 
1129 	rFormat.RequestApplyChanges();
1130 }
1131 
1132 
1133 /**************************************************************************/
1134 
1135 
1136 void SmShowSymbolSet::Paint(const Rectangle&)
1137 {
1138 	Push(PUSH_MAPMODE);
1139 
1140     // MapUnit einstellen fuer die 'nLen' berechnet wurde
1141 	SetMapMode(MapMode(MAP_PIXEL));
1142 
1143     sal_uInt16 v        = sal::static_int_cast< sal_uInt16 >((aVScrollBar.GetThumbPos() * nColumns));
1144     size_t nSymbols = aSymbolSet.size();
1145 
1146     Color aTxtColor( GetTextColor() );
1147     for (sal_uInt16 i = v; i < nSymbols ; i++)
1148 	{
1149         SmSym    aSymbol (*aSymbolSet[i]);
1150 		Font     aFont	 (aSymbol.GetFace());
1151         aFont.SetAlign(ALIGN_TOP);
1152 
1153 		// etwas kleinere FontSize nehmen (als nLen) um etwas Luft zu haben
1154         // (hoffentlich auch genug fuer links und rechts!)
1155 		aFont.SetSize(Size(0, nLen - (nLen / 3)));
1156 		SetFont(aFont);
1157         // keep text color
1158         SetTextColor( aTxtColor );
1159 
1160 		int   nIV 	= i - v;
1161         sal_UCS4 cChar = aSymbol.GetCharacter();
1162         String aText( OUString( &cChar, 1 ) );
1163 		Size  aSize( GetTextWidth( aText ), GetTextHeight());
1164 
1165 		DrawText(Point((nIV % nColumns) * nLen + (nLen - aSize.Width()) / 2,
1166 					   (nIV / nColumns) * nLen + (nLen - aSize.Height()) / 2),
1167 				 aText);
1168 	}
1169 
1170 	if (nSelectSymbol != SYMBOL_NONE)
1171 	{
1172 		Invert(Rectangle(Point(((nSelectSymbol - v) % nColumns) * nLen,
1173 			  				   ((nSelectSymbol - v) / nColumns) * nLen),
1174 			  			 Size(nLen, nLen)));
1175 	}
1176 
1177 	Pop();
1178 }
1179 
1180 
1181 void SmShowSymbolSet::MouseButtonDown(const MouseEvent& rMEvt)
1182 {
1183 	GrabFocus();
1184 
1185 	if (rMEvt.IsLeft() && Rectangle(Point(0, 0), aOutputSize).IsInside(rMEvt.GetPosPixel()))
1186 	{
1187         long nPos = (rMEvt.GetPosPixel().Y() / nLen) * nColumns + (rMEvt.GetPosPixel().X() / nLen) +
1188                       aVScrollBar.GetThumbPos() * nColumns;
1189         SelectSymbol( sal::static_int_cast< sal_uInt16 >(nPos) );
1190 
1191 		aSelectHdlLink.Call(this);
1192 
1193 		if (rMEvt.GetClicks() > 1) aDblClickHdlLink.Call(this);
1194 	}
1195 	else Control::MouseButtonDown (rMEvt);
1196 }
1197 
1198 
1199 void SmShowSymbolSet::KeyInput(const KeyEvent& rKEvt)
1200 {
1201 	sal_uInt16 n = nSelectSymbol;
1202 
1203 	if (n != SYMBOL_NONE)
1204 	{
1205 		switch (rKEvt.GetKeyCode().GetCode())
1206 		{
1207             case KEY_DOWN:      n = n + nColumns;   break;
1208             case KEY_UP:        n = n - nColumns;   break;
1209 			case KEY_LEFT:		n -= 1;	break;
1210 			case KEY_RIGHT:		n += 1;	break;
1211 			case KEY_HOME:		n  = 0;	break;
1212             case KEY_END:       n  = static_cast< sal_uInt16 >(aSymbolSet.size() - 1);   break;
1213 			case KEY_PAGEUP:	n -= nColumns * nRows;	break;
1214 			case KEY_PAGEDOWN:	n += nColumns * nRows;	break;
1215 
1216 			default:
1217 				Control::KeyInput(rKEvt);
1218 				return;
1219 		}
1220 	}
1221 	else
1222 		n = 0;
1223 
1224     if (n >= aSymbolSet.size())
1225 		n = nSelectSymbol;
1226 
1227 	// adjust scrollbar
1228 	if ((n < (sal_uInt16) (aVScrollBar.GetThumbPos() * nColumns)) ||
1229 		(n >= (sal_uInt16) ((aVScrollBar.GetThumbPos() + nRows) * nColumns)))
1230 	{
1231 		aVScrollBar.SetThumbPos(n / nColumns);
1232 		Invalidate();
1233 		Update();
1234 	}
1235 
1236 	SelectSymbol(n);
1237 	aSelectHdlLink.Call(this);
1238 }
1239 
1240 
1241 SmShowSymbolSet::SmShowSymbolSet(Window *pParent, const ResId& rResId) :
1242 	Control(pParent, rResId),
1243 	aVScrollBar(this, WinBits(WB_VSCROLL))
1244 {
1245 	nSelectSymbol = SYMBOL_NONE;
1246 
1247 	aOutputSize = GetOutputSizePixel();
1248 	long nScrollBarWidth = aVScrollBar.GetSizePixel().Width(),
1249 		 nUseableWidth   = aOutputSize.Width() - nScrollBarWidth;
1250 
1251     // Hoehe von 16pt in Pixeln (passend zu 'aOutputSize')
1252 	nLen = (sal_uInt16) LogicToPixel(Size(0, 16), MapMode(MAP_POINT)).Height();
1253 
1254     nColumns = sal::static_int_cast< sal_uInt16 >(nUseableWidth / nLen);
1255 	if (nColumns > 2  && nColumns % 2 != 0)
1256 		nColumns--;
1257     nRows    = sal::static_int_cast< sal_uInt16 >(aOutputSize.Height() / nLen);
1258 #if OSL_DEBUG_LEVEL > 1
1259 	DBG_ASSERT(nColumns > 0, "Sm : keine Spalten");
1260 	DBG_ASSERT(nRows > 0, "Sm : keine Zeilen");
1261 #endif
1262 
1263 	// genau passend machen
1264 	aOutputSize.Width()	 = nColumns * nLen;
1265 	aOutputSize.Height() = nRows * nLen;
1266 
1267 	aVScrollBar.SetPosSizePixel(Point(aOutputSize.Width() + 1, -1),
1268 								Size(nScrollBarWidth, aOutputSize.Height() + 2));
1269 	aVScrollBar.Enable(sal_False);
1270 	aVScrollBar.Show();
1271 	aVScrollBar.SetScrollHdl(LINK(this, SmShowSymbolSet, ScrollHdl));
1272 
1273 	Size WindowSize (aOutputSize);
1274 	WindowSize.Width() += nScrollBarWidth;
1275 	SetOutputSizePixel(WindowSize);
1276 
1277 }
1278 
1279 
1280 void SmShowSymbolSet::SetSymbolSet(const SymbolPtrVec_t& rSymbolSet)
1281 {
1282 	aSymbolSet = rSymbolSet;
1283 
1284     if (static_cast< sal_uInt16 >(aSymbolSet.size()) > (nColumns * nRows))
1285 	{
1286         aVScrollBar.SetRange(Range(0, ((aSymbolSet.size() + (nColumns - 1)) / nColumns) - nRows));
1287 		aVScrollBar.Enable(sal_True);
1288 	}
1289 	else
1290 	{
1291 		aVScrollBar.SetRange(Range(0,0));
1292 		aVScrollBar.Enable (sal_False);
1293 	}
1294 
1295 	Invalidate();
1296 }
1297 
1298 
1299 void SmShowSymbolSet::SelectSymbol(sal_uInt16 nSymbol)
1300 {
1301 	int v = (int) (aVScrollBar.GetThumbPos() * nColumns);
1302 
1303 	if (nSelectSymbol != SYMBOL_NONE)
1304 		Invalidate(Rectangle(Point(((nSelectSymbol - v) % nColumns) * nLen,
1305 								   ((nSelectSymbol - v) / nColumns) * nLen),
1306 							 Size(nLen, nLen)));
1307 
1308     if (nSymbol < aSymbolSet.size())
1309 		nSelectSymbol = nSymbol;
1310 
1311     if (aSymbolSet.size() == 0)
1312 		nSelectSymbol = SYMBOL_NONE;
1313 
1314 	if (nSelectSymbol != SYMBOL_NONE)
1315 		Invalidate(Rectangle(Point(((nSelectSymbol - v) % nColumns) * nLen,
1316 								   ((nSelectSymbol - v) / nColumns) * nLen),
1317 							 Size(nLen, nLen)));
1318 
1319 	Update();
1320 }
1321 
1322 
1323 IMPL_LINK( SmShowSymbolSet, ScrollHdl, ScrollBar*, EMPTYARG /*pScrollBar*/)
1324 {
1325 	Invalidate();
1326 	return 0;
1327 }
1328 
1329 ////////////////////////////////////////////////////////////////////////////////
1330 
1331 void SmShowSymbol::Paint(const Rectangle &rRect)
1332 {
1333     Control::Paint( rRect );
1334 
1335 	const XubString &rText = GetText();
1336 	Size            aTextSize(GetTextWidth(rText), GetTextHeight());
1337 
1338 	DrawText(Point((GetOutputSize().Width()  - aTextSize.Width())  / 2,
1339 				   (GetOutputSize().Height() * 7/10)), rText);
1340 }
1341 
1342 
1343 void SmShowSymbol::MouseButtonDown(const MouseEvent& rMEvt)
1344 {
1345 	if (rMEvt.GetClicks() > 1)
1346 		aDblClickHdlLink.Call(this);
1347 	else
1348 		Control::MouseButtonDown (rMEvt);
1349 }
1350 
1351 
1352 void SmShowSymbol::SetSymbol(const SmSym *pSymbol)
1353 {
1354 	if (pSymbol)
1355 	{
1356 		Font aFont (pSymbol->GetFace());
1357 		aFont.SetSize(Size(0, GetOutputSize().Height() - GetOutputSize().Height() / 3));
1358         aFont.SetAlign(ALIGN_BASELINE);
1359 		SetFont(aFont);
1360 
1361         sal_UCS4 cChar = pSymbol->GetCharacter();
1362         String aText( OUString( &cChar, 1 ) );
1363 		SetText( aText );
1364 	}
1365 
1366     // 'Invalidate' fuellt den background mit der background-Farbe.
1367     // Falls der NULL pointer uebergeben wurde reicht dies also zum loeschen
1368 	// der Anzeige
1369 	Invalidate();
1370 }
1371 
1372 
1373 ////////////////////////////////////////////////////////////////////////////////
1374 
1375 void SmSymbolDialog::FillSymbolSets(sal_Bool bDeleteText)
1376     // fuellt die Eintraege der moeglichen 'SymbolsSet's im Dialog mit den
1377 	// aktuellen Werten des SymbolSet Managers, selektiert aber keinen.
1378 {
1379 	aSymbolSets.Clear();
1380 	if (bDeleteText)
1381 		aSymbolSets.SetNoSelection();
1382 
1383     std::set< String >  aSybolSetNames( rSymbolMgr.GetSymbolSetNames() );
1384     std::set< String >::const_iterator aIt( aSybolSetNames.begin() );
1385     for ( ; aIt != aSybolSetNames.end(); ++aIt)
1386         aSymbolSets.InsertEntry( *aIt );
1387 }
1388 
1389 
1390 IMPL_LINK( SmSymbolDialog, SymbolSetChangeHdl, ListBox *, EMPTYARG pListBox )
1391 {
1392     (void) pListBox;
1393 #if OSL_DEBUG_LEVEL > 1
1394 	DBG_ASSERT(pListBox == &aSymbolSets, "Sm : falsches Argument");
1395 #endif
1396 
1397 	SelectSymbolSet(aSymbolSets.GetSelectEntry());
1398 	return 0;
1399 }
1400 
1401 
1402 IMPL_LINK( SmSymbolDialog, SymbolChangeHdl, SmShowSymbolSet *, EMPTYARG pShowSymbolSet )
1403 {
1404     (void) pShowSymbolSet;
1405 #if OSL_DEBUG_LEVEL > 1
1406 	DBG_ASSERT(pShowSymbolSet == &aSymbolSetDisplay, "Sm : falsches Argument");
1407 #endif
1408 
1409 	SelectSymbol(aSymbolSetDisplay.GetSelectSymbol());
1410 	return 0;
1411 }
1412 
1413 IMPL_LINK( SmSymbolDialog, EditClickHdl, Button *, EMPTYARG pButton )
1414 {
1415     (void) pButton;
1416 #if OSL_DEBUG_LEVEL > 1
1417 	DBG_ASSERT(pButton == &aEditBtn, "Sm : falsches Argument");
1418 #endif
1419 
1420     SmSymDefineDialog *pDialog = new SmSymDefineDialog(this, pFontListDev, rSymbolMgr);
1421 
1422 	// aktuelles Symbol und SymbolSet am neuen Dialog setzen
1423 	const XubString  aSymSetName (aSymbolSets.GetSelectEntry()),
1424 					aSymName    (aSymbolName.GetText());
1425 	pDialog->SelectOldSymbolSet(aSymSetName);
1426 	pDialog->SelectOldSymbol(aSymName);
1427 	pDialog->SelectSymbolSet(aSymSetName);
1428 	pDialog->SelectSymbol(aSymName);
1429 
1430 	// altes SymbolSet merken
1431 	XubString  aOldSymbolSet (aSymbolSets.GetSelectEntry());
1432 
1433     sal_uInt16 nSymPos = GetSelectedSymbol();
1434 
1435     // Dialog an evtl geaenderte Daten des SymbolSet Manager anpassen
1436     if (pDialog->Execute() == RET_OK  &&  rSymbolMgr.IsModified())
1437 	{
1438         rSymbolMgr.Save();
1439 		FillSymbolSets();
1440 	}
1441 
1442 	// wenn das alte SymbolSet nicht mehr existiert zum ersten gehen
1443 	// (soweit eines vorhanden ist)
1444 	if (!SelectSymbolSet(aOldSymbolSet)  &&  aSymbolSets.GetEntryCount() > 0)
1445 		SelectSymbolSet(aSymbolSets.GetEntry(0));
1446     else
1447     {
1448         // just update display of current symbol set
1449         DBG_ASSERT( aSymSetName == aSymSetName, "unexpected change in symbol set name" );
1450        	aSymbolSet      = rSymbolMgr.GetSymbolSet( aSymbolSetName );
1451         aSymbolSetDisplay.SetSymbolSet( aSymbolSet );
1452     }
1453 
1454     if (nSymPos >= aSymbolSet.size())
1455         nSymPos = static_cast< sal_uInt16 >(aSymbolSet.size()) - 1;
1456     SelectSymbol( nSymPos );
1457 
1458 	delete pDialog;
1459 	return 0;
1460 }
1461 
1462 
1463 IMPL_LINK( SmSymbolDialog, SymbolDblClickHdl, SmShowSymbolSet *, EMPTYARG pShowSymbolSet )
1464 {
1465     (void) pShowSymbolSet;
1466 #if OSL_DEBUG_LEVEL > 1
1467 	DBG_ASSERT(pShowSymbolSet == &aSymbolSetDisplay, "Sm : falsches Argument");
1468 #endif
1469 
1470 	GetClickHdl(&aGetBtn);
1471 	EndDialog(RET_OK);
1472 	return 0;
1473 }
1474 
1475 
1476 IMPL_LINK( SmSymbolDialog, GetClickHdl, Button *, EMPTYARG pButton )
1477 {
1478     (void) pButton;
1479 #if OSL_DEBUG_LEVEL > 1
1480 	DBG_ASSERT(pButton == &aGetBtn, "Sm : falscher Button");
1481 #endif
1482 
1483 	const SmSym *pSym = GetSymbol();
1484 	if (pSym)
1485 	{
1486 		String	aText ('%');
1487 		aText += pSym->GetName();
1488 		aText += (sal_Unicode)' ';
1489 
1490         rViewSh.GetViewFrame()->GetDispatcher()->Execute(
1491                 SID_INSERTTEXT, SFX_CALLMODE_STANDARD,
1492                 new SfxStringItem(SID_INSERTTEXT, aText), 0L);
1493 	}
1494 
1495 	return 0;
1496 }
1497 
1498 
1499 IMPL_LINK_INLINE_START( SmSymbolDialog, CloseClickHdl, Button *, EMPTYARG pButton )
1500 {
1501     (void) pButton;
1502 #if OSL_DEBUG_LEVEL > 1
1503 	DBG_ASSERT(pButton == &aCloseBtn, "Sm : falscher Button");
1504 #endif
1505 
1506 	EndDialog(sal_True);
1507 	return 0;
1508 }
1509 IMPL_LINK_INLINE_END( SmSymbolDialog, CloseClickHdl, Button *, pButton )
1510 
1511 
1512 SmSymbolDialog::SmSymbolDialog(Window *pParent, OutputDevice *pFntListDevice,
1513         SmSymbolManager &rMgr, SmViewShell &rViewShell, sal_Bool bFreeRes) :
1514 	ModalDialog			(pParent, SmResId(RID_SYMBOLDIALOG)),
1515     aSymbolSetText      (this, SmResId(1)),
1516     aSymbolSets         (this, SmResId(1)),
1517     aSymbolSetDisplay   (this, SmResId(1)),
1518     aSymbolName         (this, SmResId(2)),
1519     aSymbolDisplay      (this, SmResId(2)),
1520     aGetBtn             (this, SmResId(2)),
1521     aCloseBtn           (this, SmResId(3)),
1522     aEditBtn            (this, SmResId(1)),
1523     rViewSh             (rViewShell),
1524     rSymbolMgr          (rMgr),
1525     pFontListDev        (pFntListDevice)
1526 {
1527 	if (bFreeRes)
1528 		FreeResource();
1529 
1530     aSymbolSetName = String();
1531     aSymbolSet.clear();
1532 	FillSymbolSets();
1533 	if (aSymbolSets.GetEntryCount() > 0)
1534 		SelectSymbolSet(aSymbolSets.GetEntry(0));
1535 
1536     InitColor_Impl();
1537 
1538     // preview like controls should have a 2D look
1539     aSymbolDisplay.SetBorderStyle( WINDOW_BORDER_MONO );
1540 
1541 	aSymbolSets		 .SetSelectHdl	(LINK(this, SmSymbolDialog, SymbolSetChangeHdl));
1542 	aSymbolSetDisplay.SetSelectHdl  (LINK(this, SmSymbolDialog, SymbolChangeHdl));
1543 	aSymbolSetDisplay.SetDblClickHdl(LINK(this, SmSymbolDialog, SymbolDblClickHdl));
1544 	aSymbolDisplay	 .SetDblClickHdl(LINK(this, SmSymbolDialog, SymbolDblClickHdl));
1545 	aCloseBtn		 .SetClickHdl   (LINK(this, SmSymbolDialog, CloseClickHdl));
1546 	aEditBtn		 .SetClickHdl   (LINK(this, SmSymbolDialog, EditClickHdl));
1547 	aGetBtn			 .SetClickHdl   (LINK(this, SmSymbolDialog, GetClickHdl));
1548 }
1549 
1550 
1551 SmSymbolDialog::~SmSymbolDialog()
1552 {
1553 }
1554 
1555 
1556 void SmSymbolDialog::InitColor_Impl()
1557 {
1558 #if OSL_DEBUG_LEVEL > 1
1559     Color aBC( GetDisplayBackground().GetColor() );
1560 #endif
1561     ColorData   nBgCol  = COL_WHITE,
1562                 nTxtCol = COL_BLACK;
1563     const StyleSettings &rS = GetSettings().GetStyleSettings();
1564     if (rS.GetHighContrastMode())
1565     {
1566         nBgCol  = rS.GetFieldColor().GetColor();
1567         nTxtCol = rS.GetFieldTextColor().GetColor();
1568     }
1569 
1570     Color aTmpColor( nBgCol );
1571     Wallpaper aWall( aTmpColor );
1572     Color aTxtColor( nTxtCol );
1573     aSymbolDisplay   .SetBackground( aWall );
1574     aSymbolDisplay   .SetTextColor( aTxtColor );
1575     aSymbolSetDisplay.SetBackground( aWall );
1576     aSymbolSetDisplay.SetTextColor( aTxtColor );
1577 }
1578 
1579 
1580 void SmSymbolDialog::DataChanged( const DataChangedEvent& rDCEvt )
1581 {
1582     if ( rDCEvt.GetType() == DATACHANGED_SETTINGS  &&
1583          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
1584             InitColor_Impl();
1585 
1586     ModalDialog::DataChanged( rDCEvt );
1587 }
1588 
1589 
1590 sal_Bool SmSymbolDialog::SelectSymbolSet(const XubString &rSymbolSetName)
1591 {
1592 	sal_Bool	bRet = sal_False;
1593 	sal_uInt16 	nPos = aSymbolSets.GetEntryPos(rSymbolSetName);
1594 
1595     aSymbolSetName = String();
1596     aSymbolSet.clear();
1597 	if (nPos != LISTBOX_ENTRY_NOTFOUND)
1598 	{
1599 		aSymbolSets.SelectEntryPos(nPos);
1600 
1601         aSymbolSetName  = rSymbolSetName;
1602         aSymbolSet      = rSymbolMgr.GetSymbolSet( aSymbolSetName );
1603 
1604         // sort symbols by Unicode position (useful for displaying Greek characters alphabetically)
1605         std::sort( aSymbolSet.begin(), aSymbolSet.end(), lt_SmSymPtr() );
1606 
1607         aSymbolSetDisplay.SetSymbolSet( aSymbolSet );
1608         if (aSymbolSet.size() > 0)
1609 			SelectSymbol(0);
1610 
1611 		bRet = sal_True;
1612 	}
1613 	else
1614 		aSymbolSets.SetNoSelection();
1615 
1616 	return bRet;
1617 }
1618 
1619 
1620 void SmSymbolDialog::SelectSymbol(sal_uInt16 nSymbolNo)
1621 {
1622 	const SmSym *pSym = NULL;
1623     if (aSymbolSetName.Len() > 0  &&  nSymbolNo < static_cast< sal_uInt16 >(aSymbolSet.size()))
1624         pSym = aSymbolSet[ nSymbolNo ];
1625 
1626 	aSymbolSetDisplay.SelectSymbol(nSymbolNo);
1627 	aSymbolDisplay.SetSymbol(pSym);
1628 	aSymbolName.SetText(pSym ? pSym->GetName() : XubString());
1629 }
1630 
1631 
1632 const SmSym * SmSymbolDialog::GetSymbol() const
1633 {
1634 	sal_uInt16 nSymbolNo = aSymbolSetDisplay.GetSelectSymbol();
1635     bool bValid = aSymbolSetName.Len() > 0  &&  nSymbolNo < static_cast< sal_uInt16 >(aSymbolSet.size());
1636     return bValid ? aSymbolSet[ nSymbolNo ] : NULL;
1637 }
1638 
1639 
1640 ////////////////////////////////////////////////////////////////////////////////
1641 
1642 
1643 void SmShowChar::Paint(const Rectangle &rRect)
1644 {
1645     Control::Paint( rRect );
1646 
1647 	OUString aText( GetText() );
1648     if (aText.getLength() > 0)
1649 	{
1650 #if OSL_DEBUG_LEVEL > 1
1651         sal_Int32 nPos = 0;
1652         sal_UCS4 cChar = aText.iterateCodePoints( &nPos );
1653         (void) cChar;
1654 #endif
1655 		Size aTextSize(GetTextWidth(aText), GetTextHeight());
1656 
1657 		DrawText(Point((GetOutputSize().Width()  - aTextSize.Width())  / 2,
1658 					   (GetOutputSize().Height() * 7/10)), aText);
1659 	}
1660 }
1661 
1662 
1663 void SmShowChar::SetSymbol( const SmSym *pSym )
1664 {
1665     if (pSym)
1666         SetSymbol( pSym->GetCharacter(), pSym->GetFace() );
1667 }
1668 
1669 
1670 void SmShowChar::SetSymbol( sal_UCS4 cChar, const Font &rFont )
1671 {
1672     Font aFont( rFont );
1673     aFont.SetSize( Size(0, GetOutputSize().Height() - GetOutputSize().Height() / 3) );
1674     aFont.SetAlign(ALIGN_BASELINE);
1675     SetFont(aFont);
1676 
1677     String aText( OUString( &cChar, 1) );
1678     SetText( aText );
1679 
1680     Invalidate();
1681 }
1682 
1683 
1684 ////////////////////////////////////////////////////////////////////////////////
1685 
1686 void SmSymDefineDialog::FillSymbols(ComboBox &rComboBox, sal_Bool bDeleteText)
1687 {
1688 #if OSL_DEBUG_LEVEL > 1
1689 	DBG_ASSERT(&rComboBox == &aOldSymbols  ||  &rComboBox == &aSymbols,
1690 		"Sm : falsche ComboBox");
1691 #endif
1692 
1693 	rComboBox.Clear();
1694 	if (bDeleteText)
1695 		rComboBox.SetText(XubString());
1696 
1697     ComboBox &rBox = &rComboBox == &aOldSymbols ? aOldSymbolSets : aSymbolSets;
1698     SymbolPtrVec_t aSymSet( aSymbolMgrCopy.GetSymbolSet( rBox.GetText() ) );
1699     for (size_t i = 0;  i < aSymSet.size();  ++i)
1700         rComboBox.InsertEntry( aSymSet[i]->GetName() );
1701 }
1702 
1703 
1704 void SmSymDefineDialog::FillSymbolSets(ComboBox &rComboBox, sal_Bool bDeleteText)
1705 {
1706 #if OSL_DEBUG_LEVEL > 1
1707 	DBG_ASSERT(&rComboBox == &aOldSymbolSets  ||  &rComboBox == &aSymbolSets,
1708 		"Sm : falsche ComboBox");
1709 #endif
1710 
1711 	rComboBox.Clear();
1712 	if (bDeleteText)
1713 		rComboBox.SetText(XubString());
1714 
1715     const std::set< String >  aSymbolSetNames( aSymbolMgrCopy.GetSymbolSetNames() );
1716     std::set< String >::const_iterator aIt( aSymbolSetNames.begin() );
1717     for ( ;  aIt != aSymbolSetNames.end();  ++aIt)
1718         rComboBox.InsertEntry( *aIt );
1719 }
1720 
1721 
1722 void SmSymDefineDialog::FillFonts(sal_Bool bDelete)
1723 {
1724 	aFonts.Clear();
1725 	if (bDelete)
1726 		aFonts.SetNoSelection();
1727 
1728 	// alle Fonts der 'FontList' in die Fontliste aufnehmen
1729 	// von denen mit gleichen Namen jedoch nur einen (denn der Style wird
1730     // ueber die 'FontStyleBox' gewaehlt und nicht auch noch hier)
1731     if (pFontList)
1732     {
1733         sal_uInt16  nCount = pFontList->GetFontNameCount();
1734         for (sal_uInt16 i = 0;  i < nCount;  i++)
1735             aFonts.InsertEntry( pFontList->GetFontName(i).GetName() );
1736     }
1737 }
1738 
1739 
1740 void SmSymDefineDialog::FillStyles(sal_Bool bDeleteText)
1741 {
1742 	aStyles.Clear();
1743 	if (bDeleteText)
1744 		aStyles.SetText(XubString());
1745 
1746 	XubString aText (aFonts.GetSelectEntry());
1747 	if (aText.Len() != 0)
1748 	{
1749 		//aStyles.Fill(aText, &aFontList);
1750 		// eigene StyleName's verwenden
1751         const SmFontStyles &rStyles = GetFontStyles();
1752         for (sal_uInt16 i = 0;  i < rStyles.GetCount();  i++)
1753             aStyles.InsertEntry( rStyles.GetStyleName(i) );
1754 
1755 #if OSL_DEBUG_LEVEL > 1
1756 		DBG_ASSERT(aStyles.GetEntryCount() > 0, "Sm : keine Styles vorhanden");
1757 #endif
1758         aStyles.SetText( aStyles.GetEntry(0) );
1759 	}
1760 }
1761 
1762 
1763 SmSym * SmSymDefineDialog::GetSymbol(const ComboBox &rComboBox)
1764 {
1765 #if OSL_DEBUG_LEVEL > 1
1766 	DBG_ASSERT(&rComboBox == &aOldSymbols  ||  &rComboBox == &aSymbols,
1767 		"Sm : falsche ComboBox");
1768 #endif
1769     return aSymbolMgrCopy.GetSymbolByName(rComboBox.GetText());
1770 }
1771 
1772 
1773 IMPL_LINK( SmSymDefineDialog, OldSymbolChangeHdl, ComboBox *, EMPTYARG pComboBox )
1774 {
1775     (void) pComboBox;
1776 #if OSL_DEBUG_LEVEL > 1
1777 	DBG_ASSERT(pComboBox == &aOldSymbols, "Sm : falsches Argument");
1778 #endif
1779     SelectSymbol(aOldSymbols, aOldSymbols.GetText(), sal_False);
1780 	return 0;
1781 }
1782 
1783 
1784 IMPL_LINK( SmSymDefineDialog, OldSymbolSetChangeHdl, ComboBox *, EMPTYARG pComboBox )
1785 {
1786     (void) pComboBox;
1787 #if OSL_DEBUG_LEVEL > 1
1788 	DBG_ASSERT(pComboBox == &aOldSymbolSets, "Sm : falsches Argument");
1789 #endif
1790 	SelectSymbolSet(aOldSymbolSets, aOldSymbolSets.GetText(), sal_False);
1791 	return 0;
1792 }
1793 
1794 
1795 IMPL_LINK( SmSymDefineDialog, ModifyHdl, ComboBox *, pComboBox )
1796 {
1797 	// merken der Cursorposition zum wiederherstellen derselben
1798 	Selection  aSelection (pComboBox->GetSelection());
1799 
1800 	if (pComboBox == &aSymbols)
1801 		SelectSymbol(aSymbols, aSymbols.GetText(), sal_False);
1802 	else if (pComboBox == &aSymbolSets)
1803 		SelectSymbolSet(aSymbolSets, aSymbolSets.GetText(), sal_False);
1804 	else if (pComboBox == &aOldSymbols)
1805 		// nur Namen aus der Liste erlauben
1806 		SelectSymbol(aOldSymbols, aOldSymbols.GetText(), sal_True);
1807 	else if (pComboBox == &aOldSymbolSets)
1808 		// nur Namen aus der Liste erlauben
1809 		SelectSymbolSet(aOldSymbolSets, aOldSymbolSets.GetText(), sal_True);
1810 	else if (pComboBox == &aStyles)
1811 		// nur Namen aus der Liste erlauben (ist hier eh immer der Fall)
1812 		SelectStyle(aStyles.GetText(), sal_True);
1813 	else
1814     {
1815 #if OSL_DEBUG_LEVEL > 1
1816 		DBG_ASSERT(0, "Sm : falsche ComboBox Argument");
1817 #endif
1818     }
1819 
1820 	pComboBox->SetSelection(aSelection);
1821 
1822 	UpdateButtons();
1823 
1824 	return 0;
1825 }
1826 
1827 
1828 IMPL_LINK( SmSymDefineDialog, FontChangeHdl, ListBox *, EMPTYARG pListBox )
1829 {
1830     (void) pListBox;
1831 #if OSL_DEBUG_LEVEL > 1
1832 	DBG_ASSERT(pListBox == &aFonts, "Sm : falsches Argument");
1833 #endif
1834 
1835 	SelectFont(aFonts.GetSelectEntry());
1836 	return 0;
1837 }
1838 
1839 
1840 IMPL_LINK( SmSymDefineDialog, SubsetChangeHdl, ListBox *, EMPTYARG pListBox )
1841 {
1842     (void) pListBox;
1843     sal_uInt16 nPos = aFontsSubsetLB.GetSelectEntryPos();
1844     if (LISTBOX_ENTRY_NOTFOUND != nPos)
1845     {
1846         const Subset* pSubset = reinterpret_cast<const Subset*> (aFontsSubsetLB.GetEntryData( nPos ));
1847         if (pSubset)
1848         {
1849             aCharsetDisplay.SelectCharacter( pSubset->GetRangeMin() );
1850         }
1851     }
1852     return 0;
1853 }
1854 
1855 
1856 IMPL_LINK( SmSymDefineDialog, StyleChangeHdl, ComboBox *, EMPTYARG pComboBox )
1857 {
1858     (void) pComboBox;
1859 #if OSL_DEBUG_LEVEL > 1
1860 	DBG_ASSERT(pComboBox == &aStyles, "Sm : falsches Argument");
1861 #endif
1862 
1863 	SelectStyle(aStyles.GetText());
1864 	return 0;
1865 }
1866 
1867 
1868 IMPL_LINK( SmSymDefineDialog, CharHighlightHdl, Control *, EMPTYARG )
1869 {
1870    sal_UCS4 cChar = aCharsetDisplay.GetSelectCharacter();
1871 
1872 #if OSL_DEBUG_LEVEL > 1
1873     DBG_ASSERT( pSubsetMap, "SubsetMap missing" );
1874 #endif
1875     if (pSubsetMap)
1876     {
1877         const Subset* pSubset = pSubsetMap->GetSubsetByUnicode( cChar );
1878         if (pSubset)
1879             aFontsSubsetLB.SelectEntry( pSubset->GetName() );
1880         else
1881             aFontsSubsetLB.SetNoSelection();
1882     }
1883 
1884     aSymbolDisplay.SetSymbol( cChar, aCharsetDisplay.GetFont() );
1885 
1886 	UpdateButtons();
1887 
1888     // display Unicode position as symbol name while iterating over characters
1889     const String aHex( String::CreateFromInt64( cChar, 16 ).ToUpperAscii() );
1890     const String aPattern( A2OU( aHex.Len() > 4 ? "Ux000000" : "Ux0000" ) );
1891     String aUnicodePos( aPattern.Copy( 0, aPattern.Len() - aHex.Len() ) );
1892     aUnicodePos += aHex;
1893     aSymbols.SetText( aUnicodePos );
1894     aSymbolName.SetText( aUnicodePos );
1895 
1896 	return 0;
1897 }
1898 
1899 
1900 IMPL_LINK( SmSymDefineDialog, AddClickHdl, Button *, EMPTYARG pButton )
1901 {
1902     (void) pButton;
1903 #if OSL_DEBUG_LEVEL > 1
1904 	DBG_ASSERT(pButton == &aAddBtn, "Sm : falsches Argument");
1905     DBG_ASSERT(aAddBtn.IsEnabled(), "Sm : Voraussetzungen erfuellt ??");
1906 #endif
1907 
1908     // add symbol
1909     const SmSym aNewSymbol( aSymbols.GetText(), aCharsetDisplay.GetFont(),
1910             aCharsetDisplay.GetSelectCharacter(), aSymbolSets.GetText() );
1911     //DBG_ASSERT( aSymbolMgrCopy.GetSymbolByName(aTmpSymbolName) == NULL, "symbol already exists" );
1912     aSymbolMgrCopy.AddOrReplaceSymbol( aNewSymbol );
1913 
1914     // update display of new symbol
1915     aSymbolDisplay.SetSymbol( &aNewSymbol );
1916     aSymbolName.SetText( aNewSymbol.GetName() );
1917     aSymbolSetName.SetText( aNewSymbol.GetSymbolSetName() );
1918 
1919     // update list box entries
1920     FillSymbolSets(aOldSymbolSets, sal_False);
1921     FillSymbolSets(aSymbolSets,    sal_False);
1922 	FillSymbols(aOldSymbols ,sal_False);
1923 	FillSymbols(aSymbols    ,sal_False);
1924 
1925 	UpdateButtons();
1926 
1927 	return 0;
1928 }
1929 
1930 
1931 IMPL_LINK( SmSymDefineDialog, ChangeClickHdl, Button *, EMPTYARG pButton )
1932 {
1933     (void) pButton;
1934 #if OSL_DEBUG_LEVEL > 1
1935 	DBG_ASSERT(pButton == &aChangeBtn, "Sm : falsches Argument");
1936     DBG_ASSERT(aChangeBtn.IsEnabled(), "Sm : Voraussetzungen erfuellt ??");
1937 #endif
1938 
1939     // get new Sybol to use
1940     //! get font from symbol-disp lay since charset-display does not keep
1941     //! the bold attribut.
1942     const SmSym aNewSymbol( aSymbols.GetText(), aCharsetDisplay.GetFont(),
1943             aCharsetDisplay.GetSelectCharacter(), aSymbolSets.GetText() );
1944 
1945     // remove old symbol if the name was changed then add new one
1946 //    const bool bSetNameChanged    = aOldSymbolSets.GetText() != aSymbolSets.GetText();
1947     const bool bNameChanged       = aOldSymbols.GetText() != aSymbols.GetText();
1948     if (bNameChanged)
1949         aSymbolMgrCopy.RemoveSymbol( aOldSymbols.GetText() );
1950     aSymbolMgrCopy.AddOrReplaceSymbol( aNewSymbol, true );
1951 
1952     // clear display for original symbol if necessary
1953     if (bNameChanged)
1954         SetOrigSymbol(NULL, XubString());
1955 
1956     // update display of new symbol
1957     aSymbolDisplay.SetSymbol( &aNewSymbol );
1958     aSymbolName.SetText( aNewSymbol.GetName() );
1959     aSymbolSetName.SetText( aNewSymbol.GetSymbolSetName() );
1960 
1961     // update list box entries
1962     FillSymbolSets(aOldSymbolSets, sal_False);
1963     FillSymbolSets(aSymbolSets,    sal_False);
1964     FillSymbols(aOldSymbols ,sal_False);
1965     FillSymbols(aSymbols    ,sal_False);
1966 
1967     UpdateButtons();
1968 
1969 	return 0;
1970 }
1971 
1972 
1973 IMPL_LINK( SmSymDefineDialog, DeleteClickHdl, Button *, EMPTYARG pButton )
1974 {
1975     (void) pButton;
1976 #if OSL_DEBUG_LEVEL > 1
1977 	DBG_ASSERT(pButton == &aDeleteBtn, "Sm : falsches Argument");
1978     DBG_ASSERT(aDeleteBtn.IsEnabled(), "Sm : Voraussetzungen erfuellt ??");
1979 #endif
1980 
1981 	if (pOrigSymbol)
1982 	{
1983         aSymbolMgrCopy.RemoveSymbol( pOrigSymbol->GetName() );
1984 
1985         // clear display for original symbol
1986 		SetOrigSymbol(NULL, XubString());
1987 
1988         // update list box entries
1989         FillSymbolSets(aOldSymbolSets, sal_False);
1990         FillSymbolSets(aSymbolSets,    sal_False);
1991         FillSymbols(aOldSymbols ,sal_False);
1992         FillSymbols(aSymbols    ,sal_False);
1993 	}
1994 
1995 	UpdateButtons();
1996 
1997 	return 0;
1998 }
1999 
2000 
2001 void SmSymDefineDialog::UpdateButtons()
2002 {
2003 	sal_Bool  bAdd    = sal_False,
2004 		  bChange = sal_False,
2005 		  bDelete = sal_False,
2006 		  bEqual;
2007     XubString aTmpSymbolName    (aSymbols.GetText()),
2008               aTmpSymbolSetName (aSymbolSets.GetText());
2009 
2010     if (aTmpSymbolName.Len() > 0  &&  aTmpSymbolSetName.Len() > 0)
2011 	{
2012 		// alle Einstellungen gleich?
2013 		//! (Font-, Style- und SymbolSet Name werden nicht case sensitiv verglichen)
2014 		bEqual = pOrigSymbol
2015                     && aTmpSymbolSetName.EqualsIgnoreCaseAscii(aOldSymbolSetName.GetText())
2016                     && aTmpSymbolName.Equals(pOrigSymbol->GetName())
2017                     && aFonts.GetSelectEntry().EqualsIgnoreCaseAscii(
2018                             pOrigSymbol->GetFace().GetName())
2019                     && aStyles.GetText().EqualsIgnoreCaseAscii(
2020                             GetFontStyles().GetStyleName(pOrigSymbol->GetFace()))
2021                     && aCharsetDisplay.GetSelectCharacter() == pOrigSymbol->GetCharacter();
2022 
2023         // hinzufuegen nur wenn es noch kein Symbol desgleichen Namens gibt
2024         bAdd    = aSymbolMgrCopy.GetSymbolByName(aTmpSymbolName) == NULL;
2025 
2026         // loeschen nur wenn alle Einstellungen gleich sind
2027 		bDelete = pOrigSymbol != NULL;
2028 
2029         // aendern wenn bei gleichem Namen mindestens eine Einstellung anders ist
2030         // oder wenn es noch kein Symbol des neuen Namens gibt (wuerde implizites
2031         // loeschen des bereits vorhandenen Symbols erfordern)
2032 //        sal_Bool  bEqualName = pOrigSymbol && aTmpSymbolName == pOrigSymbol->GetName();
2033 //		bChange = pOrigSymbol && ( (bEqualName && !bEqual) || (!bEqualName && bAdd) );
2034 
2035         // aendern nur falls altes Symbol vorhanden und am neuen etwas anders ist
2036 		bChange = pOrigSymbol && !bEqual;
2037 }
2038 
2039 	aAddBtn   .Enable(bAdd);
2040 	aChangeBtn.Enable(bChange);
2041 	aDeleteBtn.Enable(bDelete);
2042 }
2043 
2044 
2045 SmSymDefineDialog::SmSymDefineDialog(Window * pParent,
2046         OutputDevice *pFntListDevice, SmSymbolManager &rMgr, sal_Bool bFreeRes) :
2047 	ModalDialog			(pParent, SmResId(RID_SYMDEFINEDIALOG)),
2048     aOldSymbolText      (this, SmResId(1)),
2049     aOldSymbols         (this, SmResId(1)),
2050     aOldSymbolSetText   (this, SmResId(2)),
2051     aOldSymbolSets      (this, SmResId(2)),
2052     aCharsetDisplay     (this, SmResId(1)),
2053     aSymbolText         (this, SmResId(9)),
2054     aSymbols            (this, SmResId(4)),
2055     aSymbolSetText      (this, SmResId(10)),
2056     aSymbolSets         (this, SmResId(5)),
2057     aFontText           (this, SmResId(3)),
2058     aFonts              (this, SmResId(1)),
2059     aFontsSubsetFT      (this, SmResId( FT_FONTS_SUBSET )),
2060     aFontsSubsetLB      (this, SmResId( LB_FONTS_SUBSET )),
2061     aStyleText          (this, SmResId(4)),
2062     aStyles             (this, SmResId(3)),
2063     aOldSymbolName      (this, SmResId(7)),
2064     aOldSymbolDisplay   (this, SmResId(3)),
2065     aOldSymbolSetName   (this, SmResId(8)),
2066     aSymbolName         (this, SmResId(5)),
2067     aSymbolDisplay      (this, SmResId(2)),
2068     aSymbolSetName      (this, SmResId(6)),
2069     aOkBtn              (this, SmResId(1)),
2070     aCancelBtn          (this, SmResId(1)),
2071     aAddBtn             (this, SmResId(1)),
2072     aChangeBtn          (this, SmResId(2)),
2073     aDeleteBtn          (this, SmResId(3)),
2074     aRightArrow         (this, SmResId(1)),
2075     aRigthArrow_Im      (SmResId(1)),
2076     aRigthArrow_Im_HC   (SmResId(2)),   // hi-contrast version
2077     rSymbolMgr          (rMgr),
2078     pSubsetMap          (NULL),
2079     pFontList           (NULL)
2080 {
2081 	if (bFreeRes)
2082 		FreeResource();
2083 
2084     pFontList = new FontList( pFntListDevice );
2085 
2086 	pOrigSymbol = 0;
2087 
2088     // auto completion is troublesome since that symbols character also gets automatically selected in the
2089     // display and if the user previously selected a character to define/redefine that one this is bad
2090     aOldSymbols.EnableAutocomplete( sal_False, sal_True );
2091     aSymbols   .EnableAutocomplete( sal_False, sal_True );
2092 
2093 	FillFonts();
2094 	if (aFonts.GetEntryCount() > 0)
2095 		SelectFont(aFonts.GetEntry(0));
2096 
2097     InitColor_Impl();
2098 
2099     SetSymbolSetManager(rSymbolMgr);
2100 
2101 	aOldSymbols	   .SetSelectHdl(LINK(this, SmSymDefineDialog, OldSymbolChangeHdl));
2102 	aOldSymbolSets .SetSelectHdl(LINK(this, SmSymDefineDialog, OldSymbolSetChangeHdl));
2103 	aSymbolSets    .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl));
2104 	aOldSymbolSets .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl));
2105 	aSymbols       .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl));
2106 	aOldSymbols    .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl));
2107 	aStyles		   .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl));
2108 	aFonts         .SetSelectHdl(LINK(this, SmSymDefineDialog, FontChangeHdl));
2109     aFontsSubsetLB .SetSelectHdl(LINK(this, SmSymDefineDialog, SubsetChangeHdl));
2110 	aStyles        .SetSelectHdl(LINK(this, SmSymDefineDialog, StyleChangeHdl));
2111 	aAddBtn        .SetClickHdl (LINK(this, SmSymDefineDialog, AddClickHdl));
2112 	aChangeBtn     .SetClickHdl (LINK(this, SmSymDefineDialog, ChangeClickHdl));
2113 	aDeleteBtn     .SetClickHdl (LINK(this, SmSymDefineDialog, DeleteClickHdl));
2114     aCharsetDisplay.SetHighlightHdl( LINK( this, SmSymDefineDialog, CharHighlightHdl ) );
2115 
2116     // preview like controls should have a 2D look
2117     aOldSymbolDisplay.SetBorderStyle( WINDOW_BORDER_MONO );
2118     aSymbolDisplay   .SetBorderStyle( WINDOW_BORDER_MONO );
2119 }
2120 
2121 
2122 SmSymDefineDialog::~SmSymDefineDialog()
2123 {
2124     delete pSubsetMap;
2125     delete pOrigSymbol;
2126 }
2127 
2128 void SmSymDefineDialog::InitColor_Impl()
2129 {
2130 #if OSL_DEBUG_LEVEL > 1
2131     Color aBC( GetDisplayBackground().GetColor() );
2132 #endif
2133     ColorData   nBgCol  = COL_WHITE,
2134                 nTxtCol = COL_BLACK;
2135     sal_Bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
2136     if (bHighContrast)
2137     {
2138         const StyleSettings &rS = GetSettings().GetStyleSettings();
2139         nBgCol  = rS.GetFieldColor().GetColor();
2140         nTxtCol = rS.GetFieldTextColor().GetColor();
2141     }
2142 
2143     Color aTmpColor( nBgCol );
2144     Wallpaper aWall( aTmpColor );
2145     Color aTxtColor( nTxtCol );
2146     aCharsetDisplay  .SetBackground( aWall );
2147     aCharsetDisplay  .SetTextColor( aTxtColor );
2148     aOldSymbolDisplay.SetBackground( aWall );
2149     aOldSymbolDisplay.SetTextColor( aTxtColor );
2150     aSymbolDisplay   .SetBackground( aWall );
2151     aSymbolDisplay   .SetTextColor( aTxtColor );
2152 
2153     const Image &rArrowRight = bHighContrast ? aRigthArrow_Im_HC : aRigthArrow_Im;
2154     aRightArrow.SetImage( rArrowRight );
2155 }
2156 
2157 
2158 void SmSymDefineDialog::DataChanged( const DataChangedEvent& rDCEvt )
2159 {
2160     if ( rDCEvt.GetType() == DATACHANGED_SETTINGS  &&
2161          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
2162             InitColor_Impl();
2163 
2164     ModalDialog::DataChanged( rDCEvt );
2165 }
2166 
2167 
2168 short SmSymDefineDialog::Execute()
2169 {
2170 	short nResult = ModalDialog::Execute();
2171 
2172     // Aenderungen uebernehmen falls Dialog mit OK beendet wurde
2173     if (aSymbolMgrCopy.IsModified()  &&  nResult == RET_OK)
2174         rSymbolMgr = aSymbolMgrCopy;
2175 
2176 	return nResult;
2177 }
2178 
2179 
2180 void SmSymDefineDialog::SetSymbolSetManager(const SmSymbolManager &rMgr)
2181 {
2182     aSymbolMgrCopy = rMgr;
2183 #ifdef DEBUG
2184 //        sal_uInt16 nS = aSymbolMgrCopy.GetSymbolSetCount();
2185 #endif
2186 
2187     // Das modified Flag der Kopie auf sal_False setzen, damit man spaeter damit
2188     // testen kann ob sich was geaendert hat.
2189     aSymbolMgrCopy.SetModified(sal_False);
2190 
2191 	FillSymbolSets(aOldSymbolSets);
2192 	if (aOldSymbolSets.GetEntryCount() > 0)
2193 		SelectSymbolSet(aOldSymbolSets.GetEntry(0));
2194 	FillSymbolSets(aSymbolSets);
2195 	if (aSymbolSets.GetEntryCount() > 0)
2196 		SelectSymbolSet(aSymbolSets.GetEntry(0));
2197 	FillSymbols(aOldSymbols);
2198 	if (aOldSymbols.GetEntryCount() > 0)
2199 		SelectSymbol(aOldSymbols.GetEntry(0));
2200 	FillSymbols(aSymbols);
2201 	if (aSymbols.GetEntryCount() > 0)
2202 		SelectSymbol(aSymbols.GetEntry(0));
2203 
2204 	UpdateButtons();
2205 }
2206 
2207 
2208 sal_Bool SmSymDefineDialog::SelectSymbolSet(ComboBox &rComboBox,
2209 		const XubString &rSymbolSetName, sal_Bool bDeleteText)
2210 {
2211 #if OSL_DEBUG_LEVEL > 1
2212 	DBG_ASSERT(&rComboBox == &aOldSymbolSets  ||  &rComboBox == &aSymbolSets,
2213 		"Sm : falsche ComboBox");
2214 #endif
2215 
2216 	// 'Normalisieren' des SymbolNamens (ohne leading und trailing Leerzeichen)
2217 	XubString  aNormName (rSymbolSetName);
2218 	aNormName.EraseLeadingChars(' ');
2219 	aNormName.EraseTrailingChars(' ');
2220 	// und evtl Abweichungen in der Eingabe beseitigen
2221 	rComboBox.SetText(aNormName);
2222 
2223 	sal_Bool   bRet = sal_False;
2224 	sal_uInt16 nPos = rComboBox.GetEntryPos(aNormName);
2225 
2226 	if (nPos != COMBOBOX_ENTRY_NOTFOUND)
2227 	{
2228 		rComboBox.SetText(rComboBox.GetEntry(nPos));
2229 		bRet = sal_True;
2230 	}
2231 	else if (bDeleteText)
2232 		rComboBox.SetText(XubString());
2233 
2234 	sal_Bool  bIsOld = &rComboBox == &aOldSymbolSets;
2235 
2236     // setzen des SymbolSet Namens an der zugehoerigen Darstellung
2237 	FixedText &rFT = bIsOld ? aOldSymbolSetName : aSymbolSetName;
2238 	rFT.SetText(rComboBox.GetText());
2239 
2240     // setzen der zum SymbolSet gehoerenden Symbol Namen an der zugehoerigen
2241 	// Auswahbox
2242 	ComboBox  &rCB = bIsOld ? aOldSymbols : aSymbols;
2243 	FillSymbols(rCB, sal_False);
2244 
2245     // bei Wechsel des SymbolSets fuer das alte Zeichen ein gueltiges
2246 	// Symbol bzw keins zur Anzeige bringen
2247 	if (bIsOld)
2248 	{
2249         XubString  aTmpOldSymbolName;
2250 		if (aOldSymbols.GetEntryCount() > 0)
2251             aTmpOldSymbolName = aOldSymbols.GetEntry(0);
2252         SelectSymbol(aOldSymbols, aTmpOldSymbolName, sal_True);
2253 	}
2254 
2255 	UpdateButtons();
2256 
2257 	return bRet;
2258 }
2259 
2260 
2261 void SmSymDefineDialog::SetOrigSymbol(const SmSym *pSymbol,
2262 									  const XubString &rSymbolSetName)
2263 {
2264     // clear old symbol
2265     delete pOrigSymbol;
2266     pOrigSymbol = 0;
2267 
2268     XubString   aSymName,
2269                 aSymSetName;
2270 	if (pSymbol)
2271 	{
2272         // set new symbol
2273         pOrigSymbol = new SmSym( *pSymbol );
2274 
2275 		aSymName    = pSymbol->GetName();
2276 		aSymSetName = rSymbolSetName;
2277 		aOldSymbolDisplay.SetSymbol( pSymbol );
2278 	}
2279 	else
2280     {   // loeschen des angezeigten Symbols
2281 		aOldSymbolDisplay.SetText(XubString());
2282 		aOldSymbolDisplay.Invalidate();
2283 	}
2284 	aOldSymbolName   .SetText(aSymName);
2285 	aOldSymbolSetName.SetText(aSymSetName);
2286 }
2287 
2288 
2289 sal_Bool SmSymDefineDialog::SelectSymbol(ComboBox &rComboBox,
2290 		const XubString &rSymbolName, sal_Bool bDeleteText)
2291 {
2292 #if OSL_DEBUG_LEVEL > 1
2293 	DBG_ASSERT(&rComboBox == &aOldSymbols  ||  &rComboBox == &aSymbols,
2294 		"Sm : falsche ComboBox");
2295 #endif
2296 
2297 	// 'Normalisieren' des SymbolNamens (ohne Leerzeichen)
2298 	XubString  aNormName (rSymbolName);
2299 	aNormName.EraseAllChars(' ');
2300 	// und evtl Abweichungen in der Eingabe beseitigen
2301 	rComboBox.SetText(aNormName);
2302 
2303 	sal_Bool   bRet = sal_False;
2304 	sal_uInt16 nPos = rComboBox.GetEntryPos(aNormName);
2305 
2306 	sal_Bool  bIsOld = &rComboBox == &aOldSymbols;
2307 
2308 	if (nPos != COMBOBOX_ENTRY_NOTFOUND)
2309 	{
2310 		rComboBox.SetText(rComboBox.GetEntry(nPos));
2311 
2312 		if (!bIsOld)
2313 		{
2314 			const SmSym *pSymbol = GetSymbol(aSymbols);
2315 			if (pSymbol)
2316 			{
2317                 // Font und Style entsprechend waehlen
2318 				const Font &rFont = pSymbol->GetFace();
2319 				SelectFont(rFont.GetName(), sal_False);
2320                 SelectStyle(GetFontStyles().GetStyleName(rFont), sal_False);
2321 
2322                 // da das setzen des Fonts ueber den Style Namen des SymbolsFonts nicht
2323 				// so gut klappt (er kann zB leer sein obwohl der Font selbst 'bold' und
2324                 // 'italic' ist!). Setzen wir hier den Font wie er zum Symbol gehoert
2325                 // zu Fuss.
2326 				aCharsetDisplay.SetFont(rFont);
2327 				aSymbolDisplay.SetFont(rFont);
2328 
2329                 // das zugehoerige Zeichen auswaehlen
2330 				SelectChar(pSymbol->GetCharacter());
2331 
2332                 // since SelectChar will also set the unicode point as text in the
2333                 // symbols box, we have to set the symbol name again to get that one displayed
2334                 aSymbols.SetText( pSymbol->GetName() );
2335 			}
2336 		}
2337 
2338 		bRet = sal_True;
2339 	}
2340 	else if (bDeleteText)
2341 		rComboBox.SetText(XubString());
2342 
2343 	if (bIsOld)
2344 	{
2345 		// bei Wechsel des alten Symbols nur vorhandene anzeigen sonst keins
2346 		const SmSym *pOldSymbol = NULL;
2347         XubString     aTmpOldSymbolSetName;
2348 		if (nPos != COMBOBOX_ENTRY_NOTFOUND)
2349 		{
2350             pOldSymbol        = aSymbolMgrCopy.GetSymbolByName(aNormName);
2351             aTmpOldSymbolSetName = aOldSymbolSets.GetText();
2352 		}
2353         SetOrigSymbol(pOldSymbol, aTmpOldSymbolSetName);
2354 	}
2355 	else
2356 		aSymbolName.SetText(rComboBox.GetText());
2357 
2358 	UpdateButtons();
2359 
2360 	return bRet;
2361 }
2362 
2363 
2364 void SmSymDefineDialog::SetFont(const XubString &rFontName, const XubString &rStyleName)
2365 {
2366 	// Font (FontInfo) passend zu Namen und Style holen
2367     FontInfo aFI;
2368     if (pFontList)
2369         aFI = pFontList->Get(rFontName, WEIGHT_NORMAL, ITALIC_NONE);
2370 	SetFontStyle(rStyleName, aFI);
2371 
2372 	aCharsetDisplay.SetFont(aFI);
2373 	aSymbolDisplay.SetFont(aFI);
2374 
2375     // update subset listbox for new font's unicode subsets
2376     FontCharMap aFontCharMap;
2377     aCharsetDisplay.GetFontCharMap( aFontCharMap );
2378     if (pSubsetMap)
2379         delete pSubsetMap;
2380     pSubsetMap = new SubsetMap( &aFontCharMap );
2381     //
2382     aFontsSubsetLB.Clear();
2383     bool bFirst = true;
2384     const Subset* pSubset;
2385     while( NULL != (pSubset = pSubsetMap->GetNextSubset( bFirst )) )
2386     {
2387         sal_uInt16 nPos = aFontsSubsetLB.InsertEntry( pSubset->GetName());
2388         aFontsSubsetLB.SetEntryData( nPos, (void *) pSubset );
2389         // subset must live at least as long as the selected font !!!
2390         if( bFirst )
2391 	        aFontsSubsetLB.SelectEntryPos( nPos );
2392         bFirst = false;
2393     }
2394     if( bFirst )
2395         aFontsSubsetLB.SetNoSelection();
2396     aFontsSubsetLB.Enable( !bFirst );
2397 }
2398 
2399 
2400 sal_Bool SmSymDefineDialog::SelectFont(const XubString &rFontName, sal_Bool bApplyFont)
2401 {
2402 	sal_Bool   bRet = sal_False;
2403 	sal_uInt16 nPos = aFonts.GetEntryPos(rFontName);
2404 
2405 	if (nPos != LISTBOX_ENTRY_NOTFOUND)
2406 	{
2407 		aFonts.SelectEntryPos(nPos);
2408 		if (aStyles.GetEntryCount() > 0)
2409 			SelectStyle(aStyles.GetEntry(0));
2410 		if (bApplyFont)
2411         {
2412 			SetFont(aFonts.GetSelectEntry(), aStyles.GetText());
2413             // update preview to use new font
2414             aSymbolDisplay.SetSymbol( aCharsetDisplay.GetSelectCharacter(), aCharsetDisplay.GetFont() );
2415         }
2416 		bRet = sal_True;
2417 	}
2418 	else
2419 		aFonts.SetNoSelection();
2420 	FillStyles();
2421 
2422 	UpdateButtons();
2423 
2424 	return bRet;
2425 }
2426 
2427 
2428 sal_Bool SmSymDefineDialog::SelectStyle(const XubString &rStyleName, sal_Bool bApplyFont)
2429 {
2430 	sal_Bool   bRet = sal_False;
2431 	sal_uInt16 nPos = aStyles.GetEntryPos(rStyleName);
2432 
2433     // falls der Style nicht zur Auswahl steht nehmen wir den erst moeglichen
2434 	// (sofern vorhanden)
2435 	if (nPos == COMBOBOX_ENTRY_NOTFOUND  &&  aStyles.GetEntryCount() > 0)
2436 		nPos = 0;
2437 
2438 	if (nPos != COMBOBOX_ENTRY_NOTFOUND)
2439 	{
2440 		aStyles.SetText(aStyles.GetEntry(nPos));
2441 		if (bApplyFont)
2442         {
2443 			SetFont(aFonts.GetSelectEntry(), aStyles.GetText());
2444             // update preview to use new font
2445             aSymbolDisplay.SetSymbol( aCharsetDisplay.GetSelectCharacter(), aCharsetDisplay.GetFont() );
2446         }
2447 		bRet = sal_True;
2448 	}
2449 	else
2450 		aStyles.SetText(XubString());
2451 
2452 	UpdateButtons();
2453 
2454 	return bRet;
2455 }
2456 
2457 
2458 void SmSymDefineDialog::SelectChar(xub_Unicode cChar)
2459 {
2460     aCharsetDisplay.SelectCharacter( cChar );
2461     aSymbolDisplay.SetSymbol( cChar, aCharsetDisplay.GetFont() );
2462 
2463 	UpdateButtons();
2464 }
2465 
2466 
2467 /**************************************************************************/
2468 
2469