Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 : #ifndef _PORLIN_HXX
20 : #define _PORLIN_HXX
21 :
22 : #include "possiz.hxx" // SwPosSize
23 :
24 : #ifdef DBG_UTIL
25 : #include <libxml/xmlwriter.h>
26 : #endif
27 :
28 : class XubString;
29 : class SwTxtSizeInfo;
30 : class SwTxtPaintInfo;
31 : class SwTxtFormatInfo;
32 : class SwPortionHandler;
33 :
34 : // The portions output operators are virtual methods of the portion.
35 : // The CLASSIO macro implements the 'levitating' function.
36 : // In doing so we end up with both benefits: virtual output operators and general utility
37 : #ifdef DBG_UTIL
38 : #define OUTPUT_OPERATOR virtual SvStream &operator<<( SvStream & aOs ) const;
39 : #else
40 : #define OUTPUT_OPERATOR
41 : #endif
42 :
43 : // Portion groups
44 : #define PORGRP_TXT 0x8000
45 : #define PORGRP_EXP 0x4000
46 : #define PORGRP_FLD 0x2000
47 : #define PORGRP_HYPH 0x1000
48 : #define PORGRP_NUMBER 0x0800
49 : #define PORGRP_GLUE 0x0400
50 : #define PORGRP_FIX 0x0200
51 : #define PORGRP_TAB 0x0100
52 : #define PORGRP_NOTRECY 0x0080
53 : // Small special groups
54 : #define PORGRP_FIXMARG 0x0040
55 : //#define PORGRP_? 0x0020
56 : #define PORGRP_TABNOTLFT 0x0010
57 : #define PORGRP_TOXREF 0x0008
58 :
59 : /*************************************************************************
60 : * class SwLinePortion
61 : *************************************************************************/
62 :
63 : /// Base class for anything that can be part of a line in the Writer layout.
64 : class SwLinePortion: public SwPosSize
65 : {
66 : protected:
67 : // Here we have areas with different attributes
68 : SwLinePortion *pPortion;
69 : // Count of chars and spaces on the line
70 : xub_StrLen nLineLength;
71 : KSHORT nAscent; // Maximum ascender
72 :
73 : SwLinePortion();
74 : private:
75 : MSHORT nWhichPor; // Who's who?
76 :
77 : void _Truncate();
78 :
79 : public:
80 : inline SwLinePortion(const SwLinePortion &rPortion);
81 : virtual ~SwLinePortion();
82 :
83 : // Access methods
84 23388 : inline SwLinePortion *GetPortion() const { return( pPortion ); }
85 : inline SwLinePortion &operator=(const SwLinePortion &rPortion);
86 : inline bool operator==( const SwLinePortion &rPortion ) const;
87 41376 : inline xub_StrLen GetLen() const { return nLineLength; }
88 3510 : inline void SetLen( const xub_StrLen nLen ) { nLineLength = nLen; }
89 2782 : inline void SetPortion( SwLinePortion *pNew ){ pPortion = pNew; }
90 11227 : inline KSHORT &GetAscent() { return nAscent; }
91 7532 : inline KSHORT GetAscent() const { return nAscent; }
92 3113 : inline void SetAscent( const KSHORT nNewAsc ) { nAscent = nNewAsc; }
93 374 : inline void PrtWidth( KSHORT nNewWidth ) { Width( nNewWidth ); }
94 3304 : inline KSHORT PrtWidth() const { return Width(); }
95 703 : inline void AddPrtWidth( const KSHORT nNew ) { Width( Width() + nNew ); }
96 19 : inline void SubPrtWidth( const KSHORT nNew ) { Width( Width() - nNew ); }
97 :
98 : inline const SwPosSize &PrtSize() const { return *this; }
99 :
100 : // Insert methods
101 : virtual SwLinePortion *Insert( SwLinePortion *pPortion );
102 : virtual SwLinePortion *Append( SwLinePortion *pPortion );
103 : SwLinePortion *Cut( SwLinePortion *pVictim );
104 : inline void Truncate();
105 :
106 : // Returns 0, if there's no payload
107 : virtual SwLinePortion *Compress();
108 :
109 3685 : inline void SetWhichPor( const MSHORT nNew ) { nWhichPor = nNew; }
110 232 : inline MSHORT GetWhichPor( ) const { return nWhichPor; }
111 :
112 : // Group queries
113 6979 : inline sal_Bool InTxtGrp( ) const { return nWhichPor & PORGRP_TXT ? sal_True : sal_False; }
114 6 : inline sal_Bool InGlueGrp( ) const { return nWhichPor & PORGRP_GLUE ? sal_True : sal_False;}
115 3369 : inline sal_Bool InTabGrp( ) const { return nWhichPor & PORGRP_TAB ? sal_True : sal_False; }
116 2033 : inline sal_Bool InHyphGrp( ) const { return nWhichPor & PORGRP_HYPH ? sal_True : sal_False;}
117 2940 : inline sal_Bool InNumberGrp( )const { return nWhichPor & PORGRP_NUMBER ? sal_True : sal_False;}
118 0 : inline sal_Bool InFixGrp( ) const { return nWhichPor & PORGRP_FIX ? sal_True : sal_False; }
119 8750 : inline sal_Bool InFldGrp( ) const { return nWhichPor & PORGRP_FLD ? sal_True : sal_False; }
120 0 : inline sal_Bool InToxRefGrp( ) const { return nWhichPor & PORGRP_TOXREF ? sal_True : sal_False; }
121 0 : inline sal_Bool InToxRefOrFldGrp( ) const { return nWhichPor &
122 0 : ( PORGRP_FLD | PORGRP_TOXREF ) ? sal_True : sal_False; }
123 1184 : inline sal_Bool InExpGrp( ) const { return nWhichPor & PORGRP_EXP ? sal_True : sal_False; }
124 : inline sal_Bool InTabnLftGrp( ) const
125 : { return nWhichPor & PORGRP_TABNOTLFT ? sal_True : sal_False; }
126 3245 : inline sal_Bool InFixMargGrp( )const
127 3245 : { return nWhichPor & PORGRP_FIXMARG ? sal_True : sal_False; }
128 3593 : inline sal_Bool InSpaceGrp( )const
129 3593 : { return InTxtGrp() || IsMultiPortion(); }
130 : // Individual queries
131 3297 : inline sal_Bool IsGrfNumPortion( )const{ return nWhichPor == POR_GRFNUM; }
132 10672 : inline sal_Bool IsFlyCntPortion( )const{ return nWhichPor == POR_FLYCNT; }
133 449 : inline sal_Bool IsBlankPortion( ) const{ return nWhichPor == POR_BLANK; }
134 7205 : inline sal_Bool IsBreakPortion( ) const{ return nWhichPor == POR_BRK; }
135 60 : inline sal_Bool IsErgoSumPortion()const{ return nWhichPor == POR_ERGOSUM;}
136 2221 : inline sal_Bool IsQuoVadisPortion()const{ return nWhichPor==POR_QUOVADIS;}
137 : inline sal_Bool IsTabCntPortion( )const{ return nWhichPor==POR_TABCENTER;}
138 : inline sal_Bool IsTabDecimalPortion() const { return nWhichPor == POR_TABDECIMAL;}
139 67 : inline sal_Bool IsTabLeftPortion()const{ return nWhichPor == POR_TABLEFT;}
140 116 : inline sal_Bool IsFtnNumPortion( )const{ return nWhichPor == POR_FTNNUM; }
141 1941 : inline sal_Bool IsFtnPortion( ) const{ return nWhichPor == POR_FTN; }
142 : inline sal_Bool IsTmpEndPortion( )const{ return nWhichPor == POR_TMPEND; }
143 5275 : inline sal_Bool IsDropPortion( ) const{ return nWhichPor == POR_DROP; }
144 0 : inline sal_Bool IsLayPortion( ) const{ return nWhichPor == POR_LAY; }
145 0 : inline sal_Bool IsParaPortion( ) const{ return nWhichPor == POR_PARA; }
146 3326 : inline sal_Bool IsMarginPortion( )const{ return nWhichPor == POR_MARGIN; }
147 6072 : inline sal_Bool IsFlyPortion( ) const{ return nWhichPor == POR_FLY; }
148 420 : inline sal_Bool IsHolePortion( ) const{ return nWhichPor == POR_HOLE; }
149 0 : inline sal_Bool IsSoftHyphPortion()const{ return nWhichPor==POR_SOFTHYPH;}
150 4283 : inline sal_Bool IsPostItsPortion()const{ return nWhichPor == POR_POSTITS;}
151 0 : inline sal_Bool IsCombinedPortion()const{ return nWhichPor==POR_COMBINED;}
152 296 : inline sal_Bool IsTextPortion( ) const{ return nWhichPor == POR_TXT; }
153 : inline sal_Bool IsURLPortion( ) const{ return nWhichPor == POR_URL; }
154 1611 : inline sal_Bool IsHangingPortion( ) const{ return nWhichPor == POR_HNG; }
155 869 : inline sal_Bool IsKernPortion( ) const{ return nWhichPor == POR_KERN; }
156 775 : inline sal_Bool IsArrowPortion( ) const{ return nWhichPor == POR_ARROW; }
157 12423 : inline sal_Bool IsMultiPortion( ) const{ return nWhichPor == POR_MULTI; }
158 142 : inline sal_Bool IsNumberPortion( ) const{ return nWhichPor == POR_NUMBER; } // #i23726#
159 0 : inline sal_Bool IsControlCharPortion() const { return nWhichPor == POR_CONTROLCHAR; }
160 :
161 : // Positioning
162 : SwLinePortion *FindPrevPortion( const SwLinePortion *pRoot );
163 : SwLinePortion *FindLastPortion();
164 :
165 : virtual xub_StrLen GetCrsrOfst( const KSHORT nOfst ) const;
166 : virtual SwPosSize GetTxtSize( const SwTxtSizeInfo &rInfo ) const;
167 : void CalcTxtSize( const SwTxtSizeInfo &rInfo );
168 :
169 : // Output
170 : virtual void Paint( const SwTxtPaintInfo &rInf ) const = 0;
171 : void PrePaint( const SwTxtPaintInfo &rInf, const SwLinePortion *pLast ) const;
172 :
173 : virtual sal_Bool Format( SwTxtFormatInfo &rInf );
174 : // Is called for the line's last portion
175 : virtual void FormatEOL( SwTxtFormatInfo &rInf );
176 : void Move( SwTxtPaintInfo &rInf );
177 :
178 : // For SwTxtSlot
179 : virtual sal_Bool GetExpTxt( const SwTxtSizeInfo &rInf, XubString &rTxt ) const;
180 :
181 : // For SwFldPortion, SwSoftHyphPortion
182 : virtual KSHORT GetViewWidth( const SwTxtSizeInfo &rInf ) const;
183 :
184 : // for text- and multi-portions
185 : virtual long CalcSpacing( long nSpaceAdd, const SwTxtSizeInfo &rInf ) const;
186 :
187 : // Accessibility: pass information about this portion to the PortionHandler
188 : virtual void HandlePortion( SwPortionHandler& rPH ) const;
189 :
190 : OUTPUT_OPERATOR
191 : };
192 :
193 :
194 : /*************************************************************************
195 : * inline - Implementations
196 : *************************************************************************/
197 :
198 0 : inline SwLinePortion &SwLinePortion::operator=(const SwLinePortion &rPortion)
199 : {
200 0 : *(SwPosSize*)this = rPortion;
201 0 : nLineLength = rPortion.nLineLength;
202 0 : nAscent = rPortion.nAscent;
203 0 : nWhichPor = rPortion.nWhichPor;
204 0 : return *this;
205 : }
206 :
207 : inline bool SwLinePortion::operator==(const SwLinePortion &rPortion ) const
208 : {
209 : return( Height() == rPortion.Height() &&
210 : Width() == rPortion.Width() &&
211 : nLineLength == rPortion.GetLen() &&
212 : nAscent == rPortion.GetAscent() );
213 : }
214 :
215 61 : inline SwLinePortion::SwLinePortion(const SwLinePortion &rPortion) :
216 : SwPosSize( rPortion ),
217 : pPortion( 0 ),
218 : nLineLength( rPortion.nLineLength ),
219 : nAscent( rPortion.nAscent ),
220 61 : nWhichPor( rPortion.nWhichPor )
221 : {
222 61 : }
223 :
224 1577 : inline void SwLinePortion::Truncate()
225 : {
226 1577 : if ( pPortion )
227 266 : _Truncate();
228 1577 : }
229 :
230 :
231 : //$ ostream
232 : #define CLASSIO( class )
233 :
234 : CLASSIO( SwLinePortion )
235 :
236 : #endif
237 :
238 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|