xref: /AOO41X/main/sw/source/core/inc/drawfont.hxx (revision 1d2dbeb0b7301723c6d13094e87a8714ef81a328)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #ifndef _DRAWFONT_HXX
24 #define _DRAWFONT_HXX
25 
26 #include <tools/solar.h>
27 #include <tools/string.hxx>
28 #include <errhdl.hxx>
29 
30 class SwTxtFrm;
31 class OutputDevice;
32 class ViewShell;
33 class SwScriptInfo;
34 class Point;
35 class SwWrongList;
36 class Size;
37 class SwFont;
38 class Font;
39 class SwUnderlineFont;
40 
41 /*************************************************************************
42  *                      class SwDrawTextInfo
43  *
44  * encapsulates information for drawing text
45  *************************************************************************/
46 
47 class SwDrawTextInfo
48 {
49     const SwTxtFrm* pFrm;
50     OutputDevice* pOut;
51     ViewShell* pSh;
52     const SwScriptInfo* pScriptInfo;
53     const Point* pPos;
54     const XubString* pText;
55     const SwWrongList* pWrong;
56     const SwWrongList* pGrammarCheck;
57     const SwWrongList* pSmartTags; // SMARTTAGS
58     const Size* pSize;
59     SwFont *pFnt;
60     SwUnderlineFont* pUnderFnt;
61     xub_StrLen* pHyphPos;
62     long nLeft;
63     long nRight;
64     long nKanaDiff;
65     xub_StrLen nIdx;
66     xub_StrLen nLen;
67     xub_StrLen nOfst;
68     sal_uInt16 nWidth;
69     sal_uInt16 nAscent;
70     sal_uInt16 nCompress;
71     long nSperren;
72     long nSpace;
73     long nKern;
74     xub_StrLen nNumberOfBlanks;
75     sal_uInt8 nCursorBidiLevel;
76     sal_Bool bBullet : 1;
77     sal_Bool bUpper : 1;        // Fuer Kapitaelchen: Grossbuchstaben-Flag
78     sal_Bool bDrawSpace : 1;    // Fuer Kapitaelchen: Unter/Durchstreichung
79     sal_Bool bGreyWave  : 1;    // Graue Wellenlinie beim extended TextInput
80     sal_Bool bSpaceStop : 1;    // For underlining we need to know, if a portion
81                             // is right in front of a hole portion or a
82                             // fix margin portion.
83     sal_Bool bSnapToGrid : 1;   // Does paragraph snap to grid?
84     sal_Bool bIgnoreFrmRTL : 1; // Paint text as if text has LTR direction, used for
85                             // line numbering
86     sal_Bool bPosMatchesBounds :1;  // GetCrsrOfst should not return the next
87                                 // position if screen position is inside second
88                                 // half of bound rect, used for Accessibility
89 
90     SwDrawTextInfo();       // nicht zulaessig
91 public:
92 
93 #ifdef DBG_UTIL
94     sal_Bool bPos   : 1;            // These flags should control, that the appropriate
95     sal_Bool bWrong : 1;            // Set-function has been called before calling
96     sal_Bool bGrammarCheck : 1;     //  the Get-function of a member
97     sal_Bool bSize  : 1;
98     sal_Bool bFnt   : 1;
99     sal_Bool bHyph  : 1;
100     sal_Bool bLeft  : 1;
101     sal_Bool bRight : 1;
102     sal_Bool bKana  : 1;
103     sal_Bool bOfst  : 1;
104     sal_Bool bAscent: 1;
105     sal_Bool bSperr : 1;
106     sal_Bool bSpace : 1;
107     sal_Bool bNumberOfBlanks : 1;
108     sal_Bool bUppr  : 1;
109     sal_Bool bDrawSp: 1;
110 #endif
111 
SwDrawTextInfo(ViewShell * pS,OutputDevice & rO,const SwScriptInfo * pSI,const XubString & rSt,xub_StrLen nI,xub_StrLen nL,sal_uInt16 nW=0,sal_Bool bB=sal_False)112     SwDrawTextInfo( ViewShell *pS, OutputDevice &rO, const SwScriptInfo* pSI,
113                     const XubString &rSt, xub_StrLen nI, xub_StrLen nL,
114                     sal_uInt16 nW = 0, sal_Bool bB = sal_False )
115     {
116         pFrm = NULL;
117         pSh = pS;
118         pOut = &rO;
119         pScriptInfo = pSI;
120         pText = &rSt;
121         nIdx = nI;
122         nLen = nL;
123         nKern = 0;
124         nCompress = 0;
125         nWidth = nW;
126         nNumberOfBlanks = 0;
127         nCursorBidiLevel = 0;
128         bBullet = bB;
129         pUnderFnt = 0;
130         bGreyWave = sal_False;
131         bSpaceStop = sal_False;
132         bSnapToGrid = sal_False;
133         bIgnoreFrmRTL = sal_False;
134         bPosMatchesBounds = sal_False;
135 
136         // These values are initialized but, they have to be
137         // set explicitly via their Set-function before they may
138         // be accessed by their Get-function:
139         pPos = 0;
140         pWrong = 0;
141         pGrammarCheck = 0;
142         pSmartTags = 0;
143         pSize = 0;
144         pFnt = 0;
145         pHyphPos = 0;
146         nLeft = 0;
147         nRight = 0;
148         nKanaDiff = 0;
149         nOfst = 0;
150         nAscent = 0;
151         nSperren = 0;
152         nSpace = 0;
153         bUpper = sal_False;
154         bDrawSpace = sal_False;
155 
156 #ifdef DBG_UTIL
157         // these flags control, whether the matching member variables have
158         // been set by using the Set-function before they may be accessed
159         // by their Get-function:
160         bPos = bWrong = bGrammarCheck = bSize = bFnt = bAscent = bSpace = bNumberOfBlanks = bUppr =
161         bDrawSp = bLeft = bRight = bKana = bOfst = bHyph = bSperr = sal_False;
162 #endif
163     }
164 
GetFrm() const165     const SwTxtFrm* GetFrm() const
166     {
167         return pFrm;
168     }
169 
SetFrm(const SwTxtFrm * pNewFrm)170     void SetFrm( const SwTxtFrm* pNewFrm )
171     {
172         pFrm = pNewFrm;
173     }
174 
GetShell() const175     ViewShell *GetShell() const
176     {
177         return pSh;
178     }
179 
GetOut() const180     OutputDevice& GetOut() const
181     {
182         return *pOut;
183     }
184 
GetpOut() const185     OutputDevice *GetpOut() const
186     {
187         return pOut;
188     }
189 
GetScriptInfo() const190     const SwScriptInfo* GetScriptInfo() const
191     {
192         return pScriptInfo;
193     }
194 
GetPos() const195     const Point &GetPos() const
196     {
197         ASSERT( bPos, "DrawTextInfo: Undefined Position" );
198         return *pPos;
199     }
200 
GetHyphPos() const201     xub_StrLen *GetHyphPos() const
202     {
203         ASSERT( bHyph, "DrawTextInfo: Undefined Hyph Position" );
204         return pHyphPos;
205     }
206 
GetText() const207     const XubString &GetText() const
208     {
209         return *pText;
210     }
211 
GetWrong() const212     const SwWrongList* GetWrong() const
213     {
214         ASSERT( bWrong, "DrawTextInfo: Undefined WrongList" );
215         return pWrong;
216     }
217 
GetGrammarCheck() const218     const SwWrongList* GetGrammarCheck() const
219     {
220         ASSERT( bGrammarCheck, "DrawTextInfo: Undefined GrammarCheck List" );
221         return pGrammarCheck;
222     }
223 
GetSmartTags() const224     const SwWrongList* GetSmartTags() const
225     {
226         return pSmartTags;
227     }
228 
GetSize() const229     const Size &GetSize() const
230     {
231         ASSERT( bSize, "DrawTextInfo: Undefined Size" );
232         return *pSize;
233     }
234 
GetFont() const235     SwFont* GetFont() const
236     {
237         ASSERT( bFnt, "DrawTextInfo: Undefined Font" );
238         return pFnt;
239     }
240 
GetUnderFnt() const241     SwUnderlineFont* GetUnderFnt() const
242     {
243         return pUnderFnt;
244     }
245 
GetIdx() const246     xub_StrLen GetIdx() const
247     {
248         return nIdx;
249     }
250 
GetLen() const251     xub_StrLen GetLen() const
252     {
253         return nLen;
254     }
255 
GetOfst() const256     xub_StrLen GetOfst() const
257     {
258         ASSERT( bOfst, "DrawTextInfo: Undefined Offset" );
259         return nOfst;
260     }
261 
GetEnd() const262     xub_StrLen GetEnd() const
263     {
264         return nIdx + nLen;
265     }
266 
GetLeft() const267     long GetLeft() const
268     {
269         ASSERT( bLeft, "DrawTextInfo: Undefined left range" );
270         return nLeft;
271     }
272 
GetRight() const273     long GetRight() const
274     {
275         ASSERT( bRight, "DrawTextInfo: Undefined right range" );
276         return nRight;
277     }
278 
GetKanaDiff() const279     long GetKanaDiff() const
280     {
281         ASSERT( bKana, "DrawTextInfo: Undefined kana difference" );
282         return nKanaDiff;
283     }
284 
GetWidth() const285     sal_uInt16 GetWidth() const
286     {
287         return nWidth;
288     }
289 
GetAscent() const290     sal_uInt16 GetAscent() const
291     {
292         ASSERT( bAscent, "DrawTextInfo: Undefined Ascent" );
293         return nAscent;
294     }
295 
GetKanaComp() const296     sal_uInt16 GetKanaComp() const
297     {
298         return nCompress;
299     }
300 
GetSperren() const301     long GetSperren() const
302     {
303         ASSERT( bSperr, "DrawTextInfo: Undefined >Sperren<" );
304         return nSperren;
305     }
306 
GetKern() const307     long GetKern() const
308     {
309         return nKern;
310     }
311 
GetSpace() const312     long GetSpace() const
313     {
314         ASSERT( bSpace, "DrawTextInfo: Undefined Spacing" );
315         return nSpace;
316     }
317 
GetNumberOfBlanks() const318     xub_StrLen GetNumberOfBlanks() const
319     {
320         ASSERT( bNumberOfBlanks, "DrawTextInfo::Undefined NumberOfBlanks" );
321         return nNumberOfBlanks;
322     }
323 
GetCursorBidiLevel() const324     sal_uInt8 GetCursorBidiLevel() const
325     {
326         return nCursorBidiLevel;
327     }
328 
GetBullet() const329     sal_Bool GetBullet() const
330     {
331         return bBullet;
332     }
333 
GetUpper() const334     sal_Bool GetUpper() const
335     {
336         ASSERT( bUppr, "DrawTextInfo: Undefined Upperflag" );
337         return bUpper;
338     }
339 
GetDrawSpace() const340     sal_Bool GetDrawSpace() const
341     {
342         ASSERT( bDrawSp, "DrawTextInfo: Undefined DrawSpaceflag" );
343         return bDrawSpace;
344     }
345 
GetGreyWave() const346     sal_Bool GetGreyWave() const
347     {
348         return bGreyWave;
349     }
350 
IsSpaceStop() const351     sal_Bool IsSpaceStop() const
352     {
353         return bSpaceStop;
354     }
355 
SnapToGrid() const356     sal_Bool SnapToGrid() const
357     {
358         return bSnapToGrid;
359     }
360 
IsIgnoreFrmRTL() const361     sal_Bool IsIgnoreFrmRTL() const
362     {
363         return bIgnoreFrmRTL;
364     }
365 
IsPosMatchesBounds() const366     sal_Bool IsPosMatchesBounds() const
367     {
368         return bPosMatchesBounds;
369     }
370 
SetOut(OutputDevice & rNew)371     void SetOut( OutputDevice &rNew )
372     {
373         pOut = &rNew;
374     }
375 
SetPos(const Point & rNew)376     void SetPos( const Point &rNew )
377     {
378         pPos = &rNew;
379 #ifdef DBG_UTIL
380         bPos = sal_True;
381 #endif
382     }
383 
SetHyphPos(xub_StrLen * pNew)384     void SetHyphPos( xub_StrLen *pNew )
385     {
386         pHyphPos = pNew;
387 #ifdef DBG_UTIL
388         bHyph = sal_True;
389 #endif
390     }
391 
SetText(const XubString & rNew)392     void SetText( const XubString &rNew )
393     {
394         pText = &rNew;
395     }
396 
SetWrong(const SwWrongList * pNew)397     void SetWrong( const SwWrongList* pNew )
398     {
399         pWrong = pNew;
400 #ifdef DBG_UTIL
401         bWrong = sal_True;
402 #endif
403     }
404 
SetGrammarCheck(const SwWrongList * pNew)405     void SetGrammarCheck( const SwWrongList* pNew )
406     {
407         pGrammarCheck = pNew;
408 #ifdef DBG_UTIL
409         bGrammarCheck = sal_True;
410 #endif
411     }
412 
SetSmartTags(const SwWrongList * pNew)413     void SetSmartTags( const SwWrongList* pNew )
414     {
415         pSmartTags = pNew;
416     }
417 
SetSize(const Size & rNew)418     void SetSize( const Size &rNew )
419     {
420         pSize = &rNew;
421 #ifdef DBG_UTIL
422         bSize = sal_True;
423 #endif
424     }
425 
SetFont(SwFont * pNew)426     void SetFont( SwFont* pNew )
427     {
428         pFnt = pNew;
429 #ifdef DBG_UTIL
430         bFnt = sal_True;
431 #endif
432     }
433 
SetIdx(xub_StrLen nNew)434     void SetIdx( xub_StrLen nNew )
435     {
436         nIdx = nNew;
437     }
438 
SetLen(xub_StrLen nNew)439     void SetLen( xub_StrLen nNew )
440     {
441         nLen = nNew;
442     }
443 
SetOfst(xub_StrLen nNew)444     void SetOfst( xub_StrLen nNew )
445     {
446         nOfst = nNew;
447 #ifdef DBG_UTIL
448         bOfst = sal_True;
449 #endif
450     }
451 
SetLeft(long nNew)452     void SetLeft( long nNew )
453     {
454         nLeft = nNew;
455 #ifdef DBG_UTIL
456         bLeft = sal_True;
457 #endif
458     }
459 
SetRight(long nNew)460     void SetRight( long nNew )
461     {
462         nRight = nNew;
463 #ifdef DBG_UTIL
464         bRight = sal_True;
465 #endif
466     }
467 
SetKanaDiff(long nNew)468     void SetKanaDiff( long nNew )
469     {
470         nKanaDiff = nNew;
471 #ifdef DBG_UTIL
472         bKana = sal_True;
473 #endif
474     }
475 
SetWidth(sal_uInt16 nNew)476     void SetWidth( sal_uInt16 nNew )
477     {
478         nWidth = nNew;
479     }
480 
SetAscent(sal_uInt16 nNew)481     void SetAscent( sal_uInt16 nNew )
482     {
483         nAscent = nNew;
484 #ifdef DBG_UTIL
485         bAscent = sal_True;
486 #endif
487     }
488 
SetKern(long nNew)489     void SetKern( long nNew )
490     {
491         nKern = nNew;
492     }
493 
SetSpace(long nNew)494     void SetSpace( long nNew )
495     {
496         if( nNew < 0 )
497         {
498             nSperren = -nNew;
499             nSpace = 0;
500         }
501         else
502         {
503             nSpace = nNew;
504             nSperren = 0;
505         }
506 #ifdef DBG_UTIL
507         bSpace = sal_True;
508         bSperr = sal_True;
509 #endif
510     }
511 
SetNumberOfBlanks(xub_StrLen nNew)512     void SetNumberOfBlanks( xub_StrLen nNew )
513     {
514 #ifdef DBG_UTIL
515         bNumberOfBlanks = sal_True;
516 #endif
517         nNumberOfBlanks = nNew;
518     }
519 
SetCursorBidiLevel(sal_uInt8 nNew)520     void SetCursorBidiLevel( sal_uInt8 nNew )
521     {
522         nCursorBidiLevel = nNew;
523     }
524 
SetKanaComp(short nNew)525     void SetKanaComp( short nNew )
526     {
527         nCompress = nNew;
528     }
529 
SetBullet(sal_Bool bNew)530     void SetBullet( sal_Bool bNew )
531     {
532         bBullet = bNew;
533     }
534 
SetUnderFnt(SwUnderlineFont * pULFnt)535     void SetUnderFnt( SwUnderlineFont* pULFnt )
536     {
537         pUnderFnt = pULFnt;
538     }
539 
SetUpper(sal_Bool bNew)540     void SetUpper( sal_Bool bNew )
541     {
542         bUpper = bNew;
543 #ifdef DBG_UTIL
544         bUppr = sal_True;
545 #endif
546     }
547 
SetDrawSpace(sal_Bool bNew)548     void SetDrawSpace( sal_Bool bNew )
549     {
550         bDrawSpace = bNew;
551 #ifdef DBG_UTIL
552         bDrawSp = sal_True;
553 #endif
554     }
555 
SetGreyWave(sal_Bool bNew)556     void SetGreyWave( sal_Bool bNew )
557     {
558         bGreyWave = bNew;
559     }
560 
SetSpaceStop(sal_Bool bNew)561     void SetSpaceStop( sal_Bool bNew )
562     {
563         bSpaceStop = bNew;
564     }
565 
SetSnapToGrid(sal_Bool bNew)566     void SetSnapToGrid( sal_Bool bNew )
567     {
568         bSnapToGrid = bNew;
569     }
570 
SetIgnoreFrmRTL(sal_Bool bNew)571     void SetIgnoreFrmRTL( sal_Bool bNew )
572     {
573         bIgnoreFrmRTL = bNew;
574     }
575 
SetPosMatchesBounds(sal_Bool bNew)576     void SetPosMatchesBounds( sal_Bool bNew )
577     {
578         bPosMatchesBounds = bNew;
579     }
580 
581     void Shift( sal_uInt16 nDir );
582 
583     // sets a new color at the output device if necessary
584     // if a font is passed as argument, the change if made to the font
585     // otherwise the font at the output device is changed
586     // returns if the font has been changed
587     sal_Bool ApplyAutoColor( Font* pFnt = 0 );
588 };
589 
590 #endif
591