00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include <qlayout.h>
00021
#include <qheader.h>
00022
#include <qpushbutton.h>
00023
#include <qfont.h>
00024
#include <qlabel.h>
00025
#include <qlineedit.h>
00026
#include <qlistbox.h>
00027
#include <qpopupmenu.h>
00028
#include <qstrlist.h>
00029
#include <qlistview.h>
00030
00031
#include <kapplication.h>
00032
#include <kdebug.h>
00033
#include <klocale.h>
00034
#include <kglobal.h>
00035
#include <kiconloader.h>
00036
#include <kmessagebox.h>
00037
#include <kconfig.h>
00038
#include <kstandarddirs.h>
00039
00040
#include <libkcal/vcaldrag.h>
00041
00042
#include "KGantt.h"
00043
00044
#include "koprojectview.h"
00045
00046
using namespace KOrg;
00047
00048 KOProjectViewItem::KOProjectViewItem(Todo *event,KGanttItem* parentTask,
00049
const QString& text,
00050
const QDateTime& start,
00051
const QDateTime& end) :
00052 KGanttItem(parentTask,text,start,end)
00053 {
00054 mEvent = event;
00055 }
00056
00057 KOProjectViewItem::~KOProjectViewItem()
00058 {
00059 }
00060
00061 Todo *KOProjectViewItem::event()
00062 {
00063
return mEvent;
00064 }
00065
00066
00067 KOProjectView::KOProjectView(Calendar *calendar,QWidget* parent,
00068
const char* name) :
00069 KOrg::
BaseView(calendar,parent,name)
00070 {
00071 QBoxLayout *topLayout =
new QVBoxLayout(
this);
00072
00073 QBoxLayout *topBar =
new QHBoxLayout;
00074 topLayout->addLayout(topBar);
00075
00076 QLabel *title =
new QLabel(i18n(
"Project View"),
this);
00077 title->setFrameStyle(QFrame::Panel|QFrame::Raised);
00078 topBar->addWidget(title,1);
00079
00080 QPushButton *zoomIn =
new QPushButton(i18n(
"Zoom In"),
this);
00081 topBar->addWidget(zoomIn,0);
00082 connect(zoomIn,SIGNAL(clicked()),SLOT(zoomIn()));
00083
00084 QPushButton *zoomOut =
new QPushButton(i18n(
"Zoom Out"),
this);
00085 topBar->addWidget(zoomOut,0);
00086 connect(zoomOut,SIGNAL(clicked()),SLOT(zoomOut()));
00087
00088 QPushButton *menuButton =
new QPushButton(i18n(
"Select Mode"),
this);
00089 topBar->addWidget(menuButton,0);
00090 connect(menuButton,SIGNAL(clicked()),SLOT(showModeMenu()));
00091
00092 createMainTask();
00093
00094 mGantt =
new KGantt(mMainTask,
this);
00095 topLayout->addWidget(mGantt,1);
00096
00097
#if 0
00098
mGantt->addHoliday(2000, 10, 3);
00099 mGantt->addHoliday(2001, 10, 3);
00100 mGantt->addHoliday(2000, 12, 24);
00101
00102
for(
int i=1; i<7; i++)
00103 mGantt->addHoliday(2001, 1, i);
00104
#endif
00105
}
00106
00107
void KOProjectView::createMainTask()
00108 {
00109 mMainTask =
new KGanttItem(0,i18n(
"main task"),
00110 QDateTime::currentDateTime(),
00111 QDateTime::currentDateTime());
00112 mMainTask->setMode(KGanttItem::Rubberband);
00113 mMainTask->setStyle(KGanttItem::DrawBorder | KGanttItem::DrawText |
00114 KGanttItem::DrawHandle);
00115 }
00116
00117
void KOProjectView::readSettings()
00118 {
00119 kdDebug(5850) <<
"KOProjectView::readSettings()" << endl;
00120
00121
00122 KConfig config( locateLocal(
"config",
"korganizerrc" ));
00123 config.setGroup(
"Views");
00124
00125 QValueList<int> sizes = config.readIntListEntry(
"Separator ProjectView");
00126
if (sizes.count() == 2) {
00127 mGantt->splitter()->setSizes(sizes);
00128 }
00129 }
00130
00131
void KOProjectView::writeSettings(KConfig *config)
00132 {
00133 kdDebug(5850) <<
"KOProjectView::writeSettings()" << endl;
00134
00135 config->setGroup(
"Views");
00136
00137 QValueList<int> list = mGantt->splitter()->sizes();
00138 config->writeEntry(
"Separator ProjectView",list);
00139 }
00140
00141
00142 void KOProjectView::updateView()
00143 {
00144 kdDebug(5850) <<
"KOProjectView::updateView()" << endl;
00145
00146
00147 QPtrList<KGanttItem> subs = mMainTask->getSubItems();
00148 KGanttItem *t=subs.first();
00149
while(t) {
00150 KGanttItem *nt=subs.next();
00151
delete t;
00152 t = nt;
00153 }
00154
00155
#if 0
00156
KGanttItem* t1 =
new KGanttItem(mGantt->getMainTask(),
"task 1, no subtasks",
00157 QDateTime::currentDateTime().addDays(10),
00158 QDateTime::currentDateTime().addDays(20) );
00159
00160 KGanttItem* t2 =
new KGanttItem(mGantt->getMainTask(),
"task 2, subtasks, no rubberband",
00161 QDateTime(QDate(2000,10,1)),
00162 QDateTime(QDate(2000,10,31)) );
00163
#endif
00164
00165 Todo::List todoList =
calendar()->todos();
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 mTodoMap.clear();
00189 Todo::List::ConstIterator it;
00190
for( it = todoList.begin(); it != todoList.end(); ++it ) {
00191
if ( !mTodoMap.contains( *it ) ) {
00192 insertTodoItem( *it );
00193 }
00194 }
00195 }
00196
00197 QMap<Todo *,KGanttItem *>::ConstIterator
00198 KOProjectView::insertTodoItem(Todo *todo)
00199 {
00200
00201 Todo *relatedTodo = dynamic_cast<Todo *>(todo->relatedTo());
00202
if (relatedTodo) {
00203
00204 QMap<Todo *,KGanttItem *>::ConstIterator itemIterator;
00205 itemIterator = mTodoMap.find(relatedTodo);
00206
if (itemIterator == mTodoMap.end()) {
00207
00208 itemIterator = insertTodoItem (relatedTodo);
00209 }
00210 KGanttItem *task = createTask(*itemIterator,todo);
00211
return mTodoMap.insert(todo,task);
00212 }
else {
00213
00214 KGanttItem *task = createTask(mMainTask,todo);
00215
return mTodoMap.insert(todo,task);
00216 }
00217 }
00218
00219 KGanttItem *KOProjectView::createTask(KGanttItem *parent,Todo *todo)
00220 {
00221 QDateTime startDt;
00222 QDateTime endDt;
00223
00224
if (todo->hasStartDate() && !todo->hasDueDate()) {
00225
00226 startDt = todo->dtStart();
00227 endDt = QDateTime::currentDateTime();
00228 }
else if (!todo->hasStartDate() && todo->hasDueDate()) {
00229
00230 startDt = todo->dtDue();
00231 endDt = todo->dtDue();
00232 }
else if (!todo->hasStartDate() || !todo->hasDueDate()) {
00233 startDt = QDateTime::currentDateTime();
00234 endDt = QDateTime::currentDateTime();
00235 }
else {
00236 startDt = todo->dtStart();
00237 endDt = todo->dtDue();
00238 }
00239
00240 KGanttItem *task =
new KOProjectViewItem(todo,parent,todo->summary(),startDt,
00241 endDt);
00242 connect(task,SIGNAL(changed(KGanttItem*, KGanttItem::Change)),
00243 SLOT(taskChanged(KGanttItem*,KGanttItem::Change)));
00244
if (todo->relations().count() > 0) {
00245 task->setBrush(QBrush(QColor(240,240,240), QBrush::Dense4Pattern));
00246 }
00247
00248
return task;
00249 }
00250
00251 void KOProjectView::updateConfig()
00252 {
00253
00254 }
00255
00256 Incidence::List
KOProjectView::selectedIncidences()
00257 {
00258 Incidence::List selected;
00259
00260
00261
00262
00263
00264
00265
return selected;
00266 }
00267
00268 DateList
KOProjectView::selectedDates()
00269 {
00270 DateList selected;
00271
return selected;
00272 }
00273
00274 void KOProjectView::changeEventDisplay(Event *,
int)
00275 {
00276
updateView();
00277 }
00278
00279 void KOProjectView::showDates(
const QDate &,
const QDate &)
00280 {
00281
updateView();
00282 }
00283
00284 void KOProjectView::showEvents(
const Event::List & )
00285 {
00286 kdDebug(5850) <<
"KOProjectView::selectEvents(): not yet implemented" << endl;
00287 }
00288
00289
#if 0
00290
void KOProjectView::editItem(QListViewItem *item)
00291 {
00292 emit editEventSignal(((KOProjectViewItem *)item)->event());
00293 }
00294
00295
void KOProjectView::showItem(QListViewItem *item)
00296 {
00297 emit showTodoSignal(((KOProjectViewItem *)item)->event());
00298 }
00299
00300
void KOProjectView::popupMenu(QListViewItem *item,
const QPoint &,
int)
00301 {
00302 mActiveItem = (KOProjectViewItem *)item;
00303
if (item) mItemPopupMenu->popup(QCursor::pos());
00304
else mPopupMenu->popup(QCursor::pos());
00305 }
00306
00307
void KOProjectView::newTodo()
00308 {
00309 emit newTodoSignal();
00310 }
00311
00312
void KOProjectView::newSubTodo()
00313 {
00314
if (mActiveItem) {
00315 emit newSubTodoSignal(mActiveItem->event());
00316 }
00317 }
00318
00319
void KOProjectView::editTodo()
00320 {
00321
if (mActiveItem) {
00322 emit editEventSignal(mActiveItem->event());
00323 }
00324 }
00325
00326
void KOProjectView::showTodo()
00327 {
00328
if (mActiveItem) {
00329 emit showTodoSignal(mActiveItem->event());
00330 }
00331 }
00332
00333
void KOProjectView::deleteTodo()
00334 {
00335
if (mActiveItem) {
00336
if (mActiveItem->childCount()) {
00337 KMessageBox::sorry(
this,i18n(
"Cannot delete To-Do which has children."),
00338 i18n(
"Delete To-Do"));
00339 }
else {
00340 emit deleteEventSignal(mActiveItem->event());
00341 }
00342 }
00343 }
00344
00345
void KOProjectView::purgeCompleted()
00346 {
00347
int result = KMessageBox::warningContinueCancel(
this,
00348 i18n(
"Delete all completed To-Dos?"),i18n(
"Purge To-Dos"),i18n(
"Purge"));
00349
00350
if (result == KMessageBox::Continue) {
00351 QPtrList<Todo> todoCal =
calendar()->getTodoList();
00352
00353 Todo *aTodo;
00354
for (aTodo = todoCal.first(); aTodo; aTodo = todoCal.next()) {
00355
if (aTodo->isCompleted())
00356
calendar()->deleteTodo(aTodo);
00357 }
00358
updateView();
00359 }
00360 }
00361
00362
void KOProjectView::itemClicked(QListViewItem *item)
00363 {
00364
if (!item)
return;
00365
00366 KOProjectViewItem *todoItem = (KOProjectViewItem *)item;
00367
int completed = todoItem->
event()->isCompleted();
00368
00369
if (todoItem->isOn()) {
00370
if (!completed) {
00371 todoItem->
event()->setCompleted(
true);
00372 }
00373 }
else {
00374
if (completed) {
00375 todoItem->
event()->setCompleted(
false);
00376 }
00377 }
00378 }
00379
#endif
00380
00381
void KOProjectView::showModeMenu()
00382 {
00383 mGantt->menu()->popup(QCursor::pos());
00384 }
00385
00386
void KOProjectView::taskChanged(KGanttItem *task,KGanttItem::Change change)
00387 {
00388
if (task == mMainTask)
return;
00389
00390 KOProjectViewItem *item = (KOProjectViewItem *)task;
00391
00392
if (change == KGanttItem::StartChanged) {
00393 item->
event()->setDtStart(task->getStart());
00394 }
else if (change == KGanttItem::EndChanged) {
00395 item->
event()->setDtDue(task->getEnd());
00396 }
00397 }
00398
00399
void KOProjectView::zoomIn()
00400 {
00401 mGantt->zoom(2);
00402 }
00403
00404
void KOProjectView::zoomOut()
00405 {
00406 mGantt->zoom(0.5);
00407 }
00408
00409
#include "koprojectview.moc"