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     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       kdDebug(30003) << "KoFrame::setView setMaximumSize "
00100               << "QMAX32767(" << d->m_view->maximumWidth() + 2 * border() << "," << d->m_view->maximumWidth() << "), "
00101               << "QMAX32767(" << d->m_view->maximumHeight() + 2 * border() << "," <<  d->m_view->maximumHeight() << ")"
00102               << endl;
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   //  if ( d->m_state == Active )
00240   //    d->m_mode = 0;
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       // The other modes change the geometry so they call resizeEvent.
00258       // This one doesn't, so it has to emit geometryChangedby itself.
00259       emit geometryChanged();
00260       //kdDebug() << "KoFrame::mouseMoveEvent koFrame position is " << x() << "," << y() << endl;
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>
KDE Logo
This file is part of the documentation for lib Library Version 1.4.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Mon Feb 13 09:40:01 2006 by doxygen 1.4.2 written by Dimitri van Heesch, © 1997-2003