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

Generated by: LCOV version 1.10