calendarui/caleneditor/src/caleneditorreminderfield.cpp
changeset 45 b6db4fd4947b
parent 23 fd30d51f876b
child 51 0b38fc5b94c6
--- 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 <QDate>
+
 #include <hbdataformmodelitem.h>
 #include <hbdataformmodel.h>
 #include <hbdataform.h>
+#include <hbdatetimepicker.h>
+#include <hbextendedlocale.h>
+#include <hbi18ndef.h>
+#include <hbdialog.h>
+#include <hblabel.h>
+#include <hbaction.h>
 
 // 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<HbDataFormModelItem::DataItemType> (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.