00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include <koFrame.h>
00021
#include <koView.h>
00022
00023
#include <qpainter.h>
00024
#include <kparts/event.h>
00025
#include <kcursor.h>
00026
#include <kdebug.h>
00027
00028
#define QMAX32767(a,b) QMAX(QMAX(32767,a),b)
00029
00030
class KoFramePrivate
00031 {
00032
public:
00033 KoFramePrivate()
00034 {
00035 }
00036 ~KoFramePrivate()
00037 {
00038 }
00039
00040
KoView *m_view;
00041
00042
QPoint m_mousePressPos;
00043
QPoint m_framePos;
00044
int m_width;
00045
int m_height;
00046
int m_mode;
00047
00048 KoFrame::State m_state;
00049 };
00050
00051 KoFrame::KoFrame(
QWidget *parent,
const char *name )
00052 :
QWidget( parent, name )
00053 {
00054 d =
new KoFramePrivate;
00055 d->m_state = Inactive;
00056 d->m_mode = -1;
00057 d->m_view = 0;
00058
00059 setBackgroundColor( white );
00060 setMouseTracking(
true );
00061 }
00062
00063 KoFrame::~KoFrame()
00064 {
00065
delete d;
00066 }
00067
00068
void KoFrame::setView(
KoView *view )
00069 {
00070
if ( view == d->m_view )
00071
return;
00072
00073
if ( d->m_view )
00074 d->m_view->removeEventFilter(
this );
00075
00076 d->m_view = view;
00077
if ( d->m_view )
00078 {
00079 d->m_view->installEventFilter(
this );
00080
00081
00082
00083
00084
00085 setMaximumSize( QMAX32767( d->m_view->maximumWidth() + 2 * border(), d->m_view->maximumWidth() ),
00086 QMAX32767( d->m_view->maximumHeight() + 2 * border(), d->m_view->maximumHeight() ) );
00087 setMinimumSize( d->m_view->minimumWidth() + leftBorder() + rightBorder(),
00088 d->m_view->minimumHeight() + topBorder() + bottomBorder() );
00089
00090 }
00091
00092 resizeEvent( 0L );
00093 }
00094
00095
KoView *KoFrame::view()
const
00096
{
00097
return d->m_view;
00098 }
00099
00100
void KoFrame::setState( State s )
00101 {
00102
if ( d->m_state == s )
00103
return;
00104
00105 State old = d->m_state;
00106 d->m_state = s;
00107
00108
if ( d->m_view )
00109 {
00110
00111
00112
00113
00114
00115
00116 setMaximumSize( QMAX32767( d->m_view->maximumWidth() + 2 * border(), d->m_view->maximumWidth() ),
00117 QMAX32767( d->m_view->maximumHeight() + 2 * border(), d->m_view->maximumHeight() ) );
00118 setMinimumSize( d->m_view->minimumWidth() + leftBorder() + rightBorder(),
00119 d->m_view->minimumHeight() + topBorder() + bottomBorder() );
00120 }
00121
00122
if ( d->m_state == Inactive )
00123 {
00124 d->m_state = old;
00125
int l = leftBorder();
00126
int r = rightBorder();
00127
int t = topBorder();
00128
int b = bottomBorder();
00129 d->m_state = Inactive;
00130 setGeometry( x() + l, y() + t, width() - l - r, height() - t - b );
00131 }
00132
else if ( ( d->m_state == Active || d->m_state == Selected ) && old == Inactive )
00133 setGeometry( x() - leftBorder(), y() - topBorder(),
00134 width() + leftBorder() + rightBorder(),
00135 height() + topBorder() + bottomBorder() );
00136
else if ( d->m_state == Active && old == Selected )
00137 {
00138 setGeometry( x() - leftBorder() + border(), y() - topBorder() + border(),
00139 width() + leftBorder() + rightBorder() - 2 * border(),
00140 height() + topBorder() + bottomBorder() - 2 * border() );
00141 }
00142
00143 update();
00144 }
00145
00146 KoFrame::State KoFrame::state()
const
00147
{
00148
return d->m_state;
00149 }
00150
00151
int KoFrame::leftBorder()
const
00152
{
00153
if ( d->m_state == Inactive )
00154
return 0;
00155
if ( d->m_state == Selected || !d->m_view )
00156
return border();
00157
00158
return d->m_view->leftBorder() + border();
00159 }
00160
00161
int KoFrame::rightBorder()
const
00162
{
00163
if ( d->m_state == Inactive )
00164
return 0;
00165
if ( d->m_state == Selected || !d->m_view )
00166
return border();
00167
00168
return d->m_view->rightBorder() + border();
00169 }
00170
00171
int KoFrame::topBorder()
const
00172
{
00173
if ( d->m_state == Inactive )
00174
return 0;
00175
if ( d->m_state == Selected || !d->m_view )
00176
return border();
00177
00178
return d->m_view->topBorder() + border();
00179 }
00180
00181
int KoFrame::bottomBorder()
const
00182
{
00183
if ( d->m_state == Inactive )
00184
return 0;
00185
if ( d->m_state == Selected || !d->m_view )
00186
return border();
00187
00188
return d->m_view->bottomBorder() + border();
00189 }
00190
00191
int KoFrame::border()
const
00192
{
00193
if ( d->m_state == Inactive )
00194
return 0;
00195
return 5;
00196 }
00197
00198
void KoFrame::paintEvent(
QPaintEvent* )
00199 {
00200
QPainter painter;
00201 painter.begin(
this );
00202
00203 painter.setPen( black );
00204 painter.fillRect( 0, 0, width(), height(), BDiagPattern );
00205
00206
if ( d->m_state == Selected )
00207 {
00208 painter.fillRect( 0, 0, 5, 5, black );
00209 painter.fillRect( 0, height() - 5, 5, 5, black );
00210 painter.fillRect( width() - 5, height() - 5, 5, 5, black );
00211 painter.fillRect( width() - 5, 0, 5, 5, black );
00212 painter.fillRect( width() / 2 - 3, 0, 5, 5, black );
00213 painter.fillRect( width() / 2 - 3, height() - 5, 5, 5, black );
00214 painter.fillRect( 0, height() / 2 - 3, 5, 5, black );
00215 painter.fillRect( width() - 5, height() / 2 - 3, 5, 5, black );
00216 }
00217
00218 painter.end();
00219 }
00220
00221
void KoFrame::mousePressEvent(
QMouseEvent* ev )
00222 {
00223
QRect r1( 0, 0, 5, 5 );
00224
QRect r2( 0, height() - 5, 5, 5 );
00225
QRect r3( width() - 5, height() - 5, 5, 5 );
00226
QRect r4( width() - 5, 0, 5, 5 );
00227
QRect r5( width() / 2 - 3, 0, 5, 5 );
00228
QRect r6( width() / 2 - 3, height() - 5, 5, 5 );
00229
QRect r7( 0, height() / 2 - 3, 5, 5 );
00230
QRect r8( width()- 5, height() / 2 - 3, 5, 5 );
00231
00232
if ( r1.contains( ev->pos() ) )
00233 d->m_mode = 1;
00234
else if ( r2.contains( ev->pos() ) )
00235 d->m_mode = 2;
00236
else if ( r3.contains( ev->pos() ) )
00237 d->m_mode = 3;
00238
else if ( r4.contains( ev->pos() ) )
00239 d->m_mode = 4;
00240
else if ( r5.contains( ev->pos() ) )
00241 d->m_mode = 5;
00242
else if ( r6.contains( ev->pos() ) )
00243 d->m_mode = 6;
00244
else if ( r7.contains( ev->pos() ) )
00245 d->m_mode = 7;
00246
else if ( r8.contains( ev->pos() ) )
00247 d->m_mode = 8;
00248
else
00249 d->m_mode = 0;
00250
00251
00252
00253
00254 kdDebug(30003) <<
"---- MODE=" << d->m_mode << endl;
00255
00256 d->m_mousePressPos = mapToParent( ev->pos() );
00257 d->m_framePos = mapToParent(
QPoint( 0, 0 ) );
00258 d->m_width = width();
00259 d->m_height = height();
00260 }
00261
00262
void KoFrame::mouseMoveEvent(
QMouseEvent* ev )
00263 {
00264
if ( d->m_mode == 0 )
00265 {
00266
QPoint p = parentWidget()->mapFromGlobal( ev->globalPos() );
00267 move(
QPoint( p.x() + d->m_framePos.x() - d->m_mousePressPos.x(),
00268 p.y() + d->m_framePos.y() - d->m_mousePressPos.y() ) );
00269
00270
00271 emit geometryChanged();
00272
00273 }
00274
else if ( d->m_mode == 1 )
00275 {
00276
QPoint p = parentWidget()->mapFromGlobal( ev->globalPos() );
00277
int w = QMIN( QMAX( d->m_width + d->m_mousePressPos.x() - p.x(), minimumWidth() ), maximumWidth() );
00278
int h = QMIN( QMAX( d->m_height + d->m_mousePressPos.y() - p.y(), minimumHeight() ), maximumHeight() );
00279 setGeometry( d->m_framePos.x() - w + d->m_width,
00280 d->m_framePos.y() - h + d->m_height, w, h );
00281 }
00282
else if ( d->m_mode == 2 )
00283 {
00284
QPoint p = parentWidget()->mapFromGlobal( ev->globalPos() );
00285
int w = QMIN( QMAX( d->m_width + d->m_mousePressPos.x() - p.x(), minimumWidth() ), maximumWidth() );
00286
int h = QMIN( QMAX( d->m_height - d->m_mousePressPos.y() + p.y(), minimumHeight() ), maximumHeight() );
00287 setGeometry( d->m_framePos.x() - w + d->m_width,
00288 d->m_framePos.y(), w, h );
00289 }
00290
else if ( d->m_mode == 3 )
00291 {
00292
QPoint p = parentWidget()->mapFromGlobal( ev->globalPos() );
00293
int w = QMIN( QMAX( d->m_width - d->m_mousePressPos.x() + p.x(), minimumWidth() ), maximumWidth() );
00294
int h = QMIN( QMAX( d->m_height - d->m_mousePressPos.y() + p.y(), minimumHeight() ), maximumHeight() );
00295 resize( w, h );
00296 }
00297
else if ( d->m_mode == 4 )
00298 {
00299
QPoint p = parentWidget()->mapFromGlobal( ev->globalPos() );
00300
int w = QMIN( QMAX( d->m_width - d->m_mousePressPos.x() + p.x(), minimumWidth() ), maximumWidth() );
00301
int h = QMIN( QMAX( d->m_height + d->m_mousePressPos.y() - p.y(), minimumHeight() ), maximumHeight() );
00302 setGeometry( d->m_framePos.x(),
00303 d->m_framePos.y() - h + d->m_height, w, h );
00304 }
00305
else if ( d->m_mode == 5 )
00306 {
00307
QPoint p = parentWidget()->mapFromGlobal( ev->globalPos() );
00308
int h = QMIN( QMAX( d->m_height + d->m_mousePressPos.y() - p.y(), minimumHeight() ), maximumHeight() );
00309 setGeometry( d->m_framePos.x(),
00310 d->m_framePos.y() - h + d->m_height, d->m_width, h );
00311 }
00312
else if ( d->m_mode == 6 )
00313 {
00314
QPoint p = parentWidget()->mapFromGlobal( ev->globalPos() );
00315
int h = QMIN( QMAX( d->m_height - d->m_mousePressPos.y() + p.y(), minimumHeight() ), maximumHeight() );
00316 resize( d->m_width, h );
00317 }
00318
else if ( d->m_mode == 7 )
00319 {
00320
QPoint p = parentWidget()->mapFromGlobal( ev->globalPos() );
00321
int w = QMIN( QMAX( d->m_width + d->m_mousePressPos.x() - p.x(), minimumWidth() ), maximumWidth() );
00322 setGeometry( d->m_framePos.x() - w + d->m_width,
00323 d->m_framePos.y(), w, d->m_height );
00324 }
00325
else if ( d->m_mode == 8 )
00326 {
00327
QPoint p = parentWidget()->mapFromGlobal( ev->globalPos() );
00328
int w = QMIN( QMAX( d->m_width - d->m_mousePressPos.x() + p.x(), minimumWidth() ), maximumWidth() );
00329 resize( w, d->m_height );
00330 }
00331
else if ( d->m_state == Selected || d->m_state == Active )
00332 {
00333
QRect r1( 0, 0, 5, 5 );
00334
QRect r2( 0, height() - 5, 5, 5 );
00335
QRect r3( width() - 5, height() - 5, 5, 5 );
00336
QRect r4( width() - 5, 0, 5, 5 );
00337
QRect r5( width() / 2 - 3, 0, 5, 5 );
00338
QRect r6( width() / 2 - 3, height() - 5, 5, 5 );
00339
QRect r7( 0, height() / 2 - 3, 5, 5 );
00340
QRect r8( width()- 5, height() / 2 - 3, 5, 5 );
00341
00342
if ( r1.contains( ev->pos() ) || r3.contains( ev->pos() ) )
00343 setCursor( sizeFDiagCursor );
00344
else if ( r2.contains( ev->pos() ) || r4.contains( ev->pos() ) )
00345 setCursor( sizeBDiagCursor );
00346
else if ( r5.contains( ev->pos() ) || r6.contains( ev->pos() ) )
00347 setCursor( sizeVerCursor );
00348
else if ( r7.contains( ev->pos() ) || r8.contains( ev->pos() ) )
00349 setCursor( sizeHorCursor );
00350
else
00351 setCursor( KCursor::handCursor() );
00352 }
00353
else
00354 setCursor( KCursor::handCursor() );
00355 }
00356
00357
void KoFrame::mouseReleaseEvent(
QMouseEvent* )
00358 {
00359 d->m_mode = -1;
00360 }
00361
00362
void KoFrame::resizeEvent(
QResizeEvent* )
00363 {
00364
if ( !d->m_view )
00365
return;
00366
00367
if ( d->m_state == Active || d->m_state == Selected )
00368 d->m_view->setGeometry( 5, 5, width() - 10, height() - 10 );
00369
else
00370 d->m_view->setGeometry( 0, 0, width(), height() );
00371
00372 emit geometryChanged();
00373 }
00374
00375
bool KoFrame::eventFilter(
QObject* obj,
QEvent* ev )
00376 {
00377
if ( obj == d->m_view && KParts::PartActivateEvent::test( ev ) )
00378 {
00379 kdDebug(30003) <<
"Activate event"<< endl;
00380 KParts::PartActivateEvent* e = (KParts::PartActivateEvent*)ev;
00381
if ( e->part() == (KParts::Part *)d->m_view->koDocument() )
00382 {
00383
if ( e->activated() )
00384 setState( Active );
00385
else
00386 setState( Inactive );
00387 }
00388 }
00389
else if ( obj == d->m_view && KParts::PartSelectEvent::test( ev ) )
00390 {
00391 kdDebug(30003) <<
"Selected event" << endl;
00392 KParts::PartSelectEvent* e = (KParts::PartSelectEvent*)ev;
00393
if ( e->part() == (KParts::Part *)d->m_view->koDocument() )
00394 {
00395
if ( e->selected() )
00396 setState( Selected );
00397
else
00398 setState( Inactive );
00399 }
00400 }
00401
00402
return false;
00403 }
00404
00405
#include <koFrame.moc>