34#include "KDGanttMinimizeSplitter.h"
35#ifndef TQT_NO_SPLITTER
38#include "tqdrawutil.h"
41#include "tqmemarray.h"
43#include "tqlayoutengine_p.h"
44#include "tqobjectlist.h"
46#include "tqapplication.h"
47#include <tqvaluelist.h>
49#ifndef KDGANTT_MASTER_CVS
50#include "KDGanttMinimizeSplitter.moc"
54#ifndef DOXYGEN_SKIP_INTERNAL
56static int mouseOffset;
57static int opaqueOldPos = -1;
60KDGanttSplitterHandle::KDGanttSplitterHandle( TQt::Orientation o,
62 : TQWidget( parent, name ), _activeButton( 0 ), _collapsed( false )
66 setMouseTracking(
true );
69TQSize KDGanttSplitterHandle::sizeHint()
const
74void KDGanttSplitterHandle::setOrientation( TQt::Orientation o )
78 if ( o == TQt::Horizontal )
79 setCursor( splitHCursor );
81 setCursor( splitVCursor );
86void KDGanttSplitterHandle::mouseMoveEvent( TQMouseEvent *e )
88 updateCursor( e->pos() );
89 if ( !(e->state()&TQt::LeftButton) )
92 if ( _activeButton != 0)
95 TQCOORD pos = s->pick(parentWidget()->mapFromGlobal(e->globalPos()))
98 s->moveSplitter( pos,
id() );
100 int min = pos;
int max = pos;
101 s->getRange(
id(), &min, &max );
102 s->setRubberband( TQMAX( min, TQMIN(max, pos )));
107void KDGanttSplitterHandle::mousePressEvent( TQMouseEvent *e )
109 if ( e->button() == TQt::LeftButton ) {
110 _activeButton = onButton( e->pos() );
111 mouseOffset = s->pick(e->pos());
112 if ( _activeButton != 0)
114 updateCursor( e->pos() );
118void KDGanttSplitterHandle::updateCursor(
const TQPoint& p)
120 if ( onButton( p ) != 0 ) {
121 setCursor( arrowCursor );
124 if ( orient == TQt::Horizontal )
125 setCursor( splitHCursor );
127 setCursor( splitVCursor );
132void KDGanttSplitterHandle::mouseReleaseEvent( TQMouseEvent *e )
134 if ( _activeButton != 0 ) {
135 if ( onButton( e->pos() ) == _activeButton )
140 s->expandPos(
id(), &min, &max );
141 if ( s->minimizeDirection() == KDGanttMinimizeSplitter::Left
142 || s->minimizeDirection() == KDGanttMinimizeSplitter::Up ) {
149 _origPos = s->pick(mapToParent( TQPoint( 0,0 ) ));
150 s->moveSplitter( pos,
id() );
154 s->moveSplitter( _origPos,
id() );
160 updateCursor( e->pos() );
163 if ( !opaque() && e->button() == TQt::LeftButton ) {
164 TQCOORD pos = s->pick(parentWidget()->mapFromGlobal(e->globalPos()))
166 s->setRubberband( -1 );
167 s->moveSplitter( pos,
id() );
173int KDGanttSplitterHandle::onButton(
const TQPoint& p )
175 TQValueList<TQPointArray> list = buttonRegions();
177 for( TQValueList<TQPointArray>::Iterator it = list.begin(); it != list.end(); ++it ) {
178 TQRect rect = (*it).boundingRect();
179 rect.setLeft( rect.left()- 4 );
180 rect.setRight( rect.right() + 4);
181 rect.setTop( rect.top()- 4 );
182 rect.setBottom( rect.bottom() + 4);
183 if ( rect.contains( p ) ) {
192TQValueList<TQPointArray> KDGanttSplitterHandle::buttonRegions()
194 TQValueList<TQPointArray> list;
197 int voffset[] = { (int) -sw*3, (
int) sw*3 };
198 for (
int i = 0; i < 2; i++ ) {
200 if ( !_collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Right ||
201 _collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Left) {
202 int mid = height()/2 + voffset[i];
208 else if ( !_collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Left ||
209 _collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Right ) {
210 int mid = height()/2 + voffset[i];
216 else if ( !_collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Up ||
217 _collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Down) {
218 int mid = width()/2 + voffset[i];
222 mid + sw - 4, sw-4 );
224 else if ( !_collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Down ||
225 _collapsed && s->minimizeDirection() == KDGanttMinimizeSplitter::Up ) {
226 int mid = width()/2 + voffset[i];
237void KDGanttSplitterHandle::paintEvent( TQPaintEvent * )
239 TQPixmap buffer( size() );
240 TQPainter p( &buffer );
243 p.setBrush( colorGroup().background() );
244 p.setPen( colorGroup().foreground() );
245 p.drawRect( rect() );
246 parentWidget()->style().drawPrimitive( TQStyle::PE_Panel, &p, rect(),
247 parentWidget()->colorGroup());
252 TQColor col = colorGroup().background().dark( 200 );
256 TQValueList<TQPointArray> list = buttonRegions();
258 for ( TQValueList<TQPointArray>::Iterator it = list.begin(); it != list.end(); ++it ) {
259 if ( index == _activeButton ) {
261 p.translate( parentWidget()->style().pixelMetric( TQStyle::PM_ButtonShiftHorizontal ),
262 parentWidget()->style().pixelMetric( TQStyle::PM_ButtonShiftVertical ) );
263 p.drawPolygon( *it,
true );
267 p.drawPolygon( *it,
true );
273 if ( s->minimizeDirection() == KDGanttMinimizeSplitter::Left ||
274 s->minimizeDirection() == KDGanttMinimizeSplitter::Right ) {
275 int mid = height()/2;
276 p.drawLine ( 2, mid - sw, 2, mid + sw );
277 p.drawLine ( 4, mid - sw, 4, mid + sw );
279 else if ( s->minimizeDirection() == KDGanttMinimizeSplitter::Up ||
280 s->minimizeDirection() == KDGanttMinimizeSplitter::Down ) {
282 p.drawLine( mid -sw, 2, mid +sw, 2 );
283 p.drawLine( mid -sw, 4, mid +sw, 4 );
285 bitBlt(
this, 0, 0, &buffer );
288class KDGanttSplitterLayoutStruct
300 TQSplitterData() : opaque( false ), firstShow( true ) {}
302 TQPtrList<KDGanttSplitterLayoutStruct> list;
307void kdganttGeomCalc( TQMemArray<TQLayoutStruct> &chain,
int start,
int count,
int pos,
308 int space,
int spacer );
361static TQSize minSize(
const TQWidget* )
367static TQSize minSizeHint(
const TQWidget* w )
369 TQSize min = w->minimumSize();
371 if ( min.height() <= 0 || min.width() <= 0 )
372 s = w->minimumSizeHint();
373 if ( min.height() > 0 )
374 s.setHeight( min.height() );
375 if ( min.width() > 0 )
376 s.setWidth( min.width() );
377 return s.expandedTo(TQSize(0,0));
387 :TQFrame(parent,name,WPaintUnclipped)
389 orient =TQt::Horizontal;
398 :TQFrame(parent,name,WPaintUnclipped)
409 data->list.setAutoDelete(
true );
414void KDGanttMinimizeSplitter::init()
416 data =
new TQSplitterData;
417 if ( orient ==TQt::Horizontal )
418 setSizePolicy( TQSizePolicy(TQSizePolicy::Expanding,TQSizePolicy::Minimum) );
420 setSizePolicy( TQSizePolicy(TQSizePolicy::Minimum,TQSizePolicy::Expanding) );
437 if ( orient ==TQt::Horizontal )
438 setSizePolicy( TQSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Minimum ) );
440 setSizePolicy( TQSizePolicy( TQSizePolicy::Minimum, TQSizePolicy::Expanding ) );
442 KDGanttSplitterLayoutStruct *s = data->list.first();
445 ((KDGanttSplitterHandle*)s->wid)->setOrientation( o );
446 s = data->list.next();
448 recalc( isVisible() );
470KDGanttSplitterLayoutStruct *KDGanttMinimizeSplitter::addWidget( TQWidget *w,
bool first )
472 KDGanttSplitterLayoutStruct *s;
473 KDGanttSplitterHandle *newHandle = 0;
474 if ( data->list.count() > 0 ) {
475 s =
new KDGanttSplitterLayoutStruct;
477 TQString tmp =
"qt_splithandle_";
479 newHandle =
new KDGanttSplitterHandle(
orientation(),
this, tmp.latin1() );
481 newHandle->setId(data->list.count());
482 s->isSplitter =
true;
483 s->sizer = pick( newHandle->sizeHint() );
485 data->list.insert( 0, s );
487 data->list.append( s );
489 s =
new KDGanttSplitterLayoutStruct;
492 if ( !testWState( WState_Resized ) && w->sizeHint().isValid() )
493 s->sizer = pick( w->sizeHint() );
495 s->sizer = pick( w->size() );
496 s->isSplitter =
false;
498 data->list.insert( 0, s );
500 data->list.append( s );
501 if ( newHandle && isVisible() )
513 if ( c->type() == TQEvent::ChildInserted ) {
514 if ( !c->child()->isWidgetType() )
517 if ( ((TQWidget*)c->child())->testWFlags( WType_TopLevel ) )
520 KDGanttSplitterLayoutStruct *s = data->list.first();
522 if ( s->wid == c->child() )
524 s = data->list.next();
526 addWidget( (TQWidget*)c->child() );
527 recalc( isVisible() );
529 }
else if ( c->type() == TQEvent::ChildRemoved ) {
530 KDGanttSplitterLayoutStruct *p = 0;
531 if ( data->list.count() > 1 )
532 p = data->list.at(1);
533 KDGanttSplitterLayoutStruct *s = data->list.first();
535 if ( s->wid == c->child() ) {
536 data->list.removeRef( s );
538 if ( p && p->isSplitter ) {
539 data->list.removeRef( p );
548 s = data->list.next();
560 TQPainter paint(
this );
561 paint.setPen( gray );
562 paint.setBrush( gray );
563 paint.setRasterOp( XorROP );
564 TQRect r = contentsRect();
566 int sw = style().pixelMetric(TQStyle::PM_SplitterWidth,
this);
567 if ( orient ==TQt::Horizontal ) {
568 if ( opaqueOldPos >= 0 )
569 paint.drawRect( opaqueOldPos + sw/2 - rBord , r.y(),
570 2*rBord, r.height() );
572 paint.drawRect( p + sw/2 - rBord, r.y(), 2*rBord, r.height() );
574 if ( opaqueOldPos >= 0 )
575 paint.drawRect( r.x(), opaqueOldPos + sw/2 - rBord,
576 r.width(), 2*rBord );
578 paint.drawRect( r.x(), p + sw/2 - rBord, r.width(), 2*rBord );
587 if ( e->type() == TQEvent::LayoutHint || ( e->type() == TQEvent::Show && data->firstShow ) ) {
588 recalc( isVisible() );
589 if ( e->type() == TQEvent::Show )
590 data->firstShow =
false;
592 return TQWidget::event( e );
604 TQCOORD x, TQCOORD y, TQCOORD w, TQCOORD h )
606 style().drawPrimitive(TQStyle::PE_Splitter, p, TQRect(x, y, w, h), colorGroup(),
608 TQStyle::Style_Horizontal : 0));
619 KDGanttSplitterLayoutStruct *s = data->list.first();
622 if ( s->isSplitter && seen_w )
623 return data->list.at();
624 if ( !s->isSplitter && s->wid == w )
626 s = data->list.next();
648 KDGanttSplitterLayoutStruct *s = data->list.at(
id);
649 int oldP = orient ==TQt::Horizontal ? s->wid->x() : s->wid->y();
651 if ( TQApplication::reverseLayout() && orient ==TQt::Horizontal ) {
652 p += s->wid->width();
657 moveAfter( p,
id, upLeft );
658 moveBefore( p-1,
id-1, upLeft );
664void KDGanttMinimizeSplitter::setG( TQWidget *w,
int p,
int s,
bool isSplitter )
666 if ( orient ==TQt::Horizontal ) {
667 if ( TQApplication::reverseLayout() && orient ==TQt::Horizontal && !isSplitter )
668 p = contentsRect().width() - p - s;
669 w->setGeometry( p, contentsRect().y(), s, contentsRect().height() );
671 w->setGeometry( contentsRect().x(), p, contentsRect().width(), s );
680void KDGanttMinimizeSplitter::moveBefore(
int pos,
int id,
bool upLeft )
684 KDGanttSplitterLayoutStruct *s = data->list.at(
id);
687 TQWidget *w = s->wid;
688 if ( w->isHidden() ) {
689 moveBefore( pos,
id-1, upLeft );
690 }
else if ( s->isSplitter ) {
693 if( TQApplication::reverseLayout() && orient ==TQt::Horizontal ) {
701 setG( w, pos1, dd,
true );
702 moveBefore( pos2,
id-1, upLeft );
704 moveBefore( pos2,
id-1, upLeft );
705 setG( w, pos1, dd,
true );
708 int dd, newLeft, nextPos;
709 if( TQApplication::reverseLayout() && orient ==TQt::Horizontal ) {
710 dd = w->geometry().right() - pos;
711 dd = TQMAX( pick(minSize(w)), TQMIN(dd, pick(w->maximumSize())));
713 nextPos = newLeft + dd;
715 dd = pos - pick( w->pos() ) + 1;
716 dd = TQMAX( pick(minSize(w)), TQMIN(dd, pick(w->maximumSize())));
718 nextPos = newLeft - 1;
720 setG( w, newLeft, dd,
true );
721 moveBefore( nextPos,
id-1, upLeft );
731void KDGanttMinimizeSplitter::moveAfter(
int pos,
int id,
bool upLeft )
733 KDGanttSplitterLayoutStruct *s =
id < int(data->list.count()) ?
734 data->list.at(
id) : 0;
737 TQWidget *w = s->wid;
738 if ( w->isHidden() ) {
739 moveAfter( pos,
id+1, upLeft );
740 }
else if ( pick( w->pos() ) == pos ) {
743 }
else if ( s->isSplitter ) {
746 if( TQApplication::reverseLayout() && orient ==TQt::Horizontal ) {
754 setG( w, pos1, dd,
true );
755 moveAfter( pos2,
id+1, upLeft );
757 moveAfter( pos2,
id+1, upLeft );
758 setG( w, pos1, dd,
true );
761 int left = pick( w->pos() );
762 int right, dd, newLeft, nextPos;
763 if ( TQApplication::reverseLayout() && orient ==TQt::Horizontal ) {
765 dd = TQMAX( pick(minSize(w)), TQMIN(dd, pick(w->maximumSize())));
767 nextPos = newLeft - 1;
769 right = pick( w->geometry().bottomRight() );
770 dd = right - pos + 1;
771 dd = TQMAX( pick(minSize(w)), TQMIN(dd, pick(w->maximumSize())));
774 nextPos = newLeft + dd;
776 setG( w, newLeft, dd,
true );
778 moveAfter( nextPos,
id+1, upLeft );
783void KDGanttMinimizeSplitter::expandPos(
int id,
int* min,
int* max )
785 KDGanttSplitterLayoutStruct *s = data->list.at(
id-1);
786 TQWidget* w = s->wid;
787 *min = pick( w->mapToParent( TQPoint(0,0) ) );
789 if ( (uint)
id == data->list.count() ) {
793 KDGanttSplitterLayoutStruct *s = data->list.at(
id+1);
794 TQWidget* w = s->wid;
795 *max = pick( w->mapToParent( TQPoint( w->width(), w->height() ) ) ) -8;
812 int n = data->list.count();
813 if ( id < 0 || id >= n )
816 for ( i = 0; i < id; i++ ) {
817 KDGanttSplitterLayoutStruct *s = data->list.at(i);
818 if ( s->wid->isHidden() ) {
820 }
else if ( s->isSplitter ) {
824 minB += pick( minSize(s->wid) );
825 maxB += pick( s->wid->maximumSize() );
828 for ( i =
id; i < n; i++ ) {
829 KDGanttSplitterLayoutStruct *s = data->list.at(i);
830 if ( s->wid->isHidden() ) {
832 }
else if ( s->isSplitter ) {
836 minA += pick( minSize(s->wid) );
837 maxA += pick( s->wid->maximumSize() );
840 TQRect r = contentsRect();
841 if ( orient ==TQt::Horizontal && TQApplication::reverseLayout() ) {
842 int splitterWidth = style().pixelMetric(TQStyle::PM_SplitterWidth,
this);
844 *min = pick(r.topRight()) - TQMIN( maxB, pick(r.size())-minA ) - splitterWidth;
846 *max = pick(r.topRight()) - TQMAX( minB, pick(r.size())-maxA ) - splitterWidth;
849 *min = pick(r.topLeft()) + TQMAX( minB, pick(r.size())-maxA );
851 *max = pick(r.topLeft()) + TQMIN( maxB, pick(r.size())-minA );
867 p = TQMAX( min, TQMIN( p, max ) );
873void KDGanttMinimizeSplitter::doResize()
875 TQRect r = contentsRect();
877 int n = data->list.count();
878 TQMemArray<TQLayoutStruct> a( n );
879 for ( i = 0; i< n; i++ ) {
881 KDGanttSplitterLayoutStruct *s = data->list.at(i);
882 if ( s->wid->isHidden() ) {
884 a[i].sizeHint = a[i].minimumSize = 0;
885 a[i].maximumSize = 0;
886 }
else if ( s->isSplitter ) {
888 a[i].sizeHint = a[i].minimumSize = a[i].maximumSize = s->sizer;
890 }
else if ( s->mode == KeepSize ) {
892 a[i].minimumSize = pick( minSize(s->wid) );
893 a[i].sizeHint = s->sizer;
894 a[i].maximumSize = pick( s->wid->maximumSize() );
896 }
else if ( s->mode == FollowSizeHint ) {
898 a[i].minimumSize = a[i].sizeHint = pick( s->wid->sizeHint() );
899 a[i].maximumSize = pick( s->wid->maximumSize() );
902 a[i].stretch = s->sizer;
903 a[i].maximumSize = pick( s->wid->maximumSize() );
904 a[i].sizeHint = a[i].minimumSize = pick( minSize(s->wid) );
909 kdganttGeomCalc( a, 0, n, pick( r.topLeft() ), pick( r.size() ), 0 );
911 for ( i = 0; i< n; i++ ) {
912 KDGanttSplitterLayoutStruct *s = data->list.at(i);
913 setG( s->wid, a[i].pos, a[i].size );
919void KDGanttMinimizeSplitter::recalc(
bool update )
921 int fi = 2*frameWidth();
924 int maxt = TQWIDGETSIZE_MAX;
926 int n = data->list.count();
933 for (
int i = 0; i< n; i++ ) {
934 KDGanttSplitterLayoutStruct *s = data->list.at(i);
935 if ( !s->isSplitter ) {
936 KDGanttSplitterLayoutStruct *p = (i > 0) ? data->list.at( i-1 ) : 0;
937 if ( p && p->isSplitter )
938 if ( first || s->wid->isHidden() )
942 if ( !s->wid->isHidden() )
948 for (
int j = 0; j< n; j++ ) {
949 KDGanttSplitterLayoutStruct *s = data->list.at(j);
950 if ( !s->wid->isHidden() ) {
952 if ( s->isSplitter ) {
956 TQSize minS = minSize(s->wid);
957 minl += pick( minS );
958 maxl += pick( s->wid->maximumSize() );
959 mint = TQMAX( mint, trans( minS ));
960 int tm = trans( s->wid->maximumSize() );
962 maxt = TQMIN( maxt, tm );
967 if ( parentWidget() != 0 && parentWidget()->inherits(
"KDGanttMinimizeSplitter") ) {
972 maxl = TQWIDGETSIZE_MAX;
975 maxl = TQMIN( maxl, TQWIDGETSIZE_MAX );
980 if ( orient ==TQt::Horizontal ) {
981 setMaximumSize( maxl, maxt );
982 setMinimumSize( minl, mint );
984 setMaximumSize( maxt, maxl );
985 setMinimumSize( mint, minl );
999 processChildEvents();
1000 KDGanttSplitterLayoutStruct *s = data->list.first();
1002 if ( s->wid == w ) {
1006 s = data->list.next();
1008 s = addWidget( w,
true );
1021 return data->opaque;
1045 processChildEvents();
1047 KDGanttSplitterLayoutStruct *s = data->list.first();
1049 if ( s->wid == w ) {
1051 KDGanttSplitterLayoutStruct *p = data->list.prev();
1055 data->list.insert( 0, p );
1056 data->list.insert( 0, s );
1060 s = data->list.next();
1063 addWidget( w,
true );
1074 processChildEvents();
1076 KDGanttSplitterLayoutStruct *s = data->list.first();
1078 if ( s->wid == w ) {
1081 KDGanttSplitterLayoutStruct *p = data->list.current();
1084 data->list.append( p );
1086 data->list.append( s );
1089 s = data->list.next();
1097void KDGanttMinimizeSplitter::recalcId()
1099 int n = data->list.count();
1100 for (
int i = 0; i < n; i++ ) {
1101 KDGanttSplitterLayoutStruct *s = data->list.at(i);
1102 if ( s->isSplitter )
1103 ((KDGanttSplitterHandle*)s->wid)->setId(i);
1115 TQObjectList clo = childrenListObject();
1116 if ( !clo.isEmpty() ) {
1117 TQObjectListIt it( clo );
1120 while( (o=it.current()) != 0 ) {
1122 if ( o->isWidgetType() &&
1123 !((TQWidget*)o)->isHidden() ) {
1124 TQSize s = ((TQWidget*)o)->sizeHint();
1125 if ( s.isValid() ) {
1127 t = TQMAX( t, trans( s ) );
1132 return orientation() ==TQt::Horizontal ? TQSize( l, t ) : TQSize( t, l );
1145 TQObjectList clo = childrenListObject();
1146 if ( !clo.isEmpty() ) {
1147 TQObjectListIt it( clo );
1150 while( (o=it.current()) != 0 ) {
1152 if ( o->isWidgetType() &&
1153 !((TQWidget*)o)->isHidden() ) {
1154 TQSize s = minSizeHint((TQWidget*)o);
1155 if ( s.isValid() ) {
1157 t = TQMAX( t, trans( s ) );
1162 return orientation() ==TQt::Horizontal ? TQSize( l, t ) : TQSize( t, l );
1170void KDGanttMinimizeSplitter::storeSizes()
1172 KDGanttSplitterLayoutStruct *s = data->list.first();
1174 if ( !s->isSplitter )
1175 s->sizer = pick( s->wid->size() );
1176 s = data->list.next();
1190void KDGanttMinimizeSplitter::setHidden( TQWidget *w,
bool hide )
1194 }
else if ( w == w2 ) {
1197#ifdef TQT_CHECK_RANGE
1198 tqWarning(
"KDGanttMinimizeSplitter::setHidden(), unknown widget" );
1214bool KDGanttMinimizeSplitter::isHidden( TQWidget *w )
const
1220#ifdef TQT_CHECK_RANGE
1222 tqWarning(
"KDGanttMinimizeSplitter::isHidden(), unknown widget" );
1252 if ( !testWState(WState_Polished) ) {
1253 TQWidget* that = (TQWidget*)
this;
1256 TQValueList<int> list;
1257 KDGanttSplitterLayoutStruct *s = data->list.first();
1259 if ( !s->isSplitter )
1260 list.append( s->sizer );
1261 s = data->list.next();
1283 processChildEvents();
1284 TQValueList<int>::Iterator it = list.begin();
1285 KDGanttSplitterLayoutStruct *s = data->list.first();
1286 while ( s && it != list.end() ) {
1287 if ( !s->isSplitter ) {
1291 s = data->list.next();
1302void KDGanttMinimizeSplitter::processChildEvents()
1304 TQApplication::sendPostedEvents(
this, TQEvent::ChildInserted );
1314 int sw = style().pixelMetric(TQStyle::PM_SplitterWidth,
this);
1315 KDGanttSplitterLayoutStruct *s = data->list.first();
1317 if ( s->isSplitter )
1319 s = data->list.next();
1322 TQFrame::styleChange( old );
1334 _direction = direction;
1349static inline int toFixed(
int i ) {
return i * 256; }
1350static inline int fRound(
int i ) {
1351 return ( i % 256 < 128 ) ? i / 256 : 1 + i / 256;
1353void kdganttGeomCalc( TQMemArray<TQLayoutStruct> &chain,
int start,
int count,
int pos,
1354 int space,
int spacer )
1361 int spacerCount = 0;
1363 bool wannaGrow =
false;
1367 for ( i = start; i < start + count; i++ ) {
1368 chain[i].done =
false;
1369 cHint += chain[i].sizeHint;
1370 cMin += chain[i].minimumSize;
1371 cMax += chain[i].maximumSize;
1372 sumStretch += chain[i].stretch;
1373 if ( !chain[i].empty )
1375 wannaGrow = wannaGrow || chain[i].expansive;
1381 if ( space < cMin + spacerCount * spacer ) {
1383 for ( i = start; i < start+count; i++ ) {
1384 chain[i].size = chain[i].minimumSize;
1385 chain[i].done =
true;
1387 }
else if ( space < cHint + spacerCount*spacer ) {
1392 int space_left = space - spacerCount*spacer;
1393 int overdraft = cHint - space_left;
1395 for ( i = start; i < start+count; i++ ) {
1396 if ( !chain[i].done && chain[i].minimumSize >= chain[i].sizeHint) {
1397 chain[i].size = chain[i].sizeHint;
1398 chain[i].done =
true;
1399 space_left -= chain[i].sizeHint;
1404 bool finished = n == 0;
1405 while ( !finished ) {
1407 fixed fp_over = toFixed( overdraft );
1410 for ( i = start; i < start+count; i++ ) {
1411 if ( chain[i].done )
1414 fp_w += fp_over / n;
1417 int w = fRound( fp_w );
1418 chain[i].size = chain[i].sizeHint - w;
1419 fp_w -= toFixed( w );
1420 if ( chain[i].size < chain[i].minimumSize ) {
1421 chain[i].done =
true;
1422 chain[i].size = chain[i].minimumSize;
1424 overdraft -= chain[i].sizeHint - chain[i].minimumSize;
1433 int space_left = space - spacerCount*spacer;
1435 for ( i = start; i < start + count; i++ ) {
1436 if ( !chain[i].done && (chain[i].maximumSize <= chain[i].sizeHint
1437 || wannaGrow && !chain[i].expansive) ) {
1438 chain[i].size = chain[i].sizeHint;
1439 chain[i].done =
true;
1440 space_left -= chain[i].sizeHint;
1441 sumStretch -= chain[i].stretch;
1445 extraspace = space_left;
1456 int surplus, deficit;
1458 surplus = deficit = 0;
1459 fixed fp_space = toFixed( space_left );
1461 for ( i = start; i < start+count; i++ ) {
1462 if ( chain[i].done )
1465 if ( sumStretch <= 0 )
1466 fp_w += fp_space / n;
1468 fp_w += (fp_space * chain[i].stretch) / sumStretch;
1469 int w = fRound( fp_w );
1471 fp_w -= toFixed( w );
1472 if ( w < chain[i].sizeHint ) {
1473 deficit += chain[i].sizeHint - w;
1474 }
else if ( w > chain[i].maximumSize ) {
1475 surplus += w - chain[i].maximumSize;
1478 if ( deficit > 0 && surplus <= deficit ) {
1480 for ( i = start; i < start+count; i++ ) {
1481 if ( !chain[i].done &&
1482 chain[i].size < chain[i].sizeHint ) {
1483 chain[i].size = chain[i].sizeHint;
1484 chain[i].done =
true;
1485 space_left -= chain[i].sizeHint;
1486 sumStretch -= chain[i].stretch;
1491 if ( surplus > 0 && surplus >= deficit ) {
1493 for ( i = start; i < start+count; i++ ) {
1494 if ( !chain[i].done &&
1495 chain[i].size > chain[i].maximumSize ) {
1496 chain[i].size = chain[i].maximumSize;
1497 chain[i].done =
true;
1498 space_left -= chain[i].maximumSize;
1499 sumStretch -= chain[i].stretch;
1504 }
while ( n > 0 && surplus != deficit );
1506 extraspace = space_left;
1513 int extra = extraspace / ( spacerCount + 2 );
1514 int p = pos + extra;
1515 for ( i = start; i < start+count; i++ ) {
1517 p = p + chain[i].size;
1518 if ( !chain[i].empty )
The KDGanttMinimizeSplitter class implements a splitter widget with minimize buttons.
KDGanttMinimizeSplitter(TQWidget *parent=0, const char *name=0)
void setSizes(TQValueList< int >)
TQValueList< int > sizes() const
void styleChange(TQStyle &)
virtual TQSize sizeHint() const
virtual void setOpaqueResize(bool=true)
virtual void setResizeMode(TQWidget *w, ResizeMode)
void moveSplitter(TQCOORD pos, int id)
void moveToLast(TQWidget *)
bool opaqueResize() const
void moveToFirst(TQWidget *)
int idAfter(TQWidget *) const
void setMinimizeDirection(Direction)
virtual void setOrientation(Orientation)
the orientation of the splitter
void resizeEvent(TQResizeEvent *)
virtual TQSize minimumSizeHint() const
virtual void setRubberband(int)
~KDGanttMinimizeSplitter()
Direction minimizeDirection() const
void childEvent(TQChildEvent *)
void getRange(int id, int *, int *)
virtual void drawSplitter(TQPainter *, TQCOORD x, TQCOORD y, TQCOORD w, TQCOORD h)
Orientation orientation() const