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 }