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

Generated by: LCOV version 1.10