00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
#include <qpainter.h>
00021
00022
#include <klocale.h>
00023
#include <kdebug.h>
00024
#include <qpainter.h>
00025
#include <qpixmap.h>
00026
00027
#include "kotodoviewitem.h"
00028
#include "kotodoview.h"
00029
#include "koprefs.h"
00030
00031 KOTodoViewItem::KOTodoViewItem( QListView *parent, Todo *todo,
KOTodoView *kotodo)
00032 : QCheckListItem( parent , "", CheckBox ), mTodo( todo ), mTodoView( kotodo )
00033 {
00034 construct();
00035 }
00036
00037 KOTodoViewItem::KOTodoViewItem(
KOTodoViewItem *parent, Todo *todo,
KOTodoView *kotodo )
00038 : QCheckListItem( parent, "", CheckBox ), mTodo( todo ), mTodoView( kotodo )
00039 {
00040 construct();
00041 }
00042
00043 QString KOTodoViewItem::key(
int column,
bool)
const
00044
{
00045 QMap<int,QString>::ConstIterator it = mKeyMap.find(column);
00046
if (it == mKeyMap.end()) {
00047
return text(column);
00048 }
else {
00049
return *it;
00050 }
00051 }
00052
00053
void KOTodoViewItem::setSortKey(
int column,
const QString &key)
00054 {
00055 mKeyMap.insert(column,key);
00056 }
00057
00058
#if QT_VERSION >= 300
00059
void KOTodoViewItem::paintBranches(QPainter *p,
const QColorGroup & cg,
int w,
00060
int y,
int h)
00061 {
00062 QListViewItem::paintBranches(p,cg,w,y,h);
00063 }
00064
#else
00065
#endif
00066
00067
void KOTodoViewItem::construct()
00068 {
00069 m_init =
true;
00070 QString keyd =
"==";
00071 QString keyt =
"==";
00072
00073 setOn(mTodo->isCompleted());
00074 setText(0,mTodo->summary());
00075 setText(1,QString::number(mTodo->priority()));
00076 setText(2,QString::number(mTodo->percentComplete()));
00077
if (mTodo->percentComplete()<100) {
00078
if (mTodo->isCompleted()) setSortKey(2,QString::number(999));
00079
else setSortKey(2,QString::number(mTodo->percentComplete()));
00080 }
00081
else {
00082
if (mTodo->isCompleted()) setSortKey(2,QString::number(999));
00083
else setSortKey(2,QString::number(99));
00084 }
00085
if (mTodo->hasDueDate()) {
00086 setText(3, mTodo->dtDueDateStr());
00087 QDate d = mTodo->dtDue().date();
00088 keyd.sprintf(
"%04d%02d%02d",d.year(),d.month(),d.day());
00089 setSortKey(3,keyd);
00090
if (mTodo->doesFloat()) {
00091 setText(4,
"");
00092 }
00093
else {
00094 setText(4,mTodo->dtDueTimeStr());
00095 QTime t = mTodo->dtDue().time();
00096 keyt.sprintf(
"%02d%02d",t.hour(),t.minute());
00097 setSortKey(4,keyt);
00098 }
00099 }
else {
00100 setText(3,
"");
00101 setText(4,
"");
00102 }
00103 setSortKey(3,keyd);
00104 setSortKey(4,keyt);
00105
00106 QString priorityKey = QString::number( mTodo->priority() ) + keyd + keyt;
00107
if ( mTodo->isCompleted() ) setSortKey( 1,
"1" + priorityKey );
00108
else setSortKey( 1,
"0" + priorityKey );
00109
00110 setText(5,mTodo->categoriesStr());
00111
00112
#if 0
00113
00114
00115
00116
int pos = mTodo->description().findRev(
'#');
00117
if (pos < 0) {
00118 setText(6,
"");
00119 }
else {
00120 QString str = mTodo->description().mid(pos+1);
00121 str.stripWhiteSpace();
00122 setText(6,str);
00123 }
00124
#endif
00125
00126 m_known =
false;
00127 m_init =
false;
00128 }
00129
00130
void KOTodoViewItem::stateChange(
bool state)
00131 {
00132
00133
if ( m_init )
return;
00134
00135 kdDebug(5850) <<
"State changed, modified " << state << endl;
00136 QString keyd =
"==";
00137 QString keyt =
"==";
00138
00139 Todo*oldTodo = mTodo->clone();
00140
00141
if (state) mTodo->setCompleted(state);
00142
else mTodo->setPercentComplete(0);
00143
if (isOn()!=state) {
00144 setOn(state);
00145 }
00146
00147
if (mTodo->hasDueDate()) {
00148 setText(3, mTodo->dtDueDateStr());
00149 QDate d = mTodo->dtDue().date();
00150 keyd.sprintf(
"%04d%02d%02d",d.year(),d.month(),d.day());
00151 setSortKey(3,keyd);
00152
if (mTodo->doesFloat()) {
00153 setText(4,
"");
00154 }
00155
else {
00156 setText(4,mTodo->dtDueTimeStr());
00157 QTime t = mTodo->dtDue().time();
00158 keyt.sprintf(
"%02d%02d",t.hour(),t.minute());
00159 setSortKey(4,keyt);
00160 }
00161 }
00162
00163 QString priorityKey = QString::number( mTodo->priority() ) + keyd + keyt;
00164
if ( mTodo->isCompleted() ) setSortKey( 1,
"1" + priorityKey );
00165
else setSortKey( 1,
"0" + priorityKey );
00166
00167 setText(2, QString::number(mTodo->percentComplete()));
00168
if (mTodo->percentComplete()<100) {
00169
if (mTodo->isCompleted()) setSortKey(2,QString::number(999));
00170
else setSortKey(2,QString::number(mTodo->percentComplete()));
00171 }
00172
else {
00173
if (mTodo->isCompleted()) setSortKey(2,QString::number(999));
00174
else setSortKey(2,QString::number(99));
00175 }
00176 QListViewItem *myChild = firstChild();
00177
KOTodoViewItem *item;
00178
while( myChild ) {
00179 item = static_cast<KOTodoViewItem*>(myChild);
00180 item->
stateChange(state);
00181 myChild = myChild->nextSibling();
00182 }
00183 mTodoView->
modified(
true);
00184 mTodoView->
setTodoModified( oldTodo, mTodo );
00185
delete oldTodo;
00186 }
00187
00188
bool KOTodoViewItem::isAlternate()
00189 {
00190
#ifndef KORG_NOLVALTERNATION
00191
KOTodoListView *lv = static_cast<KOTodoListView *>(listView());
00192
if (lv && lv->alternateBackground().isValid())
00193 {
00194
KOTodoViewItem *above = 0;
00195 above = dynamic_cast<KOTodoViewItem *>(itemAbove());
00196 m_known = above ? above->
m_known :
true;
00197
if (m_known)
00198 {
00199 m_odd = above ? !above->
m_odd :
false;
00200 }
00201
else
00202 {
00203
KOTodoViewItem *item;
00204
bool previous =
true;
00205
if (QListViewItem::parent())
00206 {
00207 item = dynamic_cast<KOTodoViewItem *>(QListViewItem::parent());
00208
if (item)
00209 previous = item->
m_odd;
00210 item = dynamic_cast<KOTodoViewItem *>(QListViewItem::parent()->firstChild());
00211 }
00212
else
00213 {
00214 item = dynamic_cast<KOTodoViewItem *>(lv->firstChild());
00215 }
00216
00217
while(item)
00218 {
00219 item->
m_odd = previous = !previous;
00220 item->
m_known =
true;
00221 item = dynamic_cast<KOTodoViewItem *>(item->nextSibling());
00222 }
00223 }
00224
return m_odd;
00225 }
00226
return false;
00227
#else
00228
return false;
00229
#endif
00230
}
00231
00232
void KOTodoViewItem::paintCell(QPainter *p,
const QColorGroup &cg,
int column,
int width,
int alignment)
00233 {
00234 QColorGroup _cg = cg;
00235
#ifndef KORG_NOLVALTERNATION
00236
if (isAlternate())
00237 _cg.setColor(QColorGroup::Base, static_cast< KOTodoListView* >(listView())->alternateBackground());
00238
if (mTodo->hasDueDate()) {
00239
if (mTodo->dtDue().date()==QDate::currentDate() &&
00240 !mTodo->isCompleted()) {
00241 _cg.setColor(QColorGroup::Base, KOPrefs::instance()->mTodoDueTodayColor);
00242 _cg.setColor(QColorGroup::Text, getTextColor(KOPrefs::instance()->mTodoDueTodayColor));
00243 }
00244
if (mTodo->dtDue().date() < QDate::currentDate() &&
00245 !mTodo->isCompleted()) {
00246 _cg.setColor(QColorGroup::Base, KOPrefs::instance()->mTodoOverdueColor);
00247 _cg.setColor(QColorGroup::Text, getTextColor(KOPrefs::instance()->mTodoOverdueColor));
00248 }
00249 }
00250
#endif
00251
00252
00253
if ( column == 2 ) {
00254 p->save();
00255
int progress = (
int)(( (width-6)*mTodo->percentComplete())/100.0 + 0.5);
00256
00257 p->fillRect( 0, 0, width, height(), _cg.base() );
00258 p->setPen( KGlobalSettings::textColor() );
00259 p->setBrush( KGlobalSettings::baseColor() );
00260 p->drawRect( 2, 2, width-4, height()-4);
00261 p->fillRect( 3, 3, progress, height()-6,
00262 KGlobalSettings::highlightColor() );
00263 p->restore();
00264 }
else {
00265 QCheckListItem::paintCell(p, _cg, column, width, alignment);
00266 }
00267 }