00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "KPrUtils.h"
00022
00023 #include "KPrObject.h"
00024 #include "KPrGroupObject.h"
00025 #include "KPrFreehandObject.h"
00026 #include "KPrPolylineObject.h"
00027 #include "KPrBezierCurveObject.h"
00028 #include "KPrPieObject.h"
00029
00030 #include <KoXmlNS.h>
00031 #include <KoTextZoomHandler.h>
00032 #include <KoPoint.h>
00033
00034 #include <qpainter.h>
00035 #include <qpointarray.h>
00036 #include <qpoint.h>
00037 #include <qcolor.h>
00038 #include <qsize.h>
00039 #include <qbitmap.h>
00040 #include <qcursor.h>
00041 #include <qdatetime.h>
00042 #include <qdom.h>
00043
00044 void drawFigure( LineEnd figure, QPainter* painter, const KoPoint &coord, const QColor &color,
00045 int _w, float angle, KoZoomHandler* _zoomHandler)
00046 {
00047 painter->save();
00048 painter->setPen( Qt::NoPen );
00049 painter->setBrush( Qt::NoBrush );
00050
00051 switch ( figure )
00052 {
00053 case L_SQUARE:
00054 {
00055 int _h = _w;
00056 if ( _h % 2 == 0 ) _h--;
00057 painter->translate( _zoomHandler->zoomItX(coord.x()), _zoomHandler->zoomItY( coord.y()) );
00058 painter->rotate( angle );
00059 painter->scale( 1, 1 );
00060 painter->fillRect( _zoomHandler->zoomItX( -6 - _w ),
00061 _zoomHandler->zoomItY( -3 - _h / 2),
00062 _zoomHandler->zoomItX( 6 + _w),
00063 _zoomHandler->zoomItY( 6 + _h), color );
00064 } break;
00065 case L_CIRCLE:
00066 {
00067 painter->translate( _zoomHandler->zoomItX(coord.x()), _zoomHandler->zoomItY(coord.y()) );
00068 painter->rotate( angle );
00069 painter->setBrush( color );
00070 painter->drawEllipse( _zoomHandler->zoomItX( -6 - _w ),
00071 _zoomHandler->zoomItY( -3 - _w / 2 ),
00072 _zoomHandler->zoomItX( 6 + _w),
00073 _zoomHandler->zoomItY(6 + _w) );
00074 } break;
00075 case L_ARROW:
00076 {
00077 KoPoint p1( -10 - _w, -3 - _w / 2 );
00078 KoPoint p2( 0 , 0 );
00079 KoPoint p3( -10 - _w, 3 + _w / 2 );
00080 QPointArray pArray( 3 );
00081 pArray.setPoint( 0, _zoomHandler->zoomPoint(p1) );
00082 pArray.setPoint( 1, _zoomHandler->zoomPoint(p2) );
00083 pArray.setPoint( 2, _zoomHandler->zoomPoint(p3) );
00084
00085 painter->translate( _zoomHandler->zoomItX(coord.x()),_zoomHandler->zoomItY( coord.y()) );
00086 painter->rotate( angle );
00087 painter->scale( 1, 1 );
00088 painter->setBrush( color );
00089 painter->drawPolygon( pArray );
00090 } break;
00091 case L_LINE_ARROW:
00092 {
00093 painter->translate( _zoomHandler->zoomItX(coord.x()),_zoomHandler->zoomItY( coord.y()) );
00094 painter->setPen( QPen(color , _zoomHandler->zoomItX( _w )) );
00095 painter->rotate( angle );
00096 painter->scale( 1, 1 );
00097 QPoint p1( _zoomHandler->zoomItX(-10 - _w), _zoomHandler->zoomItY(-3 - _w / 2) );
00098 QPoint p2( _zoomHandler->zoomItX(0), _zoomHandler->zoomItY(0) );
00099 QPoint p3( _zoomHandler->zoomItX(-10 - _w), _zoomHandler->zoomItY(3 + _w / 2) );
00100 painter->drawLine( p2, p1);
00101 painter->drawLine( p2, p3);
00102 }break;
00103 case L_DIMENSION_LINE:
00104 {
00105 painter->translate( _zoomHandler->zoomItX(coord.x()),_zoomHandler->zoomItY( coord.y()) );
00106 painter->setPen( QPen(color , _zoomHandler->zoomItX( _w )) );
00107 painter->rotate( angle );
00108 painter->scale( 1, 1 );
00109 QPoint p1( _zoomHandler->zoomItX(- _w / 2), _zoomHandler->zoomItY(-5 - _w / 2) );
00110 QPoint p2( _zoomHandler->zoomItX(- _w / 2), _zoomHandler->zoomItY(5 + _w / 2 ) );
00111 painter->drawLine( p1, p2);
00112 }break;
00113 case L_DOUBLE_ARROW:
00114 {
00115 painter->translate( _zoomHandler->zoomItX(coord.x()),_zoomHandler->zoomItY( coord.y()) );
00116 painter->rotate( angle );
00117 painter->scale( 1, 1 );
00118 painter->setBrush( color );
00119
00120 KoPoint p1( -10 - _w , -3 - _w / 2 );
00121 KoPoint p2( 0, 0 );
00122 KoPoint p3( -10 - _w, 3 + _w / 2 );
00123
00124 KoPoint p4( -20 - _w, -3 - _w / 2 );
00125 KoPoint p5( -10, 0 );
00126 KoPoint p6( -20 - _w, 3 + _w / 2 );
00127
00128 QPointArray pArray( 3 );
00129 pArray.setPoint( 0, _zoomHandler->zoomPoint(p1) );
00130 pArray.setPoint( 1, _zoomHandler->zoomPoint(p2) );
00131 pArray.setPoint( 2, _zoomHandler->zoomPoint(p3) );
00132 painter->drawPolygon( pArray );
00133 pArray.setPoint( 0, _zoomHandler->zoomPoint(p4) );
00134 pArray.setPoint( 1, _zoomHandler->zoomPoint(p5) );
00135 pArray.setPoint( 2, _zoomHandler->zoomPoint(p6) );
00136 painter->drawPolygon( pArray );
00137
00138 }break;
00139 case L_DOUBLE_LINE_ARROW:
00140 {
00141 painter->translate( _zoomHandler->zoomItX(coord.x()),_zoomHandler->zoomItY( coord.y()) );
00142 painter->setPen( QPen(color , _zoomHandler->zoomItX( _w )) );
00143 painter->rotate( angle );
00144 painter->scale( 1, 1 );
00145 QPoint p1( _zoomHandler->zoomItX(-10 - _w), _zoomHandler->zoomItY(-3 - _w / 2) );
00146 QPoint p2( _zoomHandler->zoomItX(0), _zoomHandler->zoomItY(0) );
00147 QPoint p3( _zoomHandler->zoomItX(-10 - _w), _zoomHandler->zoomItY(3 + _w / 2) );
00148 painter->drawLine( p2, p1);
00149 painter->drawLine( p2, p3);
00150
00151 p1.setX( _zoomHandler->zoomItX(-20 - _w));
00152 p2.setX( _zoomHandler->zoomItX(-10));
00153 p3.setX( _zoomHandler->zoomItX(-20 - _w));
00154 painter->drawLine( p2, p1);
00155 painter->drawLine( p2, p3);
00156 }break;
00157 default: break;
00158 }
00159 painter->restore();
00160 }
00161
00162 void drawFigureWithOffset( LineEnd figure, QPainter* painter, const QPoint &coord, const QColor &color,
00163 int _w, float angle, KoZoomHandler*_zoomHandler)
00164 {
00165 KoSize diff = getOffset( figure, _w, angle );
00166 KoPoint offsetPoint(diff.width(), diff.height());
00167 offsetPoint += _zoomHandler->unzoomPoint( coord );
00168 drawFigure( figure, painter, offsetPoint, color, _w, angle,_zoomHandler );
00169 }
00170
00171 void drawFigureWithOffset( LineEnd figure, QPainter* painter, const KoPoint &coord, const QColor &color,
00172 int w, float angle, KoZoomHandler*_zoomHandler, bool begin )
00173 {
00174 KoSize diff = getOffset( figure, w, angle );
00175 KoPoint offsetPoint(diff.width(), diff.height());
00176 double offsetAngle = angle + ( begin ? 90.0 : -90.0 );
00177 KoPoint lineOffset( w * cos( offsetAngle * M_PI / 180.0 ) / 2,
00178 w * sin( offsetAngle * M_PI / 180.0 ) / 2 );
00179 offsetPoint += coord + lineOffset;
00180 drawFigure( figure, painter, offsetPoint, color, w, angle,_zoomHandler );
00181 }
00182
00183 KoSize getBoundingSize( LineEnd figure, int _w, const KoZoomHandler*_zoomHandler )
00184 {
00185 switch ( figure )
00186 {
00187 case L_SQUARE:
00188 {
00189 int _h = (int)_w;
00190 if ( _h % 2 == 0 ) _h--;
00191 return KoSize( _zoomHandler->zoomItX( 10 + _w), _zoomHandler->zoomItY( 10 + _h) );
00192 } break;
00193 case L_CIRCLE:
00194 return KoSize( _zoomHandler->zoomItX(10 + _w), _zoomHandler->zoomItY(10 + _w) );
00195 break;
00196 case L_ARROW:
00197 return KoSize( _zoomHandler->zoomItX( 14 + _w),_zoomHandler->zoomItY( 14 + _w) );
00198 break;
00199 case L_LINE_ARROW:
00200 return KoSize( _zoomHandler->zoomItX( 14 + _w),_zoomHandler->zoomItY( 14 + _w) );
00201 break;
00202 case L_DIMENSION_LINE:
00203 return KoSize( _zoomHandler->zoomItX( 14 +_w),_zoomHandler->zoomItY( 14 + _w) );
00204 break;
00205 case L_DOUBLE_ARROW:
00206 return KoSize( _zoomHandler->zoomItX( 28 + _w),_zoomHandler->zoomItY( 14 + _w) );
00207 break;
00208 case L_DOUBLE_LINE_ARROW:
00209 return KoSize( _zoomHandler->zoomItX( 28 + _w),_zoomHandler->zoomItY( 14 + _w) );
00210 break;
00211 default: break;
00212 }
00213
00214 return KoSize( 0, 0 );
00215 }
00216
00217 KoSize getOffset( LineEnd figure, int _w, float angle )
00218 {
00219 double x = 0;
00220 double y = 0;
00221 switch ( figure )
00222 {
00223 case L_ARROW:
00224 case L_DOUBLE_ARROW:
00225 {
00226 x = _w * 2;
00227 y = _w * 2;
00228 break;
00229 }
00230 case L_SQUARE:
00231 case L_CIRCLE:
00232 {
00233 x = _w + 3;
00234 y = _w + 3;
00235 break;
00236 }
00237 case L_LINE_ARROW:
00238 case L_DOUBLE_LINE_ARROW:
00239 {
00240 x = _w + 1;
00241 y = _w + 1;
00242 break;
00243 }
00244 case L_DIMENSION_LINE:
00245 {
00246 x = _w / 2;
00247 y = _w / 2;
00248 break;
00249 }
00250 default: break;
00251 }
00252
00253 return KoSize( x * cos( angle * M_PI / 180.0 ), y * sin( angle * M_PI / 180 ) );
00254 }
00255
00256 QString lineEndBeginName( LineEnd type )
00257 {
00258 switch(type)
00259 {
00260 case L_NORMAL:
00261 return QString("NORMAL");
00262 case L_ARROW:
00263 return QString("ARROW");
00264 case L_SQUARE:
00265 return QString("SQUARE");
00266 case L_CIRCLE:
00267 return QString("CIRCLE");
00268 case L_LINE_ARROW:
00269 return QString("LINE_ARROW");
00270 case L_DIMENSION_LINE:
00271 return QString("DIMENSION_LINE");
00272 case L_DOUBLE_ARROW:
00273 return QString("DOUBLE_ARROW");
00274 case L_DOUBLE_LINE_ARROW:
00275 return QString("DOUBLE_LINE_ARROW");
00276 }
00277 return QString::null;
00278 }
00279
00280 LineEnd lineEndBeginFromString( const QString & type )
00281 {
00282 if(type=="NORMAL")
00283 return L_NORMAL;
00284 else if(type=="ARROW")
00285 return L_ARROW;
00286 else if(type=="SQUARE")
00287 return L_SQUARE;
00288 else if(type=="CIRCLE")
00289 return L_CIRCLE;
00290 else if(type=="LINE_ARROW")
00291 return L_LINE_ARROW;
00292 else if (type=="DIMENSION_LINE")
00293 return L_DIMENSION_LINE;
00294 else if (type=="DOUBLE_ARROW")
00295 return L_DOUBLE_ARROW;
00296 else if (type=="DOUBLE_LINE_ARROW")
00297 return L_DOUBLE_LINE_ARROW;
00298 else
00299 kdDebug(33001)<<"Error in LineEnd lineEndBeginFromString( const QString & name )\n";
00300 return L_NORMAL;
00301 }
00302
00303 QString lineEndBeginSvg( LineEnd element )
00304 {
00305 QString str;
00306 switch( element )
00307 {
00308 case L_NORMAL:
00309
00310 break;
00311 case L_ARROW:
00312 str = "m10 0-10 30h20z";
00313 break;
00314 case L_SQUARE:
00315 str = "m0 0h10v10h-10z";
00316 break;
00317 case L_CIRCLE:
00318 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";
00319 break;
00320 case L_LINE_ARROW:
00321 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";
00322 break;
00323 case L_DIMENSION_LINE:
00324 str = "m0 0h278 278 280v36 36 38h-278-278-280v-36-36z";
00325 break;
00326 case L_DOUBLE_ARROW:
00327 str = "m737 1131h394l-564-1131-567 1131h398l-398 787h1131z";
00328 break;
00329 case L_DOUBLE_LINE_ARROW:
00330
00331 str = "m0 11h312 312h122z";
00332 break;
00333 }
00334 return str;
00335 }
00336
00337 QCursor KPrUtils::penCursor()
00338 {
00339 static unsigned char pen_bits[] = {
00340 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x3a, 0x00, 0x00, 0x7d,
00341 0x00, 0x80, 0x7e, 0x00, 0x40, 0x7f, 0x00, 0xa0, 0x3f, 0x00, 0xd0, 0x1f,
00342 0x00, 0xe8, 0x0f, 0x00, 0xf4, 0x07, 0x00, 0xfa, 0x03, 0x00, 0xfd, 0x01,
00343 0x80, 0xfe, 0x00, 0x40, 0x7f, 0x00, 0xa0, 0x3f, 0x00, 0xf0, 0x1f, 0x00,
00344 0xd0, 0x0f, 0x00, 0x88, 0x07, 0x00, 0x88, 0x03, 0x00, 0xe4, 0x01, 0x00,
00345 0x7c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00};
00346
00347 QBitmap pen_bitmap( 24, 24, pen_bits, true );
00348 QBitmap pen_mask( 24, 24 );
00349 QPixmap pix( pen_bitmap );
00350 pen_mask = pix.createHeuristicMask( false );
00351 pix.setMask( pen_mask );
00352
00353 return QCursor( pix, 1, 22 );
00354 }
00355
00356 QCursor KPrUtils::rotateCursor()
00357 {
00358 static unsigned char rotate_bits[] = {
00359 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0xc0, 0xf3, 0x00, 0xe0, 0xff, 0x01,
00360 0xf0, 0xe1, 0x03, 0x70, 0x80, 0x03, 0x78, 0x80, 0x07, 0x38, 0x00, 0x07,
00361 0x38, 0x00, 0x07, 0xff, 0xe1, 0x3f, 0xfa, 0xc4, 0x17, 0x74, 0x8c, 0x0b,
00362 0x28, 0x3a, 0x05, 0x10, 0x1f, 0x02, 0x00, 0x0c, 0x00, 0x00, 0x08, 0x00,
00363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00364 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
00365
00366 QBitmap rotate_bitmap( 22, 22, rotate_bits, true );
00367 QBitmap rotate_mask( 22, 22 );
00368 QPixmap pix( rotate_bitmap );
00369 rotate_mask = pix.createHeuristicMask( false );
00370 pix.setMask( rotate_mask );
00371
00372 return QCursor( pix, 11, 13 );
00373 }
00374
00375 QString saveOasisTimer( int second )
00376 {
00377 QTime time;
00378 time = time.addSecs( second );
00379 QString hours( QString::number( time.hour() ).rightJustify( 2, '0' ) );
00380 QString ms( QString::number( time.minute() ).rightJustify( 2, '0' ) );
00381 QString sec( QString::number( time.second() ).rightJustify( 2, '0' ) );
00382
00383
00384
00385
00386 QString timeIso = QString( "PT%1H%2M%3S" ).arg( hours ).arg( ms ).arg( sec );
00387 return timeIso;
00388 }
00389
00390 int loadOasisTimer( const QString & timer )
00391 {
00392 QString str( timer );
00393
00394 int hour( str.mid( 2, 2 ).toInt() );
00395 int minute( str.mid( 5, 2 ).toInt() );
00396 int second( str.mid( 8, 2 ).toInt() );
00397
00398 return ( second + minute*60 + hour*60*60 );
00399 }
00400
00401
00402 int readOasisSettingsInt( const QDomElement & element )
00403 {
00404 if ( element.hasAttributeNS( KoXmlNS::config, "type" ) )
00405 {
00406 QString type = element.attributeNS( KoXmlNS::config, "type", QString::null );
00407 QString str = element.text();
00408 bool b;
00409 int value = str.toInt( &b );
00410 return ( b ? value : 0 );
00411 }
00412 return 0;
00413 }
00414
00415 double readOasisSettingsDouble( const QDomElement & element )
00416 {
00417 if ( element.hasAttributeNS( KoXmlNS::config, "type" ) )
00418 {
00419 QString type = element.attributeNS( KoXmlNS::config, "type", QString::null );
00420 QString str = element.text();
00421 bool b;
00422 double value = str.toDouble( &b );
00423 return ( b ? value : 0 );
00424 }
00425 return 0.0;
00426 }
00427
00428 bool readOasisSettingsBool( const QDomElement & element )
00429 {
00430 if ( element.hasAttributeNS( KoXmlNS::config, "type" ) )
00431 {
00432 QString type = element.attributeNS( KoXmlNS::config, "type", QString::null );
00433 QString str = element.text();
00434 return ( str == "true" ? true : false );
00435 }
00436 return false;
00437 }
00438
00439 QString readOasisSettingsString( const QDomElement & element )
00440 {
00441 if ( element.hasAttributeNS( KoXmlNS::config, "type" ) )
00442 {
00443 QString type = element.attributeNS( KoXmlNS::config, "type", QString::null );
00444 QString str = element.text();
00445 return str;
00446 }
00447 return QString::null;
00448 }