summaryrefslogtreecommitdiff
path: root/svtools/source/control/scriptedtext.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svtools/source/control/scriptedtext.cxx')
-rw-r--r--svtools/source/control/scriptedtext.cxx387
1 files changed, 0 insertions, 387 deletions
diff --git a/svtools/source/control/scriptedtext.cxx b/svtools/source/control/scriptedtext.cxx
deleted file mode 100644
index 3dc5a2ee2f..0000000000
--- a/svtools/source/control/scriptedtext.cxx
+++ /dev/null
@@ -1,387 +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"
-#include <svtools/scriptedtext.hxx>
-#include <vector>
-#include <rtl/ustring.hxx>
-#include <vcl/outdev.hxx>
-#include <vcl/font.hxx>
-#include <tools/debug.hxx>
-#include <com/sun/star/i18n/ScriptType.hpp>
-
-
-using namespace ::std;
-using namespace ::rtl;
-using namespace ::com::sun::star;
-
-
-//_____________________________________________________________________________
-
-class SvtScriptedTextHelper_Impl
-{
-private:
- OutputDevice& mrOutDevice; /// The output device for drawing the text.
- Font maLatinFont; /// The font for latin text portions.
- Font maAsianFont; /// The font for asian text portions.
- Font maCmplxFont; /// The font for complex text portions.
- Font maDefltFont; /// The default font of the output device.
- OUString maText; /// The text.
-
- vector< sal_Int32 > maPosVec; /// The start position of each text portion.
- vector< sal_Int16 > maScriptVec; /// The script type of each text portion.
- vector< sal_Int32 > maWidthVec; /// The output width of each text portion.
- Size maTextSize; /// The size the text will take in the current output device.
-
- /** Assignment operator not implemented to prevent usage. */
- SvtScriptedTextHelper_Impl& operator=( const SvtScriptedTextHelper_Impl& );
-
- /** Gets the font of the given script type. */
- const Font& GetFont( sal_uInt16 _nScript ) const;
- /** Sets a font on the output device depending on the script type. */
- inline void SetOutDevFont( sal_uInt16 _nScript )
- { mrOutDevice.SetFont( GetFont( _nScript ) ); }
- /** Fills maPosVec with positions of all changes of script type.
- This method expects correctly initialized maPosVec and maScriptVec. */
- void CalculateSizes();
- /** Fills maPosVec with positions of all changes of script type and
- maScriptVec with the script type of each portion. */
- void CalculateBreaks(
- const uno::Reference< i18n::XBreakIterator >& _xBreakIter );
-
-public:
- /** This constructor sets an output device and fonts for all script types. */
- SvtScriptedTextHelper_Impl(
- OutputDevice& _rOutDevice,
- Font* _pLatinFont,
- Font* _pAsianFont,
- Font* _pCmplxFont );
- /** Copy constructor. */
- SvtScriptedTextHelper_Impl(
- const SvtScriptedTextHelper_Impl& _rCopy );
- /** Destructor. */
- ~SvtScriptedTextHelper_Impl();
-
- /** Sets new fonts and recalculates the text width. */
- void SetFonts( Font* _pLatinFont, Font* _pAsianFont, Font* _pCmplxFont );
- /** Sets a new text and calculates all script breaks and the text width. */
- void SetText(
- const OUString& _rText,
- const uno::Reference< i18n::XBreakIterator >& _xBreakIter );
-
- /** Returns the previously set text. */
- const OUString& GetText() const;
- /** Returns a size struct containing the width and height of the text in the current output device. */
- const Size& GetTextSize() const;
-
- /** Draws the text in the current output device. */
- void DrawText( const Point& _rPos );
-};
-
-
-SvtScriptedTextHelper_Impl::SvtScriptedTextHelper_Impl(
- OutputDevice& _rOutDevice,
- Font* _pLatinFont, Font* _pAsianFont, Font* _pCmplxFont ) :
- mrOutDevice( _rOutDevice ),
- maLatinFont( _pLatinFont ? *_pLatinFont : _rOutDevice.GetFont() ),
- maAsianFont( _pAsianFont ? *_pAsianFont : _rOutDevice.GetFont() ),
- maCmplxFont( _pCmplxFont ? *_pCmplxFont : _rOutDevice.GetFont() ),
- maDefltFont( _rOutDevice.GetFont() )
-{
-}
-
-SvtScriptedTextHelper_Impl::SvtScriptedTextHelper_Impl( const SvtScriptedTextHelper_Impl& _rCopy ) :
- mrOutDevice( _rCopy.mrOutDevice ),
- maLatinFont( _rCopy.maLatinFont ),
- maAsianFont( _rCopy.maAsianFont ),
- maCmplxFont( _rCopy.maCmplxFont ),
- maDefltFont( _rCopy.maDefltFont ),
- maText( _rCopy.maText ),
- maPosVec( _rCopy.maPosVec ),
- maScriptVec( _rCopy.maScriptVec ),
- maWidthVec( _rCopy.maWidthVec ),
- maTextSize( _rCopy.maTextSize )
-{
-}
-
-SvtScriptedTextHelper_Impl::~SvtScriptedTextHelper_Impl()
-{
-}
-
-const Font& SvtScriptedTextHelper_Impl::GetFont( sal_uInt16 _nScript ) const
-{
- switch( _nScript )
- {
- case i18n::ScriptType::LATIN: return maLatinFont;
- case i18n::ScriptType::ASIAN: return maAsianFont;
- case i18n::ScriptType::COMPLEX: return maCmplxFont;
- }
- return maDefltFont;
-}
-
-void SvtScriptedTextHelper_Impl::CalculateSizes()
-{
- maTextSize.Width() = maTextSize.Height() = 0;
- maDefltFont = mrOutDevice.GetFont();
-
- // calculate text portion widths and total width
- maWidthVec.clear();
- if( !maPosVec.empty() )
- {
- DBG_ASSERT( maPosVec.size() - 1 == maScriptVec.size(),
- "SvtScriptedTextHelper_Impl::CalculateWidth - invalid vectors" );
-
- xub_StrLen nThisPos = static_cast< xub_StrLen >( maPosVec[ 0 ] );
- xub_StrLen nNextPos;
- sal_Int32 nPosVecSize = maPosVec.size();
- sal_Int32 nPosVecIndex = 1;
-
- sal_Int16 nScript;
- sal_Int32 nScriptVecIndex = 0;
-
- sal_Int32 nCurrWidth;
-
- while( nPosVecIndex < nPosVecSize )
- {
- nNextPos = static_cast< xub_StrLen >( maPosVec[ nPosVecIndex++ ] );
- nScript = maScriptVec[ nScriptVecIndex++ ];
-
- SetOutDevFont( nScript );
- nCurrWidth = mrOutDevice.GetTextWidth( maText, nThisPos, nNextPos - nThisPos );
- maWidthVec.push_back( nCurrWidth );
- maTextSize.Width() += nCurrWidth;
- nThisPos = nNextPos;
- }
- }
-
- // calculate maximum font height
- SetOutDevFont( i18n::ScriptType::LATIN );
- maTextSize.Height() = Max( maTextSize.Height(), mrOutDevice.GetTextHeight() );
- SetOutDevFont( i18n::ScriptType::ASIAN );
- maTextSize.Height() = Max( maTextSize.Height(), mrOutDevice.GetTextHeight() );
- SetOutDevFont( i18n::ScriptType::COMPLEX );
- maTextSize.Height() = Max( maTextSize.Height(), mrOutDevice.GetTextHeight() );
-
- mrOutDevice.SetFont( maDefltFont );
-}
-
-void SvtScriptedTextHelper_Impl::CalculateBreaks( const uno::Reference< i18n::XBreakIterator >& _xBreakIter )
-{
- maPosVec.clear();
- maScriptVec.clear();
-
- DBG_ASSERT( _xBreakIter.is(), "SvtScriptedTextHelper_Impl::CalculateBreaks - no break iterator" );
-
- sal_Int32 nLen = maText.getLength();
- if( nLen )
- {
- if( _xBreakIter.is() )
- {
- sal_Int32 nThisPos = 0; // first position of this portion
- sal_Int32 nNextPos = 0; // first position of next portion
- sal_Int16 nPortScript; // script type of this portion
- do
- {
- nPortScript = _xBreakIter->getScriptType( maText, nThisPos );
- nNextPos = _xBreakIter->endOfScript( maText, nThisPos, nPortScript );
-
- switch( nPortScript )
- {
- case i18n::ScriptType::LATIN:
- case i18n::ScriptType::ASIAN:
- case i18n::ScriptType::COMPLEX:
- maPosVec.push_back( nThisPos );
- maScriptVec.push_back( nPortScript );
- break;
- default:
- {
-/* *** handling of weak characters ***
-- first portion is weak: Use OutputDevice::HasGlyphs() to find the correct font
-- weak portion follows another portion: Script type of preceding portion is used */
- if( maPosVec.empty() )
- {
- sal_Int32 nCharIx = 0;
- sal_Int32 nNextCharIx = 0;
- sal_Int16 nScript;
- do
- {
- nScript = i18n::ScriptType::LATIN;
- while( (nScript != i18n::ScriptType::WEAK) && (nCharIx == nNextCharIx) )
- {
- nNextCharIx = mrOutDevice.HasGlyphs( GetFont( nScript ), maText, sal::static_int_cast< sal_uInt16 >(nCharIx), sal::static_int_cast< sal_uInt16 >(nNextPos - nCharIx) );
- if( nCharIx == nNextCharIx )
- ++nScript;
- }
- if( nNextCharIx == nCharIx )
- ++nNextCharIx;
-
- maPosVec.push_back( nCharIx );
- maScriptVec.push_back( nScript );
- nCharIx = nNextCharIx;
- }
- while( nCharIx < nNextPos );
- }
- // nothing to do for following portions
- }
- }
- nThisPos = nNextPos;
- }
- while( (0 <= nThisPos) && (nThisPos < nLen) );
- }
- else // no break iterator: whole text LATIN
- {
- maPosVec.push_back( 0 );
- maScriptVec.push_back( i18n::ScriptType::LATIN );
- }
-
- // push end position of last portion
- if( !maPosVec.empty() )
- maPosVec.push_back( nLen );
- }
- CalculateSizes();
-}
-
-void SvtScriptedTextHelper_Impl::SetFonts( Font* _pLatinFont, Font* _pAsianFont, Font* _pCmplxFont )
-{
- maLatinFont = _pLatinFont ? *_pLatinFont : maDefltFont;
- maAsianFont = _pAsianFont ? *_pAsianFont : maDefltFont;
- maCmplxFont = _pCmplxFont ? *_pCmplxFont : maDefltFont;
- CalculateSizes();
-}
-
-void SvtScriptedTextHelper_Impl::SetText( const OUString& _rText, const uno::Reference< i18n::XBreakIterator >& _xBreakIter )
-{
- maText = _rText;
- CalculateBreaks( _xBreakIter );
-}
-
-const OUString& SvtScriptedTextHelper_Impl::GetText() const
-{
- return maText;
-}
-
-const Size& SvtScriptedTextHelper_Impl::GetTextSize() const
-{
- return maTextSize;
-}
-
-void SvtScriptedTextHelper_Impl::DrawText( const Point& _rPos )
-{
- if( !maText.getLength() || maPosVec.empty() )
- return;
-
- DBG_ASSERT( maPosVec.size() - 1 == maScriptVec.size(), "SvtScriptedTextHelper_Impl::DrawText - invalid vectors" );
- DBG_ASSERT( maScriptVec.size() == maWidthVec.size(), "SvtScriptedTextHelper_Impl::DrawText - invalid vectors" );
-
- maDefltFont = mrOutDevice.GetFont();
- Point aCurrPos( _rPos );
- xub_StrLen nThisPos = static_cast< xub_StrLen >( maPosVec[ 0 ] );
- xub_StrLen nNextPos;
- sal_Int32 nPosVecSize = maPosVec.size();
- sal_Int32 nPosVecIndex = 1;
-
- sal_Int16 nScript;
- sal_Int32 nVecIndex = 0;
-
- while( nPosVecIndex < nPosVecSize )
- {
- nNextPos = static_cast< xub_StrLen >( maPosVec[ nPosVecIndex++ ] );
- nScript = maScriptVec[ nVecIndex ];
-
- SetOutDevFont( nScript );
- mrOutDevice.DrawText( aCurrPos, maText, nThisPos, nNextPos - nThisPos );
- aCurrPos.X() += maWidthVec[ nVecIndex++ ];
- aCurrPos.X() += mrOutDevice.GetTextHeight() / 5; // add 20% of font height as portion spacing
- nThisPos = nNextPos;
- }
- mrOutDevice.SetFont( maDefltFont );
-}
-
-
-//_____________________________________________________________________________
-
-SvtScriptedTextHelper::SvtScriptedTextHelper( OutputDevice& _rOutDevice ) :
- mpImpl( new SvtScriptedTextHelper_Impl( _rOutDevice, NULL, NULL, NULL ) )
-{
-}
-
-SvtScriptedTextHelper::SvtScriptedTextHelper( const SvtScriptedTextHelper& _rCopy ) :
- mpImpl( new SvtScriptedTextHelper_Impl( *_rCopy.mpImpl ) )
-{
-}
-
-SvtScriptedTextHelper::~SvtScriptedTextHelper()
-{
- delete mpImpl;
-}
-
-void SvtScriptedTextHelper::SetFonts( Font* _pLatinFont, Font* _pAsianFont, Font* _pCmplxFont )
-{
- mpImpl->SetFonts( _pLatinFont, _pAsianFont, _pCmplxFont );
-}
-
-void SvtScriptedTextHelper::SetDefaultFont()
-{
- mpImpl->SetFonts( NULL, NULL, NULL );
-}
-
-void SvtScriptedTextHelper::SetText( const OUString& _rText, const uno::Reference< i18n::XBreakIterator >& _xBreakIter )
-{
- mpImpl->SetText( _rText, _xBreakIter );
-}
-
-const OUString& SvtScriptedTextHelper::GetText() const
-{
- return mpImpl->GetText();
-}
-
-sal_Int32 SvtScriptedTextHelper::GetTextWidth() const
-{
- return mpImpl->GetTextSize().Width();
-}
-
-sal_Int32 SvtScriptedTextHelper::GetTextHeight() const
-{
- return mpImpl->GetTextSize().Height();
-}
-
-const Size& SvtScriptedTextHelper::GetTextSize() const
-{
- return mpImpl->GetTextSize();
-}
-
-void SvtScriptedTextHelper::DrawText( const Point& _rPos )
-{
- mpImpl->DrawText( _rPos );
-}
-
-
-//_____________________________________________________________________________
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */