summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/pim/todo/mainwindow.cpp2
-rw-r--r--core/pim/todo/todotable.cpp7
2 files changed, 6 insertions, 3 deletions
diff --git a/core/pim/todo/mainwindow.cpp b/core/pim/todo/mainwindow.cpp
index d3f4cb4..a28fc3e 100644
--- a/core/pim/todo/mainwindow.cpp
+++ b/core/pim/todo/mainwindow.cpp
@@ -331,291 +331,293 @@ void TodoWindow::slotDelete()
table->removeCurrentEntry();
table->setPaintingEnabled( true );
if ( table->numRows() == 0 ) {
currentEntryChanged( -1, 0 );
findAction->setEnabled( FALSE );
}
mStack->raiseWidget(1);
}
void TodoWindow::slotDeleteAll()
{
if(syncing) {
QMessageBox::warning(this, tr("Todo"),
tr("Can not edit data, currently syncing"));
return;
}
//QString strName = table->text( table->currentRow(), 2 ).left( 30 );
if ( !QPEMessageBox::confirmDelete( this, tr( "Todo" ), tr("Delete all tasks?") ) )
return;
table->setPaintingEnabled( false );
table->removeAllEntries();
table->setPaintingEnabled( true );
if ( table->numRows() == 0 ) {
currentEntryChanged( -1, 0 );
findAction->setEnabled( FALSE );
}
mStack->raiseWidget(1 );
}
void TodoWindow::slotEdit()
{
if(syncing) {
QMessageBox::warning(this, tr("Todo"),
tr("Can not edit data, currently syncing"));
return;
}
ToDoEvent todo = table->currentEntry();
NewTaskDialog e( todo, this, 0, TRUE );
e.setCaption( tr( "Edit Task" ) );
#if defined(Q_WS_QWS) || defined(_WS_QWS_)
e.showMaximized();
#endif
int ret = e.exec();
if ( ret == QDialog::Accepted ) {
table->setPaintingEnabled( false );
todo = e.todoEntry();
table->replaceCurrentEntry( todo );
table->setPaintingEnabled( true );
}
populateCategories();
mStack->raiseWidget( 1 );
}
void TodoWindow::slotDuplicate()
{
if(syncing) {
QMessageBox::warning(this, tr("Todo"),
tr("Can not edit data, currently syncing"));
return;
}
ToDoEvent ev = table->currentEntry();
ToDoEvent ev2 = ToDoEvent( ev ); // what about the uid
int uid;
{ // uid
Qtopia::UidGen *uidgen = new Qtopia::UidGen();
uid = uidgen->generate();
delete uidgen;
}
ev2.setUid( uid );
table->setPaintingEnabled( false );
table->addEntry( ev2 );
table->setPaintingEnabled( true );
mStack->raiseWidget( 1 );
}
void TodoWindow::slotShowPopup( const QPoint &p )
{
contextMenu->popup( p );
}
void TodoWindow::showCompleted( bool s )
{
if ( !table->isUpdatesEnabled() )
return;
table->setPaintingEnabled( false );
table->setShowCompleted( s );
table->setPaintingEnabled( true );
+ mStack->raiseWidget( 1 );
}
void TodoWindow::currentEntryChanged( int r, int )
{
if ( r != -1 && table->rowHeight( r ) > 0 ) {
editAction->setEnabled( TRUE );
deleteAction->setEnabled( TRUE );
duplicateAction->setEnabled( TRUE );
deleteAllAction->setEnabled( TRUE );
} else {
editAction->setEnabled( FALSE );
deleteAction->setEnabled( FALSE );
duplicateAction->setEnabled( FALSE );
deleteAllAction->setEnabled( FALSE );
}
}
void TodoWindow::setCategory( int c )
{
if ( c <= 0 ) return;
if ( !table->isUpdatesEnabled() )
return;
table->setPaintingEnabled( false );
for ( unsigned int i = 1; i < catMenu->count(); i++ )
catMenu->setItemChecked( i, c == (int)i );
if ( c == 1 ) {
table->setShowCategory( QString::null );
setCaption( tr("Todo") + " - " + tr( "All Categories" ) );
} else if ( c == (int)catMenu->count() - 1 ) {
table->setShowCategory( tr( "Unfiled" ) );
setCaption( tr("Todo") + " - " + tr( "Unfiled" ) );
} else {
QString cat = table->categories()[c - 2];
table->setShowCategory( cat );
setCaption( tr("Todo") + " - " + cat );
}
table->setPaintingEnabled( true );
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();
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/todotable.cpp b/core/pim/todo/todotable.cpp
index 753c036..dc60cc4 100644
--- a/core/pim/todo/todotable.cpp
+++ b/core/pim/todo/todotable.cpp
@@ -505,236 +505,237 @@ void TodoTable::setPaintingEnabled( bool e )
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() + "\"";
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 ){
- list.append( new ToDoEvent( (*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();
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) );
+ ToDoEvent *ev = new ToDoEvent( todo );
+ todoList.insert( static_cast<CheckItem*>(item(row,0)), new ToDoEvent(ev) );
}
}
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:
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,
// so don't give confusing not found message...
wrapAround = true;