You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdepim/kgantt/kgantt/xQGanttBarView.cpp

253 lines
5.7 KiB

//
// file : xQGanttBarView.C
// date : 26 oct 2000
// changed : 28 nov 2000
// author : jh
//
#include "xQGanttBarView.h"
#include "KGanttBarConfig.h"
xQGanttBarView::xQGanttBarView(KGanttItem* toplevelitem,
TQWidget* parent,
const char * name, WFlags f)
: TQScrollView(parent,name,f)
{
_config = NULL;
_toplevelitem = toplevelitem;
setFrameStyle(TQFrame::Sunken);
setLineWidth(1);
_headerBackBrush = TQBrush(TQColor(250,250,250));
setMargins( 1, TOPMARGIN , 1, 1 );
_viewport = new xQGanttBarViewPort(toplevelitem, this );
addChild(_viewport);
_viewport->setMode(xQGanttBarViewPort::Select);
connect(_viewport, TQT_SIGNAL(scroll(int,int)),
this, TQT_SLOT(scrollBy(int,int)) );
connect(_viewport, TQT_SIGNAL(recalculated()),
this, TQT_SLOT(drawHeader()) );
connect(horizontalScrollBar(), TQT_SIGNAL(valueChanged(int)),
this, TQT_SLOT(horizontalScrollBarChanged(int)) );
}
xQGanttBarView::~xQGanttBarView()
/////////////////////////////////
{
}
void
xQGanttBarView::horizontalScrollBarChanged(int /*x*/)
////////////////////////////////////////////////////
{
printf("xQGanttBarView::horizontalScrollBarChanged()\n");
drawHeader();
}
void
xQGanttBarView::drawHeader()
////////////////////////////////
{
static TQPen _dotPen( TQColor(35,35,35), 0, DotLine);
static TQPen _normalPen(TQColor(0,0,0));
static TQPen _redPen(TQColor(254,0,0));
static TQPen _greyPen(TQColor(150,150,150));
TQPainter p(this);
p.setPen( _normalPen );
p.fillRect(0,0,width(),TOPMARGIN, _headerBackBrush );
static int top = 1;
static int height = 20;
static int skip = 1;
int a,e,tmp;
bool drawDays = false;
double dayWidth = (double) ((_viewport->screenX(144000) - _viewport->screenX(0))/100.);
int wx = _viewport->worldX(contentsX());
TQDate startDate = _toplevelitem->getStart().addSecs( wx * 60 ).date();
wx = _viewport->worldX(contentsX()+width());
TQDate endDate = _toplevelitem->getStart().addSecs( wx * 60 ).date();
endDate = endDate.addDays(1);
int end = (int) startDate.daysTo(endDate);
drawDays = (end < 12);
// draw week, which first day is not visible
TQDate t = startDate.addDays(-startDate.dayOfWeek()+1);
tmp = _toplevelitem->getStart().secsTo(t)/60;
a = _viewport->screenX(tmp) - contentsX();
p.fillRect(a, top, (int) (5. * dayWidth), height, TQBrush(TQColor(240,240,240)));
p.drawRect(a, top, (int) (5. * dayWidth), height );
// draw month, which first day is not visible
t = startDate.addDays(-startDate.day()+1);
tmp = _toplevelitem->getStart().secsTo(t)/60;
a = _viewport->screenX(tmp) - contentsX();
e = t.daysInMonth();
p.fillRect(a, top + height + skip, (int) (e*dayWidth), height, TQBrush(TQColor(240,240,240)));
p.drawRect(a, top + height + skip, (int) (e*dayWidth), height );
if(a<0) a = 0;
p.drawText(a+5, int( top + height + skip + (0.8*height) ),
t.shortMonthName(t.month()) + " " + TQString::number(t.year()) );
// draw snapgrid for first month
tmp = _toplevelitem->getStart().secsTo(startDate)/60;
a = _viewport->screenX(tmp) - contentsX()+1;
double dx = (double)
((_viewport->screenX(_viewport->_snapgrid*1000) - _viewport->screenX(0))/1000.);
double limit = ((1+e-startDate.day()) * 1440)/_viewport->_snapgrid;
for(double k=1.; k<limit; k++) {
p.setPen(_greyPen);
p.drawLine(a + (int)(k * dx + 0.5), top + skip + 2 * height + 1,
a + (int)(k * dx + 0.5), top + skip + 2 * height + 2);
}
// draw from start to end
t = startDate;
for(int i=0; i<end; i++, t = t.addDays(1) ) {
tmp = _toplevelitem->getStart().secsTo(t)/60;
a = _viewport->screenX(tmp) - contentsX();
p.setPen( TQPen(TQColor(black)) );
if(t.dayOfWeek() == 1) {
p.fillRect(a, top, (int) (5. * dayWidth), height, TQBrush(TQColor(240,240,240)));
p.drawRect(a, top, (int) (5. * dayWidth), height );
if(!drawDays)
p.drawText(a+5, (int) (top + (0.8*height)), TQString::number(t.day()) );
}
if(drawDays) {
if(a<0) a = 0;
TQString str = t.shortDayName(t.dayOfWeek()) + " " + TQString::number(t.day());
TQRect rect = p.boundingRect(a+5, (int)(0.8 * height),
(int) dayWidth, height, AlignLeft, str );
if(t.dayOfWeek() > 5)
p.fillRect(rect.x(), rect.y(), rect.width(), -rect.height(), _headerBackBrush );
else
p.fillRect(rect.x(), rect.y(),
rect.width(), -rect.height(), TQBrush(TQColor(240,240,240)));
p.drawText(a+5, (int)(0.8 * height), str );
if(t.dayOfWeek()>1 && t.dayOfWeek()<6) {
p.setPen(_dotPen);
p.drawLine(a, top, a, height);
}
}
if(t.day()==1) {
e = t.daysInMonth();
p.setPen(_normalPen);
p.fillRect(a, top + height + skip,
(int) (e * dayWidth), height, TQBrush(TQColor(240,240,240)));
p.drawRect(a, top + height + skip, (int) (e * dayWidth), height );
p.drawText(a+5,
top + (int)(1.8 * height) + skip,
t.shortMonthName(t.month()) + " " + TQString::number(t.year()) );
// draw snapgrid
double limit = (e * 1440)/_viewport->_snapgrid;
for(double k=1.; k<limit; k++) {
p.setPen(_greyPen);
p.drawLine(a + 1 + (int)(k * dx + 0.5), top + skip + 2 * height + 1,
a + 1 + (int)(k * dx + 0.5), top + skip + 2 * height + 2);
}
}
}
}
void
xQGanttBarView::paintEvent(TQPaintEvent * /*e*/)
{
drawHeader();
}
KGanttBarConfig*
xQGanttBarView::getConfig()
{
if(_config)
return _config;
else {
_config = new KGanttBarConfig(this);
return _config;
}
}
void
xQGanttBarView::showConfig()
{
getConfig()->show();
}
void
xQGanttBarView::hideConfig()
{
if(_config)
_config->hide();
}
#include "xQGanttBarView.moc"