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 :
20 : #ifndef INCLUDED_SW_SOURCE_CORE_INC_DRAWFONT_HXX
21 : #define INCLUDED_SW_SOURCE_CORE_INC_DRAWFONT_HXX
22 :
23 : #include <tools/solar.h>
24 : #include <tools/debug.hxx>
25 :
26 : class SwTxtFrm;
27 : class OutputDevice;
28 : class SwViewShell;
29 : class SwScriptInfo;
30 : class Point;
31 : class SwWrongList;
32 : class Size;
33 : class SwFont;
34 : namespace vcl { class Font; }
35 : class SwUnderlineFont;
36 :
37 : // encapsulates information for drawing text
38 274080 : class SwDrawTextInfo
39 : {
40 : const SwTxtFrm* pFrm;
41 : OutputDevice* pOut;
42 : SwViewShell const * pSh;
43 : const SwScriptInfo* pScriptInfo;
44 : Point m_aPos;
45 : OUString m_aText;
46 : const SwWrongList* pWrong;
47 : const SwWrongList* pGrammarCheck;
48 : const SwWrongList* pSmartTags;
49 : Size m_aSize;
50 : SwFont *pFnt;
51 : SwUnderlineFont* pUnderFnt;
52 : sal_Int32* pHyphPos;
53 : long nLeft;
54 : long nRight;
55 : long nKanaDiff;
56 : sal_Int32 nIdx;
57 : sal_Int32 nLen;
58 : sal_Int32 nOfst;
59 : sal_uInt16 nWidth;
60 : sal_uInt16 nAscent;
61 : sal_uInt16 nCompress;
62 : long nSperren;
63 : long nSpace;
64 : long nKern;
65 : sal_Int32 nNumberOfBlanks;
66 : sal_uInt8 nCursorBidiLevel;
67 : bool bBullet : 1;
68 : bool bUpper : 1; // for small caps: upper case flag
69 : bool bDrawSpace : 1; // for small caps: underline/ line through
70 : bool bGreyWave : 1; // grey wave line for extended text input
71 : // For underlining we need to know, if a section is right in front of a
72 : // whole block or a fix margin section.
73 : bool bSpaceStop : 1;
74 : bool bSnapToGrid : 1; // Does paragraph snap to grid?
75 : // Paint text as if text has LTR direction, used for line numbering
76 : bool bIgnoreFrmRTL : 1;
77 : // GetCrsrOfst should not return the next position if screen position is
78 : // inside second half of bound rect, used for Accessibility
79 : bool bPosMatchesBounds :1;
80 :
81 : SwDrawTextInfo(); // prohibited
82 : public:
83 :
84 : #ifdef DBG_UTIL
85 : // These flags should control that the appropriate Set-function has been
86 : // called before calling the Get-function of a member
87 : bool m_bPos : 1;
88 : bool m_bWrong : 1;
89 : bool m_bGrammarCheck : 1;
90 : bool m_bSize : 1;
91 : bool m_bFnt : 1;
92 : bool m_bHyph : 1;
93 : bool m_bLeft : 1;
94 : bool m_bRight : 1;
95 : bool m_bKana : 1;
96 : bool m_bOfst : 1;
97 : bool m_bAscent: 1;
98 : bool m_bSperr : 1;
99 : bool m_bSpace : 1;
100 : bool m_bNumberOfBlanks : 1;
101 : bool m_bUppr : 1;
102 : bool m_bDrawSp: 1;
103 : #endif
104 :
105 274080 : SwDrawTextInfo( SwViewShell const *pS, OutputDevice &rO, const SwScriptInfo* pSI,
106 : const OUString &rSt, sal_Int32 nI, sal_Int32 nL,
107 : sal_uInt16 nW = 0, bool bB = false )
108 274080 : {
109 274080 : pFrm = NULL;
110 274080 : pSh = pS;
111 274080 : pOut = &rO;
112 274080 : pScriptInfo = pSI;
113 274080 : m_aText = rSt;
114 274080 : nIdx = nI;
115 274080 : nLen = nL;
116 274080 : nKern = 0;
117 274080 : nCompress = 0;
118 274080 : nWidth = nW;
119 274080 : nNumberOfBlanks = 0;
120 274080 : nCursorBidiLevel = 0;
121 274080 : bBullet = bB;
122 274080 : pUnderFnt = 0;
123 274080 : bGreyWave = false;
124 274080 : bSpaceStop = false;
125 274080 : bSnapToGrid = false;
126 274080 : bIgnoreFrmRTL = false;
127 274080 : bPosMatchesBounds = false;
128 :
129 : // These values are initialized but have to be set explicitly via their
130 : // Set-function before they may be accessed by their Get-function:
131 274080 : pWrong = 0;
132 274080 : pGrammarCheck = 0;
133 274080 : pSmartTags = 0;
134 274080 : pFnt = 0;
135 274080 : pHyphPos = 0;
136 274080 : nLeft = 0;
137 274080 : nRight = 0;
138 274080 : nKanaDiff = 0;
139 274080 : nOfst = 0;
140 274080 : nAscent = 0;
141 274080 : nSperren = 0;
142 274080 : nSpace = 0;
143 274080 : bUpper = false;
144 274080 : bDrawSpace = false;
145 :
146 : #ifdef DBG_UTIL
147 : // these flags control whether the matching member variables have been
148 : // set by using the Set-function before they may be accessed by their
149 : // Get-function:
150 : m_bPos = m_bWrong = m_bGrammarCheck = m_bSize = m_bFnt = m_bAscent =
151 : m_bSpace = m_bNumberOfBlanks = m_bUppr =
152 : m_bDrawSp = m_bLeft = m_bRight = m_bKana = m_bOfst = m_bHyph =
153 : m_bSperr = false;
154 : #endif
155 274080 : }
156 :
157 823575 : const SwTxtFrm* GetFrm() const
158 : {
159 823575 : return pFrm;
160 : }
161 :
162 274060 : void SetFrm( const SwTxtFrm* pNewFrm )
163 : {
164 274060 : pFrm = pNewFrm;
165 274060 : }
166 :
167 856924 : SwViewShell const *GetShell() const
168 : {
169 856924 : return pSh;
170 : }
171 :
172 1978831 : OutputDevice& GetOut() const
173 : {
174 1978831 : return *pOut;
175 : }
176 :
177 421960 : OutputDevice *GetpOut() const
178 : {
179 421960 : return pOut;
180 : }
181 :
182 44745 : const SwScriptInfo* GetScriptInfo() const
183 : {
184 44745 : return pScriptInfo;
185 : }
186 :
187 135333 : const Point &GetPos() const
188 : {
189 : #ifdef DBG_UTIL
190 : OSL_ENSURE( m_bPos, "DrawTextInfo: Undefined Position" );
191 : #endif
192 135333 : return m_aPos;
193 : }
194 :
195 66605 : sal_Int32 *GetHyphPos() const
196 : {
197 : #ifdef DBG_UTIL
198 : OSL_ENSURE( m_bHyph, "DrawTextInfo: Undefined Hyph Position" );
199 : #endif
200 66605 : return pHyphPos;
201 : }
202 :
203 2965021 : const OUString &GetText() const
204 : {
205 2965021 : return m_aText;
206 : }
207 :
208 52463 : const SwWrongList* GetWrong() const
209 : {
210 : #ifdef DBG_UTIL
211 : OSL_ENSURE( m_bWrong, "DrawTextInfo: Undefined WrongList" );
212 : #endif
213 52463 : return pWrong;
214 : }
215 :
216 44625 : const SwWrongList* GetGrammarCheck() const
217 : {
218 : #ifdef DBG_UTIL
219 : OSL_ENSURE( m_bGrammarCheck, "DrawTextInfo: Undefined GrammarCheck List" );
220 : #endif
221 44625 : return pGrammarCheck;
222 : }
223 :
224 44633 : const SwWrongList* GetSmartTags() const
225 : {
226 44633 : return pSmartTags;
227 : }
228 :
229 6067 : const Size &GetSize() const
230 : {
231 : #ifdef DBG_UTIL
232 : OSL_ENSURE( m_bSize, "DrawTextInfo: Undefined Size" );
233 : #endif
234 6067 : return m_aSize;
235 : }
236 :
237 1326608 : SwFont* GetFont() const
238 : {
239 : #ifdef DBG_UTIL
240 : OSL_ENSURE( m_bFnt, "DrawTextInfo: Undefined Font" );
241 : #endif
242 1326608 : return pFnt;
243 : }
244 :
245 44261 : SwUnderlineFont* GetUnderFnt() const
246 : {
247 44261 : return pUnderFnt;
248 : }
249 :
250 2809913 : sal_Int32 GetIdx() const
251 : {
252 2809913 : return nIdx;
253 : }
254 :
255 1670166 : sal_Int32 GetLen() const
256 : {
257 1670166 : return nLen;
258 : }
259 :
260 6 : sal_Int32 GetOfst() const
261 : {
262 : #ifdef DBG_UTIL
263 : OSL_ENSURE( m_bOfst, "DrawTextInfo: Undefined Offset" );
264 : #endif
265 6 : return nOfst;
266 : }
267 :
268 4 : sal_Int32 GetEnd() const
269 : {
270 4 : return nIdx + nLen;
271 : }
272 :
273 : long GetLeft() const
274 : {
275 : #ifdef DBG_UTIL
276 : OSL_ENSURE( m_bLeft, "DrawTextInfo: Undefined left range" );
277 : #endif
278 : return nLeft;
279 : }
280 :
281 : long GetRight() const
282 : {
283 : #ifdef DBG_UTIL
284 : OSL_ENSURE( m_bRight, "DrawTextInfo: Undefined right range" );
285 : #endif
286 : return nRight;
287 : }
288 :
289 161415 : long GetKanaDiff() const
290 : {
291 : #ifdef DBG_UTIL
292 : OSL_ENSURE( m_bKana, "DrawTextInfo: Undefined kana difference" );
293 : #endif
294 161415 : return nKanaDiff;
295 : }
296 :
297 1328 : sal_uInt16 GetWidth() const
298 : {
299 1328 : return nWidth;
300 : }
301 :
302 459 : sal_uInt16 GetAscent() const
303 : {
304 : #ifdef DBG_UTIL
305 : OSL_ENSURE( m_bAscent, "DrawTextInfo: Undefined Ascent" );
306 : #endif
307 459 : return nAscent;
308 : }
309 :
310 233395 : sal_uInt16 GetKanaComp() const
311 : {
312 233395 : return nCompress;
313 : }
314 :
315 44137 : long GetSperren() const
316 : {
317 : #ifdef DBG_UTIL
318 : OSL_ENSURE( m_bSperr, "DrawTextInfo: Undefined >Sperren<" );
319 : #endif
320 44137 : return nSperren;
321 : }
322 :
323 2610084 : long GetKern() const
324 : {
325 2610084 : return nKern;
326 : }
327 :
328 53619 : long GetSpace() const
329 : {
330 : #ifdef DBG_UTIL
331 : OSL_ENSURE( m_bSpace, "DrawTextInfo: Undefined Spacing" );
332 : #endif
333 53619 : return nSpace;
334 : }
335 :
336 0 : sal_Int32 GetNumberOfBlanks() const
337 : {
338 : #ifdef DBG_UTIL
339 : OSL_ENSURE( m_bNumberOfBlanks, "DrawTextInfo::Undefined NumberOfBlanks" );
340 : #endif
341 0 : return nNumberOfBlanks;
342 : }
343 :
344 6 : sal_uInt8 GetCursorBidiLevel() const
345 : {
346 6 : return nCursorBidiLevel;
347 : }
348 :
349 45221 : bool GetBullet() const
350 : {
351 45221 : return bBullet;
352 : }
353 :
354 3320 : bool GetUpper() const
355 : {
356 : #ifdef DBG_UTIL
357 : OSL_ENSURE( m_bUppr, "DrawTextInfo: Undefined Upperflag" );
358 : #endif
359 3320 : return bUpper;
360 : }
361 :
362 142 : bool GetDrawSpace() const
363 : {
364 : #ifdef DBG_UTIL
365 : OSL_ENSURE( m_bDrawSp, "DrawTextInfo: Undefined DrawSpaceflag" );
366 : #endif
367 142 : return bDrawSpace;
368 : }
369 :
370 44747 : bool GetGreyWave() const
371 : {
372 44747 : return bGreyWave;
373 : }
374 :
375 0 : bool IsSpaceStop() const
376 : {
377 0 : return bSpaceStop;
378 : }
379 :
380 556172 : bool SnapToGrid() const
381 : {
382 556172 : return bSnapToGrid;
383 : }
384 :
385 26 : bool IsIgnoreFrmRTL() const
386 : {
387 26 : return bIgnoreFrmRTL;
388 : }
389 :
390 0 : bool IsPosMatchesBounds() const
391 : {
392 0 : return bPosMatchesBounds;
393 : }
394 :
395 6664 : void SetOut( OutputDevice &rNew )
396 : {
397 6664 : pOut = &rNew;
398 6664 : }
399 :
400 133909 : void SetPos( const Point &rNew )
401 : {
402 133909 : m_aPos = rNew;
403 : #ifdef DBG_UTIL
404 : m_bPos = true;
405 : #endif
406 133909 : }
407 :
408 66609 : void SetHyphPos( sal_Int32 *pNew )
409 : {
410 66609 : pHyphPos = pNew;
411 : #ifdef DBG_UTIL
412 : m_bHyph = true;
413 : #endif
414 66609 : }
415 :
416 165842 : void SetText( const OUString &rNew )
417 : {
418 165842 : m_aText = rNew;
419 165842 : }
420 :
421 43865 : void SetWrong( const SwWrongList* pNew )
422 : {
423 43865 : pWrong = pNew;
424 : #ifdef DBG_UTIL
425 : m_bWrong = true;
426 : #endif
427 43865 : }
428 :
429 43865 : void SetGrammarCheck( const SwWrongList* pNew )
430 : {
431 43865 : pGrammarCheck = pNew;
432 : #ifdef DBG_UTIL
433 : m_bGrammarCheck = true;
434 : #endif
435 43865 : }
436 :
437 43865 : void SetSmartTags( const SwWrongList* pNew )
438 : {
439 43865 : pSmartTags = pNew;
440 43865 : }
441 :
442 3791 : void SetSize( const Size &rNew )
443 : {
444 3791 : m_aSize = rNew;
445 : #ifdef DBG_UTIL
446 : m_bSize = true;
447 : #endif
448 3791 : }
449 :
450 437672 : void SetFont( SwFont* pNew )
451 : {
452 437672 : pFnt = pNew;
453 : #ifdef DBG_UTIL
454 : m_bFnt = true;
455 : #endif
456 437672 : }
457 :
458 3592 : void SetIdx( sal_Int32 nNew )
459 : {
460 3592 : nIdx = nNew;
461 3592 : }
462 :
463 167802 : void SetLen( sal_Int32 nNew )
464 : {
465 167802 : nLen = nNew;
466 167802 : }
467 :
468 6 : void SetOfst( sal_Int32 nNew )
469 : {
470 6 : nOfst = nNew;
471 : #ifdef DBG_UTIL
472 : m_bOfst = true;
473 : #endif
474 6 : }
475 :
476 44001 : void SetLeft( long nNew )
477 : {
478 44001 : nLeft = nNew;
479 : #ifdef DBG_UTIL
480 : m_bLeft = true;
481 : #endif
482 44001 : }
483 :
484 44001 : void SetRight( long nNew )
485 : {
486 44001 : nRight = nNew;
487 : #ifdef DBG_UTIL
488 : m_bRight = true;
489 : #endif
490 44001 : }
491 :
492 167188 : void SetKanaDiff( long nNew )
493 : {
494 167188 : nKanaDiff = nNew;
495 : #ifdef DBG_UTIL
496 : m_bKana = true;
497 : #endif
498 167188 : }
499 :
500 2158 : void SetWidth( sal_uInt16 nNew )
501 : {
502 2158 : nWidth = nNew;
503 2158 : }
504 :
505 459 : void SetAscent( sal_uInt16 nNew )
506 : {
507 459 : nAscent = nNew;
508 : #ifdef DBG_UTIL
509 : m_bAscent = true;
510 : #endif
511 459 : }
512 :
513 372082 : void SetKern( long nNew )
514 : {
515 372082 : nKern = nNew;
516 372082 : }
517 :
518 44333 : void SetSpace( long nNew )
519 : {
520 44333 : if( nNew < 0 )
521 : {
522 0 : nSperren = -nNew;
523 0 : nSpace = 0;
524 : }
525 : else
526 : {
527 44333 : nSpace = nNew;
528 44333 : nSperren = 0;
529 : }
530 : #ifdef DBG_UTIL
531 : m_bSpace = true;
532 : m_bSperr = true;
533 : #endif
534 44333 : }
535 :
536 1514 : void SetNumberOfBlanks( sal_Int32 nNew )
537 : {
538 : #ifdef DBG_UTIL
539 : m_bNumberOfBlanks = true;
540 : #endif
541 1514 : nNumberOfBlanks = nNew;
542 1514 : }
543 :
544 6 : void SetCursorBidiLevel( sal_uInt8 nNew )
545 : {
546 6 : nCursorBidiLevel = nNew;
547 6 : }
548 :
549 273910 : void SetKanaComp( short nNew )
550 : {
551 273910 : nCompress = nNew;
552 273910 : }
553 :
554 924 : void SetBullet( bool bNew )
555 : {
556 924 : bBullet = bNew;
557 924 : }
558 :
559 44093 : void SetUnderFnt( SwUnderlineFont* pULFnt )
560 : {
561 44093 : pUnderFnt = pULFnt;
562 44093 : }
563 :
564 3332 : void SetUpper( bool bNew )
565 : {
566 3332 : bUpper = bNew;
567 : #ifdef DBG_UTIL
568 : m_bUppr = true;
569 : #endif
570 3332 : }
571 :
572 440 : void SetDrawSpace( bool bNew )
573 : {
574 440 : bDrawSpace = bNew;
575 : #ifdef DBG_UTIL
576 : m_bDrawSp = true;
577 : #endif
578 440 : }
579 :
580 43859 : void SetGreyWave( bool bNew )
581 : {
582 43859 : bGreyWave = bNew;
583 43859 : }
584 :
585 43833 : void SetSpaceStop( bool bNew )
586 : {
587 43833 : bSpaceStop = bNew;
588 43833 : }
589 :
590 274060 : void SetSnapToGrid( bool bNew )
591 : {
592 274060 : bSnapToGrid = bNew;
593 274060 : }
594 :
595 148 : void SetIgnoreFrmRTL( bool bNew )
596 : {
597 148 : bIgnoreFrmRTL = bNew;
598 148 : }
599 :
600 6 : void SetPosMatchesBounds( bool bNew )
601 : {
602 6 : bPosMatchesBounds = bNew;
603 6 : }
604 :
605 : void Shift( sal_uInt16 nDir );
606 :
607 : // sets a new color at the output device if necessary if a font is passed
608 : // as argument, the change if made to the font otherwise the font at the
609 : // output device is changed returns if the font has been changed
610 : bool ApplyAutoColor( vcl::Font* pFnt = 0 );
611 : };
612 :
613 : #endif
614 :
615 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|