kpresenter

KPrUtils.cpp

00001 // -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 4; -*-
00002 /* This file is part of the KDE project
00003    Copyright (C) 1998, 1999 Reginald Stadlbauer <reggie@kde.org>
00004 
00005    This library is free software; you can redistribute it and/or
00006    modify it under the terms of the GNU Library General Public
00007    License as published by the Free Software Foundation; either
00008    version 2 of the License, or (at your option) any later version.
00009 
00010    This library is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY; without even the implied warranty of
00012    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013    Library General Public License for more details.
00014 
00015    You should have received a copy of the GNU Library General Public License
00016    along with this library; see the file COPYING.LIB.  If not, write to
00017    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00018  * Boston, MA 02110-1301, USA.
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         //nothing
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         //this define is not good I don't know how to define it.
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     //ISO8601 chapter 5.5.3.2
00385     //QDate doesn't encode it as this format.
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     //convert date duration
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 }
KDE Home | KDE Accessibility Home | Description of Access Keys