korganizer Library API Documentation

koeditorrecurrence.cpp

00001 /*
00002     This file is part of KOrganizer.
00003     Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org>
00004 
00005     This program is free software; you can redistribute it and/or modify
00006     it under the terms of the GNU General Public License as published by
00007     the Free Software Foundation; either version 2 of the License, or
00008     (at your option) any later version.
00009 
00010     This program is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00013     GNU General Public License for more details.
00014 
00015     You should have received a copy of the GNU General Public License
00016     along with this program; if not, write to the Free Software
00017     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00018 
00019     As a special exception, permission is given to link this program
00020     with any edition of Qt, and distribute the resulting executable,
00021     without including the source code for Qt in the source distribution.
00022 */
00023 
00024 #include <qtooltip.h>
00025 #include <qfiledialog.h>
00026 #include <qlayout.h>
00027 #include <qvbox.h>
00028 #include <qbuttongroup.h>
00029 #include <qvgroupbox.h>
00030 #include <qwidgetstack.h>
00031 #include <qdatetime.h>
00032 #include <qlistbox.h>
00033 
00034 #include <kglobal.h>
00035 #include <klocale.h>
00036 #include <kiconloader.h>
00037 #include <kdebug.h>
00038 #include <knumvalidator.h>
00039 
00040 #include <libkcal/event.h>
00041 
00042 #include <libkdepim/kdateedit.h>
00043 
00044 #include "koprefs.h"
00045 
00046 #include "koeditorrecurrence.h"
00047 #include "koeditorrecurrence.moc"
00048 
00049 
00050 KOEditorRecurrence::KOEditorRecurrence(int spacing,QWidget* parent,
00051                                        const char* name) :
00052   QWidget( parent, name, 0 )
00053 {
00054   mSpacing = spacing;
00055 
00056   mEnabled = false;
00057 
00058   initMain();
00059   initExceptions();
00060 
00061   initLayout();
00062 }
00063 
00064 KOEditorRecurrence::~KOEditorRecurrence()
00065 {
00066 }
00067 
00068 void KOEditorRecurrence::initLayout()
00069 {
00070   QGridLayout *layoutTop = new QGridLayout(this,1,1);
00071   layoutTop->setSpacing(mSpacing);
00072 
00073   layoutTop->addMultiCellWidget(timeGroupBox,0,0,0,1);
00074   layoutTop->addMultiCellWidget(ruleGroupBox,1,1,0,1);
00075   layoutTop->addWidget(rangeGroupBox,2,0);
00076   layoutTop->addWidget(exceptionGroupBox,2,1);
00077   layoutTop->setColStretch(1,1);
00078 }
00079 
00080 void KOEditorRecurrence::initMain()
00081 {
00082   // Create the appointement time group box, which is
00083   timeGroupBox = new QGroupBox( 1,QGroupBox::Horizontal,
00084                                 i18n("Appointment Time "),this, "User_2" );
00085 
00086   QFrame *timeFrame = new QFrame(timeGroupBox,"timeFrame");
00087   QBoxLayout *layoutTimeFrame = new QHBoxLayout(timeFrame);
00088   layoutTimeFrame->setSpacing(mSpacing);
00089 
00090   dateTimeLabel = new QLabel(timeFrame);
00091   layoutTimeFrame->addWidget(dateTimeLabel);
00092 
00093   // Create the recursion rule Group box. This will also hold the
00094   // daily, weekly, monthly and yearly recursion rule frames which
00095   // specify options individual to each of these distinct sections of
00096   // the recursion rule. Note that each frame will be made visible by
00097   // the selection of a radio button.
00098   ruleGroupBox = new QGroupBox( 1,QGroupBox::Horizontal,
00099                                 i18n("Recurrence Rule"),this,
00100                                  "ruleGroupBox" );
00101 
00102   ruleFrame = new QFrame(ruleGroupBox,"ruleFrame");
00103   QBoxLayout *layoutRuleFrame = new QVBoxLayout(ruleFrame);
00104 
00105   ruleButtonGroup = new QButtonGroup(1,Horizontal,ruleFrame);
00106   ruleButtonGroup->setFrameStyle(QFrame::NoFrame);
00107   dailyButton     = new QRadioButton(i18n("Daily"), ruleButtonGroup);
00108   weeklyButton    = new QRadioButton(i18n("Weekly"), ruleButtonGroup);
00109   monthlyButton   = new QRadioButton(i18n("Monthly"), ruleButtonGroup);
00110   yearlyButton    = new QRadioButton(i18n("Yearly"), ruleButtonGroup);
00111 
00112   ruleSepFrame = new QFrame(ruleFrame);
00113   ruleSepFrame->setFrameStyle(QFrame::VLine|QFrame::Sunken);
00114 
00115   initDaily();
00116   initWeekly();
00117   initMonthly();
00118   initYearly();
00119 
00120   ruleStack = new QWidgetStack(ruleFrame);
00121   ruleStack->addWidget(dailyFrame,0);
00122   ruleStack->addWidget(weeklyFrame,1);
00123   ruleStack->addWidget(monthlyFrame,2);
00124   ruleStack->addWidget(yearlyFrame,3);
00125 
00126   QBoxLayout *layoutRule = new QHBoxLayout;
00127   layoutRuleFrame->addLayout(layoutRule);
00128   layoutRule->addWidget(ruleButtonGroup);
00129   layoutRule->addWidget(ruleSepFrame);
00130   layoutRule->addStretch(1);
00131   layoutRule->addWidget(ruleStack);
00132   layoutRule->addStretch(1);
00133 
00134   advancedRuleButton = new QCheckBox(i18n("Enable Advanced Rule:"),
00135                                      ruleFrame);
00136   advancedRuleButton->setEnabled(false);
00137 
00138   advancedRuleEdit = new QLineEdit(ruleFrame);
00139   advancedRuleEdit->setText( "" );
00140   advancedRuleEdit->setMaxLength( 32767 );
00141   advancedRuleEdit->setEnabled(false);
00142 
00143 // Disable advanced rule input, because it is not used.
00144   advancedRuleButton->hide();
00145   advancedRuleEdit->hide();
00146 
00147   QBoxLayout *layoutAdvancedRule = new QHBoxLayout;
00148   layoutRuleFrame->addLayout(layoutAdvancedRule);
00149   layoutAdvancedRule->addWidget(advancedRuleButton);
00150   layoutAdvancedRule->addWidget(advancedRuleEdit);
00151 
00152   connect(dailyButton, SIGNAL(toggled(bool)),
00153           this, SLOT(showDaily(bool)));
00154   connect(weeklyButton, SIGNAL(toggled(bool)),
00155           this, SLOT(showWeekly(bool)));
00156   connect(monthlyButton, SIGNAL(toggled(bool)),
00157           this, SLOT(showMonthly(bool)));
00158   connect(yearlyButton, SIGNAL(toggled(bool)),
00159           this, SLOT(showYearly(bool)));
00160 
00161   // Create the recursion range Group Box which contains the controls
00162   // specific to determining how long the recursion is to last.
00163   rangeGroupBox = new QGroupBox( 1,QGroupBox::Horizontal,
00164                                  i18n("Recurrence Range"),this,
00165                                  "rangeGroupBox" );
00166 
00167   rangeButtonGroup = new QButtonGroup( rangeGroupBox,"rangeButtonGroup");
00168   rangeButtonGroup->setFrameStyle(QFrame::NoFrame);
00169 //  rangeButtonGroup->setExclusive(true);
00170 
00171   startDateLabel = new QLabel(i18n("Begin on:"), rangeButtonGroup);
00172 //  startDateEdit = new KDateEdit(rangeButtonGroup);
00173   noEndDateButton = new QRadioButton(i18n("No ending date"), rangeButtonGroup);
00174   endDurationButton = new QRadioButton(i18n("End after"), rangeButtonGroup);
00175   endDurationEdit = new QLineEdit(rangeButtonGroup);
00176   endDurationEdit->setValidator(new KIntValidator(0,9999,endDurationEdit));
00177   endDurationLabel = new QLabel(i18n("occurrence(s)"), rangeButtonGroup);
00178   endDateButton = new QRadioButton(i18n("End by:"), rangeButtonGroup);
00179   endDateEdit = new KDateEdit(rangeButtonGroup);
00180 
00181   // Construct layout for recurrence range box
00182   QBoxLayout *layoutRange = new QVBoxLayout(rangeButtonGroup,5);
00183 
00184 //  QBoxLayout *layoutStart = new QHBoxLayout;
00185 //  layoutRange->addLayout(layoutStart);
00186 //  layoutStart->addWidget(startDateLabel);
00187 //  layoutStart->addWidget(startDateEdit,AlignVCenter);
00188 
00189   layoutRange->addWidget(startDateLabel);
00190 
00191   layoutRange->addWidget(noEndDateButton);
00192 
00193   QBoxLayout *layoutEndDuration = new QHBoxLayout;
00194   layoutRange->addLayout(layoutEndDuration);
00195   layoutEndDuration->addWidget(endDurationButton);
00196   layoutEndDuration->addWidget(endDurationEdit);
00197   layoutEndDuration->addWidget(endDurationLabel);
00198 
00199   QBoxLayout *layoutEndDate = new QHBoxLayout;
00200   layoutRange->addLayout(layoutEndDate);
00201   layoutEndDate->addWidget(endDateButton);
00202   layoutEndDate->addWidget(endDateEdit,AlignLeft);
00203 
00204   layoutRange->addStretch(1);
00205 
00206   connect(noEndDateButton, SIGNAL(toggled(bool)),
00207           this, SLOT(disableRange(bool)));
00208   connect(endDurationButton, SIGNAL(toggled(bool)),
00209           this, SLOT(enableDurationRange(bool)));
00210   connect(endDateButton, SIGNAL(toggled(bool)),
00211           this, SLOT(enableDateRange(bool)));
00212 }
00213 
00214 void KOEditorRecurrence::showDaily(bool on)
00215 {
00216   if (on) ruleStack->raiseWidget(dailyFrame);
00217 }
00218 
00219 void KOEditorRecurrence::showWeekly(bool on)
00220 {
00221   if (on) ruleStack->raiseWidget(weeklyFrame);
00222 }
00223 
00224 void KOEditorRecurrence::showMonthly(bool on)
00225 {
00226   if (on) ruleStack->raiseWidget(monthlyFrame);
00227 }
00228 
00229 void KOEditorRecurrence::showYearly(bool on)
00230 {
00231   if (on) ruleStack->raiseWidget(yearlyFrame);
00232 }
00233 
00234 void KOEditorRecurrence::disableRange(bool on)
00235 {
00236   if (on) {
00237     endDateEdit->setEnabled(false);
00238     endDurationEdit->setEnabled(false);
00239     endDurationLabel->setEnabled(false);
00240     return;
00241   }
00242 }
00243 
00244 void KOEditorRecurrence::enableDurationRange(bool on)
00245 {
00246   if (on) {
00247     endDurationEdit->setEnabled(true);
00248     endDurationLabel->setEnabled(true);
00249     endDateEdit->setEnabled(false);
00250     return;
00251   }
00252 }
00253 
00254 void KOEditorRecurrence::enableDateRange(bool on)
00255 {
00256   if (on) {
00257     endDateEdit->setEnabled(true);
00258     endDurationEdit->setEnabled(false);
00259     endDurationLabel->setEnabled(false);
00260     return;
00261   }
00262 }
00263 
00264 void KOEditorRecurrence::initDaily()
00265 {
00266   dailyFrame = new QFrame(ruleFrame);
00267   dailyFrame->setFrameStyle(QFrame::NoFrame);
00268 
00269   everyNDays = new QLabel(i18n("Recur every"), dailyFrame);
00270 
00271   nDaysEntry = new QLineEdit(dailyFrame);
00272   nDaysEntry->setValidator(new KIntValidator(0,999,nDaysEntry));
00273   nDaysEntry->setText( "1" );
00274   nDaysEntry->setMaxLength( 3 );
00275 
00276   nDaysLabel = new QLabel(i18n("day(s)"), dailyFrame);
00277 
00278   QBoxLayout *layoutDaily = new QHBoxLayout(dailyFrame,10);
00279   layoutDaily->addWidget(everyNDays);
00280   layoutDaily->addWidget(nDaysEntry);
00281   layoutDaily->addWidget(nDaysLabel);
00282 }
00283 
00284 void KOEditorRecurrence::initWeekly()
00285 {
00286   weeklyFrame = new QFrame(ruleFrame);
00287   weeklyFrame->setFrameStyle(QFrame::NoFrame);
00288 
00289   everyNWeeks = new QLabel(i18n("Recur every"), weeklyFrame);
00290 
00291   nWeeksEntry = new QLineEdit(weeklyFrame);
00292   nWeeksEntry->setValidator(new KIntValidator(0,99,nWeeksEntry));
00293   nWeeksEntry->setText("1");
00294   nWeeksEntry->setMaxLength(2);
00295 
00296   nWeeksLabel = new QLabel(i18n("week(s) on:"), weeklyFrame);
00297 
00298   sundayBox    = new QCheckBox(i18n("Sun"), weeklyFrame);
00299   mondayBox    = new QCheckBox(i18n("Mon"), weeklyFrame);
00300   tuesdayBox   = new QCheckBox(i18n("Tue"), weeklyFrame);
00301   wednesdayBox = new QCheckBox(i18n("Wed"), weeklyFrame);
00302   thursdayBox  = new QCheckBox(i18n("Thu"), weeklyFrame);
00303   fridayBox    = new QCheckBox(i18n("Fri"), weeklyFrame);
00304   saturdayBox  = new QCheckBox(i18n("Sat"), weeklyFrame);
00305 
00306   QBoxLayout *layoutWeekly = new QVBoxLayout(weeklyFrame,10);
00307 
00308   QBoxLayout *layoutEveryN = new QHBoxLayout;
00309   layoutWeekly->addLayout(layoutEveryN);
00310   layoutEveryN->addWidget(everyNWeeks);
00311   layoutEveryN->addWidget(nWeeksEntry);
00312   layoutEveryN->addWidget(nWeeksLabel);
00313 
00314   QBoxLayout *layoutDays = new QHBoxLayout;
00315   layoutWeekly->addLayout(layoutDays);
00316   layoutDays->addWidget(sundayBox);
00317   layoutDays->addWidget(mondayBox);
00318   layoutDays->addWidget(tuesdayBox);
00319   layoutDays->addWidget(wednesdayBox);
00320   layoutDays->addWidget(thursdayBox);
00321   layoutDays->addWidget(fridayBox);
00322   layoutDays->addWidget(saturdayBox);
00323 }
00324 
00325 void KOEditorRecurrence::initMonthly()
00326 {
00327   monthlyFrame = new QVBox(ruleFrame);
00328   monthlyFrame->setFrameStyle(QFrame::NoFrame);
00329 //  monthlyFrame->hide();
00330 
00331   monthlyButtonGroup = new QButtonGroup(monthlyFrame);
00332   monthlyButtonGroup->setFrameStyle(QFrame::NoFrame);
00333 
00334   onNthDay          = new QRadioButton(i18n("Recur on the"), monthlyButtonGroup);
00335   nthDayEntry       = new QComboBox(false, monthlyButtonGroup);
00336   nthDayLabel       = new QLabel(i18n("day"), monthlyButtonGroup);
00337 
00338   onNthTypeOfDay    = new QRadioButton(i18n("Recur on the"), monthlyButtonGroup);
00339   nthNumberEntry    = new QComboBox(false, monthlyButtonGroup);
00340   nthTypeOfDayEntry = new QComboBox(false, monthlyButtonGroup);
00341 
00342   monthCommonLabel  = new QLabel(i18n("every"), monthlyButtonGroup);
00343   nMonthsEntry      = new QLineEdit(monthlyButtonGroup);
00344   nMonthsEntry->setValidator(new KIntValidator(0,999,nMonthsEntry));
00345   nMonthsEntry->setText("1");
00346   nMonthsLabel      = new QLabel(i18n("month(s)"), monthlyButtonGroup);
00347 
00348   nthDayEntry->setSizeLimit( 7 );
00349   nthDayEntry->insertItem( i18n("1st") );
00350   nthDayEntry->insertItem( i18n("2nd") );
00351   nthDayEntry->insertItem( i18n("3rd") );
00352   nthDayEntry->insertItem( i18n("4th") );
00353   nthDayEntry->insertItem( i18n("5th") );
00354   nthDayEntry->insertItem( i18n("6th") );
00355   nthDayEntry->insertItem( i18n("7th") );
00356   nthDayEntry->insertItem( i18n("8th") );
00357   nthDayEntry->insertItem( i18n("9th") );
00358   nthDayEntry->insertItem( i18n("10th") );
00359   nthDayEntry->insertItem( i18n("11th") );
00360   nthDayEntry->insertItem( i18n("12th") );
00361   nthDayEntry->insertItem( i18n("13th") );
00362   nthDayEntry->insertItem( i18n("14th") );
00363   nthDayEntry->insertItem( i18n("15th") );
00364   nthDayEntry->insertItem( i18n("16th") );
00365   nthDayEntry->insertItem( i18n("17th") );
00366   nthDayEntry->insertItem( i18n("18th") );
00367   nthDayEntry->insertItem( i18n("19th") );
00368   nthDayEntry->insertItem( i18n("20th") );
00369   nthDayEntry->insertItem( i18n("21st") );
00370   nthDayEntry->insertItem( i18n("22nd") );
00371   nthDayEntry->insertItem( i18n("23rd") );
00372   nthDayEntry->insertItem( i18n("24th") );
00373   nthDayEntry->insertItem( i18n("25th") );
00374   nthDayEntry->insertItem( i18n("26th") );
00375   nthDayEntry->insertItem( i18n("27th") );
00376   nthDayEntry->insertItem( i18n("28th") );
00377   nthDayEntry->insertItem( i18n("29th") );
00378   nthDayEntry->insertItem( i18n("30th") );
00379   nthDayEntry->insertItem( i18n("31st") );
00380 
00381   nthNumberEntry->insertItem( i18n("1st") );
00382   nthNumberEntry->insertItem( i18n("2nd") );
00383   nthNumberEntry->insertItem( i18n("3rd") );
00384   nthNumberEntry->insertItem( i18n("4th") );
00385   nthNumberEntry->insertItem( i18n("5th") );
00386 
00387   nthTypeOfDayEntry->insertItem( i18n("Monday") );
00388   nthTypeOfDayEntry->insertItem( i18n("Tuesday") );
00389   nthTypeOfDayEntry->insertItem( i18n("Wednesday") );
00390   nthTypeOfDayEntry->insertItem( i18n("Thursday") );
00391   nthTypeOfDayEntry->insertItem( i18n("Friday") );
00392   nthTypeOfDayEntry->insertItem( i18n("Saturday") );
00393   nthTypeOfDayEntry->insertItem( i18n("Sunday") );
00394   nthTypeOfDayEntry->adjustSize();
00395 
00396   // Construct layout for monthly recurrence rule
00397   QGridLayout *layoutMonthly = new QGridLayout(monthlyButtonGroup,1,1,0,10);
00398 
00399   layoutMonthly->addWidget(onNthDay,0,0);
00400   layoutMonthly->addWidget(nthDayEntry,0,1);
00401   layoutMonthly->addWidget(nthDayLabel,0,2);
00402 
00403   layoutMonthly->addWidget(onNthTypeOfDay,1,0);
00404   layoutMonthly->addWidget(nthNumberEntry,1,1);
00405   layoutMonthly->addWidget(nthTypeOfDayEntry,1,2);
00406 
00407   layoutMonthly->addMultiCellWidget(monthCommonLabel,0,1,3,3);
00408   layoutMonthly->addMultiCellWidget(nMonthsEntry,0,1,4,4);
00409   layoutMonthly->addMultiCellWidget(nMonthsLabel,0,1,5,5);
00410 }
00411 
00412 void KOEditorRecurrence::initYearly()
00413 {
00414   yearlyFrame = new QVBox(ruleFrame);
00415   yearlyFrame->setFrameStyle(QFrame::NoFrame);
00416 
00417   yearlyButtonGroup = new QButtonGroup(yearlyFrame);
00418   yearlyButtonGroup->setFrameStyle(QFrame::NoFrame);
00419 
00420   yearMonthButton = new QRadioButton(i18n("Recur in the month of"),
00421                                      yearlyButtonGroup);
00422   yearMonthComboBox = new QComboBox(yearlyButtonGroup);
00423 
00424   yearDayButton = new QRadioButton(i18n("Recur on this day"),
00425                                    yearlyButtonGroup);
00426 
00427   yearCommonLabel = new QLabel(i18n("every"), yearlyButtonGroup);
00428   nYearsEntry = new QLineEdit(yearlyButtonGroup);
00429   nYearsEntry->setValidator(new KIntValidator(0,999,nYearsEntry));
00430   nYearsEntry->setMaxLength(3);
00431   nYearsEntry->setText("1");
00432   yearsLabel = new QLabel(i18n("year(s)"), yearlyButtonGroup);
00433 
00434   yearMonthComboBox->insertItem(i18n("January"));
00435   yearMonthComboBox->insertItem(i18n("February"));
00436   yearMonthComboBox->insertItem(i18n("March"));
00437   yearMonthComboBox->insertItem(i18n("April"));
00438   yearMonthComboBox->insertItem(i18n("May"));
00439   yearMonthComboBox->insertItem(i18n("June"));
00440   yearMonthComboBox->insertItem(i18n("July"));
00441   yearMonthComboBox->insertItem(i18n("August"));
00442   yearMonthComboBox->insertItem(i18n("September"));
00443   yearMonthComboBox->insertItem(i18n("October"));
00444   yearMonthComboBox->insertItem(i18n("November"));
00445   yearMonthComboBox->insertItem(i18n("December"));
00446 
00447   //yearDayLineEdit = new QLineEdit(yearlyButtonGroup);
00448 
00449   // Construct layout for yearly recurrence rule
00450   QGridLayout *layoutYearly = new QGridLayout(yearlyButtonGroup,1,1,0,10);
00451 
00452   layoutYearly->addWidget(yearMonthButton,0,0);
00453   layoutYearly->addWidget(yearMonthComboBox,0,1);
00454 
00455   layoutYearly->addWidget(yearDayButton,1,0);
00456 
00457   layoutYearly->addMultiCellWidget(yearCommonLabel,0,1,3,3);
00458   layoutYearly->addMultiCellWidget(nYearsEntry,0,1,4,4);
00459   layoutYearly->addMultiCellWidget(yearsLabel,0,1,5,5);
00460 }
00461 
00462 void KOEditorRecurrence::initExceptions()
00463 {
00464   // Create the exceptions group box, which holds controls for
00465   // specifying dates which are exceptions to the rule specified on
00466   // this tab.
00467   exceptionGroupBox = new QGroupBox(1,QGroupBox::Horizontal,i18n("Exceptions"),
00468                                     this,"execeptionGroupBox");
00469 
00470   QFrame *exceptionFrame = new QFrame(exceptionGroupBox,"timeFrame");
00471 
00472   exceptionDateEdit = new KDateEdit(exceptionFrame);
00473   addExceptionButton = new QPushButton(i18n("Add"), exceptionFrame);
00474   changeExceptionButton = new QPushButton(i18n("Change"), exceptionFrame);
00475   deleteExceptionButton = new QPushButton(i18n("Delete"), exceptionFrame);
00476   exceptionList = new QListBox(exceptionFrame);
00477 
00478   QGridLayout *layoutExceptionFrame = new QGridLayout(exceptionFrame,1,1,0,5);
00479   layoutExceptionFrame->addWidget(exceptionDateEdit,0,0);
00480   layoutExceptionFrame->addWidget(addExceptionButton,1,0);
00481   layoutExceptionFrame->addWidget(changeExceptionButton,2,0);
00482   layoutExceptionFrame->addWidget(deleteExceptionButton,3,0);
00483   layoutExceptionFrame->addMultiCellWidget(exceptionList,0,4,1,1);
00484   layoutExceptionFrame->setRowStretch(4,1);
00485   layoutExceptionFrame->setColStretch(1,3);
00486 
00487   connect(addExceptionButton, SIGNAL(clicked()),
00488           this, SLOT(addException()));
00489   connect(changeExceptionButton, SIGNAL(clicked()),
00490           this, SLOT(changeException()));
00491   connect(deleteExceptionButton, SIGNAL(clicked()),
00492           this, SLOT(deleteException()));
00493 }
00494 
00495 void KOEditorRecurrence::setEnabled(bool enabled)
00496 {
00497 //  kdDebug() << "KOEditorRecurrence::setEnabled(): " << (enabled ? "on" : "off") << endl;
00498 
00499   mEnabled = enabled;
00500 
00501 /*
00502   nDaysEntry->setEnabled(enabled);
00503   nWeeksEntry->setEnabled(enabled);
00504   sundayBox->setEnabled(enabled);
00505   mondayBox->setEnabled(enabled);
00506   tuesdayBox->setEnabled(enabled);
00507   wednesdayBox->setEnabled(enabled);
00508   thursdayBox->setEnabled(enabled);
00509   fridayBox->setEnabled(enabled);
00510   saturdayBox->setEnabled(enabled);
00511   onNthDay->setEnabled(enabled);
00512   nthDayEntry->setEnabled(enabled);
00513   onNthTypeOfDay->setEnabled(enabled);
00514   nthNumberEntry->setEnabled(enabled);
00515   nthTypeOfDayEntry->setEnabled(enabled);
00516   nMonthsEntry->setEnabled(enabled);
00517   yearMonthButton->setEnabled(enabled);
00518   yearDayButton->setEnabled(enabled);
00519   //  yearDayLineEdit->setEnabled(enabled);
00520   nYearsEntry->setEnabled(enabled);
00521   //  advancedRuleButton->setEnabled(enabled);
00522   //  advancedRuleEdit->setEnabled(enabled);
00523 
00524   startDateEdit->setEnabled(enabled);
00525   noEndDateButton->setEnabled(enabled);
00526   endDurationButton->setEnabled(enabled);
00527   endDurationEdit->setEnabled(enabled);
00528   endDateButton->setEnabled(enabled);
00529   endDateEdit->setEnabled(enabled);
00530   exceptionDateEdit->setEnabled(enabled);
00531   addExceptionButton->setEnabled(enabled);
00532   changeExceptionButton->setEnabled(enabled);
00533   deleteExceptionButton->setEnabled(enabled);
00534   //  exceptionDateButton->setEnabled(enabled);
00535   exceptionList->setEnabled(enabled);
00536 */
00537 }
00538 
00539 void KOEditorRecurrence::addException()
00540 {
00541   QDate tmpDate = exceptionDateEdit->date();
00542   QString date=KGlobal::locale()->formatDate(tmpDate);
00543   if(!exceptionList->findItem(date))
00544   {
00545       exceptionList->insertItem(date);
00546       mExceptionDates.append(tmpDate);
00547   }
00548 }
00549 
00550 void KOEditorRecurrence::changeException()
00551 {
00552   int pos = exceptionList->currentItem();
00553   if (pos < 0) return;
00554 
00555   QDate tmpDate = exceptionDateEdit->date();
00556   mExceptionDates[pos] = tmpDate;
00557   exceptionList->changeItem(KGlobal::locale()->formatDate(tmpDate),pos);
00558 }
00559 
00560 void KOEditorRecurrence::deleteException()
00561 {
00562   int pos = exceptionList->currentItem();
00563   if (pos < 0) return;
00564 
00565   mExceptionDates.remove( mExceptionDates.at(pos) );
00566   exceptionList->removeItem(pos);
00567 }
00568 
00569 void KOEditorRecurrence::unsetAllCheckboxes()
00570 {
00571   dailyButton->setChecked(false);
00572   weeklyButton->setChecked(false);
00573   monthlyButton->setChecked(false);
00574   yearlyButton->setChecked(false);
00575 
00576   onNthDay->setChecked(false);
00577   onNthTypeOfDay->setChecked(false);
00578   yearMonthButton->setChecked(false);
00579   yearDayButton->setChecked(false);
00580 
00581   mondayBox->setChecked(false);
00582   tuesdayBox->setChecked(false);
00583   wednesdayBox->setChecked(false);
00584   thursdayBox->setChecked(false);
00585   fridayBox->setChecked(false);
00586   saturdayBox->setChecked(false);
00587   sundayBox->setChecked(false);
00588 
00589   endDateButton->setChecked(false);
00590   noEndDateButton->setChecked(false);
00591   endDurationButton->setChecked(false);
00592 }
00593 
00594 
00595 void KOEditorRecurrence::checkDay(int day)
00596 {
00597   switch (day) {
00598   case 1:
00599     mondayBox->setChecked(true);
00600     break;
00601   case 2:
00602     tuesdayBox->setChecked(true);
00603     break;
00604   case 3:
00605     wednesdayBox->setChecked(true);
00606     break;
00607   case 4:
00608     thursdayBox->setChecked(true);
00609     break;
00610   case 5:
00611     fridayBox->setChecked(true);
00612     break;
00613   case 6:
00614     saturdayBox->setChecked(true);
00615     break;
00616   case 7:
00617     sundayBox->setChecked(true);
00618     break;
00619   }
00620 }
00621 
00622 void KOEditorRecurrence::getCheckedDays(QBitArray &rDays)
00623 {
00624   rDays.fill(false);
00625   if (mondayBox->isChecked())
00626     rDays.setBit(0, 1);
00627   if (tuesdayBox->isChecked())
00628     rDays.setBit(1, 1);
00629   if (wednesdayBox->isChecked())
00630     rDays.setBit(2, 1);
00631   if (thursdayBox->isChecked())
00632     rDays.setBit(3, 1);
00633   if (fridayBox->isChecked())
00634     rDays.setBit(4, 1);
00635   if (saturdayBox->isChecked())
00636     rDays.setBit(5, 1);
00637   if (sundayBox->isChecked())
00638   rDays.setBit(6, 1);
00639 }
00640 
00641 void KOEditorRecurrence::setCheckedDays(QBitArray &rDays)
00642 {
00643   if (rDays.testBit(0))
00644     mondayBox->setChecked(true);
00645   if (rDays.testBit(1))
00646     tuesdayBox->setChecked(true);
00647   if (rDays.testBit(2))
00648     wednesdayBox->setChecked(true);
00649   if (rDays.testBit(3))
00650     thursdayBox->setChecked(true);
00651   if (rDays.testBit(4))
00652     fridayBox->setChecked(true);
00653   if (rDays.testBit(5))
00654     saturdayBox->setChecked(true);
00655   if (rDays.testBit(6))
00656     sundayBox->setChecked(true);
00657 }
00658 
00659 
00660 void KOEditorRecurrence::setDateTimes(QDateTime start,QDateTime end)
00661 {
00662 //  kdDebug() << "KOEditorRecurrence::setDateTimes" << endl;
00663 
00664   currStartDateTime = start;
00665   currEndDateTime = end;
00666 
00667   startDateLabel->setText(i18n("Begins on: %1")
00668       .arg(KGlobal::locale()->formatDate(start.date())));
00669 }
00670 
00671 
00672 void KOEditorRecurrence::setDefaults(QDateTime from, QDateTime to,bool)
00673 {
00674   // unset everything
00675   unsetAllCheckboxes();
00676 
00677   setDateTimes(from,to);
00678 
00679   startDateLabel->setText(i18n("Begins on: %1")
00680                           .arg(KGlobal::locale()->formatDate(from.date())));
00681 
00682   noEndDateButton->setChecked(true);
00683   weeklyButton->setChecked(true);
00684 
00685   nDaysEntry->setText("1");
00686   nWeeksEntry->setText("1");
00687 
00688   checkDay(from.date().dayOfWeek());
00689   onNthDay->setChecked(true);
00690   nthDayEntry->setCurrentItem(from.date().day()-1);
00691   nMonthsEntry->setText("1");
00692   yearDayButton->setChecked(true);
00693   nYearsEntry->setText("1");
00694 }
00695 
00696 void KOEditorRecurrence::readEvent(Event *event)
00697 {
00698   QBitArray rDays;
00699   QPtrList<Recurrence::rMonthPos> rmp;
00700   QPtrList<int> rmd;
00701   int i;
00702   int month;
00703 
00704   setDateTimes(event->dtStart(),event->dtEnd());
00705 
00706   // unset everything
00707   unsetAllCheckboxes();
00708   switch (event->recurrence()->doesRecur()) {
00709   case Recurrence::rNone:
00710     break;
00711   case Recurrence::rDaily:
00712     dailyButton->setChecked(true);
00713     nDaysEntry->setText(QString::number(event->recurrence()->frequency()));
00714     break;
00715   case Recurrence::rWeekly:
00716     weeklyButton->setChecked(true);
00717     nWeeksEntry->setText(QString::number(event->recurrence()->frequency()));
00718 
00719     rDays = event->recurrence()->days();
00720     setCheckedDays(rDays);
00721     break;
00722   case Recurrence::rMonthlyPos:
00723     // we only handle one possibility in the list right now,
00724     // so I have hardcoded calls with first().  If we make the GUI
00725     // more extended, this can be changed.
00726     monthlyButton->setChecked(true);
00727     onNthTypeOfDay->setChecked(true);
00728     rmp = event->recurrence()->monthPositions();
00729     if (rmp.first()->negative)
00730       i = 5 - rmp.first()->rPos - 1;
00731     else
00732       i = rmp.first()->rPos - 1;
00733     nthNumberEntry->setCurrentItem(i);
00734     i = 0;
00735     while (!rmp.first()->rDays.testBit(i))
00736       ++i;
00737     nthTypeOfDayEntry->setCurrentItem(i);
00738     nMonthsEntry->setText(QString::number(event->recurrence()->frequency()));
00739     break;
00740   case Recurrence::rMonthlyDay:
00741     monthlyButton->setChecked(true);
00742     onNthDay->setChecked(true);
00743     rmd = event->recurrence()->monthDays();
00744     i = *rmd.first() - 1;
00745     nthDayEntry->setCurrentItem(i);
00746     nMonthsEntry->setText(QString::number(event->recurrence()->frequency()));
00747     break;
00748   case Recurrence::rYearlyMonth:
00749   case Recurrence::rYearlyDay:
00750     yearlyButton->setChecked( true );
00751     rmd = event->recurrence()->yearNums();
00752     month = *rmd.first(); 
00753     if ( month == event->dtStart().date().month() ) {
00754       yearDayButton->setChecked( true );
00755     } else {
00756       yearMonthButton->setChecked( true );
00757       yearMonthComboBox->setCurrentItem( month - 1 );
00758     }
00759     nYearsEntry->setText(QString::number(event->recurrence()->frequency()));
00760     break;
00761   default:
00762     break;
00763   }
00764 
00765   startDateLabel->setText(i18n("Begins on: %1")
00766       .arg(KGlobal::locale()->formatDate(event->dtStart().date())));
00767 
00768   if (event->recurrence()->doesRecur()) {
00769 
00770     // get range information
00771     if (event->recurrence()->duration() == -1)
00772       noEndDateButton->setChecked(true);
00773     else if (event->recurrence()->duration() == 0) {
00774       endDateButton->setChecked(true);
00775       endDateEdit->setDate(event->recurrence()->endDate());
00776     } else {
00777       endDurationButton->setChecked(true);
00778       endDurationEdit->setText(QString::number(event->recurrence()->duration()));
00779     }
00780   } else {
00781     // the event doesn't recur, but we should provide some logical
00782     // defaults in case they go and make it recur.
00783     noEndDateButton->setChecked(true);
00784     weeklyButton->setChecked(true);
00785     nDaysEntry->setText("1");
00786     nWeeksEntry->setText("1");
00787     checkDay(currStartDateTime.date().dayOfWeek());
00788     onNthDay->setChecked(true);
00789     nthDayEntry->setCurrentItem(currStartDateTime.date().day()-1);
00790     nMonthsEntry->setText("1");
00791     yearDayButton->setChecked(true);
00792     nYearsEntry->setText("1");
00793   }
00794 
00795   exceptionDateEdit->setDate(QDate::currentDate());
00796 
00797   exceptionList->clear();
00798   mExceptionDates.clear();
00799   DateList exDates = event->exDates();
00800   DateList::ConstIterator dit;
00801   for (dit = exDates.begin(); dit != exDates.end(); ++dit ) {
00802     exceptionList->insertItem(KGlobal::locale()->formatDate(*dit));
00803     mExceptionDates.append(*dit);
00804   }
00805 }
00806 
00807 void KOEditorRecurrence::writeEvent(Event *event)
00808 {
00809   // get recurrence information
00810   // need a check to see if recurrence is enabled...
00811   if (mEnabled) {
00812     int rDuration;
00813     QDate rEndDate;
00814     QString tmpStr;
00815 
00816     // clear out any old settings;
00817     event->recurrence()->unsetRecurs();
00818 
00819     // first get range information.  It is common to all types
00820     // of recurring events.
00821     if (noEndDateButton->isChecked()) {
00822       rDuration = -1;
00823     } else if (endDurationButton->isChecked()) {
00824       tmpStr = endDurationEdit->text();
00825       rDuration = tmpStr.toInt();
00826     } else {
00827       rDuration = 0;
00828       rEndDate = endDateEdit->date();
00829     }
00830 
00831     // check for daily recurrence
00832     if (dailyButton->isChecked()) {
00833       int rFreq;
00834 
00835       tmpStr = nDaysEntry->text();
00836       rFreq = tmpStr.toInt();
00837       if (rFreq < 1) rFreq = 1;
00838       if (rDuration != 0)
00839         event->recurrence()->setDaily(rFreq, rDuration);
00840       else
00841         event->recurrence()->setDaily(rFreq, rEndDate);
00842       // check for weekly recurrence
00843     } else if (weeklyButton->isChecked()) {
00844       int rFreq;
00845       QBitArray rDays(7);
00846 
00847       tmpStr = nWeeksEntry->text();
00848       rFreq = tmpStr.toInt();
00849       if (rFreq < 1) rFreq = 1;
00850 
00851       getCheckedDays(rDays);
00852 
00853       if (rDuration != 0)
00854         event->recurrence()->setWeekly(rFreq, rDays, rDuration);
00855       else
00856         event->recurrence()->setWeekly(rFreq, rDays, rEndDate);
00857     } else if (monthlyButton->isChecked()) {
00858       if (onNthTypeOfDay->isChecked()) {
00859         // it's by position
00860         int rFreq, rPos;
00861         QBitArray rDays(7);
00862 
00863         tmpStr = nMonthsEntry->text();
00864         rFreq = tmpStr.toInt();
00865         if (rFreq < 1) rFreq = 1;
00866         rDays.fill(false);
00867         rPos = nthNumberEntry->currentItem() + 1;
00868         rDays.setBit(nthTypeOfDayEntry->currentItem());
00869         if (rDuration != 0)
00870           event->recurrence()->setMonthly(Recurrence::rMonthlyPos, rFreq, rDuration);
00871         else
00872           event->recurrence()->setMonthly(Recurrence::rMonthlyPos, rFreq, rEndDate);
00873         event->recurrence()->addMonthlyPos(rPos, rDays);
00874       } else {
00875         // it's by day
00876         int rFreq;
00877         short rDay;
00878 
00879         tmpStr = nMonthsEntry->text();
00880         rFreq = tmpStr.toInt();
00881         if (rFreq < 1) rFreq = 1;
00882 
00883         rDay = nthDayEntry->currentItem() + 1;
00884 
00885         if (rDuration != 0)
00886           event->recurrence()->setMonthly(Recurrence::rMonthlyDay, rFreq, rDuration);
00887         else
00888           event->recurrence()->setMonthly(Recurrence::rMonthlyDay, rFreq, rEndDate);
00889         event->recurrence()->addMonthlyDay(rDay);
00890       }
00891     } else if (yearlyButton->isChecked()) {
00892       int rFreq = nYearsEntry->text().toInt();
00893       if (rFreq < 1) rFreq = 1;
00894 
00895       int rMonth;
00896       if ( yearMonthButton->isChecked() ) {
00897         rMonth = yearMonthComboBox->currentItem() + 1;
00898       } else {
00899         rMonth = event->dtStart().date().month();
00900       }
00901       if ( rDuration != 0 ) {
00902         event->recurrence()->setYearly( Recurrence::rYearlyMonth, rFreq,
00903                                         rDuration );
00904       } else {
00905         event->recurrence()->setYearly( Recurrence::rYearlyMonth, rFreq,
00906                                         rEndDate );
00907       }
00908 
00909       event->recurrence()->addYearlyNum( rMonth );
00910     }
00911   } else {
00912     event->recurrence()->unsetRecurs();
00913   }
00914 
00915   event->setExDates(mExceptionDates);
00916 }
00917 
00918 // obsolete
00919 #if 0
00920 QDate *KOEditorRecurrence::dateFromText(QString text)
00921 {
00922   QString tmpStr = text;
00923   tmpStr.remove(0,4);
00924   QString name = tmpStr.left(3);
00925 
00926   int y, m, d;
00927 
00928   name = name.upper();
00929 
00930   y = tmpStr.right(4).toInt();
00931   d = tmpStr.mid(4,2).toInt();
00932   if (name == "JAN")
00933     m = 1;
00934   else if (name == "FEB")
00935     m = 2;
00936   else if (name == "MAR")
00937     m = 3;
00938   else if (name == "APR")
00939     m = 4;
00940   else if (name == "MAY")
00941     m = 5;
00942   else if (name == "JUN")
00943     m = 6;
00944   else if (name == "JUL")
00945     m = 7;
00946   else if (name == "AUG")
00947     m = 8;
00948   else if (name == "SEP")
00949     m = 9;
00950   else if (name == "OCT")
00951     m = 10;
00952   else if (name == "NOV")
00953     m = 11;
00954   else if (name == "DEC")
00955     m = 12;
00956   else
00957     // should never get here!
00958     m = 0;
00959 
00960   return new QDate(y,m,d);
00961 }
00962 #endif
00963 
00964 void KOEditorRecurrence::setDateTimeStr(const QString &str)
00965 {
00966   dateTimeLabel->setText(str);
00967 }
00968 
00969 bool KOEditorRecurrence::validateInput()
00970 {
00971   // Check input here
00972 
00973   return true;
00974 }
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.5.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Sun Feb 15 11:41:09 2004 by doxygen 1.3.5 written by Dimitri van Heesch, © 1997-2001