summaryrefslogtreecommitdiff
path: root/svtools/source/control/ctrlbox.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svtools/source/control/ctrlbox.cxx')
-rw-r--r--svtools/source/control/ctrlbox.cxx2909
1 files changed, 0 insertions, 2909 deletions
diff --git a/svtools/source/control/ctrlbox.cxx b/svtools/source/control/ctrlbox.cxx
deleted file mode 100644
index d25a3192f0..0000000000
--- a/svtools/source/control/ctrlbox.cxx
+++ /dev/null
@@ -1,2909 +0,0 @@
-/* -*- 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_svtools.hxx"
-
-#define _CTRLBOX_CXX
-#include <tools/debug.hxx>
-#include <tools/stream.hxx>
-#include <vcl/svapp.hxx>
-#include <vcl/field.hxx>
-#include <vcl/helper.hxx>
-#include <sal/macros.h>
-#include <comphelper/processfactory.hxx>
-#include <unotools/charclass.hxx>
-
-#include <svtools/svtdata.hxx>
-#include <svtools/svtools.hrc>
-#include <svtools/ctrlbox.hxx>
-#include <svtools/ctrltool.hxx>
-#include <svtools/borderhelper.hxx>
-
-#include <vcl/i18nhelp.hxx>
-#include <vcl/fontcapabilities.hxx>
-#include <basegfx/polygon/b2dpolygon.hxx>
-#include <basegfx/polygon/b2dpolygontools.hxx>
-
-#include <rtl/bootstrap.hxx>
-
-#if OSL_DEBUG_LEVEL > 1
-#include <cstdio>
-#endif
-
-#define IMGINNERTEXTSPACE 2
-#define IMGOUTERTEXTSPACE 5
-#define EXTRAFONTSIZE 5
-#define MAXPREVIEWWIDTH 100
-
-#define TWIPS_TO_PT100(val) (val * 5)
-#define PT100_TO_TWIPS(val) (val / 5)
-
-#define FONTNAMEBOXMRUENTRIESFILE "/user/config/fontnameboxmruentries"
-
-using namespace ::com::sun::star;
-
-// ========================================================================
-// ColorListBox
-// ========================================================================
-
-// --------------------
-// - ImplColorListData -
-// --------------------
-
-struct ImplColorListData
-{
- Color aColor;
- sal_Bool bColor;
-
- ImplColorListData() : aColor( COL_BLACK ) { bColor = sal_False; }
- ImplColorListData( const Color& rColor ) : aColor( rColor ) { bColor = sal_True; }
-};
-
-// -----------------------------------------------------------------------
-
-void ColorListBox::ImplInit()
-{
- pColorList = new ImpColorList();
- aImageSize.Width() = GetTextWidth( XubString( RTL_CONSTASCII_USTRINGPARAM( "xxx" ) ) );
- aImageSize.Height() = GetTextHeight();
- aImageSize.Height() -= 2;
-
- EnableUserDraw( sal_True );
- SetUserItemSize( aImageSize );
-}
-
-// -----------------------------------------------------------------------
-
-void ColorListBox::ImplDestroyColorEntries()
-{
- for ( size_t n = pColorList->size(); n; )
- delete (*pColorList)[ --n ];
- pColorList->clear();
-}
-
-// -----------------------------------------------------------------------
-
-ColorListBox::ColorListBox( Window* pParent, WinBits nWinStyle ) :
- ListBox( pParent, nWinStyle )
-{
- ImplInit();
-}
-
-// -----------------------------------------------------------------------
-
-ColorListBox::ColorListBox( Window* pParent, const ResId& rResId ) :
- ListBox( pParent, rResId )
-{
- ImplInit();
-}
-
-// -----------------------------------------------------------------------
-
-ColorListBox::~ColorListBox()
-{
- ImplDestroyColorEntries();
- delete pColorList;
-}
-
-// -----------------------------------------------------------------------
-
-sal_uInt16 ColorListBox::InsertEntry( const XubString& rStr, sal_uInt16 nPos )
-{
- nPos = ListBox::InsertEntry( rStr, nPos );
- if ( nPos != LISTBOX_ERROR )
- {
- ImplColorListData* pData = new ImplColorListData;
- if ( nPos < pColorList->size() )
- {
- ImpColorList::iterator it = pColorList->begin();
- ::std::advance( it, nPos );
- pColorList->insert( it, pData );
- }
- else
- {
- pColorList->push_back( pData );
- nPos = pColorList->size() - 1;
- }
- }
- return nPos;
-}
-
-// -----------------------------------------------------------------------
-
-sal_uInt16 ColorListBox::InsertEntry( const Color& rColor, const XubString& rStr,
- sal_uInt16 nPos )
-{
- nPos = ListBox::InsertEntry( rStr, nPos );
- if ( nPos != LISTBOX_ERROR )
- {
- ImplColorListData* pData = new ImplColorListData( rColor );
- if ( nPos < pColorList->size() )
- {
- ImpColorList::iterator it = pColorList->begin();
- ::std::advance( it, nPos );
- pColorList->insert( it, pData );
- }
- else
- {
- pColorList->push_back( pData );
- nPos = pColorList->size() - 1;
- }
- }
- return nPos;
-}
-
-// -----------------------------------------------------------------------
-
-void ColorListBox::InsertAutomaticEntryColor(const Color &rColor)
-{
- // insert the "Automatic"-entry always on the first position
- InsertEntry( rColor, SvtResId( STR_SVT_AUTOMATIC_COLOR ), 0 );
-}
-
-// -----------------------------------------------------------------------
-
-void ColorListBox::RemoveEntry( sal_uInt16 nPos )
-{
- ListBox::RemoveEntry( nPos );
- if ( nPos < pColorList->size() )
- {
- ImpColorList::iterator it = pColorList->begin();
- ::std::advance( it, nPos );
- delete *it;
- pColorList->erase( it );
- }
-}
-
-// -----------------------------------------------------------------------
-
-void ColorListBox::Clear()
-{
- ImplDestroyColorEntries();
- ListBox::Clear();
-}
-
-// -----------------------------------------------------------------------
-
-void ColorListBox::CopyEntries( const ColorListBox& rBox )
-{
- // Liste leeren
- ImplDestroyColorEntries();
-
- // Daten kopieren
- size_t nCount = rBox.pColorList->size();
- for ( size_t n = 0; n < nCount; n++ )
- {
- ImplColorListData* pData = (*rBox.pColorList)[ n ];
- sal_uInt16 nPos = InsertEntry( rBox.GetEntry( n ), LISTBOX_APPEND );
- if ( nPos != LISTBOX_ERROR )
- {
- if ( nPos < pColorList->size() )
- {
- ImpColorList::iterator it = pColorList->begin();
- ::std::advance( it, nPos );
- pColorList->insert( it, new ImplColorListData( *pData ) );
- }
- else
- {
- pColorList->push_back( new ImplColorListData( *pData ) );
- }
- }
- }
-}
-
-// -----------------------------------------------------------------------
-
-sal_uInt16 ColorListBox::GetEntryPos( const Color& rColor ) const
-{
- for( sal_uInt16 n = (sal_uInt16) pColorList->size(); n; )
- {
- ImplColorListData* pData = (*pColorList)[ --n ];
- if ( pData->bColor && ( pData->aColor == rColor ) )
- return n;
- }
- return LISTBOX_ENTRY_NOTFOUND;
-}
-
-// -----------------------------------------------------------------------
-
-Color ColorListBox::GetEntryColor( sal_uInt16 nPos ) const
-{
- Color aColor;
- ImplColorListData* pData = ( nPos < pColorList->size() ) ? (*pColorList)[ nPos ] : NULL;
- if ( pData && pData->bColor )
- aColor = pData->aColor;
- return aColor;
-}
-
-// -----------------------------------------------------------------------
-
-void ColorListBox::UserDraw( const UserDrawEvent& rUDEvt )
-{
- size_t nPos = rUDEvt.GetItemId();
- ImplColorListData* pData = ( nPos < pColorList->size() ) ? (*pColorList)[ nPos ] : NULL;
- if ( pData )
- {
- if ( pData->bColor )
- {
- Point aPos( rUDEvt.GetRect().TopLeft() );
- aPos.X() += 2;
- aPos.Y() += ( rUDEvt.GetRect().GetHeight() - aImageSize.Height() ) / 2;
- rUDEvt.GetDevice()->Push();
- rUDEvt.GetDevice()->SetFillColor( pData->aColor );
- rUDEvt.GetDevice()->SetLineColor( rUDEvt.GetDevice()->GetTextColor() );
- rUDEvt.GetDevice()->DrawRect( Rectangle( aPos, aImageSize ) );
- rUDEvt.GetDevice()->Pop();
- ListBox::DrawEntry( rUDEvt, sal_False, sal_True, sal_False );
- }
- else
- ListBox::DrawEntry( rUDEvt, sal_False, sal_True, sal_True );
- }
- else
- ListBox::DrawEntry( rUDEvt, sal_True, sal_True, sal_False );
-}
-
-// =======================================================================
-// LineListBox
-// =======================================================================
-
-BorderWidthImpl::BorderWidthImpl( sal_uInt16 nFlags, double nRate1, double nRate2, double nRateGap ):
- m_nFlags( nFlags ),
- m_nRate1( nRate1 ),
- m_nRate2( nRate2 ),
- m_nRateGap( nRateGap )
-{
-}
-
-BorderWidthImpl& BorderWidthImpl::operator= ( const BorderWidthImpl& r )
-{
- m_nFlags = r.m_nFlags;
- m_nRate1 = r.m_nRate1;
- m_nRate2 = r.m_nRate2;
- m_nRateGap = r.m_nRateGap;
- return *this;
-}
-
-bool BorderWidthImpl::operator== ( const BorderWidthImpl& r ) const
-{
- return ( m_nFlags == r.m_nFlags ) &&
- ( m_nRate1 == r.m_nRate1 ) &&
- ( m_nRate2 == r.m_nRate2 ) &&
- ( m_nRateGap == r.m_nRateGap );
-}
-
-long BorderWidthImpl::GetLine1( long nWidth ) const
-{
- long result = static_cast<long>(m_nRate1);
- if ( ( m_nFlags & CHANGE_LINE1 ) > 0 )
- result = static_cast<long>(m_nRate1 * nWidth);
- return result;
-}
-
-long BorderWidthImpl::GetLine2( long nWidth ) const
-{
- long result = static_cast<long>(m_nRate2);
- if ( ( m_nFlags & CHANGE_LINE2 ) > 0 )
- result = static_cast<long>(m_nRate2 * nWidth);
- return result;
-}
-
-long BorderWidthImpl::GetGap( long nWidth ) const
-{
- long result = static_cast<long>(m_nRateGap);
- if ( ( m_nFlags & CHANGE_DIST ) > 0 )
- result = static_cast<long>(m_nRateGap * nWidth);
-
- // Avoid having too small distances (less than 1pt)
- if ( result < 20 && m_nRate1 > 0 && m_nRate2 > 0 )
- result = 20;
-
- return result;
-}
-
-double lcl_getGuessedWidth( long nTested, double nRate, bool nChanging )
-{
- double nWidth = -1.0;
- if ( nChanging )
- nWidth = double( nTested ) / nRate;
- else
- {
- if ( double( nTested ) == nRate )
- nWidth = nRate;
- }
-
- return nWidth;
-}
-
-long BorderWidthImpl::GuessWidth( long nLine1, long nLine2, long nGap )
-{
- std::vector< double > aToCompare;
- bool bInvalid = false;
-
- bool bLine1Change = ( m_nFlags & CHANGE_LINE1 ) > 0;
- double nWidth1 = lcl_getGuessedWidth( nLine1, m_nRate1, bLine1Change );
- if ( bLine1Change )
- aToCompare.push_back( nWidth1 );
- else if ( !bLine1Change && nWidth1 < 0 )
- bInvalid = true;
-
- bool bLine2Change = ( m_nFlags & CHANGE_LINE2 ) > 0;
- double nWidth2 = lcl_getGuessedWidth( nLine2, m_nRate2, bLine2Change );
- if ( bLine2Change )
- aToCompare.push_back( nWidth2 );
- else if ( !bLine2Change && nWidth2 < 0 )
- bInvalid = true;
-
- bool bGapChange = ( m_nFlags & CHANGE_DIST ) > 0;
- double nWidthGap = lcl_getGuessedWidth( nGap, m_nRateGap, bGapChange );
- if ( bGapChange && nGap > 20 )
- aToCompare.push_back( nWidthGap );
- else if ( !bGapChange && nWidthGap < 0 )
- bInvalid = true;
-
- double nWidth = 0.0;
- if ( !bInvalid && aToCompare.size() > 0 )
- {
- nWidth = *aToCompare.begin();
- std::vector< double >::iterator pIt = aToCompare.begin();
- while ( pIt != aToCompare.end() && !bInvalid )
- {
- bInvalid = ( nWidth != *pIt );
- ++pIt;
- }
- if ( bInvalid )
- nWidth = 0.0;
- }
-
- return long( nWidth );
-}
-
-/** Utility class storing the border line width, style and colors. The widths
- are defined in Twips.
- */
-class ImpLineListData
-{
-private:
- BorderWidthImpl m_aWidthImpl;
-
- Color ( *m_pColor1Fn )( Color );
- Color ( *m_pColor2Fn )( Color );
- Color ( *m_pColorDistFn )( Color, Color );
-
- long m_nMinWidth;
- sal_uInt16 m_nStyle;
-
-public:
- ImpLineListData( BorderWidthImpl aWidthImpl, sal_uInt16 nStyle,
- long nMinWidth=0, Color ( *pColor1Fn ) ( Color ) = &sameColor,
- Color ( *pColor2Fn ) ( Color ) = &sameColor, Color ( *pColorDistFn ) ( Color, Color ) = &sameDistColor );
-
- /** Returns the computed width of the line 1 in twips. */
- long GetLine1ForWidth( long nWidth ) { return m_aWidthImpl.GetLine1( nWidth ); }
-
- /** Returns the computed width of the line 2 in twips. */
- long GetLine2ForWidth( long nWidth ) { return m_aWidthImpl.GetLine2( nWidth ); }
-
- /** Returns the computed width of the gap in twips. */
- long GetDistForWidth( long nWidth ) { return m_aWidthImpl.GetGap( nWidth ); }
-
- Color GetColorLine1( const Color& aMain );
- Color GetColorLine2( const Color& aMain );
- Color GetColorDist( const Color& aMain, const Color& rDefault );
-
- /** Returns the minimum width in twips */
- long GetMinWidth( );
- sal_uInt16 GetStyle( );
-};
-
-ImpLineListData::ImpLineListData( BorderWidthImpl aWidthImpl,
- sal_uInt16 nStyle, long nMinWidth, Color ( *pColor1Fn )( Color ),
- Color ( *pColor2Fn )( Color ), Color ( *pColorDistFn )( Color, Color ) ) :
- m_aWidthImpl( aWidthImpl ),
- m_pColor1Fn( pColor1Fn ),
- m_pColor2Fn( pColor2Fn ),
- m_pColorDistFn( pColorDistFn ),
- m_nMinWidth( nMinWidth ),
- m_nStyle( nStyle )
-{
-}
-
-long ImpLineListData::GetMinWidth( )
-{
- return m_nMinWidth;
-}
-
-Color ImpLineListData::GetColorLine1( const Color& rMain )
-{
- return ( *m_pColor1Fn )( rMain );
-}
-
-Color ImpLineListData::GetColorLine2( const Color& rMain )
-{
- return ( *m_pColor2Fn )( rMain );
-}
-
-Color ImpLineListData::GetColorDist( const Color& rMain, const Color& rDefault )
-{
- return ( *m_pColorDistFn )( rMain, rDefault );
-}
-
-sal_uInt16 LineListBox::GetSelectEntryStyle( sal_uInt16 nSelIndex ) const
-{
- sal_uInt16 nStyle = STYLE_SOLID;
- sal_uInt16 nPos = GetSelectEntryPos( nSelIndex );
- if ( nPos != LISTBOX_ENTRY_NOTFOUND )
- {
- if ( m_sNone.Len( ) > 0 )
- nPos--;
- nStyle = GetEntryStyle( nPos );
- }
-
- return nStyle;
-}
-
-sal_uInt16 ImpLineListData::GetStyle( )
-{
- return m_nStyle;
-}
-
-// -----------------------------------------------------------------------
-
-void lclDrawPolygon( OutputDevice& rDev, const basegfx::B2DPolygon& rPolygon, long nWidth, sal_uInt16 nDashing )
-{
- sal_uInt16 nOldAA = rDev.GetAntialiasing();
- rDev.SetAntialiasing( nOldAA & !ANTIALIASING_ENABLE_B2DDRAW );
-
- basegfx::B2DPolyPolygon aPolygons = svtools::ApplyLineDashing( rPolygon, nDashing, rDev.GetMapMode().GetMapUnit() );
- for ( sal_uInt32 i = 0; i < aPolygons.count( ); i++ )
- {
- basegfx::B2DPolygon aDash = aPolygons.getB2DPolygon( i );
- basegfx::B2DPoint aStart = aDash.getB2DPoint( 0 );
- basegfx::B2DPoint aEnd = aDash.getB2DPoint( aDash.count() - 1 );
-
- basegfx::B2DVector aVector( aEnd - aStart );
- aVector.normalize( );
- const basegfx::B2DVector aPerpendicular(basegfx::getPerpendicular(aVector));
-
- // Handle problems of width 1px in Pixel mode: 0.5px gives a 1px line
- long nPix = rDev.PixelToLogic( Size( 0, 1 ) ).Height();
- if ( rDev.GetMapMode().GetMapUnit() == MAP_PIXEL && nWidth == nPix )
- nWidth = 0;
-
- const basegfx::B2DVector aWidthOffset( double( nWidth ) / 2 * aPerpendicular);
- basegfx::B2DPolygon aDashPolygon;
- aDashPolygon.append( aStart + aWidthOffset );
- aDashPolygon.append( aEnd + aWidthOffset );
- aDashPolygon.append( aEnd - aWidthOffset );
- aDashPolygon.append( aStart - aWidthOffset );
- aDashPolygon.setClosed( true );
-
- rDev.DrawPolygon( aDashPolygon );
- }
-
- rDev.SetAntialiasing( nOldAA );
-}
-
-namespace svtools
-{
- std::vector < double > GetDashing( sal_uInt16 nDashing, MapUnit eUnit )
- {
- ::std::vector < double >aPattern;
- switch ( nDashing )
- {
- case STYLE_DOTTED:
- if ( eUnit == MAP_TWIP )
- {
- aPattern.push_back( 30.0 );
- aPattern.push_back( 110.0 );
- }
- else if ( eUnit == MAP_100TH_MM )
- {
- aPattern.push_back( 50 );
- aPattern.push_back( 200 );
- }
- else if ( eUnit == MAP_PIXEL )
- {
- aPattern.push_back( 1.0 );
- aPattern.push_back( 3.0 );
- }
- break;
- case STYLE_DASHED:
- if ( eUnit == MAP_TWIP )
- {
- aPattern.push_back( 110 );
- aPattern.push_back( 110 );
- }
- else if ( eUnit == MAP_100TH_MM )
- {
- aPattern.push_back( 200 );
- aPattern.push_back( 200 );
- }
- else if ( eUnit == MAP_PIXEL )
- {
- aPattern.push_back( 10 );
- aPattern.push_back( 20 );
- }
- break;
- default:
- break;
- }
-
- return aPattern;
- }
-
- basegfx::B2DPolyPolygon ApplyLineDashing( const basegfx::B2DPolygon& rPolygon, sal_uInt16 nDashing, MapUnit eUnit )
- {
- std::vector< double > aPattern = GetDashing( nDashing, eUnit );
- basegfx::B2DPolyPolygon aPolygons;
- if ( ! aPattern.empty() )
- basegfx::tools::applyLineDashing( rPolygon, aPattern, &aPolygons );
- else
- aPolygons.append( rPolygon );
-
- return aPolygons;
- }
-
- void DrawLine( OutputDevice& rDev, const Point& rP1, const Point& rP2,
- sal_uInt32 nWidth, sal_uInt16 nDashing )
- {
- DrawLine( rDev, basegfx::B2DPoint( rP1.X(), rP1.Y() ),
- basegfx::B2DPoint( rP2.X(), rP2.Y( ) ), nWidth, nDashing );
- }
-
- void DrawLine( OutputDevice& rDev, const basegfx::B2DPoint& rP1, const basegfx::B2DPoint& rP2,
- sal_uInt32 nWidth, sal_uInt16 nDashing )
- {
- basegfx::B2DPolygon aPolygon;
- aPolygon.append( rP1 );
- aPolygon.append( rP2 );
- lclDrawPolygon( rDev, aPolygon, nWidth, nDashing );
- }
-}
-
-void LineListBox::ImpGetLine( long nLine1, long nLine2, long nDistance,
- Color aColor1, Color aColor2, Color aColorDist,
- sal_uInt16 nStyle, Bitmap& rBmp )
-{
- Size aSize = GetOutputSizePixel();
- aSize.Width() -= 20;
- aSize.Width() -= aTxtSize.Width();
- aSize.Height() = aTxtSize.Height();
-
- // SourceUnit nach Twips
- if ( eSourceUnit == FUNIT_POINT )
- {
- nLine1 /= 5;
- nLine2 /= 5;
- nDistance /= 5;
- }
-
- // Linien malen
- aSize = aVirDev.PixelToLogic( aSize );
- long nPix = aVirDev.PixelToLogic( Size( 0, 1 ) ).Height();
- sal_uInt32 n1 = nLine1;
- sal_uInt32 n2 = nLine2;
- long nDist = nDistance;
- n1 += nPix-1;
- n1 -= n1%nPix;
- if ( n2 )
- {
- nDist += nPix-1;
- nDist -= nDist%nPix;
- n2 += nPix-1;
- n2 -= n2%nPix;
- }
- long nVirHeight = n1+nDist+n2;
- if ( nVirHeight > aSize.Height() )
- aSize.Height() = nVirHeight;
- // negative Breiten muss und darf man nicht painten
- if ( aSize.Width() > 0 )
- {
- Size aVirSize = aVirDev.LogicToPixel( aSize );
- if ( aVirDev.GetOutputSizePixel() != aVirSize )
- aVirDev.SetOutputSizePixel( aVirSize );
- aVirDev.SetFillColor( aColorDist );
- aVirDev.DrawRect( Rectangle( Point(), aSize ) );
-
- aVirDev.SetFillColor( aColor1 );
-
- double y1 = double( n1 ) / 2;
- svtools::DrawLine( aVirDev, basegfx::B2DPoint( 0, y1 ), basegfx::B2DPoint( aSize.Width( ), y1 ), n1, nStyle );
-
- if ( n2 )
- {
- double y2 = n1 + nDist + double( n2 ) / 2;
- aVirDev.SetFillColor( aColor2 );
- svtools::DrawLine( aVirDev, basegfx::B2DPoint( 0, y2 ), basegfx::B2DPoint( aSize.Width(), y2 ), n2, STYLE_SOLID );
- }
- rBmp = aVirDev.GetBitmap( Point(), Size( aSize.Width(), n1+nDist+n2 ) );
- }
-}
-
-// -----------------------------------------------------------------------
-
-void LineListBox::ImplInit()
-{
- aTxtSize.Width() = GetTextWidth( XubString( RTL_CONSTASCII_USTRINGPARAM( " " ) ) );
- aTxtSize.Height() = GetTextHeight();
- pLineList = new ImpLineList();
- eUnit = FUNIT_POINT;
- eSourceUnit = FUNIT_POINT;
-
- aVirDev.SetLineColor();
- aVirDev.SetMapMode( MapMode( MAP_TWIP ) );
-
- UpdatePaintLineColor();
-}
-
-// -----------------------------------------------------------------------
-
-LineListBox::LineListBox( Window* pParent, WinBits nWinStyle ) :
- ListBox( pParent, nWinStyle ),
- m_nWidth( 5 ),
- m_sNone( ),
- aColor( COL_BLACK ),
- maPaintCol( COL_BLACK )
-{
- ImplInit();
-}
-
-// -----------------------------------------------------------------------
-
-LineListBox::LineListBox( Window* pParent, const ResId& rResId ) :
- ListBox( pParent, rResId ),
- m_nWidth( 5 ),
- m_sNone( ),
- aColor( COL_BLACK ),
- maPaintCol( COL_BLACK )
-{
- ImplInit();
-}
-
-// -----------------------------------------------------------------------
-
-LineListBox::~LineListBox()
-{
- for ( size_t i = 0, n = pLineList->size(); i < n; ++i ) {
- if ( (*pLineList)[ i ] ) {
- delete (*pLineList)[ i ];
- }
- }
- pLineList->clear();
- delete pLineList;
-}
-
-sal_uInt16 LineListBox::GetStylePos( sal_uInt16 nListPos, long nWidth )
-{
- sal_uInt16 nPos = LISTBOX_ENTRY_NOTFOUND;
- if ( m_sNone.Len( ) > 0 )
- nListPos--;
-
- sal_uInt16 i = 0;
- sal_uInt16 n = 0;
- sal_uInt16 nCount = pLineList->size();
- while ( nPos == LISTBOX_ENTRY_NOTFOUND && i < nCount )
- {
- ImpLineListData* pData = (*pLineList)[ i ];
- if ( pData && pData->GetMinWidth() <= nWidth )
- {
- if ( nListPos == n )
- nPos = i;
- n++;
- }
- i++;
- }
-
- return nPos;
-}
-
-
-void LineListBox::SelectEntry( sal_uInt16 nStyle, sal_Bool bSelect )
-{
- sal_uInt16 nPos = GetEntryPos( nStyle );
- if ( nPos != LISTBOX_ENTRY_NOTFOUND )
- ListBox::SelectEntryPos( nPos, bSelect );
-}
-
-// -----------------------------------------------------------------------
-
-sal_uInt16 LineListBox::InsertEntry( const XubString& rStr, sal_uInt16 nPos )
-{
- nPos = ListBox::InsertEntry( rStr, nPos );
- if ( nPos != LISTBOX_ERROR ) {
- if ( nPos < pLineList->size() ) {
- ImpLineList::iterator it = pLineList->begin();
- ::std::advance( it, nPos );
- pLineList->insert( it, NULL );
- } else {
- pLineList->push_back( NULL );
- }
- }
- return nPos;
-}
-
-// -----------------------------------------------------------------------
-
-void LineListBox::InsertEntry(
- BorderWidthImpl aWidthImpl,
- sal_uInt16 nStyle, long nMinWidth,
- Color ( *pColor1Fn )( Color ), Color ( *pColor2Fn )( Color ),
- Color ( *pColorDistFn )( Color, Color ) )
-{
- ImpLineListData* pData = new ImpLineListData(
- aWidthImpl, nStyle, nMinWidth,
- pColor1Fn, pColor2Fn, pColorDistFn );
- pLineList->push_back( pData );
-}
-
-// -----------------------------------------------------------------------
-
-void LineListBox::RemoveEntry( sal_uInt16 nPos )
-{
- ListBox::RemoveEntry( nPos );
-
- if ( nPos < pLineList->size() ) {
- ImpLineList::iterator it = pLineList->begin();
- ::std::advance( it, nPos );
- if ( *it ) delete *it;
- pLineList->erase( it );
- }
-}
-
-// -----------------------------------------------------------------------
-
-void LineListBox::Clear()
-{
- for ( size_t i = 0, n = pLineList->size(); i < n; ++i ) {
- if ( (*pLineList)[ i ] ) {
- delete (*pLineList)[ i ];
- }
- }
- pLineList->clear();
-
- ListBox::Clear();
-}
-
-// -----------------------------------------------------------------------
-
-sal_uInt16 LineListBox::GetEntryPos( sal_uInt16 nStyle ) const
-{
- for ( size_t i = 0, n = pLineList->size(); i < n; ++i ) {
- ImpLineListData* pData = (*pLineList)[ i ];
- if ( pData )
- {
- if ( GetEntryStyle( i ) == nStyle )
- {
- size_t nPos = i;
- if ( m_sNone.Len() > 0 )
- nPos ++;
- return (sal_uInt16)nPos;
- }
- }
- }
- return LISTBOX_ENTRY_NOTFOUND;
-}
-
-// -----------------------------------------------------------------------
-
-long LineListBox::GetEntryLine1( sal_uInt16 nPos ) const
-{
- ImpLineListData* pData = (nPos < pLineList->size()) ? (*pLineList)[ nPos ] : NULL;
- return ( pData ) ? pData->GetLine1ForWidth( m_nWidth ) : 0;
-}
-
-// -----------------------------------------------------------------------
-
-long LineListBox::GetEntryLine2( sal_uInt16 nPos ) const
-{
- ImpLineListData* pData = (nPos < pLineList->size()) ? (*pLineList)[ nPos ] : NULL;
- return ( pData ) ? pData->GetLine2ForWidth( m_nWidth ) : 0;
-}
-
-// -----------------------------------------------------------------------
-
-long LineListBox::GetEntryDistance( sal_uInt16 nPos ) const
-{
- ImpLineListData* pData = (nPos < pLineList->size()) ? (*pLineList)[ nPos ] : NULL;
- return ( pData ) ? pData->GetDistForWidth( m_nWidth ) : 0;
-}
-
-// -----------------------------------------------------------------------
-
-sal_uInt16 LineListBox::GetEntryStyle( sal_uInt16 nPos ) const
-{
- ImpLineListData* pData = (nPos < pLineList->size()) ? (*pLineList)[ nPos ] : NULL;
- return ( pData ) ? pData->GetStyle() : STYLE_SOLID;
-}
-
-// -----------------------------------------------------------------------
-
-sal_Bool LineListBox::UpdatePaintLineColor( void )
-{
- sal_Bool bRet = sal_True;
- const StyleSettings& rSettings = GetSettings().GetStyleSettings();
- Color aNewCol( rSettings.GetWindowColor().IsDark()? rSettings.GetLabelTextColor() : aColor );
-
- bRet = aNewCol != maPaintCol;
-
- if( bRet )
- maPaintCol = aNewCol;
-
- return bRet;
-}
-
-void LineListBox::UpdateEntries( long nOldWidth )
-{
- SetUpdateMode( sal_False );
-
- UpdatePaintLineColor( );
-
- sal_uInt16 nSelEntry = GetSelectEntryPos();
- sal_uInt16 nTypePos = GetStylePos( nSelEntry, nOldWidth );
-
- // Remove the old entries
- while ( GetEntryCount( ) > 0 )
- ListBox::RemoveEntry( 0 );
-
- // Add the new entries based on the defined width
- if ( m_sNone.Len( ) > 0 )
- ListBox::InsertEntry( m_sNone, LISTBOX_APPEND );
-
- sal_uInt16 n = 0;
- sal_uInt16 nCount = pLineList->size( );
- while ( n < nCount )
- {
- ImpLineListData* pData = (*pLineList)[ n ];
- if ( pData && pData->GetMinWidth() <= m_nWidth )
- {
- Bitmap aBmp;
- ImpGetLine( pData->GetLine1ForWidth( m_nWidth ),
- pData->GetLine2ForWidth( m_nWidth ),
- pData->GetDistForWidth( m_nWidth ),
- GetColorLine1( GetEntryCount( ) ),
- GetColorLine2( GetEntryCount( ) ),
- GetColorDist( GetEntryCount( ) ),
- pData->GetStyle(), aBmp );
- ListBox::InsertEntry( XubString( RTL_CONSTASCII_USTRINGPARAM( " " ) ), aBmp, LISTBOX_APPEND );
- if ( n == nTypePos )
- SelectEntryPos( GetEntryCount() - 1 );
- }
- else if ( n == nTypePos )
- SetNoSelection();
- n++;
- }
-
- SetUpdateMode( sal_True );
- Invalidate();
-}
-
-// -----------------------------------------------------------------------
-
-Color LineListBox::GetColorLine1( sal_uInt16 nPos )
-{
- Color rResult = GetPaintColor( );
-
- sal_uInt16 nStyle = GetStylePos( nPos, m_nWidth );
- ImpLineListData* pData = (*pLineList)[ nStyle ];
- if ( pData )
- rResult = pData->GetColorLine1( GetColor( ) );
-
- return rResult;
-}
-
-Color LineListBox::GetColorLine2( sal_uInt16 nPos )
-{
- Color rResult = GetPaintColor( );
-
- sal_uInt16 nStyle = GetStylePos( nPos, m_nWidth );
- ImpLineListData* pData = (*pLineList)[ nStyle ];
- if ( pData )
- rResult = pData->GetColorLine2( GetColor( ) );
-
- return rResult;
-}
-
-Color LineListBox::GetColorDist( sal_uInt16 nPos )
-{
- Color rResult = GetSettings().GetStyleSettings().GetFieldColor();
-
- sal_uInt16 nStyle = GetStylePos( nPos, m_nWidth );
- ImpLineListData* pData = (*pLineList)[ nStyle ];
- if ( pData )
- rResult = pData->GetColorDist( GetColor( ), rResult );
-
- return rResult;
-}
-
-// -----------------------------------------------------------------------
-
-void LineListBox::DataChanged( const DataChangedEvent& rDCEvt )
-{
- ListBox::DataChanged( rDCEvt );
-
- if( ( rDCEvt.GetType() == DATACHANGED_SETTINGS ) && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
- UpdateEntries( m_nWidth );
-}
-
-
-// ===================================================================
-// FontNameBox
-// ===================================================================
-
-struct ImplFontNameListData
-{
- FontInfo maInfo;
- sal_uInt16 mnType;
-
- ImplFontNameListData( const FontInfo& rInfo,
- sal_uInt16 nType ) :
- maInfo( rInfo ),
- mnType( nType )
- {}
-};
-
-// -------------------------------------------------------------------
-
-FontNameBox::FontNameBox( Window* pParent, WinBits nWinStyle ) :
- ComboBox( pParent, nWinStyle )
-{
- InitBitmaps();
- mpFontList = NULL;
- mbWYSIWYG = sal_False;
- mbSymbols = sal_False;
- InitFontMRUEntriesFile();
-}
-
-// -------------------------------------------------------------------
-
-FontNameBox::FontNameBox( Window* pParent, const ResId& rResId ) :
- ComboBox( pParent, rResId )
-{
- InitBitmaps();
- mpFontList = NULL;
- mbWYSIWYG = sal_False;
- mbSymbols = sal_False;
- InitFontMRUEntriesFile();
-}
-
-// -------------------------------------------------------------------
-
-FontNameBox::~FontNameBox()
-{
- SaveMRUEntries (maFontMRUEntriesFile);
- ImplDestroyFontList();
-}
-
-// -------------------------------------------------------------------
-
-void FontNameBox::DataChanged( const DataChangedEvent& rDCEvt )
-{
- ComboBox::DataChanged( rDCEvt );
-
- if( rDCEvt.GetType() == DATACHANGED_SETTINGS && ( rDCEvt.GetFlags() & SETTINGS_STYLE ) )
- InitBitmaps();
-}
-
-// -------------------------------------------------------------------
-
-void FontNameBox::SaveMRUEntries( const String& aFontMRUEntriesFile, xub_Unicode cSep ) const
-{
- ByteString aEntries = ByteString( GetMRUEntries( cSep ), RTL_TEXTENCODING_UTF8 );
-
- if( ! aEntries.Len() || ! aFontMRUEntriesFile.Len() )
- return;
-
- SvFileStream aStream;
- aStream.Open( aFontMRUEntriesFile, STREAM_WRITE | STREAM_TRUNC );
- if( ! (aStream.IsOpen() && aStream.IsWritable()) )
- {
-#if OSL_DEBUG_LEVEL > 1
- fprintf( stderr, "FontNameBox::SaveMRUEntries: opening mru entries file %s failed\n", ByteString(aFontMRUEntriesFile , RTL_TEXTENCODING_UTF8 ).GetBuffer() );
-#endif
- return;
- }
-
- aStream.SetLineDelimiter( LINEEND_LF );
- aStream.WriteLine( aEntries );
- aStream.WriteLine( ByteString() );
-}
-
-// -------------------------------------------------------------------
-
-void FontNameBox::LoadMRUEntries( const String& aFontMRUEntriesFile, xub_Unicode cSep )
-{
- if( ! aFontMRUEntriesFile.Len() )
- return;
-
- SvFileStream aStream( aFontMRUEntriesFile, STREAM_READ );
- if( ! aStream.IsOpen() )
- {
-#if OSL_DEBUG_LEVEL > 1
- fprintf( stderr, "FontNameBox::LoadMRUEntries: opening mru entries file %s failed\n", ByteString( aFontMRUEntriesFile, RTL_TEXTENCODING_UTF8 ).GetBuffer() );
-#endif
- return;
- }
-
- ByteString aLine;
- aStream.ReadLine( aLine );
- XubString aEntries = XubString( aLine, RTL_TEXTENCODING_UTF8 );
- SetMRUEntries( aEntries, cSep );
-}
-
-// ------------------------------------------------------------------
-
-void FontNameBox::InitFontMRUEntriesFile()
-{
- rtl::OUString sUserConfigDir(RTL_CONSTASCII_USTRINGPARAM("${$BRAND_BASE_DIR/program/bootstrap.ini:UserInstallation}"));
- rtl::Bootstrap::expandMacros(sUserConfigDir);
-
- maFontMRUEntriesFile = sUserConfigDir;
- if( maFontMRUEntriesFile.Len() )
- {
- maFontMRUEntriesFile.AppendAscii( FONTNAMEBOXMRUENTRIESFILE );
- }
-}
-
-// -------------------------------------------------------------------
-
-void FontNameBox::InitBitmaps( void )
-{
- maImagePrinterFont = Image( SvtResId( RID_IMG_PRINTERFONT ) );
- maImageBitmapFont = Image( SvtResId( RID_IMG_BITMAPFONT ) );
- maImageScalableFont = Image( SvtResId( RID_IMG_SCALABLEFONT ) );
-}
-
-// -------------------------------------------------------------------
-
-void FontNameBox::ImplDestroyFontList()
-{
- if ( mpFontList )
- {
- for ( size_t i = 0, n = mpFontList->size(); i < n; ++i ) {
- delete (*mpFontList)[ i ];
- }
- mpFontList->clear();
- delete mpFontList;
- }
-}
-
-// -------------------------------------------------------------------
-
-void FontNameBox::Fill( const FontList* pList )
-{
- // store old text and clear box
- XubString aOldText = GetText();
- XubString rEntries = GetMRUEntries();
- sal_Bool bLoadFromFile = ! rEntries.Len();
- Clear();
-
- ImplDestroyFontList();
- mpFontList = new ImplFontList;
-
- // insert fonts
- sal_uInt16 nFontCount = pList->GetFontNameCount();
- for ( sal_uInt16 i = 0; i < nFontCount; i++ )
- {
- const FontInfo& rFontInfo = pList->GetFontName( i );
- sal_uLong nIndex = InsertEntry( rFontInfo.GetName() );
- if ( nIndex != LISTBOX_ERROR )
- {
- sal_uInt16 nType = pList->GetFontNameType( i );
- ImplFontNameListData* pData = new ImplFontNameListData( rFontInfo, nType );
- if ( nIndex < mpFontList->size() ) {
- ImplFontList::iterator it = mpFontList->begin();
- ::std::advance( it, nIndex );
- mpFontList->insert( it, pData );
- } else {
- mpFontList->push_back( pData );
- }
- }
- }
-
- if ( bLoadFromFile )
- LoadMRUEntries (maFontMRUEntriesFile);
- else
- SetMRUEntries( rEntries );
-
- ImplCalcUserItemSize();
-
- // restore text
- if ( aOldText.Len() )
- SetText( aOldText );
-}
-
-// -------------------------------------------------------------------
-
-void FontNameBox::EnableWYSIWYG( sal_Bool bEnable )
-{
- if ( bEnable != mbWYSIWYG )
- {
- mbWYSIWYG = bEnable;
- EnableUserDraw( mbWYSIWYG | mbSymbols );
- ImplCalcUserItemSize();
- }
-}
-
-// -------------------------------------------------------------------
-
-void FontNameBox::EnableSymbols( sal_Bool bEnable )
-{
- if ( bEnable != mbSymbols )
- {
- mbSymbols = bEnable;
- EnableUserDraw( mbWYSIWYG | mbSymbols );
- ImplCalcUserItemSize();
- }
-}
-
-// -------------------------------------------------------------------
-
-void FontNameBox::ImplCalcUserItemSize()
-{
- Size aUserItemSz;
- if ( mbWYSIWYG && mpFontList )
- {
- aUserItemSz = Size(MAXPREVIEWWIDTH, GetTextHeight() );
- aUserItemSz.Height() *= 16;
- aUserItemSz.Height() /= 10;
- }
- if ( mbSymbols )
- {
- Size aSz = maImageScalableFont.GetSizePixel();
- aUserItemSz.Width() += aSz.Width() + IMGINNERTEXTSPACE;
-
- if ( mbWYSIWYG && mpFontList )
- aUserItemSz.Width() += IMGOUTERTEXTSPACE;
-
- if ( aSz.Height() > aUserItemSz.Height() )
- aUserItemSz.Height() = aSz.Height();
- }
- SetUserItemSize( aUserItemSz );
-}
-
-#define MKTAG(s) sal_uInt32((((((s[0]<<8)+s[1])<<8)+s[2])<<8)+s[3])
-#define TRADITIONAL_CHINESE 0x01000000
-#define SIMPLIFIED_CHINESE 0x02000000
-#define JAPANESE 0x04000000
-#define KOREAN 0x08000000
-#define HEBREW_MINIMAL 0x10000000
-#define GREEK_MINIMAL 0x20000000
-
-namespace
-{
- rtl::OUString getRepresentativeText(size_t nScript)
- {
- rtl::OUString sSampleText;
- switch (nScript)
- {
- case vcl::UnicodeCoverage::GREEK_AND_COPTIC:
- {
- const sal_Unicode aGrek[] = {
- 0x0391, 0x03BB, 0x03C6, 0x03AC, 0x03B2, 0x03B7, 0x03C4, 0x03BF
- };
- sSampleText = rtl::OUString(aGrek, SAL_N_ELEMENTS(aGrek));
- break;
- }
- case GREEK_MINIMAL:
- {
- const sal_Unicode aGrek[] = {
- 0x0391, 0x0392
- };
- sSampleText = rtl::OUString(aGrek, SAL_N_ELEMENTS(aGrek));
- break;
- }
- case vcl::UnicodeCoverage::HEBREW:
- {
- const sal_Unicode aHebr[] = {
- 0x05D0, 0x05B8, 0x05DC, 0x05B6, 0x05E3, 0x05D1, 0x05B5, 0x05BC,
- 0x05D9, 0x05EA, 0x0020, 0x05E2, 0x05B4, 0x05D1, 0x05B0, 0x05E8,
- 0x05B4, 0x05D9
- };
- sSampleText = rtl::OUString(aHebr, SAL_N_ELEMENTS(aHebr));
- break;
- }
- case HEBREW_MINIMAL:
- {
- const sal_Unicode aHebr[] = {
- 0x05D0, 0x05D1
- };
- sSampleText = rtl::OUString(aHebr, SAL_N_ELEMENTS(aHebr));
- break;
- }
- case vcl::UnicodeCoverage::ARABIC:
- {
- const sal_Unicode aArab[] = {
- 0x0623, 0x0628, 0x062C, 0x062F, 0x064A, 0x0629, 0x0020, 0x0639,
- 0x0631, 0x0628, 0x064A, 0x0629
- };
- sSampleText = rtl::OUString(aArab, SAL_N_ELEMENTS(aArab));
- break;
- }
- case vcl::UnicodeCoverage::DEVANAGARI:
- {
- const sal_Unicode aDeva[] = {
- 0x0926, 0x0947, 0x0935, 0x0928, 0x093E, 0x0917, 0x0930, 0x0940
- };
- sSampleText = rtl::OUString(aDeva, SAL_N_ELEMENTS(aDeva));
- break;
- }
- case vcl::UnicodeCoverage::BENGALI:
- {
- const sal_Unicode aBeng[] = {
- 0x09AC, 0x09BE, 0x0982, 0x09B2, 0x09BE, 0x0020, 0x09B2, 0x09BF,
- 0x09AA, 0x09BF
- };
- sSampleText = rtl::OUString(aBeng, SAL_N_ELEMENTS(aBeng));
- break;
- }
- case vcl::UnicodeCoverage::GURMUKHI:
- {
- const sal_Unicode aGuru[] = {
- 0x0A17, 0x0A41, 0x0A30, 0x0A2E, 0x0A41, 0x0A16, 0x0A40
- };
- sSampleText = rtl::OUString(aGuru, SAL_N_ELEMENTS(aGuru));
- break;
- }
- case vcl::UnicodeCoverage::GUJARATI:
- {
- const sal_Unicode aGujr[] = {
- 0x0A97, 0x0AC1, 0x0A9C, 0x0AB0, 0x0ABE, 0x0AA4, 0x0aC0, 0x0020,
- 0x0AB2, 0x0ABF, 0x0AAA, 0x0ABF
- };
- sSampleText = rtl::OUString(aGujr, SAL_N_ELEMENTS(aGujr));
- break;
- }
- case vcl::UnicodeCoverage::ORIYA:
- {
- const sal_Unicode aOrya[] = {
- 0x0B09, 0x0B24, 0x0B4D, 0x0B15, 0x0B33, 0x0020, 0x0B32, 0x0B3F,
- 0x0B2A, 0x0B3F
- };
- sSampleText = rtl::OUString(aOrya, SAL_N_ELEMENTS(aOrya));
- break;
- }
- case vcl::UnicodeCoverage::TAMIL:
- {
- const sal_Unicode aTaml[] = {
- 0x0B85, 0x0BB0, 0x0BBF, 0x0B9A, 0x0BCD, 0x0B9A, 0x0BC1, 0x0BB5,
- 0x0B9F, 0x0BBF
- };
- sSampleText = rtl::OUString(aTaml, SAL_N_ELEMENTS(aTaml));
- break;
- }
- case vcl::UnicodeCoverage::TELUGU:
- {
- const sal_Unicode aTelu[] = {
- 0x0C24, 0x0C46, 0x0C32, 0x0C41, 0x0C17, 0x0C41
- };
- sSampleText = rtl::OUString(aTelu, SAL_N_ELEMENTS(aTelu));
- break;
- }
- case vcl::UnicodeCoverage::KANNADA:
- {
- const sal_Unicode aKnda[] = {
- 0x0C95, 0x0CA8, 0x0CCD, 0x0CA8, 0x0CA1, 0x0020, 0x0CB2, 0x0CBF,
- 0x0CAA, 0x0CBF
- };
- sSampleText = rtl::OUString(aKnda, SAL_N_ELEMENTS(aKnda));
- break;
- }
- case vcl::UnicodeCoverage::MALAYALAM:
- {
- const sal_Unicode aMlym[] = {
- 0x0D2E, 0x0D32, 0x0D2F, 0x0D3E, 0x0D33, 0x0D32, 0x0D3F, 0x0D2A,
- 0x0D3F
- };
- sSampleText = rtl::OUString(aMlym, SAL_N_ELEMENTS(aMlym));
- break;
- }
- case vcl::UnicodeCoverage::THAI:
- {
- const sal_Unicode aThai[] = {
- 0x0E2D, 0x0E31, 0x0E01, 0x0E29, 0x0E23, 0x0E44, 0x0E17, 0x0E22
- };
- sSampleText = rtl::OUString(aThai, SAL_N_ELEMENTS(aThai));
- break;
- }
- case vcl::UnicodeCoverage::LAO:
- {
- const sal_Unicode aLao[] = {
- 0x0EAD, 0x0EB1, 0x0E81, 0x0EAA, 0x0EAD, 0x0E99, 0x0EA5, 0x0EB2,
- 0x0EA7
- };
- sSampleText = rtl::OUString(aLao, SAL_N_ELEMENTS(aLao));
- break;
- }
- case vcl::UnicodeCoverage::GEORGIAN:
- {
- const sal_Unicode aGeorgian[] = {
- 0x10D3, 0x10D0, 0x10DB, 0x10EC, 0x10D4, 0x10E0, 0x10DA, 0x10DD,
- 0x10D1, 0x10D0
- };
- sSampleText = rtl::OUString(aGeorgian, SAL_N_ELEMENTS(aGeorgian));
- break;
- }
- case vcl::UnicodeCoverage::HANGUL_JAMO:
- case KOREAN:
- {
- const sal_Unicode aHang[] = {
- 0xD55C, 0xAE00
- };
- sSampleText = rtl::OUString(aHang, SAL_N_ELEMENTS(aHang));
- break;
- }
- case vcl::UnicodeCoverage::TIBETAN:
- {
- const sal_Unicode aTibt[] = {
- 0x0F51, 0x0F56, 0x0F74, 0x0F0B, 0x0F45, 0x0F53, 0x0F0B
- };
- sSampleText = rtl::OUString(aTibt, SAL_N_ELEMENTS(aTibt));
- break;
- }
- case vcl::UnicodeCoverage::SYRIAC:
- {
- const sal_Unicode aSyri[] = {
- 0x0723, 0x071B, 0x072A, 0x0722, 0x0713, 0x0720, 0x0710
- };
- sSampleText = rtl::OUString(aSyri, SAL_N_ELEMENTS(aSyri));
- break;
- }
- case vcl::UnicodeCoverage::THAANA:
- {
- const sal_Unicode aThaa[] = {
- 0x078C, 0x07A7, 0x0782, 0x07A6
- };
- sSampleText = rtl::OUString(aThaa, SAL_N_ELEMENTS(aThaa));
- break;
- }
- case vcl::UnicodeCoverage::SINHALA:
- {
- const sal_Unicode aSinh[] = {
- 0x0DC1, 0x0DD4, 0x0DAF, 0x0DCA, 0x0DB0, 0x0020, 0x0DC3, 0x0DD2,
- 0x0D82, 0x0DC4, 0x0DBD
- };
- sSampleText = rtl::OUString(aSinh, SAL_N_ELEMENTS(aSinh));
- break;
- }
- case vcl::UnicodeCoverage::MYANMAR:
- {
- const sal_Unicode aMymr[] = {
- 0x1019, 0x103C, 0x1014, 0x103A, 0x1019, 0x102C, 0x1021, 0x1000,
- 0x1039, 0x1001, 0x101B, 0x102C
- };
- sSampleText = rtl::OUString(aMymr, SAL_N_ELEMENTS(aMymr));
- break;
- }
- case vcl::UnicodeCoverage::ETHIOPIC:
- {
- const sal_Unicode aEthi[] = {
- 0x130D, 0x12D5, 0x12DD
- };
- sSampleText = rtl::OUString(aEthi, SAL_N_ELEMENTS(aEthi));
- break;
- }
- case vcl::UnicodeCoverage::CHEROKEE:
- {
- const sal_Unicode aCher[] = {
- 0x13D7, 0x13AA, 0x13EA, 0x13B6, 0x13D9, 0x13D7
- };
- sSampleText = rtl::OUString(aCher, SAL_N_ELEMENTS(aCher));
- break;
- }
- case vcl::UnicodeCoverage::KHMER:
- {
- const sal_Unicode aKhmr[] = {
- 0x17A2, 0x1780, 0x17D2, 0x1781, 0x179A, 0x1780, 0x17D2, 0x179A,
- 0x1798, 0x1781, 0x17C1, 0x1798, 0x179A, 0x1797, 0x17B6, 0x179F,
- 0x17B6
- };
- sSampleText = rtl::OUString(aKhmr, SAL_N_ELEMENTS(aKhmr));
- break;
- }
- case vcl::UnicodeCoverage::MONGOLIAN:
- {
- const sal_Unicode aMongolian[] = {
- 0x182A, 0x1822, 0x1834, 0x1822, 0x182D, 0x180C
- };
- sSampleText = rtl::OUString(aMongolian, SAL_N_ELEMENTS(aMongolian));
- break;
- }
- case vcl::UnicodeCoverage::TAGALOG:
- {
- const sal_Unicode aTagalog[] = {
- 0x170A, 0x170A, 0x170C, 0x1712
- };
- sSampleText = rtl::OUString(aTagalog, SAL_N_ELEMENTS(aTagalog));
- break;
- }
- case vcl::UnicodeCoverage::NEW_TAI_LUE:
- {
- const sal_Unicode aTalu[] = {
- 0x1991, 0x19BA, 0x199F, 0x19B9, 0x19C9
- };
- sSampleText = rtl::OUString(aTalu, SAL_N_ELEMENTS(aTalu));
- break;
- }
- case TRADITIONAL_CHINESE:
- {
- const sal_Unicode aTraditionalChinese[] = {
- 0x7E41
- };
- sSampleText = rtl::OUString(aTraditionalChinese, SAL_N_ELEMENTS(aTraditionalChinese));
- break;
- }
- case SIMPLIFIED_CHINESE:
- {
- const sal_Unicode aSimplifiedChinese[] = {
- 0x7B80
- };
- sSampleText = rtl::OUString(aSimplifiedChinese, SAL_N_ELEMENTS(aSimplifiedChinese));
- break;
- }
- case TRADITIONAL_CHINESE|SIMPLIFIED_CHINESE:
- {
- const sal_Unicode aSimplifiedAndTraditionalChinese[] = {
- 0x7B80, 0x7E41
- };
- sSampleText = rtl::OUString(aSimplifiedAndTraditionalChinese, SAL_N_ELEMENTS(aSimplifiedAndTraditionalChinese));
- break;
- }
- case JAPANESE:
- {
- const sal_Unicode aJapanese[] = {
- 0x65E5, 0x672C, 0x8A9E
- };
- sSampleText = rtl::OUString(aJapanese, SAL_N_ELEMENTS(aJapanese));
- break;
- }
- default:
- break;
- }
- return sSampleText;
- }
-
-#if OSL_DEBUG_LEVEL > 2
- void lcl_dump_unicode_coverage(const boost::dynamic_bitset<sal_uInt32> &rIn)
- {
- if (rIn[vcl::UnicodeCoverage::BASIC_LATIN])
- fprintf(stderr, "BASIC_LATIN\n");
- if (rIn[vcl::UnicodeCoverage::LATIN_1_SUPPLEMENT])
- fprintf(stderr, "LATIN_1_SUPPLEMENT\n");
- if (rIn[vcl::UnicodeCoverage::LATIN_EXTENDED_A])
- fprintf(stderr, "LATIN_EXTENDED_A\n");
- if (rIn[vcl::UnicodeCoverage::LATIN_EXTENDED_B])
- fprintf(stderr, "LATIN_EXTENDED_B\n");
- if (rIn[vcl::UnicodeCoverage::IPA_EXTENSIONS])
- fprintf(stderr, "IPA_EXTENSIONS\n");
- if (rIn[vcl::UnicodeCoverage::SPACING_MODIFIER_LETTERS])
- fprintf(stderr, "SPACING_MODIFIER_LETTERS\n");
- if (rIn[vcl::UnicodeCoverage::COMBINING_DIACRITICAL_MARKS])
- fprintf(stderr, "COMBINING_DIACRITICAL_MARKS\n");
- if (rIn[vcl::UnicodeCoverage::GREEK_AND_COPTIC])
- fprintf(stderr, "GREEK_AND_COPTIC\n");
- if (rIn[vcl::UnicodeCoverage::COPTIC])
- fprintf(stderr, "COPTIC\n");
- if (rIn[vcl::UnicodeCoverage::CYRILLIC])
- fprintf(stderr, "CYRILLIC\n");
- if (rIn[vcl::UnicodeCoverage::ARMENIAN])
- fprintf(stderr, "ARMENIAN\n");
- if (rIn[vcl::UnicodeCoverage::HEBREW])
- fprintf(stderr, "HEBREW\n");
- if (rIn[vcl::UnicodeCoverage::VAI])
- fprintf(stderr, "VAI\n");
- if (rIn[vcl::UnicodeCoverage::ARABIC])
- fprintf(stderr, "ARABIC\n");
- if (rIn[vcl::UnicodeCoverage::NKO])
- fprintf(stderr, "NKO\n");
- if (rIn[vcl::UnicodeCoverage::DEVANAGARI])
- fprintf(stderr, "DEVANAGARI\n");
- if (rIn[vcl::UnicodeCoverage::BENGALI])
- fprintf(stderr, "BENGALI\n");
- if (rIn[vcl::UnicodeCoverage::GURMUKHI])
- fprintf(stderr, "GURMUKHI\n");
- if (rIn[vcl::UnicodeCoverage::GUJARATI])
- fprintf(stderr, "GUJARATI\n");
- if (rIn[vcl::UnicodeCoverage::ORIYA])
- fprintf(stderr, "ORIYA\n");
- if (rIn[vcl::UnicodeCoverage::TAMIL])
- fprintf(stderr, "TAMIL\n");
- if (rIn[vcl::UnicodeCoverage::TELUGU])
- fprintf(stderr, "TELUGU\n");
- if (rIn[vcl::UnicodeCoverage::KANNADA])
- fprintf(stderr, "KANNADA\n");
- if (rIn[vcl::UnicodeCoverage::MALAYALAM])
- fprintf(stderr, "MALAYALAM\n");
- if (rIn[vcl::UnicodeCoverage::THAI])
- fprintf(stderr, "THAI\n");
- if (rIn[vcl::UnicodeCoverage::LAO])
- fprintf(stderr, "LAO\n");
- if (rIn[vcl::UnicodeCoverage::GEORGIAN])
- fprintf(stderr, "GEORGIAN\n");
- if (rIn[vcl::UnicodeCoverage::BALINESE])
- fprintf(stderr, "BALINESE\n");
- if (rIn[vcl::UnicodeCoverage::HANGUL_JAMO])
- fprintf(stderr, "HANGUL_JAMO\n");
- if (rIn[vcl::UnicodeCoverage::LATIN_EXTENDED_ADDITIONAL])
- fprintf(stderr, "LATIN_EXTENDED_ADDITIONAL\n");
- if (rIn[vcl::UnicodeCoverage::GREEK_EXTENDED])
- fprintf(stderr, "GREEK_EXTENDED\n");
- if (rIn[vcl::UnicodeCoverage::GENERAL_PUNCTUATION])
- fprintf(stderr, "GENERAL_PUNCTUATION\n");
- if (rIn[vcl::UnicodeCoverage::SUPERSCRIPTS_AND_SUBSCRIPTS])
- fprintf(stderr, "SUPERSCRIPTS_AND_SUBSCRIPTS\n");
- if (rIn[vcl::UnicodeCoverage::CURRENCY_SYMBOLS])
- fprintf(stderr, "CURRENCY_SYMBOLS\n");
- if (rIn[vcl::UnicodeCoverage::COMBINING_DIACRITICAL_MARKS_FOR_SYMBOLS])
- fprintf(stderr, "COMBINING_DIACRITICAL_MARKS_FOR_SYMBOLS\n");
- if (rIn[vcl::UnicodeCoverage::LETTERLIKE_SYMBOLS])
- fprintf(stderr, "LETTERLIKE_SYMBOLS\n");
- if (rIn[vcl::UnicodeCoverage::NUMBER_FORMS])
- fprintf(stderr, "NUMBER_FORMS\n");
- if (rIn[vcl::UnicodeCoverage::ARROWS])
- fprintf(stderr, "ARROWS\n");
- if (rIn[vcl::UnicodeCoverage::MATHEMATICAL_OPERATORS])
- fprintf(stderr, "MATHEMATICAL_OPERATORS\n");
- if (rIn[vcl::UnicodeCoverage::MISCELLANEOUS_TECHNICAL])
- fprintf(stderr, "MISCELLANEOUS_TECHNICAL\n");
- if (rIn[vcl::UnicodeCoverage::CONTROL_PICTURES])
- fprintf(stderr, "CONTROL_PICTURES\n");
- if (rIn[vcl::UnicodeCoverage::OPTICAL_CHARACTER_RECOGNITION])
- fprintf(stderr, "OPTICAL_CHARACTER_RECOGNITION\n");
- if (rIn[vcl::UnicodeCoverage::ENCLOSED_ALPHANUMERICS])
- fprintf(stderr, "ENCLOSED_ALPHANUMERICS\n");
- if (rIn[vcl::UnicodeCoverage::BOX_DRAWING])
- fprintf(stderr, "BOX_DRAWING\n");
- if (rIn[vcl::UnicodeCoverage::BLOCK_ELEMENTS])
- fprintf(stderr, "BLOCK_ELEMENTS\n");
- if (rIn[vcl::UnicodeCoverage::GEOMETRIC_SHAPES])
- fprintf(stderr, "GEOMETRIC_SHAPES\n");
- if (rIn[vcl::UnicodeCoverage::MISCELLANEOUS_SYMBOLS])
- fprintf(stderr, "MISCELLANEOUS_SYMBOLS\n");
- if (rIn[vcl::UnicodeCoverage::DINGBATS])
- fprintf(stderr, "DINGBATS\n");
- if (rIn[vcl::UnicodeCoverage::CJK_SYMBOLS_AND_PUNCTUATION])
- fprintf(stderr, "CJK_SYMBOLS_AND_PUNCTUATION\n");
- if (rIn[vcl::UnicodeCoverage::HIRAGANA])
- fprintf(stderr, "HIRAGANA\n");
- if (rIn[vcl::UnicodeCoverage::KATAKANA])
- fprintf(stderr, "KATAKANA\n");
- if (rIn[vcl::UnicodeCoverage::BOPOMOFO])
- fprintf(stderr, "BOPOMOFO\n");
- if (rIn[vcl::UnicodeCoverage::HANGUL_COMPATIBILITY_JAMO])
- fprintf(stderr, "HANGUL_COMPATIBILITY_JAMO\n");
- if (rIn[vcl::UnicodeCoverage::PHAGS_PA])
- fprintf(stderr, "PHAGS_PA\n");
- if (rIn[vcl::UnicodeCoverage::ENCLOSED_CJK_LETTERS_AND_MONTHS])
- fprintf(stderr, "ENCLOSED_CJK_LETTERS_AND_MONTHS\n");
- if (rIn[vcl::UnicodeCoverage::CJK_COMPATIBILITY])
- fprintf(stderr, "CJK_COMPATIBILITY\n");
- if (rIn[vcl::UnicodeCoverage::HANGUL_SYLLABLES])
- fprintf(stderr, "HANGUL_SYLLABLES\n");
- if (rIn[vcl::UnicodeCoverage::NONPLANE_0])
- fprintf(stderr, "NONPLANE_0\n");
- if (rIn[vcl::UnicodeCoverage::PHOENICIAN])
- fprintf(stderr, "PHOENICIAN\n");
- if (rIn[vcl::UnicodeCoverage::CJK_UNIFIED_IDEOGRAPHS])
- fprintf(stderr, "CJK_UNIFIED_IDEOGRAPHS\n");
- if (rIn[vcl::UnicodeCoverage::PRIVATE_USE_AREA_PLANE_0])
- fprintf(stderr, "PRIVATE_USE_AREA_PLANE_0\n");
- if (rIn[vcl::UnicodeCoverage::CJK_STROKES])
- fprintf(stderr, "CJK_STROKES\n");
- if (rIn[vcl::UnicodeCoverage::ALPHABETIC_PRESENTATION_FORMS])
- fprintf(stderr, "ALPHABETIC_PRESENTATION_FORMS\n");
- if (rIn[vcl::UnicodeCoverage::ARABIC_PRESENTATION_FORMS_A])
- fprintf(stderr, "ARABIC_PRESENTATION_FORMS_A\n");
- if (rIn[vcl::UnicodeCoverage::COMBINING_HALF_MARKS])
- fprintf(stderr, "COMBINING_HALF_MARKS\n");
- if (rIn[vcl::UnicodeCoverage::VERTICAL_FORMS])
- fprintf(stderr, "VERTICAL_FORMS\n");
- if (rIn[vcl::UnicodeCoverage::SMALL_FORM_VARIANTS])
- fprintf(stderr, "SMALL_FORM_VARIANTS\n");
- if (rIn[vcl::UnicodeCoverage::ARABIC_PRESENTATION_FORMS_B])
- fprintf(stderr, "ARABIC_PRESENTATION_FORMS_B\n");
- if (rIn[vcl::UnicodeCoverage::HALFWIDTH_AND_FULLWIDTH_FORMS])
- fprintf(stderr, "HALFWIDTH_AND_FULLWIDTH_FORMS\n");
- if (rIn[vcl::UnicodeCoverage::SPECIALS])
- fprintf(stderr, "SPECIALS\n");
- if (rIn[vcl::UnicodeCoverage::TIBETAN])
- fprintf(stderr, "TIBETAN\n");
- if (rIn[vcl::UnicodeCoverage::SYRIAC])
- fprintf(stderr, "SYRIAC\n");
- if (rIn[vcl::UnicodeCoverage::THAANA])
- fprintf(stderr, "THAANA\n");
- if (rIn[vcl::UnicodeCoverage::SINHALA])
- fprintf(stderr, "SINHALA\n");
- if (rIn[vcl::UnicodeCoverage::MYANMAR])
- fprintf(stderr, "MYANMAR\n");
- if (rIn[vcl::UnicodeCoverage::ETHIOPIC])
- fprintf(stderr, "ETHIOPIC\n");
- if (rIn[vcl::UnicodeCoverage::CHEROKEE])
- fprintf(stderr, "CHEROKEE\n");
- if (rIn[vcl::UnicodeCoverage::UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS])
- fprintf(stderr, "UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS\n");
- if (rIn[vcl::UnicodeCoverage::OGHAM])
- fprintf(stderr, "OGHAM\n");
- if (rIn[vcl::UnicodeCoverage::RUNIC])
- fprintf(stderr, "RUNIC\n");
- if (rIn[vcl::UnicodeCoverage::KHMER])
- fprintf(stderr, "KHMER\n");
- if (rIn[vcl::UnicodeCoverage::MONGOLIAN])
- fprintf(stderr, "MONGOLIAN\n");
- if (rIn[vcl::UnicodeCoverage::BRAILLE_PATTERNS])
- fprintf(stderr, "BRAILLE_PATTERNS\n");
- if (rIn[vcl::UnicodeCoverage::YI_SYLLABLES])
- fprintf(stderr, "YI_SYLLABLES\n");
- if (rIn[vcl::UnicodeCoverage::TAGALOG])
- fprintf(stderr, "TAGALOG\n");
- if (rIn[vcl::UnicodeCoverage::OLD_ITALIC])
- fprintf(stderr, "OLD_ITALIC\n");
- if (rIn[vcl::UnicodeCoverage::GOTHIC])
- fprintf(stderr, "GOTHIC\n");
- if (rIn[vcl::UnicodeCoverage::DESERET])
- fprintf(stderr, "DESERET\n");
- if (rIn[vcl::UnicodeCoverage::BYZANTINE_MUSICAL_SYMBOLS])
- fprintf(stderr, "BYZANTINE_MUSICAL_SYMBOLS\n");
- if (rIn[vcl::UnicodeCoverage::MATHEMATICAL_ALPHANUMERIC_SYMBOLS])
- fprintf(stderr, "MATHEMATICAL_ALPHANUMERIC_SYMBOLS\n");
- if (rIn[vcl::UnicodeCoverage::PRIVATE_USE_PLANE_15])
- fprintf(stderr, "PRIVATE_USE_PLANE_15\n");
- if (rIn[vcl::UnicodeCoverage::VARIATION_SELECTORS])
- fprintf(stderr, "VARIATION_SELECTORS\n");
- if (rIn[vcl::UnicodeCoverage::TAGS])
- fprintf(stderr, "TAGS\n");
- if (rIn[vcl::UnicodeCoverage::LIMBU])
- fprintf(stderr, "LIMBU\n");
- if (rIn[vcl::UnicodeCoverage::TAI_LE])
- fprintf(stderr, "TAI_LE\n");
- if (rIn[vcl::UnicodeCoverage::NEW_TAI_LUE])
- fprintf(stderr, "NEW_TAI_LUE\n");
- if (rIn[vcl::UnicodeCoverage::BUGINESE])
- fprintf(stderr, "BUGINESE\n");
- if (rIn[vcl::UnicodeCoverage::GLAGOLITIC])
- fprintf(stderr, "GLAGOLITIC\n");
- if (rIn[vcl::UnicodeCoverage::TIFINAGH])
- fprintf(stderr, "TIFINAGH\n");
- if (rIn[vcl::UnicodeCoverage::YIJING_HEXAGRAM_SYMBOLS])
- fprintf(stderr, "YIJING_HEXAGRAM_SYMBOLS\n");
- if (rIn[vcl::UnicodeCoverage::SYLOTI_NAGRI])
- fprintf(stderr, "SYLOTI_NAGRI\n");
- if (rIn[vcl::UnicodeCoverage::LINEAR_B_SYLLABARY])
- fprintf(stderr, "LINEAR_B_SYLLABARY\n");
- if (rIn[vcl::UnicodeCoverage::ANCIENT_GREEK_NUMBERS])
- fprintf(stderr, "ANCIENT_GREEK_NUMBERS\n");
- if (rIn[vcl::UnicodeCoverage::UGARITIC])
- fprintf(stderr, "UGARITIC\n");
- if (rIn[vcl::UnicodeCoverage::OLD_PERSIAN])
- fprintf(stderr, "OLD_PERSIAN\n");
- if (rIn[vcl::UnicodeCoverage::SHAVIAN])
- fprintf(stderr, "SHAVIAN\n");
- if (rIn[vcl::UnicodeCoverage::OSMANYA])
- fprintf(stderr, "OSMANYA\n");
- if (rIn[vcl::UnicodeCoverage::CYPRIOT_SYLLABARY])
- fprintf(stderr, "CYPRIOT_SYLLABARY\n");
- if (rIn[vcl::UnicodeCoverage::KHAROSHTHI])
- fprintf(stderr, "KHAROSHTHI\n");
- if (rIn[vcl::UnicodeCoverage::TAI_XUAN_JING_SYMBOLS])
- fprintf(stderr, "TAI_XUAN_JING_SYMBOLS\n");
- if (rIn[vcl::UnicodeCoverage::CUNEIFORM])
- fprintf(stderr, "CUNEIFORM\n");
- if (rIn[vcl::UnicodeCoverage::COUNTING_ROD_NUMERALS])
- fprintf(stderr, "COUNTING_ROD_NUMERALS\n");
- if (rIn[vcl::UnicodeCoverage::SUNDANESE])
- fprintf(stderr, "SUNDANESE\n");
- if (rIn[vcl::UnicodeCoverage::LEPCHA])
- fprintf(stderr, "LEPCHA\n");
- if (rIn[vcl::UnicodeCoverage::OL_CHIKI])
- fprintf(stderr, "OL_CHIKI\n");
- if (rIn[vcl::UnicodeCoverage::SAURASHTRA])
- fprintf(stderr, "SAURASHTRA\n");
- if (rIn[vcl::UnicodeCoverage::KAYAH_LI])
- fprintf(stderr, "KAYAH_LI\n");
- if (rIn[vcl::UnicodeCoverage::REJANG])
- fprintf(stderr, "REJANG\n");
- if (rIn[vcl::UnicodeCoverage::CHAM])
- fprintf(stderr, "CHAM\n");
- if (rIn[vcl::UnicodeCoverage::ANCIENT_SYMBOLS])
- fprintf(stderr, "ANCIENT_SYMBOLS\n");
- if (rIn[vcl::UnicodeCoverage::PHAISTOS_DISC])
- fprintf(stderr, "PHAISTOS_DISC\n");
- if (rIn[vcl::UnicodeCoverage::CARIAN])
- fprintf(stderr, "CARIAN\n");
- if (rIn[vcl::UnicodeCoverage::DOMINO_TILES])
- fprintf(stderr, "DOMINO_TILES\n");
- if (rIn[vcl::UnicodeCoverage::RESERVED1])
- fprintf(stderr, "RESERVED1\n");
- if (rIn[vcl::UnicodeCoverage::RESERVED2])
- fprintf(stderr, "RESERVED2\n");
- if (rIn[vcl::UnicodeCoverage::RESERVED3])
- fprintf(stderr, "RESERVED3\n");
- if (rIn[vcl::UnicodeCoverage::RESERVED4])
- fprintf(stderr, "RESERVED4\n");
- if (rIn[vcl::UnicodeCoverage::RESERVED5])
- fprintf(stderr, "RESERVED5\n");
- }
-
- void lcl_dump_codepage_coverage(const boost::dynamic_bitset<sal_uInt32> &rIn)
- {
- if (rIn[vcl::CodePageCoverage::CP1252])
- fprintf(stderr, "CP1252\n");
- if (rIn[vcl::CodePageCoverage::CP1250])
- fprintf(stderr, "CP1250\n");
- if (rIn[vcl::CodePageCoverage::CP1251])
- fprintf(stderr, "CP1251\n");
- if (rIn[vcl::CodePageCoverage::CP1253])
- fprintf(stderr, "CP1253\n");
- if (rIn[vcl::CodePageCoverage::CP1254])
- fprintf(stderr, "CP1254\n");
- if (rIn[vcl::CodePageCoverage::CP1255])
- fprintf(stderr, "CP1255\n");
- if (rIn[vcl::CodePageCoverage::CP1256])
- fprintf(stderr, "CP1256\n");
- if (rIn[vcl::CodePageCoverage::CP1257])
- fprintf(stderr, "CP1257\n");
- if (rIn[vcl::CodePageCoverage::CP1258])
- fprintf(stderr, "CP1258\n");
- if (rIn[vcl::CodePageCoverage::CP874])
- fprintf(stderr, "CP874\n");
- if (rIn[vcl::CodePageCoverage::CP932])
- fprintf(stderr, "CP932\n");
- if (rIn[vcl::CodePageCoverage::CP936])
- fprintf(stderr, "CP936\n");
- if (rIn[vcl::CodePageCoverage::CP949])
- fprintf(stderr, "CP949\n");
- if (rIn[vcl::CodePageCoverage::CP950])
- fprintf(stderr, "CP950\n");
- if (rIn[vcl::CodePageCoverage::CP1361])
- fprintf(stderr, "CP1361\n");
- if (rIn[vcl::CodePageCoverage::CP869])
- fprintf(stderr, "CP869\n");
- if (rIn[vcl::CodePageCoverage::CP866])
- fprintf(stderr, "CP866\n");
- if (rIn[vcl::CodePageCoverage::CP865])
- fprintf(stderr, "CP865\n");
- if (rIn[vcl::CodePageCoverage::CP864])
- fprintf(stderr, "CP864\n");
- if (rIn[vcl::CodePageCoverage::CP863])
- fprintf(stderr, "CP863\n");
- if (rIn[vcl::CodePageCoverage::CP862])
- fprintf(stderr, "CP862\n");
- if (rIn[vcl::CodePageCoverage::CP861])
- fprintf(stderr, "CP861\n");
- if (rIn[vcl::CodePageCoverage::CP860])
- fprintf(stderr, "CP860\n");
- if (rIn[vcl::CodePageCoverage::CP857])
- fprintf(stderr, "CP857\n");
- if (rIn[vcl::CodePageCoverage::CP855])
- fprintf(stderr, "CP855\n");
- if (rIn[vcl::CodePageCoverage::CP852])
- fprintf(stderr, "CP852\n");
- if (rIn[vcl::CodePageCoverage::CP775])
- fprintf(stderr, "CP775\n");
- if (rIn[vcl::CodePageCoverage::CP737])
- fprintf(stderr, "CP737\n");
- if (rIn[vcl::CodePageCoverage::CP780])
- fprintf(stderr, "CP780\n");
- if (rIn[vcl::CodePageCoverage::CP850])
- fprintf(stderr, "CP850\n");
- if (rIn[vcl::CodePageCoverage::CP437])
- fprintf(stderr, "CP437\n");
- }
-#endif
-
- size_t getScript(const vcl::FontCapabilities &rFontCapabilities)
- {
- boost::dynamic_bitset<sal_uInt32> aGenericMask(vcl::UnicodeCoverage::MAX_UC_ENUM);
- aGenericMask.set();
- aGenericMask.set(vcl::UnicodeCoverage::BASIC_LATIN, false);
- aGenericMask.set(vcl::UnicodeCoverage::LATIN_1_SUPPLEMENT, false);
- aGenericMask.set(vcl::UnicodeCoverage::LATIN_EXTENDED_A, false);
- aGenericMask.set(vcl::UnicodeCoverage::LATIN_EXTENDED_B, false);
- aGenericMask.set(vcl::UnicodeCoverage::IPA_EXTENSIONS, false);
- aGenericMask.set(vcl::UnicodeCoverage::SPACING_MODIFIER_LETTERS, false);
- aGenericMask.set(vcl::UnicodeCoverage::COMBINING_DIACRITICAL_MARKS, false);
- aGenericMask.set(vcl::UnicodeCoverage::COMBINING_DIACRITICAL_MARKS_FOR_SYMBOLS, false);
- aGenericMask.set(vcl::UnicodeCoverage::LATIN_EXTENDED_ADDITIONAL, false);
- aGenericMask.set(vcl::UnicodeCoverage::GENERAL_PUNCTUATION, false);
- aGenericMask.set(vcl::UnicodeCoverage::GEOMETRIC_SHAPES, false);
- aGenericMask.set(vcl::UnicodeCoverage::SUPERSCRIPTS_AND_SUBSCRIPTS, false);
- aGenericMask.set(vcl::UnicodeCoverage::CURRENCY_SYMBOLS, false);
- aGenericMask.set(vcl::UnicodeCoverage::LETTERLIKE_SYMBOLS, false);
- aGenericMask.set(vcl::UnicodeCoverage::DINGBATS, false);
- aGenericMask.set(vcl::UnicodeCoverage::PRIVATE_USE_AREA_PLANE_0, false);
- aGenericMask.set(vcl::UnicodeCoverage::ALPHABETIC_PRESENTATION_FORMS, false);
- aGenericMask.set(vcl::UnicodeCoverage::NUMBER_FORMS, false);
- aGenericMask.set(vcl::UnicodeCoverage::ARROWS, false);
- aGenericMask.set(vcl::UnicodeCoverage::MATHEMATICAL_OPERATORS, false);
- aGenericMask.set(vcl::UnicodeCoverage::MATHEMATICAL_ALPHANUMERIC_SYMBOLS, false);
- aGenericMask.set(vcl::UnicodeCoverage::MISCELLANEOUS_TECHNICAL, false);
- aGenericMask.set(vcl::UnicodeCoverage::CONTROL_PICTURES, false);
- aGenericMask.set(vcl::UnicodeCoverage::ENCLOSED_ALPHANUMERICS, false);
- aGenericMask.set(vcl::UnicodeCoverage::BOX_DRAWING, false);
- aGenericMask.set(vcl::UnicodeCoverage::BLOCK_ELEMENTS, false);
- aGenericMask.set(vcl::UnicodeCoverage::MISCELLANEOUS_SYMBOLS, false);
- aGenericMask.set(vcl::UnicodeCoverage::SPECIALS, false);
- aGenericMask.set(vcl::UnicodeCoverage::NONPLANE_0, false);
- aGenericMask.set(vcl::UnicodeCoverage::PRIVATE_USE_PLANE_15, false);
- aGenericMask.set(vcl::UnicodeCoverage::CJK_SYMBOLS_AND_PUNCTUATION, false);
-
- boost::dynamic_bitset<sal_uInt32> aMasked = rFontCapabilities.maUnicodeRange & aGenericMask;
-
- if (aMasked.count() == 1)
- return aMasked.find_first();
-
-
- if (aMasked[vcl::UnicodeCoverage::ARABIC])
- {
- aMasked.set(vcl::UnicodeCoverage::ARABIC_PRESENTATION_FORMS_A, false);
- aMasked.set(vcl::UnicodeCoverage::ARABIC_PRESENTATION_FORMS_B, false);
- aMasked.set(vcl::UnicodeCoverage::NKO, false);
- //Probably strongly tuned for Arabic
- if (aMasked.count() == 1)
- return vcl::UnicodeCoverage::ARABIC;
- if (aMasked.count() == 2 && aMasked[vcl::UnicodeCoverage::SYRIAC])
- return vcl::UnicodeCoverage::SYRIAC;
- }
-
- if (aMasked[vcl::UnicodeCoverage::DEVANAGARI])
- {
- aMasked.set(vcl::UnicodeCoverage::DEVANAGARI, false);
- //Probably strongly tuned for a single Indic script
- if (aMasked.count() == 1)
- return aMasked.find_first();
- }
-
- aMasked.set(vcl::UnicodeCoverage::GREEK_EXTENDED, false);
- aMasked.set(vcl::UnicodeCoverage::GREEK_AND_COPTIC, false);
- if (aMasked.count() == 1)
- return aMasked.find_first();
-
- if (aMasked[vcl::UnicodeCoverage::CYRILLIC])
- {
- //Probably strongly tuned for Georgian
- if (aMasked.count() == 2 && aMasked[vcl::UnicodeCoverage::GEORGIAN])
- return vcl::UnicodeCoverage::GEORGIAN;
- }
-
- boost::dynamic_bitset<sal_uInt32> aCJKMask(vcl::UnicodeCoverage::MAX_UC_ENUM);
- aCJKMask.set();
- aCJKMask.set(vcl::UnicodeCoverage::CJK_SYMBOLS_AND_PUNCTUATION, false);
- aCJKMask.set(vcl::UnicodeCoverage::HIRAGANA, false);
- aCJKMask.set(vcl::UnicodeCoverage::KATAKANA, false);
- aCJKMask.set(vcl::UnicodeCoverage::HANGUL_JAMO, false);
- aCJKMask.set(vcl::UnicodeCoverage::HANGUL_SYLLABLES, false);
- aCJKMask.set(vcl::UnicodeCoverage::HANGUL_COMPATIBILITY_JAMO, false);
- aCJKMask.set(vcl::UnicodeCoverage::ENCLOSED_CJK_LETTERS_AND_MONTHS, false);
- aCJKMask.set(vcl::UnicodeCoverage::CJK_COMPATIBILITY, false);
- aCJKMask.set(vcl::UnicodeCoverage::CJK_UNIFIED_IDEOGRAPHS, false);
- aCJKMask.set(vcl::UnicodeCoverage::CJK_STROKES, false);
- aCJKMask.set(vcl::UnicodeCoverage::HALFWIDTH_AND_FULLWIDTH_FORMS, false);
- aCJKMask.set(vcl::UnicodeCoverage::VERTICAL_FORMS, false);
- aCJKMask.set(vcl::UnicodeCoverage::BOPOMOFO, false);
- aCJKMask.set(vcl::UnicodeCoverage::SMALL_FORM_VARIANTS, false);
- aCJKMask.set(vcl::UnicodeCoverage::PHAGS_PA, false);
- aCJKMask.set(vcl::UnicodeCoverage::CYRILLIC, false);
- aCJKMask.set(vcl::UnicodeCoverage::THAI, false);
- aCJKMask.set(vcl::UnicodeCoverage::DESERET, false);
-
- aMasked = aMasked & aCJKMask;
-
- //So, apparently a CJK font
- if (!aMasked.count())
- {
- boost::dynamic_bitset<sal_uInt32> aCJKCodePageMask(vcl::CodePageCoverage::MAX_CP_ENUM);
- aCJKCodePageMask.set(vcl::CodePageCoverage::CP932);
- aCJKCodePageMask.set(vcl::CodePageCoverage::CP936);
- aCJKCodePageMask.set(vcl::CodePageCoverage::CP949);
- aCJKCodePageMask.set(vcl::CodePageCoverage::CP950);
- aCJKCodePageMask.set(vcl::CodePageCoverage::CP1361);
- boost::dynamic_bitset<sal_uInt32> aMaskedCodePage =
- rFontCapabilities.maCodePageRange & aCJKCodePageMask;
- //fold Korean
- if (aMaskedCodePage[vcl::CodePageCoverage::CP1361])
- {
- aMaskedCodePage.set(vcl::CodePageCoverage::CP949);
- aMaskedCodePage.set(vcl::CodePageCoverage::CP1361, false);
- }
-
- sal_uInt32 nRet = 0;
- if (aMaskedCodePage[vcl::CodePageCoverage::CP936])
- nRet |= SIMPLIFIED_CHINESE;
- if (aMaskedCodePage[vcl::CodePageCoverage::CP950])
- nRet |= TRADITIONAL_CHINESE;
- if (aMaskedCodePage[vcl::CodePageCoverage::CP932])
- nRet |= JAPANESE;
- if (aMaskedCodePage[vcl::CodePageCoverage::CP949])
- nRet |= KOREAN;
- return nRet;
- }
-
- return 0;
- }
-
- rtl::OUString makeRepresentativeSymbolText(bool bOpenSymbol, OutputDevice &rDevice)
- {
- rtl::OUString sSampleText;
-
- FontCharMap aFontCharMap;
- bool bHasCharMap = rDevice.GetFontCharMap( aFontCharMap );
- if( bHasCharMap )
- {
- // use some sample characters available in the font
- sal_Unicode aText[8];
-
- // start just above the PUA used by most symbol fonts
- sal_uInt32 cNewChar = 0xFF00;
-#ifdef QUARTZ
- // on MacOSX there are too many non-presentable symbols above the codepoint 0x0192
- if( !bOpenSymbol )
- cNewChar = 0x0192;
-#endif
-
- const int nMaxCount = sizeof(aText)/sizeof(*aText) - 1;
- int nSkip = aFontCharMap.GetCharCount() / nMaxCount;
- if( nSkip > 10 )
- nSkip = 10;
- else if( nSkip <= 0 )
- nSkip = 1;
- for( int i = 0; i < nMaxCount; ++i )
- {
- sal_uInt32 cOldChar = cNewChar;
- for( int j = nSkip; --j >= 0; )
- cNewChar = aFontCharMap.GetPrevChar( cNewChar );
- if( cOldChar == cNewChar )
- break;
- aText[ i ] = static_cast<sal_Unicode>(cNewChar); // TODO: support UCS4 samples
- aText[ i+1 ] = 0;
- }
-
- sSampleText = rtl::OUString(aText);
- }
- else
- {
- static sal_Unicode aImplSymbolFontText[] = {
- 0xF021,0xF032,0xF043,0xF054,0xF065,0xF076,0xF0B7,0xF0C8,0};
- const sal_Unicode* pText = aImplSymbolFontText;
- if( bOpenSymbol )
- {
- static sal_Unicode aImplStarSymbolText[] = {
- 0x2706,0x2704,0x270D,0xE033,0x2211,0x2288,0};
- pText = aImplStarSymbolText;
- }
- sSampleText = rtl::OUString(pText);
- }
-
- return sSampleText;
- }
-
- long shrinkFontToFit(rtl::OUString &rSampleText, long nH, Font &rFont, OutputDevice &rDevice, Rectangle &rTextRect)
- {
- long nWidth = 0;
-
- Size aSize( rFont.GetSize() );
-
- //Make sure it fits in the available height
- while (aSize.Height() > 0)
- {
- if (!rDevice.GetTextBoundRect(rTextRect, rSampleText, 0, 0))
- break;
- if (rTextRect.GetHeight() <= nH)
- {
- nWidth = rTextRect.GetWidth();
- break;
- }
-
- aSize.Height() -= EXTRAFONTSIZE;
- rFont.SetSize(aSize);
- rDevice.SetFont(rFont);
- }
-
- return nWidth;
- }
-}
-
-// -------------------------------------------------------------------
-
-void FontNameBox::UserDraw( const UserDrawEvent& rUDEvt )
-{
- ImplFontNameListData* pData = (*mpFontList)[ rUDEvt.GetItemId() ];
- const FontInfo& rInfo = pData->maInfo;
- sal_uInt16 nType = pData->mnType;
- Point aTopLeft = rUDEvt.GetRect().TopLeft();
- long nX = aTopLeft.X();
- long nH = rUDEvt.GetRect().GetHeight();
-
- if ( mbSymbols )
- {
- nX += IMGINNERTEXTSPACE;
- Image* pImg = NULL;
- if ( (nType & (FONTLIST_FONTNAMETYPE_PRINTER | FONTLIST_FONTNAMETYPE_SCREEN)) == FONTLIST_FONTNAMETYPE_PRINTER )
- pImg = &maImagePrinterFont;
- else if ( nType & FONTLIST_FONTNAMETYPE_SCALABLE )
- pImg = &maImageScalableFont;
- else
- pImg = &maImageBitmapFont;
-
- if ( pImg )
- {
- Point aPos( nX, aTopLeft.Y() + (nH-pImg->GetSizePixel().Height())/2 );
- rUDEvt.GetDevice()->DrawImage( aPos, *pImg );
- }
-
- // X immer um gleiche Breite aendern, auch wenn kein Image ausgegeben.
- nX += maImagePrinterFont.GetSizePixel().Width();
- }
-
- if ( mbWYSIWYG && mpFontList )
- {
- nX += IMGOUTERTEXTSPACE;
-
- bool bSymbolFont = (rInfo.GetCharSet() == RTL_TEXTENCODING_SYMBOL)
- || rInfo.GetName().EqualsIgnoreCaseAscii("cmsy10")
- || rInfo.GetName().EqualsIgnoreCaseAscii("cmex10")
- || rInfo.GetName().EqualsIgnoreCaseAscii("feta26")
- || rInfo.GetName().EqualsIgnoreCaseAscii("jsMath-cmsy10")
- || rInfo.GetName().EqualsIgnoreCaseAscii("jsMath-cmex10")
- || rInfo.GetName().EqualsIgnoreCaseAscii("msam10")
- || rInfo.GetName().EqualsIgnoreCaseAscii("msbm10")
- || rInfo.GetName().EqualsIgnoreCaseAscii("wasy10")
- || rInfo.GetName().EqualsIgnoreCaseAscii("Denemo")
- || rInfo.GetName().EqualsIgnoreCaseAscii("GlyphBasic1")
- || rInfo.GetName().EqualsIgnoreCaseAscii("GlyphBasic2")
- || rInfo.GetName().EqualsIgnoreCaseAscii("GlyphBasic3")
- || rInfo.GetName().EqualsIgnoreCaseAscii("GlyphBasic4")
- || rInfo.GetName().EqualsIgnoreCaseAscii("Letters Laughing")
- || rInfo.GetName().EqualsIgnoreCaseAscii("MusiQwik")
- || rInfo.GetName().EqualsIgnoreCaseAscii("MusiSync");
-
- // starsymbol is a unicode font, but cannot display its own name
- const bool bOpenSymbol = rInfo.GetName().EqualsIgnoreCaseAscii( "starsymbol" )
- || rInfo.GetName().EqualsIgnoreCaseAscii( "opensymbol" );
- bSymbolFont |= bOpenSymbol;
-
- Color aTextColor = rUDEvt.GetDevice()->GetTextColor();
- Font aOldFont( rUDEvt.GetDevice()->GetFont() );
- Size aSize( aOldFont.GetSize() );
- aSize.Height() += EXTRAFONTSIZE;
- Font aFont( rInfo );
- aFont.SetSize( aSize );
- rUDEvt.GetDevice()->SetFont( aFont );
- rUDEvt.GetDevice()->SetTextColor( aTextColor );
-
- bool bUsingCorrectFont = true;
- Rectangle aTextRect;
-
- // Preview the font name
- rtl::OUString sFontName = rInfo.GetName();
-
- //If it shouldn't or can't draw its own name because it doesn't have the glyphs
- if (bSymbolFont || (STRING_LEN != rUDEvt.GetDevice()->HasGlyphs(aFont, sFontName)))
- bUsingCorrectFont = false;
- else
- {
- //Make sure it fits in the available height, shrinking the font if necessary
- bUsingCorrectFont = shrinkFontToFit(sFontName, nH, aFont, *rUDEvt.GetDevice(), aTextRect) != 0;
- }
-
- if (!bUsingCorrectFont)
- {
- rUDEvt.GetDevice()->SetFont(aOldFont);
- rUDEvt.GetDevice()->GetTextBoundRect(aTextRect, sFontName, 0, 0);
- }
-
- long nTextHeight = aTextRect.GetHeight();
- long nDesiredGap = (nH-nTextHeight)/2;
- long nVertAdjust = nDesiredGap - aTextRect.Top();
-// long nHortAdjust = 0 - aTextRect.Left();
- Point aPos( nX, aTopLeft.Y() + nVertAdjust );
- rUDEvt.GetDevice()->DrawText( aPos, sFontName );
- Rectangle aHack(aPos.X(), aTopLeft.Y() + nH/2 - 5, aPos.X() + 40, aTopLeft.Y() + nH/2 + 5);
- long nTextX = aPos.X() + aTextRect.GetWidth();
-
- if (!bUsingCorrectFont)
- rUDEvt.GetDevice()->SetFont( aFont );
-
- rtl::OUString sSampleText;
- bool bHasSampleTextGlyphs=false;
-
- if (!bSymbolFont)
- {
- const bool bNameBeginsWithLatinText = rInfo.GetName().GetChar(0) <= 'z';
- vcl::FontCapabilities aFontCapabilities;
-#if OSL_DEBUG_LEVEL > 2
- lcl_dump_unicode_coverage(aFontCapabilities.maUnicodeRange);
- lcl_dump_codepage_coverage(aFontCapabilities.maCodePageRange);
-#endif
- if (bNameBeginsWithLatinText && rUDEvt.GetDevice()->GetFontCapabilities(aFontCapabilities))
- {
- //If this font is probably tuned to display a single non-Latin
- //script and the font name is itself in Latin, then show a small
- //chunk of representative text for that script
- size_t nScript = getScript(aFontCapabilities);
- if (nScript)
- {
- //If we're a CJK font, see if we seem to be tuned
- //for C, J or K
- if (nScript & JAPANESE && nScript ^ JAPANESE)
- {
- const sal_Unicode aJapanese[] = { 0x3007, 0x9F9D };
- rtl::OUString sJapanese(aJapanese, SAL_N_ELEMENTS(aJapanese));
- if (STRING_LEN != rUDEvt.GetDevice()->HasGlyphs(aFont, sJapanese))
- nScript ^= JAPANESE;
- }
-
- if (nScript & TRADITIONAL_CHINESE && nScript ^ TRADITIONAL_CHINESE)
- {
- const sal_Unicode aTraditionalChinese[] = { 0xFA0D };
- rtl::OUString sTraditionalChinese(aTraditionalChinese, SAL_N_ELEMENTS(aTraditionalChinese));
- if (STRING_LEN != rUDEvt.GetDevice()->HasGlyphs(aFont, sTraditionalChinese))
- nScript ^= TRADITIONAL_CHINESE;
- }
-
- if (nScript & SIMPLIFIED_CHINESE && nScript ^ SIMPLIFIED_CHINESE)
- {
- const sal_Unicode aSimplifiedChinese[] = { 0x9FA0 };
- rtl::OUString sSimplifiedChinese(aSimplifiedChinese, SAL_N_ELEMENTS(aSimplifiedChinese));
- if (STRING_LEN != rUDEvt.GetDevice()->HasGlyphs(aFont, sSimplifiedChinese))
- nScript ^= SIMPLIFIED_CHINESE;
- }
-
- sSampleText = getRepresentativeText(nScript);
- bHasSampleTextGlyphs = (STRING_LEN == rUDEvt.GetDevice()->HasGlyphs(aFont, sSampleText));
- }
- }
- }
-
- //If we're not a symbol font, but could neither render our own name and
- //we can't determine what script it would like to render, then try a
- //few well known scripts
- if (!sSampleText.getLength() && !bUsingCorrectFont)
- {
- static const sal_Int32 aScripts[] =
- {
- vcl::UnicodeCoverage::ARABIC,
- vcl::UnicodeCoverage::HEBREW,
-
- vcl::UnicodeCoverage::BENGALI,
- vcl::UnicodeCoverage::GURMUKHI,
- vcl::UnicodeCoverage::GUJARATI,
- vcl::UnicodeCoverage::ORIYA,
- vcl::UnicodeCoverage::TAMIL,
- vcl::UnicodeCoverage::TELUGU,
- vcl::UnicodeCoverage::KANNADA,
- vcl::UnicodeCoverage::MALAYALAM,
- vcl::UnicodeCoverage::SINHALA,
- vcl::UnicodeCoverage::DEVANAGARI,
-
- vcl::UnicodeCoverage::THAI,
- vcl::UnicodeCoverage::LAO,
- vcl::UnicodeCoverage::GEORGIAN,
- vcl::UnicodeCoverage::TIBETAN,
- vcl::UnicodeCoverage::SYRIAC,
- vcl::UnicodeCoverage::MYANMAR,
- vcl::UnicodeCoverage::ETHIOPIC,
- vcl::UnicodeCoverage::KHMER,
- vcl::UnicodeCoverage::MONGOLIAN,
-
- KOREAN,
- JAPANESE,
- TRADITIONAL_CHINESE|SIMPLIFIED_CHINESE,
-
- vcl::UnicodeCoverage::GREEK_AND_COPTIC,
-
- HEBREW_MINIMAL,
- GREEK_MINIMAL
- };
-
- for (size_t i = 0; i < SAL_N_ELEMENTS(aScripts); ++i)
- {
- sSampleText = getRepresentativeText(aScripts[i]);
- if (sSampleText.getLength())
- {
- bHasSampleTextGlyphs = (STRING_LEN == rUDEvt.GetDevice()->HasGlyphs(aFont, sSampleText));
- if (bHasSampleTextGlyphs)
- break;
- }
- }
- }
-
- //If we're a symbol font, or for some reason the font still couldn't
- //render something representative of what it would like to render then
- //make up some semi-random text that it *can* display
- if (bSymbolFont || (!bUsingCorrectFont && !bHasSampleTextGlyphs))
- {
- sSampleText = makeRepresentativeSymbolText(bOpenSymbol, *rUDEvt.GetDevice());
- bHasSampleTextGlyphs = (STRING_LEN == rUDEvt.GetDevice()->HasGlyphs(aFont, sSampleText));
- }
-
- if (sSampleText.getLength() && bHasSampleTextGlyphs)
- {
- const Size &rItemSize = rUDEvt.GetDevice()->GetOutputSize();
- //leave a little border at the edge
- long nSpace = rItemSize.Width() - nTextX - IMGOUTERTEXTSPACE;
- if (nSpace >= 0)
- {
- //Make sure it fits in the available height, and get how wide that would be
- long nWidth = shrinkFontToFit(sSampleText, nH, aFont, *rUDEvt.GetDevice(), aTextRect);
- //Chop letters off until it fits in the available width
- while (nWidth > nSpace || nWidth > MAXPREVIEWWIDTH)
- {
- sSampleText = sSampleText.copy(0, sSampleText.getLength()-1);
- nWidth = rUDEvt.GetDevice()->GetTextBoundRect(aTextRect, sSampleText, 0, 0) ?
- aTextRect.GetWidth() : 0;
- }
-
- //center the text on the line
- if (sSampleText.getLength() && nWidth)
- {
- nTextHeight = aTextRect.GetHeight();
- nDesiredGap = (nH-nTextHeight)/2;
- nVertAdjust = nDesiredGap - aTextRect.Top();
- aPos = Point(nTextX + nSpace - nWidth, aTopLeft.Y() + nVertAdjust);
- rUDEvt.GetDevice()->DrawText( aPos, sSampleText );
- }
- }
- }
-
- rUDEvt.GetDevice()->SetFont( aOldFont );
- DrawEntry( rUDEvt, sal_False, sal_False); // draw seperator
- }
- else
- {
- DrawEntry( rUDEvt, sal_True, sal_True );
- }
-}
-
-// ===================================================================
-// FontStyleBox
-// ===================================================================
-
-FontStyleBox::FontStyleBox( Window* pParent, WinBits nWinStyle ) :
- ComboBox( pParent, nWinStyle )
-{
-}
-
-// -------------------------------------------------------------------
-
-FontStyleBox::FontStyleBox( Window* pParent, const ResId& rResId ) :
- ComboBox( pParent, rResId )
-{
- aLastStyle = GetText();
-}
-
-// -------------------------------------------------------------------
-
-FontStyleBox::~FontStyleBox()
-{
-}
-
-// -------------------------------------------------------------------
-
-void FontStyleBox::Select()
-{
- // keep text over fill operation
- aLastStyle = GetText();
- ComboBox::Select();
-}
-
-// -------------------------------------------------------------------
-
-void FontStyleBox::LoseFocus()
-{
- // keep text over fill operation
- aLastStyle = GetText();
- ComboBox::LoseFocus();
-}
-
-// -------------------------------------------------------------------
-
-void FontStyleBox::Modify()
-{
- CharClass aChrCls( ::comphelper::getProcessServiceFactory(),
- GetSettings().GetLocale() );
- XubString aStr = GetText();
- sal_uInt16 nEntryCount = GetEntryCount();
-
- if ( GetEntryPos( aStr ) == COMBOBOX_ENTRY_NOTFOUND )
- {
- aChrCls.toUpper( aStr );
- for ( sal_uInt16 i = 0; i < nEntryCount; i++ )
- {
- XubString aEntryText = GetEntry( i );
- aChrCls.toUpper( aEntryText );
-
- if ( aStr == aEntryText )
- {
- SetText( GetEntry( i ) );
- break;
- }
- }
- }
-
- ComboBox::Modify();
-}
-
-// -------------------------------------------------------------------
-
-void FontStyleBox::Fill( const XubString& rName, const FontList* pList )
-{
- // note: this method must call ComboBox::SetText(),
- // else aLastStyle will overwritten
- // store prior selection position and clear box
- XubString aOldText = GetText();
- sal_uInt16 nPos = GetEntryPos( aOldText );
- Clear();
-
- // does a font with this name already exist?
- sal_Handle hFontInfo = pList->GetFirstFontInfo( rName );
- if ( hFontInfo )
- {
- XubString aStyleText;
- FontWeight eLastWeight = WEIGHT_DONTKNOW;
- FontItalic eLastItalic = ITALIC_NONE;
- FontWidth eLastWidth = WIDTH_DONTKNOW;
- sal_Bool bNormal = sal_False;
- sal_Bool bItalic = sal_False;
- sal_Bool bBold = sal_False;
- sal_Bool bBoldItalic = sal_False;
- sal_Bool bInsert = sal_False;
- FontInfo aInfo;
- while ( hFontInfo )
- {
- aInfo = pList->GetFontInfo( hFontInfo );
-
- FontWeight eWeight = aInfo.GetWeight();
- FontItalic eItalic = aInfo.GetItalic();
- FontWidth eWidth = aInfo.GetWidthType();
- // Only if the attributes are different, we insert the
- // Font to avoid double Entries in different languages
- if ( (eWeight != eLastWeight) || (eItalic != eLastItalic) ||
- (eWidth != eLastWidth) )
- {
- if ( bInsert )
- InsertEntry( aStyleText );
-
- if ( eWeight <= WEIGHT_NORMAL )
- {
- if ( eItalic != ITALIC_NONE )
- bItalic = sal_True;
- else
- bNormal = sal_True;
- }
- else
- {
- if ( eItalic != ITALIC_NONE )
- bBoldItalic = sal_True;
- else
- bBold = sal_True;
- }
-
- // For wrong StyleNames we replace this with the correct once
- aStyleText = pList->GetStyleName( aInfo );
- bInsert = GetEntryPos( aStyleText ) == LISTBOX_ENTRY_NOTFOUND;
- if ( !bInsert )
- {
- aStyleText = pList->GetStyleName( eWeight, eItalic );
- bInsert = GetEntryPos( aStyleText ) == LISTBOX_ENTRY_NOTFOUND;
- }
-
- eLastWeight = eWeight;
- eLastItalic = eItalic;
- eLastWidth = eWidth;
- }
- else
- {
- if ( bInsert )
- {
- // If we have two names for the same attributes
- // we prefer the translated standard names
- const XubString& rAttrStyleText = pList->GetStyleName( eWeight, eItalic );
- if ( rAttrStyleText != aStyleText )
- {
- XubString aTempStyleText = pList->GetStyleName( aInfo );
- if ( rAttrStyleText == aTempStyleText )
- aStyleText = rAttrStyleText;
- bInsert = GetEntryPos( aStyleText ) == LISTBOX_ENTRY_NOTFOUND;
- }
- }
- }
-
- if ( !bItalic && (aStyleText == pList->GetItalicStr()) )
- bItalic = sal_True;
- else if ( !bBold && (aStyleText == pList->GetBoldStr()) )
- bBold = sal_True;
- else if ( !bBoldItalic && (aStyleText == pList->GetBoldItalicStr()) )
- bBoldItalic = sal_True;
-
- hFontInfo = pList->GetNextFontInfo( hFontInfo );
- }
-
- if ( bInsert )
- InsertEntry( aStyleText );
-
- // Bestimmte Styles als Nachbildung
- if ( bNormal )
- {
- if ( !bItalic )
- InsertEntry( pList->GetItalicStr() );
- if ( !bBold )
- InsertEntry( pList->GetBoldStr() );
- }
- if ( !bBoldItalic )
- {
- if ( bNormal || bItalic || bBold )
- InsertEntry( pList->GetBoldItalicStr() );
- }
- if ( aOldText.Len() )
- {
- if ( GetEntryPos( aLastStyle ) != LISTBOX_ENTRY_NOTFOUND )
- ComboBox::SetText( aLastStyle );
- else
- {
- if ( nPos >= GetEntryCount() )
- ComboBox::SetText( GetEntry( 0 ) );
- else
- ComboBox::SetText( GetEntry( nPos ) );
- }
- }
- }
- else
- {
- // Wenn Font nicht, dann Standard-Styles einfuegen
- InsertEntry( pList->GetNormalStr() );
- InsertEntry( pList->GetItalicStr() );
- InsertEntry( pList->GetBoldStr() );
- InsertEntry( pList->GetBoldItalicStr() );
- if ( aOldText.Len() )
- {
- if ( nPos > GetEntryCount() )
- ComboBox::SetText( GetEntry( 0 ) );
- else
- ComboBox::SetText( GetEntry( nPos ) );
- }
- }
-}
-
-// ===================================================================
-// FontSizeBox
-// ===================================================================
-
-FontSizeBox::FontSizeBox( Window* pParent, WinBits nWinSize ) :
- MetricBox( pParent, nWinSize )
-{
- ImplInit();
-}
-
-// -----------------------------------------------------------------------
-
-FontSizeBox::FontSizeBox( Window* pParent, const ResId& rResId ) :
- MetricBox( pParent, rResId )
-{
- ImplInit();
-}
-
-// -----------------------------------------------------------------------
-
-FontSizeBox::~FontSizeBox()
-{
-}
-
-// -----------------------------------------------------------------------
-
-void FontSizeBox::ImplInit()
-{
- EnableAutocomplete( sal_False );
-
- bRelativeMode = sal_False;
- bPtRelative = sal_False;
- bRelative = sal_False;
- bStdSize = sal_False;
- pFontList = NULL;
-
- SetShowTrailingZeros( sal_False );
- SetDecimalDigits( 1 );
- SetMin( 20 );
- SetMax( 9999 );
- SetProminentEntryType( PROMINENT_MIDDLE );
-}
-
-// -----------------------------------------------------------------------
-
-void FontSizeBox::Reformat()
-{
- FontSizeNames aFontSizeNames( GetSettings().GetUILanguage() );
- if ( !bRelativeMode || !aFontSizeNames.IsEmpty() )
- {
- long nNewValue = aFontSizeNames.Name2Size( GetText() );
- if ( nNewValue)
- {
- mnLastValue = nNewValue;
- return;
- }
- }
-
- MetricBox::Reformat();
-}
-
-// -----------------------------------------------------------------------
-
-void FontSizeBox::Modify()
-{
- MetricBox::Modify();
-
- if ( bRelativeMode )
- {
- XubString aStr = GetText();
- aStr.EraseLeadingChars();
-
- sal_Bool bNewMode = bRelative;
- sal_Bool bOldPtRelMode = bPtRelative;
-
- if ( bRelative )
- {
- bPtRelative = sal_False;
- const xub_Unicode* pStr = aStr.GetBuffer();
- while ( *pStr )
- {
- if ( ((*pStr < '0') || (*pStr > '9')) && (*pStr != '%') )
- {
- if ( ('-' == *pStr || '+' == *pStr) && !bPtRelative )
- bPtRelative = sal_True;
- else if ( bPtRelative && 'p' == *pStr && 't' == *++pStr )
- ;
- else
- {
- bNewMode = sal_False;
- break;
- }
- }
- pStr++;
- }
- }
- else
- {
- if ( STRING_NOTFOUND != aStr.Search( '%' ) )
- {
- bNewMode = sal_True;
- bPtRelative = sal_False;
- }
-
- if ( '-' == aStr.GetChar( 0 ) || '+' == aStr.GetChar( 0 ) )
- {
- bNewMode = sal_True;
- bPtRelative = sal_True;
- }
- }
-
- if ( bNewMode != bRelative || bPtRelative != bOldPtRelMode )
- SetRelative( bNewMode );
- }
-}
-
-// -----------------------------------------------------------------------
-
-void FontSizeBox::Fill( const FontInfo* pInfo, const FontList* pList )
-{
- // remember for relative mode
- pFontList = pList;
-
- // no font sizes need to be set for relative mode
- if ( bRelative )
- return;
-
- // query font sizes
- const long* pTempAry;
- const long* pAry = 0;
-
- if( pInfo )
- {
- aFontInfo = *pInfo;
- pAry = pList->GetSizeAry( *pInfo );
- }
- else
- {
- pAry = pList->GetStdSizeAry();
- }
-
- // first insert font size names (for simplified/traditional chinese)
- FontSizeNames aFontSizeNames( GetSettings().GetUILanguage() );
- if ( pAry == pList->GetStdSizeAry() )
- {
- // for standard sizes we don't need to bother
- if ( bStdSize && GetEntryCount() && aFontSizeNames.IsEmpty() )
- return;
- bStdSize = sal_True;
- }
- else
- bStdSize = sal_False;
-
- Selection aSelection = GetSelection();
- XubString aStr = GetText();
-
- Clear();
- sal_uInt16 nPos = 0;
-
- if ( !aFontSizeNames.IsEmpty() )
- {
- if ( pAry == pList->GetStdSizeAry() )
- {
- // for scalable fonts all font size names
- sal_uLong nCount = aFontSizeNames.Count();
- for( sal_uLong i = 0; i < nCount; i++ )
- {
- String aSizeName = aFontSizeNames.GetIndexName( i );
- long nSize = aFontSizeNames.GetIndexSize( i );
- ComboBox::InsertEntry( aSizeName, nPos );
- ComboBox::SetEntryData( nPos, (void*)(-nSize) ); // mark as special
- nPos++;
- }
- }
- else
- {
- // for fixed size fonts only selectable font size names
- pTempAry = pAry;
- while ( *pTempAry )
- {
- String aSizeName = aFontSizeNames.Size2Name( *pTempAry );
- if ( aSizeName.Len() )
- {
- ComboBox::InsertEntry( aSizeName, nPos );
- ComboBox::SetEntryData( nPos, (void*)(-(*pTempAry)) ); // mark as special
- nPos++;
- }
- pTempAry++;
- }
- }
- }
-
- // then insert numerical font size values
- pTempAry = pAry;
- while ( *pTempAry )
- {
- InsertValue( *pTempAry, FUNIT_NONE, nPos );
- ComboBox::SetEntryData( nPos, (void*)(*pTempAry) );
- nPos++;
- pTempAry++;
- }
-
- SetText( aStr );
- SetSelection( aSelection );
-}
-
-// -----------------------------------------------------------------------
-
-void FontSizeBox::EnableRelativeMode( sal_uInt16 nMin, sal_uInt16 nMax, sal_uInt16 nStep )
-{
- bRelativeMode = sal_True;
- nRelMin = nMin;
- nRelMax = nMax;
- nRelStep = nStep;
- SetUnit( FUNIT_POINT );
-}
-
-// -----------------------------------------------------------------------
-
-void FontSizeBox::EnablePtRelativeMode( short nMin, short nMax, short nStep )
-{
- bRelativeMode = sal_True;
- nPtRelMin = nMin;
- nPtRelMax = nMax;
- nPtRelStep = nStep;
- SetUnit( FUNIT_POINT );
-}
-
-// -----------------------------------------------------------------------
-
-void FontSizeBox::SetRelative( sal_Bool bNewRelative )
-{
- if ( bRelativeMode )
- {
- Selection aSelection = GetSelection();
- XubString aStr = GetText();
- aStr.EraseLeadingChars();
-
- if ( bNewRelative )
- {
- bRelative = sal_True;
- bStdSize = sal_False;
-
- if ( bPtRelative )
- {
- SetDecimalDigits( 1 );
- SetMin( nPtRelMin );
- SetMax( nPtRelMax );
- SetUnit( FUNIT_POINT );
-
- Clear();
-
- short i = nPtRelMin, n = 0;
- // JP 30.06.98: more than 100 values are not useful
- while ( i <= nPtRelMax && n++ < 100 )
- {
- InsertValue( i );
- i = i + nPtRelStep;
- }
- }
- else
- {
- SetDecimalDigits( 0 );
- SetMin( nRelMin );
- SetMax( nRelMax );
- SetCustomUnitText( '%' );
- SetUnit( FUNIT_CUSTOM );
-
- Clear();
- sal_uInt16 i = nRelMin;
- while ( i <= nRelMax )
- {
- InsertValue( i );
- i = i + nRelStep;
- }
- }
- }
- else
- {
- bRelative = bPtRelative = sal_False;
- SetDecimalDigits( 1 );
- SetMin( 20 );
- SetMax( 9999 );
- SetUnit( FUNIT_POINT );
- if ( pFontList )
- Fill( &aFontInfo, pFontList );
- }
-
- SetText( aStr );
- SetSelection( aSelection );
- }
-}
-
-// -----------------------------------------------------------------------
-
-XubString FontSizeBox::CreateFieldText( sal_Int64 nValue ) const
-{
- XubString sRet( MetricBox::CreateFieldText( nValue ) );
- if ( bRelativeMode && bPtRelative && (0 <= nValue) && sRet.Len() )
- sRet.Insert( '+', 0 );
- return sRet;
-}
-
-// -----------------------------------------------------------------------
-
-void FontSizeBox::SetValue( sal_Int64 nNewValue, FieldUnit eInUnit )
-{
- if ( !bRelative )
- {
- sal_Int64 nTempValue = MetricField::ConvertValue( nNewValue, GetBaseValue(), GetDecimalDigits(), eInUnit, GetUnit() );
- FontSizeNames aFontSizeNames( GetSettings().GetUILanguage() );
- // conversion loses precision; however font sizes should
- // never have a problem with that
- String aName = aFontSizeNames.Size2Name( static_cast<long>(nTempValue) );
- if ( aName.Len() && (GetEntryPos( aName ) != LISTBOX_ENTRY_NOTFOUND) )
- {
- mnLastValue = nTempValue;
- SetText( aName );
- mnFieldValue = mnLastValue;
- SetEmptyFieldValueData( sal_False );
- return;
- }
- }
-
- MetricBox::SetValue( nNewValue, eInUnit );
-}
-
-// -----------------------------------------------------------------------
-
-void FontSizeBox::SetValue( sal_Int64 nNewValue )
-{
- SetValue( nNewValue, FUNIT_NONE );
-}
-
-// -----------------------------------------------------------------------
-
-sal_Int64 FontSizeBox::GetValue( sal_uInt16 nPos, FieldUnit eOutUnit ) const
-{
- if ( !bRelative )
- {
- sal_Int64 nComboVal = static_cast<sal_Int64>(reinterpret_cast<long>(ComboBox::GetEntryData( nPos )));
- if ( nComboVal < 0 ) // marked as special?
- {
- return MetricField::ConvertValue( -nComboVal, mnBaseValue, GetDecimalDigits(),
- meUnit, eOutUnit );
- }
- }
-
- // do normal font size processing
- sal_Int64 nRetValue = MetricBox::GetValue( nPos, eOutUnit );
- return nRetValue;
-}
-
-// -----------------------------------------------------------------------
-
-sal_Int64 FontSizeBox::GetValue( FieldUnit eOutUnit ) const
-{
- if ( !bRelative )
- {
- FontSizeNames aFontSizeNames( GetSettings().GetUILanguage() );
- sal_Int64 nValue = aFontSizeNames.Name2Size( GetText() );
- if ( nValue)
- return MetricField::ConvertValue( nValue, GetBaseValue(), GetDecimalDigits(), GetUnit(), eOutUnit );
- }
-
- return MetricBox::GetValue( eOutUnit );
-}
-
-// -----------------------------------------------------------------------
-
-sal_Int64 FontSizeBox::GetValue() const
-{
- // implementation not inline, because it is a virtual function
- return GetValue( FUNIT_NONE );
-}
-
-// -----------------------------------------------------------------------
-
-void FontSizeBox::SetUserValue( sal_Int64 nNewValue, FieldUnit eInUnit )
-{
- if ( !bRelative )
- {
- sal_Int64 nTempValue = MetricField::ConvertValue( nNewValue, GetBaseValue(), GetDecimalDigits(), eInUnit, GetUnit() );
- FontSizeNames aFontSizeNames( GetSettings().GetUILanguage() );
- // conversion loses precision
- // however font sizes should never have a problem with that
- String aName = aFontSizeNames.Size2Name( static_cast<long>(nTempValue) );
- if ( aName.Len() && (GetEntryPos( aName ) != LISTBOX_ENTRY_NOTFOUND) )
- {
- mnLastValue = nTempValue;
- SetText( aName );
- return;
- }
- }
-
- MetricBox::SetUserValue( nNewValue, eInUnit );
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */