xref: /AOO41X/main/starmath/source/dialog.cxx (revision 7ea7a1cc0485d11251efeb72154f72ac1c990b6e)
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 
GetCount() const80     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 
SmFontStyles()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 
GetStyleName(const Font & rFont) const99 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 
GetStyleName(sal_uInt16 nIdx) const116 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 
GetFontStyles()135 const SmFontStyles & GetFontStyles()
136 {
137     static const SmFontStyles aImpl;
138     return aImpl;
139 }
140 
141 /////////////////////////////////////////////////////////////////
142 
SetFontStyle(const XubString & rStyleName,Font & rFont)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 
IMPL_LINK_INLINE_START(SmPrintOptionsTabPage,SizeButtonClickHdl,Button *,EMPTYARG)168 IMPL_LINK_INLINE_START( SmPrintOptionsTabPage, SizeButtonClickHdl, Button *, EMPTYARG/*pButton*/ )
169 {
170     aZoom.Enable(aSizeZoomed.IsChecked());
171     return 0;
172 }
IMPL_LINK_INLINE_END(SmPrintOptionsTabPage,SizeButtonClickHdl,Button *,pButton)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 
FillItemSet(SfxItemSet & rSet)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 
Reset(const SfxItemSet & rSet)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 
Create(Window * pWindow,const SfxItemSet & rSet)243 SfxTabPage* SmPrintOptionsTabPage::Create(Window* pWindow, const SfxItemSet& rSet)
244 {
245     return (new SmPrintOptionsTabPage(pWindow, rSet));
246 }
247 
248 /**************************************************************************/
249 
250 
Paint(const Rectangle & rRect)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 
SetFont(const Font & rFont)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 
IMPL_LINK_INLINE_START(SmFontDialog,FontSelectHdl,ComboBox *,pComboBox)278 IMPL_LINK_INLINE_START( SmFontDialog, FontSelectHdl, ComboBox *, pComboBox )
279 {
280     Face.SetName(pComboBox->GetText());
281     aShowFont.SetFont(Face);
282     return 0;
283 }
IMPL_LINK_INLINE_END(SmFontDialog,FontSelectHdl,ComboBox *,pComboBox)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 
IMPL_LINK(SmFontDialog,AttrChangeHdl,CheckBox *,EMPTYARG)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 
SetFont(const Font & rFont)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 
SmFontDialog(Window * pParent,OutputDevice * pFntListDevice,sal_Bool bHideCheckboxes,sal_Bool bFreeRes)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 
InitColor_Impl()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 
DataChanged(const DataChangedEvent & rDCEvt)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 
IMPL_LINK(SmFontSizeDialog,DefaultButtonClickHdl,Button *,EMPTYARG)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 
SmFontSizeDialog(Window * pParent,sal_Bool bFreeRes)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 
ReadFrom(const SmFormat & rFormat)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 
WriteTo(SmFormat & rFormat) const480 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 
IMPL_LINK(SmFontTypeDialog,MenuSelectHdl,Menu *,pMenu)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 
IMPL_LINK_INLINE_START(SmFontTypeDialog,DefaultButtonClickHdl,Button *,EMPTYARG)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 }
IMPL_LINK_INLINE_END(SmFontTypeDialog,DefaultButtonClickHdl,Button *,pButton)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 
ReadFrom(const SmFormat & rFormat)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 
WriteTo(SmFormat & rFormat) const602 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 
SmCategoryDesc(const ResId & rResId,sal_uInt16 nCategoryIdx)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 
~SmCategoryDesc()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 
IMPL_LINK(SmDistanceDialog,GetFocusHdl,Control *,pControl)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 
IMPL_LINK(SmDistanceDialog,MenuSelectHdl,Menu *,pMenu)730 IMPL_LINK( SmDistanceDialog, MenuSelectHdl, Menu *, pMenu )
731 {
732     SetCategory(pMenu->GetCurItemId() - 1);
733     return 0;
734 }
735 
736 
IMPL_LINK(SmDistanceDialog,DefaultButtonClickHdl,Button *,EMPTYARG)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 
IMPL_LINK(SmDistanceDialog,CheckBoxClickHdl,CheckBox *,pCheckBox)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 
SetHelpId(MetricField & rField,const rtl::OString & sHelpId)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 
SetCategory(sal_uInt16 nCategory)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_PERCENT;
869             nDigits = 0;
870         }
871         else
872         {
873             eUnit   = FUNIT_100TH_MM;
874             nDigits = 2;
875         }
876         pMF->SetUnit(eUnit);            //! veraendert den Wert
877         pMF->SetDecimalDigits(nDigits);
878 
879         if (bActive)
880         {
881             pCat = Categories[nCategory];
882             pFT->SetText(*pCat->GetString(i));
883 
884             pMF->SetMin(pCat->GetMinimum(i));
885             pMF->SetMax(pCat->GetMaximum(i));
886             pMF->SetValue(pCat->GetValue(i));
887 
888             SetHelpId(*pMF, aCatMf2Hid[nCategory][i]);
889         }
890     }
891     // nun noch die CheckBox und das zugehoerige MetricField genau dann aktivieren,
892     // falls es sich um das Klammer Menu handelt.
893     bActive = nCategory == 5;
894     aCheckBox1.Show(bActive);
895     aCheckBox1.Enable(bActive);
896     if (bActive)
897     {
898         aCheckBox1.Check( bScaleAllBrackets );
899 
900         sal_Bool bChecked = aCheckBox1.IsChecked();
901         aFixedText4  .Enable( bChecked );
902         aMetricField4.Enable( bChecked );
903     }
904 
905     aMenuButton.GetPopupMenu()->CheckItem(nCategory + 1, sal_True);
906     aFixedLine.SetText(Categories[nCategory]->GetName());
907 
908     nActiveCategory = nCategory;
909 
910     aMetricField1.GrabFocus();
911     Invalidate();
912     Update();
913 }
914 
915 
SmDistanceDialog(Window * pParent,sal_Bool bFreeRes)916 SmDistanceDialog::SmDistanceDialog(Window *pParent, sal_Bool bFreeRes)
917     : ModalDialog(pParent, SmResId(RID_DISTANCEDIALOG)),
918     aFixedText1    (this, SmResId(1)),
919     aMetricField1  (this, SmResId(1)),
920     aFixedText2    (this, SmResId(2)),
921     aMetricField2  (this, SmResId(2)),
922     aFixedText3    (this, SmResId(3)),
923     aMetricField3  (this, SmResId(3)),
924     aCheckBox1     (this, SmResId(1)),
925     aFixedText4    (this, SmResId(4)),
926     aMetricField4  (this, SmResId(4)),
927     aOKButton1     (this, SmResId(1)),
928     aCancelButton1 (this, SmResId(1)),
929     aMenuButton    (this, SmResId(1)),
930     aDefaultButton (this, SmResId(1)),
931     aBitmap        (this, SmResId(1)),
932     aFixedLine     (this, SmResId(1))
933 {
934     for (sal_uInt16 i = 0; i < NOCATEGORIES; i++)
935         Categories[i] = new SmCategoryDesc(SmResId(i + 1), i);
936     nActiveCategory   = CATEGORY_NONE;
937     bScaleAllBrackets = sal_False;
938 
939     if (bFreeRes)
940         FreeResource();
941 
942     ApplyImages();
943 
944     // preview like controls should have a 2D look
945     aBitmap.SetBorderStyle( WINDOW_BORDER_MONO );
946 
947     aMetricField1.SetGetFocusHdl(LINK(this, SmDistanceDialog, GetFocusHdl));
948     aMetricField2.SetGetFocusHdl(LINK(this, SmDistanceDialog, GetFocusHdl));
949     aMetricField3.SetGetFocusHdl(LINK(this, SmDistanceDialog, GetFocusHdl));
950     aMetricField4.SetGetFocusHdl(LINK(this, SmDistanceDialog, GetFocusHdl));
951     aCheckBox1.SetClickHdl(LINK(this, SmDistanceDialog, CheckBoxClickHdl));
952 
953     aMenuButton.GetPopupMenu()->SetSelectHdl(LINK(this, SmDistanceDialog, MenuSelectHdl));
954 
955     aDefaultButton.SetClickHdl(LINK(this, SmDistanceDialog, DefaultButtonClickHdl));
956 }
957 
958 
~SmDistanceDialog()959 SmDistanceDialog::~SmDistanceDialog()
960 {
961     for (int i = 0; i < NOCATEGORIES; i++)
962         DELETEZ(Categories[i]);
963 }
964 
ApplyImages()965 void SmDistanceDialog::ApplyImages()
966 {
967     sal_Bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
968     for (int i = 0;  i < NOCATEGORIES;  ++i)
969     {
970         SmCategoryDesc *pCat = Categories[i];
971         if (pCat)
972             pCat->SetHighContrast( bHighContrast );
973     }
974 }
975 
DataChanged(const DataChangedEvent & rEvt)976 void SmDistanceDialog::DataChanged( const DataChangedEvent &rEvt )
977 {
978     if ( (rEvt.GetType() == DATACHANGED_SETTINGS) && (rEvt.GetFlags() & SETTINGS_STYLE) )
979             ApplyImages();
980 
981     ModalDialog::DataChanged( rEvt );
982 }
983 
ReadFrom(const SmFormat & rFormat)984 void SmDistanceDialog::ReadFrom(const SmFormat &rFormat)
985 {
986     Categories[0]->SetValue(0, rFormat.GetDistance(DIS_HORIZONTAL));
987     Categories[0]->SetValue(1, rFormat.GetDistance(DIS_VERTICAL));
988     Categories[0]->SetValue(2, rFormat.GetDistance(DIS_ROOT));
989     Categories[1]->SetValue(0, rFormat.GetDistance(DIS_SUPERSCRIPT));
990     Categories[1]->SetValue(1, rFormat.GetDistance(DIS_SUBSCRIPT));
991     Categories[2]->SetValue(0, rFormat.GetDistance(DIS_NUMERATOR));
992     Categories[2]->SetValue(1, rFormat.GetDistance(DIS_DENOMINATOR));
993     Categories[3]->SetValue(0, rFormat.GetDistance(DIS_FRACTION));
994     Categories[3]->SetValue(1, rFormat.GetDistance(DIS_STROKEWIDTH));
995     Categories[4]->SetValue(0, rFormat.GetDistance(DIS_UPPERLIMIT));
996     Categories[4]->SetValue(1, rFormat.GetDistance(DIS_LOWERLIMIT));
997     Categories[5]->SetValue(0, rFormat.GetDistance(DIS_BRACKETSIZE));
998     Categories[5]->SetValue(1, rFormat.GetDistance(DIS_BRACKETSPACE));
999     Categories[5]->SetValue(3, rFormat.GetDistance(DIS_NORMALBRACKETSIZE));
1000     Categories[6]->SetValue(0, rFormat.GetDistance(DIS_MATRIXROW));
1001     Categories[6]->SetValue(1, rFormat.GetDistance(DIS_MATRIXCOL));
1002     Categories[7]->SetValue(0, rFormat.GetDistance(DIS_ORNAMENTSIZE));
1003     Categories[7]->SetValue(1, rFormat.GetDistance(DIS_ORNAMENTSPACE));
1004     Categories[8]->SetValue(0, rFormat.GetDistance(DIS_OPERATORSIZE));
1005     Categories[8]->SetValue(1, rFormat.GetDistance(DIS_OPERATORSPACE));
1006     Categories[9]->SetValue(0, rFormat.GetDistance(DIS_LEFTSPACE));
1007     Categories[9]->SetValue(1, rFormat.GetDistance(DIS_RIGHTSPACE));
1008     Categories[9]->SetValue(2, rFormat.GetDistance(DIS_TOPSPACE));
1009     Categories[9]->SetValue(3, rFormat.GetDistance(DIS_BOTTOMSPACE));
1010 
1011     bScaleAllBrackets = rFormat.IsScaleNormalBrackets();
1012 
1013     // force update (even of category 0) by setting nActiveCategory to a
1014     // non-existent category number
1015     nActiveCategory = CATEGORY_NONE;
1016     SetCategory(0);
1017 }
1018 
1019 
WriteTo(SmFormat & rFormat)1020 void SmDistanceDialog::WriteTo(SmFormat &rFormat) /*const*/
1021 {
1022     // hmm... koennen die tatsaechlich unterschiedlich sein?
1023     // wenn nicht kann oben naemlich das const stehen!
1024     SetCategory(nActiveCategory);
1025 
1026     rFormat.SetDistance( DIS_HORIZONTAL,        Categories[0]->GetValue(0) );
1027     rFormat.SetDistance( DIS_VERTICAL,          Categories[0]->GetValue(1) );
1028     rFormat.SetDistance( DIS_ROOT,              Categories[0]->GetValue(2) );
1029     rFormat.SetDistance( DIS_SUPERSCRIPT,       Categories[1]->GetValue(0) );
1030     rFormat.SetDistance( DIS_SUBSCRIPT,         Categories[1]->GetValue(1) );
1031     rFormat.SetDistance( DIS_NUMERATOR,         Categories[2]->GetValue(0) );
1032     rFormat.SetDistance( DIS_DENOMINATOR,       Categories[2]->GetValue(1) );
1033     rFormat.SetDistance( DIS_FRACTION,          Categories[3]->GetValue(0) );
1034     rFormat.SetDistance( DIS_STROKEWIDTH,       Categories[3]->GetValue(1) );
1035     rFormat.SetDistance( DIS_UPPERLIMIT,        Categories[4]->GetValue(0) );
1036     rFormat.SetDistance( DIS_LOWERLIMIT,        Categories[4]->GetValue(1) );
1037     rFormat.SetDistance( DIS_BRACKETSIZE,       Categories[5]->GetValue(0) );
1038     rFormat.SetDistance( DIS_BRACKETSPACE,      Categories[5]->GetValue(1) );
1039     rFormat.SetDistance( DIS_MATRIXROW,         Categories[6]->GetValue(0) );
1040     rFormat.SetDistance( DIS_MATRIXCOL,         Categories[6]->GetValue(1) );
1041     rFormat.SetDistance( DIS_ORNAMENTSIZE,      Categories[7]->GetValue(0) );
1042     rFormat.SetDistance( DIS_ORNAMENTSPACE,     Categories[7]->GetValue(1) );
1043     rFormat.SetDistance( DIS_OPERATORSIZE,      Categories[8]->GetValue(0) );
1044     rFormat.SetDistance( DIS_OPERATORSPACE,     Categories[8]->GetValue(1) );
1045     rFormat.SetDistance( DIS_LEFTSPACE,         Categories[9]->GetValue(0) );
1046     rFormat.SetDistance( DIS_RIGHTSPACE,        Categories[9]->GetValue(1) );
1047     rFormat.SetDistance( DIS_TOPSPACE,          Categories[9]->GetValue(2) );
1048     rFormat.SetDistance( DIS_BOTTOMSPACE,       Categories[9]->GetValue(3) );
1049     rFormat.SetDistance( DIS_NORMALBRACKETSIZE, Categories[5]->GetValue(3) );
1050 
1051     rFormat.SetScaleNormalBrackets( bScaleAllBrackets );
1052 
1053     rFormat.RequestApplyChanges();
1054 }
1055 
1056 
1057 /**************************************************************************/
1058 
1059 
IMPL_LINK(SmAlignDialog,DefaultButtonClickHdl,Button *,EMPTYARG)1060 IMPL_LINK( SmAlignDialog, DefaultButtonClickHdl, Button *, EMPTYARG /*pButton*/ )
1061 {
1062    QueryBox *pQueryBox = new QueryBox(this, SmResId(RID_DEFAULTSAVEQUERY));
1063 
1064     if (pQueryBox->Execute() == RET_YES)
1065     {
1066         SmModule *pp = SM_MOD();
1067         SmFormat aFmt( pp->GetConfig()->GetStandardFormat() );
1068         WriteTo( aFmt );
1069         pp->GetConfig()->SetStandardFormat( aFmt );
1070     }
1071 
1072     delete pQueryBox;
1073     return 0;
1074 }
1075 
1076 
SmAlignDialog(Window * pParent,sal_Bool bFreeRes)1077 SmAlignDialog::SmAlignDialog(Window * pParent, sal_Bool bFreeRes)
1078     : ModalDialog(pParent, SmResId(RID_ALIGNDIALOG)),
1079     aLeft          (this, SmResId(1)),
1080     aCenter        (this, SmResId(2)),
1081     aRight         (this, SmResId(3)),
1082     aFixedLine1    (this, SmResId(1)),
1083     aOKButton1     (this, SmResId(1)),
1084     aCancelButton1 (this, SmResId(1)),
1085     aDefaultButton (this, SmResId(1))
1086 {
1087     if (bFreeRes)
1088         FreeResource();
1089 
1090     aDefaultButton.SetClickHdl(LINK(this, SmAlignDialog, DefaultButtonClickHdl));
1091 }
1092 
1093 
ReadFrom(const SmFormat & rFormat)1094 void SmAlignDialog::ReadFrom(const SmFormat &rFormat)
1095 {
1096     switch (rFormat.GetHorAlign())
1097     {
1098         case AlignLeft:
1099             aLeft  .Check(sal_True);
1100             aCenter.Check(sal_False);
1101             aRight .Check(sal_False);
1102             break;
1103 
1104         case AlignCenter:
1105             aLeft  .Check(sal_False);
1106             aCenter.Check(sal_True);
1107             aRight .Check(sal_False);
1108             break;
1109 
1110         case AlignRight:
1111             aLeft  .Check(sal_False);
1112             aCenter.Check(sal_False);
1113             aRight .Check(sal_True);
1114             break;
1115     }
1116 }
1117 
1118 
WriteTo(SmFormat & rFormat) const1119 void SmAlignDialog::WriteTo(SmFormat &rFormat) const
1120 {
1121     if (aLeft.IsChecked())
1122         rFormat.SetHorAlign(AlignLeft);
1123     else if (aRight.IsChecked())
1124         rFormat.SetHorAlign(AlignRight);
1125     else
1126         rFormat.SetHorAlign(AlignCenter);
1127 
1128     rFormat.RequestApplyChanges();
1129 }
1130 
1131 
1132 /**************************************************************************/
1133 
1134 
Paint(const Rectangle &)1135 void SmShowSymbolSet::Paint(const Rectangle&)
1136 {
1137     Push(PUSH_MAPMODE);
1138 
1139     // MapUnit einstellen fuer die 'nLen' berechnet wurde
1140     SetMapMode(MapMode(MAP_PIXEL));
1141 
1142     sal_uInt16 v        = sal::static_int_cast< sal_uInt16 >((aVScrollBar.GetThumbPos() * nColumns));
1143     size_t nSymbols = aSymbolSet.size();
1144 
1145     Color aTxtColor( GetTextColor() );
1146     for (sal_uInt16 i = v; i < nSymbols ; i++)
1147     {
1148         SmSym    aSymbol (*aSymbolSet[i]);
1149         Font     aFont   (aSymbol.GetFace());
1150         aFont.SetAlign(ALIGN_TOP);
1151 
1152         // etwas kleinere FontSize nehmen (als nLen) um etwas Luft zu haben
1153         // (hoffentlich auch genug fuer links und rechts!)
1154         aFont.SetSize(Size(0, nLen - (nLen / 3)));
1155         SetFont(aFont);
1156         // keep text color
1157         SetTextColor( aTxtColor );
1158 
1159         int   nIV   = i - v;
1160         sal_UCS4 cChar = aSymbol.GetCharacter();
1161         String aText( OUString( &cChar, 1 ) );
1162         Size  aSize( GetTextWidth( aText ), GetTextHeight());
1163 
1164         DrawText(Point((nIV % nColumns) * nLen + (nLen - aSize.Width()) / 2,
1165                        (nIV / nColumns) * nLen + (nLen - aSize.Height()) / 2),
1166                  aText);
1167     }
1168 
1169     if (nSelectSymbol != SYMBOL_NONE)
1170     {
1171         Invert(Rectangle(Point(((nSelectSymbol - v) % nColumns) * nLen,
1172                                ((nSelectSymbol - v) / nColumns) * nLen),
1173                          Size(nLen, nLen)));
1174     }
1175 
1176     Pop();
1177 }
1178 
1179 
MouseButtonDown(const MouseEvent & rMEvt)1180 void SmShowSymbolSet::MouseButtonDown(const MouseEvent& rMEvt)
1181 {
1182     GrabFocus();
1183 
1184     if (rMEvt.IsLeft() && Rectangle(Point(0, 0), aOutputSize).IsInside(rMEvt.GetPosPixel()))
1185     {
1186         long nPos = (rMEvt.GetPosPixel().Y() / nLen) * nColumns + (rMEvt.GetPosPixel().X() / nLen) +
1187                       aVScrollBar.GetThumbPos() * nColumns;
1188         SelectSymbol( sal::static_int_cast< sal_uInt16 >(nPos) );
1189 
1190         aSelectHdlLink.Call(this);
1191 
1192         if (rMEvt.GetClicks() > 1) aDblClickHdlLink.Call(this);
1193     }
1194     else Control::MouseButtonDown (rMEvt);
1195 }
1196 
1197 
KeyInput(const KeyEvent & rKEvt)1198 void SmShowSymbolSet::KeyInput(const KeyEvent& rKEvt)
1199 {
1200     sal_uInt16 n = nSelectSymbol;
1201 
1202     if (n != SYMBOL_NONE)
1203     {
1204         switch (rKEvt.GetKeyCode().GetCode())
1205         {
1206             case KEY_DOWN:      n = n + nColumns;   break;
1207             case KEY_UP:        n = n - nColumns;   break;
1208             case KEY_LEFT:      n -= 1; break;
1209             case KEY_RIGHT:     n += 1; break;
1210             case KEY_HOME:      n  = 0; break;
1211             case KEY_END:       n  = static_cast< sal_uInt16 >(aSymbolSet.size() - 1);   break;
1212             case KEY_PAGEUP:    n -= nColumns * nRows;  break;
1213             case KEY_PAGEDOWN:  n += nColumns * nRows;  break;
1214 
1215             default:
1216                 Control::KeyInput(rKEvt);
1217                 return;
1218         }
1219     }
1220     else
1221         n = 0;
1222 
1223     if (n >= aSymbolSet.size())
1224         n = nSelectSymbol;
1225 
1226     // adjust scrollbar
1227     if ((n < (sal_uInt16) (aVScrollBar.GetThumbPos() * nColumns)) ||
1228         (n >= (sal_uInt16) ((aVScrollBar.GetThumbPos() + nRows) * nColumns)))
1229     {
1230         aVScrollBar.SetThumbPos(n / nColumns);
1231         Invalidate();
1232         Update();
1233     }
1234 
1235     SelectSymbol(n);
1236     aSelectHdlLink.Call(this);
1237 }
1238 
1239 
SmShowSymbolSet(Window * pParent,const ResId & rResId)1240 SmShowSymbolSet::SmShowSymbolSet(Window *pParent, const ResId& rResId) :
1241     Control(pParent, rResId),
1242     aVScrollBar(this, WinBits(WB_VSCROLL))
1243 {
1244     nSelectSymbol = SYMBOL_NONE;
1245 
1246     aOutputSize = GetOutputSizePixel();
1247     long nScrollBarWidth = aVScrollBar.GetSizePixel().Width(),
1248          nUseableWidth   = aOutputSize.Width() - nScrollBarWidth;
1249 
1250     // Hoehe von 16pt in Pixeln (passend zu 'aOutputSize')
1251     nLen = (sal_uInt16) LogicToPixel(Size(0, 16), MapMode(MAP_POINT)).Height();
1252 
1253     nColumns = sal::static_int_cast< sal_uInt16 >(nUseableWidth / nLen);
1254     if (nColumns > 2  && nColumns % 2 != 0)
1255         nColumns--;
1256     nRows    = sal::static_int_cast< sal_uInt16 >(aOutputSize.Height() / nLen);
1257 #if OSL_DEBUG_LEVEL > 1
1258     DBG_ASSERT(nColumns > 0, "Sm : keine Spalten");
1259     DBG_ASSERT(nRows > 0, "Sm : keine Zeilen");
1260 #endif
1261 
1262     // genau passend machen
1263     aOutputSize.Width()  = nColumns * nLen;
1264     aOutputSize.Height() = nRows * nLen;
1265 
1266     aVScrollBar.SetPosSizePixel(Point(aOutputSize.Width() + 1, -1),
1267                                 Size(nScrollBarWidth, aOutputSize.Height() + 2));
1268     aVScrollBar.Enable(sal_False);
1269     aVScrollBar.Show();
1270     aVScrollBar.SetScrollHdl(LINK(this, SmShowSymbolSet, ScrollHdl));
1271 
1272     Size WindowSize (aOutputSize);
1273     WindowSize.Width() += nScrollBarWidth;
1274     SetOutputSizePixel(WindowSize);
1275 
1276 }
1277 
1278 
SetSymbolSet(const SymbolPtrVec_t & rSymbolSet)1279 void SmShowSymbolSet::SetSymbolSet(const SymbolPtrVec_t& rSymbolSet)
1280 {
1281     aSymbolSet = rSymbolSet;
1282 
1283     if (static_cast< sal_uInt16 >(aSymbolSet.size()) > (nColumns * nRows))
1284     {
1285         aVScrollBar.SetRange(Range(0, ((aSymbolSet.size() + (nColumns - 1)) / nColumns) - nRows));
1286         aVScrollBar.Enable(sal_True);
1287     }
1288     else
1289     {
1290         aVScrollBar.SetRange(Range(0,0));
1291         aVScrollBar.Enable (sal_False);
1292     }
1293 
1294     Invalidate();
1295 }
1296 
1297 
SelectSymbol(sal_uInt16 nSymbol)1298 void SmShowSymbolSet::SelectSymbol(sal_uInt16 nSymbol)
1299 {
1300     int v = (int) (aVScrollBar.GetThumbPos() * nColumns);
1301 
1302     if (nSelectSymbol != SYMBOL_NONE)
1303         Invalidate(Rectangle(Point(((nSelectSymbol - v) % nColumns) * nLen,
1304                                    ((nSelectSymbol - v) / nColumns) * nLen),
1305                              Size(nLen, nLen)));
1306 
1307     if (nSymbol < aSymbolSet.size())
1308         nSelectSymbol = nSymbol;
1309 
1310     if (aSymbolSet.size() == 0)
1311         nSelectSymbol = SYMBOL_NONE;
1312 
1313     if (nSelectSymbol != SYMBOL_NONE)
1314         Invalidate(Rectangle(Point(((nSelectSymbol - v) % nColumns) * nLen,
1315                                    ((nSelectSymbol - v) / nColumns) * nLen),
1316                              Size(nLen, nLen)));
1317 
1318     Update();
1319 }
1320 
1321 
IMPL_LINK(SmShowSymbolSet,ScrollHdl,ScrollBar *,EMPTYARG)1322 IMPL_LINK( SmShowSymbolSet, ScrollHdl, ScrollBar*, EMPTYARG /*pScrollBar*/)
1323 {
1324     Invalidate();
1325     return 0;
1326 }
1327 
1328 ////////////////////////////////////////////////////////////////////////////////
1329 
Paint(const Rectangle & rRect)1330 void SmShowSymbol::Paint(const Rectangle &rRect)
1331 {
1332     Control::Paint( rRect );
1333 
1334     const XubString &rText = GetText();
1335     Size            aTextSize(GetTextWidth(rText), GetTextHeight());
1336 
1337     DrawText(Point((GetOutputSize().Width()  - aTextSize.Width())  / 2,
1338                    (GetOutputSize().Height() * 7/10)), rText);
1339 }
1340 
1341 
MouseButtonDown(const MouseEvent & rMEvt)1342 void SmShowSymbol::MouseButtonDown(const MouseEvent& rMEvt)
1343 {
1344     if (rMEvt.GetClicks() > 1)
1345         aDblClickHdlLink.Call(this);
1346     else
1347         Control::MouseButtonDown (rMEvt);
1348 }
1349 
1350 
SetSymbol(const SmSym * pSymbol)1351 void SmShowSymbol::SetSymbol(const SmSym *pSymbol)
1352 {
1353     if (pSymbol)
1354     {
1355         Font aFont (pSymbol->GetFace());
1356         aFont.SetSize(Size(0, GetOutputSize().Height() - GetOutputSize().Height() / 3));
1357         aFont.SetAlign(ALIGN_BASELINE);
1358         SetFont(aFont);
1359 
1360         sal_UCS4 cChar = pSymbol->GetCharacter();
1361         String aText( OUString( &cChar, 1 ) );
1362         SetText( aText );
1363     }
1364 
1365     // 'Invalidate' fuellt den background mit der background-Farbe.
1366     // Falls der NULL pointer uebergeben wurde reicht dies also zum loeschen
1367     // der Anzeige
1368     Invalidate();
1369 }
1370 
1371 
1372 ////////////////////////////////////////////////////////////////////////////////
1373 
FillSymbolSets(sal_Bool bDeleteText)1374 void SmSymbolDialog::FillSymbolSets(sal_Bool bDeleteText)
1375     // fuellt die Eintraege der moeglichen 'SymbolsSet's im Dialog mit den
1376     // aktuellen Werten des SymbolSet Managers, selektiert aber keinen.
1377 {
1378     aSymbolSets.Clear();
1379     if (bDeleteText)
1380         aSymbolSets.SetNoSelection();
1381 
1382     std::set< String >  aSybolSetNames( rSymbolMgr.GetSymbolSetNames() );
1383     std::set< String >::const_iterator aIt( aSybolSetNames.begin() );
1384     for ( ; aIt != aSybolSetNames.end(); ++aIt)
1385         aSymbolSets.InsertEntry( *aIt );
1386 }
1387 
1388 
IMPL_LINK(SmSymbolDialog,SymbolSetChangeHdl,ListBox *,EMPTYARG pListBox)1389 IMPL_LINK( SmSymbolDialog, SymbolSetChangeHdl, ListBox *, EMPTYARG pListBox )
1390 {
1391     (void) pListBox;
1392 #if OSL_DEBUG_LEVEL > 1
1393     DBG_ASSERT(pListBox == &aSymbolSets, "Sm : falsches Argument");
1394 #endif
1395 
1396     SelectSymbolSet(aSymbolSets.GetSelectEntry());
1397     return 0;
1398 }
1399 
1400 
IMPL_LINK(SmSymbolDialog,SymbolChangeHdl,SmShowSymbolSet *,EMPTYARG pShowSymbolSet)1401 IMPL_LINK( SmSymbolDialog, SymbolChangeHdl, SmShowSymbolSet *, EMPTYARG pShowSymbolSet )
1402 {
1403     (void) pShowSymbolSet;
1404 #if OSL_DEBUG_LEVEL > 1
1405     DBG_ASSERT(pShowSymbolSet == &aSymbolSetDisplay, "Sm : falsches Argument");
1406 #endif
1407 
1408     SelectSymbol(aSymbolSetDisplay.GetSelectSymbol());
1409     return 0;
1410 }
1411 
IMPL_LINK(SmSymbolDialog,EditClickHdl,Button *,EMPTYARG pButton)1412 IMPL_LINK( SmSymbolDialog, EditClickHdl, Button *, EMPTYARG pButton )
1413 {
1414     (void) pButton;
1415 #if OSL_DEBUG_LEVEL > 1
1416     DBG_ASSERT(pButton == &aEditBtn, "Sm : falsches Argument");
1417 #endif
1418 
1419     SmSymDefineDialog *pDialog = new SmSymDefineDialog(this, pFontListDev, rSymbolMgr);
1420 
1421     // aktuelles Symbol und SymbolSet am neuen Dialog setzen
1422     const XubString  aSymSetName (aSymbolSets.GetSelectEntry()),
1423                     aSymName    (aSymbolName.GetText());
1424     pDialog->SelectOldSymbolSet(aSymSetName);
1425     pDialog->SelectOldSymbol(aSymName);
1426     pDialog->SelectSymbolSet(aSymSetName);
1427     pDialog->SelectSymbol(aSymName);
1428 
1429     // altes SymbolSet merken
1430     XubString  aOldSymbolSet (aSymbolSets.GetSelectEntry());
1431 
1432     sal_uInt16 nSymPos = GetSelectedSymbol();
1433 
1434     // Dialog an evtl geaenderte Daten des SymbolSet Manager anpassen
1435     if (pDialog->Execute() == RET_OK  &&  rSymbolMgr.IsModified())
1436     {
1437         rSymbolMgr.Save();
1438         FillSymbolSets();
1439     }
1440 
1441     // wenn das alte SymbolSet nicht mehr existiert zum ersten gehen
1442     // (soweit eines vorhanden ist)
1443     if (!SelectSymbolSet(aOldSymbolSet)  &&  aSymbolSets.GetEntryCount() > 0)
1444         SelectSymbolSet(aSymbolSets.GetEntry(0));
1445     else
1446     {
1447         // just update display of current symbol set
1448         DBG_ASSERT( aSymSetName == aSymSetName, "unexpected change in symbol set name" );
1449         aSymbolSet      = rSymbolMgr.GetSymbolSet( aSymbolSetName );
1450         aSymbolSetDisplay.SetSymbolSet( aSymbolSet );
1451     }
1452 
1453     if (nSymPos >= aSymbolSet.size())
1454         nSymPos = static_cast< sal_uInt16 >(aSymbolSet.size()) - 1;
1455     SelectSymbol( nSymPos );
1456 
1457     delete pDialog;
1458     return 0;
1459 }
1460 
1461 
IMPL_LINK(SmSymbolDialog,SymbolDblClickHdl,SmShowSymbolSet *,EMPTYARG pShowSymbolSet)1462 IMPL_LINK( SmSymbolDialog, SymbolDblClickHdl, SmShowSymbolSet *, EMPTYARG pShowSymbolSet )
1463 {
1464     (void) pShowSymbolSet;
1465 #if OSL_DEBUG_LEVEL > 1
1466     DBG_ASSERT(pShowSymbolSet == &aSymbolSetDisplay, "Sm : falsches Argument");
1467 #endif
1468 
1469     GetClickHdl(&aGetBtn);
1470     EndDialog(RET_OK);
1471     return 0;
1472 }
1473 
1474 
IMPL_LINK(SmSymbolDialog,GetClickHdl,Button *,EMPTYARG pButton)1475 IMPL_LINK( SmSymbolDialog, GetClickHdl, Button *, EMPTYARG pButton )
1476 {
1477     (void) pButton;
1478 #if OSL_DEBUG_LEVEL > 1
1479     DBG_ASSERT(pButton == &aGetBtn, "Sm : falscher Button");
1480 #endif
1481 
1482     const SmSym *pSym = GetSymbol();
1483     if (pSym)
1484     {
1485         String  aText ('%');
1486         aText += pSym->GetName();
1487         aText += (sal_Unicode)' ';
1488 
1489         rViewSh.GetViewFrame()->GetDispatcher()->Execute(
1490                 SID_INSERTTEXT, SFX_CALLMODE_STANDARD,
1491                 new SfxStringItem(SID_INSERTTEXT, aText), 0L);
1492     }
1493 
1494     return 0;
1495 }
1496 
1497 
IMPL_LINK_INLINE_START(SmSymbolDialog,CloseClickHdl,Button *,EMPTYARG pButton)1498 IMPL_LINK_INLINE_START( SmSymbolDialog, CloseClickHdl, Button *, EMPTYARG pButton )
1499 {
1500     (void) pButton;
1501 #if OSL_DEBUG_LEVEL > 1
1502     DBG_ASSERT(pButton == &aCloseBtn, "Sm : falscher Button");
1503 #endif
1504 
1505     EndDialog(sal_True);
1506     return 0;
1507 }
IMPL_LINK_INLINE_END(SmSymbolDialog,CloseClickHdl,Button *,pButton)1508 IMPL_LINK_INLINE_END( SmSymbolDialog, CloseClickHdl, Button *, pButton )
1509 
1510 
1511 SmSymbolDialog::SmSymbolDialog(Window *pParent, OutputDevice *pFntListDevice,
1512         SmSymbolManager &rMgr, SmViewShell &rViewShell, sal_Bool bFreeRes) :
1513     ModalDialog         (pParent, SmResId(RID_SYMBOLDIALOG)),
1514     aSymbolSetText      (this, SmResId(1)),
1515     aSymbolSets         (this, SmResId(1)),
1516     aSymbolSetDisplay   (this, SmResId(1)),
1517     aSymbolName         (this, SmResId(2)),
1518     aSymbolDisplay      (this, SmResId(2)),
1519     aGetBtn             (this, SmResId(2)),
1520     aCloseBtn           (this, SmResId(3)),
1521     aEditBtn            (this, SmResId(1)),
1522     rViewSh             (rViewShell),
1523     rSymbolMgr          (rMgr),
1524     pFontListDev        (pFntListDevice)
1525 {
1526     if (bFreeRes)
1527         FreeResource();
1528 
1529     aSymbolSetName = String();
1530     aSymbolSet.clear();
1531     FillSymbolSets();
1532     if (aSymbolSets.GetEntryCount() > 0)
1533         SelectSymbolSet(aSymbolSets.GetEntry(0));
1534 
1535     InitColor_Impl();
1536 
1537     // preview like controls should have a 2D look
1538     aSymbolDisplay.SetBorderStyle( WINDOW_BORDER_MONO );
1539 
1540     aSymbolSets      .SetSelectHdl  (LINK(this, SmSymbolDialog, SymbolSetChangeHdl));
1541     aSymbolSetDisplay.SetSelectHdl  (LINK(this, SmSymbolDialog, SymbolChangeHdl));
1542     aSymbolSetDisplay.SetDblClickHdl(LINK(this, SmSymbolDialog, SymbolDblClickHdl));
1543     aSymbolDisplay   .SetDblClickHdl(LINK(this, SmSymbolDialog, SymbolDblClickHdl));
1544     aCloseBtn        .SetClickHdl   (LINK(this, SmSymbolDialog, CloseClickHdl));
1545     aEditBtn         .SetClickHdl   (LINK(this, SmSymbolDialog, EditClickHdl));
1546     aGetBtn          .SetClickHdl   (LINK(this, SmSymbolDialog, GetClickHdl));
1547 }
1548 
1549 
~SmSymbolDialog()1550 SmSymbolDialog::~SmSymbolDialog()
1551 {
1552 }
1553 
1554 
InitColor_Impl()1555 void SmSymbolDialog::InitColor_Impl()
1556 {
1557 #if OSL_DEBUG_LEVEL > 1
1558     Color aBC( GetDisplayBackground().GetColor() );
1559 #endif
1560     ColorData   nBgCol  = COL_WHITE,
1561                 nTxtCol = COL_BLACK;
1562     const StyleSettings &rS = GetSettings().GetStyleSettings();
1563     if (rS.GetHighContrastMode())
1564     {
1565         nBgCol  = rS.GetFieldColor().GetColor();
1566         nTxtCol = rS.GetFieldTextColor().GetColor();
1567     }
1568 
1569     Color aTmpColor( nBgCol );
1570     Wallpaper aWall( aTmpColor );
1571     Color aTxtColor( nTxtCol );
1572     aSymbolDisplay   .SetBackground( aWall );
1573     aSymbolDisplay   .SetTextColor( aTxtColor );
1574     aSymbolSetDisplay.SetBackground( aWall );
1575     aSymbolSetDisplay.SetTextColor( aTxtColor );
1576 }
1577 
1578 
DataChanged(const DataChangedEvent & rDCEvt)1579 void SmSymbolDialog::DataChanged( const DataChangedEvent& rDCEvt )
1580 {
1581     if ( rDCEvt.GetType() == DATACHANGED_SETTINGS  &&
1582          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
1583             InitColor_Impl();
1584 
1585     ModalDialog::DataChanged( rDCEvt );
1586 }
1587 
1588 
SelectSymbolSet(const XubString & rSymbolSetName)1589 sal_Bool SmSymbolDialog::SelectSymbolSet(const XubString &rSymbolSetName)
1590 {
1591     sal_Bool    bRet = sal_False;
1592     sal_uInt16  nPos = aSymbolSets.GetEntryPos(rSymbolSetName);
1593 
1594     aSymbolSetName = String();
1595     aSymbolSet.clear();
1596     if (nPos != LISTBOX_ENTRY_NOTFOUND)
1597     {
1598         aSymbolSets.SelectEntryPos(nPos);
1599 
1600         aSymbolSetName  = rSymbolSetName;
1601         aSymbolSet      = rSymbolMgr.GetSymbolSet( aSymbolSetName );
1602 
1603         // sort symbols by Unicode position (useful for displaying Greek characters alphabetically)
1604         std::sort( aSymbolSet.begin(), aSymbolSet.end(), lt_SmSymPtr() );
1605 
1606         aSymbolSetDisplay.SetSymbolSet( aSymbolSet );
1607         if (aSymbolSet.size() > 0)
1608             SelectSymbol(0);
1609 
1610         bRet = sal_True;
1611     }
1612     else
1613         aSymbolSets.SetNoSelection();
1614 
1615     return bRet;
1616 }
1617 
1618 
SelectSymbol(sal_uInt16 nSymbolNo)1619 void SmSymbolDialog::SelectSymbol(sal_uInt16 nSymbolNo)
1620 {
1621     const SmSym *pSym = NULL;
1622     if (aSymbolSetName.Len() > 0  &&  nSymbolNo < static_cast< sal_uInt16 >(aSymbolSet.size()))
1623         pSym = aSymbolSet[ nSymbolNo ];
1624 
1625     aSymbolSetDisplay.SelectSymbol(nSymbolNo);
1626     aSymbolDisplay.SetSymbol(pSym);
1627     aSymbolName.SetText(pSym ? pSym->GetName() : XubString());
1628 }
1629 
1630 
GetSymbol() const1631 const SmSym * SmSymbolDialog::GetSymbol() const
1632 {
1633     sal_uInt16 nSymbolNo = aSymbolSetDisplay.GetSelectSymbol();
1634     bool bValid = aSymbolSetName.Len() > 0  &&  nSymbolNo < static_cast< sal_uInt16 >(aSymbolSet.size());
1635     return bValid ? aSymbolSet[ nSymbolNo ] : NULL;
1636 }
1637 
1638 
1639 ////////////////////////////////////////////////////////////////////////////////
1640 
1641 
Paint(const Rectangle & rRect)1642 void SmShowChar::Paint(const Rectangle &rRect)
1643 {
1644     Control::Paint( rRect );
1645 
1646     OUString aText( GetText() );
1647     if (aText.getLength() > 0)
1648     {
1649 #if OSL_DEBUG_LEVEL > 1
1650         sal_Int32 nPos = 0;
1651         sal_UCS4 cChar = aText.iterateCodePoints( &nPos );
1652         (void) cChar;
1653 #endif
1654         Size aTextSize(GetTextWidth(aText), GetTextHeight());
1655 
1656         DrawText(Point((GetOutputSize().Width()  - aTextSize.Width())  / 2,
1657                        (GetOutputSize().Height() * 7/10)), aText);
1658     }
1659 }
1660 
1661 
SetSymbol(const SmSym * pSym)1662 void SmShowChar::SetSymbol( const SmSym *pSym )
1663 {
1664     if (pSym)
1665         SetSymbol( pSym->GetCharacter(), pSym->GetFace() );
1666 }
1667 
1668 
SetSymbol(sal_UCS4 cChar,const Font & rFont)1669 void SmShowChar::SetSymbol( sal_UCS4 cChar, const Font &rFont )
1670 {
1671     Font aFont( rFont );
1672     aFont.SetSize( Size(0, GetOutputSize().Height() - GetOutputSize().Height() / 3) );
1673     aFont.SetAlign(ALIGN_BASELINE);
1674     SetFont(aFont);
1675 
1676     String aText( OUString( &cChar, 1) );
1677     SetText( aText );
1678 
1679     Invalidate();
1680 }
1681 
1682 
1683 ////////////////////////////////////////////////////////////////////////////////
1684 
FillSymbols(ComboBox & rComboBox,sal_Bool bDeleteText)1685 void SmSymDefineDialog::FillSymbols(ComboBox &rComboBox, sal_Bool bDeleteText)
1686 {
1687 #if OSL_DEBUG_LEVEL > 1
1688     DBG_ASSERT(&rComboBox == &aOldSymbols  ||  &rComboBox == &aSymbols,
1689         "Sm : falsche ComboBox");
1690 #endif
1691 
1692     rComboBox.Clear();
1693     if (bDeleteText)
1694         rComboBox.SetText(XubString());
1695 
1696     ComboBox &rBox = &rComboBox == &aOldSymbols ? aOldSymbolSets : aSymbolSets;
1697     SymbolPtrVec_t aSymSet( aSymbolMgrCopy.GetSymbolSet( rBox.GetText() ) );
1698     for (size_t i = 0;  i < aSymSet.size();  ++i)
1699         rComboBox.InsertEntry( aSymSet[i]->GetName() );
1700 }
1701 
1702 
FillSymbolSets(ComboBox & rComboBox,sal_Bool bDeleteText)1703 void SmSymDefineDialog::FillSymbolSets(ComboBox &rComboBox, sal_Bool bDeleteText)
1704 {
1705 #if OSL_DEBUG_LEVEL > 1
1706     DBG_ASSERT(&rComboBox == &aOldSymbolSets  ||  &rComboBox == &aSymbolSets,
1707         "Sm : falsche ComboBox");
1708 #endif
1709 
1710     rComboBox.Clear();
1711     if (bDeleteText)
1712         rComboBox.SetText(XubString());
1713 
1714     const std::set< String >  aSymbolSetNames( aSymbolMgrCopy.GetSymbolSetNames() );
1715     std::set< String >::const_iterator aIt( aSymbolSetNames.begin() );
1716     for ( ;  aIt != aSymbolSetNames.end();  ++aIt)
1717         rComboBox.InsertEntry( *aIt );
1718 }
1719 
1720 
FillFonts(sal_Bool bDelete)1721 void SmSymDefineDialog::FillFonts(sal_Bool bDelete)
1722 {
1723     aFonts.Clear();
1724     if (bDelete)
1725         aFonts.SetNoSelection();
1726 
1727     // alle Fonts der 'FontList' in die Fontliste aufnehmen
1728     // von denen mit gleichen Namen jedoch nur einen (denn der Style wird
1729     // ueber die 'FontStyleBox' gewaehlt und nicht auch noch hier)
1730     if (pFontList)
1731     {
1732         sal_uInt16  nCount = pFontList->GetFontNameCount();
1733         for (sal_uInt16 i = 0;  i < nCount;  i++)
1734             aFonts.InsertEntry( pFontList->GetFontName(i).GetName() );
1735     }
1736 }
1737 
1738 
FillStyles(sal_Bool bDeleteText)1739 void SmSymDefineDialog::FillStyles(sal_Bool bDeleteText)
1740 {
1741     aStyles.Clear();
1742     if (bDeleteText)
1743         aStyles.SetText(XubString());
1744 
1745     XubString aText (aFonts.GetSelectEntry());
1746     if (aText.Len() != 0)
1747     {
1748         //aStyles.Fill(aText, &aFontList);
1749         // eigene StyleName's verwenden
1750         const SmFontStyles &rStyles = GetFontStyles();
1751         for (sal_uInt16 i = 0;  i < rStyles.GetCount();  i++)
1752             aStyles.InsertEntry( rStyles.GetStyleName(i) );
1753 
1754 #if OSL_DEBUG_LEVEL > 1
1755         DBG_ASSERT(aStyles.GetEntryCount() > 0, "Sm : keine Styles vorhanden");
1756 #endif
1757         aStyles.SetText( aStyles.GetEntry(0) );
1758     }
1759 }
1760 
1761 
GetSymbol(const ComboBox & rComboBox)1762 SmSym * SmSymDefineDialog::GetSymbol(const ComboBox &rComboBox)
1763 {
1764 #if OSL_DEBUG_LEVEL > 1
1765     DBG_ASSERT(&rComboBox == &aOldSymbols  ||  &rComboBox == &aSymbols,
1766         "Sm : falsche ComboBox");
1767 #endif
1768     return aSymbolMgrCopy.GetSymbolByName(rComboBox.GetText());
1769 }
1770 
1771 
IMPL_LINK(SmSymDefineDialog,OldSymbolChangeHdl,ComboBox *,EMPTYARG pComboBox)1772 IMPL_LINK( SmSymDefineDialog, OldSymbolChangeHdl, ComboBox *, EMPTYARG pComboBox )
1773 {
1774     (void) pComboBox;
1775 #if OSL_DEBUG_LEVEL > 1
1776     DBG_ASSERT(pComboBox == &aOldSymbols, "Sm : falsches Argument");
1777 #endif
1778     SelectSymbol(aOldSymbols, aOldSymbols.GetText(), sal_False);
1779     return 0;
1780 }
1781 
1782 
IMPL_LINK(SmSymDefineDialog,OldSymbolSetChangeHdl,ComboBox *,EMPTYARG pComboBox)1783 IMPL_LINK( SmSymDefineDialog, OldSymbolSetChangeHdl, ComboBox *, EMPTYARG pComboBox )
1784 {
1785     (void) pComboBox;
1786 #if OSL_DEBUG_LEVEL > 1
1787     DBG_ASSERT(pComboBox == &aOldSymbolSets, "Sm : falsches Argument");
1788 #endif
1789     SelectSymbolSet(aOldSymbolSets, aOldSymbolSets.GetText(), sal_False);
1790     return 0;
1791 }
1792 
1793 
IMPL_LINK(SmSymDefineDialog,ModifyHdl,ComboBox *,pComboBox)1794 IMPL_LINK( SmSymDefineDialog, ModifyHdl, ComboBox *, pComboBox )
1795 {
1796     // merken der Cursorposition zum wiederherstellen derselben
1797     Selection  aSelection (pComboBox->GetSelection());
1798 
1799     if (pComboBox == &aSymbols)
1800         SelectSymbol(aSymbols, aSymbols.GetText(), sal_False);
1801     else if (pComboBox == &aSymbolSets)
1802         SelectSymbolSet(aSymbolSets, aSymbolSets.GetText(), sal_False);
1803     else if (pComboBox == &aOldSymbols)
1804         // nur Namen aus der Liste erlauben
1805         SelectSymbol(aOldSymbols, aOldSymbols.GetText(), sal_True);
1806     else if (pComboBox == &aOldSymbolSets)
1807         // nur Namen aus der Liste erlauben
1808         SelectSymbolSet(aOldSymbolSets, aOldSymbolSets.GetText(), sal_True);
1809     else if (pComboBox == &aStyles)
1810         // nur Namen aus der Liste erlauben (ist hier eh immer der Fall)
1811         SelectStyle(aStyles.GetText(), sal_True);
1812     else
1813     {
1814 #if OSL_DEBUG_LEVEL > 1
1815         DBG_ASSERT(0, "Sm : falsche ComboBox Argument");
1816 #endif
1817     }
1818 
1819     pComboBox->SetSelection(aSelection);
1820 
1821     UpdateButtons();
1822 
1823     return 0;
1824 }
1825 
1826 
IMPL_LINK(SmSymDefineDialog,FontChangeHdl,ListBox *,EMPTYARG pListBox)1827 IMPL_LINK( SmSymDefineDialog, FontChangeHdl, ListBox *, EMPTYARG pListBox )
1828 {
1829     (void) pListBox;
1830 #if OSL_DEBUG_LEVEL > 1
1831     DBG_ASSERT(pListBox == &aFonts, "Sm : falsches Argument");
1832 #endif
1833 
1834     SelectFont(aFonts.GetSelectEntry());
1835     return 0;
1836 }
1837 
1838 
IMPL_LINK(SmSymDefineDialog,SubsetChangeHdl,ListBox *,EMPTYARG pListBox)1839 IMPL_LINK( SmSymDefineDialog, SubsetChangeHdl, ListBox *, EMPTYARG pListBox )
1840 {
1841     (void) pListBox;
1842     sal_uInt16 nPos = aFontsSubsetLB.GetSelectEntryPos();
1843     if (LISTBOX_ENTRY_NOTFOUND != nPos)
1844     {
1845         const Subset* pSubset = reinterpret_cast<const Subset*> (aFontsSubsetLB.GetEntryData( nPos ));
1846         if (pSubset)
1847         {
1848             aCharsetDisplay.SelectCharacter( pSubset->GetRangeMin() );
1849         }
1850     }
1851     return 0;
1852 }
1853 
1854 
IMPL_LINK(SmSymDefineDialog,StyleChangeHdl,ComboBox *,EMPTYARG pComboBox)1855 IMPL_LINK( SmSymDefineDialog, StyleChangeHdl, ComboBox *, EMPTYARG pComboBox )
1856 {
1857     (void) pComboBox;
1858 #if OSL_DEBUG_LEVEL > 1
1859     DBG_ASSERT(pComboBox == &aStyles, "Sm : falsches Argument");
1860 #endif
1861 
1862     SelectStyle(aStyles.GetText());
1863     return 0;
1864 }
1865 
1866 
IMPL_LINK(SmSymDefineDialog,CharHighlightHdl,Control *,EMPTYARG)1867 IMPL_LINK( SmSymDefineDialog, CharHighlightHdl, Control *, EMPTYARG )
1868 {
1869    sal_UCS4 cChar = aCharsetDisplay.GetSelectCharacter();
1870 
1871 #if OSL_DEBUG_LEVEL > 1
1872     DBG_ASSERT( pSubsetMap, "SubsetMap missing" );
1873 #endif
1874     if (pSubsetMap)
1875     {
1876         const Subset* pSubset = pSubsetMap->GetSubsetByUnicode( cChar );
1877         if (pSubset)
1878             aFontsSubsetLB.SelectEntry( pSubset->GetName() );
1879         else
1880             aFontsSubsetLB.SetNoSelection();
1881     }
1882 
1883     aSymbolDisplay.SetSymbol( cChar, aCharsetDisplay.GetFont() );
1884 
1885     UpdateButtons();
1886 
1887     // display Unicode position as symbol name while iterating over characters
1888     const String aHex( String::CreateFromInt64( cChar, 16 ).ToUpperAscii() );
1889     const String aPattern( A2OU( aHex.Len() > 4 ? "Ux000000" : "Ux0000" ) );
1890     String aUnicodePos( aPattern.Copy( 0, aPattern.Len() - aHex.Len() ) );
1891     aUnicodePos += aHex;
1892     aSymbols.SetText( aUnicodePos );
1893     aSymbolName.SetText( aUnicodePos );
1894 
1895     return 0;
1896 }
1897 
1898 
IMPL_LINK(SmSymDefineDialog,AddClickHdl,Button *,EMPTYARG pButton)1899 IMPL_LINK( SmSymDefineDialog, AddClickHdl, Button *, EMPTYARG pButton )
1900 {
1901     (void) pButton;
1902 #if OSL_DEBUG_LEVEL > 1
1903     DBG_ASSERT(pButton == &aAddBtn, "Sm : falsches Argument");
1904     DBG_ASSERT(aAddBtn.IsEnabled(), "Sm : Voraussetzungen erfuellt ??");
1905 #endif
1906 
1907     // add symbol
1908     const SmSym aNewSymbol( aSymbols.GetText(), aCharsetDisplay.GetFont(),
1909             aCharsetDisplay.GetSelectCharacter(), aSymbolSets.GetText() );
1910     //DBG_ASSERT( aSymbolMgrCopy.GetSymbolByName(aTmpSymbolName) == NULL, "symbol already exists" );
1911     aSymbolMgrCopy.AddOrReplaceSymbol( aNewSymbol );
1912 
1913     // update display of new symbol
1914     aSymbolDisplay.SetSymbol( &aNewSymbol );
1915     aSymbolName.SetText( aNewSymbol.GetName() );
1916     aSymbolSetName.SetText( aNewSymbol.GetSymbolSetName() );
1917 
1918     // update list box entries
1919     FillSymbolSets(aOldSymbolSets, sal_False);
1920     FillSymbolSets(aSymbolSets,    sal_False);
1921     FillSymbols(aOldSymbols ,sal_False);
1922     FillSymbols(aSymbols    ,sal_False);
1923 
1924     UpdateButtons();
1925 
1926     return 0;
1927 }
1928 
1929 
IMPL_LINK(SmSymDefineDialog,ChangeClickHdl,Button *,EMPTYARG pButton)1930 IMPL_LINK( SmSymDefineDialog, ChangeClickHdl, Button *, EMPTYARG pButton )
1931 {
1932     (void) pButton;
1933 #if OSL_DEBUG_LEVEL > 1
1934     DBG_ASSERT(pButton == &aChangeBtn, "Sm : falsches Argument");
1935     DBG_ASSERT(aChangeBtn.IsEnabled(), "Sm : Voraussetzungen erfuellt ??");
1936 #endif
1937 
1938     // get new Sybol to use
1939     //! get font from symbol-disp lay since charset-display does not keep
1940     //! the bold attribut.
1941     const SmSym aNewSymbol( aSymbols.GetText(), aCharsetDisplay.GetFont(),
1942             aCharsetDisplay.GetSelectCharacter(), aSymbolSets.GetText() );
1943 
1944     // remove old symbol if the name was changed then add new one
1945 //    const bool bSetNameChanged    = aOldSymbolSets.GetText() != aSymbolSets.GetText();
1946     const bool bNameChanged       = aOldSymbols.GetText() != aSymbols.GetText();
1947     if (bNameChanged)
1948         aSymbolMgrCopy.RemoveSymbol( aOldSymbols.GetText() );
1949     aSymbolMgrCopy.AddOrReplaceSymbol( aNewSymbol, true );
1950 
1951     // clear display for original symbol if necessary
1952     if (bNameChanged)
1953         SetOrigSymbol(NULL, XubString());
1954 
1955     // update display of new symbol
1956     aSymbolDisplay.SetSymbol( &aNewSymbol );
1957     aSymbolName.SetText( aNewSymbol.GetName() );
1958     aSymbolSetName.SetText( aNewSymbol.GetSymbolSetName() );
1959 
1960     // update list box entries
1961     FillSymbolSets(aOldSymbolSets, sal_False);
1962     FillSymbolSets(aSymbolSets,    sal_False);
1963     FillSymbols(aOldSymbols ,sal_False);
1964     FillSymbols(aSymbols    ,sal_False);
1965 
1966     UpdateButtons();
1967 
1968     return 0;
1969 }
1970 
1971 
IMPL_LINK(SmSymDefineDialog,DeleteClickHdl,Button *,EMPTYARG pButton)1972 IMPL_LINK( SmSymDefineDialog, DeleteClickHdl, Button *, EMPTYARG pButton )
1973 {
1974     (void) pButton;
1975 #if OSL_DEBUG_LEVEL > 1
1976     DBG_ASSERT(pButton == &aDeleteBtn, "Sm : falsches Argument");
1977     DBG_ASSERT(aDeleteBtn.IsEnabled(), "Sm : Voraussetzungen erfuellt ??");
1978 #endif
1979 
1980     if (pOrigSymbol)
1981     {
1982         aSymbolMgrCopy.RemoveSymbol( pOrigSymbol->GetName() );
1983 
1984         // clear display for original symbol
1985         SetOrigSymbol(NULL, XubString());
1986 
1987         // update list box entries
1988         FillSymbolSets(aOldSymbolSets, sal_False);
1989         FillSymbolSets(aSymbolSets,    sal_False);
1990         FillSymbols(aOldSymbols ,sal_False);
1991         FillSymbols(aSymbols    ,sal_False);
1992     }
1993 
1994     UpdateButtons();
1995 
1996     return 0;
1997 }
1998 
1999 
UpdateButtons()2000 void SmSymDefineDialog::UpdateButtons()
2001 {
2002     sal_Bool  bAdd    = sal_False,
2003           bChange = sal_False,
2004           bDelete = sal_False,
2005           bEqual;
2006     XubString aTmpSymbolName    (aSymbols.GetText()),
2007               aTmpSymbolSetName (aSymbolSets.GetText());
2008 
2009     if (aTmpSymbolName.Len() > 0  &&  aTmpSymbolSetName.Len() > 0)
2010     {
2011         // alle Einstellungen gleich?
2012         //! (Font-, Style- und SymbolSet Name werden nicht case sensitiv verglichen)
2013         bEqual = pOrigSymbol
2014                     && aTmpSymbolSetName.EqualsIgnoreCaseAscii(aOldSymbolSetName.GetText())
2015                     && aTmpSymbolName.Equals(pOrigSymbol->GetName())
2016                     && aFonts.GetSelectEntry().EqualsIgnoreCaseAscii(
2017                             pOrigSymbol->GetFace().GetName())
2018                     && aStyles.GetText().EqualsIgnoreCaseAscii(
2019                             GetFontStyles().GetStyleName(pOrigSymbol->GetFace()))
2020                     && aCharsetDisplay.GetSelectCharacter() == pOrigSymbol->GetCharacter();
2021 
2022         // hinzufuegen nur wenn es noch kein Symbol desgleichen Namens gibt
2023         bAdd    = aSymbolMgrCopy.GetSymbolByName(aTmpSymbolName) == NULL;
2024 
2025         // loeschen nur wenn alle Einstellungen gleich sind
2026         bDelete = pOrigSymbol != NULL;
2027 
2028         // aendern wenn bei gleichem Namen mindestens eine Einstellung anders ist
2029         // oder wenn es noch kein Symbol des neuen Namens gibt (wuerde implizites
2030         // loeschen des bereits vorhandenen Symbols erfordern)
2031 //        sal_Bool  bEqualName = pOrigSymbol && aTmpSymbolName == pOrigSymbol->GetName();
2032 //      bChange = pOrigSymbol && ( (bEqualName && !bEqual) || (!bEqualName && bAdd) );
2033 
2034         // aendern nur falls altes Symbol vorhanden und am neuen etwas anders ist
2035         bChange = pOrigSymbol && !bEqual;
2036 }
2037 
2038     aAddBtn   .Enable(bAdd);
2039     aChangeBtn.Enable(bChange);
2040     aDeleteBtn.Enable(bDelete);
2041 }
2042 
2043 
SmSymDefineDialog(Window * pParent,OutputDevice * pFntListDevice,SmSymbolManager & rMgr,sal_Bool bFreeRes)2044 SmSymDefineDialog::SmSymDefineDialog(Window * pParent,
2045         OutputDevice *pFntListDevice, SmSymbolManager &rMgr, sal_Bool bFreeRes) :
2046     ModalDialog         (pParent, SmResId(RID_SYMDEFINEDIALOG)),
2047     aOldSymbolText      (this, SmResId(1)),
2048     aOldSymbols         (this, SmResId(1)),
2049     aOldSymbolSetText   (this, SmResId(2)),
2050     aOldSymbolSets      (this, SmResId(2)),
2051     aCharsetDisplay     (this, SmResId(1)),
2052     aSymbolText         (this, SmResId(9)),
2053     aSymbols            (this, SmResId(4)),
2054     aSymbolSetText      (this, SmResId(10)),
2055     aSymbolSets         (this, SmResId(5)),
2056     aFontText           (this, SmResId(3)),
2057     aFonts              (this, SmResId(1)),
2058     aFontsSubsetFT      (this, SmResId( FT_FONTS_SUBSET )),
2059     aFontsSubsetLB      (this, SmResId( LB_FONTS_SUBSET )),
2060     aStyleText          (this, SmResId(4)),
2061     aStyles             (this, SmResId(3)),
2062     aOldSymbolName      (this, SmResId(7)),
2063     aOldSymbolDisplay   (this, SmResId(3)),
2064     aOldSymbolSetName   (this, SmResId(8)),
2065     aSymbolName         (this, SmResId(5)),
2066     aSymbolDisplay      (this, SmResId(2)),
2067     aSymbolSetName      (this, SmResId(6)),
2068     aOkBtn              (this, SmResId(1)),
2069     aCancelBtn          (this, SmResId(1)),
2070     aAddBtn             (this, SmResId(1)),
2071     aChangeBtn          (this, SmResId(2)),
2072     aDeleteBtn          (this, SmResId(3)),
2073     aRightArrow         (this, SmResId(1)),
2074     aRigthArrow_Im      (SmResId(1)),
2075     aRigthArrow_Im_HC   (SmResId(2)),   // hi-contrast version
2076     rSymbolMgr          (rMgr),
2077     pSubsetMap          (NULL),
2078     pFontList           (NULL)
2079 {
2080     if (bFreeRes)
2081         FreeResource();
2082 
2083     pFontList = new FontList( pFntListDevice );
2084 
2085     pOrigSymbol = 0;
2086 
2087     // auto completion is troublesome since that symbols character also gets automatically selected in the
2088     // display and if the user previously selected a character to define/redefine that one this is bad
2089     aOldSymbols.EnableAutocomplete( sal_False, sal_True );
2090     aSymbols   .EnableAutocomplete( sal_False, sal_True );
2091 
2092     FillFonts();
2093     if (aFonts.GetEntryCount() > 0)
2094         SelectFont(aFonts.GetEntry(0));
2095 
2096     InitColor_Impl();
2097 
2098     SetSymbolSetManager(rSymbolMgr);
2099 
2100     aOldSymbols    .SetSelectHdl(LINK(this, SmSymDefineDialog, OldSymbolChangeHdl));
2101     aOldSymbolSets .SetSelectHdl(LINK(this, SmSymDefineDialog, OldSymbolSetChangeHdl));
2102     aSymbolSets    .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl));
2103     aOldSymbolSets .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl));
2104     aSymbols       .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl));
2105     aOldSymbols    .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl));
2106     aStyles        .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl));
2107     aFonts         .SetSelectHdl(LINK(this, SmSymDefineDialog, FontChangeHdl));
2108     aFontsSubsetLB .SetSelectHdl(LINK(this, SmSymDefineDialog, SubsetChangeHdl));
2109     aStyles        .SetSelectHdl(LINK(this, SmSymDefineDialog, StyleChangeHdl));
2110     aAddBtn        .SetClickHdl (LINK(this, SmSymDefineDialog, AddClickHdl));
2111     aChangeBtn     .SetClickHdl (LINK(this, SmSymDefineDialog, ChangeClickHdl));
2112     aDeleteBtn     .SetClickHdl (LINK(this, SmSymDefineDialog, DeleteClickHdl));
2113     aCharsetDisplay.SetHighlightHdl( LINK( this, SmSymDefineDialog, CharHighlightHdl ) );
2114 
2115     // preview like controls should have a 2D look
2116     aOldSymbolDisplay.SetBorderStyle( WINDOW_BORDER_MONO );
2117     aSymbolDisplay   .SetBorderStyle( WINDOW_BORDER_MONO );
2118 }
2119 
2120 
~SmSymDefineDialog()2121 SmSymDefineDialog::~SmSymDefineDialog()
2122 {
2123     delete pSubsetMap;
2124     delete pOrigSymbol;
2125 }
2126 
InitColor_Impl()2127 void SmSymDefineDialog::InitColor_Impl()
2128 {
2129 #if OSL_DEBUG_LEVEL > 1
2130     Color aBC( GetDisplayBackground().GetColor() );
2131 #endif
2132     ColorData   nBgCol  = COL_WHITE,
2133                 nTxtCol = COL_BLACK;
2134     sal_Bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
2135     if (bHighContrast)
2136     {
2137         const StyleSettings &rS = GetSettings().GetStyleSettings();
2138         nBgCol  = rS.GetFieldColor().GetColor();
2139         nTxtCol = rS.GetFieldTextColor().GetColor();
2140     }
2141 
2142     Color aTmpColor( nBgCol );
2143     Wallpaper aWall( aTmpColor );
2144     Color aTxtColor( nTxtCol );
2145     aCharsetDisplay  .SetBackground( aWall );
2146     aCharsetDisplay  .SetTextColor( aTxtColor );
2147     aOldSymbolDisplay.SetBackground( aWall );
2148     aOldSymbolDisplay.SetTextColor( aTxtColor );
2149     aSymbolDisplay   .SetBackground( aWall );
2150     aSymbolDisplay   .SetTextColor( aTxtColor );
2151 
2152     const Image &rArrowRight = bHighContrast ? aRigthArrow_Im_HC : aRigthArrow_Im;
2153     aRightArrow.SetImage( rArrowRight );
2154 }
2155 
2156 
DataChanged(const DataChangedEvent & rDCEvt)2157 void SmSymDefineDialog::DataChanged( const DataChangedEvent& rDCEvt )
2158 {
2159     if ( rDCEvt.GetType() == DATACHANGED_SETTINGS  &&
2160          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
2161             InitColor_Impl();
2162 
2163     ModalDialog::DataChanged( rDCEvt );
2164 }
2165 
2166 
Execute()2167 short SmSymDefineDialog::Execute()
2168 {
2169     short nResult = ModalDialog::Execute();
2170 
2171     // Aenderungen uebernehmen falls Dialog mit OK beendet wurde
2172     if (aSymbolMgrCopy.IsModified()  &&  nResult == RET_OK)
2173         rSymbolMgr = aSymbolMgrCopy;
2174 
2175     return nResult;
2176 }
2177 
2178 
SetSymbolSetManager(const SmSymbolManager & rMgr)2179 void SmSymDefineDialog::SetSymbolSetManager(const SmSymbolManager &rMgr)
2180 {
2181     aSymbolMgrCopy = rMgr;
2182 #ifdef DEBUG
2183 //        sal_uInt16 nS = aSymbolMgrCopy.GetSymbolSetCount();
2184 #endif
2185 
2186     // Das modified Flag der Kopie auf sal_False setzen, damit man spaeter damit
2187     // testen kann ob sich was geaendert hat.
2188     aSymbolMgrCopy.SetModified(sal_False);
2189 
2190     FillSymbolSets(aOldSymbolSets);
2191     if (aOldSymbolSets.GetEntryCount() > 0)
2192         SelectSymbolSet(aOldSymbolSets.GetEntry(0));
2193     FillSymbolSets(aSymbolSets);
2194     if (aSymbolSets.GetEntryCount() > 0)
2195         SelectSymbolSet(aSymbolSets.GetEntry(0));
2196     FillSymbols(aOldSymbols);
2197     if (aOldSymbols.GetEntryCount() > 0)
2198         SelectSymbol(aOldSymbols.GetEntry(0));
2199     FillSymbols(aSymbols);
2200     if (aSymbols.GetEntryCount() > 0)
2201         SelectSymbol(aSymbols.GetEntry(0));
2202 
2203     UpdateButtons();
2204 }
2205 
2206 
SelectSymbolSet(ComboBox & rComboBox,const XubString & rSymbolSetName,sal_Bool bDeleteText)2207 sal_Bool SmSymDefineDialog::SelectSymbolSet(ComboBox &rComboBox,
2208         const XubString &rSymbolSetName, sal_Bool bDeleteText)
2209 {
2210 #if OSL_DEBUG_LEVEL > 1
2211     DBG_ASSERT(&rComboBox == &aOldSymbolSets  ||  &rComboBox == &aSymbolSets,
2212         "Sm : falsche ComboBox");
2213 #endif
2214 
2215     // 'Normalisieren' des SymbolNamens (ohne leading und trailing Leerzeichen)
2216     XubString  aNormName (rSymbolSetName);
2217     aNormName.EraseLeadingChars(' ');
2218     aNormName.EraseTrailingChars(' ');
2219     // und evtl Abweichungen in der Eingabe beseitigen
2220     rComboBox.SetText(aNormName);
2221 
2222     sal_Bool   bRet = sal_False;
2223     sal_uInt16 nPos = rComboBox.GetEntryPos(aNormName);
2224 
2225     if (nPos != COMBOBOX_ENTRY_NOTFOUND)
2226     {
2227         rComboBox.SetText(rComboBox.GetEntry(nPos));
2228         bRet = sal_True;
2229     }
2230     else if (bDeleteText)
2231         rComboBox.SetText(XubString());
2232 
2233     sal_Bool  bIsOld = &rComboBox == &aOldSymbolSets;
2234 
2235     // setzen des SymbolSet Namens an der zugehoerigen Darstellung
2236     FixedText &rFT = bIsOld ? aOldSymbolSetName : aSymbolSetName;
2237     rFT.SetText(rComboBox.GetText());
2238 
2239     // setzen der zum SymbolSet gehoerenden Symbol Namen an der zugehoerigen
2240     // Auswahbox
2241     ComboBox  &rCB = bIsOld ? aOldSymbols : aSymbols;
2242     FillSymbols(rCB, sal_False);
2243 
2244     // bei Wechsel des SymbolSets fuer das alte Zeichen ein gueltiges
2245     // Symbol bzw keins zur Anzeige bringen
2246     if (bIsOld)
2247     {
2248         XubString  aTmpOldSymbolName;
2249         if (aOldSymbols.GetEntryCount() > 0)
2250             aTmpOldSymbolName = aOldSymbols.GetEntry(0);
2251         SelectSymbol(aOldSymbols, aTmpOldSymbolName, sal_True);
2252     }
2253 
2254     UpdateButtons();
2255 
2256     return bRet;
2257 }
2258 
2259 
SetOrigSymbol(const SmSym * pSymbol,const XubString & rSymbolSetName)2260 void SmSymDefineDialog::SetOrigSymbol(const SmSym *pSymbol,
2261                                       const XubString &rSymbolSetName)
2262 {
2263     // clear old symbol
2264     delete pOrigSymbol;
2265     pOrigSymbol = 0;
2266 
2267     XubString   aSymName,
2268                 aSymSetName;
2269     if (pSymbol)
2270     {
2271         // set new symbol
2272         pOrigSymbol = new SmSym( *pSymbol );
2273 
2274         aSymName    = pSymbol->GetName();
2275         aSymSetName = rSymbolSetName;
2276         aOldSymbolDisplay.SetSymbol( pSymbol );
2277     }
2278     else
2279     {   // loeschen des angezeigten Symbols
2280         aOldSymbolDisplay.SetText(XubString());
2281         aOldSymbolDisplay.Invalidate();
2282     }
2283     aOldSymbolName   .SetText(aSymName);
2284     aOldSymbolSetName.SetText(aSymSetName);
2285 }
2286 
2287 
SelectSymbol(ComboBox & rComboBox,const XubString & rSymbolName,sal_Bool bDeleteText)2288 sal_Bool SmSymDefineDialog::SelectSymbol(ComboBox &rComboBox,
2289         const XubString &rSymbolName, sal_Bool bDeleteText)
2290 {
2291 #if OSL_DEBUG_LEVEL > 1
2292     DBG_ASSERT(&rComboBox == &aOldSymbols  ||  &rComboBox == &aSymbols,
2293         "Sm : falsche ComboBox");
2294 #endif
2295 
2296     // 'Normalisieren' des SymbolNamens (ohne Leerzeichen)
2297     XubString  aNormName (rSymbolName);
2298     aNormName.EraseAllChars(' ');
2299     // und evtl Abweichungen in der Eingabe beseitigen
2300     rComboBox.SetText(aNormName);
2301 
2302     sal_Bool   bRet = sal_False;
2303     sal_uInt16 nPos = rComboBox.GetEntryPos(aNormName);
2304 
2305     sal_Bool  bIsOld = &rComboBox == &aOldSymbols;
2306 
2307     if (nPos != COMBOBOX_ENTRY_NOTFOUND)
2308     {
2309         rComboBox.SetText(rComboBox.GetEntry(nPos));
2310 
2311         if (!bIsOld)
2312         {
2313             const SmSym *pSymbol = GetSymbol(aSymbols);
2314             if (pSymbol)
2315             {
2316                 // Font und Style entsprechend waehlen
2317                 const Font &rFont = pSymbol->GetFace();
2318                 SelectFont(rFont.GetName(), sal_False);
2319                 SelectStyle(GetFontStyles().GetStyleName(rFont), sal_False);
2320 
2321                 // da das setzen des Fonts ueber den Style Namen des SymbolsFonts nicht
2322                 // so gut klappt (er kann zB leer sein obwohl der Font selbst 'bold' und
2323                 // 'italic' ist!). Setzen wir hier den Font wie er zum Symbol gehoert
2324                 // zu Fuss.
2325                 aCharsetDisplay.SetFont(rFont);
2326                 aSymbolDisplay.SetFont(rFont);
2327 
2328                 // das zugehoerige Zeichen auswaehlen
2329                 SelectChar(pSymbol->GetCharacter());
2330 
2331                 // since SelectChar will also set the unicode point as text in the
2332                 // symbols box, we have to set the symbol name again to get that one displayed
2333                 aSymbols.SetText( pSymbol->GetName() );
2334             }
2335         }
2336 
2337         bRet = sal_True;
2338     }
2339     else if (bDeleteText)
2340         rComboBox.SetText(XubString());
2341 
2342     if (bIsOld)
2343     {
2344         // bei Wechsel des alten Symbols nur vorhandene anzeigen sonst keins
2345         const SmSym *pOldSymbol = NULL;
2346         XubString     aTmpOldSymbolSetName;
2347         if (nPos != COMBOBOX_ENTRY_NOTFOUND)
2348         {
2349             pOldSymbol        = aSymbolMgrCopy.GetSymbolByName(aNormName);
2350             aTmpOldSymbolSetName = aOldSymbolSets.GetText();
2351         }
2352         SetOrigSymbol(pOldSymbol, aTmpOldSymbolSetName);
2353     }
2354     else
2355         aSymbolName.SetText(rComboBox.GetText());
2356 
2357     UpdateButtons();
2358 
2359     return bRet;
2360 }
2361 
2362 
SetFont(const XubString & rFontName,const XubString & rStyleName)2363 void SmSymDefineDialog::SetFont(const XubString &rFontName, const XubString &rStyleName)
2364 {
2365     // Font (FontInfo) passend zu Namen und Style holen
2366     FontInfo aFI;
2367     if (pFontList)
2368         aFI = pFontList->Get(rFontName, WEIGHT_NORMAL, ITALIC_NONE);
2369     SetFontStyle(rStyleName, aFI);
2370 
2371     aCharsetDisplay.SetFont(aFI);
2372     aSymbolDisplay.SetFont(aFI);
2373 
2374     // update subset listbox for new font's unicode subsets
2375     FontCharMap aFontCharMap;
2376     aCharsetDisplay.GetFontCharMap( aFontCharMap );
2377     if (pSubsetMap)
2378         delete pSubsetMap;
2379     pSubsetMap = new SubsetMap( &aFontCharMap );
2380     //
2381     aFontsSubsetLB.Clear();
2382     bool bFirst = true;
2383     const Subset* pSubset;
2384     while( NULL != (pSubset = pSubsetMap->GetNextSubset( bFirst )) )
2385     {
2386         sal_uInt16 nPos = aFontsSubsetLB.InsertEntry( pSubset->GetName());
2387         aFontsSubsetLB.SetEntryData( nPos, (void *) pSubset );
2388         // subset must live at least as long as the selected font !!!
2389         if( bFirst )
2390             aFontsSubsetLB.SelectEntryPos( nPos );
2391         bFirst = false;
2392     }
2393     if( bFirst )
2394         aFontsSubsetLB.SetNoSelection();
2395     aFontsSubsetLB.Enable( !bFirst );
2396 }
2397 
2398 
SelectFont(const XubString & rFontName,sal_Bool bApplyFont)2399 sal_Bool SmSymDefineDialog::SelectFont(const XubString &rFontName, sal_Bool bApplyFont)
2400 {
2401     sal_Bool   bRet = sal_False;
2402     sal_uInt16 nPos = aFonts.GetEntryPos(rFontName);
2403 
2404     if (nPos != LISTBOX_ENTRY_NOTFOUND)
2405     {
2406         aFonts.SelectEntryPos(nPos);
2407         if (aStyles.GetEntryCount() > 0)
2408             SelectStyle(aStyles.GetEntry(0));
2409         if (bApplyFont)
2410         {
2411             SetFont(aFonts.GetSelectEntry(), aStyles.GetText());
2412             // update preview to use new font
2413             aSymbolDisplay.SetSymbol( aCharsetDisplay.GetSelectCharacter(), aCharsetDisplay.GetFont() );
2414         }
2415         bRet = sal_True;
2416     }
2417     else
2418         aFonts.SetNoSelection();
2419     FillStyles();
2420 
2421     UpdateButtons();
2422 
2423     return bRet;
2424 }
2425 
2426 
SelectStyle(const XubString & rStyleName,sal_Bool bApplyFont)2427 sal_Bool SmSymDefineDialog::SelectStyle(const XubString &rStyleName, sal_Bool bApplyFont)
2428 {
2429     sal_Bool   bRet = sal_False;
2430     sal_uInt16 nPos = aStyles.GetEntryPos(rStyleName);
2431 
2432     // falls der Style nicht zur Auswahl steht nehmen wir den erst moeglichen
2433     // (sofern vorhanden)
2434     if (nPos == COMBOBOX_ENTRY_NOTFOUND  &&  aStyles.GetEntryCount() > 0)
2435         nPos = 0;
2436 
2437     if (nPos != COMBOBOX_ENTRY_NOTFOUND)
2438     {
2439         aStyles.SetText(aStyles.GetEntry(nPos));
2440         if (bApplyFont)
2441         {
2442             SetFont(aFonts.GetSelectEntry(), aStyles.GetText());
2443             // update preview to use new font
2444             aSymbolDisplay.SetSymbol( aCharsetDisplay.GetSelectCharacter(), aCharsetDisplay.GetFont() );
2445         }
2446         bRet = sal_True;
2447     }
2448     else
2449         aStyles.SetText(XubString());
2450 
2451     UpdateButtons();
2452 
2453     return bRet;
2454 }
2455 
2456 
SelectChar(xub_Unicode cChar)2457 void SmSymDefineDialog::SelectChar(xub_Unicode cChar)
2458 {
2459     aCharsetDisplay.SelectCharacter( cChar );
2460     aSymbolDisplay.SetSymbol( cChar, aCharsetDisplay.GetFont() );
2461 
2462     UpdateButtons();
2463 }
2464 
2465 
2466 /**************************************************************************/
2467 
2468