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