--- a/calendarui/caleneditor/src/caleneditorrepeatfield.cpp Tue Jul 06 14:14:56 2010 +0300
+++ b/calendarui/caleneditor/src/caleneditorrepeatfield.cpp Wed Aug 18 09:47:38 2010 +0300
@@ -32,6 +32,12 @@
// User Included
#include "caleneditorrepeatfield.h"
#include "caleneditorcustomitem.h"
+#include "calendateutils.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "caleneditorrepeatfieldTraces.h"
+#endif
+
// Constants
const int userRole = Qt::UserRole + 100;
@@ -40,6 +46,39 @@
\class CalenEditorRepeatField
*/
/*!
+ \enum CalenEditorRepeatField::RepeatTypes
+ This enum defines the different repeat types of an entry
+ */
+/*!
+ \var CalenEditorRepeatField::RepeatTypes CalenEditorRepeatField::RepeatOnce
+ No repeating type.
+ */
+/*!
+ \var CalenEditorRepeatField::RepeatTypes CalenEditorRepeatField::RepeatDaily
+ Daily repeating type.
+ */
+/*!
+ \var CalenEditorRepeatField::RepeatTypes CalenEditorRepeatField::RepeatWorkdays
+ Workdays repeating type.
+ */
+/*!
+ \var CalenEditorRepeatField::RepeatTypes CalenEditorRepeatField::RepeatWeekly
+ Weekly repeating type.
+ */
+/*!
+ \var CalenEditorRepeatField::RepeatTypes CalenEditorRepeatField::RepeatBiWeekly
+ Fortnightly repeating type.
+ */
+/*!
+ \var CalenEditorRepeatField::RepeatTypes CalenEditorRepeatField::RepeatMonthly
+ Monthly repeating type.
+ */
+/*!
+ \var CalenEditorRepeatField::RepeatTypes CalenEditorRepeatField::RepeatYearly
+ Yearly repeating type.
+ */
+
+/*!
Constructor.
\param parent QObject pointer
@@ -53,36 +92,40 @@
mCalenEditor(calenEditor),
mEditorForm(form),
mCalenEditorModel(model),
- mRepeatItem(NULL),
- mRepeatComboBox(NULL),
- mCustomRepeatUntilItem(NULL),
+ mRepeatItem(0),
+ mRepeatComboBox(0),
+ mCustomRepeatUntilItem(0),
+ mRepeatRoleValue(0),
mIsBiWeekly(false),
mIsWorkdays(false),
mRepeatUntilItemAdded(false)
{
+ OstTraceFunctionEntry0( CALENEDITORREPEATFIELD_CALENEDITORREPEATFIELD_ENTRY );
if (!mCalenEditor->editedEntry()->repeatRule().isNull()) {
mRepeatRuleType = mCalenEditor->editedEntry()->repeatRule().type();
mRepeatUntilDate = mCalenEditor->editedEntry()->repeatRule().until().date();
- }
-
- mRepeatItem = new HbDataFormModelItem();
- mRepeatItem->setType(HbDataFormModelItem::ComboBoxItem);
- mRepeatItem->setData(HbDataFormModelItem::LabelRole,
- hbTrId("txt_calendar_setlabel_repeat"));
+ }
+
+ mRepeatItem = new HbDataFormModelItem();
+ mRepeatItem->setType(HbDataFormModelItem::ComboBoxItem);
+ mRepeatItem->setData(HbDataFormModelItem::LabelRole,
+ hbTrId("txt_calendar_setlabel_repeat"));
- // Create the repeat choices
- QStringList repeatChoices;
- repeatChoices << hbTrId("txt_calendar_setlabel_repeat_val_only_once")
- << hbTrId("txt_calendar_setlabel_repeat_val_daily")
- << hbTrId("txt_calendar_setlabel_repeat_val_workdays")
- << hbTrId("txt_calendar_setlabel_repeat_val_weekly")
- << hbTrId("txt_calendar_setlabel_repeat_val_fortnightly")
- << hbTrId("txt_calendar_setlabel_repeat_val_monthly")
- << hbTrId("txt_calendar_setlabel_repeat_val_yearly");
+ // Create the repeat choices
+ QStringList repeatChoices;
+ repeatChoices << hbTrId("txt_calendar_setlabel_repeat_val_only_once")
+ << hbTrId("txt_calendar_setlabel_repeat_val_daily")
+ << hbTrId("txt_calendar_setlabel_repeat_val_workdays")
+ << hbTrId("txt_calendar_setlabel_repeat_val_weekly")
+ << hbTrId("txt_calendar_setlabel_repeat_val_fortnightly")
+ << hbTrId("txt_calendar_setlabel_repeat_val_monthly")
+ << hbTrId("txt_calendar_setlabel_repeat_val_yearly");
- mRepeatItem->setContentWidgetData(QString("items"), repeatChoices);
+ mRepeatItem->setContentWidgetData("items", repeatChoices);
+ mRepeatItem->setContentWidgetData("objectName", "repeatItem");
mCalenEditorModel->appendDataFormItem( mRepeatItem,
mCalenEditorModel->invisibleRootItem());
+ OstTraceFunctionExit0( CALENEDITORREPEATFIELD_CALENEDITORREPEATFIELD_EXIT );
}
/*!
@@ -90,7 +133,9 @@
*/
CalenEditorRepeatField::~CalenEditorRepeatField()
{
+ OstTraceFunctionEntry0( DUP1_CALENEDITORREPEATFIELD_CALENEDITORREPEATFIELD_ENTRY );
// Nothing Yet
+ OstTraceFunctionExit0( DUP1_CALENEDITORREPEATFIELD_CALENEDITORREPEATFIELD_EXIT );
}
/*!
@@ -98,9 +143,11 @@
*/
void CalenEditorRepeatField::addItemToModel()
{
+ OstTraceFunctionEntry0( CALENEDITORREPEATFIELD_ADDITEMTOMODEL_ENTRY );
// Add reminder to the model
mCalenEditorModel->appendDataFormItem( mRepeatItem,
mCalenEditorModel->invisibleRootItem());
+ OstTraceFunctionExit0( CALENEDITORREPEATFIELD_ADDITEMTOMODEL_EXIT );
}
/*!
@@ -108,7 +155,9 @@
*/
void CalenEditorRepeatField::removeItemFromModel()
{
+ OstTraceFunctionEntry0( CALENEDITORREPEATFIELD_REMOVEITEMFROMMODEL_ENTRY );
mCalenEditorModel->removeItem(modelIndex());
+ OstTraceFunctionExit0( CALENEDITORREPEATFIELD_REMOVEITEMFROMMODEL_EXIT );
}
/*!
@@ -117,6 +166,7 @@
*/
void CalenEditorRepeatField::populateRepeatItem(int index)
{
+ OstTraceFunctionEntry0( CALENEDITORREPEATFIELD_POPULATEREPEATITEM_ENTRY );
HbDataFormViewItem
*item =
qobject_cast<HbDataFormViewItem *> (
@@ -142,31 +192,31 @@
if (mCalenEditor->editedEntry()->isRepeating()) {
switch (mCalenEditor->editedEntry()->repeatRule().type()) {
case AgendaRepeatRule::DailyRule: {
- mRepeatComboBox->setCurrentIndex(1);
+ mRepeatComboBox->setCurrentIndex(DailyRole);
}
break;
case AgendaRepeatRule::WeeklyRule: {
bool isWorkdays = AgendaUtil::isWorkdaysRepeatingEntry(
mCalenEditor->editedEntry()->repeatRule());
if (isWorkdays) {
- mRepeatComboBox->setCurrentIndex(2);
+ mRepeatComboBox->setCurrentIndex(WorkdaysRole);
mIsWorkdays = true;
} else {
if (mCalenEditor->editedEntry()->repeatRule().interval() == 1) {
- mRepeatComboBox->setCurrentIndex(3);
+ mRepeatComboBox->setCurrentIndex(WeeklyRole);
} else {
- mRepeatComboBox->setCurrentIndex(4);
+ mRepeatComboBox->setCurrentIndex(BiWeeklyRole);
mIsBiWeekly = true;
}
}
}
break;
case AgendaRepeatRule::MonthlyRule: {
- mRepeatComboBox->setCurrentIndex(5);
+ mRepeatComboBox->setCurrentIndex(MonthlyRole);
}
break;
case AgendaRepeatRule::YearlyRule: {
- mRepeatComboBox->setCurrentIndex(6);
+ mRepeatComboBox->setCurrentIndex(YearlyRole);
}
break;
default:
@@ -181,11 +231,32 @@
AgendaRepeatRule(
AgendaRepeatRule::InvalidRule));
}
-
+ // Connect the slot once the updation of mRepeatComboBox is done
+ connect(mRepeatComboBox, SIGNAL(currentIndexChanged(int)), this,
+ SLOT(handleRepeatIndexChanged(int)));
// Update the repeat choices depending upon the duration
updateRepeatChoices();
- connect(mRepeatComboBox, SIGNAL(currentIndexChanged(int)), this,
- SLOT(handleRepeatIndexChanged(int)));
+ OstTraceFunctionExit0( CALENEDITORREPEATFIELD_POPULATEREPEATITEM_EXIT );
+}
+
+/*!
+ Removes the repeat until item from the model
+ and removed the connection for date picker launch too.
+ */
+void CalenEditorRepeatField::removeRepeatUntilItem()
+{
+ mRepeatRuleType = AgendaRepeatRule::InvalidRule;
+ if (mRepeatUntilItemAdded) {
+ mEditorForm->removeConnection(mCustomRepeatUntilItem, SIGNAL(clicked()),
+ this, SLOT(launchRepeatUntilDatePicker()));
+ QModelIndex repeatIndex =
+ mCalenEditorModel->indexFromItem(mRepeatItem);
+ mCalenEditorModel->removeItem(
+ mCalenEditorModel->index(
+ repeatIndex.row()+ 1, 0));
+ mRepeatUntilItemAdded = false;
+ mCustomRepeatUntilItem = 0;
+ }
}
/*!
@@ -195,6 +266,7 @@
*/
void CalenEditorRepeatField::handleRepeatIndexChanged(int index)
{
+ OstTraceFunctionEntry0( CALENEDITORREPEATFIELD_HANDLEREPEATINDEXCHANGED_ENTRY );
mIsBiWeekly = false;
mIsWorkdays = false;
@@ -202,12 +274,33 @@
// Get the user role we have set for this index
QVariant role = mRepeatComboBox->itemData(index, userRole);
int value = role.toInt();
- switch (value) {
- case 1: {
+
+ // Boolean to check if the repeating property of the entry is changed.
+ // based on the value and mRepeatUntilItemAdded
+ // ie. From repeating to non repeating OR vice versa OR No change
+ bool repeatPropertyChange = false;
+ if (value > 0 && value <= 6 && !mRepeatUntilItemAdded) {
+ // Non repeating to repeating
+ repeatPropertyChange = true;
+ }else if(mRepeatUntilItemAdded && value == 0) {
+ // Repeating to non repeating
+ repeatPropertyChange = true;
+ }else {
+ // No change in repeat value
+ repeatPropertyChange = false;
+ }
+ QDate repeatUntilDate = mRepeatUntilDate;
+
+ if (value != mRepeatRoleValue)
+ {
+ mRepeatRoleValue = value;
+ switch (value) {
+ case DailyRole: {
if (!mRepeatUntilItemAdded) {
insertRepeatUntilItem();
}
if (mCustomRepeatUntilItem) {
+ // Show default repeat until date till one year for daily rule
mRepeatUntilDate = mCalenEditor->editedEntry()->startTime().date().addYears(1);
mCustomRepeatUntilItem->setContentWidgetData( "text",
locale.format( mRepeatUntilDate,
@@ -216,11 +309,12 @@
mRepeatRuleType = AgendaRepeatRule::DailyRule;
}
break;
- case 2: {
+ case WorkdaysRole: {
if (!mRepeatUntilItemAdded) {
insertRepeatUntilItem();
}
if (mCustomRepeatUntilItem) {
+ // Show default repeat until date till one year for workdays rule
mRepeatUntilDate = mCalenEditor->editedEntry()->startTime().date().addYears(1);
mCustomRepeatUntilItem->setContentWidgetData( "text",
locale.format( mRepeatUntilDate,
@@ -230,25 +324,26 @@
mIsWorkdays = true;
}
break;
- case 3: {
+ case WeeklyRole: {
if (!mRepeatUntilItemAdded) {
insertRepeatUntilItem();
}
if (mCustomRepeatUntilItem) {
+ // Show default repeat until date till one year for weekly rule
mRepeatUntilDate = mCalenEditor->editedEntry()->startTime().date().addYears(1);
mCustomRepeatUntilItem->setContentWidgetData( "text",
locale.format( mRepeatUntilDate,
r_qtn_date_usual_with_zero));
-
}
mRepeatRuleType = AgendaRepeatRule::WeeklyRule;
}
break;
- case 4: {
+ case BiWeeklyRole: {
if (!mRepeatUntilItemAdded) {
insertRepeatUntilItem();
}
if (mCustomRepeatUntilItem) {
+ // Show default repeat until date till one year for bi-weekly rule
mRepeatUntilDate = mCalenEditor->editedEntry()->startTime().date().addYears(1);
mCustomRepeatUntilItem->setContentWidgetData( "text",
locale.format( mRepeatUntilDate,
@@ -258,12 +353,13 @@
mIsBiWeekly = true;
}
break;
- case 5: {
+ case MonthlyRole: {
if (!mRepeatUntilItemAdded) {
insertRepeatUntilItem();
}
if (mCustomRepeatUntilItem) {
- mRepeatUntilDate = mCalenEditor->editedEntry()->startTime().date().addYears(5);
+ // Show default repeat until date till one year for monthly rule
+ mRepeatUntilDate = mCalenEditor->editedEntry()->startTime().date().addYears(1);
mCustomRepeatUntilItem->setContentWidgetData( "text",
locale.format( mRepeatUntilDate,
r_qtn_date_usual_with_zero));
@@ -271,11 +367,12 @@
mRepeatRuleType = AgendaRepeatRule::MonthlyRule;
}
break;
- case 6: {
+ case YearlyRole: {
if (!mRepeatUntilItemAdded) {
insertRepeatUntilItem();
}
if (mCustomRepeatUntilItem) {
+ // Show default repeat until date till ten years for yearly rule
mRepeatUntilDate = mCalenEditor->editedEntry()->startTime().date().addYears(10);
mCustomRepeatUntilItem->setContentWidgetData( "text",
locale.format( mRepeatUntilDate,
@@ -285,23 +382,20 @@
}
break;
default: {
- mRepeatRuleType = AgendaRepeatRule::InvalidRule;
- if (mRepeatUntilItemAdded) {
- QModelIndex repeatIndex =
- mCalenEditorModel->indexFromItem(mRepeatItem);
- mCalenEditorModel->removeItem(
- mCalenEditorModel->index(
- repeatIndex.row()+ 1, 0));
- mRepeatUntilItemAdded = false;
- mCustomRepeatUntilItem = NULL;
- }
+ removeRepeatUntilItem();
}
break;
}
+ }
if(!mCalenEditor->isNewEntry()) {
mCalenEditor->addDiscardAction();
}
- mCalenEditor->updateReminderChoices();
+ // Depending on repeatPropertyChange value and the repeatuntil date change
+ // the reminder choices are updated
+ if(repeatPropertyChange || repeatUntilDate != mRepeatUntilDate) {
+ mCalenEditor->updateReminderChoices();
+ }
+ OstTraceFunctionExit0( CALENEDITORREPEATFIELD_HANDLEREPEATINDEXCHANGED_EXIT );
}
/*!
@@ -310,6 +404,7 @@
*/
QModelIndex CalenEditorRepeatField::modelIndex()
{
+ OstTraceFunctionEntry0( CALENEDITORREPEATFIELD_MODELINDEX_ENTRY );
return mCalenEditorModel->indexFromItem(mRepeatItem);
}
@@ -318,6 +413,7 @@
*/
void CalenEditorRepeatField::insertRepeatUntilItem()
{
+ OstTraceFunctionEntry0( CALENEDITORREPEATFIELD_INSERTREPEATUNTILITEM_ENTRY );
HbDataFormModelItem::DataItemType itemType =
static_cast<HbDataFormModelItem::DataItemType> (RepeatUntilOffset);
@@ -343,7 +439,9 @@
r_qtn_date_usual_with_zero);
mCustomRepeatUntilItem->setContentWidgetData("text", dateString);
}
- //TODO: Scroll to functionality has to be implemented
+ //Scroll to repeat until item added
+ mEditorForm->scrollTo(mCalenEditorModel->index(index, 0), HbAbstractItemView::EnsureVisible);
+ OstTraceFunctionExit0( CALENEDITORREPEATFIELD_INSERTREPEATUNTILITEM_EXIT );
}
/*!
@@ -352,6 +450,8 @@
*/
bool CalenEditorRepeatField::isRepeatUntilItemAdded()
{
+ OstTraceFunctionEntry0( CALENEDITORREPEATFIELD_ISREPEATUNTILITEMADDED_ENTRY );
+ OstTraceFunctionExit0( CALENEDITORREPEATFIELD_ISREPEATUNTILITEMADDED_EXIT );
return mRepeatUntilItemAdded;
}
@@ -360,6 +460,7 @@
*/
void CalenEditorRepeatField::launchRepeatUntilDatePicker()
{
+ OstTraceFunctionEntry0( CALENEDITORREPEATFIELD_LAUNCHREPEATUNTILDATEPICKER_ENTRY );
HbDialog *popUp = new HbDialog();
popUp->setDismissPolicy(HbDialog::NoDismiss);
popUp->setTimeout(HbDialog::NoTimeout);
@@ -368,13 +469,13 @@
popUp->setAttribute( Qt::WA_DeleteOnClose, true );
if (mDatePicker) {
- mDatePicker = NULL;
+ mDatePicker = 0;
}
if (mRepeatRuleType == AgendaRepeatRule::DailyRule) {
QDate minDate = mCalenEditor->editedEntry()->endTime().date().addDays(1);
mDatePicker = new HbDateTimePicker(mRepeatUntilDate, popUp);
mDatePicker->setMinimumDate(minDate);
- mDatePicker->setMaximumDate(QDate(31, 12, 2100));
+ mDatePicker->setMaximumDate(CalenDateUtils::maxTime().date());
mDatePicker->setDate(mRepeatUntilDate);
} else if (mRepeatRuleType == AgendaRepeatRule::WeeklyRule) {
QDate minDate;
@@ -385,19 +486,19 @@
}
mDatePicker = new HbDateTimePicker(mRepeatUntilDate, popUp);
mDatePicker->setMinimumDate(minDate);
- mDatePicker->setMaximumDate(QDate(31, 12, 2100));
+ mDatePicker->setMaximumDate(CalenDateUtils::maxTime().date());
mDatePicker->setDate(mRepeatUntilDate);
} else if (mRepeatRuleType == AgendaRepeatRule::MonthlyRule) {
QDate minDate = mCalenEditor->editedEntry()->endTime().date().addMonths(1);
mDatePicker = new HbDateTimePicker(mRepeatUntilDate, popUp);
mDatePicker->setMinimumDate(minDate);
- mDatePicker->setMaximumDate(QDate(31, 12, 2100));
+ mDatePicker->setMaximumDate(CalenDateUtils::maxTime().date());
mDatePicker->setDate(mRepeatUntilDate);
} else if (mRepeatRuleType == AgendaRepeatRule::YearlyRule) {
QDate minDate = mCalenEditor->editedEntry()->endTime().date().addYears(1);
mDatePicker = new HbDateTimePicker(mRepeatUntilDate, popUp);
mDatePicker->setMinimumDate(minDate);
- mDatePicker->setMaximumDate(QDate(31, 12, 2100));
+ mDatePicker->setMaximumDate(CalenDateUtils::maxTime().date());
mDatePicker->setDate(mRepeatUntilDate);
}
popUp->setContentWidget(mDatePicker);
@@ -407,6 +508,7 @@
connect(okAction, SIGNAL(triggered()), this, SLOT(setRepeatUntilDate()));
popUp->addAction(new HbAction(hbTrId("txt_common_button_cancel"), popUp));
popUp->open();
+ OstTraceFunctionExit0( CALENEDITORREPEATFIELD_LAUNCHREPEATUNTILDATEPICKER_EXIT );
}
/*!
@@ -414,6 +516,7 @@
*/
void CalenEditorRepeatField::setRepeatUntilDate()
{
+ OstTraceFunctionEntry0( CALENEDITORREPEATFIELD_SETREPEATUNTILDATE_ENTRY );
mRepeatUntilDate = mDatePicker->date();
if (mRepeatUntilDate.isValid()) {
HbExtendedLocale locale = HbExtendedLocale::system();
@@ -422,6 +525,7 @@
mCustomRepeatUntilItem->setContentWidgetData("text", dateString);
}
mCalenEditor->updateReminderChoices();
+ OstTraceFunctionExit0( CALENEDITORREPEATFIELD_SETREPEATUNTILDATE_EXIT );
}
/*!
@@ -429,6 +533,8 @@
*/
QDate CalenEditorRepeatField::repeatUntilDate()
{
+ OstTraceFunctionEntry0( CALENEDITORREPEATFIELD_REPEATUNTILDATE_ENTRY );
+ OstTraceFunctionExit0( CALENEDITORREPEATFIELD_REPEATUNTILDATE_EXIT );
return mRepeatUntilDate;
}
@@ -437,14 +543,25 @@
*/
void CalenEditorRepeatField::updateRepeatChoices()
{
+ OstTraceFunctionEntry0( CALENEDITORREPEATFIELD_UPDATEREPEATCHOICES_ENTRY );
if (!mRepeatComboBox) {
+ OstTraceFunctionExit0( CALENEDITORREPEATFIELD_UPDATEREPEATCHOICES_EXIT );
return;
}
+ // Disconnect the slot and connect it back again at end to avoid unnecessary
+ // calls to handleRepeatIndexChanged slot. Or else the slot gets called
+ // when we add all of items to the repeat combobox.
+ disconnect(mRepeatComboBox, SIGNAL(currentIndexChanged(int)), this,
+ SLOT(handleRepeatIndexChanged(int)));
// Clear all the choices and add it again. If we dont do it
// as user would have changed the end times many times and we would have
// deleted repeat options depending upon that
// Get the current choice
int choice = mRepeatComboBox->currentIndex();
+
+ QVariant role = mRepeatComboBox->itemData(choice, userRole);
+ mRepeatRoleValue = role.toInt();
+
int previousCount = mRepeatComboBox->count();
mRepeatComboBox->clear();
QStringList repeatChoices;
@@ -499,6 +616,8 @@
mRepeatComboBox->removeItem(RepeatWeekly);
mRepeatComboBox->removeItem(RepeatWorkdays);
mRepeatComboBox->removeItem(RepeatDaily);
+ //Remove the repeat until item too.
+ removeRepeatUntilItem();
} else if (mCalenEditor->editedEntry()->endTime()
>= (mCalenEditor->editedEntry()->startTime().addMonths(1))) {
isRemovedItem = true;
@@ -545,8 +664,13 @@
if (choice >= count) {
choice = count - 1;
}
+
+ //Connecting back the slot for repeat index change before setting index.
+ connect(mRepeatComboBox, SIGNAL(currentIndexChanged(int)), this,
+ SLOT(handleRepeatIndexChanged(int)));
// Set the previous user's choice
mRepeatComboBox->setCurrentIndex(choice);
+ OstTraceFunctionExit0( DUP1_CALENEDITORREPEATFIELD_UPDATEREPEATCHOICES_EXIT );
}
/*!
@@ -554,6 +678,7 @@
*/
void CalenEditorRepeatField::saveRepeatRule()
{
+ OstTraceFunctionEntry0( CALENEDITORREPEATFIELD_SAVEREPEATRULE_ENTRY );
// saves repeat type of entry.
if (mRepeatRuleType != AgendaRepeatRule::InvalidRule) {
AgendaRepeatRule repeatRule(mRepeatRuleType);
@@ -614,19 +739,18 @@
}
} else if (mRepeatRuleType == AgendaRepeatRule::MonthlyRule) {
QList<int> monthDays;
- //TODO :
int dayNoInMonth = mCalenEditor->editedEntry()->startTime().date().day();
monthDays.append(dayNoInMonth);
repeatRule.setByMonthDay(monthDays);
} else if (mRepeatRuleType == AgendaRepeatRule::YearlyRule) {
- //TODO : Add yearly rule.Check if required.
}
mCalenEditor->editedEntry()->setRepeatRule(repeatRule);
} else {
mCalenEditor->editedEntry()->setRepeatRule( AgendaRepeatRule(
AgendaRepeatRule::InvalidRule));
}
- // TODO: Need to update rDates here
+ // TODO: Need to update rDates here for 10.2 if required
+ OstTraceFunctionExit0( CALENEDITORREPEATFIELD_SAVEREPEATRULE_EXIT );
}
// End of file --Don't remove this.