diff -r fd30d51f876b -r b6db4fd4947b calendarui/caleneditor/src/caleneditorreminderfield.cpp --- a/calendarui/caleneditor/src/caleneditorreminderfield.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/caleneditor/src/caleneditorreminderfield.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -18,13 +18,22 @@ // System Includes +#include + #include #include #include +#include +#include +#include +#include +#include +#include // User Includes #include "caleneditorreminderfield.h" +#define numberOfMinutesInADay 1440 /*! \class CalenEditorReminderField */ @@ -42,35 +51,16 @@ :QObject(parent), mCalenEditor(calenEditor), mEditorForm(form), - mCalenEditorModel(model) + mCalenEditorModel(model), + mCustomReminderTimeItem(NULL), + mReminderTimeAdded(false) { mReminderItem = new HbDataFormModelItem(); mReminderItem->setType(HbDataFormModelItem::ComboBoxItem); mReminderItem->setData(HbDataFormModelItem::LabelRole, - hbTrId("txt_calendar_setlabel_alarm")); - // Create the remaindar choices - QStringList remaindarChoices; - remaindarChoices << hbTrId("txt_calendar_setlabel_alarm_val_off") - << hbTrId("txt_calendar_setlabel_alarm_val_before_ln_minutes", 5) - << hbTrId("txt_calendar_setlabel_alarm_val_before_ln_minutes", 10) - << hbTrId("txt_calendar_setlabel_alarm_val_before_ln_minutes", 15) - << hbTrId("txt_calendar_setlabel_alarm_val_before_ln_minutes", 30) - << hbTrId("txt_calendar_setlabel_alarm_val_before_ln_hours", 1) - << hbTrId("txt_calendar_setlabel_alarm_val_before_ln_hours", 2); - - mReminderItem->setContentWidgetData(QString("items"), remaindarChoices); - - // Build the hash map for the reminder. - mReminderHash[0] = 0; // OFF. - mReminderHash[1] = 5; - mReminderHash[2] = 10; - mReminderHash[3] = 15; - mReminderHash[4] = 30; - mReminderHash[5] = 60; - mReminderHash[6] = 120; - + hbTrId("txt_calendar_setlabel_reminder")); // Add it to the model - mCalenEditorModel->appendDataFormItem( mReminderItem, + mCalenEditorModel->appendDataFormItem(mReminderItem, mCalenEditorModel->invisibleRootItem()); } @@ -79,7 +69,33 @@ */ CalenEditorReminderField::~CalenEditorReminderField() { - // Nothing Yet + if(mReminderHash.count()) { + mReminderHash.clear(); + } +} + +/*! + Set the reminder choices. + */ +void CalenEditorReminderField::setReminderChoices() +{ + // Create the reminder choices + QStringList reminderChoices; + reminderChoices << hbTrId("txt_calendar_setlabel_reminder_val_off") + << hbTrId("txt_calendar_setlabel_reminder_val_at_the_start") + << hbTrId("txt_calendar_setlabel_reminder_val_15_minutes_befo") + << hbTrId("txt_calendar_setlabel_reminder_val_30_minutes_befo") + << hbTrId("txt_calendar_setlabel_reminder_val_1_hour_before"); + + mReminderItem->setContentWidgetData(QString("items"), reminderChoices); + + // Build the hash map for the reminder. + mReminderHash[0] = -1; // OFF. + mReminderHash[1] = 0; + mReminderHash[2] = 15; + mReminderHash[3] = 30; + mReminderHash[4] = 60; + mReminderItem->setEnabled(true); } /*! @@ -93,7 +109,7 @@ } /*! - Removes reminder item frm the model + Removes reminder item from the model */ void CalenEditorReminderField::removeItemFromModel() { @@ -106,33 +122,106 @@ */ void CalenEditorReminderField::populateReminderItem(bool newEntry) { + AgendaAlarm reminder; + bool pastEvent = false; + + // Set reference date to start date or repeat until date accordingly to + // decide whether its a past event or not. + QDate referenceDate; + if (!mCalenEditor->editedEntry()->isRepeating() || + (mCalenEditor->isEditRangeThisOnly())) { + referenceDate = mCalenEditor->editedEntry()->startTime().date(); + } else { + referenceDate = mCalenEditor->editedEntry()->repeatRule().until().date(); + } + + if ((referenceDate < QDate::currentDate()) || + (referenceDate == QDate::currentDate() + && (mCalenEditor->editedEntry()->startTime().time() < + QTime::currentTime()))) { + pastEvent = true; + } + + if (mCalenEditor->isAllDayEvent()) { + updateReminderChoicesForAllDay(referenceDate); + } else { + setReminderChoices(); + } // Set the default reminder value to 15 minutes if (newEntry) { - mReminderItem->setContentWidgetData("currentIndex", 3); - // Save the reminder alarm for the entry - AgendaAlarm reminder; - reminder.setTimeOffset(mReminderHash.value(3)); - reminder.setAlarmSoundName(QString(" ")); - // Set the reminder to the entry as well as original entry. - mCalenEditor->editedEntry()->setAlarm(reminder); - mCalenEditor->originalEntry()->setAlarm(reminder); + if (!pastEvent) { + mReminderItem->setContentWidgetData("currentIndex", 2); + // Save the reminder alarm for the entry + reminder.setTimeOffset(mReminderHash.value(2)); + reminder.setAlarmSoundName(QString(" ")); + // Set the reminder to the entry as well as original entry. + mCalenEditor->editedEntry()->setAlarm(reminder); + mCalenEditor->originalEntry()->setAlarm(reminder); + } else { + mReminderItem->setContentWidgetData("currentIndex", 0); + mReminderItem->setEnabled(false); + } } else { + // If the alarm is not null, + // Check if all day event or not and then set the choices accordingly. if (mCalenEditor->editedEntry()->alarm().isNull()) { // Alarm is set off mReminderItem->setContentWidgetData("currentIndex", 0); - } else { + if(mReminderTimeAdded) { + removeReminderTimeField(); + } + } else if (mCalenEditor->editedEntry()->type() + != AgendaEntry::TypeEvent) { // Get the reminder offset value. - int reminderOffset = mCalenEditor->editedEntry()->alarm().timeOffset(); + int reminderOffset = + mCalenEditor->editedEntry()->alarm().timeOffset(); // Get the index value for the reminder combo box from the hash // table. int index = mReminderHash.key(reminderOffset); mReminderItem->setContentWidgetData("currentIndex", index); + } else { + // Insert reminder time field and display entry's reminder time. + // If past then disable the field. + if (!mReminderTimeAdded) { + insertReminderTimeField(); + if (pastEvent) { + mCustomReminderTimeItem->setEnabled(false); + } + } + QStringList reminderChoicesForAllDay; + reminderChoicesForAllDay << hbTrId("txt_calendar_setlabel_reminder_val_off") + << hbTrId("txt_calendar_setlabel_reminder_val_on_event_day") + << hbTrId("txt_calendar_setlabel_reminder_val_1_day_before") + << hbTrId("txt_calendar_setlabel_reminder_val_2_days_before"); + mReminderItem->setContentWidgetData(QString("items"), + reminderChoicesForAllDay); + QTime referenceTime(0, 0, 0); + // Set the appropriate reminder depending on the value of time offset. + reminder = mCalenEditor->editedEntry()->alarm(); + int offsetInMins = reminder.timeOffset(); + if (offsetInMins < 0 || offsetInMins == 0) { + mReminderItem->setContentWidgetData("currentIndex", 1); + mReminderTimeForAllDay = referenceTime.addSecs(-(offsetInMins + * 60)); + } else if (offsetInMins < numberOfMinutesInADay) { + mReminderItem->setContentWidgetData("currentIndex", 2); + mReminderTimeForAllDay = referenceTime.addSecs(-(offsetInMins + * 60)); + } else { + mReminderItem->setContentWidgetData("currentIndex", 3); + offsetInMins %= (24 * 60); + mReminderTimeForAllDay = referenceTime.addSecs(-(offsetInMins + * 60)); + } + setDisplayTime(); + } + if (pastEvent) { + mReminderItem->setEnabled(false); } } mEditorForm->addConnection(mReminderItem, SIGNAL(currentIndexChanged(int)), this, SLOT(handleReminderIndexChanged(int))); - } /*! @@ -146,21 +235,64 @@ if (!mCalenEditor->editedEntry()->alarm().isNull()) { reminder = mCalenEditor->editedEntry()->alarm(); } - // If value for the index in hash table is 0 i.e reminder is "OFF", - // then dont do anything only set the default constructed reminder to - // the entry which is Null. - if (mReminderHash.value(index)) { - // If not zero then set the reminder offset - // value to the entry. - reminder.setTimeOffset(mReminderHash.value(index)); - reminder.setAlarmSoundName(QString(" ")); + // Check whether all day event or not and store appropriately. + if (!mCalenEditor->isAllDayEvent()) { + // If value for the index in hash table is -1 i.e reminder is "OFF", + // then set the default constructed reminder to + // the entry which is Null. + if (mReminderHash.value(index) < 0) { + // Construct the default alarm which is NULL + reminder = AgendaAlarm(); + } else { + // If not zero then set the reminder offset + // value to the entry. + reminder.setTimeOffset(mReminderHash.value(index)); + reminder.setAlarmSoundName(QString(" ")); + } } else { - // Construct the default alarm which is NULL - reminder = AgendaAlarm(); + QDateTime reminderDateTimeForAllDay; + QDateTime + startDateTimeForAllDay( + mCalenEditor->editedEntry()->startTime().date(), + QTime(0, 0, 0)); + if (mReminderItem->contentWidgetData("currentIndex") == 0) { + reminder = AgendaAlarm(); + mCustomReminderTimeItem->setEnabled(false); + } else { + int offset = 0; + if (mReminderItem->contentWidgetData("currentIndex") == 2) { + offset = 1; + } else if (mReminderItem->contentWidgetData("currentIndex") == 3) { + offset = 2; + } + if(!mReminderTimeAdded) { + insertReminderTimeField() +; } + // If on same day as that of the event then check if time has been + // changed , if changed retain that else set default time. + if (offset == 0) { + if(mReminderTimeForAllDay == QTime(18, 0, 0, 0)) { + mReminderTimeForAllDay.setHMS(8, 0, 0); + setDisplayTime(); + } + } + reminderDateTimeForAllDay.setDate( + mCalenEditor->editedEntry()->startTime().date().addDays( + -offset)); + reminderDateTimeForAllDay.setTime(mReminderTimeForAllDay); + int seconds = + reminderDateTimeForAllDay.secsTo(startDateTimeForAllDay); + int timeOffest = seconds / 60; + mCustomReminderTimeItem->setEnabled(true); + reminder.setTimeOffset(timeOffest); + reminder.setAlarmSoundName(QString(" ")); + } } // Set the reminder to the entry. mCalenEditor->editedEntry()->setAlarm(reminder); - mCalenEditor->addDiscardAction(); + if(!mCalenEditor->isNewEntry()) { + mCalenEditor->addDiscardAction(); + } } /*! @@ -171,4 +303,238 @@ { return mCalenEditorModel->indexFromItem(mReminderItem); } + +/*! + Set reminder off. + */ +void CalenEditorReminderField::setReminderOff() +{ + // Create the remindar choices + QStringList reminderChoices; + reminderChoices << hbTrId("txt_calendar_setlabel_reminder_val_off"); + mReminderItem->setContentWidgetData(QString("items"), reminderChoices); + mReminderItem->setEnabled(false); +} + +/*! + Set the default alarm for a new all day event. + */ +void CalenEditorReminderField::setDefaultAlarmForAllDay() +{ + // Set default alarm if its a new entry. + if (mCalenEditor->isNewEntry()) { + AgendaAlarm reminder; + QDate defaultDate + (mCalenEditor->editedEntry()->startTime().date().addDays(-1)); + // Set default time. + mReminderTimeForAllDay.setHMS(18, 0, 0, 0); + setDisplayTime(); + QDateTime startDateTimeForAllDay( + mCalenEditor->editedEntry()->startTime().date(), QTime(0, 0)); + QDateTime defaultReminderDateTimeForAllDay + (defaultDate, mReminderTimeForAllDay); + int offsetInSecs = + defaultReminderDateTimeForAllDay.secsTo(startDateTimeForAllDay); + int offsetInMins = offsetInSecs/60; + reminder.setTimeOffset(offsetInMins); + reminder.setAlarmSoundName(QString(" ")); + // Set the reminder to the entry as well as original entry. + mCalenEditor->editedEntry()->setAlarm(reminder); + mCalenEditor->originalEntry()->setAlarm(reminder); + } +} + +/*! + Updates the reminder choices for an all day event. + \param referenceDate to indicate past or not. + */ +void CalenEditorReminderField::updateReminderChoicesForAllDay(QDate referenceDate) +{ + if (!mReminderTimeAdded){ + insertReminderTimeField(); + } + QStringList reminderChoicesForAllDay; + QDate tomorrow = QDate::currentDate().addDays(1); + QDate theDayAfterTomorrow = QDate::currentDate().addDays(2); + + if (referenceDate < QDate::currentDate() || + referenceDate == QDate::currentDate()) { + // Set reminder off for past event. + reminderChoicesForAllDay << hbTrId("txt_calendar_setlabel_reminder_val_off"); + mReminderItem->setContentWidgetData(QString("items"), + reminderChoicesForAllDay); + mReminderItem->setEnabled(false); + removeReminderTimeField(); + } else if (theDayAfterTomorrow < referenceDate || + theDayAfterTomorrow == referenceDate) { + reminderChoicesForAllDay + << hbTrId("txt_calendar_setlabel_reminder_val_off") + << hbTrId("txt_calendar_setlabel_reminder_val_on_event_day") + << hbTrId("txt_calendar_setlabel_reminder_val_1_day_before") + << hbTrId("txt_calendar_setlabel_reminder_val_2_days_before"); + mReminderItem->setEnabled(true); + mCustomReminderTimeItem->setEnabled(true); + } else { + reminderChoicesForAllDay + << hbTrId("txt_calendar_setlabel_reminder_val_off") + << hbTrId("txt_calendar_setlabel_reminder_val_on_event_day") + << hbTrId("txt_calendar_setlabel_reminder_val_1_day_before"); + mReminderItem->setEnabled(true); + mCustomReminderTimeItem->setEnabled(true); + } + if (mReminderItem->isEnabled()) { + mReminderItem->setContentWidgetData(QString("items"), + reminderChoicesForAllDay); + } +} + +/*! + Insert the reminder time field for an all day event. + */ +void CalenEditorReminderField::insertReminderTimeField() +{ + HbDataFormModelItem::DataItemType itemType = + static_cast (ReminderTimeOffset); + + // If all day item is not added then insert at one level before. + int index = CalenEditorPrivate::ReminderTimeForAllDayItem; + if(!mCalenEditor->isAllDayFieldAdded()) { + index = CalenEditorPrivate::ReminderTimeForAllDayItem - 1; + } + mCustomReminderTimeItem = mCalenEditorModel->insertDataFormItem( + index, + itemType, + QString(hbTrId("txt_calendar_setlabel_reminder_time")), + mCalenEditorModel->invisibleRootItem()); + if (currentReminderIndex() != 1){ + mReminderTimeForAllDay.setHMS(18,0,0,0); + } else { + mReminderTimeForAllDay.setHMS(8,0,0,0); + } + + mEditorForm->addConnection(mCustomReminderTimeItem, SIGNAL(clicked()), + this, SLOT(launchReminderTimePicker())); + setDisplayTime(); + mReminderTimeAdded = true; +} + +/*! + Set the reminder time selected by the user. + */ +void CalenEditorReminderField::setDisplayTime() +{ + HbExtendedLocale locale = HbExtendedLocale::system(); + QString timeString = locale.format( + mReminderTimeForAllDay, + r_qtn_time_usual_with_zero); + mCustomReminderTimeItem->setContentWidgetData("text", timeString); +} + +/*! + Remove the reminder time field if its not an all day event. + */ +void CalenEditorReminderField::removeReminderTimeField() +{ + mReminderTimeAdded = false; + if (mCustomReminderTimeItem) { + QModelIndex reminderIndex = + mCalenEditorModel->indexFromItem(mCustomReminderTimeItem); + mCalenEditorModel->removeItem( + mCalenEditorModel->index( + reminderIndex.row(), 0)); + mCustomReminderTimeItem = NULL; + } +} + +/*! + Launches time picker to select time. + */ +void CalenEditorReminderField::launchReminderTimePicker() +{ + mTimePicker = new HbDateTimePicker(mReminderTimeForAllDay); + mTimePicker->setTime(mReminderTimeForAllDay); + HbDialog *popUp = new HbDialog(); + popUp->setDismissPolicy(HbDialog::NoDismiss); + popUp->setTimeout(HbDialog::NoTimeout); + popUp->setContentWidget(mTimePicker); + popUp->setHeadingWidget( new HbLabel( + hbTrId("Reminder Time"))); + HbAction *okAction = new HbAction(hbTrId("txt_common_button_ok")); + popUp->addAction(okAction); + connect(okAction, SIGNAL(triggered()), this, SLOT(setReminderTimeForAllDay())); + connect(okAction, SIGNAL(triggered()), popUp, SLOT(close())); + popUp->addAction(new HbAction(hbTrId("txt_common_button_cancel"), + popUp)); + popUp->open(); +} + +/*! + Set the reminder time chosen. + */ +void CalenEditorReminderField::setReminderTimeForAllDay() +{ + mReminderTimeForAllDay = mTimePicker->time(); + if (mReminderTimeForAllDay.isValid()) { + // Change the time displayed to that selected by the user. + setDisplayTime(); + handleReminderIndexChanged(currentReminderIndex()); + } +} + +/*! + Checks if reminder field is enabled or not. + */ +bool CalenEditorReminderField::isReminderFieldEnabled() +{ + return mReminderItem->isEnabled(); +} + +/*! + Returns the number of items present in the reminder option. + */ +int CalenEditorReminderField::reminderItemsCount() +{ + QVariant strings = mReminderItem->contentWidgetData("items"); + QStringList stringList(strings.toStringList()); + int count = stringList.count(); + return count; +} + +/*! + Returns the current chosen index. + */ +int CalenEditorReminderField::currentReminderIndex() +{ + QVariant countVariant = mReminderItem->contentWidgetData("currentIndex"); + int index = countVariant.toInt(); + return index; +} + +/*! + Sets the chosen index as current index. + /param index indicates the idex value to be set. + */ +void CalenEditorReminderField::setCurrentIndex(int index) +{ + mReminderItem->setContentWidgetData("currentIndex", index); +} + +/*! + Disables the reminder time field. + */ +void CalenEditorReminderField::disableReminderTimeField() +{ + if (mReminderTimeAdded) { + mCustomReminderTimeItem->setEnabled(false); + } +} + +/*! + Checks if reminder time field is added or not. + */ +bool CalenEditorReminderField::isReminderTimeForAllDayAdded() +{ + return mReminderTimeAdded; +} + // End of file --Don't remove this.