summaryrefslogtreecommitdiff
authorzecke <zecke>2002-06-15 16:46:37 (UTC)
committer zecke <zecke>2002-06-15 16:46:37 (UTC)
commitff47b17768607d8819ef5cd3316a1cab0abdcf3a (patch) (side-by-side diff)
treeaddbc4d7d8826ce2952aca872e67e3575d77cda7
parent9f41969610f9db5d60d6080abae0b21e54a549e2 (diff)
downloadopie-ff47b17768607d8819ef5cd3316a1cab0abdcf3a.zip
opie-ff47b17768607d8819ef5cd3316a1cab0abdcf3a.tar.gz
opie-ff47b17768607d8819ef5cd3316a1cab0abdcf3a.tar.bz2
Summary support
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/pim/todo/mainwindow.cpp2
-rw-r--r--core/pim/todo/todoentry.ui370
-rw-r--r--core/pim/todo/todoentryimpl.cpp7
-rw-r--r--core/pim/todo/todotable.cpp11
-rw-r--r--core/pim/todo/todotable.h3
-rw-r--r--libopie/tododb.cpp12
-rw-r--r--libopie/todoevent.cpp43
-rw-r--r--libopie/todoevent.h67
-rw-r--r--libopie/todovcalresource.cpp23
9 files changed, 353 insertions, 185 deletions
diff --git a/core/pim/todo/mainwindow.cpp b/core/pim/todo/mainwindow.cpp
index b7b1da0..1358f1c 100644
--- a/core/pim/todo/mainwindow.cpp
+++ b/core/pim/todo/mainwindow.cpp
@@ -469,159 +469,159 @@ void TodoWindow::setCategory( int c )
mStack->raiseWidget( 1 );
}
void TodoWindow::populateCategories()
{
catMenu->clear();
int id, rememberId;
id = 1;
rememberId = 0;
catMenu->insertItem( tr( "All Categories" ), id++ );
catMenu->insertSeparator();
QStringList categories = table->categories();
categories.append( tr( "Unfiled" ) );
for ( QStringList::Iterator it = categories.begin();
it != categories.end(); ++it ) {
catMenu->insertItem( *it, id );
if ( *it == table->showCategory() )
rememberId = id;
++id;
}
if ( table->showCategory().isEmpty() )
setCategory( 1 );
else
setCategory( rememberId );
}
void TodoWindow::reload()
{
table->clear();
table->load( todolistXMLFilename() );
syncing = FALSE;
}
void TodoWindow::flush()
{
syncing = TRUE;
table->save( todolistXMLFilename() );
}
void TodoWindow::closeEvent( QCloseEvent *e )
{
if( mStack->visibleWidget() != table ){
mStack->raiseWidget( 1 );
e->ignore();
return;
}
if(syncing) {
/* no need to save if in the middle of syncing */
e->accept();
return;
}
if ( table->save( todolistXMLFilename() ) ) {
e->accept();
// repeat for categories...
// if writing configs fail, it will emit an
// error, but I feel that it is "ok" for us to exit
// espically since we aren't told if the write succeeded...
Config config( "todo" );
config.setGroup( "View" );
config.writeEntry( "ShowComplete", table->showCompleted() );
config.writeEntry( "Category", table->showCategory() );
/* added 20.01.2k2 by se */
config.writeEntry( "ShowDeadLine", table->showDeadline());
} else {
if ( QMessageBox::critical( this, tr("Out of space"),
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();
else
e->ignore();
}
}
void TodoWindow::slotFind()
{
// put everything back to view all for searching...
mStack->raiseWidget( 1 );
if ( !catMenu->isItemChecked( 0 ) )
setCategory( 0 );
FindDialog dlg( "Todo List", this );
QObject::connect( &dlg,
SIGNAL(signalFindClicked(const QString &,
bool, bool, int)),
table,
SLOT(slotDoFind(const QString&, bool, bool, int)) );
QObject::connect( table, SIGNAL(signalNotFound()), &dlg,
SLOT(slotNotFound()) );
QObject::connect( table, SIGNAL(signalWrapAround()), &dlg,
SLOT(slotWrapAround()) );
dlg.exec();
if ( table->numSelections() )
table->clearSelection();
table->clearFindRow();
}
void TodoWindow::setDocument( const QString &filename )
{
if ( filename.find(".vcs") != int(filename.length()) - 4 ) return;
ToDoDB todoDB(filename, new ToDoVCalResource() );
QValueList<ToDoEvent> tl = todoDB.rawToDos();
for( QValueList<ToDoEvent>::Iterator it = tl.begin(); it != tl.end(); ++it ) {
table->addEntry( *it );
}
}
static const char * beamfile = "/tmp/obex/todo.vcs";
void TodoWindow::slotBeam()
{
unlink( beamfile ); // delete if exists
ToDoEvent c = table->currentEntry();
mkdir("/tmp/obex/", 0755);
ToDoDB todoDB( beamfile, new ToDoVCalResource() );
todoDB.addEvent( c );
todoDB.save();
Ir *ir = new Ir( this );
connect( ir, SIGNAL( done( Ir * ) ), this, SLOT( beamDone( Ir * ) ) );
- QString description = c.description();
+ QString description = c.summary();
ir->send( beamfile, description, "text/x-vCalendar" );
}
void TodoWindow::beamDone( Ir *ir )
{
delete ir;
unlink( beamfile );
}
void TodoWindow::showDeadline( bool s )
{
table->setPaintingEnabled( false );
table->setShowDeadline( s );
table->setPaintingEnabled( true );
}
void TodoWindow::slotShowDetails()
{
ToDoEvent event = table->currentEntry();
slotShowDetails( event );
}
void TodoWindow::slotShowDetails( const ToDoEvent &event )
{
if( mView == 0l ){
mView = new TodoLabel(mStack);
mStack->addWidget( mView, 2 );
}
mView->init( event );
mView->sync();
mStack->raiseWidget( 2);
}
diff --git a/core/pim/todo/todoentry.ui b/core/pim/todo/todoentry.ui
index c735e76..87ee68c 100644
--- a/core/pim/todo/todoentry.ui
+++ b/core/pim/todo/todoentry.ui
@@ -1,266 +1,326 @@
<!DOCTYPE UI><UI>
<class>NewTaskDialogBase</class>
<comment>*********************************************************************
** Copyright (C) 2000 Trolltech AS. All rights reserved.
**
** This file is part of Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
*********************************************************************</comment>
<widget>
<class>QDialog</class>
<property stdset="1">
<name>name</name>
<cstring>NewTaskDialogBase</cstring>
</property>
<property stdset="1">
<name>geometry</name>
<rect>
<x>0</x>
<y>0</y>
- <width>249</width>
+ <width>245</width>
<height>321</height>
</rect>
</property>
<property stdset="1">
<name>caption</name>
<string>New Task</string>
</property>
<property>
<name>layoutMargin</name>
</property>
<property>
<name>layoutSpacing</name>
</property>
- <vbox>
+ <widget>
+ <class>QLayoutWidget</class>
<property stdset="1">
- <name>margin</name>
- <number>0</number>
+ <name>name</name>
+ <cstring>Layout3</cstring>
</property>
<property stdset="1">
- <name>spacing</name>
- <number>0</number>
+ <name>geometry</name>
+ <rect>
+ <x>1</x>
+ <y>25</y>
+ <width>243</width>
+ <height>17</height>
+ </rect>
</property>
- <widget>
- <class>QLayoutWidget</class>
+ <hbox>
<property stdset="1">
- <name>name</name>
- <cstring>Layout4</cstring>
+ <name>margin</name>
+ <number>0</number>
</property>
- <hbox>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>6</number>
+ </property>
+ <widget>
+ <class>QLabel</class>
<property stdset="1">
- <name>margin</name>
- <number>0</number>
+ <name>name</name>
+ <cstring>TextLabel3</cstring>
</property>
<property stdset="1">
- <name>spacing</name>
- <number>6</number>
+ <name>frameShape</name>
+ <enum>NoFrame</enum>
</property>
- <widget>
- <class>QLabel</class>
+ <property stdset="1">
+ <name>text</name>
+ <string>Category:</string>
+ </property>
+ </widget>
+ <widget>
+ <class>CategorySelect</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>comboCategory</cstring>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget>
+ <class>QLayoutWidget</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>Layout6</cstring>
+ </property>
+ <property stdset="1">
+ <name>geometry</name>
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>240</width>
+ <height>320</height>
+ </rect>
+ </property>
+ <grid>
+ <property stdset="1">
+ <name>margin</name>
+ <number>0</number>
+ </property>
+ <property stdset="1">
+ <name>spacing</name>
+ <number>6</number>
+ </property>
+ <widget row="2" column="0" >
+ <class>QLayoutWidget</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
<property stdset="1">
- <name>name</name>
- <cstring>TextLabel2</cstring>
+ <name>margin</name>
+ <number>0</number>
</property>
<property stdset="1">
- <name>text</name>
- <string>Priority:</string>
+ <name>spacing</name>
+ <number>6</number>
</property>
- </widget>
- <widget>
- <class>QComboBox</class>
- <item>
- <property>
- <name>text</name>
- <string>1 - Very High</string>
+ <widget>
+ <class>QLabel</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>TextLabel1</cstring>
</property>
- </item>
- <item>
- <property>
+ <property stdset="1">
<name>text</name>
- <string>2 - High</string>
+ <string>Summary:</string>
</property>
- </item>
- <item>
- <property>
- <name>text</name>
- <string>3 - Normal</string>
- </property>
- </item>
- <item>
- <property>
- <name>text</name>
- <string>4 - Low</string>
- </property>
- </item>
- <item>
- <property>
- <name>text</name>
- <string>5 - Very Low</string>
+ </widget>
+ <widget>
+ <class>QLineEdit</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>lneSum</cstring>
</property>
- </item>
- <property stdset="1">
- <name>name</name>
- <cstring>comboPriority</cstring>
- </property>
- <property stdset="1">
- <name>sizePolicy</name>
- <sizepolicy>
- <hsizetype>7</hsizetype>
- <vsizetype>0</vsizetype>
- </sizepolicy>
- </property>
- <property stdset="1">
- <name>currentItem</name>
- <number>2</number>
- </property>
- </widget>
- </hbox>
- </widget>
- <widget>
- <class>QLayoutWidget</class>
- <property stdset="1">
- <name>name</name>
- <cstring>Layout3</cstring>
- </property>
- <hbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget row="3" column="0" >
+ <class>QMultiLineEdit</class>
<property stdset="1">
- <name>margin</name>
- <number>0</number>
+ <name>name</name>
+ <cstring>txtTodo</cstring>
</property>
+ </widget>
+ <widget row="1" column="0" >
+ <class>QLayoutWidget</class>
<property stdset="1">
- <name>spacing</name>
- <number>6</number>
+ <name>name</name>
+ <cstring>Layout4</cstring>
</property>
- <widget>
- <class>QLabel</class>
- <property stdset="1">
- <name>name</name>
- <cstring>TextLabel3</cstring>
- </property>
- <property stdset="1">
- <name>frameShape</name>
- <enum>NoFrame</enum>
- </property>
+ <hbox>
<property stdset="1">
- <name>text</name>
- <string>Category:</string>
+ <name>margin</name>
+ <number>0</number>
</property>
- </widget>
- <widget>
- <class>CategorySelect</class>
<property stdset="1">
- <name>name</name>
- <cstring>comboCategory</cstring>
+ <name>spacing</name>
+ <number>6</number>
</property>
- </widget>
- </hbox>
- </widget>
- <widget>
- <class>QLayoutWidget</class>
- <property stdset="1">
- <name>name</name>
- <cstring>Layout4</cstring>
- </property>
- <hbox>
- <property stdset="1">
- <name>margin</name>
- <number>0</number>
- </property>
+ <widget>
+ <class>QCheckBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>checkCompleted</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>&amp;Completed</string>
+ </property>
+ </widget>
+ <widget>
+ <class>QCheckBox</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>checkDate</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>D&amp;ue</string>
+ </property>
+ </widget>
+ <widget>
+ <class>QPushButton</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>buttonDate</cstring>
+ </property>
+ <property stdset="1">
+ <name>enabled</name>
+ <bool>false</bool>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>1 Jan 2001</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget row="0" column="0" >
+ <class>QLayoutWidget</class>
<property stdset="1">
- <name>spacing</name>
- <number>6</number>
+ <name>name</name>
+ <cstring>Layout4</cstring>
</property>
- <widget>
- <class>QCheckBox</class>
- <property stdset="1">
- <name>name</name>
- <cstring>checkCompleted</cstring>
- </property>
+ <hbox>
<property stdset="1">
- <name>text</name>
- <string>&amp;Completed</string>
+ <name>margin</name>
+ <number>0</number>
</property>
- </widget>
- <widget>
- <class>QCheckBox</class>
<property stdset="1">
- <name>name</name>
- <cstring>checkDate</cstring>
+ <name>spacing</name>
+ <number>6</number>
</property>
- <property stdset="1">
- <name>text</name>
- <string>D&amp;ue</string>
- </property>
- </widget>
- <widget>
- <class>QPushButton</class>
- <property stdset="1">
- <name>name</name>
- <cstring>buttonDate</cstring>
- </property>
- <property stdset="1">
- <name>enabled</name>
- <bool>false</bool>
- </property>
- <property stdset="1">
- <name>text</name>
- <string>1 Jan 2001</string>
- </property>
- </widget>
- </hbox>
- </widget>
- <widget>
- <class>QMultiLineEdit</class>
- <property stdset="1">
- <name>name</name>
- <cstring>txtTodo</cstring>
- </property>
- </widget>
- </vbox>
+ <widget>
+ <class>QLabel</class>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property stdset="1">
+ <name>text</name>
+ <string>Priority:</string>
+ </property>
+ </widget>
+ <widget>
+ <class>QComboBox</class>
+ <item>
+ <property>
+ <name>text</name>
+ <string>1 - Very High</string>
+ </property>
+ </item>
+ <item>
+ <property>
+ <name>text</name>
+ <string>2 - High</string>
+ </property>
+ </item>
+ <item>
+ <property>
+ <name>text</name>
+ <string>3 - Normal</string>
+ </property>
+ </item>
+ <item>
+ <property>
+ <name>text</name>
+ <string>4 - Low</string>
+ </property>
+ </item>
+ <item>
+ <property>
+ <name>text</name>
+ <string>5 - Very Low</string>
+ </property>
+ </item>
+ <property stdset="1">
+ <name>name</name>
+ <cstring>comboPriority</cstring>
+ </property>
+ <property stdset="1">
+ <name>sizePolicy</name>
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ </sizepolicy>
+ </property>
+ <property stdset="1">
+ <name>currentItem</name>
+ <number>2</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
</widget>
<customwidgets>
<customwidget>
<class>CategorySelect</class>
<header location="global">qpe/categoryselect.h</header>
<sizehint>
<width>-1</width>
<height>-1</height>
</sizehint>
<container>0</container>
<sizepolicy>
<hordata>7</hordata>
<verdata>1</verdata>
</sizepolicy>
<pixmap>image0</pixmap>
</customwidget>
</customwidgets>
<images>
<image>
<name>image0</name>
<data format="XPM.GZ" length="646">789c6dd2c10ac2300c00d07bbf2234b7229d1be245fc04c5a3201e4615f430059d0711ff5ddb2e6bb236ec90eed134cb5a19d8ef36602af5ecdbfeeac05dda0798d3abebde87e3faa374d3807fa0d633a52d38d8de6f679fe33fc776e196f53cd010188256a3600a292882096246517815ca99884606e18044a3a40d91824820924265a7923a2e8bcd05f33db1173e002913175f2a6be6d3294871a2d95fa00e8a94ee017b69d339d90df1e77c57ea072ede6758</data>
</image>
</images>
<connections>
<connection>
<sender>checkDate</sender>
<signal>toggled(bool)</signal>
<receiver>buttonDate</receiver>
<slot>setEnabled(bool)</slot>
</connection>
<slot access="protected">dateChanged( const QString &amp; )</slot>
<slot access="protected">dateChanged( int, int, int )</slot>
</connections>
</UI>
diff --git a/core/pim/todo/todoentryimpl.cpp b/core/pim/todo/todoentryimpl.cpp
index 26a685c..dfaf9b4 100644
--- a/core/pim/todo/todoentryimpl.cpp
+++ b/core/pim/todo/todoentryimpl.cpp
@@ -1,153 +1,156 @@
/**********************************************************************
** Copyright (C) 2000 Trolltech AS. All rights reserved.
+** Copyright (C) 2002 zecke
**
** This file is part of Qtopia Environment.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#include "todoentryimpl.h"
#include <opie/todoevent.h>
#include <opie/tododb.h>
#include <qpe/categoryselect.h>
#include <qpe/datebookmonth.h>
#include <qpe/global.h>
#include <qpe/imageedit.h>
#include <qpe/timestring.h>
#include <qpe/palmtoprecord.h>
#include <qmessagebox.h>
#include <qpopupmenu.h>
#include <qtoolbutton.h>
#include <qcombobox.h>
#include <qcheckbox.h>
#include <qlineedit.h>
#include <qmultilineedit.h>
#include <qlabel.h>
#include <qtimer.h>
#include <qapplication.h>
NewTaskDialog::NewTaskDialog( const ToDoEvent& task, QWidget *parent,
const char *name, bool modal, WFlags fl )
: NewTaskDialogBase( parent, name, modal, fl ),
todo( task )
{
todo.setCategories( task.allCategories() );
if ( todo.hasDate() )
date = todo.date();
else
date = QDate::currentDate();
init();
comboPriority->setCurrentItem( task.priority() - 1 );
checkCompleted->setChecked( task.isCompleted() );
checkDate->setChecked( task.hasDate() );
buttonDate->setText( TimeString::longDateString( date ) );
txtTodo->setText( task.description() );
+ lneSum->setText( task.summary() );
}
/*
* Constructs a NewTaskDialog which is a child of 'parent', with the
* name 'name' and widget flags set to 'f'
*
* The dialog will by default be modeless, unless you set 'modal' to
* TRUE to construct a modal dialog.
*/
NewTaskDialog::NewTaskDialog( int id, QWidget* parent, const char* name, bool modal,
WFlags fl )
: NewTaskDialogBase( parent, name, modal, fl ),
date( QDate::currentDate() )
{
if ( id != -1 ) {
QArray<int> ids( 1 );
ids[0] = id;
todo.setCategory( Qtopia::Record::idsToString( ids ) );
}
init();
}
void NewTaskDialog::init()
{
QPopupMenu *m1 = new QPopupMenu( this );
picker = new DateBookMonth( m1, 0, TRUE );
m1->insertItem( picker );
buttonDate->setPopup( m1 );
comboCategory->setCategories( todo.categories(), "Todo List", tr("Todo List") );
connect( picker, SIGNAL( dateClicked( int, int, int ) ),
this, SLOT( dateChanged( int, int, int ) ) );
buttonDate->setText( TimeString::longDateString( date ) );
picker->setDate( date.year(), date.month(), date.day() );
}
/*
* Destroys the object and frees any allocated resources
*/
NewTaskDialog::~NewTaskDialog()
{
// no need to delete child widgets, Qt does it all for us
}
void NewTaskDialog::dateChanged( int y, int m, int d )
{
date = QDate( y, m, d );
buttonDate->setText( TimeString::longDateString( date ) );
}
/*!
*/
ToDoEvent NewTaskDialog::todoEntry()
{
if( checkDate->isChecked() ){
todo.setDate( date );
todo.setHasDate( true );
}else{
todo.setHasDate( false );
}
if ( comboCategory->currentCategory() != -1 ) {
QArray<int> arr = comboCategory->currentCategories();
QStringList list;
list = QStringList::split(";", Qtopia::Record::idsToString( arr )) ;
todo.setCategories( list );
}
todo.setPriority( comboPriority->currentItem() + 1 );
todo.setCompleted( checkCompleted->isChecked() );
-
+
todo.setDescription( txtTodo->text() );
-
+ todo.setSummary( lneSum->text() );
+
return todo;
}
/*!
*/
void NewTaskDialog::accept()
{
QString strText = txtTodo->text();
if ( strText.isEmpty() ) {
// hmm... just decline it then, the user obviously didn't care about it
QDialog::reject();
return;
}
QDialog::accept();
}
diff --git a/core/pim/todo/todotable.cpp b/core/pim/todo/todotable.cpp
index 52a3087..779b28c 100644
--- a/core/pim/todo/todotable.cpp
+++ b/core/pim/todo/todotable.cpp
@@ -447,296 +447,300 @@ void TodoTable::updateVisible()
adjustColumn(2);
}
int visible = 0;
int id = mCat.id( "Todo List", showCat );
for ( int row = 0; row < numRows(); row++ ) {
CheckItem *ci = (CheckItem *)item( row, 0 );
ToDoEvent *t = todoList[ci];
QArray<int> vlCats = t->categories();
bool hide = false;
if ( !showComp && ci->isChecked() )
hide = true;
if ( !showCat.isEmpty() ) {
if ( showCat == tr( "Unfiled" ) ) {
if ( vlCats.count() > 0 )
hide = true;
} else {
// do some comparing, we have to reverse our idea here... which idea? - zecke
if ( !hide ) {
hide = true;
for ( uint it = 0; it < vlCats.count(); ++it ) {
if ( vlCats[it] == id ) {
hide = false;
break;
}
}
}
}
}
if ( hide ) {
if ( currentRow() == row )
setCurrentCell( -1, 0 );
if ( rowHeight( row ) > 0 )
hideRow( row );
} else {
if ( rowHeight( row ) == 0 ) {
showRow( row );
adjustRow( row );
}
visible++;
}
}
if ( !visible )
setCurrentCell( -1, 0 );
}
void TodoTable::viewportPaintEvent( QPaintEvent *pe )
{
if ( enablePainting )
QTable::viewportPaintEvent( pe );
}
void TodoTable::setPaintingEnabled( bool e )
{
if ( e != enablePainting ) {
if ( !enablePainting ) {
enablePainting = true;
rowHeightChanged( 0 );
viewport()->update();
} else {
enablePainting = false;
}
}
}
void TodoTable::clear()
{
for ( QMap<CheckItem*, ToDoEvent *>::Iterator it = todoList.begin();
it != todoList.end(); ++it ) {
ToDoEvent *todo = it.data();
updateJournal( *todo, ACTION_REMOVE );
delete todo;
}
todoList.clear();
for ( int r = 0; r < numRows(); ++r ) {
for ( int c = 0; c < numCols(); ++c ) {
if ( cellWidget( r, c ) )
clearCellWidget( r, c );
clearCell( r, c );
}
}
setNumRows( 0 );
}
void TodoTable::sortColumn( int col, bool ascending, bool /*wholeRows*/ )
{
// The default for wholeRows is false, however
// for this todo table we want to exchange complete
// rows when sorting. Also, we always want ascending, since
// the values have a logical order.
QTable::sortColumn( col, ascending, TRUE );
updateVisible();
}
void TodoTable::slotCheckPriority(int row, int col )
{
// kludgey work around to make forward along the updated priority...
if ( col == 1 ) {
// let everyone know!!
ComboItem* i = static_cast<ComboItem*>( item( row, col ) );
emit signalPriorityChanged( i->text().toInt() );
}
}
void TodoTable::updateJournal( const ToDoEvent &todo, journal_action action )
{
QFile f( journalFileName() );
if ( !f.open(IO_WriteOnly|IO_Append) )
return;
QString buf;
QCString str;
buf = "<Task";
// todo.save( buf );
buf += " Action=\"" + QString::number( int(action) ) + "\"";
buf += " Uid=\"" + QString::number( todo.uid() ) + "\""; // better write the id
buf += " Completed=\""+ QString::number((int)todo.isCompleted() ) + "\"";
buf += " HasDate=\""+ QString::number((int)todo.hasDate() ) +"\"";
buf += " Priority=\"" + QString::number( todo.priority() ) + "\"";
QArray<int> arrat = todo.categories();
QString attr;
for(uint i=0; i < arrat.count(); i++ ){
attr.append(QString::number(arrat[i])+";" );
}
if(!attr.isEmpty() ) // remove the last ;
attr.remove(attr.length()-1, 1 );
buf += " Categories=\"" + attr + "\"";
buf += " Description=\"" + todo.description() + "\"";
+ buf += " Summary=\"" + todo.summary() + "\"";
if(todo.hasDate() ) {
buf += " DateYear=\""+QString::number( todo.date().year() ) + "\"";
buf += " DateMonth=\"" + QString::number( todo.date().month() ) + "\"";
buf += " DateDay=\"" + QString::number( todo.date().day() ) + "\"";
}
buf += "/>\n";
str = buf.utf8();
f.writeBlock( str.data(), str.length() );
f.close();
}
void TodoTable::rowHeightChanged( int row )
{
if ( enablePainting )
QTable::rowHeightChanged( row );
}
void TodoTable::loadFile( const QString &/*we use the standard*/ )
{
QList<ToDoEvent> list;
ToDoDB todoDB;
QValueList<ToDoEvent> vaList = todoDB.rawToDos();
for(QValueList<ToDoEvent>::ConstIterator it = vaList.begin(); it != vaList.end(); ++it ){
ToDoEvent *event = new ToDoEvent( (*it) );
list.append( event );
}
vaList.clear();
// qDebug("parsing done=%d", t.elapsed() );
if ( list.count() > 0 ) {
internalAddEntries( list );
list.clear();
}
// qDebug("loading done: t=%d", t.elapsed() );
}
void TodoTable::journalFreeReplaceEntry( const ToDoEvent &todo, int row )
{
- QString strTodo;
- strTodo = todo.description().left(40).simplifyWhiteSpace();
+ QString strTodo = todo.summary();
+ if( strTodo.isEmpty() ){
+ strTodo = todo.description().left(40).simplifyWhiteSpace();
+ //todo.setSummary(strTodo );
+ }
if ( row == -1 ) {
QMapIterator<CheckItem*, ToDoEvent *> it;
for ( it = todoList.begin(); it != todoList.end(); ++it ) {
if ( *(*it) == todo ) {
row = it.key()->row();
it.key()->setChecked( todo.isCompleted() );
static_cast<ComboItem*>(item(row, 1))->setText( QString::number(todo.priority()) );
item( row, 2 )->setText( strTodo );
if (showDeadl){
static_cast<DueTextItem*>(item(row,3))->setToDoEvent(&todo );
}
*(*it) = todo;
}
}
} else {
ToDoEvent *t = todoList[static_cast<CheckItem*>(item(row, 0))];
todoList.remove( static_cast<CheckItem*>(item(row, 0)) );
delete t;
static_cast<CheckItem*>(item(row, 0))->setChecked( todo.isCompleted() );
static_cast<ComboItem*>(item(row, 1))->setText( QString::number(todo.priority()) );
item( row, 2 )->setText( strTodo );
if (showDeadl){
static_cast<DueTextItem*>(item(row,3))->setToDoEvent(&todo );
}
todoList.insert( static_cast<CheckItem*>(item(row,0)), new ToDoEvent(todo) );
}
}
void TodoTable::journalFreeRemoveEntry( int row )
{
CheckItem *chk;
chk = static_cast<CheckItem*>(item(row, 0 ));
if ( !chk )
return;
todoList.remove( chk );
realignTable( row );
}
void TodoTable::keyPressEvent( QKeyEvent *e )
{
if ( e->key() == Key_Space || e->key() == Key_Return ) {
switch ( currentColumn() ) {
case 0: {
CheckItem *i = static_cast<CheckItem*>(item(currentRow(),
currentColumn()));
if ( i )
i->toggle();
break;
}
case 1:
break;
case 2:{
ToDoEvent *todo = todoList[static_cast<CheckItem*>(item(currentRow(), 0))];
emit showDetails(*todo);
break;
}
case 3:
// Future: Let us change the dueDate directly...
emit signalEdit();
default:
break;
}
} else
QTable::keyPressEvent( e );
}
QStringList TodoTable::categories()
{
// This is called seldom, so calling a load in here
// should be fine.
mCat.load( categoryFileName() );
QStringList categoryList = mCat.labels( "Todo List" );
return categoryList;
}
void TodoTable::slotDoFind( const QString &findString, bool caseSensitive,
bool backwards, int category )
{
// we have to iterate through the table, this gives the illusion that
// sorting is actually being used.
if ( currFindRow < -1 )
currFindRow = currentRow() - 1;
clearSelection( TRUE );
int rows,
row;
CheckItem *chk;
QRegExp r( findString );
r.setCaseSensitive( caseSensitive );
rows = numRows();
static bool wrapAround = true;
if ( !backwards ) {
for ( row = currFindRow + 1; row < rows; row++ ) {
chk = static_cast<CheckItem*>( item(row, 0) );
if ( taskCompare(*(todoList[chk]), r, category) )
break;
}
} else {
for ( row = currFindRow - 1; row > -1; row-- ) {
chk = static_cast<CheckItem*>( item(row, 0) );
if ( taskCompare(*(todoList[chk]), r, category) )
break;
}
}
if ( row >= rows || row < 0 ) {
if ( row < 0 )
currFindRow = rows;
else
currFindRow = -1;
if ( wrapAround )
emit signalWrapAround();
else
emit signalNotFound();
wrapAround = !wrapAround;
} else {
currFindRow = row;
QTableSelection foundSelection;
foundSelection.init( currFindRow, 0 );
foundSelection.expandTo( currFindRow, numCols() - 1 );
addSelection( foundSelection );
setCurrentCell( currFindRow, numCols() - 1 );
// we should always be able to wrap around and find this again,
@@ -783,156 +787,159 @@ void TodoTable::applyJournal()
if(ok ){
switch( action){
case ACTION_ADD:
tododb.addEvent(ev );
break;
case ACTION_REMOVE:
tododb.removeEvent( ev );
break;
case ACTION_REPLACE:
tododb.replaceEvent( ev );
break;
}
}
el = el->nextChild();
}
QFile::remove(journalFileName()+ "_new" );
tododb.save();
}
}
void TodoTable::slotCheckDay()
{
QDate date = QDate::currentDate();
if( mDay.daysTo(date )!= 0 ){
setPaintingEnabled( FALSE );
for(int i=0; i < numRows(); i++ ){
ToDoEvent *t = todoList[static_cast<CheckItem*>(item(i, 0))];
static_cast<DueTextItem*>(item(i, 3) )->setToDoEvent( t );
}
setPaintingEnabled( TRUE );
mDay = date;
}
mDayTimer->start( 60 * 1000 ); // 60 seconds
}
// check Action and decide
/*
void TodoTable::doApply(XMLElement *el )
{
QString dummy;
bool ok;
int action;
dummy = el->attribute("Action" );
action = dummy.toInt(&ok );
ToDoEvent ev = xmlToEvent( el );
if( ok ){
switch( action ){
case ACTION_ADD:
addEntry( ev );
break;
case ACTION_REMOVE:{ // find an entry with the same uid and remove it then
break;
}
case ACTION_REPLACE:
break;
}
}
}
*/
namespace {
static bool taskCompare( const ToDoEvent &task, const QRegExp &r, int category )
{
bool returnMe;
QArray<int> cats;
cats = task.categories();
returnMe = false;
if ( (category == -1 && cats.count() == 0) || category == -2 )
returnMe = task.match( r );
else {
int i;
for ( i = 0; i < int(cats.count()); i++ ) {
if ( cats[i] == category ) {
returnMe = task.match( r );
break;
}
}
}
return returnMe;
}
static QString journalFileName()
{
QString str;
str = getenv( "HOME" );
str += "/.opie_todojournal";
return str;
}
static ToDoEvent xmlToEvent( XMLElement *element )
{
QString dummy;
ToDoEvent event;
bool ok;
int dumInt;
// completed
dummy = element->attribute("Completed" );
dumInt = dummy.toInt(&ok );
if(ok ) event.setCompleted( dumInt == 0 ? false : true );
// hasDate
dummy = element->attribute("HasDate" );
dumInt = dummy.toInt(&ok );
if(ok ) event.setHasDate( dumInt == 0 ? false: true );
// set the date
bool hasDa = dumInt;
if ( hasDa ) { //parse the date
int year, day, month = 0;
year = day = month;
// year
dummy = element->attribute("DateYear" );
dumInt = dummy.toInt(&ok );
if( ok ) year = dumInt;
// month
dummy = element->attribute("DateMonth" );
dumInt = dummy.toInt(&ok );
if(ok ) month = dumInt;
dummy = element->attribute("DateDay" );
dumInt = dummy.toInt(&ok );
if(ok ) day = dumInt;
// set the date
QDate date( year, month, day );
event.setDate( date);
}
dummy = element->attribute("Priority" );
dumInt = dummy.toInt(&ok );
if(!ok ) dumInt = ToDoEvent::NORMAL;
event.setPriority( dumInt );
//description
dummy = element->attribute("Description" );
event.setDescription( dummy );
+ // summary
+ dummy = element->attribute("Summary" );
+ event.setSummary( dummy );
// category
dummy = element->attribute("Categories" );
QStringList ids = QStringList::split(";", dummy );
event.setCategories( ids );
//uid
dummy = element->attribute("Uid" );
dumInt = dummy.toInt(&ok );
if(ok ) event.setUid( dumInt );
return event;
}
}
// int TodoTable::rowHeight( int ) const
// {
// return 18;
// }
// int TodoTable::rowPos( int row ) const
// {
// return 18*row;
// }
// int TodoTable::rowAt( int pos ) const
// {
// return QMIN( pos/18, numRows()-1 );
// }
diff --git a/core/pim/todo/todotable.h b/core/pim/todo/todotable.h
index 7672f21..39e00d1 100644
--- a/core/pim/todo/todotable.h
+++ b/core/pim/todo/todotable.h
@@ -74,171 +74,172 @@ public:
TodoTextItem( QTable *t, const QString & str )
:QTableItem( t, QTableItem::Never, str ) {}
QString key () const { return Qtopia::buildSortKey( text() ); }
};
class DueTextItem : public QTableItem
{
public:
DueTextItem( QTable *t, ToDoEvent *ev );
QString key() const;
void setToDoEvent( const ToDoEvent *ev );
void paint( QPainter *p, const QColorGroup &cg, const QRect &cr, bool selected );
private:
int m_off;
bool m_hasDate:1;
bool m_completed:1;
};
enum journal_action { ACTION_ADD=0, ACTION_REMOVE, ACTION_REPLACE };
namespace Opie
{
class XMLElement;
};
class TodoTable : public QTable
{
Q_OBJECT
public:
TodoTable( QWidget *parent = 0, const char * name = 0 );
void addEntry( const ToDoEvent &todo );
void clearFindRow() { currFindRow = -2; }
ToDoEvent currentEntry() const;
void replaceCurrentEntry( const ToDoEvent &todo, bool fromTableItem = false );
QStringList categories();
void setShowCompleted( bool sc ) { showComp = sc; updateVisible(); }
bool showCompleted() const { return showComp; }
void setShowDeadline (bool sd) {showDeadl = sd; updateVisible();}
bool showDeadline() const { return showDeadl;}
void setShowCategory( const QString &c ) { showCat = c; updateVisible(); }
const QString &showCategory() const { return showCat; }
int showCategoryId() const;
bool save( const QString &fn );
void load( const QString &fn );
void applyJournal( );
void clear();
void removeCurrentEntry();
void removeAllEntries() { clear(); };
//void removeAllEntriesInCategory(const QString &category );
void setPaintingEnabled( bool e );
virtual void sortColumn( int col, bool ascending, bool /*wholeRows*/ );
// int rowHeight( int ) const;
// int rowPos( int row ) const;
// virtual int rowAt( int pos ) const;
signals:
void signalEdit();
void signalDoneChanged( bool b );
void signalPriorityChanged( int i );
void signalShowMenu( const QPoint & );
void signalNotFound();
void signalWrapAround();
void showDetails( const ToDoEvent & );
protected:
void keyPressEvent( QKeyEvent *e );
private:
void updateVisible();
void viewportPaintEvent( QPaintEvent * );
void internalAddEntries( QList<ToDoEvent> &list);
inline void insertIntoTable( ToDoEvent *todo, int row );
void updateJournal( const ToDoEvent &todo, journal_action action);
void mergeJournal();
void journalFreeReplaceEntry( const ToDoEvent &todo, int row );
void journalFreeRemoveEntry( int row );
inline void realignTable( int row );
void loadFile( const QString &strFile);
private slots:
void slotClicked( int row, int col, int button, const QPoint &pos );
void slotPressed( int row, int col, int button, const QPoint &pos );
void slotCheckPriority(int row, int col );
void slotCurrentChanged(int row, int col );
void slotDoFind( const QString &findString, bool caseSensetive,
bool backwards, int category );
void slotShowMenu();
void rowHeightChanged( int row );
void slotCheckDay(); // check the day
private:
friend class TodoWindow;
QMap<CheckItem*, ToDoEvent *> todoList;
QStringList categoryList;
bool showComp;
QString showCat;
QTimer *menuTimer;
QDate mDay;
QTimer *mDayTimer; // see if the day changed
bool enablePainting;
Categories mCat;
int currFindRow;
bool showDeadl:1;
};
inline void TodoTable::insertIntoTable( ToDoEvent *todo, int row )
{
QString sortKey = (char) ((todo->isCompleted() ? 'a' : 'A')
+ todo->priority() )
+ Qtopia::buildSortKey( todo->description() );
CheckItem *chk = new CheckItem( this, sortKey );
chk->setChecked( todo->isCompleted() );
ComboItem *cmb = new ComboItem( this, QTableItem::WhenCurrent );
cmb->setText( QString::number( todo->priority() ) );
- QTableItem *ti = new TodoTextItem( this, todo->description().left(40).simplifyWhiteSpace() );
+ QString sum = todo->summary();
+ QTableItem *ti = new TodoTextItem( this, sum.isEmpty() ? todo->description().left(40).simplifyWhiteSpace() : sum );
ti->setReplaceable( false );
DueTextItem *due = new DueTextItem(this, todo );
setItem( row, 3, due);
setItem( row, 0, chk );
setItem( row, 1, cmb );
setItem( row, 2, ti );
todoList.insert( chk, todo );
}
inline void TodoTable::realignTable( int row )
{
QTableItem *ti1,
*ti2,
*ti3,
*ti4;
int totalRows = numRows();
for ( int curr = row; curr < totalRows - 1; curr++ ) {
// this is bad, we must take the item out and then
// set it. In the end, it behaves no worse (time wise)
// then the old way of saving the entries to file, clearing
// the table re-reading in the file and resetting the table
ti1 = item( curr + 1, 0 );
ti2 = item( curr + 1, 1 );
ti3 = item( curr + 1, 2 );
ti4 = item( curr + 1, 3 );
takeItem( ti1 );
takeItem( ti2 );
takeItem( ti3 );
takeItem( ti4 );
setItem( curr, 0, ti1 );
setItem( curr, 1, ti2 );
setItem( curr, 2, ti3 );
setItem( curr, 3, ti4 );
}
setNumRows( totalRows - 1 );
}
#endif
diff --git a/libopie/tododb.cpp b/libopie/tododb.cpp
index fe8b8bf..6b10ec2 100644
--- a/libopie/tododb.cpp
+++ b/libopie/tododb.cpp
@@ -1,254 +1,258 @@
#include <qdir.h>
#include <opie/tododb.h>
#include <opie/xmltree.h>
#include <opie/todoresource.h>
#include <qpe/palmtoprecord.h>
#include <qpe/global.h>
using namespace Opie;
namespace {
class FileToDoResource : public ToDoResource {
public:
FileToDoResource() {};
+ // FIXME better parsing
bool save(const QString &name, const QValueList<ToDoEvent> &m_todos ){
// prepare the XML
XMLElement *tasks = new XMLElement( );
tasks->setTagName("Tasks" );
for( QValueList<ToDoEvent>::ConstIterator it = m_todos.begin(); it != m_todos.end(); ++it ){
XMLElement::AttributeMap map;
XMLElement *task = new XMLElement();
map.insert( "Completed", QString::number((int)(*it).isCompleted() ) );
map.insert( "HasDate", QString::number((int)(*it).hasDate() ) );
map.insert( "Priority", QString::number( (*it).priority() ) );
+ map.insert( "Summary", (*it).summary() );
QArray<int> arrat = (*it).categories();
QString attr;
for(uint i=0; i < arrat.count(); i++ ){
attr.append(QString::number(arrat[i])+";" );
}
if(!attr.isEmpty() ) // remove the last ;
attr.remove(attr.length()-1, 1 );
map.insert( "Categories", attr );
//else
//map.insert( "Categories", QString::null );
map.insert( "Description", (*it).description() );
if( (*it).hasDate() ){
map.insert("DateYear", QString::number( (*it).date().year() ) );
map.insert("DateMonth", QString::number( (*it).date().month() ) );
map.insert("DateDay", QString::number( (*it).date().day() ) );
}
map.insert("Uid", QString::number( (*it).uid() ) );
task->setTagName("Task" );
task->setAttributes( map );
tasks->appendChild(task);
}
QFile file( name);
if( file.open(IO_WriteOnly ) ){
QTextStream stream(&file );
stream.setEncoding( QTextStream::UnicodeUTF8 );
stream << "<!DOCTYPE Tasks>" << endl;
tasks->save(stream );
delete tasks;
stream << "</Tasks>" << endl;
file.close();
return true;
}
return false;
}
QValueList<ToDoEvent> load( const QString &name ){
qWarning("loading tododb" );
QValueList<ToDoEvent> m_todos;
XMLElement *root = XMLElement::load( name );
if(root != 0l ){ // start parsing
qWarning("ToDoDB::load tagName(): %s", root->tagName().latin1() );
//if( root->tagName() == QString::fromLatin1("Tasks" ) ){// Start
XMLElement *element = root->firstChild();
element = element->firstChild();
while( element ){
if( element->tagName() != QString::fromLatin1("Task") ){
element = element->nextChild();
continue;
}
qWarning("ToDoDB::load element tagName() : %s", element->tagName().latin1() );
QString dummy;
ToDoEvent event;
bool ok;
int dumInt;
// completed
dummy = element->attribute("Completed" );
dumInt = dummy.toInt(&ok );
if(ok ) event.setCompleted( dumInt == 0 ? false : true );
// hasDate
dummy = element->attribute("HasDate" );
dumInt = dummy.toInt(&ok );
if(ok ) event.setHasDate( dumInt == 0 ? false: true );
// set the date
bool hasDa = dumInt;
if ( hasDa ) { //parse the date
int year, day, month = 0;
year = day = month;
// year
dummy = element->attribute("DateYear" );
dumInt = dummy.toInt(&ok );
if( ok ) year = dumInt;
// month
dummy = element->attribute("DateMonth" );
dumInt = dummy.toInt(&ok );
if(ok ) month = dumInt;
dummy = element->attribute("DateDay" );
dumInt = dummy.toInt(&ok );
if(ok ) day = dumInt;
// set the date
QDate date( year, month, day );
event.setDate( date);
}
dummy = element->attribute("Priority" );
dumInt = dummy.toInt(&ok );
if(!ok ) dumInt = ToDoEvent::NORMAL;
event.setPriority( dumInt );
//description
dummy = element->attribute("Description" );
event.setDescription( dummy );
+ dummy = element->attribute("Summary" );
+ event.setSummary( dummy );
// category
dummy = element->attribute("Categories" );
QStringList ids = QStringList::split(";", dummy );
- event.setCategories( ids );
-
+ event.setCategories( ids );
+
//uid
dummy = element->attribute("Uid" );
dumInt = dummy.toInt(&ok );
if(ok ) event.setUid( dumInt );
m_todos.append( event );
element = element->nextChild(); // next element
}
//}
}else {
qWarning("could not load" );
}
delete root;
qWarning("returning" );
return m_todos;
}
};
}
ToDoDB::ToDoDB(const QString &fileName, ToDoResource *res ){
m_fileName = fileName;
if( fileName.isEmpty() && res == 0 ){
m_fileName = Global::applicationFileName("todolist","todolist.xml");
res = new FileToDoResource();
//qWarning("%s", m_fileName.latin1() );
}else if(res == 0 ){ // let's create a ToDoResource for xml
res = new FileToDoResource();
}
m_res = res;
load();
}
ToDoResource* ToDoDB::resource(){
return m_res;
};
void ToDoDB::setResource( ToDoResource *res )
{
delete m_res;
m_res = res;
}
ToDoDB::~ToDoDB()
{
delete m_res;
}
QValueList<ToDoEvent> ToDoDB::effectiveToDos(const QDate &from, const QDate &to,
bool all )
{
QValueList<ToDoEvent> events;
for( QValueList<ToDoEvent>::Iterator it = m_todos.begin(); it!= m_todos.end(); ++it ){
if( (*it).hasDate() ){
if( (*it).date() >= from && (*it).date() <= to )
events.append( (*it) );
}else if( all ){
events.append( (*it) );
}
}
return events;
}
QValueList<ToDoEvent> ToDoDB::effectiveToDos(const QDate &from,
bool all)
{
return effectiveToDos( from, QDate::currentDate(), all );
}
QValueList<ToDoEvent> ToDoDB::overDue()
{
QValueList<ToDoEvent> events;
- for( QValueList<ToDoEvent>::Iterator it = m_todos.begin(); it!= m_todos.end(); ++it ){
+ for( QValueList<ToDoEvent>::Iterator it = m_todos.begin(); it!= m_todos.end(); ++it ){
if( (*it).isOverdue() )
events.append((*it) );
}
return events;
}
QValueList<ToDoEvent> ToDoDB::rawToDos()
{
return m_todos;
}
void ToDoDB::addEvent( const ToDoEvent &event )
{
m_todos.append( event );
}
void ToDoDB::editEvent( const ToDoEvent &event )
{
m_todos.remove( event );
m_todos.append( event );
}
void ToDoDB::removeEvent( const ToDoEvent &event )
{
m_todos.remove( event );
}
void ToDoDB::replaceEvent(const ToDoEvent &event )
{
QValueList<ToDoEvent>::Iterator it;
int uid = event.uid();
// == is not overloaded as we would like :( so let's search for the uid
for(it = m_todos.begin(); it != m_todos.end(); ++it ){
if( (*it).uid() == uid ){
m_todos.remove( (*it) );
break; // should save us the iterate is now borked
}
}
m_todos.append(event);
}
void ToDoDB::reload()
{
load();
}
void ToDoDB::mergeWith(const QValueList<ToDoEvent>& events )
{
QValueList<ToDoEvent>::ConstIterator it;
for( it = events.begin(); it != events.end(); ++it ){
replaceEvent( (*it) );
}
}
void ToDoDB::setFileName(const QString &file )
{
m_fileName =file;
}
QString ToDoDB::fileName()const
{
return m_fileName;
}
void ToDoDB::load()
{
- m_todos = m_res->load( m_fileName );
+ m_todos = m_res->load( m_fileName );
}
bool ToDoDB::save()
{
return m_res->save( m_fileName, m_todos );
}
diff --git a/libopie/todoevent.cpp b/libopie/todoevent.cpp
index aa348a2..fb7073c 100644
--- a/libopie/todoevent.cpp
+++ b/libopie/todoevent.cpp
@@ -1,240 +1,269 @@
#include <opie/todoevent.h>
#include <qpe/palmtopuidgen.h>
#include <qpe/stringutil.h>
#include <qpe/palmtoprecord.h>
#include <qpe/stringutil.h>
#include <qpe/categories.h>
#include <qpe/categoryselect.h>
#include <qobject.h>
ToDoEvent::ToDoEvent(const ToDoEvent &event )
{
*this = event;
}
-ToDoEvent::ToDoEvent(bool completed, int priority, const QStringList &category,
- const QString &description, bool hasDate, QDate date, int uid )
+ToDoEvent::ToDoEvent(bool completed, int priority,
+ const QStringList &category,
+ const QString& summary,
+ const QString &description,
+ bool hasDate, QDate date, int uid )
{
m_date = date;
m_isCompleted = completed;
m_hasDate = hasDate;
m_priority = priority;
m_category = category;
+ m_sum = summary;
m_desc = Qtopia::simplifyMultiLineSpace(description );
if (uid == -1 ) {
Qtopia::UidGen *uidgen = new Qtopia::UidGen();
uid = uidgen->generate();
delete uidgen;
}// generate the ids
- m_uid = uid;
+ m_uid = uid;
}
QArray<int> ToDoEvent::categories()const
{
QArray<int> array(m_category.count() ); // currently the datebook can be only in one category
array = Qtopia::Record::idsFromString( m_category.join(";") );
return array;
}
bool ToDoEvent::match( const QRegExp &regExp )const
{
if( QString::number( m_priority ).find( regExp ) != -1 ){
return true;
}else if( m_hasDate && m_date.toString().find( regExp) != -1 ){
return true;
}else if(m_desc.find( regExp ) != -1 ){
return true;
}
return false;
}
bool ToDoEvent::isCompleted() const
{
return m_isCompleted;
}
bool ToDoEvent::hasDate() const
{
return m_hasDate;
}
int ToDoEvent::priority()const
{
return m_priority;
}
QStringList ToDoEvent::allCategories()const
{
return m_category;
}
+QString ToDoEvent::extra(const QString& )const
+{
+ return QString::null;
+}
+QString ToDoEvent::summary() const
+{
+ return m_sum;
+}
void ToDoEvent::insertCategory(const QString &str )
{
m_category.append( str );
}
void ToDoEvent::clearCategories()
{
m_category.clear();
}
void ToDoEvent::setCategories(const QStringList &list )
{
m_category = list;
}
QDate ToDoEvent::date()const
{
return m_date;
}
QString ToDoEvent::description()const
{
return m_desc;
}
void ToDoEvent::setCompleted( bool completed )
{
m_isCompleted = completed;
}
void ToDoEvent::setHasDate( bool hasDate )
{
m_hasDate = hasDate;
}
void ToDoEvent::setDescription(const QString &desc )
{
m_desc = Qtopia::simplifyMultiLineSpace(desc );
}
+void ToDoEvent::setExtra( const QString&, const QString& )
+{
+
+}
+void ToDoEvent::setSummary( const QString& sum )
+{
+ m_sum = sum;
+}
void ToDoEvent::setCategory( const QString &cat )
{
qWarning("setCategory %s", cat.latin1() );
m_category.clear();
m_category << cat;
}
void ToDoEvent::setPriority(int prio )
{
m_priority = prio;
}
void ToDoEvent::setDate( QDate date )
{
m_date = date;
}
bool ToDoEvent::isOverdue( )
{
if( m_hasDate )
return QDate::currentDate() > m_date;
return false;
}
/*!
Returns a richt text string
*/
QString ToDoEvent::richText() const
{
QString text;
QStringList catlist;
-
+
// Description of the todo
if ( !description().isEmpty() ){
+ text += "<b>" + QObject::tr( "Summary:") + "</b><br>";
+ text += Qtopia::escapeString(summary() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>";
text += "<b>" + QObject::tr( "Description:" ) + "</b><br>";
text += Qtopia::escapeString(description() ).replace(QRegExp( "[\n]"), "<br>" ) + "<br>";
}
text += "<b>" + QObject::tr( "Priority:") +" </b>"
+ QString::number( priority() ) + "<br>";
if (hasDate() ){
text += "<b>" + QObject::tr( "Deadline:") + " </b>";
text += date().toString();
text += "<br>";
}
-
+
// Open database of all categories and get the list of
// the categories this todoevent belongs to.
// Then print them...
// I am not sure whether there is no better way doing this !?
Categories catdb;
bool firstloop = true;
catdb.load( categoryFileName() );
catlist = allCategories();
-
+
text += "<b>" + QObject::tr( "Category:") + "</b> ";
for ( QStringList::Iterator it = catlist.begin(); it != catlist.end(); ++it ) {
if (!firstloop){
text += ", ";
}
firstloop = false;
text += catdb.label ("todo", (*it).toInt());
}
text += "<br>";
return text;
}
bool ToDoEvent::operator<( const ToDoEvent &toDoEvent )const{
if( !hasDate() && !toDoEvent.hasDate() ) return true;
if( !hasDate() && toDoEvent.hasDate() ) return true;
if( hasDate() && toDoEvent.hasDate() ){
if( date() == toDoEvent.date() ){ // let's the priority decide
return priority() < toDoEvent.priority();
}else{
return date() < toDoEvent.date();
}
}
return false;
}
bool ToDoEvent::operator<=(const ToDoEvent &toDoEvent )const
{
if( !hasDate() && !toDoEvent.hasDate() ) return true;
if( !hasDate() && toDoEvent.hasDate() ) return true;
if( hasDate() && toDoEvent.hasDate() ){
if( date() == toDoEvent.date() ){ // let's the priority decide
return priority() <= toDoEvent.priority();
}else{
return date() <= toDoEvent.date();
}
}
return true;
}
bool ToDoEvent::operator>(const ToDoEvent &toDoEvent )const
{
if( !hasDate() && !toDoEvent.hasDate() ) return false;
if( !hasDate() && toDoEvent.hasDate() ) return false;
if( hasDate() && toDoEvent.hasDate() ){
if( date() == toDoEvent.date() ){ // let's the priority decide
return priority() > toDoEvent.priority();
}else{
return date() > toDoEvent.date();
}
}
return false;
}
bool ToDoEvent::operator>=(const ToDoEvent &toDoEvent )const
{
if( !hasDate() && !toDoEvent.hasDate() ) return true;
if( !hasDate() && toDoEvent.hasDate() ) return false;
if( hasDate() && toDoEvent.hasDate() ){
if( date() == toDoEvent.date() ){ // let's the priority decide
return priority() > toDoEvent.priority();
}else{
return date() > toDoEvent.date();
}
}
return true;
}
bool ToDoEvent::operator==(const ToDoEvent &toDoEvent )const
{
- if( m_date == toDoEvent.m_date && m_isCompleted == toDoEvent.m_isCompleted && m_hasDate == toDoEvent.m_hasDate && m_priority == toDoEvent.m_priority && m_category == toDoEvent.m_category && m_desc == toDoEvent.m_desc )
+ if( m_priority == toDoEvent.m_priority &&
+ m_isCompleted == toDoEvent.m_isCompleted &&
+ m_hasDate == toDoEvent.m_hasDate &&
+ m_date == toDoEvent.m_date &&
+ m_category == toDoEvent.m_category &&
+ m_sum == toDoEvent.m_sum &&
+ m_desc == toDoEvent.m_desc )
return true;
return false;
}
ToDoEvent &ToDoEvent::operator=(const ToDoEvent &item )
{
m_date = item.m_date;
m_isCompleted = item.m_isCompleted;
m_hasDate = item.m_hasDate;
m_priority = item.m_priority;
m_category = item.m_category;
m_desc = item.m_desc;
m_uid = item.m_uid;
+ m_sum = item.m_sum;
return *this;
}
diff --git a/libopie/todoevent.h b/libopie/todoevent.h
index 8a00f99..7454241 100644
--- a/libopie/todoevent.h
+++ b/libopie/todoevent.h
@@ -1,92 +1,151 @@
#ifndef todoevent_h
#define todoevent_h
+#include <qmap.h>
#include <qregexp.h>
#include <qstringlist.h>
#include <qdatetime.h>
class ToDoEvent {
friend class ToDoDB;
public:
// priorities from Very low to very high
enum Priority { VERYHIGH=1, HIGH, NORMAL, LOW, VERYLOW };
/* Constructs a new ToDoEvent
@param completed Is the TodoEvent completed
@param priority What is the priority of this ToDoEvent
@param category Which category does it belong( uid )
+ @param summary A small summary of the todo
@param description What is this ToDoEvent about
@param hasDate Does this Event got a deadline
@param date what is the deadline?
@param uid what is the UUID of this Event
**/
- ToDoEvent( bool completed = false, int priority = NORMAL,
- const QStringList &category = QStringList(),
- const QString &description = QString::null ,
+ ToDoEvent( bool completed = false, int priority = NORMAL,
+ const QStringList &category = QStringList(),
+ const QString &summary = QString::null ,
+ const QString &description = QString::null,
bool hasDate = false, QDate date = QDate::currentDate(), int uid = -1 );
/* Copy c'tor
**/
ToDoEvent(const ToDoEvent & );
/*
Is this event completed?
**/
bool isCompleted() const;
/*
Does this Event have a deadline
**/
bool hasDate() const;
/*
What is the priority?
**/
int priority()const ;
+
+ /*
+ All category numbers as QString in a List
+ **/
QStringList allCategories()const;
+
+ /*
+ * Same as above but with QArray<int>
+ */
QArray<int> categories() const;
+
+ /**
+ * The end Date
+ */
QDate date()const;
+
+ /**
+ * The description of the todo
+ */
QString description()const;
+ /**
+ * A small summary of the todo
+ */
+ QString summary() const;
+
+ /**
+ * Return this todoevent in a RichText formatted QString
+ */
QString richText() const;
+ /**
+ * Returns the UID of the Todo
+ */
int uid()const { return m_uid;};
+
+
+ QString extra(const QString& )const;
+ /**
+ * Set if this Todo is completed
+ */
void setCompleted(bool completed );
+
+ /**
+ * set if this todo got an end data
+ */
void setHasDate( bool hasDate );
// if the category doesn't exist we will create it
- // this sets the the Category after this call category will be the only category
+ // this sets the the Category after this call category will be the only category
void setCategory( const QString &category );
// adds a category to the Categories of this event
void insertCategory(const QString &category );
+
+ /**
+ * Removes this event from all categories
+ */
void clearCategories();
+
+ /**
+ * This todo belongs to xxx categories
+ */
void setCategories(const QStringList& );
+ /**
+ * Set the priority of the Todo
+ */
void setPriority(int priority );
+
+ /**
+ * set the end date
+ */
void setDate( QDate date );
void setDescription(const QString& );
+ void setSummary(const QString& );
+ void setExtra( const QString&, const QString& );
bool isOverdue();
bool match( const QRegExp &r )const;
void setUid(int id) {m_uid = id; };
bool operator<(const ToDoEvent &toDoEvent )const;
bool operator<=(const ToDoEvent &toDoEvent )const;
bool operator!=(const ToDoEvent &toDoEvent )const { return !(*this == toDoEvent); };
bool operator>(const ToDoEvent &toDoEvent )const;
bool operator>=(const ToDoEvent &toDoEvent)const;
bool operator==(const ToDoEvent &toDoEvent )const;
ToDoEvent &operator=(const ToDoEvent &toDoEvent );
private:
class ToDoEventPrivate;
ToDoEventPrivate *d;
QDate m_date;
bool m_isCompleted:1;
bool m_hasDate:1;
int m_priority;
QStringList m_category;
QString m_desc;
+ QString m_sum;
+ QMap<QString, QString> m_extra;
int m_uid;
};
#endif
diff --git a/libopie/todovcalresource.cpp b/libopie/todovcalresource.cpp
index 75f2197..80f8c60 100644
--- a/libopie/todovcalresource.cpp
+++ b/libopie/todovcalresource.cpp
@@ -1,153 +1,158 @@
/*
               =. This file is part of the OPIE Project
             .=l. Copyright (c) 2002 Holger Freyther <freyther@kde.org>
           .>+-= the use of vobject was inspired by libkcal
- _;:,     .>    :=|. This library is free software; you can
+ _;:,     .>    :=|. This library is free software; you can
.> <`_,   >  .   <= redistribute it and/or modify it under
:`=1 )Y*s>-.--   : the terms of the GNU Library 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 library is distributed in the hope that
+    .%`+i>       _;_.
+    .i_,=:_.      -<s. This library 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 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 <qfile.h>
#include <qvaluelist.h>
#include <opie/todoevent.h>
#include <opie/todovcalresource.h>
#include "../library/backend/vobject_p.h"
#include "../library/backend/timeconversion.h"
#include "../library/backend/qfiledirect_p.h"
static VObject *vobjByEvent( const ToDoEvent &event )
{
VObject *task = newVObject( VCTodoProp );
if( task == 0 )
return 0l;
if( event.hasDate() )
addPropValue( task, VCDueProp, TimeConversion::toISO8601( event.date() ) );
if( event.isCompleted() )
addPropValue( task, VCStatusProp, "COMPLETED");
QString string = QString::number(event.priority() );
addPropValue( task, VCPriorityProp, string.local8Bit() );
addPropValue( task, VCCategoriesProp, event.allCategories().join(";").local8Bit() );
addPropValue( task, VCDescriptionProp, event.description().local8Bit() );
- addPropValue( task, VCSummaryProp, event.description().left(15).local8Bit() );
+ addPropValue( task, VCSummaryProp, event.summary().left(15).local8Bit() );
return task;
};
static ToDoEvent eventByVObj( VObject *obj ){
ToDoEvent event;
VObject *ob;
QCString name;
// no uid, attendees, ... and no fun
// description
if( ( ob = isAPropertyOf( obj, VCDescriptionProp )) != 0 ){
name = vObjectStringZValue( ob );
event.setDescription( name );
- }
+ }
+ // summary
+ if ( ( ob = isAPropertyOf( obj, VCSummaryProp ) ) != 0 ) {
+ name = vObjectStringZValue( ob );
+ event.setSummary( name );
+ }
// completed
if( ( ob = isAPropertyOf( obj, VCStatusProp )) != 0 ){
name = vObjectStringZValue( ob );
if( name == "COMPLETED" ){
event.setCompleted( true );
}else{
event.setCompleted( false );
}
}else
event.setCompleted( false );
// priority
if ((ob = isAPropertyOf(obj, VCPriorityProp))) {
name = vObjectStringZValue( ob );
bool ok;
event.setPriority(name.toInt(&ok) );
}
//due date
if((ob = isAPropertyOf(obj, VCDueProp)) ){
event.setHasDate( true );
name = vObjectStringZValue( ob );
event.setDate( TimeConversion::fromISO8601( name).date() );
- }
+ }
// categories
if((ob = isAPropertyOf( obj, VCCategoriesProp )) != 0 ){
name = vObjectStringZValue( ob );
qWarning("Categories:%s", name.data() );
}
return event;
};
-QValueList<ToDoEvent> ToDoVCalResource::load(const QString &file)
+QValueList<ToDoEvent> ToDoVCalResource::load(const QString &file)
{
QValueList<ToDoEvent> events;
VObject *vcal = 0l;
vcal = Parse_MIME_FromFileName( (char *)file.utf8().data() ); // from vobject
if(!vcal )
return events;
// start parsing
VObjectIterator it;
VObject *vobj;
initPropIterator(&it, vcal);
while( moreIteration( &it ) ) {
vobj = ::nextVObject( &it );
QCString name = ::vObjectName( vobj );
//QCString objVal = ::vObjectStringZValue( vobj );
// let's find out the type
if( name == VCTodoProp ){
events.append( eventByVObj( vobj ) );
} // parse the value
}
return events;
}
bool ToDoVCalResource::save(const QString &fileName, const QValueList<ToDoEvent>&list )
{
QFileDirect file ( fileName );
if(!file.open(IO_WriteOnly ) )
return false;
// obj
VObject *obj;
obj = newVObject( VCCalProp );
addPropValue( obj, VCVersionProp, "1.0" );
VObject *vo;
for(QValueList<ToDoEvent>::ConstIterator it = list.begin(); it != list.end(); ++it ){
vo = vobjByEvent( (*it) );
addVObjectProp(obj, vo );
}
writeVObject( file.directHandle(), obj );
cleanVObject( obj );
cleanStrTbl();
return true;
}