00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <tqcursor.h>
00025 #include <tqlabel.h>
00026 #include <tqlayout.h>
00027 #include <tqtooltip.h>
00028
00029 #include <kdialog.h>
00030 #include <tdeglobal.h>
00031 #include <kiconloader.h>
00032 #include <tdelocale.h>
00033 #include <tdeparts/part.h>
00034 #include <tdepopupmenu.h>
00035 #include <kstandarddirs.h>
00036 #include <kurllabel.h>
00037 #include <libkcal/resourcecalendar.h>
00038 #include <libkcal/resourcelocal.h>
00039 #include <libkcal/todo.h>
00040 #include <libkcal/incidenceformatter.h>
00041 #include <libtdepim/kpimprefs.h>
00042
00043 #include "korganizeriface_stub.h"
00044
00045 #include "core.h"
00046 #include "plugin.h"
00047 #include "todoplugin.h"
00048
00049 #include "korganizer/stdcalendar.h"
00050 #include "korganizer/koglobals.h"
00051 #include "korganizer/incidencechanger.h"
00052
00053 #include "todosummarywidget.h"
00054
00055 TodoSummaryWidget::TodoSummaryWidget( TodoPlugin *plugin,
00056 TQWidget *parent, const char *name )
00057 : Kontact::Summary( parent, name ), mPlugin( plugin )
00058 {
00059 TQVBoxLayout *mainLayout = new TQVBoxLayout( this, 3, 3 );
00060
00061 TQPixmap icon = TDEGlobal::iconLoader()->loadIcon( "kontact_todo",
00062 TDEIcon::Desktop, TDEIcon::SizeMedium );
00063 TQWidget *header = createHeader( this, icon, i18n( "To-do" ) );
00064 mainLayout->addWidget( header );
00065
00066 mLayout = new TQGridLayout( mainLayout, 7, 4, 3 );
00067 mLayout->setRowStretch( 6, 1 );
00068
00069 mCalendar = KOrg::StdCalendar::self();
00070
00071 connect( mCalendar, TQT_SIGNAL( calendarChanged() ), TQT_SLOT( updateView() ) );
00072 connect( mPlugin->core(), TQT_SIGNAL( dayChanged( const TQDate& ) ),
00073 TQT_SLOT( updateView() ) );
00074
00075 updateView();
00076 }
00077
00078 TodoSummaryWidget::~TodoSummaryWidget()
00079 {
00080 }
00081
00082 void TodoSummaryWidget::updateView()
00083 {
00084 mLabels.setAutoDelete( true );
00085 mLabels.clear();
00086 mLabels.setAutoDelete( false );
00087
00088 TDEConfig config( "kcmkorgsummaryrc" );
00089 config.setGroup( "Todo" );
00090 bool showAllTodos = config.readBoolEntry( "ShowAllTodos", false );
00091
00092 TDEIconLoader loader( "tdepim" );
00093
00094 TQLabel *label = 0;
00095 int counter = 0;
00096
00097 TQDate currentDate = TQDate::currentDate();
00098 KCal::Todo::List todos = mCalendar->todos();
00099 if ( todos.count() > 0 ) {
00100 TQPixmap pm = loader.loadIcon( "todo", TDEIcon::Small );
00101 KCal::Todo::List::ConstIterator it;
00102 for ( it = todos.begin(); it != todos.end(); ++it ) {
00103 KCal::Todo *todo = *it;
00104
00105 bool accepted = false;
00106 TQString stateText;
00107
00108
00109 if ( showAllTodos && !todo->isCompleted())
00110 accepted = true;
00111
00112
00113 if ( todo->hasDueDate() && !todo->isCompleted() &&
00114 todo->dtDue().date() < currentDate ) {
00115 accepted = true;
00116 stateText = i18n( "overdue" );
00117 }
00118
00119
00120 if ( todo->hasStartDate() && todo->hasDueDate() &&
00121 todo->dtStart().date() < currentDate &&
00122 currentDate < todo->dtDue().date() ) {
00123 accepted = true;
00124 stateText = i18n( "in progress" );
00125 }
00126
00127
00128 if ( todo->hasStartDate() && todo->dtStart().date() == currentDate ) {
00129 accepted = true;
00130 stateText = i18n( "starts today" );
00131 }
00132
00133
00134 if ( todo->hasDueDate() && todo->dtDue().date() == currentDate ) {
00135 accepted = true;
00136 stateText = i18n( "ends today" );
00137 }
00138
00139 if ( !accepted )
00140 continue;
00141
00142 label = new TQLabel( this );
00143 label->setPixmap( pm );
00144 label->setSizePolicy( TQSizePolicy::Maximum, TQSizePolicy::Maximum );
00145 mLayout->addWidget( label, counter, 0 );
00146 mLabels.append( label );
00147
00148 label = new TQLabel( TQString::number( todo->percentComplete() ) + "%", this );
00149 label->setAlignment( AlignHCenter | AlignVCenter );
00150 label->setSizePolicy( TQSizePolicy::Maximum, TQSizePolicy::Maximum );
00151 mLayout->addWidget( label, counter, 1 );
00152 mLabels.append( label );
00153
00154 TQString sSummary = todo->summary();
00155 if ( todo->relatedTo() ) {
00156 sSummary = todo->relatedTo()->summary() + ":" + todo->summary();
00157 }
00158 KURLLabel *urlLabel = new KURLLabel( this );
00159 urlLabel->setText( sSummary );
00160 urlLabel->setURL( todo->uid() );
00161 urlLabel->installEventFilter( this );
00162 urlLabel->setTextFormat( TQt::RichText );
00163 mLayout->addWidget( urlLabel, counter, 2 );
00164 mLabels.append( urlLabel );
00165
00166 connect( urlLabel, TQT_SIGNAL( leftClickedURL( const TQString& ) ),
00167 this, TQT_SLOT( viewTodo( const TQString& ) ) );
00168 connect( urlLabel, TQT_SIGNAL( rightClickedURL( const TQString& ) ),
00169 this, TQT_SLOT( popupMenu( const TQString& ) ) );
00170
00171 TQString tipText( KCal::IncidenceFormatter::toolTipStr( mCalendar, todo, currentDate, true ) );
00172 if ( !tipText.isEmpty() ) {
00173 TQToolTip::add( urlLabel, tipText );
00174 }
00175
00176 label = new TQLabel( stateText, this );
00177 label->setAlignment( AlignLeft | AlignVCenter );
00178 label->setSizePolicy( TQSizePolicy::Maximum, TQSizePolicy::Maximum );
00179 mLayout->addWidget( label, counter, 3 );
00180 mLabels.append( label );
00181
00182 counter++;
00183 }
00184 }
00185
00186 if ( counter == 0 ) {
00187 TQLabel *noTodos = new TQLabel( i18n( "No to-dos pending" ), this );
00188 noTodos->setAlignment( AlignHCenter | AlignVCenter );
00189 mLayout->addWidget( noTodos, 0, 1 );
00190 mLabels.append( noTodos );
00191 }
00192
00193 for ( label = mLabels.first(); label; label = mLabels.next() )
00194 label->show();
00195 }
00196
00197 void TodoSummaryWidget::viewTodo( const TQString &uid )
00198 {
00199 mPlugin->core()->selectPlugin( "kontact_todoplugin" );
00200 KOrganizerIface_stub iface( "korganizer", "KOrganizerIface" );
00201 iface.editIncidence( uid );
00202 }
00203
00204 void TodoSummaryWidget::removeTodo( const TQString &uid )
00205 {
00206 mPlugin->core()->selectPlugin( "kontact_todoplugin" );
00207 KOrganizerIface_stub iface( "korganizer", "KOrganizerIface" );
00208 iface.deleteIncidence( uid, false );
00209 }
00210
00211 void TodoSummaryWidget::completeTodo( const TQString &uid )
00212 {
00213 KCal::Todo *todo = mCalendar->todo( uid );
00214 IncidenceChanger *changer = new IncidenceChanger( mCalendar, TQT_TQOBJECT(this) );
00215 if ( !todo->isReadOnly() && changer->beginChange( todo, 0, TQString() ) ) {
00216 KCal::Todo *oldTodo = todo->clone();
00217 todo->setCompleted( TQDateTime::currentDateTime() );
00218 changer->changeIncidence( oldTodo, todo, KOGlobals::COMPLETION_MODIFIED, this );
00219 changer->endChange( todo, 0, TQString() );
00220 delete oldTodo;
00221 updateView();
00222 }
00223 }
00224
00225 void TodoSummaryWidget::popupMenu( const TQString &uid )
00226 {
00227 TDEPopupMenu popup( this );
00228 TQToolTip::remove( this );
00229 popup.insertItem( i18n( "&Edit To-do..." ), 0 );
00230 popup.insertItem( TDEGlobal::iconLoader()->loadIcon( "edit-delete", TDEIcon::Small),
00231 i18n( "&Delete To-do" ), 1 );
00232 KCal::Todo *todo = mCalendar->todo( uid );
00233 if ( !todo->isCompleted() ) {
00234 popup.insertItem( TDEGlobal::iconLoader()->loadIcon( "checkedbox", TDEIcon::Small),
00235 i18n( "&Mark To-do Completed" ), 2 );
00236 }
00237
00238 switch ( popup.exec( TQCursor::pos() ) ) {
00239 case 0:
00240 viewTodo( uid );
00241 break;
00242 case 1:
00243 removeTodo( uid );
00244 break;
00245 case 2:
00246 completeTodo( uid );
00247 break;
00248 }
00249 }
00250
00251 bool TodoSummaryWidget::eventFilter( TQObject *obj, TQEvent* e )
00252 {
00253 if ( obj->inherits( "KURLLabel" ) ) {
00254 KURLLabel* label = static_cast<KURLLabel*>( TQT_TQWIDGET(obj) );
00255 if ( e->type() == TQEvent::Enter )
00256 emit message( i18n( "Edit To-do: \"%1\"" ).arg( label->text() ) );
00257 if ( e->type() == TQEvent::Leave )
00258 emit message( TQString() );
00259 }
00260
00261 return Kontact::Summary::eventFilter( obj, e );
00262 }
00263
00264 TQStringList TodoSummaryWidget::configModules() const
00265 {
00266 return TQStringList( "kcmtodosummary.desktop" );
00267 }
00268
00269 #include "todosummarywidget.moc"