-rw-r--r-- | core/pim/todo/todotable.cpp | 2 | ||||
-rw-r--r-- | core/pim/todo/todotable.h | 4 |
2 files changed, 6 insertions, 0 deletions
diff --git a/core/pim/todo/todotable.cpp b/core/pim/todo/todotable.cpp index 208a084..2389cdd 100644 --- a/core/pim/todo/todotable.cpp +++ b/core/pim/todo/todotable.cpp @@ -1,239 +1,241 @@ /********************************************************************** ** 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. ** **********************************************************************/ /* Show Deadline was added by Stefan Eilers (se, eilers.stefan@epost.de) */ #include "todotable.h" #include <opie/tododb.h> #include <opie/xmltree.h> #include <qpe/categoryselect.h> #include <qpe/xmlreader.h> #include <qasciidict.h> #include <qcombobox.h> #include <qfile.h> #include <qpainter.h> #include <qtextcodec.h> #include <qtimer.h> #include <qdatetime.h> #include <qtextstream.h> #include <qcursor.h> #include <qregexp.h> #include <errno.h> #include <stdlib.h> #include <stdio.h> #include <iostream> +using namespace Opie; + namespace { static bool taskCompare( const ToDoEvent &task, const QRegExp &r, int category ); static QString journalFileName(); static ToDoEvent xmlToEvent( XMLElement *ev ); } CheckItem::CheckItem( QTable *t, const QString &key ) : QTableItem( t, Never, "" ), checked( FALSE ), sortKey( key ) { } QString CheckItem::key() const { return sortKey; } void CheckItem::setChecked( bool b ) { checked = b; table()->updateCell( row(), col() ); } void CheckItem::toggle() { TodoTable *parent = static_cast<TodoTable*>(table()); ToDoEvent newTodo = parent->currentEntry(); checked = !checked; newTodo.setCompleted( checked ); table()->updateCell( row(), col() ); parent->replaceCurrentEntry( newTodo, true ); } bool CheckItem::isChecked() const { return checked; } static const int BoxSize = 10; void CheckItem::paint( QPainter *p, const QColorGroup &cg, const QRect &cr, bool ) { p->fillRect( 0, 0, cr.width(), cr.height(), cg.brush( QColorGroup::Base ) ); int marg = ( cr.width() - BoxSize ) / 2; int x = 0; int y = ( cr.height() - BoxSize ) / 2; p->setPen( QPen( cg.text() ) ); p->drawRect( x + marg, y, BoxSize, BoxSize ); p->drawRect( x + marg+1, y+1, BoxSize-2, BoxSize-2 ); p->setPen( darkGreen ); x += 1; y += 1; if ( checked ) { QPointArray a( 7*2 ); int i, xx, yy; xx = x+1+marg; yy = y+2; for ( i=0; i<3; i++ ) { a.setPoint( 2*i, xx, yy ); a.setPoint( 2*i+1, xx, yy+2 ); xx++; yy++; } yy -= 2; for ( i=3; i<7; i++ ) { a.setPoint( 2*i, xx, yy ); a.setPoint( 2*i+1, xx, yy+2 ); xx++; yy--; } p->drawLineSegments( a ); } } ComboItem::ComboItem( QTable *t, EditType et ) : QTableItem( t, et, "3" ), cb( 0 ) { setReplaceable( FALSE ); } QWidget *ComboItem::createEditor() const { QString txt = text(); ( (ComboItem*)this )->cb = new QComboBox( table()->viewport() ); cb->insertItem( "1" ); cb->insertItem( "2" ); cb->insertItem( "3" ); cb->insertItem( "4" ); cb->insertItem( "5" ); cb->setCurrentItem( txt.toInt() - 1 ); return cb; } void ComboItem::setContentFromEditor( QWidget *w ) { TodoTable *parent = static_cast<TodoTable*>(table()); ToDoEvent newTodo = parent->currentEntry(); if ( w->inherits( "QComboBox" ) ) setText( ( (QComboBox*)w )->currentText() ); else QTableItem::setContentFromEditor( w ); newTodo.setPriority( text().toInt() ); parent->replaceCurrentEntry( newTodo, true ); } void ComboItem::setText( const QString &s ) { if ( cb ) cb->setCurrentItem( s.toInt() - 1 ); QTableItem::setText( s ); } QString ComboItem::text() const { if ( cb ) return cb->currentText(); return QTableItem::text(); } DueTextItem::DueTextItem( QTable *t, ToDoEvent *ev ) : QTableItem(t, Never, QString::null ) { setToDoEvent( ev ); } QString DueTextItem::key() const { QString key; if( m_hasDate ){ if(m_off == 0 ){ key.append("b"); }else if( m_off > 0 ){ key.append("c"); }else if( m_off < 0 ){ key.append("a"); } key.append(QString::number(m_off ) ); }else{ key.append("d"); } return key; } void DueTextItem::setToDoEvent( const ToDoEvent *ev ) { m_hasDate = ev->hasDate(); m_completed = ev->isCompleted(); if( ev->hasDate() ){ QDate today = QDate::currentDate(); m_off = today.daysTo(ev->date() ); //qWarning("DueText m_off=%d", m_off ); setText( QString::number(m_off) + " day(s) " ); }else{ setText("n.d." ); m_off = 0; } //qWarning("m_off=%d", m_off ); } void DueTextItem::paint( QPainter *p, const QColorGroup &cg, const QRect &cr, bool selected ) { //qWarning ("paint m_off=%d", m_off ); QColorGroup cg2(cg); QColor text = cg.text(); if( m_hasDate && !m_completed ){ if( m_off < 0 ){ cg2.setColor(QColorGroup::Text, QColor(red ) ); }else if( m_off == 0 ){ cg2.setColor(QColorGroup::Text, QColor(yellow) ); // orange isn't predefined }else if( m_off > 0){ cg2.setColor(QColorGroup::Text, QColor(green ) ); } } QTableItem::paint(p, cg2, cr, selected ); cg2.setColor(QColorGroup::Text, text ); } TodoTable::TodoTable( QWidget *parent, const char *name ) // #ifdef QT_QTABLE_NOHEADER_CONSTRUCTOR // : QTable( 0, 3, parent, name, TRUE ), // #else : QTable( 0, 4, parent, name ), // #endif showComp( true ), enablePainting( true ), mCat( 0 ), currFindRow( -2 ), showDeadl( true) { mCat.load( categoryFileName() ); setSorting( TRUE ); setSelectionMode( NoSelection ); setColumnStretchable( 2, TRUE ); setColumnWidth( 0, 20 ); setColumnWidth( 1, 35 ); diff --git a/core/pim/todo/todotable.h b/core/pim/todo/todotable.h index 2f6e635..7672f21 100644 --- a/core/pim/todo/todotable.h +++ b/core/pim/todo/todotable.h @@ -1,240 +1,244 @@ /********************************************************************** ** 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. ** **********************************************************************/ #ifndef TODOTABLE_H #define TODOTABLE_H #include <qpe/categories.h> #include <qpe/stringutil.h> //#include <qpe/task.h> #include <opie/todoevent.h> #include <qtable.h> #include <qmap.h> #include <qguardedptr.h> class Node; class QComboBox; class QTimer; class CheckItem : public QTableItem { public: CheckItem( QTable *t, const QString &sortkey ); void setChecked( bool b ); void toggle(); bool isChecked() const; void setKey( const QString &key ) { sortKey = key; } QString key() const; void paint( QPainter *p, const QColorGroup &cg, const QRect &cr, bool selected ); private: bool checked; QString sortKey; }; class ComboItem : public QTableItem { public: ComboItem( QTable *t, EditType et ); QWidget *createEditor() const; void setContentFromEditor( QWidget *w ); void setText( const QString &s ); int alignment() const { return Qt::AlignCenter; } QString text() const; private: QGuardedPtr<QComboBox> cb; }; class TodoTextItem : public QTableItem { 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() ); 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 |