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 : class Font;
35 : class SwUnderlineFont;
36 :
37 : // encapsulates information for drawing text
38 0 : class SwDrawTextInfo
39 : {
40 : const SwTxtFrm* pFrm;
41 : OutputDevice* pOut;
42 : SwViewShell* 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 : sal_Bool bBullet : 1;
68 : sal_Bool bUpper : 1; // for small caps: upper case flag
69 : sal_Bool bDrawSpace : 1; // for small caps: underline/ line through
70 : sal_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 : sal_Bool bSpaceStop : 1;
74 : sal_Bool bSnapToGrid : 1; // Does paragraph snap to grid?
75 : // Paint text as if text has LTR direction, used for line numbering
76 : sal_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 : sal_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 0 : SwDrawTextInfo( SwViewShell *pS, OutputDevice &rO, const SwScriptInfo* pSI,
106 : const OUString &rSt, sal_Int32 nI, sal_Int32 nL,
107 : sal_uInt16 nW = 0, sal_Bool bB = sal_False )
108 0 : {
109 0 : pFrm = NULL;
110 0 : pSh = pS;
111 0 : pOut = &rO;
112 0 : pScriptInfo = pSI;
113 0 : m_aText = rSt;
114 0 : nIdx = nI;
115 0 : nLen = nL;
116 0 : nKern = 0;
117 0 : nCompress = 0;
118 0 : nWidth = nW;
119 0 : nNumberOfBlanks = 0;
120 0 : nCursorBidiLevel = 0;
121 0 : bBullet = bB;
122 0 : pUnderFnt = 0;
123 0 : bGreyWave = sal_False;
124 0 : bSpaceStop = sal_False;
125 0 : bSnapToGrid = sal_False;
126 0 : bIgnoreFrmRTL = sal_False;
127 0 : bPosMatchesBounds = sal_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 0 : pWrong = 0;
132 0 : pGrammarCheck = 0;
133 0 : pSmartTags = 0;
134 0 : pFnt = 0;
135 0 : pHyphPos = 0;
136 0 : nLeft = 0;
137 0 : nRight = 0;
138 0 : nKanaDiff = 0;
139 0 : nOfst = 0;
140 0 : nAscent = 0;
141 0 : nSperren = 0;
142 0 : nSpace = 0;
143 0 : bUpper = sal_False;
144 0 : bDrawSpace = sal_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 0 : }
156 :
157 0 : const SwTxtFrm* GetFrm() const
158 : {
159 0 : return pFrm;
160 : }
161 :
162 0 : void SetFrm( const SwTxtFrm* pNewFrm )
163 : {
164 0 : pFrm = pNewFrm;
165 0 : }
166 :
167 0 : SwViewShell *GetShell() const
168 : {
169 0 : return pSh;
170 : }
171 :
172 0 : OutputDevice& GetOut() const
173 : {
174 0 : return *pOut;
175 : }
176 :
177 0 : OutputDevice *GetpOut() const
178 : {
179 0 : return pOut;
180 : }
181 :
182 0 : const SwScriptInfo* GetScriptInfo() const
183 : {
184 0 : return pScriptInfo;
185 : }
186 :
187 0 : const Point &GetPos() const
188 : {
189 : #ifdef DBG_UTIL
190 : OSL_ENSURE( m_bPos, "DrawTextInfo: Undefined Position" );
191 : #endif
192 0 : return m_aPos;
193 : }
194 :
195 0 : sal_Int32 *GetHyphPos() const
196 : {
197 : #ifdef DBG_UTIL
198 : OSL_ENSURE( m_bHyph, "DrawTextInfo: Undefined Hyph Position" );
199 : #endif
200 0 : return pHyphPos;
201 : }
202 :
203 0 : const OUString &GetText() const
204 : {
205 0 : return m_aText;
206 : }
207 :
208 0 : const SwWrongList* GetWrong() const
209 : {
210 : #ifdef DBG_UTIL
211 : OSL_ENSURE( m_bWrong, "DrawTextInfo: Undefined WrongList" );
212 : #endif
213 0 : return pWrong;
214 : }
215 :
216 0 : const SwWrongList* GetGrammarCheck() const
217 : {
218 : #ifdef DBG_UTIL
219 : OSL_ENSURE( m_bGrammarCheck, "DrawTextInfo: Undefined GrammarCheck List" );
220 : #endif
221 0 : return pGrammarCheck;
222 : }
223 :
224 0 : const SwWrongList* GetSmartTags() const
225 : {
226 0 : return pSmartTags;
227 : }
228 :
229 0 : const Size &GetSize() const
230 : {
231 : #ifdef DBG_UTIL
232 : OSL_ENSURE( m_bSize, "DrawTextInfo: Undefined Size" );
233 : #endif
234 0 : return m_aSize;
235 : }
236 :
237 0 : SwFont* GetFont() const
238 : {
239 : #ifdef DBG_UTIL
240 : OSL_ENSURE( m_bFnt, "DrawTextInfo: Undefined Font" );
241 : #endif
242 0 : return pFnt;
243 : }
244 :
245 0 : SwUnderlineFont* GetUnderFnt() const
246 : {
247 0 : return pUnderFnt;
248 : }
249 :
250 0 : sal_Int32 GetIdx() const
251 : {
252 0 : return nIdx;
253 : }
254 :
255 0 : sal_Int32 GetLen() const
256 : {
257 0 : return nLen;
258 : }
259 :
260 0 : sal_Int32 GetOfst() const
261 : {
262 : #ifdef DBG_UTIL
263 : OSL_ENSURE( m_bOfst, "DrawTextInfo: Undefined Offset" );
264 : #endif
265 0 : return nOfst;
266 : }
267 :
268 0 : sal_Int32 GetEnd() const
269 : {
270 0 : 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 0 : long GetKanaDiff() const
290 : {
291 : #ifdef DBG_UTIL
292 : OSL_ENSURE( m_bKana, "DrawTextInfo: Undefined kana difference" );
293 : #endif
294 0 : return nKanaDiff;
295 : }
296 :
297 0 : sal_uInt16 GetWidth() const
298 : {
299 0 : return nWidth;
300 : }
301 :
302 0 : sal_uInt16 GetAscent() const
303 : {
304 : #ifdef DBG_UTIL
305 : OSL_ENSURE( m_bAscent, "DrawTextInfo: Undefined Ascent" );
306 : #endif
307 0 : return nAscent;
308 : }
309 :
310 0 : sal_uInt16 GetKanaComp() const
311 : {
312 0 : return nCompress;
313 : }
314 :
315 0 : long GetSperren() const
316 : {
317 : #ifdef DBG_UTIL
318 : OSL_ENSURE( m_bSperr, "DrawTextInfo: Undefined >Sperren<" );
319 : #endif
320 0 : return nSperren;
321 : }
322 :
323 0 : long GetKern() const
324 : {
325 0 : return nKern;
326 : }
327 :
328 0 : long GetSpace() const
329 : {
330 : #ifdef DBG_UTIL
331 : OSL_ENSURE( m_bSpace, "DrawTextInfo: Undefined Spacing" );
332 : #endif
333 0 : 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 0 : sal_uInt8 GetCursorBidiLevel() const
345 : {
346 0 : return nCursorBidiLevel;
347 : }
348 :
349 0 : sal_Bool GetBullet() const
350 : {
351 0 : return bBullet;
352 : }
353 :
354 0 : sal_Bool GetUpper() const
355 : {
356 : #ifdef DBG_UTIL
357 : OSL_ENSURE( m_bUppr, "DrawTextInfo: Undefined Upperflag" );
358 : #endif
359 0 : return bUpper;
360 : }
361 :
362 0 : sal_Bool GetDrawSpace() const
363 : {
364 : #ifdef DBG_UTIL
365 : OSL_ENSURE( m_bDrawSp, "DrawTextInfo: Undefined DrawSpaceflag" );
366 : #endif
367 0 : return bDrawSpace;
368 : }
369 :
370 0 : sal_Bool GetGreyWave() const
371 : {
372 0 : return bGreyWave;
373 : }
374 :
375 0 : sal_Bool IsSpaceStop() const
376 : {
377 0 : return bSpaceStop;
378 : }
379 :
380 0 : sal_Bool SnapToGrid() const
381 : {
382 0 : return bSnapToGrid;
383 : }
384 :
385 0 : sal_Bool IsIgnoreFrmRTL() const
386 : {
387 0 : return bIgnoreFrmRTL;
388 : }
389 :
390 0 : sal_Bool IsPosMatchesBounds() const
391 : {
392 0 : return bPosMatchesBounds;
393 : }
394 :
395 0 : void SetOut( OutputDevice &rNew )
396 : {
397 0 : pOut = &rNew;
398 0 : }
399 :
400 0 : void SetPos( const Point &rNew )
401 : {
402 0 : m_aPos = rNew;
403 : #ifdef DBG_UTIL
404 : m_bPos = true;
405 : #endif
406 0 : }
407 :
408 0 : void SetHyphPos( sal_Int32 *pNew )
409 : {
410 0 : pHyphPos = pNew;
411 : #ifdef DBG_UTIL
412 : m_bHyph = true;
413 : #endif
414 0 : }
415 :
416 0 : void SetText( const OUString &rNew )
417 : {
418 0 : m_aText = rNew;
419 0 : }
420 :
421 0 : void SetWrong( const SwWrongList* pNew )
422 : {
423 0 : pWrong = pNew;
424 : #ifdef DBG_UTIL
425 : m_bWrong = true;
426 : #endif
427 0 : }
428 :
429 0 : void SetGrammarCheck( const SwWrongList* pNew )
430 : {
431 0 : pGrammarCheck = pNew;
432 : #ifdef DBG_UTIL
433 : m_bGrammarCheck = true;
434 : #endif
435 0 : }
436 :
437 0 : void SetSmartTags( const SwWrongList* pNew )
438 : {
439 0 : pSmartTags = pNew;
440 0 : }
441 :
442 0 : void SetSize( const Size &rNew )
443 : {
444 0 : m_aSize = rNew;
445 : #ifdef DBG_UTIL
446 : m_bSize = true;
447 : #endif
448 0 : }
449 :
450 0 : void SetFont( SwFont* pNew )
451 : {
452 0 : pFnt = pNew;
453 : #ifdef DBG_UTIL
454 : m_bFnt = true;
455 : #endif
456 0 : }
457 :
458 0 : void SetIdx( sal_Int32 nNew )
459 : {
460 0 : nIdx = nNew;
461 0 : }
462 :
463 0 : void SetLen( sal_Int32 nNew )
464 : {
465 0 : nLen = nNew;
466 0 : }
467 :
468 0 : void SetOfst( sal_Int32 nNew )
469 : {
470 0 : nOfst = nNew;
471 : #ifdef DBG_UTIL
472 : m_bOfst = true;
473 : #endif
474 0 : }
475 :
476 0 : void SetLeft( long nNew )
477 : {
478 0 : nLeft = nNew;
479 : #ifdef DBG_UTIL
480 : m_bLeft = true;
481 : #endif
482 0 : }
483 :
484 0 : void SetRight( long nNew )
485 : {
486 0 : nRight = nNew;
487 : #ifdef DBG_UTIL
488 : m_bRight = true;
489 : #endif
490 0 : }
491 :
492 0 : void SetKanaDiff( long nNew )
493 : {
494 0 : nKanaDiff = nNew;
495 : #ifdef DBG_UTIL
496 : m_bKana = true;
497 : #endif
498 0 : }
499 :
500 0 : void SetWidth( sal_uInt16 nNew )
501 : {
502 0 : nWidth = nNew;
503 0 : }
504 :
505 0 : void SetAscent( sal_uInt16 nNew )
506 : {
507 0 : nAscent = nNew;
508 : #ifdef DBG_UTIL
509 : m_bAscent = true;
510 : #endif
511 0 : }
512 :
513 0 : void SetKern( long nNew )
514 : {
515 0 : nKern = nNew;
516 0 : }
517 :
518 0 : void SetSpace( long nNew )
519 : {
520 0 : if( nNew < 0 )
521 : {
522 0 : nSperren = -nNew;
523 0 : nSpace = 0;
524 : }
525 : else
526 : {
527 0 : nSpace = nNew;
528 0 : nSperren = 0;
529 : }
530 : #ifdef DBG_UTIL
531 : m_bSpace = true;
532 : m_bSperr = true;
533 : #endif
534 0 : }
535 :
536 0 : void SetNumberOfBlanks( sal_Int32 nNew )
537 : {
538 : #ifdef DBG_UTIL
539 : m_bNumberOfBlanks = true;
540 : #endif
541 0 : nNumberOfBlanks = nNew;
542 0 : }
543 :
544 0 : void SetCursorBidiLevel( sal_uInt8 nNew )
545 : {
546 0 : nCursorBidiLevel = nNew;
547 0 : }
548 :
549 0 : void SetKanaComp( short nNew )
550 : {
551 0 : nCompress = nNew;
552 0 : }
553 :
554 0 : void SetBullet( sal_Bool bNew )
555 : {
556 0 : bBullet = bNew;
557 0 : }
558 :
559 0 : void SetUnderFnt( SwUnderlineFont* pULFnt )
560 : {
561 0 : pUnderFnt = pULFnt;
562 0 : }
563 :
564 0 : void SetUpper( sal_Bool bNew )
565 : {
566 0 : bUpper = bNew;
567 : #ifdef DBG_UTIL
568 : m_bUppr = true;
569 : #endif
570 0 : }
571 :
572 0 : void SetDrawSpace( sal_Bool bNew )
573 : {
574 0 : bDrawSpace = bNew;
575 : #ifdef DBG_UTIL
576 : m_bDrawSp = true;
577 : #endif
578 0 : }
579 :
580 0 : void SetGreyWave( sal_Bool bNew )
581 : {
582 0 : bGreyWave = bNew;
583 0 : }
584 :
585 0 : void SetSpaceStop( sal_Bool bNew )
586 : {
587 0 : bSpaceStop = bNew;
588 0 : }
589 :
590 0 : void SetSnapToGrid( sal_Bool bNew )
591 : {
592 0 : bSnapToGrid = bNew;
593 0 : }
594 :
595 0 : void SetIgnoreFrmRTL( sal_Bool bNew )
596 : {
597 0 : bIgnoreFrmRTL = bNew;
598 0 : }
599 :
600 0 : void SetPosMatchesBounds( sal_Bool bNew )
601 : {
602 0 : bPosMatchesBounds = bNew;
603 0 : }
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 : sal_Bool ApplyAutoColor( Font* pFnt = 0 );
611 : };
612 :
613 : #endif
614 :
615 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|