-rw-r--r-- | core/pim/todo/mainwindow.cpp | 425 | ||||
-rw-r--r-- | core/pim/todo/mainwindow.h | 77 | ||||
-rw-r--r-- | core/pim/todo/newtaskdlg.cpp | 78 | ||||
-rw-r--r-- | core/pim/todo/newtaskdlg.h | 56 | ||||
-rw-r--r-- | core/pim/todo/tableview.cpp | 88 | ||||
-rw-r--r-- | core/pim/todo/tableview.h | 52 | ||||
-rw-r--r-- | core/pim/todo/templateeditor.cpp | 38 | ||||
-rw-r--r-- | core/pim/todo/templateeditor.h | 31 | ||||
-rw-r--r-- | core/pim/todo/todo.pro | 8 | ||||
-rw-r--r-- | core/pim/todo/todomanager.cpp | 43 |
10 files changed, 375 insertions, 521 deletions
diff --git a/core/pim/todo/mainwindow.cpp b/core/pim/todo/mainwindow.cpp index 9424c23..75da27c 100644 --- a/core/pim/todo/mainwindow.cpp +++ b/core/pim/todo/mainwindow.cpp @@ -1,675 +1,502 @@ /* - =. This file is part of the OPIE Project - .=l. Copyright (c) 2002 <> - .>+-= - _;:, .> :=|. This program is free software; you can -.> <`_, > . <= redistribute it and/or modify it under -:`=1 )Y*s>-.-- : the terms of the GNU General Public -.="- .-=="i, .._ License as published by the Free Software - - . .-<_> .<> Foundation; either version 2 of the License, - ._= =} : or (at your option) any later version. - .%`+i> _;_. - .i_,=:_. -<s. This program is distributed in the hope that - + . -:. = it will be useful, but WITHOUT ANY WARRANTY; - : .. .:, . . . without even the implied warranty of - =_ + =;=|` MERCHANTABILITY or FITNESS FOR A - _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU -..}^=.= = ; Library General Public License for more -++= -. .` .: details. - : = ...= . :.=- - -. .:....=;==+<; You should have received a copy of the GNU - -_. . . )=. = General Public License along with - -- :-=` this library; see the file COPYING.LIB. + =. This file is part of the OPIE Project + .=l. Copyright (c) 2002 <> + .>+-= +_;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU General Public +.="- .-=="i, .._ License as published by the Free Software +- . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. +: = ...= . :.=- +-. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = General Public License along with + -- :-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <unistd.h> #include <opie2/odebug.h> #include <opie2/opimrecurrence.h> #include <opie2/opimnotifymanager.h> #include <opie2/otodoaccessvcal.h> #include <opie2/oapplicationfactory.h> #include <qpe/applnk.h> #include <qpe/config.h> #include <qpe/ir.h> #include <qpe/resource.h> #include <qpe/qpemessagebox.h> #include <qpe/alarmserver.h> #include <qpe/qpeapplication.h> +#include <qaction.h> +#include <qlayout.h> #include <qmenubar.h> #include <qmessagebox.h> #include <qpushbutton.h> -#include <qaction.h> +#include <qstringlist.h> #include <qtimer.h> -#include <qlayout.h> #include <qwhatsthis.h> #include "quickeditimpl.h" #include "todotemplatemanager.h" -#include "templateeditor.h" +#include "templatedialogimpl.h" #include "tableview.h" #include "textviewshow.h" #include "todoeditor.h" +#include "newtaskdlg.h" #include "mainwindow.h" using Opie::Core::OApplicationFactory; OPIE_EXPORT_APP( OApplicationFactory<Todo::MainWindow> ) using namespace Opie; using namespace Todo; MainWindow::MainWindow( QWidget* parent, const char* name, WFlags ) - : Opie::OPimMainWindow( "Todolist", parent, name, WType_TopLevel | WStyle_ContextHelp ) + : Opie::OPimMainWindow( "Todolist", tr( "Todo List" ), "Todo List", tr( "Task" ), "todo", + parent, name, WType_TopLevel | WStyle_ContextHelp ) { if (!name) setName("todo window"); m_syncing = false; m_showing = false; m_counter = 0; m_tempManager = new TemplateManager(); m_tempManager->load(); - initUI(); initConfig(); + initUI(); initViews(); initActions(); initEditor(); initShow(); - initTemplate(); - populateTemplates(); raiseCurrentView(); - QTimer::singleShot(0, this, SLOT(populateCategories() ) ); + QTimer::singleShot( 0, this, SLOT(initStuff()) ); } -void MainWindow::initTemplate() { - m_curTempEd = new TemplateEditor( this, templateManager() ); +void MainWindow::initStuff() { + m_todoMgr.load(); + setViewCategory( m_curCat ); + setCategory( m_curCat ); } void MainWindow::initActions() { - - // Data menu - m_edit->insertItem(QWidget::tr("New from template"), m_template, - -1, 0 ); - - QAction* a = new QAction( QWidget::tr("New Task" ), Resource::loadPixmap( "new" ), - QString::null, 0, this, 0 ); - connect(a, SIGNAL( activated() ), - this, SLOT( slotNew() ) ); - a->setWhatsThis( QWidget::tr( "Click here to create a new task." ) ); - a->addTo(m_tool ); - a->addTo(m_edit ); - - a = new QAction( QWidget::tr("Edit Task"), Resource::loadIconSet( "edit" ), - QString::null, 0, this, 0 ); - connect(a, SIGNAL(activated() ), - this, SLOT( slotEdit() ) ); - a->setWhatsThis( QWidget::tr( "Click here to modify the current task." ) ); - a->addTo( m_tool ); - a->addTo( m_edit ); - m_editAction = a; - - a = new QAction( QString::null, QWidget::tr("View Task"), 0, this, 0 ); - connect(a, SIGNAL( activated() ), - this, SLOT( slotShowDetails() ) ); - a->addTo( m_edit ); - - m_edit->insertSeparator(); - - a = new QAction( QWidget::tr("Delete..."), Resource::loadIconSet( "trash" ), - QString::null, 0, this, 0 ); - connect(a, SIGNAL(activated() ), - this, SLOT(slotDelete() ) ); - a->setWhatsThis( QWidget::tr( "Click here to remove the current task." ) ); - a->addTo( m_tool ); - a->addTo( m_edit ); - m_deleteAction = a; - - a = new QAction( QString::null, QWidget::tr("Delete all..."), 0, this, 0 ); - connect(a, SIGNAL( activated() ), - this, SLOT( slotDeleteAll() ) ); - a->addTo(m_edit ); - m_deleteAllAction = a; - - a = new QAction( QString::null, QWidget::tr("Delete completed"), - 0, this, 0 ); - connect(a, SIGNAL( activated() ), - this, SLOT( slotDeleteCompleted() ) ); - a->addTo(m_edit ); - a->setEnabled( TRUE ); - m_deleteCompleteAction = a; - - m_edit->insertSeparator(); - - a = new QAction( QString::null, QWidget::tr("Duplicate"), 0, this, 0 ); - connect(a, SIGNAL( activated() ), - this, SLOT( slotDuplicate() ) ); - a->addTo(m_edit ); - m_duplicateAction = a; - - m_edit->insertSeparator(); - - if ( Ir::supported() ) { - a = new QAction( QWidget::tr( "Beam" ), Resource::loadPixmap( "beam" ), QString::null, 0, this, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( slotBeam() ) ); - a->setWhatsThis( QWidget::tr( "Click here to send the current task to another device." ) ); - a->addTo( m_edit ); - a->addTo( m_tool ); - } - -#if 0 - // Options menu - a = new QAction( QWidget::tr("Find"), Resource::loadIconSet( "mag" ), - QString::null, 0, this, 0 ); - connect(a, SIGNAL( activated() ), this, SLOT( slotFind() ) ); - a->addTo( m_options ); - m_findAction = a; - - - m_options->insertSeparator(); -#endif - + // Insert Task menu items + QActionGroup *items = new QActionGroup( this, QString::null, false ); + + m_deleteCompleteAction = new QAction( QString::null, QWidget::tr( "Delete completed" ), + 0, items, 0 ); + connect( m_deleteCompleteAction, SIGNAL(activated()), this, SLOT(slotDeleteCompleted()) ); + + insertItemMenuItems( items ); + + // Insert View menu items + items = new QActionGroup( this, QString::null, false ); + m_completedAction = new QAction( QString::null, QWidget::tr("Show completed tasks"), - 0, this, 0, TRUE ); - m_completedAction->addTo( m_options ); + 0, items, 0, true ); m_completedAction->setOn( showCompleted() ); - connect(m_completedAction, SIGNAL( toggled(bool) ), this, SLOT(slotShowCompleted(bool) ) ); + connect( m_completedAction, SIGNAL(toggled(bool)), this, SLOT(slotShowCompleted(bool)) ); - a = new QAction( QString::null, QWidget::tr("Show only over-due tasks"), - 0, this, 0, TRUE ); - a->addTo( m_options ); + QAction *a = new QAction( QString::null, QWidget::tr("Show only over-due tasks"), + 0, items, 0, true ); a->setOn( showOverDue() ); - connect(a, SIGNAL(toggled(bool)), this, SLOT(slotShowDue(bool) ) ); + connect( a, SIGNAL(toggled(bool)), this, SLOT(slotShowDue(bool)) ); m_showDeadLineAction = new QAction( QString::null, QWidget::tr("Show task deadlines"), - 0, this, 0, TRUE ); - m_showDeadLineAction->addTo( m_options ); + 0, items, 0, true ); m_showDeadLineAction->setOn( showDeadline() ); - connect(m_showDeadLineAction, SIGNAL(toggled(bool) ), this, SLOT( slotShowDeadLine(bool) ) ); + connect( m_showDeadLineAction, SIGNAL(toggled(bool)), this, SLOT(slotShowDeadLine(bool)) ); m_showQuickTaskAction = new QAction( QString::null, QWidget::tr("Show quick task bar"), - 0, this, 0, TRUE ); - m_showQuickTaskAction->addTo( m_options ); + 0, items, 0, true ); m_showQuickTaskAction->setOn( showQuickTask() ); - connect(m_showQuickTaskAction, SIGNAL( toggled(bool) ), this, SLOT(slotShowQuickTask(bool) ) ); - - m_options->insertSeparator(); - - m_bar->insertItem( QWidget::tr("Data") ,m_edit ); - m_bar->insertItem( QWidget::tr("Category"), m_catMenu ); - m_bar->insertItem( QWidget::tr("Options"), m_options ); - - m_curQuick = new QuickEditImpl( this, m_quicktask ); - addToolBar( (QToolBar *)m_curQuick->widget(), QWidget::tr( "QuickEdit" ), QMainWindow::Top, TRUE ); - m_curQuick->signal()->connect( this, SLOT(slotQuickEntered() ) ); - + connect( m_showQuickTaskAction, SIGNAL(toggled(bool)), this, SLOT(slotShowQuickTask(bool)) ); + + insertViewMenuItems( items ); } /* m_curCat from Config */ void MainWindow::initConfig() { Config config( "todo" ); config.setGroup( "View" ); - m_completed = config.readBoolEntry( "ShowComplete", TRUE ); - m_curCat = config.readEntry( "Category", QString::null ); - m_deadline = config.readBoolEntry( "ShowDeadLine", TRUE); - m_overdue = config.readBoolEntry("ShowOverDue", FALSE ); - m_quicktask = config.readBoolEntry("ShowQuickTask", TRUE); + m_completed = config.readBoolEntry( "ShowComplete", true ); + m_curCat = config.readEntry( "Category", QString::null ); + m_deadline = config.readBoolEntry( "ShowDeadLine", true); + m_overdue = config.readBoolEntry("ShowOverDue", false ); + m_quicktask = config.readBoolEntry("ShowQuickTask", true); } void MainWindow::initUI() { - + // Create main widget stack m_stack = new Opie::Ui::OWidgetStack(this, "main stack"); - setCentralWidget( m_stack ); - - setToolBarsMovable( FALSE ); - - QToolBar *menubarholder = new QToolBar( this ); - menubarholder->setHorizontalStretchable( TRUE ); - m_bar = new QMenuBar( menubarholder ); - - m_tool = new QToolBar( this ); - - /** QPopupMenu */ - m_edit = new QPopupMenu( this ); - m_options = new QPopupMenu( this ); - m_catMenu = new QPopupMenu( this ); - m_template = new QPopupMenu( this ); - - m_catMenu->setCheckable( TRUE ); - m_template->setCheckable( TRUE ); - - connect(m_catMenu, SIGNAL(activated(int) ), - this, SLOT(setCategory(int) ) ); - connect(m_template, SIGNAL(activated(int) ), - this, SLOT(slotNewFromTemplate(int) ) ); + connect( this, SIGNAL(categorySelected(const QString&)), + this, SLOT(setCategory(const QString&)) ); + + // Create quick task toolbar + m_curQuick = new QuickEditImpl( this, m_quicktask ); + addToolBar( (QToolBar *)m_curQuick->widget(), QWidget::tr( "QuickEdit" ), + QMainWindow::Top, true ); + m_curQuick->signal()->connect( this, SLOT(slotQuickEntered()) ); } void MainWindow::initViews() { TableView* tableView = new TableView( this, m_stack ); QWhatsThis::add( tableView, QWidget::tr( "This is a listing of all current tasks.\n\nThe list displays the following information:\n1. Completed - A green checkmark indicates task is completed. Click here to complete a task.\n2. Priority - a graphical representation of task priority. Double-click here to modify.\n3. Description - description of task. Click here to select the task.\n4. Deadline - shows when task is due. This column can be shown or hidden by selecting Options->'Show task deadlines' from the menu above." ) ); m_stack->addWidget( tableView, m_counter++ ); m_views.append( tableView ); m_curView = tableView; connectBase( tableView ); /* add QString type + QString configname to * the View menu * and subdirs for multiple views */ } void MainWindow::initEditor() { m_curEdit = new Editor(); } void MainWindow::initShow() { m_curShow = new TextViewShow(this, this); m_stack->addWidget( m_curShow->widget() , m_counter++ ); } MainWindow::~MainWindow() { delete templateManager(); } void MainWindow::connectBase( ViewBase* ) { // once templates and signals mix we'll use it again } -QPopupMenu* MainWindow::contextMenu( int , bool recur ) { - QPopupMenu* menu = new QPopupMenu(); - - m_editAction->addTo( menu ); - m_deleteAction->addTo( menu ); - m_duplicateAction->addTo( menu ); - - menu->insertSeparator(); - - /* - * if this event recurs we allow - * to detach it. - * remove all - */ - if ( recur ) { - ; // FIXME - } - - return menu; -} -QPopupMenu* MainWindow::options() { - return m_options; -} -QPopupMenu* MainWindow::edit() { - return m_edit; -} -QToolBar* MainWindow::toolbar() { - return m_tool; +QPopupMenu* MainWindow::contextMenu( int , bool /*recur*/ ) { + return itemContextMenu(); } OPimTodoAccess::List MainWindow::list()const { return m_todoMgr.list(); } OPimTodoAccess::List MainWindow::sorted( bool asc, int sortOrder ) { int cat = 0; - if ( m_curCat != QWidget::tr("All Categories") ) + if ( m_curCat != tr( "All" ) ) cat = currentCatId(); - if ( m_curCat == QWidget::tr("Unfiled") ) + if ( m_curCat == tr( "Unfiled" ) ) cat = -1; int filter = OPimTodoAccess::FilterCategory; if (!m_completed ) filter |= OPimTodoAccess::DoNotShowCompleted; if (m_overdue) filter |= OPimTodoAccess::OnlyOverDue; - + return m_todoMgr.sorted( asc, sortOrder, filter, cat ); } OPimTodoAccess::List MainWindow::sorted( bool asc, int sortOrder, int addFilter) { int cat = 0; - if ( m_curCat != QWidget::tr("All Categories") ) + if ( m_curCat != tr( "All" ) ) cat = currentCatId(); - if ( m_curCat == QWidget::tr("Unfiled") ) + if ( m_curCat == tr( "Unfiled" ) ) cat = -1; - + return m_todoMgr.sorted(asc, sortOrder, addFilter, cat ); } OPimTodo MainWindow::event( int uid ) { return m_todoMgr.event( uid ); } bool MainWindow::isSyncing()const { return m_syncing; } TemplateManager* MainWindow::templateManager() { return m_tempManager; } Editor* MainWindow::currentEditor() { return m_curEdit; } TodoShow* MainWindow::currentShow() { return m_curShow; } void MainWindow::slotReload() { - m_syncing = FALSE; + m_syncing = false; m_todoMgr.reload(); currentView()->updateView( ); raiseCurrentView(); } void MainWindow::closeEvent( QCloseEvent* e ) { if (m_stack->visibleWidget() == currentShow()->widget() ) { m_showing = false; raiseCurrentView(); e->ignore(); return; } /* * we should have flushed and now we're still saving * so there is no need to flush */ if (m_syncing ) { e->accept(); return; } bool quit = false; if ( m_todoMgr.saveAll() ){ quit = true; }else { if ( QMessageBox::critical( this, QWidget::tr("Out of space"), QWidget::tr("Todo was unable\n" "to save your changes.\n" "Free up some space\n" "and try again.\n" "\nQuit Anyway?"), QMessageBox::Yes|QMessageBox::Escape, QMessageBox::No|QMessageBox::Default) != QMessageBox::No ) { e->accept(); quit = true; }else e->ignore(); } if (quit ) { Config config( "todo" ); config.setGroup( "View" ); config.writeEntry( "ShowComplete", showCompleted() ); config.writeEntry( "Category", currentCategory() ); config.writeEntry( "ShowDeadLine", showDeadline()); config.writeEntry( "ShowOverDue", showOverDue() ); config.writeEntry( "ShowQuickTask", showQuickTask() ); /* save templates */ templateManager()->save(); e->accept(); QTimer::singleShot(0, qApp, SLOT(closeAllWindows()) ); } } -void MainWindow::populateTemplates() { - m_template->clear(); - QStringList list = templateManager()->templates(); - QStringList::Iterator it; - for ( it = list.begin(); it != list.end(); ++it ) { - m_template->insertItem( (*it) ); - } -} -/* - * slotNewFromTemplate - * We use the edit widget to do - * the config but we setUid(1) - * to get a new uid - */ -/* - * first we get the name of the template - * then we will use the TemplateManager - */ -void MainWindow::slotNewFromTemplate( int id ) { - QString name = m_template->text( id ); - - OPimTodo event = templateManager()->templateEvent( name ); - event = currentEditor()->edit(this, - event ); - - if ( currentEditor()->accepted() ) { - /* assign new todo */ - event.setUid( 1 ); - handleAlarms( OPimTodo(), event ); - m_todoMgr.add( event ); - currentView()->addEvent( event ); - - populateCategories(); +void MainWindow::slotItemNew() { + NewTaskDlg dlg( templateManager()->templates(), this ); + if ( QPEApplication::execDialog( &dlg ) == QDialog::Accepted ) { + QString tempName = dlg.tempSelected(); + if ( tempName.isNull() ) + // Create new, blank task + create(); + else { + // Create new task from the template selected + OPimTodo event = templateManager()->templateEvent( tempName ); + event = currentEditor()->edit( this, event ); + if ( currentEditor()->accepted() ) { + event.setUid( 1 ); + handleAlarms( OPimTodo(), event ); + m_todoMgr.add( event ); + currentView()->addEvent( event ); + + reloadCategories(); + } + raiseCurrentView(); + } } - raiseCurrentView(); } -void MainWindow::slotNew() { - create(); +void MainWindow::slotItemEdit() { + slotEdit( currentView()->current() ); } -void MainWindow::slotDuplicate() { +void MainWindow::slotItemDuplicate() { if(m_syncing) { QMessageBox::warning(this, QWidget::tr("Todo"), QWidget::tr("Data can not be edited, currently syncing")); return; } OPimTodo ev = m_todoMgr.event( currentView()->current() ); /* let's generate a new uid */ ev.setUid(1); m_todoMgr.add( ev ); currentView()->addEvent( ev ); raiseCurrentView(); } -void MainWindow::slotDelete() { +void MainWindow::slotItemDelete() { if (!currentView()->current() ) return; if(m_syncing) { QMessageBox::warning(this, QWidget::tr("Todo"), QWidget::tr("Data can not be edited, currently syncing")); return; } QString strName = currentView()->currentRepresentation(); if (!QPEMessageBox::confirmDelete(this, QWidget::tr("Todo"), strName ) ) return; handleAlarms( m_todoMgr.event( currentView()->current() ), OPimTodo() ); m_todoMgr.remove( currentView()->current() ); currentView()->removeEvent( currentView()->current() ); raiseCurrentView(); } + +static const char *beamfile = "/tmp/opie-todo.vcs"; +void MainWindow::slotItemBeam() { + beam( currentView()->current() ); +} +void MainWindow::slotItemFind() { +} +void MainWindow::slotConfigure() { + TemplateDialogImpl dlg( this, m_tempManager ); + if ( QPEApplication::execDialog( &dlg ) != QDialog::Accepted ) + m_tempManager->load(); +} void MainWindow::slotDelete(int uid ) { if( uid == 0 ) return; if(m_syncing) { QMessageBox::warning(this, QWidget::tr("Todo"), QWidget::tr("Data can not be edited, currently syncing")); return; } OPimTodo to = m_todoMgr.event(uid); if (!QPEMessageBox::confirmDelete(this, QWidget::tr("Todo"), to.toShortText() ) ) return; handleAlarms(to, OPimTodo() ); m_todoMgr.remove( to.uid() ); currentView()->removeEvent( to.uid() ); raiseCurrentView(); } void MainWindow::slotDeleteAll() { if(m_syncing) { QMessageBox::warning(this, QWidget::tr("Todo"), QWidget::tr("Data can not be edited, currently syncing")); return; } if ( !QPEMessageBox::confirmDelete( this, QWidget::tr( "Todo" ), QWidget::tr("all tasks?") ) ) return; m_todoMgr.removeAll(); currentView()->clear(); raiseCurrentView(); } void MainWindow::slotDeleteCompleted() { if(m_syncing) { QMessageBox::warning(this, QWidget::tr("Todo"), QWidget::tr("Data can not be edited, currently syncing")); return; } if ( !QPEMessageBox::confirmDelete( this, QWidget::tr( "Todo" ), QWidget::tr("all completed tasks?") ) ) return; m_todoMgr.removeCompleted(); currentView()->updateView( ); } -void MainWindow::slotFind() { - -} -void MainWindow::slotEdit() { - slotEdit( currentView()->current() ); -} /* * set the category */ -void MainWindow::setCategory( int c) { - if ( c <= 0 ) return; - - - for ( unsigned int i = 1; i < m_catMenu->count(); i++ ) - m_catMenu->setItemChecked(i, c == (int)i ); - - if (c == 1 ) { +void MainWindow::setCategory( const QString &category ) { + m_curCat = category; + if ( m_curCat == tr( "All" ) ) m_curCat = QString::null; - setCaption( QWidget::tr("Todo") + " - " + QWidget::tr("All Categories" ) ); - - }else if ( c == (int)m_catMenu->count() - 1 ) { - m_curCat = QWidget::tr("Unfiled"); - setCaption( QWidget::tr("Todo") + " - " + QWidget::tr("Unfiled") ); - }else { - m_curCat = m_todoMgr.categories()[c-2]; - setCaption( QWidget::tr("Todo") + " - " + m_curCat ); - } - m_catMenu->setItemChecked( c, true ); - + currentView()->setShowCategory( m_curCat ); raiseCurrentView(); } void MainWindow::slotShowDeadLine( bool dead) { m_deadline = dead; currentView()->setShowDeadline( dead ); } void MainWindow::slotShowCompleted( bool show) { m_completed = show; currentView()->setShowCompleted( m_completed ); } void MainWindow::slotShowQuickTask( bool show ) { m_quicktask = show; if ( m_quicktask ) m_curQuick->widget()->show(); else m_curQuick->widget()->hide(); } bool MainWindow::showOverDue()const { return m_overdue; } void MainWindow::setDocument( const QString& fi) { DocLnk doc(fi); if (doc.isValid() ) receiveFile(doc.file() ); else receiveFile(fi ); } - -static const char *beamfile = "/tmp/opie-todo.vcs"; -void MainWindow::slotBeam() { - beam( currentView()->current() ); -} void MainWindow::beamDone( Ir* ir) { delete ir; ::unlink( beamfile ); } void MainWindow::receiveFile( const QString& filename ) { OPimTodoAccessVCal* cal = new OPimTodoAccessVCal(filename ); OPimTodoAccess acc( cal ); acc.load(); OPimTodoAccess::List list = acc.allRecords(); if (list.count()){ QString message = QWidget::tr("<P>%1 new tasks arrived.<p>Would you like to add them to your Todolist?").arg(list.count() ); if ( QMessageBox::information(this, QWidget::tr("New Tasks"), message, QMessageBox::Ok, QMessageBox::Cancel ) == QMessageBox::Ok ) { OPimTodoAccess::List::Iterator it; for ( it = list.begin(); it != list.end(); ++it ) m_todoMgr.add( (*it) ); currentView()->updateView(); } } } void MainWindow::slotFlush() { - m_syncing = TRUE; + m_syncing = true; m_todoMgr.save(); } void MainWindow::slotShowDetails() { slotShow( currentView()->current() ); } -/* - * populate the Categories - * Menu - */ -void MainWindow::populateCategories() { - m_todoMgr.load(); - - m_catMenu->clear(); - int id, rememberId; - id = 1; - rememberId = 1; - - m_catMenu->insertItem( QWidget::tr( "All Categories" ), id++ ); - m_catMenu->insertSeparator(); - QStringList categories = m_todoMgr.categories(); - categories.append( QWidget::tr( "Unfiled" ) ); - for ( QStringList::Iterator it = categories.begin(); - it != categories.end(); ++it ) { - m_catMenu->insertItem( *it, id ); - if ( *it == currentCategory() ) - rememberId = id; - ++id; - } - setCategory( rememberId ); -} bool MainWindow::showCompleted()const { return m_completed; } bool MainWindow::showDeadline()const { return m_deadline; } bool MainWindow::showQuickTask()const { return m_quicktask; } QString MainWindow::currentCategory()const { return m_curCat; } int MainWindow::currentCatId() { return m_todoMgr.catId( m_curCat ); } ViewBase* MainWindow::currentView() { return m_curView; } void MainWindow::raiseCurrentView() { // due QPE/Application/todolist show(int) // we might not have the populateCategories slot called once // we would show the otodo but then imediately switch to the currentView // if we're initially showing we shouldn't raise the table // in returnFromView we fix up m_showing if (m_showing ) return; m_stack->raiseWidget( m_curView->widget() ); } void MainWindow::slotShowDue(bool ov) { m_overdue = ov; currentView()->showOverDue( ov ); raiseCurrentView(); @@ -680,65 +507,65 @@ void MainWindow::slotShow( int uid ) { currentShow()->slotShow( event( uid ) ); m_stack->raiseWidget( currentShow()->widget() ); } void MainWindow::slotShowNext() { int l = currentView()->next(); if (l!=0) slotShow(l); } void MainWindow::slotShowPrev() { int l = currentView()->prev(); if (l!=0) slotShow(l); } void MainWindow::slotEdit( int uid ) { if (uid == 0 ) return; if(m_syncing) { QMessageBox::warning(this, QWidget::tr("Todo"), QWidget::tr("Data can't be edited, currently syncing")); return; } OPimTodo old_todo = m_todoMgr.event( uid ); OPimTodo todo = currentEditor()->edit(this, old_todo ); /* if completed */ if ( currentEditor()->accepted() ) { handleAlarms( old_todo, todo ); m_todoMgr.update( todo.uid(), todo ); currentView()->replaceEvent( todo ); /* a Category might have changed */ - populateCategories(); + reloadCategories(); } raiseCurrentView(); } /* void MainWindow::slotUpdate1( int uid, const SmallTodo& ev) { m_todoMgr.update( uid, ev ); } */ void MainWindow::updateTodo( const OPimTodo& ev) { m_todoMgr.update( ev.uid() , ev ); } /* The view changed it's configuration * update the view menu */ void MainWindow::slotUpdate3( QWidget* ) { } void MainWindow::updateList() { m_todoMgr.updateList(); } void MainWindow::setReadAhead( uint count ) { if (m_todoMgr.todoDB() ) m_todoMgr.todoDB()->setReadAhead( count ); } void MainWindow::slotQuickEntered() { OPimTodo todo = quickEditor()->todo(); if (todo.isEmpty() ) return; m_todoMgr.add( todo ); currentView()->addEvent( todo ); @@ -829,122 +656,122 @@ void MainWindow::slotComplete( const OPimTodo& todo ) { raiseCurrentView(); } void MainWindow::flush() { slotFlush(); } void MainWindow::reload() { slotReload(); } int MainWindow::create() { int uid = 0; if(m_syncing) { QMessageBox::warning(this, QWidget::tr("Todo"), QWidget::tr("Data can not be edited, currently syncing")); return uid; } m_todoMgr.load(); OPimTodo todo = currentEditor()->newTodo( currentCatId(), this ); if ( currentEditor()->accepted() ) { //todo.assignUid(); uid = todo.uid(); handleAlarms( OPimTodo(), todo ); m_todoMgr.add( todo ); currentView()->addEvent( todo ); // I'm afraid we must call this every time now, otherwise // spend expensive time comparing all these strings... // but only call if we changed something -zecke - populateCategories(); + reloadCategories(); } raiseCurrentView( ); return uid; } /* delete it silently... */ bool MainWindow::remove( int uid ) { if (m_syncing) return false; /* argh need to get the whole OEvent... to disable alarms -zecke */ handleAlarms( OPimTodo(), m_todoMgr.event( uid ) ); return m_todoMgr.remove( uid ); } void MainWindow::beam( int uid) { if( uid == 0 ) return; ::unlink( beamfile ); m_todoMgr.load(); OPimTodo todo = event( uid ); OPimTodoAccessVCal* cal = new OPimTodoAccessVCal(QString::fromLatin1(beamfile) ); OPimTodoAccess acc( cal ); acc.load(); acc.add( todo ); acc.save(); Ir* ir = new Ir(this ); connect(ir, SIGNAL(done(Ir*) ), this, SLOT(beamDone(Ir*) ) ); ir->send(beamfile, todo.summary(), "text/x-vCalendar" ); } void MainWindow::show( int uid ) { m_todoMgr.load(); // might not be loaded yet m_showing = true; slotShow( uid ); raise(); QPEApplication::setKeepRunning(); } void MainWindow::edit( int uid ) { m_todoMgr.load(); slotEdit( uid ); } void MainWindow::add( const OPimRecord& rec) { OPimTodo test; if ( rec.rtti() != test.rtti() ) return; m_todoMgr.load(); // might not be loaded const OPimTodo& todo = static_cast<const OPimTodo&>(rec); m_todoMgr.add(todo ); currentView()->addEvent( todo ); // I'm afraid we must call this every time now, otherwise // spend expensive time comparing all these strings... // but only call if we changed something -zecke - populateCategories(); + reloadCategories(); } void MainWindow::slotReturnFromView() { m_showing = false; raiseCurrentView(); } namespace { OPimNotifyManager::Alarms findNonMatching( const OPimNotifyManager::Alarms& oldAls, const OPimNotifyManager::Alarms& newAls ) { OPimNotifyManager::Alarms nonMatching; OPimNotifyManager::Alarms::ConstIterator oldIt = oldAls.begin(); OPimNotifyManager::Alarms::ConstIterator newIt; for ( ; oldIt != oldAls.end(); ++oldIt ) { bool found = false; QDateTime oldDt = (*oldIt).dateTime(); for (newIt= newAls.begin(); newIt != newAls.end(); ++newIt ) { if ( oldDt == (*newIt).dateTime() ) { found = true; break; } } if (!found) nonMatching.append( (*oldIt) ); } return nonMatching; } void addAlarms( const OPimNotifyManager::Alarms& als, int uid ) { OPimNotifyManager::Alarms::ConstIterator it; for ( it = als.begin(); it != als.end(); ++it ) { AlarmServer::addAlarm( (*it).dateTime(), "QPE/Application/todolist", "alarm(QDateTime,int)", uid ); } @@ -975,58 +802,58 @@ void MainWindow::handleAlarms( const OPimTodo& oldTodo, const OPimTodo& newTodo) OPimNotifyManager::Alarms added; if ( oldTodo.isEmpty() || !oldTodo.hasNotifiers() ) added = newTodo.notifiers().alarms(); else added = findNonMatching( newTodo.notifiers().alarms(), oldTodo.notifiers().alarms() ); addAlarms( added, newTodo.uid() ); } } /* we might have not loaded the db */ void MainWindow::doAlarm( const QDateTime& dt, int uid ) { m_todoMgr.load(); OPimTodo todo = m_todoMgr.event( uid ); if (!todo.hasNotifiers() ) return; /* * let's find the right alarm and find out if silent * then show a richtext widget */ bool loud = false; OPimNotifyManager::Alarms als = todo.notifiers().alarms(); OPimNotifyManager::Alarms::Iterator it; for ( it = als.begin(); it != als.end(); ++it ) { if ( (*it).dateTime() == dt ) { loud = ( (*it).sound() == OPimAlarm::Loud ); break; } } if (loud) startAlarm(); - QDialog dlg(this, 0, TRUE ); + QDialog dlg(this, 0, true ); QVBoxLayout* lay = new QVBoxLayout( &dlg ); QTextView* view = new QTextView( &dlg ); lay->addWidget( view ); QPushButton* btnOk = new QPushButton( tr("Ok"), &dlg ); connect( btnOk, SIGNAL(clicked() ), &dlg, SLOT(accept() ) ); lay->addWidget( btnOk ); QString text = tr("<h1>Alarm at %1</h1><br>").arg( TimeString::dateString( dt ) ); text += todo.toRichText(); view->setText( text ); bool needToStay = QPEApplication::execDialog( &dlg ); if (loud) killAlarm(); if (needToStay) { // showMaximized(); // raise(); QPEApplication::setKeepRunning(); // setActiveWindow(); } } diff --git a/core/pim/todo/mainwindow.h b/core/pim/todo/mainwindow.h index f0d6a42..c0fe805 100644 --- a/core/pim/todo/mainwindow.h +++ b/core/pim/todo/mainwindow.h @@ -1,211 +1,198 @@ /* - =. This file is part of the OPIE Project - .=l. Copyright (c) 2002 Holger Freyther <zecke@handhelds.org> - .>+-= - _;:, .> :=|. This program is free software; you can -.> <`_, > . <= redistribute it and/or modify it under -:`=1 )Y*s>-.-- : the terms of the GNU General Public -.="- .-=="i, .._ License as published by the Free Software - - . .-<_> .<> Foundation; either version 2 of the License, - ._= =} : or (at your option) any later version. - .%`+i> _;_. - .i_,=:_. -<s. This program is distributed in the hope that - + . -:. = it will be useful, but WITHOUT ANY WARRANTY; - : .. .:, . . . without even the implied warranty of - =_ + =;=|` MERCHANTABILITY or FITNESS FOR A - _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU -..}^=.= = ; Library General Public License for more -++= -. .` .: details. - : = ...= . :.=- - -. .:....=;==+<; You should have received a copy of the GNU - -_. . . )=. = Library General Public License along with - -- :-=` this library; see the file COPYING.LIB. + =. This file is part of the OPIE Project + .=l. Copyright (c) 2002 Holger Freyther <zecke@handhelds.org> + .>+-= +_;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU General Public +.="- .-=="i, .._ License as published by the Free Software +- . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. +: = ...= . :.=- +-. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TODO_MAIN_WINDOW_H #define TODO_MAIN_WINDOW_H #include <qlist.h> #include <opie2/otodoaccess.h> #include <opie2/opimtodo.h> #include <opie2/opimmainwindow.h> #include <opie2/owidgetstack.h> #include "smalltodo.h" #include "todoview.h" #include "quickedit.h" #include "todomanager.h" class QPopupMenu; class QMenuBar; class QToolBar; class QAction; class Ir; class QVBox; class QLineEdit; namespace Todo { typedef TodoView View; class TemplateManager; class Editor; class TodoShow; - class TemplateEditor; struct QuickEditBase; class MainWindow : public Opie::OPimMainWindow { Q_OBJECT friend class TodoView; // avoid QObject here.... friend class TodoShow; // avoid QObject public: /* Opie::Core::OApplicationFactory application Name */ static QString appName() { return QString::fromLatin1("todolist"); } MainWindow( QWidget *parent = 0, const char* name = 0, WFlags fl = 0 ); ~MainWindow(); /** return a context menu for an OPimTodo */ QPopupMenu* contextMenu(int uid, bool doesRecur = FALSE ); - QPopupMenu* options(); - QPopupMenu* edit(); - QToolBar* toolbar(); - void updateList(); OPimTodoAccess::List list()const; OPimTodoAccess::List sorted( bool asc, int sortOrder ); OPimTodoAccess::List sorted( bool asc, int sortOrder, int addFilter ); OPimTodo event(int uid ); bool isSyncing()const; bool showCompleted()const; bool showDeadline()const; bool showOverDue()const; bool showQuickTask()const; QString currentCategory()const; int currentCatId(); TemplateManager* templateManager(); QuickEditBase* quickEditor(); void updateTodo( const OPimTodo& ); - void populateTemplates(); Editor* currentEditor(); void setReadAhead(uint count ); private slots: void slotQuickEntered(); - void populateCategories(); void slotReload(); void slotFlush(); protected: void closeEvent( QCloseEvent* e ); private: /* handle setting and removing alarms */ void handleAlarms( const OPimTodo& oldTodo, const OPimTodo& newTodo ); void receiveFile( const QString& filename ); void connectBase( ViewBase* ); void initUI(); void initActions(); void initConfig(); void initViews(); void initEditor(); void initShow(); - void initTemplate(); void raiseCurrentView(); ViewBase* currentView(); ViewBase* m_curView; bool m_showing : 1; // used to see if we show a todo in the cases we shouldn't change the table QuickEditBase* m_curQuick; Editor* m_curEdit; TodoShow* currentShow(); TodoShow* m_curShow; - TemplateEditor* currentTemplateEditor(); - TemplateEditor* m_curTempEd; - QMenuBar* m_bar; - QToolBar* m_tool; QAction* m_editAction, *m_deleteAction, *m_findAction, *m_completedAction, *m_showDeadLineAction, *m_deleteAllAction, *m_deleteCompleteAction, *m_duplicateAction, *m_showOverDueAction, *m_showQuickTaskAction, *m_effectiveAction; Opie::Ui::OWidgetStack *m_stack; - QPopupMenu* m_catMenu, - *m_edit, - *m_options, - *m_template; bool m_syncing:1; bool m_deadline:1; bool m_completed:1; bool m_overdue:1; bool m_quicktask:1; TodoManager m_todoMgr; QString m_curCat; QList<ViewBase> m_views; uint m_counter; TemplateManager* m_tempManager; private slots: + void initStuff(); + + void slotItemNew(); + void slotItemEdit(); + void slotItemDuplicate(); + void slotItemDelete(); + void slotItemBeam(); + void slotItemFind(); + void slotConfigure(); + void slotShow(int); void slotEdit(int); void slotUpdate3( QWidget* ); void slotComplete( int uid ); void slotComplete( const OPimTodo& ev ); - void slotNewFromTemplate(int id ); - void slotNew(); - void slotDuplicate(); - void slotDelete(); void slotDelete(int uid ); void slotDeleteAll(); void slotDeleteCompleted(); - void slotEdit(); - void slotFind(); - void setCategory( int ); + void setCategory( const QString &category ); void slotShowDeadLine( bool ); void slotShowCompleted( bool ); void slotShowQuickTask( bool ); void setDocument( const QString& ); - void slotBeam(); void beamDone( Ir* ); void slotShowDetails(); void slotShowNext(); void slotShowPrev(); void slotShowDue( bool ); void slotReturnFromView(); // for TodoShow... /* reimplementation from opimmainwindow */ protected slots: void flush(); void reload(); int create(); bool remove( int uid ); void beam(int uid); void show( int uid ); void edit( int uid ); void add( const Opie::OPimRecord& ); void doAlarm( const QDateTime& dt, int uid ); }; } #endif diff --git a/core/pim/todo/newtaskdlg.cpp b/core/pim/todo/newtaskdlg.cpp new file mode 100644 index 0000000..0b5a29d --- a/dev/null +++ b/core/pim/todo/newtaskdlg.cpp @@ -0,0 +1,78 @@ +/* + =. This file is part of the OPIE Project + .=l. Copyright (c) 2005 Dan Williams <drw@handhelds.org> + .>+-= +_;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU General Public +.="- .-=="i, .._ License as published by the Free Software +- . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. +: = ...= . :.=- +-. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#include "newtaskdlg.h" + +#include <qbuttongroup.h> +#include <qcombobox.h> +#include <qlayout.h> +#include <qradiobutton.h> + +NewTaskDlg::NewTaskDlg( const QStringList &templates, QWidget *parent ) + : QDialog( parent, QString::null, true, WStyle_ContextHelp ) +{ + setCaption( tr( "New Task" ) ); + + QButtonGroup *bg = new QButtonGroup( this ); + bg->hide(); + + QVBoxLayout *layout = new QVBoxLayout( this, 10, 3 ); + + QRadioButton *btn = new QRadioButton( tr( "Blank task" ), this ); + btn->setChecked( true ); + bg->insert( btn ); + layout->addWidget( btn ); + + layout->addStretch(); + + m_useTemplate = new QRadioButton( tr( "Using template:" ), this ); + connect( m_useTemplate, SIGNAL(toggled(bool)), this, SLOT(slotUseTemplate(bool)) ); + bg->insert( m_useTemplate ); + layout->addWidget( m_useTemplate ); + + m_templateList = new QComboBox( this ); + m_templateList->insertStringList( templates ); + m_templateList->setEnabled( false ); + layout->addWidget( m_templateList ); + + layout->addStretch(); +} + +QString NewTaskDlg::tempSelected() { + QString tempStr; + if ( m_useTemplate->isChecked() ) + tempStr = m_templateList->currentText(); + + return tempStr; +} + +void NewTaskDlg::slotUseTemplate( bool on ) { + m_templateList->setEnabled( on ); + if ( on ) + m_templateList->setFocus(); +} diff --git a/core/pim/todo/newtaskdlg.h b/core/pim/todo/newtaskdlg.h new file mode 100644 index 0000000..31398b3 --- a/dev/null +++ b/core/pim/todo/newtaskdlg.h @@ -0,0 +1,56 @@ +/* + =. This file is part of the OPIE Project + .=l. Copyright (c) 2002 <> + .>+-= +_;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU General Public +.="- .-=="i, .._ License as published by the Free Software +- . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. +: = ...= . :.=- +-. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = General Public License along with + -- :-=` this library; see the file COPYING.LIB. + If not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. + +*/ + +#ifndef NEWTASKDLG_H +#define NEWTASKDLG_H + +#include <qdialog.h> + +#include <qstringlist.h> + +class QComboBox; +class QRadioButton; + +class NewTaskDlg : public QDialog +{ + Q_OBJECT + +public: + NewTaskDlg( const QStringList &templates, QWidget *parent = 0l ); + + QString tempSelected(); + +private: + QRadioButton *m_useTemplate; + QComboBox *m_templateList; + +private slots: + void slotUseTemplate( bool on ); +}; + +#endif diff --git a/core/pim/todo/tableview.cpp b/core/pim/todo/tableview.cpp index 221faca..c64ad46 100644 --- a/core/pim/todo/tableview.cpp +++ b/core/pim/todo/tableview.cpp @@ -1,72 +1,72 @@ /* - =. This file is part of the OPIE Project - .=l. Copyright (c) 2002 <zecke> - .>+-= - _;:, .> :=|. This program is free software; you can -.> <`_, > . <= redistribute it and/or modify it under -:`=1 )Y*s>-.-- : the terms of the GNU General Public -.="- .-=="i, .._ License as published by the Free Software - - . .-<_> .<> Foundation; either version 2 of the License, - ._= =} : or (at your option) any later version. - .%`+i> _;_. - .i_,=:_. -<s. This program is distributed in the hope that - + . -:. = it will be useful, but WITHOUT ANY WARRANTY; - : .. .:, . . . without even the implied warranty of - =_ + =;=|` MERCHANTABILITY or FITNESS FOR A - _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU -..}^=.= = ; Library General Public License for more -++= -. .` .: details. - : = ...= . :.=- - -. .:....=;==+<; You should have received a copy of the GNU - -_. . . )=. = Library General Public License along with - -- :-=` this library; see the file COPYING.LIB. + =. This file is part of the OPIE Project + .=l. Copyright (c) 2002 <zecke> + .>+-= +_;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU General Public +.="- .-=="i, .._ License as published by the Free Software +- . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. +: = ...= . :.=- +-. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <stdlib.h> #include <cmath> #include <cctype> #include <opie2/odebug.h> #include <opie2/opimrecurrence.h> #include <qpe/config.h> +#include <qpe/qpeapplication.h> #include <qpe/resource.h> #include <qcombobox.h> #include <qlineedit.h> -#include <qtimer.h> #include <qpopupmenu.h> #include "mainwindow.h" //#include "tableitems.h" #include "tableview.h" using namespace Todo; namespace { static const int BoxSize = 14; static const int RowHeight = 20; } TableView::EditorWidget::EditorWidget() : m_wid(0l), m_row(-1), m_col(-1) { } void TableView::EditorWidget::setCellWidget(QWidget* wid, int row, int col ) { m_wid = wid; m_row = row; m_col = col; } void TableView::EditorWidget::releaseCellWidget() { m_wid = 0; m_row = m_col = -1; } QWidget* TableView::EditorWidget::cellWidget()const { return m_wid; } int TableView::EditorWidget::cellRow()const { return m_row; } int TableView::EditorWidget::cellCol()const { return m_col; @@ -88,109 +88,99 @@ TableView::TableView( MainWindow* window, QWidget* wid ) setName("TableView"); // Load icons // TODO - probably should be done globally somewhere else, // see also quickeditimpl.cpp/h, taskeditoroverview.cpp/h m_pic_completed = Resource::loadPixmap( "todo/completed" ); QString namestr; for ( unsigned int i = 1; i < 6; i++ ) { namestr = "todo/priority"; namestr.append( QString::number( i ) ); m_pic_priority[ i - 1 ] = Resource::loadPixmap( namestr ); } setUpdatesEnabled( false ); viewport()->setUpdatesEnabled( false ); m_enablePaint = false; setNumRows(0); setNumCols(4); horizontalHeader()->setLabel( 0, QWidget::tr("C.") ); horizontalHeader()->setLabel( 1, QWidget::tr("Priority") ); horizontalHeader()->setLabel( 2, QWidget::tr("Summary" ) ); horizontalHeader()->setLabel( 3, QWidget::tr("Deadline") ); setShowDeadline( todoWindow()->showDeadline() ); setSorting( TRUE ); setSelectionMode( NoSelection ); setLeftMargin( 0 ); verticalHeader()->hide(); + QPEApplication::setStylusOperation( viewport(), QPEApplication::RightOnHold ); connect((QTable*)this, SIGNAL( clicked(int,int,int,const QPoint&) ), this, SLOT( slotClicked(int,int,int,const QPoint&) ) ); - connect((QTable*)this, SIGNAL( pressed(int,int,int,const QPoint&) ), - this, SLOT( slotPressed(int,int,int,const QPoint&) ) ); connect((QTable*)this, SIGNAL(valueChanged(int,int) ), this, SLOT( slotValueChanged(int,int) ) ); connect((QTable*)this, SIGNAL(currentChanged(int,int) ), this, SLOT( slotCurrentChanged(int,int) ) ); - m_menuTimer = new QTimer( this ); - connect( m_menuTimer, SIGNAL(timeout()), - this, SLOT(slotShowMenu()) ); - /* now let's init the config */ initConfig(); m_enablePaint = true; setUpdatesEnabled( true ); viewport()->setUpdatesEnabled( true ); viewport()->update(); setSortOrder( Opie::OPimTodoAccess::Completed ); setAscending( TRUE ); m_first = true; } /* a new day has started * update the day */ void TableView::newDay() { clear(); updateView(); } TableView::~TableView() { Config config( "todo" ); config.setGroup( "Options" ); for (int i = 0; i < numCols(); i++ ) config.writeEntry("Width"+QString::number(i), columnWidth(i) ); } -void TableView::slotShowMenu() { - QPopupMenu *menu = todoWindow()->contextMenu( current(), sorted()[currentRow()].recurrence().doesRecur() ); - menu->exec(QCursor::pos() ); - delete menu; -} QString TableView::type() const { return QString::fromLatin1( tr("Table View") ); } int TableView::current() { if (numRows() == 0 ) return 0; int uid = sorted().uidAt(currentRow() ); return uid; } int TableView::next() { if ( numRows() == 0 ) return 0; if ( currentRow() + 1 >= numRows() ) return 0; setCurrentCell( currentRow() +1, currentColumn() ); return sorted().uidAt( currentRow() ); } int TableView::prev() { if ( numRows() == 0 ) return 0; if ( currentRow() - 1 < 0 ) return 0; setCurrentCell( currentRow() -1, currentColumn() ); return sorted().uidAt( currentRow() ); } QString TableView::currentRepresentation() { OPimTodo to = sorted()[currentRow()]; return to.summary().isEmpty() ? to.description().left(20) : to.summary() ; } /* show overdue */ void TableView::showOverDue( bool ) { clear(); updateView(); } @@ -251,136 +241,120 @@ void TableView::replaceEvent( const OPimTodo& ev) { */ void TableView::removeEvent( int ) { updateView(); } void TableView::setShowCompleted( bool ) { updateView(); } void TableView::setShowDeadline( bool b ) { if ( b ) showColumn( 3 ); else hideColumn( 3 ); // Try to intelligently size columns // TODO - would use width() below, but doesn't have valid value at time of c'tor int col2width = 238; int width = m_pic_completed.width(); setColumnWidth( 0, width ); col2width -= width; width = fontMetrics().boundingRect( horizontalHeader()->label( 1 ) ).width() + 8; setColumnWidth( 1, width ); col2width -= width; if ( b ) { width = fontMetrics().boundingRect( horizontalHeader()->label( 3 ) ).width() + 8; setColumnWidth( 3, width ); col2width -= width; } setColumnWidth( 2, col2width ); } void TableView::setShowCategory( const QString& str) { if ( str != m_oleCat || m_first ) updateView(); - + m_oleCat = str; m_first = false; - } void TableView::clear() { setNumRows(0); } void TableView::slotClicked(int row, int col, int, const QPoint& point) { if ( m_editorWidget.cellWidget() ) { //setCellContentFromEditor(m_editorWidget.cellRow(), m_editorWidget.cellCol() ); endEdit(m_editorWidget.cellRow(), m_editorWidget.cellCol(), true, true ); m_editorWidget.releaseCellWidget(); } if ( !cellGeometry(row, col ).contains(point ) ) return; int ui= sorted().uidAt( row ); switch( col ) { case 0:{ int x = point.x() -columnPos( col ); int y = point.y() -rowPos( row ); int w = columnWidth( col ); int h = rowHeight( row ); if ( x >= ( w - BoxSize ) / 2 && x <= ( w - BoxSize ) / 2 + BoxSize && y >= ( h - BoxSize ) / 2 && y <= ( h - BoxSize ) / 2 + BoxSize ) { TodoView::complete(sorted()[row] ); } } break; // Priority emit a double click... case 1:{ QWidget* wid = beginEdit( row, col, FALSE ); m_editorWidget.setCellWidget( wid, row, col ); } break; case 2: { - m_menuTimer->stop(); showTodo( ui ); break; } case 3: { - m_menuTimer->stop(); TodoView::edit( ui ); break; } } } -void TableView::slotPressed(int row, int col, int, - const QPoint& point) { - - m_prevP = point; - /* TextColumn column */ - if ( col == 2 && cellGeometry( row, col ).contains( point ) ) - m_menuTimer->start( 750, TRUE ); -} -void TableView::slotValueChanged( int, int ) { -} -void TableView::slotCurrentChanged(int, int ) { - m_menuTimer->stop(); -} QWidget* TableView::widget() { return this; } /* * We need to overwrite sortColumn * because we want to sort whole row * based * We event want to set the setOrder * to a sort() and update() */ void TableView::sortColumn( int col, bool asc, bool ) { switch(col) { case 1: col = Opie::OPimTodoAccess::Priority; break; case 2: col = Opie::OPimTodoAccess::SortSummary; break; case 3: col = Opie::OPimTodoAccess::Deadline; break; case 0: default: col = Opie::OPimTodoAccess::Completed; break; } setSortOrder( col ); setAscending( asc ); updateView(); } void TableView::viewportPaintEvent( QPaintEvent* e) { @@ -550,78 +524,84 @@ void TableView::timerEvent( QTimerEvent* ) { } else { int ro = row + 8; sorted()[ro]; ro = row-8; if (ro < 0 ) ro = 0; sorted()[ro]; } m_row = !m_row; } // We want a strike through completed ;) // durchstreichen to complete /* * MouseTracking is off this mean we only receive * these events if the mouse button is pressed * We've the previous point saved * We check if the previous and current Point are * in the same row. * Then we check if they're some pixel horizontal away * if the distance between the two points is greater than * 8 we mark the underlying todo as completed and do a repaint * * BUG: When clicking on the Due column and it's scrollable * the todo is marked as completed... * REASON: QTable is doing auto scrolling which leads to a move * in the x coordinate and this way it's able to pass the * m_completeStrokeWidth criteria * WORKAROUND: strike through needs to strike through the same * row and two columns! */ -void TableView::contentsMouseReleaseEvent( QMouseEvent* e) { +void TableView::contentsMouseReleaseEvent( QMouseEvent *e ) { int row = rowAt(m_prevP.y()); int colOld = columnAt(m_prevP.x() ); int colNew = columnAt(e->x() ); if ( row == rowAt( e->y() ) && row != -1 && colOld != colNew ) { TodoView::complete( sorted()[row] ); return; } QTable::contentsMouseReleaseEvent( e ); } -void TableView::contentsMouseMoveEvent( QMouseEvent* e ) { - m_menuTimer->stop(); - QTable::contentsMouseMoveEvent( e ); +void TableView::contentsMousePressEvent( QMouseEvent *e ) { + if ( e->button() == RightButton ) { + QPopupMenu *menu = todoWindow()->contextMenu( current(), sorted()[currentRow()].recurrence().doesRecur() ); + menu->exec( QCursor::pos() ); + } + else { + m_prevP = e->pos(); + QTable::contentsMousePressEvent( e ); + } } void TableView::keyPressEvent( QKeyEvent* event) { if ( m_editorWidget.cellWidget() ) { // setCellContentFromEditor(m_editorWidget.cellRow(), m_editorWidget.cellCol() ); endEdit(m_editorWidget.cellRow(), m_editorWidget.cellCol(), true, true ); m_editorWidget.releaseCellWidget(); setFocus(); } if ( sorted().count() < 1 ) { QTable::keyPressEvent( event ); return; } int row = currentRow(); int col = currentColumn(); char key = ::toupper( event->ascii() ); /* let QTable also handle the d letter */ if ( key == 'D' ) { event->accept(); removeQuery( sorted().uidAt( row ) ); return; } switch( event->key() ) { case Qt::Key_F33: case Qt::Key_Enter: case Qt::Key_Return: case Qt::Key_Space: diff --git a/core/pim/todo/tableview.h b/core/pim/todo/tableview.h index 7f78255..46c16e1 100644 --- a/core/pim/todo/tableview.h +++ b/core/pim/todo/tableview.h @@ -1,130 +1,124 @@ /* - =. This file is part of the OPIE Project - .=l. Copyright (c) 2002 <> - .>+-= - _;:, .> :=|. This program is free software; you can -.> <`_, > . <= redistribute it and/or modify it under -:`=1 )Y*s>-.-- : the terms of the GNU General Public -.="- .-=="i, .._ License as published by the Free Software - - . .-<_> .<> Foundation; either version 2 of the License, - ._= =} : or (at your option) any later version. - .%`+i> _;_. - .i_,=:_. -<s. This program is distributed in the hope that - + . -:. = it will be useful, but WITHOUT ANY WARRANTY; - : .. .:, . . . without even the implied warranty of - =_ + =;=|` MERCHANTABILITY or FITNESS FOR A - _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU -..}^=.= = ; Library General Public License for more -++= -. .` .: details. - : = ...= . :.=- - -. .:....=;==+<; You should have received a copy of the GNU - -_. . . )=. = Library General Public License along with - -- :-=` this library; see the file COPYING.LIB. + =. This file is part of the OPIE Project + .=l. Copyright (c) 2002 <> + .>+-= +_;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU General Public +.="- .-=="i, .._ License as published by the Free Software +- . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. +: = ...= . :.=- +-. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef OPIE_TABLE_VIEW_H #define OPIE_TABLE_VIEW_H #include <qtable.h> #include <qmap.h> #include <qpixmap.h> #include "todoview.h" class QTimer; namespace Todo { class CheckItem; class DueTextItem; class TableView : public QTable, public TodoView { Q_OBJECT public: TableView( MainWindow*, QWidget* parent ); ~TableView(); QString type()const; int current(); QString currentRepresentation(); int next(); int prev(); void clear(); void showOverDue( bool ); void updateView(); void setTodo( int uid, const OPimTodo& ); void addEvent( const OPimTodo& event ); void replaceEvent( const OPimTodo& ); void removeEvent( int uid ); void setShowCompleted( bool ); void setShowDeadline( bool ); void setShowCategory(const QString& =QString::null ); void newDay(); QWidget* widget(); void sortColumn(int, bool, bool ); /* * we do our drawing ourselves * because we don't want to have * 40.000 QTableItems for 10.000 * OPimTodos where we only show 10 at a time! */ void paintCell(QPainter* p, int row, int col, const QRect&, bool ); private: /* reimplented for internal reasons */ void viewportPaintEvent( QPaintEvent* ); - QTimer *m_menuTimer; bool m_enablePaint:1; QString m_oleCat; bool m_first : 1; QPixmap m_pic_completed; QPixmap m_pic_priority[ 5 ]; protected: void keyPressEvent( QKeyEvent* ); - void contentsMouseReleaseEvent( QMouseEvent* ); - void contentsMouseMoveEvent( QMouseEvent* ); + void contentsMouseReleaseEvent( QMouseEvent *e ); + void contentsMousePressEvent( QMouseEvent *e ); void timerEvent( QTimerEvent* e ); QWidget* createEditor(int row, int col, bool initFromCell )const; void setCellContentFromEditor( int row, int col ); /** * for inline editing on single click and to work around some * bug in qt2.3.5 */ struct EditorWidget { EditorWidget(); void setCellWidget(QWidget*, int row, int col ); void releaseCellWidget(); QWidget* cellWidget()const; int cellRow()const; int cellCol()const; private: QWidget* m_wid; int m_row, m_col; }; EditorWidget m_editorWidget; private slots: - void slotShowMenu(); void slotClicked(int, int, int, const QPoint& ); - void slotPressed(int, int, int, - const QPoint& ); - void slotValueChanged(int, int); - void slotCurrentChanged(int, int ); void slotPriority(); private: void initConfig(); int m_completeStrokeWidth; bool m_row : 1; QPoint m_prevP; }; }; #endif diff --git a/core/pim/todo/templateeditor.cpp b/core/pim/todo/templateeditor.cpp deleted file mode 100644 index ca02173..0000000 --- a/core/pim/todo/templateeditor.cpp +++ b/dev/null @@ -1,38 +0,0 @@ -#include <qaction.h> -#include <qpopupmenu.h> - -#include "mainwindow.h" -#include "todotemplatemanager.h" - -#include "templatedialogimpl.h" -#include "templateeditor.h" - -using namespace Todo; - -TemplateEditor::TemplateEditor( MainWindow* main, - TemplateManager* manager ) - : QObject( main ), m_main( main ), m_man( manager ) -{ - init(); - -} -TemplateEditor::~TemplateEditor() { - -} -/* ok we add us to the Menubar */ -void TemplateEditor::init() { - QAction* a = new QAction( QString::null, QWidget::tr("Configure Templates"), - 0, this, 0, FALSE ); - connect(a, SIGNAL(activated() ), - this, SLOT(setUp() ) ); - - a->addTo( m_main->options() ); -} -void TemplateEditor::setUp() { - TemplateDialogImpl dlg(m_main, m_man ); - int ret= dlg.exec(); - if (QDialog::Accepted != ret ) - m_man->load(); - else - m_main->populateTemplates(); -} diff --git a/core/pim/todo/templateeditor.h b/core/pim/todo/templateeditor.h deleted file mode 100644 index e551328..0000000 --- a/core/pim/todo/templateeditor.h +++ b/dev/null @@ -1,31 +0,0 @@ -#ifndef OPIE_TEMPLATE_EDITOR_H -#define OPIE_TEMPLATE_EDITOR_H - -#include <qobject.h> -#include <qdialog.h> -#include <qstring.h> - -namespace Todo { - - class MainWindow; - class TemplateManager; - class TemplateEditor : public QObject{ - Q_OBJECT - public: - TemplateEditor( MainWindow* win, - TemplateManager* man); - ~TemplateEditor(); - - signals: - void configChanged(); - private: - void init(); - MainWindow* m_main; - TemplateManager* m_man; -private slots: - void setUp(); - - }; -}; - -#endif diff --git a/core/pim/todo/todo.pro b/core/pim/todo/todo.pro index 6c082cf..9b60818 100644 --- a/core/pim/todo/todo.pro +++ b/core/pim/todo/todo.pro @@ -1,49 +1,49 @@ #TEMPLATE = app CONFIG = qt warn_on quick-app #DESTDIR = $(OPIEDIR)/bin HEADERS = smalltodo.h \ todomanager.h \ mainwindow.h \ todoview.h \ tableview.h \ todotemplatemanager.h \ todoeditor.h \ todoshow.h \ textviewshow.h \ - templateeditor.h \ templatedialog.h \ templatedialogimpl.h \ quickedit.h \ quickeditimpl.h \ otaskeditor.h \ taskeditoroverview.h \ taskeditorstatus.h \ - taskeditoralarms.h + taskeditoralarms.h \ + newtaskdlg.h SOURCES = smalltodo.cpp \ todomanager.cpp \ mainwindow.cpp \ # main.cpp \ tableview.cpp \ todoview.cpp \ todotemplatemanager.cpp \ todoeditor.cpp \ todoshow.cpp \ textviewshow.cpp \ - templateeditor.cpp \ templatedialog.cpp \ templatedialogimpl.cpp \ quickeditimpl.cpp \ quickedit.cpp \ otaskeditor.cpp \ taskeditoroverview.cpp \ taskeditorstatus.cpp \ - taskeditoralarms.cpp + taskeditoralarms.cpp \ + newtaskdlg.cpp TARGET = todolist INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += $(OPIEDIR)/include LIBS += -lqpe -lopiecore2 -lopieui2 -lopiepim2 include( $(OPIEDIR)/include.pro ) diff --git a/core/pim/todo/todomanager.cpp b/core/pim/todo/todomanager.cpp index 7136f9a..fcd5f0e 100644 --- a/core/pim/todo/todomanager.cpp +++ b/core/pim/todo/todomanager.cpp @@ -1,71 +1,72 @@ /* - =. This file is part of the OPIE Project - .=l. Copyright (c) 2002 <> - .>+-= - _;:, .> :=|. This program is free software; you can -.> <`_, > . <= redistribute it and/or modify it under -:`=1 )Y*s>-.-- : the terms of the GNU General Public -.="- .-=="i, .._ License as published by the Free Software - - . .-<_> .<> Foundation; either version 2 of the License, - ._= =} : or (at your option) any later version. - .%`+i> _;_. - .i_,=:_. -<s. This program is distributed in the hope that - + . -:. = it will be useful, but WITHOUT ANY WARRANTY; - : .. .:, . . . without even the implied warranty of - =_ + =;=|` MERCHANTABILITY or FITNESS FOR A - _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU -..}^=.= = ; Library General Public License for more -++= -. .` .: details. - : = ...= . :.=- - -. .:....=;==+<; You should have received a copy of the GNU - -_. . . )=. = Library General Public License along with - -- :-=` this library; see the file COPYING.LIB. + =. This file is part of the OPIE Project + .=l. Copyright (c) 2002 <> + .>+-= +_;:, .> :=|. This program is free software; you can +.> <`_, > . <= redistribute it and/or modify it under +:`=1 )Y*s>-.-- : the terms of the GNU General Public +.="- .-=="i, .._ License as published by the Free Software +- . .-<_> .<> Foundation; either version 2 of the License, + ._= =} : or (at your option) any later version. + .%`+i> _;_. + .i_,=:_. -<s. This program is distributed in the hope that + + . -:. = it will be useful, but WITHOUT ANY WARRANTY; + : .. .:, . . . without even the implied warranty of + =_ + =;=|` MERCHANTABILITY or FITNESS FOR A + _.=:. : :=>`: PARTICULAR PURPOSE. See the GNU +..}^=.= = ; Library General Public License for more +++= -. .` .: details. +: = ...= . :.=- +-. .:....=;==+<; You should have received a copy of the GNU + -_. . . )=. = Library General Public License along with + -- :-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <opie2/odebug.h> #include <qpe/categoryselect.h> #include "todomanager.h" using namespace Todo; TodoManager::TodoManager( QObject *obj ) : QObject( obj ) { m_db = 0l; + m_cat.load( categoryFileName() ); } TodoManager::~TodoManager() { delete m_db; } OPimTodo TodoManager::event(int uid ) { return m_db->find( uid ); } void TodoManager::updateList() { m_list = m_db->allRecords(); } OPimTodoAccess::List TodoManager::list() const{ return m_list; } OPimTodoAccess::List TodoManager::sorted( bool asc, int so, int f, int cat ) { return m_db->sorted( asc, so, f, cat ); } OPimTodoAccess::List::Iterator TodoManager::overDue() { int filter = Opie::OPimTodoAccess::FilterCategory | Opie::OPimTodoAccess::OnlyOverDue; m_list = m_db->sorted(m_asc, m_sortOrder, filter, m_ca ); m_it = m_list.begin(); return m_it; } OPimTodoAccess::List::Iterator TodoManager::fromTo( const QDate& start, const QDate& end ) { m_list = m_db->effectiveToDos( start, end ); m_it = m_list.begin(); return m_it; } OPimTodoAccess::List::Iterator TodoManager::query( const OPimTodo& ev, int query ) { m_list = m_db->queryByExample( ev, query ); m_it = m_list.begin(); return m_it; |