kpresenter

KPrUtils.cpp
1/* This file is part of the KDE project
2 Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@kde.org>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details.
13
14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18*/
19
20#include "KPrUtils.h"
21
22#include "KPrObject.h"
23#include "KPrGroupObject.h"
24#include "KPrFreehandObject.h"
25#include "KPrPolylineObject.h"
26#include "KPrBezierCurveObject.h"
27#include "KPrPieObject.h"
28
29#include <KoXmlNS.h>
30#include <KoTextZoomHandler.h>
31#include <KoPoint.h>
32
33#include <tqpainter.h>
34#include <tqpointarray.h>
35#include <tqpoint.h>
36#include <tqcolor.h>
37#include <tqsize.h>
38#include <tqbitmap.h>
39#include <tqcursor.h>
40#include <tqdatetime.h>
41#include <tqdom.h>
42
43void drawFigure( LineEnd figure, TQPainter* painter, const KoPoint &coord, const TQColor &color,
44 int _w, float angle, KoZoomHandler* _zoomHandler)
45{
46 painter->save();
47 painter->setPen( TQt::NoPen );
48 painter->setBrush( TQt::NoBrush );
49
50 switch ( figure )
51 {
52 case L_SQUARE:
53 {
54 int _h = _w;
55 if ( _h % 2 == 0 ) _h--;
56 painter->translate( _zoomHandler->zoomItX(coord.x()), _zoomHandler->zoomItY( coord.y()) );
57 painter->rotate( angle );
58 painter->scale( 1, 1 );
59 painter->fillRect( _zoomHandler->zoomItX( -6 - _w ),
60 _zoomHandler->zoomItY( -3 - _h / 2),
61 _zoomHandler->zoomItX( 6 + _w),
62 _zoomHandler->zoomItY( 6 + _h), color );
63 } break;
64 case L_CIRCLE:
65 {
66 painter->translate( _zoomHandler->zoomItX(coord.x()), _zoomHandler->zoomItY(coord.y()) );
67 painter->rotate( angle );
68 painter->setBrush( color );
69 painter->drawEllipse( _zoomHandler->zoomItX( -6 - _w ),
70 _zoomHandler->zoomItY( -3 - _w / 2 ),
71 _zoomHandler->zoomItX( 6 + _w),
72 _zoomHandler->zoomItY(6 + _w) );
73 } break;
74 case L_ARROW:
75 {
76 KoPoint p1( -10 - _w, -3 - _w / 2 );
77 KoPoint p2( 0 , 0 );
78 KoPoint p3( -10 - _w, 3 + _w / 2 );
79 TQPointArray pArray( 3 );
80 pArray.setPoint( 0, _zoomHandler->zoomPoint(p1) );
81 pArray.setPoint( 1, _zoomHandler->zoomPoint(p2) );
82 pArray.setPoint( 2, _zoomHandler->zoomPoint(p3) );
83
84 painter->translate( _zoomHandler->zoomItX(coord.x()),_zoomHandler->zoomItY( coord.y()) );
85 painter->rotate( angle );
86 painter->scale( 1, 1 );
87 painter->setBrush( color );
88 painter->drawPolygon( pArray );
89 } break;
90 case L_LINE_ARROW:
91 {
92 painter->translate( _zoomHandler->zoomItX(coord.x()),_zoomHandler->zoomItY( coord.y()) );
93 painter->setPen( TQPen(color , _zoomHandler->zoomItX( _w )) );
94 painter->rotate( angle );
95 painter->scale( 1, 1 );
96 TQPoint p1( _zoomHandler->zoomItX(-10 - _w), _zoomHandler->zoomItY(-3 - _w / 2) );
97 TQPoint p2( _zoomHandler->zoomItX(0), _zoomHandler->zoomItY(0) );
98 TQPoint p3( _zoomHandler->zoomItX(-10 - _w), _zoomHandler->zoomItY(3 + _w / 2) );
99 painter->drawLine( p2, p1);
100 painter->drawLine( p2, p3);
101 }break;
102 case L_DIMENSION_LINE:
103 {
104 painter->translate( _zoomHandler->zoomItX(coord.x()),_zoomHandler->zoomItY( coord.y()) );
105 painter->setPen( TQPen(color , _zoomHandler->zoomItX( _w )) );
106 painter->rotate( angle );
107 painter->scale( 1, 1 );
108 TQPoint p1( _zoomHandler->zoomItX(- _w / 2), _zoomHandler->zoomItY(-5 - _w / 2) );
109 TQPoint p2( _zoomHandler->zoomItX(- _w / 2), _zoomHandler->zoomItY(5 + _w / 2 ) );
110 painter->drawLine( p1, p2);
111 }break;
112 case L_DOUBLE_ARROW:
113 {
114 painter->translate( _zoomHandler->zoomItX(coord.x()),_zoomHandler->zoomItY( coord.y()) );
115 painter->rotate( angle );
116 painter->scale( 1, 1 );
117 painter->setBrush( color );
118
119 KoPoint p1( -10 - _w , -3 - _w / 2 );
120 KoPoint p2( 0, 0 );
121 KoPoint p3( -10 - _w, 3 + _w / 2 );
122
123 KoPoint p4( -20 - _w, -3 - _w / 2 );
124 KoPoint p5( -10, 0 );
125 KoPoint p6( -20 - _w, 3 + _w / 2 );
126
127 TQPointArray pArray( 3 );
128 pArray.setPoint( 0, _zoomHandler->zoomPoint(p1) );
129 pArray.setPoint( 1, _zoomHandler->zoomPoint(p2) );
130 pArray.setPoint( 2, _zoomHandler->zoomPoint(p3) );
131 painter->drawPolygon( pArray );
132 pArray.setPoint( 0, _zoomHandler->zoomPoint(p4) );
133 pArray.setPoint( 1, _zoomHandler->zoomPoint(p5) );
134 pArray.setPoint( 2, _zoomHandler->zoomPoint(p6) );
135 painter->drawPolygon( pArray );
136
137 }break;
138 case L_DOUBLE_LINE_ARROW:
139 {
140 painter->translate( _zoomHandler->zoomItX(coord.x()),_zoomHandler->zoomItY( coord.y()) );
141 painter->setPen( TQPen(color , _zoomHandler->zoomItX( _w )) );
142 painter->rotate( angle );
143 painter->scale( 1, 1 );
144 TQPoint p1( _zoomHandler->zoomItX(-10 - _w), _zoomHandler->zoomItY(-3 - _w / 2) );
145 TQPoint p2( _zoomHandler->zoomItX(0), _zoomHandler->zoomItY(0) );
146 TQPoint p3( _zoomHandler->zoomItX(-10 - _w), _zoomHandler->zoomItY(3 + _w / 2) );
147 painter->drawLine( p2, p1);
148 painter->drawLine( p2, p3);
149
150 p1.setX( _zoomHandler->zoomItX(-20 - _w));
151 p2.setX( _zoomHandler->zoomItX(-10));
152 p3.setX( _zoomHandler->zoomItX(-20 - _w));
153 painter->drawLine( p2, p1);
154 painter->drawLine( p2, p3);
155 }break;
156 default: break;
157 }
158 painter->restore();
159}
160
161void drawFigureWithOffset( LineEnd figure, TQPainter* painter, const TQPoint &coord, const TQColor &color,
162 int _w, float angle, KoZoomHandler*_zoomHandler)
163{
164 KoSize diff = getOffset( figure, _w, angle );
165 KoPoint offsetPoint(diff.width(), diff.height());
166 offsetPoint += _zoomHandler->unzoomPoint( coord );
167 drawFigure( figure, painter, offsetPoint, color, _w, angle,_zoomHandler );
168}
169
170void drawFigureWithOffset( LineEnd figure, TQPainter* painter, const KoPoint &coord, const TQColor &color,
171 int w, float angle, KoZoomHandler*_zoomHandler, bool begin )
172{
173 KoSize diff = getOffset( figure, w, angle );
174 KoPoint offsetPoint(diff.width(), diff.height());
175 double offsetAngle = angle + ( begin ? 90.0 : -90.0 );
176 KoPoint lineOffset( w * cos( offsetAngle * M_PI / 180.0 ) / 2,
177 w * sin( offsetAngle * M_PI / 180.0 ) / 2 );
178 offsetPoint += coord + lineOffset;
179 drawFigure( figure, painter, offsetPoint, color, w, angle,_zoomHandler );
180}
181
182KoSize getBoundingSize( LineEnd figure, int _w, const KoZoomHandler*_zoomHandler )
183{
184 switch ( figure )
185 {
186 case L_SQUARE:
187 {
188 int _h = (int)_w;
189 if ( _h % 2 == 0 ) _h--;
190 return KoSize( _zoomHandler->zoomItX( 10 + _w), _zoomHandler->zoomItY( 10 + _h) );
191 } break;
192 case L_CIRCLE:
193 return KoSize( _zoomHandler->zoomItX(10 + _w), _zoomHandler->zoomItY(10 + _w) );
194 break;
195 case L_ARROW:
196 return KoSize( _zoomHandler->zoomItX( 14 + _w),_zoomHandler->zoomItY( 14 + _w) );
197 break;
198 case L_LINE_ARROW:
199 return KoSize( _zoomHandler->zoomItX( 14 + _w),_zoomHandler->zoomItY( 14 + _w) );
200 break;
201 case L_DIMENSION_LINE:
202 return KoSize( _zoomHandler->zoomItX( 14 +_w),_zoomHandler->zoomItY( 14 + _w) );
203 break;
204 case L_DOUBLE_ARROW:
205 return KoSize( _zoomHandler->zoomItX( 28 + _w),_zoomHandler->zoomItY( 14 + _w) );
206 break;
207 case L_DOUBLE_LINE_ARROW:
208 return KoSize( _zoomHandler->zoomItX( 28 + _w),_zoomHandler->zoomItY( 14 + _w) );
209 break;
210 default: break;
211 }
212
213 return KoSize( 0, 0 );
214}
215
216KoSize getOffset( LineEnd figure, int _w, float angle )
217{
218 double x = 0;
219 double y = 0;
220 switch ( figure )
221 {
222 case L_ARROW:
223 case L_DOUBLE_ARROW:
224 {
225 x = _w * 2;
226 y = _w * 2;
227 break;
228 }
229 case L_SQUARE:
230 case L_CIRCLE:
231 {
232 x = _w + 3;
233 y = _w + 3;
234 break;
235 }
236 case L_LINE_ARROW:
237 case L_DOUBLE_LINE_ARROW:
238 {
239 x = _w + 1;
240 y = _w + 1;
241 break;
242 }
243 case L_DIMENSION_LINE:
244 {
245 x = _w / 2;
246 y = _w / 2;
247 break;
248 }
249 default: break;
250 }
251
252 return KoSize( x * cos( angle * M_PI / 180.0 ), y * sin( angle * M_PI / 180 ) );
253}
254
255TQString lineEndBeginName( LineEnd type )
256{
257 switch(type)
258 {
259 case L_NORMAL:
260 return TQString("NORMAL");
261 case L_ARROW:
262 return TQString("ARROW");
263 case L_SQUARE:
264 return TQString("SQUARE");
265 case L_CIRCLE:
266 return TQString("CIRCLE");
267 case L_LINE_ARROW:
268 return TQString("LINE_ARROW");
269 case L_DIMENSION_LINE:
270 return TQString("DIMENSION_LINE");
271 case L_DOUBLE_ARROW:
272 return TQString("DOUBLE_ARROW");
273 case L_DOUBLE_LINE_ARROW:
274 return TQString("DOUBLE_LINE_ARROW");
275 }
276 return TQString();
277}
278
279LineEnd lineEndBeginFromString( const TQString & type )
280{
281 if(type=="NORMAL")
282 return L_NORMAL;
283 else if(type=="ARROW")
284 return L_ARROW;
285 else if(type=="SQUARE")
286 return L_SQUARE;
287 else if(type=="CIRCLE")
288 return L_CIRCLE;
289 else if(type=="LINE_ARROW")
290 return L_LINE_ARROW;
291 else if (type=="DIMENSION_LINE")
292 return L_DIMENSION_LINE;
293 else if (type=="DOUBLE_ARROW")
294 return L_DOUBLE_ARROW;
295 else if (type=="DOUBLE_LINE_ARROW")
296 return L_DOUBLE_LINE_ARROW;
297 else
298 kdDebug(33001)<<"Error in LineEnd lineEndBeginFromString( const TQString & name )\n";
299 return L_NORMAL;
300}
301
302TQString lineEndBeginSvg( LineEnd element )
303{
304 TQString str;
305 switch( element )
306 {
307 case L_NORMAL:
308 //nothing
309 break;
310 case L_ARROW:
311 str = "m10 0-10 30h20z";
312 break;
313 case L_SQUARE:
314 str = "m0 0h10v10h-10z";
315 break;
316 case L_CIRCLE:
317 str = "m462 1118-102-29-102-51-93-72-72-93-51-102-29-102-13-105 13-102 29-106 51-102 72-89 93-72 102-50 102-34 106-9 101 9 106 34 98 50 93 72 72 89 51 102 29 106 13 102-13 105-29 102-51 102-72 93-93 72-98 51-106 29-101 13z";
318 break;
319 case L_LINE_ARROW:
320 str = "m0 2108v17 17l12 42 30 34 38 21 43 4 29-8 30-21 25-26 13-34 343-1532 339 1520 13 42 29 34 39 21 42 4 42-12 34-30 21-42v-39-12l-4 4-440-1998-9-42-25-39-38-25-43-8-42 8-38 25-26 39-8 42z";
321 break;
322 case L_DIMENSION_LINE:
323 str = "m0 0h278 278 280v36 36 38h-278-278-280v-36-36z";
324 break;
325 case L_DOUBLE_ARROW:
326 str = "m737 1131h394l-564-1131-567 1131h398l-398 787h1131z";
327 break;
328 case L_DOUBLE_LINE_ARROW:
329 //this define is not good I don't know how to define it.
330 str = "m0 11h312 312h122z";
331 break;
332 }
333 return str;
334}
335
336TQCursor KPrUtils::penCursor()
337{
338 static unsigned char pen_bits[] = {
339 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x7d,
340 0x00, 0x80, 0x7e, 0x00, 0x40, 0x7f, 0x00, 0xa0, 0x3f, 0x00, 0xd0, 0x1f,
341 0x00, 0xe8, 0x0f, 0x00, 0xf4, 0x07, 0x00, 0xfa, 0x03, 0x00, 0xfd, 0x01,
342 0x80, 0xfe, 0x00, 0x40, 0x7f, 0x00, 0xa0, 0x3f, 0x00, 0xf0, 0x1f, 0x00,
343 0xd0, 0x0f, 0x00, 0x88, 0x07, 0x00, 0x88, 0x03, 0x00, 0xe4, 0x01, 0x00,
344 0x7c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00};
345
346 TQBitmap pen_bitmap( 24, 24, pen_bits, true );
347 TQBitmap pen_mask( 24, 24 );
348 TQPixmap pix( pen_bitmap );
349 pen_mask = pix.createHeuristicMask( false );
350 pix.setMask( pen_mask );
351
352 return TQCursor( pix, 1, 22 );
353}
354
355TQCursor KPrUtils::rotateCursor()
356{
357 static unsigned char rotate_bits[] = {
358 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xc0, 0xf3, 0x00, 0xe0, 0xff, 0x01,
359 0xf0, 0xe1, 0x03, 0x70, 0x80, 0x03, 0x78, 0x80, 0x07, 0x38, 0x00, 0x07,
360 0x38, 0x00, 0x07, 0xff, 0xe1, 0x3f, 0xfa, 0xc4, 0x17, 0x74, 0x8c, 0x0b,
361 0x28, 0x3a, 0x05, 0x10, 0x1f, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x08, 0x00,
362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
364
365 TQBitmap rotate_bitmap( 22, 22, rotate_bits, true );
366 TQBitmap rotate_mask( 22, 22 );
367 TQPixmap pix( rotate_bitmap );
368 rotate_mask = pix.createHeuristicMask( false );
369 pix.setMask( rotate_mask );
370
371 return TQCursor( pix, 11, 13 );
372}
373
374TQString saveOasisTimer( int second )
375{
376 TQTime time;
377 time = time.addSecs( second );
378 TQString hours( TQString::number( time.hour() ).rightJustify( 2, '0' ) );
379 TQString ms( TQString::number( time.minute() ).rightJustify( 2, '0' ) );
380 TQString sec( TQString::number( time.second() ).rightJustify( 2, '0' ) );
381
382
383 //ISO8601 chapter 5.5.3.2
384 //TQDate doesn't encode it as this format.
385 TQString timeIso = TQString( "PT%1H%2M%3S" ).arg( hours ).arg( ms ).arg( sec );
386 return timeIso;
387}
388
389int loadOasisTimer( const TQString & timer )
390{
391 TQString str( timer );
392 //convert date duration
393 int hour( str.mid( 2, 2 ).toInt() );
394 int minute( str.mid( 5, 2 ).toInt() );
395 int second( str.mid( 8, 2 ).toInt() );
396
397 return ( second + minute*60 + hour*60*60 );
398}
399
400
401int readOasisSettingsInt( const TQDomElement & element )
402{
403 if ( element.hasAttributeNS( KoXmlNS::config, "type" ) )
404 {
405 TQString type = element.attributeNS( KoXmlNS::config, "type", TQString() );
406 TQString str = element.text();
407 bool b;
408 int value = str.toInt( &b );
409 return ( b ? value : 0 );
410 }
411 return 0;
412}
413
414double readOasisSettingsDouble( const TQDomElement & element )
415{
416 if ( element.hasAttributeNS( KoXmlNS::config, "type" ) )
417 {
418 TQString type = element.attributeNS( KoXmlNS::config, "type", TQString() );
419 TQString str = element.text();
420 bool b;
421 double value = str.toDouble( &b );
422 return ( b ? value : 0 );
423 }
424 return 0.0;
425}
426
427bool readOasisSettingsBool( const TQDomElement & element )
428{
429 if ( element.hasAttributeNS( KoXmlNS::config, "type" ) )
430 {
431 TQString type = element.attributeNS( KoXmlNS::config, "type", TQString() );
432 TQString str = element.text();
433 return ( str == "true" ? true : false );
434 }
435 return false;
436}
437
438TQString readOasisSettingsString( const TQDomElement & element )
439{
440 if ( element.hasAttributeNS( KoXmlNS::config, "type" ) )
441 {
442 TQString type = element.attributeNS( KoXmlNS::config, "type", TQString() );
443 TQString str = element.text();
444 return str;
445 }
446 return TQString();
447}