KDGanttSemiSizingControl.cpp
00001 /* -*- Mode: C++ -*- 00002 $Id$ 00003 */ 00004 00005 /**************************************************************************** 00006 ** Copyright (C) 2002-2004 Klarälvdalens Datakonsult AB. All rights reserved. 00007 ** 00008 ** This file is part of the KDGantt library. 00009 ** 00010 ** This file may be distributed and/or modified under the terms of the 00011 ** GNU General Public License version 2 as published by the Free Software 00012 ** Foundation and appearing in the file LICENSE.GPL included in the 00013 ** packaging of this file. 00014 ** 00015 ** Licensees holding valid commercial KDGantt licenses may use this file in 00016 ** accordance with the KDGantt Commercial License Agreement provided with 00017 ** the Software. 00018 ** 00019 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 00020 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 00021 ** 00022 ** See http://www.klaralvdalens-datakonsult.se/Public/products/ for 00023 ** information about KDGantt Commercial License Agreements. 00024 ** 00025 ** Contact info@klaralvdalens-datakonsult.se if any conditions of this 00026 ** licensing are not clear to you. 00027 ** 00028 ** As a special exception, permission is given to link this program 00029 ** with any edition of TQt, and distribute the resulting executable, 00030 ** without including the source code for TQt in the source distribution. 00031 ** 00032 **********************************************************************/ 00033 00034 00035 #include "KDGanttSemiSizingControl.h" 00036 #include <tqpushbutton.h> 00037 #include <tqpointarray.h> 00038 #include <tqpainter.h> 00039 #include <tqbitmap.h> 00040 #include <tqtooltip.h> 00041 #include <tqwhatsthis.h> 00066 KDGanttSemiSizingControl::KDGanttSemiSizingControl( TQWidget* parent, 00067 const char* name ) : 00068 KDGanttSizingControl( parent, name ), _orient( Qt::Horizontal ), 00069 _arrowPos( Before ), _minimizedWidget(0), _maximizedWidget(0) 00070 { 00071 init(); 00072 } 00073 00074 00087 KDGanttSemiSizingControl::KDGanttSemiSizingControl( Qt::Orientation orientation, 00088 TQWidget* parent, 00089 const char* name ) : 00090 KDGanttSizingControl( parent, name ), _orient( orientation ), 00091 _arrowPos( Before ), _minimizedWidget(0), _maximizedWidget(0) 00092 { 00093 init(); 00094 } 00095 00096 00110 KDGanttSemiSizingControl::KDGanttSemiSizingControl( ArrowPosition arrowPosition, 00111 Qt::Orientation orientation, 00112 TQWidget* parent, 00113 const char* name ) : 00114 KDGanttSizingControl( parent, name ), _orient( orientation ), 00115 _arrowPos( arrowPosition ), _minimizedWidget(0), _maximizedWidget(0) 00116 { 00117 init(); 00118 } 00119 00120 00130 void KDGanttSemiSizingControl::setMinimizedWidget( TQWidget* widget ) 00131 { 00132 _minimizedWidget = widget; 00133 if( _minimizedWidget ) _minimizedWidget->hide(); 00134 setup(); 00135 } 00136 00137 00146 TQWidget* KDGanttSemiSizingControl::minimizedWidget() const 00147 { 00148 return _minimizedWidget; 00149 } 00150 00160 void KDGanttSemiSizingControl::setMaximizedWidget( TQWidget* widget ) 00161 { 00162 _maximizedWidget = widget; 00163 //if( _maximizedWidget ) _maximizedWidget->show(); 00164 setup(); 00165 } 00166 00175 TQWidget* KDGanttSemiSizingControl::maximizedWidget() const 00176 { 00177 return _maximizedWidget; 00178 } 00179 00180 00181 00189 void KDGanttSemiSizingControl::setOrientation( Qt::Orientation orientation ) 00190 { 00191 if ( _orient != orientation ) { 00192 _orient = orientation; 00193 setup(); 00194 } 00195 } 00196 00197 00204 Qt::Orientation KDGanttSemiSizingControl::orientation() const 00205 { 00206 return _orient; 00207 } 00208 00209 00217 void KDGanttSemiSizingControl::setArrowPosition( ArrowPosition arrowPosition ) 00218 { 00219 if ( _arrowPos != arrowPosition ) { 00220 _arrowPos = arrowPosition; 00221 setup(); 00222 } 00223 } 00224 00225 00233 KDGanttSemiSizingControl::ArrowPosition KDGanttSemiSizingControl::arrowPosition() const 00234 { 00235 return _arrowPos; 00236 } 00237 00238 00247 void KDGanttSemiSizingControl::init() 00248 { 00249 _but = new TQPushButton( this ); 00250 _but->setSizePolicy( TQSizePolicy( TQSizePolicy::Fixed, TQSizePolicy::Fixed ) ); 00251 connect( _but, TQT_SIGNAL( clicked() ), this, TQT_SLOT(changeState()) ); 00252 _layout = 0; 00253 TQWhatsThis::add( _but, "Click on this button to show the \nlegend at the bottom of the widget"); 00254 TQToolTip::add( _but, "Show / hide legend"); 00255 00256 00257 } 00258 00259 void KDGanttSemiSizingControl::setup() 00260 { 00261 //-------------------------------------------------- Setup layout 00262 delete _layout; 00263 TQBoxLayout* butLayout; // _layout will delete me 00264 00265 if ( _orient == Qt::Horizontal || isMinimized() ) 00266 _layout = new TQHBoxLayout( this ); 00267 else 00268 _layout = new TQVBoxLayout( this ); 00269 00270 if ( _orient == Qt::Vertical && !isMinimized() ) 00271 butLayout = new TQHBoxLayout( _layout ); 00272 else 00273 butLayout = new TQVBoxLayout( _layout ); 00274 00275 00276 00277 //---------------------------------------- Set the arrow on the button 00278 if ( !isMinimized() ) { 00279 _but->setPixmap( pixmap( Down ) ); 00280 } 00281 else { 00282 if ( _arrowPos == Before ) { 00283 _but->setPixmap( pixmap( Right ) ); 00284 } 00285 else { 00286 _but->setPixmap( pixmap( Left ) ); 00287 } 00288 } 00289 00290 //------------------------------ Setup the button at the correct possition 00291 if ( _arrowPos == After && _orient == Qt::Vertical && !isMinimized() ) { 00292 butLayout->addStretch( 1 ); 00293 butLayout->addWidget( _but, 0, TQt::AlignLeft ); 00294 } 00295 else { 00296 butLayout->addWidget( _but, 0, TQt::AlignRight ); 00297 butLayout->addStretch( 1 ); 00298 } 00299 00300 // Set widget in the correct possition 00301 TQWidget* widget; 00302 /* ************************** old code *************** 00303 if ( isMinimized() ) 00304 widget = _minimizedWidget; 00305 else 00306 widget = _maximizedWidget; 00307 if( widget ) { 00308 if ( _arrowPos == Before || _orient == Qt::Vertical && !isMinimized() ) 00309 _layout->addWidget( widget, 1 ); 00310 else 00311 _layout->insertWidget( 0, widget, 1 ); 00312 } 00313 ************************************************** */ 00314 // hack for the usage in KDGantt as pop-up legend widget 00315 // for this purpose, 00316 // the _maximizedWidget must be a child of the parent of this widget 00317 00318 if ( isMinimized() ) { 00319 widget = _minimizedWidget; 00320 if( widget ) { 00321 if ( _arrowPos == Before || _orient == Qt::Vertical && !isMinimized() ) 00322 _layout->addWidget( widget, 1 ); 00323 else 00324 _layout->insertWidget( 0, widget, 1 ); 00325 } 00326 } 00327 else { 00328 if ( _arrowPos == Before || _orient == Qt::Vertical && !isMinimized() ) 00329 _layout->addStretch( 1 ); 00330 else 00331 _layout->insertStretch( 0, 1 ); 00332 widget = _maximizedWidget; 00333 // the following is only the special case 00334 // arrowPos == Before and _orient == Qt::Vertical 00335 //widget->move( 0+x(), _but->height()+y()); 00336 } 00337 } 00338 00339 00348 void KDGanttSemiSizingControl::restore( bool restore ) 00349 { 00350 if ( ! restore ) { 00351 minimize( true ); 00352 } 00353 else { 00354 if( _maximizedWidget ) _maximizedWidget->show(); 00355 if( _minimizedWidget ) _minimizedWidget->hide(); 00356 KDGanttSizingControl::restore( restore ); 00357 setup(); 00358 } 00359 } 00360 00370 void KDGanttSemiSizingControl::minimize( bool minimize ) 00371 { 00372 if ( ! minimize ) { 00373 restore( true ); 00374 } 00375 else { 00376 if( _minimizedWidget ) _minimizedWidget->show(); 00377 if( _maximizedWidget ) _maximizedWidget->hide(); 00378 KDGanttSizingControl::minimize( minimize ); 00379 setup(); 00380 } 00381 } 00382 00383 TQPixmap KDGanttSemiSizingControl::pixmap( Direction direction ) { 00384 int s = 10; 00385 TQPixmap pix( s, s ); 00386 pix.fill( blue ); 00387 00388 TQPointArray arr; 00389 switch ( direction ) { 00390 case Up: arr.setPoints( 3, 0, s-1, s-1, s-1, 0, s/2 ); ;break; 00391 case Down: arr.setPoints( 3, 0, 0, s-1, 0, s/2, s-1 ); break; 00392 case Left: arr.setPoints( 3, s-1, 0, s-1, s-1, 0, s/2 ); break; 00393 case Right: arr.setPoints( 3, 0,0, s-1, s/2, 0, s-1 ); break; 00394 } 00395 00396 TQPainter p( &pix ); 00397 p.setPen( black ); 00398 p.setBrush( colorGroup().button() ); 00399 p.drawPolygon( arr ); 00400 TQBitmap bit( s, s ); 00401 bit.fill( color0 ); 00402 00403 TQPainter p2( &bit ); 00404 p2.setPen( color1 ); 00405 p2.setBrush( color1 ); 00406 p2.drawPolygon( arr ); 00407 pix.setMask( bit ); 00408 return pix; 00409 } 00410 00411 #ifndef KDGANTT_MASTER_CVS 00412 #include "KDGanttSemiSizingControl.moc" 00413 #endif