diff options
Diffstat (limited to 'svx/source/dialog/fntctrl.cxx')
-rw-r--r-- | svx/source/dialog/fntctrl.cxx | 846 |
1 files changed, 846 insertions, 0 deletions
diff --git a/svx/source/dialog/fntctrl.cxx b/svx/source/dialog/fntctrl.cxx new file mode 100644 index 000000000000..14eb6dd78272 --- /dev/null +++ b/svx/source/dialog/fntctrl.cxx @@ -0,0 +1,846 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_svx.hxx" + +// include --------------------------------------------------------------- +#include <sfx2/viewsh.hxx> // SfxViewShell +#include <sfx2/printer.hxx> // Printer +#include <vcl/metric.hxx> +#include <vcl/svapp.hxx> +#include <unicode/uchar.h> +#include <com/sun/star/uno/Reference.h> +#include <com/sun/star/i18n/XBreakIterator.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> +#include <comphelper/processfactory.hxx> + +#include <com/sun/star/i18n/ScriptType.hdl> + +#ifndef _SVSTDARR_HXX +#define _SVSTDARR_USHORTS +#define _SVSTDARR_ULONGS +#define _SVSTDARR_XUB_STRLEN +#include <svl/svstdarr.hxx> +#endif +#include <svtools/colorcfg.hxx> + +#include <svx/fntctrl.hxx> +#include <svx/dialogs.hrc> +#define TEXT_WIDTH 20 + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using ::com::sun::star::i18n::XBreakIterator; + +// ----------------------------------------------------------------------- +// small helper functions to set fonts +// ----------------------------------------------------------------------- +namespace +{ + void scaleFontWidth(Font& _rFont,const OutputDevice& rOutDev,long& _n100PercentFont) + { + _rFont.SetWidth( 0 ); + _n100PercentFont = rOutDev.GetFontMetric( _rFont ).GetWidth(); + } + // ----------------------------------------------------------------------- + void initFont(Font& _rFont) + { + _rFont.SetTransparent(sal_True); + _rFont.SetAlign(ALIGN_BASELINE); + } + // ----------------------------------------------------------------------- + void setFontSize(Font& _rFont) + { + Size aSize( _rFont.GetSize() ); + aSize.Height() = ( aSize.Height() * 3 ) / 5; + aSize.Width() = ( aSize.Width() * 3 ) / 5; + _rFont.SetSize( aSize ); + } + // ----------------------------------------------------------------------- + void calcFontHeightAnyAscent(OutputDevice* _pWin,Font& _rFont,long& _nHeight,long& _nAscent) + { + if ( !_nHeight ) + { + _pWin->SetFont( _rFont ); + FontMetric aMetric( _pWin->GetFontMetric() ); + _nHeight = aMetric.GetLineHeight(); + _nAscent = aMetric.GetAscent(); + } + } + // ----------------------------------------------------------------------- + void setFont( const SvxFont& rNewFont, SvxFont& rImplFont ) + { + rImplFont = rNewFont; + rImplFont.SetTransparent( sal_True ); + rImplFont.SetAlign( ALIGN_BASELINE ); + } + +} +// ----------------------------------------------------------------------- + + +// class FontPrevWin_Impl ----------------------------------------------- + +class FontPrevWin_Impl +{ + friend class SvxFontPrevWindow; + + SvxFont aFont; + Printer* pPrinter; + sal_Bool bDelPrinter; + + Reference < XBreakIterator > xBreak; + SvULongs aTextWidth; + SvXub_StrLens aScriptChg; + SvUShorts aScriptType; + SvxFont aCJKFont; + SvxFont aCTLFont; + String aText; + String aScriptText; + Color* pColor; + Color* pBackColor; + long nAscent; + sal_Unicode cStartBracket; + sal_Unicode cEndBracket; + + long n100PercentFontWidth; // initial -1 -> not set yet + long n100PercentFontWidthCJK; + long n100PercentFontWidthCTL; + sal_uInt16 nFontWidthScale; + + sal_Bool bSelection : 1, + bGetSelection : 1, + bUseResText : 1, + bTwoLines : 1, + bIsCJKUI : 1, + bIsCTLUI : 1, + bUseFontNameAsText : 1, + bTextInited : 1; + + void _CheckScript(); +public: + inline FontPrevWin_Impl() : + pPrinter( NULL ), bDelPrinter( sal_False ), + pColor( NULL ), pBackColor( 0 ), nAscent( 0 ), + cStartBracket( 0 ), cEndBracket( 0 ), nFontWidthScale( 100 ), + bSelection( sal_False ), bGetSelection( sal_False ), bUseResText( sal_False ), + bTwoLines( sal_False ), + bIsCJKUI( sal_False ), bIsCTLUI( sal_False ), + bUseFontNameAsText( sal_False ), bTextInited( sal_False ) + { + Invalidate100PercentFontWidth(); + } + + inline ~FontPrevWin_Impl() + { + delete pColor; + delete pBackColor; + if( bDelPrinter ) + delete pPrinter; + } + + void CheckScript(); + Size CalcTextSize( OutputDevice* pWin, OutputDevice* pPrt, SvxFont &rFont ); + void DrawPrev( OutputDevice* pWin, Printer* pPrt, Point &rPt, SvxFont &rFont ); + + sal_Bool SetFontWidthScale( sal_uInt16 nScaleInPercent ); + inline void Invalidate100PercentFontWidth(); + inline sal_Bool Is100PercentFontWidthValid() const; + void ScaleFontWidth( const OutputDevice& rOutDev ); + // scales rNonCJKFont and aCJKFont depending on nFontWidthScale and + // sets the 100%-Font-Widths +}; + +void FontPrevWin_Impl::CheckScript() +{ + if( aText != aScriptText ) + _CheckScript(); +} + +inline void FontPrevWin_Impl::Invalidate100PercentFontWidth() +{ + n100PercentFontWidth = n100PercentFontWidthCJK = n100PercentFontWidthCTL = -1; +} + +inline sal_Bool FontPrevWin_Impl::Is100PercentFontWidthValid() const +{ + DBG_ASSERT( ( n100PercentFontWidth == -1 && n100PercentFontWidthCJK == -1 ) || + ( n100PercentFontWidth != -1 && n100PercentFontWidthCJK != -1 ) || + ( n100PercentFontWidth == -1 && n100PercentFontWidthCTL == -1 ) || + ( n100PercentFontWidth != -1 && n100PercentFontWidthCTL != -1 ), + "*FontPrevWin_Impl::Is100PercentFontWidthValid(): 100PercentFontWidth's not synchronous" ); + return n100PercentFontWidth != -1; +} + +// class FontPrevWin_Impl ----------------------------------------------- + +/*-----------------19.7.2001 08:44------------------ + * void FontPrevWin_Impl::_CheckScript() + * evalutates the scripttypes of the actual string. + * Afterwards the positions of script change are notified in aScriptChg, + * the scripttypes in aScriptType. + * The aTextWidth array will be filled with zero. + * --------------------------------------------------*/ + +void FontPrevWin_Impl::_CheckScript() +{ + aScriptText = aText; + size_t nCnt = aScriptChg.size(); + if( nCnt ) + { + aScriptChg.clear(); + aScriptType.Remove( 0, nCnt ); + aTextWidth.Remove( 0, nCnt ); + nCnt = 0; + } + if( !xBreak.is() ) + { + Reference< XMultiServiceFactory > xMSF = ::comphelper::getProcessServiceFactory(); + xBreak = Reference< XBreakIterator >(xMSF->createInstance( + ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.i18n.BreakIterator")) ),UNO_QUERY); + } + if( xBreak.is() ) + { + sal_uInt16 nScript = xBreak->getScriptType( aText, 0 ); + sal_uInt16 nChg = 0; + if( com::sun::star::i18n::ScriptType::WEAK == nScript ) + { + nChg = (xub_StrLen)xBreak->endOfScript( aText, nChg, nScript ); + if( nChg < aText.Len() ) + nScript = xBreak->getScriptType( aText, nChg ); + else + nScript = com::sun::star::i18n::ScriptType::LATIN; + } + + do + { + nChg = (xub_StrLen)xBreak->endOfScript( aText, nChg, nScript ); + if (nChg < aText.Len() && nChg > 0 && + (com::sun::star::i18n::ScriptType::WEAK == + xBreak->getScriptType(aText, nChg - 1))) + { + int8_t nType = u_charType(aText.GetChar(nChg) ); + if (nType == U_NON_SPACING_MARK || nType == U_ENCLOSING_MARK || + nType == U_COMBINING_SPACING_MARK ) + { + aScriptChg.push_back( nChg - 1 ); + } + else + { + aScriptChg.push_back( nChg ); + } + } + else + { + aScriptChg.push_back( nChg ); + } + aScriptType.Insert( nScript, nCnt ); + aTextWidth.Insert( sal_uIntPtr(0), nCnt++ ); + + if( nChg < aText.Len() ) + nScript = xBreak->getScriptType( aText, nChg ); + else + break; + } while( sal_True ); + } +} + +/*-----------------19.7.2001 08:48------------------ + * Size FontPrevWin_Impl::CalcTextSize(..) + * fills the aTextWidth array with the text width of every part + * of the actual string without a script change inside. + * For Latin parts the given rFont will be used, + * for Asian parts the aCJKFont. + * The returned size contains the whole string. + * The member nAscent is calculated to the maximal ascent of all used fonts. + * --------------------------------------------------*/ + +Size FontPrevWin_Impl::CalcTextSize( OutputDevice* pWin, OutputDevice* _pPrinter, + SvxFont &rFont ) +{ + sal_uInt16 nScript; + sal_uInt16 nIdx = 0; + xub_StrLen nStart = 0; + xub_StrLen nEnd; + size_t nCnt = aScriptChg.size(); + if( nCnt ) + { + nEnd = aScriptChg[ nIdx ]; + nScript = aScriptType[ nIdx ]; + } + else + { + nEnd = aText.Len(); + nScript = com::sun::star::i18n::ScriptType::LATIN; + } + long nTxtWidth = 0; + long nCJKHeight = 0; + long nCTLHeight = 0; + long nHeight = 0; + nAscent = 0; + long nCJKAscent = 0; + long nCTLAscent = 0; + do + { + SvxFont& rFnt = (nScript==com::sun::star::i18n::ScriptType::ASIAN) ? aCJKFont : ((nScript==com::sun::star::i18n::ScriptType::COMPLEX) ? aCTLFont : rFont); + sal_uIntPtr nWidth = rFnt.GetTxtSize( _pPrinter, aText, nStart, nEnd-nStart ). + Width(); + aTextWidth[ nIdx++ ] = nWidth; + nTxtWidth += nWidth; + switch(nScript) + { + case com::sun::star::i18n::ScriptType::ASIAN: + calcFontHeightAnyAscent(pWin,aCJKFont,nCJKHeight,nCJKAscent); + break; + case com::sun::star::i18n::ScriptType::COMPLEX: + calcFontHeightAnyAscent(pWin,aCTLFont,nCTLHeight,nCTLAscent); + break; + default: + calcFontHeightAnyAscent(pWin,rFont,nHeight,nAscent); + } + + if( nEnd < aText.Len() && nIdx < nCnt ) + { + nStart = nEnd; + nEnd = aScriptChg[ nIdx ]; + nScript = aScriptType[ nIdx ]; + } + else + break; + } + while( sal_True ); + nHeight -= nAscent; + nCJKHeight -= nCJKAscent; + nCTLHeight -= nCTLAscent; + if( nHeight < nCJKHeight ) + nHeight = nCJKHeight; + if( nAscent < nCJKAscent ) + nAscent = nCJKAscent; + if( nHeight < nCTLHeight ) + nHeight = nCTLHeight; + if( nAscent < nCTLAscent ) + nAscent = nCTLAscent; + nHeight += nAscent; + + Size aTxtSize( nTxtWidth, nHeight ); + return aTxtSize; +} + +/*-----------------19.7.2001 08:54------------------ + * void FontPrevWin_Impl::DrawPrev(..) + * calls SvxFont::DrawPrev(..) for every part of the string without a script + * change inside, for Asian parts the aCJKFont will be used, otherwise the + * given rFont. + * --------------------------------------------------*/ + +void FontPrevWin_Impl::DrawPrev( OutputDevice* pWin, Printer* _pPrinter, + Point &rPt, SvxFont &rFont ) +{ + Font aOldFont = _pPrinter->GetFont(); + sal_uInt16 nScript; + sal_uInt16 nIdx = 0; + xub_StrLen nStart = 0; + xub_StrLen nEnd; + size_t nCnt = aScriptChg.size(); + if( nCnt ) + { + nEnd = aScriptChg[ nIdx ]; + nScript = aScriptType[ nIdx ]; + } + else + { + nEnd = aText.Len(); + nScript = com::sun::star::i18n::ScriptType::LATIN; + } + do + { + SvxFont& rFnt = (nScript==com::sun::star::i18n::ScriptType::ASIAN) ? aCJKFont : ((nScript==com::sun::star::i18n::ScriptType::COMPLEX) ? aCTLFont : rFont); + _pPrinter->SetFont( rFnt ); + + rFnt.DrawPrev( pWin, _pPrinter, rPt, aText, nStart, nEnd - nStart ); + + rPt.X() += aTextWidth[ nIdx++ ]; + if( nEnd < aText.Len() && nIdx < nCnt ) + { + nStart = nEnd; + nEnd = aScriptChg[ nIdx ]; + nScript = aScriptType[ nIdx ]; + } + else + break; + } + while( sal_True ); + _pPrinter->SetFont( aOldFont ); +} + +// ----------------------------------------------------------------------- + +sal_Bool FontPrevWin_Impl::SetFontWidthScale( sal_uInt16 nScale ) +{ + if( nFontWidthScale != nScale ) + { + nFontWidthScale = nScale; + return sal_True; + } + + return sal_False; +} + + +// ----------------------------------------------------------------------- + +void FontPrevWin_Impl::ScaleFontWidth( const OutputDevice& rOutDev ) +{ + if( !Is100PercentFontWidthValid() ) + { + scaleFontWidth(aFont,rOutDev,n100PercentFontWidth); + scaleFontWidth(aCJKFont,rOutDev,n100PercentFontWidthCJK); + scaleFontWidth(aCTLFont,rOutDev,n100PercentFontWidthCTL); + } + + aFont.SetWidth( n100PercentFontWidth * nFontWidthScale / 100 ); + aCJKFont.SetWidth( n100PercentFontWidthCJK * nFontWidthScale / 100 ); + aCTLFont.SetWidth( n100PercentFontWidthCTL * nFontWidthScale / 100 ); +} + +// class SvxFontPrevWindow ----------------------------------------------- + +void SvxFontPrevWindow::InitSettings( sal_Bool bForeground, sal_Bool bBackground ) +{ + const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings(); + + if ( bForeground ) + { + svtools::ColorConfig aColorConfig; + Color aTextColor( aColorConfig.GetColorValue( svtools::FONTCOLOR ).nColor ); + + if ( IsControlForeground() ) + aTextColor = GetControlForeground(); + SetTextColor( aTextColor ); + } + + if ( bBackground ) + { + if ( IsControlBackground() ) + SetBackground( GetControlBackground() ); + else + SetBackground( rStyleSettings.GetWindowColor() ); + } + Invalidate(); +} + +// ----------------------------------------------------------------------- + +SvxFontPrevWindow::SvxFontPrevWindow( Window* pParent, const ResId& rId ) : + + Window ( pParent, rId ) +{ + pImpl = new FontPrevWin_Impl; + SfxViewShell* pSh = SfxViewShell::Current(); + + if ( pSh ) + pImpl->pPrinter = pSh->GetPrinter(); + + if ( !pImpl->pPrinter ) + { + pImpl->pPrinter = new Printer; + pImpl->bDelPrinter = sal_True; + } + SetMapMode( MapMode( MAP_TWIP ) ); + initFont(pImpl->aFont); + initFont(pImpl->aCJKFont); + initFont(pImpl->aCTLFont); + InitSettings( sal_True, sal_True ); + SetBorderStyle( WINDOW_BORDER_MONO ); + + LanguageType eLanguage = Application::GetSettings().GetUILanguage(); + switch( eLanguage ) + { + case LANGUAGE_CHINESE: + case LANGUAGE_JAPANESE: + case LANGUAGE_KOREAN: + case LANGUAGE_KOREAN_JOHAB: + case LANGUAGE_CHINESE_SIMPLIFIED: + case LANGUAGE_CHINESE_HONGKONG: + case LANGUAGE_CHINESE_SINGAPORE: + case LANGUAGE_CHINESE_MACAU: + case LANGUAGE_CHINESE_TRADITIONAL: + pImpl->bIsCJKUI = sal_True; + break; + // TODO: CTL Locale + // pImpl->bIsCTLUI = sal_True; + // break; + default: + pImpl->bIsCJKUI = pImpl->bIsCTLUI = sal_False; + break; + } +} + +// ----------------------------------------------------------------------- + +SvxFontPrevWindow::~SvxFontPrevWindow() +{ + delete pImpl; +} + +// ----------------------------------------------------------------------- +SvxFont& SvxFontPrevWindow::GetCTLFont() +{ + return pImpl->aCTLFont; +} + +// ----------------------------------------------------------------------- + +SvxFont& SvxFontPrevWindow::GetCJKFont() +{ + return pImpl->aCJKFont; +} + +// ----------------------------------------------------------------------- + +void SvxFontPrevWindow::StateChanged( StateChangedType nType ) +{ + if ( nType == STATE_CHANGE_CONTROLFOREGROUND ) + InitSettings( sal_True, sal_False ); + else if ( nType == STATE_CHANGE_CONTROLBACKGROUND ) + InitSettings( sal_False, sal_True ); + + Window::StateChanged( nType ); +} + +// ----------------------------------------------------------------------- + +void SvxFontPrevWindow::DataChanged( const DataChangedEvent& rDCEvt ) +{ + if ( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) ) + InitSettings( sal_True, sal_True ); + else + Window::DataChanged( rDCEvt ); +} + +SvxFont& SvxFontPrevWindow::GetFont() +{ + pImpl->Invalidate100PercentFontWidth(); // because the user might change the size + return pImpl->aFont; +} + +const SvxFont& SvxFontPrevWindow::GetFont() const +{ + return pImpl->aFont; +} + +// ----------------------------------------------------------------------- + +void SvxFontPrevWindow::SetPreviewText( const ::rtl::OUString& rString ) +{ + pImpl->aText = rString; + pImpl->bTextInited = sal_True; +} + +// ----------------------------------------------------------------------- + +void SvxFontPrevWindow::SetFontNameAsPreviewText() +{ + pImpl->bUseFontNameAsText = sal_True; +} + +// ----------------------------------------------------------------------- + +void SvxFontPrevWindow::SetFont( const SvxFont& rOutFont ) +{ + setFont( rOutFont, pImpl->aFont ); + + pImpl->Invalidate100PercentFontWidth(); + Invalidate(); +} + +// ----------------------------------------------------------------------- + +void SvxFontPrevWindow::SetFont( const SvxFont& rNormalOutFont, const SvxFont& rCJKOutFont, const SvxFont& rCTLFont ) +{ + setFont( rNormalOutFont, pImpl->aFont ); + setFont( rCJKOutFont, pImpl->aCJKFont ); + setFont( rCTLFont, pImpl->aCTLFont ); + + + pImpl->Invalidate100PercentFontWidth(); + Invalidate(); +} + +// ----------------------------------------------------------------------- + +void SvxFontPrevWindow::SetCJKFont( const SvxFont &rCJKOutFont ) +{ + setFont( rCJKOutFont, pImpl->aCJKFont ); + + pImpl->Invalidate100PercentFontWidth(); + Invalidate(); +} +// ----------------------------------------------------------------------------- +void SvxFontPrevWindow::SetCTLFont( const SvxFont &rCTLOutFont ) +{ + setFont( rCTLOutFont, pImpl->aCTLFont ); + + pImpl->Invalidate100PercentFontWidth(); + Invalidate(); +} + +// ----------------------------------------------------------------------- + +void SvxFontPrevWindow::SetColor(const Color &rColor) +{ + delete pImpl->pColor; + pImpl->pColor = new Color( rColor ); + Invalidate(); +} +// ----------------------------------------------------------------------- + +void SvxFontPrevWindow::ResetColor() +{ + delete pImpl->pColor; + pImpl->pColor = 0; + Invalidate(); +} + +// ----------------------------------------------------------------------- + +void SvxFontPrevWindow::SetBackColor(const Color &rColor) +{ + delete pImpl->pBackColor; + pImpl->pBackColor = new Color( rColor ); + Invalidate(); +} + +// ----------------------------------------------------------------------- + +void SvxFontPrevWindow::UseResourceText( sal_Bool bUse ) +{ + pImpl->bUseResText = bUse; +} + +// ----------------------------------------------------------------------- + +void SvxFontPrevWindow::Paint( const Rectangle& ) +{ + Printer* pPrinter = pImpl->pPrinter; + SvxFont& rFont = pImpl->aFont; + SvxFont& rCJKFont = pImpl->aCJKFont; + // TODO: SvxFont& rCTLFont = pImpl->aCTLFont; + + if ( pImpl->bUseResText ) + pImpl->aText = GetText(); + else if ( !pImpl->bSelection && !pImpl->bTextInited ) + { + SfxViewShell* pSh = SfxViewShell::Current(); + + if ( pSh && !pImpl->bGetSelection && !pImpl->bUseFontNameAsText ) + { + pImpl->aText = pSh->GetSelectionText(); + pImpl->bGetSelection = sal_True; + pImpl->bSelection = pImpl->aText.Len() != 0; + + } + + if ( !pImpl->bSelection || pImpl->bUseFontNameAsText ) + { + pImpl->aText = rFont.GetName(); + if( pImpl->bIsCJKUI ) + pImpl->aText += rCJKFont.GetName(); + //TODO bIsCTLUI + } + + if ( !pImpl->aText.Len() ) + pImpl->aText = GetText(); + + // remove line feeds and carriage returns from string + bool bNotEmpty = false; + for ( xub_StrLen i = 0; i < pImpl->aText.Len(); ++i ) + { + if ( 0xa == pImpl->aText.GetChar( i ) || + 0xd == pImpl->aText.GetChar( i ) ) + pImpl->aText.SetChar( i, ' ' ); + else + bNotEmpty = true; + } + if ( !bNotEmpty ) + pImpl->aText = GetText(); + + if ( pImpl->aText.Len() > (TEXT_WIDTH-1) ) + pImpl->aText.Erase( pImpl->aText.Search( sal_Unicode( ' ' ), TEXT_WIDTH ) ); + } + + // calculate text width scaling + pImpl->ScaleFontWidth( *this/*, rFont*/ ); + + pImpl->CheckScript(); + Size aTxtSize = pImpl->CalcTextSize( this, pPrinter, rFont ); + + const Size aLogSize( GetOutputSize() ); + + long nX = aLogSize.Width() / 2 - aTxtSize.Width() / 2; + long nY = aLogSize.Height() / 2 - aTxtSize.Height() / 2; + + if ( nY + pImpl->nAscent > aLogSize.Height() ) + nY = aLogSize.Height() - pImpl->nAscent; + + if ( pImpl->pBackColor ) + { + Rectangle aRect( Point( 0, 0 ), aLogSize ); + Color aLineCol = GetLineColor(); + Color aFillCol = GetFillColor(); + SetLineColor(); + SetFillColor( *pImpl->pBackColor ); + DrawRect( aRect ); + SetLineColor( aLineCol ); + SetFillColor( aFillCol ); + } + if ( pImpl->pColor ) + { + Rectangle aRect( Point( nX, nY ), aTxtSize ); + Color aLineCol = GetLineColor(); + Color aFillCol = GetFillColor(); + SetLineColor(); + SetFillColor( *pImpl->pColor ); + DrawRect( aRect ); + SetLineColor( aLineCol ); + SetFillColor( aFillCol ); + } + + long nStdAscent = pImpl->nAscent; + nY += nStdAscent; + + if(pImpl->bTwoLines) + { + SvxFont aSmallFont( rFont ); + Size aOldSize = pImpl->aCJKFont.GetSize(); + setFontSize(aSmallFont); + setFontSize(pImpl->aCJKFont); + + long nStartBracketWidth = 0; + long nEndBracketWidth = 0; + long nTextWidth = 0; + if(pImpl->cStartBracket) + { + String sBracket(pImpl->cStartBracket); + nStartBracketWidth = rFont.GetTxtSize( pPrinter, sBracket ).Width(); + } + if(pImpl->cEndBracket) + { + String sBracket(pImpl->cEndBracket); + nEndBracketWidth = rFont.GetTxtSize( pPrinter, sBracket ).Width(); + } + nTextWidth = pImpl->CalcTextSize( this, pPrinter, aSmallFont ).Width(); + long nResultWidth = nStartBracketWidth; + nResultWidth += nEndBracketWidth; + nResultWidth += nTextWidth; + + long _nX = (aLogSize.Width() - nResultWidth) / 2; + DrawLine( Point( 0, nY ), Point( _nX, nY ) ); + DrawLine( Point( _nX + nResultWidth, nY ), Point( aLogSize.Width(), nY ) ); + + long nSmallAscent = pImpl->nAscent; + long nOffset = (nStdAscent - nSmallAscent ) / 2; + + if(pImpl->cStartBracket) + { + String sBracket(pImpl->cStartBracket); + rFont.DrawPrev( this, pPrinter, Point( _nX, nY - nOffset - 4), sBracket ); + _nX += nStartBracketWidth; + } + + Point aTmpPoint1( _nX, nY - nSmallAscent - 2 ); + Point aTmpPoint2( _nX, nY ); + pImpl->DrawPrev( this, pPrinter, aTmpPoint1, aSmallFont ); + pImpl->DrawPrev( this, pPrinter, aTmpPoint2, aSmallFont ); + + _nX += nTextWidth; + if(pImpl->cEndBracket) + { + Point aTmpPoint( _nX + 1, nY - nOffset - 4); + String sBracket(pImpl->cEndBracket); + rFont.DrawPrev( this, pPrinter, aTmpPoint, sBracket ); + } + pImpl->aCJKFont.SetSize( aOldSize ); + } + else + { + Color aLineCol = GetLineColor(); + + SetLineColor( rFont.GetColor() ); + DrawLine( Point( 0, nY ), Point( nX, nY ) ); + DrawLine( Point( nX + aTxtSize.Width(), nY ), Point( aLogSize.Width(), nY ) ); + + SetLineColor( aLineCol ); + + Point aTmpPoint( nX, nY ); + pImpl->DrawPrev( this, pPrinter, aTmpPoint, rFont ); + } +} + +sal_Bool SvxFontPrevWindow::IsTwoLines() const +{ + return pImpl->bTwoLines; +} + +void SvxFontPrevWindow::SetTwoLines(sal_Bool bSet) +{ + pImpl->bTwoLines = bSet;} + + +void SvxFontPrevWindow::SetBrackets(sal_Unicode cStart, sal_Unicode cEnd) +{ + pImpl->cStartBracket = cStart; + pImpl->cEndBracket = cEnd; +} + +// ----------------------------------------------------------------------- + +void SvxFontPrevWindow::SetFontWidthScale( sal_uInt16 n ) +{ + if( pImpl->SetFontWidthScale( n ) ) + Invalidate(); +} + +// ----------------------------------------------------------------------- + +void SvxFontPrevWindow::AutoCorrectFontColor( void ) +{ + Color aFontColor( GetTextColor() ); + + if( COL_AUTO == pImpl->aFont.GetColor().GetColor() ) + pImpl->aFont.SetColor( aFontColor ); + + if( COL_AUTO == pImpl->aCJKFont.GetColor().GetColor() ) + pImpl->aCJKFont.SetColor( aFontColor ); + + if( COL_AUTO == pImpl->aCTLFont.GetColor().GetColor() ) + pImpl->aCTLFont.SetColor( aFontColor ); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |