LCOV - code coverage report
Current view: top level - starmath/source - dialog.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1 1356 0.1 %
Date: 2015-06-13 12:38:46 Functions: 2 175 1.1 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.11