diff --git a/calendarsupport/kcalprefs.kcfg b/calendarsupport/kcalprefs.kcfg index bb13cd11be..737adb4353 100644 --- a/calendarsupport/kcalprefs.kcfg +++ b/calendarsupport/kcalprefs.kcfg @@ -1,212 +1,228 @@ klocale.h Check this box to use the KDE-wide e-mail settings, which are defined using the System Settings "About Me" Module. Uncheck this box to be able to specify your full name and e-mail. true Enter the default time for events here. The default is used if you do not supply a start time. QDateTime(QDate(1752,1,1), QTime(10,0)) Enter default duration for events here. The default is used if you do not supply an end time. QDateTime(QDate(1752,1,1), QTime(1,0)) Check this box if you want to enable the specified file to be used as the default sound file for new reminders. You can always specify another file in the Reminder configuration accessible from the Event or To-do editors. false Set a file to be used as the default sound file for new reminders. You can always specify another file in the Reminder configuration accessible from the Event or To-do editors. Check this box if you want to enable reminders for all newly created Events. You can always turn-off the reminders in the Event editor dialog. By default, enable reminders for new events false Check this box if you want to enable reminders for all newly created To-dos. You can always turn-off the reminders in the To-do editor dialog. By default, enable reminders for new to-dos false Enter the default reminder time for all newly created items. The time unit is specified in the adjacent combobox. Default time for reminders 15 Enter the default reminder time units for all newly created items. The time is specified in the adjacent spinbox. Default time unit for reminders 0 Enter the start time for events here. This time should be the earliest time that you use for events. QDateTime(QDate(1752,1,1), QTime(7,0)) Check this box to prevent KOrganizer from marking the working hours on holidays. true Select from which region you want to use the holidays here. Defined holidays are shown as non-working days in the date navigator, the agenda view, etc. Check this box to enable automatic generation of mails when creating, updating or deleting events (or to-dos) involving other attendees. You should check this box if you want to use the groupware functionality (e.g. Configuring Kontact as a KDE Kolab client). true + + + + + + + + + + + + + + InvitationPolicySend + + true false 1 UnitMonths true true actionArchive 31 Enter your full name here. This name will be displayed as "Organizer" in to-dos and events you create. i18n("Anonymous") Enter here your e-mail address. This e-mail address will be used to identify the owner of the calendar, and displayed in events and to-dos you create. i18n("nobody@nowhere") Select a color to use for the "no category" or "unset category" situation, when an item does not belong to any category. This color is used when drawing items in the agenda or month views using the "Only category" scheme. Use this color when drawing items without a category 151, 235, 121 diff --git a/incidenceeditor-ng/individualmailcomponentfactory.cpp b/incidenceeditor-ng/individualmailcomponentfactory.cpp index fec1f09ed5..e46ddd7ecc 100644 --- a/incidenceeditor-ng/individualmailcomponentfactory.cpp +++ b/incidenceeditor-ng/individualmailcomponentfactory.cpp @@ -1,254 +1,267 @@ /* Copyright (c) 2014 Sandro Knauß This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "individualmailcomponentfactory.h" #include "individualmaildialog.h" +#include #include #include #include #include #include #include using namespace IncidenceEditorNG; // IndividualMessageQueueJob IndividualMessageQueueJob::IndividualMessageQueueJob(const KPIMIdentities::Identity &identity, const KCalCore::Attendee::List &update, const KCalCore::Attendee::List &edit, QObject *parent) : MailTransport::MessageQueueJob(parent) , mUpdate(update) , mEdit(edit) , mIdentity(identity) , mQueueJob(0) , mComposerJob(0) { } void IndividualMessageQueueJob::start() { QSet attendeesTo(QSet::fromList(addressAttribute().to())); QSet attendeesCc(QSet::fromList(addressAttribute().cc())); QStringList attendeesAutoTo, attendeesAutoCc; foreach (const KCalCore::Attendee::Ptr & attendee, mUpdate) { if (attendeesTo.contains(attendee->email())) { attendeesAutoTo.append(attendee->fullName()); } if (attendeesCc.contains(attendee->email())) { attendeesAutoCc.append(attendee->fullName()); } } if (!attendeesAutoTo.isEmpty() || !attendeesAutoCc.isEmpty() || !addressAttribute().bcc().isEmpty()) { startQueueJob(attendeesAutoTo, attendeesAutoCc); } QStringList attendeesComposerTo, attendeesComposerCc; foreach (const KCalCore::Attendee::Ptr & attendee, mEdit) { if (attendeesTo.contains(attendee->email())) { attendeesComposerTo.append(attendee->fullName()); } if (attendeesCc.contains(attendee->email())) { attendeesComposerCc.append(attendee->fullName()); } } if (!attendeesComposerTo.isEmpty() || !attendeesComposerCc.isEmpty()) { startComposerJob(attendeesComposerTo, attendeesComposerCc); } // No subjob has been started if (!mQueueJob && !mComposerJob) { emitResult(); } } void IndividualMessageQueueJob::startQueueJob(const QStringList &to, const QStringList &cc) { KMime::Message::Ptr msg(message()); msg->to()->fromUnicodeString(to.join(QLatin1String(", ")), "utf-8"); msg->cc()->fromUnicodeString(cc.join(QLatin1String(", ")), "utf-8"); msg->assemble(); mQueueJob = new MailTransport::MessageQueueJob(this); mQueueJob->setMessage(msg); mQueueJob->transportAttribute().setTransportId(transportAttribute().transportId()); mQueueJob->sentBehaviourAttribute().setSentBehaviour(sentBehaviourAttribute().sentBehaviour()); mQueueJob->addressAttribute().setFrom(addressAttribute().from()); mQueueJob->addressAttribute().setTo(to); mQueueJob->addressAttribute().setCc(cc); mQueueJob->addressAttribute().setBcc(addressAttribute().bcc()); connect(mQueueJob, SIGNAL(finished(KJob*)), SLOT(handleJobFinished(KJob*))); mQueueJob->start(); } void IndividualMessageQueueJob::startComposerJob(const QStringList &to, const QStringList &cc) { mComposerJob = new OpenComposerJob(this, to.join(QLatin1String(", ")), cc.join(QLatin1String(", ")), QString(), message(), mIdentity); connect(mComposerJob, SIGNAL(finished(KJob*)), SLOT(handleJobFinished(KJob*))); mComposerJob->start(); } void IndividualMessageQueueJob::handleJobFinished(KJob *job) { if (job->error()) { if (job == mQueueJob && mComposerJob) { mComposerJob->kill(); mComposerJob = 0; } else if (job == mComposerJob && mQueueJob) { mQueueJob->kill(); mQueueJob = 0; } setError(job->error()); setErrorText(job->errorString()); emitResult(); return; } if (job == mQueueJob) { if (!mComposerJob) { emitResult(); } mQueueJob = 0; } else { if (!mQueueJob) { emitResult(); } mComposerJob = 0; } } // IndividualMailAskDelegator IndividualMailITIPHandlerDialogDelegate::IndividualMailITIPHandlerDialogDelegate(const KCalCore::Incidence::Ptr &incidence, KCalCore::iTIPMethod method, QWidget *parent) : Akonadi::ITIPHandlerDialogDelegate(incidence, method, parent) { } void IndividualMailITIPHandlerDialogDelegate::openDialog(const QString &question, const KCalCore::Attendee::List &attendees, Action action, const KGuiItem &buttonYes, const KGuiItem &buttonNo) { switch (action) { case ActionSendMessage: emit setUpdate(mIncidence, attendees); emit dialogClosed(KMessageBox::Yes, mMethod, mIncidence); break; case ActionDontSendMessage: emit dialogClosed(KMessageBox::No, mMethod, mIncidence); break; default: - mDialog = new IndividualMailDialog(question, attendees, buttonYes, buttonNo, mParent); - connect(mDialog, SIGNAL(finished(int)), SLOT(onDialogClosed(int))); - mDialog->show(); + switch (CalendarSupport::KCalPrefs::instance()->sendPolicy()) { + case(CalendarSupport::KCalPrefs::InvitationPolicySend): + emit setUpdate(mIncidence, attendees); + emit dialogClosed(KMessageBox::Yes, mMethod, mIncidence); + break; + case(CalendarSupport::KCalPrefs::InvitationPolicyDontSend): + emit dialogClosed(KMessageBox::No, mMethod, mIncidence); + break; + case(CalendarSupport::KCalPrefs::InvitationPolicyAsk): + default: + mDialog = new IndividualMailDialog(question, attendees, buttonYes, buttonNo, mParent); + connect(mDialog, SIGNAL(finished(int)), SLOT(onDialogClosed(int))); + mDialog->show(); + break; + } break; } } void IndividualMailITIPHandlerDialogDelegate::openDialogIncidenceCreated(Recipient recipient, const QString &question, Action action, const KGuiItem &buttonYes, const KGuiItem &buttonNo) { if (recipient == Attendees) { openDialog(question, mIncidence->attendees(), action, buttonYes, buttonNo); } else { KCalCore::Attendee::Ptr organizer(new KCalCore::Attendee(mIncidence->organizer()->name(), mIncidence->organizer()->email())); openDialog(question, KCalCore::Attendee::List() << organizer, action, buttonYes, buttonNo); } } void IndividualMailITIPHandlerDialogDelegate::openDialogIncidenceModified(bool attendeeStatusChanged, Recipient recipient, const QString &question, Action action, const KGuiItem &buttonYes, const KGuiItem &buttonNo) { Q_UNUSED(attendeeStatusChanged); if (recipient == Attendees) { openDialog(question, mIncidence->attendees(), action, buttonYes, buttonNo); } else { KCalCore::Attendee::Ptr organizer(new KCalCore::Attendee(mIncidence->organizer()->name(), mIncidence->organizer()->email())); openDialog(question, KCalCore::Attendee::List() << organizer, action, buttonYes, buttonNo); } } void IndividualMailITIPHandlerDialogDelegate::openDialogIncidenceDeleted(Recipient recipient, const QString &question, Action action, const KGuiItem &buttonYes, const KGuiItem &buttonNo) { if (recipient == Attendees) { openDialog(question, mIncidence->attendees(), action, buttonYes, buttonNo); } else { KCalCore::Attendee::Ptr organizer(new KCalCore::Attendee(mIncidence->organizer()->name(), mIncidence->organizer()->email())); openDialog(question, KCalCore::Attendee::List() << organizer, action, buttonYes, buttonNo); } } void IndividualMailITIPHandlerDialogDelegate::onDialogClosed(int result) { if (result == KDialog::Yes) { emit setEdit(mIncidence, mDialog->editAttendees()); emit setUpdate(mIncidence, mDialog->updateAttendees()); emit dialogClosed(KMessageBox::Yes, mMethod, mIncidence); } else { emit dialogClosed(KMessageBox::No, mMethod, mIncidence); } } // IndividualMailJobFactory IndividualMailComponentFactory::IndividualMailComponentFactory(QObject *parent) : Akonadi::ITIPHandlerComponentFactory(parent) { } MailTransport::MessageQueueJob *IndividualMailComponentFactory::createMessageQueueJob(const KCalCore::IncidenceBase::Ptr &incidence, const KPIMIdentities::Identity &identity, QObject *parent) { return new IndividualMessageQueueJob(identity, mUpdate.take(incidence->uid()), mEdit.take(incidence->uid()), parent); } Akonadi::ITIPHandlerDialogDelegate *IndividualMailComponentFactory::createITIPHanderDialogDelegate(const KCalCore::Incidence::Ptr &incidence, KCalCore::iTIPMethod method, QWidget *parent) { IndividualMailITIPHandlerDialogDelegate *askDelegator = new IndividualMailITIPHandlerDialogDelegate(incidence, method, parent); connect(askDelegator, SIGNAL(setEdit(KCalCore::Incidence::Ptr,KCalCore::Attendee::List)), SLOT(onSetEdit(KCalCore::Incidence::Ptr,KCalCore::Attendee::List))); connect(askDelegator, SIGNAL(setUpdate(KCalCore::Incidence::Ptr,KCalCore::Attendee::List)), SLOT(onSetUpdate(KCalCore::Incidence::Ptr,KCalCore::Attendee::List))); return askDelegator; } void IndividualMailComponentFactory::onSetEdit(const KCalCore::Incidence::Ptr &incidence, const KCalCore::Attendee::List &edit) { mEdit[incidence->uid()] = edit; } void IndividualMailComponentFactory::onSetUpdate(const KCalCore::Incidence::Ptr &incidence, const KCalCore::Attendee::List &update) { mUpdate[incidence->uid()] = update; } diff --git a/korganizer/koprefsdialog.cpp b/korganizer/koprefsdialog.cpp index 3ecbb795c5..06bb6cc51b 100644 --- a/korganizer/koprefsdialog.cpp +++ b/korganizer/koprefsdialog.cpp @@ -1,1582 +1,1587 @@ /* This file is part of KOrganizer. Copyright (c) 2000-2003 Cornelius Schumacher Copyright (C) 2003-2004 Reinhold Kainhofer This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. As a special exception, permission is given to link this program with any edition of Qt, and distribute the resulting executable, without including the source code for Qt in the source distribution. */ #include "koprefsdialog.h" #include "kitemiconcheckcombo.h" #include "kocore.h" #include "koglobals.h" #include "koprefs.h" #include "ui_kogroupwareprefspage.h" #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 #include #include #include KOPrefsDialogMain::KOPrefsDialogMain( const KComponentData &inst, QWidget *parent ) : KPrefsModule( KOPrefs::instance(), inst, parent ) { QBoxLayout *topTopLayout = new QVBoxLayout( this ); KTabWidget *tabWidget = new KTabWidget( this ); topTopLayout->addWidget( tabWidget ); // Personal Settings QWidget *personalFrame = new QWidget( this ); QVBoxLayout *personalLayout = new QVBoxLayout( personalFrame ); tabWidget->addTab( personalFrame, KIcon( QLatin1String("preferences-desktop-personal") ), i18nc( "@title:tab personal settings", "Personal" ) ); KPIM::KPrefsWidBool *emailControlCenter = addWidBool( CalendarSupport::KCalPrefs::instance()->emailControlCenterItem(), personalFrame ); connect( emailControlCenter->checkBox(), SIGNAL(toggled(bool)), SLOT(toggleEmailSettings(bool)) ); personalLayout->addWidget( emailControlCenter->checkBox() ); mUserEmailSettings = new QGroupBox( i18nc( "@title:group email settings", "Email Settings" ), personalFrame ); personalLayout->addWidget( mUserEmailSettings ); QFormLayout *emailSettingsLayout = new QFormLayout( mUserEmailSettings ); KPIM::KPrefsWidString *s = addWidString( CalendarSupport::KCalPrefs::instance()->userNameItem(), mUserEmailSettings ); emailSettingsLayout->addRow ( s->label(), s->lineEdit() ); s=addWidString( CalendarSupport::KCalPrefs::instance()->userEmailItem(), mUserEmailSettings ); emailSettingsLayout->addRow ( s->label(), s->lineEdit() ); KPIM::KPrefsWidRadios *defaultEmailAttachMethod = addWidRadios( IncidenceEditorNG::GlobalSettings::self()->defaultEmailAttachMethodItem(), personalFrame ); personalLayout->addWidget( defaultEmailAttachMethod->groupBox() ); personalLayout->addStretch( 1 ); // Save Settings QFrame *saveFrame = new QFrame( this ); tabWidget->addTab( saveFrame, KIcon( QLatin1String("document-save") ), i18nc( "@title:tab", "Save" ) ); QVBoxLayout *saveLayout = new QVBoxLayout( saveFrame ); QGroupBox *saveGroupBox = new QGroupBox( i18nc( "@title:group", "Exporting Calendar" ), saveFrame ); saveLayout->addWidget( saveGroupBox ); QVBoxLayout *saveGroupLayout = new QVBoxLayout; saveGroupBox->setLayout( saveGroupLayout ); KPIM::KPrefsWidBool *autoExportHTML = addWidBool( KOPrefs::instance()->autoExportItem(), saveGroupBox ); saveGroupLayout->addWidget( autoExportHTML->checkBox() ); QBoxLayout *intervalLayout = new QHBoxLayout; saveGroupLayout->addLayout( intervalLayout ); KPIM::KPrefsWidInt *autoExportInterval = addWidInt( KOPrefs::instance()->autoExportIntervalItem(), saveGroupBox ); connect( autoExportHTML->checkBox(), SIGNAL(toggled(bool)), autoExportInterval->label(), SLOT(setEnabled(bool)) ); connect( autoExportHTML->checkBox(), SIGNAL(toggled(bool)), autoExportInterval->spinBox(), SLOT(setEnabled(bool)) ); intervalLayout->addWidget( autoExportInterval->label() ); intervalLayout->addWidget( autoExportInterval->spinBox() ); KPIM::KPrefsWidBool *confirmItem = addWidBool( KOPrefs::instance()->confirmItem(), saveFrame ); saveLayout->addWidget( confirmItem->checkBox() ); KPIM::KPrefsWidRadios *destinationItem = addWidRadios( KOPrefs::instance()->destinationItem(), saveFrame ); saveLayout->addWidget( destinationItem->groupBox() ); saveLayout->addStretch( 1 ); // System Tray Settings QFrame *systrayFrame = new QFrame( this ); QVBoxLayout *systrayLayout = new QVBoxLayout( systrayFrame ); tabWidget->addTab( systrayFrame, KIcon( QLatin1String("preferences-other") ), i18nc( "@title:tab systray settings", "System Tray" ) ); QGroupBox *systrayGroupBox = new QGroupBox( i18nc( "@title:group", "Show/Hide Options" ), systrayFrame ); systrayLayout->addWidget( systrayGroupBox ); QVBoxLayout *systrayGroupLayout = new QVBoxLayout; systrayGroupBox->setLayout( systrayGroupLayout ); KPIM::KPrefsWidBool *showReminderDaemonItem = addWidBool( KOPrefs::instance()->showReminderDaemonItem(), systrayGroupBox ); systrayGroupLayout->addWidget( showReminderDaemonItem->checkBox() ); showReminderDaemonItem->checkBox()->setToolTip( i18nc( "@info:tooltip", "Enable this setting to show the KOrganizer " "reminder daemon in your system tray (recommended)." ) ); QLabel *note = new QLabel( i18nc( "@info", "The daemon will continue running even if it is not shown " "in the system tray." ) ); systrayGroupLayout->addWidget( note ); systrayLayout->addStretch( 1 ); //Calendar Account QFrame *calendarFrame = new QFrame( this ); tabWidget->addTab( calendarFrame, KIcon( QLatin1String("office-calendar") ), i18nc( "@title:tab calendar account settings", "Calendars" ) ); mAccountsCalendar.setupUi( calendarFrame ); mAccountsCalendar.vlay->setSpacing( KDialog::spacingHint() ); mAccountsCalendar.vlay->setMargin( KDialog::marginHint() ); mAccountsCalendar.mAccountList->agentFilterProxyModel()-> addMimeTypeFilter( QLatin1String("text/calendar") ); mAccountsCalendar.mAccountList->agentFilterProxyModel()-> addCapabilityFilter( QLatin1String("Resource") ); // show only resources, no agents mAccountsCalendar.mFilterAccount-> setProxy( mAccountsCalendar.mAccountList->agentFilterProxyModel() ); connect( mAccountsCalendar.mAccountList->view()->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SLOT(slotAccountSelected())); connect( mAccountsCalendar.mAccountList, SIGNAL(doubleClicked(Akonadi::AgentInstance)), this, SLOT(slotModifySelectedAccount()) ); mAccountsCalendar.hlay->insertWidget( 0, mAccountsCalendar.mAccountList ); connect( mAccountsCalendar.mAddAccountButton, SIGNAL(clicked()), this, SLOT(slotAddAccount()) ); connect( mAccountsCalendar.mModifyAccountButton, SIGNAL(clicked()), this, SLOT(slotModifySelectedAccount()) ); const bool hasSelection = !mAccountsCalendar.mAccountList->selectedAgentInstances().isEmpty(); mAccountsCalendar.mModifyAccountButton->setEnabled( hasSelection ); mAccountsCalendar.mRemoveAccountButton->setEnabled( hasSelection ); connect( mAccountsCalendar.mRemoveAccountButton, SIGNAL(clicked()), this, SLOT(slotRemoveSelectedAccount()) ); load(); } void KOPrefsDialogMain::slotAccountSelected() { if ( mAccountsCalendar.mAccountList->selectedAgentInstances().isEmpty() ) { mAccountsCalendar.mModifyAccountButton->setEnabled( false ); mAccountsCalendar.mRemoveAccountButton->setEnabled( false ); } else { Akonadi::AgentInstance selectedAgent = mAccountsCalendar.mAccountList->selectedAgentInstances().first(); mAccountsCalendar.mModifyAccountButton->setEnabled( !selectedAgent.type().capabilities().contains( QLatin1String( "NoConfig" ) ) ); mAccountsCalendar.mRemoveAccountButton->setEnabled( true ); } } void KOPrefsDialogMain::slotAddAccount() { //TODO verify this dialog box. We can see note etc... Akonadi::AgentTypeDialog dlg( this ); Akonadi::AgentFilterProxyModel *filter = dlg.agentFilterProxyModel(); filter->addMimeTypeFilter( QLatin1String("text/calendar") ); filter->addCapabilityFilter( QLatin1String("Resource") ); if ( dlg.exec() ) { const Akonadi::AgentType agentType = dlg.agentType(); if ( agentType.isValid() ) { Akonadi::AgentInstanceCreateJob *job = new Akonadi::AgentInstanceCreateJob( agentType, this ); job->configure( this ); job->start(); } } } void KOPrefsDialogMain::slotModifySelectedAccount() { Akonadi::AgentInstance instance = mAccountsCalendar.mAccountList->currentAgentInstance(); if ( instance.isValid() ) { KWindowSystem::allowExternalProcessWindowActivation(); instance.configure( this ); } } void KOPrefsDialogMain::slotRemoveSelectedAccount() { const Akonadi::AgentInstance instance = mAccountsCalendar.mAccountList->currentAgentInstance(); if ( instance.isValid() ) { Akonadi::AgentManager::self()->removeInstance( instance ); } slotAccountSelected(); } void KOPrefsDialogMain::toggleEmailSettings( bool on ) { mUserEmailSettings->setEnabled( !on ); /* if (on) { KEMailSettings settings; mNameEdit->setText( settings.getSetting(KEMailSettings::RealName) ); mEmailEdit->setText( settings.getSetting(KEMailSettings::EmailAddress) ); } else { mNameEdit->setText( CalendarSupport::KCalPrefs::instance()->mName ); mEmailEdit->setText( CalendarSupport::KCalPrefs::instance()->mEmail ); }*/ } extern "C" { KDE_EXPORT KCModule *create_korganizerconfigmain( QWidget *parent, const char * ) { return new KOPrefsDialogMain( KOGlobals::self()->componentData(), parent ); } } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// class KOPrefsDialogTime : public KPIM::KPrefsModule { public: KOPrefsDialogTime( const KComponentData &inst, QWidget *parent ) : KPIM::KPrefsModule( KOPrefs::instance(), inst, parent ) { QVBoxLayout *layout = new QVBoxLayout( this ); KTabWidget *tabWidget = new KTabWidget( this ); layout->addWidget( tabWidget ); QFrame *regionalPage = new QFrame( parent ); tabWidget->addTab( regionalPage, KIcon( QLatin1String("flag") ), i18nc( "@title:tab", "Regional" ) ); QGridLayout *regionalLayout = new QGridLayout( regionalPage ); regionalLayout->setSpacing( KDialog::spacingHint() ); QGroupBox *datetimeGroupBox = new QGroupBox( i18nc( "@title:group", "General Time and Date" ), regionalPage ); regionalLayout->addWidget( datetimeGroupBox, 0, 0 ); QGridLayout *datetimeLayout = new QGridLayout( datetimeGroupBox ); KPIM::KPrefsWidTime *dayBegins = addWidTime( KOPrefs::instance()->dayBeginsItem(), regionalPage ); datetimeLayout->addWidget( dayBegins->label(), 1, 0 ); datetimeLayout->addWidget( dayBegins->timeEdit(), 1, 1 ); QGroupBox *holidaysGroupBox = new QGroupBox( i18nc( "@title:group", "Holidays" ), regionalPage ); regionalLayout->addWidget( holidaysGroupBox, 1, 0 ); QGridLayout *holidaysLayout = new QGridLayout( holidaysGroupBox ); // holiday region selection KHBox *holidayRegBox = new KHBox( regionalPage ); holidaysLayout->addWidget( holidayRegBox, 1, 0, 1, 2 ); QLabel *holidayLabel = new QLabel( i18nc( "@label", "Use holiday region:" ), holidayRegBox ); holidayLabel->setWhatsThis( KOPrefs::instance()->holidaysItem()->whatsThis() ); mHolidayCombo = new KComboBox( holidayRegBox ); connect( mHolidayCombo, SIGNAL(activated(int)), SLOT(slotWidChanged()) ); mHolidayCombo->setWhatsThis( KOPrefs::instance()->holidaysItem()->whatsThis() ); QStringList regions = KHolidays::HolidayRegion::regionCodes(); QMap regionsMap; foreach ( const QString & regionCode, regions ) { QString name = KHolidays::HolidayRegion::name( regionCode ); QString languageName = KGlobal::locale()->languageCodeToName( KHolidays::HolidayRegion::languageCode( regionCode ) ); QString label; if ( languageName.isEmpty() ) { label = name; } else { label = i18nc( "Holday region, region language", "%1 (%2)", name, languageName ); } regionsMap.insert( label, regionCode ); } mHolidayCombo->addItem( i18nc( "No holiday region", "None" ), QString() ); QMapIterator i( regionsMap ); while ( i.hasNext() ) { i.next(); mHolidayCombo->addItem( i.key(), i.value() ); } if ( KOGlobals::self()->holidays() && KOGlobals::self()->holidays()->isValid() ) { mHolidayCombo->setCurrentIndex( mHolidayCombo->findData( KOGlobals::self()->holidays()->regionCode() ) ); } else { mHolidayCombo->setCurrentIndex( 0 ); } QGroupBox *workingHoursGroupBox = new QGroupBox( i18nc( "@title:group", "Working Period" ), regionalPage ); regionalLayout->addWidget( workingHoursGroupBox, 2, 0 ); QBoxLayout *workingHoursLayout = new QVBoxLayout( workingHoursGroupBox ); QBoxLayout *workDaysLayout = new QHBoxLayout; workingHoursLayout->addLayout( workDaysLayout ); // Respect start of week setting int weekStart = KGlobal::locale()->weekStartDay(); for ( int i=0; i < 7; ++i ) { const KCalendarSystem *calSys = KOGlobals::self()->calendarSystem(); QString weekDayName = calSys->weekDayName( ( i + weekStart + 6 ) % 7 + 1, KCalendarSystem::ShortDayName ); int index = ( i + weekStart + 6 ) % 7; mWorkDays[ index ] = new QCheckBox( weekDayName ); mWorkDays[ index ]->setWhatsThis( i18nc( "@info:whatsthis", "Check this box to make KOrganizer mark the " "working hours for this day of the week. " "If this is a work day for you, check " "this box, or the working hours will not be " "marked with color." ) ); connect( mWorkDays[ index ], SIGNAL(stateChanged(int)), SLOT(slotWidChanged()) ); workDaysLayout->addWidget( mWorkDays[ index ] ); } KPIM::KPrefsWidTime *workStart = addWidTime( KOPrefs::instance()->workingHoursStartItem() ); QHBoxLayout *workStartLayout = new QHBoxLayout; workingHoursLayout->addLayout( workStartLayout ); workStartLayout->addWidget( workStart->label() ); workStartLayout->addWidget( workStart->timeEdit() ); KPIM::KPrefsWidTime *workEnd = addWidTime( KOPrefs::instance()->workingHoursEndItem() ); QHBoxLayout *workEndLayout = new QHBoxLayout; workingHoursLayout->addLayout( workEndLayout ); workEndLayout->addWidget( workEnd->label() ); workEndLayout->addWidget( workEnd->timeEdit() ); KPIM::KPrefsWidBool *excludeHolidays = addWidBool( KOPrefs::instance()->excludeHolidaysItem() ); workingHoursLayout->addWidget( excludeHolidays->checkBox() ); regionalLayout->setRowStretch( 4, 1 ); QFrame *defaultPage = new QFrame( parent ); tabWidget->addTab( defaultPage, KIcon( QLatin1String("draw-eraser") ), i18nc( "@title:tab", "Default Values" ) ); QGridLayout *defaultLayout = new QGridLayout( defaultPage ); defaultLayout->setSpacing( KDialog::spacingHint() ); QGroupBox *timesGroupBox = new QGroupBox( i18nc( "@title:group", "Appointments" ), defaultPage ); defaultLayout->addWidget( timesGroupBox, 0, 0 ); QGridLayout *timesLayout = new QGridLayout( timesGroupBox ); KPIM::KPrefsWidTime *defaultTime = addWidTime( CalendarSupport::KCalPrefs::instance()->startTimeItem(), defaultPage ); timesLayout->addWidget( defaultTime->label(), 0, 0 ); timesLayout->addWidget( defaultTime->timeEdit(), 0, 1 ); KPIM::KPrefsWidDuration *defaultDuration = addWidDuration( CalendarSupport::KCalPrefs::instance()->defaultDurationItem(), QLatin1String("hh:mm"), defaultPage ); timesLayout->addWidget( defaultDuration->label(), 1, 0 ); timesLayout->addWidget( defaultDuration->timeEdit(), 1, 1 ); QGroupBox *remindersGroupBox = new QGroupBox( i18nc( "@title:group", "Reminders" ), defaultPage ); defaultLayout->addWidget( remindersGroupBox, 1, 0 ); QGridLayout *remindersLayout = new QGridLayout( remindersGroupBox ); QLabel *reminderLabel = new QLabel( i18nc( "@label", "Default reminder time:" ), defaultPage ); remindersLayout->addWidget( reminderLabel, 0, 0 ); reminderLabel->setWhatsThis( CalendarSupport::KCalPrefs::instance()->reminderTimeItem()->whatsThis() ); mReminderTimeSpin = new KIntSpinBox( defaultPage ); mReminderTimeSpin->setWhatsThis( CalendarSupport::KCalPrefs::instance()->reminderTimeItem()->whatsThis() ); mReminderTimeSpin->setToolTip( CalendarSupport::KCalPrefs::instance()->reminderTimeItem()->toolTip() ); connect( mReminderTimeSpin, SIGNAL(valueChanged(int)), SLOT(slotWidChanged()) ); remindersLayout->addWidget( mReminderTimeSpin, 0, 1 ); mReminderUnitsCombo = new KComboBox( defaultPage ); mReminderUnitsCombo->setToolTip( CalendarSupport::KCalPrefs::instance()->reminderTimeUnitsItem()->toolTip() ); mReminderUnitsCombo->setWhatsThis( CalendarSupport::KCalPrefs::instance()->reminderTimeUnitsItem()->whatsThis() ); connect( mReminderUnitsCombo, SIGNAL(activated(int)), SLOT(slotWidChanged()) ); mReminderUnitsCombo->addItem( i18nc( "@item:inlistbox reminder units in minutes", "minute(s)" ) ); mReminderUnitsCombo->addItem( i18nc( "@item:inlistbox reminder time units in hours", "hour(s)" ) ); mReminderUnitsCombo->addItem( i18nc( "@item:inlistbox reminder time units in days", "day(s)" ) ); remindersLayout->addWidget( mReminderUnitsCombo, 0, 2 ); QCheckBox *cb = addWidBool( CalendarSupport::KCalPrefs::instance()->defaultAudioFileRemindersItem() )->checkBox(); cb->setText( QString() ); if ( CalendarSupport::KCalPrefs::instance()->audioFilePathItem()->value().isEmpty() ) { QString defAudioFile = KGlobal::dirs()->findResourceDir( "sound", QLatin1String("KDE-Sys-Warning.ogg") ); CalendarSupport::KCalPrefs::instance()->audioFilePathItem()->setValue( defAudioFile + QLatin1String("KDE-Sys-Warning.ogg") ); } QString filter = i18n( "*.ogg *.wav *.mp3 *.wma *.flac *.aiff *.raw *.au *.ra|" "Audio Files (*.ogg *.wav *.mp3 *.wma *.flac *.aiff *.raw *.au *.ra)" ); KUrlRequester *rq = addWidPath( CalendarSupport::KCalPrefs::instance()->audioFilePathItem(), 0, filter )->urlRequester(); rq->setEnabled( cb->isChecked() ); connect( cb, SIGNAL(toggled(bool)), rq, SLOT(setEnabled(bool)) ); QHBoxLayout *audioFileRemindersBox = new QHBoxLayout( remindersGroupBox ); audioFileRemindersBox->addWidget( cb ); audioFileRemindersBox->addWidget( rq ); remindersLayout->addLayout( audioFileRemindersBox, 1, 0 ); remindersLayout->addWidget( addWidBool( CalendarSupport::KCalPrefs::instance()->defaultEventRemindersItem() )->checkBox(), 2, 0 ); remindersLayout->addWidget( addWidBool( CalendarSupport::KCalPrefs::instance()->defaultTodoRemindersItem() )->checkBox(), 3, 0 ); defaultLayout->setRowStretch( 3, 1 ); load(); } protected: void usrReadConfig() { mReminderTimeSpin->setValue( CalendarSupport::KCalPrefs::instance()->mReminderTime ); mReminderUnitsCombo->setCurrentIndex( CalendarSupport::KCalPrefs::instance()->mReminderTimeUnits ); for ( int i = 0; i < 7; ++i ) { mWorkDays[i]->setChecked( ( 1 << i ) & ( KOPrefs::instance()->mWorkWeekMask ) ); } } void usrWriteConfig() { KOPrefs::instance()->mHolidays = mHolidayCombo->itemData( mHolidayCombo->currentIndex() ).toString(); CalendarSupport::KCalPrefs::instance()->mReminderTime = mReminderTimeSpin->value(); CalendarSupport::KCalPrefs::instance()->mReminderTimeUnits = mReminderUnitsCombo->currentIndex(); int mask = 0; for ( int i = 0; i < 7; ++i ) { if ( mWorkDays[i]->isChecked() ) { mask = mask | ( 1 << i ); } } KOPrefs::instance()->mWorkWeekMask = mask; KOPrefs::instance()->writeConfig(); CalendarSupport::KCalPrefs::instance()->writeConfig(); } void setCombo( KComboBox *combo, const QString &text, const QStringList *tags = 0 ) { if ( tags ) { int i = tags->indexOf( text ); if ( i > 0 ) { combo->setCurrentIndex( i ); } } else { for ( int i=0; i < combo->count(); ++i ) { if ( combo->itemText( i ) == text ) { combo->setCurrentIndex( i ); break; } } } } private: QStringList tzonenames; KComboBox *mHolidayCombo; KIntSpinBox *mReminderTimeSpin; KComboBox *mReminderUnitsCombo; QCheckBox *mWorkDays[7]; }; extern "C" { KDE_EXPORT KCModule *create_korganizerconfigtime( QWidget *parent, const char * ) { KGlobal::locale()->insertCatalog( QLatin1String("timezones4") ); return new KOPrefsDialogTime( KOGlobals::self()->componentData(), parent ); } } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// class KOPrefsDialogViews : public KPIM::KPrefsModule { public: KOPrefsDialogViews( const KComponentData &inst, QWidget *parent ) : KPIM::KPrefsModule( KOPrefs::instance(), inst, parent ), mMonthIconComboBox( new KItemIconCheckCombo( KItemIconCheckCombo::MonthType, this ) ), mAgendaIconComboBox( new KItemIconCheckCombo( KItemIconCheckCombo::AgendaType, this ) ) { QBoxLayout *topTopLayout = new QVBoxLayout( this ); KTabWidget *tabWidget = new KTabWidget( this ); topTopLayout->addWidget( tabWidget ); connect( mMonthIconComboBox, SIGNAL(checkedItemsChanged(QStringList)), SLOT(slotWidChanged()) ); connect( mAgendaIconComboBox, SIGNAL(checkedItemsChanged(QStringList)), SLOT(slotWidChanged()) ); // Tab: Views->General QFrame *generalFrame = new QFrame( this ); tabWidget->addTab( generalFrame, KIcon( QLatin1String("view-choose") ), i18nc( "@title:tab general settings", "General" ) ); QBoxLayout *generalLayout = new QVBoxLayout( generalFrame ); // GroupBox: Views->General->Display Options QVBoxLayout *gdisplayLayout = new QVBoxLayout; QGroupBox *gdisplayBox = new QGroupBox( i18nc( "@title:group", "Display Options" ) ); QBoxLayout *nextDaysLayout = new QHBoxLayout; gdisplayLayout->addLayout( nextDaysLayout ); KPIM::KPrefsWidInt *nextDays = addWidInt( KOPrefs::instance()->nextXDaysItem() ); nextDays->spinBox()->setSuffix( i18nc( "@label suffix in the N days spin box", " days" ) ); nextDaysLayout->addWidget( nextDays->label() ); nextDaysLayout->addWidget( nextDays->spinBox() ); nextDaysLayout->addStretch( 1 ); gdisplayLayout->addWidget( addWidBool( KOPrefs::instance()->enableToolTipsItem() )->checkBox() ); gdisplayLayout->addWidget( addWidBool( KOPrefs::instance()->todosUseCategoryColorsItem() )->checkBox() ); gdisplayBox->setLayout( gdisplayLayout ); generalLayout->addWidget( gdisplayBox ); // GroupBox: Views->General->Date Navigator QVBoxLayout *datenavLayout = new QVBoxLayout; QGroupBox *datenavBox = new QGroupBox( i18nc( "@title:group", "Date Navigator" ) ); datenavLayout->addWidget( addWidBool( KOPrefs::instance()->dailyRecurItem() )->checkBox() ); datenavLayout->addWidget( addWidBool( KOPrefs::instance()->weeklyRecurItem() )->checkBox() ); datenavLayout->addWidget( addWidBool( KOPrefs::instance()->highlightTodosItem() )->checkBox() ); datenavLayout->addWidget( addWidBool( KOPrefs::instance()->highlightJournalsItem() )->checkBox() ); datenavLayout->addWidget( addWidBool( KOPrefs::instance()->weekNumbersShowWorkItem() )->checkBox() ); datenavBox->setLayout( datenavLayout ); generalLayout->addWidget( datenavBox ); generalLayout->addStretch( 1 ); // Tab: Views->Agenda View QFrame *agendaFrame = new QFrame( this ); tabWidget->addTab( agendaFrame, KIcon( QLatin1String("view-calendar-workweek") ), i18nc( "@title:tab", "Agenda View" ) ); QBoxLayout *agendaLayout = new QVBoxLayout( agendaFrame ); // GroupBox: Views->Agenda View->Display Options QVBoxLayout *adisplayLayout = new QVBoxLayout; QGroupBox *adisplayBox = new QGroupBox( i18nc( "@title:group", "Display Options" ) ); QHBoxLayout *hourSizeLayout = new QHBoxLayout; adisplayLayout->addLayout( hourSizeLayout ); KPIM::KPrefsWidInt *hourSize = addWidInt( KOPrefs::instance()->hourSizeItem() ); hourSize->spinBox()->setSuffix( i18nc( "@label suffix in the hour size spin box", " pixels" ) ); hourSizeLayout->addWidget( hourSize->label() ); hourSizeLayout->addWidget( hourSize->spinBox() ); hourSizeLayout->addStretch( 1 ); adisplayLayout->addWidget( addWidBool( KOPrefs::instance()->enableAgendaItemIconsItem() )->checkBox() ); adisplayLayout->addWidget( addWidBool( KOPrefs::instance()->showTodosAgendaViewItem() )->checkBox() ); KPIM::KPrefsWidBool *marcusBainsEnabled = addWidBool( KOPrefs::instance()->marcusBainsEnabledItem() ); adisplayLayout->addWidget( marcusBainsEnabled->checkBox() ); KPIM::KPrefsWidBool *marcusBainsShowSeconds = addWidBool( KOPrefs::instance()->marcusBainsShowSecondsItem() ); connect( marcusBainsEnabled->checkBox(), SIGNAL(toggled(bool)), marcusBainsShowSeconds->checkBox(), SLOT(setEnabled(bool)) ); adisplayLayout->addWidget( marcusBainsShowSeconds->checkBox() ); adisplayLayout->addWidget( addWidBool( KOPrefs::instance()->selectionStartsEditorItem() )->checkBox() ); mAgendaIconComboBox->setCheckedIcons( KOPrefs::instance()->eventViewsPreferences()->agendaViewIcons() ); adisplayLayout->addWidget( mAgendaIconComboBox ); adisplayBox->setLayout( adisplayLayout ); agendaLayout->addWidget( adisplayBox ); // GroupBox: Views->Agenda View->Color Usage agendaLayout->addWidget( addWidRadios( KOPrefs::instance()->agendaViewColorsItem() )->groupBox() ); agendaLayout->addWidget( addWidBool( KOPrefs::instance()->colorBusyDaysEnabledItem() )->checkBox() ); // GroupBox: Views->Agenda View->Multiple Calendars agendaLayout->addWidget( addWidRadios( KOPrefs::instance()->agendaViewCalendarDisplayItem() )->groupBox() ); agendaLayout->addStretch( 1 ); // Tab: Views->Month View QFrame *monthFrame = new QFrame( this ); tabWidget->addTab( monthFrame, KIcon( QLatin1String("view-calendar-month") ), i18nc( "@title:tab", "Month View" ) ); QBoxLayout *monthLayout = new QVBoxLayout( monthFrame ); // GroupBox: Views->Month View->Display Options QVBoxLayout *mdisplayLayout = new QVBoxLayout; QGroupBox *mdisplayBox = new QGroupBox( i18nc( "@title:group", "Display Options" ) ); /*mdisplayLayout->addWidget( addWidBool( KOPrefs::instance()->enableMonthScrollItem() )->checkBox() );*/ mdisplayLayout->addWidget( addWidBool( KOPrefs::instance()->showTimeInMonthViewItem() )->checkBox() ); mdisplayLayout->addWidget( addWidBool( KOPrefs::instance()->enableMonthItemIconsItem() )->checkBox() ); mdisplayLayout->addWidget( addWidBool( KOPrefs::instance()->showTodosMonthViewItem() )->checkBox() ); mdisplayLayout->addWidget( addWidBool( KOPrefs::instance()->showJournalsMonthViewItem() )->checkBox() ); mdisplayBox->setLayout( mdisplayLayout ); mMonthIconComboBox->setCheckedIcons( KOPrefs::instance()->eventViewsPreferences()->monthViewIcons() ); mdisplayLayout->addWidget( mMonthIconComboBox ); monthLayout->addWidget( mdisplayBox ); monthLayout->addWidget( addWidBool( KOPrefs::instance()->colorMonthBusyDaysEnabledItem() )->checkBox() ); // GroupBox: Views->Month View->Color Usage monthLayout->addWidget( addWidRadios( KOPrefs::instance()->monthViewColorsItem() )->groupBox() ); monthLayout->addStretch( 1 ); // Tab: Views->Todo View QFrame *todoFrame = new QFrame( this ); tabWidget->addTab( todoFrame, KIcon( QLatin1String("view-calendar-tasks") ), i18nc( "@title:tab", "Todo View" ) ); QBoxLayout *todoLayout = new QVBoxLayout( todoFrame ); // GroupBox: Views->Todo View->Display Options QVBoxLayout *tdisplayLayout = new QVBoxLayout; QGroupBox *tdisplayBox = new QGroupBox( i18nc( "@title:group", "Display Options" ) ); tdisplayLayout->addWidget( addWidBool( KOPrefs::instance()->sortCompletedTodosSeparatelyItem() )->checkBox() ); tdisplayBox->setLayout( tdisplayLayout ); todoLayout->addWidget( tdisplayBox ); // GroupBox: Views->Todo View->Other QVBoxLayout *otherLayout = new QVBoxLayout; QGroupBox *otherBox = new QGroupBox( i18nc( "@title:group", "Other Options" ) ); otherLayout->addWidget( addWidBool( KOPrefs::instance()->recordTodosInJournalsItem() )->checkBox() ); otherBox->setLayout( otherLayout ); todoLayout->addWidget( otherBox ); todoLayout->addStretch( 1 ); load(); } protected: void usrWriteConfig() { KOPrefs::instance()->eventViewsPreferences()->setAgendaViewIcons( mAgendaIconComboBox->checkedIcons() ); KOPrefs::instance()->eventViewsPreferences()->setMonthViewIcons( mMonthIconComboBox->checkedIcons() ); } private: KItemIconCheckCombo *mMonthIconComboBox; KItemIconCheckCombo *mAgendaIconComboBox; }; extern "C" { KDE_EXPORT KCModule *create_korganizerconfigviews( QWidget *parent, const char * ) { return new KOPrefsDialogViews( KOGlobals::self()->componentData(), parent ); } } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// KOPrefsDialogColorsAndFonts::KOPrefsDialogColorsAndFonts( const KComponentData &inst, QWidget *parent ) : KPIM::KPrefsModule( KOPrefs::instance(), inst, parent ) { QBoxLayout *topTopLayout = new QVBoxLayout( this ); KTabWidget *tabWidget = new KTabWidget( this ); topTopLayout->addWidget( tabWidget ); QWidget *colorFrame = new QWidget( this ); topTopLayout->addWidget( colorFrame ); QGridLayout *colorLayout = new QGridLayout(colorFrame); colorLayout->setSpacing( KDialog::spacingHint() ); tabWidget->addTab( colorFrame, KIcon( QLatin1String("preferences-desktop-color") ), i18nc( "@title:tab", "Colors" ) ); // Holiday Color KPIM::KPrefsWidColor *holidayColor = addWidColor( KOPrefs::instance()->agendaHolidaysBackgroundColorItem(), colorFrame ); colorLayout->addWidget( holidayColor->label(), 0, 0 ); colorLayout->addWidget( holidayColor->button(), 0, 1 ); // agenda view background color KPIM::KPrefsWidColor *agendaBgColor = addWidColor( KOPrefs::instance()->agendaGridBackgroundColorItem(), colorFrame ); colorLayout->addWidget( agendaBgColor->label(), 3, 0 ); colorLayout->addWidget( agendaBgColor->button(), 3, 1 ); // agenda view Marcus Bains line color KPIM::KPrefsWidColor *mblColor = addWidColor( KOPrefs::instance()->agendaMarcusBainsLineLineColorItem(), colorFrame ); colorLayout->addWidget( mblColor->label(), 5, 0 ); colorLayout->addWidget( mblColor->button(), 5, 1 ); KPIM::KPrefsWidColor *viewBgBusyColor = addWidColor( KOPrefs::instance()->viewBgBusyColorItem(), colorFrame ); colorLayout->addWidget( viewBgBusyColor->label(), 4, 0 ); colorLayout->addWidget( viewBgBusyColor->button(), 4, 1 ); // working hours color KPIM::KPrefsWidColor *agendaGridWorkHoursBackgroundColor = addWidColor( KOPrefs::instance()->workingHoursColorItem(), colorFrame ); colorLayout->addWidget( agendaGridWorkHoursBackgroundColor->label(), 6, 0 ); colorLayout->addWidget( agendaGridWorkHoursBackgroundColor->button(), 6, 1 ); // Todo due today color KPIM::KPrefsWidColor *todoDueTodayColor = addWidColor( KOPrefs::instance()->todoDueTodayColorItem(), colorFrame ); colorLayout->addWidget( todoDueTodayColor->label(), 7, 0 ); colorLayout->addWidget( todoDueTodayColor->button(), 7, 1 ); // Todo overdue color KPIM::KPrefsWidColor *todoOverdueColor = addWidColor( KOPrefs::instance()->todoOverdueColorItem(), colorFrame ); colorLayout->addWidget( todoOverdueColor->label(), 8, 0 ); colorLayout->addWidget( todoOverdueColor->button(), 8, 1 ); // categories colors QGroupBox *categoryGroup = new QGroupBox( i18nc( "@title:group", "Categories" ), colorFrame ); colorLayout->addWidget( categoryGroup, 9, 0, 1, 2 ); QGridLayout *categoryLayout = new QGridLayout; categoryGroup->setLayout( categoryLayout ); KPIM::KPrefsWidColor *unsetCategoryColor = addWidColor( CalendarSupport::KCalPrefs::instance()->unsetCategoryColorItem(), categoryGroup ); categoryLayout->addWidget( unsetCategoryColor->label(), 0, 0 ); categoryLayout->addWidget( unsetCategoryColor->button(), 0, 1 ); unsetCategoryColor->label()->setWhatsThis( unsetCategoryColor->button()->whatsThis() ); unsetCategoryColor->label()->setToolTip( unsetCategoryColor->button()->toolTip() ); mCategoryCombo = new KPIM::TagCombo( categoryGroup ); mCategoryCombo->setWhatsThis( i18nc( "@info:whatsthis", "Select here the event category you want to modify. " "You can change the selected category color using " "the button below." ) ); connect( mCategoryCombo, SIGNAL(activated(int)), SLOT(updateCategoryColor()) ); categoryLayout->addWidget( mCategoryCombo, 1, 0 ); mCategoryButton = new KColorButton( categoryGroup ); mCategoryButton->setWhatsThis( i18nc( "@info:whatsthis", "Choose here the color of the event category selected " "using the combo box above." ) ); connect( mCategoryButton, SIGNAL(changed(QColor)), SLOT(setCategoryColor()) ); categoryLayout->addWidget( mCategoryButton, 1, 1 ); updateCategoryColor(); // resources colors QGroupBox *resourceGroup = new QGroupBox( i18nc( "@title:group", "Resources" ), colorFrame ); colorLayout->addWidget( resourceGroup, 10, 0, 1, 2 ); QBoxLayout *resourceLayout = new QHBoxLayout; resourceGroup->setLayout( resourceLayout ); mResourceCombo = new Akonadi::CollectionComboBox( resourceGroup ); //mResourceCombo->addExcludedSpecialResources(Akonadi::Collection::SearchResource); QStringList mimetypes; mimetypes << KCalCore::Todo::todoMimeType(); mimetypes << KCalCore::Journal::journalMimeType(); mimetypes << KCalCore::Event::eventMimeType(); mResourceCombo->setMimeTypeFilter( mimetypes ); mResourceCombo->setWhatsThis( i18nc( "@info:whatsthis", "Select the calendar you want to modify. " "You can change the selected calendar color using " "the button below." ) ); connect( mResourceCombo, SIGNAL(activated(int)), SLOT(updateResourceColor()) ); resourceLayout->addWidget( mResourceCombo ); mResourceButton = new KColorButton( resourceGroup ); mResourceButton->setWhatsThis( i18nc( "@info:whatsthis", "Choose here the color of the calendar selected " "using the combo box above." ) ); connect( mResourceButton, SIGNAL(changed(QColor)), SLOT(setResourceColor()) ); resourceLayout->addWidget( mResourceButton ); colorLayout->setRowStretch( 11, 1 ); QWidget *fontFrame = new QWidget( this ); tabWidget->addTab( fontFrame, KIcon( QLatin1String("preferences-desktop-font") ), i18nc( "@title:tab", "Fonts" ) ); QGridLayout *fontLayout = new QGridLayout( fontFrame ); fontLayout->setSpacing( KDialog::spacingHint() ); KPIM::KPrefsWidFont *timeBarFont = addWidFont( KOPrefs::instance()->agendaTimeLabelsFontItem(), fontFrame, KGlobal::locale()->formatTime( QTime( 12, 34 ) ) ); fontLayout->addWidget( timeBarFont->label(), 0, 0 ); fontLayout->addWidget( timeBarFont->preview(), 0, 1 ); fontLayout->addWidget( timeBarFont->button(), 0, 2 ); KPIM::KPrefsWidFont *monthViewFont = addWidFont( KOPrefs::instance()->monthViewFontItem(), fontFrame, KGlobal::locale()->formatTime( QTime( 12, 34 ) ) + QLatin1Char(' ') + i18nc( "@label", "Event text" ) ); fontLayout->addWidget( monthViewFont->label(), 1, 0 ); fontLayout->addWidget( monthViewFont->preview(), 1, 1 ); fontLayout->addWidget( monthViewFont->button(), 1, 2 ); KPIM::KPrefsWidFont *agendaViewFont = addWidFont( KOPrefs::instance()->agendaViewFontItem(), fontFrame, i18nc( "@label", "Event text" ) ); fontLayout->addWidget( agendaViewFont->label(), 2, 0 ); fontLayout->addWidget( agendaViewFont->preview(), 2, 1 ); fontLayout->addWidget( agendaViewFont->button(), 2, 2 ); KPIM::KPrefsWidFont *marcusBainsFont = addWidFont( KOPrefs::instance()->agendaMarcusBainsLineFontItem(), fontFrame, KGlobal::locale()->formatTime( QTime( 12, 34, 23 ) ) ); fontLayout->addWidget( marcusBainsFont->label(), 3, 0 ); fontLayout->addWidget( marcusBainsFont->preview(), 3, 1 ); fontLayout->addWidget( marcusBainsFont->button(), 3, 2 ); fontLayout->setColumnStretch( 1, 1 ); fontLayout->setRowStretch( 4, 1 ); load(); } void KOPrefsDialogColorsAndFonts::usrWriteConfig() { QHash::const_iterator i = mCategoryDict.constBegin(); while ( i != mCategoryDict.constEnd() ) { CalendarSupport::KCalPrefs::instance()->setCategoryColor( i.key(), i.value() ); ++i; } i = mResourceDict.constBegin(); while ( i != mResourceDict.constEnd() ) { KOPrefs::instance()->setResourceColor( i.key(), i.value() ); ++i; } //mCalendarViewsPrefs->writeConfig(); } void KOPrefsDialogColorsAndFonts::usrReadConfig() { updateCategories(); updateResources(); //mCalendarViewsPrefs->readConfig(); } void KOPrefsDialogColorsAndFonts::updateCategories() { updateCategoryColor(); } void KOPrefsDialogColorsAndFonts::setCategoryColor() { mCategoryDict.insert( mCategoryCombo->currentText(), mCategoryButton->color() ); slotWidChanged(); } void KOPrefsDialogColorsAndFonts::updateCategoryColor() { const QString cat = mCategoryCombo->currentText(); QColor color = mCategoryDict.value( cat ); if ( !color.isValid() ) { //TODO get this from the tag color = CalendarSupport::KCalPrefs::instance()->categoryColor( cat ); } if ( color.isValid() ) { mCategoryButton->setColor( color ); } } void KOPrefsDialogColorsAndFonts::updateResources() { updateResourceColor(); } void KOPrefsDialogColorsAndFonts::setResourceColor() { bool ok; const QString id = QString::number( mResourceCombo->itemData( mResourceCombo->currentIndex(), Akonadi::CollectionModel::CollectionIdRole ).toLongLong( &ok ) ); if( ! ok ) { return; } mResourceDict.insert( id, mResourceButton->color() ); slotWidChanged(); } void KOPrefsDialogColorsAndFonts::updateResourceColor() { bool ok; const QString id = QString::number( mResourceCombo->itemData( mResourceCombo->currentIndex(), Akonadi::CollectionModel::CollectionIdRole ).toLongLong( &ok ) ); if ( !ok ) { return; } kDebug() << id << mResourceCombo->itemText( mResourceCombo->currentIndex() ); QColor color = mResourceDict.value( id ); if ( ! color.isValid() ) { color = KOPrefs::instance()->resourceColor( id ); } mResourceButton->setColor( color ); } extern "C" { KDE_EXPORT KCModule *create_korganizerconfigcolorsandfonts( QWidget *parent, const char * ) { return new KOPrefsDialogColorsAndFonts( KOGlobals::self()->componentData(), parent ); } } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// KOPrefsDialogGroupScheduling::KOPrefsDialogGroupScheduling( const KComponentData &inst, QWidget *parent ) : KPIM::KPrefsModule( KOPrefs::instance(), inst, parent ) { QBoxLayout *topTopLayout = new QVBoxLayout( this ); QWidget *topFrame = new QWidget( this ); topTopLayout->addWidget( topFrame ); QGridLayout *topLayout = new QGridLayout( topFrame ); topLayout->setSpacing( KDialog::spacingHint() ); KPIM::KPrefsWidBool *useGroupwareBool = addWidBool( CalendarSupport::KCalPrefs::instance()->useGroupwareCommunicationItem(), topFrame ); topLayout->addWidget( useGroupwareBool->checkBox(), 0, 0, 1, 2 ); + KPIM::KPrefsWidCombo *defaultSendPolicy = + addWidCombo( CalendarSupport::KCalPrefs::instance()->sendPolicyItem(), topFrame ); + topLayout->addWidget( defaultSendPolicy->label(), 1, 0, 1, 2 ); + topLayout->addWidget( defaultSendPolicy->comboBox(), 2, 0, 1, 2 ); + KPIM::KPrefsWidBool *bcc = addWidBool( Akonadi::CalendarSettings::self()->bccItem(), topFrame ); - topLayout->addWidget( bcc->checkBox(), 1, 0, 1, 2 ); + topLayout->addWidget( bcc->checkBox(), 3, 0, 1, 2 ); QLabel *aTransportLabel = new QLabel( i18nc( "@label", "Mail transport:" ), topFrame ); - topLayout->addWidget( aTransportLabel, 2, 0, 1, 2 ); + topLayout->addWidget( aTransportLabel, 4, 0, 1, 2 ); MailTransport::TransportManagementWidget *tmw = new MailTransport::TransportManagementWidget( topFrame ); tmw->layout()->setContentsMargins( 0, 0, 0, 0 ); - topLayout->addWidget( tmw, 3, 0, 1, 2 ); + topLayout->addWidget( tmw, 5, 0, 1, 2 ); //topLayout->setRowStretch( 2, 1 ); load(); } void KOPrefsDialogGroupScheduling::usrReadConfig() { } void KOPrefsDialogGroupScheduling::usrWriteConfig() { } extern "C" { KDE_EXPORT KCModule *create_korganizerconfiggroupscheduling( QWidget *parent, const char * ) { return new KOPrefsDialogGroupScheduling( KOGlobals::self()->componentData(), parent ); } } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// KOPrefsDialogGroupwareScheduling::KOPrefsDialogGroupwareScheduling( const KComponentData &inst, QWidget *parent ) : KPrefsModule( CalendarSupport::KCalPrefs::instance(), inst, parent ) { mGroupwarePage = new Ui::KOGroupwarePrefsPage(); QWidget *widget = new QWidget( this ); widget->setObjectName( QLatin1String("KOGrouparePrefsPage") ); mGroupwarePage->setupUi( widget ); mGroupwarePage->groupwareTab->setTabIcon( 0, KIcon( QLatin1String("go-up") ) ); mGroupwarePage->groupwareTab->setTabIcon( 1, KIcon( QLatin1String("go-down") ) ); // signals and slots connections connect( mGroupwarePage->publishDays, SIGNAL(valueChanged(int)), SLOT(slotWidChanged()) ); connect( mGroupwarePage->publishUrl, SIGNAL(textChanged(QString)), SLOT(slotWidChanged()) ); connect( mGroupwarePage->publishUser, SIGNAL(textChanged(QString)), SLOT(slotWidChanged()) ); connect( mGroupwarePage->publishPassword, SIGNAL(textChanged(QString)), SLOT(slotWidChanged()) ); connect( mGroupwarePage->publishSavePassword, SIGNAL(toggled(bool)), SLOT(slotWidChanged()) ); connect( mGroupwarePage->retrieveEnable, SIGNAL(toggled(bool)), SLOT(slotWidChanged()) ); connect( mGroupwarePage->retrieveUser, SIGNAL(textChanged(QString)), SLOT(slotWidChanged()) ); connect( mGroupwarePage->retrievePassword, SIGNAL(textChanged(QString)), SLOT(slotWidChanged()) ); connect( mGroupwarePage->retrieveSavePassword, SIGNAL(toggled(bool)), SLOT(slotWidChanged()) ); connect( mGroupwarePage->retrieveUrl, SIGNAL(textChanged(QString)), SLOT(slotWidChanged())); connect( mGroupwarePage->publishDelay, SIGNAL(valueChanged(int)), SLOT(slotWidChanged()) ); connect( mGroupwarePage->fullDomainRetrieval, SIGNAL(toggled(bool)), SLOT(slotWidChanged()) ); connect( mGroupwarePage->publishEnable, SIGNAL(toggled(bool)), SLOT(slotWidChanged()) ); ( new QVBoxLayout( this ) )->addWidget( widget ); load(); } KOPrefsDialogGroupwareScheduling::~KOPrefsDialogGroupwareScheduling() { delete mGroupwarePage; } void KOPrefsDialogGroupwareScheduling::usrReadConfig() { mGroupwarePage->publishEnable->setChecked( Akonadi::CalendarSettings::self()->freeBusyPublishAuto() ); mGroupwarePage->publishDelay->setValue( Akonadi::CalendarSettings::self()->freeBusyPublishDelay() ); mGroupwarePage->publishDays->setValue( Akonadi::CalendarSettings::self()->freeBusyPublishDays() ); mGroupwarePage->publishUrl->setText( Akonadi::CalendarSettings::self()->freeBusyPublishUrl() ); mGroupwarePage->publishUser->setText( Akonadi::CalendarSettings::self()->freeBusyPublishUser() ); mGroupwarePage->publishPassword->setText( Akonadi::CalendarSettings::self()->freeBusyPublishPassword() ); mGroupwarePage->publishSavePassword->setChecked( Akonadi::CalendarSettings::self()->freeBusyPublishSavePassword() ); mGroupwarePage->retrieveEnable->setChecked( Akonadi::CalendarSettings::self()->freeBusyRetrieveAuto() ); mGroupwarePage->fullDomainRetrieval->setChecked( Akonadi::CalendarSettings::self()->freeBusyFullDomainRetrieval() ); mGroupwarePage->retrieveUrl->setText( Akonadi::CalendarSettings::self()->freeBusyRetrieveUrl() ); mGroupwarePage->retrieveUser->setText( Akonadi::CalendarSettings::self()->freeBusyRetrieveUser() ); mGroupwarePage->retrievePassword->setText( Akonadi::CalendarSettings::self()->freeBusyRetrievePassword() ); mGroupwarePage->retrieveSavePassword->setChecked( Akonadi::CalendarSettings::self()->freeBusyRetrieveSavePassword() ); } void KOPrefsDialogGroupwareScheduling::usrWriteConfig() { Akonadi::CalendarSettings::self()->setFreeBusyPublishAuto( mGroupwarePage->publishEnable->isChecked()); Akonadi::CalendarSettings::self()->setFreeBusyPublishDelay(mGroupwarePage->publishDelay->value()); Akonadi::CalendarSettings::self()->setFreeBusyPublishDays( mGroupwarePage->publishDays->value()); Akonadi::CalendarSettings::self()->setFreeBusyPublishUrl( mGroupwarePage->publishUrl->text()); Akonadi::CalendarSettings::self()->setFreeBusyPublishUser( mGroupwarePage->publishUser->text()); Akonadi::CalendarSettings::self()->setFreeBusyPublishPassword( mGroupwarePage->publishPassword->text()); Akonadi::CalendarSettings::self()->setFreeBusyPublishSavePassword( mGroupwarePage->publishSavePassword->isChecked()); Akonadi::CalendarSettings::self()->setFreeBusyRetrieveAuto( mGroupwarePage->retrieveEnable->isChecked()); Akonadi::CalendarSettings::self()->setFreeBusyFullDomainRetrieval( mGroupwarePage->fullDomainRetrieval->isChecked()); Akonadi::CalendarSettings::self()->setFreeBusyRetrieveUrl( mGroupwarePage->retrieveUrl->text()); Akonadi::CalendarSettings::self()->setFreeBusyRetrieveUser( mGroupwarePage->retrieveUser->text()); Akonadi::CalendarSettings::self()->setFreeBusyRetrievePassword( mGroupwarePage->retrievePassword->text()); Akonadi::CalendarSettings::self()->setFreeBusyRetrieveSavePassword( mGroupwarePage->retrieveSavePassword->isChecked()); // clear the url cache for our user const QString configFile = KStandardDirs::locateLocal( "data", QLatin1String("korganizer/freebusyurls") ); KConfig cfg( configFile ); cfg.deleteGroup( CalendarSupport::KCalPrefs::instance()->email() ); Akonadi::CalendarSettings::self()->writeConfig(); } extern "C" { KDE_EXPORT KCModule *create_korganizerconfigfreebusy( QWidget *parent, const char * ) { return new KOPrefsDialogGroupwareScheduling( KOGlobals::self()->componentData(), parent ); } } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// class PluginItem : public QTreeWidgetItem { public: PluginItem( QTreeWidget *parent, KService::Ptr service ) : QTreeWidgetItem( parent, QStringList( service->name() ) ), mService( service ) {} PluginItem( QTreeWidgetItem *parent, KService::Ptr service ) : QTreeWidgetItem( parent, QStringList( service->name() ) ), mService( service ) {} KService::Ptr service() { return mService; } private: KService::Ptr mService; }; /** Dialog for selecting and configuring KOrganizer plugins */ KOPrefsDialogPlugins::KOPrefsDialogPlugins( const KComponentData &inst, QWidget *parent ) : KPrefsModule( KOPrefs::instance(), inst, parent ) { QBoxLayout *topTopLayout = new QVBoxLayout( this ); QWidget *topFrame = new QWidget( this ); topTopLayout->addWidget( topFrame ); QBoxLayout *topLayout = new QVBoxLayout( topFrame ); topLayout->setSpacing( KDialog::spacingHint() ); mTreeWidget = new QTreeWidget( topFrame ); mTreeWidget->setColumnCount( 1 ); mTreeWidget->setHeaderLabel( i18nc( "@title:column plugin name", "Name" ) ); topLayout->addWidget( mTreeWidget ); mDescription = new QLabel( topFrame ); mDescription->setAlignment( Qt::AlignVCenter ); mDescription->setWordWrap( true ); mDescription->setFrameShape( QLabel::Panel ); mDescription->setFrameShadow( QLabel::Sunken ); mDescription->setMinimumSize( QSize( 0, 55 ) ); QSizePolicy policy( QSizePolicy::MinimumExpanding, QSizePolicy::Fixed ); policy.setHorizontalStretch( 0 ); policy.setVerticalStretch( 0 ); policy.setHeightForWidth( mDescription->sizePolicy().hasHeightForWidth() ); mDescription->setSizePolicy( policy ); topLayout->addWidget( mDescription ); QWidget *buttonRow = new QWidget( topFrame ); QBoxLayout *buttonRowLayout = new QHBoxLayout( buttonRow ); mConfigureButton = new KPushButton( KGuiItem( i18nc( "@action:button", "Configure &Plugin..." ), QLatin1String("configure"), QString(), i18nc( "@info:whatsthis", "This button allows you to configure" " the plugin that you have selected in the list above" ) ), buttonRow ); buttonRowLayout->addWidget( mConfigureButton ); buttonRowLayout->addItem( new QSpacerItem( 1, 1, QSizePolicy::Expanding ) ); topLayout->addWidget( buttonRow ); mPositioningGroupBox = new QGroupBox( i18nc( "@title:group", "Position" ), topFrame ); //mPositionMonthTop = new QCheckBox( //i18nc( "@option:check", "Show in the month view" ), mPositioningGroupBox ); mPositionAgendaTop = new QRadioButton( i18nc( "@option:check", "Show at the top of the agenda views" ), mPositioningGroupBox ); mPositionAgendaBottom = new QRadioButton( i18nc( "@option:check", "Show at the bottom of the agenda views" ), mPositioningGroupBox ); QVBoxLayout *positioningLayout = new QVBoxLayout( mPositioningGroupBox ); //positioningLayout->addWidget( mPositionMonthTop ); positioningLayout->addWidget( mPositionAgendaTop ); positioningLayout->addWidget( mPositionAgendaBottom ); positioningLayout->addStretch( 1 ); topLayout->addWidget( mPositioningGroupBox ); connect( mConfigureButton, SIGNAL(clicked()), SLOT(configure()) ); //connect( mPositionMonthTop, SIGNAL(clicked()), SLOT(positioningChanged()) ); connect( mPositionAgendaTop, SIGNAL(clicked()), SLOT(positioningChanged()) ); connect( mPositionAgendaBottom, SIGNAL(clicked()), SLOT(positioningChanged()) ); connect( mTreeWidget, SIGNAL(itemSelectionChanged()), SLOT(selectionChanged()) ); connect( mTreeWidget, SIGNAL(itemChanged(QTreeWidgetItem*,int)), SLOT(selectionChanged()) ); connect( mTreeWidget, SIGNAL(itemClicked(QTreeWidgetItem*,int)), SLOT(slotWidChanged()) ); load(); selectionChanged(); } void KOPrefsDialogPlugins::usrReadConfig() { mTreeWidget->clear(); KService::List plugins = KOCore::self()->availablePlugins(); plugins += KOCore::self()->availableParts(); EventViews::PrefsPtr viewPrefs = KOPrefs::instance()->eventViewsPreferences(); QStringList selectedPlugins = viewPrefs->selectedPlugins(); QTreeWidgetItem *decorations = new QTreeWidgetItem( mTreeWidget, QStringList( i18nc( "@title:group", "Calendar Decorations" ) ) ); QTreeWidgetItem *others = new QTreeWidgetItem( mTreeWidget, QStringList( i18nc( "@title:group", "Other Plugins" ) ) ); KService::List::ConstIterator it; for ( it = plugins.constBegin(); it != plugins.constEnd(); ++it ) { QTreeWidgetItem *item = 0; if ( (*it)->hasServiceType( EventViews::CalendarDecoration::Decoration::serviceType() ) ) { item = new PluginItem( decorations, *it ); } else if ( !(*it)->hasServiceType( QLatin1String( "KOrganizer/PrintPlugin" ) ) ) { // we specifically skip print plugins since we no longer support them item = new PluginItem( others, *it ); } else { continue; } if ( selectedPlugins.contains( (*it)->desktopEntryName() ) ) { item->setCheckState( 0, Qt::Checked ); } else { item->setCheckState( 0, Qt::Unchecked ); } } decorations->setExpanded( true ); others->setExpanded( true ); mDecorationsAtMonthViewTop = KOPrefs::instance()->decorationsAtMonthViewTop().toSet(); mDecorationsAtAgendaViewTop = viewPrefs->decorationsAtAgendaViewTop().toSet(); mDecorationsAtAgendaViewBottom = viewPrefs->decorationsAtAgendaViewBottom().toSet(); } void KOPrefsDialogPlugins::usrWriteConfig() { QStringList selectedPlugins; for ( int i = 0; i < mTreeWidget->topLevelItemCount(); ++i) { QTreeWidgetItem *serviceTypeGroup = mTreeWidget->topLevelItem( i ); for ( int j = 0; j < serviceTypeGroup->childCount(); j++) { PluginItem *item = static_cast( serviceTypeGroup->child( j ) ); if( item->checkState( 0 ) == Qt::Checked ) { selectedPlugins.append( item->service()->desktopEntryName() ); } } } EventViews::PrefsPtr viewPrefs = KOPrefs::instance()->eventViewsPreferences(); viewPrefs->setSelectedPlugins( selectedPlugins ); KOPrefs::instance()->setDecorationsAtMonthViewTop( mDecorationsAtMonthViewTop.toList() ); viewPrefs->setDecorationsAtAgendaViewTop( mDecorationsAtAgendaViewTop.toList() ); viewPrefs->setDecorationsAtAgendaViewBottom( mDecorationsAtAgendaViewBottom.toList() ); } void KOPrefsDialogPlugins::configure() { if ( mTreeWidget->selectedItems().count() != 1 ) { return; } PluginItem *item = static_cast( mTreeWidget->selectedItems().last() ); if ( !item ) { return; } CalendarSupport::Plugin *plugin = KOCore::self()->loadPlugin( item->service() ); if ( plugin ) { plugin->configure( this ); delete plugin; slotWidChanged(); } else { KMessageBox::sorry( this, i18nc( "@info", "Unable to configure this plugin" ), QLatin1String("PluginConfigUnable") ); } } void KOPrefsDialogPlugins::positioningChanged() { if ( mTreeWidget->selectedItems().count() != 1 ) { return; } PluginItem *item = dynamic_cast( mTreeWidget->selectedItems().last() ); if ( !item ) { return; } QString decoration = item->service()->desktopEntryName(); /*if ( mPositionMonthTop->checkState() == Qt::Checked ) { if ( !mDecorationsAtMonthViewTop.contains( decoration ) ) { mDecorationsAtMonthViewTop.insert( decoration ); } } else { mDecorationsAtMonthViewTop.remove( decoration ); }*/ if ( mPositionAgendaTop->isChecked() ) { if ( !mDecorationsAtAgendaViewTop.contains( decoration ) ) { mDecorationsAtAgendaViewTop.insert( decoration ); } } else { mDecorationsAtAgendaViewTop.remove( decoration ); } if ( mPositionAgendaBottom->isChecked() ) { if ( !mDecorationsAtAgendaViewBottom.contains( decoration ) ) { mDecorationsAtAgendaViewBottom.insert( decoration ); } } else { mDecorationsAtAgendaViewBottom.remove( decoration ); } slotWidChanged(); } void KOPrefsDialogPlugins::selectionChanged() { mPositioningGroupBox->hide(); //mPositionMonthTop->setChecked( false ); mPositionAgendaTop->setChecked( false ); mPositionAgendaBottom->setChecked( false ); if ( mTreeWidget->selectedItems().count() != 1 ) { mConfigureButton->setEnabled( false ); mDescription->setText( QString() ); return; } PluginItem *item = dynamic_cast( mTreeWidget->selectedItems().last() ); if ( !item ) { mConfigureButton->setEnabled( false ); mDescription->setText( QString() ); return; } QVariant variant = item->service()->property( QLatin1String("X-KDE-KOrganizer-HasSettings") ); bool hasSettings = true; if ( variant.isValid() ) { hasSettings = variant.toBool(); } mDescription->setText( item->service()->comment() ); if ( !hasSettings ) { mConfigureButton->hide(); } else { mConfigureButton->show(); mConfigureButton->setEnabled( item->checkState(0) == Qt::Checked ); } bool hasPosition = false; if ( item->service()->hasServiceType( EventViews::CalendarDecoration::Decoration::serviceType() ) ) { QString decoration = item->service()->desktopEntryName(); /*if ( mDecorationsAtMonthViewTop.contains( decoration ) ) { mPositionMonthTop->setChecked( true ); hasPosition = true; }*/ if ( mDecorationsAtAgendaViewTop.contains( decoration ) ) { mPositionAgendaTop->setChecked( true ); hasPosition = true; } if ( mDecorationsAtAgendaViewBottom.contains( decoration ) ) { mPositionAgendaBottom->setChecked( true ); hasPosition = true; } if ( !hasPosition ) { // no position has been selected, so default to Agenda Top mDecorationsAtAgendaViewTop << decoration; mPositionAgendaTop->setChecked( true ); } mPositioningGroupBox->setEnabled( item->checkState(0) == Qt::Checked ); mPositioningGroupBox->show(); } slotWidChanged(); } extern "C" { KDE_EXPORT KCModule *create_korganizerconfigplugins( QWidget *parent, const char * ) { return new KOPrefsDialogPlugins( KOGlobals::self()->componentData(), parent ); } } //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// extern "C" { KDE_EXPORT KCModule *create_korgdesignerfields( QWidget *parent, const char * ) { return new KOPrefsDesignerFields( KOGlobals::self()->componentData(), parent ); } } KOPrefsDesignerFields::KOPrefsDesignerFields( const KComponentData &inst, QWidget *parent ) : KCMDesignerFields( inst, parent ) { } QString KOPrefsDesignerFields::localUiDir() { const QString dir = KStandardDirs::locateLocal( "data", QLatin1String("korganizer/designer/event/") ); return dir; } QString KOPrefsDesignerFields::uiPath() { return QLatin1String("korganizer/designer/event/"); } void KOPrefsDesignerFields::writeActivePages( const QStringList &activePages ) { CalendarSupport::KCalPrefs::instance()->setActiveDesignerFields( activePages ); CalendarSupport::KCalPrefs::instance()->writeConfig(); } QStringList KOPrefsDesignerFields::readActivePages() { return CalendarSupport::KCalPrefs::instance()->activeDesignerFields(); } QString KOPrefsDesignerFields::applicationName() { return QLatin1String("KORGANIZER"); } diff --git a/libkdepim/prefs/kprefsdialog.cpp b/libkdepim/prefs/kprefsdialog.cpp index ba96a9eb0c..18aeb9ad21 100644 --- a/libkdepim/prefs/kprefsdialog.cpp +++ b/libkdepim/prefs/kprefsdialog.cpp @@ -1,938 +1,943 @@ /* This file is part of libkdepim. Copyright (c) 2001,2003 Cornelius Schumacher Copyright (C) 2003-2004 Reinhold Kainhofer Copyright (C) 2005,2008,2011 Allen Winter This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ //krazy:excludeall=tipsandthis #include "kprefsdialog.h" #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 using namespace KPIM; namespace KPrefsWidFactory { KPrefsWid *create( KConfigSkeletonItem *item, QWidget *parent ) { KConfigSkeleton::ItemBool *boolItem = dynamic_cast( item ); if ( boolItem ) { return new KPrefsWidBool( boolItem, parent ); } KConfigSkeleton::ItemString *stringItem = dynamic_cast( item ); if ( stringItem ) { return new KPrefsWidString( stringItem, parent ); } KConfigSkeleton::ItemEnum *enumItem = dynamic_cast( item ); if ( enumItem ) { QList choices = enumItem->choices(); if ( choices.isEmpty() ) { kError() << "Enum has no choices."; return 0; } else { KPrefsWidRadios *radios = new KPrefsWidRadios( enumItem, parent ); QList::ConstIterator it; int value = 0; QList::ConstIterator end(choices.constEnd()); for ( it = choices.constBegin(); it != end; ++it ) { radios->addRadio( value++, (*it).label ); } return radios; } } KConfigSkeleton::ItemInt *intItem = dynamic_cast( item ); if ( intItem ) { return new KPrefsWidInt( intItem, parent ); } return 0; } } // namespace KPrefsWidFactory QList KPrefsWid::widgets() const { return QList(); } KPrefsWidBool::KPrefsWidBool( KConfigSkeleton::ItemBool *item, QWidget *parent ) : mItem( item ) { mCheck = new QCheckBox( mItem->label(), parent ); connect( mCheck, SIGNAL(clicked()), SIGNAL(changed()) ); QString toolTip = mItem->toolTip(); if ( !toolTip.isEmpty() ) { mCheck->setToolTip( toolTip ); } QString whatsThis = mItem->whatsThis(); if ( !whatsThis.isEmpty() ) { mCheck->setWhatsThis( whatsThis ); } } void KPrefsWidBool::readConfig() { mCheck->setChecked( mItem->value() ); } void KPrefsWidBool::writeConfig() { mItem->setValue( mCheck->isChecked() ); } QCheckBox *KPrefsWidBool::checkBox() { return mCheck; } QList KPrefsWidBool::widgets() const { QList widgets; widgets.append( mCheck ); return widgets; } KPrefsWidInt::KPrefsWidInt( KConfigSkeleton::ItemInt *item, QWidget *parent ) : mItem( item ) { mLabel = new QLabel( mItem->label() + QLatin1Char( ':' ), parent ); mSpin = new QSpinBox( parent ); if ( !mItem->minValue().isNull() ) { mSpin->setMinimum( mItem->minValue().toInt() ); } if ( !mItem->maxValue().isNull() ) { mSpin->setMaximum( mItem->maxValue().toInt() ); } connect( mSpin, SIGNAL(valueChanged(int)), SIGNAL(changed()) ); mLabel->setBuddy( mSpin ); QString toolTip = mItem->toolTip(); if ( !toolTip.isEmpty() ) { mLabel->setToolTip( toolTip ); mSpin->setToolTip( toolTip ); } QString whatsThis = mItem->whatsThis(); if ( !whatsThis.isEmpty() ) { mLabel->setWhatsThis( whatsThis ); mSpin->setWhatsThis( whatsThis ); } } void KPrefsWidInt::readConfig() { mSpin->setValue( mItem->value() ); } void KPrefsWidInt::writeConfig() { mItem->setValue( mSpin->value() ); } QLabel *KPrefsWidInt::label() { return mLabel; } QSpinBox *KPrefsWidInt::spinBox() { return mSpin; } QList KPrefsWidInt::widgets() const { QList widgets; widgets.append( mLabel ); widgets.append( mSpin ); return widgets; } KPrefsWidColor::KPrefsWidColor( KConfigSkeleton::ItemColor *item, QWidget *parent ) : mItem( item ) { mButton = new KColorButton( parent ); connect( mButton, SIGNAL(changed(QColor)), SIGNAL(changed()) ); mLabel = new QLabel( mItem->label() + QLatin1Char( ':' ), parent ); mLabel->setBuddy( mButton ); QString toolTip = mItem->toolTip(); if ( !toolTip.isEmpty() ) { mButton->setToolTip( toolTip ); } QString whatsThis = mItem->whatsThis(); if ( !whatsThis.isEmpty() ) { mButton->setWhatsThis( whatsThis ); } } KPrefsWidColor::~KPrefsWidColor() { } void KPrefsWidColor::readConfig() { mButton->setColor( mItem->value() ); } void KPrefsWidColor::writeConfig() { mItem->setValue( mButton->color() ); } QLabel *KPrefsWidColor::label() { return mLabel; } KColorButton *KPrefsWidColor::button() { return mButton; } KPrefsWidFont::KPrefsWidFont( KConfigSkeleton::ItemFont *item, QWidget *parent, const QString &sampleText ) : mItem( item ) { mLabel = new QLabel( mItem->label() + QLatin1Char( ':' ), parent ); mPreview = new QLabel( sampleText, parent ); mPreview->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken ); mButton = new QPushButton( i18n( "Choose..." ), parent ); connect( mButton, SIGNAL(clicked()), SLOT(selectFont()) ); QString toolTip = mItem->toolTip(); if ( !toolTip.isEmpty() ) { mPreview->setToolTip( toolTip ); mButton->setToolTip( toolTip ); } QString whatsThis = mItem->whatsThis(); if ( !whatsThis.isEmpty() ) { mPreview->setWhatsThis( whatsThis ); mButton->setWhatsThis( whatsThis ); } } KPrefsWidFont::~KPrefsWidFont() { } void KPrefsWidFont::readConfig() { mPreview->setFont( mItem->value() ); } void KPrefsWidFont::writeConfig() { mItem->setValue( mPreview->font() ); } QLabel *KPrefsWidFont::label() { return mLabel; } QFrame *KPrefsWidFont::preview() { return mPreview; } QPushButton *KPrefsWidFont::button() { return mButton; } void KPrefsWidFont::selectFont() { #ifndef QT_NO_FONTDIALOG QFont myFont( mPreview->font() ); int result = KFontDialog::getFont( myFont ); if ( result == KFontDialog::Accepted ) { mPreview->setFont( myFont ); emit changed(); } #endif } KPrefsWidTime::KPrefsWidTime( KConfigSkeleton::ItemDateTime *item, QWidget *parent ) : mItem( item ) { mLabel = new QLabel( mItem->label() + QLatin1Char( ':' ), parent ); mTimeEdit = new KTimeComboBox( parent ); mLabel->setBuddy( mTimeEdit ); connect( mTimeEdit, SIGNAL(timeEdited(QTime)), SIGNAL(changed()) ); connect( mTimeEdit, SIGNAL(timeEntered(QTime)), SIGNAL(changed()) ); QString toolTip = mItem->toolTip(); if ( !toolTip.isEmpty() ) { mTimeEdit->setToolTip( toolTip ); } QString whatsThis = mItem->whatsThis(); if ( !whatsThis.isEmpty() ) { mTimeEdit->setWhatsThis( whatsThis ); } } void KPrefsWidTime::readConfig() { mTimeEdit->setTime( mItem->value().time() ); } void KPrefsWidTime::writeConfig() { // Don't overwrite the date value of the QDateTime, so we can use a // KPrefsWidTime and a KPrefsWidDate on the same config entry! QDateTime dt( mItem->value() ); dt.setTime( mTimeEdit->time() ); mItem->setValue( dt ); } QLabel *KPrefsWidTime::label() { return mLabel; } KTimeComboBox *KPrefsWidTime::timeEdit() { return mTimeEdit; } KPrefsWidDuration::KPrefsWidDuration( KConfigSkeleton::ItemDateTime *item, const QString &format, QWidget *parent ) : mItem( item ) { mLabel = new QLabel( mItem->label() + QLatin1Char( ':' ), parent ); mTimeEdit = new QTimeEdit( parent ); mLabel->setBuddy( mTimeEdit ); if ( format.isEmpty() ) { mTimeEdit->setDisplayFormat( QLatin1String( "hh:mm:ss" ) ); } else { mTimeEdit->setDisplayFormat( format ); } mTimeEdit->setMinimumTime( QTime( 0, 1 ) ); // [1 min] mTimeEdit->setMaximumTime( QTime( 24, 0 ) ); // [24 hr] connect( mTimeEdit, SIGNAL(timeChanged(QTime)), SIGNAL(changed()) ); QString toolTip = mItem->toolTip(); if ( !toolTip.isEmpty() ) { mTimeEdit->setToolTip( toolTip ); } QString whatsThis = mItem->whatsThis(); if ( !whatsThis.isEmpty() ) { mTimeEdit->setWhatsThis( whatsThis ); } } void KPrefsWidDuration::readConfig() { mTimeEdit->setTime( mItem->value().time() ); } void KPrefsWidDuration::writeConfig() { QDateTime dt( mItem->value() ); dt.setTime( mTimeEdit->time() ); mItem->setValue( dt ); } QLabel *KPrefsWidDuration::label() { return mLabel; } QTimeEdit *KPrefsWidDuration::timeEdit() { return mTimeEdit; } KPrefsWidDate::KPrefsWidDate( KConfigSkeleton::ItemDateTime *item, QWidget *parent ) : mItem( item ) { mLabel = new QLabel( mItem->label() + QLatin1Char( ':' ), parent ); mDateEdit = new KDateComboBox( parent ); mLabel->setBuddy( mDateEdit ); connect( mDateEdit, SIGNAL(dateEdited(QDate)), SIGNAL(changed()) ); QString toolTip = mItem->toolTip(); if ( !toolTip.isEmpty() ) { mDateEdit->setToolTip( toolTip ); } QString whatsThis = mItem->whatsThis(); if ( !whatsThis.isEmpty() ) { mDateEdit->setWhatsThis( whatsThis ); } } void KPrefsWidDate::readConfig() { if ( !mItem->value().date().isValid() ) { mItem->setValue( QDateTime::currentDateTime() ); } mDateEdit->setDate( mItem->value().date().isValid() ? mItem->value().date() : QDate::currentDate() ); } void KPrefsWidDate::writeConfig() { QDateTime dt( mItem->value() ); dt.setDate( mDateEdit->date() ); mItem->setValue( dt ); if ( !mItem->value().date().isValid() ) { mItem->setValue( QDateTime::currentDateTime() ); } } QLabel *KPrefsWidDate::label() { return mLabel; } KDateComboBox *KPrefsWidDate::dateEdit() { return mDateEdit; } KPrefsWidRadios::KPrefsWidRadios( KConfigSkeleton::ItemEnum *item, QWidget *parent ) : mItem( item ) { mBox = new QGroupBox( mItem->label(), parent ); new QVBoxLayout( mBox ); mGroup = new QButtonGroup( parent ); connect( mGroup, SIGNAL(buttonClicked(int)), SIGNAL(changed()) ); } KPrefsWidRadios::~KPrefsWidRadios() { } void KPrefsWidRadios::addRadio( int value, const QString &text, const QString &toolTip, const QString &whatsThis ) { QRadioButton *r = new QRadioButton( text, mBox ); mBox->layout()->addWidget( r ); mGroup->addButton( r, value ); if ( !toolTip.isEmpty() ) { r->setToolTip( toolTip ); } if ( !whatsThis.isEmpty() ) { r->setWhatsThis( whatsThis ); } } QGroupBox *KPrefsWidRadios::groupBox() const { return mBox; } void KPrefsWidRadios::readConfig() { if ( !mGroup->button( mItem->value() ) ) return; mGroup->button( mItem->value() )->setChecked( true ); } void KPrefsWidRadios::writeConfig() { mItem->setValue( mGroup->checkedId() ); } QList KPrefsWidRadios::widgets() const { QList w; w.append( mBox ); return w; } KPrefsWidCombo::KPrefsWidCombo( KConfigSkeleton::ItemEnum *item, QWidget *parent ) : mItem( item ) { KHBox *hbox = new KHBox( parent ); - new QLabel( mItem->label(), hbox ); + mLabel = new QLabel( mItem->label(), hbox ); mCombo = new KComboBox( hbox ); connect( mCombo, SIGNAL(activated(int)), SIGNAL(changed()) ); } KPrefsWidCombo::~KPrefsWidCombo() { } void KPrefsWidCombo::readConfig() { mCombo->setCurrentIndex( mItem->value() ); } void KPrefsWidCombo::writeConfig() { mItem->setValue( mCombo->currentIndex() ); } QList KPrefsWidCombo::widgets() const { QList w; w.append( mCombo ); return w; } KComboBox *KPrefsWidCombo::comboBox() { return mCombo; } +QLabel *KPrefsWidCombo::label() +{ + return mLabel; +} + KPrefsWidString::KPrefsWidString( KConfigSkeleton::ItemString *item, QWidget *parent, KLineEdit::EchoMode echomode ) : mItem( item ) { mLabel = new QLabel( mItem->label() + QLatin1Char( ':' ), parent ); mEdit = new KLineEdit( parent ); mLabel->setBuddy( mEdit ); connect( mEdit, SIGNAL(textChanged(QString)), SIGNAL(changed()) ); mEdit->setEchoMode( echomode ); QString toolTip = mItem->toolTip(); if ( !toolTip.isEmpty() ) { mEdit->setToolTip( toolTip ); } QString whatsThis = mItem->whatsThis(); if ( !whatsThis.isEmpty() ) { mEdit->setWhatsThis( whatsThis ); } } KPrefsWidString::~KPrefsWidString() { } void KPrefsWidString::readConfig() { mEdit->setText( mItem->value() ); } void KPrefsWidString::writeConfig() { mItem->setValue( mEdit->text() ); } QLabel *KPrefsWidString::label() { return mLabel; } KLineEdit *KPrefsWidString::lineEdit() { return mEdit; } QList KPrefsWidString::widgets() const { QList widgets; widgets.append( mLabel ); widgets.append( mEdit ); return widgets; } KPrefsWidPath::KPrefsWidPath( KConfigSkeleton::ItemPath *item, QWidget *parent, const QString &filter, KFile::Modes mode ) : mItem( item ) { mLabel = new QLabel( mItem->label() + QLatin1Char( ':' ), parent ); mURLRequester = new KUrlRequester( parent ); mLabel->setBuddy( mURLRequester ); mURLRequester->setMode( mode ); mURLRequester->setFilter( filter ); connect( mURLRequester, SIGNAL(textChanged(QString)), SIGNAL(changed()) ); QString toolTip = mItem->toolTip(); if ( !toolTip.isEmpty() ) { mURLRequester->setToolTip( toolTip ); } QString whatsThis = mItem->whatsThis(); if ( !whatsThis.isEmpty() ) { mURLRequester->setWhatsThis( whatsThis ); } } KPrefsWidPath::~KPrefsWidPath() { } void KPrefsWidPath::readConfig() { mURLRequester->setUrl( KUrl( mItem->value() ) ); } void KPrefsWidPath::writeConfig() { mItem->setValue( mURLRequester->url().path() ); } QLabel *KPrefsWidPath::label() { return mLabel; } KUrlRequester *KPrefsWidPath::urlRequester() { return mURLRequester; } QList KPrefsWidPath::widgets() const { QList widgets; widgets.append( mLabel ); widgets.append( mURLRequester ); return widgets; } KPrefsWidManager::KPrefsWidManager( KConfigSkeleton *prefs ) : mPrefs( prefs ) { } KPrefsWidManager::~KPrefsWidManager() { qDeleteAll( mPrefsWids ); mPrefsWids.clear(); } void KPrefsWidManager::addWid( KPrefsWid *wid ) { mPrefsWids.append( wid ); } KPrefsWidBool *KPrefsWidManager::addWidBool( KConfigSkeleton::ItemBool *item, QWidget *parent ) { KPrefsWidBool *w = new KPrefsWidBool( item, parent ); addWid( w ); return w; } KPrefsWidTime *KPrefsWidManager::addWidTime( KConfigSkeleton::ItemDateTime *item, QWidget *parent ) { KPrefsWidTime *w = new KPrefsWidTime( item, parent ); addWid( w ); return w; } KPrefsWidDuration *KPrefsWidManager::addWidDuration( KConfigSkeleton::ItemDateTime *item, const QString &format, QWidget *parent ) { KPrefsWidDuration *w = new KPrefsWidDuration( item, format, parent ); addWid( w ); return w; } KPrefsWidDate *KPrefsWidManager::addWidDate( KConfigSkeleton::ItemDateTime *item, QWidget *parent ) { KPrefsWidDate *w = new KPrefsWidDate( item, parent ); addWid( w ); return w; } KPrefsWidColor *KPrefsWidManager::addWidColor( KConfigSkeleton::ItemColor *item, QWidget *parent ) { KPrefsWidColor *w = new KPrefsWidColor( item, parent ); addWid( w ); return w; } KPrefsWidRadios *KPrefsWidManager::addWidRadios( KConfigSkeleton::ItemEnum *item, QWidget *parent ) { KPrefsWidRadios *w = new KPrefsWidRadios( item, parent ); QList choices; choices = item->choices2(); QList::ConstIterator it; int value = 0; for ( it = choices.constBegin(); it != choices.constEnd(); ++it ) { w->addRadio( value++, (*it).label, (*it).toolTip, (*it).whatsThis ); } addWid( w ); return w; } KPrefsWidCombo *KPrefsWidManager::addWidCombo( KConfigSkeleton::ItemEnum *item, QWidget *parent ) { KPrefsWidCombo *w = new KPrefsWidCombo( item, parent ); QList choices; choices = item->choices(); QList::ConstIterator it; for ( it = choices.constBegin(); it != choices.constEnd(); ++it ) { w->comboBox()->addItem( (*it).label ); } addWid( w ); return w; } KPrefsWidString *KPrefsWidManager::addWidString( KConfigSkeleton::ItemString *item, QWidget *parent ) { KPrefsWidString *w = new KPrefsWidString( item, parent, KLineEdit::Normal ); addWid( w ); return w; } KPrefsWidPath *KPrefsWidManager::addWidPath( KConfigSkeleton::ItemPath *item, QWidget *parent, const QString &filter, KFile::Modes mode ) { KPrefsWidPath *w = new KPrefsWidPath( item, parent, filter, mode ); addWid( w ); return w; } KPrefsWidString *KPrefsWidManager::addWidPassword( KConfigSkeleton::ItemString *item, QWidget *parent ) { KPrefsWidString *w = new KPrefsWidString( item, parent, KLineEdit::Password ); addWid( w ); return w; } KPrefsWidFont *KPrefsWidManager::addWidFont( KConfigSkeleton::ItemFont *item, QWidget *parent, const QString &sampleText ) { KPrefsWidFont *w = new KPrefsWidFont( item, parent, sampleText ); addWid( w ); return w; } KPrefsWidInt *KPrefsWidManager::addWidInt( KConfigSkeleton::ItemInt *item, QWidget *parent ) { KPrefsWidInt *w = new KPrefsWidInt( item, parent ); addWid( w ); return w; } void KPrefsWidManager::setWidDefaults() { bool tmp = mPrefs->useDefaults( true ); readWidConfig(); mPrefs->useDefaults( tmp ); } void KPrefsWidManager::readWidConfig() { QList::Iterator it; for ( it = mPrefsWids.begin(); it != mPrefsWids.end(); ++it ) { (*it)->readConfig(); } } void KPrefsWidManager::writeWidConfig() { QList::Iterator it; for ( it = mPrefsWids.begin(); it != mPrefsWids.end(); ++it ) { (*it)->writeConfig(); } mPrefs->writeConfig(); } KPrefsDialog::KPrefsDialog( KConfigSkeleton *prefs, QWidget *parent, bool modal ) : KPageDialog( parent ), KPrefsWidManager( prefs ) { setFaceType( List ); setCaption( i18n( "Preferences" ) ); setButtons( Ok|Apply|Cancel|Default ); setDefaultButton( Ok ); setModal( modal ); showButtonSeparator( true ); connect( this, SIGNAL(okClicked()), SLOT(slotOk()) ); connect( this, SIGNAL(applyClicked()), SLOT(slotApply()) ); connect( this, SIGNAL(defaultClicked()), SLOT(slotDefault()) ); connect( this, SIGNAL(cancelClicked()), SLOT(reject()) ); } KPrefsDialog::~KPrefsDialog() { } void KPrefsDialog::autoCreate() { KConfigSkeletonItem::List items = prefs()->items(); QMap mGroupPages; QMap mGroupLayouts; QMap mCurrentRows; KConfigSkeletonItem::List::ConstIterator it; for ( it = items.constBegin(); it != items.constEnd(); ++it ) { QString group = (*it)->group(); //QString name = (*it)->name(); QWidget *page; QGridLayout *layout; int currentRow; if ( !mGroupPages.contains( group ) ) { page = new QWidget( this ); addPage( page, group ); layout = new QGridLayout( page ); mGroupPages.insert( group, page ); mGroupLayouts.insert( group, layout ); currentRow = 0; mCurrentRows.insert( group, currentRow ); } else { page = mGroupPages[ group ]; layout = mGroupLayouts[ group ]; currentRow = mCurrentRows[ group ]; } KPrefsWid *wid = KPrefsWidFactory::create( *it, page ); if ( wid ) { QList widgets = wid->widgets(); if ( widgets.count() == 1 ) { layout->addWidget( widgets[ 0 ], currentRow, currentRow, 0, 1 ); } else if ( widgets.count() == 2 ) { layout->addWidget( widgets[ 0 ], currentRow, 0 ); layout->addWidget( widgets[ 1 ], currentRow, 1 ); } else { kError() <<"More widgets than expected:" << widgets.count(); } if ( (*it)->isImmutable() ) { QList::Iterator it2; for ( it2 = widgets.begin(); it2 != widgets.end(); ++it2 ) { (*it2)->setEnabled( false ); } } addWid( wid ); mCurrentRows.insert( group, ++currentRow ); } } readConfig(); } void KPrefsDialog::setDefaults() { setWidDefaults(); } void KPrefsDialog::readConfig() { readWidConfig(); usrReadConfig(); } void KPrefsDialog::writeConfig() { writeWidConfig(); usrWriteConfig(); readConfig(); } void KPrefsDialog::slotApply() { writeConfig(); emit configChanged(); } void KPrefsDialog::slotOk() { slotApply(); accept(); } void KPrefsDialog::slotDefault() { if ( KMessageBox::warningContinueCancel( this, i18n( "You are about to set all preferences to default values. " "All custom modifications will be lost." ), i18n( "Setting Default Preferences" ), KGuiItem( i18n( "Reset to Defaults" ) ) ) == KMessageBox::Continue ) { setDefaults(); } } KPrefsModule::KPrefsModule( KConfigSkeleton *prefs, const KComponentData &instance, QWidget *parent, const QVariantList &args ) : KCModule( instance, parent, args ), KPrefsWidManager( prefs ) { emit changed( false ); } void KPrefsModule::addWid( KPrefsWid *wid ) { KPrefsWidManager::addWid( wid ); connect( wid, SIGNAL(changed()), SLOT(slotWidChanged()) ); } void KPrefsModule::slotWidChanged() { emit changed( true ); } void KPrefsModule::load() { readWidConfig(); usrReadConfig(); emit changed( false ); } void KPrefsModule::save() { writeWidConfig(); usrWriteConfig(); } void KPrefsModule::defaults() { setWidDefaults(); emit changed( true ); } diff --git a/libkdepim/prefs/kprefsdialog.h b/libkdepim/prefs/kprefsdialog.h index ef1bef4643..7322019024 100644 --- a/libkdepim/prefs/kprefsdialog.h +++ b/libkdepim/prefs/kprefsdialog.h @@ -1,817 +1,824 @@ /* This file is part of libkdepim. Copyright (c) 2001-2003 Cornelius Schumacher Copyright (C) 2003-2004 Reinhold Kainhofer Copyright (C) 2005,2008,2011 Allen Winter This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef KDEPIM_KPREFSDIALOG_H #define KDEPIM_KPREFSDIALOG_H #include "kdepim_export.h" #define KDE3_SUPPORT #include #undef KDE3_SUPPORT #include #include #include #include #include class KColorButton; class KComboBox; class KComponentData; class KDateComboBox; class KTimeComboBox; class KUrlRequester; class QCheckBox; class QLabel; class QSpinBox; class QTimeEdit; class QButtonGroup; class QGroupBox; namespace KPIM { /** @short Base class for GUI control elements used by @ref KPrefsDialog. @author Cornelius Schumacher @see KPrefsDialog This class provides the interface for the GUI control elements used by KPrefsDialog. The control element consists of a set of widgets for handling a certain type of configuration information. */ class KDEPIM_EXPORT KPrefsWid : public QObject { Q_OBJECT public: /** This function is called to read value of the setting from the stored configuration and display it in the widget. */ virtual void readConfig() = 0; /** This function is called to write the current setting of the widget to the stored configuration. */ virtual void writeConfig() = 0; /** Return a list of widgets used by this control element. */ virtual QList widgets() const; Q_SIGNALS: /** Emitted when widget value has changed. */ void changed(); }; /** @short Widgets for bool settings in @ref KPrefsDialog. This class provides a control element for configuring bool values. It is meant to be used by KPrefsDialog. The user is responsible for the layout management. */ class KDEPIM_EXPORT KPrefsWidBool : public KPrefsWid { public: /** Create a bool value control element consisting of a QCheckbox. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. */ explicit KPrefsWidBool( KConfigSkeleton::ItemBool *item, QWidget *parent = 0 ); /** Return the QCheckbox used by this control element. */ QCheckBox *checkBox(); void readConfig(); void writeConfig(); QList widgets() const; private: KConfigSkeleton::ItemBool *mItem; QCheckBox *mCheck; }; /** @short Widgets for int settings in @ref KPrefsDialog. This class provides a control element for configuring integer values. It is meant to be used by KPrefsDialog. The user is responsible for the layout management. */ class KDEPIM_EXPORT KPrefsWidInt : public KPrefsWid { public: /** Create a integer value control element consisting of a label and a spinbox. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. */ explicit KPrefsWidInt( KConfigSkeleton::ItemInt *item, QWidget *parent = 0 ); /** Return QLabel used by this control element. */ QLabel *label(); /** Return the QSpinBox used by this control element. */ QSpinBox *spinBox(); void readConfig(); void writeConfig(); QList widgets() const; private: KConfigSkeleton::ItemInt *mItem; QLabel *mLabel; QSpinBox *mSpin; }; /** @short Widgets for time settings in @ref KPrefsDialog. This class provides a control element for configuring time values. It is meant to be used by KPrefsDialog. The user is responsible for the layout management. */ class KDEPIM_EXPORT KPrefsWidTime : public KPrefsWid { public: /** Create a time value control element consisting of a label and a spinbox. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. */ explicit KPrefsWidTime( KConfigSkeleton::ItemDateTime *item, QWidget *parent = 0 ); /** Return QLabel used by this widget. */ QLabel *label(); /** Return KTimeComboBox used by this widget. */ KTimeComboBox *timeEdit(); void readConfig(); void writeConfig(); private: KConfigSkeleton::ItemDateTime *mItem; QLabel *mLabel; KTimeComboBox *mTimeEdit; }; /** @short Widgets for duration settings in @ref KPrefsDialog. This class provides a control element for configuring duration values. It is meant to be used by KPrefsDialog. The user is responsible for the layout management. */ class KDEPIM_EXPORT KPrefsWidDuration : public KPrefsWid { public: /** Create a duration value control element consisting of a label and a spinbox. @param item The KConfigSkeletonItem representing the preferences entry. @param format display format. default is "hh:mm:ss" @param parent Parent widget. */ explicit KPrefsWidDuration( KConfigSkeleton::ItemDateTime *item, const QString &format, QWidget *parent = 0 ); /** Return QLabel used by this widget. */ QLabel *label(); /** Return QSpinBox used by this widget. */ QTimeEdit *timeEdit(); void readConfig(); void writeConfig(); private: KConfigSkeleton::ItemDateTime *mItem; QLabel *mLabel; QTimeEdit *mTimeEdit; }; /** @short Widgets for time settings in @ref KPrefsDialog. This class provides a control element for configuring date values. It is meant to be used by KPrefsDialog. The user is responsible for the layout management. */ class KDEPIM_EXPORT KPrefsWidDate : public KPrefsWid { public: /** Create a time value control element consisting of a label and a date box. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. */ explicit KPrefsWidDate( KConfigSkeleton::ItemDateTime *item, QWidget *parent = 0 ); /** Return QLabel used by this widget. */ QLabel *label(); /** Return KDateComboBox used by this widget. */ KDateComboBox *dateEdit(); void readConfig(); void writeConfig(); private: KConfigSkeleton::ItemDateTime *mItem; QLabel *mLabel; KDateComboBox *mDateEdit; }; /** @short Widgets for color settings in @ref KPrefsDialog. This class provides a control element for configuring color values. It is meant to be used by KPrefsDialog. The user is responsible for the layout management. */ class KDEPIM_EXPORT KPrefsWidColor : public KPrefsWid { Q_OBJECT public: /** Create a color value control element consisting of a test field and a button for opening a color dialog. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. */ explicit KPrefsWidColor( KConfigSkeleton::ItemColor *item, QWidget *parent = 0 ); /** Destruct color setting widget. */ ~KPrefsWidColor(); /** Return QLabel for the button */ QLabel *label(); /** Return button opening the color dialog. */ KColorButton *button(); void readConfig(); void writeConfig(); private: KConfigSkeleton::ItemColor *mItem; QLabel *mLabel; KColorButton *mButton; }; /** @short Widgets for font settings in @ref KPrefsDialog. This class provides a control element for configuring font values. It is meant to be used by KPrefsDialog. The user is responsible for the layout management. */ class KDEPIM_EXPORT KPrefsWidFont : public KPrefsWid { Q_OBJECT public: /** Create a font value control element consisting of a test field and a button for opening a font dialog. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. @param sampleText Sample text for previewing the selected font. */ explicit KPrefsWidFont( KConfigSkeleton::ItemFont *item, QWidget *parent = 0, const QString &sampleText = QString() ); /** Destruct font setting widget. */ ~KPrefsWidFont(); /** Return QLabel. */ QLabel *label(); /** Return QFrame used as preview field. */ QFrame *preview(); /** Return button opening the font dialog. */ QPushButton *button(); void readConfig(); void writeConfig(); protected Q_SLOTS: void selectFont(); private: KConfigSkeleton::ItemFont *mItem; QLabel *mLabel; QLabel *mPreview; QPushButton *mButton; }; /** @short Widgets for settings represented by a group of radio buttons in @ref KPrefsDialog. This class provides a control element for configuring selections. It is meant to be used by KPrefsDialog. The user is responsible for the layout management. The setting is interpreted as an int value, corresponding to the position of the radio button. The position of the button is defined by the sequence of @ref addRadio() calls, starting with 0. */ class KDEPIM_EXPORT KPrefsWidRadios : public KPrefsWid { public: /** Create a control element for selection of an option. It consists of a box with several radio buttons. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. */ explicit KPrefsWidRadios( KConfigSkeleton::ItemEnum *item, QWidget *parent = 0 ); virtual ~KPrefsWidRadios(); /** Add a radio button. @param value The enum value represented by this radio button. @param text Text of the button. @param toolTip ToolTip help for the button. @param whatsThis What's This help for the button. */ void addRadio( int value, const QString &text, const QString &toolTip = QString(), const QString &whatsThis = QString() ); /** Return the box widget used by this widget. */ QGroupBox *groupBox() const; void readConfig(); void writeConfig(); QList widgets() const; private: KConfigSkeleton::ItemEnum *mItem; QGroupBox *mBox; QButtonGroup *mGroup; }; /** @short Widgets for settings represented by a combo box in @ref KPrefsDialog. This class provides a control element for configuring selections. It is meant to be used by KPrefsDialog. The user is responsible for the layout management. The setting is interpreted as an int value, corresponding to the index in the combo box. */ class KDE_EXPORT KPrefsWidCombo : public KPrefsWid { public: /** Create a control element for selection of an option. It consists of a combo box. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. */ explicit KPrefsWidCombo( KConfigSkeleton::ItemEnum *item, QWidget *parent ); virtual ~KPrefsWidCombo(); void readConfig(); void writeConfig(); KComboBox *comboBox(); + + /** + Return QLabel used by this control element. + */ + QLabel *label(); + QList widgets() const; private: KConfigSkeleton::ItemEnum *mItem; KComboBox *mCombo; + QLabel *mLabel; }; /** @short Widgets for string settings in @ref KPrefsDialog. This class provides a control element for configuring string values. It is meant to be used by KPrefsDialog. The user is responsible for the layout management. */ class KDEPIM_EXPORT KPrefsWidString : public KPrefsWid { public: /** Create a string value control element consisting of a test label and a line edit. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. @param echomode Describes how a line edit should display its contents. */ explicit KPrefsWidString( KConfigSkeleton::ItemString *item, QWidget *parent = 0, KLineEdit::EchoMode echomode=KLineEdit::Normal ); /** Destructor. */ virtual ~KPrefsWidString(); /** Return QLabel used by this widget. */ QLabel *label(); /** Return KLineEdit used by this widget. */ KLineEdit *lineEdit(); void readConfig(); void writeConfig(); QList widgets() const; private: KConfigSkeleton::ItemString *mItem; QLabel *mLabel; KLineEdit *mEdit; }; /** @short Widgets for string settings in @ref KPrefsDialog. This class provides a control element for configuring string values. It is meant to be used by KPrefsDialog. The user is responsible for the layout management. */ class KDEPIM_EXPORT KPrefsWidPath : public KPrefsWid { public: /** Create a string value control element consisting of a test label and a line edit. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. @param filter URLRequester filter @param mode Describes how a line edit should display its contents. */ explicit KPrefsWidPath( KConfigSkeleton::ItemPath *item, QWidget *parent = 0, const QString &filter = QString(), KFile::Modes = KFile::File ); /** Destructor. */ virtual ~KPrefsWidPath(); /** Return QLabel used by this widget. */ QLabel *label(); /** Return KUrlRequester used by this widget. */ KUrlRequester *urlRequester(); void readConfig(); void writeConfig(); QList widgets() const; private: KConfigSkeleton::ItemPath *mItem; QLabel *mLabel; KUrlRequester *mURLRequester; }; /** @short Class for managing KPrefsWid objects. This class manages standard configuration widgets provided bz the KPrefsWid subclasses. It handles creation, loading, saving and default values in a transparent way. The user has to add the widgets by the corresponding addWid functions and KPrefsWidManager handles the rest automatically. */ class KDEPIM_EXPORT KPrefsWidManager { public: /** Create a KPrefsWidManager object for a KPrefs object. @param prefs KPrefs object used to access te configuration. */ explicit KPrefsWidManager( KConfigSkeleton *prefs ); /** Destructor. */ virtual ~KPrefsWidManager(); KConfigSkeleton *prefs() const { return mPrefs; } /** Register a custom KPrefsWid object. */ virtual void addWid( KPrefsWid * ); /** Register a @ref KPrefsWidBool object. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. */ KPrefsWidBool *addWidBool( KConfigSkeleton::ItemBool *item, QWidget *parent = 0 ); /** Register a @ref KPrefsWidInt object. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. */ KPrefsWidInt *addWidInt( KConfigSkeleton::ItemInt *item, QWidget *parent = 0 ); /** Register a @ref KPrefsWidDate object. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. */ KPrefsWidDate *addWidDate( KConfigSkeleton::ItemDateTime *item, QWidget *parent = 0 ); /** Register a @ref KPrefsWidTime object. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. */ KPrefsWidTime *addWidTime( KConfigSkeleton::ItemDateTime *item, QWidget *parent = 0 ); /** Register a @ref KPrefsWidDuration object. @param item The KConfigSkeletonItem representing the preferences entry. @param format display format. default is "hh:mm:ss" @param parent Parent widget. */ KPrefsWidDuration *addWidDuration( KConfigSkeleton::ItemDateTime *item, const QString &format, QWidget *parent = 0 ); /** Register a @ref KPrefsWidColor object. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. */ KPrefsWidColor *addWidColor( KConfigSkeleton::ItemColor *item, QWidget *parent = 0 ); /** Register a @ref KPrefsWidRadios object. The choices represented by the given item object are automatically added as radio buttons. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. */ KPrefsWidRadios *addWidRadios( KConfigSkeleton::ItemEnum *item, QWidget *parent = 0 ); /** Register a @ref KPrefsWidCombo object. The choices represented by the given item object are automatically added to the combo box. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. */ KPrefsWidCombo *addWidCombo( KConfigSkeleton::ItemEnum *item, QWidget *parent = 0 ); /** Register a @ref KPrefsWidString object. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. */ KPrefsWidString *addWidString( KConfigSkeleton::ItemString *item, QWidget *parent = 0 ); /** Register a path @ref KPrefsWidPath object. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. @param filter URLRequester filter @param mode URLRequester mode */ KPrefsWidPath *addWidPath ( KConfigSkeleton::ItemPath *item, QWidget *parent = 0, const QString &filter = QString(), KFile::Modes mode = KFile::File ); /** Register a password @ref KPrefsWidString object, with echomode set to KLineEdit::Password. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. */ KPrefsWidString *addWidPassword ( KConfigSkeleton::ItemString *item, QWidget *parent = 0 ); /** Register a @ref KPrefsWidFont object. @param item The KConfigSkeletonItem representing the preferences entry. @param parent Parent widget. @param sampleText Sample text for previewing the selected font. */ KPrefsWidFont *addWidFont( KConfigSkeleton::ItemFont *item, QWidget *parent = 0, const QString &sampleText = QString() ); /** Set all widgets to default values. */ void setWidDefaults(); /** Read preferences from config file. */ void readWidConfig(); /** Write preferences to config file. */ void writeWidConfig(); private: KConfigSkeleton *mPrefs; QList mPrefsWids; }; /** @short Base class for a preferences dialog. This class provides the framework for a preferences dialog. You have to subclass it and add the code to create the actual configuration widgets and do the layout management. KPrefsDialog provides functions to add subclasses of @ref KPrefsWid via KPrefsWidManager. For these widgets the reading, writing and setting to default values is handled automatically. Custom widgets have to be handled in the functions @ref usrReadConfig() and @ref usrWriteConfig(). */ class KDEPIM_EXPORT KPrefsDialog : public KPageDialog, public KPrefsWidManager { Q_OBJECT public: /** Create a KPrefsDialog for a KPrefs object. @param prefs KPrefs object used to access te configuration. @param parent Parent widget. @param name Widget name. @param modal true, if dialog has to be modal, false for non-modal. */ explicit KPrefsDialog( KConfigSkeleton *prefs, QWidget *parent = 0, bool modal = false ); /** Destructor. */ virtual ~KPrefsDialog(); void autoCreate(); public Q_SLOTS: /** Set all widgets to default values. */ void setDefaults(); /** Read preferences from config file. */ void readConfig(); /** Write preferences to config file. */ void writeConfig(); Q_SIGNALS: /** Emitted when the a changed configuration has been stored. */ void configChanged(); protected Q_SLOTS: /** Apply changes to preferences */ void slotApply(); /** Accept changes to preferences and close dialog */ void slotOk(); /** Set preferences to default values */ void slotDefault(); protected: /** Implement this to read custom configuration widgets. */ virtual void usrReadConfig() {} /** Implement this to write custom configuration widgets. */ virtual void usrWriteConfig() {} }; class KDEPIM_EXPORT KPrefsModule : public KCModule, public KPrefsWidManager { Q_OBJECT public: KPrefsModule( KConfigSkeleton *, const KComponentData &instance, QWidget *parent=0, const QVariantList &args=QVariantList() ); virtual void addWid( KPrefsWid * ); void load(); void save(); void defaults(); protected Q_SLOTS: void slotWidChanged(); protected: /** Implement this to read custom configuration widgets. */ virtual void usrReadConfig() {} /** Implement this to write custom configuration widgets. */ virtual void usrWriteConfig() {} }; } #endif