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