00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <qtooltip.h>
00025 #include <qlayout.h>
00026 #include <qvbox.h>
00027 #include <qbuttongroup.h>
00028 #include <qvgroupbox.h>
00029 #include <qwidgetstack.h>
00030 #include <qdatetime.h>
00031 #include <qlabel.h>
00032 #include <qcheckbox.h>
00033 #include <qcombobox.h>
00034 #include <qpushbutton.h>
00035
00036 #include <kdebug.h>
00037 #include <kglobal.h>
00038 #include <klocale.h>
00039 #include <kiconloader.h>
00040 #include <kmessagebox.h>
00041 #include <kfiledialog.h>
00042 #include <kstandarddirs.h>
00043 #include <krestrictedline.h>
00044 #include <ktextedit.h>
00045
00046 #include <libkcal/event.h>
00047
00048 #include "ktimeedit.h"
00049 #include <libkdepim/kdateedit.h>
00050
00051 #include "koprefs.h"
00052
00053 #include "koeditorgeneralevent.h"
00054 #include "koeditorgeneralevent.moc"
00055
00056 KOEditorGeneralEvent::KOEditorGeneralEvent(QObject* parent,
00057 const char* name) :
00058 KOEditorGeneral( parent, name)
00059 {
00060 connect(this,SIGNAL(dateTimesChanged(QDateTime,QDateTime)),
00061 SLOT(setDuration()));
00062 connect(this,SIGNAL(dateTimesChanged(QDateTime,QDateTime)),
00063 SLOT(emitDateTimeStr()));
00064 }
00065
00066 KOEditorGeneralEvent::~KOEditorGeneralEvent()
00067 {
00068 }
00069
00070 void KOEditorGeneralEvent::finishSetup()
00071 {
00072 QWidget::setTabOrder( mSummaryEdit, mLocationEdit );
00073 QWidget::setTabOrder( mLocationEdit, mStartDateEdit );
00074 QWidget::setTabOrder( mStartDateEdit, mStartTimeEdit );
00075 QWidget::setTabOrder( mStartTimeEdit, mEndDateEdit );
00076 QWidget::setTabOrder( mEndDateEdit, mEndTimeEdit );
00077 QWidget::setTabOrder( mEndTimeEdit, mNoTimeButton );
00078 QWidget::setTabOrder( mNoTimeButton, mAlarmButton );
00079 QWidget::setTabOrder( mAlarmButton, mAlarmTimeEdit );
00080 QWidget::setTabOrder( mAlarmTimeEdit, mAlarmIncrCombo );
00081 QWidget::setTabOrder( mAlarmIncrCombo, mAlarmSoundButton );
00082 QWidget::setTabOrder( mAlarmSoundButton, mAlarmProgramButton );
00083 QWidget::setTabOrder( mAlarmProgramButton, mFreeTimeCombo );
00084 QWidget::setTabOrder( mFreeTimeCombo, mDescriptionEdit );
00085 QWidget::setTabOrder( mDescriptionEdit, mCategoriesButton );
00086 QWidget::setTabOrder( mCategoriesButton, mSecrecyCombo );
00087
00088
00089 mSummaryEdit->setFocus();
00090 }
00091
00092 void KOEditorGeneralEvent::initTime(QWidget *parent,QBoxLayout *topLayout)
00093 {
00094 QBoxLayout *timeLayout = new QVBoxLayout(topLayout);
00095
00096 QGroupBox *timeGroupBox = new QGroupBox(1,QGroupBox::Horizontal,
00097 i18n("Date && Time"),parent);
00098 timeLayout->addWidget(timeGroupBox);
00099
00100 QFrame *timeBoxFrame = new QFrame(timeGroupBox);
00101
00102 QGridLayout *layoutTimeBox = new QGridLayout(timeBoxFrame,2,3);
00103 layoutTimeBox->setSpacing(topLayout->spacing());
00104
00105
00106 mStartDateLabel = new QLabel(i18n("&Start:"),timeBoxFrame);
00107 layoutTimeBox->addWidget(mStartDateLabel,0,0);
00108
00109 mStartDateEdit = new KDateEdit(timeBoxFrame);
00110 layoutTimeBox->addWidget(mStartDateEdit,0,1);
00111 mStartDateLabel->setBuddy( mStartDateEdit );
00112
00113 mStartTimeEdit = new KTimeEdit(timeBoxFrame);
00114 layoutTimeBox->addWidget(mStartTimeEdit,0,2);
00115
00116
00117 mEndDateLabel = new QLabel(i18n("&End:"),timeBoxFrame);
00118 layoutTimeBox->addWidget(mEndDateLabel,1,0);
00119
00120 mEndDateEdit = new KDateEdit(timeBoxFrame);
00121 layoutTimeBox->addWidget(mEndDateEdit,1,1);
00122 mEndDateLabel->setBuddy( mEndDateEdit );
00123
00124 mEndTimeEdit = new KTimeEdit(timeBoxFrame);
00125 layoutTimeBox->addWidget(mEndTimeEdit,1,2);
00126
00127 QHBoxLayout *flagsBox = new QHBoxLayout( timeBoxFrame );
00128
00129 mNoTimeButton = new QCheckBox(i18n("&No time associated"),timeBoxFrame);
00130 flagsBox->addWidget(mNoTimeButton);
00131 connect(mNoTimeButton, SIGNAL(toggled(bool)),SLOT(dontAssociateTime(bool)));
00132
00133 mDurationLabel = new QLabel( timeBoxFrame );
00134 if ( KOPrefs::instance()->mCompactDialogs ) {
00135 layoutTimeBox->addMultiCellWidget( mDurationLabel, 3, 3, 0, 3 );
00136 } else {
00137 flagsBox->addWidget( mDurationLabel, 0, 2 );
00138 }
00139
00140 layoutTimeBox->addMultiCellLayout( flagsBox, 2, 2, 0, 3 );
00141
00142
00143 connect(mStartTimeEdit, SIGNAL(timeChanged(QTime)),
00144 this, SLOT(startTimeChanged(QTime)));
00145 connect(mEndTimeEdit, SIGNAL(timeChanged(QTime)),
00146 this, SLOT(endTimeChanged(QTime)));
00147
00148
00149 connect(mStartDateEdit, SIGNAL(dateChanged(QDate)),
00150 this, SLOT(startDateChanged(QDate)));
00151 connect(mEndDateEdit, SIGNAL(dateChanged(QDate)),
00152 this, SLOT(endDateChanged(QDate)));
00153 }
00154
00155 void KOEditorGeneralEvent::initClass(QWidget *parent,QBoxLayout *topLayout)
00156 {
00157 QBoxLayout *classLayout = new QHBoxLayout(topLayout);
00158
00159 QLabel *freeTimeLabel = new QLabel(i18n("S&how time as:"),parent);
00160 classLayout->addWidget(freeTimeLabel);
00161
00162 mFreeTimeCombo = new QComboBox(false, parent);
00163 mFreeTimeCombo->insertItem(i18n("Busy"));
00164 mFreeTimeCombo->insertItem(i18n("Free"));
00165 classLayout->addWidget(mFreeTimeCombo);
00166 freeTimeLabel->setBuddy( mFreeTimeCombo );
00167 }
00168
00169 void KOEditorGeneralEvent::timeStuffDisable(bool disable)
00170 {
00171 mStartTimeEdit->setEnabled( !disable );
00172 mEndTimeEdit->setEnabled( !disable );
00173
00174 setDuration();
00175 emitDateTimeStr();
00176 }
00177
00178 void KOEditorGeneralEvent::dontAssociateTime(bool noTime)
00179 {
00180 timeStuffDisable(noTime);
00181
00182 allDayChanged(noTime);
00183 }
00184
00185 void KOEditorGeneralEvent::setDateTimes(QDateTime start, QDateTime end)
00186 {
00187
00188
00189 mStartDateEdit->setDate(start.date());
00190
00191 mStartTimeEdit->blockSignals( true );
00192 mStartTimeEdit->setTime(start.time());
00193 mStartTimeEdit->blockSignals( false );
00194 mEndDateEdit->setDate(end.date());
00195 mEndTimeEdit->setTime(end.time());
00196
00197 mCurrStartDateTime = start;
00198 mCurrEndDateTime = end;
00199
00200 setDuration();
00201 emitDateTimeStr();
00202 }
00203
00204 void KOEditorGeneralEvent::startTimeChanged(QTime newtime)
00205 {
00206 kdDebug(5850) << "KOEditorGeneralEvent::startTimeChanged() " << newtime.toString() << endl;
00207
00208 int secsep = mCurrStartDateTime.secsTo(mCurrEndDateTime);
00209
00210 mCurrStartDateTime.setTime(newtime);
00211
00212
00213 mCurrEndDateTime = mCurrStartDateTime.addSecs(secsep);
00214 mEndTimeEdit->setTime(mCurrEndDateTime.time());
00215 mEndDateEdit->setDate(mCurrEndDateTime.date());
00216
00217 emit dateTimesChanged(mCurrStartDateTime,mCurrEndDateTime);
00218 }
00219
00220 void KOEditorGeneralEvent::endTimeChanged(QTime newtime)
00221 {
00222
00223
00224 QDateTime newdt(mCurrEndDateTime.date(), newtime);
00225 mCurrEndDateTime = newdt;
00226
00227 emit dateTimesChanged(mCurrStartDateTime,mCurrEndDateTime);
00228 }
00229
00230 void KOEditorGeneralEvent::startDateChanged(QDate newdate)
00231 {
00232 int daysep = mCurrStartDateTime.daysTo(mCurrEndDateTime);
00233
00234 mCurrStartDateTime.setDate(newdate);
00235
00236
00237 mCurrEndDateTime.setDate(mCurrStartDateTime.date().addDays(daysep));
00238 mEndDateEdit->setDate(mCurrEndDateTime.date());
00239
00240 emit dateTimesChanged(mCurrStartDateTime,mCurrEndDateTime);
00241 }
00242
00243 void KOEditorGeneralEvent::endDateChanged(QDate newdate)
00244 {
00245 QDateTime newdt(newdate, mCurrEndDateTime.time());
00246
00247 if(newdt < mCurrStartDateTime) {
00248
00249 newdt = mCurrStartDateTime;
00250 mEndDateEdit->setDate(newdt.date());
00251 mEndTimeEdit->setTime(newdt.time());
00252 }
00253 mCurrEndDateTime = newdt;
00254
00255 emit dateTimesChanged(mCurrStartDateTime,mCurrEndDateTime);
00256 }
00257
00258 void KOEditorGeneralEvent::setDefaults(QDateTime from,QDateTime to,bool allDay)
00259 {
00260 KOEditorGeneral::setDefaults(allDay);
00261
00262 mNoTimeButton->setChecked(allDay);
00263 timeStuffDisable(allDay);
00264
00265 setDateTimes(from,to);
00266 }
00267
00268 void KOEditorGeneralEvent::readEvent( Event *event, bool tmpl )
00269 {
00270 QString tmpStr;
00271
00272 mNoTimeButton->setChecked(event->doesFloat());
00273 timeStuffDisable(event->doesFloat());
00274
00275 if ( !tmpl ) {
00276
00277 setDateTimes(event->dtStart(),event->dtEnd());
00278 }
00279
00280 switch( event->transparency() ) {
00281 case Event::Transparent:
00282 mFreeTimeCombo->setCurrentItem(1);
00283 break;
00284 case Event::Opaque:
00285 mFreeTimeCombo->setCurrentItem(0);
00286 break;
00287 }
00288
00289 readIncidence(event);
00290 }
00291
00292 void KOEditorGeneralEvent::writeEvent(Event *event)
00293 {
00294
00295
00296 writeIncidence(event);
00297
00298 QDate tmpDate;
00299 QTime tmpTime;
00300 QDateTime tmpDT;
00301
00302
00303 QString tmpStr;
00304
00305 if (mNoTimeButton->isChecked()) {
00306 event->setFloats(true);
00307
00308 tmpDate = mStartDateEdit->date();
00309 tmpTime.setHMS(0,0,0);
00310 tmpDT.setDate(tmpDate);
00311 tmpDT.setTime(tmpTime);
00312 event->setDtStart(tmpDT);
00313
00314 tmpDate = mEndDateEdit->date();
00315 tmpTime.setHMS(0,0,0);
00316 tmpDT.setDate(tmpDate);
00317 tmpDT.setTime(tmpTime);
00318 event->setDtEnd(tmpDT);
00319 } else {
00320 event->setFloats(false);
00321
00322
00323 tmpDate = mEndDateEdit->date();
00324 tmpTime = mEndTimeEdit->getTime();
00325 tmpDT.setDate(tmpDate);
00326 tmpDT.setTime(tmpTime);
00327 event->setDtEnd(tmpDT);
00328
00329
00330 tmpDate = mStartDateEdit->date();
00331 tmpTime = mStartTimeEdit->getTime();
00332 tmpDT.setDate(tmpDate);
00333 tmpDT.setTime(tmpTime);
00334 event->setDtStart(tmpDT);
00335 }
00336
00337 event->setTransparency(mFreeTimeCombo->currentItem() > 0
00338 ? KCal::Event::Transparent
00339 : KCal::Event::Opaque);
00340
00341
00342 }
00343
00344 void KOEditorGeneralEvent::setDuration()
00345 {
00346 QString tmpStr, catStr;
00347 int hourdiff, minutediff;
00348
00349
00350 if(mCurrEndDateTime >= mCurrStartDateTime) {
00351
00352 if (mNoTimeButton->isChecked()) {
00353 int daydiff = mCurrStartDateTime.date().daysTo(mCurrEndDateTime.date()) + 1;
00354 tmpStr = i18n("Duration: ");
00355 tmpStr.append(i18n("1 Day","%n Days",daydiff));
00356 } else {
00357 hourdiff = mCurrStartDateTime.date().daysTo(mCurrEndDateTime.date()) * 24;
00358 hourdiff += mCurrEndDateTime.time().hour() -
00359 mCurrStartDateTime.time().hour();
00360 minutediff = mCurrEndDateTime.time().minute() -
00361 mCurrStartDateTime.time().minute();
00362
00363 if (minutediff < 0 && hourdiff > 0) {
00364 hourdiff -= 1;
00365 minutediff += 60;
00366 }
00367 if (hourdiff || minutediff){
00368 tmpStr = i18n("Duration: ");
00369 if (hourdiff){
00370 catStr = i18n("1 hour","%n hours",hourdiff);
00371 tmpStr.append(catStr);
00372 }
00373 if (hourdiff && minutediff){
00374 tmpStr += i18n(", ");
00375 }
00376 if (minutediff){
00377 catStr = i18n("1 minute","%n minutes",minutediff);
00378 tmpStr += catStr;
00379 }
00380 } else tmpStr = "";
00381 }
00382 }
00383 mDurationLabel->setText(tmpStr);
00384 }
00385
00386 void KOEditorGeneralEvent::emitDateTimeStr()
00387 {
00388 KLocale *l = KGlobal::locale();
00389
00390 QString from,to;
00391 if (mNoTimeButton->isChecked()) {
00392 from = l->formatDate(mCurrStartDateTime.date());
00393 to = l->formatDate(mCurrEndDateTime.date());
00394 } else {
00395 from = l->formatDateTime(mCurrStartDateTime);
00396 to = l->formatDateTime(mCurrEndDateTime);
00397 }
00398
00399 QString str = i18n("From: %1 To: %2 %3").arg(from).arg(to)
00400 .arg(mDurationLabel->text());
00401
00402 emit dateTimeStrChanged(str);
00403 }
00404
00405 bool KOEditorGeneralEvent::validateInput()
00406 {
00407
00408
00409 if (!mNoTimeButton->isChecked()) {
00410 if (!mStartTimeEdit->inputIsValid()) {
00411 KMessageBox::sorry( 0,
00412 i18n("Please specify a valid start time, for example '%1'.")
00413 .arg( KGlobal::locale()->formatTime( QTime::currentTime() ) ) );
00414 return false;
00415 }
00416
00417 if (!mEndTimeEdit->inputIsValid()) {
00418 KMessageBox::sorry( 0,
00419 i18n("Please specify a valid end time, for example '%1'.")
00420 .arg( KGlobal::locale()->formatTime( QTime::currentTime() ) ) );
00421 return false;
00422 }
00423 }
00424
00425 if (!mStartDateEdit->inputIsValid()) {
00426 KMessageBox::sorry( 0,
00427 i18n("Please specify a valid start date, for example '%1'.")
00428 .arg( KGlobal::locale()->formatDate( QDate::currentDate() ) ) );
00429 return false;
00430 }
00431
00432 if (!mEndDateEdit->inputIsValid()) {
00433 KMessageBox::sorry( 0,
00434 i18n("Please specify a valid end date, for example '%1'.")
00435 .arg( KGlobal::locale()->formatDate( QDate::currentDate() ) ) );
00436 return false;
00437 }
00438
00439 QDateTime startDt,endDt;
00440 startDt.setDate(mStartDateEdit->date());
00441 endDt.setDate(mEndDateEdit->date());
00442 if (!mNoTimeButton->isChecked()) {
00443 startDt.setTime(mStartTimeEdit->getTime());
00444 endDt.setTime(mEndTimeEdit->getTime());
00445 }
00446
00447 if (startDt > endDt) {
00448 KMessageBox::sorry(0,i18n("The event ends before it starts.\n"
00449 "Please correct dates and times."));
00450 return false;
00451 }
00452
00453 return KOEditorGeneral::validateInput();
00454 }