F:/KPlato/koffice/libs/kofficecore/KoFrame.cpp

Aller à la documentation de ce fichier.
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., 51 Franklin Street, Fifth Floor,
00017  * Boston, MA 02110-1301, USA.
00018 */
00019 
00020 #include <KoFrame.h>
00021 #include <KoView.h>
00022 
00023 #include <QPainter>
00024 //Added by qt3to4:
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* /*name*/ )
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       kDebug(30003) << "KoFrame::setView setMaximumSize "
00106               << "qMax32767(" << d->m_view->maximumWidth() + 2 * border() << "," << d->m_view->maximumWidth() << "), "
00107               << "qMax32767(" << d->m_view->maximumHeight() + 2 * border() << "," <<  d->m_view->maximumHeight() << ")"
00108               << endl;
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   //  if ( d->m_state == Active )
00246   //    d->m_mode = 0;
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       // The other modes change the geometry so they call resizeEvent.
00264       // This one doesn't, so it has to emit geometryChangedby itself.
00265       emit geometryChanged();
00266       //kDebug() << "KoFrame::mouseMoveEvent koFrame position is " << x() << "," << y() << endl;
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>

Généré le Wed Nov 22 23:41:03 2006 pour KPlato par  doxygen 1.5.1-p1