summaryrefslogtreecommitdiff
path: root/sw/source/core/text/pormulti.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/text/pormulti.hxx')
-rw-r--r--sw/source/core/text/pormulti.hxx268
1 files changed, 268 insertions, 0 deletions
diff --git a/sw/source/core/text/pormulti.hxx b/sw/source/core/text/pormulti.hxx
new file mode 100644
index 000000000000..b292f1163e1d
--- /dev/null
+++ b/sw/source/core/text/pormulti.hxx
@@ -0,0 +1,268 @@
+/*************************************************************************
+ *
+ * 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.
+ *
+ ************************************************************************/
+#ifndef _PORMULTI_HXX
+#define _PORMULTI_HXX
+
+#include "porlay.hxx"
+#include "porexp.hxx"
+
+class SwTxtFormatInfo;
+class SwFldPortion;
+class SwTxtCursor;
+class SwLineLayout;
+class SwTxtPaintInfo;
+class SwTxtAttr;
+class SfxPoolItem;
+class SwFont;
+
+/*-----------------02.02.01 15:01-------------------
+ * SwMultiCreator is a small structur to create a multiportion.
+ * It contains the kind of multiportion and a textattribute
+ * or a poolitem.
+ * The GetMultiCreator-function fills this structur and
+ * the Ctor of the SwMultiPortion uses it.
+ * --------------------------------------------------*/
+
+#define SW_MC_DOUBLE 0
+#define SW_MC_RUBY 1
+#define SW_MC_ROTATE 2
+#define SW_MC_BIDI 3
+
+struct SwMultiCreator
+{
+ const SwTxtAttr* pAttr;
+ const SfxPoolItem* pItem;
+ sal_uInt8 nId;
+ sal_uInt8 nLevel;
+};
+
+/*-----------------25.10.00 16:19-------------------
+ * A two-line-portion (SwMultiPortion) could have surrounding brackets,
+ * in this case the structur SwBracket will be used.
+ * --------------------------------------------------*/
+
+struct SwBracket
+{
+ xub_StrLen nStart; // Start of text attribute determins the font
+ KSHORT nAscent; // Ascent of the brackets
+ KSHORT nHeight; // Height of them
+ KSHORT nPreWidth; // Width of the opening bracket
+ KSHORT nPostWidth; // Width of the closing bracket
+ sal_Unicode cPre; // Initial character, e.g. '('
+ sal_Unicode cPost; // Final character, e.g. ')'
+ sal_uInt8 nPreScript; // Script of the initial character
+ sal_uInt8 nPostScript; // Script of the final character
+};
+
+/*-----------------16.10.00 12:45-------------------
+ * The SwMultiPortion is line portion inside a line portion,
+ * it's a group of portions,
+ * e.g. a double line portion in a line
+ * or phonetics (ruby)
+ * or combined characters
+ * or a rotated portion.
+ * --------------------------------------------------*/
+
+class SwMultiPortion : public SwLinePortion
+{
+ SwLineLayout aRoot; // One or more lines
+ SwFldPortion *pFldRest; // Field rest from the previous line
+ sal_Bool bTab1 :1; // First line tabulator
+ sal_Bool bTab2 :1; // Second line includes tabulator
+ sal_Bool bDouble :1; // Double line
+ sal_Bool bRuby :1; // Phonetics
+ sal_Bool bBidi :1;
+ sal_Bool bTop :1; // Phonetic position
+ sal_Bool bFormatted :1; // Already formatted
+ sal_Bool bFollowFld :1; // Field follow inside
+ sal_uInt8 nDirection:2; // Direction (0/90/180/270 degrees)
+ sal_Bool bFlyInCntnt:1; // Fly as character inside
+protected:
+ SwMultiPortion( xub_StrLen nEnd ) : pFldRest( 0 ), bTab1( sal_False ),
+ bTab2( sal_False ), bDouble( sal_False ), bRuby( sal_False ),
+ bBidi( sal_False ), bFormatted( sal_False ), bFollowFld( sal_False ),
+ nDirection( 0 ), bFlyInCntnt( sal_False )
+ { SetWhichPor( POR_MULTI ); SetLen( nEnd ); }
+ inline void SetDouble() { bDouble = sal_True; }
+ inline void SetRuby() { bRuby = sal_True; }
+ inline void SetBidi() { bBidi = sal_True; }
+ inline void SetTop( sal_Bool bNew ) { bTop = bNew; }
+ inline void SetTab1( sal_Bool bNew ) { bTab1 = bNew; }
+ inline void SetTab2( sal_Bool bNew ) { bTab2 = bNew; }
+ inline void SetDirection( sal_uInt8 nNew ) { nDirection = nNew; }
+ inline sal_Bool GetTab1() const { return bTab1; }
+ inline sal_Bool GetTab2() const { return bTab2; }
+public:
+ ~SwMultiPortion();
+ const SwLineLayout& GetRoot() const { return aRoot; }
+ SwLineLayout& GetRoot() { return aRoot; }
+ SwFldPortion* GetFldRest() { return pFldRest; }
+ void SetFldRest( SwFldPortion* pNew ) { pFldRest = pNew; }
+
+ inline sal_Bool HasTabulator() const { return bTab1 || bTab2; }
+ inline sal_Bool IsFormatted() const { return bFormatted; }
+ inline void SetFormatted() { bFormatted = sal_True; }
+ inline sal_Bool IsFollowFld() const { return bFollowFld; }
+ inline void SetFollowFld() { bFollowFld = sal_True; }
+ inline sal_Bool HasFlyInCntnt() const { return bFlyInCntnt; }
+ inline void SetFlyInCntnt( sal_Bool bNew ) { bFlyInCntnt = bNew; }
+ inline sal_Bool IsDouble() const { return bDouble; }
+ inline sal_Bool IsRuby() const { return bRuby; }
+ inline sal_Bool IsBidi() const { return bBidi; }
+ inline sal_Bool OnTop() const { return bTop; }
+ void ActualizeTabulator();
+
+ virtual void Paint( const SwTxtPaintInfo &rInf ) const;
+ virtual long CalcSpacing( long nSpaceAdd, const SwTxtSizeInfo &rInf ) const;
+ virtual sal_Bool ChgSpaceAdd( SwLineLayout* pCurr, long nSpaceAdd ) const;
+
+ // Summarize the internal lines to calculate the (external) size
+ void CalcSize( SwTxtFormatter& rLine, SwTxtFormatInfo &rInf );
+
+ inline sal_Bool HasBrackets() const;
+ inline sal_Bool HasRotation() const { return 0 != (1 & nDirection); }
+ inline sal_Bool IsRevers() const { return 0 != (2 & nDirection); }
+ inline sal_uInt8 GetDirection() const { return nDirection; }
+ inline sal_uInt16 GetFontRotation() const
+ { return ( HasRotation() ? ( IsRevers() ? 2700 : 900 ) : 0 ); }
+
+ // Accessibility: pass information about this portion to the PortionHandler
+ virtual void HandlePortion( SwPortionHandler& rPH ) const;
+
+ OUTPUT_OPERATOR
+};
+
+class SwDoubleLinePortion : public SwMultiPortion
+{
+ SwBracket* pBracket; // Surrounding brackets
+ SwTwips nLineDiff; // Difference of the width of the both lines
+ xub_StrLen nBlank1; // Number of blanks in the first line
+ xub_StrLen nBlank2; // Number of blanks in the second line
+public:
+ SwDoubleLinePortion( SwDoubleLinePortion& rDouble, xub_StrLen nEnd );
+ SwDoubleLinePortion( const SwMultiCreator& rCreate, xub_StrLen nEnd );
+ ~SwDoubleLinePortion();
+
+ inline SwBracket* GetBrackets() const { return pBracket; }
+ void SetBrackets( const SwDoubleLinePortion& rDouble );
+ void PaintBracket( SwTxtPaintInfo& rInf, long nSpaceAdd, sal_Bool bOpen ) const;
+ void FormatBrackets( SwTxtFormatInfo &rInf, SwTwips& nMaxWidth );
+ inline KSHORT PreWidth() const { return pBracket->nPreWidth; };
+ inline KSHORT PostWidth() const { return pBracket->nPostWidth; }
+ inline void ClearBrackets()
+ { pBracket->nPreWidth = pBracket->nPostWidth=0; Width( 0 ); }
+ inline KSHORT BracketWidth(){ return PreWidth() + PostWidth(); }
+
+ void CalcBlanks( SwTxtFormatInfo &rInf );
+ static void ResetSpaceAdd( SwLineLayout* pCurr );
+ inline SwTwips GetLineDiff() const { return nLineDiff; }
+ inline xub_StrLen GetSpaceCnt() const
+ { return ( nLineDiff < 0 ) ? nBlank2 : nBlank1; }
+ inline xub_StrLen GetSmallerSpaceCnt() const
+ { return ( nLineDiff < 0 ) ? nBlank1 : nBlank2; }
+ inline xub_StrLen GetBlank1() const { return nBlank1; }
+ inline xub_StrLen GetBlank2() const { return nBlank2; }
+
+ virtual long CalcSpacing( long nSpaceAdd, const SwTxtSizeInfo &rInf ) const;
+ virtual sal_Bool ChgSpaceAdd( SwLineLayout* pCurr, long nSpaceAdd ) const;
+};
+
+class SwRubyPortion : public SwMultiPortion
+{
+ xub_StrLen nRubyOffset;
+ sal_uInt16 nAdjustment;
+ void _Adjust( SwTxtFormatInfo &rInf);
+public:
+ SwRubyPortion( const SwRubyPortion& rRuby, xub_StrLen nEnd );
+
+ SwRubyPortion( const SwMultiCreator& rCreate, const SwFont& rFnt,
+ const IDocumentSettingAccess& rIDocumentSettingAccess,
+ xub_StrLen nEnd, xub_StrLen nOffs,
+ const sal_Bool* pForceRubyPos );
+
+ void CalcRubyOffset();
+ inline void Adjust( SwTxtFormatInfo &rInf )
+ { if(nAdjustment && GetRoot().GetNext()) _Adjust(rInf); }
+ inline sal_uInt16 GetAdjustment() const { return nAdjustment; }
+ inline xub_StrLen GetRubyOffset() const { return nRubyOffset; }
+};
+
+class SwRotatedPortion : public SwMultiPortion
+{
+public:
+ SwRotatedPortion( xub_StrLen nEnd, sal_uInt8 nDir = 1 )
+ : SwMultiPortion( nEnd ) { SetDirection( nDir ); }
+ SwRotatedPortion( const SwMultiCreator& rCreate, xub_StrLen nEnd,
+ sal_Bool bRTL );
+};
+
+class SwBidiPortion : public SwMultiPortion
+{
+ sal_uInt8 nLevel;
+
+public:
+ SwBidiPortion( xub_StrLen nEnd, sal_uInt8 nLv );
+
+ inline sal_uInt8 GetLevel() const { return nLevel; }
+ // Get number of blanks for justified alignment
+ xub_StrLen GetSpaceCnt( const SwTxtSizeInfo &rInf ) const;
+ // Calculates extra spacing based on number of blanks
+ virtual long CalcSpacing( long nSpaceAdd, const SwTxtSizeInfo &rInf ) const;
+ // Manipulate the spacing array at pCurr
+ virtual sal_Bool ChgSpaceAdd( SwLineLayout* pCurr, long nSpaceAdd ) const;
+};
+
+// For cursor travelling in multiportions
+
+class SwTxtCursorSave
+{
+ SwTxtCursor* pTxtCrsr;
+ SwLineLayout* pCurr;
+ SwTwips nWidth;
+ xub_StrLen nStart;
+ sal_uInt8 nOldProp;
+ sal_Bool bSpaceChg;
+public:
+ SwTxtCursorSave( SwTxtCursor* pTxtCursor, SwMultiPortion* pMulti,
+ SwTwips nY, sal_uInt16& nX, xub_StrLen nCurrStart, long nSpaceAdd );
+ ~SwTxtCursorSave();
+};
+
+/*************************************************************************
+ * inline - Implementations
+ *************************************************************************/
+
+inline sal_Bool SwMultiPortion::HasBrackets() const
+{
+ return sal::static_int_cast< sal_Bool >( IsDouble() ?
+ 0 != ((SwDoubleLinePortion*)this)->GetBrackets() :
+ sal_False );
+}
+
+CLASSIO( SwMultiPortion )
+
+#endif