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 }