Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "tools/rcid.h"
21 : #include <comphelper/string.hxx>
22 : #include <svl/eitem.hxx>
23 : #include <svl/intitem.hxx>
24 : #include <svl/stritem.hxx>
25 : #include <sfx2/app.hxx>
26 : #include <vcl/builder.hxx>
27 : #include <vcl/layout.hxx>
28 : #include <vcl/msgbox.hxx>
29 : #include <svtools/ctrltool.hxx>
30 : #include <sfx2/printer.hxx>
31 : #include <vcl/help.hxx>
32 : #include <vcl/waitobj.hxx>
33 : #include <vcl/settings.hxx>
34 : #include <vcl/wall.hxx>
35 : #include <sfx2/dispatch.hxx>
36 : #include <sfx2/sfx.hrc>
37 : #include <osl/diagnose.h>
38 : #include <svx/ucsubset.hxx>
39 :
40 :
41 : #include "dialog.hxx"
42 : #include "starmath.hrc"
43 : #include "config.hxx"
44 : #include "dialog.hrc"
45 : #include "smmod.hxx"
46 : #include "symbol.hxx"
47 : #include "view.hxx"
48 : #include "document.hxx"
49 : #include "unomodel.hxx"
50 :
51 :
52 : // Since it's better to set/query the FontStyle via its attributes rather
53 : // than via the StyleName we create a way to translate
54 : // Attribute <-> StyleName
55 :
56 0 : class SmFontStyles
57 : {
58 : OUString aNormal;
59 : OUString aBold;
60 : OUString aItalic;
61 : OUString aBoldItalic;
62 : OUString aEmpty;
63 :
64 : public:
65 : SmFontStyles();
66 :
67 0 : sal_uInt16 GetCount() const { return 4; }
68 : const OUString& GetStyleName( const Font &rFont ) const;
69 : const OUString& GetStyleName( sal_uInt16 nIdx ) const;
70 : };
71 :
72 :
73 0 : SmFontStyles::SmFontStyles() :
74 0 : aNormal ( ResId( RID_FONTREGULAR, *SM_MOD()->GetResMgr() ) ),
75 0 : aBold ( ResId( RID_FONTBOLD, *SM_MOD()->GetResMgr() ) ),
76 0 : aItalic ( ResId( RID_FONTITALIC, *SM_MOD()->GetResMgr() ) )
77 : {
78 :
79 0 : aBoldItalic = aBold;
80 0 : aBoldItalic += ", ";
81 0 : aBoldItalic += aItalic;
82 0 : }
83 :
84 :
85 0 : const OUString& SmFontStyles::GetStyleName( const Font &rFont ) const
86 : {
87 : //! compare also SmSpecialNode::Prepare
88 0 : bool bBold = IsBold( rFont ),
89 0 : bItalic = IsItalic( rFont );
90 :
91 0 : if (bBold && bItalic)
92 0 : return aBoldItalic;
93 0 : else if (bItalic)
94 0 : return aItalic;
95 0 : else if (bBold)
96 0 : return aBold;
97 0 : return aNormal;
98 : }
99 :
100 :
101 0 : const OUString& SmFontStyles::GetStyleName( sal_uInt16 nIdx ) const
102 : {
103 : // 0 = "normal", 1 = "italic",
104 : // 2 = "bold", 3 = "bold italic"
105 :
106 : #if OSL_DEBUG_LEVEL > 1
107 : OSL_ENSURE( nIdx < GetCount(), "index out of range" );
108 : #endif
109 0 : switch (nIdx)
110 : {
111 0 : case 0 : return aNormal;
112 0 : case 1 : return aItalic;
113 0 : case 2 : return aBold;
114 0 : case 3 : return aBoldItalic;
115 : }
116 0 : return aEmpty;
117 : }
118 :
119 :
120 0 : const SmFontStyles & GetFontStyles()
121 : {
122 0 : static const SmFontStyles aImpl;
123 0 : return aImpl;
124 : }
125 :
126 : /////////////////////////////////////////////////////////////////
127 :
128 0 : void SetFontStyle(const OUString &rStyleName, Font &rFont)
129 : {
130 : // Find index related to StyleName. For an empty StyleName it's assumed to be
131 : // 0 (neither bold nor italic).
132 0 : sal_uInt16 nIndex = 0;
133 0 : if (!rStyleName.isEmpty())
134 : {
135 : sal_uInt16 i;
136 0 : const SmFontStyles &rStyles = GetFontStyles();
137 0 : for (i = 0; i < rStyles.GetCount(); ++i)
138 0 : if (rStyleName == rStyles.GetStyleName(i))
139 0 : break;
140 : #if OSL_DEBUG_LEVEL > 1
141 : OSL_ENSURE(i < rStyles.GetCount(), "style-name unknown");
142 : #endif
143 0 : nIndex = i;
144 : }
145 :
146 0 : rFont.SetItalic((nIndex & 0x1) ? ITALIC_NORMAL : ITALIC_NONE);
147 0 : rFont.SetWeight((nIndex & 0x2) ? WEIGHT_BOLD : WEIGHT_NORMAL);
148 0 : }
149 :
150 :
151 : /**************************************************************************/
152 :
153 0 : IMPL_LINK_INLINE_START( SmPrintOptionsTabPage, SizeButtonClickHdl, Button *, EMPTYARG/*pButton*/ )
154 : {
155 0 : m_pZoom->Enable(m_pSizeZoomed->IsChecked());
156 0 : return 0;
157 : }
158 0 : IMPL_LINK_INLINE_END( SmPrintOptionsTabPage, SizeButtonClickHdl, Button *, pButton )
159 :
160 :
161 0 : SmPrintOptionsTabPage::SmPrintOptionsTabPage(Window *pParent, const SfxItemSet &rOptions)
162 0 : : SfxTabPage(pParent, "SmathSettings", "modules/smath/ui/smathsettings.ui", rOptions)
163 : {
164 0 : get( m_pTitle, "title");
165 0 : get( m_pText, "text");
166 0 : get( m_pFrame, "frame");
167 0 : get( m_pSizeNormal, "sizenormal");
168 0 : get( m_pSizeScaled, "sizescaled");
169 0 : get( m_pSizeZoomed, "sizezoomed");
170 0 : get( m_pZoom, "zoom");
171 0 : get( m_pNoRightSpaces, "norightspaces");
172 0 : get( m_pSaveOnlyUsedSymbols, "saveonlyusedsymbols");
173 :
174 0 : m_pSizeNormal->SetClickHdl(LINK(this, SmPrintOptionsTabPage, SizeButtonClickHdl));
175 0 : m_pSizeScaled->SetClickHdl(LINK(this, SmPrintOptionsTabPage, SizeButtonClickHdl));
176 0 : m_pSizeZoomed->SetClickHdl(LINK(this, SmPrintOptionsTabPage, SizeButtonClickHdl));
177 :
178 0 : Reset(rOptions);
179 0 : }
180 :
181 :
182 0 : sal_Bool SmPrintOptionsTabPage::FillItemSet(SfxItemSet& rSet)
183 : {
184 : sal_uInt16 nPrintSize;
185 0 : if (m_pSizeNormal->IsChecked())
186 0 : nPrintSize = PRINT_SIZE_NORMAL;
187 0 : else if (m_pSizeScaled->IsChecked())
188 0 : nPrintSize = PRINT_SIZE_SCALED;
189 : else
190 0 : nPrintSize = PRINT_SIZE_ZOOMED;
191 :
192 0 : rSet.Put(SfxUInt16Item(GetWhich(SID_PRINTSIZE), (sal_uInt16) nPrintSize));
193 0 : rSet.Put(SfxUInt16Item(GetWhich(SID_PRINTZOOM), (sal_uInt16) m_pZoom->GetValue()));
194 0 : rSet.Put(SfxBoolItem(GetWhich(SID_PRINTTITLE), m_pTitle->IsChecked()));
195 0 : rSet.Put(SfxBoolItem(GetWhich(SID_PRINTTEXT), m_pText->IsChecked()));
196 0 : rSet.Put(SfxBoolItem(GetWhich(SID_PRINTFRAME), m_pFrame->IsChecked()));
197 0 : rSet.Put(SfxBoolItem(GetWhich(SID_NO_RIGHT_SPACES), m_pNoRightSpaces->IsChecked()));
198 0 : rSet.Put(SfxBoolItem(GetWhich(SID_SAVE_ONLY_USED_SYMBOLS), m_pSaveOnlyUsedSymbols->IsChecked()));
199 :
200 0 : return true;
201 : }
202 :
203 :
204 0 : void SmPrintOptionsTabPage::Reset(const SfxItemSet& rSet)
205 : {
206 0 : SmPrintSize ePrintSize = (SmPrintSize)((const SfxUInt16Item &)rSet.Get(GetWhich(SID_PRINTSIZE))).GetValue();
207 :
208 0 : m_pSizeNormal->Check(ePrintSize == PRINT_SIZE_NORMAL);
209 0 : m_pSizeScaled->Check(ePrintSize == PRINT_SIZE_SCALED);
210 0 : m_pSizeZoomed->Check(ePrintSize == PRINT_SIZE_ZOOMED);
211 :
212 0 : m_pZoom->Enable(m_pSizeZoomed->IsChecked());
213 :
214 0 : m_pZoom->SetValue(((const SfxUInt16Item &)rSet.Get(GetWhich(SID_PRINTZOOM))).GetValue());
215 :
216 0 : m_pTitle->Check(((const SfxBoolItem &)rSet.Get(GetWhich(SID_PRINTTITLE))).GetValue());
217 0 : m_pText->Check(((const SfxBoolItem &)rSet.Get(GetWhich(SID_PRINTTEXT))).GetValue());
218 0 : m_pFrame->Check(((const SfxBoolItem &)rSet.Get(GetWhich(SID_PRINTFRAME))).GetValue());
219 0 : m_pNoRightSpaces->Check(((const SfxBoolItem &)rSet.Get(GetWhich(SID_NO_RIGHT_SPACES))).GetValue());
220 0 : m_pSaveOnlyUsedSymbols->Check(((const SfxBoolItem &)rSet.Get(GetWhich(SID_SAVE_ONLY_USED_SYMBOLS))).GetValue());
221 0 : }
222 :
223 :
224 0 : SfxTabPage* SmPrintOptionsTabPage::Create(Window* pWindow, const SfxItemSet& rSet)
225 : {
226 0 : return (new SmPrintOptionsTabPage(pWindow, rSet));
227 : }
228 :
229 : /**************************************************************************/
230 :
231 :
232 0 : void SmShowFont::Paint(const Rectangle& rRect )
233 : {
234 0 : Control::Paint( rRect );
235 :
236 0 : OUString Text (GetFont().GetName());
237 0 : Size TextSize(GetTextWidth(Text), GetTextHeight());
238 :
239 0 : DrawText(Point((GetOutputSize().Width() - TextSize.Width()) / 2,
240 0 : (GetOutputSize().Height() - TextSize.Height()) / 2), Text);
241 0 : }
242 :
243 :
244 0 : void SmShowFont::SetFont(const Font& rFont)
245 : {
246 0 : Color aTxtColor( GetTextColor() );
247 0 : Font aFont (rFont);
248 :
249 0 : Invalidate();
250 0 : aFont.SetSize(Size(0, 24));
251 0 : aFont.SetAlign(ALIGN_TOP);
252 0 : Control::SetFont(aFont);
253 :
254 : // keep old text color (new font may have different color)
255 0 : SetTextColor( aTxtColor );
256 0 : }
257 :
258 :
259 0 : IMPL_LINK_INLINE_START( SmFontDialog, FontSelectHdl, ComboBox *, pComboBox )
260 : {
261 0 : Face.SetName(pComboBox->GetText());
262 0 : aShowFont.SetFont(Face);
263 0 : return 0;
264 : }
265 0 : IMPL_LINK_INLINE_END( SmFontDialog, FontSelectHdl, ComboBox *, pComboBox )
266 :
267 :
268 0 : IMPL_LINK( SmFontDialog, FontModifyHdl, ComboBox *, pComboBox )
269 : {
270 : // if font is available in list then use it
271 0 : sal_uInt16 nPos = pComboBox->GetEntryPos( pComboBox->GetText() );
272 0 : if (COMBOBOX_ENTRY_NOTFOUND != nPos)
273 : {
274 0 : FontSelectHdl( pComboBox );
275 : }
276 0 : return 0;
277 : }
278 :
279 :
280 0 : IMPL_LINK( SmFontDialog, AttrChangeHdl, CheckBox *, EMPTYARG /*pCheckBox*/ )
281 : {
282 0 : if (aBoldCheckBox.IsChecked())
283 0 : Face.SetWeight(FontWeight(WEIGHT_BOLD));
284 : else
285 0 : Face.SetWeight(FontWeight(WEIGHT_NORMAL));
286 :
287 0 : if (aItalicCheckBox.IsChecked())
288 0 : Face.SetItalic(ITALIC_NORMAL);
289 : else
290 0 : Face.SetItalic(ITALIC_NONE);
291 :
292 0 : aShowFont.SetFont(Face);
293 0 : return 0;
294 : }
295 :
296 :
297 0 : void SmFontDialog::SetFont(const Font &rFont)
298 : {
299 0 : Face = rFont;
300 :
301 0 : aFontBox.SetText( Face.GetName() );
302 0 : aBoldCheckBox.Check( IsBold( Face ) );
303 0 : aItalicCheckBox.Check( IsItalic( Face ) );
304 :
305 0 : aShowFont.SetFont(Face);
306 0 : }
307 :
308 0 : IMPL_LINK( SmFontDialog, HelpButtonClickHdl, Button *, EMPTYARG /*pButton*/ )
309 : {
310 : // start help system
311 0 : Help* pHelp = Application::GetHelp();
312 0 : if( pHelp )
313 : {
314 0 : pHelp->Start( OUString( "HID_SMA_FONTDIALOG" ), &aHelpButton1 );
315 : }
316 0 : return 0;
317 : }
318 :
319 0 : SmFontDialog::SmFontDialog(Window * pParent,
320 : OutputDevice *pFntListDevice, bool bHideCheckboxes, bool bFreeRes)
321 : : ModalDialog(pParent,SmResId(RID_FONTDIALOG)),
322 : aFixedText1 (this, SmResId(1)),
323 : aFontBox (this, SmResId(1)),
324 : aBoldCheckBox (this, SmResId(1)),
325 : aItalicCheckBox (this, SmResId(2)),
326 : aOKButton1 (this, SmResId(1)),
327 : aHelpButton1 (this, SmResId(1)),
328 : aCancelButton1 (this, SmResId(1)),
329 : aShowFont (this, SmResId(1)),
330 0 : aFixedText2 (this, SmResId(2))
331 : {
332 0 : if (bFreeRes)
333 0 : FreeResource();
334 0 : aHelpButton1.SetClickHdl(LINK(this, SmFontDialog, HelpButtonClickHdl));
335 :
336 : {
337 0 : WaitObject aWait( this );
338 :
339 0 : FontList aFontList( pFntListDevice );
340 :
341 0 : sal_uInt16 nCount = aFontList.GetFontNameCount();
342 0 : for (sal_uInt16 i = 0; i < nCount; i++)
343 0 : aFontBox.InsertEntry( aFontList.GetFontName(i).GetName() );
344 :
345 0 : Face.SetSize(Size(0, 24));
346 0 : Face.SetWeight(WEIGHT_NORMAL);
347 0 : Face.SetItalic(ITALIC_NONE);
348 0 : Face.SetFamily(FAMILY_DONTKNOW);
349 0 : Face.SetPitch(PITCH_DONTKNOW);
350 0 : Face.SetCharSet(RTL_TEXTENCODING_DONTKNOW);
351 0 : Face.SetTransparent(true);
352 :
353 0 : InitColor_Impl();
354 :
355 : // preview like controls should have a 2D look
356 0 : aShowFont.SetBorderStyle( WINDOW_BORDER_MONO );
357 : }
358 :
359 0 : aFontBox.SetSelectHdl(LINK(this, SmFontDialog, FontSelectHdl));
360 0 : aFontBox.SetModifyHdl(LINK(this, SmFontDialog, FontModifyHdl));
361 0 : aBoldCheckBox.SetClickHdl(LINK(this, SmFontDialog, AttrChangeHdl));
362 0 : aItalicCheckBox.SetClickHdl(LINK(this, SmFontDialog, AttrChangeHdl));
363 :
364 0 : if (bHideCheckboxes)
365 : {
366 0 : aBoldCheckBox.Check( false );
367 0 : aBoldCheckBox.Enable( false );
368 0 : aBoldCheckBox.Show( false );
369 0 : aItalicCheckBox.Check( false );
370 0 : aItalicCheckBox.Enable( false );
371 0 : aItalicCheckBox.Show( false );
372 0 : aFixedText2.Show( false );
373 :
374 0 : Size aSize( aFontBox.GetSizePixel() );
375 0 : long nComboBoxBottom = aFontBox.GetPosPixel().Y() + aFontBox.GetSizePixel().Height();
376 0 : long nCheckBoxBottom = aItalicCheckBox.GetPosPixel().Y() + aItalicCheckBox.GetSizePixel().Height();
377 0 : aSize.Height() += nCheckBoxBottom - nComboBoxBottom;
378 0 : aFontBox.SetSizePixel( aSize );
379 : }
380 0 : }
381 :
382 : namespace
383 : {
384 0 : void getColors(Window &rRef, ColorData &rBgCol, ColorData &rTxtCol)
385 : {
386 0 : const StyleSettings &rS = rRef.GetSettings().GetStyleSettings();
387 0 : if (rS.GetHighContrastMode())
388 : {
389 0 : rBgCol = rS.GetFieldColor().GetColor();
390 0 : rTxtCol = rS.GetFieldTextColor().GetColor();
391 : }
392 : else
393 : {
394 0 : rBgCol = COL_WHITE;
395 0 : rTxtCol = COL_BLACK;
396 : }
397 0 : }
398 : }
399 :
400 0 : void SmFontDialog::InitColor_Impl()
401 : {
402 : ColorData nBgCol, nTxtCol;
403 0 : getColors(*this, nBgCol, nTxtCol);
404 :
405 0 : Color aTmpColor( nBgCol );
406 0 : Wallpaper aWall( aTmpColor );
407 0 : Color aTxtColor( nTxtCol );
408 0 : aShowFont.SetBackground( aWall );
409 0 : aShowFont.SetTextColor( aTxtColor );
410 0 : }
411 :
412 0 : void SmFontDialog::DataChanged( const DataChangedEvent& rDCEvt )
413 : {
414 0 : if ( rDCEvt.GetType() == DATACHANGED_SETTINGS &&
415 0 : (rDCEvt.GetFlags() & SETTINGS_STYLE) )
416 0 : InitColor_Impl();
417 :
418 0 : ModalDialog::DataChanged( rDCEvt );
419 0 : }
420 :
421 0 : class SaveDefaultsQuery : public MessageDialog
422 : {
423 : public:
424 0 : SaveDefaultsQuery(Window *pParent)
425 : : MessageDialog(pParent, "SaveDefaultsDialog",
426 0 : "modules/smath/ui/savedefaultsdialog.ui")
427 : {
428 0 : }
429 : };
430 :
431 0 : IMPL_LINK( SmFontSizeDialog, DefaultButtonClickHdl, Button *, EMPTYARG /*pButton*/ )
432 : {
433 0 : if (SaveDefaultsQuery(this).Execute() == RET_YES)
434 : {
435 0 : SmModule *pp = SM_MOD();
436 0 : SmFormat aFmt( pp->GetConfig()->GetStandardFormat() );
437 0 : WriteTo( aFmt );
438 0 : pp->GetConfig()->SetStandardFormat( aFmt );
439 : }
440 0 : return 0;
441 : }
442 :
443 0 : SmFontSizeDialog::SmFontSizeDialog(Window * pParent)
444 0 : : ModalDialog(pParent, "FontSizeDialog", "modules/smath/ui/fontsizedialog.ui")
445 : {
446 0 : get(m_pTextSize, "spinB_text");
447 0 : get(m_pIndexSize, "spinB_index");
448 0 : get(m_pFunctionSize, "spinB_function");
449 0 : get(m_pOperatorSize, "spinB_operator");
450 0 : get(m_pBorderSize, "spinB_limit");
451 0 : get(m_pBaseSize, "spinB_baseSize");
452 0 : get(m_pDefaultButton, "default");
453 :
454 0 : m_pDefaultButton->SetClickHdl(LINK(this, SmFontSizeDialog, DefaultButtonClickHdl));
455 0 : }
456 :
457 :
458 0 : void SmFontSizeDialog::ReadFrom(const SmFormat &rFormat)
459 : {
460 : //! aufpassen: richtig runden!
461 : m_pBaseSize->SetValue( SmRoundFraction(
462 0 : Sm100th_mmToPts( rFormat.GetBaseSize().Height() ) ) );
463 :
464 0 : m_pTextSize->SetValue( rFormat.GetRelSize(SIZ_TEXT) );
465 0 : m_pIndexSize->SetValue( rFormat.GetRelSize(SIZ_INDEX) );
466 0 : m_pFunctionSize->SetValue( rFormat.GetRelSize(SIZ_FUNCTION) );
467 0 : m_pOperatorSize->SetValue( rFormat.GetRelSize(SIZ_OPERATOR) );
468 0 : m_pBorderSize->SetValue( rFormat.GetRelSize(SIZ_LIMITS) );
469 0 : }
470 :
471 :
472 0 : void SmFontSizeDialog::WriteTo(SmFormat &rFormat) const
473 : {
474 0 : rFormat.SetBaseSize( Size(0, SmPtsTo100th_mm( static_cast< long >(m_pBaseSize->GetValue()))) );
475 :
476 0 : rFormat.SetRelSize(SIZ_TEXT, (sal_uInt16) m_pTextSize->GetValue());
477 0 : rFormat.SetRelSize(SIZ_INDEX, (sal_uInt16) m_pIndexSize->GetValue());
478 0 : rFormat.SetRelSize(SIZ_FUNCTION, (sal_uInt16) m_pFunctionSize->GetValue());
479 0 : rFormat.SetRelSize(SIZ_OPERATOR, (sal_uInt16) m_pOperatorSize->GetValue());
480 0 : rFormat.SetRelSize(SIZ_LIMITS, (sal_uInt16) m_pBorderSize->GetValue());
481 :
482 0 : const Size aTmp (rFormat.GetBaseSize());
483 0 : for (sal_uInt16 i = FNT_BEGIN; i <= FNT_END; i++)
484 0 : rFormat.SetFontSize(i, aTmp);
485 :
486 0 : rFormat.RequestApplyChanges();
487 0 : }
488 :
489 :
490 : /**************************************************************************/
491 :
492 :
493 0 : IMPL_LINK( SmFontTypeDialog, MenuSelectHdl, Menu *, pMenu )
494 : {
495 : SmFontPickListBox *pActiveListBox;
496 :
497 0 : bool bHideCheckboxes = false;
498 0 : switch (pMenu->GetCurItemId())
499 : {
500 0 : case 1: pActiveListBox = m_pVariableFont; break;
501 0 : case 2: pActiveListBox = m_pFunctionFont; break;
502 0 : case 3: pActiveListBox = m_pNumberFont; break;
503 0 : case 4: pActiveListBox = m_pTextFont; break;
504 0 : case 5: pActiveListBox = m_pSerifFont; bHideCheckboxes = true; break;
505 0 : case 6: pActiveListBox = m_pSansFont; bHideCheckboxes = true; break;
506 0 : case 7: pActiveListBox = m_pFixedFont; bHideCheckboxes = true; break;
507 0 : default:pActiveListBox = NULL;
508 : }
509 :
510 0 : if (pActiveListBox)
511 : {
512 0 : SmFontDialog *pFontDialog = new SmFontDialog(this, pFontListDev, bHideCheckboxes);
513 :
514 0 : pActiveListBox->WriteTo(*pFontDialog);
515 0 : if (pFontDialog->Execute() == RET_OK)
516 0 : pActiveListBox->ReadFrom(*pFontDialog);
517 0 : delete pFontDialog;
518 : }
519 0 : return 0;
520 : }
521 :
522 :
523 0 : IMPL_LINK_INLINE_START( SmFontTypeDialog, DefaultButtonClickHdl, Button *, EMPTYARG /*pButton*/ )
524 : {
525 0 : if (SaveDefaultsQuery(this).Execute() == RET_YES)
526 : {
527 0 : SmModule *pp = SM_MOD();
528 0 : SmFormat aFmt( pp->GetConfig()->GetStandardFormat() );
529 0 : WriteTo( aFmt );
530 0 : pp->GetConfig()->SetStandardFormat( aFmt, true );
531 : }
532 0 : return 0;
533 : }
534 0 : IMPL_LINK_INLINE_END( SmFontTypeDialog, DefaultButtonClickHdl, Button *, pButton )
535 :
536 0 : SmFontTypeDialog::SmFontTypeDialog(Window * pParent, OutputDevice *pFntListDevice)
537 : : ModalDialog(pParent, "FontsDialog", "modules/smath/ui/fonttypedialog.ui"),
538 0 : pFontListDev (pFntListDevice)
539 : {
540 0 : get(m_pVariableFont, "variableCB");
541 0 : get(m_pFunctionFont, "functionCB");
542 0 : get(m_pNumberFont, "numberCB");
543 0 : get(m_pTextFont, "textCB");
544 0 : get(m_pSerifFont, "serifCB");
545 0 : get(m_pSansFont, "sansCB");
546 0 : get(m_pFixedFont, "fixedCB");
547 0 : get(m_pMenuButton, "modify");
548 0 : get(m_pDefaultButton, "default");
549 :
550 0 : m_pDefaultButton->SetClickHdl(LINK(this, SmFontTypeDialog, DefaultButtonClickHdl));
551 :
552 0 : m_pMenuButton->GetPopupMenu()->SetSelectHdl(LINK(this, SmFontTypeDialog, MenuSelectHdl));
553 0 : }
554 :
555 0 : void SmFontTypeDialog::ReadFrom(const SmFormat &rFormat)
556 : {
557 0 : SmModule *pp = SM_MOD();
558 :
559 0 : *m_pVariableFont = pp->GetConfig()->GetFontPickList(FNT_VARIABLE);
560 0 : *m_pFunctionFont = pp->GetConfig()->GetFontPickList(FNT_FUNCTION);
561 0 : *m_pNumberFont = pp->GetConfig()->GetFontPickList(FNT_NUMBER);
562 0 : *m_pTextFont = pp->GetConfig()->GetFontPickList(FNT_TEXT);
563 0 : *m_pSerifFont = pp->GetConfig()->GetFontPickList(FNT_SERIF);
564 0 : *m_pSansFont = pp->GetConfig()->GetFontPickList(FNT_SANS);
565 0 : *m_pFixedFont = pp->GetConfig()->GetFontPickList(FNT_FIXED);
566 :
567 0 : m_pVariableFont->Insert( rFormat.GetFont(FNT_VARIABLE) );
568 0 : m_pFunctionFont->Insert( rFormat.GetFont(FNT_FUNCTION) );
569 0 : m_pNumberFont->Insert( rFormat.GetFont(FNT_NUMBER) );
570 0 : m_pTextFont->Insert( rFormat.GetFont(FNT_TEXT) );
571 0 : m_pSerifFont->Insert( rFormat.GetFont(FNT_SERIF) );
572 0 : m_pSansFont->Insert( rFormat.GetFont(FNT_SANS) );
573 0 : m_pFixedFont->Insert( rFormat.GetFont(FNT_FIXED) );
574 0 : }
575 :
576 :
577 0 : void SmFontTypeDialog::WriteTo(SmFormat &rFormat) const
578 : {
579 0 : SmModule *pp = SM_MOD();
580 :
581 0 : pp->GetConfig()->GetFontPickList(FNT_VARIABLE) = *m_pVariableFont;
582 0 : pp->GetConfig()->GetFontPickList(FNT_FUNCTION) = *m_pFunctionFont;
583 0 : pp->GetConfig()->GetFontPickList(FNT_NUMBER) = *m_pNumberFont;
584 0 : pp->GetConfig()->GetFontPickList(FNT_TEXT) = *m_pTextFont;
585 0 : pp->GetConfig()->GetFontPickList(FNT_SERIF) = *m_pSerifFont;
586 0 : pp->GetConfig()->GetFontPickList(FNT_SANS) = *m_pSansFont;
587 0 : pp->GetConfig()->GetFontPickList(FNT_FIXED) = *m_pFixedFont;
588 :
589 0 : rFormat.SetFont( FNT_VARIABLE, m_pVariableFont->Get(0) );
590 0 : rFormat.SetFont( FNT_FUNCTION, m_pFunctionFont->Get(0) );
591 0 : rFormat.SetFont( FNT_NUMBER, m_pNumberFont->Get(0) );
592 0 : rFormat.SetFont( FNT_TEXT, m_pTextFont->Get(0) );
593 0 : rFormat.SetFont( FNT_SERIF, m_pSerifFont->Get(0) );
594 0 : rFormat.SetFont( FNT_SANS, m_pSansFont->Get(0) );
595 0 : rFormat.SetFont( FNT_FIXED, m_pFixedFont->Get(0) );
596 :
597 0 : rFormat.RequestApplyChanges();
598 0 : }
599 :
600 : /**************************************************************************/
601 :
602 : struct FieldMinMax
603 : {
604 : sal_uInt16 nMin, nMax;
605 : };
606 :
607 : // Data for min and max values of the 4 metric fields
608 : // for each of the 10 categories
609 : static const FieldMinMax pMinMaxData[10][4] =
610 : {
611 : // 0
612 : {{ 0, 200 }, { 0, 200 }, { 0, 100 }, { 0, 0 }},
613 : // 1
614 : {{ 0, 100 }, { 0, 100 }, { 0, 0 }, { 0, 0 }},
615 : // 2
616 : {{ 0, 100 }, { 0, 100 }, { 0, 0 }, { 0, 0 }},
617 : // 3
618 : {{ 0, 100 }, { 1, 100 }, { 0, 0 }, { 0, 0 }},
619 : // 4
620 : {{ 0, 100 }, { 0, 100 }, { 0, 0 }, { 0, 0 }},
621 : // 5
622 : {{ 0, 100 }, { 0, 100 }, { 0, 0 }, { 0, 100 }},
623 : // 6
624 : {{ 0, 300 }, { 0, 300 }, { 0, 0 }, { 0, 0 }},
625 : // 7
626 : {{ 0, 100 }, { 0, 100 }, { 0, 0 }, { 0, 0 }},
627 : // 8
628 : {{ 0, 100 }, { 0, 100 }, { 0, 0 }, { 0, 0 }},
629 : // 9
630 : {{ 0, 10000 }, { 0, 10000 }, { 0, 10000 }, { 0, 10000 }}
631 : };
632 :
633 0 : SmCategoryDesc::SmCategoryDesc(VclBuilderContainer& rBuilder, sal_uInt16 nCategoryIdx)
634 : {
635 0 : ++nCategoryIdx;
636 0 : FixedText *pTitle = rBuilder.get<FixedText>(OString::number(nCategoryIdx)+"title");
637 0 : if (pTitle)
638 : {
639 0 : Name = pTitle->GetText();
640 :
641 0 : for (int i = 0; i < 4; ++i)
642 : {
643 0 : FixedText *pLabel = rBuilder.get<FixedText>(OString::number(nCategoryIdx)+"label"+OString::number(i+1));
644 :
645 0 : if (pLabel)
646 : {
647 0 : Strings [i] = new OUString(pLabel->GetText());
648 0 : FixedImage *pImage = rBuilder.get<FixedImage>(OString::number(nCategoryIdx)+"image"+OString::number(i+1));
649 0 : Graphics [i] = new Image(pImage->GetImage());
650 : }
651 : else
652 : {
653 0 : Strings [i] = 0;
654 0 : Graphics [i] = 0;
655 : }
656 :
657 0 : const FieldMinMax &rMinMax = pMinMaxData[ nCategoryIdx ][i];
658 0 : Value[i] = Minimum[i] = rMinMax.nMin;
659 0 : Maximum[i] = rMinMax.nMax;
660 : }
661 : }
662 0 : }
663 :
664 0 : SmCategoryDesc::~SmCategoryDesc()
665 : {
666 0 : for (int i = 0; i < 4; ++i)
667 : {
668 0 : delete Strings [i];
669 0 : delete Graphics [i];
670 : }
671 0 : }
672 :
673 : /**************************************************************************/
674 :
675 0 : IMPL_LINK( SmDistanceDialog, GetFocusHdl, Control *, pControl )
676 : {
677 0 : if (Categories[nActiveCategory])
678 : {
679 : sal_uInt16 i;
680 :
681 0 : if (pControl == m_pMetricField1)
682 0 : i = 0;
683 0 : else if (pControl == m_pMetricField2)
684 0 : i = 1;
685 0 : else if (pControl == m_pMetricField3)
686 0 : i = 2;
687 0 : else if (pControl == m_pMetricField4)
688 0 : i = 3;
689 : else
690 0 : return 0;
691 0 : m_pBitmap->SetImage(*(Categories[nActiveCategory]->GetGraphic(i)));
692 : }
693 0 : return 0;
694 : }
695 :
696 0 : IMPL_LINK( SmDistanceDialog, MenuSelectHdl, Menu *, pMenu )
697 : {
698 0 : SetCategory(pMenu->GetCurItemId() - 1);
699 0 : return 0;
700 : }
701 :
702 :
703 0 : IMPL_LINK( SmDistanceDialog, DefaultButtonClickHdl, Button *, EMPTYARG /*pButton*/ )
704 : {
705 0 : if (SaveDefaultsQuery(this).Execute() == RET_YES)
706 : {
707 0 : SmModule *pp = SM_MOD();
708 0 : SmFormat aFmt( pp->GetConfig()->GetStandardFormat() );
709 0 : WriteTo( aFmt );
710 0 : pp->GetConfig()->SetStandardFormat( aFmt );
711 : }
712 0 : return 0;
713 : }
714 :
715 0 : IMPL_LINK( SmDistanceDialog, CheckBoxClickHdl, CheckBox *, pCheckBox )
716 : {
717 0 : if (pCheckBox == m_pCheckBox1)
718 : {
719 0 : m_pCheckBox1->Toggle();
720 :
721 0 : bool bChecked = m_pCheckBox1->IsChecked();
722 0 : m_pFixedText4->Enable( bChecked );
723 0 : m_pMetricField4->Enable( bChecked );
724 : }
725 0 : return 0;
726 : }
727 :
728 :
729 0 : void SmDistanceDialog::SetHelpId(MetricField &rField, const OString& sHelpId)
730 : {
731 0 : const OUString aEmptyText;
732 :
733 0 : rField.SetHelpId(sHelpId);
734 0 : rField.SetHelpText(aEmptyText);
735 :
736 : // since MetricField inherits from SpinField which has a sub Edit field
737 : // (which is actually the one we modify) we have to set the help-id
738 : // for it too.
739 0 : Edit *pSubEdit = rField.GetSubEdit();
740 0 : if (pSubEdit)
741 : {
742 0 : pSubEdit->SetHelpId(sHelpId);
743 0 : pSubEdit->SetHelpText(aEmptyText);
744 0 : }
745 0 : }
746 :
747 :
748 0 : void SmDistanceDialog::SetCategory(sal_uInt16 nCategory)
749 : {
750 : #if OSL_DEBUG_LEVEL > 1
751 : OSL_ENSURE(/*0 <= nCategory &&*/ nCategory < NOCATEGORIES,
752 : "Sm: wrong category number in SmDistanceDialog");
753 : #endif
754 :
755 : // array to convert category- and metricfield-number in help ids.
756 : // 0 is used in case of unused combinations.
757 : #if OSL_DEBUG_LEVEL > 1
758 : OSL_ENSURE(NOCATEGORIES == 10, "Sm : array doesn't fit into the number of categories");
759 : #endif
760 : static const char * aCatMf2Hid[10][4] =
761 : {
762 : { HID_SMA_DEFAULT_DIST, HID_SMA_LINE_DIST, HID_SMA_ROOT_DIST, 0 },
763 : { HID_SMA_SUP_DIST, HID_SMA_SUB_DIST , 0, 0 },
764 : { HID_SMA_NUMERATOR_DIST, HID_SMA_DENOMINATOR_DIST, 0, 0 },
765 : { HID_SMA_FRACLINE_EXCWIDTH, HID_SMA_FRACLINE_LINEWIDTH, 0, 0 },
766 : { HID_SMA_UPPERLIMIT_DIST, HID_SMA_LOWERLIMIT_DIST, 0, 0 },
767 : { HID_SMA_BRACKET_EXCHEIGHT, HID_SMA_BRACKET_DIST, 0, HID_SMA_BRACKET_EXCHEIGHT2 },
768 : { HID_SMA_MATRIXROW_DIST, HID_SMA_MATRIXCOL_DIST, 0, 0 },
769 : { HID_SMA_ATTRIBUT_DIST, HID_SMA_INTERATTRIBUT_DIST, 0, 0 },
770 : { HID_SMA_OPERATOR_EXCHEIGHT, HID_SMA_OPERATOR_DIST, 0, 0 },
771 : { HID_SMA_LEFTBORDER_DIST, HID_SMA_RIGHTBORDER_DIST, HID_SMA_UPPERBORDER_DIST, HID_SMA_LOWERBORDER_DIST }
772 : };
773 :
774 : // array to help iterate over the controls
775 : Window * const aWin[4][2] =
776 : {
777 : { m_pFixedText1, m_pMetricField1 },
778 : { m_pFixedText2, m_pMetricField2 },
779 : { m_pFixedText3, m_pMetricField3 },
780 : { m_pFixedText4, m_pMetricField4 }
781 0 : };
782 :
783 : SmCategoryDesc *pCat;
784 :
785 : // remember the (maybe new) settings of the active SmCategoryDesc
786 : // before switching to the new one
787 0 : if (nActiveCategory != CATEGORY_NONE)
788 : {
789 0 : pCat = Categories[nActiveCategory];
790 0 : pCat->SetValue(0, (sal_uInt16) m_pMetricField1->GetValue());
791 0 : pCat->SetValue(1, (sal_uInt16) m_pMetricField2->GetValue());
792 0 : pCat->SetValue(2, (sal_uInt16) m_pMetricField3->GetValue());
793 0 : pCat->SetValue(3, (sal_uInt16) m_pMetricField4->GetValue());
794 :
795 0 : if (nActiveCategory == 5)
796 0 : bScaleAllBrackets = m_pCheckBox1->IsChecked();
797 :
798 0 : m_pMenuButton->GetPopupMenu()->CheckItem(nActiveCategory + 1, false);
799 : }
800 :
801 : // activation/deactivation of the associated controls depending on the chosen category
802 : bool bActive;
803 0 : for (sal_uInt16 i = 0; i < 4; i++)
804 : {
805 0 : FixedText *pFT = (FixedText * const) aWin[i][0];
806 0 : MetricField *pMF = (MetricField * const) aWin[i][1];
807 :
808 : // To determine which Controls should be active, the existence
809 : // of an associated HelpID is checked
810 0 : bActive = aCatMf2Hid[nCategory][i] != 0;
811 :
812 0 : pFT->Show(bActive);
813 0 : pFT->Enable(bActive);
814 0 : pMF->Show(bActive);
815 0 : pMF->Enable(bActive);
816 :
817 : // set measurement unit and number of decimal places
818 : FieldUnit eUnit;
819 : sal_uInt16 nDigits;
820 0 : if (nCategory < 9)
821 : {
822 0 : eUnit = FUNIT_CUSTOM;
823 0 : nDigits = 0;
824 0 : pMF->SetCustomUnitText(OUString('%'));
825 : }
826 : else
827 : {
828 0 : eUnit = FUNIT_100TH_MM;
829 0 : nDigits = 2;
830 : }
831 0 : pMF->SetUnit(eUnit); // changes the value
832 0 : pMF->SetDecimalDigits(nDigits);
833 :
834 0 : if (bActive)
835 : {
836 0 : pCat = Categories[nCategory];
837 0 : pFT->SetText(*pCat->GetString(i));
838 :
839 0 : pMF->SetMin(pCat->GetMinimum(i));
840 0 : pMF->SetMax(pCat->GetMaximum(i));
841 0 : pMF->SetValue(pCat->GetValue(i));
842 :
843 0 : SetHelpId(*pMF, aCatMf2Hid[nCategory][i]);
844 : }
845 : }
846 : // activate the CheckBox and the associated MetricField if we're dealing with the brackets menu
847 0 : bActive = nCategory == 5;
848 0 : m_pCheckBox1->Show(bActive);
849 0 : m_pCheckBox1->Enable(bActive);
850 0 : if (bActive)
851 : {
852 0 : m_pCheckBox1->Check( bScaleAllBrackets );
853 :
854 0 : bool bChecked = m_pCheckBox1->IsChecked();
855 0 : m_pFixedText4->Enable( bChecked );
856 0 : m_pMetricField4->Enable( bChecked );
857 : }
858 :
859 0 : m_pMenuButton->GetPopupMenu()->CheckItem(nCategory + 1, true);
860 0 : m_pFrame->set_label(Categories[nCategory]->GetName());
861 :
862 0 : nActiveCategory = nCategory;
863 :
864 0 : m_pMetricField1->GrabFocus();
865 0 : Invalidate();
866 0 : Update();
867 0 : }
868 :
869 :
870 0 : SmDistanceDialog::SmDistanceDialog(Window *pParent)
871 : : ModalDialog(pParent, "SpacingDialog",
872 0 : "modules/smath/ui/spacingdialog.ui")
873 : {
874 0 : get(m_pFrame, "template");
875 0 : get(m_pFixedText1, "label1");
876 0 : get(m_pMetricField1, "spinbutton1");
877 0 : get(m_pFixedText2, "label2");
878 0 : get(m_pMetricField2, "spinbutton2");
879 0 : get(m_pFixedText3, "label3");
880 0 : get(m_pMetricField3, "spinbutton3");
881 0 : get(m_pCheckBox1, "checkbutton");
882 0 : get(m_pFixedText4, "label4");
883 0 : get(m_pMetricField4, "spinbutton4");
884 0 : get(m_pMenuButton, "category");
885 0 : get(m_pDefaultButton, "default");
886 0 : get(m_pBitmap, "image");
887 :
888 0 : for (sal_uInt16 i = 0; i < NOCATEGORIES; ++i)
889 0 : Categories[i] = new SmCategoryDesc(*this, i);
890 0 : nActiveCategory = CATEGORY_NONE;
891 0 : bScaleAllBrackets = false;
892 :
893 : // preview like controls should have a 2D look
894 0 : m_pBitmap->SetBorderStyle( WINDOW_BORDER_MONO );
895 :
896 0 : m_pMetricField1->SetGetFocusHdl(LINK(this, SmDistanceDialog, GetFocusHdl));
897 0 : m_pMetricField2->SetGetFocusHdl(LINK(this, SmDistanceDialog, GetFocusHdl));
898 0 : m_pMetricField3->SetGetFocusHdl(LINK(this, SmDistanceDialog, GetFocusHdl));
899 0 : m_pMetricField4->SetGetFocusHdl(LINK(this, SmDistanceDialog, GetFocusHdl));
900 0 : m_pCheckBox1->SetClickHdl(LINK(this, SmDistanceDialog, CheckBoxClickHdl));
901 :
902 0 : m_pMenuButton->GetPopupMenu()->SetSelectHdl(LINK(this, SmDistanceDialog, MenuSelectHdl));
903 :
904 0 : m_pDefaultButton->SetClickHdl(LINK(this, SmDistanceDialog, DefaultButtonClickHdl));
905 0 : }
906 :
907 :
908 0 : SmDistanceDialog::~SmDistanceDialog()
909 : {
910 0 : for (int i = 0; i < NOCATEGORIES; i++)
911 0 : DELETEZ(Categories[i]);
912 0 : }
913 :
914 0 : void SmDistanceDialog::DataChanged( const DataChangedEvent &rEvt )
915 : {
916 0 : ModalDialog::DataChanged( rEvt );
917 0 : }
918 :
919 0 : void SmDistanceDialog::ReadFrom(const SmFormat &rFormat)
920 : {
921 0 : Categories[0]->SetValue(0, rFormat.GetDistance(DIS_HORIZONTAL));
922 0 : Categories[0]->SetValue(1, rFormat.GetDistance(DIS_VERTICAL));
923 0 : Categories[0]->SetValue(2, rFormat.GetDistance(DIS_ROOT));
924 0 : Categories[1]->SetValue(0, rFormat.GetDistance(DIS_SUPERSCRIPT));
925 0 : Categories[1]->SetValue(1, rFormat.GetDistance(DIS_SUBSCRIPT));
926 0 : Categories[2]->SetValue(0, rFormat.GetDistance(DIS_NUMERATOR));
927 0 : Categories[2]->SetValue(1, rFormat.GetDistance(DIS_DENOMINATOR));
928 0 : Categories[3]->SetValue(0, rFormat.GetDistance(DIS_FRACTION));
929 0 : Categories[3]->SetValue(1, rFormat.GetDistance(DIS_STROKEWIDTH));
930 0 : Categories[4]->SetValue(0, rFormat.GetDistance(DIS_UPPERLIMIT));
931 0 : Categories[4]->SetValue(1, rFormat.GetDistance(DIS_LOWERLIMIT));
932 0 : Categories[5]->SetValue(0, rFormat.GetDistance(DIS_BRACKETSIZE));
933 0 : Categories[5]->SetValue(1, rFormat.GetDistance(DIS_BRACKETSPACE));
934 0 : Categories[5]->SetValue(3, rFormat.GetDistance(DIS_NORMALBRACKETSIZE));
935 0 : Categories[6]->SetValue(0, rFormat.GetDistance(DIS_MATRIXROW));
936 0 : Categories[6]->SetValue(1, rFormat.GetDistance(DIS_MATRIXCOL));
937 0 : Categories[7]->SetValue(0, rFormat.GetDistance(DIS_ORNAMENTSIZE));
938 0 : Categories[7]->SetValue(1, rFormat.GetDistance(DIS_ORNAMENTSPACE));
939 0 : Categories[8]->SetValue(0, rFormat.GetDistance(DIS_OPERATORSIZE));
940 0 : Categories[8]->SetValue(1, rFormat.GetDistance(DIS_OPERATORSPACE));
941 0 : Categories[9]->SetValue(0, rFormat.GetDistance(DIS_LEFTSPACE));
942 0 : Categories[9]->SetValue(1, rFormat.GetDistance(DIS_RIGHTSPACE));
943 0 : Categories[9]->SetValue(2, rFormat.GetDistance(DIS_TOPSPACE));
944 0 : Categories[9]->SetValue(3, rFormat.GetDistance(DIS_BOTTOMSPACE));
945 :
946 0 : bScaleAllBrackets = rFormat.IsScaleNormalBrackets();
947 :
948 : // force update (even of category 0) by setting nActiveCategory to a
949 : // non-existent category number
950 0 : nActiveCategory = CATEGORY_NONE;
951 0 : SetCategory(0);
952 0 : }
953 :
954 :
955 0 : void SmDistanceDialog::WriteTo(SmFormat &rFormat) /*const*/
956 : {
957 : // TODO can they actually be different?
958 : // if that's not the case 'const' could be used above!
959 0 : SetCategory(nActiveCategory);
960 :
961 0 : rFormat.SetDistance( DIS_HORIZONTAL, Categories[0]->GetValue(0) );
962 0 : rFormat.SetDistance( DIS_VERTICAL, Categories[0]->GetValue(1) );
963 0 : rFormat.SetDistance( DIS_ROOT, Categories[0]->GetValue(2) );
964 0 : rFormat.SetDistance( DIS_SUPERSCRIPT, Categories[1]->GetValue(0) );
965 0 : rFormat.SetDistance( DIS_SUBSCRIPT, Categories[1]->GetValue(1) );
966 0 : rFormat.SetDistance( DIS_NUMERATOR, Categories[2]->GetValue(0) );
967 0 : rFormat.SetDistance( DIS_DENOMINATOR, Categories[2]->GetValue(1) );
968 0 : rFormat.SetDistance( DIS_FRACTION, Categories[3]->GetValue(0) );
969 0 : rFormat.SetDistance( DIS_STROKEWIDTH, Categories[3]->GetValue(1) );
970 0 : rFormat.SetDistance( DIS_UPPERLIMIT, Categories[4]->GetValue(0) );
971 0 : rFormat.SetDistance( DIS_LOWERLIMIT, Categories[4]->GetValue(1) );
972 0 : rFormat.SetDistance( DIS_BRACKETSIZE, Categories[5]->GetValue(0) );
973 0 : rFormat.SetDistance( DIS_BRACKETSPACE, Categories[5]->GetValue(1) );
974 0 : rFormat.SetDistance( DIS_MATRIXROW, Categories[6]->GetValue(0) );
975 0 : rFormat.SetDistance( DIS_MATRIXCOL, Categories[6]->GetValue(1) );
976 0 : rFormat.SetDistance( DIS_ORNAMENTSIZE, Categories[7]->GetValue(0) );
977 0 : rFormat.SetDistance( DIS_ORNAMENTSPACE, Categories[7]->GetValue(1) );
978 0 : rFormat.SetDistance( DIS_OPERATORSIZE, Categories[8]->GetValue(0) );
979 0 : rFormat.SetDistance( DIS_OPERATORSPACE, Categories[8]->GetValue(1) );
980 0 : rFormat.SetDistance( DIS_LEFTSPACE, Categories[9]->GetValue(0) );
981 0 : rFormat.SetDistance( DIS_RIGHTSPACE, Categories[9]->GetValue(1) );
982 0 : rFormat.SetDistance( DIS_TOPSPACE, Categories[9]->GetValue(2) );
983 0 : rFormat.SetDistance( DIS_BOTTOMSPACE, Categories[9]->GetValue(3) );
984 0 : rFormat.SetDistance( DIS_NORMALBRACKETSIZE, Categories[5]->GetValue(3) );
985 :
986 0 : rFormat.SetScaleNormalBrackets( bScaleAllBrackets );
987 :
988 0 : rFormat.RequestApplyChanges();
989 0 : }
990 :
991 0 : IMPL_LINK( SmAlignDialog, DefaultButtonClickHdl, Button *, EMPTYARG /*pButton*/ )
992 : {
993 0 : if (SaveDefaultsQuery(this).Execute() == RET_YES)
994 : {
995 0 : SmModule *pp = SM_MOD();
996 0 : SmFormat aFmt( pp->GetConfig()->GetStandardFormat() );
997 0 : WriteTo( aFmt );
998 0 : pp->GetConfig()->SetStandardFormat( aFmt );
999 : }
1000 0 : return 0;
1001 : }
1002 :
1003 0 : SmAlignDialog::SmAlignDialog(Window * pParent)
1004 : : ModalDialog(pParent, "AlignmentDialog",
1005 0 : "modules/smath/ui/alignmentdialog.ui")
1006 : {
1007 0 : get(m_pLeft, "left");
1008 0 : get(m_pCenter, "center");
1009 0 : get(m_pRight, "right");
1010 0 : get(m_pDefaultButton, "default");
1011 0 : m_pDefaultButton->SetClickHdl(LINK(this, SmAlignDialog, DefaultButtonClickHdl));
1012 0 : }
1013 :
1014 :
1015 0 : void SmAlignDialog::ReadFrom(const SmFormat &rFormat)
1016 : {
1017 0 : switch (rFormat.GetHorAlign())
1018 : {
1019 : case AlignLeft:
1020 0 : m_pLeft->Check(true);
1021 0 : m_pCenter->Check(false);
1022 0 : m_pRight->Check(false);
1023 0 : break;
1024 :
1025 : case AlignCenter:
1026 0 : m_pLeft->Check(false);
1027 0 : m_pCenter->Check(true);
1028 0 : m_pRight->Check(false);
1029 0 : break;
1030 :
1031 : case AlignRight:
1032 0 : m_pLeft->Check(false);
1033 0 : m_pCenter->Check(false);
1034 0 : m_pRight->Check(true);
1035 0 : break;
1036 : }
1037 0 : }
1038 :
1039 :
1040 0 : void SmAlignDialog::WriteTo(SmFormat &rFormat) const
1041 : {
1042 0 : if (m_pLeft->IsChecked())
1043 0 : rFormat.SetHorAlign(AlignLeft);
1044 0 : else if (m_pRight->IsChecked())
1045 0 : rFormat.SetHorAlign(AlignRight);
1046 : else
1047 0 : rFormat.SetHorAlign(AlignCenter);
1048 :
1049 0 : rFormat.RequestApplyChanges();
1050 0 : }
1051 :
1052 :
1053 0 : SmShowSymbolSetWindow::SmShowSymbolSetWindow(Window *pParent, WinBits nStyle)
1054 : : Control(pParent, nStyle)
1055 : , m_pVScrollBar(0)
1056 0 : , nSelectSymbol(SYMBOL_NONE)
1057 : {
1058 : ColorData nBgCol, nTxtCol;
1059 0 : getColors(*this, nBgCol, nTxtCol);
1060 :
1061 0 : Color aTmpColor( nBgCol );
1062 0 : Wallpaper aWall( aTmpColor );
1063 0 : Color aTxtColor( nTxtCol );
1064 0 : SetBackground( aWall );
1065 0 : SetTextColor( aTxtColor );
1066 0 : }
1067 :
1068 0 : Point SmShowSymbolSetWindow::OffsetPoint(const Point &rPoint) const
1069 : {
1070 0 : return Point(rPoint.X() + nXOffset, rPoint.Y() + nYOffset);
1071 : }
1072 :
1073 0 : void SmShowSymbolSetWindow::Paint(const Rectangle&)
1074 : {
1075 0 : Push(PUSH_MAPMODE);
1076 :
1077 : // set MapUnit for which 'nLen' has been calculated
1078 0 : SetMapMode(MapMode(MAP_PIXEL));
1079 :
1080 0 : sal_uInt16 v = sal::static_int_cast< sal_uInt16 >((m_pVScrollBar->GetThumbPos() * nColumns));
1081 0 : size_t nSymbols = aSymbolSet.size();
1082 :
1083 0 : Color aTxtColor( GetTextColor() );
1084 0 : for (sal_uInt16 i = v; i < nSymbols ; i++)
1085 : {
1086 0 : SmSym aSymbol (*aSymbolSet[i]);
1087 0 : Font aFont (aSymbol.GetFace());
1088 0 : aFont.SetAlign(ALIGN_TOP);
1089 :
1090 : // taking a FontSize which is a bit smaller (compared to nLen) in order to have a buffer
1091 : // (hopefully enough for left and right, too)
1092 0 : aFont.SetSize(Size(0, nLen - (nLen / 3)));
1093 0 : SetFont(aFont);
1094 : // keep text color
1095 0 : SetTextColor( aTxtColor );
1096 :
1097 0 : int nIV = i - v;
1098 0 : sal_UCS4 cChar = aSymbol.GetCharacter();
1099 0 : OUString aText(&cChar, 1);
1100 0 : Size aSize( GetTextWidth( aText ), GetTextHeight());
1101 :
1102 0 : Point aPoint((nIV % nColumns) * nLen + (nLen - aSize.Width()) / 2,
1103 0 : (nIV / nColumns) * nLen + (nLen - aSize.Height()) / 2);
1104 :
1105 0 : DrawText(OffsetPoint(aPoint), aText);
1106 0 : }
1107 :
1108 0 : if (nSelectSymbol != SYMBOL_NONE)
1109 : {
1110 0 : Point aPoint(((nSelectSymbol - v) % nColumns) * nLen,
1111 0 : ((nSelectSymbol - v) / nColumns) * nLen);
1112 :
1113 0 : Invert(Rectangle(OffsetPoint(aPoint), Size(nLen, nLen)));
1114 :
1115 : }
1116 :
1117 0 : Pop();
1118 0 : }
1119 :
1120 :
1121 0 : void SmShowSymbolSetWindow::MouseButtonDown(const MouseEvent& rMEvt)
1122 : {
1123 0 : GrabFocus();
1124 :
1125 0 : Size aOutputSize(nColumns * nLen, nRows * nLen);
1126 0 : Point aPoint(rMEvt.GetPosPixel());
1127 0 : aPoint.X() -= nXOffset;
1128 0 : aPoint.Y() -= nYOffset;
1129 :
1130 0 : if (rMEvt.IsLeft() && Rectangle(Point(0, 0), aOutputSize).IsInside(rMEvt.GetPosPixel()))
1131 : {
1132 0 : long nPos = (aPoint.Y() / nLen) * nColumns + (aPoint.X() / nLen) +
1133 0 : m_pVScrollBar->GetThumbPos() * nColumns;
1134 0 : SelectSymbol( sal::static_int_cast< sal_uInt16 >(nPos) );
1135 :
1136 0 : aSelectHdlLink.Call(this);
1137 :
1138 0 : if (rMEvt.GetClicks() > 1)
1139 0 : aDblClickHdlLink.Call(this);
1140 : }
1141 0 : }
1142 :
1143 :
1144 0 : void SmShowSymbolSetWindow::KeyInput(const KeyEvent& rKEvt)
1145 : {
1146 0 : sal_uInt16 n = nSelectSymbol;
1147 :
1148 0 : if (n != SYMBOL_NONE)
1149 : {
1150 0 : switch (rKEvt.GetKeyCode().GetCode())
1151 : {
1152 0 : case KEY_DOWN: n = n + nColumns; break;
1153 0 : case KEY_UP: n = n - nColumns; break;
1154 0 : case KEY_LEFT: n -= 1; break;
1155 0 : case KEY_RIGHT: n += 1; break;
1156 0 : case KEY_HOME: n = 0; break;
1157 0 : case KEY_END: n = static_cast< sal_uInt16 >(aSymbolSet.size() - 1); break;
1158 0 : case KEY_PAGEUP: n -= nColumns * nRows; break;
1159 0 : case KEY_PAGEDOWN: n += nColumns * nRows; break;
1160 :
1161 : default:
1162 0 : Control::KeyInput(rKEvt);
1163 0 : return;
1164 : }
1165 : }
1166 : else
1167 0 : n = 0;
1168 :
1169 0 : if (n >= aSymbolSet.size())
1170 0 : n = nSelectSymbol;
1171 :
1172 : // adjust scrollbar
1173 0 : if ((n < (sal_uInt16) (m_pVScrollBar->GetThumbPos() * nColumns)) ||
1174 0 : (n >= (sal_uInt16) ((m_pVScrollBar->GetThumbPos() + nRows) * nColumns)))
1175 : {
1176 0 : m_pVScrollBar->SetThumbPos(n / nColumns);
1177 0 : Invalidate();
1178 0 : Update();
1179 : }
1180 :
1181 0 : SelectSymbol(n);
1182 0 : aSelectHdlLink.Call(this);
1183 : }
1184 :
1185 0 : void SmShowSymbolSetWindow::setScrollbar(ScrollBar *pVScrollBar)
1186 : {
1187 0 : m_pVScrollBar = pVScrollBar;
1188 0 : m_pVScrollBar->Enable(false);
1189 0 : m_pVScrollBar->Show();
1190 0 : m_pVScrollBar->SetScrollHdl(LINK(this, SmShowSymbolSetWindow, ScrollHdl));
1191 0 : }
1192 :
1193 0 : SmShowSymbolSet::SmShowSymbolSet(Window *pParent)
1194 : : VclHBox(pParent, false, 6)
1195 : , aSymbolWindow(this, WB_TABSTOP)
1196 0 : , aVScrollBar(this, WinBits(WB_VSCROLL))
1197 : {
1198 0 : aSymbolWindow.set_hexpand(true);
1199 0 : aSymbolWindow.set_vexpand(true);
1200 0 : aSymbolWindow.setScrollbar(&aVScrollBar);
1201 0 : aSymbolWindow.calccols();
1202 0 : aSymbolWindow.Show();
1203 0 : }
1204 :
1205 0 : extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeSmShowSymbolSet(Window *pParent, VclBuilder::stringmap &)
1206 : {
1207 0 : return new SmShowSymbolSet(pParent);
1208 : }
1209 :
1210 0 : void SmShowSymbolSetWindow::calccols()
1211 : {
1212 : // Height of 16pt in pixels (matching 'aOutputSize')
1213 0 : nLen = (sal_uInt16) LogicToPixel(Size(0, 16), MapMode(MAP_POINT)).Height();
1214 :
1215 0 : Size aOutputSize = GetOutputSizePixel();
1216 :
1217 0 : nColumns = sal::static_int_cast< sal_uInt16 >(aOutputSize.Width() / nLen);
1218 0 : if (nColumns > 2 && nColumns % 2 != 0)
1219 0 : --nColumns;
1220 0 : nRows = sal::static_int_cast< sal_uInt16 >(aOutputSize.Height() / nLen);
1221 0 : nColumns = std::max<sal_uInt16>(1, nColumns);
1222 0 : nRows = std::max<sal_uInt16>(1, nRows);
1223 :
1224 0 : nXOffset = (aOutputSize.Width() - (nColumns * nLen)) / 2;
1225 0 : nYOffset = (aOutputSize.Height() - (nRows * nLen)) / 2;
1226 :
1227 0 : SetScrollBarRange();
1228 0 : }
1229 :
1230 0 : Size SmShowSymbolSetWindow::GetOptimalSize() const
1231 : {
1232 0 : Window *pParent = GetParent();
1233 0 : return Size(pParent->approximate_char_width() * 24, pParent->GetTextHeight() * 8);
1234 : }
1235 :
1236 0 : void SmShowSymbolSetWindow::SetSymbolSet(const SymbolPtrVec_t& rSymbolSet)
1237 : {
1238 0 : aSymbolSet = rSymbolSet;
1239 :
1240 0 : SetScrollBarRange();
1241 0 : }
1242 :
1243 0 : void SmShowSymbolSetWindow::SetScrollBarRange()
1244 : {
1245 0 : if (static_cast< sal_uInt16 >(aSymbolSet.size()) > (nColumns * nRows))
1246 : {
1247 0 : m_pVScrollBar->SetRange(Range(0, ((aSymbolSet.size() + (nColumns - 1)) / nColumns) - nRows));
1248 0 : m_pVScrollBar->Enable(true);
1249 : }
1250 : else
1251 : {
1252 0 : m_pVScrollBar->SetRange(Range(0,0));
1253 0 : m_pVScrollBar->Enable (false);
1254 : }
1255 :
1256 0 : Invalidate();
1257 0 : }
1258 :
1259 0 : void SmShowSymbolSetWindow::SelectSymbol(sal_uInt16 nSymbol)
1260 : {
1261 0 : int v = (int) (m_pVScrollBar->GetThumbPos() * nColumns);
1262 :
1263 0 : if (nSelectSymbol != SYMBOL_NONE)
1264 0 : Invalidate(Rectangle(OffsetPoint(Point(((nSelectSymbol - v) % nColumns) * nLen,
1265 0 : ((nSelectSymbol - v) / nColumns) * nLen)),
1266 0 : Size(nLen, nLen)));
1267 :
1268 0 : if (nSymbol < aSymbolSet.size())
1269 0 : nSelectSymbol = nSymbol;
1270 :
1271 0 : if (aSymbolSet.empty())
1272 0 : nSelectSymbol = SYMBOL_NONE;
1273 :
1274 0 : if (nSelectSymbol != SYMBOL_NONE)
1275 0 : Invalidate(Rectangle(OffsetPoint(Point(((nSelectSymbol - v) % nColumns) * nLen,
1276 0 : ((nSelectSymbol - v) / nColumns) * nLen)),
1277 0 : Size(nLen, nLen)));
1278 :
1279 0 : Update();
1280 0 : }
1281 :
1282 0 : void SmShowSymbolSetWindow::Resize()
1283 : {
1284 0 : Control::Resize();
1285 0 : calccols();
1286 0 : }
1287 :
1288 0 : IMPL_LINK( SmShowSymbolSetWindow, ScrollHdl, ScrollBar*, EMPTYARG /*pScrollBar*/)
1289 : {
1290 0 : Invalidate();
1291 0 : return 0;
1292 : }
1293 :
1294 0 : extern "C" SAL_DLLPUBLIC_EXPORT Window* SAL_CALL makeSmShowSymbol(Window *pParent, VclBuilder::stringmap &rMap)
1295 : {
1296 0 : WinBits nWinBits = 0;
1297 :
1298 0 : VclBuilder::stringmap::iterator aFind = rMap.find(OString("border"));
1299 0 : if (aFind != rMap.end())
1300 : {
1301 0 : if (toBool(aFind->second))
1302 0 : nWinBits |= WB_BORDER;
1303 0 : rMap.erase(aFind);
1304 : }
1305 :
1306 0 : return new SmShowSymbol(pParent, nWinBits);
1307 : }
1308 :
1309 0 : void SmShowSymbol::Resize()
1310 : {
1311 0 : Control::Resize();
1312 0 : Invalidate();
1313 0 : }
1314 :
1315 0 : void SmShowSymbol::setFontSize(Font &rFont) const
1316 : {
1317 0 : rFont.SetSize(Size(0, GetOutputSize().Height() - GetOutputSize().Height() / 3));
1318 0 : }
1319 :
1320 0 : void SmShowSymbol::Paint(const Rectangle &rRect)
1321 : {
1322 0 : Control::Paint( rRect );
1323 :
1324 0 : Font aFont(GetFont());
1325 0 : setFontSize(aFont);
1326 0 : SetFont(aFont);
1327 :
1328 0 : const OUString &rText = GetText();
1329 0 : Size aTextSize(GetTextWidth(rText), GetTextHeight());
1330 :
1331 0 : DrawText(Point((GetOutputSize().Width() - aTextSize.Width()) / 2,
1332 0 : (GetOutputSize().Height() * 7/10)), rText);
1333 0 : }
1334 :
1335 :
1336 0 : void SmShowSymbol::MouseButtonDown(const MouseEvent& rMEvt)
1337 : {
1338 0 : if (rMEvt.GetClicks() > 1)
1339 0 : aDblClickHdlLink.Call(this);
1340 : else
1341 0 : Control::MouseButtonDown (rMEvt);
1342 0 : }
1343 :
1344 :
1345 0 : void SmShowSymbol::SetSymbol(const SmSym *pSymbol)
1346 : {
1347 0 : if (pSymbol)
1348 : {
1349 0 : Font aFont (pSymbol->GetFace());
1350 0 : setFontSize(aFont);
1351 0 : aFont.SetAlign(ALIGN_BASELINE);
1352 0 : SetFont(aFont);
1353 :
1354 0 : sal_UCS4 cChar = pSymbol->GetCharacter();
1355 0 : OUString aText(&cChar, 1);
1356 0 : SetText( aText );
1357 : }
1358 :
1359 : // 'Invalidate' fills the background with the background color.
1360 : // If a NULL pointer has been passed that's already enough to clear the display
1361 0 : Invalidate();
1362 0 : }
1363 :
1364 :
1365 : ////////////////////////////////////////////////////////////////////////////////
1366 :
1367 0 : void SmSymbolDialog::FillSymbolSets(bool bDeleteText)
1368 : // populate the entries of possible SymbolsSets in the dialog with
1369 : // current values of the SymbolSet manager but selects none of those
1370 : {
1371 0 : m_pSymbolSets->Clear();
1372 0 : if (bDeleteText)
1373 0 : m_pSymbolSets->SetNoSelection();
1374 :
1375 0 : std::set< OUString > aSybolSetNames( rSymbolMgr.GetSymbolSetNames() );
1376 0 : std::set< OUString >::const_iterator aIt( aSybolSetNames.begin() );
1377 0 : for ( ; aIt != aSybolSetNames.end(); ++aIt)
1378 0 : m_pSymbolSets->InsertEntry( *aIt );
1379 0 : }
1380 :
1381 :
1382 0 : IMPL_LINK_NOARG( SmSymbolDialog, SymbolSetChangeHdl )
1383 : {
1384 0 : SelectSymbolSet(m_pSymbolSets->GetSelectEntry());
1385 0 : return 0;
1386 : }
1387 :
1388 :
1389 0 : IMPL_LINK_NOARG( SmSymbolDialog, SymbolChangeHdl )
1390 : {
1391 0 : SelectSymbol(m_pSymbolSetDisplay->GetSelectSymbol());
1392 0 : return 0;
1393 : }
1394 :
1395 0 : IMPL_LINK_NOARG(SmSymbolDialog, EditClickHdl)
1396 : {
1397 0 : SmSymDefineDialog *pDialog = new SmSymDefineDialog(this, pFontListDev, rSymbolMgr);
1398 :
1399 : // set current symbol and SymbolSet for the new dialog
1400 0 : const OUString aSymSetName (m_pSymbolSets->GetSelectEntry()),
1401 0 : aSymName (m_pSymbolName->GetText());
1402 0 : pDialog->SelectOldSymbolSet(aSymSetName);
1403 0 : pDialog->SelectOldSymbol(aSymName);
1404 0 : pDialog->SelectSymbolSet(aSymSetName);
1405 0 : pDialog->SelectSymbol(aSymName);
1406 :
1407 : // remember old SymbolSet
1408 0 : OUString aOldSymbolSet (m_pSymbolSets->GetSelectEntry());
1409 :
1410 0 : sal_uInt16 nSymPos = GetSelectedSymbol();
1411 :
1412 : // adapt dialog to data of the SymbolSet manager, which might have changed
1413 0 : if (pDialog->Execute() == RET_OK && rSymbolMgr.IsModified())
1414 : {
1415 0 : rSymbolMgr.Save();
1416 0 : FillSymbolSets();
1417 : }
1418 :
1419 : // if the old SymbolSet doesn't exist anymore, go to the first one SymbolSet (if one exists)
1420 0 : if (!SelectSymbolSet(aOldSymbolSet) && m_pSymbolSets->GetEntryCount() > 0)
1421 0 : SelectSymbolSet(m_pSymbolSets->GetEntry(0));
1422 : else
1423 : {
1424 : // just update display of current symbol set
1425 : assert(aSymSetName == aSymSetName); //unexpected change in symbol set name
1426 0 : aSymbolSet = rSymbolMgr.GetSymbolSet( aSymbolSetName );
1427 0 : m_pSymbolSetDisplay->SetSymbolSet( aSymbolSet );
1428 : }
1429 :
1430 0 : if (nSymPos >= aSymbolSet.size())
1431 0 : nSymPos = static_cast< sal_uInt16 >(aSymbolSet.size()) - 1;
1432 0 : SelectSymbol( nSymPos );
1433 :
1434 0 : delete pDialog;
1435 0 : return 0;
1436 : }
1437 :
1438 :
1439 0 : IMPL_LINK_NOARG( SmSymbolDialog, SymbolDblClickHdl )
1440 : {
1441 0 : GetClickHdl(m_pGetBtn);
1442 0 : EndDialog(RET_OK);
1443 0 : return 0;
1444 : }
1445 :
1446 :
1447 0 : IMPL_LINK_NOARG( SmSymbolDialog, GetClickHdl )
1448 : {
1449 0 : const SmSym *pSym = GetSymbol();
1450 0 : if (pSym)
1451 : {
1452 0 : OUStringBuffer aText;
1453 0 : aText.append('%').append(pSym->GetName()).append(' ');
1454 :
1455 : rViewSh.GetViewFrame()->GetDispatcher()->Execute(
1456 : SID_INSERTSYMBOL, SFX_CALLMODE_STANDARD,
1457 0 : new SfxStringItem(SID_INSERTSYMBOL, aText.makeStringAndClear()), 0L);
1458 : }
1459 :
1460 0 : return 0;
1461 : }
1462 :
1463 :
1464 0 : SmSymbolDialog::SmSymbolDialog(Window *pParent, OutputDevice *pFntListDevice,
1465 : SmSymbolManager &rMgr, SmViewShell &rViewShell)
1466 : : ModalDialog(pParent, "CatalogDialog",
1467 : "modules/smath/ui/catalogdialog.ui")
1468 :
1469 : ,
1470 :
1471 : rViewSh (rViewShell),
1472 : rSymbolMgr (rMgr),
1473 0 : pFontListDev (pFntListDevice)
1474 : {
1475 0 : get(m_pSymbolSets, "symbolset");
1476 0 : m_pSymbolSets->SetStyle(m_pSymbolSets->GetStyle()|WB_SORT);
1477 0 : get(m_pSymbolName, "symbolname");
1478 0 : get(m_pGetBtn, "insert");
1479 0 : get(m_pEditBtn, "edit");
1480 0 : get(m_pSymbolSetDisplay, "symbolsetdisplay");
1481 0 : get(m_pSymbolDisplay, "preview");
1482 :
1483 0 : aSymbolSetName = OUString();
1484 0 : aSymbolSet.clear();
1485 0 : FillSymbolSets();
1486 0 : if (m_pSymbolSets->GetEntryCount() > 0)
1487 0 : SelectSymbolSet(m_pSymbolSets->GetEntry(0));
1488 :
1489 0 : InitColor_Impl();
1490 :
1491 : // preview like controls should have a 2D look
1492 0 : m_pSymbolDisplay->SetBorderStyle( WINDOW_BORDER_MONO );
1493 :
1494 0 : m_pSymbolSets->SetSelectHdl(LINK(this, SmSymbolDialog, SymbolSetChangeHdl));
1495 0 : m_pSymbolSetDisplay->SetSelectHdl(LINK(this, SmSymbolDialog, SymbolChangeHdl));
1496 0 : m_pSymbolSetDisplay->SetDblClickHdl(LINK(this, SmSymbolDialog, SymbolDblClickHdl));
1497 0 : m_pSymbolDisplay->SetDblClickHdl(LINK(this, SmSymbolDialog, SymbolDblClickHdl));
1498 0 : m_pEditBtn->SetClickHdl(LINK(this, SmSymbolDialog, EditClickHdl));
1499 0 : m_pGetBtn->SetClickHdl(LINK(this, SmSymbolDialog, GetClickHdl));
1500 0 : }
1501 :
1502 :
1503 0 : void SmSymbolDialog::InitColor_Impl()
1504 : {
1505 : ColorData nBgCol, nTxtCol;
1506 0 : getColors(*this, nBgCol, nTxtCol);
1507 :
1508 0 : Color aTmpColor( nBgCol );
1509 0 : Wallpaper aWall( aTmpColor );
1510 0 : Color aTxtColor( nTxtCol );
1511 0 : m_pSymbolDisplay->SetBackground( aWall );
1512 0 : m_pSymbolDisplay->SetTextColor( aTxtColor );
1513 0 : m_pSymbolSetDisplay->SetBackground( aWall );
1514 0 : m_pSymbolSetDisplay->SetTextColor( aTxtColor );
1515 0 : }
1516 :
1517 :
1518 0 : void SmSymbolDialog::DataChanged( const DataChangedEvent& rDCEvt )
1519 : {
1520 0 : if ( rDCEvt.GetType() == DATACHANGED_SETTINGS &&
1521 0 : (rDCEvt.GetFlags() & SETTINGS_STYLE) )
1522 0 : InitColor_Impl();
1523 :
1524 0 : ModalDialog::DataChanged( rDCEvt );
1525 0 : }
1526 :
1527 :
1528 0 : bool SmSymbolDialog::SelectSymbolSet(const OUString &rSymbolSetName)
1529 : {
1530 0 : bool bRet = false;
1531 0 : sal_uInt16 nPos = m_pSymbolSets->GetEntryPos(rSymbolSetName);
1532 :
1533 0 : aSymbolSetName = OUString();
1534 0 : aSymbolSet.clear();
1535 0 : if (nPos != LISTBOX_ENTRY_NOTFOUND)
1536 : {
1537 0 : m_pSymbolSets->SelectEntryPos(nPos);
1538 :
1539 0 : aSymbolSetName = rSymbolSetName;
1540 0 : aSymbolSet = rSymbolMgr.GetSymbolSet( aSymbolSetName );
1541 :
1542 : // sort symbols by Unicode position (useful for displaying Greek characters alphabetically)
1543 0 : std::sort( aSymbolSet.begin(), aSymbolSet.end(), lt_SmSymPtr() );
1544 :
1545 0 : m_pSymbolSetDisplay->SetSymbolSet( aSymbolSet );
1546 0 : if (aSymbolSet.size() > 0)
1547 0 : SelectSymbol(0);
1548 :
1549 0 : bRet = true;
1550 : }
1551 : else
1552 0 : m_pSymbolSets->SetNoSelection();
1553 :
1554 0 : return bRet;
1555 : }
1556 :
1557 :
1558 0 : void SmSymbolDialog::SelectSymbol(sal_uInt16 nSymbolNo)
1559 : {
1560 0 : const SmSym *pSym = NULL;
1561 0 : if (!aSymbolSetName.isEmpty() && nSymbolNo < static_cast< sal_uInt16 >(aSymbolSet.size()))
1562 0 : pSym = aSymbolSet[ nSymbolNo ];
1563 :
1564 0 : m_pSymbolSetDisplay->SelectSymbol(nSymbolNo);
1565 0 : m_pSymbolDisplay->SetSymbol(pSym);
1566 0 : m_pSymbolName->SetText(pSym ? pSym->GetName() : OUString());
1567 0 : }
1568 :
1569 :
1570 0 : const SmSym * SmSymbolDialog::GetSymbol() const
1571 : {
1572 0 : sal_uInt16 nSymbolNo = m_pSymbolSetDisplay->GetSelectSymbol();
1573 0 : bool bValid = !aSymbolSetName.isEmpty() && nSymbolNo < static_cast< sal_uInt16 >(aSymbolSet.size());
1574 0 : return bValid ? aSymbolSet[ nSymbolNo ] : NULL;
1575 : }
1576 :
1577 :
1578 : ////////////////////////////////////////////////////////////////////////////////
1579 :
1580 :
1581 0 : void SmShowChar::Paint(const Rectangle &rRect)
1582 : {
1583 0 : Control::Paint( rRect );
1584 :
1585 0 : OUString aText( GetText() );
1586 0 : if (!aText.isEmpty())
1587 : {
1588 : #if OSL_DEBUG_LEVEL > 1
1589 : sal_Int32 nPos = 0;
1590 : sal_UCS4 cChar = aText.iterateCodePoints( &nPos );
1591 : (void) cChar;
1592 : #endif
1593 0 : Size aTextSize(GetTextWidth(aText), GetTextHeight());
1594 :
1595 0 : DrawText(Point((GetOutputSize().Width() - aTextSize.Width()) / 2,
1596 0 : (GetOutputSize().Height() * 7/10)), aText);
1597 0 : }
1598 0 : }
1599 :
1600 :
1601 0 : void SmShowChar::SetSymbol( const SmSym *pSym )
1602 : {
1603 0 : if (pSym)
1604 0 : SetSymbol( pSym->GetCharacter(), pSym->GetFace() );
1605 0 : }
1606 :
1607 :
1608 0 : void SmShowChar::SetSymbol( sal_UCS4 cChar, const Font &rFont )
1609 : {
1610 0 : Font aFont( rFont );
1611 0 : aFont.SetSize( Size(0, GetOutputSize().Height() - GetOutputSize().Height() / 3) );
1612 0 : aFont.SetAlign(ALIGN_BASELINE);
1613 0 : SetFont(aFont);
1614 0 : aFont.SetTransparent(true);
1615 :
1616 0 : OUString aText(&cChar, 1);
1617 0 : SetText( aText );
1618 :
1619 0 : Invalidate();
1620 0 : }
1621 :
1622 :
1623 : ////////////////////////////////////////////////////////////////////////////////
1624 :
1625 0 : void SmSymDefineDialog::FillSymbols(ComboBox &rComboBox, bool bDeleteText)
1626 : {
1627 : #if OSL_DEBUG_LEVEL > 1
1628 : OSL_ENSURE(&rComboBox == &aOldSymbols || &rComboBox == &aSymbols,
1629 : "Sm : wrong ComboBox");
1630 : #endif
1631 :
1632 0 : rComboBox.Clear();
1633 0 : if (bDeleteText)
1634 0 : rComboBox.SetText(OUString());
1635 :
1636 0 : ComboBox &rBox = &rComboBox == &aOldSymbols ? aOldSymbolSets : aSymbolSets;
1637 0 : SymbolPtrVec_t aSymSet( aSymbolMgrCopy.GetSymbolSet( rBox.GetText() ) );
1638 0 : for (size_t i = 0; i < aSymSet.size(); ++i)
1639 0 : rComboBox.InsertEntry( aSymSet[i]->GetName() );
1640 0 : }
1641 :
1642 :
1643 0 : void SmSymDefineDialog::FillSymbolSets(ComboBox &rComboBox, bool bDeleteText)
1644 : {
1645 : #if OSL_DEBUG_LEVEL > 1
1646 : OSL_ENSURE(&rComboBox == &aOldSymbolSets || &rComboBox == &aSymbolSets,
1647 : "Sm : falsche ComboBox");
1648 : #endif
1649 :
1650 0 : rComboBox.Clear();
1651 0 : if (bDeleteText)
1652 0 : rComboBox.SetText(OUString());
1653 :
1654 0 : const std::set< OUString > aSymbolSetNames( aSymbolMgrCopy.GetSymbolSetNames() );
1655 0 : std::set< OUString >::const_iterator aIt( aSymbolSetNames.begin() );
1656 0 : for ( ; aIt != aSymbolSetNames.end(); ++aIt)
1657 0 : rComboBox.InsertEntry( *aIt );
1658 0 : }
1659 :
1660 :
1661 0 : void SmSymDefineDialog::FillFonts(bool bDelete)
1662 : {
1663 0 : aFonts.Clear();
1664 0 : if (bDelete)
1665 0 : aFonts.SetNoSelection();
1666 :
1667 : // Include all fonts of FontList into the font list.
1668 : // If there are duplicates, only include one entry of each font since the style will be
1669 : // already selected using the FontStyleBox.
1670 0 : if (pFontList)
1671 : {
1672 0 : sal_uInt16 nCount = pFontList->GetFontNameCount();
1673 0 : for (sal_uInt16 i = 0; i < nCount; i++)
1674 0 : aFonts.InsertEntry( pFontList->GetFontName(i).GetName() );
1675 : }
1676 0 : }
1677 :
1678 :
1679 0 : void SmSymDefineDialog::FillStyles(bool bDeleteText)
1680 : {
1681 0 : aStyles.Clear();
1682 0 : if (bDeleteText)
1683 0 : aStyles.SetText(OUString());
1684 :
1685 0 : OUString aText (aFonts.GetSelectEntry());
1686 0 : if (!aText.isEmpty())
1687 : {
1688 : // use own StyleNames
1689 0 : const SmFontStyles &rStyles = GetFontStyles();
1690 0 : for (sal_uInt16 i = 0; i < rStyles.GetCount(); i++)
1691 0 : aStyles.InsertEntry( rStyles.GetStyleName(i) );
1692 :
1693 : #if OSL_DEBUG_LEVEL > 1
1694 : OSL_ENSURE(aStyles.GetEntryCount() > 0, "Sm : no styles available");
1695 : #endif
1696 0 : aStyles.SetText( aStyles.GetEntry(0) );
1697 0 : }
1698 0 : }
1699 :
1700 :
1701 0 : SmSym * SmSymDefineDialog::GetSymbol(const ComboBox &rComboBox)
1702 : {
1703 : #if OSL_DEBUG_LEVEL > 1
1704 : OSL_ENSURE(&rComboBox == &aOldSymbols || &rComboBox == &aSymbols,
1705 : "Sm : wrong combobox");
1706 : #endif
1707 0 : return aSymbolMgrCopy.GetSymbolByName(rComboBox.GetText());
1708 : }
1709 :
1710 :
1711 0 : IMPL_LINK( SmSymDefineDialog, OldSymbolChangeHdl, ComboBox *, EMPTYARG pComboBox )
1712 : {
1713 : (void) pComboBox;
1714 : #if OSL_DEBUG_LEVEL > 1
1715 : OSL_ENSURE(pComboBox == &aOldSymbols, "Sm : wrong argument");
1716 : #endif
1717 0 : SelectSymbol(aOldSymbols, aOldSymbols.GetText(), false);
1718 0 : return 0;
1719 : }
1720 :
1721 :
1722 0 : IMPL_LINK( SmSymDefineDialog, OldSymbolSetChangeHdl, ComboBox *, EMPTYARG pComboBox )
1723 : {
1724 : (void) pComboBox;
1725 : #if OSL_DEBUG_LEVEL > 1
1726 : OSL_ENSURE(pComboBox == &aOldSymbolSets, "Sm : wrong argument");
1727 : #endif
1728 0 : SelectSymbolSet(aOldSymbolSets, aOldSymbolSets.GetText(), false);
1729 0 : return 0;
1730 : }
1731 :
1732 :
1733 0 : IMPL_LINK( SmSymDefineDialog, ModifyHdl, ComboBox *, pComboBox )
1734 : {
1735 : // remember cursor position for later restoring of it
1736 0 : Selection aSelection (pComboBox->GetSelection());
1737 :
1738 0 : if (pComboBox == &aSymbols)
1739 0 : SelectSymbol(aSymbols, aSymbols.GetText(), false);
1740 0 : else if (pComboBox == &aSymbolSets)
1741 0 : SelectSymbolSet(aSymbolSets, aSymbolSets.GetText(), false);
1742 0 : else if (pComboBox == &aOldSymbols)
1743 : // allow only names from the list
1744 0 : SelectSymbol(aOldSymbols, aOldSymbols.GetText(), true);
1745 0 : else if (pComboBox == &aOldSymbolSets)
1746 : // allow only names from the list
1747 0 : SelectSymbolSet(aOldSymbolSets, aOldSymbolSets.GetText(), true);
1748 0 : else if (pComboBox == &aStyles)
1749 : // allow only names from the list (that's the case here anyway)
1750 0 : SelectStyle(aStyles.GetText(), true);
1751 : else
1752 : {
1753 : #if OSL_DEBUG_LEVEL > 1
1754 : OSL_FAIL("Sm : wrong combobox argument");
1755 : #endif
1756 : }
1757 :
1758 0 : pComboBox->SetSelection(aSelection);
1759 :
1760 0 : UpdateButtons();
1761 :
1762 0 : return 0;
1763 : }
1764 :
1765 :
1766 0 : IMPL_LINK( SmSymDefineDialog, FontChangeHdl, ListBox *, EMPTYARG pListBox )
1767 : {
1768 : (void) pListBox;
1769 : #if OSL_DEBUG_LEVEL > 1
1770 : OSL_ENSURE(pListBox == &aFonts, "Sm : wrong argument");
1771 : #endif
1772 :
1773 0 : SelectFont(aFonts.GetSelectEntry());
1774 0 : return 0;
1775 : }
1776 :
1777 :
1778 0 : IMPL_LINK( SmSymDefineDialog, SubsetChangeHdl, ListBox *, EMPTYARG pListBox )
1779 : {
1780 : (void) pListBox;
1781 0 : sal_uInt16 nPos = aFontsSubsetLB.GetSelectEntryPos();
1782 0 : if (LISTBOX_ENTRY_NOTFOUND != nPos)
1783 : {
1784 0 : const Subset* pSubset = reinterpret_cast<const Subset*> (aFontsSubsetLB.GetEntryData( nPos ));
1785 0 : if (pSubset)
1786 : {
1787 0 : aCharsetDisplay.SelectCharacter( pSubset->GetRangeMin() );
1788 : }
1789 : }
1790 0 : return 0;
1791 : }
1792 :
1793 :
1794 0 : IMPL_LINK( SmSymDefineDialog, StyleChangeHdl, ComboBox *, EMPTYARG pComboBox )
1795 : {
1796 : (void) pComboBox;
1797 : #if OSL_DEBUG_LEVEL > 1
1798 : OSL_ENSURE(pComboBox == &aStyles, "Sm : falsches Argument");
1799 : #endif
1800 :
1801 0 : SelectStyle(aStyles.GetText());
1802 0 : return 0;
1803 : }
1804 :
1805 :
1806 0 : IMPL_LINK_NOARG(SmSymDefineDialog, CharHighlightHdl)
1807 : {
1808 0 : sal_UCS4 cChar = aCharsetDisplay.GetSelectCharacter();
1809 :
1810 : #if OSL_DEBUG_LEVEL > 1
1811 : OSL_ENSURE( pSubsetMap, "SubsetMap missing" );
1812 : #endif
1813 0 : if (pSubsetMap)
1814 : {
1815 0 : const Subset* pSubset = pSubsetMap->GetSubsetByUnicode( cChar );
1816 0 : if (pSubset)
1817 0 : aFontsSubsetLB.SelectEntry( pSubset->GetName() );
1818 : else
1819 0 : aFontsSubsetLB.SetNoSelection();
1820 : }
1821 :
1822 0 : aSymbolDisplay.SetSymbol( cChar, aCharsetDisplay.GetFont() );
1823 :
1824 0 : UpdateButtons();
1825 :
1826 : // display Unicode position as symbol name while iterating over characters
1827 0 : const OUString aHex(OUString::valueOf(static_cast<sal_Int64>(cChar), 16 ).toAsciiUpperCase());
1828 0 : const OUString aPattern( (aHex.getLength() > 4) ? OUString("Ux000000") : OUString("Ux0000") );
1829 0 : OUString aUnicodePos( aPattern.copy( 0, aPattern.getLength() - aHex.getLength() ) );
1830 0 : aUnicodePos += aHex;
1831 0 : aSymbols.SetText( aUnicodePos );
1832 0 : aSymbolName.SetText( aUnicodePos );
1833 :
1834 0 : return 0;
1835 : }
1836 :
1837 :
1838 0 : IMPL_LINK( SmSymDefineDialog, AddClickHdl, Button *, EMPTYARG pButton )
1839 : {
1840 : (void) pButton;
1841 : #if OSL_DEBUG_LEVEL > 1
1842 : OSL_ENSURE(pButton == &aAddBtn, "Sm : wrong argument");
1843 : OSL_ENSURE(aAddBtn.IsEnabled(), "Sm : requirements met ??");
1844 : #endif
1845 :
1846 : // add symbol
1847 0 : const SmSym aNewSymbol( aSymbols.GetText(), aCharsetDisplay.GetFont(),
1848 0 : aCharsetDisplay.GetSelectCharacter(), aSymbolSets.GetText() );
1849 : //OSL_ENSURE( aSymbolMgrCopy.GetSymbolByName(aTmpSymbolName) == NULL, "symbol already exists" );
1850 0 : aSymbolMgrCopy.AddOrReplaceSymbol( aNewSymbol );
1851 :
1852 : // update display of new symbol
1853 0 : aSymbolDisplay.SetSymbol( &aNewSymbol );
1854 0 : aSymbolName.SetText( aNewSymbol.GetName() );
1855 0 : aSymbolSetName.SetText( aNewSymbol.GetSymbolSetName() );
1856 :
1857 : // update list box entries
1858 0 : FillSymbolSets(aOldSymbolSets, false);
1859 0 : FillSymbolSets(aSymbolSets, false);
1860 0 : FillSymbols(aOldSymbols ,false);
1861 0 : FillSymbols(aSymbols ,false);
1862 :
1863 0 : UpdateButtons();
1864 :
1865 0 : return 0;
1866 : }
1867 :
1868 :
1869 0 : IMPL_LINK( SmSymDefineDialog, ChangeClickHdl, Button *, EMPTYARG pButton )
1870 : {
1871 : (void) pButton;
1872 : #if OSL_DEBUG_LEVEL > 1
1873 : OSL_ENSURE(pButton == &aChangeBtn, "Sm : wrong argument");
1874 : OSL_ENSURE(aChangeBtn.IsEnabled(), "Sm : requirements met ??");
1875 : #endif
1876 :
1877 : // get new Sybol to use
1878 : //! get font from symbol-disp lay since charset-display does not keep
1879 : //! the bold attribut.
1880 0 : const SmSym aNewSymbol( aSymbols.GetText(), aCharsetDisplay.GetFont(),
1881 0 : aCharsetDisplay.GetSelectCharacter(), aSymbolSets.GetText() );
1882 :
1883 : // remove old symbol if the name was changed then add new one
1884 0 : const bool bNameChanged = aOldSymbols.GetText() != aSymbols.GetText();
1885 0 : if (bNameChanged)
1886 0 : aSymbolMgrCopy.RemoveSymbol( aOldSymbols.GetText() );
1887 0 : aSymbolMgrCopy.AddOrReplaceSymbol( aNewSymbol, true );
1888 :
1889 : // clear display for original symbol if necessary
1890 0 : if (bNameChanged)
1891 0 : SetOrigSymbol(NULL, OUString());
1892 :
1893 : // update display of new symbol
1894 0 : aSymbolDisplay.SetSymbol( &aNewSymbol );
1895 0 : aSymbolName.SetText( aNewSymbol.GetName() );
1896 0 : aSymbolSetName.SetText( aNewSymbol.GetSymbolSetName() );
1897 :
1898 : // update list box entries
1899 0 : FillSymbolSets(aOldSymbolSets, false);
1900 0 : FillSymbolSets(aSymbolSets, false);
1901 0 : FillSymbols(aOldSymbols ,false);
1902 0 : FillSymbols(aSymbols ,false);
1903 :
1904 0 : UpdateButtons();
1905 :
1906 0 : return 0;
1907 : }
1908 :
1909 :
1910 0 : IMPL_LINK( SmSymDefineDialog, DeleteClickHdl, Button *, EMPTYARG pButton )
1911 : {
1912 : (void) pButton;
1913 : #if OSL_DEBUG_LEVEL > 1
1914 : OSL_ENSURE(pButton == &aDeleteBtn, "Sm : wrong argument");
1915 : OSL_ENSURE(aDeleteBtn.IsEnabled(), "Sm : requirements met ??");
1916 : #endif
1917 :
1918 0 : if (pOrigSymbol)
1919 : {
1920 0 : aSymbolMgrCopy.RemoveSymbol( pOrigSymbol->GetName() );
1921 :
1922 : // clear display for original symbol
1923 0 : SetOrigSymbol(NULL, OUString());
1924 :
1925 : // update list box entries
1926 0 : FillSymbolSets(aOldSymbolSets, false);
1927 0 : FillSymbolSets(aSymbolSets, false);
1928 0 : FillSymbols(aOldSymbols ,false);
1929 0 : FillSymbols(aSymbols ,false);
1930 : }
1931 :
1932 0 : UpdateButtons();
1933 :
1934 0 : return 0;
1935 : }
1936 :
1937 :
1938 0 : void SmSymDefineDialog::UpdateButtons()
1939 : {
1940 0 : bool bAdd = false,
1941 0 : bChange = false,
1942 0 : bDelete = false;
1943 0 : OUString aTmpSymbolName (aSymbols.GetText()),
1944 0 : aTmpSymbolSetName (aSymbolSets.GetText());
1945 :
1946 0 : if (aTmpSymbolName.getLength() > 0 && aTmpSymbolSetName.getLength() > 0)
1947 : {
1948 : // are all settings equal?
1949 : //! (Font-, Style- und SymbolSet name comparison is not case sensitive)
1950 : bool bEqual = pOrigSymbol
1951 0 : && aTmpSymbolSetName.equalsIgnoreAsciiCase(aOldSymbolSetName.GetText())
1952 0 : && aTmpSymbolName.equals(pOrigSymbol->GetName())
1953 0 : && aFonts.GetSelectEntry().EqualsIgnoreCaseAscii(
1954 0 : pOrigSymbol->GetFace().GetName())
1955 0 : && aStyles.GetText().equalsIgnoreAsciiCase(
1956 0 : GetFontStyles().GetStyleName(pOrigSymbol->GetFace()))
1957 0 : && aCharsetDisplay.GetSelectCharacter() == pOrigSymbol->GetCharacter();
1958 :
1959 : // only add it if there isn't already a symbol with the same name
1960 0 : bAdd = aSymbolMgrCopy.GetSymbolByName(aTmpSymbolName) == NULL;
1961 :
1962 : // only delete it if all settings are equal
1963 0 : bDelete = pOrigSymbol != NULL;
1964 :
1965 : // only change it if the old symbol exists and the new one is different
1966 0 : bChange = pOrigSymbol && !bEqual;
1967 : }
1968 :
1969 0 : aAddBtn .Enable(bAdd);
1970 0 : aChangeBtn.Enable(bChange);
1971 0 : aDeleteBtn.Enable(bDelete);
1972 0 : }
1973 :
1974 0 : IMPL_LINK( SmSymDefineDialog, HelpButtonClickHdl, Button *, EMPTYARG /*pButton*/ )
1975 : {
1976 : // start help system
1977 0 : Help* pHelp = Application::GetHelp();
1978 0 : if( pHelp )
1979 : {
1980 0 : pHelp->Start( OUString( "HID_SMA_SYMDEFINEDIALOG" ), &aHelpBtn );
1981 : }
1982 0 : return 0;
1983 : }
1984 :
1985 0 : SmSymDefineDialog::SmSymDefineDialog(Window * pParent,
1986 : OutputDevice *pFntListDevice, SmSymbolManager &rMgr, bool bFreeRes) :
1987 : ModalDialog (pParent, SmResId(RID_SYMDEFINEDIALOG)),
1988 : aOldSymbolText (this, SmResId(1)),
1989 : aOldSymbols (this, SmResId(1)),
1990 : aOldSymbolSetText (this, SmResId(2)),
1991 : aOldSymbolSets (this, SmResId(2)),
1992 : aCharsetDisplay (this, SmResId(1)),
1993 : aSymbolText (this, SmResId(9)),
1994 : aSymbols (this, SmResId(4)),
1995 : aSymbolSetText (this, SmResId(10)),
1996 : aSymbolSets (this, SmResId(5)),
1997 : aFontText (this, SmResId(3)),
1998 : aFonts (this, SmResId(1)),
1999 : aFontsSubsetFT (this, SmResId( FT_FONTS_SUBSET )),
2000 : aFontsSubsetLB (this, SmResId( LB_FONTS_SUBSET )),
2001 : aStyleText (this, SmResId(4)),
2002 : aStyles (this, SmResId(3)),
2003 : aOldSymbolName (this, SmResId(7)),
2004 : aOldSymbolDisplay (this, SmResId(3)),
2005 : aOldSymbolSetName (this, SmResId(8)),
2006 : aSymbolName (this, SmResId(5)),
2007 : aSymbolDisplay (this, SmResId(2)),
2008 : aSymbolSetName (this, SmResId(6)),
2009 : aOkBtn (this, SmResId(1)),
2010 : aHelpBtn (this, SmResId(1)),
2011 : aCancelBtn (this, SmResId(1)),
2012 : aAddBtn (this, SmResId(1)),
2013 : aChangeBtn (this, SmResId(2)),
2014 : aDeleteBtn (this, SmResId(3)),
2015 : aRightArrow (this, SmResId(1)),
2016 : aRigthArrow_Im (SmResId(1)),
2017 : rSymbolMgr (rMgr),
2018 : pSubsetMap (NULL),
2019 0 : pFontList (NULL)
2020 : {
2021 0 : if (bFreeRes)
2022 0 : FreeResource();
2023 :
2024 0 : aHelpBtn.SetClickHdl(LINK(this, SmSymDefineDialog, HelpButtonClickHdl));
2025 :
2026 0 : pFontList = new FontList( pFntListDevice );
2027 :
2028 0 : pOrigSymbol = 0;
2029 :
2030 : // auto completion is troublesome since that symbols character also gets automatically selected in the
2031 : // display and if the user previously selected a character to define/redefine that one this is bad
2032 0 : aOldSymbols.EnableAutocomplete( false, true );
2033 0 : aSymbols .EnableAutocomplete( false, true );
2034 :
2035 0 : FillFonts();
2036 0 : if (aFonts.GetEntryCount() > 0)
2037 0 : SelectFont(aFonts.GetEntry(0));
2038 :
2039 0 : InitColor_Impl();
2040 :
2041 0 : SetSymbolSetManager(rSymbolMgr);
2042 :
2043 0 : aOldSymbols .SetSelectHdl(LINK(this, SmSymDefineDialog, OldSymbolChangeHdl));
2044 0 : aOldSymbolSets .SetSelectHdl(LINK(this, SmSymDefineDialog, OldSymbolSetChangeHdl));
2045 0 : aSymbolSets .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl));
2046 0 : aOldSymbolSets .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl));
2047 0 : aSymbols .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl));
2048 0 : aOldSymbols .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl));
2049 0 : aStyles .SetModifyHdl(LINK(this, SmSymDefineDialog, ModifyHdl));
2050 0 : aFonts .SetSelectHdl(LINK(this, SmSymDefineDialog, FontChangeHdl));
2051 0 : aFontsSubsetLB .SetSelectHdl(LINK(this, SmSymDefineDialog, SubsetChangeHdl));
2052 0 : aStyles .SetSelectHdl(LINK(this, SmSymDefineDialog, StyleChangeHdl));
2053 0 : aAddBtn .SetClickHdl (LINK(this, SmSymDefineDialog, AddClickHdl));
2054 0 : aChangeBtn .SetClickHdl (LINK(this, SmSymDefineDialog, ChangeClickHdl));
2055 0 : aDeleteBtn .SetClickHdl (LINK(this, SmSymDefineDialog, DeleteClickHdl));
2056 0 : aCharsetDisplay.SetHighlightHdl( LINK( this, SmSymDefineDialog, CharHighlightHdl ) );
2057 :
2058 : // preview like controls should have a 2D look
2059 0 : aOldSymbolDisplay.SetBorderStyle( WINDOW_BORDER_MONO );
2060 0 : aSymbolDisplay .SetBorderStyle( WINDOW_BORDER_MONO );
2061 0 : }
2062 :
2063 :
2064 0 : SmSymDefineDialog::~SmSymDefineDialog()
2065 : {
2066 0 : delete pSubsetMap;
2067 0 : delete pOrigSymbol;
2068 0 : }
2069 :
2070 0 : void SmSymDefineDialog::InitColor_Impl()
2071 : {
2072 : #if OSL_DEBUG_LEVEL > 1
2073 : Color aBC( GetDisplayBackground().GetColor() );
2074 : #endif
2075 0 : ColorData nBgCol = COL_WHITE,
2076 0 : nTxtCol = COL_BLACK;
2077 0 : bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
2078 0 : if (bHighContrast)
2079 : {
2080 0 : const StyleSettings &rS = GetSettings().GetStyleSettings();
2081 0 : nBgCol = rS.GetFieldColor().GetColor();
2082 0 : nTxtCol = rS.GetFieldTextColor().GetColor();
2083 : }
2084 :
2085 0 : Color aTmpColor( nBgCol );
2086 0 : Wallpaper aWall( aTmpColor );
2087 0 : Color aTxtColor( nTxtCol );
2088 0 : aCharsetDisplay .SetBackground( aWall );
2089 0 : aCharsetDisplay .SetTextColor( aTxtColor );
2090 0 : aOldSymbolDisplay.SetBackground( aWall );
2091 0 : aOldSymbolDisplay.SetTextColor( aTxtColor );
2092 0 : aSymbolDisplay .SetBackground( aWall );
2093 0 : aSymbolDisplay .SetTextColor( aTxtColor );
2094 :
2095 0 : const Image &rArrowRight = aRigthArrow_Im;
2096 0 : aRightArrow.SetImage( rArrowRight );
2097 0 : }
2098 :
2099 :
2100 0 : void SmSymDefineDialog::DataChanged( const DataChangedEvent& rDCEvt )
2101 : {
2102 0 : if ( rDCEvt.GetType() == DATACHANGED_SETTINGS &&
2103 0 : (rDCEvt.GetFlags() & SETTINGS_STYLE) )
2104 0 : InitColor_Impl();
2105 :
2106 0 : ModalDialog::DataChanged( rDCEvt );
2107 0 : }
2108 :
2109 :
2110 0 : short SmSymDefineDialog::Execute()
2111 : {
2112 0 : short nResult = ModalDialog::Execute();
2113 :
2114 : // apply changes if dialog was closed by clicking OK
2115 0 : if (aSymbolMgrCopy.IsModified() && nResult == RET_OK)
2116 0 : rSymbolMgr = aSymbolMgrCopy;
2117 :
2118 0 : return nResult;
2119 : }
2120 :
2121 :
2122 0 : void SmSymDefineDialog::SetSymbolSetManager(const SmSymbolManager &rMgr)
2123 : {
2124 0 : aSymbolMgrCopy = rMgr;
2125 :
2126 : // Set the modified flag of the copy to false so that
2127 : // we can check later on if anything has been changed
2128 0 : aSymbolMgrCopy.SetModified(false);
2129 :
2130 0 : FillSymbolSets(aOldSymbolSets);
2131 0 : if (aOldSymbolSets.GetEntryCount() > 0)
2132 0 : SelectSymbolSet(aOldSymbolSets.GetEntry(0));
2133 0 : FillSymbolSets(aSymbolSets);
2134 0 : if (aSymbolSets.GetEntryCount() > 0)
2135 0 : SelectSymbolSet(aSymbolSets.GetEntry(0));
2136 0 : FillSymbols(aOldSymbols);
2137 0 : if (aOldSymbols.GetEntryCount() > 0)
2138 0 : SelectSymbol(aOldSymbols.GetEntry(0));
2139 0 : FillSymbols(aSymbols);
2140 0 : if (aSymbols.GetEntryCount() > 0)
2141 0 : SelectSymbol(aSymbols.GetEntry(0));
2142 :
2143 0 : UpdateButtons();
2144 0 : }
2145 :
2146 :
2147 0 : bool SmSymDefineDialog::SelectSymbolSet(ComboBox &rComboBox,
2148 : const OUString &rSymbolSetName, bool bDeleteText)
2149 : {
2150 : #if OSL_DEBUG_LEVEL > 1
2151 : OSL_ENSURE(&rComboBox == &aOldSymbolSets || &rComboBox == &aSymbolSets,
2152 : "Sm : wrong ComboBox");
2153 : #endif
2154 :
2155 : // trim SymbolName (no leading and trailing blanks)
2156 0 : OUString aNormName (rSymbolSetName);
2157 0 : aNormName = comphelper::string::stripStart(aNormName, ' ');
2158 0 : aNormName = comphelper::string::stripEnd(aNormName, ' ');
2159 : // and remove possible deviations within the input
2160 0 : rComboBox.SetText(aNormName);
2161 :
2162 0 : bool bRet = false;
2163 0 : sal_uInt16 nPos = rComboBox.GetEntryPos(aNormName);
2164 :
2165 0 : if (nPos != COMBOBOX_ENTRY_NOTFOUND)
2166 : {
2167 0 : rComboBox.SetText(rComboBox.GetEntry(nPos));
2168 0 : bRet = true;
2169 : }
2170 0 : else if (bDeleteText)
2171 0 : rComboBox.SetText(OUString());
2172 :
2173 0 : bool bIsOld = &rComboBox == &aOldSymbolSets;
2174 :
2175 : // setting the SymbolSet name at the associated display
2176 0 : FixedText &rFT = bIsOld ? aOldSymbolSetName : aSymbolSetName;
2177 0 : rFT.SetText(rComboBox.GetText());
2178 :
2179 : // set the symbol name which belongs to the SymbolSet at the associated combobox
2180 0 : ComboBox &rCB = bIsOld ? aOldSymbols : aSymbols;
2181 0 : FillSymbols(rCB, false);
2182 :
2183 : // display a valid respectively no symbol when changing the SymbolSets
2184 0 : if (bIsOld)
2185 : {
2186 0 : OUString aTmpOldSymbolName;
2187 0 : if (aOldSymbols.GetEntryCount() > 0)
2188 0 : aTmpOldSymbolName = aOldSymbols.GetEntry(0);
2189 0 : SelectSymbol(aOldSymbols, aTmpOldSymbolName, true);
2190 : }
2191 :
2192 0 : UpdateButtons();
2193 :
2194 0 : return bRet;
2195 : }
2196 :
2197 :
2198 0 : void SmSymDefineDialog::SetOrigSymbol(const SmSym *pSymbol,
2199 : const OUString &rSymbolSetName)
2200 : {
2201 : // clear old symbol
2202 0 : delete pOrigSymbol;
2203 0 : pOrigSymbol = 0;
2204 :
2205 0 : OUString aSymName,
2206 0 : aSymSetName;
2207 0 : if (pSymbol)
2208 : {
2209 : // set new symbol
2210 0 : pOrigSymbol = new SmSym( *pSymbol );
2211 :
2212 0 : aSymName = pSymbol->GetName();
2213 0 : aSymSetName = rSymbolSetName;
2214 0 : aOldSymbolDisplay.SetSymbol( pSymbol );
2215 : }
2216 : else
2217 : { // delete displayed symbols
2218 0 : aOldSymbolDisplay.SetText(OUString());
2219 0 : aOldSymbolDisplay.Invalidate();
2220 : }
2221 0 : aOldSymbolName .SetText(aSymName);
2222 0 : aOldSymbolSetName.SetText(aSymSetName);
2223 0 : }
2224 :
2225 :
2226 0 : bool SmSymDefineDialog::SelectSymbol(ComboBox &rComboBox,
2227 : const OUString &rSymbolName, bool bDeleteText)
2228 : {
2229 : #if OSL_DEBUG_LEVEL > 1
2230 : OSL_ENSURE(&rComboBox == &aOldSymbols || &rComboBox == &aSymbols,
2231 : "Sm : wrong ComboBox");
2232 : #endif
2233 :
2234 : // trim SymbolName (no blanks)
2235 0 : OUString aNormName(comphelper::string::remove(rSymbolName, ' '));
2236 : // and remove possible deviations within the input
2237 0 : rComboBox.SetText(aNormName);
2238 :
2239 0 : bool bRet = false;
2240 0 : sal_uInt16 nPos = rComboBox.GetEntryPos(aNormName);
2241 :
2242 0 : bool bIsOld = &rComboBox == &aOldSymbols;
2243 :
2244 0 : if (nPos != COMBOBOX_ENTRY_NOTFOUND)
2245 : {
2246 0 : rComboBox.SetText(rComboBox.GetEntry(nPos));
2247 :
2248 0 : if (!bIsOld)
2249 : {
2250 0 : const SmSym *pSymbol = GetSymbol(aSymbols);
2251 0 : if (pSymbol)
2252 : {
2253 : // choose font and style accordingly
2254 0 : const Font &rFont = pSymbol->GetFace();
2255 0 : SelectFont(rFont.GetName(), false);
2256 0 : SelectStyle(GetFontStyles().GetStyleName(rFont), false);
2257 :
2258 : // Since setting the Font via the Style name of the SymbolFonts doesn't
2259 : // work really well (e.g. it can be empty even though the font itself is
2260 : // bold or italic) we're manually setting the Font with respect to the Symbol
2261 0 : aCharsetDisplay.SetFont(rFont);
2262 0 : aSymbolDisplay.SetFont(rFont);
2263 :
2264 : // select associated character
2265 0 : SelectChar(pSymbol->GetCharacter());
2266 :
2267 : // since SelectChar will also set the unicode point as text in the
2268 : // symbols box, we have to set the symbol name again to get that one displayed
2269 0 : aSymbols.SetText( pSymbol->GetName() );
2270 : }
2271 : }
2272 :
2273 0 : bRet = true;
2274 : }
2275 0 : else if (bDeleteText)
2276 0 : rComboBox.SetText(OUString());
2277 :
2278 0 : if (bIsOld)
2279 : {
2280 : // if there's a change of the old symbol, show only the available ones, otherwise show none
2281 0 : const SmSym *pOldSymbol = NULL;
2282 0 : OUString aTmpOldSymbolSetName;
2283 0 : if (nPos != COMBOBOX_ENTRY_NOTFOUND)
2284 : {
2285 0 : pOldSymbol = aSymbolMgrCopy.GetSymbolByName(aNormName);
2286 0 : aTmpOldSymbolSetName = aOldSymbolSets.GetText();
2287 : }
2288 0 : SetOrigSymbol(pOldSymbol, aTmpOldSymbolSetName);
2289 : }
2290 : else
2291 0 : aSymbolName.SetText(rComboBox.GetText());
2292 :
2293 0 : UpdateButtons();
2294 :
2295 0 : return bRet;
2296 : }
2297 :
2298 :
2299 0 : void SmSymDefineDialog::SetFont(const OUString &rFontName, const OUString &rStyleName)
2300 : {
2301 : // get Font (FontInfo) matching name and style
2302 0 : FontInfo aFI;
2303 0 : if (pFontList)
2304 0 : aFI = pFontList->Get(rFontName, WEIGHT_NORMAL, ITALIC_NONE);
2305 0 : SetFontStyle(rStyleName, aFI);
2306 :
2307 0 : aCharsetDisplay.SetFont(aFI);
2308 0 : aSymbolDisplay.SetFont(aFI);
2309 :
2310 : // update subset listbox for new font's unicode subsets
2311 0 : FontCharMap aFontCharMap;
2312 0 : aCharsetDisplay.GetFontCharMap( aFontCharMap );
2313 0 : if (pSubsetMap)
2314 0 : delete pSubsetMap;
2315 0 : pSubsetMap = new SubsetMap( &aFontCharMap );
2316 :
2317 0 : aFontsSubsetLB.Clear();
2318 0 : bool bFirst = true;
2319 : const Subset* pSubset;
2320 0 : while( NULL != (pSubset = pSubsetMap->GetNextSubset( bFirst )) )
2321 : {
2322 0 : sal_uInt16 nPos = aFontsSubsetLB.InsertEntry( pSubset->GetName());
2323 0 : aFontsSubsetLB.SetEntryData( nPos, (void *) pSubset );
2324 : // subset must live at least as long as the selected font !!!
2325 0 : if( bFirst )
2326 0 : aFontsSubsetLB.SelectEntryPos( nPos );
2327 0 : bFirst = false;
2328 : }
2329 0 : if( bFirst )
2330 0 : aFontsSubsetLB.SetNoSelection();
2331 0 : aFontsSubsetLB.Enable( !bFirst );
2332 0 : }
2333 :
2334 :
2335 0 : bool SmSymDefineDialog::SelectFont(const OUString &rFontName, bool bApplyFont)
2336 : {
2337 0 : bool bRet = false;
2338 0 : sal_uInt16 nPos = aFonts.GetEntryPos(rFontName);
2339 :
2340 0 : if (nPos != LISTBOX_ENTRY_NOTFOUND)
2341 : {
2342 0 : aFonts.SelectEntryPos(nPos);
2343 0 : if (aStyles.GetEntryCount() > 0)
2344 0 : SelectStyle(aStyles.GetEntry(0));
2345 0 : if (bApplyFont)
2346 : {
2347 0 : SetFont(aFonts.GetSelectEntry(), aStyles.GetText());
2348 0 : bRet = true;
2349 0 : aSymbolDisplay.SetSymbol( aCharsetDisplay.GetSelectCharacter(), aCharsetDisplay.GetFont() );
2350 : }
2351 0 : bRet = sal_True;
2352 : }
2353 : else
2354 0 : aFonts.SetNoSelection();
2355 0 : FillStyles();
2356 :
2357 0 : UpdateButtons();
2358 :
2359 0 : return bRet;
2360 : }
2361 :
2362 :
2363 0 : bool SmSymDefineDialog::SelectStyle(const OUString &rStyleName, bool bApplyFont)
2364 : {
2365 0 : bool bRet = false;
2366 0 : sal_uInt16 nPos = aStyles.GetEntryPos(rStyleName);
2367 :
2368 : // if the style is not available take the first available one (if existent)
2369 0 : if (nPos == COMBOBOX_ENTRY_NOTFOUND && aStyles.GetEntryCount() > 0)
2370 0 : nPos = 0;
2371 :
2372 0 : if (nPos != COMBOBOX_ENTRY_NOTFOUND)
2373 : {
2374 0 : aStyles.SetText(aStyles.GetEntry(nPos));
2375 0 : if (bApplyFont)
2376 : {
2377 0 : SetFont(aFonts.GetSelectEntry(), aStyles.GetText());
2378 0 : bRet = true;
2379 0 : aSymbolDisplay.SetSymbol( aCharsetDisplay.GetSelectCharacter(), aCharsetDisplay.GetFont() );
2380 : }
2381 0 : bRet = sal_True;
2382 : }
2383 : else
2384 0 : aStyles.SetText(OUString());
2385 :
2386 0 : UpdateButtons();
2387 :
2388 0 : return bRet;
2389 : }
2390 :
2391 :
2392 0 : void SmSymDefineDialog::SelectChar(sal_Unicode cChar)
2393 : {
2394 0 : aCharsetDisplay.SelectCharacter( cChar );
2395 0 : aSymbolDisplay.SetSymbol( cChar, aCharsetDisplay.GetFont() );
2396 :
2397 0 : UpdateButtons();
2398 21 : }
2399 :
2400 :
2401 : /**************************************************************************/
2402 :
2403 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|