From 5ec5bc2080bbc41e025fb98e6571a2c281b775cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sl=C3=A1vek=20Banko?= Date: Tue, 2 Jul 2013 18:32:11 +0200 Subject: Initial import --- kbiff/setupdlg.cpp | 2015 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2015 insertions(+) create mode 100644 kbiff/setupdlg.cpp (limited to 'kbiff/setupdlg.cpp') diff --git a/kbiff/setupdlg.cpp b/kbiff/setupdlg.cpp new file mode 100644 index 0000000..ba2c1a3 --- /dev/null +++ b/kbiff/setupdlg.cpp @@ -0,0 +1,2015 @@ +/* + * setupdlg.cpp + * Copyright (C) 1999-2008 Kurt Granroth + * + * This file contains the implementation of the setup dialog + * class for KBiff. + */ +#include "setupdlg.h" +#include "setupdlg.moc" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include "version.h" + +#include +#include +#include +#include + +#define CONFIG_FILE "kbiffrc" + +#ifdef HAVE_PATHS_H +#include +#endif + +#ifndef _PATH_MAILDIR +#define _PATH_MAILDIR "/var/spool/mail" +#endif + +/////////////////////////////////////////////////////////////////////////// +// KBiffSetup +/////////////////////////////////////////////////////////////////////////// +KBiffSetup::KBiffSetup(const QString& profile_, bool secure_) + : KDialog(0, 0, true) +{ + // set the icon just to be cute + KWin::setIcons(winId(), kapp->icon(), kapp->miniIcon()); + + // make sure the profile is *something* + QString the_profile; + if (profile_.isEmpty() || profile_.isNull()) + the_profile = getSomeProfile(); + else + the_profile = profile_; + + setCaption(i18n("KBiff Setup")); + + // The profile combo box and buttons all go in this groupbox + QGroupBox* profile_groupbox = new QGroupBox(i18n("Profile"), this); + + // combo box to hold the profile names + comboProfile = new QComboBox(false, profile_groupbox); + comboProfile->setSizeLimit(10); + + QString whatsthis = i18n( + "This is a list of all of the KBiff profiles

