00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "koborder.h"
00021 #include <qdom.h>
00022 #include <kdebug.h>
00023 #include "kozoomhandler.h"
00024 #include "kotextformat.h"
00025 #include "korichtext.h"
00026
00027 KoBorder::KoBorder()
00028 : color(), style( SOLID )
00029 {
00030 setPenWidth( 1 );
00031 }
00032
00033 KoBorder::KoBorder( const QColor & c, BorderStyle s, double width )
00034 : color( c ), style( s )
00035 {
00036 setPenWidth( width );
00037 }
00038
00039 bool KoBorder::operator==( const KoBorder _brd ) const {
00040 return ( style == _brd.style && color == _brd.color && ptPenWidth == _brd.ptPenWidth );
00041 }
00042
00043 bool KoBorder::operator!=( const KoBorder _brd ) const {
00044 return ( style != _brd.style || color != _brd.color || ptPenWidth != _brd.ptPenWidth );
00045 }
00046
00047 void KoBorder::setStyle(BorderStyle _style)
00048 {
00049 style = _style;
00050 setPenWidth(ptPenWidth);
00051 }
00052
00053 void KoBorder::setPenWidth(double _w)
00054 {
00055 ptPenWidth = _w;
00056 if ( style==KoBorder::DOUBLE_LINE)
00057 {
00058 ptWidth = 2 * ptPenWidth + 1;
00059 }
00060 else
00061 ptWidth = _w;
00062 }
00063
00064 QPen KoBorder::borderPen( const KoBorder & _brd, int width, QColor defaultColor )
00065 {
00066 QPen pen( _brd.color, width );
00067 if ( !_brd.color.isValid() )
00068 pen.setColor( defaultColor );
00069
00070 switch ( _brd.style ) {
00071 case KoBorder::SOLID:
00072 case KoBorder::DOUBLE_LINE:
00073 pen.setStyle( SolidLine );
00074 break;
00075 case KoBorder::DASH:
00076 pen.setStyle( DashLine );
00077 break;
00078 case KoBorder::DOT:
00079 pen.setStyle( DotLine );
00080 break;
00081 case KoBorder::DASH_DOT:
00082 pen.setStyle( DashDotLine );
00083 break;
00084 case KoBorder::DASH_DOT_DOT:
00085 pen.setStyle( DashDotDotLine );
00086 break;
00087 }
00088
00089 return pen;
00090 }
00091
00092 KoBorder KoBorder::loadBorder( const QDomElement & elem )
00093 {
00094 KoBorder bd;
00095 if ( elem.hasAttribute("red") )
00096 {
00097 int r = elem.attribute("red").toInt();
00098 int g = elem.attribute("green").toInt();
00099 int b = elem.attribute("blue").toInt();
00100 bd.color.setRgb( r, g, b );
00101 }
00102 bd.style = static_cast<BorderStyle>( elem.attribute("style").toInt() );
00103 bd.setPenWidth( elem.attribute("width").toDouble() );
00104 return bd;
00105 }
00106
00107 void KoBorder::save( QDomElement & elem ) const
00108 {
00109 if (color.isValid()) {
00110 elem.setAttribute("red", color.red());
00111 elem.setAttribute("green", color.green());
00112 elem.setAttribute("blue", color.blue());
00113 }
00114 elem.setAttribute("style", static_cast<int>( style ));
00115 elem.setAttribute("width", ptPenWidth);
00116 }
00117
00118 KoBorder::BorderStyle KoBorder::getStyle( const QString &style )
00119 {
00120 if ( style == "___ ___ __" )
00121 return KoBorder::DASH;
00122 if ( style == "_ _ _ _ _ _" )
00123 return KoBorder::DOT;
00124 if ( style == "___ _ ___ _" )
00125 return KoBorder::DASH_DOT;
00126 if ( style == "___ _ _ ___" )
00127 return KoBorder::DASH_DOT_DOT;
00128 if ( style == "===========" )
00129 return KoBorder::DOUBLE_LINE;
00130
00131 return KoBorder::SOLID;
00132 }
00133
00134 QString KoBorder::getStyle( const BorderStyle &style )
00135 {
00136 switch ( style )
00137 {
00138 case KoBorder::SOLID:
00139 return "_________";
00140 case KoBorder::DASH:
00141 return "___ ___ __";
00142 case KoBorder::DOT:
00143 return "_ _ _ _ _ _";
00144 case KoBorder::DASH_DOT:
00145 return "___ _ ___ _";
00146 case KoBorder::DASH_DOT_DOT:
00147 return "___ _ _ ___";
00148 case KoBorder::DOUBLE_LINE:
00149 return "===========";
00150 }
00151
00152
00153 return "_________";
00154 }
00155
00156 int KoBorder::zoomWidthX( double ptWidth, KoZoomHandler * zoomHandler, int minborder )
00157 {
00158
00159
00160 return ptWidth > 0 ? QMAX( 1, zoomHandler->zoomItX( ptWidth ) ) : minborder;
00161 }
00162
00163 int KoBorder::zoomWidthY( double ptWidth, KoZoomHandler * zoomHandler, int minborder )
00164 {
00165
00166
00167 return ptWidth > 0 ? QMAX( 1, zoomHandler->zoomItY( ptWidth ) ) : minborder;
00168 }
00169
00170 void KoBorder::drawBorders( QPainter& painter, KoZoomHandler * zoomHandler, QRect rect, KoBorder leftBorder, KoBorder rightBorder, KoBorder topBorder, KoBorder bottomBorder, int minborder, QPen defaultPen )
00171 {
00172 int topBorderWidth = zoomWidthY( topBorder.width(), zoomHandler, minborder );
00173 int bottomBorderWidth = zoomWidthY( bottomBorder.width(), zoomHandler, minborder );
00174 int leftBorderWidth = zoomWidthX( leftBorder.width(), zoomHandler, minborder );
00175 int rightBorderWidth = zoomWidthX( rightBorder.width(), zoomHandler, minborder );
00176
00177 int topBorderPenWidth = zoomWidthY( topBorder.penWidth(), zoomHandler, minborder );
00178 int bottomBorderPenWidth = zoomWidthY( bottomBorder.penWidth(), zoomHandler, minborder );
00179 int leftBorderPenWidth = zoomWidthX( leftBorder.penWidth(), zoomHandler, minborder );
00180 int rightBorderPenWidth = zoomWidthX( rightBorder.penWidth(), zoomHandler, minborder );
00181
00182
00183 int lastPixelAdj = 1;
00184
00185
00186
00187
00188
00189
00190
00191 QColor defaultColor = KoTextFormat::defaultTextColor( &painter );
00192
00193 if ( topBorderWidth > 0 )
00194 {
00195 if ( topBorder.penWidth() > 0 )
00196 painter.setPen( KoBorder::borderPen( topBorder, topBorderPenWidth, defaultColor ) );
00197 else
00198 painter.setPen( defaultPen );
00199 int y = rect.top() - topBorderWidth + topBorderPenWidth/2;
00200 if ( topBorder.style==KoBorder::DOUBLE_LINE)
00201 {
00202 painter.drawLine( rect.left()-leftBorderWidth, y, rect.right()+2*(rightBorderPenWidth+lastPixelAdj), y );
00203 y += topBorderPenWidth + 1;
00204 painter.drawLine( rect.left()-leftBorderPenWidth, y, rect.right()+rightBorderPenWidth+lastPixelAdj, y );
00205 }
00206 else
00207 {
00208 painter.drawLine( rect.left()-leftBorderWidth, y, rect.right()+rightBorderWidth+lastPixelAdj, y );
00209 }
00210 }
00211 if ( bottomBorderWidth > 0 )
00212 {
00213 if ( bottomBorder.penWidth() > 0 )
00214 painter.setPen( KoBorder::borderPen( bottomBorder, bottomBorderPenWidth, defaultColor ) );
00215 else
00216 painter.setPen( defaultPen );
00217
00218 int y = rect.bottom() + bottomBorderPenWidth/2 + 1;
00219
00220 if ( bottomBorder.style==KoBorder::DOUBLE_LINE)
00221 {
00222 painter.drawLine( rect.left()-leftBorderPenWidth, y, rect.right()+rightBorderPenWidth+lastPixelAdj, y );
00223 y += bottomBorderPenWidth + 1;
00224 painter.drawLine( rect.left()-leftBorderWidth, y, rect.right()+2*(rightBorderPenWidth+lastPixelAdj), y );
00225 }
00226 else
00227 {
00228 painter.drawLine( rect.left()-leftBorderWidth, y, rect.right()+rightBorderWidth+lastPixelAdj, y );
00229 }
00230 }
00231 if ( leftBorderWidth > 0 )
00232 {
00233 if ( leftBorder.penWidth() > 0 )
00234 painter.setPen( KoBorder::borderPen( leftBorder, leftBorderPenWidth, defaultColor ) );
00235 else
00236 painter.setPen( defaultPen );
00237 int x = rect.left() - leftBorderWidth + leftBorderPenWidth/2;
00238 if ( leftBorder.style==KoBorder::DOUBLE_LINE)
00239 {
00240 painter.drawLine( x, rect.top()-topBorderWidth, x, rect.bottom()+2*(bottomBorderPenWidth+lastPixelAdj) );
00241 x += leftBorderPenWidth + 1;
00242 painter.drawLine( x, rect.top()-topBorderPenWidth, x, rect.bottom()+bottomBorderPenWidth+lastPixelAdj );
00243 }
00244 else
00245 {
00246 int yTop = rect.top() - topBorderWidth;
00247 int yBottom = rect.bottom() + bottomBorderWidth;
00248
00249
00250
00251 painter.drawLine( x, yTop, x, yBottom+lastPixelAdj );
00252 }
00253 }
00254 if ( rightBorderWidth > 0 )
00255 {
00256 if ( rightBorder.penWidth() > 0 )
00257 painter.setPen( KoBorder::borderPen( rightBorder, rightBorderPenWidth, defaultColor ) );
00258 else
00259 painter.setPen( defaultPen );
00260 int x = rect.right() + rightBorderPenWidth/2 + 1;
00261
00262 if ( rightBorder.style==KoBorder::DOUBLE_LINE)
00263 {
00264 painter.drawLine( x, rect.top()-topBorderPenWidth, x, rect.bottom()+bottomBorderPenWidth+lastPixelAdj );
00265 x += rightBorderPenWidth + 1;
00266 painter.drawLine( x, rect.top()-topBorderWidth, x, rect.bottom()+2*(bottomBorderPenWidth+lastPixelAdj) );
00267
00268 }
00269 else
00270 {
00271 painter.drawLine( x, rect.top()-topBorderWidth, x, rect.bottom()+bottomBorderWidth+lastPixelAdj );
00272 }
00273 }
00274 }