summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2005-04-01 19:24:18 (UTC)
committer zautrix <zautrix>2005-04-01 19:24:18 (UTC)
commitb1e3bf53b1c4cc46ef0a2ded04338bc38a640161 (patch) (unidiff)
tree7f6aecc33d464e28d18e07b0663450e917ea594b
parent1022d8763a5185c74d1fb1fba9857d6e3afd9ff5 (diff)
downloadkdepimpi-b1e3bf53b1c4cc46ef0a2ded04338bc38a640161.zip
kdepimpi-b1e3bf53b1c4cc46ef0a2ded04338bc38a640161.tar.gz
kdepimpi-b1e3bf53b1c4cc46ef0a2ded04338bc38a640161.tar.bz2
fix
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--korganizer/koagendaview.cpp16
-rw-r--r--microkde/KDGanttMinimizeSplitter.cpp7
2 files changed, 16 insertions, 7 deletions
diff --git a/korganizer/koagendaview.cpp b/korganizer/koagendaview.cpp
index 99f547a..667ff2a 100644
--- a/korganizer/koagendaview.cpp
+++ b/korganizer/koagendaview.cpp
@@ -1,725 +1,733 @@
1/* 1/*
2 This file is part of KOrganizer. 2 This file is part of KOrganizer.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This program is free software; you can redistribute it and/or modify 5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or 7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version. 8 (at your option) any later version.
9 9
10 This program is distributed in the hope that it will be useful, 10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details. 13 GNU General Public License for more details.
14 14
15 You should have received a copy of the GNU General Public License 15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software 16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18 18
19 As a special exception, permission is given to link this program 19 As a special exception, permission is given to link this program
20 with any edition of Qt, and distribute the resulting executable, 20 with any edition of Qt, and distribute the resulting executable,
21 without including the source code for Qt in the source distribution. 21 without including the source code for Qt in the source distribution.
22*/ 22*/
23 23
24#include <qhbox.h> 24#include <qhbox.h>
25#include <qvbox.h> 25#include <qvbox.h>
26#include <qlabel.h> 26#include <qlabel.h>
27#include <qframe.h> 27#include <qframe.h>
28#include <qlayout.h> 28#include <qlayout.h>
29#ifndef KORG_NOSPLITTER 29#ifndef KORG_NOSPLITTER
30#include <qsplitter.h> 30#include <qsplitter.h>
31#endif 31#endif
32#include <qfont.h> 32#include <qfont.h>
33#include <qfontmetrics.h> 33#include <qfontmetrics.h>
34#include <qpopupmenu.h> 34#include <qpopupmenu.h>
35#include <qtooltip.h> 35#include <qtooltip.h>
36#include <qpainter.h> 36#include <qpainter.h>
37#include <qpushbutton.h> 37#include <qpushbutton.h>
38#include <qapplication.h> 38#include <qapplication.h>
39 39
40#include <kapplication.h> 40#include <kapplication.h>
41#include <KDGanttMinimizeSplitter.h> 41#include <KDGanttMinimizeSplitter.h>
42#include <kdebug.h> 42#include <kdebug.h>
43#include <kstandarddirs.h> 43#include <kstandarddirs.h>
44#include <kiconloader.h> 44#include <kiconloader.h>
45#include <klocale.h> 45#include <klocale.h>
46#include <kconfig.h> 46#include <kconfig.h>
47#include <kglobal.h> 47#include <kglobal.h>
48#include "calendarview.h" 48#include "calendarview.h"
49#include "koviewmanager.h" 49#include "koviewmanager.h"
50 50
51#include <libkcal/calendar.h> 51#include <libkcal/calendar.h>
52#include <libkcal/icaldrag.h> 52#include <libkcal/icaldrag.h>
53#include <libkcal/dndfactory.h> 53#include <libkcal/dndfactory.h>
54 54
55#include <kcalendarsystem.h> 55#include <kcalendarsystem.h>
56 56
57#include "koglobals.h" 57#include "koglobals.h"
58#ifndef KORG_NOPLUGINS 58#ifndef KORG_NOPLUGINS
59#include "kocore.h" 59#include "kocore.h"
60#endif 60#endif
61#include "koprefs.h" 61#include "koprefs.h"
62#include "koagenda.h" 62#include "koagenda.h"
63#include "koagendaitem.h" 63#include "koagendaitem.h"
64#ifndef KORG_NOPRINTER 64#ifndef KORG_NOPRINTER
65#include "calprinter.h" 65#include "calprinter.h"
66#endif 66#endif
67 67
68#include "koagendaview.h" 68#include "koagendaview.h"
69//#include "koagendaview.moc" 69//#include "koagendaview.moc"
70 70
71//extern bool globalFlagBlockPainting; 71//extern bool globalFlagBlockPainting;
72extern int globalFlagBlockAgenda; 72extern int globalFlagBlockAgenda;
73extern int globalFlagBlockStartup; 73extern int globalFlagBlockStartup;
74extern int globalFlagBlockAgendaItemPaint; 74extern int globalFlagBlockAgendaItemPaint;
75extern int globalFlagBlockAgendaItemUpdate; 75extern int globalFlagBlockAgendaItemUpdate;
76extern int globalFlagBlockLabel; 76extern int globalFlagBlockLabel;
77using namespace KOrg; 77using namespace KOrg;
78 78
79 79
80 80
81TimeLabels::TimeLabels(int rows,QWidget *parent,const char *name,WFlags f) : 81TimeLabels::TimeLabels(int rows,QWidget *parent,const char *name,WFlags f) :
82 QScrollView(parent,name,f) 82 QScrollView(parent,name,f)
83{ 83{
84 myPix.resize( 1, 1 ); 84 myPix.resize( 1, 1 );
85 mRows = rows; 85 mRows = rows;
86 86
87 mRedrawNeeded = true; 87 mRedrawNeeded = true;
88 setMinimumHeight( 20 ); 88 setMinimumHeight( 20 );
89 mCellHeight = KOPrefs::instance()->mHourSize*4; 89 mCellHeight = KOPrefs::instance()->mHourSize*4;
90 90
91 enableClipper(true); 91 enableClipper(true);
92 92
93 setHScrollBarMode(AlwaysOff); 93 setHScrollBarMode(AlwaysOff);
94 setVScrollBarMode(AlwaysOff); 94 setVScrollBarMode(AlwaysOff);
95 95
96 resizeContents(50,mRows * mCellHeight); 96 resizeContents(50,mRows * mCellHeight);
97 97
98 viewport()->setBackgroundMode( PaletteBackground ); 98 viewport()->setBackgroundMode( PaletteBackground );
99} 99}
100 100
101void TimeLabels::setCellHeight(int height) 101void TimeLabels::setCellHeight(int height)
102{ 102{
103 mCellHeight = height; 103 mCellHeight = height;
104} 104}
105 105
106/* 106/*
107 Optimization so that only the "dirty" portion of the scroll view 107 Optimization so that only the "dirty" portion of the scroll view
108 is redrawn. Unfortunately, this is not called by default paintEvent() method. 108 is redrawn. Unfortunately, this is not called by default paintEvent() method.
109*/ 109*/
110void TimeLabels::drawContents(QPainter *p,int cx, int cy, int cw, int ch) 110void TimeLabels::drawContents(QPainter *p,int cx, int cy, int cw, int ch)
111{ 111{
112 112
113 // if ( globalFlagBlockAgenda ) 113 // if ( globalFlagBlockAgenda )
114 // return; 114 // return;
115 // bug: the parameters cx, cy, cw, ch are the areas that need to be 115 // bug: the parameters cx, cy, cw, ch are the areas that need to be
116 // redrawn, not the area of the widget. unfortunately, this 116 // redrawn, not the area of the widget. unfortunately, this
117 // code assumes the latter... 117 // code assumes the latter...
118 118
119 // now, for a workaround... 119 // now, for a workaround...
120 // these two assignments fix the weird redraw bug 120 // these two assignments fix the weird redraw bug
121 mRedrawNeeded = true; 121 mRedrawNeeded = true;
122 if ( mRedrawNeeded ) { 122 if ( mRedrawNeeded ) {
123 cx = contentsX() + frameWidth()*2; 123 cx = contentsX() + frameWidth()*2;
124 cw = contentsWidth() ; 124 cw = contentsWidth() ;
125 // end of workaround 125 // end of workaround
126 126
127 int cell = ((int)(cy/mCellHeight)); 127 int cell = ((int)(cy/mCellHeight));
128 int y = cell * mCellHeight; 128 int y = cell * mCellHeight;
129 QFontMetrics fm = fontMetrics(); 129 QFontMetrics fm = fontMetrics();
130 QString hour; 130 QString hour;
131 QString suffix; 131 QString suffix;
132 int timeHeight = fm.ascent(); 132 int timeHeight = fm.ascent();
133 QFont nFont = p->font(); 133 QFont nFont = p->font();
134 134
135 if (!KGlobal::locale()->use12Clock()) 135 if (!KGlobal::locale()->use12Clock())
136 suffix = "00"; 136 suffix = "00";
137 137
138 if ( timeHeight > mCellHeight ) { 138 if ( timeHeight > mCellHeight ) {
139 timeHeight = mCellHeight-1; 139 timeHeight = mCellHeight-1;
140 int pointS = nFont.pointSize(); 140 int pointS = nFont.pointSize();
141 while ( pointS > 4 ) { 141 while ( pointS > 4 ) {
142 nFont.setPointSize( pointS ); 142 nFont.setPointSize( pointS );
143 fm = QFontMetrics( nFont ); 143 fm = QFontMetrics( nFont );
144 if ( fm.ascent() < mCellHeight ) 144 if ( fm.ascent() < mCellHeight )
145 break; 145 break;
146 -- pointS; 146 -- pointS;
147 } 147 }
148 fm = QFontMetrics( nFont ); 148 fm = QFontMetrics( nFont );
149 timeHeight = fm.ascent(); 149 timeHeight = fm.ascent();
150 } 150 }
151 //timeHeight -= (timeHeight/4-2); 151 //timeHeight -= (timeHeight/4-2);
152 QFont sFont = nFont; 152 QFont sFont = nFont;
153 sFont.setPointSize( sFont.pointSize()/2 ); 153 sFont.setPointSize( sFont.pointSize()/2 );
154 QFontMetrics fmS( sFont ); 154 QFontMetrics fmS( sFont );
155 int sHei = fmS.ascent() ; 155 int sHei = fmS.ascent() ;
156 //sHei -= (sHei/4-2); 156 //sHei -= (sHei/4-2);
157 int startW = this->width() - 2*frameWidth()-1; 157 int startW = this->width() - frameWidth()-2;
158 int tw2 = fmS.width(suffix); 158 int tw2 = fmS.width(suffix);
159 while (y < cy + ch) { 159 while (y < cy + ch) {
160 p->drawLine(cx,y,cw,y); 160 p->drawLine(cx,y,cw,y);
161 hour.setNum(cell); 161 hour.setNum(cell);
162 162
163 // handle 24h and am/pm time formats 163 // handle 24h and am/pm time formats
164 if (KGlobal::locale()->use12Clock()) { 164 if (KGlobal::locale()->use12Clock()) {
165 if (cell > 11) suffix = "pm"; 165 if (cell > 11) suffix = "pm";
166 else 166 else
167 suffix = "am"; 167 suffix = "am";
168 if (cell == 0) hour.setNum(12); 168 if (cell == 0) hour.setNum(12);
169 if (cell > 12) hour.setNum(cell - 12); 169 if (cell > 12) hour.setNum(cell - 12);
170 tw2 = fmS.width(suffix); 170 tw2 = fmS.width(suffix);
171 } 171 }
172 172
173 // center and draw the time label 173 // center and draw the time label
174 int timeWidth = fm.width(hour); 174 int timeWidth = fm.width(hour);
175 int offset = startW - timeWidth - tw2 ; 175 int offset = startW - timeWidth - tw2 ;
176 p->setFont( nFont ); 176 p->setFont( nFont );
177 p->drawText( offset, y+ timeHeight, hour); 177 p->drawText( offset, y+ timeHeight, hour);
178 p->setFont( sFont ); 178 p->setFont( sFont );
179 offset = startW - tw2+1; 179 offset = startW - tw2+1;
180 p->drawText( offset, y+ sHei, suffix); 180 p->drawText( offset, y+ sHei, suffix);
181 181
182 // increment indices 182 // increment indices
183 y += mCellHeight; 183 y += mCellHeight;
184 cell++; 184 cell++;
185 } 185 }
186 } else { 186 } else {
187 //qDebug("NO redraw "); 187 //qDebug("NO redraw ");
188 } 188 }
189 // double buffer not yet implemented 189 // double buffer not yet implemented
190 //bitBlt (this, 0, 0, &myPix, 0 ,0,width(), height() ,CopyROP); 190 //bitBlt (this, 0, 0, &myPix, 0 ,0,width(), height() ,CopyROP);
191 //mRedrawNeeded = false; 191 //mRedrawNeeded = false;
192} 192}
193 193
194/** 194/**
195 Calculates the minimum width. 195 Calculates the minimum width.
196*/ 196*/
197int TimeLabels::minimumWidth() const 197int TimeLabels::minimumWidth() const
198{ 198{
199 return mMiniWidth; 199 return mMiniWidth;
200} 200}
201 201
202/** updates widget's internal state */ 202/** updates widget's internal state */
203void TimeLabels::updateConfig() 203void TimeLabels::updateConfig()
204{ 204{
205 mRedrawNeeded = true; 205 mRedrawNeeded = true;
206 // set the font 206 // set the font
207 // config->setGroup("Fonts"); 207 // config->setGroup("Fonts");
208 // QFont font = config->readFontEntry("TimeBar Font"); 208 // QFont font = config->readFontEntry("TimeBar Font");
209 setFont(KOPrefs::instance()->mTimeBarFont); 209 setFont(KOPrefs::instance()->mTimeBarFont);
210 QString test = "20oo"; 210 QString test = "20";
211 if (KGlobal::locale()->use12Clock()) 211 if (KGlobal::locale()->use12Clock())
212 test = "12mi"; 212 test = "12";
213 mMiniWidth = fontMetrics().width(test) + frameWidth()*2 +1 ; 213 mMiniWidth = fontMetrics().width(test);
214 if (KGlobal::locale()->use12Clock())
215 test = "pm";
216 else
217 test = "00";
218 QFont sFont = font();
219 sFont.setPointSize( sFont.pointSize()/2 );
220 QFontMetrics fmS( sFont );
221 mMiniWidth += fmS.width( test ) + frameWidth()*2 +4 ;
214 // update geometry restrictions based on new settings 222 // update geometry restrictions based on new settings
215 setFixedWidth( mMiniWidth ); 223 setFixedWidth( mMiniWidth );
216 224
217 // update HourSize 225 // update HourSize
218 mCellHeight = KOPrefs::instance()->mHourSize*4; 226 mCellHeight = KOPrefs::instance()->mHourSize*4;
219 resizeContents(50,mRows * mCellHeight); 227 resizeContents(50,mRows * mCellHeight);
220} 228}
221 229
222/** update time label positions */ 230/** update time label positions */
223void TimeLabels::positionChanged() 231void TimeLabels::positionChanged()
224{ 232{
225 int adjustment = mAgenda->contentsY(); 233 int adjustment = mAgenda->contentsY();
226 setContentsPos(0, adjustment); 234 setContentsPos(0, adjustment);
227} 235}
228 236
229/** */ 237/** */
230void TimeLabels::setAgenda(KOAgenda* agenda) 238void TimeLabels::setAgenda(KOAgenda* agenda)
231{ 239{
232 mAgenda = agenda; 240 mAgenda = agenda;
233} 241}
234 242
235void TimeLabels::contentsMousePressEvent ( QMouseEvent * e) 243void TimeLabels::contentsMousePressEvent ( QMouseEvent * e)
236{ 244{
237 mMouseDownY = e->pos().y(); 245 mMouseDownY = e->pos().y();
238 mOrgCap = topLevelWidget()->caption(); 246 mOrgCap = topLevelWidget()->caption();
239} 247}
240 248
241void TimeLabels::contentsMouseMoveEvent ( QMouseEvent * e ) 249void TimeLabels::contentsMouseMoveEvent ( QMouseEvent * e )
242{ 250{
243 int diff = mMouseDownY - e->pos().y(); 251 int diff = mMouseDownY - e->pos().y();
244 if ( diff < 10 && diff > -10 ) 252 if ( diff < 10 && diff > -10 )
245 return; 253 return;
246 int tSize = KOPrefs::instance()->mHourSize + (diff/10) ; 254 int tSize = KOPrefs::instance()->mHourSize + (diff/10) ;
247 if ( tSize < 4 ) 255 if ( tSize < 4 )
248 tSize = 4; 256 tSize = 4;
249 if ( tSize > 22 ) 257 if ( tSize > 22 )
250 tSize = 22; 258 tSize = 22;
251 tSize = (tSize-2)/2; 259 tSize = (tSize-2)/2;
252 topLevelWidget()->setCaption(i18n("New Agendasize: %1").arg(tSize)); 260 topLevelWidget()->setCaption(i18n("New Agendasize: %1").arg(tSize));
253 261
254} 262}
255void TimeLabels::contentsMouseReleaseEvent ( QMouseEvent * e ) 263void TimeLabels::contentsMouseReleaseEvent ( QMouseEvent * e )
256{ 264{
257 topLevelWidget()->setCaption( mOrgCap ); 265 topLevelWidget()->setCaption( mOrgCap );
258 int diff = mMouseDownY - e->pos().y(); 266 int diff = mMouseDownY - e->pos().y();
259 if ( diff < 10 && diff > -10 ) 267 if ( diff < 10 && diff > -10 )
260 return; 268 return;
261 int tSize = KOPrefs::instance()->mHourSize + (diff/10); 269 int tSize = KOPrefs::instance()->mHourSize + (diff/10);
262 if ( tSize < 4 ) 270 if ( tSize < 4 )
263 tSize = 4; 271 tSize = 4;
264 if ( tSize > 22 ) 272 if ( tSize > 22 )
265 tSize = 22; 273 tSize = 22;
266 tSize = (tSize/2)*2; 274 tSize = (tSize/2)*2;
267 if ( tSize == KOPrefs::instance()->mHourSize ) 275 if ( tSize == KOPrefs::instance()->mHourSize )
268 return; 276 return;
269 KOPrefs::instance()->mHourSize = tSize; 277 KOPrefs::instance()->mHourSize = tSize;
270 emit scaleChanged(); 278 emit scaleChanged();
271} 279}
272 280
273/** This is called in response to repaint() */ 281/** This is called in response to repaint() */
274void TimeLabels::paintEvent(QPaintEvent*) 282void TimeLabels::paintEvent(QPaintEvent*)
275{ 283{
276 284
277 // kdDebug() << "paintevent..." << endl; 285 // kdDebug() << "paintevent..." << endl;
278 // this is another hack! 286 // this is another hack!
279 // QPainter painter(this); 287 // QPainter painter(this);
280 //QString c 288 //QString c
281 repaintContents(contentsX(), contentsY(), visibleWidth(), visibleHeight()); 289 repaintContents(contentsX(), contentsY(), visibleWidth(), visibleHeight());
282} 290}
283 291
284//////////////////////////////////////////////////////////////////////////// 292////////////////////////////////////////////////////////////////////////////
285 293
286EventIndicator::EventIndicator(Location loc,QWidget *parent,const char *name) 294EventIndicator::EventIndicator(Location loc,QWidget *parent,const char *name)
287 : QFrame(parent,name) 295 : QFrame(parent,name)
288{ 296{
289 mColumns = 1; 297 mColumns = 1;
290 mTopBox = 0; 298 mTopBox = 0;
291 mLocation = loc; 299 mLocation = loc;
292 mTopLayout = 0; 300 mTopLayout = 0;
293 mPaintWidget = 0; 301 mPaintWidget = 0;
294 mXOffset = 0; 302 mXOffset = 0;
295 if (mLocation == Top) mPixmap = SmallIcon("1uparrow"); 303 if (mLocation == Top) mPixmap = SmallIcon("1uparrow");
296 else mPixmap = SmallIcon("1downarrow"); 304 else mPixmap = SmallIcon("1downarrow");
297 mEnabled.resize(mColumns); 305 mEnabled.resize(mColumns);
298 mEnabled.fill( false ); 306 mEnabled.fill( false );
299 setMinimumHeight(mPixmap.height()); 307 setMinimumHeight(mPixmap.height());
300} 308}
301 309
302EventIndicator::~EventIndicator() 310EventIndicator::~EventIndicator()
303{ 311{
304} 312}
305 313
306void EventIndicator::drawContents(QPainter *p) 314void EventIndicator::drawContents(QPainter *p)
307{ 315{
308 316
309 // kdDebug() << "======== top: " << contentsRect().top() << " bottom " << // contentsRect().bottom() << " left " << contentsRect().left() << " right " << contentsRect().right() << endl; 317 // kdDebug() << "======== top: " << contentsRect().top() << " bottom " << // contentsRect().bottom() << " left " << contentsRect().left() << " right " << contentsRect().right() << endl;
310 KDGanttSplitterHandle* han = 0; 318 KDGanttSplitterHandle* han = 0;
311 if ( mPaintWidget ) 319 if ( mPaintWidget )
312 han = mPaintWidget->firstHandle(); 320 han = mPaintWidget->firstHandle();
313 if ( ! han ) { 321 if ( ! han ) {
314 int i; 322 int i;
315 for(i=0;i<mColumns;++i) { 323 for(i=0;i<mColumns;++i) {
316 if (mEnabled[i]) { 324 if (mEnabled[i]) {
317 int cellWidth = contentsRect().right()/mColumns; 325 int cellWidth = contentsRect().right()/mColumns;
318 int xOffset = KOGlobals::self()->reverseLayout() ? 326 int xOffset = KOGlobals::self()->reverseLayout() ?
319 (mColumns - 1 - i)*cellWidth + (cellWidth -mPixmap.width())/2 : 327 (mColumns - 1 - i)*cellWidth + (cellWidth -mPixmap.width())/2 :
320 i*cellWidth + (cellWidth -mPixmap.width()) /2; 328 i*cellWidth + (cellWidth -mPixmap.width()) /2;
321 p->drawPixmap(QPoint(1+xOffset,0),mPixmap); 329 p->drawPixmap(QPoint(1+xOffset,0),mPixmap);
322 } 330 }
323 } 331 }
324 } else { 332 } else {
325 han->repaint(); 333 han->repaint();
326 //mPaintWidget->setBackgroundColor( red ); 334 //mPaintWidget->setBackgroundColor( red );
327 335
328 QPainter pa( han ); 336 QPainter pa( han );
329 int i; 337 int i;
330 bool setColor = false; 338 bool setColor = false;
331 for(i=0;i<mColumns;++i) { 339 for(i=0;i<mColumns;++i) {
332 if (mEnabled[i]) { 340 if (mEnabled[i]) {
333 setColor = true; 341 setColor = true;
334 342
335 int cellWidth = contentsRect().right()/mColumns; 343 int cellWidth = contentsRect().right()/mColumns;
336 int xOffset = KOGlobals::self()->reverseLayout() ? 344 int xOffset = KOGlobals::self()->reverseLayout() ?
337 (mColumns - 1 - i)*cellWidth + cellWidth/2 -mPixmap.width()/2 : 345 (mColumns - 1 - i)*cellWidth + cellWidth/2 -mPixmap.width()/2 :
338 i*cellWidth + cellWidth/2 -mPixmap.width()/2; 346 i*cellWidth + cellWidth/2 -mPixmap.width()/2;
339 pa.drawPixmap(QPoint(mXOffset + xOffset,0),mPixmap); 347 pa.drawPixmap(QPoint(mXOffset + xOffset,0),mPixmap);
340 //qDebug("222draw pix %d ",xOffset ); 348 //qDebug("222draw pix %d ",xOffset );
341 349
342 } 350 }
343 351
344 } 352 }
345 pa.end(); 353 pa.end();
346 354
347 } 355 }
348} 356}
349 357
350void EventIndicator::setXOffset( int x ) 358void EventIndicator::setXOffset( int x )
351{ 359{
352 mXOffset = x; 360 mXOffset = x;
353} 361}
354void EventIndicator::setPaintWidget( KDGanttMinimizeSplitter * w ) 362void EventIndicator::setPaintWidget( KDGanttMinimizeSplitter * w )
355{ 363{
356 mPaintWidget = w; 364 mPaintWidget = w;
357 setMaximumHeight(0); 365 setMaximumHeight(0);
358 setMinimumHeight(0); 366 setMinimumHeight(0);
359} 367}
360void EventIndicator::changeColumns(int columns) 368void EventIndicator::changeColumns(int columns)
361{ 369{
362 mColumns = columns; 370 mColumns = columns;
363 mEnabled.resize(mColumns); 371 mEnabled.resize(mColumns);
364 372
365 update(); 373 update();
366} 374}
367 375
368void EventIndicator::enableColumn(int column, bool enable) 376void EventIndicator::enableColumn(int column, bool enable)
369{ 377{
370 mEnabled[column] = enable; 378 mEnabled[column] = enable;
371} 379}
372 380
373 381
374//////////////////////////////////////////////////////////////////////////// 382////////////////////////////////////////////////////////////////////////////
375//////////////////////////////////////////////////////////////////////////// 383////////////////////////////////////////////////////////////////////////////
376//////////////////////////////////////////////////////////////////////////// 384////////////////////////////////////////////////////////////////////////////
377 385
378KOAgendaView::KOAgendaView(Calendar *cal,QWidget *parent,const char *name) : 386KOAgendaView::KOAgendaView(Calendar *cal,QWidget *parent,const char *name) :
379 KOEventView (cal,parent,name) 387 KOEventView (cal,parent,name)
380{ 388{
381 mBlockUpdating = true; 389 mBlockUpdating = true;
382 mStartHour = 8; 390 mStartHour = 8;
383 mSelectedDates.append(QDate::currentDate()); 391 mSelectedDates.append(QDate::currentDate());
384 392
385 mLayoutDayLabels = 0; 393 mLayoutDayLabels = 0;
386 mDayLabelsFrame = 0; 394 mDayLabelsFrame = 0;
387 mDayLabels = 0; 395 mDayLabels = 0;
388 bool isRTL = KOGlobals::self()->reverseLayout(); 396 bool isRTL = KOGlobals::self()->reverseLayout();
389 QPixmap expandPix; 397 QPixmap expandPix;
390 if ( KOPrefs::instance()->mVerticalScreen ) { 398 if ( KOPrefs::instance()->mVerticalScreen ) {
391 expandPix = SmallIcon( "1updownarrow" ); 399 expandPix = SmallIcon( "1updownarrow" );
392 } else { 400 } else {
393 expandPix = SmallIcon("1leftrightarrow" ); 401 expandPix = SmallIcon("1leftrightarrow" );
394 } 402 }
395 403
396 QBoxLayout *topLayout = new QVBoxLayout(this); 404 QBoxLayout *topLayout = new QVBoxLayout(this);
397 405
398 // Create day name labels for agenda columns 406 // Create day name labels for agenda columns
399 // Create agenda splitter 407 // Create agenda splitter
400 408
401 mSplitterAgenda = new KDGanttMinimizeSplitter( Qt::Vertical, this); 409 mSplitterAgenda = new KDGanttMinimizeSplitter( Qt::Vertical, this);
402 mSplitterAgenda->setMinimizeDirection ( KDGanttMinimizeSplitter::Up ); 410 mSplitterAgenda->setMinimizeDirection ( KDGanttMinimizeSplitter::Up );
403 topLayout->addWidget( mSplitterAgenda ); 411 topLayout->addWidget( mSplitterAgenda );
404 mAllDayFrame = new QHBox(mSplitterAgenda); 412 mAllDayFrame = new QHBox(mSplitterAgenda);
405 mAllDayFrame->setFocusPolicy(NoFocus); 413 mAllDayFrame->setFocusPolicy(NoFocus);
406 QWidget *agendaFrame = new QWidget(mSplitterAgenda); 414 QWidget *agendaFrame = new QWidget(mSplitterAgenda);
407 agendaFrame->setFocusPolicy(NoFocus); 415 agendaFrame->setFocusPolicy(NoFocus);
408 416
409 // Create all-day agenda widget 417 // Create all-day agenda widget
410 mDummyAllDayLeft = new QVBox( mAllDayFrame ); 418 mDummyAllDayLeft = new QVBox( mAllDayFrame );
411 419
412 mExpandButton = new QPushButton(mDummyAllDayLeft); 420 mExpandButton = new QPushButton(mDummyAllDayLeft);
413 mExpandButton->setPixmap( expandPix ); 421 mExpandButton->setPixmap( expandPix );
414 int widebut = mExpandButton->sizeHint().width()+4; 422 int widebut = mExpandButton->sizeHint().width()+4;
415 int heibut = mExpandButton->sizeHint().height()+4; 423 int heibut = mExpandButton->sizeHint().height()+4;
416 if ( heibut > widebut ) 424 if ( heibut > widebut )
417 widebut = heibut ; 425 widebut = heibut ;
418 426
419 //mExpandButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, 427 //mExpandButton->setSizePolicy( QSizePolicy( QSizePolicy::Fixed,
420 // QSizePolicy::Fixed ) ); 428 // QSizePolicy::Fixed ) );
421 mExpandButton->setFixedSize( widebut, widebut); 429 mExpandButton->setFixedSize( widebut, widebut);
422 connect( mExpandButton, SIGNAL( clicked() ), SIGNAL( toggleExpand() ) ); 430 connect( mExpandButton, SIGNAL( clicked() ), SIGNAL( toggleExpand() ) );
423 mExpandButton->setFocusPolicy(NoFocus); 431 mExpandButton->setFocusPolicy(NoFocus);
424 mAllDayAgenda = new KOAgenda(1,mAllDayFrame); 432 mAllDayAgenda = new KOAgenda(1,mAllDayFrame);
425 mAllDayAgenda->setFocusPolicy(NoFocus); 433 mAllDayAgenda->setFocusPolicy(NoFocus);
426 QLabel *dummyAllDayRight = new QLabel (mAllDayFrame); 434 QLabel *dummyAllDayRight = new QLabel (mAllDayFrame);
427 435
428 // Create event context menu for all day agenda 436 // Create event context menu for all day agenda
429 mAllDayAgendaPopup = eventPopup(); 437 mAllDayAgendaPopup = eventPopup();
430 connect(mAllDayAgenda,SIGNAL(showIncidencePopupSignal(Incidence *)), 438 connect(mAllDayAgenda,SIGNAL(showIncidencePopupSignal(Incidence *)),
431 mAllDayAgendaPopup,SLOT(showIncidencePopup(Incidence *))); 439 mAllDayAgendaPopup,SLOT(showIncidencePopup(Incidence *)));
432 440
433 // Create agenda frame 441 // Create agenda frame
434 QGridLayout *agendaLayout = new QGridLayout(agendaFrame,4,3); 442 QGridLayout *agendaLayout = new QGridLayout(agendaFrame,4,3);
435 // QHBox *agendaFrame = new QHBox(splitterAgenda); 443 // QHBox *agendaFrame = new QHBox(splitterAgenda);
436 444
437 // create event indicator bars 445 // create event indicator bars
438 mEventIndicatorTop = new EventIndicator(EventIndicator::Top,agendaFrame); 446 mEventIndicatorTop = new EventIndicator(EventIndicator::Top,agendaFrame);
439#ifndef DESKTOP_VERSION 447#ifndef DESKTOP_VERSION
440 // FIX 448 // FIX
441 mEventIndicatorTop->setPaintWidget( mSplitterAgenda ); 449 mEventIndicatorTop->setPaintWidget( mSplitterAgenda );
442#endif 450#endif
443 mDayLabelsFrame = new QHBox(agendaFrame); 451 mDayLabelsFrame = new QHBox(agendaFrame);
444 //topLayout->addWidget(mDayLabelsFrame); 452 //topLayout->addWidget(mDayLabelsFrame);
445 mDayLabels = new QFrame (mDayLabelsFrame); 453 mDayLabels = new QFrame (mDayLabelsFrame);
446 mLayoutDayLabels = new QHBoxLayout(mDayLabels); 454 mLayoutDayLabels = new QHBoxLayout(mDayLabels);
447 agendaLayout->addMultiCellWidget(mDayLabelsFrame ,0,0,0,2); 455 agendaLayout->addMultiCellWidget(mDayLabelsFrame ,0,0,0,2);
448 agendaLayout->addWidget(mEventIndicatorTop,1,1); 456 agendaLayout->addWidget(mEventIndicatorTop,1,1);
449 457
450 mEventIndicatorBottom = new EventIndicator(EventIndicator::Bottom, 458 mEventIndicatorBottom = new EventIndicator(EventIndicator::Bottom,
451 agendaFrame); 459 agendaFrame);
452 agendaLayout->addWidget(mEventIndicatorBottom,3,1); 460 agendaLayout->addWidget(mEventIndicatorBottom,3,1);
453 QWidget *dummyAgendaRight = new QWidget(agendaFrame); 461 QWidget *dummyAgendaRight = new QWidget(agendaFrame);
454 agendaLayout->addWidget(dummyAgendaRight,1,2); 462 agendaLayout->addWidget(dummyAgendaRight,1,2);
455 463
456 // Create time labels 464 // Create time labels
457 mTimeLabels = new TimeLabels(24,agendaFrame); 465 mTimeLabels = new TimeLabels(24,agendaFrame);
458 agendaLayout->addWidget(mTimeLabels,2,0); 466 agendaLayout->addWidget(mTimeLabels,2,0);
459 connect(mTimeLabels,SIGNAL( scaleChanged()), 467 connect(mTimeLabels,SIGNAL( scaleChanged()),
460 this,SLOT(updateConfig())); 468 this,SLOT(updateConfig()));
461 469
462 // Create agenda 470 // Create agenda
463 mAgenda = new KOAgenda(1,96,KOPrefs::instance()->mHourSize,agendaFrame); 471 mAgenda = new KOAgenda(1,96,KOPrefs::instance()->mHourSize,agendaFrame);
464 agendaLayout->addMultiCellWidget(mAgenda,2,2,1,2); 472 agendaLayout->addMultiCellWidget(mAgenda,2,2,1,2);
465 agendaLayout->setColStretch(1,1); 473 agendaLayout->setColStretch(1,1);
466 mAgenda->setFocusPolicy(NoFocus); 474 mAgenda->setFocusPolicy(NoFocus);
467 // Create event context menu for agenda 475 // Create event context menu for agenda
468 mAgendaPopup = eventPopup(); 476 mAgendaPopup = eventPopup();
469 477
470 mAgendaPopup->addAdditionalItem(QIconSet(SmallIcon("bell")), 478 mAgendaPopup->addAdditionalItem(QIconSet(SmallIcon("bell")),
471 i18n("Toggle Alarm"),mAgenda, 479 i18n("Toggle Alarm"),mAgenda,
472 SLOT(popupAlarm()),true); 480 SLOT(popupAlarm()),true);
473 481
474 482
475 connect(mAgenda,SIGNAL(showIncidencePopupSignal(Incidence *)), 483 connect(mAgenda,SIGNAL(showIncidencePopupSignal(Incidence *)),
476 mAgendaPopup,SLOT(showIncidencePopup(Incidence *))); 484 mAgendaPopup,SLOT(showIncidencePopup(Incidence *)));
477 485
478 // make connections between dependent widgets 486 // make connections between dependent widgets
479 mTimeLabels->setAgenda(mAgenda); 487 mTimeLabels->setAgenda(mAgenda);
480 488
481 // Update widgets to reflect user preferences 489 // Update widgets to reflect user preferences
482 // updateConfig(); 490 // updateConfig();
483 491
484 // createDayLabels(); 492 // createDayLabels();
485 493
486 // these blank widgets make the All Day Event box line up with the agenda 494 // these blank widgets make the All Day Event box line up with the agenda
487 dummyAllDayRight->setFixedWidth(mAgenda->verticalScrollBar()->width()); 495 dummyAllDayRight->setFixedWidth(mAgenda->verticalScrollBar()->width());
488 dummyAgendaRight->setFixedWidth(mAgenda->verticalScrollBar()->width()); 496 dummyAgendaRight->setFixedWidth(mAgenda->verticalScrollBar()->width());
489 mDummyAllDayLeft->setFixedWidth(mTimeLabels->width()); 497 mDummyAllDayLeft->setFixedWidth(mTimeLabels->width());
490 498
491 // Scrolling 499 // Scrolling
492 connect(mAgenda->verticalScrollBar(),SIGNAL(valueChanged(int)), 500 connect(mAgenda->verticalScrollBar(),SIGNAL(valueChanged(int)),
493 mTimeLabels, SLOT(positionChanged())); 501 mTimeLabels, SLOT(positionChanged()));
494 connect(mTimeLabels->verticalScrollBar(),SIGNAL(valueChanged(int)), 502 connect(mTimeLabels->verticalScrollBar(),SIGNAL(valueChanged(int)),
495 SLOT(setContentsPos(int))); 503 SLOT(setContentsPos(int)));
496 504
497 connect(mAgenda,SIGNAL(showDateView( int, int)),SLOT(slotShowDateView( int, int ))); 505 connect(mAgenda,SIGNAL(showDateView( int, int)),SLOT(slotShowDateView( int, int )));
498 connect(mAllDayAgenda,SIGNAL(showDateView( int, int )), SLOT(slotShowDateView( int, int ) )); 506 connect(mAllDayAgenda,SIGNAL(showDateView( int, int )), SLOT(slotShowDateView( int, int ) ));
499 507
500 // Create/Show/Edit/Delete Event 508 // Create/Show/Edit/Delete Event
501 connect(mAgenda,SIGNAL(newEventSignal(int,int)), 509 connect(mAgenda,SIGNAL(newEventSignal(int,int)),
502 SLOT(newEvent(int,int))); 510 SLOT(newEvent(int,int)));
503 connect(mAgenda,SIGNAL(newTodoSignal(int,int)), 511 connect(mAgenda,SIGNAL(newTodoSignal(int,int)),
504 SLOT(newTodo(int,int))); 512 SLOT(newTodo(int,int)));
505 connect(mAgenda,SIGNAL(newEventSignal(int,int,int,int)), 513 connect(mAgenda,SIGNAL(newEventSignal(int,int,int,int)),
506 SLOT(newEvent(int,int,int,int))); 514 SLOT(newEvent(int,int,int,int)));
507 connect(mAllDayAgenda,SIGNAL(newEventSignal(int,int)), 515 connect(mAllDayAgenda,SIGNAL(newEventSignal(int,int)),
508 SLOT(newEventAllDay(int,int))); 516 SLOT(newEventAllDay(int,int)));
509 connect(mAllDayAgenda,SIGNAL(newTodoSignal(int,int)), 517 connect(mAllDayAgenda,SIGNAL(newTodoSignal(int,int)),
510 SLOT(newTodoAllDay(int,int))); 518 SLOT(newTodoAllDay(int,int)));
511 connect(mAllDayAgenda,SIGNAL(newEventSignal(int,int,int,int)), 519 connect(mAllDayAgenda,SIGNAL(newEventSignal(int,int,int,int)),
512 SLOT(newEventAllDay(int,int))); 520 SLOT(newEventAllDay(int,int)));
513 connect(mAgenda,SIGNAL(newTimeSpanSignal(int,int,int,int)), 521 connect(mAgenda,SIGNAL(newTimeSpanSignal(int,int,int,int)),
514 SLOT(newTimeSpanSelected(int,int,int,int))); 522 SLOT(newTimeSpanSelected(int,int,int,int)));
515 connect(mAllDayAgenda,SIGNAL(newTimeSpanSignal(int,int,int,int)), 523 connect(mAllDayAgenda,SIGNAL(newTimeSpanSignal(int,int,int,int)),
516 SLOT(newTimeSpanSelectedAllDay(int,int,int,int))); 524 SLOT(newTimeSpanSelectedAllDay(int,int,int,int)));
517 connect(mAgenda,SIGNAL(newStartSelectSignal()),SLOT(updateView())); 525 connect(mAgenda,SIGNAL(newStartSelectSignal()),SLOT(updateView()));
518 connect(mAllDayAgenda,SIGNAL(newStartSelectSignal()),SLOT(updateView())); 526 connect(mAllDayAgenda,SIGNAL(newStartSelectSignal()),SLOT(updateView()));
519 527
520 connect(mAgenda,SIGNAL(editIncidenceSignal(Incidence *)), 528 connect(mAgenda,SIGNAL(editIncidenceSignal(Incidence *)),
521 SIGNAL(editIncidenceSignal(Incidence *))); 529 SIGNAL(editIncidenceSignal(Incidence *)));
522 connect(mAllDayAgenda,SIGNAL(editIncidenceSignal(Incidence *)), 530 connect(mAllDayAgenda,SIGNAL(editIncidenceSignal(Incidence *)),
523 SIGNAL(editIncidenceSignal(Incidence *))); 531 SIGNAL(editIncidenceSignal(Incidence *)));
524 connect(mAgenda,SIGNAL(showIncidenceSignal(Incidence *)), 532 connect(mAgenda,SIGNAL(showIncidenceSignal(Incidence *)),
525 SIGNAL(showIncidenceSignal(Incidence *))); 533 SIGNAL(showIncidenceSignal(Incidence *)));
526 connect(mAllDayAgenda,SIGNAL(showIncidenceSignal(Incidence *)), 534 connect(mAllDayAgenda,SIGNAL(showIncidenceSignal(Incidence *)),
527 SIGNAL(showIncidenceSignal(Incidence *))); 535 SIGNAL(showIncidenceSignal(Incidence *)));
528 connect(mAgenda,SIGNAL(deleteIncidenceSignal(Incidence *)), 536 connect(mAgenda,SIGNAL(deleteIncidenceSignal(Incidence *)),
529 SIGNAL(deleteIncidenceSignal(Incidence *))); 537 SIGNAL(deleteIncidenceSignal(Incidence *)));
530 connect(mAllDayAgenda,SIGNAL(deleteIncidenceSignal(Incidence *)), 538 connect(mAllDayAgenda,SIGNAL(deleteIncidenceSignal(Incidence *)),
531 SIGNAL(deleteIncidenceSignal(Incidence *))); 539 SIGNAL(deleteIncidenceSignal(Incidence *)));
532 540
533 connect(mAgenda,SIGNAL(itemModified(KOAgendaItem *, int )), 541 connect(mAgenda,SIGNAL(itemModified(KOAgendaItem *, int )),
534 SLOT(updateEventDates(KOAgendaItem *, int ))); 542 SLOT(updateEventDates(KOAgendaItem *, int )));
535 connect(mAllDayAgenda,SIGNAL(itemModified(KOAgendaItem *, int )), 543 connect(mAllDayAgenda,SIGNAL(itemModified(KOAgendaItem *, int )),
536 SLOT(updateEventDates(KOAgendaItem *, int))); 544 SLOT(updateEventDates(KOAgendaItem *, int)));
537 545
538 // event indicator update 546 // event indicator update
539 connect(mAgenda,SIGNAL(lowerYChanged(int)), 547 connect(mAgenda,SIGNAL(lowerYChanged(int)),
540 SLOT(updateEventIndicatorTop(int))); 548 SLOT(updateEventIndicatorTop(int)));
541 connect(mAgenda,SIGNAL(upperYChanged(int)), 549 connect(mAgenda,SIGNAL(upperYChanged(int)),
542 SLOT(updateEventIndicatorBottom(int))); 550 SLOT(updateEventIndicatorBottom(int)));
543 // drag signals 551 // drag signals
544 /* 552 /*
545 connect(mAgenda,SIGNAL(startDragSignal(Event *)), 553 connect(mAgenda,SIGNAL(startDragSignal(Event *)),
546 SLOT(startDrag(Event *))); 554 SLOT(startDrag(Event *)));
547 connect(mAllDayAgenda,SIGNAL(startDragSignal(Event *)), 555 connect(mAllDayAgenda,SIGNAL(startDragSignal(Event *)),
548 SLOT(startDrag(Event *))); 556 SLOT(startDrag(Event *)));
549 */ 557 */
550 // synchronize selections 558 // synchronize selections
551 connect( mAgenda, SIGNAL( incidenceSelected( Incidence * ) ), 559 connect( mAgenda, SIGNAL( incidenceSelected( Incidence * ) ),
552 mAllDayAgenda, SLOT( deselectItem() ) ); 560 mAllDayAgenda, SLOT( deselectItem() ) );
553 connect( mAllDayAgenda, SIGNAL( incidenceSelected( Incidence * ) ), 561 connect( mAllDayAgenda, SIGNAL( incidenceSelected( Incidence * ) ),
554 mAgenda, SLOT( deselectItem() ) ); 562 mAgenda, SLOT( deselectItem() ) );
555 connect( mAgenda, SIGNAL( incidenceSelected( Incidence * ) ), 563 connect( mAgenda, SIGNAL( incidenceSelected( Incidence * ) ),
556 SIGNAL( incidenceSelected( Incidence * ) ) ); 564 SIGNAL( incidenceSelected( Incidence * ) ) );
557 connect( mAllDayAgenda, SIGNAL( incidenceSelected( Incidence * ) ), 565 connect( mAllDayAgenda, SIGNAL( incidenceSelected( Incidence * ) ),
558 SIGNAL( incidenceSelected( Incidence * ) ) ); 566 SIGNAL( incidenceSelected( Incidence * ) ) );
559 connect( mAgenda, SIGNAL( resizedSignal() ), 567 connect( mAgenda, SIGNAL( resizedSignal() ),
560 SLOT( updateConfig( ) ) ); 568 SLOT( updateConfig( ) ) );
561 connect( mAgenda, SIGNAL( addToCalSignal(Incidence *, Incidence *) ), 569 connect( mAgenda, SIGNAL( addToCalSignal(Incidence *, Incidence *) ),
562 SLOT( addToCalSlot(Incidence *, Incidence * ) ) ); 570 SLOT( addToCalSlot(Incidence *, Incidence * ) ) );
563 connect( mAllDayAgenda, SIGNAL( addToCalSignal(Incidence * ,Incidence *) ), 571 connect( mAllDayAgenda, SIGNAL( addToCalSignal(Incidence * ,Incidence *) ),
564 SLOT( addToCalSlot(Incidence * , Incidence *) ) ); 572 SLOT( addToCalSlot(Incidence * , Incidence *) ) );
565 // connect( mAgenda, SIGNAL( cloneIncidenceSignal(Incidence *) ), SIGNAL( cloneIncidenceSignal(Incidence *) ) ); 573 // connect( mAgenda, SIGNAL( cloneIncidenceSignal(Incidence *) ), SIGNAL( cloneIncidenceSignal(Incidence *) ) );
566 //connect( mAllDayAgenda, SIGNAL( cloneIncidenceSignal(Incidence *) ), SIGNAL( cloneIncidenceSignal(Incidence *) ) ); 574 //connect( mAllDayAgenda, SIGNAL( cloneIncidenceSignal(Incidence *) ), SIGNAL( cloneIncidenceSignal(Incidence *) ) );
567 575
568 576
569} 577}
570 578
571void KOAgendaView::toggleAllDay() 579void KOAgendaView::toggleAllDay()
572{ 580{
573 if ( mSplitterAgenda->firstHandle() ) 581 if ( mSplitterAgenda->firstHandle() )
574 mSplitterAgenda->firstHandle()->toggle(); 582 mSplitterAgenda->firstHandle()->toggle();
575} 583}
576void KOAgendaView::addToCalSlot(Incidence * inc, Incidence * incOld ) 584void KOAgendaView::addToCalSlot(Incidence * inc, Incidence * incOld )
577{ 585{
578 calendar()->addIncidence( inc ); 586 calendar()->addIncidence( inc );
579 587
580 if ( incOld ) { 588 if ( incOld ) {
581 if ( incOld->type() == "Todo" ) 589 if ( incOld->type() == "Todo" )
582 emit todoMoved((Todo*)incOld, KOGlobals::EVENTEDITED ); 590 emit todoMoved((Todo*)incOld, KOGlobals::EVENTEDITED );
583 else 591 else
584 emit incidenceChanged(incOld, KOGlobals::EVENTEDITED); 592 emit incidenceChanged(incOld, KOGlobals::EVENTEDITED);
585 } 593 }
586 594
587} 595}
588 596
589KOAgendaView::~KOAgendaView() 597KOAgendaView::~KOAgendaView()
590{ 598{
591 delete mAgendaPopup; 599 delete mAgendaPopup;
592 delete mAllDayAgendaPopup; 600 delete mAllDayAgendaPopup;
593 delete KOAgendaItem::paintPix(); 601 delete KOAgendaItem::paintPix();
594 delete KOAgendaItem::paintPixSel(); 602 delete KOAgendaItem::paintPixSel();
595} 603}
596void KOAgendaView::resizeEvent( QResizeEvent* e ) 604void KOAgendaView::resizeEvent( QResizeEvent* e )
597{ 605{
598 //qDebug("KOAgendaView::resizeEvent( QResizeEvent* e ) %d ", e->size().width()); 606 //qDebug("KOAgendaView::resizeEvent( QResizeEvent* e ) %d ", e->size().width());
599 bool uc = false; 607 bool uc = false;
600 int ow = e->oldSize().width(); 608 int ow = e->oldSize().width();
601 int oh = e->oldSize().height(); 609 int oh = e->oldSize().height();
602 int w = e->size().width(); 610 int w = e->size().width();
603 int h = e->size().height(); 611 int h = e->size().height();
604 if ( (ow > oh && w< h ) || (ow < oh && w > h ) ) { 612 if ( (ow > oh && w< h ) || (ow < oh && w > h ) ) {
605 if ( ! mBlockUpdating && !globalFlagBlockStartup && !globalFlagBlockAgenda ) 613 if ( ! mBlockUpdating && !globalFlagBlockStartup && !globalFlagBlockAgenda )
606 uc = true; 614 uc = true;
607 //qDebug("view changed %d %d %d %d ", ow, oh , w , h); 615 //qDebug("view changed %d %d %d %d ", ow, oh , w , h);
608 } 616 }
609 mUpcomingWidth = e->size().width() ; 617 mUpcomingWidth = e->size().width() ;
610 if ( mBlockUpdating || uc ) { 618 if ( mBlockUpdating || uc ) {
611 mBlockUpdating = false; 619 mBlockUpdating = false;
612 //mAgenda->setMinimumSize(800 , 600 ); 620 //mAgenda->setMinimumSize(800 , 600 );
613 //qDebug("mAgenda->resize+++++++++++++++ "); 621 //qDebug("mAgenda->resize+++++++++++++++ ");
614 updateConfig(); 622 updateConfig();
615 //qDebug("KOAgendaView::Updating now possible "); 623 //qDebug("KOAgendaView::Updating now possible ");
616 } else 624 } else
617 createDayLabels(); 625 createDayLabels();
618 //qDebug("resizeEvent end "); 626 //qDebug("resizeEvent end ");
619 627
620} 628}
621void KOAgendaView::slotDaylabelClicked( int num ) 629void KOAgendaView::slotDaylabelClicked( int num )
622{ 630{
623 631
624 QDate firstDate = mSelectedDates.first(); 632 QDate firstDate = mSelectedDates.first();
625 if ( num == -1 ) 633 if ( num == -1 )
626 emit showDateView( 6, firstDate ); 634 emit showDateView( 6, firstDate );
627 else if (num >= 0 ) { 635 else if (num >= 0 ) {
628 if ( mSelectedDates.count() == 1) 636 if ( mSelectedDates.count() == 1)
629 emit showDateView( 9, firstDate.addDays( num ) ); 637 emit showDateView( 9, firstDate.addDays( num ) );
630 else 638 else
631 emit showDateView( 3, firstDate.addDays( num ) ); 639 emit showDateView( 3, firstDate.addDays( num ) );
632 } 640 }
633 else 641 else
634 showDateView( 10, firstDate.addDays(1) ); 642 showDateView( 10, firstDate.addDays(1) );
635} 643}
636 644
637KOAgendaButton* KOAgendaView::getNewDaylabel() 645KOAgendaButton* KOAgendaView::getNewDaylabel()
638{ 646{
639 647
640 KOAgendaButton * dayLabel = new KOAgendaButton(mDayLabels); 648 KOAgendaButton * dayLabel = new KOAgendaButton(mDayLabels);
641 connect( dayLabel, SIGNAL( numClicked(int) ), this, SLOT ( slotDaylabelClicked(int) ) ); 649 connect( dayLabel, SIGNAL( numClicked(int) ), this, SLOT ( slotDaylabelClicked(int) ) );
642 mDayLabelsList.append( dayLabel ); 650 mDayLabelsList.append( dayLabel );
643 mLayoutDayLabels->addWidget(dayLabel); 651 mLayoutDayLabels->addWidget(dayLabel);
644 return dayLabel ; 652 return dayLabel ;
645} 653}
646 654
647void KOAgendaView::createDayLabels() 655void KOAgendaView::createDayLabels()
648{ 656{
649 657
650 if ( mBlockUpdating || globalFlagBlockLabel == 1) { 658 if ( mBlockUpdating || globalFlagBlockLabel == 1) {
651 // qDebug(" KOAgendaView::createDayLabels() blocked "); 659 // qDebug(" KOAgendaView::createDayLabels() blocked ");
652 return; 660 return;
653 661
654 } 662 }
655 int newHight; 663 int newHight;
656 664
657 // ### Before deleting and recreating we could check if mSelectedDates changed... 665 // ### Before deleting and recreating we could check if mSelectedDates changed...
658 // It would remove some flickering and gain speed (since this is called by 666 // It would remove some flickering and gain speed (since this is called by
659 // each updateView() call) 667 // each updateView() call)
660 668
661 int maxWid = mUpcomingWidth - mTimeLabels->width()- mAgenda->verticalScrollBar()->width() - 2; 669 int maxWid = mUpcomingWidth - mTimeLabels->width()- mAgenda->verticalScrollBar()->width() - 2;
662 mDayLabelsFrame->setMaximumWidth( mUpcomingWidth ); 670 mDayLabelsFrame->setMaximumWidth( mUpcomingWidth );
663 if ( maxWid < 0 ) 671 if ( maxWid < 0 )
664 maxWid = 20; 672 maxWid = 20;
665 673
666 QFont dlf = KOPrefs::instance()->mTimeLabelsFont; 674 QFont dlf = KOPrefs::instance()->mTimeLabelsFont;
667 QFontMetrics fm ( dlf ); 675 QFontMetrics fm ( dlf );
668 int selCount = mSelectedDates.count(); 676 int selCount = mSelectedDates.count();
669 QString dayTest = "Mon 20"; 677 QString dayTest = "Mon 20";
670 //QString dayTest = "Mon 20"; 678 //QString dayTest = "Mon 20";
671 int wid = fm.width( dayTest ); 679 int wid = fm.width( dayTest );
672 //maxWid -= ( selCount * 3 ); //working for QLabels 680 //maxWid -= ( selCount * 3 ); //working for QLabels
673 maxWid -= ( selCount * 3 ); //working for QPushButton 681 maxWid -= ( selCount * 3 ); //working for QPushButton
674 if ( maxWid < 0 ) 682 if ( maxWid < 0 )
675 maxWid = 20; 683 maxWid = 20;
676 int needWid = wid * selCount; 684 int needWid = wid * selCount;
677 //qDebug("++++++++Needed : %d MaxWidth: %d", needWid, maxWid ); 685 //qDebug("++++++++Needed : %d MaxWidth: %d", needWid, maxWid );
678 //if ( needWid > maxWid ) 686 //if ( needWid > maxWid )
679 // qDebug("DAYLABELS TOOOOOOO BIG "); 687 // qDebug("DAYLABELS TOOOOOOO BIG ");
680 while ( needWid > maxWid ) { 688 while ( needWid > maxWid ) {
681 dayTest = dayTest.left( dayTest.length() - 1 ); 689 dayTest = dayTest.left( dayTest.length() - 1 );
682 wid = fm.width( dayTest ); 690 wid = fm.width( dayTest );
683 needWid = wid * selCount; 691 needWid = wid * selCount;
684 } 692 }
685 int maxLen = dayTest.length(); 693 int maxLen = dayTest.length();
686 int fontPoint = dlf.pointSize(); 694 int fontPoint = dlf.pointSize();
687 if ( maxLen < 2 ) { 695 if ( maxLen < 2 ) {
688 int fontPoint = dlf.pointSize(); 696 int fontPoint = dlf.pointSize();
689 while ( fontPoint > 4 ) { 697 while ( fontPoint > 4 ) {
690 --fontPoint; 698 --fontPoint;
691 dlf.setPointSize( fontPoint ); 699 dlf.setPointSize( fontPoint );
692 QFontMetrics f( dlf ); 700 QFontMetrics f( dlf );
693 wid = f.width( "30" ); 701 wid = f.width( "30" );
694 needWid = wid * selCount; 702 needWid = wid * selCount;
695 if ( needWid < maxWid ) 703 if ( needWid < maxWid )
696 break; 704 break;
697 } 705 }
698 maxLen = 2; 706 maxLen = 2;
699 } 707 }
700 //qDebug("Max len %d ", dayTest.length() ); 708 //qDebug("Max len %d ", dayTest.length() );
701 709
702 QFontMetrics tempF( dlf ); 710 QFontMetrics tempF( dlf );
703 newHight = tempF.height(); 711 newHight = tempF.height();
704 mDayLabels->setFont( dlf ); 712 mDayLabels->setFont( dlf );
705 // mLayoutDayLabels = new QHBoxLayout(mDayLabels);; 713 // mLayoutDayLabels = new QHBoxLayout(mDayLabels);;
706 // mLayoutDayLabels->addSpacing(mTimeLabels->width()); 714 // mLayoutDayLabels->addSpacing(mTimeLabels->width());
707 //mLayoutDayLabels->addSpacing( 2 ); 715 //mLayoutDayLabels->addSpacing( 2 );
708 // QFont lFont = dlf; 716 // QFont lFont = dlf;
709 bool appendLabels = false; 717 bool appendLabels = false;
710 KOAgendaButton *dayLabel; 718 KOAgendaButton *dayLabel;
711 dayLabel = mDayLabelsList.first(); 719 dayLabel = mDayLabelsList.first();
712 if ( !dayLabel ) { 720 if ( !dayLabel ) {
713 appendLabels = true; 721 appendLabels = true;
714 dayLabel = getNewDaylabel(); 722 dayLabel = getNewDaylabel();
715 } 723 }
716 dayLabel->setFixedWidth( mTimeLabels->width()+mAgenda->frameWidth() ); 724 dayLabel->setFixedWidth( mTimeLabels->width()+mAgenda->frameWidth() );
717 dayLabel->setFont( dlf ); 725 dayLabel->setFont( dlf );
718 dayLabel->setNum( -1 ); 726 dayLabel->setNum( -1 );
719 //dayLabel->setAlignment(QLabel::AlignHCenter); 727 //dayLabel->setAlignment(QLabel::AlignHCenter);
720 dayLabel->setText( KOGlobals::self()->calendarSystem()->monthName( mSelectedDates.first(), true ) ); 728 dayLabel->setText( KOGlobals::self()->calendarSystem()->monthName( mSelectedDates.first(), true ) );
721 dayLabel->show(); 729 dayLabel->show();
722 DateList::ConstIterator dit; 730 DateList::ConstIterator dit;
723 bool oneday = (mSelectedDates.first() == mSelectedDates.last() ); 731 bool oneday = (mSelectedDates.first() == mSelectedDates.last() );
724 int counter = -1; 732 int counter = -1;
725 for( dit = mSelectedDates.begin(); dit != mSelectedDates.end(); ++dit ) { 733 for( dit = mSelectedDates.begin(); dit != mSelectedDates.end(); ++dit ) {
diff --git a/microkde/KDGanttMinimizeSplitter.cpp b/microkde/KDGanttMinimizeSplitter.cpp
index d675517..6cb1f31 100644
--- a/microkde/KDGanttMinimizeSplitter.cpp
+++ b/microkde/KDGanttMinimizeSplitter.cpp
@@ -169,1033 +169,1034 @@ void KDGanttSplitterHandle::toggle()
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 buffer.fill( colorGroup().background() );
275 //buffer.fill( backgroundColor() ); 275 //buffer.fill( backgroundColor() );
276 // parentWidget()->style().drawPrimitive( QStyle::PE_Panel, &p, rect(), parentWidget()->colorGroup()); 276 // parentWidget()->style().drawPrimitive( QStyle::PE_Panel, &p, rect(), parentWidget()->colorGroup());
277 277
278 int sw = 8; // Hardcoded, given I didn't use styles anymore, I didn't like to use their size 278 int sw = 8; // Hardcoded, given I didn't use styles anymore, I didn't like to use their size
279 279
280 // arrow color 280 // arrow color
281 QColor col; 281 QColor col;
282 if ( _activeButton ) 282 if ( _activeButton )
283 col = colorGroup().background().dark( 250 ); 283 col = colorGroup().background().dark( 250 );
284 else { 284 else {
285 if ( mMouseDown ) 285 if ( mMouseDown )
286 col = Qt::white; 286 col = Qt::white;
287 else 287 else
288 col = colorGroup().background().dark( 150 ); 288 col = colorGroup().background().dark( 150 );
289 } 289 }
290 //QColor col = backgroundColor().dark( 130 ); 290 //QColor col = backgroundColor().dark( 130 );
291 p.setBrush( col ); 291 p.setBrush( col );
292 p.setPen( col ); 292 p.setPen( col );
293 293
294 QValueList<QPointArray> list = buttonRegions(); 294 QValueList<QPointArray> list = buttonRegions();
295 int index = 1; 295 int index = 1;
296 if ( mUseOffset ) 296 if ( mUseOffset )
297 p.translate( 0, 1 ); 297 p.translate( 0, 1 );
298 for ( QValueList<QPointArray>::Iterator it = list.begin(); it != list.end(); ++it ) { 298 for ( QValueList<QPointArray>::Iterator it = list.begin(); it != list.end(); ++it ) {
299 if ( index == _activeButton ) { 299 if ( index == _activeButton ) {
300 300
301 /* 301 /*
302 if ( ! _collapsed ) { 302 if ( ! _collapsed ) {
303 p.save(); 303 p.save();
304 // p.translate( parentWidget()->style().pixelMetric( QStyle::PM_ButtonShiftHorizontal ), 304 // p.translate( parentWidget()->style().pixelMetric( QStyle::PM_ButtonShiftHorizontal ),
305 // parentWidget()->style().pixelMetric( QStyle::PM_ButtonShiftVertical ) ); 305 // parentWidget()->style().pixelMetric( QStyle::PM_ButtonShiftVertical ) );
306 p.translate( -1, 0 ); 306 p.translate( -1, 0 );
307 p.drawPolygon( *it, true ); 307 p.drawPolygon( *it, true );
308 p.restore(); } else 308 p.restore(); } else
309 */ 309 */
310 p.drawPolygon( *it, true ); 310 p.drawPolygon( *it, true );
311 311
312 } 312 }
313 else { 313 else {
314 /* 314 /*
315 if ( ! _collapsed ) { 315 if ( ! _collapsed ) {
316 p.save(); 316 p.save();
317 p.translate( -1, 0 ); 317 p.translate( -1, 0 );
318 p.drawPolygon( *it, true ); 318 p.drawPolygon( *it, true );
319 p.restore(); 319 p.restore();
320 } else 320 } else
321 */ 321 */
322 p.drawPolygon( *it, true ); 322 p.drawPolygon( *it, true );
323 323
324 } 324 }
325 index++; 325 index++;
326 } 326 }
327 327
328 // Draw the lines between the arrows 328 // Draw the lines between the arrows
329 if ( s->minimizeDirection() == KDGanttMinimizeSplitter::Left || 329 if ( s->minimizeDirection() == KDGanttMinimizeSplitter::Left ||
330 s->minimizeDirection() == KDGanttMinimizeSplitter::Right ) { 330 s->minimizeDirection() == KDGanttMinimizeSplitter::Right ) {
331 int mid = height()/2; 331 int mid = height()/2;
332 p.drawLine ( 1, mid - sw, 1, mid + sw ); 332 p.drawLine ( 1, mid - sw, 1, mid + sw );
333 p.drawLine ( 3, mid - sw, 3, mid + sw ); 333 p.drawLine ( 3, mid - sw, 3, mid + sw );
334 } 334 }
335 else if ( s->minimizeDirection() == KDGanttMinimizeSplitter::Up || 335 else if ( s->minimizeDirection() == KDGanttMinimizeSplitter::Up ||
336 s->minimizeDirection() == KDGanttMinimizeSplitter::Down ) { 336 s->minimizeDirection() == KDGanttMinimizeSplitter::Down ) {
337 int mid = width()/2; 337 int mid = width()/2;
338 p.drawLine( mid -sw, 1, mid +sw, 1 ); 338 p.drawLine( mid -sw, 1, mid +sw, 1 );
339 p.drawLine( mid -sw, 3, mid +sw, 3 ); 339 p.drawLine( mid -sw, 3, mid +sw, 3 );
340 } 340 }
341 bitBlt( this, 0, 0, &buffer ); 341 bitBlt( this, 0, 0, &buffer );
342 342
343} 343}
344#endif 344#endif
345 345
346class QSplitterLayoutStruct 346class QSplitterLayoutStruct
347{ 347{
348public: 348public:
349 KDGanttMinimizeSplitter::ResizeMode mode; 349 KDGanttMinimizeSplitter::ResizeMode mode;
350 QCOORD sizer; 350 QCOORD sizer;
351 bool isSplitter; 351 bool isSplitter;
352 QWidget *wid; 352 QWidget *wid;
353}; 353};
354 354
355class QSplitterData 355class QSplitterData
356{ 356{
357public: 357public:
358 QSplitterData() : opaque( FALSE ), firstShow( TRUE ) {} 358 QSplitterData() : opaque( FALSE ), firstShow( TRUE ) {}
359 359
360 QPtrList<QSplitterLayoutStruct> list; 360 QPtrList<QSplitterLayoutStruct> list;
361 bool opaque; 361 bool opaque;
362 bool firstShow; 362 bool firstShow;
363}; 363};
364 364
365void kdganttGeomCalc( QMemArray<QLayoutStruct> &chain, int start, int count, int pos, 365void kdganttGeomCalc( QMemArray<QLayoutStruct> &chain, int start, int count, int pos,
366 int space, int spacer ); 366 int space, int spacer );
367#endif // DOXYGEN_SKIP_INTERNAL 367#endif // DOXYGEN_SKIP_INTERNAL
368 368
369 369
370/*! 370/*!
371 \class KDGanttMinimizeSplitter KDGanttMinimizeSplitter.h 371 \class KDGanttMinimizeSplitter KDGanttMinimizeSplitter.h
372 \brief The KDGanttMinimizeSplitter class implements a splitter 372 \brief The KDGanttMinimizeSplitter class implements a splitter
373 widget with minimize buttons. 373 widget with minimize buttons.
374 374
375 This class (and its documentation) is largely a copy of Qt's 375 This class (and its documentation) is largely a copy of Qt's
376 QSplitter; the copying was necessary because QSplitter is not 376 QSplitter; the copying was necessary because QSplitter is not
377 extensible at all. QSplitter and its documentation are licensed 377 extensible at all. QSplitter and its documentation are licensed
378 according to the GPL and the Qt Professional License (if you hold 378 according to the GPL and the Qt Professional License (if you hold
379 such a license) and are (C) Trolltech AS. 379 such a license) and are (C) Trolltech AS.
380 380
381 A splitter lets the user control the size of child widgets by 381 A splitter lets the user control the size of child widgets by
382 dragging the boundary between the children. Any number of widgets 382 dragging the boundary between the children. Any number of widgets
383 may be controlled. 383 may be controlled.
384 384
385 To show a QListBox, a QListView and a QTextEdit side by side: 385 To show a QListBox, a QListView and a QTextEdit side by side:
386 386
387 \code 387 \code
388 KDGanttMinimizeSplitter *split = new KDGanttMinimizeSplitter( parent ); 388 KDGanttMinimizeSplitter *split = new KDGanttMinimizeSplitter( parent );
389 QListBox *lb = new QListBox( split ); 389 QListBox *lb = new QListBox( split );
390 QListView *lv = new QListView( split ); 390 QListView *lv = new QListView( split );
391 QTextEdit *ed = new QTextEdit( split ); 391 QTextEdit *ed = new QTextEdit( split );
392 \endcode 392 \endcode
393 393
394 In KDGanttMinimizeSplitter, the boundary can be either horizontal or 394 In KDGanttMinimizeSplitter, the boundary can be either horizontal or
395 vertical. The default is horizontal (the children are side by side) 395 vertical. The default is horizontal (the children are side by side)
396 but you can use setOrientation( QSplitter::Vertical ) to set it to 396 but you can use setOrientation( QSplitter::Vertical ) to set it to
397 vertical. 397 vertical.
398 398
399 Use setResizeMode() to specify 399 Use setResizeMode() to specify
400 that a widget should keep its size when the splitter is resized. 400 that a widget should keep its size when the splitter is resized.
401 401
402 Although KDGanttMinimizeSplitter normally resizes the children only 402 Although KDGanttMinimizeSplitter normally resizes the children only
403 at the end of a resize operation, if you call setOpaqueResize( TRUE 403 at the end of a resize operation, if you call setOpaqueResize( TRUE
404 ) the widgets are resized as often as possible. 404 ) the widgets are resized as often as possible.
405 405
406 The initial distribution of size between the widgets is determined 406 The initial distribution of size between the widgets is determined
407 by the initial size of each widget. You can also use setSizes() to 407 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 408 set the sizes of all the widgets. The function sizes() returns the
409 sizes set by the user. 409 sizes set by the user.
410 410
411 If you hide() a child, its space will be distributed among the other 411 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 412 children. It will be reinstated when you show() it again. It is also
413 possible to reorder the widgets within the splitter using 413 possible to reorder the widgets within the splitter using
414 moveToFirst() and moveToLast(). 414 moveToFirst() and moveToLast().
415*/ 415*/
416 416
417 417
418 418
419static QSize minSize( const QWidget* /*w*/ ) 419static QSize minSize( const QWidget* /*w*/ )
420{ 420{
421 return QSize(0,0); 421 return QSize(0,0);
422} 422}
423 423
424// This is the original version of minSize 424// This is the original version of minSize
425static QSize minSizeHint( const QWidget* w ) 425static QSize minSizeHint( const QWidget* w )
426{ 426{
427 QSize min = w->minimumSize(); 427 QSize min = w->minimumSize();
428 QSize s; 428 QSize s;
429 if ( min.height() <= 0 || min.width() <= 0 ) 429 if ( min.height() <= 0 || min.width() <= 0 )
430 s = w->minimumSizeHint(); 430 s = w->minimumSizeHint();
431 if ( min.height() > 0 ) 431 if ( min.height() > 0 )
432 s.setHeight( min.height() ); 432 s.setHeight( min.height() );
433 if ( min.width() > 0 ) 433 if ( min.width() > 0 )
434 s.setWidth( min.width() ); 434 s.setWidth( min.width() );
435 return s.expandedTo(QSize(0,0)); 435 return s.expandedTo(QSize(0,0));
436} 436}
437 437
438 438
439/*! 439/*!
440 Constructs a horizontal splitter with the \a parent and \a 440 Constructs a horizontal splitter with the \a parent and \a
441 name arguments being passed on to the QFrame constructor. 441 name arguments being passed on to the QFrame constructor.
442*/ 442*/
443KDGanttMinimizeSplitter::KDGanttMinimizeSplitter( QWidget *parent, const char *name ) 443KDGanttMinimizeSplitter::KDGanttMinimizeSplitter( QWidget *parent, const char *name )
444 :QFrame(parent,name,WPaintUnclipped) 444 :QFrame(parent,name,WPaintUnclipped)
445{ 445{
446 mRubberBand = 0; 446 mRubberBand = 0;
447 mFirstHandle = 0; 447 mFirstHandle = 0;
448#if QT_VERSION >= 232 448#if QT_VERSION >= 232
449 orient = Horizontal; 449 orient = Horizontal;
450 init(); 450 init();
451#endif 451#endif
452} 452}
453 453
454/*! 454/*!
455 Constructs a splitter with orientation \a o with the \a parent 455 Constructs a splitter with orientation \a o with the \a parent
456 and \a name arguments being passed on to the QFrame constructor. 456 and \a name arguments being passed on to the QFrame constructor.
457*/ 457*/
458KDGanttMinimizeSplitter::KDGanttMinimizeSplitter( Orientation o, QWidget *parent, const char *name ) 458KDGanttMinimizeSplitter::KDGanttMinimizeSplitter( Orientation o, QWidget *parent, const char *name )
459 :QFrame(parent,name,WPaintUnclipped) 459 :QFrame(parent,name,WPaintUnclipped)
460{ 460{
461 461
462 mRubberBand = 0; 462 mRubberBand = 0;
463 mFirstHandle = 0; 463 mFirstHandle = 0;
464#if QT_VERSION >= 232 464#if QT_VERSION >= 232
465 orient = o; 465 orient = o;
466 init(); 466 init();
467#endif 467#endif
468} 468}
469 469
470/*! 470/*!
471 Destroys the splitter and any children. 471 Destroys the splitter and any children.
472*/ 472*/
473KDGanttMinimizeSplitter::~KDGanttMinimizeSplitter() 473KDGanttMinimizeSplitter::~KDGanttMinimizeSplitter()
474{ 474{
475#if QT_VERSION >= 232 475#if QT_VERSION >= 232
476 data->list.setAutoDelete( TRUE ); 476 data->list.setAutoDelete( TRUE );
477 delete data; 477 delete data;
478#endif 478#endif
479 if ( mRubberBand ) 479 if ( mRubberBand )
480 delete mRubberBand; 480 delete mRubberBand;
481} 481}
482 482
483 483
484#if QT_VERSION >= 232 484#if QT_VERSION >= 232
485void KDGanttMinimizeSplitter::init() 485void KDGanttMinimizeSplitter::init()
486{ 486{
487 data = new QSplitterData; 487 data = new QSplitterData;
488 if ( orient == Horizontal ) 488 if ( orient == Horizontal )
489 setSizePolicy( QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum) ); 489 setSizePolicy( QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Minimum) );
490 else 490 else
491 setSizePolicy( QSizePolicy(QSizePolicy::Minimum,QSizePolicy::Expanding) ); 491 setSizePolicy( QSizePolicy(QSizePolicy::Minimum,QSizePolicy::Expanding) );
492#ifndef DESKTOP_VERSION 492#ifndef DESKTOP_VERSION
493 setOpaqueResize( false ); 493 setOpaqueResize( false );
494#else 494#else
495 setOpaqueResize( true ); 495 setOpaqueResize( true );
496#endif 496#endif
497} 497}
498#endif 498#endif
499 499
500 500
501void KDGanttMinimizeSplitter::toggle() 501void KDGanttMinimizeSplitter::toggle()
502{ 502{
503 if ( mFirstHandle ) 503 if ( mFirstHandle )
504 mFirstHandle->toggle(); 504 mFirstHandle->toggle();
505 else 505 else
506 qDebug("KDGanttMinimizeSplitter::toggle::sorry, handle not available "); 506 qDebug("KDGanttMinimizeSplitter::toggle::sorry, handle not available ");
507 507
508} 508}
509 509
510 510
511/*! 511/*!
512 \brief the orientation of the splitter 512 \brief the orientation of the splitter
513 513
514 By default the orientation is horizontal (the widgets are side by side). 514 By default the orientation is horizontal (the widgets are side by side).
515 The possible orientations are Qt:Vertical and Qt::Horizontal (the default). 515 The possible orientations are Qt:Vertical and Qt::Horizontal (the default).
516*/ 516*/
517void KDGanttMinimizeSplitter::setOrientation( Orientation o ) 517void KDGanttMinimizeSplitter::setOrientation( Orientation o )
518{ 518{
519#if QT_VERSION >= 232 519#if QT_VERSION >= 232
520 if ( orient == o ) 520 if ( orient == o )
521 return; 521 return;
522 orient = o; 522 orient = o;
523 523
524 if ( orient == Horizontal ) 524 if ( orient == Horizontal )
525 setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ) ); 525 setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ) );
526 else 526 else
527 setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Expanding ) ); 527 setSizePolicy( QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Expanding ) );
528 528
529 QSplitterLayoutStruct *s = data->list.first(); 529 QSplitterLayoutStruct *s = data->list.first();
530 while ( s ) { 530 while ( s ) {
531 if ( s->isSplitter ) 531 if ( s->isSplitter )
532 ((KDGanttSplitterHandle*)s->wid)->setOrientation( o ); 532 ((KDGanttSplitterHandle*)s->wid)->setOrientation( o );
533 s = data->list.next(); // ### next at end of loop, no iterator 533 s = data->list.next(); // ### next at end of loop, no iterator
534 } 534 }
535 recalc( isVisible() ); 535 recalc( isVisible() );
536#endif 536#endif
537} 537}
538 538
539 539
540#if QT_VERSION >= 232 540#if QT_VERSION >= 232
541/*! 541/*!
542 \reimp 542 \reimp
543*/ 543*/
544void KDGanttMinimizeSplitter::resizeEvent( QResizeEvent * ) 544void KDGanttMinimizeSplitter::resizeEvent( QResizeEvent * )
545{ 545{
546 doResize(); 546 doResize();
547} 547}
548 548
549 549
550/* 550/*
551 Inserts the widget \a w at the end (or at the beginning if \a first 551 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. 552 is TRUE) of the splitter's list of widgets.
553 553
554 It is the responsibility of the caller of this function to make sure 554 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 555 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 556 needed. (If \a first is TRUE, then recalcId is very probably
557 needed.) 557 needed.)
558*/ 558*/
559QSplitterLayoutStruct *KDGanttMinimizeSplitter::addWidget( QWidget *w, bool first ) 559QSplitterLayoutStruct *KDGanttMinimizeSplitter::addWidget( QWidget *w, bool first )
560{ 560{
561 QSplitterLayoutStruct *s; 561 QSplitterLayoutStruct *s;
562 KDGanttSplitterHandle *newHandle = 0; 562 KDGanttSplitterHandle *newHandle = 0;
563 if ( data->list.count() > 0 ) { 563 if ( data->list.count() > 0 ) {
564 s = new QSplitterLayoutStruct; 564 s = new QSplitterLayoutStruct;
565 s->mode = KeepSize; 565 s->mode = KeepSize;
566 QString tmp = "qt_splithandle_"; 566 QString tmp = "qt_splithandle_";
567 tmp += w->name(); 567 tmp += w->name();
568 newHandle = new KDGanttSplitterHandle( orientation(), this, tmp.latin1() ); 568 newHandle = new KDGanttSplitterHandle( orientation(), this, tmp.latin1() );
569 if ( ! mFirstHandle ) 569 if ( ! mFirstHandle )
570 mFirstHandle = newHandle; 570 mFirstHandle = newHandle;
571 s->wid = newHandle; 571 s->wid = newHandle;
572 newHandle->setId(data->list.count()); 572 newHandle->setId(data->list.count());
573 s->isSplitter = TRUE; 573 s->isSplitter = TRUE;
574 s->sizer = pick( newHandle->sizeHint() ); 574 s->sizer = pick( newHandle->sizeHint() );
575 if ( first ) 575 if ( first )
576 data->list.insert( 0, s ); 576 data->list.insert( 0, s );
577 else 577 else
578 data->list.append( s ); 578 data->list.append( s );
579 } 579 }
580 s = new QSplitterLayoutStruct; 580 s = new QSplitterLayoutStruct;
581 s->mode = Stretch; 581 s->mode = Stretch;
582 s->wid = w; 582 s->wid = w;
583 if ( !testWState( WState_Resized ) && w->sizeHint().isValid() ) 583 if ( !testWState( WState_Resized ) && w->sizeHint().isValid() )
584 s->sizer = pick( w->sizeHint() ); 584 s->sizer = pick( w->sizeHint() );
585 else 585 else
586 s->sizer = pick( w->size() ); 586 s->sizer = pick( w->size() );
587 s->isSplitter = FALSE; 587 s->isSplitter = FALSE;
588 if ( first ) 588 if ( first )
589 data->list.insert( 0, s ); 589 data->list.insert( 0, s );
590 else 590 else
591 data->list.append( s ); 591 data->list.append( s );
592 if ( newHandle && isVisible() ) 592 if ( newHandle && isVisible() )
593 newHandle->show(); //will trigger sending of post events 593 newHandle->show(); //will trigger sending of post events
594 return s; 594 return s;
595} 595}
596 596
597 597
598/*! 598/*!
599 Tells the splitter that a child widget has been inserted or removed. 599 Tells the splitter that a child widget has been inserted or removed.
600 The event is passed in \a c. 600 The event is passed in \a c.
601*/ 601*/
602void KDGanttMinimizeSplitter::childEvent( QChildEvent *c ) 602void KDGanttMinimizeSplitter::childEvent( QChildEvent *c )
603{ 603{
604 if ( c->type() == QEvent::ChildInserted ) { 604 if ( c->type() == QEvent::ChildInserted ) {
605 if ( !c->child()->isWidgetType() ) 605 if ( !c->child()->isWidgetType() )
606 return; 606 return;
607 607
608 if ( ((QWidget*)c->child())->testWFlags( WType_TopLevel ) ) 608 if ( ((QWidget*)c->child())->testWFlags( WType_TopLevel ) )
609 return; 609 return;
610 610
611 QSplitterLayoutStruct *s = data->list.first(); 611 QSplitterLayoutStruct *s = data->list.first();
612 while ( s ) { 612 while ( s ) {
613 if ( s->wid == c->child() ) 613 if ( s->wid == c->child() )
614 return; 614 return;
615 s = data->list.next(); 615 s = data->list.next();
616 } 616 }
617 addWidget( (QWidget*)c->child() ); 617 addWidget( (QWidget*)c->child() );
618 recalc( isVisible() ); 618 recalc( isVisible() );
619 619
620 } else if ( c->type() == QEvent::ChildRemoved ) { 620 } else if ( c->type() == QEvent::ChildRemoved ) {
621 QSplitterLayoutStruct *p = 0; 621 QSplitterLayoutStruct *p = 0;
622 if ( data->list.count() > 1 ) 622 if ( data->list.count() > 1 )
623 p = data->list.at(1); //remove handle _after_ first widget. 623 p = data->list.at(1); //remove handle _after_ first widget.
624 QSplitterLayoutStruct *s = data->list.first(); 624 QSplitterLayoutStruct *s = data->list.first();
625 while ( s ) { 625 while ( s ) {
626 if ( s->wid == c->child() ) { 626 if ( s->wid == c->child() ) {
627 data->list.removeRef( s ); 627 data->list.removeRef( s );
628 delete s; 628 delete s;
629 if ( p && p->isSplitter ) { 629 if ( p && p->isSplitter ) {
630 data->list.removeRef( p ); 630 data->list.removeRef( p );
631 delete p->wid; //will call childEvent 631 delete p->wid; //will call childEvent
632 delete p; 632 delete p;
633 } 633 }
634 recalcId(); 634 recalcId();
635 doResize(); 635 doResize();
636 return; 636 return;
637 } 637 }
638 p = s; 638 p = s;
639 s = data->list.next(); 639 s = data->list.next();
640 } 640 }
641 } 641 }
642} 642}
643 643
644 644
645/*! 645/*!
646 Shows a rubber band at position \a p. If \a p is negative, the 646 Shows a rubber band at position \a p. If \a p is negative, the
647 rubber band is removed. 647 rubber band is removed.
648*/ 648*/
649void KDGanttMinimizeSplitter::setRubberband( int p ) 649void KDGanttMinimizeSplitter::setRubberband( int p )
650{ 650{
651#ifdef DESKTOP_VERSION 651#ifdef DESKTOP_VERSION
652 QPainter paint( this ); 652 QPainter paint( this );
653 paint.setPen( gray ); 653 paint.setPen( gray );
654 paint.setBrush( gray ); 654 paint.setBrush( gray );
655 paint.setRasterOp( XorROP ); 655 paint.setRasterOp( XorROP );
656 QRect r = contentsRect(); 656 QRect r = contentsRect();
657 const int rBord = 3; //Themable???? 657 const int rBord = 3; //Themable????
658#if QT_VERSION >= 0x030000 658#if QT_VERSION >= 0x030000
659 int sw = style().pixelMetric(QStyle::PM_SplitterWidth, this); 659 int sw = style().pixelMetric(QStyle::PM_SplitterWidth, this);
660#else 660#else
661 int sw = style().splitterWidth(); 661 int sw = style().splitterWidth();
662#endif 662#endif
663 if ( orient == Horizontal ) { 663 if ( orient == Horizontal ) {
664 if ( opaqueOldPos >= 0 ) 664 if ( opaqueOldPos >= 0 )
665 paint.drawRect( opaqueOldPos + sw/2 - rBord , r.y(), 665 paint.drawRect( opaqueOldPos + sw/2 - rBord , r.y(),
666 2*rBord, r.height() ); 666 2*rBord, r.height() );
667 if ( p >= 0 ) 667 if ( p >= 0 )
668 paint.drawRect( p + sw/2 - rBord, r.y(), 2*rBord, r.height() ); 668 paint.drawRect( p + sw/2 - rBord, r.y(), 2*rBord, r.height() );
669 } else { 669 } else {
670 if ( opaqueOldPos >= 0 ) 670 if ( opaqueOldPos >= 0 )
671 paint.drawRect( r.x(), opaqueOldPos + sw/2 - rBord, 671 paint.drawRect( r.x(), opaqueOldPos + sw/2 - rBord,
672 r.width(), 2*rBord ); 672 r.width(), 2*rBord );
673 if ( p >= 0 ) 673 if ( p >= 0 )
674 paint.drawRect( r.x(), p + sw/2 - rBord, r.width(), 2*rBord ); 674 paint.drawRect( r.x(), p + sw/2 - rBord, r.width(), 2*rBord );
675 } 675 }
676 opaqueOldPos = p; 676 opaqueOldPos = p;
677#else 677#else
678 if ( !mRubberBand ) { 678 if ( !mRubberBand ) {
679 mRubberBand = new QFrame( 0, "rubber", WStyle_NoBorder | WStyle_Customize | WStyle_StaysOnTop); 679 mRubberBand = new QFrame( 0, "rubber", WStyle_NoBorder | WStyle_Customize | WStyle_StaysOnTop);
680 mRubberBand->setFrameStyle( Box | Raised ); 680 mRubberBand->setFrameStyle( Box | Raised );
681 mRubberBand->setPalette( QPalette ( Qt::red.light(),Qt::red.dark() ) ); 681 //mRubberBand->setPalette( QPalette ( Qt::red.light(),Qt::red.dark() ) );
682 mRubberBand->setPalette( QPalette ( QColor( 178,18,188), QColor( 242,27,255 ) ));
682 } 683 }
683 QRect r = contentsRect(); 684 QRect r = contentsRect();
684 static int rBord = 0; //Themable???? 685 static int rBord = 0; //Themable????
685 if ( !rBord ) { 686 if ( !rBord ) {
686 if (QApplication::desktop()->width() <= 320 ) 687 if (QApplication::desktop()->width() <= 320 )
687 rBord = 4; 688 rBord = 3;
688 else 689 else
689 rBord = 5; 690 rBord = 4;
690 } 691 }
691 int sw = style().splitterWidth(); 692 int sw = style().splitterWidth();
692 if ( orient == Horizontal ) { 693 if ( orient == Horizontal ) {
693 if ( p >= 0 ) { 694 if ( p >= 0 ) {
694 QPoint geo = mapToGlobal (QPoint ( p + sw/2 - rBord, r.y())); 695 QPoint geo = mapToGlobal (QPoint ( p + sw/2 - rBord, r.y()));
695 mRubberBand->setGeometry( geo.x(), geo.y(), 2*rBord, r.height() ); 696 mRubberBand->setGeometry( geo.x(), geo.y(), 2*rBord, r.height() );
696 } 697 }
697 } else { 698 } else {
698 if ( p >= 0 ) { 699 if ( p >= 0 ) {
699 QPoint geo = mapToGlobal (QPoint ( r.x(), p + sw/2 - rBord)); 700 QPoint geo = mapToGlobal (QPoint ( r.x(), p + sw/2 - rBord));
700 mRubberBand->setGeometry( geo.x(), geo.y(), r.width(), 2*rBord); 701 mRubberBand->setGeometry( geo.x(), geo.y(), r.width(), 2*rBord);
701 } 702 }
702 } 703 }
703 opaqueOldPos = p; 704 opaqueOldPos = p;
704 if ( ! mRubberBand->isVisible() ) { 705 if ( ! mRubberBand->isVisible() ) {
705 mRubberBand->show(); 706 mRubberBand->show();
706 } 707 }
707#endif 708#endif
708} 709}
709 710
710 711
711/*! \reimp */ 712/*! \reimp */
712bool KDGanttMinimizeSplitter::event( QEvent *e ) 713bool KDGanttMinimizeSplitter::event( QEvent *e )
713{ 714{
714 if ( e->type() == QEvent::LayoutHint || ( e->type() == QEvent::Show && data->firstShow ) ) { 715 if ( e->type() == QEvent::LayoutHint || ( e->type() == QEvent::Show && data->firstShow ) ) {
715 recalc( isVisible() ); 716 recalc( isVisible() );
716 if ( e->type() == QEvent::Show ) 717 if ( e->type() == QEvent::Show )
717 data->firstShow = FALSE; 718 data->firstShow = FALSE;
718 } 719 }
719 return QWidget::event( e ); 720 return QWidget::event( e );
720} 721}
721 722
722 723
723/*! 724/*!
724 \obsolete 725 \obsolete
725 726
726 Draws the splitter handle in the rectangle described by \a x, \a y, 727 Draws the splitter handle in the rectangle described by \a x, \a y,
727 \a w, \a h using painter \a p. 728 \a w, \a h using painter \a p.
728 \sa QStyle::drawPrimitive() 729 \sa QStyle::drawPrimitive()
729*/ 730*/
730void KDGanttMinimizeSplitter::drawSplitter( QPainter *p, 731void KDGanttMinimizeSplitter::drawSplitter( QPainter *p,
731 QCOORD x, QCOORD y, QCOORD w, QCOORD h ) 732 QCOORD x, QCOORD y, QCOORD w, QCOORD h )
732{ 733{
733#if 0 734#if 0
734 // LR 735 // LR
735 style().drawPrimitive(QStyle::PE_Splitter, p, QRect(x, y, w, h), colorGroup(), 736 style().drawPrimitive(QStyle::PE_Splitter, p, QRect(x, y, w, h), colorGroup(),
736 (orientation() == Qt::Horizontal ? 737 (orientation() == Qt::Horizontal ?
737 QStyle::Style_Horizontal : 0)); 738 QStyle::Style_Horizontal : 0));
738#endif 739#endif
739} 740}
740 741
741 742
742/*! 743/*!
743 Returns the id of the splitter to the right of or below the widget \a w, 744 Returns the id of the splitter to the right of or below the widget \a w,
744 or 0 if there is no such splitter 745 or 0 if there is no such splitter
745 (i.e. it is either not in this KDGanttMinimizeSplitter or it is at the end). 746 (i.e. it is either not in this KDGanttMinimizeSplitter or it is at the end).
746*/ 747*/
747int KDGanttMinimizeSplitter::idAfter( QWidget* w ) const 748int KDGanttMinimizeSplitter::idAfter( QWidget* w ) const
748{ 749{
749 QSplitterLayoutStruct *s = data->list.first(); 750 QSplitterLayoutStruct *s = data->list.first();
750 bool seen_w = FALSE; 751 bool seen_w = FALSE;
751 while ( s ) { 752 while ( s ) {
752 if ( s->isSplitter && seen_w ) 753 if ( s->isSplitter && seen_w )
753 return data->list.at(); 754 return data->list.at();
754 if ( !s->isSplitter && s->wid == w ) 755 if ( !s->isSplitter && s->wid == w )
755 seen_w = TRUE; 756 seen_w = TRUE;
756 s = data->list.next(); 757 s = data->list.next();
757 } 758 }
758 return 0; 759 return 0;
759} 760}
760 761
761 762
762/*! 763/*!
763 Moves the left/top edge of the splitter handle with id \a id as 764 Moves the left/top edge of the splitter handle with id \a id as
764 close as possible to position \a p, which is the distance from the 765 close as possible to position \a p, which is the distance from the
765 left (or top) edge of the widget. 766 left (or top) edge of the widget.
766 767
767 For Arabic and Hebrew the layout is reversed, and using this 768 For Arabic and Hebrew the layout is reversed, and using this
768 function to set the position of the splitter might lead to 769 function to set the position of the splitter might lead to
769 unexpected results, since in Arabic and Hebrew the position of 770 unexpected results, since in Arabic and Hebrew the position of
770 splitter one is to the left of the position of splitter zero. 771 splitter one is to the left of the position of splitter zero.
771 772
772 \sa idAfter() 773 \sa idAfter()
773*/ 774*/
774void KDGanttMinimizeSplitter::moveSplitter( QCOORD p, int id ) 775void KDGanttMinimizeSplitter::moveSplitter( QCOORD p, int id )
775{ 776{
776 p = adjustPos( p, id ); 777 p = adjustPos( p, id );
777 QSplitterLayoutStruct *s = data->list.at(id); 778 QSplitterLayoutStruct *s = data->list.at(id);
778 int oldP = orient == Horizontal ? s->wid->x() : s->wid->y(); 779 int oldP = orient == Horizontal ? s->wid->x() : s->wid->y();
779 bool upLeft; 780 bool upLeft;
780 if ( false && orient == Horizontal ) { 781 if ( false && orient == Horizontal ) {
781 p += s->wid->width(); 782 p += s->wid->width();
782 upLeft = p > oldP; 783 upLeft = p > oldP;
783 } else 784 } else
784 upLeft = p < oldP; 785 upLeft = p < oldP;
785 786
786 moveAfter( p, id, upLeft ); 787 moveAfter( p, id, upLeft );
787 moveBefore( p-1, id-1, upLeft ); 788 moveBefore( p-1, id-1, upLeft );
788 789
789 storeSizes(); 790 storeSizes();
790} 791}
791 792
792 793
793void KDGanttMinimizeSplitter::setG( QWidget *w, int p, int s, bool isSplitter ) 794void KDGanttMinimizeSplitter::setG( QWidget *w, int p, int s, bool isSplitter )
794{ 795{
795 if ( orient == Horizontal ) { 796 if ( orient == Horizontal ) {
796 if ( false && orient == Horizontal && !isSplitter ) 797 if ( false && orient == Horizontal && !isSplitter )
797 p = contentsRect().width() - p - s; 798 p = contentsRect().width() - p - s;
798 w->setGeometry( p, contentsRect().y(), s, contentsRect().height() ); 799 w->setGeometry( p, contentsRect().y(), s, contentsRect().height() );
799 } else 800 } else
800 w->setGeometry( contentsRect().x(), p, contentsRect().width(), s ); 801 w->setGeometry( contentsRect().x(), p, contentsRect().width(), s );
801} 802}
802 803
803 804
804/* 805/*
805 Places the right/bottom edge of the widget at \a id at position \a pos. 806 Places the right/bottom edge of the widget at \a id at position \a pos.
806 807
807 \sa idAfter() 808 \sa idAfter()
808*/ 809*/
809void KDGanttMinimizeSplitter::moveBefore( int pos, int id, bool upLeft ) 810void KDGanttMinimizeSplitter::moveBefore( int pos, int id, bool upLeft )
810{ 811{
811 if( id < 0 ) 812 if( id < 0 )
812 return; 813 return;
813 QSplitterLayoutStruct *s = data->list.at(id); 814 QSplitterLayoutStruct *s = data->list.at(id);
814 if ( !s ) 815 if ( !s )
815 return; 816 return;
816 QWidget *w = s->wid; 817 QWidget *w = s->wid;
817 if ( w->isHidden() ) { 818 if ( w->isHidden() ) {
818 moveBefore( pos, id-1, upLeft ); 819 moveBefore( pos, id-1, upLeft );
819 } else if ( s->isSplitter ) { 820 } else if ( s->isSplitter ) {
820 int pos1, pos2; 821 int pos1, pos2;
821 int dd = s->sizer; 822 int dd = s->sizer;
822 if( false && orient == Horizontal ) { 823 if( false && orient == Horizontal ) {
823 pos1 = pos; 824 pos1 = pos;
824 pos2 = pos + dd; 825 pos2 = pos + dd;
825 } else { 826 } else {
826 pos2 = pos - dd; 827 pos2 = pos - dd;
827 pos1 = pos2 + 1; 828 pos1 = pos2 + 1;
828 } 829 }
829 if ( upLeft ) { 830 if ( upLeft ) {
830 setG( w, pos1, dd, TRUE ); 831 setG( w, pos1, dd, TRUE );
831 moveBefore( pos2, id-1, upLeft ); 832 moveBefore( pos2, id-1, upLeft );
832 } else { 833 } else {
833 moveBefore( pos2, id-1, upLeft ); 834 moveBefore( pos2, id-1, upLeft );
834 setG( w, pos1, dd, TRUE ); 835 setG( w, pos1, dd, TRUE );
835 } 836 }
836 } else { 837 } else {
837 int dd, newLeft, nextPos; 838 int dd, newLeft, nextPos;
838 if( false && orient == Horizontal ) { 839 if( false && orient == Horizontal ) {
839 dd = w->geometry().right() - pos; 840 dd = w->geometry().right() - pos;
840 dd = QMAX( pick(minSize(w)), QMIN(dd, pick(w->maximumSize()))); 841 dd = QMAX( pick(minSize(w)), QMIN(dd, pick(w->maximumSize())));
841 newLeft = pos+1; 842 newLeft = pos+1;
842 nextPos = newLeft + dd; 843 nextPos = newLeft + dd;
843 } else { 844 } else {
844 dd = pos - pick( w->pos() ) + 1; 845 dd = pos - pick( w->pos() ) + 1;
845 dd = QMAX( pick(minSize(w)), QMIN(dd, pick(w->maximumSize()))); 846 dd = QMAX( pick(minSize(w)), QMIN(dd, pick(w->maximumSize())));
846 newLeft = pos-dd+1; 847 newLeft = pos-dd+1;
847 nextPos = newLeft - 1; 848 nextPos = newLeft - 1;
848 } 849 }
849 setG( w, newLeft, dd, TRUE ); 850 setG( w, newLeft, dd, TRUE );
850 moveBefore( nextPos, id-1, upLeft ); 851 moveBefore( nextPos, id-1, upLeft );
851 } 852 }
852} 853}
853 854
854 855
855/* 856/*
856 Places the left/top edge of the widget at \a id at position \a pos. 857 Places the left/top edge of the widget at \a id at position \a pos.
857 858
858 \sa idAfter() 859 \sa idAfter()
859*/ 860*/
860void KDGanttMinimizeSplitter::moveAfter( int pos, int id, bool upLeft ) 861void KDGanttMinimizeSplitter::moveAfter( int pos, int id, bool upLeft )
861{ 862{
862 QSplitterLayoutStruct *s = id < int(data->list.count()) ? 863 QSplitterLayoutStruct *s = id < int(data->list.count()) ?
863 data->list.at(id) : 0; 864 data->list.at(id) : 0;
864 if ( !s ) 865 if ( !s )
865 return; 866 return;
866 QWidget *w = s->wid; 867 QWidget *w = s->wid;
867 if ( w->isHidden() ) { 868 if ( w->isHidden() ) {
868 moveAfter( pos, id+1, upLeft ); 869 moveAfter( pos, id+1, upLeft );
869 } else if ( pick( w->pos() ) == pos ) { 870 } else if ( pick( w->pos() ) == pos ) {
870 //No need to do anything if it's already there. 871 //No need to do anything if it's already there.
871 return; 872 return;
872 } else if ( s->isSplitter ) { 873 } else if ( s->isSplitter ) {
873 int dd = s->sizer; 874 int dd = s->sizer;
874 int pos1, pos2; 875 int pos1, pos2;
875 if( false && orient == Horizontal ) { 876 if( false && orient == Horizontal ) {
876 pos2 = pos - dd; 877 pos2 = pos - dd;
877 pos1 = pos2 + 1; 878 pos1 = pos2 + 1;
878 } else { 879 } else {
879 pos1 = pos; 880 pos1 = pos;
880 pos2 = pos + dd; 881 pos2 = pos + dd;
881 } 882 }
882 if ( upLeft ) { 883 if ( upLeft ) {
883 setG( w, pos1, dd, TRUE ); 884 setG( w, pos1, dd, TRUE );
884 moveAfter( pos2, id+1, upLeft ); 885 moveAfter( pos2, id+1, upLeft );
885 } else { 886 } else {
886 moveAfter( pos2, id+1, upLeft ); 887 moveAfter( pos2, id+1, upLeft );
887 setG( w, pos1, dd, TRUE ); 888 setG( w, pos1, dd, TRUE );
888 } 889 }
889 } else { 890 } else {
890 int left = pick( w->pos() ); 891 int left = pick( w->pos() );
891 int right, dd,/* newRight,*/ newLeft, nextPos; 892 int right, dd,/* newRight,*/ newLeft, nextPos;
892 if ( false && orient == Horizontal ) { 893 if ( false && orient == Horizontal ) {
893 dd = pos - left + 1; 894 dd = pos - left + 1;
894 dd = QMAX( pick(minSize(w)), QMIN(dd, pick(w->maximumSize()))); 895 dd = QMAX( pick(minSize(w)), QMIN(dd, pick(w->maximumSize())));
895 newLeft = pos-dd+1; 896 newLeft = pos-dd+1;
896 nextPos = newLeft - 1; 897 nextPos = newLeft - 1;
897 } else { 898 } else {
898 right = pick( w->geometry().bottomRight() ); 899 right = pick( w->geometry().bottomRight() );
899 dd = right - pos + 1; 900 dd = right - pos + 1;
900 dd = QMAX( pick(minSize(w)), QMIN(dd, pick(w->maximumSize()))); 901 dd = QMAX( pick(minSize(w)), QMIN(dd, pick(w->maximumSize())));
901 /*newRight = pos+dd-1;*/ 902 /*newRight = pos+dd-1;*/
902 newLeft = pos; 903 newLeft = pos;
903 nextPos = newLeft + dd; 904 nextPos = newLeft + dd;
904 } 905 }
905 setG( w, newLeft, dd, TRUE ); 906 setG( w, newLeft, dd, TRUE );
906 /*if( right != newRight )*/ 907 /*if( right != newRight )*/
907 moveAfter( nextPos, id+1, upLeft ); 908 moveAfter( nextPos, id+1, upLeft );
908 } 909 }
909} 910}
910 911
911 912
912void KDGanttMinimizeSplitter::expandPos( int id, int* min, int* max ) 913void KDGanttMinimizeSplitter::expandPos( int id, int* min, int* max )
913{ 914{
914 QSplitterLayoutStruct *s = data->list.at(id-1); 915 QSplitterLayoutStruct *s = data->list.at(id-1);
915 QWidget* w = s->wid; 916 QWidget* w = s->wid;
916 *min = pick( w->mapToParent( QPoint(0,0) ) ); 917 *min = pick( w->mapToParent( QPoint(0,0) ) );
917 918
918 if ( (uint) id == data->list.count() ) { 919 if ( (uint) id == data->list.count() ) {
919 pick( size() ); 920 pick( size() );
920 } 921 }
921 else { 922 else {
922 QSplitterLayoutStruct *s = data->list.at(id+1); 923 QSplitterLayoutStruct *s = data->list.at(id+1);
923 QWidget* w = s->wid; 924 QWidget* w = s->wid;
924 *max = pick( w->mapToParent( QPoint( w->width(), w->height() ) ) ) -8; 925 *max = pick( w->mapToParent( QPoint( w->width(), w->height() ) ) ) -8;
925 } 926 }
926} 927}
927 928
928 929
929/*! 930/*!
930 Returns the valid range of the splitter with id \a id in \a *min and \a *max. 931 Returns the valid range of the splitter with id \a id in \a *min and \a *max.
931 932
932 \sa idAfter() 933 \sa idAfter()
933*/ 934*/
934 935
935void KDGanttMinimizeSplitter::getRange( int id, int *min, int *max ) 936void KDGanttMinimizeSplitter::getRange( int id, int *min, int *max )
936{ 937{
937 int minB = 0;//before 938 int minB = 0;//before
938 int maxB = 0; 939 int maxB = 0;
939 int minA = 0; 940 int minA = 0;
940 int maxA = 0;//after 941 int maxA = 0;//after
941 int n = data->list.count(); 942 int n = data->list.count();
942 if ( id < 0 || id >= n ) 943 if ( id < 0 || id >= n )
943 return; 944 return;
944 int i; 945 int i;
945 for ( i = 0; i < id; i++ ) { 946 for ( i = 0; i < id; i++ ) {
946 QSplitterLayoutStruct *s = data->list.at(i); 947 QSplitterLayoutStruct *s = data->list.at(i);
947 if ( s->wid->isHidden() ) { 948 if ( s->wid->isHidden() ) {
948 //ignore 949 //ignore
949 } else if ( s->isSplitter ) { 950 } else if ( s->isSplitter ) {
950 minB += s->sizer; 951 minB += s->sizer;
951 maxB += s->sizer; 952 maxB += s->sizer;
952 } else { 953 } else {
953 minB += pick( minSize(s->wid) ); 954 minB += pick( minSize(s->wid) );
954 maxB += pick( s->wid->maximumSize() ); 955 maxB += pick( s->wid->maximumSize() );
955 } 956 }
956 } 957 }
957 for ( i = id; i < n; i++ ) { 958 for ( i = id; i < n; i++ ) {
958 QSplitterLayoutStruct *s = data->list.at(i); 959 QSplitterLayoutStruct *s = data->list.at(i);
959 if ( s->wid->isHidden() ) { 960 if ( s->wid->isHidden() ) {
960 //ignore 961 //ignore
961 } else if ( s->isSplitter ) { 962 } else if ( s->isSplitter ) {
962 minA += s->sizer; 963 minA += s->sizer;
963 maxA += s->sizer; 964 maxA += s->sizer;
964 } else { 965 } else {
965 minA += pick( minSize(s->wid) ); 966 minA += pick( minSize(s->wid) );
966 maxA += pick( s->wid->maximumSize() ); 967 maxA += pick( s->wid->maximumSize() );
967 } 968 }
968 } 969 }
969 QRect r = contentsRect(); 970 QRect r = contentsRect();
970 if ( orient == Horizontal && false ) { 971 if ( orient == Horizontal && false ) {
971#if QT_VERSION >= 0x030000 972#if QT_VERSION >= 0x030000
972 int splitterWidth = style().pixelMetric(QStyle::PM_SplitterWidth, this); 973 int splitterWidth = style().pixelMetric(QStyle::PM_SplitterWidth, this);
973#else 974#else
974 int splitterWidth = style().splitterWidth(); 975 int splitterWidth = style().splitterWidth();
975#endif 976#endif
976 977
977 if ( min ) 978 if ( min )
978 *min = pick(r.topRight()) - QMIN( maxB, pick(r.size())-minA ) - splitterWidth; 979 *min = pick(r.topRight()) - QMIN( maxB, pick(r.size())-minA ) - splitterWidth;
979 if ( max ) 980 if ( max )
980 *max = pick(r.topRight()) - QMAX( minB, pick(r.size())-maxA ) - splitterWidth; 981 *max = pick(r.topRight()) - QMAX( minB, pick(r.size())-maxA ) - splitterWidth;
981 } else { 982 } else {
982 if ( min ) 983 if ( min )
983 *min = pick(r.topLeft()) + QMAX( minB, pick(r.size())-maxA ); 984 *min = pick(r.topLeft()) + QMAX( minB, pick(r.size())-maxA );
984 if ( max ) 985 if ( max )
985 *max = pick(r.topLeft()) + QMIN( maxB, pick(r.size())-minA ); 986 *max = pick(r.topLeft()) + QMIN( maxB, pick(r.size())-minA );
986 } 987 }
987} 988}
988 989
989 990
990/*! 991/*!
991 Returns the closest legal position to \a p of the splitter with id \a id. 992 Returns the closest legal position to \a p of the splitter with id \a id.
992 993
993 \sa idAfter() 994 \sa idAfter()
994*/ 995*/
995 996
996int KDGanttMinimizeSplitter::adjustPos( int p, int id ) 997int KDGanttMinimizeSplitter::adjustPos( int p, int id )
997{ 998{
998 int min = 0; 999 int min = 0;
999 int max = 0; 1000 int max = 0;
1000 getRange( id, &min, &max ); 1001 getRange( id, &min, &max );
1001 p = QMAX( min, QMIN( p, max ) ); 1002 p = QMAX( min, QMIN( p, max ) );
1002 1003
1003 return p; 1004 return p;
1004} 1005}
1005 1006
1006 1007
1007void KDGanttMinimizeSplitter::doResize() 1008void KDGanttMinimizeSplitter::doResize()
1008{ 1009{
1009 QRect r = contentsRect(); 1010 QRect r = contentsRect();
1010 int i; 1011 int i;
1011 int n = data->list.count(); 1012 int n = data->list.count();
1012 QMemArray<QLayoutStruct> a( n ); 1013 QMemArray<QLayoutStruct> a( n );
1013 for ( i = 0; i< n; i++ ) { 1014 for ( i = 0; i< n; i++ ) {
1014 a[i].init(); 1015 a[i].init();
1015 QSplitterLayoutStruct *s = data->list.at(i); 1016 QSplitterLayoutStruct *s = data->list.at(i);
1016 if ( s->wid->isHidden() ) { 1017 if ( s->wid->isHidden() ) {
1017 a[i].stretch = 0; 1018 a[i].stretch = 0;
1018 a[i].sizeHint = a[i].minimumSize = 0; 1019 a[i].sizeHint = a[i].minimumSize = 0;
1019 a[i].maximumSize = 0; 1020 a[i].maximumSize = 0;
1020 } else if ( s->isSplitter ) { 1021 } else if ( s->isSplitter ) {
1021 a[i].stretch = 0; 1022 a[i].stretch = 0;
1022 a[i].sizeHint = a[i].minimumSize = a[i].maximumSize = s->sizer; 1023 a[i].sizeHint = a[i].minimumSize = a[i].maximumSize = s->sizer;
1023 a[i].empty = FALSE; 1024 a[i].empty = FALSE;
1024 } else if ( s->mode == KeepSize ) { 1025 } else if ( s->mode == KeepSize ) {
1025 a[i].stretch = 0; 1026 a[i].stretch = 0;
1026 a[i].minimumSize = pick( minSize(s->wid) ); 1027 a[i].minimumSize = pick( minSize(s->wid) );
1027 a[i].sizeHint = s->sizer; 1028 a[i].sizeHint = s->sizer;
1028 a[i].maximumSize = pick( s->wid->maximumSize() ); 1029 a[i].maximumSize = pick( s->wid->maximumSize() );
1029 a[i].empty = FALSE; 1030 a[i].empty = FALSE;
1030 } else if ( s->mode == FollowSizeHint ) { 1031 } else if ( s->mode == FollowSizeHint ) {
1031 a[i].stretch = 0; 1032 a[i].stretch = 0;
1032 a[i].minimumSize = a[i].sizeHint = pick( s->wid->sizeHint() ); 1033 a[i].minimumSize = a[i].sizeHint = pick( s->wid->sizeHint() );
1033 a[i].maximumSize = pick( s->wid->maximumSize() ); 1034 a[i].maximumSize = pick( s->wid->maximumSize() );
1034 a[i].empty = FALSE; 1035 a[i].empty = FALSE;
1035 } else { //proportional 1036 } else { //proportional
1036 a[i].stretch = s->sizer; 1037 a[i].stretch = s->sizer;
1037 a[i].maximumSize = pick( s->wid->maximumSize() ); 1038 a[i].maximumSize = pick( s->wid->maximumSize() );
1038 a[i].sizeHint = a[i].minimumSize = pick( minSize(s->wid) ); 1039 a[i].sizeHint = a[i].minimumSize = pick( minSize(s->wid) );
1039 a[i].empty = FALSE; 1040 a[i].empty = FALSE;
1040 } 1041 }
1041 } 1042 }
1042 1043
1043 kdganttGeomCalc( a, 0, n, pick( r.topLeft() ), pick( r.size() ), 0 ); 1044 kdganttGeomCalc( a, 0, n, pick( r.topLeft() ), pick( r.size() ), 0 );
1044 1045
1045 for ( i = 0; i< n; i++ ) { 1046 for ( i = 0; i< n; i++ ) {
1046 QSplitterLayoutStruct *s = data->list.at(i); 1047 QSplitterLayoutStruct *s = data->list.at(i);
1047 setG( s->wid, a[i].pos, a[i].size ); 1048 setG( s->wid, a[i].pos, a[i].size );
1048 } 1049 }
1049 1050
1050} 1051}
1051 1052
1052 1053
1053void KDGanttMinimizeSplitter::recalc( bool update ) 1054void KDGanttMinimizeSplitter::recalc( bool update )
1054{ 1055{
1055 int fi = 2*frameWidth(); 1056 int fi = 2*frameWidth();
1056 int maxl = fi; 1057 int maxl = fi;
1057 int minl = fi; 1058 int minl = fi;
1058 int maxt = QWIDGETSIZE_MAX; 1059 int maxt = QWIDGETSIZE_MAX;
1059 int mint = fi; 1060 int mint = fi;
1060 int n = data->list.count(); 1061 int n = data->list.count();
1061 bool first = TRUE; 1062 bool first = TRUE;
1062 /* 1063 /*
1063 The splitter before a hidden widget is always hidden. 1064 The splitter before a hidden widget is always hidden.
1064 The splitter before the first visible widget is hidden. 1065 The splitter before the first visible widget is hidden.
1065 The splitter before any other visible widget is visible. 1066 The splitter before any other visible widget is visible.
1066 */ 1067 */
1067 for ( int i = 0; i< n; i++ ) { 1068 for ( int i = 0; i< n; i++ ) {
1068 QSplitterLayoutStruct *s = data->list.at(i); 1069 QSplitterLayoutStruct *s = data->list.at(i);
1069 if ( !s->isSplitter ) { 1070 if ( !s->isSplitter ) {
1070 QSplitterLayoutStruct *p = (i > 0) ? p = data->list.at( i-1 ) : 0; 1071 QSplitterLayoutStruct *p = (i > 0) ? p = data->list.at( i-1 ) : 0;
1071 if ( p && p->isSplitter ) 1072 if ( p && p->isSplitter )
1072 if ( first || s->wid->isHidden() ) 1073 if ( first || s->wid->isHidden() )
1073 p->wid->hide(); //may trigger new recalc 1074 p->wid->hide(); //may trigger new recalc
1074 else 1075 else
1075 p->wid->show(); //may trigger new recalc 1076 p->wid->show(); //may trigger new recalc
1076 if ( !s->wid->isHidden() ) 1077 if ( !s->wid->isHidden() )
1077 first = FALSE; 1078 first = FALSE;
1078 } 1079 }
1079 } 1080 }
1080 1081
1081 bool empty=TRUE; 1082 bool empty=TRUE;
1082 for ( int j = 0; j< n; j++ ) { 1083 for ( int j = 0; j< n; j++ ) {
1083 QSplitterLayoutStruct *s = data->list.at(j); 1084 QSplitterLayoutStruct *s = data->list.at(j);
1084 if ( !s->wid->isHidden() ) { 1085 if ( !s->wid->isHidden() ) {
1085 empty = FALSE; 1086 empty = FALSE;
1086 if ( s->isSplitter ) { 1087 if ( s->isSplitter ) {
1087 minl += s->sizer; 1088 minl += s->sizer;
1088 maxl += s->sizer; 1089 maxl += s->sizer;
1089 } else { 1090 } else {
1090 QSize minS = minSize(s->wid); 1091 QSize minS = minSize(s->wid);
1091 minl += pick( minS ); 1092 minl += pick( minS );
1092 maxl += pick( s->wid->maximumSize() ); 1093 maxl += pick( s->wid->maximumSize() );
1093 mint = QMAX( mint, trans( minS )); 1094 mint = QMAX( mint, trans( minS ));
1094 int tm = trans( s->wid->maximumSize() ); 1095 int tm = trans( s->wid->maximumSize() );
1095 if ( tm > 0 ) 1096 if ( tm > 0 )
1096 maxt = QMIN( maxt, tm ); 1097 maxt = QMIN( maxt, tm );
1097 } 1098 }
1098 } 1099 }
1099 } 1100 }
1100 if ( empty ) { 1101 if ( empty ) {
1101 if ( parentWidget() != 0 && parentWidget()->inherits("KDGanttMinimizeSplitter") ) { 1102 if ( parentWidget() != 0 && parentWidget()->inherits("KDGanttMinimizeSplitter") ) {
1102 // nested splitters; be nice 1103 // nested splitters; be nice
1103 maxl = maxt = 0; 1104 maxl = maxt = 0;
1104 } else { 1105 } else {
1105 // KDGanttMinimizeSplitter with no children yet 1106 // KDGanttMinimizeSplitter with no children yet
1106 maxl = QWIDGETSIZE_MAX; 1107 maxl = QWIDGETSIZE_MAX;
1107 } 1108 }
1108 } else { 1109 } else {
1109 maxl = QMIN( maxl, QWIDGETSIZE_MAX ); 1110 maxl = QMIN( maxl, QWIDGETSIZE_MAX );
1110 } 1111 }
1111 if ( maxt < mint ) 1112 if ( maxt < mint )
1112 maxt = mint; 1113 maxt = mint;
1113 1114
1114 if ( orient == Horizontal ) { 1115 if ( orient == Horizontal ) {
1115 setMaximumSize( maxl, maxt ); 1116 setMaximumSize( maxl, maxt );
1116 setMinimumSize( minl, mint ); 1117 setMinimumSize( minl, mint );
1117 } else { 1118 } else {
1118 setMaximumSize( maxt, maxl ); 1119 setMaximumSize( maxt, maxl );
1119 setMinimumSize( mint, minl ); 1120 setMinimumSize( mint, minl );
1120 } 1121 }
1121 if ( update ) 1122 if ( update )
1122 doResize(); 1123 doResize();
1123} 1124}
1124 1125
1125/*! 1126/*!
1126 Sets resize mode of \a w to \a mode. 1127 Sets resize mode of \a w to \a mode.
1127 1128
1128 \sa ResizeMode 1129 \sa ResizeMode
1129*/ 1130*/
1130 1131
1131void KDGanttMinimizeSplitter::setResizeMode( QWidget *w, ResizeMode mode ) 1132void KDGanttMinimizeSplitter::setResizeMode( QWidget *w, ResizeMode mode )
1132{ 1133{
1133 processChildEvents(); 1134 processChildEvents();
1134 QSplitterLayoutStruct *s = data->list.first(); 1135 QSplitterLayoutStruct *s = data->list.first();
1135 while ( s ) { 1136 while ( s ) {
1136 if ( s->wid == w ) { 1137 if ( s->wid == w ) {
1137 s->mode = mode; 1138 s->mode = mode;
1138 return; 1139 return;
1139 } 1140 }
1140 s = data->list.next(); 1141 s = data->list.next();
1141 } 1142 }
1142 s = addWidget( w, TRUE ); 1143 s = addWidget( w, TRUE );
1143 s->mode = mode; 1144 s->mode = mode;
1144} 1145}
1145 1146
1146 1147
1147/*! 1148/*!
1148 Returns TRUE if opaque resize is on; otherwise returns FALSE. 1149 Returns TRUE if opaque resize is on; otherwise returns FALSE.
1149 1150
1150 \sa setOpaqueResize() 1151 \sa setOpaqueResize()
1151*/ 1152*/
1152 1153
1153bool KDGanttMinimizeSplitter::opaqueResize() const 1154bool KDGanttMinimizeSplitter::opaqueResize() const
1154{ 1155{
1155 return data->opaque; 1156 return data->opaque;
1156} 1157}
1157 1158
1158 1159
1159/*! 1160/*!
1160 If \a on is TRUE then opaque resizing is turned on; otherwise 1161 If \a on is TRUE then opaque resizing is turned on; otherwise
1161 opaque resizing is turned off. 1162 opaque resizing is turned off.
1162 Opaque resizing is initially turned off. 1163 Opaque resizing is initially turned off.
1163 1164
1164 \sa opaqueResize() 1165 \sa opaqueResize()
1165*/ 1166*/
1166 1167
1167void KDGanttMinimizeSplitter::setOpaqueResize( bool on ) 1168void KDGanttMinimizeSplitter::setOpaqueResize( bool on )
1168{ 1169{
1169 data->opaque = on; 1170 data->opaque = on;
1170} 1171}
1171 1172
1172 1173
1173/*! 1174/*!
1174 Moves widget \a w to the leftmost/top position. 1175 Moves widget \a w to the leftmost/top position.
1175*/ 1176*/
1176 1177
1177void KDGanttMinimizeSplitter::moveToFirst( QWidget *w ) 1178void KDGanttMinimizeSplitter::moveToFirst( QWidget *w )
1178{ 1179{
1179 processChildEvents(); 1180 processChildEvents();
1180 bool found = FALSE; 1181 bool found = FALSE;
1181 QSplitterLayoutStruct *s = data->list.first(); 1182 QSplitterLayoutStruct *s = data->list.first();
1182 while ( s ) { 1183 while ( s ) {
1183 if ( s->wid == w ) { 1184 if ( s->wid == w ) {
1184 found = TRUE; 1185 found = TRUE;
1185 QSplitterLayoutStruct *p = data->list.prev(); 1186 QSplitterLayoutStruct *p = data->list.prev();
1186 if ( p ) { // not already at first place 1187 if ( p ) { // not already at first place
1187 data->list.take(); //take p 1188 data->list.take(); //take p
1188 data->list.take(); // take s 1189 data->list.take(); // take s
1189 data->list.insert( 0, p ); 1190 data->list.insert( 0, p );
1190 data->list.insert( 0, s ); 1191 data->list.insert( 0, s );
1191 } 1192 }
1192 break; 1193 break;
1193 } 1194 }
1194 s = data->list.next(); 1195 s = data->list.next();
1195 } 1196 }
1196 if ( !found ) 1197 if ( !found )
1197 addWidget( w, TRUE ); 1198 addWidget( w, TRUE );
1198 recalcId(); 1199 recalcId();
1199} 1200}
1200 1201
1201 1202