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