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