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.5.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Nov 17 13:19:23 2004 by doxygen 1.3.5 written by Dimitri van Heesch, © 1997-2003