summaryrefslogtreecommitdiffabout
path: root/microkde
authorzautrix <zautrix>2005-04-01 22:32:18 (UTC)
committer zautrix <zautrix>2005-04-01 22:32:18 (UTC)
commit02bdd5a73feb7bd2431c5492c7bbf663f28efbd8 (patch) (unidiff)
treec87553742dfa351f4d4ae2308d68dd87cc400304 /microkde
parentefb66afca923f23a94b19da1fa12555956e70844 (diff)
downloadkdepimpi-02bdd5a73feb7bd2431c5492c7bbf663f28efbd8.zip
kdepimpi-02bdd5a73feb7bd2431c5492c7bbf663f28efbd8.tar.gz
kdepimpi-02bdd5a73feb7bd2431c5492c7bbf663f28efbd8.tar.bz2
nf
Diffstat (limited to 'microkde') (more/less context) (ignore whitespace changes)
-rw-r--r--microkde/KDGanttMinimizeSplitter.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/microkde/KDGanttMinimizeSplitter.cpp b/microkde/KDGanttMinimizeSplitter.cpp
index 6cb1f31..253175e 100644
--- a/microkde/KDGanttMinimizeSplitter.cpp
+++ b/microkde/KDGanttMinimizeSplitter.cpp
@@ -1,670 +1,679 @@
1/* -*- Mode: C++ -*- 1/* -*- Mode: C++ -*-
2 $Id$ 2 $Id$
3*/ 3*/
4 4
5/**************************************************************************** 5/****************************************************************************
6 ** Copyright (C) 2002-2004 Klarälvdalens Datakonsult AB. All rights reserved. 6 ** Copyright (C) 2002-2004 Klarälvdalens Datakonsult AB. All rights reserved.
7 ** 7 **
8 ** This file is part of the KDGantt library. 8 ** This file is part of the KDGantt library.
9 ** 9 **
10 ** This file may be distributed and/or modified under the terms of the 10 ** This file may be distributed and/or modified under the terms of the
11 ** GNU General Public License version 2 as published by the Free Software 11 ** GNU General Public License version 2 as published by the Free Software
12 ** Foundation and appearing in the file LICENSE.GPL included in the 12 ** Foundation and appearing in the file LICENSE.GPL included in the
13 ** packaging of this file. 13 ** packaging of this file.
14 ** 14 **
15 ** Licensees holding valid commercial KDGantt licenses may use this file in 15 ** Licensees holding valid commercial KDGantt licenses may use this file in
16 ** accordance with the KDGantt Commercial License Agreement provided with 16 ** accordance with the KDGantt Commercial License Agreement provided with
17 ** the Software. 17 ** the Software.
18 ** 18 **
19 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE 19 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
20 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 20 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21 ** 21 **
22 ** See http://www.klaralvdalens-datakonsult.se/Public/products/ for 22 ** See http://www.klaralvdalens-datakonsult.se/Public/products/ for
23 ** information about KDGantt Commercial License Agreements. 23 ** information about KDGantt Commercial License Agreements.
24 ** 24 **
25 ** Contact info@klaralvdalens-datakonsult.se if any conditions of this 25 ** Contact info@klaralvdalens-datakonsult.se if any conditions of this
26 ** licensing are not clear to you. 26 ** licensing are not clear to you.
27 ** 27 **
28 ** As a special exception, permission is given to link this program 28 ** As a special exception, permission is given to link this program
29 ** with any edition of Qt, and distribute the resulting executable, 29 ** with any edition of Qt, and distribute the resulting executable,
30 ** without including the source code for Qt in the source distribution. 30 ** without including the source code for Qt in the source distribution.
31 ** 31 **
32 **********************************************************************/ 32 **********************************************************************/
33 33
34#include "KDGanttMinimizeSplitter.h" 34#include "KDGanttMinimizeSplitter.h"
35#ifndef QT_NO_SPLITTER___ 35#ifndef QT_NO_SPLITTER___
36 36
37#include "qpainter.h" 37#include "qpainter.h"
38#include "qdrawutil.h" 38#include "qdrawutil.h"
39#include "qbitmap.h" 39#include "qbitmap.h"
40#if QT_VERSION >= 0x030000 40#if QT_VERSION >= 0x030000
41#include "qptrlist.h" 41#include "qptrlist.h"
42#include "qmemarray.h" 42#include "qmemarray.h"
43#else 43#else
44#include <qlist.h> 44#include <qlist.h>
45#include <qarray.h> 45#include <qarray.h>
46#define QPtrList QList 46#define QPtrList QList
47#define QMemArray QArray 47#define QMemArray QArray
48#endif 48#endif
49#include "qlayoutengine_p.h" 49#include "qlayoutengine_p.h"
50#include "qobjectlist.h" 50#include "qobjectlist.h"
51#include "qstyle.h" 51#include "qstyle.h"
52#include "qapplication.h" //sendPostedEvents 52#include "qapplication.h" //sendPostedEvents
53#include <qvaluelist.h> 53#include <qvaluelist.h>
54#include <qcursor.h> 54#include <qcursor.h>
55#ifndef KDGANTT_MASTER_CVS 55#ifndef KDGANTT_MASTER_CVS
56//#include "KDGanttMinimizeSplitter.moc" 56//#include "KDGanttMinimizeSplitter.moc"
57#endif 57#endif
58 58
59 59
60 60
61#ifndef DOXYGEN_SKIP_INTERNAL 61#ifndef DOXYGEN_SKIP_INTERNAL
62 62
63#if QT_VERSION >= 232 63#if QT_VERSION >= 232
64static int mouseOffset; 64static int mouseOffset;
65static int opaqueOldPos = -1; //### there's only one mouse, but this is a bit risky 65static int opaqueOldPos = -1; //### there's only one mouse, but this is a bit risky
66 66
67 67
68KDGanttSplitterHandle::KDGanttSplitterHandle( Qt::Orientation o, 68KDGanttSplitterHandle::KDGanttSplitterHandle( Qt::Orientation o,
69 KDGanttMinimizeSplitter *parent, const char * name ) 69 KDGanttMinimizeSplitter *parent, const char * name )
70 : QWidget( parent, name ), _activeButton( 0 ), _collapsed( false ) 70 : QWidget( parent, name ), _activeButton( 0 ), _collapsed( false )
71{ 71{
72 72
73 if ( QApplication::desktop()->width() > 320 && QApplication::desktop()->width() < 650 ) { 73 if ( QApplication::desktop()->width() > 320 && QApplication::desktop()->width() < 650 ) {
74 mSizeHint = QSize(7,7); 74 mSizeHint = QSize(7,7);
75 mUseOffset = true; 75 mUseOffset = true;
76 } else { 76 } else {
77 mSizeHint = QSize(6,6); 77 mSizeHint = QSize(6,6);
78 mUseOffset = false; 78 mUseOffset = false;
79 } 79 }
80 s = parent; 80 s = parent;
81 setOrientation(o); 81 setOrientation(o);
82 setMouseTracking( true ); 82 setMouseTracking( true );
83 mMouseDown = false; 83 mMouseDown = false;
84 //setMaximumHeight( 5 ); // test only 84 //setMaximumHeight( 5 ); // test only
85} 85}
86 86
87QSize KDGanttSplitterHandle::sizeHint() const 87QSize KDGanttSplitterHandle::sizeHint() const
88{ 88{
89 return mSizeHint; 89 return mSizeHint;
90} 90}
91 91
92void KDGanttSplitterHandle::setOrientation( Qt::Orientation o ) 92void KDGanttSplitterHandle::setOrientation( Qt::Orientation o )
93{ 93{
94 orient = o; 94 orient = o;
95#ifndef QT_NO_CURSOR 95#ifndef QT_NO_CURSOR
96 if ( o == KDGanttMinimizeSplitter::Horizontal ) 96 if ( o == KDGanttMinimizeSplitter::Horizontal )
97 setCursor( splitHCursor ); 97 setCursor( splitHCursor );
98 else 98 else
99 setCursor( splitVCursor ); 99 setCursor( splitVCursor );
100#endif 100#endif
101} 101}
102 102
103 103
104void KDGanttSplitterHandle::mouseMoveEvent( QMouseEvent *e ) 104void KDGanttSplitterHandle::mouseMoveEvent( QMouseEvent *e )
105{ 105{
106 updateCursor( e->pos() ); 106 updateCursor( e->pos() );
107 if ( !(e->state()&LeftButton) ) 107 if ( !(e->state()&LeftButton) )
108 return; 108 return;
109 109
110 if ( _activeButton != 0) 110 if ( _activeButton != 0)
111 return; 111 return;
112 112
113 QCOORD pos = s->pick(parentWidget()->mapFromGlobal(e->globalPos())) 113 QCOORD pos = s->pick(parentWidget()->mapFromGlobal(e->globalPos()))
114 - mouseOffset; 114 - mouseOffset;
115 if ( opaque() ) { 115 if ( opaque() ) {
116 s->moveSplitter( pos, id() ); 116 s->moveSplitter( pos, id() );
117 } else { 117 } else {
118 int min = pos; int max = pos; 118 int min = pos; int max = pos;
119 s->getRange( id(), &min, &max ); 119 s->getRange( id(), &min, &max );
120 s->setRubberband( QMAX( min, QMIN(max, pos ))); 120 s->setRubberband( QMAX( min, QMIN(max, pos )));
121 } 121 }
122 _collapsed = false; 122 _collapsed = false;
123} 123}
124 124
125void KDGanttSplitterHandle::mousePressEvent( QMouseEvent *e ) 125void KDGanttSplitterHandle::mousePressEvent( QMouseEvent *e )
126{ 126{
127 if ( e->button() == LeftButton ) { 127 if ( e->button() == LeftButton ) {
128 _activeButton = onButton( e->pos() ); 128 _activeButton = onButton( e->pos() );
129 mouseOffset = s->pick(e->pos()); 129 mouseOffset = s->pick(e->pos());
130 mMouseDown = true; 130 mMouseDown = true;
131 repaint(); 131 repaint();
132 updateCursor( e->pos() ); 132 updateCursor( e->pos() );
133 } 133 }
134} 134}
135 135
136void KDGanttSplitterHandle::updateCursor( const QPoint& p) 136void KDGanttSplitterHandle::updateCursor( const QPoint& p)
137{ 137{
138 if ( onButton( p ) != 0 ) { 138 if ( onButton( p ) != 0 ) {
139 setCursor( arrowCursor ); 139 setCursor( arrowCursor );
140 } 140 }
141 else { 141 else {
142 if ( orient == KDGanttMinimizeSplitter::Horizontal ) 142 if ( orient == KDGanttMinimizeSplitter::Horizontal )
143 setCursor( splitHCursor ); 143 setCursor( splitHCursor );
144 else 144 else
145 setCursor( splitVCursor ); 145 setCursor( splitVCursor );
146 } 146 }
147} 147}
148void KDGanttSplitterHandle::toggle() 148void KDGanttSplitterHandle::toggle()
149{ 149{
150 int pos; 150 int pos;
151 int min, max; 151 int min, max;
152 if ( !_collapsed ) { 152 if ( !_collapsed ) {
153 s->expandPos( id(), &min, &max ); 153 s->expandPos( id(), &min, &max );
154 if ( s->minimizeDirection() == KDGanttMinimizeSplitter::Left 154 if ( s->minimizeDirection() == KDGanttMinimizeSplitter::Left
155 || s->minimizeDirection() == KDGanttMinimizeSplitter::Up ) { 155 || s->minimizeDirection() == KDGanttMinimizeSplitter::Up ) {
156 pos = min; 156 pos = min;
157 } 157 }
158 else { 158 else {
159 pos = max; 159 pos = max;
160 } 160 }
161 161
162 _origPos = s->pick(mapToParent( QPoint( 0,0 ) )); 162 _origPos = s->pick(mapToParent( QPoint( 0,0 ) ));
163 s->moveSplitter( pos, id() ); 163 s->moveSplitter( pos, id() );
164 _collapsed = true; 164 _collapsed = true;
165 } 165 }
166 else { 166 else {
167 s->moveSplitter( _origPos, id() ); 167 s->moveSplitter( _origPos, id() );
168 _collapsed = false; 168 _collapsed = false;
169 } 169 }
170 repaint(); 170 repaint();
171} 171}
172 172
173void KDGanttSplitterHandle::mouseReleaseEvent( QMouseEvent *e ) 173void KDGanttSplitterHandle::mouseReleaseEvent( QMouseEvent *e )
174{ 174{
175 mMouseDown = false; 175 mMouseDown = false;
176 if ( _activeButton != 0 ) { 176 if ( _activeButton != 0 ) {
177 if ( onButton( e->pos() ) == _activeButton ) 177 if ( onButton( e->pos() ) == _activeButton )
178 { 178 {
179 toggle(); 179 toggle();
180 } 180 }
181 _activeButton = 0; 181 _activeButton = 0;
182 updateCursor( e->pos() ); 182 updateCursor( e->pos() );
183 } 183 }
184 else { 184 else {
185 if ( !opaque() && e->button() == LeftButton ) { 185 if ( !opaque() && e->button() == LeftButton ) {
186 QCOORD pos = s->pick(parentWidget()->mapFromGlobal(e->globalPos())) 186 QCOORD pos = s->pick(parentWidget()->mapFromGlobal(e->globalPos()))
187 - mouseOffset; 187 - mouseOffset;
188 s->setRubberband( -1 ); 188 s->setRubberband( -1 );
189 s->moveSplitter( pos, id() ); 189 s->moveSplitter( pos, id() );
190 } 190 }
191 } 191 }
192 if ( s->rubberBand() ) 192 if ( s->rubberBand() )
193 s->rubberBand()->hide(); 193 s->rubberBand()->hide();
194 repaint(); 194 repaint();
195} 195}
196 196
197int KDGanttSplitterHandle::onButton( const QPoint& p ) 197int KDGanttSplitterHandle::onButton( const QPoint& p )
198{ 198{
199 QValueList<QPointArray> list = buttonRegions(); 199 QValueList<QPointArray> list = buttonRegions();
200 int index = 1; 200 int index = 1;
201 int add = 12; 201 int add = 12;
202 for( QValueList<QPointArray>::Iterator it = list.begin(); it != list.end(); ++it ) { 202 for( QValueList<QPointArray>::Iterator it = list.begin(); it != list.end(); ++it ) {
203 QRect rect = (*it).boundingRect(); 203 QRect rect = (*it).boundingRect();
204 rect.setLeft( rect.left()- add ); 204 rect.setLeft( rect.left()- add );
205 rect.setRight( rect.right() + add); 205 rect.setRight( rect.right() + add);
206 rect.setTop( rect.top()- add ); 206 rect.setTop( rect.top()- add );
207 rect.setBottom( rect.bottom() + add); 207 rect.setBottom( rect.bottom() + add);
208 if ( rect.contains( p ) ) { 208 if ( rect.contains( p ) ) {
209 return index; 209 return index;
210 } 210 }
211 index++; 211 index++;
212 } 212 }
213 return 0; 213 return 0;
214} 214}
215 215
216 216
217QValueList<QPointArray> KDGanttSplitterHandle::buttonRegions() 217QValueList<QPointArray> KDGanttSplitterHandle::buttonRegions()
218{ 218{
219 QValueList<QPointArray> list; 219 QValueList<QPointArray> list;
220 220
221 int sw = 8; 221 int sw = 8;
222 int yyy = 1; 222 int yyy = 1;
223 int xxx = 1; 223 int xxx = 1;
224 int voffset[] = { (int) -sw*3, (int) sw*3 }; 224 int voffset[] = { (int) -sw*3, (int) sw*3 };
225 for ( int i = 0; i < 2; i++ ) { 225 for ( int i = 0; i < 2; i++ ) {
226 QPointArray arr; 226 QPointArray arr;
227 if ( !_collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Right || 227 if ( !_collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Right ||
228 _collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Left) { 228 _collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Left) {
229 int mid = height()/2 + voffset[i]; 229 int mid = height()/2 + voffset[i];
230 arr.setPoints( 3, 230 arr.setPoints( 3,
231 1-xxx, mid - sw + 4, 231 1-xxx, mid - sw + 4,
232 sw-3-xxx, mid, 232 sw-3-xxx, mid,
233 1-xxx, mid + sw -4); 233 1-xxx, mid + sw -4);
234 } 234 }
235 else if ( !_collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Left || 235 else if ( !_collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Left ||
236 _collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Right ) { 236 _collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Right ) {
237 int mid = height()/2 + voffset[i]; 237 int mid = height()/2 + voffset[i];
238 arr.setPoints( 3, 238 arr.setPoints( 3,
239 sw-4, mid - sw + 4, 239 sw-4, mid - sw + 4,
240 0, mid, 240 0, mid,
241 sw-4, mid + sw - 4); 241 sw-4, mid + sw - 4);
242 } 242 }
243 else if ( !_collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Up || 243 else if ( !_collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Up ||
244 _collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Down) { 244 _collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Down) {
245 int mid = width()/2 + voffset[i]; 245 int mid = width()/2 + voffset[i];
246 arr.setPoints( 3, 246 arr.setPoints( 3,
247 mid - sw + 4, sw-4, 247 mid - sw + 4, sw-4,
248 mid, 0, 248 mid, 0,
249 mid + sw - 4, sw-4 ); 249 mid + sw - 4, sw-4 );
250 } 250 }
251 else if ( !_collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Down || 251 else if ( !_collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Down ||
252 _collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Up ) { 252 _collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Up ) {
253 int mid = width()/2 + voffset[i]; 253 int mid = width()/2 + voffset[i];
254 arr.setPoints( 3, 254 arr.setPoints( 3,
255 mid - sw + 4, 1-yyy, 255 mid - sw + 4, 1-yyy,
256 mid, sw-3-yyy, 256 mid, sw-3-yyy,
257 mid + sw -4, 1-yyy); 257 mid + sw -4, 1-yyy);
258 } 258 }
259 list.append( arr ); 259 list.append( arr );
260 } 260 }
261 return list; 261 return list;
262} 262}
263 263
264void KDGanttSplitterHandle::paintEvent( QPaintEvent * ) 264void KDGanttSplitterHandle::paintEvent( QPaintEvent * )
265{ 265{
266 QPixmap buffer( size() ); 266 QPixmap buffer( size() );
267 QPainter p( &buffer ); 267 QPainter p( &buffer );
268 268
269 //LR 269 //LR
270 // Draw the splitter rectangle 270 // Draw the splitter rectangle
271 p.setBrush( colorGroup().background() ); 271 p.setBrush( colorGroup().background() );
272 p.setPen( colorGroup().foreground() ); 272 p.setPen( colorGroup().foreground() );
273 //p.drawRect( rect() ); 273 //p.drawRect( rect() );
274 buffer.fill( colorGroup().background() ); 274#ifndef DESKTOP_VERSION
275 if ( mMouseDown )
276 buffer.fill( QColor( 242,27,255 ) );
277 else
278#endif
279 buffer.fill( colorGroup().background() );
275 //buffer.fill( backgroundColor() ); 280 //buffer.fill( backgroundColor() );
276 // parentWidget()->style().drawPrimitive( QStyle::PE_Panel, &p, rect(), parentWidget()->colorGroup()); 281 // parentWidget()->style().drawPrimitive( QStyle::PE_Panel, &p, rect(), parentWidget()->colorGroup());
277 282
278 int sw = 8; // Hardcoded, given I didn't use styles anymore, I didn't like to use their size 283 int sw = 8; // Hardcoded, given I didn't use styles anymore, I didn't like to use their size
279 284
280 // arrow color 285 // arrow color
281 QColor col; 286 QColor col;
282 if ( _activeButton ) 287 if ( _activeButton )
283 col = colorGroup().background().dark( 250 ); 288 col = colorGroup().background().dark( 250 );
284 else { 289 else {
285 if ( mMouseDown ) 290 if ( mMouseDown )
286 col = Qt::white; 291#ifndef DESKTOP_VERSION
292 col = QColor( 178,18,188);//QColor( 242,27,255 );//Qt::white;
293#else
294 col = Qt::white;
295#endif
287 else 296 else
288 col = colorGroup().background().dark( 150 ); 297 col = colorGroup().background().dark( 150 );
289 } 298 }
290 //QColor col = backgroundColor().dark( 130 ); 299 //QColor col = backgroundColor().dark( 130 );
291 p.setBrush( col ); 300 p.setBrush( col );
292 p.setPen( col ); 301 p.setPen( col );
293 302
294 QValueList<QPointArray> list = buttonRegions(); 303 QValueList<QPointArray> list = buttonRegions();
295 int index = 1; 304 int index = 1;
296 if ( mUseOffset ) 305 if ( mUseOffset )
297 p.translate( 0, 1 ); 306 p.translate( 0, 1 );
298 for ( QValueList<QPointArray>::Iterator it = list.begin(); it != list.end(); ++it ) { 307 for ( QValueList<QPointArray>::Iterator it = list.begin(); it != list.end(); ++it ) {
299 if ( index == _activeButton ) { 308 if ( index == _activeButton ) {
300 309
301 /* 310 /*
302 if ( ! _collapsed ) { 311 if ( ! _collapsed ) {
303 p.save(); 312 p.save();
304 // p.translate( parentWidget()->style().pixelMetric( QStyle::PM_ButtonShiftHorizontal ), 313 // p.translate( parentWidget()->style().pixelMetric( QStyle::PM_ButtonShiftHorizontal ),
305 // parentWidget()->style().pixelMetric( QStyle::PM_ButtonShiftVertical ) ); 314 // parentWidget()->style().pixelMetric( QStyle::PM_ButtonShiftVertical ) );
306 p.translate( -1, 0 ); 315 p.translate( -1, 0 );
307 p.drawPolygon( *it, true ); 316 p.drawPolygon( *it, true );
308 p.restore(); } else 317 p.restore(); } else
309 */ 318 */
310 p.drawPolygon( *it, true ); 319 p.drawPolygon( *it, true );
311 320
312 } 321 }
313 else { 322 else {
314 /* 323 /*
315 if ( ! _collapsed ) { 324 if ( ! _collapsed ) {
316 p.save(); 325 p.save();
317 p.translate( -1, 0 ); 326 p.translate( -1, 0 );
318 p.drawPolygon( *it, true ); 327 p.drawPolygon( *it, true );
319 p.restore(); 328 p.restore();
320 } else 329 } else
321 */ 330 */
322 p.drawPolygon( *it, true ); 331 p.drawPolygon( *it, true );
323 332
324 } 333 }
325 index++; 334 index++;
326 } 335 }
327 336
328 // Draw the lines between the arrows 337 // Draw the lines between the arrows
329 if ( s->minimizeDirection() == KDGanttMinimizeSplitter::Left || 338 if ( s->minimizeDirection() == KDGanttMinimizeSplitter::Left ||
330 s->minimizeDirection() == KDGanttMinimizeSplitter::Right ) { 339 s->minimizeDirection() == KDGanttMinimizeSplitter::Right ) {
331 int mid = height()/2; 340 int mid = height()/2;
332 p.drawLine ( 1, mid - sw, 1, mid + sw ); 341 p.drawLine ( 1, mid - sw, 1, mid + sw );
333 p.drawLine ( 3, mid - sw, 3, mid + sw ); 342 p.drawLine ( 3, mid - sw, 3, mid + sw );
334 } 343 }
335 else if ( s->minimizeDirection() == KDGanttMinimizeSplitter::Up || 344 else if ( s->minimizeDirection() == KDGanttMinimizeSplitter::Up ||
336 s->minimizeDirection() == KDGanttMinimizeSplitter::Down ) { 345 s->minimizeDirection() == KDGanttMinimizeSplitter::Down ) {
337 int mid = width()/2; 346 int mid = width()/2;
338 p.drawLine( mid -sw, 1, mid +sw, 1 ); 347 p.drawLine( mid -sw, 1, mid +sw, 1 );
339 p.drawLine( mid -sw, 3, mid +sw, 3 ); 348 p.drawLine( mid -sw, 3, mid +sw, 3 );
340 } 349 }
341 bitBlt( this, 0, 0, &buffer ); 350 bitBlt( this, 0, 0, &buffer );
342 351
343} 352}
344#endif 353#endif
345 354
346class QSplitterLayoutStruct 355class QSplitterLayoutStruct
347{ 356{
348public: 357public:
349 KDGanttMinimizeSplitter::ResizeMode mode; 358 KDGanttMinimizeSplitter::ResizeMode mode;
350 QCOORD sizer; 359 QCOORD sizer;
351 bool isSplitter; 360 bool isSplitter;
352 QWidget *wid; 361 QWidget *wid;
353}; 362};
354 363
355class QSplitterData 364class QSplitterData
356{ 365{
357public: 366public:
358 QSplitterData() : opaque( FALSE ), firstShow( TRUE ) {} 367 QSplitterData() : opaque( FALSE ), firstShow( TRUE ) {}
359 368
360 QPtrList<QSplitterLayoutStruct> list; 369 QPtrList<QSplitterLayoutStruct> list;
361 bool opaque; 370 bool opaque;
362 bool firstShow; 371 bool firstShow;
363}; 372};
364 373
365void kdganttGeomCalc( QMemArray<QLayoutStruct> &chain, int start, int count, int pos, 374void kdganttGeomCalc( QMemArray<QLayoutStruct> &chain, int start, int count, int pos,
366 int space, int spacer ); 375 int space, int spacer );
367#endif // DOXYGEN_SKIP_INTERNAL 376#endif // DOXYGEN_SKIP_INTERNAL
368 377
369 378
370/*! 379/*!
371 \class KDGanttMinimizeSplitter KDGanttMinimizeSplitter.h 380 \class KDGanttMinimizeSplitter KDGanttMinimizeSplitter.h
372 \brief The KDGanttMinimizeSplitter class implements a splitter 381 \brief The KDGanttMinimizeSplitter class implements a splitter
373 widget with minimize buttons. 382 widget with minimize buttons.
374 383
375 This class (and its documentation) is largely a copy of Qt's 384 This class (and its documentation) is largely a copy of Qt's
376 QSplitter; the copying was necessary because QSplitter is not 385 QSplitter; the copying was necessary because QSplitter is not
377 extensible at all. QSplitter and its documentation are licensed 386 extensible at all. QSplitter and its documentation are licensed
378 according to the GPL and the Qt Professional License (if you hold 387 according to the GPL and the Qt Professional License (if you hold
379 such a license) and are (C) Trolltech AS. 388 such a license) and are (C) Trolltech AS.
380 389
381 A splitter lets the user control the size of child widgets by 390 A splitter lets the user control the size of child widgets by
382 dragging the boundary between the children. Any number of widgets 391 dragging the boundary between the children. Any number of widgets
383 may be controlled. 392 may be controlled.
384 393
385 To show a QListBox, a QListView and a QTextEdit side by side: 394 To show a QListBox, a QListView and a QTextEdit side by side:
386 395
387 \code 396 \code
388 KDGanttMinimizeSplitter *split = new KDGanttMinimizeSplitter( parent ); 397 KDGanttMinimizeSplitter *split = new KDGanttMinimizeSplitter( parent );
389 QListBox *lb = new QListBox( split ); 398 QListBox *lb = new QListBox( split );
390 QListView *lv = new QListView( split ); 399 QListView *lv = new QListView( split );
391 QTextEdit *ed = new QTextEdit( split ); 400 QTextEdit *ed = new QTextEdit( split );
392 \endcode 401 \endcode
393 402
394 In KDGanttMinimizeSplitter, the boundary can be either horizontal or 403 In KDGanttMinimizeSplitter, the boundary can be either horizontal or
395 vertical. The default is horizontal (the children are side by side) 404 vertical. The default is horizontal (the children are side by side)
396 but you can use setOrientation( QSplitter::Vertical ) to set it to 405 but you can use setOrientation( QSplitter::Vertical ) to set it to
397 vertical. 406 vertical.
398 407
399 Use setResizeMode() to specify 408 Use setResizeMode() to specify
400 that a widget should keep its size when the splitter is resized. 409 that a widget should keep its size when the splitter is resized.
401 410
402 Although KDGanttMinimizeSplitter normally resizes the children only 411 Although KDGanttMinimizeSplitter normally resizes the children only
403 at the end of a resize operation, if you call setOpaqueResize( TRUE 412 at the end of a resize operation, if you call setOpaqueResize( TRUE
404 ) the widgets are resized as often as possible. 413 ) the widgets are resized as often as possible.
405 414
406 The initial distribution of size between the widgets is determined 415 The initial distribution of size between the widgets is determined
407 by the initial size of each widget. You can also use setSizes() to 416 by the initial size of each widget. You can also use setSizes() to
408 set the sizes of all the widgets. The function sizes() returns the 417 set the sizes of all the widgets. The function sizes() returns the
409 sizes set by the user. 418 sizes set by the user.
410 419
411 If you hide() a child, its space will be distributed among the other 420 If you hide() a child, its space will be distributed among the other
412 children. It will be reinstated when you show() it again. It is also 421 children. It will be reinstated when you show() it again. It is also
413 possible to reorder the widgets within the splitter using 422 possible to reorder the widgets within the splitter using
414 moveToFirst() and moveToLast(). 423 moveToFirst() and moveToLast().
415*/ 424*/
416 425
417 426
418 427
419static QSize minSize( const QWidget* /*w*/ ) 428static QSize minSize( const QWidget* /*w*/ )
420{ 429{
421 return QSize(0,0); 430 return QSize(0,0);
422} 431}
423 432
424// This is the original version of minSize 433// This is the original version of minSize
425static QSize minSizeHint( const QWidget* w ) 434static QSize minSizeHint( const QWidget* w )
426{ 435{
427 QSize min = w->minimumSize(); 436 QSize min = w->minimumSize();
428 QSize s; 437 QSize s;
429 if ( min.height() <= 0 || min.width() <= 0 ) 438 if ( min.height() <= 0 || min.width() <= 0 )
430 s = w->minimumSizeHint(); 439 s = w->minimumSizeHint();
431 if ( min.height() > 0 ) 440 if ( min.height() > 0 )
432 s.setHeight( min.height() ); 441 s.setHeight( min.height() );
433 if ( min.width() > 0 ) 442 if ( min.width() > 0 )
434 s.setWidth( min.width() ); 443 s.setWidth( min.width() );
435 return s.expandedTo(QSize(0,0)); 444 return s.expandedTo(QSize(0,0));
436} 445}
437 446
438 447
439/*! 448/*!
440 Constructs a horizontal splitter with the \a parent and \a 449 Constructs a horizontal splitter with the \a parent and \a
441 name arguments being passed on to the QFrame constructor. 450 name arguments being passed on to the QFrame constructor.
442*/ 451*/
443KDGanttMinimizeSplitter::KDGanttMinimizeSplitter( QWidget *parent, const char *name ) 452KDGanttMinimizeSplitter::KDGanttMinimizeSplitter( QWidget *parent, const char *name )
444 :QFrame(parent,name,WPaintUnclipped) 453 :QFrame(parent,name,WPaintUnclipped)
445{ 454{
446 mRubberBand = 0; 455 mRubberBand = 0;
447 mFirstHandle = 0; 456 mFirstHandle = 0;
448#if QT_VERSION >= 232 457#if QT_VERSION >= 232
449 orient = Horizontal; 458 orient = Horizontal;
450 init(); 459 init();
451#endif 460#endif
452} 461}
453 462
454/*! 463/*!
455 Constructs a splitter with orientation \a o with the \a parent 464 Constructs a splitter with orientation \a o with the \a parent
456 and \a name arguments being passed on to the QFrame constructor. 465 and \a name arguments being passed on to the QFrame constructor.
457*/ 466*/
458KDGanttMinimizeSplitter::KDGanttMinimizeSplitter( Orientation o, QWidget *parent, const char *name ) 467KDGanttMinimizeSplitter::KDGanttMinimizeSplitter( Orientation o, QWidget *parent, const char *name )
459 :QFrame(parent,name,WPaintUnclipped) 468 :QFrame(parent,name,WPaintUnclipped)
460{ 469{
461 470
462 mRubberBand = 0; 471 mRubberBand = 0;
463 mFirstHandle = 0; 472 mFirstHandle = 0;
464#if QT_VERSION >= 232 473#if QT_VERSION >= 232
465 orient = o; 474 orient = o;
466 init(); 475 init();
467#endif 476#endif
468} 477}
469 478
470/*! 479/*!
471 Destroys the splitter and any children. 480 Destroys the splitter and any children.
472*/ 481*/
473KDGanttMinimizeSplitter::~KDGanttMinimizeSplitter() 482KDGanttMinimizeSplitter::~KDGanttMinimizeSplitter()
474{ 483{
475#if QT_VERSION >= 232 484#if QT_VERSION >= 232
476 data->list.setAutoDelete( TRUE ); 485 data->list.setAutoDelete( TRUE );
477 delete data; 486 delete data;
478#endif 487#endif
479 if ( mRubberBand ) 488 if ( mRubberBand )
480 delete mRubberBand; 489 delete mRubberBand;
481} 490}
482 491
483 492
484#if QT_VERSION >= 232 493#if QT_VERSION >= 232
485void KDGanttMinimizeSplitter::init() 494void KDGanttMinimizeSplitter::init()
486{ 495{
487 data = new QSplitterData; 496 data = new QSplitterData;
488 if ( orient == Horizontal ) 497 if ( orient == Horizontal )
489 setSizePolicy( QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum) ); 498 setSizePolicy( QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum) );
490 else 499 else
491 setSizePolicy( QSizePolicy(QSizePolicy::Minimum,QSizePolicy::Expanding) ); 500 setSizePolicy( QSizePolicy(QSizePolicy::Minimum,QSizePolicy::Expanding) );
492#ifndef DESKTOP_VERSION 501#ifndef DESKTOP_VERSION
493 setOpaqueResize( false ); 502 setOpaqueResize( false );
494#else 503#else
495 setOpaqueResize( true ); 504 setOpaqueResize( true );
496#endif 505#endif
497} 506}
498#endif 507#endif
499 508
500 509
501void KDGanttMinimizeSplitter::toggle() 510void KDGanttMinimizeSplitter::toggle()
502{ 511{
503 if ( mFirstHandle ) 512 if ( mFirstHandle )
504 mFirstHandle->toggle(); 513 mFirstHandle->toggle();
505 else 514 else
506 qDebug("KDGanttMinimizeSplitter::toggle::sorry, handle not available "); 515 qDebug("KDGanttMinimizeSplitter::toggle::sorry, handle not available ");
507 516
508} 517}
509 518
510 519
511/*! 520/*!
512 \brief the orientation of the splitter 521 \brief the orientation of the splitter
513 522
514 By default the orientation is horizontal (the widgets are side by side). 523 By default the orientation is horizontal (the widgets are side by side).
515 The possible orientations are Qt:Vertical and Qt::Horizontal (the default). 524 The possible orientations are Qt:Vertical and Qt::Horizontal (the default).
516*/ 525*/
517void KDGanttMinimizeSplitter::setOrientation( Orientation o ) 526void KDGanttMinimizeSplitter::setOrientation( Orientation o )
518{ 527{
519#if QT_VERSION >= 232 528#if QT_VERSION >= 232
520 if ( orient == o ) 529 if ( orient == o )
521 return; 530 return;
522 orient = o; 531 orient = o;
523 532
524 if ( orient == Horizontal ) 533 if ( orient == Horizontal )
525 setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ) ); 534 setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ) );
526 else 535 else
527 setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Expanding ) ); 536 setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Expanding ) );
528 537
529 QSplitterLayoutStruct *s = data->list.first(); 538 QSplitterLayoutStruct *s = data->list.first();
530 while ( s ) { 539 while ( s ) {
531 if ( s->isSplitter ) 540 if ( s->isSplitter )
532 ((KDGanttSplitterHandle*)s->wid)->setOrientation( o ); 541 ((KDGanttSplitterHandle*)s->wid)->setOrientation( o );
533 s = data->list.next(); // ### next at end of loop, no iterator 542 s = data->list.next(); // ### next at end of loop, no iterator
534 } 543 }
535 recalc( isVisible() ); 544 recalc( isVisible() );
536#endif 545#endif
537} 546}
538 547
539 548
540#if QT_VERSION >= 232 549#if QT_VERSION >= 232
541/*! 550/*!
542 \reimp 551 \reimp
543*/ 552*/
544void KDGanttMinimizeSplitter::resizeEvent( QResizeEvent * ) 553void KDGanttMinimizeSplitter::resizeEvent( QResizeEvent * )
545{ 554{
546 doResize(); 555 doResize();
547} 556}
548 557
549 558
550/* 559/*
551 Inserts the widget \a w at the end (or at the beginning if \a first 560 Inserts the widget \a w at the end (or at the beginning if \a first
552 is TRUE) of the splitter's list of widgets. 561 is TRUE) of the splitter's list of widgets.
553 562
554 It is the responsibility of the caller of this function to make sure 563 It is the responsibility of the caller of this function to make sure
555 that \a w is not already in the splitter and to call recalcId if 564 that \a w is not already in the splitter and to call recalcId if
556 needed. (If \a first is TRUE, then recalcId is very probably 565 needed. (If \a first is TRUE, then recalcId is very probably
557 needed.) 566 needed.)
558*/ 567*/
559QSplitterLayoutStruct *KDGanttMinimizeSplitter::addWidget( QWidget *w, bool first ) 568QSplitterLayoutStruct *KDGanttMinimizeSplitter::addWidget( QWidget *w, bool first )
560{ 569{
561 QSplitterLayoutStruct *s; 570 QSplitterLayoutStruct *s;
562 KDGanttSplitterHandle *newHandle = 0; 571 KDGanttSplitterHandle *newHandle = 0;
563 if ( data->list.count() > 0 ) { 572 if ( data->list.count() > 0 ) {
564 s = new QSplitterLayoutStruct; 573 s = new QSplitterLayoutStruct;
565 s->mode = KeepSize; 574 s->mode = KeepSize;
566 QString tmp = "qt_splithandle_"; 575 QString tmp = "qt_splithandle_";
567 tmp += w->name(); 576 tmp += w->name();
568 newHandle = new KDGanttSplitterHandle( orientation(), this, tmp.latin1() ); 577 newHandle = new KDGanttSplitterHandle( orientation(), this, tmp.latin1() );
569 if ( ! mFirstHandle ) 578 if ( ! mFirstHandle )
570 mFirstHandle = newHandle; 579 mFirstHandle = newHandle;
571 s->wid = newHandle; 580 s->wid = newHandle;
572 newHandle->setId(data->list.count()); 581 newHandle->setId(data->list.count());
573 s->isSplitter = TRUE; 582 s->isSplitter = TRUE;
574 s->sizer = pick( newHandle->sizeHint() ); 583 s->sizer = pick( newHandle->sizeHint() );
575 if ( first ) 584 if ( first )
576 data->list.insert( 0, s ); 585 data->list.insert( 0, s );
577 else 586 else
578 data->list.append( s ); 587 data->list.append( s );
579 } 588 }
580 s = new QSplitterLayoutStruct; 589 s = new QSplitterLayoutStruct;
581 s->mode = Stretch; 590 s->mode = Stretch;
582 s->wid = w; 591 s->wid = w;
583 if ( !testWState( WState_Resized ) && w->sizeHint().isValid() ) 592 if ( !testWState( WState_Resized ) && w->sizeHint().isValid() )
584 s->sizer = pick( w->sizeHint() ); 593 s->sizer = pick( w->sizeHint() );
585 else 594 else
586 s->sizer = pick( w->size() ); 595 s->sizer = pick( w->size() );
587 s->isSplitter = FALSE; 596 s->isSplitter = FALSE;
588 if ( first ) 597 if ( first )
589 data->list.insert( 0, s ); 598 data->list.insert( 0, s );
590 else 599 else
591 data->list.append( s ); 600 data->list.append( s );
592 if ( newHandle && isVisible() ) 601 if ( newHandle && isVisible() )
593 newHandle->show(); //will trigger sending of post events 602 newHandle->show(); //will trigger sending of post events
594 return s; 603 return s;
595} 604}
596 605
597 606
598/*! 607/*!
599 Tells the splitter that a child widget has been inserted or removed. 608 Tells the splitter that a child widget has been inserted or removed.
600 The event is passed in \a c. 609 The event is passed in \a c.
601*/ 610*/
602void KDGanttMinimizeSplitter::childEvent( QChildEvent *c ) 611void KDGanttMinimizeSplitter::childEvent( QChildEvent *c )
603{ 612{
604 if ( c->type() == QEvent::ChildInserted ) { 613 if ( c->type() == QEvent::ChildInserted ) {
605 if ( !c->child()->isWidgetType() ) 614 if ( !c->child()->isWidgetType() )
606 return; 615 return;
607 616
608 if ( ((QWidget*)c->child())->testWFlags( WType_TopLevel ) ) 617 if ( ((QWidget*)c->child())->testWFlags( WType_TopLevel ) )
609 return; 618 return;
610 619
611 QSplitterLayoutStruct *s = data->list.first(); 620 QSplitterLayoutStruct *s = data->list.first();
612 while ( s ) { 621 while ( s ) {
613 if ( s->wid == c->child() ) 622 if ( s->wid == c->child() )
614 return; 623 return;
615 s = data->list.next(); 624 s = data->list.next();
616 } 625 }
617 addWidget( (QWidget*)c->child() ); 626 addWidget( (QWidget*)c->child() );
618 recalc( isVisible() ); 627 recalc( isVisible() );
619 628
620 } else if ( c->type() == QEvent::ChildRemoved ) { 629 } else if ( c->type() == QEvent::ChildRemoved ) {
621 QSplitterLayoutStruct *p = 0; 630 QSplitterLayoutStruct *p = 0;
622 if ( data->list.count() > 1 ) 631 if ( data->list.count() > 1 )
623 p = data->list.at(1); //remove handle _after_ first widget. 632 p = data->list.at(1); //remove handle _after_ first widget.
624 QSplitterLayoutStruct *s = data->list.first(); 633 QSplitterLayoutStruct *s = data->list.first();
625 while ( s ) { 634 while ( s ) {
626 if ( s->wid == c->child() ) { 635 if ( s->wid == c->child() ) {
627 data->list.removeRef( s ); 636 data->list.removeRef( s );
628 delete s; 637 delete s;
629 if ( p && p->isSplitter ) { 638 if ( p && p->isSplitter ) {
630 data->list.removeRef( p ); 639 data->list.removeRef( p );
631 delete p->wid; //will call childEvent 640 delete p->wid; //will call childEvent
632 delete p; 641 delete p;
633 } 642 }
634 recalcId(); 643 recalcId();
635 doResize(); 644 doResize();
636 return; 645 return;
637 } 646 }
638 p = s; 647 p = s;
639 s = data->list.next(); 648 s = data->list.next();
640 } 649 }
641 } 650 }
642} 651}
643 652
644 653
645/*! 654/*!
646 Shows a rubber band at position \a p. If \a p is negative, the 655 Shows a rubber band at position \a p. If \a p is negative, the
647 rubber band is removed. 656 rubber band is removed.
648*/ 657*/
649void KDGanttMinimizeSplitter::setRubberband( int p ) 658void KDGanttMinimizeSplitter::setRubberband( int p )
650{ 659{
651#ifdef DESKTOP_VERSION 660#ifdef DESKTOP_VERSION
652 QPainter paint( this ); 661 QPainter paint( this );
653 paint.setPen( gray ); 662 paint.setPen( gray );
654 paint.setBrush( gray ); 663 paint.setBrush( gray );
655 paint.setRasterOp( XorROP ); 664 paint.setRasterOp( XorROP );
656 QRect r = contentsRect(); 665 QRect r = contentsRect();
657 const int rBord = 3; //Themable???? 666 const int rBord = 3; //Themable????
658#if QT_VERSION >= 0x030000 667#if QT_VERSION >= 0x030000
659 int sw = style().pixelMetric(QStyle::PM_SplitterWidth, this); 668 int sw = style().pixelMetric(QStyle::PM_SplitterWidth, this);
660#else 669#else
661 int sw = style().splitterWidth(); 670 int sw = style().splitterWidth();
662#endif 671#endif
663 if ( orient == Horizontal ) { 672 if ( orient == Horizontal ) {
664 if ( opaqueOldPos >= 0 ) 673 if ( opaqueOldPos >= 0 )
665 paint.drawRect( opaqueOldPos + sw/2 - rBord , r.y(), 674 paint.drawRect( opaqueOldPos + sw/2 - rBord , r.y(),
666 2*rBord, r.height() ); 675 2*rBord, r.height() );
667 if ( p >= 0 ) 676 if ( p >= 0 )
668 paint.drawRect( p + sw/2 - rBord, r.y(), 2*rBord, r.height() ); 677 paint.drawRect( p + sw/2 - rBord, r.y(), 2*rBord, r.height() );
669 } else { 678 } else {
670 if ( opaqueOldPos >= 0 ) 679 if ( opaqueOldPos >= 0 )