summaryrefslogtreecommitdiff
authordrw <drw>2005-01-30 00:32:33 (UTC)
committer drw <drw>2005-01-30 00:32:33 (UTC)
commit114c5c468032a08205b2d8b7da3966bff6d47875 (patch) (side-by-side diff)
treebbd79021246e747f7292eda140e424cf9d750ac5
parent43f82d5c68e1d7a5b26f862c26a76253a85e7518 (diff)
downloadopie-114c5c468032a08205b2d8b7da3966bff6d47875.zip
opie-114c5c468032a08205b2d8b7da3966bff6d47875.tar.gz
opie-114c5c468032a08205b2d8b7da3966bff6d47875.tar.bz2
Convert Todo to use new OPimMainWindow functionality, plus some other code clean-ups
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/pim/todo/mainwindow.cpp425
-rw-r--r--core/pim/todo/mainwindow.h77
-rw-r--r--core/pim/todo/newtaskdlg.cpp78
-rw-r--r--core/pim/todo/newtaskdlg.h56
-rw-r--r--core/pim/todo/tableview.cpp88
-rw-r--r--core/pim/todo/tableview.h52
-rw-r--r--core/pim/todo/templateeditor.cpp38
-rw-r--r--core/pim/todo/templateeditor.h31
-rw-r--r--core/pim/todo/todo.pro8
-rw-r--r--core/pim/todo/todomanager.cpp43
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,1032 +1,859 @@
/*
-               =. 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();
}
void MainWindow::slotShow( int uid ) {
if ( uid == 0 ) return;
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 );
raiseCurrentView();
}
QuickEditBase* MainWindow::quickEditor() {
return m_curQuick;
}
void MainWindow::slotComplete( int uid ) {
slotComplete( event(uid) );
}
void MainWindow::slotComplete( const OPimTodo& todo ) {
OPimTodo to = todo;
to.setCompleted( !to.isCompleted() );
to.setCompletedDate( QDate::currentDate() );
/*
* if the item does recur
* we need to spin it off
* and update the items duedate to the next
* possible recurrance of this item...
* the spinned off one will loose the
* recurrence.
* We calculate the difference between the old due date and the
* new one and add this diff to start, completed and alarm dates
* -zecke
*/
if ( to.hasRecurrence() && to.isCompleted() ) {
OPimTodo to2( to );
/* the spinned off one won't recur anymore */
to.setRecurrence( OPimRecurrence() );
OPimRecurrence rec = to2.recurrence();
rec.setStart( to.dueDate() );
to2.setRecurrence( rec );
/*
* if there is a next occurence
* from the duedate of the last recurrance
*/
QDate date;
if ( to2.recurrence().nextOcurrence( to2.dueDate().addDays(1), date ) ) {
int dayDiff = to.dueDate().daysTo( date );
QDate inval;
/* generate a new uid for the old record */
to.setUid( 1 );
/* add the old one cause it has a new UID here cause it was spin off */
m_todoMgr.add( to );
/*
* update the due date
* start date
* and complete date
*/
to2.setDueDate( date );
rec.setStart( date );
to2.setRecurrence( rec ); // could be Monday, TuesDay, Thursday every week
/* move start date */
if (to2.hasStartDate() )
to2.setStartDate( to2.startDate().addDays( dayDiff ) );
/* now the alarms */
if (to2.hasNotifiers() ) {
OPimNotifyManager::Alarms _als = to2.notifiers().alarms();
OPimNotifyManager::Alarms als;
/* for every alarm move the day */
for ( OPimNotifyManager::Alarms::Iterator it = _als.begin(); it != _als.end(); ++it ) {
OPimAlarm al = (*it);
al.setDateTime( al.dateTime().addDays( dayDiff ) );
als.append( al );
}
to2.notifiers().setAlarms( als );
handleAlarms( OPimTodo(), todo );
}
to2.setCompletedDate( inval );
to2.setCompleted( false );
updateTodo( to2 );
}else
updateTodo( to );
}else
updateTodo( to );
currentView()->updateView();
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 );
}
}
void removeAlarms( const OPimNotifyManager::Alarms& als, int uid ) {
OPimNotifyManager::Alarms::ConstIterator it;
for ( it = als.begin(); it != als.end(); ++it ) {
AlarmServer::deleteAlarm( (*it).dateTime(), "QPE/Application/todolist", "alarm(QDateTime,int)", uid );
}
}
}
void MainWindow::handleAlarms( const OPimTodo& oldTodo, const OPimTodo& newTodo) {
/*
* if oldTodo is not empty and has notifiers we need to find the deleted ones
*/
if(!oldTodo.isEmpty() && oldTodo.hasNotifiers() ) {
OPimNotifyManager::Alarms removed;
OPimNotifyManager::Alarms oldAls = oldTodo.notifiers().alarms();
if (!newTodo.hasNotifiers() )
removed = oldAls;
else
removed = findNonMatching( oldAls, newTodo.notifiers().alarms() );
removeAlarms( removed, oldTodo.uid() );
}
if ( newTodo.hasNotifiers() ) {
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,644 +1,624 @@
/*
-               =. 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;
}
void TableView::initConfig() {
Config config( "todo" );
config.setGroup( "Options" );
m_completeStrokeWidth = config.readNumEntry( "CompleteStrokeWidth", 8 );
for (int i = 0; i < numCols(); i++ ) {
int width = config.readNumEntry("Width"+QString::number(i), -1 );
setColumnWidth(i, width == -1 ? columnWidth(i) : width );
}
}
TableView::TableView( MainWindow* window, QWidget* wid )
: QTable( wid ), TodoView( window ) {
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();
}
void TableView::updateView( ) {
m_row = false;
static int id;
id = startTimer(4000 );
/* FIXME we want one page to be read!
*
* Calculate that screensize
*/
todoWindow()->setReadAhead( 4 );
sort();
OPimTodoAccess::List::Iterator it, end;
it = sorted().begin();
end = sorted().end();
QTime time;
time.start();
m_enablePaint = false;
setUpdatesEnabled( false );
viewport()->setUpdatesEnabled( false );
setNumRows( it.count() );
if ( it.count() == 0 )
killTimer(id);
// int elc = time.elapsed();
setUpdatesEnabled( true );
viewport()->setUpdatesEnabled( true );
viewport()->update();
m_enablePaint = true;
// int el = time.elapsed();
}
void TableView::setTodo( int, const OPimTodo&) {
sort();
/* repaint */
repaint();
}
void TableView::addEvent( const OPimTodo&) {
/* fix problems of not showing the 'Haken' */
updateView();
}
/*
* find the event
* and then replace the complete row
*/
void TableView::replaceEvent( const OPimTodo& ev) {
addEvent( ev );
}
/*
* re aligning table can be slow too
* FIXME: look what performs better
* either this or the old align table
*/
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) {
if (m_enablePaint )
QTable::viewportPaintEvent( e );
}
/*
* This segment is copyrighted by TT
* it was taken from their todolist
* application this code is GPL
*/
void TableView::paintCell(QPainter* p, int row, int col, const QRect& cr, bool ) {
const QColorGroup &cg = colorGroup();
p->save();
OPimTodo task = sorted()[row];
// TODO - give user option for grid or bars?
// Paint alternating background bars
if ( (row % 2 ) == 0 ) {
p->fillRect( 0, 0, cr.width(), cr.height(), cg.brush( QColorGroup::Base ) );
p->setPen( QPen( cg.text() ) );
}
else {
p->fillRect( 0, 0, cr.width(), cr.height(), cg.brush( QColorGroup::Background ) );
p->setPen( QPen( cg.buttonText() ) );
}
// Paint grid
//p->fillRect( 0, 0, cr.width(), cr.height(), cg.brush( QColorGroup::Base ) );
//QPen op = p->pen();
//p->setPen(cg.mid());
//p->drawLine( 0, cr.height() - 1, cr.width() - 1, cr.height() - 1 );
//p->drawLine( cr.width() - 1, 0, cr.width() - 1, cr.height() - 1 );
//p->setPen(op);
QFont f = p->font();
QFontMetrics fm(f);
int marg = ( cr.width() - BoxSize ) / 2;
int x = 0;
int y = ( cr.height() - BoxSize ) / 2;
switch(col) {
case 0: // completed field
{
//p->setPen( QPen( cg.text() ) );
//p->drawRect( x + marg, y, BoxSize, BoxSize );
//p->drawRect( x + marg+1, y+1, BoxSize-2, BoxSize-2 );
if ( task.isCompleted() ) {
p->drawPixmap( x + marg, y, m_pic_completed );
}
}
break;
case 1: // priority field
{
p->drawPixmap( x + marg, y, m_pic_priority[ task.priority() - 1 ] );
}
break;
case 2: // description field
{
QString text = task.summary().isEmpty() ?
task.description().left(20) :
task.summary();
p->drawText(2,2 + fm.ascent(), text);
}
break;
case 3:
{
QString text;
if (task.hasDueDate()) {
int off = QDate::currentDate().daysTo( task.dueDate() );
text = tr( "%1 day(s)").arg(QString::number(off));
/*
* set color if not completed
*/
if (!task.isCompleted() ) {
QColor color = Qt::black;
if ( off < 0 )
color = Qt::red;
else if ( off == 0 )
color = Qt::yellow;
else if ( off > 0 )
color = Qt::green;
p->setPen(color );
}
} else {
text = tr("None");
}
p->drawText(2,2 + fm.ascent(), text);
}
break;
}
p->restore();
}
QWidget* TableView::createEditor(int row, int col, bool )const {
switch( col ) {
case 1: {
/* the priority stuff */
QComboBox* combo = new QComboBox( viewport() );
for ( int i = 0; i < 5; i++ ) {
combo->insertItem( m_pic_priority[ i ] );
}
combo->setCurrentItem( sorted()[row].priority()-1 );
return combo;
}
/* summary */
case 2:{
QLineEdit* edit = new QLineEdit( viewport() );
edit->setText( sorted()[row].summary() );
return edit;
}
case 0:
default:
return 0l;
}
}
void TableView::setCellContentFromEditor(int row, int col ) {
if ( col == 1 ) {
QWidget* wid = cellWidget(row, 1 );
if ( wid->inherits("QComboBox") ) {
int pri = ((QComboBox*)wid)->currentItem() + 1;
OPimTodo todo = sorted()[row];
if ( todo.priority() != pri ) {
todo.setPriority( pri );
TodoView::update( todo.uid(), todo );
updateView();
}
}
}else if ( col == 2) {
QWidget* wid = cellWidget(row, 2);
if ( wid->inherits("QLineEdit") ) {
QString text = ((QLineEdit*)wid)->text();
OPimTodo todo = sorted()[row];
if ( todo.summary() != text ) {
todo.setSummary( text );
TodoView::update( todo.uid(), todo );
updateView();
}
}
}
}
void TableView::slotPriority() {
setCellContentFromEditor( currentRow(), currentColumn() );
}
/*
* We'll use the TimerEvent to read ahead or to keep the cahce always
* filled enough.
* We will try to read ahead 4 items in both ways
* up and down. On odd or even we will currentRow()+-4 or +-9
*
*/
void TableView::timerEvent( QTimerEvent* ) {
if (sorted().count() == 0 )
return;
int row = currentRow();
if ( m_row ) {
int ro = row-4;
if (ro < 0 ) ro = 0;
sorted()[ro];
ro = row+4;
sorted()[ro];
} 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:
if ( col == 0 ) {
TodoView::complete(sorted()[row]);
}else if ( col == 1 ) {
QWidget* wid = beginEdit(row, col, FALSE );
m_editorWidget.setCellWidget( wid, row, col );
}else if ( col == 2 ) {
showTodo( sorted().uidAt( currentRow() ) );
}else if ( col == 3 ) {
TodoView::edit( sorted().uidAt(row) );
}
event->accept();
break;
default:
QTable::keyPressEvent( event );
}
}
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,125 +1,126 @@
/*
-               =. 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;
}
OPimTodoAccess* TodoManager::todoDB() {
return m_db;
}
void TodoManager::add( const OPimTodo& ev ) {
m_db->add( ev );
}
void TodoManager::update( int, const SmallTodo& ) {
}
void TodoManager::update( int, const OPimTodo& ev) {
m_db->replace( ev );
}
bool TodoManager::remove( int uid ) {
return m_db->remove( uid );
}
void TodoManager::removeAll() {
m_db->clear();
}
void TodoManager::removeCompleted() {
m_db->removeAllCompleted();
}
void TodoManager::save() {
m_db->save();
}
bool TodoManager::saveAll() {
return m_db->save();
}
void TodoManager::reload() {
m_db->reload();
}
QStringList TodoManager::categories() {
m_cat.load(categoryFileName() );
return m_cat.labels( "Todo List");
}
/*
* we rely on load beeing called from populateCategories
*/
int TodoManager::catId( const QString& cats ) {
return m_cat.id( "Todo List", cats );
}
void TodoManager::remove( const QArray<int>& ids) {
for (uint i=0; i < ids.size(); i++ )
remove( ids[i] );
}
bool TodoManager::isLoaded()const {
return (m_db == 0 );
}
void TodoManager::load() {
if (!m_db) {
m_db = new OPimTodoAccess();
m_db->load();
}
}