lib Library API Documentation

koFrame.cc

00001 /* This file is part of the KDE project 00002 Copyright (C) 1998, 1999, 2000 Torben Weis <weis@kde.org> 00003 00004 This library is free software; you can redistribute it and/or 00005 modify it under the terms of the GNU Library General Public 00006 License as published by the Free Software Foundation; either 00007 version 2 of the License, or (at your option) any later version. 00008 00009 This library is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 Library General Public License for more details. 00013 00014 You should have received a copy of the GNU Library General Public License 00015 along with this library; see the file COPYING.LIB. If not, write to 00016 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00017 Boston, MA 02111-1307, USA. 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 // #### Do we need this ? 00082 // 1 - it seems border is 0 00083 // 2 - setState will be called anyway 00084 // (David) 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 kdDebug(30003) << "KoFrame::setView setMaximumSize " 00112 << "QMAX32767(" << d->m_view->maximumWidth() + 2 * border() << "," << d->m_view->maximumWidth() << "), " 00113 << "QMAX32767(" << d->m_view->maximumHeight() + 2 * border() << "," << d->m_view->maximumHeight() << ")" 00114 << endl; 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 // if ( d->m_state == Active ) 00252 // d->m_mode = 0; 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 // The other modes change the geometry so they call resizeEvent. 00270 // This one doesn't, so it has to emit geometryChangedby itself. 00271 emit geometryChanged(); 00272 //kdDebug() << "KoFrame::mouseMoveEvent koFrame position is " << x() << "," << y() << endl; 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>
KDE Logo
This file is part of the documentation for lib Library Version 1.3.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Sep 28 04:04:00 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003