karm_part.cpp
00001 00002 #include "kaccelmenuwatch.h" 00003 #include "karm_part.h" 00004 #include "karmerrors.h" 00005 #include "task.h" 00006 #include "preferences.h" 00007 #include "tray.h" 00008 #include "version.h" 00009 #include <kaccel.h> 00010 00011 #include <kinstance.h> 00012 #include <kaction.h> 00013 #include <kstdaction.h> 00014 #include <kfiledialog.h> 00015 #include <kglobal.h> 00016 #include <klocale.h> 00017 00018 #include <tqfile.h> 00019 #include <tqtextstream.h> 00020 #include <tqmultilineedit.h> 00021 #include <tqpopupmenu.h> 00022 #include "mainwindow.h" 00023 00024 karmPart::karmPart( TQWidget *parentWidget, const char *widgetName, 00025 TQObject *parent, const char *name ) 00026 : DCOPObject ( "KarmDCOPIface" ), KParts::ReadWritePart(parent, name), 00027 _accel ( new KAccel( parentWidget ) ), 00028 _watcher ( new KAccelMenuWatch( _accel, TQT_TQOBJECT(parentWidget) ) ) 00029 { 00030 // we need an instance 00031 setInstance( karmPartFactory::instance() ); 00032 00033 // this should be your custom internal widget 00034 _taskView = new TaskView( parentWidget, widgetName ); 00035 00036 // setup PreferenceDialog. 00037 _preferences = Preferences::instance(); 00038 00039 // notify the part that this is our internal widget 00040 setWidget(_taskView); 00041 00042 // create our actions 00043 KStdAction::open(this, TQT_SLOT(fileOpen()), actionCollection()); 00044 KStdAction::saveAs(this, TQT_SLOT(fileSaveAs()), actionCollection()); 00045 KStdAction::save(this, TQT_SLOT(save()), actionCollection()); 00046 00047 makeMenus(); 00048 00049 _watcher->updateMenus(); 00050 00051 // connections 00052 00053 connect( _taskView, TQT_SIGNAL( totalTimesChanged( long, long ) ), 00054 this, TQT_SLOT( updateTime( long, long ) ) ); 00055 connect( _taskView, TQT_SIGNAL( selectionChanged ( TQListViewItem * )), 00056 this, TQT_SLOT(slotSelectionChanged())); 00057 connect( _taskView, TQT_SIGNAL( updateButtons() ), 00058 this, TQT_SLOT(slotSelectionChanged())); 00059 00060 // Setup context menu request handling 00061 connect( _taskView, 00062 TQT_SIGNAL( contextMenuRequested( TQListViewItem*, const TQPoint&, int )), 00063 this, 00064 TQT_SLOT( contextMenuRequest( TQListViewItem*, const TQPoint&, int ))); 00065 00066 _tray = new KarmTray( this ); 00067 00068 connect( _tray, TQT_SIGNAL( quitSelected() ), TQT_SLOT( quit() ) ); 00069 00070 connect( _taskView, TQT_SIGNAL( timersActive() ), _tray, TQT_SLOT( startClock() ) ); 00071 connect( _taskView, TQT_SIGNAL( timersActive() ), this, TQT_SLOT( enableStopAll() )); 00072 connect( _taskView, TQT_SIGNAL( timersInactive() ), _tray, TQT_SLOT( stopClock() ) ); 00073 connect( _taskView, TQT_SIGNAL( timersInactive() ), this, TQT_SLOT( disableStopAll())); 00074 connect( _taskView, TQT_SIGNAL( tasksChanged( TQPtrList<Task> ) ), 00075 _tray, TQT_SLOT( updateToolTip( TQPtrList<Task> ) )); 00076 00077 _taskView->load(); 00078 00079 // Everything that uses Preferences has been created now, we can let it 00080 // emit its signals 00081 _preferences->emitSignals(); 00082 slotSelectionChanged(); 00083 00084 // set our XML-UI resource file 00085 setXMLFile("karmui.rc"); 00086 00087 // we are read-write by default 00088 setReadWrite(true); 00089 00090 // we are not modified since we haven't done anything yet 00091 setModified(false); 00092 } 00093 00094 karmPart::~karmPart() 00095 { 00096 } 00097 00098 void karmPart::slotSelectionChanged() 00099 { 00100 Task* item= _taskView->current_item(); 00101 actionDelete->setEnabled(item); 00102 actionEdit->setEnabled(item); 00103 actionStart->setEnabled(item && !item->isRunning() && !item->isComplete()); 00104 actionStop->setEnabled(item && item->isRunning()); 00105 actionMarkAsComplete->setEnabled(item && !item->isComplete()); 00106 actionMarkAsIncomplete->setEnabled(item && item->isComplete()); 00107 } 00108 00109 void karmPart::makeMenus() 00110 { 00111 KAction 00112 *actionKeyBindings, 00113 *actionNew, 00114 *actionNewSub; 00115 00116 (void) KStdAction::quit( this, TQT_SLOT( quit() ), actionCollection()); 00117 (void) KStdAction::print( this, TQT_SLOT( print() ), actionCollection()); 00118 actionKeyBindings = KStdAction::keyBindings( this, TQT_SLOT( keyBindings() ), 00119 actionCollection() ); 00120 actionPreferences = KStdAction::preferences(TQT_TQOBJECT(_preferences), 00121 TQT_SLOT(showDialog()), 00122 actionCollection() ); 00123 (void) KStdAction::save( this, TQT_SLOT( save() ), actionCollection() ); 00124 KAction* actionStartNewSession = new KAction( i18n("Start &New Session"), 00125 0, 00126 TQT_TQOBJECT(this), 00127 TQT_SLOT( startNewSession() ), 00128 actionCollection(), 00129 "start_new_session"); 00130 KAction* actionResetAll = new KAction( i18n("&Reset All Times"), 00131 0, 00132 TQT_TQOBJECT(this), 00133 TQT_SLOT( resetAllTimes() ), 00134 actionCollection(), 00135 "reset_all_times"); 00136 actionStart = new KAction( i18n("&Start"), 00137 TQString::fromLatin1("1rightarrow"), Key_S, 00138 TQT_TQOBJECT(_taskView), 00139 TQT_SLOT( startCurrentTimer() ), actionCollection(), 00140 "start"); 00141 actionStop = new KAction( i18n("S&top"), 00142 TQString::fromLatin1("stop"), 0, 00143 TQT_TQOBJECT(_taskView), 00144 TQT_SLOT( stopCurrentTimer() ), actionCollection(), 00145 "stop"); 00146 actionStopAll = new KAction( i18n("Stop &All Timers"), 00147 Key_Escape, 00148 TQT_TQOBJECT(_taskView), 00149 TQT_SLOT( stopAllTimers() ), actionCollection(), 00150 "stopAll"); 00151 actionStopAll->setEnabled(false); 00152 00153 actionNew = new KAction( i18n("&New..."), 00154 TQString::fromLatin1("filenew"), CTRL+Key_N, 00155 TQT_TQOBJECT(_taskView), 00156 TQT_SLOT( newTask() ), actionCollection(), 00157 "new_task"); 00158 actionNewSub = new KAction( i18n("New &Subtask..."), 00159 TQString::fromLatin1("kmultiple"), CTRL+ALT+Key_N, 00160 TQT_TQOBJECT(_taskView), 00161 TQT_SLOT( newSubTask() ), actionCollection(), 00162 "new_sub_task"); 00163 actionDelete = new KAction( i18n("&Delete"), 00164 TQString::fromLatin1("editdelete"), Key_Delete, 00165 TQT_TQOBJECT(_taskView), 00166 TQT_SLOT( deleteTask() ), actionCollection(), 00167 "delete_task"); 00168 actionEdit = new KAction( i18n("&Edit..."), 00169 TQString::fromLatin1("edit"), CTRL + Key_E, 00170 TQT_TQOBJECT(_taskView), 00171 TQT_SLOT( editTask() ), actionCollection(), 00172 "edit_task"); 00173 // actionAddComment = new KAction( i18n("&Add Comment..."), 00174 // TQString::fromLatin1("document"), 00175 // CTRL+ALT+Key_E, 00176 // TQT_TQOBJECT(_taskView), 00177 // TQT_SLOT( addCommentToTask() ), 00178 // actionCollection(), 00179 // "add_comment_to_task"); 00180 actionMarkAsComplete = new KAction( i18n("&Mark as Complete"), 00181 TQString::fromLatin1("document"), 00182 CTRL+Key_M, 00183 TQT_TQOBJECT(_taskView), 00184 TQT_SLOT( markTaskAsComplete() ), 00185 actionCollection(), 00186 "mark_as_complete"); 00187 actionMarkAsIncomplete = new KAction( i18n("&Mark as Incomplete"), 00188 TQString::fromLatin1("document"), 00189 CTRL+Key_M, 00190 TQT_TQOBJECT(_taskView), 00191 TQT_SLOT( markTaskAsIncomplete() ), 00192 actionCollection(), 00193 "mark_as_incomplete"); 00194 actionClipTotals = new KAction( i18n("&Copy Totals to Clipboard"), 00195 TQString::fromLatin1("klipper"), 00196 CTRL+Key_C, 00197 TQT_TQOBJECT(_taskView), 00198 TQT_SLOT( clipTotals() ), 00199 actionCollection(), 00200 "clip_totals"); 00201 actionClipHistory = new KAction( i18n("Copy &History to Clipboard"), 00202 TQString::fromLatin1("klipper"), 00203 CTRL+ALT+Key_C, 00204 TQT_TQOBJECT(_taskView), 00205 TQT_SLOT( clipHistory() ), 00206 actionCollection(), 00207 "clip_history"); 00208 00209 new KAction( i18n("Import &Legacy Flat File..."), 0, 00210 TQT_TQOBJECT(_taskView), TQT_SLOT(loadFromFlatFile()), actionCollection(), 00211 "import_flatfile"); 00212 new KAction( i18n("&Export to CSV File..."), 0, 00213 TQT_TQOBJECT(_taskView), TQT_SLOT(exportcsvFile()), actionCollection(), 00214 "export_csvfile"); 00215 new KAction( i18n("Export &History to CSV File..."), 0, 00216 TQT_TQOBJECT(this), TQT_SLOT(exportcsvHistory()), actionCollection(), 00217 "export_csvhistory"); 00218 new KAction( i18n("Import Tasks From &Planner..."), 0, 00219 TQT_TQOBJECT(_taskView), TQT_SLOT(importPlanner()), actionCollection(), 00220 "import_planner"); 00221 new KAction( i18n("Configure KArm..."), 0, 00222 TQT_TQOBJECT(_preferences), TQT_SLOT(showDialog()), actionCollection(), 00223 "configure_karm"); 00224 00225 /* 00226 new KAction( i18n("Import E&vents"), 0, 00227 _taskView, 00228 TQT_SLOT( loadFromKOrgEvents() ), actionCollection(), 00229 "import_korg_events"); 00230 */ 00231 00232 // Tool tops must be set after the createGUI. 00233 actionKeyBindings->setToolTip( i18n("Configure key bindings") ); 00234 actionKeyBindings->setWhatsThis( i18n("This will let you configure key" 00235 "bindings which is specific to karm") ); 00236 00237 actionStartNewSession->setToolTip( i18n("Start a new session") ); 00238 actionStartNewSession->setWhatsThis( i18n("This will reset the session time " 00239 "to 0 for all tasks, to start a " 00240 "new session, without affecting " 00241 "the totals.") ); 00242 actionResetAll->setToolTip( i18n("Reset all times") ); 00243 actionResetAll->setWhatsThis( i18n("This will reset the session and total " 00244 "time to 0 for all tasks, to restart from " 00245 "scratch.") ); 00246 00247 actionStart->setToolTip( i18n("Start timing for selected task") ); 00248 actionStart->setWhatsThis( i18n("This will start timing for the selected " 00249 "task.\n" 00250 "It is even possible to time several tasks " 00251 "simultaneously.\n\n" 00252 "You may also start timing of a tasks by " 00253 "double clicking the left mouse " 00254 "button on a given task. This will, however, " 00255 "stop timing of other tasks.")); 00256 00257 actionStop->setToolTip( i18n("Stop timing of the selected task") ); 00258 actionStop->setWhatsThis( i18n("Stop timing of the selected task") ); 00259 00260 actionStopAll->setToolTip( i18n("Stop all of the active timers") ); 00261 actionStopAll->setWhatsThis( i18n("Stop all of the active timers") ); 00262 00263 actionNew->setToolTip( i18n("Create new top level task") ); 00264 actionNew->setWhatsThis( i18n("This will create a new top level task.") ); 00265 00266 actionDelete->setToolTip( i18n("Delete selected task") ); 00267 actionDelete->setWhatsThis( i18n("This will delete the selected task and " 00268 "all its subtasks.") ); 00269 00270 actionEdit->setToolTip( i18n("Edit name or times for selected task") ); 00271 actionEdit->setWhatsThis( i18n("This will bring up a dialog box where you " 00272 "may edit the parameters for the selected " 00273 "task.")); 00274 //actionAddComment->setToolTip( i18n("Add a comment to a task") ); 00275 //actionAddComment->setWhatsThis( i18n("This will bring up a dialog box where " 00276 // "you can add a comment to a task. The " 00277 // "comment can for instance add information on what you " 00278 // "are currently doing. The comment will " 00279 // "be logged in the log file.")); 00280 actionClipTotals->setToolTip(i18n("Copy task totals to clipboard")); 00281 actionClipHistory->setToolTip(i18n("Copy time card history to clipboard.")); 00282 00283 slotSelectionChanged(); 00284 } 00285 00286 void karmPart::setReadWrite(bool rw) 00287 { 00288 // notify your internal widget of the read-write state 00289 if (rw) 00290 connect(_taskView, TQT_SIGNAL(textChanged()), 00291 this, TQT_SLOT(setModified())); 00292 else 00293 { 00294 disconnect(_taskView, TQT_SIGNAL(textChanged()), 00295 this, TQT_SLOT(setModified())); 00296 } 00297 00298 ReadWritePart::setReadWrite(rw); 00299 } 00300 00301 void karmPart::setModified(bool modified) 00302 { 00303 // get a handle on our Save action and make sure it is valid 00304 KAction *save = actionCollection()->action(KStdAction::stdName(KStdAction::Save)); 00305 if (!save) 00306 return; 00307 00308 // if so, we either enable or disable it based on the current 00309 // state 00310 if (modified) 00311 save->setEnabled(true); 00312 else 00313 save->setEnabled(false); 00314 00315 // in any event, we want our parent to do it's thing 00316 ReadWritePart::setModified(modified); 00317 } 00318 00319 bool karmPart::openFile() 00320 { 00321 // m_file is always local so we can use TQFile on it 00322 _taskView->load(m_file); 00323 00324 // just for fun, set the status bar 00325 emit setStatusBarText( m_url.prettyURL() ); 00326 00327 return true; 00328 } 00329 00330 bool karmPart::saveFile() 00331 { 00332 // if we aren't read-write, return immediately 00333 if (isReadWrite() == false) 00334 return false; 00335 00336 // m_file is always local, so we use TQFile 00337 TQFile file(m_file); 00338 if (file.open(IO_WriteOnly) == false) 00339 return false; 00340 00341 // use TQTextStream to dump the text to the file 00342 TQTextStream stream(&file); 00343 00344 file.close(); 00345 00346 return true; 00347 } 00348 00349 void karmPart::fileOpen() 00350 { 00351 // this slot is called whenever the File->Open menu is selected, 00352 // the Open shortcut is pressed (usually CTRL+O) or the Open toolbar 00353 // button is clicked 00354 TQString file_name = KFileDialog::getOpenFileName(); 00355 00356 if (file_name.isEmpty() == false) 00357 openURL(file_name); 00358 } 00359 00360 void karmPart::fileSaveAs() 00361 { 00362 // this slot is called whenever the File->Save As menu is selected, 00363 TQString file_name = KFileDialog::getSaveFileName(); 00364 if (file_name.isEmpty() == false) 00365 saveAs(file_name); 00366 } 00367 00368 00369 // It's usually safe to leave the factory code alone.. with the 00370 // notable exception of the KAboutData data 00371 #include <kaboutdata.h> 00372 #include <klocale.h> 00373 00374 KInstance* karmPartFactory::s_instance = 0L; 00375 KAboutData* karmPartFactory::s_about = 0L; 00376 00377 karmPartFactory::karmPartFactory() 00378 : KParts::Factory() 00379 { 00380 } 00381 00382 karmPartFactory::~karmPartFactory() 00383 { 00384 delete s_instance; 00385 delete s_about; 00386 00387 s_instance = 0L; 00388 } 00389 00390 KParts::Part* karmPartFactory::createPartObject( TQWidget *parentWidget, const char *widgetName, 00391 TQObject *parent, const char *name, 00392 const char *classname, const TQStringList &args ) 00393 { 00394 // Create an instance of our Part 00395 karmPart* obj = new karmPart( parentWidget, widgetName, parent, name ); 00396 00397 // See if we are to be read-write or not 00398 if (TQCString(classname) == "KParts::ReadOnlyPart") 00399 obj->setReadWrite(false); 00400 00401 return obj; 00402 } 00403 00404 KInstance* karmPartFactory::instance() 00405 { 00406 if( !s_instance ) 00407 { 00408 s_about = new KAboutData("karmpart", I18N_NOOP("karmPart"), "0.1"); 00409 s_about->addAuthor("Thorsten Staerk", 0, "thorsten@staerk.de"); 00410 s_instance = new KInstance(s_about); 00411 } 00412 return s_instance; 00413 } 00414 00415 extern "C" 00416 { 00417 KDE_EXPORT void* init_libkarmpart() 00418 { 00419 KGlobal::locale()->insertCatalogue("karm"); 00420 return new karmPartFactory; 00421 } 00422 } 00423 00424 void karmPart::contextMenuRequest( TQListViewItem*, const TQPoint& point, int ) 00425 { 00426 TQPopupMenu* pop = dynamic_cast<TQPopupMenu*>( 00427 factory()->container( i18n( "task_popup" ), this ) ); 00428 if ( pop ) 00429 pop->popup( point ); 00430 } 00431 00432 //---------------------------------------------------------------------------- 00433 // 00434 // D C O P I N T E R F A C E 00435 // 00436 //---------------------------------------------------------------------------- 00437 00438 TQString karmPart::version() const 00439 { 00440 return KARM_VERSION; 00441 } 00442 00443 TQString karmPart::deletetodo() 00444 { 00445 _taskView->deleteTask(); 00446 return ""; 00447 } 00448 00449 bool karmPart::getpromptdelete() 00450 { 00451 return _preferences->promptDelete(); 00452 } 00453 00454 TQString karmPart::setpromptdelete( bool prompt ) 00455 { 00456 _preferences->setPromptDelete( prompt ); 00457 return ""; 00458 } 00459 00460 TQString karmPart::taskIdFromName( const TQString &taskname ) const 00461 { 00462 TQString rval = ""; 00463 00464 Task* task = _taskView->first_child(); 00465 while ( rval.isEmpty() && task ) 00466 { 00467 rval = _hasTask( task, taskname ); 00468 task = task->nextSibling(); 00469 } 00470 00471 return rval; 00472 } 00473 00474 void karmPart::quit() 00475 { 00476 // TODO: write something for kapp->quit(); 00477 } 00478 00479 bool karmPart::save() 00480 { 00481 kdDebug(5970) << "Saving time data to disk." << endl; 00482 TQString err=_taskView->save(); // untranslated error msg. 00483 // TODO: 00484 /* if (err.isEmpty()) statusBar()->message(i18n("Successfully saved tasks and history"),1807); 00485 else statusBar()->message(i18n(err.ascii()),7707); // no msgbox since save is called when exiting */ 00486 return true; 00487 } 00488 00489 int karmPart::addTask( const TQString& taskname ) 00490 { 00491 DesktopList desktopList; 00492 TQString uid = _taskView->addTask( taskname, 0, 0, desktopList ); 00493 kdDebug(5970) << "MainWindow::addTask( " << taskname << " ) returns " << uid << endl; 00494 if ( uid.length() > 0 ) return 0; 00495 else 00496 { 00497 // We can't really tell what happened, b/c the resource framework only 00498 // returns a boolean. 00499 return KARM_ERR_GENERIC_SAVE_FAILED; 00500 } 00501 } 00502 00503 TQString karmPart::setPerCentComplete( const TQString& taskName, int perCent ) 00504 { 00505 int index = 0; 00506 TQString err="no such task"; 00507 for (int i=0; i<_taskView->count(); i++) 00508 { 00509 if ((_taskView->item_at_index(i)->name()==taskName)) 00510 { 00511 index=i; 00512 if (err==TQString()) err="task name is abigious"; 00513 if (err=="no such task") err=TQString(); 00514 } 00515 } 00516 if (err==TQString()) 00517 { 00518 _taskView->item_at_index(index)->setPercentComplete( perCent, _taskView->storage() ); 00519 } 00520 return err; 00521 } 00522 00523 int karmPart::bookTime 00524 ( const TQString& taskId, const TQString& datetime, long minutes ) 00525 { 00526 int rval = 0; 00527 TQDate startDate; 00528 TQTime startTime; 00529 TQDateTime startDateTime; 00530 Task *task, *t; 00531 00532 if ( minutes <= 0 ) rval = KARM_ERR_INVALID_DURATION; 00533 00534 // Find task 00535 task = _taskView->first_child(); 00536 t = NULL; 00537 while ( !t && task ) 00538 { 00539 t = _hasUid( task, taskId ); 00540 task = task->nextSibling(); 00541 } 00542 if ( t == NULL ) rval = KARM_ERR_UID_NOT_FOUND; 00543 00544 // Parse datetime 00545 if ( !rval ) 00546 { 00547 startDate = TQDate::fromString( datetime, Qt::ISODate ); 00548 if ( datetime.length() > 10 ) // "YYYY-MM-DD".length() = 10 00549 { 00550 startTime = TQTime::fromString( datetime, Qt::ISODate ); 00551 } 00552 else startTime = TQTime( 12, 0 ); 00553 if ( startDate.isValid() && startTime.isValid() ) 00554 { 00555 startDateTime = TQDateTime( startDate, startTime ); 00556 } 00557 else rval = KARM_ERR_INVALID_DATE; 00558 00559 } 00560 00561 // Update task totals (session and total) and save to disk 00562 if ( !rval ) 00563 { 00564 t->changeTotalTimes( t->sessionTime() + minutes, t->totalTime() + minutes ); 00565 if ( ! _taskView->storage()->bookTime( t, startDateTime, minutes * 60 ) ) 00566 { 00567 rval = KARM_ERR_GENERIC_SAVE_FAILED; 00568 } 00569 } 00570 00571 return rval; 00572 } 00573 00574 // There was something really bad going on with DCOP when I used a particular 00575 // argument name; if I recall correctly, the argument name was errno. 00576 TQString karmPart::getError( int mkb ) const 00577 { 00578 if ( mkb <= KARM_MAX_ERROR_NO ) return m_error[ mkb ]; 00579 else return i18n( "Invalid error number: %1" ).arg( mkb ); 00580 } 00581 00582 int karmPart::totalMinutesForTaskId( const TQString& taskId ) 00583 { 00584 int rval = 0; 00585 Task *task, *t; 00586 00587 kdDebug(5970) << "MainWindow::totalTimeForTask( " << taskId << " )" << endl; 00588 00589 // Find task 00590 task = _taskView->first_child(); 00591 t = NULL; 00592 while ( !t && task ) 00593 { 00594 t = _hasUid( task, taskId ); 00595 task = task->nextSibling(); 00596 } 00597 if ( t != NULL ) 00598 { 00599 rval = t->totalTime(); 00600 kdDebug(5970) << "MainWindow::totalTimeForTask - task found: rval = " << rval << endl; 00601 } 00602 else 00603 { 00604 kdDebug(5970) << "MainWindow::totalTimeForTask - task not found" << endl; 00605 rval = KARM_ERR_UID_NOT_FOUND; 00606 } 00607 00608 return rval; 00609 } 00610 00611 TQString karmPart::_hasTask( Task* task, const TQString &taskname ) const 00612 { 00613 TQString rval = ""; 00614 if ( task->name() == taskname ) 00615 { 00616 rval = task->uid(); 00617 } 00618 else 00619 { 00620 Task* nexttask = task->firstChild(); 00621 while ( rval.isEmpty() && nexttask ) 00622 { 00623 rval = _hasTask( nexttask, taskname ); 00624 nexttask = nexttask->nextSibling(); 00625 } 00626 } 00627 return rval; 00628 } 00629 00630 Task* karmPart::_hasUid( Task* task, const TQString &uid ) const 00631 { 00632 Task *rval = NULL; 00633 00634 //kdDebug(5970) << "MainWindow::_hasUid( " << task << ", " << uid << " )" << endl; 00635 00636 if ( task->uid() == uid ) rval = task; 00637 else 00638 { 00639 Task* nexttask = task->firstChild(); 00640 while ( !rval && nexttask ) 00641 { 00642 rval = _hasUid( nexttask, uid ); 00643 nexttask = nexttask->nextSibling(); 00644 } 00645 } 00646 return rval; 00647 } 00648 00649 TQString karmPart::starttimerfor( const TQString& taskname ) 00650 { 00651 TQString err="no such task"; 00652 for (int i=0; i<_taskView->count(); i++) 00653 { 00654 if ((_taskView->item_at_index(i)->name()==taskname)) 00655 { 00656 _taskView->startTimerFor( _taskView->item_at_index(i) ); 00657 err=""; 00658 } 00659 } 00660 return err; 00661 } 00662 00663 TQString karmPart::stoptimerfor( const TQString& taskname ) 00664 { 00665 TQString err="no such task"; 00666 for (int i=0; i<_taskView->count(); i++) 00667 { 00668 if ((_taskView->item_at_index(i)->name()==taskname)) 00669 { 00670 _taskView->stopTimerFor( _taskView->item_at_index(i) ); 00671 err=""; 00672 } 00673 } 00674 return err; 00675 } 00676 00677 TQString karmPart::exportcsvfile( TQString filename, TQString from, TQString to, int type, bool decimalMinutes, bool allTasks, TQString delimiter, TQString quote ) 00678 { 00679 ReportCriteria rc; 00680 rc.allTasks=allTasks; 00681 rc.decimalMinutes=decimalMinutes; 00682 rc.delimiter=delimiter; 00683 rc.from=TQDate::fromString( from ); 00684 rc.quote=quote; 00685 rc.reportType=(ReportCriteria::REPORTTYPE) type; 00686 rc.to=TQDate::fromString( to ); 00687 rc.url=filename; 00688 return _taskView->report( rc ); 00689 } 00690 00691 TQString karmPart::importplannerfile( TQString fileName ) 00692 { 00693 return _taskView->importPlanner(fileName); 00694 } 00695 00696 void karmPart::startNewSession() 00697 { 00698 _taskView->startNewSession(); 00699 _taskView->save(); 00700 } 00701 00702 #include <tqpopupmenu.h> 00703 #include "karm_part.moc"