summaryrefslogtreecommitdiffstats
path: root/korn/subjectsdlg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'korn/subjectsdlg.cpp')
-rw-r--r--korn/subjectsdlg.cpp535
1 files changed, 535 insertions, 0 deletions
diff --git a/korn/subjectsdlg.cpp b/korn/subjectsdlg.cpp
new file mode 100644
index 00000000..9b675e0b
--- /dev/null
+++ b/korn/subjectsdlg.cpp
@@ -0,0 +1,535 @@
+#include "subjectsdlg.h"
+#include "maildrop.h"
+#include <qapplication.h>
+#include <kcursor.h>
+#include <kdebug.h>
+#include <qlayout.h>
+#include <qdatetime.h>
+#include <qtimer.h>
+#include "mailsubject.h"
+#include <klocale.h>
+#include <qprogressdialog.h>
+#include <kmessagebox.h>
+#include "maildlg.h"
+#include "progress_dialog.h"
+
+KornSubjectsDlg::SubjectListViewItem::SubjectListViewItem( QListView *parent, KornMailSubject * item)
+ // set the column strings except column 2 (date)
+ : KListViewItem(parent, item->getSender(), item->getSubject(), "", KGlobal::locale()->formatNumber(item->getSize(), 0))
+ , _mailSubject( new KornMailSubject( *item ) )
+{
+ // convert the date according to the user settings and show it in column 2
+ QDateTime date;
+ date.setTime_t(_mailSubject->getDate());
+ setText(2, KGlobal::locale()->formatDateTime(date, true, true));
+}
+
+KornSubjectsDlg::SubjectListViewItem::~SubjectListViewItem()
+{
+ delete _mailSubject;
+}
+
+int KornSubjectsDlg::SubjectListViewItem::compare( QListViewItem* item, int column, bool ascending ) const
+{
+ if ( column == 2 )
+ {
+ // if column 2 was clicked, compare the dates.
+ QDateTime d, e;
+ d.setTime_t(_mailSubject->getDate());
+ e.setTime_t(((SubjectListViewItem *)item)->_mailSubject->getDate());
+ return e.secsTo( d );
+ }
+ else if ( column == 3 )
+ {
+ // if column 3 was clicked, compare the sizes.
+ int i1 = _mailSubject->getSize();
+ int i2 = ((SubjectListViewItem *)item)->_mailSubject->getSize();
+ return i1 - i2;
+ }
+ else
+ {
+ // otherwise call default handling (i.e. string compare)
+ return KListViewItem::compare( item, column, ascending );
+ }
+}
+
+KornSubjectsDlg::KornSubjectsDlg( QWidget *parent )
+ : KDialogBase( parent, "urldialog", true, "test", Close, Close, true), _mailDrop( new QPtrList< KMailDrop > ),
+ _subjects(0), _delete(0), mailDlg(0), _canDeleteMaildrop( true )
+{
+ _loadSubjectsCanceled = false;
+ setModal( true );
+
+ // The dialog contains a list view and several buttons.
+ // Two box layouts hol dthem.
+ QWidget * page = new QWidget( this );
+ setMainWidget(page);
+ invertSelButton = new KPushButton(i18n("&Invert Selection"), page);
+ clearSelButton = new KPushButton(i18n("&Remove Selection"), page);
+ deleteButton = new KPushButton(i18n("&Delete"), page);
+ showButton = new KPushButton(i18n("&Show"), page);
+ deleteButton->setEnabled(false);
+ showButton->setEnabled(false);
+ QVBoxLayout * topLayout = new QVBoxLayout( page, 0, spacingHint() );
+ QHBoxLayout * buttons = new QHBoxLayout();
+ _list = new KListView(page);
+ topLayout->addWidget(_list, 10);
+ topLayout->addLayout(buttons, 0);
+ buttons->addWidget(invertSelButton, 0);
+ buttons->addWidget(clearSelButton, 0);
+ buttons->addWidget(deleteButton, 0);
+ buttons->addWidget(showButton, 0);
+ buttons->addStretch(10);
+
+ // feed the list view with its colums
+ _list->setSelectionMode(QListView::Multi);
+ _list->addColumn(i18n("From"));
+ _list->addColumn(i18n("Subject"));
+ _list->addColumn(i18n("Date"));
+ _list->addColumn(i18n("Size (Bytes)"));
+
+ // column 3 contains a number (change alignment)
+ _list->setColumnAlignment(3, Qt::AlignRight);
+ _list->setItemMargin(3);
+
+ // connect the selection changed and double click events of the list view
+ connect(_list, SIGNAL(selectionChanged()), this, SLOT(listSelectionChanged()));
+ connect(_list, SIGNAL(executed(QListViewItem *)), this, SLOT(doubleClicked(QListViewItem *)));
+
+ // connect the buttons
+ connect(invertSelButton, SIGNAL(clicked()), this, SLOT(invertSelection()));
+ connect(clearSelButton, SIGNAL(clicked()), this, SLOT(removeSelection()));
+ connect(showButton, SIGNAL(clicked()), this, SLOT(showMessage()));
+ connect(deleteButton, SIGNAL(clicked()), this, SLOT(deleteMessage()));
+ setInitialSize(QSize(QApplication::desktop()->width(), QApplication::desktop()->height()));
+}
+
+void KornSubjectsDlg::clear()
+{
+ _mailDrop->clear();
+}
+
+void KornSubjectsDlg::addMailBox(KMailDrop* mailDrop)
+{
+ _mailDrop->append( mailDrop );
+}
+
+void KornSubjectsDlg::loadMessages()
+{
+ reloadSubjects();
+ exec();
+}
+
+void KornSubjectsDlg::listSelectionChanged()
+{
+ QPtrList< QListViewItem > list( _list->selectedItems() );
+
+ if (!_mailDrop)
+ return;
+ int selected = list.count();
+ bool enableDelete = selected > 0;
+
+ if(enableDelete)
+ {
+ KornSubjectsDlg::SubjectListViewItem* current = (SubjectListViewItem*)list.first();
+ KMailDrop *drop = current->getMailSubject()->getMailDrop();
+ enableDelete = drop->canDeleteMails();
+
+ while( enableDelete && ( current = (SubjectListViewItem*)list.next() ) )
+ enableDelete = current->getMailSubject()->getMailDrop()->canDeleteMails();
+ }
+
+ // eneable the show button if one is selected
+ showButton->setEnabled(selected == 1);
+
+ // eneable the delete button if one or more items are selected
+
+ deleteButton->setEnabled(enableDelete);
+}
+
+void KornSubjectsDlg::doubleClicked(QListViewItem * item)
+{
+ // show the message
+ showMessage(item);
+}
+
+KornSubjectsDlg::~KornSubjectsDlg()
+{
+ if (_subjects)
+ delete _subjects;
+ _subjects = 0;
+}
+
+void KornSubjectsDlg::loadSubjectsCanceled()
+{
+ _loadSubjectsCanceled = true;
+}
+
+void KornSubjectsDlg::invertSelection()
+{
+ _list->invertSelection();
+}
+
+void KornSubjectsDlg::removeSelection()
+{
+ _list->clearSelection();
+}
+
+void KornSubjectsDlg::showMessage()
+{
+ if (!_mailDrop)
+ return;
+
+ // get selcted item
+ QPtrList<QListViewItem> messages = _list->selectedItems();
+ QListViewItem * item = messages.first();
+
+ // and show it
+ showMessage(item);
+}
+
+void KornSubjectsDlg::showMessage(QListViewItem * item )
+{
+ if (!item)
+ return;
+
+ // Create mail dialog if it has not been created so far.
+ if (!mailDlg)
+ mailDlg = new KornMailDlg (this);
+
+ // Feed the mail dailog with data and show it (modal dialog)
+ mailDlg->setMailSubject( ( ( KornSubjectsDlg::SubjectListViewItem *)item )->getMailSubject() );
+ mailDlg->exec();
+}
+
+void KornSubjectsDlg::showSubjectsDlg( const QString& name )
+{
+ setCaption( i18n("Mails in Box: %1").arg( name ) );
+
+ // load the subjects
+ reloadSubjects();
+ // if the load process was not cancled: show the dialog
+ if( this->isVisible() )
+ exec();
+}
+
+void KornSubjectsDlg::closeDialog( )
+{
+ disconnect( this, SIGNAL( finished() ), this, SLOT( closeDialog() ) );
+}
+
+//----------------------------
+// ALL FUNCTIONS WITH HAVE SOMETHING TO DO WITH FETCHING SUBJECTS
+//----------------------------
+
+//The public function
+void KornSubjectsDlg::reloadSubjects()
+{
+ if( _subjects )
+ return; //Already fetching
+
+ makeSubjectsStruct();
+
+ _subjects->progress->setNumberOfBoxes( _mailDrop->count() );
+ _subjects->progress->setProgressOfBoxes( 0 );
+ _subjects->progress->setNumberOfSteps( 1 );
+ _subjects->progress->setProgress( 0 );
+
+ _subjects->it->toFirst();
+
+ if( !_subjects->it->current() )
+ return; //No maildrops available.
+
+ _subjects->progress->show();
+
+ prepareStep1Subjects( _subjects->it->current() );
+}
+
+//Private help-functions
+void KornSubjectsDlg::prepareStep1Subjects( KMailDrop *drop )
+{
+ _subjects->progress->setText( i18n( "Rechecking box..." ) );
+ _subjects->progress->setNumberOfSteps( 1 );
+ _subjects->progress->setProgress( 0 );
+ _subjects->atRechecking = true;
+
+ connect( drop, SIGNAL( rechecked() ), this, SLOT( slotReloadRechecked() ) );
+ drop->recheck();
+}
+
+void KornSubjectsDlg::removeStep1Subjects( KMailDrop *drop )
+{
+ disconnect( drop, SIGNAL( rechecked() ), this, SLOT( slotReloadRechecked() ) );
+}
+
+void KornSubjectsDlg::prepareStep2Subjects( KMailDrop *drop )
+{
+ _subjects->progress->setText( i18n( "Fetching messages..." ) );
+ _subjects->atRechecking = false;
+
+ connect( drop, SIGNAL( readSubject( KornMailSubject* ) ), this, SLOT( subjectAvailable( KornMailSubject* ) ) );
+ connect( drop, SIGNAL( readSubjectsReady( bool ) ), this, SLOT( subjectsReady( bool ) ) );
+ connect( drop, SIGNAL( readSubjectsTotalSteps( int ) ), _subjects->progress, SLOT( setNumberOfSteps( int ) ) );
+ connect( drop, SIGNAL( readSubjectsProgress( int ) ), _subjects->progress, SLOT( setProgress( int ) ) );
+ connect( _subjects->progress, SIGNAL( cancelPressed() ), drop, SLOT( readSubjectsCanceled() ) );
+
+ if( _subjects->it->current()->canReadSubjects() )
+ _subjects->it->current()->readSubjects( 0 );
+ else
+ subjectsReady( true );
+}
+
+void KornSubjectsDlg::removeStep2Subjects( KMailDrop *drop )
+{
+ disconnect( drop, SIGNAL( readSubject( KornMailSubject* ) ), this, SLOT( subjectAvailable( KornMailSubject* ) ) );
+ disconnect( drop, SIGNAL( readSubjectsReady( bool ) ), this, SLOT( subjectsReady( bool ) ) );
+ disconnect( drop, SIGNAL( readSubjectsTotalSteps( int ) ), _subjects->progress, SLOT( setNumberOfSteps( int ) ) );
+ disconnect( drop, SIGNAL( readSubjectsProgress( int ) ), _subjects->progress, SLOT( setProgress( int ) ) );
+ disconnect( _subjects->progress, SIGNAL( cancelPressed() ), drop, SLOT( readSubjectsCanceled() ) );
+}
+
+bool KornSubjectsDlg::makeSubjectsStruct()
+{
+ if( _subjects ) //Subjects are already being checked
+ return false;
+
+ _subjects = new SubjectsData;
+ _subjects->it = new QPtrListIterator< KMailDrop >( *_mailDrop );
+ _subjects->subjects = new QValueVector< KornMailSubject >;
+ _subjects->progress = new DoubleProgressDialog( this, "progress" );
+ _subjects->atRechecking = true;
+
+ connect( _subjects->progress, SIGNAL( cancelPressed() ), this, SLOT( slotSubjectsCanceled() ) );
+
+ return true;
+}
+
+void KornSubjectsDlg::deleteSubjectsStruct()
+{
+ if( !_subjects )
+ return;
+
+ disconnect( _subjects->progress, SIGNAL( cancelPressed() ), this, SLOT( slotSubjectsCanceled() ) );
+
+ this->unsetCursor();
+
+ delete _subjects->progress;
+ delete _subjects->subjects;
+ delete _subjects->it;
+ delete _subjects; _subjects = 0;
+}
+
+//Slots
+void KornSubjectsDlg::slotReloadRechecked()
+{
+ _subjects->progress->setText( i18n( "Downloading subjects..." ) ); //Progress message when fetching messages
+
+ removeStep1Subjects( _subjects->it->current() );
+ _subjects->subjects->reserve( _subjects->it->current()->count() ); //enlarge QValueVector to speed adding up.
+ prepareStep2Subjects( _subjects->it->current() );
+}
+
+void KornSubjectsDlg::slotSubjectsCanceled()
+{
+ if( !_subjects )
+ return; //Nothing to do
+
+ if( _subjects->atRechecking )
+ removeStep1Subjects( _subjects->it->current() );
+ else
+ removeStep2Subjects( _subjects->it->current() );
+
+ deleteSubjectsStruct();
+}
+
+void KornSubjectsDlg::subjectAvailable( KornMailSubject * subject )
+{
+ if( _subjects )
+ _subjects->subjects->push_back( *subject );
+
+ delete subject;
+
+}
+
+void KornSubjectsDlg::subjectsReady( bool success )
+{
+ static int progress;
+
+ if( !_subjects )
+ return;
+
+ if( _subjects->it->atFirst() )
+ progress = 0;
+
+ removeStep2Subjects( _subjects->it->current() );
+
+ //Goto next drop
+ ++(*_subjects->it);
+ ++progress;
+
+ _subjects->progress->setProgressOfBoxes( progress );
+
+ if( _subjects->it->current() )
+ {
+ prepareStep1Subjects( _subjects->it->current() );
+ } else {
+ //Clear list first
+ _list->clear();
+
+ //All subjects downloaded
+ for( QValueVector<KornMailSubject>::iterator it = _subjects->subjects->begin(); it != _subjects->subjects->end();
+ ++it )
+ { //Draw entry's
+ new SubjectListViewItem(_list, &(*it));
+ }
+
+ if( _subjects->subjects->capacity() != _subjects->subjects->count() )
+ _subjects->subjects->resize( _subjects->subjects->count() );
+
+ deleteSubjectsStruct();
+ //If windows isn't visible already, shows it.
+ if( !isVisible() && success )
+ show();
+ }
+}
+//---------------------------------
+//Here comes all functions with have to do something with deleting messages
+//---------------------------------
+
+
+//Main function
+void KornSubjectsDlg::deleteMessage()
+{
+ if ( _delete )
+ return; //A delete action is already pending
+
+ makeDeleteStruct();
+
+ fillDeleteMessageList();
+
+ if ( _delete->messages->count() == 0 )
+ {
+ deleteDeleteStruct();
+ return; //No messages to delete
+ } else {
+ _delete->totalNumberOfMessages = _delete->messages->count();
+ }
+
+ QString confirmation = i18n( "Do you really want to delete %n message?",
+ "Do you really want to delete %n messages?", _delete->messages->count() );
+
+ if( KMessageBox::questionYesNo( this, confirmation, i18n( "Confirmation" ), KStdGuiItem::del(), KStdGuiItem::cancel() ) != KMessageBox::Yes )
+ {
+ deleteDeleteStruct();
+ return; //Not excepted
+ }
+
+ _delete->progress->setLabelText( i18n( "Deleting mail; please wait...." ) );
+ _delete->progress->setTotalSteps( _delete->totalNumberOfMessages );
+ _delete->progress->setProgress( 0 );
+ _delete->progress->show();
+
+ deleteNextMessage();
+}
+
+//Private help functions
+void KornSubjectsDlg::makeDeleteStruct()
+{
+ _delete = new DeleteData;
+ _delete->messages = new QPtrList< KornMailSubject >;
+ _delete->ids = new QPtrList< const KornMailId >;
+ _delete->progress = new QProgressDialog( this, "progress" );
+ _delete->totalNumberOfMessages = 0;
+
+ connect( _delete->progress, SIGNAL( canceled() ), this, SLOT( slotDeleteCanceled() ) );
+}
+
+void KornSubjectsDlg::deleteDeleteStruct()
+{
+ disconnect( _delete->progress, SIGNAL( canceled() ), this, SLOT( slotDeleteCanceled() ) );
+
+ delete _delete->messages;
+ delete _delete->ids;
+ delete _delete->progress;
+ delete _delete; _delete = 0;
+}
+
+void KornSubjectsDlg::fillDeleteMessageList()
+{
+ QListViewItem *current;
+ QPtrList< QListViewItem > list( _list->selectedItems() );
+
+ for( current = list.first(); current; current = list.next() )
+ _delete->messages->append( ( ( KornSubjectsDlg::SubjectListViewItem * ) current )->getMailSubject() );
+}
+
+void KornSubjectsDlg::fillDeleteIdList( KMailDrop *drop )
+{
+ _delete->ids->clear();
+ KornMailSubject *current;
+
+ for( current = _delete->messages->first(); current; )
+ {
+ if( current->getMailDrop() == drop )
+ {
+ _delete->ids->append( current->getId() );
+ if( _delete->messages->remove( current ) )
+ current = _delete->messages->current(); //If successfull, current() is already the next message
+ else
+ current = _delete->messages->next(); // If removal failed, goto the next item
+ } else {
+ current = _delete->messages->next(); //Goto next item
+ }
+ }
+}
+
+void KornSubjectsDlg::deleteNextMessage()
+{
+ if( _delete->messages->count() == 0 ) //No more messages to delete
+ {
+ QTimer::singleShot( 100, this, SLOT( reloadSubjects() ) );
+ deleteDeleteStruct();
+ //reloadSubjects(); //Reload all subjects again
+ return;
+ }
+
+ _delete->ids = new QPtrList< const KornMailId >;
+ _delete->drop = _delete->messages->getFirst()->getMailDrop();
+
+ fillDeleteIdList( _delete->drop );
+
+ // Connect the progress bar signals of the mail box
+ connect( _delete->drop, SIGNAL( deleteMailsTotalSteps( int ) ), _delete->progress, SLOT( setTotalSteps( int ) ) );
+ connect( _delete->drop, SIGNAL( deleteMailsProgress( int ) ), _delete->progress, SLOT( setProgress( int ) ) );
+ connect( _delete->drop, SIGNAL( deleteMailsReady( bool ) ), this, SLOT( deleteMailsReady( bool ) ) );
+
+ // connect the cancel button of the progress bar
+ connect( _delete->progress, SIGNAL( canceled() ), _delete->drop, SLOT( deleteMailsCanceled() ) );
+
+ // delete the mails
+ _delete->drop->deleteMails( _delete->ids, 0 );
+}
+
+void KornSubjectsDlg::deleteMailsReady( bool /*success*/ )
+{
+ if( !_delete )
+ return;
+
+ disconnect( _delete->drop, SIGNAL( deleteMailsTotalSteps( int ) ), _delete->progress, SLOT( setTotalSteps( int ) ) );
+ disconnect( _delete->drop, SIGNAL( deleteMailsProgress( int ) ), _delete->progress, SLOT( setProgress( int ) ) );
+ disconnect( _delete->drop, SIGNAL( deleteMailsReady( bool ) ), this, SLOT( deleteMailsReady( bool ) ) );
+
+ // disconnect the cancel button of the progress bar
+ disconnect( _delete->progress, SIGNAL( canceled() ), _delete->drop, SLOT( deleteMailsCanceled() ) );
+
+ deleteNextMessage();
+}
+
+void KornSubjectsDlg::slotDeleteCanceled()
+{
+ deleteDeleteStruct();
+ reloadSubjects();
+}
+
+#include "subjectsdlg.moc"
+