" + "A profile is a logical grouping of settings for either one " + "mailbox or several mailboxes. Each profile gets one icon " + "and one new mail sound and one... well, everything"); + QWhatsThis::add(comboProfile, whatsthis); + + // Add New Profile button + QPushButton *new_profile_button = new QPushButton(i18n("&New..."), + profile_groupbox); + whatsthis = i18n("Create a new profile"); + QWhatsThis::add(new_profile_button, whatsthis); + connect(new_profile_button, SIGNAL(clicked()), SLOT(slotAddNewProfile())); + + // Rename Profile button + QPushButton *rename_profile_button = new QPushButton(i18n("&Rename..."), + profile_groupbox); + whatsthis = i18n("Rename the current profile"); + QWhatsThis::add(rename_profile_button, whatsthis); + connect(rename_profile_button, SIGNAL(clicked()), SLOT(slotRenameProfile())); + + // Delete Profile button + QPushButton *delete_profile_button = new QPushButton(i18n("&Delete"), + profile_groupbox); + whatsthis = i18n("Delete the current profile"); + QWhatsThis::add(delete_profile_button, whatsthis); + connect(delete_profile_button, SIGNAL(clicked()), SLOT(slotDeleteProfile())); + + // setup the tabs + QTabWidget *tabctl = new QTabWidget(this); + generalTab = new KBiffGeneralTab(the_profile, tabctl); + newmailTab = new KBiffNewMailTab(the_profile, tabctl); + mailboxTab = new KBiffMailboxTab(the_profile, tabctl); + aboutTab = new KBiffAboutTab(tabctl); + + connect(comboProfile, SIGNAL(highlighted(const QString&)), + generalTab, SLOT(readConfig(const QString&))); + connect(comboProfile, SIGNAL(highlighted(const QString&)), + newmailTab, SLOT(readConfig(const QString&))); + connect(comboProfile, SIGNAL(highlighted(const QString&)), + mailboxTab, SLOT(readConfig(const QString&))); + + // add the tabs + tabctl->addTab(generalTab, i18n("General")); + tabctl->addTab(newmailTab, i18n("New Mail")); + tabctl->addTab(mailboxTab, i18n("Mailbox")); + tabctl->addTab(aboutTab, i18n("About")); + + // help button + QPushButton *help_button = new QPushButton(i18n("&Help"), this); + connect(help_button, SIGNAL(clicked()), SLOT(invokeHelp())); + + // ok button + QPushButton *ok_button = new QPushButton(i18n("&OK"), this); + ok_button->setDefault(true); + connect(ok_button, SIGNAL(clicked()), SLOT(slotDone())); + + // cancel button + QPushButton *cancel_button = new QPushButton(i18n("&Cancel"), this); + connect(cancel_button, SIGNAL(clicked()), SLOT(reject())); + + // are we secure? + isSecure = secure_; + + // NOW, SETUP ALL THE LAYOUTS! + // This layout handles the buttons for the profile combobox + QBoxLayout *pro_button_layout = new QBoxLayout(QBoxLayout::LeftToRight, 12); + pro_button_layout->addWidget(new_profile_button); + pro_button_layout->addWidget(rename_profile_button); + pro_button_layout->addWidget(delete_profile_button); + + // This layout handles the upper profile groupbox + QBoxLayout *profile_layout = new QBoxLayout(profile_groupbox, + QBoxLayout::Down, 12); + profile_layout->addSpacing(8); + profile_layout->addWidget(comboProfile); + profile_layout->addLayout(pro_button_layout); + + // This layout handles the dialog buttons + QBoxLayout *dialog_button_layout = new QBoxLayout(QBoxLayout::LeftToRight, + 12); + dialog_button_layout->addWidget(help_button); + dialog_button_layout->addStretch(1); + dialog_button_layout->addWidget(ok_button); + dialog_button_layout->addWidget(cancel_button); + + // This is the outermost layout + QBoxLayout *top_layout = new QBoxLayout(this, QBoxLayout::Down, 12); + top_layout->addWidget(profile_groupbox); + top_layout->addWidget(tabctl, 1); + top_layout->addLayout(dialog_button_layout); + + // Read in the config for this profile + readConfig(the_profile); +} + +KBiffSetup::~KBiffSetup() +{ +} + +bool KBiffSetup::getSecure() const +{ + return isSecure; +} + +const QString KBiffSetup::getProfile() const +{ + return comboProfile->currentText(); +} + +const KBiffURL KBiffSetup::getCurrentMailbox() const +{ + return mailboxTab->getMailbox(); +} + +const QList KBiffSetup::getMailboxList() const +{ + return mailboxTab->getMailboxList(); +} + +const QString KBiffSetup::getMailClient() const +{ + return generalTab->getMailClient(); +} + +const QString KBiffSetup::getNoMailIcon() const +{ + return generalTab->getButtonNoMail(); +} + +const QString KBiffSetup::getNewMailIcon() const +{ + return generalTab->getButtonNewMail(); +} + +const QString KBiffSetup::getOldMailIcon() const +{ + return generalTab->getButtonOldMail(); +} + +const QString KBiffSetup::getNoConnIcon() const +{ + return generalTab->getButtonNoConn(); +} + +const QString KBiffSetup::getStoppedIcon() const +{ + return generalTab->getButtonStopped(); +} + +bool KBiffSetup::getSessionManagement() const +{ + return generalTab->getSessionManagement(); +} + +bool KBiffSetup::getCheckStartup() const +{ + return generalTab->getCheckStartup(); +} + +bool KBiffSetup::getDock() const +{ + return generalTab->getDock(); +} + +unsigned int KBiffSetup::getPoll() const +{ + return generalTab->getPoll(); +} + +const QString KBiffSetup::getRunCommandPath() const +{ + return newmailTab->getRunCommandPath(); +} + +const QString KBiffSetup::getRunResetCommandPath() const +{ + return newmailTab->getRunResetCommandPath(); +} + +const QString KBiffSetup::getPlaySoundPath() const +{ + return newmailTab->getPlaySoundPath(); +} + +bool KBiffSetup::getRunCommand() const +{ + return newmailTab->getRunCommand(); +} + +bool KBiffSetup::getRunResetCommand() const +{ + return newmailTab->getRunResetCommand(); +} + +bool KBiffSetup::getPlaySound() const +{ + return newmailTab->getPlaySound(); +} + +bool KBiffSetup::getSystemBeep() const +{ + return newmailTab->getSystemBeep(); +} + +bool KBiffSetup::getNotify() const +{ + return newmailTab->getNotify(); +} + +bool KBiffSetup::getStatus() const +{ + return newmailTab->getStatus(); +} + +void KBiffSetup::invokeHelp() +{ + kapp->invokeHelp(); +} + +void KBiffSetup::readConfig(const QString& profile_) +{ + QStringList profile_list; + + // open the config file + KSimpleConfig *config = new KSimpleConfig(CONFIG_FILE, true); + config->setDollarExpansion(false); + + config->setGroup("General"); + + // read in the mailboxes + profile_list = config->readListEntry("Profiles", ','); + int number_of_mailboxes = profile_list.count(); + delete config; + + // check if we have any mailboxes to read in + if (number_of_mailboxes > 0) + { + comboProfile->clear(); + + // load up the combo box + comboProfile->insertStringList(profile_list); + + // read in the data from the first mailbox if we don't have a name + for (int i = 0; i < comboProfile->count(); i++) + { + if (QString(profile_) == comboProfile->text(i)) + { + comboProfile->setCurrentItem(i); + break; + } + } + } + else + comboProfile->insertItem(profile_); +} + +QString KBiffSetup::getSomeProfile() const +{ + QStringList profile_list; + + // open the config file + KSimpleConfig *config = new KSimpleConfig(CONFIG_FILE, true); + config->setGroup("General"); + + // read in the mailboxes + profile_list = config->readListEntry("Profiles", ','); + int number_of_mailboxes = profile_list.count(); + delete config; + + // get the first mailbox if it exists + if (number_of_mailboxes > 0) + return profile_list.last(); + else + return QString("Inbox"); +} + +void KBiffSetup::saveConfig() +{ + // open the config file for writing + KSimpleConfig *config = new KSimpleConfig(CONFIG_FILE); + + config->setGroup("General"); + + // get the list of profiles + QStringList profile_list; + for (int i = 0; i < comboProfile->count(); i++) + profile_list.append(comboProfile->text(i)); + + // write the mailboxes + config->writeEntry("Profiles", profile_list, ','); + + delete config; +} + +/////////////////////////////////////////////////////////////////////// +// Protected slots +/////////////////////////////////////////////////////////////////////// +void KBiffSetup::slotDone() +{ + QString profile = comboProfile->currentText(); + saveConfig(); + generalTab->saveConfig(profile); + newmailTab->saveConfig(profile); + mailboxTab->saveConfig(profile); + accept(); +} + +void KBiffSetup::slotAddNewProfile() +{ + KBiffNewDlg dlg; + + // popup the name chooser + dlg.setCaption(i18n("New Profile")); + if (dlg.exec()) + { + QString profile_name = dlg.getName(); + + // bail out if we already have this name + for (int i = 0; i < comboProfile->count(); i++) + { + if (profile_name == comboProfile->text(i)) + return; + } + + // continue only if we received a decent name + if (profile_name.isEmpty() == false) + { + comboProfile->insertItem(profile_name, 0); + + saveConfig(); + readConfig(profile_name); + generalTab->readConfig(profile_name); + newmailTab->readConfig(profile_name); + mailboxTab->readConfig(profile_name); + } + } +} + +void KBiffSetup::slotRenameProfile() +{ + KBiffNewDlg dlg; + QString title; + QString old_profile = comboProfile->currentText(); + + title = i18n("Rename Profile: %1").arg(old_profile); + dlg.setCaption(title); + // popup the name chooser + if (dlg.exec()) + { + QString profile_name = dlg.getName(); + + // bail out if we already have this name + for (int i = 0; i < comboProfile->count(); i++) + { + if (profile_name == comboProfile->text(i)) + return; + } + + // continue only if we received a decent name + if (profile_name.isNull() == false) + { + comboProfile->removeItem(comboProfile->currentItem()); + comboProfile->insertItem(profile_name, 0); + + // remove the reference from the config file + KSimpleConfig *config = new KSimpleConfig(CONFIG_FILE); + // nuke the group + config->deleteGroup(old_profile, true); + delete config; + + // now save the profile settings + saveConfig(); + generalTab->saveConfig(profile_name); + newmailTab->saveConfig(profile_name); + mailboxTab->saveConfig(profile_name); + } + } +} + +void KBiffSetup::slotDeleteProfile() +{ + QString title, msg; + QString profile = comboProfile->currentText(); + + title = i18n("Delete Profile: %1").arg(profile); + msg = i18n("Are you sure you wish to delete this profile?\n"); + + switch (KMessageBox::warningYesNo(this, msg, title)) + { + case KMessageBox::Yes: + { + comboProfile->removeItem(comboProfile->currentItem()); + + saveConfig(); + + // remove the reference from the config file + KSimpleConfig *config = new KSimpleConfig(CONFIG_FILE); + // nuke the group + config->deleteGroup(profile, true); + delete config; + + if (comboProfile->count() == 0) + { + readConfig("Inbox"); + generalTab->readConfig("Inbox"); + newmailTab->readConfig("Inbox"); + mailboxTab->readConfig("Inbox"); + } + else + { + readConfig(comboProfile->currentText()); + generalTab->readConfig(comboProfile->currentText()); + newmailTab->readConfig(comboProfile->currentText()); + mailboxTab->readConfig(comboProfile->currentText()); + } + + break; + } + case KMessageBox::No: + default: + break; + } +} + +/////////////////////////////////////////////////////////////////////// +// KBiffGeneralTab +/////////////////////////////////////////////////////////////////////// +KBiffGeneralTab::KBiffGeneralTab(const QString& profile_, QWidget *parent_) + : QWidget(parent_) +{ + // the poll time (in seconds) + QLabel* poll_label = new QLabel(i18n("P&oll (sec):"), this); + editPoll = new QLineEdit(this); + poll_label->setBuddy(editPoll); + QString whatsthis = i18n( + "This is the interval (in seconds) that KBiff will check " + "for new mail. Typically, this can be quite small (under " + "60 seconds) for local mailboxes but should be around 5 " + "minutes (300 seconds) for remote mailboxes"); + QWhatsThis::add(editPoll, whatsthis); + + // the command to run when clicked + QLabel *mail_label = new QLabel(i18n("&Mail client:"), this); + editCommand = new QLineEdit(this); + mail_label->setBuddy(editCommand); + whatsthis = i18n( + "This is the mail client that KBiff was use when you click " + "on the icon or the Mailer button. If it's not in your path, " + "then you must specify the location using an absolute path. " + "This recognizes the %m and %u arguments. The " + "first is replaced with the first mailbox containing new mail " + "and the latter is replaced with the mailbox's URL."); + QWhatsThis::add(editCommand, whatsthis); + + // do we dock automatically? + checkDock = new QCheckBox(i18n("Doc&k in panel"), this); + + // should we support session management? + checkNoSession = new QCheckBox(i18n("Use &session management"), this); + + // should we check at startup? + checkNoStartup = new QCheckBox(i18n("Don't &check at startup"), this); + whatsthis = i18n( + "This option is for those people using KBiff to check their " + "IMAP4 or POP3 account over a dial-up connection. If KBiff " + "tries to connect at startup and you are not connected, the " + "DNS lookup will hang for a long time. If this is checked, " + "then KBiff will not check for new mail on startup. You will " + "need to manually start it every time you connect"); + QWhatsThis::add(checkNoStartup, whatsthis); + + // group box to hold the icons together + QGroupBox* icons_groupbox = new QGroupBox(i18n("Icons:"), this); + + // "stopped" pixmap button + QLabel* stopped_label = new QLabel(i18n("&Stopped:"), icons_groupbox); + buttonStopped = new KIconButton(icons_groupbox); + buttonStopped->setFixedSize(50, 50); + buttonStopped->setIconType(KIcon::User, KIcon::Any, true); + stopped_label->setBuddy(buttonStopped); + + // "no mailbox" pixmap button + QLabel* noconn_label = new QLabel(i18n("No Mail&box:"), icons_groupbox); + buttonNoConn = new KIconButton(icons_groupbox); + buttonNoConn->setFixedSize(50, 50); + buttonNoConn->setIconType(KIcon::User, KIcon::Any, true); + noconn_label->setBuddy(buttonNoConn); + + // "no mail" pixmap button + QLabel* nomail_label = new QLabel(i18n("No M&ail:"), icons_groupbox); + buttonNoMail = new KIconButton(icons_groupbox); + buttonNoMail->setIconType(KIcon::User, KIcon::Any, true); + buttonNoMail->setFixedSize(50, 50); + nomail_label->setBuddy(buttonNoMail); + + // "old mail" pixmap button + QLabel* oldmail_label = new QLabel(i18n("O&ld Mail:"), icons_groupbox); + buttonOldMail = new KIconButton(icons_groupbox); + buttonOldMail->setIconType(KIcon::User, KIcon::Any, true); + buttonOldMail->setFixedSize(50, 50); + oldmail_label->setBuddy(buttonOldMail); + + // "new mail" pixmap button + QLabel* newmail_label = new QLabel(i18n("N&ew Mail:"), icons_groupbox); + buttonNewMail = new KIconButton(icons_groupbox); + buttonNewMail->setIconType(KIcon::User, KIcon::Any, true); + buttonNewMail->setFixedSize(50, 50); + newmail_label->setBuddy(buttonNewMail); + + // poll time layout + QGridLayout *info_layout = new QGridLayout(5, 3, 8); + info_layout->addWidget(poll_label, 0, 0); + info_layout->addWidget(editPoll, 0, 1); + info_layout->setColStretch(2, 1); + + info_layout->addWidget(mail_label, 1, 0); + info_layout->addMultiCellWidget(editCommand, 1, 1, 1, 2); + info_layout->addMultiCellWidget(checkDock, 2, 2, 1, 2); + info_layout->addMultiCellWidget(checkNoSession, 3, 3, 1, 2); + info_layout->addMultiCellWidget(checkNoStartup, 4, 4, 1, 2); + + // icons layout + QVBoxLayout *stopped_layout = new QVBoxLayout; + stopped_layout->addWidget(stopped_label); + stopped_layout->addWidget(buttonStopped); + + QVBoxLayout *no_conn_layout = new QVBoxLayout; + no_conn_layout->addWidget(noconn_label); + no_conn_layout->addWidget(buttonNoConn); + + QVBoxLayout *no_mail_layout = new QVBoxLayout; + no_mail_layout->addWidget(nomail_label); + no_mail_layout->addWidget(buttonNoMail); + + QVBoxLayout *old_mail_layout = new QVBoxLayout; + old_mail_layout->addWidget(oldmail_label); + old_mail_layout->addWidget(buttonOldMail); + + QVBoxLayout *new_mail_layout = new QVBoxLayout; + new_mail_layout->addWidget(newmail_label); + new_mail_layout->addWidget(buttonNewMail); + + QHBoxLayout *inner_icon_layout = new QHBoxLayout; + inner_icon_layout->addStretch(1); + inner_icon_layout->addLayout(stopped_layout); + inner_icon_layout->addStretch(1); + inner_icon_layout->addLayout(no_conn_layout); + inner_icon_layout->addStretch(1); + inner_icon_layout->addLayout(no_mail_layout); + inner_icon_layout->addStretch(1); + inner_icon_layout->addLayout(old_mail_layout); + inner_icon_layout->addStretch(1); + inner_icon_layout->addLayout(new_mail_layout); + inner_icon_layout->addStretch(1); + + QBoxLayout *outer_icon_layout = new QBoxLayout(icons_groupbox, + QBoxLayout::Down, 5); + outer_icon_layout->addSpacing(8); + outer_icon_layout->addLayout(inner_icon_layout); + outer_icon_layout->addStretch(1); + + // main "outer" layout for this tab + QVBoxLayout *top_layout = new QVBoxLayout(this, 12); + top_layout->addLayout(info_layout); + top_layout->addWidget(icons_groupbox); + top_layout->addStretch(1); + + // now read in the config data for this profile + readConfig(profile_); +} + +KBiffGeneralTab::~KBiffGeneralTab() +{ +} + +bool KBiffGeneralTab::getSessionManagement() const +{ + return checkNoSession->isChecked(); +} + +bool KBiffGeneralTab::getCheckStartup() const +{ + return checkNoStartup->isChecked(); +} + +bool KBiffGeneralTab::getDock() const +{ + return checkDock->isChecked(); +} + +const QString KBiffGeneralTab::getButtonOldMail() const +{ + return buttonOldMail->icon(); +} + +const QString KBiffGeneralTab::getButtonNewMail() const +{ + return buttonNewMail->icon(); +} + +const QString KBiffGeneralTab::getButtonNoMail() const +{ + return buttonNoMail->icon(); +} + +const QString KBiffGeneralTab::getButtonNoConn() const +{ + return buttonNoConn->icon(); +} + +const QString KBiffGeneralTab::getButtonStopped() const +{ + return buttonStopped->icon(); +} + +const QString KBiffGeneralTab::getMailClient() const +{ + return editCommand->text(); +} + +int KBiffGeneralTab::getPoll() const +{ + return QString(editPoll->text()).toInt(); +} + +void KBiffGeneralTab::readConfig(const QString& profile_) +{ + // open the config file + KSimpleConfig *config = new KSimpleConfig(CONFIG_FILE, true); + + config->setGroup(profile_); + + // someday, we need to read in the system email prefs + editPoll->setText(config->readEntry("Poll", "60")); + editCommand->setText(config->readEntry("MailClient", "kmail -check")); + checkDock->setChecked(config->readBoolEntry("Docked", true)); + checkNoSession->setChecked(config->readBoolEntry("Sessions", true)); + checkNoStartup->setChecked(config->readBoolEntry("DontCheck", false)); + + QString stopped, no_mail, old_mail, new_mail, no_conn; + stopped = config->readEntry("StoppedPixmap", "stopped"); + no_mail = config->readEntry("NoMailPixmap", "nomail"); + old_mail = config->readEntry("OldMailPixmap", "oldmail"); + new_mail = config->readEntry("NewMailPixmap", "newmail"); + no_conn = config->readEntry("NoConnPixmap", "noconn"); + + buttonOldMail->setIcon(old_mail); + buttonNewMail->setIcon(new_mail); + buttonNoMail->setIcon(no_mail); + buttonNoConn->setIcon(no_conn); + buttonStopped->setIcon(stopped); + + delete config; +} + +static QString justIconName(const QString& icon_name) +{ + // the following code is a bit of a hack, but there is a rationale + // to it. if possible, we want to just save the name of the icons + // (without extension), and not the whole path due to name munging + // later on. + QFileInfo info( icon_name ); + + // we first test if the basename (filename without extensions) is + // the same as the filename. if it is, then we are perfect. no + // need to do anything further + if ( info.baseName() == info.fileName() ) + return icon_name; + + // now we see if we can load based just on the basename + QPixmap icon = KGlobal::iconLoader()->loadIcon( info.baseName(), KIcon::User ); + + // if it's null, then it's in a non-standard path so we must use an + // absolute path. no need to go further + if ( icon.isNull() ) + return icon_name; + + // now we know that the icon loader can find it.. but is it the same + // one as the one the user picked? + if ( KGlobal::iconLoader()->iconPath( info.baseName(), KIcon::User ) != + KGlobal::iconLoader()->iconPath( icon_name, KIcon::User ) ) + return icon_name; + + // FINALLY done! if we got this far, then we know that the icon + // loader can handle just the name and that the icon returned is the + // same one that the user wanted. whew! + return info.baseName(); +} + +void KBiffGeneralTab::saveConfig(const QString& profile_) +{ + // open the config file for writing + KSimpleConfig *config = new KSimpleConfig(CONFIG_FILE); + + config->setGroup(profile_); + + config->writeEntry("Poll", editPoll->text()); + config->writeEntry("MailClient", editCommand->text()); + config->writeEntry("Docked", checkDock->isChecked()); + config->writeEntry("Sessions", checkNoSession->isChecked()); + config->writeEntry("DontCheck", checkNoStartup->isChecked()); + config->writeEntry("NoMailPixmap", justIconName(buttonNoMail->icon())); + config->writeEntry("NewMailPixmap", justIconName(buttonNewMail->icon())); + config->writeEntry("OldMailPixmap", justIconName(buttonOldMail->icon())); + config->writeEntry("NoConnPixmap", justIconName(buttonNoConn->icon())); + config->writeEntry("StoppedPixmap", justIconName(buttonStopped->icon())); + delete config; +} + +/////////////////////////////////////////////////////////////////////// +// KBiffNewMailTab +/////////////////////////////////////////////////////////////////////// +KBiffNewMailTab::KBiffNewMailTab(const QString& profile_, QWidget *parent_) + : QWidget(parent_) +{ + // setup the Run Command stuff + checkRunCommand = new QCheckBox(i18n("R&un Command"), this); + editRunCommand = new QLineEdit(this); + buttonBrowseRunCommand = new QPushButton(i18n("Browse"), this); + + // setup the Run Reset Command stuff + checkRunResetCommand = new QCheckBox(i18n("R&un Reset-Command"), this); + editRunResetCommand = new QLineEdit(this); + buttonBrowseRunResetCommand = new QPushButton(i18n("Browse"), this); + + // setup the Play Sound stuff + checkPlaySound = new QCheckBox(i18n("&Play Sound"), this); + editPlaySound = new QLineEdit(this); + buttonBrowsePlaySound = new QPushButton(i18n("Browse"), this); + + buttonTestPlaySound = new QPushButton(this); + buttonTestPlaySound->setPixmap(UserIcon("playsound")); + + // setup the System stuff + checkBeep = new QCheckBox(i18n("System &Beep"), this); + checkNotify = new QCheckBox(i18n("N&otify"), this); + checkStatus = new QCheckBox(i18n("&Floating Status"), this); + + // connect some slots and signals + connect(buttonBrowsePlaySound, SIGNAL(clicked()), SLOT(browsePlaySound())); + connect(buttonBrowseRunCommand, SIGNAL(clicked()), SLOT(browseRunCommand())); + connect(buttonBrowseRunResetCommand, SIGNAL(clicked()), SLOT(browseRunResetCommand())); + connect(checkPlaySound, SIGNAL(toggled(bool)), SLOT(enablePlaySound(bool))); + connect(buttonTestPlaySound, SIGNAL(clicked()), SLOT(testPlaySound())); + connect(checkRunCommand, SIGNAL(toggled(bool)), SLOT(enableRunCommand(bool))); + connect(checkRunResetCommand, SIGNAL(toggled(bool)), SLOT(enableRunResetCommand(bool))); + + // NOW DO THE LAYOUT + QHBoxLayout *run_command_layout = new QHBoxLayout(5); + run_command_layout->addWidget(editRunCommand); + run_command_layout->addWidget(buttonBrowseRunCommand); + + QHBoxLayout *run_reset_command_layout = new QHBoxLayout(5); + run_reset_command_layout->addWidget(editRunResetCommand); + run_reset_command_layout->addWidget(buttonBrowseRunResetCommand); + + QHBoxLayout *play_sound_layout = new QHBoxLayout(5); + play_sound_layout->addWidget(buttonTestPlaySound, 0); + play_sound_layout->addWidget(editPlaySound, 1); + play_sound_layout->addWidget(buttonBrowsePlaySound); + + QVBoxLayout *top_layout = new QVBoxLayout(this, 5); + top_layout->addWidget(checkRunCommand); + top_layout->addLayout(run_command_layout); + + top_layout->addWidget(checkRunResetCommand); + top_layout->addLayout(run_reset_command_layout); + + top_layout->addWidget(checkPlaySound); + top_layout->addLayout(play_sound_layout); + + top_layout->addWidget(checkBeep); + top_layout->addWidget(checkNotify); + top_layout->addWidget(checkStatus); + top_layout->addStretch(1); + + readConfig(profile_); +} + +KBiffNewMailTab::~KBiffNewMailTab() +{ +} + +void KBiffNewMailTab::testPlaySound() +{ + KAudioPlayer::play(getPlaySoundPath()); +} + +void KBiffNewMailTab::readConfig(const QString& profile_) +{ + // open the config file + KSimpleConfig *config = new KSimpleConfig(CONFIG_FILE, true); + + config->setGroup(profile_); + + checkRunCommand->setChecked(config->readBoolEntry("RunCommand", false)); + checkRunResetCommand->setChecked(config->readBoolEntry("RunResetCommand", false)); + checkPlaySound->setChecked(config->readBoolEntry("PlaySound", false)); + checkBeep->setChecked(config->readBoolEntry("SystemBeep", true)); + checkNotify->setChecked(config->readBoolEntry("Notify", true)); + checkStatus->setChecked(config->readBoolEntry("Status", true)); + editRunCommand->setText(config->readEntry("RunCommandPath")); + editRunResetCommand->setText(config->readEntry("RunResetCommandPath")); + editPlaySound->setText(config->readEntry("PlaySoundPath")); + + enableRunCommand(checkRunCommand->isChecked()); + enableRunResetCommand(checkRunResetCommand->isChecked()); + enablePlaySound(checkPlaySound->isChecked()); + + delete config; +} + +void KBiffNewMailTab::saveConfig(const QString& profile_) +{ + KSimpleConfig *config = new KSimpleConfig(CONFIG_FILE); + + config->setGroup(profile_); + + config->writeEntry("RunCommand", checkRunCommand->isChecked()); + config->writeEntry("RunResetCommand", checkRunResetCommand->isChecked()); + config->writeEntry("PlaySound", checkPlaySound->isChecked()); + config->writeEntry("SystemBeep", checkBeep->isChecked()); + config->writeEntry("Notify", checkNotify->isChecked()); + config->writeEntry("Status", checkStatus->isChecked()); + config->writeEntry("RunCommandPath", editRunCommand->text()); + config->writeEntry("RunResetCommandPath", editRunResetCommand->text()); + config->writeEntry("PlaySoundPath", editPlaySound->text()); + + delete config; +} + +bool KBiffNewMailTab::getRunCommand() const +{ + return checkRunCommand->isChecked(); +} + +const QString KBiffNewMailTab::getRunCommandPath() const +{ + return editRunCommand->text(); +} + +bool KBiffNewMailTab::getRunResetCommand() const +{ + return checkRunResetCommand->isChecked(); +} + +const QString KBiffNewMailTab::getRunResetCommandPath() const +{ + return editRunResetCommand->text(); +} + +bool KBiffNewMailTab::getPlaySound() const +{ + return checkPlaySound->isChecked(); +} + +const QString KBiffNewMailTab::getPlaySoundPath() const +{ + return editPlaySound->text(); +} + +bool KBiffNewMailTab::getSystemBeep() const +{ + return checkBeep->isChecked(); +} + +bool KBiffNewMailTab::getNotify() const +{ + return checkNotify->isChecked(); +} + +bool KBiffNewMailTab::getStatus() const +{ + return checkStatus->isChecked(); +} + +void KBiffNewMailTab::enableRunCommand(bool enable) +{ + editRunCommand->setEnabled(enable); + buttonBrowseRunCommand->setEnabled(enable); +} + +void KBiffNewMailTab::enableRunResetCommand(bool enable) +{ + editRunResetCommand->setEnabled(enable); + buttonBrowseRunResetCommand->setEnabled(enable); +} + +void KBiffNewMailTab::enablePlaySound(bool enable) +{ + editPlaySound->setEnabled(enable); + buttonBrowsePlaySound->setEnabled(enable); + buttonTestPlaySound->setEnabled(enable); +} + +void KBiffNewMailTab::browseRunCommand() +{ + + KURL url = KFileDialog::getOpenURL(); + + if( url.isEmpty() ) + return; + + if( !url.isLocalFile() ) + { + KMessageBox::sorry( 0L, i18n( "Only local files can be executed." ) ); + return; + } + + editRunCommand->setText( url.path() ); +} + +void KBiffNewMailTab::browseRunResetCommand() +{ + + KURL url = KFileDialog::getOpenURL(); + + if( url.isEmpty() ) + return; + + if( !url.isLocalFile() ) + { + return; + } + + editRunResetCommand->setText( url.path() ); +} + +void KBiffNewMailTab::browsePlaySound() +{ + + KURL url = KFileDialog::getOpenURL(); + + if( url.isEmpty() ) + return; + + if( !url.isLocalFile() ) + { + KMessageBox::sorry( 0L, i18n( "Only local files are supported yet." ) ); + return; + } + + editPlaySound->setText( url.path() ); +} + + +////////////////////////////////////////////////////////////////////// +// KBiffMailboxTab +////////////////////////////////////////////////////////////////////// +KBiffMailboxAdvanced::KBiffMailboxAdvanced() + : KDialog(0, 0, true, 0) +{ + setCaption(i18n("Advanced Options")); + + QLabel *mailbox_label = new QLabel(i18n("Mailbox &URL:"), this); + mailbox_label->setAlignment(AlignVCenter | AlignRight); + mailbox = new QLineEdit(this); + mailbox_label->setBuddy(mailbox); + QString whatsthis = i18n( + "KBiff uses URLs to specify a mailbox and the parameters " + "to the mailbox. This allows you to modify the URL directly. " + "Do so only if you really really know what you're doing!"); + QWhatsThis::add(mailbox, whatsthis); + + QLabel *port_label = new QLabel(i18n("P&ort:"), this); + port_label->setAlignment(AlignVCenter | AlignRight); + port = new QLineEdit(this); + port_label->setBuddy(port); + whatsthis = i18n( + "This allows you to specify the port of your socket protocol. " + "It usually is correct, so the only time you would change it is " + "if you are accessing a non-standard server or going through " + "a proxy (or something similar"); + QWhatsThis::add(port, whatsthis); + + whatsthis = i18n( + "IMAP4, POP3, and NNTP sockets each have their own timeout " + "before they give up. If you have a slow connection, you might " + "want to set this to some random high value"); + QLabel *timeout_label = new QLabel(i18n("&Timeout:"), this); + timeout_label->setAlignment(AlignVCenter | AlignRight); + timeout = new QLineEdit(this); + QWhatsThis::add(timeout, whatsthis); + timeout_label->setBuddy(timeout); + + preauth = new QCheckBox(i18n("&PREAUTH"), this); + preauth->setEnabled(false); + whatsthis = i18n( + "Check this if you login to your IMAP4 or POP3 server before " + "kbiff accesses it."); + QWhatsThis::add(preauth, whatsthis); + + keepalive = new QCheckBox(i18n("&Keep Alive"), this); + keepalive->setEnabled(false); + whatsthis = i18n( + "If this is checked, then the IMAP4, POP3, or NNTP client " + "will not log off each time"); + QWhatsThis::add(keepalive, whatsthis); + + async = new QCheckBox(i18n("&Asynchronous"), this); + async->setEnabled(false); + whatsthis = i18n( + "If this is checked, then the socket protocols will access " + "the server asynchronously"); + QWhatsThis::add(async, whatsthis); + + apop = new QCheckBox(i18n("&Disable APOP"), this); + apop->setEnabled(false); + whatsthis = i18n( + "If this is checked, then POP mailboxes will not use Authenticated POP where available, " + "and send passwords in plaintext over the network, which is a security risk"); + QWhatsThis::add(apop, whatsthis); + + QPushButton *ok = new QPushButton(i18n("&OK"), this); + ok->setDefault(true); + + QPushButton *cancel = new QPushButton(i18n("&Cancel"), this); + + // connect all the slots to signals + connect(preauth, SIGNAL(toggled(bool)), SLOT(preauthModified(bool))); + connect(keepalive, SIGNAL(toggled(bool)), SLOT(keepaliveModified(bool))); + connect(async, SIGNAL(toggled(bool)), SLOT(asyncModified(bool))); + connect(apop, SIGNAL(toggled(bool)), SLOT(apopModified(bool))); + connect(port, SIGNAL(textChanged(const QString&)), + SLOT(portModified(const QString&))); + connect(ok, SIGNAL(clicked()), SLOT(accept())); + connect(cancel, SIGNAL(clicked()), SLOT(reject())); + connect(timeout, SIGNAL(textChanged(const QString&)), + SLOT(timeoutModified(const QString&))); + + // NOW DO THE LAYOUT + QGridLayout *top_layout = new QGridLayout(this, 7, 4, 12); + top_layout->addWidget(mailbox_label, 0, 0); + top_layout->addMultiCellWidget(mailbox, 0, 0, 1, 3); + top_layout->addWidget(port_label, 1, 0); + top_layout->addWidget(port, 1, 1); + top_layout->addWidget(timeout_label, 1, 2); + top_layout->addWidget(timeout, 1, 3); + top_layout->addWidget(preauth, 2, 1); + top_layout->addWidget(keepalive, 3, 1); + top_layout->addWidget(async, 4, 1); + top_layout->addWidget(apop, 4, 1); + top_layout->addWidget(ok, 6, 2); + top_layout->addWidget(cancel, 6, 3); +} + +KBiffMailboxAdvanced::~KBiffMailboxAdvanced() +{ +} + +const KBiffURL KBiffMailboxAdvanced::getMailbox() const +{ + KBiffURL url(mailbox->text()); + url.setPass(password); + return url; +} + +unsigned int KBiffMailboxAdvanced::getPort() const +{ + return QString(port->text()).toInt(); +} + +void KBiffMailboxAdvanced::setMailbox(const KBiffURL& url) +{ + password = url.pass(); + KBiffURL new_url(url); + new_url.setPass(""); + mailbox->setText(new_url.url()); +} + +void KBiffMailboxAdvanced::setPort(unsigned int the_port, bool enable) +{ + port->setEnabled(enable); + port->setText(QString().setNum(the_port)); +} + +void KBiffMailboxAdvanced::portModified(const QString& text) +{ + KBiffURL url = getMailbox(); + url.setPort(QString(text).toInt()); + setMailbox(url); +} + +void KBiffMailboxAdvanced::setTimeout(unsigned int the_to, bool enable) +{ + timeout->setEnabled(enable); + timeout->setText(QString().setNum(the_to)); +} + +void KBiffMailboxAdvanced::timeoutModified(const QString& text) +{ + KBiffURL url = getMailbox(); + url.setSearchPar("timeout", text.local8Bit()); + setMailbox(url); +} + +void KBiffMailboxAdvanced::preauthModified(bool is_preauth) +{ + KBiffURL url = getMailbox(); + if (is_preauth) + url.setSearchPar("preauth", "yes"); + else + url.setSearchPar("preauth", "no"); + setMailbox(url); +} + +void KBiffMailboxAdvanced::keepaliveModified(bool is_keepalive) +{ + KBiffURL url = getMailbox(); + if (is_keepalive) + url.setSearchPar("keepalive", "yes"); + else + url.setSearchPar("keepalive", "no"); + setMailbox(url); +} + +void KBiffMailboxAdvanced::asyncModified(bool is_async) +{ + KBiffURL url = getMailbox(); + if (is_async) + url.setSearchPar("async", "yes"); + else + url.setSearchPar("async", "no"); + setMailbox(url); +} + +void KBiffMailboxAdvanced::apopModified(bool disable_apop) +{ + KBiffURL url = getMailbox(); + if ( url.protocol() == "pop3" || url.protocol() == "pop3s" ) + { + if ( disable_apop ) + url.setSearchPar("apop", "no"); + else + url.setSearchPar("apop", "yes"); + setMailbox(url); + } +} + +void KBiffMailboxAdvanced::setPreauth(bool on) +{ + preauth->setEnabled(true); + preauth->setChecked(on); +} + +void KBiffMailboxAdvanced::setKeepalive(bool on) +{ + keepalive->setEnabled(true); + keepalive->setChecked(on); +} + +void KBiffMailboxAdvanced::setAsync(bool on) +{ + async->setEnabled(true); + async->setChecked(on); +} + +void KBiffMailboxAdvanced::setDisableApop(bool on) +{ + apop->setEnabled(true); + apop->setChecked(on); +} + +bool KBiffMailboxAdvanced::getPreauth() const +{ + return preauth->isChecked(); +} + +KBiffMailboxTab::KBiffMailboxTab(const QString& profile_, QWidget *parent_) + : QWidget(parent_), mailboxHash(new QDict) +{ + if (mailboxHash) + mailboxHash->setAutoDelete(true); + + mailboxes = new QListView(this); + mailboxes->setFrameStyle(QFrame::WinPanel | QFrame::Sunken); + mailboxes->addColumn(i18n("Mailbox:")); + mailboxes->header()->hide(); + + QPushButton *new_mailbox = new QPushButton(this); + new_mailbox->setPixmap(UserIcon("mailbox")); + QToolTip::add(new_mailbox, i18n("New Mailbox")); + + QPushButton *delete_mailbox = new QPushButton(this); + delete_mailbox->setPixmap(UserIcon("delete")); + QToolTip::add(delete_mailbox, i18n("Delete Mailbox")); + + QLabel *protocol_label = new QLabel(i18n("Pro&tocol:"), this); + comboProtocol = new QComboBox(this); + comboProtocol->insertItem(""); + comboProtocol->insertItem("mbox"); + comboProtocol->insertItem("maildir"); + comboProtocol->insertItem("imap4"); + comboProtocol->insertItem("pop3"); + comboProtocol->insertItem("mh"); + comboProtocol->insertItem("file"); + comboProtocol->insertItem("nntp"); +#ifdef USE_SSL + comboProtocol->insertItem("imap4s"); + comboProtocol->insertItem("pop3s"); +#endif // USE_SSL + protocol_label->setBuddy(comboProtocol); + + QLabel *mailbox_label = new QLabel(i18n("&Mailbox:"), this); + editMailbox = new QLineEdit(this); + mailbox_label->setBuddy(editMailbox); + buttonBrowse = new QPushButton("...", this); + + QLabel *server_label = new QLabel(i18n("&Server:"), this); + editServer = new QLineEdit(this); + server_label->setBuddy(editServer); + + QLabel *user_label = new QLabel(i18n("&User:"), this); + editUser = new QLineEdit(this); + user_label->setBuddy(editUser); + + QLabel *password_label = new QLabel(i18n("P&assword:"), this); + editPassword = new QLineEdit(this); + editPassword->setEchoMode(QLineEdit::Password); + password_label->setBuddy(editPassword); + + checkStorePassword = new QCheckBox(i18n("S&tore password"), this); + QPushButton *advanced_button = new QPushButton(i18n("&Advanced"), this); + + // the command to run before polling + QGroupBox *fetch_box = new QGroupBox(this); + fetch_box->setTitle(i18n("Pre-&Polling Command")); + fetch_box->setColumnLayout(0, Qt::Vertical ); + fetch_box->layout()->setSpacing(0); + fetch_box->layout()->setMargin(0); + + checkFetchCommand = new QCheckBox(i18n("&Enable"), fetch_box); + editFetchCommand = new QLineEdit(fetch_box); + buttonBrowseFetchCommand = new QPushButton(i18n("Browse"), fetch_box); + QString whatsthis = i18n( + "This command shall be run before KBiff polls for new " + "mail. It is useful for those people that want to download their " + "POP3 mail regularly using (for instance) 'fetchmail'"); + QWhatsThis::add(checkFetchCommand, whatsthis); + QWhatsThis::add(editFetchCommand, whatsthis); + QWhatsThis::add(buttonBrowseFetchCommand, whatsthis); + enableFetchCommand(false); + + // connect all the signals + connect(mailboxes, SIGNAL(selectionChanged(QListViewItem *)), + SLOT(slotMailboxSelected(QListViewItem *))); + connect(new_mailbox, SIGNAL(clicked()), SLOT(slotNewMailbox())); + connect(delete_mailbox, SIGNAL(clicked()), SLOT(slotDeleteMailbox())); + connect(comboProtocol, SIGNAL(highlighted(int)), + SLOT(protocolSelected(int))); + connect(buttonBrowse, SIGNAL(clicked()), SLOT(browse())); + connect(advanced_button, SIGNAL(clicked()), SLOT(advanced())); + connect(buttonBrowseFetchCommand, SIGNAL(clicked()), SLOT(browseFetchCommand())); + connect(checkFetchCommand, SIGNAL(toggled(bool)), SLOT(enableFetchCommand(bool))); + + // NOW DO THE LAYOUT + QHBoxLayout *fetch_command_layout = new QHBoxLayout(5); + fetch_command_layout->addWidget(editFetchCommand, 1); + fetch_command_layout->addWidget(buttonBrowseFetchCommand); + + QVBoxLayout *group_layout = new QVBoxLayout(fetch_box->layout()); + group_layout->setAlignment(Qt::AlignTop); + group_layout->setSpacing(6); + group_layout->setMargin(11); + group_layout->addWidget(checkFetchCommand); + group_layout->addLayout(fetch_command_layout); + + QHBoxLayout *advanced_layout = new QHBoxLayout; + advanced_layout->addStretch(1); + advanced_layout->addWidget(advanced_button); + + QGridLayout *param_layout = new QGridLayout(6, 3, 12); + param_layout->addWidget(protocol_label, 0, 0); + param_layout->addWidget(comboProtocol, 0, 1, 1); + param_layout->addWidget(buttonBrowse, 0, 2); + param_layout->addWidget(mailbox_label, 1, 0); + param_layout->addMultiCellWidget(editMailbox, 1, 1, 1, 2); + param_layout->addWidget(server_label, 2, 0); + param_layout->addMultiCellWidget(editServer, 2, 2, 1, 2); + param_layout->addWidget(user_label, 3, 0); + param_layout->addMultiCellWidget(editUser, 3, 3, 1, 2); + param_layout->addWidget(password_label, 4, 0); + param_layout->addMultiCellWidget(editPassword, 4, 4, 1, 2); + param_layout->addMultiCellWidget(checkStorePassword, 5, 5, 1, 2); + param_layout->setColStretch(1, 1); + + QVBoxLayout *right_side_layout = new QVBoxLayout; + right_side_layout->addLayout(param_layout); + right_side_layout->addWidget(fetch_box); + right_side_layout->addLayout(advanced_layout); + right_side_layout->addStretch(1); + + QGridLayout *mailbox_layout = new QGridLayout(2, 2, 1); + mailbox_layout->addMultiCellWidget(mailboxes, 0, 0, 0, 1); + mailbox_layout->addWidget(new_mailbox, 1, 0); + mailbox_layout->addWidget(delete_mailbox, 1, 1); + + QHBoxLayout *top_layout = new QHBoxLayout(this, 12); + top_layout->addLayout(mailbox_layout); + top_layout->addLayout(right_side_layout); + + readConfig(profile_); +} + +KBiffMailboxTab::~KBiffMailboxTab() +{ + delete mailboxHash; +} + +void KBiffMailboxTab::readConfig(const QString& profile_) +{ + // initialize some variables that need initing + oldItem = 0; + + // open the config file + KSimpleConfig *config = new KSimpleConfig(CONFIG_FILE, true); + config->setDollarExpansion(false); + + mailboxHash->clear(); + mailboxes->clear(); + + config->setGroup(profile_); + + QStringList mailbox_list; + + mailbox_list = config->readListEntry("Mailboxes", ','); + int number_of_mailboxes = mailbox_list.count(); + + if (number_of_mailboxes > 0) + { + for (unsigned int i = 0; i < mailbox_list.count(); i+=3) + { + KBiffMailbox *mailbox = new KBiffMailbox(); + mailbox->key = *mailbox_list.at(i); + mailbox->url = KBiffURL(*mailbox_list.at(i+1)); + QString password(KBiffCodecs::base64Decode(*mailbox_list.at(i+2))); + + if (password.isEmpty()) + mailbox->store = false; + else + { + mailbox->store = true; + mailbox->url.setPass(password); + } + + QListViewItem *item = new QListViewItem(mailboxes, mailbox->key); + item->setPixmap(0, QPixmap(UserIcon("mailbox"))); + + mailboxHash->insert(mailbox->key, mailbox); + } + } + else + { + KBiffMailbox *mailbox = new KBiffMailbox(); + mailbox->key = i18n("Default"); + mailbox->store = false; + mailbox->url = defaultMailbox(); + mailboxHash->insert(mailbox->key, mailbox); + + QListViewItem *item = new QListViewItem(mailboxes, mailbox->key); + item->setPixmap(0, QPixmap(UserIcon("mailbox"))); + } + + mailboxes->setSelected(mailboxes->firstChild(), true); + delete config; +} + +void KBiffMailboxTab::saveConfig(const QString& profile_) +{ + // open the config file + KSimpleConfig *config = new KSimpleConfig(CONFIG_FILE); + config->setDollarExpansion(false); + + config->setGroup(profile_); + + QStringList mailbox_list; + + for (QListViewItem *item = mailboxes->firstChild(); + item; + item = item->nextSibling()) + { + KBiffMailbox *mailbox = new KBiffMailbox(); + QString item_text(item->text(0)); + + // if this mailbox is the current one, then use the current + // settings instead of the hash + if (item == mailboxes->currentItem()) + { + mailbox->store = checkStorePassword->isChecked(); + mailbox->url = getMailbox(); + + mailboxHash->replace(item_text, mailbox); + } + + mailbox = mailboxHash->find(item_text); + + QString password(KBiffCodecs::base64Encode(mailbox->url.pass().local8Bit())); + KBiffURL url = mailbox->url; + url.setPass(""); + + if (mailbox->store == false) + password = ""; + + mailbox_list.append(item_text); + mailbox_list.append(url.url()); + mailbox_list.append(password); + } + + config->writeEntry("Mailboxes", mailbox_list, ','); + delete config; +} + +void KBiffMailboxTab::enableFetchCommand(bool enable) +{ + editFetchCommand->setEnabled(enable); + buttonBrowseFetchCommand->setEnabled(enable); +} + +void KBiffMailboxTab::browseFetchCommand() +{ + KURL url = KFileDialog::getOpenURL(); + + if( url.isEmpty() ) + return; + + if( !url.isLocalFile() ) + { + KMessageBox::sorry( 0L, i18n( "Only local files can be executed." ) ); + return; + } + + editFetchCommand->setText( url.path() ); +} + +void KBiffMailboxTab::setMailbox(const KBiffURL& url) +{ + QString prot(url.protocol()); + + if (prot == "mbox") + protocolSelected(1); + else if (prot == "maildir") + protocolSelected(2); + else if (prot == "imap4") + protocolSelected(3); + else if (prot == "pop3") + protocolSelected(4); + else if (prot == "mh") + protocolSelected(5); + else if (prot == "file") + protocolSelected(6); + else if (prot == "nntp") + protocolSelected(7); +#ifdef USE_SSL + else if (prot == "imap4s") + protocolSelected(8); + else if (prot == "pop3s") + protocolSelected(9); +#endif // USE_SSL + else + return; + + if (editMailbox->isEnabled()) + { + QString path(url.path()); + if (((prot == "imap4") || (prot == "nntp") || (prot == "imap4s")) && !path.isEmpty() && path[0] == '/') + path.remove(0, 1); + + editMailbox->setText(path); + } + + port = url.port(); + + if (editServer->isEnabled()) + editServer->setText(url.host()); + if (editUser->isEnabled()) + { + QString user(url.user()); + editUser->setText(user); + } + if (editPassword->isEnabled()) + { + QString passwd(url.pass()); + editPassword->setText(passwd); + } + + timeout = url.searchPar("timeout").toInt(); + preauth = url.searchPar("preauth") == "yes" ? true : false; + keepalive = url.searchPar("keepalive") == "yes" ? true : false; + async = url.searchPar("async") == "yes" ? true : false; + useApop = url.searchPar("apop") == "no" ? false : true; + + QString fetch = url.searchPar("fetch"); + checkFetchCommand->setChecked(!fetch.isEmpty()); + editFetchCommand->setText(fetch); +} + +const KBiffURL KBiffMailboxTab::getMailbox() const +{ + KBiffURL url; + + url.setProtocol(comboProtocol->currentText()); + QString prot(url.protocol()); + + if (editUser->isEnabled()) + { + QString user(editUser->text()); + url.setUser(user); + } + + if (editPassword->isEnabled()) + { + QString passwd(editPassword->text()); + url.setPass(passwd); + } + + if (editServer->isEnabled()) + url.setHost(editServer->text()); + + url.setPort(port); + + if (editMailbox->isEnabled()) + { + QString path(editMailbox->text()); + if (!path.isEmpty() && path[0] != '/') + path.prepend("/"); + url.setPath(path); + } + + if ((prot == "imap4") || (prot == "pop3") || (prot == "nntp") || (prot == "imap4s") || (prot == "pop3s")) + { + if (keepalive) + url.setSearchPar("keepalive", "yes"); + else + url.setSearchPar("keepalive", "no"); + + if (async) + url.setSearchPar("async", "yes"); + else + url.setSearchPar("async", "no"); + + if ((prot == "pop3s") || (prot == "pop3") ) + { + if (useApop) + url.setSearchPar("apop", "yes"); + else + url.setSearchPar("apop", "no"); + } + url.setSearchPar("timeout", QString().setNum(timeout)); + } + + if (checkFetchCommand->isChecked() && !editFetchCommand->text().isEmpty()) + url.setSearchPar("fetch", editFetchCommand->text()); + + return url; +} + +const QList KBiffMailboxTab::getMailboxList() const +{ + QList mbox_list; + + for (QListViewItem *item = mailboxes->firstChild(); + item; + item = item->nextSibling()) + { + KBiffMailbox *mailbox = mailboxHash->find(item->text(0)); + // without the next line the key of the first mailbox is lost. + // it's a mystery for me + mailbox->key = item->text(0); + mbox_list.append(mailbox); + } + return mbox_list; +} + +void KBiffMailboxTab::slotDeleteMailbox() +{ + /* only delete the non default mailboxes */ + if (mailboxes->childCount() == 1) + return; + + /* need some "Are you sure?" code here */ + QListViewItem *item = mailboxes->currentItem(); + + mailboxHash->remove(item->text(0)); + mailboxes->takeItem(item); + item = 0; + + mailboxes->setSelected(mailboxes->firstChild(), true); +} + +void KBiffMailboxTab::slotNewMailbox() +{ + KBiffNewDlg dlg; + + // popup the name chooser + dlg.setCaption(i18n("New Mailbox")); + if (dlg.exec()) + { + QString mailbox_name = dlg.getName(); + + // continue only if we received a decent name + if (mailbox_name.isEmpty() == false) + { + QListViewItem *item = new QListViewItem(mailboxes, mailbox_name); + item->setPixmap(0, QPixmap(UserIcon("mailbox"))); + + KBiffMailbox *mailbox = new KBiffMailbox(); + mailbox->store = false; + mailbox->url = defaultMailbox(); + + mailboxHash->insert(mailbox_name, mailbox); + mailboxes->setSelected(item, true); + } + } +} + +void KBiffMailboxTab::slotMailboxSelected(QListViewItem *item) +{ + KBiffMailbox *mailbox; + + // if an "old" item exists, save the current info as it + if (oldItem && !oldItem->text(0).isNull()) + { + mailbox = mailboxHash->find(oldItem->text(0)); + + if (mailbox) + { + // change the hash only if the item is different + KBiffURL url(getMailbox()); + bool checked = checkStorePassword->isChecked(); + if (mailbox->url.url() != url.url() || mailbox->store != checked) + { + mailbox->url = getMailbox(); + mailbox->store = checkStorePassword->isChecked(); + } + } + } + + mailbox = mailboxHash->find(item->text(0)); + + if (mailbox) + { + setMailbox(mailbox->url); + checkStorePassword->setChecked(mailbox->store); + + // save this as the "old" item + oldItem = item; + } +} + +void KBiffMailboxTab::protocolSelected(int protocol) +{ + comboProtocol->setCurrentItem(protocol); + + switch (protocol) + { + case 1: // mbox + case 2: // maildir + case 5: // mh + case 6: // file + port = 0; + buttonBrowse->setEnabled(true); + editMailbox->setEnabled(true); + editServer->setEnabled(false); + editUser->setEnabled(false); + editPassword->setEnabled(false); + checkStorePassword->setEnabled(false); + break; + case 3: // IMAP4 + port = 143; + timeout = 10; + editMailbox->setEnabled(true); + buttonBrowse->setEnabled(true); + editServer->setEnabled(true); + editUser->setEnabled(true); + editPassword->setEnabled(true); + checkStorePassword->setEnabled(true); + break; +#ifdef USE_SSL + case 8: // IMAP4S + port = 993; + timeout = 10; + editMailbox->setEnabled(true); + buttonBrowse->setEnabled(true); + editServer->setEnabled(true); + editUser->setEnabled(true); + editPassword->setEnabled(true); + checkStorePassword->setEnabled(true); + break; +#endif // USE_SSL + case 7: // NNTP + port = 119; + timeout = 10; + editMailbox->setEnabled(true); + buttonBrowse->setEnabled(false); + editServer->setEnabled(true); + editUser->setEnabled(true); + editPassword->setEnabled(true); + checkStorePassword->setEnabled(true); + break; + case 4: // POP3 + port = 110; + timeout = 10; + editMailbox->setEnabled(false); + buttonBrowse->setEnabled(false); + editServer->setEnabled(true); + editUser->setEnabled(true); + editPassword->setEnabled(true); + checkStorePassword->setEnabled(true); + break; +#ifdef USE_SSL + case 9: // POP3S + port = 995; + timeout = 10; + editMailbox->setEnabled(false); + buttonBrowse->setEnabled(false); + editServer->setEnabled(true); + editUser->setEnabled(true); + editPassword->setEnabled(true); + checkStorePassword->setEnabled(true); + break; +#endif // USE_SSL + default: // blank + port = 0; + timeout = 0; + editMailbox->setEnabled(false); + buttonBrowse->setEnabled(false); + editServer->setEnabled(false); + editUser->setEnabled(false); + editPassword->setEnabled(false); + checkStorePassword->setEnabled(false); + break; + } +} + +void KBiffMailboxTab::browse() +{ + QString proto(getMailbox().protocol()); + + if (proto == "imap4" || proto == "imap4s") + { + KURL start; + start.setProtocol((proto == "imap4s") ? "imaps" : "imap"); + start.setUser(getMailbox().user()); + start.setHost(getMailbox().host()); + start.setPath("/"); + KURL url = KFileDialog::getOpenURL(start.url()); + if (url.url().isEmpty()) + return; + + QString path(url.path()); + if (path.isEmpty()) + return; + + if (path[0] == '/') + path = path.right(path.length() - 1); + if (path.right(1) == "/") + path = path.left(path.length() - 1); + + editMailbox->setText( path ); + return; + } + else + { + QString file; + if (proto == "maildir") + file = KFileDialog::getExistingDirectory(); + else + file = KFileDialog::getOpenFileName(); + + if( file.isEmpty() ) + return; + + editMailbox->setText( file ); + } +} + +void KBiffMailboxTab::advanced() +{ + KBiffMailboxAdvanced advanced_dlg; + QString prot(getMailbox().protocol()); + + if (prot == "mbox" || prot == "maildir" || prot == "file" || prot == "mh") + { + advanced_dlg.setPort(port, false); + advanced_dlg.setTimeout(timeout, false); + } + else + { + advanced_dlg.setPort(port); + advanced_dlg.setTimeout(timeout); + } + + if ((prot == "imap4") || (prot == "imap4s")) + { + advanced_dlg.setPreauth(preauth); + advanced_dlg.setKeepalive(keepalive); + advanced_dlg.setAsync(async); + } + + if ((prot == "pop3") || (prot == "nntp") || (prot == "pop3s")) + { + advanced_dlg.setKeepalive(keepalive); + advanced_dlg.setAsync(async); + advanced_dlg.setDisableApop(!useApop); + } + + advanced_dlg.setMailbox(getMailbox()); + if (advanced_dlg.exec()) + { + port = advanced_dlg.getPort(); + setMailbox(advanced_dlg.getMailbox()); + } +} + +const KBiffURL KBiffMailboxTab::defaultMailbox() const +{ + QFileInfo mailbox_info(getenv("MAIL")); + if (mailbox_info.exists() == false) + { + QString s(_PATH_MAILDIR); + s += "/"; + s += getpwuid(getuid())->pw_name; + mailbox_info.setFile(s); + } + + QString default_path = mailbox_info.isDir() ? QString("maildir:") : + QString("mbox:"); + default_path.append(mailbox_info.absFilePath()); + + return KBiffURL(default_path); +} + +////////////////////////////////////////////////////////////////////// +// KBiffAboutTab +////////////////////////////////////////////////////////////////////// +KBiffAboutTab::KBiffAboutTab(QWidget *parent_) + : QWidget(parent_) +{ + // load in the kbiff pixmap + QPixmap logo_pixmap(kapp->icon()); + + QLabel *pixmap_label = new QLabel(this); + pixmap_label->setPixmap(logo_pixmap); + + // we want a bigger logo + QFont logo_font = QFont::defaultFont(); + logo_font.setPointSize(logo_font.pointSize() * 1.5); + logo_font.setBold(true); + + KURLLabel *logo_label = new KURLLabel(this); + logo_label->setURL("http://kbiff.granroth.org"); + logo_label->setFont(logo_font); + logo_label->setText("KBiff"); + logo_label->setUnderline(false); + logo_label->setGlow(false); + logo_label->setFloat(true); + connect(logo_label, SIGNAL(leftClickedURL(const QString&)), + SLOT(homepage(const QString&))); + + QLabel *version_label = new QLabel(this); + version_label->setText(QString("Version %1\n\nCopyright (C) 1998-2008\nKurt Granroth").arg(kbiff_version)); + + KURLLabel *email_label = new KURLLabel(this); + email_label->setText("granroth@kde.org"); + email_label->setURL("mailto:granroth@kde.org"); + email_label->setUnderline(false); + email_label->setGlow(false); + email_label->setFloat(true); + connect(email_label, SIGNAL(leftClickedURL(const QString&)), + SLOT(mailTo(const QString&))); + + // about tab text layout + QVBoxLayout *text_layout = new QVBoxLayout(0); + text_layout->addWidget(version_label); + text_layout->addWidget(email_label); + + // main about tab layout + QGridLayout *about_layout = new QGridLayout(this, 3, 2, 12, 0); + about_layout->addWidget(pixmap_label, 0, 0); + about_layout->addWidget(logo_label, 0, 1); + about_layout->addLayout(text_layout, 1, 1); + about_layout->setRowStretch(2, 1); +} + +KBiffAboutTab::~KBiffAboutTab() +{ +} + +void KBiffAboutTab::mailTo(const QString& url) +{ + (void) new KRun ( url ); +} + +void KBiffAboutTab::homepage(const QString& url) +{ + (void) new KRun ( url ); +} + +KBiffNewDlg::KBiffNewDlg(QWidget* parent_, const char * name_) + : KDialog(parent_, name_, true) +{ + // set my name + setCaption(i18n("New Name")); + + QLabel* label = new QLabel(i18n("&New Name:"), this); + editName = new QLineEdit(this); + editName->setFocus(); + label->setBuddy(editName); + + // ok button + QPushButton* button_ok = new QPushButton(i18n("&OK"), this); + button_ok->setDefault(true); + + // cancel button + QPushButton* button_cancel = new QPushButton(i18n("&Cancel"), this); + + connect(button_ok, SIGNAL(clicked()), SLOT(accept())); + connect(button_cancel, SIGNAL(clicked()), SLOT(reject())); + + // NOW DO THE LAYOUT + QGridLayout *top_layout = new QGridLayout(this, 2, 3, 12); + top_layout->addWidget(label, 0, 0); + top_layout->addMultiCellWidget(editName, 0, 0, 1, 2); + top_layout->addWidget(button_ok, 1, 1); + top_layout->addWidget(button_cancel, 1, 2); +} -- cgit v1.2.3