20#include "kptresourceview.h"
22#include "kptcalendar.h"
23#include "kptduration.h"
24#include "kptresourceappointmentsview.h"
27#include "kptproject.h"
29#include "kptresource.h"
30#include "kptdatetime.h"
31#include "kptcontext.h"
34#include <tqpopupmenu.h>
36#include <tqpaintdevicemetrics.h>
39#include <tdelistview.h>
49class ResListView :
public TDEListView {
51 ResListView(TQWidget * parent = 0,
const char* name=0)
52 : TDEListView(parent, name)
55 int headerHeight()
const {
56 return header()->count() > 0 ? header()->sectionRect(0).height() : 0;
58 virtual void paintToPrinter(TQPainter *p,
int x,
int y,
int w,
int h) {
60 TQColor bgc(193, 223, 255);
62 p->setBackgroundMode(TQt::OpaqueMode);
63 p->setBackgroundColor(bgc);
64 TQHeader *head = header();
68 for (
int s = 0; s < head->count(); ++s) {
69 sr = head->sectionRect(s);
73 for (
int s = 0; s < head->count(); ++s) {
74 sr = head->sectionRect(s);
76 sr = TQRect(sr.x()-offset, sr.y(), sr.width(), sr.height());
79 if (sr.x()+sr.width() <= x || sr.x() >= x+w) {
89 p->drawText(tr, columnAlignment(s)|TQt::AlignVCenter, head->label(s), -1);
93 p->translate(0, headerHeight());
94 drawAllContents(p, x, y, w, h);
97 int calculateY(
int ymin,
int ymax)
const {
98 TQPtrList<ResListView::DrawableItem> drawables;
99 drawables.setAutoDelete(
true);
100 TQListViewItem *child = firstChild();
103 for (; child; child = child->nextSibling()) {
104 ypos = buildDrawables(drawables, level, ypos, child, ymin, ymax);
107 DrawableItem *item = drawables.getLast();
109 y = item->y + item->i->height();
116 DrawableItem(
int level,
int ypos, TQListViewItem *item ) { y = ypos; l = level; i = item; };
122 int buildDrawables(TQPtrList<ResListView::DrawableItem> &lst,
int level,
int ypos, TQListViewItem *item,
int ymin,
int ymax)
const {
124 int ih = item->height();
125 if (y < ymin && y+ih > ymin) {
128 if (y >= ymin && y+ih < ymax) {
129 ResListView::DrawableItem *dr =
new ResListView::DrawableItem(level, y, item);
134 if (item->isOpen()) {
135 TQListViewItem *child = item->firstChild();
136 for (; child; child = child->nextSibling()) {
137 y = buildDrawables(lst, level+1, y, child, ymin, ymax);
146 virtual void drawAllContents(TQPainter * p,
int cx,
int cy,
int cw,
int ch) {
147 if ( columns() == 0 ) {
148 paintEmptyArea( p, TQRect( cx, cy, cw, ch ) );
152 TQPtrList<ResListView::DrawableItem> drawables;
153 drawables.setAutoDelete(
true);
154 TQListViewItem *child = firstChild();
157 for (; child; child = child->nextSibling()) {
158 ypos = buildDrawables(drawables, level, ypos, child, cy, cy+ch);
161 p->setFont( font() );
163 TQPtrListIterator<ResListView::DrawableItem> it(drawables);
166 int fx = -1, x, fc = 0, lc = 0;
168 ResListView::DrawableItem * current;
170 while ( (current = it.current()) != 0 ) {
172 int ih = current->i->height();
173 int ith = current->i->totalHeight();
178 if ( ih > 0 && current->y < cy+ch && current->y+ih > cy ) {
184 cs = header()->cellSize( 0 );
185 while ( x + cs <= cx && c < header()->count() ) {
188 if ( c < header()->count() )
189 cs = header()->cellSize( c );
193 while( x < cx + cw && c < header()->count() ) {
196 if ( c < header()->count() )
197 cs = header()->cellSize( c );
206 const TQColorGroup &cg = ( palette().inactive() );
208 while ( c < lc && !drawables.isEmpty() ) {
209 int i = header()->mapToLogical( c );
210 cs = header()->cellSize( c );
211 r.setRect( x, current->y-cy, cs, ih );
213 r.setLeft( r.left() + current->l * treeStepSize() );
217 if ( !( r.width() == 0 || r.height() == 0 ) ) {
218 p->translate( r.left(), r.top() );
219 int ac = header()->mapToLogical( c );
222 int align = columnAlignment( ac );
223 if ( align == AlignAuto ) align = AlignLeft;
224 bool sel = current->i->isSelected();
226 current->i->setSelected(
false);
227 current->i->paintCell( p, cg, ac, r.width(), align );
229 current->i->setSelected(sel);
238 const int cell = header()->mapToActual( 0 );
241 tx = header()->cellPos( cell );
281class ResourceItemPrivate :
public TDEListViewItem {
283 ResourceItemPrivate(Resource *r, TQListViewItem *parent)
284 : TDEListViewItem(parent, r->name()),
289 virtual void paintCell(TQPainter *p,
const TQColorGroup &cg,
int column,
int width,
int align) {
291 if (m_columns[column] == 1) {
292 g.setColor(TQColorGroup::Text, TQColor(red));
293 g.setColor(TQColorGroup::HighlightedText, TQColor(red));
296 TDEListViewItem::paintCell(p, g, column, width, align);
298 void setColumnState(
int c,
int state=1) {
299 m_columns[c] = state;
302 TQMap<int, int> m_columns;
305class NodeItemPrivate :
public TDEListViewItem {
307 NodeItemPrivate(Task *n, TQListView *parent)
308 : TDEListViewItem(parent, n->name()),
313 NodeItemPrivate(TQString name, TQListView *parent)
314 : TDEListViewItem(parent, name),
319 void setPriority(
int col,
int prio) {
320 if (prioColors.contains(prio)) {
321 columnPrio.insert(col, prio);
323 columnPrio.remove(col);
326 int priority(
int col) {
327 if (columnPrio.contains(col)) {
328 return columnPrio[col];
333 virtual void paintCell ( TQPainter * p,
const TQColorGroup & cg,
int column,
int width,
int align ) {
336 if (columnPrio.contains(column)) {
337 g.setColor(TQColorGroup::Base, prioColors[columnPrio[column]]);
339 TDEListViewItem::paintCell(p, g, column, width, align);
345 prioColors.insert(1, TQColor(gray));
346 prioColors.insert(2, TQColor(green));
347 prioColors.insert(3, TQColor(yellow));
348 prioColors.insert(4, TQColor(red));
350 TQMap<int, TQColor> prioColors;
351 TQMap<int, int> columnPrio;
354class AppointmentItem :
public TDEListViewItem {
356 AppointmentItem(Appointment *a, TQDate &d, TQListViewItem *parent)
357 : TDEListViewItem(parent),
361 Appointment *appointment;
365TQSize ResourceView::sizeHint()
const {
366 return minimumSizeHint();
369ResourceView::ResourceView(View *view, TQWidget *parent)
370 : TQSplitter(parent,
"Resource view"),
375 setOrientation(TQt::Vertical);
377 resList =
new ResListView(
this,
"Resource list");
378 resList->setItemMargin(2);
379#if KDE_IS_VERSION(3,3,9)
380 resList->setShadeSortColumn(
false);
382 resList->setRootIsDecorated(
true);
383 resList->addColumn(i18n(
"Name"));
384 resList->setColumnAlignment(1, AlignHCenter);
385 resList->addColumn(i18n(
"Type"));
386 resList->setColumnAlignment(2, AlignHCenter);
387 resList->addColumn(i18n(
"Initials"));
388 resList->setColumnAlignment(3, AlignLeft);
389 resList->addColumn(i18n(
"Email"));
390 resList->setColumnAlignment(4, AlignHCenter);
391 resList->addColumn(i18n(
"Calendar Name"));
392 resList->setColumnAlignment(5, AlignRight);
393 resList->addColumn(i18n(
"Available From"));
394 resList->setColumnAlignment(6, AlignRight);
395 resList->addColumn(i18n(
"Available Until"));
396 resList->setColumnAlignment(7, AlignRight);
397 resList->addColumn(i18n(
"%"));
398 resList->setColumnAlignment(8, AlignRight);
399 resList->addColumn(i18n(
"Normal Rate"));
400 resList->setColumnAlignment(9, AlignRight);
401 resList->addColumn(i18n(
"Overtime Rate"));
403 m_showAppointments =
false;
404 m_appview =
new ResourceAppointmentsView(view,
this);
406 draw(view->getProject());
409 connect(resList, TQ_SIGNAL(selectionChanged()), TQ_SLOT(resSelectionChanged()));
410 connect(resList, TQ_SIGNAL( contextMenuRequested(TQListViewItem*,
const TQPoint&,
int)), TQ_SLOT(popupMenuRequested(TQListViewItem*,
const TQPoint&,
int)));
412 connect(resList, TQ_SIGNAL(doubleClicked(TQListViewItem*,
const TQPoint&,
int)), TQ_SLOT(slotItemDoubleClicked(TQListViewItem*)));
416void ResourceView::zoom(
double )
420Resource *ResourceView::currentResource() {
422 return m_selectedItem->resource;
426void ResourceView::draw(Project &project)
433 TQPtrListIterator<ResourceGroup> it(project.resourceGroups());
434 for (; it.current(); ++it) {
435 TDEListViewItem *item =
new TDEListViewItem(resList, it.current()->name());
437 drawResources(project, item, it.current());
439 if (m_selectedItem) {
440 resList->setSelected(m_selectedItem,
true);
442 resSelectionChanged(m_selectedItem);
447void ResourceView::drawResources(
const Project &proj, TQListViewItem *parent, ResourceGroup *group)
450 TQPtrListIterator<Resource> it(group->resources());
451 for (; it.current(); ++it) {
452 Resource *r = it.current();
453 ResourceItemPrivate *item =
new ResourceItemPrivate(r, parent);
455 item->setColumnState(0, 0);
456 item->setColumnState(4, 0);
457 item->setColumnState(5, 0);
458 item->setColumnState(6, 0);
459 item->setColumnState(7, 0);
460 if (r->calendar() == 0) {
461 item->setColumnState(0, 1);
462 item->setColumnState(4, 1);
464 if (proj.constraint() == Node::MustFinishOn) {
465 if (proj.mustFinishOn() <= r->availableFrom()) {
466 item->setColumnState(0, 1);
467 item->setColumnState(5, 1);
470 if (proj.mustStartOn() >= r->availableUntil()) {
471 item->setColumnState(0, 1);
472 item->setColumnState(6, 1);
475 if (r->units() == 0) {
476 item->setColumnState(0, 1);
477 item->setColumnState(7, 1);
480 item->setText(0, r->name());
482 case Resource::Type_Work:
483 item->setText(1, i18n(
"Work"));
485 case Resource::Type_Material:
486 item->setText(1, i18n(
"Material"));
489 item->setText(1, i18n(
"Undefined"));
492 item->setText(2, r->initials());
493 item->setText(3, r->email());
494 item->setText(4, r->calendar() ? r->calendar()->name() : i18n(
"None"));
495 item->setText(5, TDEGlobal::locale()->formatDateTime(r->availableFrom()));
496 item->setText(6, TDEGlobal::locale()->formatDateTime(r->availableUntil()));
497 item->setText(7, TQString().setNum(r->units()));
498 item->setText(8, TDEGlobal::locale()->formatMoney(r->normalRate()));
499 item->setText(9, TDEGlobal::locale()->formatMoney(r->overtimeRate()));
500 if (!m_selectedItem) {
501 m_selectedItem = item;
507void ResourceView::resSelectionChanged() {
509 resSelectionChanged(resList->selectedItem());
512void ResourceView::resSelectionChanged(TQListViewItem *item) {
514 ResourceItemPrivate *ritem =
dynamic_cast<ResourceItemPrivate *
>(item);
516 m_selectedItem = ritem;
517 if (m_showAppointments) {
519 m_appview->draw(ritem->resource, m_mainview->getProject().startTime().date(), m_mainview->getProject().endTime().date());
530void ResourceView::slotItemDoubleClicked(TQListViewItem*) {
531 emit itemDoubleClicked();
534void ResourceView::popupMenuRequested(TQListViewItem* item,
const TQPoint & pos,
int)
536 ResourceItemPrivate *ritem =
dynamic_cast<ResourceItemPrivate *
>(item);
538 if (ritem != m_selectedItem)
539 resSelectionChanged(ritem);
540 TQPopupMenu *menu = m_mainview->popupMenu(
"resource_popup");
547 kdDebug()<<k_funcinfo<<
"No menu!"<<endl;
551TQValueList<int> ResourceView::listOffsets(
int pageHeight)
const {
552 TQValueList<int> lst;
553 int hh = resList->headerHeight();
554 int ph = pageHeight-hh;
555 int lh = resList->contentsHeight() - hh;
557 kdDebug()<<k_funcinfo<<ly<<
", "<<lh<<endl;
560 ly = resList->calculateY(ly+1, ly+ph);
566void ResourceView::print(KPrinter &printer) {
568 TQPaintDeviceMetrics m = TQPaintDeviceMetrics ( &printer );
569 uint top, left, bottom, right;
570 printer.margins(&top, &left, &bottom, &right);
574 p.setViewport(left, top, m.width()-left-right, m.height()-top-bottom);
575 p.setClipRect(left, top, m.width()-left-right, m.height()-top-bottom);
576 TQRect preg = p.clipRegion(TQPainter::CoordPainter).boundingRect();
579 int ch = resList->contentsHeight();
580 int cw = resList->contentsWidth();
581 double scale = (double)preg.width()/(double)(cw);
584 p.scale(scale, scale);
586 int ph = preg.height()-resList->headerHeight();
587 TQValueList<int> lst = listOffsets(preg.height());
588 for (
int i=0; i < lst.count(); ++i) {
593 resList->paintToPrinter(&p, 0, lst[i], cw, ph);
599bool ResourceView::setContext(Context::Resourceview &) {
604void ResourceView::getContext(Context::Resourceview &)
const {
611#include "kptresourceview.moc"