# HG changeset patch # User hgs # Date 1277718722 -19800 # Node ID b6db4fd4947bfefe0e89f867ebca2a06303a0932 # Parent fd30d51f876b61e2db6cb2f2af4ace02d7a16684 201025 diff -r fd30d51f876b -r b6db4fd4947b agendainterface/agendautil/agendautil.pro --- a/agendainterface/agendautil/agendautil.pro Mon May 03 12:30:32 2010 +0300 +++ b/agendainterface/agendautil/agendautil.pro Mon Jun 28 15:22:02 2010 +0530 @@ -23,7 +23,6 @@ INCLUDEPATH += . \ ./inc \ ../inc -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE DEFINES += XQCALENDAR_LIBRARY @@ -31,11 +30,13 @@ LIBS += -lcalinterimapi \ -lcalenImp \ -lestor \ - -lefsrv + -lefsrv \ + -lcaleninterimutils2 TARGET.UID3 = 0x20029F7F TARGET.CAPABILITY = ALL -TCB TARGET.EPOCALLOWDLLDATA = 1 + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE } HEADERS += ../inc/agendautil.h \ diff -r fd30d51f876b -r b6db4fd4947b agendainterface/agendautil/bwins/agendainterfaceu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/agendainterface/agendautil/bwins/agendainterfaceu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,184 @@ +EXPORTS + ?minTime@AgendaUtil@@SA?AVQDateTime@@XZ @ 1 NONAME ; class QDateTime AgendaUtil::minTime(void) + ??4AgendaCategory@@QAEAAV0@ABV0@@Z @ 2 NONAME ; class AgendaCategory & AgendaCategory::operator=(class AgendaCategory const &) + ?addEntry@AgendaUtil@@QAEKABVAgendaEntry@@@Z @ 3 NONAME ; unsigned long AgendaUtil::addEntry(class AgendaEntry const &) + ??_EAgendaEntry@@UAE@I@Z @ 4 NONAME ; AgendaEntry::~AgendaEntry(unsigned int) + ??8AgendaEntry@@QBE_NABV0@@Z @ 5 NONAME ; bool AgendaEntry::operator==(class AgendaEntry const &) const + ??1AgendaAlarm@@QAE@XZ @ 6 NONAME ; AgendaAlarm::~AgendaAlarm(void) + ?setAlarm@AgendaEntry@@QAEXABVAgendaAlarm@@@Z @ 7 NONAME ; void AgendaEntry::setAlarm(class AgendaAlarm const &) + ?isNull@AgendaEntry@@QBE_NXZ @ 8 NONAME ; bool AgendaEntry::isNull(void) const + ?isNull@AgendaCategory@@QBE_NXZ @ 9 NONAME ; bool AgendaCategory::isNull(void) const + ??8AgendaRepeatRule@@QBE_NABV0@@Z @ 10 NONAME ; bool AgendaRepeatRule::operator==(class AgendaRepeatRule const &) const + ?entryUpdated@AgendaUtil@@IAEXK@Z @ 11 NONAME ; void AgendaUtil::entryUpdated(unsigned long) + ?alarmSoundName@AgendaAlarm@@QBE?AVQString@@XZ @ 12 NONAME ; class QString AgendaAlarm::alarmSoundName(void) const + ?alarm@AgendaEntry@@QBE?AVAgendaAlarm@@XZ @ 13 NONAME ; class AgendaAlarm AgendaEntry::alarm(void) const + ?responseRequested@AgendaAttendee@@QBE_NXZ @ 14 NONAME ; bool AgendaAttendee::responseRequested(void) const + ?startTime@AgendaEntry@@QBE?AVQDateTime@@XZ @ 15 NONAME ; class QDateTime AgendaEntry::startTime(void) const + ?geoValue@AgendaEntry@@QBE?AVAgendaGeoValue@@XZ @ 16 NONAME ; class AgendaGeoValue AgendaEntry::geoValue(void) const + ?getNextInstanceTimes@AgendaUtil@@QAEXAAVAgendaEntry@@AAVQDateTime@@1@Z @ 17 NONAME ; void AgendaUtil::getNextInstanceTimes(class AgendaEntry &, class QDateTime &, class QDateTime &) + ?exportAsvCalendar@AgendaUtil@@QAE_NABVQString@@J@Z @ 18 NONAME ; bool AgendaUtil::exportAsvCalendar(class QString const &, long) + ??_EAgendaAttendee@@UAE@I@Z @ 19 NONAME ; AgendaAttendee::~AgendaAttendee(unsigned int) + ??9AgendaAlarm@@QBE_NABV0@@Z @ 20 NONAME ; bool AgendaAlarm::operator!=(class AgendaAlarm const &) const + ?isNull@AgendaAlarm@@QBE_NXZ @ 21 NONAME ; bool AgendaAlarm::isNull(void) const + ?extendedCategoryName@AgendaCategory@@QBE?AVQString@@XZ @ 22 NONAME ; class QString AgendaCategory::extendedCategoryName(void) const + ?entryIds@AgendaUtil@@QAE?AV?$QList@K@@W4FilterFlags@1@@Z @ 23 NONAME ; class QList AgendaUtil::entryIds(enum AgendaUtil::FilterFlags) + ?isRepeating@AgendaEntry@@QAE_NXZ @ 24 NONAME ; bool AgendaEntry::isRepeating(void) + ?clearRepeatingProperties@AgendaUtil@@QAEXAAVAgendaEntry@@@Z @ 25 NONAME ; void AgendaUtil::clearRepeatingProperties(class AgendaEntry &) + ?deleteRepeatedEntry@AgendaUtil@@QAEXAAVAgendaEntry@@W4RecurrenceRange@1@@Z @ 26 NONAME ; void AgendaUtil::deleteRepeatedEntry(class AgendaEntry &, enum AgendaUtil::RecurrenceRange) + ?tr@AgendaUtil@@SA?AVQString@@PBD0H@Z @ 27 NONAME ; class QString AgendaUtil::tr(char const *, char const *, int) + ?description@AgendaEntry@@QBE?AVQString@@XZ @ 28 NONAME ; class QString AgendaEntry::description(void) const + ??0AgendaUtil@@QAE@PAVQObject@@@Z @ 29 NONAME ; AgendaUtil::AgendaUtil(class QObject *) + ?categories@AgendaEntry@@QAEAAV?$QList@VAgendaCategory@@@@XZ @ 30 NONAME ; class QList & AgendaEntry::categories(void) + ?entriesChanged@AgendaUtil@@IAEXV?$QList@K@@@Z @ 31 NONAME ; void AgendaUtil::entriesChanged(class QList) + ??0AgendaGeoValue@@QAE@XZ @ 32 NONAME ; AgendaGeoValue::AgendaGeoValue(void) + ?status@AgendaAttendee@@QBE?AW4StatusType@1@XZ @ 33 NONAME ; enum AgendaAttendee::StatusType AgendaAttendee::status(void) const + ?markDatesWithEvents@AgendaUtil@@QAEXVQDateTime@@0W4FilterFlags@1@AAV?$QList@VQDate@@@@@Z @ 34 NONAME ; void AgendaUtil::markDatesWithEvents(class QDateTime, class QDateTime, enum AgendaUtil::FilterFlags, class QList &) + ??9AgendaGeoValue@@QBE_NABV0@@Z @ 35 NONAME ; bool AgendaGeoValue::operator!=(class AgendaGeoValue const &) const + ??0AgendaAlarm@@QAE@XZ @ 36 NONAME ; AgendaAlarm::AgendaAlarm(void) + ?byMonth@AgendaRepeatRule@@QBE?AV?$QList@W4Month@AgendaRepeatRule@@@@XZ @ 37 NONAME ; class QList AgendaRepeatRule::byMonth(void) const + ?isNull@AgendaAttendee@@QBE_NXZ @ 38 NONAME ; bool AgendaAttendee::isNull(void) const + ?areNoEntriesInCalendar@AgendaUtil@@QAE_NXZ @ 39 NONAME ; bool AgendaUtil::areNoEntriesInCalendar(void) + ?clearGeoValue@AgendaEntry@@QBEXXZ @ 40 NONAME ; void AgendaEntry::clearGeoValue(void) const + ?setAddress@AgendaAttendee@@QAEXABVQString@@@Z @ 41 NONAME ; void AgendaAttendee::setAddress(class QString const &) + ?setRepeatRuleStart@AgendaRepeatRule@@QAEXABVQDateTime@@@Z @ 42 NONAME ; void AgendaRepeatRule::setRepeatRuleStart(class QDateTime const &) + ?trUtf8@AgendaUtil@@SA?AVQString@@PBD0H@Z @ 43 NONAME ; class QString AgendaUtil::trUtf8(char const *, char const *, int) + ?setLastModifiedDateTime@AgendaEntry@@QAEXABVQDateTime@@@Z @ 44 NONAME ; void AgendaEntry::setLastModifiedDateTime(class QDateTime const &) + ??0AgendaAlarm@@QAE@ABV0@@Z @ 45 NONAME ; AgendaAlarm::AgendaAlarm(class AgendaAlarm const &) + ?setSummary@AgendaEntry@@QAEXABVQString@@@Z @ 46 NONAME ; void AgendaEntry::setSummary(class QString const &) + ?setByMonthDay@AgendaRepeatRule@@QAEXABV?$QList@H@@@Z @ 47 NONAME ; void AgendaRepeatRule::setByMonthDay(class QList const &) + ??1AgendaEntry@@UAE@XZ @ 48 NONAME ; AgendaEntry::~AgendaEntry(void) + ?setResponseRequested@AgendaAttendee@@QAEX_N@Z @ 49 NONAME ; void AgendaAttendee::setResponseRequested(bool) + ??1AgendaRepeatRule@@QAE@XZ @ 50 NONAME ; AgendaRepeatRule::~AgendaRepeatRule(void) + ?byMonthDay@AgendaRepeatRule@@QBE?AV?$QList@H@@XZ @ 51 NONAME ; class QList AgendaRepeatRule::byMonthDay(void) const + ?detach@AgendaGeoValue@@AAEXXZ @ 52 NONAME ; void AgendaGeoValue::detach(void) + ?detach@AgendaEntry@@AAEXXZ @ 53 NONAME ; void AgendaEntry::detach(void) + ??9AgendaAttendee@@QBE_NABV0@@Z @ 54 NONAME ; bool AgendaAttendee::operator!=(class AgendaAttendee const &) const + ??9AgendaRepeatRule@@QBE_NABV0@@Z @ 55 NONAME ; bool AgendaRepeatRule::operator!=(class AgendaRepeatRule const &) const + ?weekStart@AgendaRepeatRule@@QBE?AW4Day@1@XZ @ 56 NONAME ; enum AgendaRepeatRule::Day AgendaRepeatRule::weekStart(void) const + ??4AgendaAlarm@@QAEAAV0@ABV0@@Z @ 57 NONAME ; class AgendaAlarm & AgendaAlarm::operator=(class AgendaAlarm const &) + ?lastModifiedDateTime@AgendaEntry@@QBE?AVQDateTime@@XZ @ 58 NONAME ; class QDateTime AgendaEntry::lastModifiedDateTime(void) const + ?attendees@AgendaEntry@@QBEABV?$QList@VAgendaAttendee@@@@XZ @ 59 NONAME ; class QList const & AgendaEntry::attendees(void) const + ?setInterval@AgendaRepeatRule@@QAEXH@Z @ 60 NONAME ; void AgendaRepeatRule::setInterval(int) + ?updateEntry@AgendaUtil@@QAE_NABVAgendaEntry@@_N@Z @ 61 NONAME ; bool AgendaUtil::updateEntry(class AgendaEntry const &, bool) + ??8AgendaGeoValue@@QBE_NABV0@@Z @ 62 NONAME ; bool AgendaGeoValue::operator==(class AgendaGeoValue const &) const + ?id@AgendaEntry@@QBEKXZ @ 63 NONAME ; unsigned long AgendaEntry::id(void) const + ?setByDay@AgendaRepeatRule@@QAEXABV?$QList@W4Day@AgendaRepeatRule@@@@@Z @ 64 NONAME ; void AgendaRepeatRule::setByDay(class QList const &) + ?setUntil@AgendaRepeatRule@@QAEXABVQDateTime@@@Z @ 65 NONAME ; void AgendaRepeatRule::setUntil(class QDateTime const &) + ?setType@AgendaRepeatRule@@QAEXW4RuleType@1@@Z @ 66 NONAME ; void AgendaRepeatRule::setType(enum AgendaRepeatRule::RuleType) + ?interval@AgendaRepeatRule@@QBEHXZ @ 67 NONAME ; int AgendaRepeatRule::interval(void) const + ?rDates@AgendaEntry@@QBE?AV?$QList@VQDate@@@@XZ @ 68 NONAME ; class QList AgendaEntry::rDates(void) const + ?repeatRuleStart@AgendaRepeatRule@@QBE?AVQDateTime@@XZ @ 69 NONAME ; class QDateTime AgendaRepeatRule::repeatRuleStart(void) const + ??8AgendaAlarm@@QBE_NABV0@@Z @ 70 NONAME ; bool AgendaAlarm::operator==(class AgendaAlarm const &) const + ?storeRepeatingEntry@AgendaUtil@@QAE_NABVAgendaEntry@@_N@Z @ 71 NONAME ; bool AgendaUtil::storeRepeatingEntry(class AgendaEntry const &, bool) + ??0AgendaRepeatRule@@QAE@ABV0@@Z @ 72 NONAME ; AgendaRepeatRule::AgendaRepeatRule(class AgendaRepeatRule const &) + ?setStatus@AgendaAttendee@@QAEXW4StatusType@1@@Z @ 73 NONAME ; void AgendaAttendee::setStatus(enum AgendaAttendee::StatusType) + ?setStatus@AgendaEntry@@QAEXW4Status@1@@Z @ 74 NONAME ; void AgendaEntry::setStatus(enum AgendaEntry::Status) + ?setExtendedCategoryName@AgendaCategory@@QAEXABVQString@@@Z @ 75 NONAME ; void AgendaCategory::setExtendedCategoryName(class QString const &) + ?setDescription@AgendaEntry@@QAEXABVQString@@@Z @ 76 NONAME ; void AgendaEntry::setDescription(class QString const &) + ?recurrenceId@AgendaEntry@@QAE?AVQDateTime@@XZ @ 77 NONAME ; class QDateTime AgendaEntry::recurrenceId(void) + ?until@AgendaRepeatRule@@QBE?AVQDateTime@@XZ @ 78 NONAME ; class QDateTime AgendaRepeatRule::until(void) const + ?setByMonth@AgendaRepeatRule@@QAEXABV?$QList@W4Month@AgendaRepeatRule@@@@@Z @ 79 NONAME ; void AgendaRepeatRule::setByMonth(class QList const &) + ?qt_metacall@AgendaUtil@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 80 NONAME ; int AgendaUtil::qt_metacall(enum QMetaObject::Call, int, void * *) + ?qt_metacast@AgendaUtil@@UAEPAXPBD@Z @ 81 NONAME ; void * AgendaUtil::qt_metacast(char const *) + ?isNull@AgendaRepeatRule@@QBE_NXZ @ 82 NONAME ; bool AgendaRepeatRule::isNull(void) const + ?getStaticMetaObject@AgendaUtil@@SAABUQMetaObject@@XZ @ 83 NONAME ; struct QMetaObject const & AgendaUtil::getStaticMetaObject(void) + ??8AgendaAttendee@@QBE_NABV0@@Z @ 84 NONAME ; bool AgendaAttendee::operator==(class AgendaAttendee const &) const + ?addCategory@AgendaEntry@@QAEXABVAgendaCategory@@@Z @ 85 NONAME ; void AgendaEntry::addCategory(class AgendaCategory const &) + ?setLocation@AgendaEntry@@QAEXABVQString@@@Z @ 86 NONAME ; void AgendaEntry::setLocation(class QString const &) + ?isTimedEntry@AgendaEntry@@QAE_NXZ @ 87 NONAME ; bool AgendaEntry::isTimedEntry(void) + ?favourite@AgendaEntry@@QBEIXZ @ 88 NONAME ; unsigned int AgendaEntry::favourite(void) const + ?entryViewCreationCompleted@AgendaUtil@@IAEXH@Z @ 89 NONAME ; void AgendaUtil::entryViewCreationCompleted(int) + ?durationInSecs@AgendaEntry@@QBEHXZ @ 90 NONAME ; int AgendaEntry::durationInSecs(void) const + ??1AgendaUtil@@UAE@XZ @ 91 NONAME ; AgendaUtil::~AgendaUtil(void) + ?category@AgendaCategory@@QBE?AW4CategoryType@1@XZ @ 92 NONAME ; enum AgendaCategory::CategoryType AgendaCategory::category(void) const + ?entryAdded@AgendaUtil@@IAEXK@Z @ 93 NONAME ; void AgendaUtil::entryAdded(unsigned long) + ?role@AgendaAttendee@@QBE?AW4ParticipantRole@1@XZ @ 94 NONAME ; enum AgendaAttendee::ParticipantRole AgendaAttendee::role(void) const + ?type@AgendaEntry@@QBE?AW4Type@1@XZ @ 95 NONAME ; enum AgendaEntry::Type AgendaEntry::type(void) const + ??0AgendaEntry@@QAE@W4Type@0@@Z @ 96 NONAME ; AgendaEntry::AgendaEntry(enum AgendaEntry::Type) + ?detach@AgendaRepeatRule@@AAEXXZ @ 97 NONAME ; void AgendaRepeatRule::detach(void) + ?error@AgendaUtil@@QBE?AW4Error@1@XZ @ 98 NONAME ; enum AgendaUtil::Error AgendaUtil::error(void) const + ?trUtf8@AgendaUtil@@SA?AVQString@@PBD0@Z @ 99 NONAME ; class QString AgendaUtil::trUtf8(char const *, char const *) + ?status@AgendaEntry@@QBE?AW4Status@1@XZ @ 100 NONAME ; enum AgendaEntry::Status AgendaEntry::status(void) const + ??0AgendaEntry@@QAE@ABV0@@Z @ 101 NONAME ; AgendaEntry::AgendaEntry(class AgendaEntry const &) + ??4AgendaAttendee@@QAEAAV0@ABV0@@Z @ 102 NONAME ; class AgendaAttendee & AgendaAttendee::operator=(class AgendaAttendee const &) + ?address@AgendaAttendee@@QBE?AVQString@@XZ @ 103 NONAME ; class QString AgendaAttendee::address(void) const + ?entryDeleted@AgendaUtil@@IAEXK@Z @ 104 NONAME ; void AgendaUtil::entryDeleted(unsigned long) + ?summary@AgendaEntry@@QBE?AVQString@@XZ @ 105 NONAME ; class QString AgendaEntry::summary(void) const + ?priority@AgendaEntry@@QBEHXZ @ 106 NONAME ; int AgendaEntry::priority(void) const + ?fetchById@AgendaUtil@@QAE?AVAgendaEntry@@K@Z @ 107 NONAME ; class AgendaEntry AgendaUtil::fetchById(unsigned long) + ?setCommonName@AgendaAttendee@@QAEXABVQString@@@Z @ 108 NONAME ; void AgendaAttendee::setCommonName(class QString const &) + ?setMethod@AgendaEntry@@QAEXW4Method@1@@Z @ 109 NONAME ; void AgendaEntry::setMethod(enum AgendaEntry::Method) + ?setRDates@AgendaEntry@@QAEXABV?$QList@VQDate@@@@@Z @ 110 NONAME ; void AgendaEntry::setRDates(class QList const &) + ?parentEntry@AgendaUtil@@QAE?AVAgendaEntry@@AAV2@@Z @ 111 NONAME ; class AgendaEntry AgendaUtil::parentEntry(class AgendaEntry &) + ?addAttendee@AgendaEntry@@QAEXABVAgendaAttendee@@@Z @ 112 NONAME ; void AgendaEntry::addAttendee(class AgendaAttendee const &) + ?setCompleted@AgendaUtil@@QAEXAAVAgendaEntry@@_NAAVQDateTime@@@Z @ 113 NONAME ; void AgendaUtil::setCompleted(class AgendaEntry &, bool, class QDateTime &) + ??0AgendaCategory@@QAE@XZ @ 114 NONAME ; AgendaCategory::AgendaCategory(void) + ?timeOffset@AgendaAlarm@@QBEHXZ @ 115 NONAME ; int AgendaAlarm::timeOffset(void) const + ??0AgendaAttendee@@QAE@XZ @ 116 NONAME ; AgendaAttendee::AgendaAttendee(void) + ?setAlarmSoundName@AgendaAlarm@@QAEXABVQString@@@Z @ 117 NONAME ; void AgendaAlarm::setAlarmSoundName(class QString const &) + ?fetchEntriesInRange@AgendaUtil@@QAE?AV?$QList@VAgendaEntry@@@@VQDateTime@@0W4FilterFlags@1@@Z @ 118 NONAME ; class QList AgendaUtil::fetchEntriesInRange(class QDateTime, class QDateTime, enum AgendaUtil::FilterFlags) + ?detach@AgendaAlarm@@AAEXXZ @ 119 NONAME ; void AgendaAlarm::detach(void) + ?setWeekStart@AgendaRepeatRule@@QAEXW4Day@1@@Z @ 120 NONAME ; void AgendaRepeatRule::setWeekStart(enum AgendaRepeatRule::Day) + ?setFavourite@AgendaEntry@@QAEXI@Z @ 121 NONAME ; void AgendaEntry::setFavourite(unsigned int) + ?setDTStamp@AgendaEntry@@QAEXABVQDateTime@@@Z @ 122 NONAME ; void AgendaEntry::setDTStamp(class QDateTime const &) + ?cloneEntry@AgendaUtil@@QAEKABVAgendaEntry@@W4Type@2@@Z @ 123 NONAME ; unsigned long AgendaUtil::cloneEntry(class AgendaEntry const &, enum AgendaEntry::Type) + ?setRepeatRule@AgendaEntry@@QAEXABVAgendaRepeatRule@@@Z @ 124 NONAME ; void AgendaEntry::setRepeatRule(class AgendaRepeatRule const &) + ?categories@AgendaEntry@@QBEABV?$QList@VAgendaCategory@@@@XZ @ 125 NONAME ; class QList const & AgendaEntry::categories(void) const + ?tr@AgendaUtil@@SA?AVQString@@PBD0@Z @ 126 NONAME ; class QString AgendaUtil::tr(char const *, char const *) + ??4AgendaRepeatRule@@QAEAAV0@ABV0@@Z @ 127 NONAME ; class AgendaRepeatRule & AgendaRepeatRule::operator=(class AgendaRepeatRule const &) + ?setCompletedDateTime@AgendaEntry@@QAEXABVQDateTime@@@Z @ 128 NONAME ; void AgendaEntry::setCompletedDateTime(class QDateTime const &) + ??0AgendaRepeatRule@@QAE@XZ @ 129 NONAME ; AgendaRepeatRule::AgendaRepeatRule(void) + ?dtStamp@AgendaEntry@@QBE?AVQDateTime@@XZ @ 130 NONAME ; class QDateTime AgendaEntry::dtStamp(void) const + ?method@AgendaEntry@@QBE?AW4Method@1@XZ @ 131 NONAME ; enum AgendaEntry::Method AgendaEntry::method(void) const + ?type@AgendaRepeatRule@@QBE?AW4RuleType@1@XZ @ 132 NONAME ; enum AgendaRepeatRule::RuleType AgendaRepeatRule::type(void) const + ??4AgendaGeoValue@@QAEAAV0@ABV0@@Z @ 133 NONAME ; class AgendaGeoValue & AgendaGeoValue::operator=(class AgendaGeoValue const &) + ??0AgendaCategory@@QAE@W4CategoryType@0@@Z @ 134 NONAME ; AgendaCategory::AgendaCategory(enum AgendaCategory::CategoryType) + ?commonName@AgendaAttendee@@QBE?AVQString@@XZ @ 135 NONAME ; class QString AgendaAttendee::commonName(void) const + ?detach@AgendaCategory@@AAEXXZ @ 136 NONAME ; void AgendaCategory::detach(void) + ??0AgendaGeoValue@@QAE@ABV0@@Z @ 137 NONAME ; AgendaGeoValue::AgendaGeoValue(class AgendaGeoValue const &) + ?isWorkdaysRepeatingEntry@AgendaUtil@@SA_NABVAgendaRepeatRule@@@Z @ 138 NONAME ; bool AgendaUtil::isWorkdaysRepeatingEntry(class AgendaRepeatRule const &) + ?setRole@AgendaAttendee@@QAEXW4ParticipantRole@1@@Z @ 139 NONAME ; void AgendaAttendee::setRole(enum AgendaAttendee::ParticipantRole) + ?detach@AgendaAttendee@@AAEXXZ @ 140 NONAME ; void AgendaAttendee::detach(void) + ?getLatLong@AgendaGeoValue@@QBEXAAN0@Z @ 141 NONAME ; void AgendaGeoValue::getLatLong(double &, double &) const + ?maxTime@AgendaUtil@@SA?AVQDateTime@@XZ @ 142 NONAME ; class QDateTime AgendaUtil::maxTime(void) + ?setCategory@AgendaCategory@@QAEXW4CategoryType@1@@Z @ 143 NONAME ; void AgendaCategory::setCategory(enum AgendaCategory::CategoryType) + ?endTime@AgendaEntry@@QBE?AVQDateTime@@XZ @ 144 NONAME ; class QDateTime AgendaEntry::endTime(void) const + ??9AgendaEntry@@QBE_NABV0@@Z @ 145 NONAME ; bool AgendaEntry::operator!=(class AgendaEntry const &) const + ??0AgendaRepeatRule@@QAE@W4RuleType@0@@Z @ 146 NONAME ; AgendaRepeatRule::AgendaRepeatRule(enum AgendaRepeatRule::RuleType) + ??9AgendaCategory@@QBE_NABV0@@Z @ 147 NONAME ; bool AgendaCategory::operator!=(class AgendaCategory const &) const + ??0AgendaAttendee@@QAE@ABV0@@Z @ 148 NONAME ; AgendaAttendee::AgendaAttendee(class AgendaAttendee const &) + ??0AgendaAttendee@@QAE@ABVQString@@@Z @ 149 NONAME ; AgendaAttendee::AgendaAttendee(class QString const &) + ?importvCalendar@AgendaUtil@@QAEHABVQString@@AAVAgendaEntry@@@Z @ 150 NONAME ; int AgendaUtil::importvCalendar(class QString const &, class AgendaEntry &) + ?instanceViewCreationCompleted@AgendaUtil@@IAEXH@Z @ 151 NONAME ; void AgendaUtil::instanceViewCreationCompleted(int) + ??_EAgendaUtil@@UAE@I@Z @ 152 NONAME ; AgendaUtil::~AgendaUtil(unsigned int) + ?setGeoValue@AgendaEntry@@QAEXABVAgendaGeoValue@@@Z @ 153 NONAME ; void AgendaEntry::setGeoValue(class AgendaGeoValue const &) + ?getPreviousInstanceTimes@AgendaUtil@@QAEXAAVAgendaEntry@@AAVQDateTime@@1@Z @ 154 NONAME ; void AgendaUtil::getPreviousInstanceTimes(class AgendaEntry &, class QDateTime &, class QDateTime &) + ?attendees@AgendaEntry@@QAEAAV?$QList@VAgendaAttendee@@@@XZ @ 155 NONAME ; class QList & AgendaEntry::attendees(void) + ?staticMetaObject@AgendaUtil@@2UQMetaObject@@B @ 156 NONAME ; struct QMetaObject const AgendaUtil::staticMetaObject + ?entriesDeleted@AgendaUtil@@IAEXH@Z @ 157 NONAME ; void AgendaUtil::entriesDeleted(int) + ?fetchAllEntries@AgendaUtil@@QAE?AV?$QList@VAgendaEntry@@@@W4FilterFlags@1@@Z @ 158 NONAME ; class QList AgendaUtil::fetchAllEntries(enum AgendaUtil::FilterFlags) + ?setTimeOffset@AgendaAlarm@@QAEXH@Z @ 159 NONAME ; void AgendaAlarm::setTimeOffset(int) + ??0AgendaEntry@@QAE@XZ @ 160 NONAME ; AgendaEntry::AgendaEntry(void) + ?setPriority@AgendaEntry@@QAEXH@Z @ 161 NONAME ; void AgendaEntry::setPriority(int) + ?setType@AgendaEntry@@QAEXW4Type@1@@Z @ 162 NONAME ; void AgendaEntry::setType(enum AgendaEntry::Type) + ?setStartAndEndTime@AgendaEntry@@QAE_NABVQDateTime@@0@Z @ 163 NONAME ; bool AgendaEntry::setStartAndEndTime(class QDateTime const &, class QDateTime const &) + ?deleteEntries@AgendaUtil@@QAEXAAVQDateTime@@0W4FilterFlags@1@@Z @ 164 NONAME ; void AgendaUtil::deleteEntries(class QDateTime &, class QDateTime &, enum AgendaUtil::FilterFlags) + ?metaObject@AgendaUtil@@UBEPBUQMetaObject@@XZ @ 165 NONAME ; struct QMetaObject const * AgendaUtil::metaObject(void) const + ?location@AgendaEntry@@QBE?AVQString@@XZ @ 166 NONAME ; class QString AgendaEntry::location(void) const + ??8AgendaCategory@@QBE_NABV0@@Z @ 167 NONAME ; bool AgendaCategory::operator==(class AgendaCategory const &) const + ??0AgendaCategory@@QAE@ABV0@@Z @ 168 NONAME ; AgendaCategory::AgendaCategory(class AgendaCategory const &) + ??1AgendaGeoValue@@QAE@XZ @ 169 NONAME ; AgendaGeoValue::~AgendaGeoValue(void) + ??4AgendaEntry@@QAEAAV0@ABV0@@Z @ 170 NONAME ; class AgendaEntry & AgendaEntry::operator=(class AgendaEntry const &) + ??_EAgendaCategory@@UAE@I@Z @ 171 NONAME ; AgendaCategory::~AgendaCategory(unsigned int) + ?createEntryIdListForDay@AgendaUtil@@QAE?AV?$QList@VAgendaEntry@@@@VQDateTime@@W4FilterFlags@1@@Z @ 172 NONAME ; class QList AgendaUtil::createEntryIdListForDay(class QDateTime, enum AgendaUtil::FilterFlags) + ?createException@AgendaUtil@@QAE_NABVAgendaEntry@@VQDateTime@@@Z @ 173 NONAME ; bool AgendaUtil::createException(class AgendaEntry const &, class QDateTime) + ?repeatRule@AgendaEntry@@QBE?AVAgendaRepeatRule@@XZ @ 174 NONAME ; class AgendaRepeatRule AgendaEntry::repeatRule(void) const + ??1AgendaCategory@@UAE@XZ @ 175 NONAME ; AgendaCategory::~AgendaCategory(void) + ?deleteEntry@AgendaUtil@@QAE_NK@Z @ 176 NONAME ; bool AgendaUtil::deleteEntry(unsigned long) + ??1AgendaAttendee@@UAE@XZ @ 177 NONAME ; AgendaAttendee::~AgendaAttendee(void) + ?byDay@AgendaRepeatRule@@QBE?AV?$QList@W4Day@AgendaRepeatRule@@@@XZ @ 178 NONAME ; class QList AgendaRepeatRule::byDay(void) const + ?setLatLong@AgendaGeoValue@@QAEXNN@Z @ 179 NONAME ; void AgendaGeoValue::setLatLong(double, double) + ?completedDateTime@AgendaEntry@@QBE?AVQDateTime@@XZ @ 180 NONAME ; class QDateTime AgendaEntry::completedDateTime(void) const + ?setRecurrenceId@AgendaEntry@@QAEXAAVQDateTime@@@Z @ 181 NONAME ; void AgendaEntry::setRecurrenceId(class QDateTime &) + ?isNull@AgendaGeoValue@@QBE_NXZ @ 182 NONAME ; bool AgendaGeoValue::isNull(void) const + diff -r fd30d51f876b -r b6db4fd4947b agendainterface/agendautil/eabi/agendainterfaceu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/agendainterface/agendautil/eabi/agendainterfaceu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,212 @@ +EXPORTS + _ZN10AgendaUtil10cloneEntryERK11AgendaEntryNS0_4TypeE @ 1 NONAME + _ZN10AgendaUtil10entryAddedEm @ 2 NONAME + _ZN10AgendaUtil11deleteEntryEm @ 3 NONAME + _ZN10AgendaUtil11parentEntryER11AgendaEntry @ 4 NONAME + _ZN10AgendaUtil11qt_metacallEN11QMetaObject4CallEiPPv @ 5 NONAME + _ZN10AgendaUtil11qt_metacastEPKc @ 6 NONAME + _ZN10AgendaUtil11updateEntryERK11AgendaEntryb @ 7 NONAME + _ZN10AgendaUtil12entryDeletedEm @ 8 NONAME + _ZN10AgendaUtil12entryUpdatedEm @ 9 NONAME + _ZN10AgendaUtil12setCompletedER11AgendaEntrybR9QDateTime @ 10 NONAME + _ZN10AgendaUtil13deleteEntriesER9QDateTimeS1_NS_11FilterFlagsE @ 11 NONAME + _ZN10AgendaUtil14entriesChangedE5QListImE @ 12 NONAME + _ZN10AgendaUtil14entriesDeletedEi @ 13 NONAME + _ZN10AgendaUtil15createExceptionERK11AgendaEntry9QDateTime @ 14 NONAME + _ZN10AgendaUtil15fetchAllEntriesENS_11FilterFlagsE @ 15 NONAME + _ZN10AgendaUtil15importvCalendarERK7QStringR11AgendaEntry @ 16 NONAME + _ZN10AgendaUtil16staticMetaObjectE @ 17 NONAME DATA 16 + _ZN10AgendaUtil17exportAsvCalendarERK7QStringl @ 18 NONAME + _ZN10AgendaUtil19deleteRepeatedEntryER11AgendaEntryNS_15RecurrenceRangeE @ 19 NONAME + _ZN10AgendaUtil19fetchEntriesInRangeE9QDateTimeS0_NS_11FilterFlagsE @ 20 NONAME + _ZN10AgendaUtil19getStaticMetaObjectEv @ 21 NONAME + _ZN10AgendaUtil19markDatesWithEventsE9QDateTimeS0_NS_11FilterFlagsER5QListI5QDateE @ 22 NONAME + _ZN10AgendaUtil19storeRepeatingEntryERK11AgendaEntryb @ 23 NONAME + _ZN10AgendaUtil20getNextInstanceTimesER11AgendaEntryR9QDateTimeS3_ @ 24 NONAME + _ZN10AgendaUtil22areNoEntriesInCalendarEv @ 25 NONAME + _ZN10AgendaUtil23createEntryIdListForDayE9QDateTimeNS_11FilterFlagsE @ 26 NONAME + _ZN10AgendaUtil24clearRepeatingPropertiesER11AgendaEntry @ 27 NONAME + _ZN10AgendaUtil24getPreviousInstanceTimesER11AgendaEntryR9QDateTimeS3_ @ 28 NONAME + _ZN10AgendaUtil24isWorkdaysRepeatingEntryERK16AgendaRepeatRule @ 29 NONAME + _ZN10AgendaUtil26entryViewCreationCompletedEi @ 30 NONAME + _ZN10AgendaUtil29instanceViewCreationCompletedEi @ 31 NONAME + _ZN10AgendaUtil7maxTimeEv @ 32 NONAME + _ZN10AgendaUtil7minTimeEv @ 33 NONAME + _ZN10AgendaUtil8addEntryERK11AgendaEntry @ 34 NONAME + _ZN10AgendaUtil8entryIdsENS_11FilterFlagsE @ 35 NONAME + _ZN10AgendaUtil9fetchByIdEm @ 36 NONAME + _ZN10AgendaUtilC1EP7QObject @ 37 NONAME + _ZN10AgendaUtilC2EP7QObject @ 38 NONAME + _ZN10AgendaUtilD0Ev @ 39 NONAME + _ZN10AgendaUtilD1Ev @ 40 NONAME + _ZN10AgendaUtilD2Ev @ 41 NONAME + _ZN11AgendaAlarm13setTimeOffsetEi @ 42 NONAME + _ZN11AgendaAlarm17setAlarmSoundNameERK7QString @ 43 NONAME + _ZN11AgendaAlarm6detachEv @ 44 NONAME + _ZN11AgendaAlarmC1ERKS_ @ 45 NONAME + _ZN11AgendaAlarmC1Ev @ 46 NONAME + _ZN11AgendaAlarmC2ERKS_ @ 47 NONAME + _ZN11AgendaAlarmC2Ev @ 48 NONAME + _ZN11AgendaAlarmD1Ev @ 49 NONAME + _ZN11AgendaAlarmD2Ev @ 50 NONAME + _ZN11AgendaAlarmaSERKS_ @ 51 NONAME + _ZN11AgendaEntry10categoriesEv @ 52 NONAME + _ZN11AgendaEntry10setDTStampERK9QDateTime @ 53 NONAME + _ZN11AgendaEntry10setSummaryERK7QString @ 54 NONAME + _ZN11AgendaEntry11addAttendeeERK14AgendaAttendee @ 55 NONAME + _ZN11AgendaEntry11addCategoryERK14AgendaCategory @ 56 NONAME + _ZN11AgendaEntry11isRepeatingEv @ 57 NONAME + _ZN11AgendaEntry11setGeoValueERK14AgendaGeoValue @ 58 NONAME + _ZN11AgendaEntry11setLocationERK7QString @ 59 NONAME + _ZN11AgendaEntry11setPriorityEi @ 60 NONAME + _ZN11AgendaEntry12isTimedEntryEv @ 61 NONAME + _ZN11AgendaEntry12recurrenceIdEv @ 62 NONAME + _ZN11AgendaEntry12setFavouriteEj @ 63 NONAME + _ZN11AgendaEntry13setRepeatRuleERK16AgendaRepeatRule @ 64 NONAME + _ZN11AgendaEntry14setDescriptionERK7QString @ 65 NONAME + _ZN11AgendaEntry15setRecurrenceIdER9QDateTime @ 66 NONAME + _ZN11AgendaEntry18setStartAndEndTimeERK9QDateTimeS2_ @ 67 NONAME + _ZN11AgendaEntry20setCompletedDateTimeERK9QDateTime @ 68 NONAME + _ZN11AgendaEntry23setLastModifiedDateTimeERK9QDateTime @ 69 NONAME + _ZN11AgendaEntry6detachEv @ 70 NONAME + _ZN11AgendaEntry7setTypeENS_4TypeE @ 71 NONAME + _ZN11AgendaEntry8setAlarmERK11AgendaAlarm @ 72 NONAME + _ZN11AgendaEntry9attendeesEv @ 73 NONAME + _ZN11AgendaEntry9setMethodENS_6MethodE @ 74 NONAME + _ZN11AgendaEntry9setRDatesERK5QListI5QDateE @ 75 NONAME + _ZN11AgendaEntry9setStatusENS_6StatusE @ 76 NONAME + _ZN11AgendaEntryC1ENS_4TypeE @ 77 NONAME + _ZN11AgendaEntryC1ERKS_ @ 78 NONAME + _ZN11AgendaEntryC1Ev @ 79 NONAME + _ZN11AgendaEntryC2ENS_4TypeE @ 80 NONAME + _ZN11AgendaEntryC2ERKS_ @ 81 NONAME + _ZN11AgendaEntryC2Ev @ 82 NONAME + _ZN11AgendaEntryD0Ev @ 83 NONAME + _ZN11AgendaEntryD1Ev @ 84 NONAME + _ZN11AgendaEntryD2Ev @ 85 NONAME + _ZN11AgendaEntryaSERKS_ @ 86 NONAME + _ZN14AgendaAttendee10setAddressERK7QString @ 87 NONAME + _ZN14AgendaAttendee13setCommonNameERK7QString @ 88 NONAME + _ZN14AgendaAttendee20setResponseRequestedEb @ 89 NONAME + _ZN14AgendaAttendee6detachEv @ 90 NONAME + _ZN14AgendaAttendee7setRoleENS_15ParticipantRoleE @ 91 NONAME + _ZN14AgendaAttendee9setStatusENS_10StatusTypeE @ 92 NONAME + _ZN14AgendaAttendeeC1ERK7QString @ 93 NONAME + _ZN14AgendaAttendeeC1ERKS_ @ 94 NONAME + _ZN14AgendaAttendeeC1Ev @ 95 NONAME + _ZN14AgendaAttendeeC2ERK7QString @ 96 NONAME + _ZN14AgendaAttendeeC2ERKS_ @ 97 NONAME + _ZN14AgendaAttendeeC2Ev @ 98 NONAME + _ZN14AgendaAttendeeD0Ev @ 99 NONAME + _ZN14AgendaAttendeeD1Ev @ 100 NONAME + _ZN14AgendaAttendeeD2Ev @ 101 NONAME + _ZN14AgendaAttendeeaSERKS_ @ 102 NONAME + _ZN14AgendaCategory11setCategoryENS_12CategoryTypeE @ 103 NONAME + _ZN14AgendaCategory23setExtendedCategoryNameERK7QString @ 104 NONAME + _ZN14AgendaCategory6detachEv @ 105 NONAME + _ZN14AgendaCategoryC1ENS_12CategoryTypeE @ 106 NONAME + _ZN14AgendaCategoryC1ERKS_ @ 107 NONAME + _ZN14AgendaCategoryC1Ev @ 108 NONAME + _ZN14AgendaCategoryC2ENS_12CategoryTypeE @ 109 NONAME + _ZN14AgendaCategoryC2ERKS_ @ 110 NONAME + _ZN14AgendaCategoryC2Ev @ 111 NONAME + _ZN14AgendaCategoryD0Ev @ 112 NONAME + _ZN14AgendaCategoryD1Ev @ 113 NONAME + _ZN14AgendaCategoryD2Ev @ 114 NONAME + _ZN14AgendaCategoryaSERKS_ @ 115 NONAME + _ZN14AgendaGeoValue10setLatLongEdd @ 116 NONAME + _ZN14AgendaGeoValue6detachEv @ 117 NONAME + _ZN14AgendaGeoValueC1ERKS_ @ 118 NONAME + _ZN14AgendaGeoValueC1Ev @ 119 NONAME + _ZN14AgendaGeoValueC2ERKS_ @ 120 NONAME + _ZN14AgendaGeoValueC2Ev @ 121 NONAME + _ZN14AgendaGeoValueD1Ev @ 122 NONAME + _ZN14AgendaGeoValueD2Ev @ 123 NONAME + _ZN14AgendaGeoValueaSERKS_ @ 124 NONAME + _ZN16AgendaRepeatRule10setByMonthERK5QListINS_5MonthEE @ 125 NONAME + _ZN16AgendaRepeatRule11setIntervalEi @ 126 NONAME + _ZN16AgendaRepeatRule12setWeekStartENS_3DayE @ 127 NONAME + _ZN16AgendaRepeatRule13setByMonthDayERK5QListIiE @ 128 NONAME + _ZN16AgendaRepeatRule18setRepeatRuleStartERK9QDateTime @ 129 NONAME + _ZN16AgendaRepeatRule6detachEv @ 130 NONAME + _ZN16AgendaRepeatRule7setTypeENS_8RuleTypeE @ 131 NONAME + _ZN16AgendaRepeatRule8setByDayERK5QListINS_3DayEE @ 132 NONAME + _ZN16AgendaRepeatRule8setUntilERK9QDateTime @ 133 NONAME + _ZN16AgendaRepeatRuleC1ENS_8RuleTypeE @ 134 NONAME + _ZN16AgendaRepeatRuleC1ERKS_ @ 135 NONAME + _ZN16AgendaRepeatRuleC1Ev @ 136 NONAME + _ZN16AgendaRepeatRuleC2ENS_8RuleTypeE @ 137 NONAME + _ZN16AgendaRepeatRuleC2ERKS_ @ 138 NONAME + _ZN16AgendaRepeatRuleC2Ev @ 139 NONAME + _ZN16AgendaRepeatRuleD1Ev @ 140 NONAME + _ZN16AgendaRepeatRuleD2Ev @ 141 NONAME + _ZN16AgendaRepeatRuleaSERKS_ @ 142 NONAME + _ZNK10AgendaUtil10metaObjectEv @ 143 NONAME + _ZNK10AgendaUtil5errorEv @ 144 NONAME + _ZNK11AgendaAlarm10timeOffsetEv @ 145 NONAME + _ZNK11AgendaAlarm14alarmSoundNameEv @ 146 NONAME + _ZNK11AgendaAlarm6isNullEv @ 147 NONAME + _ZNK11AgendaAlarmeqERKS_ @ 148 NONAME + _ZNK11AgendaAlarmneERKS_ @ 149 NONAME + _ZNK11AgendaEntry10categoriesEv @ 150 NONAME + _ZNK11AgendaEntry10repeatRuleEv @ 151 NONAME + _ZNK11AgendaEntry11descriptionEv @ 152 NONAME + _ZNK11AgendaEntry14durationInSecsEv @ 153 NONAME + _ZNK11AgendaEntry17completedDateTimeEv @ 154 NONAME + _ZNK11AgendaEntry20lastModifiedDateTimeEv @ 155 NONAME + _ZNK11AgendaEntry2idEv @ 156 NONAME + _ZNK11AgendaEntry4typeEv @ 157 NONAME + _ZNK11AgendaEntry5alarmEv @ 158 NONAME + _ZNK11AgendaEntry6isNullEv @ 159 NONAME + _ZNK11AgendaEntry6methodEv @ 160 NONAME + _ZNK11AgendaEntry6rDatesEv @ 161 NONAME + _ZNK11AgendaEntry6statusEv @ 162 NONAME + _ZNK11AgendaEntry7dtStampEv @ 163 NONAME + _ZNK11AgendaEntry7endTimeEv @ 164 NONAME + _ZNK11AgendaEntry7summaryEv @ 165 NONAME + _ZNK11AgendaEntry8geoValueEv @ 166 NONAME + _ZNK11AgendaEntry8locationEv @ 167 NONAME + _ZNK11AgendaEntry8priorityEv @ 168 NONAME + _ZNK11AgendaEntry9attendeesEv @ 169 NONAME + _ZNK11AgendaEntry9favouriteEv @ 170 NONAME + _ZNK11AgendaEntry9startTimeEv @ 171 NONAME + _ZNK11AgendaEntryeqERKS_ @ 172 NONAME + _ZNK11AgendaEntryneERKS_ @ 173 NONAME + _ZNK14AgendaAttendee10commonNameEv @ 174 NONAME + _ZNK14AgendaAttendee17responseRequestedEv @ 175 NONAME + _ZNK14AgendaAttendee4roleEv @ 176 NONAME + _ZNK14AgendaAttendee6isNullEv @ 177 NONAME + _ZNK14AgendaAttendee6statusEv @ 178 NONAME + _ZNK14AgendaAttendee7addressEv @ 179 NONAME + _ZNK14AgendaAttendeeeqERKS_ @ 180 NONAME + _ZNK14AgendaAttendeeneERKS_ @ 181 NONAME + _ZNK14AgendaCategory20extendedCategoryNameEv @ 182 NONAME + _ZNK14AgendaCategory6isNullEv @ 183 NONAME + _ZNK14AgendaCategory8categoryEv @ 184 NONAME + _ZNK14AgendaCategoryeqERKS_ @ 185 NONAME + _ZNK14AgendaCategoryneERKS_ @ 186 NONAME + _ZNK14AgendaGeoValue10getLatLongERdS0_ @ 187 NONAME + _ZNK14AgendaGeoValue6isNullEv @ 188 NONAME + _ZNK14AgendaGeoValueeqERKS_ @ 189 NONAME + _ZNK14AgendaGeoValueneERKS_ @ 190 NONAME + _ZNK16AgendaRepeatRule10byMonthDayEv @ 191 NONAME + _ZNK16AgendaRepeatRule15repeatRuleStartEv @ 192 NONAME + _ZNK16AgendaRepeatRule4typeEv @ 193 NONAME + _ZNK16AgendaRepeatRule5byDayEv @ 194 NONAME + _ZNK16AgendaRepeatRule5untilEv @ 195 NONAME + _ZNK16AgendaRepeatRule6isNullEv @ 196 NONAME + _ZNK16AgendaRepeatRule7byMonthEv @ 197 NONAME + _ZNK16AgendaRepeatRule8intervalEv @ 198 NONAME + _ZNK16AgendaRepeatRule9weekStartEv @ 199 NONAME + _ZNK16AgendaRepeatRuleeqERKS_ @ 200 NONAME + _ZNK16AgendaRepeatRuleneERKS_ @ 201 NONAME + _ZTI10AgendaUtil @ 202 NONAME + _ZTI11AgendaEntry @ 203 NONAME + _ZTI14AgendaAttendee @ 204 NONAME + _ZTI14AgendaCategory @ 205 NONAME + _ZTV10AgendaUtil @ 206 NONAME + _ZTV11AgendaEntry @ 207 NONAME + _ZTV14AgendaAttendee @ 208 NONAME + _ZTV14AgendaCategory @ 209 NONAME + _ZNK11AgendaEntry13clearGeoValueEv @ 210 NONAME + diff -r fd30d51f876b -r b6db4fd4947b agendainterface/agendautil/inc/agendaentry.h --- a/agendainterface/agendautil/inc/agendaentry.h Mon May 03 12:30:32 2010 +0300 +++ b/agendainterface/agendautil/inc/agendaentry.h Mon Jun 28 15:22:02 2010 +0530 @@ -380,6 +380,7 @@ void setGeoValue(const AgendaGeoValue& geoValue); AgendaGeoValue geoValue() const; + void clearGeoValue() const; int durationInSecs() const; AgendaEntry& operator=(const AgendaEntry& other); diff -r fd30d51f876b -r b6db4fd4947b agendainterface/agendautil/inc/agendautil.h --- a/agendainterface/agendautil/inc/agendautil.h Mon May 03 12:30:32 2010 +0300 +++ b/agendainterface/agendautil/inc/agendautil.h Mon Jun 28 15:22:02 2010 +0530 @@ -79,7 +79,7 @@ AgendaEntry& entry, AgendaUtil::RecurrenceRange range); bool updateEntry(const AgendaEntry& entry, bool isChild = false); bool storeRepeatingEntry(const AgendaEntry& entry, bool copyToChildren); - bool createException(const AgendaEntry& entry); + bool createException(const AgendaEntry& entry,QDateTime instanceOriginalDateTime); QList entryIds( AgendaUtil::FilterFlags filter = AgendaUtil::IncludeAll); QList fetchAllEntries( @@ -120,6 +120,8 @@ void entryDeleted(ulong id); void entryUpdated(ulong id); void entriesDeleted(int status); + void entryViewCreationCompleted(int status); + void instanceViewCreationCompleted(int status); private: friend class AgendaUtilPrivate; diff -r fd30d51f876b -r b6db4fd4947b agendainterface/agendautil/inc/agendautil_p.h --- a/agendainterface/agendautil/inc/agendautil_p.h Mon May 03 12:30:32 2010 +0300 +++ b/agendainterface/agendautil/inc/agendautil_p.h Mon Jun 28 15:22:02 2010 +0530 @@ -65,7 +65,7 @@ ulong cloneEntry(const AgendaEntry& entry, AgendaEntry::Type type); bool updateEntry(const AgendaEntry& entry, bool isChild = false); bool storeRepeatingEntry(const AgendaEntry& entry, bool copyToChildren); - bool createException(const AgendaEntry& entry); + bool createException(const AgendaEntry& entry, QDateTime instanceOriginalDateTime); bool deleteEntry(ulong id); void deleteRepeatedEntry( diff -r fd30d51f876b -r b6db4fd4947b agendainterface/agendautil/src/agendaentry.cpp --- a/agendainterface/agendautil/src/agendaentry.cpp Mon May 03 12:30:32 2010 +0300 +++ b/agendainterface/agendautil/src/agendaentry.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -1984,7 +1984,17 @@ { return d->m_geoValue; } - + +/*! + Clears the geo value if it has any + */ +void AgendaEntry::clearGeoValue() const +{ + if (d) { + d->m_geoValue = AgendaGeoValue(); + } +} + /*! Returns duration of the meeting in seconds diff -r fd30d51f876b -r b6db4fd4947b agendainterface/agendautil/src/agendautil.cpp --- a/agendainterface/agendautil/src/agendautil.cpp Mon May 03 12:30:32 2010 +0300 +++ b/agendainterface/agendautil/src/agendautil.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -194,9 +194,9 @@ AgendaUtil::Error that indicates which error occurred \sa addEntry(), deleteEntry() */ -bool AgendaUtil::createException(const AgendaEntry& entry) +bool AgendaUtil::createException(const AgendaEntry& entry,QDateTime instanceOriginalDateTime) { - return d->createException(entry); + return d->createException(entry, instanceOriginalDateTime); } /*! Fetches the entry which of id is equal to given \a id. diff -r fd30d51f876b -r b6db4fd4947b agendainterface/agendautil/src/agendautil_p.cpp --- a/agendainterface/agendautil/src/agendautil_p.cpp Mon May 03 12:30:32 2010 +0300 +++ b/agendainterface/agendautil/src/agendautil_p.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -34,6 +35,7 @@ #include "agendautil_p.h" #include "agendaentry.h" #include "agendaentry_p.h" +#include "CleanupResetAndDestroy.h" // Constants //recognition string for ical @@ -41,7 +43,6 @@ //recognition string for vcal _LIT8(KVersionVCal, "VERSION:1.0"); const TInt KReadDataAmount = 256; -const TInt KGuidLength = 30; const TInt KNoOfDaysInWeek = 7; static const int startDateArray[2] = { 1900, 1}; static const int endDateArray[2] = { 2100, 1}; @@ -108,70 +109,24 @@ delete filter; } - /* - // If view creation is in progress, then wait till it gets completed - if((iCalEntryView && !mEntryViewCreated) - || (iCalInstanceView && !mInstanceViewCreated)) - { - if(!iWait) - { - TRAP(iError, iWait = new (ELeave) CActiveSchedulerWait;); - if(!iWait->IsStarted()) - { - iWait->Start(); - } - } + // First construct the CCalInstanceView if not already available. + // The CCalEntryView is constructed in CompletedL. Instance view + // is created before entry view since entry view is required only + // when editing/saving any entry. So we will construct it later + if (!iCalInstanceView) { + TRAP (iError, iCalInstanceView = CCalInstanceView::NewL(*iCalSession, + *this);) } - */ - - // First construct the CCalEntryView if not already available. - // The CCalInstanceView is constructed in ::CompletedL. We block the - // thread here until everything is setup. - if (!iCalEntryView) - { - TRAP( - iError, - iCalEntryView = CCalEntryView::NewL(*iCalSession, *this); - ); - if (!iWait) - { - TRAP( - iError, - iWait = new (ELeave) CActiveSchedulerWait; - ) - if (!iWait->IsStarted()) - { - iWait->Start(); - } - } - } - - // Comes here only when timer is expired, hence one more - // check is needed here. - if (iCalSession && mEntryViewCreated && mInstanceViewCreated) - { - // Everything is ready. - return true; - } - - else - { - return false; - } + + // All the requests have been made + return true; } AgendaUtilPrivate::~AgendaUtilPrivate() { delete iCalEntryView; delete iCalInstanceView; - if (iWait && iWait->IsStarted()) - { - iWait->AsyncStop(); - } - - delete iWait; - if (iCalSession) - { + if (iCalSession) { iCalSession->StopChangeNotification(); } delete iCalSession; @@ -180,6 +135,8 @@ void AgendaUtilPrivate::Completed(TInt aError) { iError = aError; + static bool isInstanceViewDeleted = false; + static bool isEntryViewDeleted = false; if (mIsDeleting) { // If deletion was in progress, then it is completed now @@ -188,39 +145,35 @@ emit q->entriesDeleted(iError); } - if(KErrNone != iError) - { + if (KErrNone != iError) { // Something has gone wrong, return + if (iCalEntryView && !isEntryViewDeleted) { + isEntryViewDeleted = true; delete iCalEntryView; iCalEntryView = NULL; + } + if (iCalInstanceView && !isInstanceViewDeleted) { + isInstanceViewDeleted = true; delete iCalInstanceView; iCalInstanceView = NULL; + } return; } - if(iCalEntryView && !mEntryViewCreated) - { - mEntryViewCreated = true; - - // Start creating the instance view. - if(!iCalInstanceView) - { - TRAP(iError, iCalInstanceView = CCalInstanceView::NewL( - *iCalSession, *this);) + if (iCalInstanceView && !mInstanceViewCreated) { + // Instance view is now created. + mInstanceViewCreated = true; + emit q->instanceViewCreationCompleted(iError); + // Start with the construction of entry view + if (!iCalEntryView) { + TRAP (iError, + iCalEntryView = CCalEntryView::NewL(*iCalSession, *this); + ); } - } - else if(iCalInstanceView && !mInstanceViewCreated) - { - mInstanceViewCreated = true; - } - - // Stop the wait timer - if( iWait && iWait->IsStarted()) - { - if(mEntryViewCreated && mInstanceViewCreated) - { - iWait->AsyncStop(); - } + } else if(iCalEntryView && !mEntryViewCreated) { + // Entry view is now constructed + mEntryViewCreated = true; + emit q->entryViewCreationCompleted(iError); } } @@ -248,25 +201,21 @@ int success = 0; // First check if the session to the calendar database is prepared or not. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Something went wrong return localUid; } + // Get the global uid. + CCalenInterimUtils2* calenInterimUtils2 = CCalenInterimUtils2::NewL(); + HBufC8* globalUid = calenInterimUtils2->GlobalUidL(); if (AgendaEntry::TypeNote == entry.type()) { TRAP( iError, RPointerArray entryArray; - CleanupClosePushL(entryArray); - - // Get the global uid. - TTime homeTime; - homeTime.HomeTime(); - TInt64 seed = homeTime.Int64(); - TInt randumNumber = Math::Rand(seed); - HBufC8* globalUid = HBufC8::NewLC(KGuidLength); - globalUid->Des().Num(randumNumber); + CleanupResetAndDestroyPushL(entryArray); + CleanupStack::PushL(globalUid); // Construct a CCalEntry object and start filling the details. CCalEntry* newEntry = 0; @@ -277,7 +226,6 @@ 0); CleanupStack::Pop(globalUid); - CleanupStack::PushL(newEntry); // Add description. TPtrC description(reinterpret_cast( @@ -309,7 +257,7 @@ dtStamp.time().minute(), 0, 0); TTime creationTTime(creationDateTime); creationCalTime.SetTimeLocalL(creationTTime); - //newEntry->SetDTStampL(creationCalTime); + newEntry->SetDTStampL(creationCalTime); // Finally set the entry to the database using the entry view. entryArray.AppendL(newEntry); @@ -317,7 +265,6 @@ localUid = newEntry->LocalUidL(); // Cleanup. - CleanupStack::PopAndDestroy(newEntry); CleanupStack::PopAndDestroy(&entryArray); ) } else { @@ -325,16 +272,8 @@ iError, RPointerArray entryArray; - CleanupClosePushL(entryArray); - - // Get the global uid. - TTime homeTime; - homeTime.HomeTime(); - TInt64 seed = homeTime.Int64(); - TInt randumNumber = Math::Rand(seed); - HBufC8* globalUid = HBufC8::NewLC(KGuidLength); - globalUid->Des().Num(randumNumber); - + CleanupResetAndDestroyPushL(entryArray); + CleanupStack::PushL(globalUid); // Construct a CCalEntry object and start filling the details. CCalEntry* newEntry = 0; newEntry = CCalEntry::NewL( @@ -344,7 +283,6 @@ 0); CleanupStack::Pop(globalUid); - CleanupStack::PushL(newEntry); // Add the summary. if (!entry.summary().isNull()) { @@ -443,10 +381,12 @@ localUid = newEntry->LocalUidL(); // Cleanup. - CleanupStack::PopAndDestroy(newEntry); CleanupStack::PopAndDestroy(&entryArray); ) } + + delete calenInterimUtils2; + // Emit signal upon successful creation of entry. if (0 < localUid && 1 == success) { emit q->entryAdded(localUid); @@ -467,7 +407,7 @@ const AgendaEntry &entry, AgendaEntry::Type type) { // First prepare the session with agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Something went wrong. return 0; } @@ -497,9 +437,7 @@ // Now save the GUID of the saved entry. TRAP( iError, - - globalUid = HBufC8::NewL(KGuidLength); - *globalUid = originalEntry->UidL(); + globalUid = originalEntry->UidL().AllocL(); ) delete originalEntry; @@ -519,7 +457,6 @@ globalUid, static_cast(entry.method()), 0); - CleanupStack::PushL(newEntry); // Add description. TPtrC description(reinterpret_cast( @@ -535,7 +472,6 @@ localUid = newEntry->LocalUidL(); // Cleanup. - CleanupStack::PopAndDestroy(newEntry); CleanupStack::PopAndDestroy(&entryArray); ) } else { @@ -552,7 +488,6 @@ globalUid, static_cast(entry.method()), 0); - CleanupStack::PushL(newEntry); // Add the summary. if (!entry.summary().isNull()) { @@ -651,7 +586,6 @@ localUid = newEntry->LocalUidL(); // Cleanup. - CleanupStack::PopAndDestroy(newEntry); CleanupStack::PopAndDestroy(&entryArray); ) } @@ -671,7 +605,7 @@ bool AgendaUtilPrivate::deleteEntry(ulong id) { // First prepare the session with agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Something went wrong. return false; } @@ -706,10 +640,9 @@ AgendaEntry& entry, AgendaUtil::RecurrenceRange range) { - qDebug("AgendaUtilPrivate::deleteRepeatedEntry"); // First prepare the session with agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Something went wrong. return; } @@ -736,18 +669,12 @@ // the exceptional entries share the global uid with the parent // entry. RPointerArray entries; - CleanupClosePushL(entries); + CleanupResetAndDestroyPushL(entries); iCalEntryView->FetchL(calEntry->UidL(), entries); if (entries.Count()) { iCalEntryView->DeleteL(*entries[0]); } - // Cleanup. - int count = entries.Count(); - for (int i = count - 1; i >= 0; --i) { - CCalEntry *entry = entries[i]; - delete entry; - } CleanupStack::PopAndDestroy(&entries); CleanupStack::PopAndDestroy(); } @@ -766,7 +693,7 @@ bool AgendaUtilPrivate::updateEntry(const AgendaEntry& entry, bool isChild) { // First prepare the session with agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Something went wrong. return false; } @@ -785,7 +712,6 @@ // Get the entry corresponding to the id. AgendaEntry storedEntry = fetchById(entry.id()); CCalEntry* calEntry = iCalEntryView->FetchL(entry.id()); - CleanupStack::PushL(calEntry); // Update the description. if (storedEntry.description() != entry.description() @@ -839,12 +765,12 @@ // Update the entry using the CCalEntryView. RPointerArray entryArray; - CleanupClosePushL(entryArray); + CleanupResetAndDestroyPushL(entryArray); entryArray.AppendL(calEntry); iCalEntryView->UpdateL(entryArray, success); // Cleanup. - CleanupStack::PopAndDestroy(2, calEntry); + CleanupStack::PopAndDestroy( &entryArray ); ) } else { TRAP( @@ -853,22 +779,18 @@ // Get the entry corresponding to the id. AgendaEntry storedEntry = fetchById(entry.id()); CCalEntry* calEntry = iCalEntryView->FetchL(entry.id()); - CleanupStack::PushL(calEntry); // Update the attendees. if (!entry.isNull() && (entry.d->m_attendees != storedEntry.attendees())) { - RPointerArray attendeesArray = + RPointerArray& attendeesArray = calEntry->AttendeesL(); - CleanupClosePushL(attendeesArray); int iterator = 0; while (attendeesArray.Count() > iterator) { calEntry->DeleteAttendeeL(iterator); iterator++; } - // Cleanup. - CleanupStack::PopAndDestroy(&attendeesArray); addAttendeesToEntry(entry.d->m_attendees, *calEntry); } @@ -878,14 +800,11 @@ RPointerArray categories = calEntry->CategoryListL(); - CleanupClosePushL(categories); int iterator = 0; while (categories.Count() > iterator) { calEntry->DeleteCategoryL(iterator); iterator++; } - // Cleanup. - CleanupStack::PopAndDestroy(&categories); addCategoriesToEntry(entry.d->m_categories, *calEntry); } @@ -994,7 +913,7 @@ // Save the geo value if any AgendaGeoValue entryGeoValue = entry.geoValue(); - if (!entryGeoValue.isNull()) { + if (!entryGeoValue.isNull() && (entryGeoValue != storedEntry.geoValue())) { CCalGeoValue* geoValue = CCalGeoValue::NewL(); double latitude; double longitude; @@ -1006,11 +925,14 @@ // set it to CCalentry calEntry->SetGeoValueL(*geoValue); delete geoValue; + } else if (entryGeoValue.isNull()) { + // Clear the geo values if any + calEntry->ClearGeoValueL(); } // Update the entry using the calen entry view. RPointerArray entryArray; - CleanupClosePushL(entryArray); + CleanupResetAndDestroyPushL(entryArray); entryArray.AppendL(calEntry); if (!isChild) { iCalEntryView->UpdateL(entryArray, success); @@ -1018,7 +940,7 @@ iCalEntryView->StoreL(entryArray, success); } // Cleanup. - CleanupStack::PopAndDestroy(2, calEntry); + CleanupStack::PopAndDestroy( &entryArray ); ) } @@ -1033,7 +955,7 @@ bool copyToChildren) { // First prepare the session with agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Something went wrong. return false; } @@ -1054,9 +976,10 @@ if (instance) { // Get all the entries with same global Uid. RPointerArray entries; - CleanupClosePushL(entries); + CleanupResetAndDestroyPushL(entries); iCalEntryView->FetchL(instance->UidL(), entries); calEntry = entries[0]; + entries.Remove(0); CleanupStack::PopAndDestroy(&entries); } else { CleanupStack::PopAndDestroy(instance); @@ -1092,7 +1015,7 @@ // Entry is not a child, but does it have any children? // Fetch array of entries associated with this UID. RPointerArray oldEntries; - CleanupClosePushL(oldEntries); + CleanupResetAndDestroyPushL(oldEntries); iCalEntryView->FetchL(calEntry->UidL(), oldEntries); bool hasChildren = oldEntries.Count() > 0; @@ -1122,6 +1045,9 @@ // set it to CCalentry calEntry->SetGeoValueL(*geoValue); delete geoValue; + } else { + // Clear the geo values + calEntry->ClearGeoValueL(); } // set the description @@ -1199,11 +1125,11 @@ return success; } -bool AgendaUtilPrivate::createException(const AgendaEntry& entry) -{ - +bool AgendaUtilPrivate::createException(const AgendaEntry& entry, + QDateTime instanceOriginalDateTime) +{ // First prepare the session with agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Something went wrong. return false; } @@ -1226,18 +1152,12 @@ HBufC8* guid = calEntry->UidL().AllocLC(); // create new (child) entry // Use original instance time for recurrenceID as this entry hasn't got one. - TCalTime originalCalTime = calEntry->StartTimeL(); - TDateTime origDateTime = originalCalTime.TimeLocalL().DateTime(); - // set the instance date to this - QDate date = entry.startTime().date(); - QTime time =entry.startTime().time(); - origDateTime.Set(date.year(), - static_cast (date.month() - 1), - date.day() - 1, - time.hour(), - time.minute(),time.second(), 0); - TTime originalTime(origDateTime); - originalCalTime.SetTimeLocalL(originalTime); + TCalTime originalCalTime; + TDateTime originalDateTime(instanceOriginalDateTime.date().year(), + TMonth(instanceOriginalDateTime.date().month() - 1), + instanceOriginalDateTime.date().day() -1, 0, 0, 0, 0); + TTime originalDateTimeTTime(originalDateTime); + originalCalTime.SetTimeLocalL(originalDateTimeTTime); // create the new child now CCalEntry* newEntry = CCalEntry::NewL( calEntry->EntryTypeL(), guid, @@ -1248,7 +1168,6 @@ CleanupStack::Pop(guid); CleanupStack::PopAndDestroy(calEntry); - CleanupStack::PushL(newEntry); // Update the description. if (!entry.description().isNull()) { @@ -1285,13 +1204,13 @@ // Update the entry using the CCalEntryView. RPointerArray entryArray; - CleanupClosePushL(entryArray); + CleanupResetAndDestroyPushL(entryArray); entryArray.AppendL(newEntry); iCalEntryView->StoreL(entryArray, success); localUid = newEntry->LocalUidL(); // Cleanup. - CleanupStack::PopAndDestroy(2, newEntry); + CleanupStack::PopAndDestroy(&entryArray); ) } else { TRAP( @@ -1303,20 +1222,12 @@ HBufC8* guid = calEntry->UidL().AllocLC(); // create new (child) entry // Use original instance time for recurrenceID as this entry hasn't got one. - TCalTime originalCalTime = calEntry->StartTimeL(); - TDateTime origDateTime = originalCalTime.TimeLocalL().DateTime(); - // set only the instance date but not the time to this - QDate date = entry.startTime().date(); - QTime time =entry.startTime().time(); - origDateTime.Set(date.year(), - static_cast (date.month() - 1), - date.day() - 1, - origDateTime.Hour(), - origDateTime.Minute(), - origDateTime.Second(), - origDateTime.MicroSecond()); - TTime originalTime(origDateTime); - originalCalTime.SetTimeLocalL(originalTime); + TCalTime originalCalTime; + TDateTime originalDateTime(instanceOriginalDateTime.date().year(), + TMonth(instanceOriginalDateTime.date().month() - 1), + instanceOriginalDateTime.date().day() -1, 0, 0, 0, 0); + TTime originalDateTimeTTime(originalDateTime); + originalCalTime.SetTimeLocalL(originalDateTimeTTime); // create the new child now CCalEntry* newEntry = CCalEntry::NewL( calEntry->EntryTypeL(), guid, @@ -1327,7 +1238,6 @@ CleanupStack::Pop(guid); CleanupStack::PopAndDestroy(calEntry); - CleanupStack::PushL(newEntry); // Store the attendees. if (!entry.isNull()) { addAttendeesToEntry(entry.d->m_attendees, *newEntry); @@ -1435,14 +1345,13 @@ newEntry->ClearRepeatingPropertiesL(); // Update the entry using the calen entry view. RPointerArray entryArray; - CleanupClosePushL(entryArray); + CleanupResetAndDestroyPushL(entryArray); entryArray.AppendL(newEntry); iCalEntryView->StoreL(entryArray, success); localUid = newEntry->LocalUidL(); // Cleanup. CleanupStack::PopAndDestroy(&entryArray); - CleanupStack::PopAndDestroy(newEntry); ) } @@ -1464,7 +1373,7 @@ AgendaEntry entry; // First check if the session with the calendar exists. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Return empty AgendaEntry. return entry; } @@ -1500,7 +1409,7 @@ QList listOfIds; // First check if the session with agenda server exists. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Return empty list. return listOfIds; } @@ -1509,7 +1418,7 @@ iError, RPointerArray instanceList; - CleanupClosePushL(instanceList); + CleanupResetAndDestroyPushL(instanceList); CalCommon::TCalViewFilter filters = filter; TCalTime startDateForInstanceSearch; TCalTime endDateForInstanceSearch; @@ -1536,14 +1445,8 @@ listOfIds.append(instanceList[iter]->Entry().LocalUidL()); } - int count = instanceList.Count(); - for (int iter = count - 1; iter >= 0; --iter) { - CCalInstance *instance = instanceList[iter]; - delete instance; - } - // Cleanup. - CleanupStack::PopAndDestroy(); + CleanupStack::PopAndDestroy(&instanceList); ) return listOfIds; @@ -1561,7 +1464,7 @@ QList entryList; // First check if the session with agenda server exists. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Return empty list. return entryList; } @@ -1570,7 +1473,7 @@ iError, RPointerArray instanceList; - CleanupClosePushL(instanceList); + CleanupResetAndDestroyPushL(instanceList); CalCommon::TCalViewFilter filters = filter; TCalTime startDateForInstanceSearch; TCalTime endDateForInstanceSearch; @@ -1601,14 +1504,8 @@ instanceList[iter])); } - int count = instanceList.Count(); - for (int iter = count - 1; iter >= 0; --iter) { - CCalInstance *instance = instanceList[iter]; - delete instance; - } - // Cleanup. - CleanupStack::PopAndDestroy(); + CleanupStack::PopAndDestroy(&instanceList); ) return entryList; @@ -1619,7 +1516,7 @@ AgendaUtil::FilterFlags filter) { QList entryList; - if(!prepareSession()) + if(!mInstanceViewCreated) { // return empty list return entryList; @@ -1628,7 +1525,7 @@ TRAP(iError, RPointerArray instanceList; - CleanupClosePushL(instanceList); + CleanupResetAndDestroyPushL(instanceList); CalCommon::TCalViewFilter filters = filter; TCalTime startDateForInstanceSearch; TCalTime endDateForInstanceSearch; @@ -1661,12 +1558,7 @@ { entryList.append(createAgendaEntryFromCalEntry(instanceList[i]->Entry(), instanceList[i])); } - int count = instanceList.Count(); - for (int i = count - 1; i >= 0; --i) { - CCalInstance *instance = instanceList[i]; - delete instance; - } - CleanupStack::PopAndDestroy(); + CleanupStack::PopAndDestroy(&instanceList); ) return entryList; @@ -1676,7 +1568,13 @@ QDateTime rangeEnd,AgendaUtil::FilterFlags filter, QList& dates) { RPointerArray instanceList; - CleanupClosePushL(instanceList); + + if(!mInstanceViewCreated) { + // return empty list + return; + } + + CleanupResetAndDestroyPushL(instanceList); CalCommon::TCalViewFilter filters = filter; TCalTime startDateForInstanceSearch; TCalTime endDateForInstanceSearch; @@ -1704,7 +1602,7 @@ endDateForInstanceSearch); iCalInstanceView->FindInstanceL(instanceList, filters, searchTimeRange); - + // Parse thru the list and mark the dates which have events for (int i = 0; i < instanceList.Count(); i++) { CCalEntry::TType type = instanceList[i]->Entry().EntryTypeL(); @@ -1712,52 +1610,106 @@ TCalTime startCalTime = instanceList[i]->StartTimeL(); TCalTime endCalTime = instanceList[i]->EndTimeL(); TDateTime startDateTime = startCalTime.TimeLocalL().DateTime(); + TDateTime endDateTime = endCalTime.TimeLocalL().DateTime(); QDate startDate(startDateTime.Year(), startDateTime.Month()+1, startDateTime.Day() + 1); + QDate endDate(endDateTime.Year(), endDateTime.Month()+1, + endDateTime.Day() + 1); if (type == CCalEntry::EEvent || type == CCalEntry::EAppt || type == CCalEntry::EReminder) { if(endsAtStartOfDay(instanceList[i], endCalTime.TimeLocalL())) { - // instance ends at start of endtime day, month view doesnt - // want to show event on this day TDateTime endDateTime = endCalTime.TimeLocalL().DateTime(); + // prevent problems with items ending tomorrow at 00:00 endDateTime.SetMinute(endDateTime.Minute() - 1); TTime time(endDateTime); + // If it is ending before the start of the grid if (time <= startDateForInstanceSearch.TimeLocalL()) { continue; } } - - // Mark the required dates frm start date to end date - TTimeIntervalDays days = endCalTime.TimeLocalL().DaysFrom(startCalTime.TimeLocalL()); - for (int j = -1; j < days.Int(); j++) { - QDate date = startDate.addDays(j+1); - if (date <= rangeEnd.date()) { - dates.append(date); - } else { - break; - } - } - } else if (type == CCalEntry::EAnniv) { - if (startDate <= rangeEnd.date()) { - dates.append(startDate); - } - } else if (type == CCalEntry::ETodo) { - // if start time is less that today, then mark it for today - if (startDate < QDate::currentDate()) { - dates.append(QDate::currentDate()); - } else { - dates.append(startDate); - } - } - } - CleanupStack::PopAndDestroy(); + // Mark the required dates frm start date to end date + TTimeIntervalDays days ; + int numOfDays = 0; + //check if the start date of the entry is before the start day of the grid + if(startDate < rangeStart.date()){ + if(endDate<=rangeEnd.date()){ + //if the end date of entry is lying in the grid , + //then mark the entry from start day of the grid to the end date of the entry + days = endCalTime.TimeLocalL().DaysFrom(startDateForInstanceSearch.TimeLocalL()); + numOfDays = days.Int(); + } + else{ + //if end date of the entry is greater then the last date of grid, + //then mark all the date of the grid with the entry + days = endDateForInstanceSearch.TimeLocalL().DaysFrom(startDateForInstanceSearch.TimeLocalL()) ; + numOfDays = days.Int(); + } + // Check if the event is all-day + if (instanceList[i]->Entry().EntryTypeL() == CCalEntry::EEvent) { + // no need to consider the date on which it ends + // reduce days count by 1 + numOfDays--; + } + //start the entries from the first day of the grid + for (int j = 0; j <= numOfDays; j++) { + QDate date = rangeStart.date().addDays(j); + if (date <= rangeEnd.date()) { + dates.append(date); + } else { + break; + } + } + } + //if the start date of the entry is lying inside the grid + else{ + if(endDate<=rangeEnd.date()){ + //if the end date of entry is lying in the grid , + //then mark the entry from start date of the entry to the end date of the entry + days = endCalTime.TimeLocalL().DaysFrom(startCalTime.TimeLocalL()) ; + numOfDays = days.Int(); + } + else{ + //if end date of the entry is greater then the last date of grid, + //then mark all the date from start date of the entry to the end date of the grid + days = endDateForInstanceSearch.TimeLocalL().DaysFrom(startCalTime.TimeLocalL()) ; + numOfDays = days.Int(); + } + // Check if the event is all-day + if (instanceList[i]->Entry().EntryTypeL() == CCalEntry::EEvent) { + // no need to consider the date on which it ends + // reduce days count by 1 + numOfDays--; + } + for (int j = 0; j <= numOfDays; j++) { + QDate date = startDate.addDays(j); + if (date <= rangeEnd.date()) { + dates.append(date); + } else { + break; + } + } + } + } else if (type == CCalEntry::EAnniv) { + if (startDate <= rangeEnd.date()) { + dates.append(startDate); + } + } else if (type == CCalEntry::ETodo) { + // if start time is less that today, then mark it for today + if (startDate < QDate::currentDate()) { + dates.append(QDate::currentDate()); + } else { + dates.append(startDate); + } + } + } + CleanupStack::PopAndDestroy(&instanceList); } QList AgendaUtilPrivate::createEntryIdListForDay( QDateTime day, AgendaUtil::FilterFlags filter ) { QList entryList; - if(!prepareSession()) { + if(!mInstanceViewCreated) { // return empty list return entryList; } @@ -1766,7 +1718,7 @@ TRAP(iError, getDayRange(day, day, dayRange); RPointerArray instanceList; - CleanupClosePushL(instanceList); + CleanupResetAndDestroyPushL(instanceList); CalCommon::TCalViewFilter filters = filter; // Check if the filter has todos also to be included if(filter & CalCommon::EIncludeIncompletedTodos) @@ -1809,6 +1761,26 @@ { iCalInstanceView->FindInstanceL(instanceList, filters, dayRange); } + + // In this list, check if any all day events are there + // As all day events end at 12.00AM of next day, we should not show it again on next day + TCalTime calTime; + TDateTime dateTime( + day.date().year(), + static_cast(day.date().month() - 1), + day.date().day() - 1, day.time().hour(), + day.time().minute(), 0, 0); + TTime time(dateTime); + for (int i(0); i < instanceList.Count(); i++) { + if ((endsAtStartOfDay(instanceList[i], time)) && + instanceList[i]->Entry().EntryTypeL() == CCalEntry::EEvent) { + // Previous day all-day event has been found, we are not supposed to + // show it on current day, hence remove it from the instance list + instanceList.Remove(i); + i--; + } + } + // Sort the list sortInstanceList(instanceList); for(TInt i = 0; iEntry(), instanceList[i])); } - int count = instanceList.Count(); - for (int i = count - 1; i >= 0; --i) { - CCalInstance *instance = instanceList[i]; - delete instance; - } - CleanupStack::PopAndDestroy(); + CleanupStack::PopAndDestroy( &instanceList ); ) return entryList; @@ -1833,7 +1800,7 @@ int success = -1 ; // First prepare the session with agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { return success; } @@ -1886,7 +1853,7 @@ const QString& fileName, ulong calendarEntryId) { // First prepare session with agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { return false; } TRAP( @@ -1953,18 +1920,16 @@ // Fetch the calentry CCalEntry* calEntry = iCalEntryView->FetchL(entry.id()); - CleanupStack::PushL(calEntry); calEntry->SetCompletedL(complete, calTime); // Update the entry in the Database RPointerArray array; - CleanupClosePushL(array); + CleanupResetAndDestroyPushL(array); array.AppendL(calEntry); iCalEntryView->UpdateL(array, success); // Cleanup. - CleanupStack::PopAndDestroy(&array); - CleanupStack::PopAndDestroy(calEntry); + CleanupStack::PopAndDestroy( &array ); ) if (0 < success) { @@ -2022,7 +1987,7 @@ { AgendaEntry parentEntry; // First check if the session with the calendar exists. - if (!prepareSession()) { + if (!mInstanceViewCreated) { // Return empty AgendaEntry. return entry; } @@ -2036,7 +2001,7 @@ if (calEntry) { // Get all the entries with same global Uid. RPointerArray entries; - CleanupClosePushL(entries); + CleanupResetAndDestroyPushL(entries); iCalEntryView->FetchL(calEntry->UidL(), entries); parentEntry = createAgendaEntryFromCalEntry(*entries[0]); CleanupStack::PopAndDestroy(&entries); @@ -2064,7 +2029,7 @@ if (calEntry) { // Get all the entries with same global Uid. RPointerArray entries; - CleanupClosePushL(entries); + CleanupResetAndDestroyPushL(entries); iCalEntryView->FetchL(calEntry->UidL(), entries); entries[0]->ClearRepeatingPropertiesL(); CleanupStack::PopAndDestroy(&entries); @@ -2083,7 +2048,7 @@ QDateTime& endTime) { RPointerArray entries; - CleanupClosePushL(entries); + CleanupResetAndDestroyPushL(entries); TCalTime previousStartTime; TCalTime previousEndTime; TTime zero(TInt64(0)); @@ -2200,6 +2165,16 @@ // Is currentInstanceDate before parent dt start? if (currentInstanceDate.TimeLocalL() < entries[0]->StartTimeL().TimeLocalL()) { + TBool exceptionEntryBeforeParentStartPresent = EFalse; + for (TInt i=0; i= 0; --i) { - CCalEntry *instance = entries[i]; - delete instance; - } CleanupStack::PopAndDestroy(&entries); } @@ -2273,7 +2249,7 @@ QDateTime& endTime) { RPointerArray entries; - CleanupClosePushL(entries); + CleanupResetAndDestroyPushL(entries); TCalTime nextStartTime; TCalTime nextEndTime; TTime zero(TInt64(0)); @@ -2387,9 +2363,19 @@ keepLooking = EFalse; break; } - // Is currentInstanceDate before parent dt start? - if (currentInstanceDate.TimeLocalL() < - entries[0]->StartTimeL().TimeLocalL()) { + // Is currentInstanceDate after repeat until date? + if (currentInstanceDate.TimeLocalL() > + rrule.Until().TimeLocalL()) { + TBool exceptionEntryAfterRepeatUntilPresent = EFalse; + for (TInt i=0; i rrule.Until().TimeLocalL()) { + exceptionEntryAfterRepeatUntilPresent = ETrue; + } + } + if (!exceptionEntryAfterRepeatUntilPresent) { + currentInstanceDate.SetTimeLocalL(Time::NullTTime()); + nextStartTime = currentInstanceDate; + } // There are no instances before the exception keepLooking = EFalse; } else { @@ -2432,22 +2418,24 @@ CleanupStack::PopAndDestroy( &exdates ); } } - // Convert TCalTimes to QDateTimes - TDateTime nextStart = nextStartTime.TimeLocalL().DateTime(); - TDateTime nextEnd = nextEndTime.TimeLocalL().DateTime(); - startTime.setDate(QDate(nextStart.Year(), nextStart.Month()+1, - nextStart.Day() + 1)); - startTime.setTime(QTime(nextStart.Hour(), nextStart.Minute(), 0, 0)); - endTime.setDate(QDate(nextEnd.Year(), nextEnd.Month()+1, - nextEnd.Day() + 1)); - endTime.setTime(QTime(nextEnd.Hour(), nextEnd.Minute(), 0, 0)); + if (nextStartTime.TimeUtcL() != Time::NullTTime()) { + // Convert TCalTimes to QDateTimes + TDateTime nextStart = nextStartTime.TimeLocalL().DateTime(); + TDateTime nextEnd = nextEndTime.TimeLocalL().DateTime(); + startTime.setDate(QDate(nextStart.Year(), nextStart.Month()+1, + nextStart.Day() + 1)); + startTime.setTime(QTime(nextStart.Hour(), nextStart.Minute(), 0, 0)); + endTime.setDate(QDate(nextEnd.Year(), nextEnd.Month()+1, + nextEnd.Day() + 1)); + endTime.setTime(QTime(nextEnd.Hour(), nextEnd.Minute(), 0, 0)); + } else { + QDateTime nullDateTime; + startTime = nullDateTime; + endTime = nullDateTime; + } delete calEntry; - int count = entries.Count(); - for (int i = count - 1; i >= 0; --i) { - CCalEntry *instance = entries[i]; - delete instance; - } + CleanupStack::PopAndDestroy(&entries); } @@ -2458,10 +2446,15 @@ */ bool AgendaUtilPrivate::areNoEntriesInCalendar() { + // First prepare the session with the agenda server. + if (!mInstanceViewCreated) { + return false; + } + bool isEmpty; // Query for the entries for entire range RPointerArray instanceList; - CleanupClosePushL(instanceList); + CleanupResetAndDestroyPushL(instanceList); // Create the filter CalCommon::TCalViewFilter filters = AgendaUtil::IncludeAnniversaries @@ -2498,7 +2491,9 @@ } else { isEmpty = true; } - CleanupStack::PopAndDestroy(); + + // Cleanup + CleanupStack::PopAndDestroy( &instanceList ); return isEmpty; } @@ -2662,8 +2657,7 @@ entry.setStartAndEndTime(startDateTime, endDateTime); // Attendees. - RPointerArray calAttendees = calEntry.AttendeesL(); - CleanupClosePushL(calAttendees); + RPointerArray& calAttendees = calEntry.AttendeesL(); for (int i = 0; i < calAttendees.Count(); i++) { AgendaAttendee attendee; @@ -2690,11 +2684,9 @@ calAttendees[i]->StatusL())); entry.addAttendee(attendee); } - CleanupStack::Pop(&calAttendees); // Categories. - RPointerArray calCategories = calEntry.CategoryListL(); - CleanupClosePushL(calCategories); + const RPointerArray& calCategories = calEntry.CategoryListL(); for (int i = 0; i < calCategories.Count(); i++) { AgendaCategory category; @@ -2710,7 +2702,6 @@ static_cast(categoryType)); entry.addCategory(category); } - CleanupStack::PopAndDestroy(&calCategories); // Id. entry.d->m_id = calEntry.LocalUidL(); @@ -2846,7 +2837,7 @@ const QList& attendees, CCalEntry& entry) { // First prepare the session with the agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { return false; } @@ -2878,7 +2869,7 @@ const QList& categories, CCalEntry& entry) { // First prepare the session with the agenda server. - if (!prepareSession()) { + if (!mInstanceViewCreated) { return false; } TRAP( @@ -2984,7 +2975,7 @@ CCalInstance* AgendaUtilPrivate::findPossibleInstance(AgendaEntry& entry) { - if(!prepareSession()) { + if(!mInstanceViewCreated) { // return empty list return NULL; } @@ -2992,7 +2983,7 @@ CalCommon::TCalTimeRange dayRange(dummy, dummy); getDayRange(entry.startTime(), entry.startTime(), dayRange); RPointerArray instances; - CleanupClosePushL(instances); + CleanupResetAndDestroyPushL(instances); iCalInstanceView->FindInstanceL(instances, CalCommon::EIncludeAll, dayRange); TTime entryStartTime(dayRange.StartTime().TimeLocalL()); @@ -3412,7 +3403,7 @@ const CalCommon::TCalTimeRange& timeRange) { RPointerArray allInstances; - CleanupClosePushL( allInstances ); + CleanupResetAndDestroyPushL(allInstances); TInt filter; // Get the entry type to be filtered @@ -3461,7 +3452,7 @@ const CalCommon::TCalTimeRange& timeRange) { RPointerArray allInstances; - CleanupClosePushL( allInstances ); + CleanupResetAndDestroyPushL(allInstances); TInt filter; // Get the entry type to be filtered @@ -3702,16 +3693,14 @@ oldEntries[i]->SequenceNumberL(), recId, oldEntries[i]->RecurrenceRangeL() ); - CleanupStack::PushL(exception); exception->CopyFromL(*oldEntries[i]); exception->SetLastModifiedDateL(); TInt successCount=0; RPointerArray entries; - CleanupClosePushL( entries ); + CleanupResetAndDestroyPushL(entries); entries.Append( exception ); iCalEntryView->StoreL( entries, successCount ); CleanupStack::PopAndDestroy( &entries ); - CleanupStack::PopAndDestroy(exception); } else { @@ -3724,10 +3713,10 @@ oldEntries[i]->SetLastModifiedDateL(); TInt successCount=0; RPointerArray entries; - CleanupClosePushL( entries ); + CleanupClosePushL(entries); entries.Append( oldEntries[i] ); iCalEntryView->StoreL( entries, successCount ); - CleanupStack::PopAndDestroy( &entries ); + CleanupStack::Pop( &entries ); } } } diff -r fd30d51f876b -r b6db4fd4947b agendainterface/bwins/agendainterfaceu.def --- a/agendainterface/bwins/agendainterfaceu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,181 +0,0 @@ -EXPORTS - ?minTime@AgendaUtil@@SA?AVQDateTime@@XZ @ 1 NONAME ; class QDateTime AgendaUtil::minTime(void) - ??4AgendaCategory@@QAEAAV0@ABV0@@Z @ 2 NONAME ; class AgendaCategory & AgendaCategory::operator=(class AgendaCategory const &) - ?addEntry@AgendaUtil@@QAEKABVAgendaEntry@@@Z @ 3 NONAME ; unsigned long AgendaUtil::addEntry(class AgendaEntry const &) - ??_EAgendaEntry@@UAE@I@Z @ 4 NONAME ; AgendaEntry::~AgendaEntry(unsigned int) - ??8AgendaEntry@@QBE_NABV0@@Z @ 5 NONAME ; bool AgendaEntry::operator==(class AgendaEntry const &) const - ??1AgendaAlarm@@QAE@XZ @ 6 NONAME ; AgendaAlarm::~AgendaAlarm(void) - ?setAlarm@AgendaEntry@@QAEXABVAgendaAlarm@@@Z @ 7 NONAME ; void AgendaEntry::setAlarm(class AgendaAlarm const &) - ?isNull@AgendaEntry@@QBE_NXZ @ 8 NONAME ; bool AgendaEntry::isNull(void) const - ?isNull@AgendaCategory@@QBE_NXZ @ 9 NONAME ; bool AgendaCategory::isNull(void) const - ??8AgendaRepeatRule@@QBE_NABV0@@Z @ 10 NONAME ; bool AgendaRepeatRule::operator==(class AgendaRepeatRule const &) const - ?entryUpdated@AgendaUtil@@IAEXK@Z @ 11 NONAME ; void AgendaUtil::entryUpdated(unsigned long) - ?alarmSoundName@AgendaAlarm@@QBE?AVQString@@XZ @ 12 NONAME ; class QString AgendaAlarm::alarmSoundName(void) const - ?alarm@AgendaEntry@@QBE?AVAgendaAlarm@@XZ @ 13 NONAME ; class AgendaAlarm AgendaEntry::alarm(void) const - ?responseRequested@AgendaAttendee@@QBE_NXZ @ 14 NONAME ; bool AgendaAttendee::responseRequested(void) const - ?startTime@AgendaEntry@@QBE?AVQDateTime@@XZ @ 15 NONAME ; class QDateTime AgendaEntry::startTime(void) const - ?geoValue@AgendaEntry@@QBE?AVAgendaGeoValue@@XZ @ 16 NONAME ; class AgendaGeoValue AgendaEntry::geoValue(void) const - ?getNextInstanceTimes@AgendaUtil@@QAEXAAVAgendaEntry@@AAVQDateTime@@1@Z @ 17 NONAME ; void AgendaUtil::getNextInstanceTimes(class AgendaEntry &, class QDateTime &, class QDateTime &) - ?exportAsvCalendar@AgendaUtil@@QAE_NABVQString@@J@Z @ 18 NONAME ; bool AgendaUtil::exportAsvCalendar(class QString const &, long) - ??_EAgendaAttendee@@UAE@I@Z @ 19 NONAME ; AgendaAttendee::~AgendaAttendee(unsigned int) - ??9AgendaAlarm@@QBE_NABV0@@Z @ 20 NONAME ; bool AgendaAlarm::operator!=(class AgendaAlarm const &) const - ?isNull@AgendaAlarm@@QBE_NXZ @ 21 NONAME ; bool AgendaAlarm::isNull(void) const - ?extendedCategoryName@AgendaCategory@@QBE?AVQString@@XZ @ 22 NONAME ; class QString AgendaCategory::extendedCategoryName(void) const - ?entryIds@AgendaUtil@@QAE?AV?$QList@K@@W4FilterFlags@1@@Z @ 23 NONAME ; class QList AgendaUtil::entryIds(enum AgendaUtil::FilterFlags) - ?isRepeating@AgendaEntry@@QAE_NXZ @ 24 NONAME ; bool AgendaEntry::isRepeating(void) - ?clearRepeatingProperties@AgendaUtil@@QAEXAAVAgendaEntry@@@Z @ 25 NONAME ; void AgendaUtil::clearRepeatingProperties(class AgendaEntry &) - ?deleteRepeatedEntry@AgendaUtil@@QAEXAAVAgendaEntry@@W4RecurrenceRange@1@@Z @ 26 NONAME ; void AgendaUtil::deleteRepeatedEntry(class AgendaEntry &, enum AgendaUtil::RecurrenceRange) - ?tr@AgendaUtil@@SA?AVQString@@PBD0H@Z @ 27 NONAME ; class QString AgendaUtil::tr(char const *, char const *, int) - ?description@AgendaEntry@@QBE?AVQString@@XZ @ 28 NONAME ; class QString AgendaEntry::description(void) const - ??0AgendaUtil@@QAE@PAVQObject@@@Z @ 29 NONAME ; AgendaUtil::AgendaUtil(class QObject *) - ?categories@AgendaEntry@@QAEAAV?$QList@VAgendaCategory@@@@XZ @ 30 NONAME ; class QList & AgendaEntry::categories(void) - ?createException@AgendaUtil@@QAE_NABVAgendaEntry@@@Z @ 31 NONAME ; bool AgendaUtil::createException(class AgendaEntry const &) - ?entriesChanged@AgendaUtil@@IAEXV?$QList@K@@@Z @ 32 NONAME ; void AgendaUtil::entriesChanged(class QList) - ??0AgendaGeoValue@@QAE@XZ @ 33 NONAME ; AgendaGeoValue::AgendaGeoValue(void) - ?status@AgendaAttendee@@QBE?AW4StatusType@1@XZ @ 34 NONAME ; enum AgendaAttendee::StatusType AgendaAttendee::status(void) const - ?markDatesWithEvents@AgendaUtil@@QAEXVQDateTime@@0W4FilterFlags@1@AAV?$QList@VQDate@@@@@Z @ 35 NONAME ; void AgendaUtil::markDatesWithEvents(class QDateTime, class QDateTime, enum AgendaUtil::FilterFlags, class QList &) - ??9AgendaGeoValue@@QBE_NABV0@@Z @ 36 NONAME ; bool AgendaGeoValue::operator!=(class AgendaGeoValue const &) const - ??0AgendaAlarm@@QAE@XZ @ 37 NONAME ; AgendaAlarm::AgendaAlarm(void) - ?byMonth@AgendaRepeatRule@@QBE?AV?$QList@W4Month@AgendaRepeatRule@@@@XZ @ 38 NONAME ; class QList AgendaRepeatRule::byMonth(void) const - ?isNull@AgendaAttendee@@QBE_NXZ @ 39 NONAME ; bool AgendaAttendee::isNull(void) const - ?setAddress@AgendaAttendee@@QAEXABVQString@@@Z @ 40 NONAME ; void AgendaAttendee::setAddress(class QString const &) - ?setRepeatRuleStart@AgendaRepeatRule@@QAEXABVQDateTime@@@Z @ 41 NONAME ; void AgendaRepeatRule::setRepeatRuleStart(class QDateTime const &) - ?trUtf8@AgendaUtil@@SA?AVQString@@PBD0H@Z @ 42 NONAME ; class QString AgendaUtil::trUtf8(char const *, char const *, int) - ?setLastModifiedDateTime@AgendaEntry@@QAEXABVQDateTime@@@Z @ 43 NONAME ; void AgendaEntry::setLastModifiedDateTime(class QDateTime const &) - ??0AgendaAlarm@@QAE@ABV0@@Z @ 44 NONAME ; AgendaAlarm::AgendaAlarm(class AgendaAlarm const &) - ?setSummary@AgendaEntry@@QAEXABVQString@@@Z @ 45 NONAME ; void AgendaEntry::setSummary(class QString const &) - ?setByMonthDay@AgendaRepeatRule@@QAEXABV?$QList@H@@@Z @ 46 NONAME ; void AgendaRepeatRule::setByMonthDay(class QList const &) - ??1AgendaEntry@@UAE@XZ @ 47 NONAME ; AgendaEntry::~AgendaEntry(void) - ?setResponseRequested@AgendaAttendee@@QAEX_N@Z @ 48 NONAME ; void AgendaAttendee::setResponseRequested(bool) - ??1AgendaRepeatRule@@QAE@XZ @ 49 NONAME ; AgendaRepeatRule::~AgendaRepeatRule(void) - ?byMonthDay@AgendaRepeatRule@@QBE?AV?$QList@H@@XZ @ 50 NONAME ; class QList AgendaRepeatRule::byMonthDay(void) const - ?detach@AgendaGeoValue@@AAEXXZ @ 51 NONAME ; void AgendaGeoValue::detach(void) - ?detach@AgendaEntry@@AAEXXZ @ 52 NONAME ; void AgendaEntry::detach(void) - ??9AgendaAttendee@@QBE_NABV0@@Z @ 53 NONAME ; bool AgendaAttendee::operator!=(class AgendaAttendee const &) const - ??9AgendaRepeatRule@@QBE_NABV0@@Z @ 54 NONAME ; bool AgendaRepeatRule::operator!=(class AgendaRepeatRule const &) const - ?weekStart@AgendaRepeatRule@@QBE?AW4Day@1@XZ @ 55 NONAME ; enum AgendaRepeatRule::Day AgendaRepeatRule::weekStart(void) const - ??4AgendaAlarm@@QAEAAV0@ABV0@@Z @ 56 NONAME ; class AgendaAlarm & AgendaAlarm::operator=(class AgendaAlarm const &) - ?lastModifiedDateTime@AgendaEntry@@QBE?AVQDateTime@@XZ @ 57 NONAME ; class QDateTime AgendaEntry::lastModifiedDateTime(void) const - ?attendees@AgendaEntry@@QBEABV?$QList@VAgendaAttendee@@@@XZ @ 58 NONAME ; class QList const & AgendaEntry::attendees(void) const - ?setInterval@AgendaRepeatRule@@QAEXH@Z @ 59 NONAME ; void AgendaRepeatRule::setInterval(int) - ?updateEntry@AgendaUtil@@QAE_NABVAgendaEntry@@_N@Z @ 60 NONAME ; bool AgendaUtil::updateEntry(class AgendaEntry const &, bool) - ??8AgendaGeoValue@@QBE_NABV0@@Z @ 61 NONAME ; bool AgendaGeoValue::operator==(class AgendaGeoValue const &) const - ?id@AgendaEntry@@QBEKXZ @ 62 NONAME ; unsigned long AgendaEntry::id(void) const - ?setByDay@AgendaRepeatRule@@QAEXABV?$QList@W4Day@AgendaRepeatRule@@@@@Z @ 63 NONAME ; void AgendaRepeatRule::setByDay(class QList const &) - ?setUntil@AgendaRepeatRule@@QAEXABVQDateTime@@@Z @ 64 NONAME ; void AgendaRepeatRule::setUntil(class QDateTime const &) - ?setType@AgendaRepeatRule@@QAEXW4RuleType@1@@Z @ 65 NONAME ; void AgendaRepeatRule::setType(enum AgendaRepeatRule::RuleType) - ?interval@AgendaRepeatRule@@QBEHXZ @ 66 NONAME ; int AgendaRepeatRule::interval(void) const - ?rDates@AgendaEntry@@QBE?AV?$QList@VQDate@@@@XZ @ 67 NONAME ; class QList AgendaEntry::rDates(void) const - ?repeatRuleStart@AgendaRepeatRule@@QBE?AVQDateTime@@XZ @ 68 NONAME ; class QDateTime AgendaRepeatRule::repeatRuleStart(void) const - ??8AgendaAlarm@@QBE_NABV0@@Z @ 69 NONAME ; bool AgendaAlarm::operator==(class AgendaAlarm const &) const - ?storeRepeatingEntry@AgendaUtil@@QAE_NABVAgendaEntry@@_N@Z @ 70 NONAME ; bool AgendaUtil::storeRepeatingEntry(class AgendaEntry const &, bool) - ??0AgendaRepeatRule@@QAE@ABV0@@Z @ 71 NONAME ; AgendaRepeatRule::AgendaRepeatRule(class AgendaRepeatRule const &) - ?setStatus@AgendaAttendee@@QAEXW4StatusType@1@@Z @ 72 NONAME ; void AgendaAttendee::setStatus(enum AgendaAttendee::StatusType) - ?setStatus@AgendaEntry@@QAEXW4Status@1@@Z @ 73 NONAME ; void AgendaEntry::setStatus(enum AgendaEntry::Status) - ?setExtendedCategoryName@AgendaCategory@@QAEXABVQString@@@Z @ 74 NONAME ; void AgendaCategory::setExtendedCategoryName(class QString const &) - ?setDescription@AgendaEntry@@QAEXABVQString@@@Z @ 75 NONAME ; void AgendaEntry::setDescription(class QString const &) - ?recurrenceId@AgendaEntry@@QAE?AVQDateTime@@XZ @ 76 NONAME ; class QDateTime AgendaEntry::recurrenceId(void) - ?until@AgendaRepeatRule@@QBE?AVQDateTime@@XZ @ 77 NONAME ; class QDateTime AgendaRepeatRule::until(void) const - ?setByMonth@AgendaRepeatRule@@QAEXABV?$QList@W4Month@AgendaRepeatRule@@@@@Z @ 78 NONAME ; void AgendaRepeatRule::setByMonth(class QList const &) - ?qt_metacall@AgendaUtil@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 79 NONAME ; int AgendaUtil::qt_metacall(enum QMetaObject::Call, int, void * *) - ?qt_metacast@AgendaUtil@@UAEPAXPBD@Z @ 80 NONAME ; void * AgendaUtil::qt_metacast(char const *) - ?isNull@AgendaRepeatRule@@QBE_NXZ @ 81 NONAME ; bool AgendaRepeatRule::isNull(void) const - ?getStaticMetaObject@AgendaUtil@@SAABUQMetaObject@@XZ @ 82 NONAME ; struct QMetaObject const & AgendaUtil::getStaticMetaObject(void) - ??8AgendaAttendee@@QBE_NABV0@@Z @ 83 NONAME ; bool AgendaAttendee::operator==(class AgendaAttendee const &) const - ?addCategory@AgendaEntry@@QAEXABVAgendaCategory@@@Z @ 84 NONAME ; void AgendaEntry::addCategory(class AgendaCategory const &) - ?setLocation@AgendaEntry@@QAEXABVQString@@@Z @ 85 NONAME ; void AgendaEntry::setLocation(class QString const &) - ?isTimedEntry@AgendaEntry@@QAE_NXZ @ 86 NONAME ; bool AgendaEntry::isTimedEntry(void) - ?favourite@AgendaEntry@@QBEIXZ @ 87 NONAME ; unsigned int AgendaEntry::favourite(void) const - ?durationInSecs@AgendaEntry@@QBEHXZ @ 88 NONAME ; int AgendaEntry::durationInSecs(void) const - ??1AgendaUtil@@UAE@XZ @ 89 NONAME ; AgendaUtil::~AgendaUtil(void) - ?category@AgendaCategory@@QBE?AW4CategoryType@1@XZ @ 90 NONAME ; enum AgendaCategory::CategoryType AgendaCategory::category(void) const - ?entryAdded@AgendaUtil@@IAEXK@Z @ 91 NONAME ; void AgendaUtil::entryAdded(unsigned long) - ?role@AgendaAttendee@@QBE?AW4ParticipantRole@1@XZ @ 92 NONAME ; enum AgendaAttendee::ParticipantRole AgendaAttendee::role(void) const - ?type@AgendaEntry@@QBE?AW4Type@1@XZ @ 93 NONAME ; enum AgendaEntry::Type AgendaEntry::type(void) const - ??0AgendaEntry@@QAE@W4Type@0@@Z @ 94 NONAME ; AgendaEntry::AgendaEntry(enum AgendaEntry::Type) - ?detach@AgendaRepeatRule@@AAEXXZ @ 95 NONAME ; void AgendaRepeatRule::detach(void) - ?error@AgendaUtil@@QBE?AW4Error@1@XZ @ 96 NONAME ; enum AgendaUtil::Error AgendaUtil::error(void) const - ?trUtf8@AgendaUtil@@SA?AVQString@@PBD0@Z @ 97 NONAME ; class QString AgendaUtil::trUtf8(char const *, char const *) - ?status@AgendaEntry@@QBE?AW4Status@1@XZ @ 98 NONAME ; enum AgendaEntry::Status AgendaEntry::status(void) const - ??0AgendaEntry@@QAE@ABV0@@Z @ 99 NONAME ; AgendaEntry::AgendaEntry(class AgendaEntry const &) - ??4AgendaAttendee@@QAEAAV0@ABV0@@Z @ 100 NONAME ; class AgendaAttendee & AgendaAttendee::operator=(class AgendaAttendee const &) - ?address@AgendaAttendee@@QBE?AVQString@@XZ @ 101 NONAME ; class QString AgendaAttendee::address(void) const - ?entryDeleted@AgendaUtil@@IAEXK@Z @ 102 NONAME ; void AgendaUtil::entryDeleted(unsigned long) - ?summary@AgendaEntry@@QBE?AVQString@@XZ @ 103 NONAME ; class QString AgendaEntry::summary(void) const - ?priority@AgendaEntry@@QBEHXZ @ 104 NONAME ; int AgendaEntry::priority(void) const - ?fetchById@AgendaUtil@@QAE?AVAgendaEntry@@K@Z @ 105 NONAME ; class AgendaEntry AgendaUtil::fetchById(unsigned long) - ?setCommonName@AgendaAttendee@@QAEXABVQString@@@Z @ 106 NONAME ; void AgendaAttendee::setCommonName(class QString const &) - ?setMethod@AgendaEntry@@QAEXW4Method@1@@Z @ 107 NONAME ; void AgendaEntry::setMethod(enum AgendaEntry::Method) - ?setRDates@AgendaEntry@@QAEXABV?$QList@VQDate@@@@@Z @ 108 NONAME ; void AgendaEntry::setRDates(class QList const &) - ?parentEntry@AgendaUtil@@QAE?AVAgendaEntry@@AAV2@@Z @ 109 NONAME ; class AgendaEntry AgendaUtil::parentEntry(class AgendaEntry &) - ?addAttendee@AgendaEntry@@QAEXABVAgendaAttendee@@@Z @ 110 NONAME ; void AgendaEntry::addAttendee(class AgendaAttendee const &) - ?setCompleted@AgendaUtil@@QAEXAAVAgendaEntry@@_NAAVQDateTime@@@Z @ 111 NONAME ; void AgendaUtil::setCompleted(class AgendaEntry &, bool, class QDateTime &) - ??0AgendaCategory@@QAE@XZ @ 112 NONAME ; AgendaCategory::AgendaCategory(void) - ?timeOffset@AgendaAlarm@@QBEHXZ @ 113 NONAME ; int AgendaAlarm::timeOffset(void) const - ??0AgendaAttendee@@QAE@XZ @ 114 NONAME ; AgendaAttendee::AgendaAttendee(void) - ?setAlarmSoundName@AgendaAlarm@@QAEXABVQString@@@Z @ 115 NONAME ; void AgendaAlarm::setAlarmSoundName(class QString const &) - ?fetchEntriesInRange@AgendaUtil@@QAE?AV?$QList@VAgendaEntry@@@@VQDateTime@@0W4FilterFlags@1@@Z @ 116 NONAME ; class QList AgendaUtil::fetchEntriesInRange(class QDateTime, class QDateTime, enum AgendaUtil::FilterFlags) - ?detach@AgendaAlarm@@AAEXXZ @ 117 NONAME ; void AgendaAlarm::detach(void) - ?setWeekStart@AgendaRepeatRule@@QAEXW4Day@1@@Z @ 118 NONAME ; void AgendaRepeatRule::setWeekStart(enum AgendaRepeatRule::Day) - ?setFavourite@AgendaEntry@@QAEXI@Z @ 119 NONAME ; void AgendaEntry::setFavourite(unsigned int) - ?setDTStamp@AgendaEntry@@QAEXABVQDateTime@@@Z @ 120 NONAME ; void AgendaEntry::setDTStamp(class QDateTime const &) - ?cloneEntry@AgendaUtil@@QAEKABVAgendaEntry@@W4Type@2@@Z @ 121 NONAME ; unsigned long AgendaUtil::cloneEntry(class AgendaEntry const &, enum AgendaEntry::Type) - ?setRepeatRule@AgendaEntry@@QAEXABVAgendaRepeatRule@@@Z @ 122 NONAME ; void AgendaEntry::setRepeatRule(class AgendaRepeatRule const &) - ?categories@AgendaEntry@@QBEABV?$QList@VAgendaCategory@@@@XZ @ 123 NONAME ; class QList const & AgendaEntry::categories(void) const - ?tr@AgendaUtil@@SA?AVQString@@PBD0@Z @ 124 NONAME ; class QString AgendaUtil::tr(char const *, char const *) - ??4AgendaRepeatRule@@QAEAAV0@ABV0@@Z @ 125 NONAME ; class AgendaRepeatRule & AgendaRepeatRule::operator=(class AgendaRepeatRule const &) - ?setCompletedDateTime@AgendaEntry@@QAEXABVQDateTime@@@Z @ 126 NONAME ; void AgendaEntry::setCompletedDateTime(class QDateTime const &) - ??0AgendaRepeatRule@@QAE@XZ @ 127 NONAME ; AgendaRepeatRule::AgendaRepeatRule(void) - ?dtStamp@AgendaEntry@@QBE?AVQDateTime@@XZ @ 128 NONAME ; class QDateTime AgendaEntry::dtStamp(void) const - ?method@AgendaEntry@@QBE?AW4Method@1@XZ @ 129 NONAME ; enum AgendaEntry::Method AgendaEntry::method(void) const - ?type@AgendaRepeatRule@@QBE?AW4RuleType@1@XZ @ 130 NONAME ; enum AgendaRepeatRule::RuleType AgendaRepeatRule::type(void) const - ??4AgendaGeoValue@@QAEAAV0@ABV0@@Z @ 131 NONAME ; class AgendaGeoValue & AgendaGeoValue::operator=(class AgendaGeoValue const &) - ??0AgendaCategory@@QAE@W4CategoryType@0@@Z @ 132 NONAME ; AgendaCategory::AgendaCategory(enum AgendaCategory::CategoryType) - ?commonName@AgendaAttendee@@QBE?AVQString@@XZ @ 133 NONAME ; class QString AgendaAttendee::commonName(void) const - ?detach@AgendaCategory@@AAEXXZ @ 134 NONAME ; void AgendaCategory::detach(void) - ??0AgendaGeoValue@@QAE@ABV0@@Z @ 135 NONAME ; AgendaGeoValue::AgendaGeoValue(class AgendaGeoValue const &) - ?isWorkdaysRepeatingEntry@AgendaUtil@@SA_NABVAgendaRepeatRule@@@Z @ 136 NONAME ; bool AgendaUtil::isWorkdaysRepeatingEntry(class AgendaRepeatRule const &) - ?setRole@AgendaAttendee@@QAEXW4ParticipantRole@1@@Z @ 137 NONAME ; void AgendaAttendee::setRole(enum AgendaAttendee::ParticipantRole) - ?detach@AgendaAttendee@@AAEXXZ @ 138 NONAME ; void AgendaAttendee::detach(void) - ?getLatLong@AgendaGeoValue@@QBEXAAN0@Z @ 139 NONAME ; void AgendaGeoValue::getLatLong(double &, double &) const - ?maxTime@AgendaUtil@@SA?AVQDateTime@@XZ @ 140 NONAME ; class QDateTime AgendaUtil::maxTime(void) - ?setCategory@AgendaCategory@@QAEXW4CategoryType@1@@Z @ 141 NONAME ; void AgendaCategory::setCategory(enum AgendaCategory::CategoryType) - ?endTime@AgendaEntry@@QBE?AVQDateTime@@XZ @ 142 NONAME ; class QDateTime AgendaEntry::endTime(void) const - ??9AgendaEntry@@QBE_NABV0@@Z @ 143 NONAME ; bool AgendaEntry::operator!=(class AgendaEntry const &) const - ??0AgendaRepeatRule@@QAE@W4RuleType@0@@Z @ 144 NONAME ; AgendaRepeatRule::AgendaRepeatRule(enum AgendaRepeatRule::RuleType) - ??9AgendaCategory@@QBE_NABV0@@Z @ 145 NONAME ; bool AgendaCategory::operator!=(class AgendaCategory const &) const - ??0AgendaAttendee@@QAE@ABV0@@Z @ 146 NONAME ; AgendaAttendee::AgendaAttendee(class AgendaAttendee const &) - ??0AgendaAttendee@@QAE@ABVQString@@@Z @ 147 NONAME ; AgendaAttendee::AgendaAttendee(class QString const &) - ?importvCalendar@AgendaUtil@@QAEHABVQString@@AAVAgendaEntry@@@Z @ 148 NONAME ; int AgendaUtil::importvCalendar(class QString const &, class AgendaEntry &) - ??_EAgendaUtil@@UAE@I@Z @ 149 NONAME ; AgendaUtil::~AgendaUtil(unsigned int) - ?setGeoValue@AgendaEntry@@QAEXABVAgendaGeoValue@@@Z @ 150 NONAME ; void AgendaEntry::setGeoValue(class AgendaGeoValue const &) - ?getPreviousInstanceTimes@AgendaUtil@@QAEXAAVAgendaEntry@@AAVQDateTime@@1@Z @ 151 NONAME ; void AgendaUtil::getPreviousInstanceTimes(class AgendaEntry &, class QDateTime &, class QDateTime &) - ?attendees@AgendaEntry@@QAEAAV?$QList@VAgendaAttendee@@@@XZ @ 152 NONAME ; class QList & AgendaEntry::attendees(void) - ?staticMetaObject@AgendaUtil@@2UQMetaObject@@B @ 153 NONAME ; struct QMetaObject const AgendaUtil::staticMetaObject - ?entriesDeleted@AgendaUtil@@IAEXH@Z @ 154 NONAME ; void AgendaUtil::entriesDeleted(int) - ?fetchAllEntries@AgendaUtil@@QAE?AV?$QList@VAgendaEntry@@@@W4FilterFlags@1@@Z @ 155 NONAME ; class QList AgendaUtil::fetchAllEntries(enum AgendaUtil::FilterFlags) - ?setTimeOffset@AgendaAlarm@@QAEXH@Z @ 156 NONAME ; void AgendaAlarm::setTimeOffset(int) - ??0AgendaEntry@@QAE@XZ @ 157 NONAME ; AgendaEntry::AgendaEntry(void) - ?setPriority@AgendaEntry@@QAEXH@Z @ 158 NONAME ; void AgendaEntry::setPriority(int) - ?setType@AgendaEntry@@QAEXW4Type@1@@Z @ 159 NONAME ; void AgendaEntry::setType(enum AgendaEntry::Type) - ?setStartAndEndTime@AgendaEntry@@QAE_NABVQDateTime@@0@Z @ 160 NONAME ; bool AgendaEntry::setStartAndEndTime(class QDateTime const &, class QDateTime const &) - ?deleteEntries@AgendaUtil@@QAEXAAVQDateTime@@0W4FilterFlags@1@@Z @ 161 NONAME ; void AgendaUtil::deleteEntries(class QDateTime &, class QDateTime &, enum AgendaUtil::FilterFlags) - ?metaObject@AgendaUtil@@UBEPBUQMetaObject@@XZ @ 162 NONAME ; struct QMetaObject const * AgendaUtil::metaObject(void) const - ?location@AgendaEntry@@QBE?AVQString@@XZ @ 163 NONAME ; class QString AgendaEntry::location(void) const - ??8AgendaCategory@@QBE_NABV0@@Z @ 164 NONAME ; bool AgendaCategory::operator==(class AgendaCategory const &) const - ??0AgendaCategory@@QAE@ABV0@@Z @ 165 NONAME ; AgendaCategory::AgendaCategory(class AgendaCategory const &) - ??1AgendaGeoValue@@QAE@XZ @ 166 NONAME ; AgendaGeoValue::~AgendaGeoValue(void) - ??4AgendaEntry@@QAEAAV0@ABV0@@Z @ 167 NONAME ; class AgendaEntry & AgendaEntry::operator=(class AgendaEntry const &) - ??_EAgendaCategory@@UAE@I@Z @ 168 NONAME ; AgendaCategory::~AgendaCategory(unsigned int) - ?createEntryIdListForDay@AgendaUtil@@QAE?AV?$QList@VAgendaEntry@@@@VQDateTime@@W4FilterFlags@1@@Z @ 169 NONAME ; class QList AgendaUtil::createEntryIdListForDay(class QDateTime, enum AgendaUtil::FilterFlags) - ?repeatRule@AgendaEntry@@QBE?AVAgendaRepeatRule@@XZ @ 170 NONAME ; class AgendaRepeatRule AgendaEntry::repeatRule(void) const - ??1AgendaCategory@@UAE@XZ @ 171 NONAME ; AgendaCategory::~AgendaCategory(void) - ?deleteEntry@AgendaUtil@@QAE_NK@Z @ 172 NONAME ; bool AgendaUtil::deleteEntry(unsigned long) - ??1AgendaAttendee@@UAE@XZ @ 173 NONAME ; AgendaAttendee::~AgendaAttendee(void) - ?byDay@AgendaRepeatRule@@QBE?AV?$QList@W4Day@AgendaRepeatRule@@@@XZ @ 174 NONAME ; class QList AgendaRepeatRule::byDay(void) const - ?setLatLong@AgendaGeoValue@@QAEXNN@Z @ 175 NONAME ; void AgendaGeoValue::setLatLong(double, double) - ?completedDateTime@AgendaEntry@@QBE?AVQDateTime@@XZ @ 176 NONAME ; class QDateTime AgendaEntry::completedDateTime(void) const - ?setRecurrenceId@AgendaEntry@@QAEXAAVQDateTime@@@Z @ 177 NONAME ; void AgendaEntry::setRecurrenceId(class QDateTime &) - ?isNull@AgendaGeoValue@@QBE_NXZ @ 178 NONAME ; bool AgendaGeoValue::isNull(void) const - ?areNoEntriesInCalendar@AgendaUtil@@QAE_NXZ @ 179 NONAME ; bool AgendaUtil::areNoEntriesInCalendar(void) - diff -r fd30d51f876b -r b6db4fd4947b agendainterface/eabi/agendainterfaceu.def --- a/agendainterface/eabi/agendainterfaceu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,209 +0,0 @@ -EXPORTS - _ZN10AgendaUtil10cloneEntryERK11AgendaEntryNS0_4TypeE @ 1 NONAME - _ZN10AgendaUtil10entryAddedEm @ 2 NONAME - _ZN10AgendaUtil11deleteEntryEm @ 3 NONAME - _ZN10AgendaUtil11parentEntryER11AgendaEntry @ 4 NONAME - _ZN10AgendaUtil11qt_metacallEN11QMetaObject4CallEiPPv @ 5 NONAME - _ZN10AgendaUtil11qt_metacastEPKc @ 6 NONAME - _ZN10AgendaUtil11updateEntryERK11AgendaEntryb @ 7 NONAME - _ZN10AgendaUtil12entryDeletedEm @ 8 NONAME - _ZN10AgendaUtil12entryUpdatedEm @ 9 NONAME - _ZN10AgendaUtil12setCompletedER11AgendaEntrybR9QDateTime @ 10 NONAME - _ZN10AgendaUtil13deleteEntriesER9QDateTimeS1_NS_11FilterFlagsE @ 11 NONAME - _ZN10AgendaUtil14entriesChangedE5QListImE @ 12 NONAME - _ZN10AgendaUtil14entriesDeletedEi @ 13 NONAME - _ZN10AgendaUtil15createExceptionERK11AgendaEntry @ 14 NONAME - _ZN10AgendaUtil15fetchAllEntriesENS_11FilterFlagsE @ 15 NONAME - _ZN10AgendaUtil15importvCalendarERK7QStringR11AgendaEntry @ 16 NONAME - _ZN10AgendaUtil16staticMetaObjectE @ 17 NONAME DATA 16 - _ZN10AgendaUtil17exportAsvCalendarERK7QStringl @ 18 NONAME - _ZN10AgendaUtil19deleteRepeatedEntryER11AgendaEntryNS_15RecurrenceRangeE @ 19 NONAME - _ZN10AgendaUtil19fetchEntriesInRangeE9QDateTimeS0_NS_11FilterFlagsE @ 20 NONAME - _ZN10AgendaUtil19getStaticMetaObjectEv @ 21 NONAME - _ZN10AgendaUtil19markDatesWithEventsE9QDateTimeS0_NS_11FilterFlagsER5QListI5QDateE @ 22 NONAME - _ZN10AgendaUtil19storeRepeatingEntryERK11AgendaEntryb @ 23 NONAME - _ZN10AgendaUtil20getNextInstanceTimesER11AgendaEntryR9QDateTimeS3_ @ 24 NONAME - _ZN10AgendaUtil23createEntryIdListForDayE9QDateTimeNS_11FilterFlagsE @ 25 NONAME - _ZN10AgendaUtil24clearRepeatingPropertiesER11AgendaEntry @ 26 NONAME - _ZN10AgendaUtil24getPreviousInstanceTimesER11AgendaEntryR9QDateTimeS3_ @ 27 NONAME - _ZN10AgendaUtil24isWorkdaysRepeatingEntryERK16AgendaRepeatRule @ 28 NONAME - _ZN10AgendaUtil7maxTimeEv @ 29 NONAME - _ZN10AgendaUtil7minTimeEv @ 30 NONAME - _ZN10AgendaUtil8addEntryERK11AgendaEntry @ 31 NONAME - _ZN10AgendaUtil8entryIdsENS_11FilterFlagsE @ 32 NONAME - _ZN10AgendaUtil9fetchByIdEm @ 33 NONAME - _ZN10AgendaUtilC1EP7QObject @ 34 NONAME - _ZN10AgendaUtilC2EP7QObject @ 35 NONAME - _ZN10AgendaUtilD0Ev @ 36 NONAME - _ZN10AgendaUtilD1Ev @ 37 NONAME - _ZN10AgendaUtilD2Ev @ 38 NONAME - _ZN11AgendaAlarm13setTimeOffsetEi @ 39 NONAME - _ZN11AgendaAlarm17setAlarmSoundNameERK7QString @ 40 NONAME - _ZN11AgendaAlarm6detachEv @ 41 NONAME - _ZN11AgendaAlarmC1ERKS_ @ 42 NONAME - _ZN11AgendaAlarmC1Ev @ 43 NONAME - _ZN11AgendaAlarmC2ERKS_ @ 44 NONAME - _ZN11AgendaAlarmC2Ev @ 45 NONAME - _ZN11AgendaAlarmD1Ev @ 46 NONAME - _ZN11AgendaAlarmD2Ev @ 47 NONAME - _ZN11AgendaAlarmaSERKS_ @ 48 NONAME - _ZN11AgendaEntry10categoriesEv @ 49 NONAME - _ZN11AgendaEntry10setDTStampERK9QDateTime @ 50 NONAME - _ZN11AgendaEntry10setSummaryERK7QString @ 51 NONAME - _ZN11AgendaEntry11addAttendeeERK14AgendaAttendee @ 52 NONAME - _ZN11AgendaEntry11addCategoryERK14AgendaCategory @ 53 NONAME - _ZN11AgendaEntry11isRepeatingEv @ 54 NONAME - _ZN11AgendaEntry11setGeoValueERK14AgendaGeoValue @ 55 NONAME - _ZN11AgendaEntry11setLocationERK7QString @ 56 NONAME - _ZN11AgendaEntry11setPriorityEi @ 57 NONAME - _ZN11AgendaEntry12isTimedEntryEv @ 58 NONAME - _ZN11AgendaEntry12recurrenceIdEv @ 59 NONAME - _ZN11AgendaEntry12setFavouriteEj @ 60 NONAME - _ZN11AgendaEntry13setRepeatRuleERK16AgendaRepeatRule @ 61 NONAME - _ZN11AgendaEntry14setDescriptionERK7QString @ 62 NONAME - _ZN11AgendaEntry15setRecurrenceIdER9QDateTime @ 63 NONAME - _ZN11AgendaEntry18setStartAndEndTimeERK9QDateTimeS2_ @ 64 NONAME - _ZN11AgendaEntry20setCompletedDateTimeERK9QDateTime @ 65 NONAME - _ZN11AgendaEntry23setLastModifiedDateTimeERK9QDateTime @ 66 NONAME - _ZN11AgendaEntry6detachEv @ 67 NONAME - _ZN11AgendaEntry7setTypeENS_4TypeE @ 68 NONAME - _ZN11AgendaEntry8setAlarmERK11AgendaAlarm @ 69 NONAME - _ZN11AgendaEntry9attendeesEv @ 70 NONAME - _ZN11AgendaEntry9setMethodENS_6MethodE @ 71 NONAME - _ZN11AgendaEntry9setRDatesERK5QListI5QDateE @ 72 NONAME - _ZN11AgendaEntry9setStatusENS_6StatusE @ 73 NONAME - _ZN11AgendaEntryC1ENS_4TypeE @ 74 NONAME - _ZN11AgendaEntryC1ERKS_ @ 75 NONAME - _ZN11AgendaEntryC1Ev @ 76 NONAME - _ZN11AgendaEntryC2ENS_4TypeE @ 77 NONAME - _ZN11AgendaEntryC2ERKS_ @ 78 NONAME - _ZN11AgendaEntryC2Ev @ 79 NONAME - _ZN11AgendaEntryD0Ev @ 80 NONAME - _ZN11AgendaEntryD1Ev @ 81 NONAME - _ZN11AgendaEntryD2Ev @ 82 NONAME - _ZN11AgendaEntryaSERKS_ @ 83 NONAME - _ZN14AgendaAttendee10setAddressERK7QString @ 84 NONAME - _ZN14AgendaAttendee13setCommonNameERK7QString @ 85 NONAME - _ZN14AgendaAttendee20setResponseRequestedEb @ 86 NONAME - _ZN14AgendaAttendee6detachEv @ 87 NONAME - _ZN14AgendaAttendee7setRoleENS_15ParticipantRoleE @ 88 NONAME - _ZN14AgendaAttendee9setStatusENS_10StatusTypeE @ 89 NONAME - _ZN14AgendaAttendeeC1ERK7QString @ 90 NONAME - _ZN14AgendaAttendeeC1ERKS_ @ 91 NONAME - _ZN14AgendaAttendeeC1Ev @ 92 NONAME - _ZN14AgendaAttendeeC2ERK7QString @ 93 NONAME - _ZN14AgendaAttendeeC2ERKS_ @ 94 NONAME - _ZN14AgendaAttendeeC2Ev @ 95 NONAME - _ZN14AgendaAttendeeD0Ev @ 96 NONAME - _ZN14AgendaAttendeeD1Ev @ 97 NONAME - _ZN14AgendaAttendeeD2Ev @ 98 NONAME - _ZN14AgendaAttendeeaSERKS_ @ 99 NONAME - _ZN14AgendaCategory11setCategoryENS_12CategoryTypeE @ 100 NONAME - _ZN14AgendaCategory23setExtendedCategoryNameERK7QString @ 101 NONAME - _ZN14AgendaCategory6detachEv @ 102 NONAME - _ZN14AgendaCategoryC1ENS_12CategoryTypeE @ 103 NONAME - _ZN14AgendaCategoryC1ERKS_ @ 104 NONAME - _ZN14AgendaCategoryC1Ev @ 105 NONAME - _ZN14AgendaCategoryC2ENS_12CategoryTypeE @ 106 NONAME - _ZN14AgendaCategoryC2ERKS_ @ 107 NONAME - _ZN14AgendaCategoryC2Ev @ 108 NONAME - _ZN14AgendaCategoryD0Ev @ 109 NONAME - _ZN14AgendaCategoryD1Ev @ 110 NONAME - _ZN14AgendaCategoryD2Ev @ 111 NONAME - _ZN14AgendaCategoryaSERKS_ @ 112 NONAME - _ZN14AgendaGeoValue10setLatLongEdd @ 113 NONAME - _ZN14AgendaGeoValue6detachEv @ 114 NONAME - _ZN14AgendaGeoValueC1ERKS_ @ 115 NONAME - _ZN14AgendaGeoValueC1Ev @ 116 NONAME - _ZN14AgendaGeoValueC2ERKS_ @ 117 NONAME - _ZN14AgendaGeoValueC2Ev @ 118 NONAME - _ZN14AgendaGeoValueD1Ev @ 119 NONAME - _ZN14AgendaGeoValueD2Ev @ 120 NONAME - _ZN14AgendaGeoValueaSERKS_ @ 121 NONAME - _ZN16AgendaRepeatRule10setByMonthERK5QListINS_5MonthEE @ 122 NONAME - _ZN16AgendaRepeatRule11setIntervalEi @ 123 NONAME - _ZN16AgendaRepeatRule12setWeekStartENS_3DayE @ 124 NONAME - _ZN16AgendaRepeatRule13setByMonthDayERK5QListIiE @ 125 NONAME - _ZN16AgendaRepeatRule18setRepeatRuleStartERK9QDateTime @ 126 NONAME - _ZN16AgendaRepeatRule6detachEv @ 127 NONAME - _ZN16AgendaRepeatRule7setTypeENS_8RuleTypeE @ 128 NONAME - _ZN16AgendaRepeatRule8setByDayERK5QListINS_3DayEE @ 129 NONAME - _ZN16AgendaRepeatRule8setUntilERK9QDateTime @ 130 NONAME - _ZN16AgendaRepeatRuleC1ENS_8RuleTypeE @ 131 NONAME - _ZN16AgendaRepeatRuleC1ERKS_ @ 132 NONAME - _ZN16AgendaRepeatRuleC1Ev @ 133 NONAME - _ZN16AgendaRepeatRuleC2ENS_8RuleTypeE @ 134 NONAME - _ZN16AgendaRepeatRuleC2ERKS_ @ 135 NONAME - _ZN16AgendaRepeatRuleC2Ev @ 136 NONAME - _ZN16AgendaRepeatRuleD1Ev @ 137 NONAME - _ZN16AgendaRepeatRuleD2Ev @ 138 NONAME - _ZN16AgendaRepeatRuleaSERKS_ @ 139 NONAME - _ZNK10AgendaUtil10metaObjectEv @ 140 NONAME - _ZNK10AgendaUtil5errorEv @ 141 NONAME - _ZNK11AgendaAlarm10timeOffsetEv @ 142 NONAME - _ZNK11AgendaAlarm14alarmSoundNameEv @ 143 NONAME - _ZNK11AgendaAlarm6isNullEv @ 144 NONAME - _ZNK11AgendaAlarmeqERKS_ @ 145 NONAME - _ZNK11AgendaAlarmneERKS_ @ 146 NONAME - _ZNK11AgendaEntry10categoriesEv @ 147 NONAME - _ZNK11AgendaEntry10repeatRuleEv @ 148 NONAME - _ZNK11AgendaEntry11descriptionEv @ 149 NONAME - _ZNK11AgendaEntry14durationInSecsEv @ 150 NONAME - _ZNK11AgendaEntry17completedDateTimeEv @ 151 NONAME - _ZNK11AgendaEntry20lastModifiedDateTimeEv @ 152 NONAME - _ZNK11AgendaEntry2idEv @ 153 NONAME - _ZNK11AgendaEntry4typeEv @ 154 NONAME - _ZNK11AgendaEntry5alarmEv @ 155 NONAME - _ZNK11AgendaEntry6isNullEv @ 156 NONAME - _ZNK11AgendaEntry6methodEv @ 157 NONAME - _ZNK11AgendaEntry6rDatesEv @ 158 NONAME - _ZNK11AgendaEntry6statusEv @ 159 NONAME - _ZNK11AgendaEntry7dtStampEv @ 160 NONAME - _ZNK11AgendaEntry7endTimeEv @ 161 NONAME - _ZNK11AgendaEntry7summaryEv @ 162 NONAME - _ZNK11AgendaEntry8geoValueEv @ 163 NONAME - _ZNK11AgendaEntry8locationEv @ 164 NONAME - _ZNK11AgendaEntry8priorityEv @ 165 NONAME - _ZNK11AgendaEntry9attendeesEv @ 166 NONAME - _ZNK11AgendaEntry9favouriteEv @ 167 NONAME - _ZNK11AgendaEntry9startTimeEv @ 168 NONAME - _ZNK11AgendaEntryeqERKS_ @ 169 NONAME - _ZNK11AgendaEntryneERKS_ @ 170 NONAME - _ZNK14AgendaAttendee10commonNameEv @ 171 NONAME - _ZNK14AgendaAttendee17responseRequestedEv @ 172 NONAME - _ZNK14AgendaAttendee4roleEv @ 173 NONAME - _ZNK14AgendaAttendee6isNullEv @ 174 NONAME - _ZNK14AgendaAttendee6statusEv @ 175 NONAME - _ZNK14AgendaAttendee7addressEv @ 176 NONAME - _ZNK14AgendaAttendeeeqERKS_ @ 177 NONAME - _ZNK14AgendaAttendeeneERKS_ @ 178 NONAME - _ZNK14AgendaCategory20extendedCategoryNameEv @ 179 NONAME - _ZNK14AgendaCategory6isNullEv @ 180 NONAME - _ZNK14AgendaCategory8categoryEv @ 181 NONAME - _ZNK14AgendaCategoryeqERKS_ @ 182 NONAME - _ZNK14AgendaCategoryneERKS_ @ 183 NONAME - _ZNK14AgendaGeoValue10getLatLongERdS0_ @ 184 NONAME - _ZNK14AgendaGeoValue6isNullEv @ 185 NONAME - _ZNK14AgendaGeoValueeqERKS_ @ 186 NONAME - _ZNK14AgendaGeoValueneERKS_ @ 187 NONAME - _ZNK16AgendaRepeatRule10byMonthDayEv @ 188 NONAME - _ZNK16AgendaRepeatRule15repeatRuleStartEv @ 189 NONAME - _ZNK16AgendaRepeatRule4typeEv @ 190 NONAME - _ZNK16AgendaRepeatRule5byDayEv @ 191 NONAME - _ZNK16AgendaRepeatRule5untilEv @ 192 NONAME - _ZNK16AgendaRepeatRule6isNullEv @ 193 NONAME - _ZNK16AgendaRepeatRule7byMonthEv @ 194 NONAME - _ZNK16AgendaRepeatRule8intervalEv @ 195 NONAME - _ZNK16AgendaRepeatRule9weekStartEv @ 196 NONAME - _ZNK16AgendaRepeatRuleeqERKS_ @ 197 NONAME - _ZNK16AgendaRepeatRuleneERKS_ @ 198 NONAME - _ZTI10AgendaUtil @ 199 NONAME - _ZTI11AgendaEntry @ 200 NONAME - _ZTI14AgendaAttendee @ 201 NONAME - _ZTI14AgendaCategory @ 202 NONAME - _ZTV10AgendaUtil @ 203 NONAME - _ZTV11AgendaEntry @ 204 NONAME - _ZTV14AgendaAttendee @ 205 NONAME - _ZTV14AgendaCategory @ 206 NONAME - _ZN10AgendaUtil22areNoEntriesInCalendarEv @ 207 NONAME - diff -r fd30d51f876b -r b6db4fd4947b agendainterface/inc/CleanupResetAndDestroy.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/agendainterface/inc/CleanupResetAndDestroy.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,82 @@ +/* +* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Symbian Foundation License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Provides cleanup item to push ResetAndDestroy calls to + * cleanup stack. It is heavily used for RPointerArrays, + * which are used all over Symbian's CalenInterimAPI. + * Implementation is more or less copy-paste of + * cleanup item of Close method and CleanupClosePushL + * +*/ + + + +#ifndef __CLEANUPRESETANDDESTROY_H__ +#define __CLEANUPRESETANDDESTROY_H__ + +/** + * A utility class used by the templated function CleanupResetAndDestroyPushL() + * to create a TCleanupItem item that will perform a close type operation on + * the class T type object. + **/ +template +class CleanupResetAndDestroy +{ + public: + inline static void PushL(T& aRef); + + private: + static void ResetAndDestroy(TAny *aPtr); + +}; + +/** + * Constructs and pushes a TCleanupItem object onto the cleanup stack. + * + * The TCleanupItem encapsulates: + * + * 1. a reference aRef to the object of type class T which is to be cleaned up + * 2. an associated cleanup operation. + * + * The cleanup operation is the private static function ResetAndDestroy() of + * the templated class CleanupResetAndDestroy and is invoked as a result of + * a subsequent call to CleanupStack::PopAndDestroy(). + * + * CleanupResetAndDestroy::ResetAndDestroy() is passed a pointer to the + * class T object to be cleaned up, and the function implements cleanup by + * calling ResetAndDestroy() on the passed object. + * The class T object must, therefore, define and implement (or inherit) a + * ResetAndDestroy() member function. + * + * RPointerArray buffers; + * CleanupResetAndDestroyPushL( buffers ); + * buffers.Append( HBufC::NewL(100) ); + * ... + * CleanupStack::PopAndDestroy(); // <--- results in ResetAndDestroy() being called on "buffers". + * ... + * @endcode + * + * @param aRef A reference to a class T type object for which the cleanup item is being created. + * @see TCleanupItem + * @see CleanupResetAndDestroy + * @see CleanupStack::PopAndDestroy() + **/ +template +inline void CleanupResetAndDestroyPushL(T& aRef); + +#include "CleanupResetAndDestroy.inl" + + +#endif //__CLEANUPRESETANDDESTROY_H__ + +// End of File diff -r fd30d51f876b -r b6db4fd4947b agendainterface/inc/CleanupResetAndDestroy.inl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/agendainterface/inc/CleanupResetAndDestroy.inl Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,60 @@ +/* +* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Symbian Foundation License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Provides cleanup item to push ResetAndDestroy calls to +* cleanup stack. It is heavily used for RPointerArrays, +* which are used all over Symbian's CalenInterimAPI. +* Implementation is more or less copy-paste of +* cleanup item of Close method and CleanupClosePushL +* +*/ + + + +#include "CleanupResetAndDestroy.h" + + +/** + * Creates a TCleanupItem for the specified object. + * The cleanup operation is the private static function ResetAndDestroy() of this class. + * @param aRef The object for which a TCleanupItem is to be constructed. + **/ +template +inline void CleanupResetAndDestroy::PushL(T& aRef) +{ + CleanupStack::PushL( TCleanupItem( &ResetAndDestroy, &aRef ) ); +} + +/** + * The cleanup operation to be performed. + * @param aPtr A pointer to the object for which clean up is to be performed. + * The implementation calls ResetAndDestroy() on this object. + **/ +template +void CleanupResetAndDestroy::ResetAndDestroy(TAny *aPtr) +{ + static_cast( aPtr )->ResetAndDestroy(); +} + +/** + * See header file CleanupResetAndDestroy.h for in-source comment. + * + **/ +template +inline void CleanupResetAndDestroyPushL(T& aRef) +{ + CleanupResetAndDestroy::PushL( aRef ); +} + + +// End of File diff -r fd30d51f876b -r b6db4fd4947b agendainterface/inc/agendautil.h --- a/agendainterface/inc/agendautil.h Mon May 03 12:30:32 2010 +0300 +++ b/agendainterface/inc/agendautil.h Mon Jun 28 15:22:02 2010 +0530 @@ -106,18 +106,22 @@ QDateTime& endTime); void getNextInstanceTimes(AgendaEntry& entry, QDateTime& startTime, QDateTime& endTime); - + void markDatesWithEvents(QDateTime rangeStart, QDateTime rangeEnd, + AgendaUtil::FilterFlags filter, QList& dates); + bool areNoEntriesInCalendar(); static QDateTime minTime(); static QDateTime maxTime(); - + static bool isWorkdaysRepeatingEntry(const AgendaRepeatRule& repeatRule); - + Q_SIGNALS: void entriesChanged(QList ids); void entryAdded(ulong id); void entryDeleted(ulong id); void entryUpdated(ulong id); void entriesDeleted(int status); + void entryViewCreationCompleted(int status); + void instanceViewCreationCompleted(int status); private: friend class AgendaUtilPrivate; diff -r fd30d51f876b -r b6db4fd4947b agendainterface/tsrc/tsrc.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/agendainterface/tsrc/tsrc.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,20 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# This is the project specification file for agendaInterface test code +# + +# include test components here + +# End of file --Don't remove this diff -r fd30d51f876b -r b6db4fd4947b alarmui/BWINS/ALMALERTU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/alarmui/BWINS/ALMALERTU.DEF Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,3 @@ +EXPORTS + ?NewAlarm@@YAPAVMAlarmObserver@@XZ @ 1 NONAME ; class MAlarmObserver * NewAlarm(void) + diff -r fd30d51f876b -r b6db4fd4947b alarmui/BWINS/ALMALERTu.def --- a/alarmui/BWINS/ALMALERTu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -EXPORTS - ?NewAlarm@@YAPAVMAlarmObserver@@XZ @ 1 NONAME ; class MAlarmObserver * NewAlarm(void) - diff -r fd30d51f876b -r b6db4fd4947b alarmui/BWINS/AknAlarmServiceU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/alarmui/BWINS/AknAlarmServiceU.DEF Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,3 @@ +EXPORTS + ?Entry@@YAPAVMAknAlarmServiceStartup@@XZ @ 1 NONAME ; class MAknAlarmServiceStartup * Entry(void) + diff -r fd30d51f876b -r b6db4fd4947b alarmui/BWINS/AknAlarmServiceu.def --- a/alarmui/BWINS/AknAlarmServiceu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -EXPORTS - ?Entry@@YAPAVMAknAlarmServiceStartup@@XZ @ 1 NONAME ; class MAknAlarmServiceStartup * Entry(void) - diff -r fd30d51f876b -r b6db4fd4947b alarmui/DataSrc/AlmAlert.rss --- a/alarmui/DataSrc/AlmAlert.rss Mon May 03 12:30:32 2010 +0300 +++ b/alarmui/DataSrc/AlmAlert.rss Mon Jun 28 15:22:02 2010 +0530 @@ -21,7 +21,7 @@ NAME ALRT #include -#include +#include #include "AlmAlertVariant.hrh" diff -r fd30d51f876b -r b6db4fd4947b alarmui/EABI/AknAlarmServiceU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/alarmui/EABI/AknAlarmServiceU.DEF Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,3 @@ +EXPORTS + _Z5Entryv @ 1 NONAME + diff -r fd30d51f876b -r b6db4fd4947b alarmui/EABI/AlmAlertU.DEF --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/alarmui/EABI/AlmAlertU.DEF Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,3 @@ +EXPORTS + _Z8NewAlarmv @ 1 NONAME + diff -r fd30d51f876b -r b6db4fd4947b alarmui/alarmalertwidget/alarmalertinterface/bwins/alarmalertwidgetu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/alarmui/alarmalertwidget/alarmalertinterface/bwins/alarmalertwidgetu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,7 @@ +EXPORTS + ?updateAlarmAlert@AlarmAlert@@QAE_NPAUSAlarmInfo@@@Z @ 1 NONAME ; bool AlarmAlert::updateAlarmAlert(struct SAlarmInfo *) + ?dismissAlarmAlert@AlarmAlert@@QAEXXZ @ 2 NONAME ; void AlarmAlert::dismissAlarmAlert(void) + ??0AlarmAlert@@QAE@PAVAlarmAlertObserver@@@Z @ 3 NONAME ; AlarmAlert::AlarmAlert(class AlarmAlertObserver *) + ?showAlarmAlert@AlarmAlert@@QAE_NPAUSAlarmInfo@@@Z @ 4 NONAME ; bool AlarmAlert::showAlarmAlert(struct SAlarmInfo *) + ??1AlarmAlert@@QAE@XZ @ 5 NONAME ; AlarmAlert::~AlarmAlert(void) + diff -r fd30d51f876b -r b6db4fd4947b alarmui/alarmalertwidget/alarmalertinterface/eabi/alarmalertwidgetu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/alarmui/alarmalertwidget/alarmalertinterface/eabi/alarmalertwidgetu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,9 @@ +EXPORTS + _ZN10AlarmAlert14showAlarmAlertEP10SAlarmInfo @ 1 NONAME + _ZN10AlarmAlert16updateAlarmAlertEP10SAlarmInfo @ 2 NONAME + _ZN10AlarmAlert17dismissAlarmAlertEv @ 3 NONAME + _ZN10AlarmAlertC1EP18AlarmAlertObserver @ 4 NONAME + _ZN10AlarmAlertC2EP18AlarmAlertObserver @ 5 NONAME + _ZN10AlarmAlertD1Ev @ 6 NONAME + _ZN10AlarmAlertD2Ev @ 7 NONAME + diff -r fd30d51f876b -r b6db4fd4947b alarmui/alarmalertwidget/alarmalertinterface/inc/alarmalertwidget.h --- a/alarmui/alarmalertwidget/alarmalertinterface/inc/alarmalertwidget.h Mon May 03 12:30:32 2010 +0300 +++ b/alarmui/alarmalertwidget/alarmalertinterface/inc/alarmalertwidget.h Mon Jun 28 15:22:02 2010 +0530 @@ -11,7 +11,7 @@ * * Contributors: * -* Description: +* Description: * */ // alarmalertwidget.h @@ -21,15 +21,16 @@ // System includes #include -#include -#include +#include // User includes #include "alarmcommon.h" // Forward declarations -class HbDeviceDialog; +class CHbDeviceDialogSymbian; class AlarmAlertObserver; +class CHbSymbianVariantMap; +class CHbSymbianVariant; // Class declaration /** @@ -37,10 +38,8 @@ * @brief This is the client side of the device dialog plugin. * Contains API's to show, update and dismiss alarm dialogs */ -class AlarmAlertWidget : public QObject +class AlarmAlertWidget : public MHbDeviceDialogObserver { -Q_OBJECT - public: /** @@ -48,93 +47,118 @@ * @param observer This is the observer of all user events */ AlarmAlertWidget(AlarmAlertObserver *observer); - + /** * @brief Destructor */ ~AlarmAlertWidget(); - + /** * @brief Shows the alarm dialog * @param The alarm information to display * @return true on success, false otherwise */ bool showAlarmDialog(SAlarmInfo *alarmInfo); - + /** * @brief Dismisses any alarm dialog that is being shown * @return true on success, false otherwise */ - bool dismissAlarmDialog(); - + void dismissAlarmDialog(); + /** * @brief Updates the alarm dialog with new information * @param The alarm information to update * @return true on success, false otherwise */ bool updateAlarmDialog(SAlarmInfo *alarmInfo); + +public: -private slots: + /** + * @brief Inform the client about user interaction on dialog. + * @param List of aruguemnts the dialog has sent. + */ + void DataReceived(CHbSymbianVariantMap& aData); + + /** + * @brief Updates the alarm dialog with new information + * @param The alarm information to update + */ + void DeviceDialogClosed(TInt aCompletionCode); + +private: + /** + * @brief Handle the events sent by dialog. + * @param params List of arguments the dialog has sent + */ + void triggerAction(const CHbSymbianVariant* source); + +private: /** - * @brief Slot to handle user interactions - * @param params List of arguments the dialog has sent + * @var mVariantMap + * @brief Contain the parameters. */ - void triggerAction(QVariantMap params); - -private: - + CHbSymbianVariantMap* mVariantMap; + /** * @var mSubject * @brief Holds the alarm subject */ - QString mSubject; - + CHbSymbianVariant* mAlarmSubject; + /** * @var mLocation * @brief Holds the alarm location (for calendar alerts only) */ - QString mLocation; - + CHbSymbianVariant* mLocation; + /** * @var mAlarmTime * @brief Holds the alarm expiry time */ - QDateTime mAlarmTime; + CHbSymbianVariant* mAlarmTime; /** + * @var mAlarmDate + * @brief Holds the alarm expiry date + */ + CHbSymbianVariant* mAlarmDate; + + /** * @var mDeviceDialog * @brief The interface to the device dialog server */ - HbDeviceDialog *mDeviceDialog; - + CHbDeviceDialogSymbian *mDeviceDialog; + /** * @var mAlarmAlertType * @brief Tells if the type of alert being displayed * is a clock /calendar/to-do alert */ - int mAlarmAlertType; - + CHbSymbianVariant* mAlarmAlertType; + /** * @var mCanSnooze * @brief Tells whether the current alert can be snoozed. * true->alarm can be snoozed * false->alarm cannot be snoozed */ - bool mCanSnooze; - + CHbSymbianVariant* mCanSnooze; + /** * @var mIsSilent * @brief Indicates if the alarm is silent or not */ - bool mIsSilent; - + CHbSymbianVariant* mIsSilent; + /** * @var mIsTimedAlarm * @brief Indicates if the alarm has time info or not */ - bool mIsTimedAlarm; - + CHbSymbianVariant* mIsTimedAlarm; + /** * @var mObserver * @brief The observer for user responses diff -r fd30d51f876b -r b6db4fd4947b alarmui/alarmalertwidget/alarmalertinterface/inc/alarmalertwrapper.h --- a/alarmui/alarmalertwidget/alarmalertinterface/inc/alarmalertwrapper.h Mon May 03 12:30:32 2010 +0300 +++ b/alarmui/alarmalertwidget/alarmalertinterface/inc/alarmalertwrapper.h Mon Jun 28 15:22:02 2010 +0530 @@ -74,10 +74,9 @@ * AlarmAlertObserver::alertCancelled is called once the * alert is cancelled successfully * - * @return true on success, false otherwise */ - IMPORT_C bool dismissAlarmAlert(); - + IMPORT_C void dismissAlarmAlert(); + /** * @brief Updates the alarm alert with the information * provided diff -r fd30d51f876b -r b6db4fd4947b alarmui/alarmalertwidget/alarmalertinterface/src/alarmalertwidget.cpp --- a/alarmui/alarmalertwidget/alarmalertinterface/src/alarmalertwidget.cpp Mon May 03 12:30:32 2010 +0300 +++ b/alarmui/alarmalertwidget/alarmalertinterface/src/alarmalertwidget.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -11,21 +11,22 @@ * * Contributors: * -* Description: +* Description: * */ // alarmalertwidget.cpp // System includes -#include -#include -#include +#include // User includes #include "alarmalertwidget.h" #include "alarmalert.h" #include "alarmalertobserver.h" +// Constants. +const TInt KMaxlength=30; + // --------------------------------------------------------- // AlarmAlertWidget::AlarmAlertWidget // rest of the details are commented in the header @@ -34,11 +35,6 @@ AlarmAlertWidget::AlarmAlertWidget(AlarmAlertObserver *observer) : mObserver(observer) { - // Create a session with the device dialog server - mDeviceDialog = new HbDeviceDialog(HbDeviceDialog::NoFlags, this); - - // Connect to signals to receive events sent by the dialog - connect(mDeviceDialog, SIGNAL(dataReceived(QVariantMap)), this, SLOT(triggerAction(QVariantMap))); } // --------------------------------------------------------- @@ -48,10 +44,47 @@ // AlarmAlertWidget::~AlarmAlertWidget() { - // Cleanup - if (mDeviceDialog) { - delete mDeviceDialog; - } + // Cleanup + + if (mAlarmSubject) { + delete mAlarmSubject; + } + + if (mLocation) { + delete mLocation; + } + + if (mAlarmTime) { + delete mAlarmTime; + } + + if (mAlarmDate) { + delete mAlarmDate; + } + + if (mAlarmAlertType) { + delete mAlarmAlertType; + } + + if (mCanSnooze) { + delete mCanSnooze; + } + + if (mIsSilent) { + delete mIsSilent; + } + + if (mIsTimedAlarm) { + delete mIsTimedAlarm; + } + + if (mVariantMap) { + delete mVariantMap; + } + + if (mDeviceDialog) { + delete mDeviceDialog; + } } // --------------------------------------------------------- @@ -61,40 +94,77 @@ // bool AlarmAlertWidget::showAlarmDialog(SAlarmInfo *alarmInfo) { - // Get the subject of the alarm (description for clock alarms - // and subject for calendar alarms) - mSubject = QString::fromUtf16(alarmInfo->iSubject->Ptr(), - alarmInfo->iSubject->Length()); + // Get the alarm date and time + TBuf timeString; + TBuf dateString; + + TBuf timeFormat(_L("%-B%:0%J%:1%T%:3%+B")); + TBuf dateFormat; + TLocale locale; + switch (locale.DateFormat()) { + case EDateEuropean: + dateFormat.Copy(_L("%F%/0%D%/1%M%/2%Y%/3")); + break; + case EDateAmerican: + dateFormat.Copy(_L("%F%/0%M%/1%D%/2%Y%/3")); + break; + case EDateJapanese: + dateFormat.Copy(_L("%F%/0%Y%/1%M%/2%D%/3")); + break; + default: + // Nothing yet. + break; + } + - // Get the location (for calendar alarms) - mLocation = QString::fromUtf16(alarmInfo->iLocation->Ptr(), - alarmInfo->iLocation->Length()); + alarmInfo->iTime.FormatL(timeString, timeFormat); + alarmInfo->iTime.FormatL(dateString, dateFormat); + + // Create a session with the device dialog server + mDeviceDialog = CHbDeviceDialogSymbian::NewL(); - // Get the alarm date and time - // TODO: Check QDateTime to TTime compatibility - mAlarmTime.setTime(QTime(alarmInfo->iTime.DateTime().Hour(), - alarmInfo->iTime.DateTime().Minute(), - alarmInfo->iTime.DateTime().Second())); - mAlarmTime.setDate(QDate(alarmInfo->iDate.DateTime().Year(), - alarmInfo->iDate.DateTime().Month(), - alarmInfo->iDate.DateTime().Day())); + + // Package the different parameters to send + mVariantMap = CHbSymbianVariantMap::NewL(); + + // Get the subject of the alarm (description for clock alarms + // and subject for calendar alarms) + mAlarmSubject = CHbSymbianVariant::NewL( + alarmInfo->iSubject, CHbSymbianVariant::EDes ); + mVariantMap->Add(alarmSubjectSymbian, mAlarmSubject); + + // Get the location (for calendar alarms) + mLocation = CHbSymbianVariant::NewL( + alarmInfo->iLocation, CHbSymbianVariant::EDes); + mVariantMap->Add(alarmLocationSymbian, mLocation); + + mAlarmTime = CHbSymbianVariant::NewL( + &timeString, CHbSymbianVariant::EDes); + mVariantMap->Add(alarmTimeSymbian, mAlarmTime); - mCanSnooze = alarmInfo->iCanSnooze; - mIsSilent = alarmInfo->iIsSilent; - mAlarmAlertType = alarmInfo->iAlarmAlertType; - mIsTimedAlarm = alarmInfo->iIsTimed; + mAlarmDate = CHbSymbianVariant::NewL( + &dateString, CHbSymbianVariant::EDes); + mVariantMap->Add(alarmDateSymbian, mAlarmDate); + + mIsSilent = CHbSymbianVariant::NewL( + &alarmInfo->iIsSilent, CHbSymbianVariant::EBool); + mVariantMap->Add(alarmRingingTypeSymbian, mIsSilent); + + mCanSnooze = CHbSymbianVariant::NewL( + &alarmInfo->iCanSnooze, CHbSymbianVariant::EBool); + mVariantMap->Add(alarmCanSnoozeSymbain, mCanSnooze); + + mAlarmAlertType = CHbSymbianVariant::NewL( + &alarmInfo->iAlarmAlertType, CHbSymbianVariant::EInt); + mVariantMap->Add(alarmTypeSymbian, mAlarmAlertType); + + mIsTimedAlarm = CHbSymbianVariant::NewL( + &alarmInfo->iIsTimed, CHbSymbianVariant::EBool); + mVariantMap->Add(alarmIsTimedSymbian, mIsTimedAlarm); + + // Package the different parameters to send + return mDeviceDialog->Show(ALARM_ALERT_PLUGIN_SYMBIAN, *mVariantMap, this); - // Package the different parameters to send - QVariantMap params; - params.insert(alarmSubject, mSubject); - params.insert(alarmLocation, mLocation); - params.insert(alarmDateTime, mAlarmTime); - params.insert(alarmRingingType, mIsSilent); - params.insert(alarmCanSnooze, mCanSnooze); - params.insert(alarmType, mAlarmAlertType); - params.insert(alarmIsTimed, mIsTimedAlarm); - - return mDeviceDialog->show(ALARM_ALERT_PLUGIN, params); } // --------------------------------------------------------- @@ -102,10 +172,10 @@ // rest of the details are commented in the header // --------------------------------------------------------- // -bool AlarmAlertWidget::dismissAlarmDialog() +void AlarmAlertWidget::dismissAlarmDialog() { // Dismiss the dialog - return mDeviceDialog->cancel(); + mDeviceDialog->Cancel(); } // --------------------------------------------------------- @@ -113,13 +183,37 @@ // rest of the details are commented in the header // --------------------------------------------------------- // -bool AlarmAlertWidget::updateAlarmDialog(SAlarmInfo* alarmInfo) +bool AlarmAlertWidget::updateAlarmDialog(SAlarmInfo* /*alarmInfo*/) { - Q_UNUSED(alarmInfo); // Update the dialog with any new information // TODO: Pass the updated information sent by the observer - QVariantMap params; - return mDeviceDialog->update(params); + /*CHbSymbianVariantMap params; + mDeviceDialog->Update(params);*/ + return false; +} + +// --------------------------------------------------------- +// AlarmAlertWidget::DataReceived +// rest of the details are commented in the header +// --------------------------------------------------------- +// +void AlarmAlertWidget::DataReceived(CHbSymbianVariantMap& aData) +{ + if (!aData.Keys().MdcaCount()) { + return; + } + + triggerAction(aData.Get(alarmCommandSymbian)); +} + +// --------------------------------------------------------- +// AlarmAlertWidget::DeviceDialogClosed +// rest of the details are commented in the header +// --------------------------------------------------------- +// +void AlarmAlertWidget::DeviceDialogClosed(TInt /*aCompletionCode*/) +{ + } // --------------------------------------------------------- @@ -127,33 +221,28 @@ // rest of the details are commented in the header // --------------------------------------------------------- // -void AlarmAlertWidget::triggerAction(QVariantMap params) +void AlarmAlertWidget::triggerAction(const CHbSymbianVariant* source) { - // Check what is the command being sent by the dialog - // Based on that, update the command to be sent - QVariantMap::const_iterator iter = params.find(alarmCommand); - if (iter != params.constEnd()) { - AlarmCommand command(AlarmCmdLast); - if (iter.value().toInt() == Stop) { - command = AlarmStop; - } - else if (iter.value().toInt() == Snooze) { - command = AlarmSnooze; - } - else if (iter.value().toInt() == Silence) { - command = AlarmSilence; - } else if (iter.value().toInt() == Shown) { - command = AlarmShown; - mObserver->alertDisplayed(command); - return; - } else { - command = AlarmCmdLast; - } - if (command != AlarmCmdLast) { - // Notify the observer with the command - mObserver->alertCompleted(command); - } - - } + AlarmCommand command(AlarmCmdLast); + + if (*source->Value() == Stop) { + command = AlarmStop; + } else if (*source->Value() == Snooze) { + command = AlarmSnooze; + } else if (*source->Value() == Silence) { + command = AlarmSilence; + } else if (*source->Value() == Shown) { + command = AlarmShown; + mObserver->alertDisplayed(command); + return; + } else { + command = AlarmCmdLast; + } + + if (command != AlarmCmdLast) { + // Notify the observer with the command + mObserver->alertCompleted(command); + } } + // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b alarmui/alarmalertwidget/alarmalertinterface/src/alarmalertwrapper.cpp --- a/alarmui/alarmalertwidget/alarmalertinterface/src/alarmalertwrapper.cpp Mon May 03 12:30:32 2010 +0300 +++ b/alarmui/alarmalertwidget/alarmalertinterface/src/alarmalertwrapper.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -60,10 +60,10 @@ // rest of the details are commented in the header // --------------------------------------------------------- // -EXPORT_C bool AlarmAlert::dismissAlarmAlert() +EXPORT_C void AlarmAlert::dismissAlarmAlert() { // Forward the call to the client - return mAlarmWidget->dismissAlarmDialog(); + mAlarmWidget->dismissAlarmDialog(); } // --------------------------------------------------------- diff -r fd30d51f876b -r b6db4fd4947b alarmui/alarmalertwidget/alarmalertplugin/alarmalertplugin.pro --- a/alarmui/alarmalertwidget/alarmalertplugin/alarmalertplugin.pro Mon May 03 12:30:32 2010 +0300 +++ b/alarmui/alarmalertwidget/alarmalertplugin/alarmalertplugin.pro Mon Jun 28 15:22:02 2010 +0530 @@ -31,3 +31,7 @@ alarmalertdocloader.cpp RESOURCES += alarmalert.qrc + +TRANSLATIONS += alarmui.ts + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b alarmui/alarmalertwidget/alarmalertplugin/data/alarmalert.qrc --- a/alarmui/alarmalertwidget/alarmalertplugin/data/alarmalert.qrc Mon May 03 12:30:32 2010 +0300 +++ b/alarmui/alarmalertwidget/alarmalertplugin/data/alarmalert.qrc Mon Jun 28 15:22:02 2010 +0530 @@ -7,7 +7,4 @@ xml/alarmalert_clock_unlocked.docml xml/alarmalert_todo_unlocked.docml - - alarmui_en_GB.qm - \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b alarmui/alarmalertwidget/alarmalertplugin/data/alarmui_en_GB.qm Binary file alarmui/alarmalertwidget/alarmalertplugin/data/alarmui_en_GB.qm has changed diff -r fd30d51f876b -r b6db4fd4947b alarmui/alarmalertwidget/alarmalertplugin/data/xml/alarmalert_calendar_unlocked.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/alarmui/alarmalertwidget/alarmalertplugin/data/xml/alarmalert_calendar_unlocked.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + diff -r fd30d51f876b -r b6db4fd4947b alarmui/alarmalertwidget/alarmalertplugin/data/xml/alarmalert_clock_unlocked.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/alarmui/alarmalertwidget/alarmalertplugin/data/xml/alarmalert_clock_unlocked.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b alarmui/alarmalertwidget/alarmalertplugin/data/xml/alarmalert_todo_unlocked.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/alarmui/alarmalertwidget/alarmalertplugin/data/xml/alarmalert_todo_unlocked.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b alarmui/alarmalertwidget/alarmalertplugin/inc/alarmalert.h --- a/alarmui/alarmalertwidget/alarmalertplugin/inc/alarmalert.h Mon May 03 12:30:32 2010 +0300 +++ b/alarmui/alarmalertwidget/alarmalertplugin/inc/alarmalert.h Mon Jun 28 15:22:02 2010 +0530 @@ -11,7 +11,7 @@ * * Contributors: * -* Description: +* Description: * */ // alarmalert.h @@ -21,30 +21,45 @@ // The plugin name. Do not remove the "com.nokia.hb" part. const QString ALARM_ALERT_PLUGIN("com.nokia.hb.alarmalertdialog"); +_LIT(ALARM_ALERT_PLUGIN_SYMBIAN, "com.nokia.hb.alarmalertdialog"); // The string identifier for command const QString alarmCommand("command"); +_LIT(alarmCommandSymbian, "command"); // The string identifier for alarm subject const QString alarmSubject("subject"); +_LIT(alarmSubjectSymbian, "subject"); // The string identifier for alarm location const QString alarmLocation("location"); +_LIT(alarmLocationSymbian, "location"); -// The string identifier for alarm date and time -const QString alarmDateTime("dateTime"); +// The string identifier for alarm time +const QString alarmTime("time"); +_LIT(alarmTimeSymbian, "time"); + +// The string identifier for alarm date. +const QString alarmDate("date"); +_LIT(alarmDateSymbian, "date"); + +// The string identifier for alarm time // The string identifier for alarm type const QString alarmType("type"); +_LIT(alarmTypeSymbian, "type"); // The string identifier for alarm ringing type const QString alarmRingingType("ringingType"); +_LIT(alarmRingingTypeSymbian, "ringingType"); // The string identifier for alarm snoozability const QString alarmCanSnooze("canSnooze"); +_LIT(alarmCanSnoozeSymbain, "canSnooze"); // The string identifier for checking the nontimed alarms const QString alarmIsTimed("isTimed"); +_LIT(alarmIsTimedSymbian, "isTimed"); /** @@ -62,7 +77,7 @@ /** * @enum AlarmType - * @brief Alarm types to be sent + * @brief Alarm types to be sent * to the alarm dialog */ enum AlarmType { diff -r fd30d51f876b -r b6db4fd4947b alarmui/alarmalertwidget/alarmalertplugin/inc/alarmalertwidget_p.h --- a/alarmui/alarmalertwidget/alarmalertplugin/inc/alarmalertwidget_p.h Mon May 03 12:30:32 2010 +0300 +++ b/alarmui/alarmalertwidget/alarmalertplugin/inc/alarmalertwidget_p.h Mon Jun 28 15:22:02 2010 +0530 @@ -28,7 +28,7 @@ // Forward declarations class QGraphicsWidget; class QEvent; -class QTranslator; +class HbTranslator; class HbMainWindow; class HbDocumentLoader; class HbLabel; @@ -140,6 +140,11 @@ */ void silenced(); + /** + * @brief Called when the alarmui is about to display. + */ + void aboutToDisplay(); + private: /** * @brief Extracts the parameters sent by the client @@ -192,13 +197,19 @@ * @var mAlarmTime * @brief Holds the alarm expiry time */ - QDateTime mAlarmTime; + QString mAlarmTime; + + /** + * @var mAlarmDate + * @brief Holds the alarm expiry time + */ + QString mAlarmDate; /** * @var mTranslator * @brief translator for the localisation of strings */ - QTranslator *mTranslator; + HbTranslator *mTranslator; /** * @var mAlarmDescription diff -r fd30d51f876b -r b6db4fd4947b alarmui/alarmalertwidget/alarmalertplugin/src/alarmalertplugin.cpp --- a/alarmui/alarmalertwidget/alarmalertplugin/src/alarmalertplugin.cpp Mon May 03 12:30:32 2010 +0300 +++ b/alarmui/alarmalertwidget/alarmalertplugin/src/alarmalertplugin.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -19,7 +19,6 @@ // System includes #include #include -#include #include // User includes @@ -80,7 +79,7 @@ Q_UNUSED(deviceDialogType); Q_UNUSED(parameters); - info->group = GenericDeviceDialogGroup; + info->group = CriticalGroup; info->priority = DefaultPriority; info->flags = NoDeviceDialogFlags; return true; diff -r fd30d51f876b -r b6db4fd4947b alarmui/alarmalertwidget/alarmalertplugin/src/alarmalertwidget_p.cpp --- a/alarmui/alarmalertwidget/alarmalertplugin/src/alarmalertwidget_p.cpp Mon May 03 12:30:32 2010 +0300 +++ b/alarmui/alarmalertwidget/alarmalertplugin/src/alarmalertwidget_p.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -20,17 +20,16 @@ #include #include #include -#include #include -#include + #include #include #include #include #include #include -#include #include +#include // User includes #include "alarmalertwidget_p.h" @@ -43,6 +42,7 @@ // --------------------------------------------------------- // AlarmAlertDialogPrivate::AlarmAlertDialogPrivate(const QVariantMap ¶meters): + mTranslator(new HbTranslator("alarmui")), mClosedByClient(false), mIsSilenceKey(false) { @@ -52,19 +52,13 @@ // Set the dismiss policy and timeout property setDismissPolicy(HbPopup::NoDismiss); setTimeout(HbPopup::NoTimeout); + + // Listen the signal when alarmui is about to display so that we can start playing the alarm tone. + connect(this, SIGNAL(aboutToShow()), this, SLOT(aboutToDisplay()) ); // Initialize the user response mUserResponse = Other; - // Load the translation file and install the editor specific translator - mTranslator = new QTranslator; - QString lang = QLocale::system().name(); - QString path = "Z:/resource/qt/translations/"; - bool loaded = mTranslator->load("alarmui_en_GB",":/translations"); - // TODO: Load the appropriate .qm file based on locale - //bool loaded = mTranslator->load("alarmui_" + lang, path); - HbApplication::instance()->installTranslator(mTranslator); - // TODO: Gestures not working. Integrate once support is available from Qt grabGesture(Qt::SwipeGesture); } @@ -88,7 +82,6 @@ HbEffect::remove(mSlider); // Remove the translator - HbApplication::instance()->removeTranslator(mTranslator); if (mTranslator) { delete mTranslator; mTranslator = 0; @@ -151,7 +144,7 @@ HbDialog::showEvent(event); QVariantMap param; param.insert(alarmCommand, mUserResponse); - //emit deviceDialogData(param); + emit deviceDialogData(param); } // --------------------------------------------------------- @@ -161,9 +154,7 @@ // void AlarmAlertDialogPrivate::closeEvent(QCloseEvent *event) { - // Forward the call to the base class - HbDialog::closeEvent(event); - + // Do not notify the client back if the close was initiated by client itself if(!mClosedByClient) { // Package the user response and send it @@ -173,6 +164,9 @@ } // This signal has to be emitted so that the dialog can be cleaned up later emit deviceDialogClosed(); + + // Forward the call to the base class + HbDialog::closeEvent(event); } // --------------------------------------------------------- @@ -215,7 +209,20 @@ close(); } } - + +// --------------------------------------------------------- +// AlarmAlertDialogPrivate::aboutToDisplay +// rest of the details are commented in the header +// --------------------------------------------------------- +// +void AlarmAlertDialogPrivate::aboutToDisplay() + { + mUserResponse = Shown; + QVariantMap param; + param.insert(alarmCommand, mUserResponse); + emit deviceDialogData(param); + } + // --------------------------------------------------------- // AlarmAlertDialogPrivate::dismissed // rest of the details are commented in the header @@ -243,8 +250,10 @@ mSubject = iter.value().toString(); } else if (alarmLocation == key) { mLocation = iter.value().toString(); - } else if (alarmDateTime == key) { - mAlarmTime = iter.value().toDateTime(); + } else if (alarmTime == key) { + mAlarmTime = iter.value().toString(); + } else if (alarmDate == key) { + mAlarmDate = iter.value().toString(); } else if (alarmType == key) { mAlarmAlertType = static_cast (iter.value().toInt()); } else if (alarmCanSnooze == key) { @@ -302,8 +311,7 @@ } HbExtendedLocale locale = HbExtendedLocale::system(); mAlarmDateTime->setPlainText( - hbTrId("txt_calendar_info_alarm_start_time").arg( - locale.format(mAlarmTime.time(), r_qtn_time_usual))); + hbTrId("txt_calendar_info_alarm_start_time").arg(mAlarmTime)); mAlarmDescription = qobject_cast ( mAlertDocLoader->findWidget("alarmDescription")); @@ -367,16 +375,14 @@ qFatal("Unable to find the alarmTime label"); } mAlarmDateTime->setPlainText( - hbTrId("txt_calendar_info_alarm_start_time").arg( - locale.format(mAlarmTime.time(), r_qtn_time_usual))); + hbTrId("txt_calendar_info_alarm_start_time").arg(mAlarmTime)); HbLabel *alarmDate = qobject_cast ( mAlertDocLoader->findWidget("alarmDate")); if (!alarmDate) { qFatal("Unable to find the alarmDate label"); } alarmDate->setPlainText( - hbTrId("txt_calendar_info_alarm_start_date").arg( - locale.format(mAlarmTime.date(), r_qtn_date_usual_with_zero))); + hbTrId("txt_calendar_info_alarm_start_date").arg(mAlarmDate)); HbLabel *alarmDateNonTimed = qobject_cast ( mAlertDocLoader->findWidget("nonTimedAlarmDate")); if (!alarmDateNonTimed) { @@ -407,8 +413,7 @@ qFatal("Unable to find the alarmDateNonTimed label"); } alarmDateNonTimed->setPlainText( - hbTrId("txt_calendar_info_alarm_start_date").arg( - locale.format(mAlarmTime.date(), r_qtn_date_usual_with_zero))); + hbTrId("txt_calendar_info_alarm_start_date").arg(mAlarmDate)); } QGraphicsWidget *headingWidget = mAlertDocLoader->findWidget("heading"); @@ -482,8 +487,7 @@ qFatal("Unable to load the alarmDate label"); } alarmDate->setPlainText( - hbTrId("txt_calendar_info_alarm_start_date").arg( - locale.format(mAlarmTime.date(), r_qtn_date_usual_with_zero))); + hbTrId("txt_calendar_info_alarm_start_date").arg(mAlarmDate)); mAlarmDescription = qobject_cast ( mAlertDocLoader->findWidget("alarmDescription")); diff -r fd30d51f876b -r b6db4fd4947b alarmui/alarmalertwidget/bwins/alarmalertwidgetu.def --- a/alarmui/alarmalertwidget/bwins/alarmalertwidgetu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -EXPORTS - ?updateAlarmAlert@AlarmAlert@@QAE_NPAUSAlarmInfo@@@Z @ 1 NONAME ; bool AlarmAlert::updateAlarmAlert(struct SAlarmInfo *) - ??0AlarmAlert@@QAE@PAVAlarmAlertObserver@@@Z @ 2 NONAME ; AlarmAlert::AlarmAlert(class AlarmAlertObserver *) - ?dismissAlarmAlert@AlarmAlert@@QAE_NXZ @ 3 NONAME ; bool AlarmAlert::dismissAlarmAlert(void) - ?showAlarmAlert@AlarmAlert@@QAE_NPAUSAlarmInfo@@@Z @ 4 NONAME ; bool AlarmAlert::showAlarmAlert(struct SAlarmInfo *) - ??1AlarmAlert@@QAE@XZ @ 5 NONAME ; AlarmAlert::~AlarmAlert(void) - diff -r fd30d51f876b -r b6db4fd4947b alarmui/alarmalertwidget/eabi/alarmalertwidgetu.def --- a/alarmui/alarmalertwidget/eabi/alarmalertwidgetu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -EXPORTS - _ZN10AlarmAlert14showAlarmAlertEP10SAlarmInfo @ 1 NONAME - _ZN10AlarmAlert16updateAlarmAlertEP10SAlarmInfo @ 2 NONAME - _ZN10AlarmAlert17dismissAlarmAlertEv @ 3 NONAME - _ZN10AlarmAlertC1EP18AlarmAlertObserver @ 4 NONAME - _ZN10AlarmAlertC2EP18AlarmAlertObserver @ 5 NONAME - _ZN10AlarmAlertD1Ev @ 6 NONAME - _ZN10AlarmAlertD2Ev @ 7 NONAME - diff -r fd30d51f876b -r b6db4fd4947b alarmui/eabi/AknAlarmServiceu.def --- a/alarmui/eabi/AknAlarmServiceu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -EXPORTS - _Z5Entryv @ 1 NONAME - diff -r fd30d51f876b -r b6db4fd4947b alarmui/eabi/AlmAlertu.def --- a/alarmui/eabi/AlmAlertu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -EXPORTS - _Z8NewAlarmv @ 1 NONAME - diff -r fd30d51f876b -r b6db4fd4947b alarmui/src/AlmAlarmControl.cpp --- a/alarmui/src/AlmAlarmControl.cpp Mon May 03 12:30:32 2010 +0300 +++ b/alarmui/src/AlmAlarmControl.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -177,7 +177,7 @@ iAlarmUtils->StartKeyBlocker(); // reset the key guard - iAlarmUtils->SetKeyGuard( ETrue ); + //iAlarmUtils->SetKeyGuard( ETrue ); } break; @@ -227,26 +227,9 @@ // Allow auto-snooze only while waiting user input if( IsState( EStateWaitingInput ) ) { - SetState( EStateAfterInput ); - if( iAlarmUtils->IsCalendarAlarm() ) - { - if( iAlarmUtils->IsCalendarAlarmViewer() ) - { - iAlarmUtils->SetCalendarAlarmViewer(EFalse); - } - else - { - TRAP_IGNORE( StoreMissedAlarmDataL() ); - } - iAlarmUtils->DoStopAlarm(); - DoCancelDialog(); - - } - else - { - iAlarmUtils->TryToSnoozeActiveAlarm(); - DoCancelDialog(); - } + SetState( EStateAfterInput ); + iAlarmUtils->TryToSnoozeActiveAlarm(); + DoCancelDialog(); } TRACE_EXIT_POINT; } @@ -529,9 +512,9 @@ delete text; // only delete if GetAlarmLabelL call was successfull ASSERT( !err ); */ iAlarmUtils->NotifierDialogController()->showAlarmAlert(alarmInfo); - iAlarmUtils->StartAutoSnoozeTimer(); - iAlarmUtils->PlayAlarmSound(); - SetState( EStateWaitingInput ); + //iAlarmUtils->StartAutoSnoozeTimer(); + //iAlarmUtils->PlayAlarmSound(); + //SetState( EStateWaitingInput ); if( err ) // failed to fetch alarm data or show the notification { @@ -962,7 +945,7 @@ { iAlarmUtils->StartAutoSnoozeTimer(); iAlarmUtils->PlayAlarmSound(); - iAlarmUtils->SetKeyGuard( EFalse ); + //iAlarmUtils->SetKeyGuard( EFalse ); SetState( EStateWaitingInput ); iAlarmUtils->StartKeyBlocker(); // block all input for 0.5 seconds } @@ -1385,7 +1368,7 @@ { iAlarmUtils->StartAutoSnoozeTimer(); iAlarmUtils->PlayAlarmSound(); - iAlarmUtils->SetKeyGuard( EFalse ); + //iAlarmUtils->SetKeyGuard( EFalse ); SetState( EStateWaitingInput ); iAlarmUtils->StartKeyBlocker(); // block all input for 0.5 seconds } diff -r fd30d51f876b -r b6db4fd4947b alarmui/src/alarmutils.cpp --- a/alarmui/src/alarmutils.cpp Mon May 03 12:30:32 2010 +0300 +++ b/alarmui/src/alarmutils.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -56,6 +56,8 @@ #endif // SYMBIAN_CALENDAR_V2 #include #include +#include +#include // #include // for launching calendar entry view @@ -76,14 +78,8 @@ const TInt KMaxProfileVolume( 10 ); const TInt KVolumeRampPeriod( 3000000 ); // 3 seconds _LIT( KRngMimeType, "application/vnd.nokia.ringing-tone" ); -const TUid KCRUidCalendar = {0x101F874B}; //const TUint32 KCalendarSoundFile = 0x00000004; -const TUint32 KCalendarDefaultSoundFile = 0x00000005; -const TUint32 KCalendarSnoozeTime = 0x00000007; -const TUid KCRUidClockApp = {0x101F874D}; //const TUint32 KClockAppSoundFile = 0x00000000; -const TUint32 KClockAppDefaultSoundFile = 0x00000001; -const TUint32 KClockAppSnoozeTime = 0x00000002; const TUid KAlarmClockOne = { 0x101F793A }; const TUid KCRUidProfileEngine = {0x101F8798}; @@ -440,7 +436,7 @@ if( IsClockAlarm() ) { - PIM_TRAPD_ASSERT( repository = CRepository::NewL( KCRUidClockApp ); ) + PIM_TRAPD_ASSERT( repository = CRepository::NewL( TUid::Uid(KCRUidClockApp) ); ) PIM_TRAPD_ASSERT( profileRepository = CRepository::NewL( KCRUidProfileEngine ); ) @@ -459,8 +455,10 @@ } else { - PIM_TRAPD_ASSERT( repository = CRepository::NewL( KCRUidCalendar ); ) - PIM_TRAPD_ASSERT( profileRepository = CRepository::NewL( KCRUidProfileEngine ); ) + PIM_TRAPD_ASSERT( repository = + CRepository::NewL( TUid::Uid(KCRUidCalendar) ); ) + PIM_TRAPD_ASSERT( profileRepository = + CRepository::NewL( KCRUidProfileEngine ); ) if( repository ) { @@ -660,7 +658,7 @@ case EAlarmTypeClock: { CRepository* repository = NULL; - PIM_TRAPD_ASSERT( repository = CRepository::NewL( KCRUidClockApp ); ) + PIM_TRAPD_ASSERT( repository = CRepository::NewL( TUid::Uid(KCRUidClockApp) ); ) if( repository ) { @@ -673,7 +671,8 @@ case EAlarmTypeCalendar: { CRepository* repository = NULL; - PIM_TRAPD_ASSERT( repository = CRepository::NewL( KCRUidCalendar ); ) + PIM_TRAPD_ASSERT( repository = + CRepository::NewL( TUid::Uid(KCRUidCalendar) ); ) if( repository ) { diff -r fd30d51f876b -r b6db4fd4947b alarmui/stubsis/alarmui_stub.pkg --- a/alarmui/stubsis/alarmui_stub.pkg Mon May 03 12:30:32 2010 +0300 +++ b/alarmui/stubsis/alarmui_stub.pkg Mon Jun 28 15:22:02 2010 +0530 @@ -1,27 +1,27 @@ -; -; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -; All rights reserved. -; This component and the accompanying materials are made available -; under the terms of "Eclipse Public License v1.0" -; which accompanies this distribution, and is available -; at the URL "http://www.eclipse.org/legal/epl-v10.html". -; -; Initial Contributors: -; Nokia Corporation - initial contribution. -; -; Contributors: -; -; Description: pkg file of Alarm UIfor IAD. -; - -; Language -&EN - -; Header -#{"AlarmUI"}, (0x1000599E), 1, 0, 0, TYPE=SA - -; Localised vendor name -%{"Nokia"} - -; Unique vendor name -:"Nokia" +; +; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +; All rights reserved. +; This component and the accompanying materials are made available +; under the terms of "Eclipse Public License v1.0" +; which accompanies this distribution, and is available +; at the URL "http://www.eclipse.org/legal/epl-v10.html". +; +; Initial Contributors: +; Nokia Corporation - initial contribution. +; +; Contributors: +; +; Description: pkg file of Alarm UIfor IAD. +; + +; Language +&EN + +; Header +#{"AlarmUI"}, (0x1000599E), 1, 0, 0, TYPE=SA + +; Localised vendor name +%{"Nokia"} + +; Unique vendor name +:"Nokia" diff -r fd30d51f876b -r b6db4fd4947b alarmui/tsrc/tsrc.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/alarmui/tsrc/tsrc.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,20 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# This is the project specification file for alarmui test code +# + +# include test components here + +# End of file --Don't remove this diff -r fd30d51f876b -r b6db4fd4947b calendarui/agendaeventviewer/agendaeventviewer.pro --- a/calendarui/agendaeventviewer/agendaeventviewer.pro Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/agendaeventviewer/agendaeventviewer.pro Mon Jun 28 15:22:02 2010 +0530 @@ -36,7 +36,7 @@ symbian: { -BLD_INF_RULES.prj_exports += \ + BLD_INF_RULES.prj_exports += \ "./inc/agendaeventviewer.h |../inc/agendaeventviewer.h" \ "./inc/agendaeventviewer.h |../../inc/agendaeventviewer.h" @@ -46,12 +46,10 @@ LIBS += -lagendainterface \ - -lnoteseditor \ -lcaleneditor \ -lcalencommonutils \ -lmaptileservice - -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE } SOURCES += \ @@ -69,7 +67,8 @@ agendaeventviewerdocloader.h \ agendaeventvieweritem.h -RESOURCES += \ - agendaeventviewer.qrc +RESOURCES += agendaeventviewer.qrc + +TRANSLATIONS += caleneventviewer.ts # End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/agendaeventviewer/bwins/agendaeventvieweru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/agendaeventviewer/bwins/agendaeventvieweru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,8 @@ +EXPORTS + ?view@AgendaEventViewer@@QAEXVAgendaEntry@@W4Actions@1@@Z @ 1 NONAME ; void AgendaEventViewer::view(class AgendaEntry, enum AgendaEventViewer::Actions) + ?view@AgendaEventViewer@@QAEXABVQFile@@W4Actions@1@@Z @ 2 NONAME ; void AgendaEventViewer::view(class QFile const &, enum AgendaEventViewer::Actions) + ??1AgendaEventViewer@@UAE@XZ @ 3 NONAME ; AgendaEventViewer::~AgendaEventViewer(void) + ??0AgendaEventViewer@@QAE@PAVAgendaUtil@@PAVQObject@@@Z @ 4 NONAME ; AgendaEventViewer::AgendaEventViewer(class AgendaUtil *, class QObject *) + ?view@AgendaEventViewer@@QAEXKW4Actions@1@@Z @ 5 NONAME ; void AgendaEventViewer::view(unsigned long, enum AgendaEventViewer::Actions) + ??0AgendaEventViewer@@QAE@PAVQObject@@@Z @ 6 NONAME ; AgendaEventViewer::AgendaEventViewer(class QObject *) + diff -r fd30d51f876b -r b6db4fd4947b calendarui/agendaeventviewer/data/agendaeventviewer.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/agendaeventviewer/data/agendaeventviewer.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b calendarui/agendaeventviewer/data/agendaeventviewer.qrc --- a/calendarui/agendaeventviewer/data/agendaeventviewer.qrc Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/agendaeventviewer/data/agendaeventviewer.qrc Mon Jun 28 15:22:02 2010 +0530 @@ -2,11 +2,9 @@ agendaeventviewer.docml - - caleneventviewer_en_GB.qm - agendaeventvieweritem.css + agendaeventvieweritem_color.css agendaeventvieweritem.widgetml \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/agendaeventviewer/data/agendaeventvieweritem.css --- a/calendarui/agendaeventviewer/data/agendaeventvieweritem.css Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/agendaeventviewer/data/agendaeventvieweritem.css Mon Jun 28 15:22:02 2010 +0530 @@ -1,3 +1,14 @@ + +AgendaEventViewerItem[leftPrimaryIconItem="true"]:portrait { + layout: layout-eventvieweritem-stretch; + fixed-width: var(hb-param-screen-width); +} + +AgendaEventViewerItem[leftPrimaryIconItem="true"]:landscape { + layout: layout-eventvieweritem-stretch; + fixed-width: var(hb-param-screen-width); +} + AgendaEventViewerItem:portrait { layout: layout-eventvieweritem; @@ -9,7 +20,17 @@ fixed-width: var(hb-param-screen-width); } -AgendaEventViewerItem::primaryIconItem { + +AgendaEventViewerItem::primaryLeftIconItem { + fixed-width:var(hb-param-graphic-size-primary-small); + fixed-height:var(hb-param-graphic-size-primary-small); + top: -var(hb-param-margin-gene-top); + left: -var(hb-param-margin-gene-left); + + +} + +AgendaEventViewerItem::primaryRightIconItem { fixed-width:var(hb-param-graphic-size-secondary); fixed-height:var(hb-param-graphic-size-secondary); top: -var(hb-param-margin-gene-top); @@ -20,24 +41,40 @@ fixed-width:var(hb-param-graphic-size-primary-small); fixed-height:var(hb-param-graphic-size-primary-small); left: -var(hb-param-margin-gene-left); + } -AgendaEventViewerItem::primaryTextItem { +AgendaEventViewerItem::primaryTextItem[leftPrimaryIconItem="true"] { + text-height: var(hb-param-text-height-primary); + font-variant: primary; + text-align: left; + top: -var(hb-param-margin-gene-top); + right: var(hb-param-margin-gene-middle-horizontal); + left: -var(hb-param-margin-gene-middle-horizontal); +} +AgendaEventViewerItem::primaryTextItem[leftPrimaryIconItem="false"] { text-height: var(hb-param-text-height-primary); font-variant: primary; text-align: left; top: -var(hb-param-margin-gene-top); right: var(hb-param-margin-gene-middle-horizontal); - + + } - -AgendaEventViewerItem::secondaryTextItem { +AgendaEventViewerItem::secondaryTextItem[leftPrimaryIconItem="true"]{ text-height: var(hb-param-text-height-secondary); font-variant: secondary; text-align: left; top: -var(hb-param-margin-gene-middle-vertical); right: var(hb-param-margin-gene-right); - left: -var(hb-param-margin-gene-middle-horizontal); bottom: var(hb-param-margin-gene-bottom); - } +AgendaEventViewerItem::secondaryTextItem[leftPrimaryIconItem="false"] { + text-height: var(hb-param-text-height-secondary); + font-variant: secondary; + text-align: left; + top: -var(hb-param-margin-gene-middle-vertical); + right: var(hb-param-margin-gene-right); + bottom: var(hb-param-margin-gene-bottom); + left: -var(hb-param-margin-gene-middle-horizontal); +} diff -r fd30d51f876b -r b6db4fd4947b calendarui/agendaeventviewer/data/agendaeventvieweritem.widgetml --- a/calendarui/agendaeventviewer/data/agendaeventvieweritem.widgetml Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/agendaeventviewer/data/agendaeventvieweritem.widgetml Mon Jun 28 15:22:02 2010 +0530 @@ -16,4 +16,26 @@ - + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/agendaeventviewer/data/agendaeventvieweritem_color.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/agendaeventviewer/data/agendaeventvieweritem_color.css Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,27 @@ +AgendaEventViewerItem::primaryTextItem{ + color: var(qtc_list_item_content_normal); +} + +AgendaEventViewerItem::primaryTextItem[state="pressed"]{ + color: var(qtc_list_item_pressed); +} + +AgendaEventViewerItem::primaryTextItem[state="disabled"]{ + color: var(qtc_list_item_disabled); +} + +AgendaEventViewerItem::secondaryTextItem{ + color: var(qtc_list_item_content_normal); +} + +AgendaEventViewerItem::secondaryTextItem[state="pressed"]{ + color: var(qtc_list_item_pressed); +} + +AgendaEventViewerItem::secondaryTextItem[state="disabled"]{ + color: var(qtc_list_item_disabled); +} + +AgendaEventViewerItem::primaryRightIconItem{ + color: var(qtc_list_item_content_normal); +} \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/agendaeventviewer/data/caleneventviewer_en_GB.qm Binary file calendarui/agendaeventviewer/data/caleneventviewer_en_GB.qm has changed diff -r fd30d51f876b -r b6db4fd4947b calendarui/agendaeventviewer/eabi/agendaeventvieweru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/agendaeventviewer/eabi/agendaeventvieweru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,12 @@ +EXPORTS + _ZN17AgendaEventViewer4viewE11AgendaEntryNS_7ActionsE @ 1 NONAME + _ZN17AgendaEventViewer4viewERK5QFileNS_7ActionsE @ 2 NONAME + _ZN17AgendaEventViewer4viewEmNS_7ActionsE @ 3 NONAME + _ZN17AgendaEventViewerC1EP10AgendaUtilP7QObject @ 4 NONAME + _ZN17AgendaEventViewerC1EP7QObject @ 5 NONAME + _ZN17AgendaEventViewerC2EP10AgendaUtilP7QObject @ 6 NONAME + _ZN17AgendaEventViewerC2EP7QObject @ 7 NONAME + _ZN17AgendaEventViewerD0Ev @ 8 NONAME + _ZN17AgendaEventViewerD1Ev @ 9 NONAME + _ZN17AgendaEventViewerD2Ev @ 10 NONAME + diff -r fd30d51f876b -r b6db4fd4947b calendarui/agendaeventviewer/inc/agendaeventview.h --- a/calendarui/agendaeventviewer/inc/agendaeventview.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/agendaeventviewer/inc/agendaeventview.h Mon Jun 28 15:22:02 2010 +0530 @@ -29,15 +29,17 @@ // Forward declarations class QGraphicsLinearLayout; -class QTranslator; +class QTimer; +class QPluginLoader; class HbView; class HbAction; class HbLabel; class HbMainWindow; +class HbTranslator; +class MapTileService; class AgendaEventViewerItem; class AgendaEventViewerPrivate; class AgendaEventViewerDocLoader; -class NotesEditor; class CalenEditor; class AgendaEventView: public QObject @@ -71,8 +73,9 @@ void removeAllWidgets(); void addAllWidgets(); void showDeleteOccurencePopup(); - int showDeleteConfirmationQuery(); - + void showDeleteConfirmationQuery(); + void getSubjectIcon(AgendaEntry::Type type, QString &subjectIcon); + void getProgressIndicatorstatus(QString &progressIcon); private slots: void markTodoStatus(); void edit(); @@ -84,9 +87,13 @@ void handleNoteEditorClosed(bool status); void handleCalendarEditorClosed(); void handleDeleteOccurence(int index); + void handleDeleteAction(); + void updateProgressIndicator(); + void receiveMapTileStatus(int entryid,int addressType, int status); + void changedOrientation(Qt::Orientation orientation); private: - + HbMainWindow* mMainWindow; HbView *mViewer; QPointer mSubjectWidget; QPointer mDateTimeWidget; @@ -102,16 +109,22 @@ AgendaEventViewerDocLoader *mDocLoader; AgendaEntry mOriginalAgendaEntry; AgendaEntry mAgendaEntry; - NotesEditor *mNoteEditor; + QPointer mNotesEditorPluginLoader; CalenEditor *mCalenEditor; QGraphicsLinearLayout *mLinearLayout; - - QTranslator *mTranslator; + + HbTranslator *mTranslator; bool mReminderWidgetAdded; HbAction *mBackAction; - HbMainWindow* mMainWindow; + bool mLocationFeatureEnabled; - QString mMaptilePath; + QString mMaptilePath; + MapTileService *mMaptileService; + QTimer *mProgressTimer; + int mProgressIconCount; + bool mMaptileStatusReceived; + int mMaptileStatus; + bool mNotesPluginLoaded; private: friend class AgendaEventViewerPrivate; diff -r fd30d51f876b -r b6db4fd4947b calendarui/agendaeventviewer/inc/agendaeventviewer_p.h --- a/calendarui/agendaeventviewer/inc/agendaeventviewer_p.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/agendaeventviewer/inc/agendaeventviewer_p.h Mon Jun 28 15:22:02 2010 +0530 @@ -50,6 +50,7 @@ void editingCompleted(); void deletingStarted(); void deletingCompleted(); + void viewCreationCompleted(int error); private: AgendaEventViewer *q_ptr; @@ -60,6 +61,11 @@ private: friend class AgendaEventView; + ulong mId; + AgendaEventViewer::Actions mAction; + bool mShowEventViewById; + bool mShowEventViewByFileHandle; + QString mFileName; }; #endif // AGENDAEVENTVIEWERPRIVATE_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/agendaeventviewer/inc/agendaeventvieweritem.h --- a/calendarui/agendaeventviewer/inc/agendaeventvieweritem.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/agendaeventviewer/inc/agendaeventvieweritem.h Mon Jun 28 15:22:02 2010 +0530 @@ -43,6 +43,8 @@ HbTextItem *mSecondaryText; HbIconItem *mPrimaryIcon; HbIconItem *mSecondaryIcon; + HbIconItem *mPrimaryRightIcon; + HbIconItem *mPrimaryLeftIcon; }; diff -r fd30d51f876b -r b6db4fd4947b calendarui/agendaeventviewer/src/agendaeventview.cpp --- a/calendarui/agendaeventviewer/src/agendaeventview.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/agendaeventviewer/src/agendaeventview.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -17,12 +17,14 @@ // System includes #include -#include #include -#include #include +#include +#include +#include +#include +#include #include -#include #include #include #include @@ -37,14 +39,12 @@ #include #include #include -#include -#include -#include -#include -#include +#include + // User includes +#include //maptile service #include -#include +#include #include #include "agendaeventview.h" #include "agendaeventviewerdocloader.h" @@ -52,18 +52,14 @@ #include "agendaeventviewer_p.h" #include "agendaeventvieweritem.h" #include "calendateutils.h" - -//maptile service -#include // Constants #define CHARACTER_HYPHEN "-" #define CHARACTER_SPACE " " #define CHARACTER_NEW_LINE "\n" -// This is used to set the maptile image height and width , -//because HbLabel by default not displaying the actual size of image -const int height = 128; -const int width = 330; +//This Property is use for setting a primary left icon +static const char *primaryLeftIconItem("leftPrimaryIconItem"); + /*! \class AgendaEventView. @@ -81,21 +77,18 @@ AgendaEventView::AgendaEventView( AgendaEventViewerPrivate *owner, QObject *parent): QObject(parent), + mMainWindow(NULL), mOwner(owner), + mTranslator(new HbTranslator("caleneventviewer")), mReminderWidgetAdded(true), - mMainWindow(NULL), - mMaptilePath(NULL) + mMaptilePath(NULL), + mMaptileService(NULL), + mProgressTimer(NULL), + mProgressIconCount(0), + mMaptileStatusReceived(false), + mMaptileStatus(-1), + mNotesPluginLoaded(false) { - qDebug() << "AgendaEventViewer: AgendaEventView::AgendaEventView -->"; - - // Load the translator based on locale - mTranslator = new QTranslator; - QString lang = QLocale::system().name(); - QString path = "Z:/resource/qt/translations/"; - mTranslator->load("caleneventviewer_en_GB",":/translations"); - // TODO: Load the appropriate .qm file based on locale - //bool loaded = mTranslator->load("caleneventviewer_" + lang, path); - HbApplication::instance()->installTranslator(mTranslator); mDocLoader = new AgendaEventViewerDocLoader; @@ -113,6 +106,9 @@ mSubjectWidget = qobject_cast ( mDocLoader->findWidget(AGENDA_EVENT_VIEWER_SUBJECT_WIDGET)); + //load layout that supports icon before subject label + mSubjectWidget->setProperty(primaryLeftIconItem,true); + mDateTimeWidget = qobject_cast ( mDocLoader->findWidget(AGENDA_EVENT_VIEWER_DATE_TIME_WIDGET)); @@ -139,12 +135,18 @@ mLinearLayout = static_cast (scrollAreaWidget->layout()); - MapTileService::AppType appType; - appType = MapTileService::AppTypeCalendar; - mLocationFeatureEnabled = MapTileService::isLocationFeatureEnabled(appType); - + + //maptile service object , to retrive maptile path from database. + mMaptileService= new MapTileService(); + mLocationFeatureEnabled = mMaptileService->isLocationFeatureEnabled( + MapTileService::AppTypeCalendar); + if (mLocationFeatureEnabled) { + //timer to run progress indicator icon. + mProgressTimer = new QTimer(this); + mProgressTimer->setSingleShot(true); + connect(mProgressTimer, SIGNAL(timeout()), this, SLOT(updateProgressIndicator())); + } - qDebug() << "AgendaEventViewer: AgendaEventView::AgendaEventView <--"; } @@ -153,10 +155,8 @@ */ AgendaEventView::~AgendaEventView() { - qDebug() << "AgendaEventViewer: AgendaEventView::~AgendaEventView -->"; // Remove the translator - HbApplication::instance()->removeTranslator(mTranslator); if (mTranslator) { delete mTranslator; mTranslator = 0; @@ -164,14 +164,30 @@ mDocLoader->reset(); delete mDocLoader; - + + // Unload notes editor if loaded. + if (mNotesEditorPluginLoader) { + mNotesEditorPluginLoader->unload(); + delete mNotesEditorPluginLoader; + mNotesEditorPluginLoader = 0; + } + // Delete the mainwindow if we have created any if (mMainWindow) { delete mMainWindow; mMainWindow = NULL; } - qDebug() << "AgendaEventViewer: AgendaEventView::~AgendaEventView <--"; + if (mMaptileService) { + delete mMaptileService; + mMaptileService = NULL; + } + + if (mProgressTimer) { + delete mProgressTimer; + mProgressTimer = NULL; + } + } /*! @@ -182,7 +198,6 @@ void AgendaEventView::execute(AgendaEntry entry, AgendaEventViewer::Actions action) { - qDebug() << "AgendaEventViewer: AgendaEventView::execute -->"; mOriginalAgendaEntry = entry; mAgendaEntry = entry; @@ -198,9 +213,6 @@ // Add the toolbar items to event viewer addToolBarItem(action); - - // Add the title to event viewer. - addGroupBoxData(); // Connect for the entry updation and addtion signal to refresh the view // when the same is edited in editor. @@ -222,18 +234,19 @@ mMainWindow = new HbMainWindow(); mMainWindow->addView(mViewer); mMainWindow->setCurrentView(mViewer); + connect(mMainWindow,SIGNAL(orientationChanged(Qt::Orientation)),this,SLOT(changedOrientation(Qt::Orientation))); } else { window->addView(mViewer); window->setCurrentView(mViewer); + connect(window,SIGNAL(orientationChanged(Qt::Orientation)),this,SLOT(changedOrientation(Qt::Orientation))); } // Add softkey after adding view on window - mBackAction = new HbAction(Hb::BackAction); + mBackAction = new HbAction(Hb::BackNaviAction); mViewer->setNavigationAction(mBackAction); connect(mBackAction, SIGNAL(triggered()), this, SLOT(close())); - qDebug() << "AgendaEventViewer: AgendaEventView::execute <--"; } /*! @@ -241,7 +254,9 @@ */ void AgendaEventView::addViewerData() { - qDebug() << "AgendaEventViewer: AgendaEventView::addViewerData -->"; + + // Add the title to event viewer. + addGroupBoxData(); // Set the summary & priority to viewer. addSubjectAndPriorityData(); @@ -274,7 +289,6 @@ // Set the description. addDescriptionData(); - qDebug() << "AgendaEventViewer: AgendaEventView::addViewerData <--"; } /*! @@ -282,7 +296,6 @@ */ void AgendaEventView::addMenuItem() { - qDebug() << "AgendaEventViewer: AgendaEventView::addMenuItem -->"; if (mAgendaEntry.type() == AgendaEntry::TypeTodo) { @@ -300,7 +313,6 @@ SLOT(markTodoStatus())); menu->addAction(mMarkTodoAction); } - qDebug() << "AgendaEventViewer: AgendaEventView::addMenuItem <--"; } /*! @@ -308,7 +320,6 @@ */ void AgendaEventView::addToolBarItem(AgendaEventViewer::Actions action) { - qDebug() << "AgendaEventViewer: AgendaEventView::addToolBarItem -->"; HbToolBar *toolBar = qobject_cast ( mDocLoader->findWidget(AGENDA_EVENT_VIEWER_TOOLBAR)); @@ -339,7 +350,6 @@ toolBar->addAction(saveAction); } - qDebug() << "AgendaEventViewer: AgendaEventView::addToolBarItem <--"; } /*! @@ -347,21 +357,20 @@ */ void AgendaEventView::addGroupBoxData() { - qDebug() << "AgendaEventViewer: AgendaEventView::addGroupBoxData -->"; HbGroupBox *groupBox = qobject_cast ( mDocLoader->findWidget(AGENDA_EVENT_VIEWER_GROUPBOX)); - if (mAgendaEntry.type() == AgendaEntry::TypeTodo) { + AgendaEntry::Type entryType = mAgendaEntry.type(); + if (entryType == AgendaEntry::TypeTodo) { groupBox->setHeading(hbTrId("txt_calendar_subhead_to_do")); - } else if (mAgendaEntry.type() == AgendaEntry::TypeNote) { - groupBox->setHeading(tr("Note")); - } else { - // TODO: Add the text id based on the entry type Anniversary or meeting - groupBox->setHeading(hbTrId("txt_calendar_subhead_event")); + } else if (entryType == AgendaEntry::TypeAppoinment) { + groupBox->setHeading(hbTrId("txt_calendar_subhead_meeting")); + }else if (entryType == AgendaEntry::TypeEvent) { + //TODO: Add text id once available + groupBox->setHeading(hbTrId("All day event")); } - - qDebug() << "AgendaEventViewer: AgendaEventView::addGroupBoxData <--"; + } /*! @@ -369,8 +378,6 @@ */ void AgendaEventView::addSubjectAndPriorityData() { - qDebug() - << "AgendaEventViewer: AgendaEventView::addSubjectAndPriorityData -->"; QStringList itemList; itemList.append(hbTrId("txt_calendar_dblist_subject")); @@ -383,16 +390,17 @@ mSubjectWidget->setEventViewerItemData(itemList, Qt::DisplayRole); - itemList.clear(); - QString priorityIcon(QString::null); - getPriorityIcon(mAgendaEntry.priority(), priorityIcon); - itemList.append(priorityIcon); - itemList.append(QString::null); + itemList.clear(); + QString priorityIcon(QString::null); + QString subjectIcon(QString::null); + getPriorityIcon(mAgendaEntry.priority(), priorityIcon); + getSubjectIcon(mAgendaEntry.type(),subjectIcon); + itemList.append(subjectIcon); + itemList.append(priorityIcon); + itemList.append(QString::null); mSubjectWidget->setEventViewerItemData(itemList, Qt::DecorationRole); - qDebug() - << "AgendaEventViewer: AgendaEventView::addSubjectAndPriorityData <--"; } /*! @@ -400,9 +408,6 @@ */ void AgendaEventView::addDateTimeData() { - qDebug() - << "AgendaEventViewer: AgendaEventView::addDateTimeData -->"; - QStringList itemData; HbExtendedLocale systemLocale = HbExtendedLocale::system(); @@ -410,7 +415,11 @@ QDateTime endDateTime = mAgendaEntry.endTime(); itemData.append(QString::null); + itemData.append(QString::null); itemData.append("qtg_small_calendar"); + + mDateTimeWidget->setProperty(primaryLeftIconItem, false); + mDateTimeWidget->setEventViewerItemData(itemData, Qt::DecorationRole); itemData.clear(); itemData.append(QString::null); @@ -461,14 +470,13 @@ dateTimeText.append(systemLocale.format(startDateTime.date(), r_qtn_date_usual_with_zero)); - - if (CalenDateUtils::onSameDay(startDateTime, endDateTime)) { + if (CalenDateUtils::onSameDay(startDateTime, endDateTime.addSecs(-60))) { data.append(hbTrId("txt_calendar_dblist_meeting_date").arg( dateTimeText)); } else { QString endDate; endDate.append( - systemLocale.format(endDateTime.date(), + systemLocale.format(endDateTime.addSecs(-60).date(), r_qtn_date_usual_with_zero)); data.append(hbTrId("txt_calendar_dblist_start_end_time").arg( dateTimeText).arg(endDate)); @@ -480,8 +488,6 @@ itemData.append(data); mDateTimeWidget->setEventViewerItemData(itemData, Qt::DisplayRole); - qDebug() - << "AgendaEventViewer: AgendaEventView::addDateTimeData <--"; } /*! @@ -489,16 +495,28 @@ */ void AgendaEventView::addLocationData() { - qDebug() << "AgendaEventViewer: AgendaEventView::addLocationData -->"; QStringList itemData; - itemData.append(QString::null); - itemData.append("qtg_small_location"); + QString progressIcon(QString::null); + if ( mLocationFeatureEnabled ) { + getProgressIndicatorstatus(progressIcon); + } + if( progressIcon.isNull() ) { + itemData.append(QString::null); + itemData.append(QString::null); + itemData.append("qtg_small_location"); + mLocationWidget->setProperty(primaryLeftIconItem, false); + } + else { + itemData.append("qtg_small_location"); + itemData.append( progressIcon ); + itemData.append(QString::null); + mLocationWidget->setProperty(primaryLeftIconItem, true); + } mLocationWidget->setEventViewerItemData(itemData, Qt::DecorationRole); itemData.clear(); itemData.append(QString::null); itemData.append(mAgendaEntry.location()); mLocationWidget->setEventViewerItemData(itemData, Qt::DisplayRole); - qDebug() << "AgendaEventViewer: AgendaEventView::addLocationData <--"; } /*! @@ -506,70 +524,42 @@ */ void AgendaEventView::addMapTileImage() { + if (mLocationFeatureEnabled && !mAgendaEntry.location().isEmpty() && !mMaptilePath.isEmpty()) { - qDebug() << "AgendaEventViewer: AgendaEventView::addMapTileImage -->"; - - if (!mAgendaEntry.location().isEmpty() && mLocationFeatureEnabled){ - MapTileService::AddressType addressType; - addressType = MapTileService::AddressPlain; - int eventId = mAgendaEntry.id(); - mMaptilePath = MapTileService::getMapTileImage(eventId, addressType); - if (!mMaptilePath.isNull()) - { - QIcon mapTileIcon(mMaptilePath); - QPainter painter; - QPixmap baloon(HbIcon("qtg_small_location.svg").pixmap()); - QPixmap map (mapTileIcon.pixmap(width,height)); - //Display pin image in the center of maptile image - painter.begin( &map ); - painter.drawPixmap( (width/2)-(baloon.width()/2), - (height/2)-baloon.height(), baloon ); - painter.end(); - mapTileIcon.addPixmap( map ); - - HbIcon maptile(mapTileIcon); - mMaptileLabel->setIcon(maptile); - - mMaptileLabel->setPreferredSize(QSizeF(width, height)); - mMaptileLabel->setMinimumSize(QSizeF(width, height)); - mMaptileLabel->setMaximumSize(QSizeF(width, height)); - mMaptileLabel->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, - QSizePolicy::Fixed)); - - } + HbIcon maptile(mMaptilePath); + mMaptileLabel->setIcon(maptile); + mMaptileLabel->setPreferredSize(QSizeF(maptile.width(), maptile.height())); } - - qDebug() << "AgendaEventViewer: AgendaEventView::addMapTileImage <--"; } /*! Add reminder data to Event viewer */ void AgendaEventView::addReminderData() { - qDebug() << "AgendaEventViewer: AgendaEventView::addReminderData -->"; QStringList itemData; itemData.append(QString::null); - itemData.append("qtg_small_reminder"); + itemData.append(QString::null); + itemData.append("qtg_small_reminder"); + mReminderWidget->setProperty(primaryLeftIconItem, false); mReminderWidget->setEventViewerItemData(itemData, Qt::DecorationRole); itemData.clear(); itemData.append(QString::null); itemData.append(alarmTimeText()); mReminderWidget->setEventViewerItemData(itemData, Qt::DisplayRole); - qDebug() << "AgendaEventViewer: AgendaEventView::addReminderData <--"; -} + } /*! Add completed to-do data to Event viewer */ void AgendaEventView::addCompletedTodoData() { - qDebug() << "AgendaEventViewer: AgendaEventView::addCompletedTodoData -->"; QStringList itemData; QString completedText; - HbExtendedLocale systemLocale = HbExtendedLocale::system();; - + HbExtendedLocale systemLocale = HbExtendedLocale::system();; + itemData.append(QString::null); itemData.append(QString::null); itemData.append(QString::null); + mReminderWidget->setProperty(primaryLeftIconItem, false); mReminderWidget->setEventViewerItemData(itemData, Qt::DecorationRole); itemData.clear(); completedText = systemLocale.format(mAgendaEntry.completedDateTime().date(), @@ -577,7 +567,6 @@ itemData.append(hbTrId("txt_calendar_dblist_completed_date")); itemData.append(completedText); mReminderWidget->setEventViewerItemData(itemData, Qt::DisplayRole); - qDebug() << "AgendaEventViewer: AgendaEventView::addCompletedTodoData <--"; } /*! @@ -585,16 +574,16 @@ */ void AgendaEventView::addRepeatData() { - qDebug() << "AgendaEventViewer: AgendaEventView::addRepeatData -->"; QStringList itemData; itemData.append(QString::null); - itemData.append("qtg_mono_repeat.svg"); + itemData.append(QString::null); + itemData.append("qtg_small_repeat"); + mRepeatWidget->setProperty(primaryLeftIconItem, false); mRepeatWidget->setEventViewerItemData(itemData, Qt::DecorationRole); itemData.clear(); itemData.append(QString::null); itemData.append(repeatRule()); mRepeatWidget->setEventViewerItemData(itemData, Qt::DisplayRole); - qDebug() << "AgendaEventViewer: AgendaEventView::addRepeatData <--"; } /*! @@ -602,16 +591,16 @@ */ void AgendaEventView::addDescriptionData() { - qDebug() << "AgendaEventViewer: AgendaEventView::addDiscriptionData -->"; QStringList itemData; itemData.append(QString::null); itemData.append(QString::null); + itemData.append(QString::null); + mDescriptionWidget->setProperty(primaryLeftIconItem, false); mDescriptionWidget->setEventViewerItemData(itemData, Qt::DecorationRole); itemData.clear(); itemData.append(hbTrId("txt_calendar_dblist_description")); itemData.append(mAgendaEntry.description()); mDescriptionWidget->setEventViewerItemData(itemData, Qt::DisplayRole); - qDebug() << "AgendaEventViewer: AgendaEventView::addDiscriptionData <--"; } /*! @@ -619,7 +608,6 @@ */ void AgendaEventView::getPriorityIcon(int priority, QString &priorityIcon) { - qDebug() << "AgendaEventViewer: AgendaEventView::getPriorityIcon -->"; switch(priority) { case 1:priorityIcon.append("qtg_small_priority_high"); @@ -630,7 +618,6 @@ break; } - qDebug() << "AgendaEventViewer: AgendaEventView::getPriorityIcon <--"; } /*! @@ -638,7 +625,6 @@ */ QString AgendaEventView::repeatRule() const { - qDebug() << "AgendaEventViewer: AgendaEventView::repeatRule -->"; QString repeatRule; AgendaRepeatRule agendaRepeatRule = mAgendaEntry.repeatRule(); @@ -650,8 +636,7 @@ break; case AgendaRepeatRule::WeeklyRule: if (AgendaUtil::isWorkdaysRepeatingEntry(agendaRepeatRule)) { - //TODO: Add text id for workdays - repeatRule.append(hbTrId("Workdays")); + repeatRule.append(hbTrId("txt_calendar_dblist_repeats_workdays")); } else { if (agendaRepeatRule.interval() == 2) { repeatRule.append( @@ -682,7 +667,6 @@ hbTrId("txt_calendar_dblist_repeats_daily_val_until_1"). arg(untilDateString)); } - qDebug() << "AgendaEventViewer: AgendaEventView::repeatRule <--"; return repeatRule; } @@ -694,7 +678,6 @@ */ QString AgendaEventView::alarmTimeText() const { - qDebug() << "AgendaEventViewer: AgendaEventView::alarmTimeText -->"; QString alarmDateTimeText; QDateTime startTime; @@ -719,7 +702,6 @@ r_qtn_date_usual_with_zero))); } - qDebug() << "AgendaEventViewer: AgendaEventView::alarmTimeText <--"; return alarmDateTimeText; } @@ -728,7 +710,6 @@ */ void AgendaEventView::removeWidget() { - qDebug() << "AgendaEventViewer: AgendaEventView::removeWidget -->"; if (mAgendaEntry.location().isEmpty()) { mLocationWidget->hide(); @@ -742,10 +723,11 @@ mMaptileLabel->hide(); mLinearLayout->removeItem(mMaptileLabel); } + file.close(); if (mAgendaEntry.alarm().isNull()) { if (mAgendaEntry.type() == AgendaEntry::TypeTodo ) { - if (AgendaEntry::TodoNeedsAction == mAgendaEntry.status()) { + if (AgendaEntry::TodoCompleted != mAgendaEntry.status()) { mReminderWidget->hide(); mLinearLayout->removeItem(mReminderWidget); mReminderWidgetAdded = false; @@ -770,7 +752,6 @@ mLinearLayout->invalidate(); mLinearLayout->activate(); - qDebug() << "AgendaEventViewer: AgendaEventView::removeWidget <--"; } /*! @@ -778,8 +759,6 @@ */ void AgendaEventView::updateCompletedReminderData() { - qDebug() - << "AgendaEventViewer: AgendaEventView::updateCompletedReminderData -->"; if (AgendaEntry::TodoCompleted == mAgendaEntry.status()) { addCompletedTodoData(); @@ -809,8 +788,6 @@ mLinearLayout->invalidate(); mLinearLayout->activate(); - qDebug() - << "AgendaEventViewer: AgendaEventView::updateCompletedReminderData <--"; } /*! @@ -818,7 +795,6 @@ */ void AgendaEventView::removeAllWidgets() { - qDebug() << "AgendaEventViewer: AgendaEventView::removeAllWidgets -->"; for (int i = 2; i < mLinearLayout->count(); i++) { mLinearLayout->removeAt(i); @@ -826,7 +802,6 @@ mLinearLayout->invalidate(); mLinearLayout->activate(); - qDebug() << "AgendaEventViewer: AgendaEventView::removeAllWidgets <--"; } /*! @@ -834,7 +809,6 @@ */ void AgendaEventView::addAllWidgets() { - qDebug() << "AgendaEventViewer: AgendaEventView::addAllWidgets -->"; mLinearLayout->addItem(mLocationWidget); mLocationWidget->show(); @@ -850,7 +824,6 @@ mLinearLayout->invalidate(); mLinearLayout->activate(); - qDebug() << "AgendaEventViewer: AgendaEventView::addAllWidgets <--"; } /*! @@ -858,11 +831,10 @@ */ void AgendaEventView::showDeleteOccurencePopup() { - qDebug() - << "AgendaEventViewer: AgendaEventView::showDeleteOccurencePopup -->"; - HbDialog popUp; - popUp.setDismissPolicy(HbDialog::NoDismiss); - popUp.setTimeout(HbDialog::NoTimeout); + HbDialog *popUp = new HbDialog(); + popUp->setDismissPolicy(HbDialog::NoDismiss); + popUp->setTimeout(HbDialog::NoTimeout); + popUp->setAttribute( Qt::WA_DeleteOnClose, true ); QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical); HbWidget *deleteWidget = new HbWidget(mViewer); @@ -872,84 +844,88 @@ QStringList list; list << hbTrId("txt_calendar_info_this_occurrence_only") - << hbTrId("txt_calendar_info_all_occurences"); + << hbTrId("txt_calendar_info_all_occurences"); deleteButtonList->setItems(list); layout->addItem(deleteButtonList); - popUp.setContentWidget(deleteWidget); - popUp.setHeadingWidget(new HbLabel( - hbTrId("txt_calendar_title_delete_repeated_entry"))); + popUp->setContentWidget(deleteWidget); + popUp->setHeadingWidget(new HbLabel( + hbTrId("txt_calendar_title_delete_repeated_entry"))); connect(deleteButtonList, SIGNAL(itemSelected(int)), this, - SLOT(handleDeleteOccurence(int))); - connect(deleteButtonList, SIGNAL(itemSelected(int)), &popUp, SLOT(close())); + SLOT(handleDeleteOccurence(int))); + connect(deleteButtonList, SIGNAL(itemSelected(int)), popUp, SLOT(close())); - // Create secondary action - HbAction *cancelAction = new HbAction( - hbTrId("txt_calendar_button_softkey1_cancel")); - popUp.setSecondaryAction(cancelAction); - connect(cancelAction, SIGNAL(triggered()), &popUp, SLOT(close())); + popUp->addAction(new HbAction( + hbTrId("txt_calendar_button_softkey1_cancel"))); // Show the popup - popUp.exec(); + popUp->open(); - qDebug() - << "AgendaEventViewer: AgendaEventView::showDeleteOccurencePopup <--"; } - /*! - * Show delete confirmation query + Show delete confirmation query */ -int AgendaEventView::showDeleteConfirmationQuery() -{ - qDebug() - << "AgendaEventViewer: AgendaEventView::showDeleteConfirmationQuery -->"; - int retStatus = 0; +void AgendaEventView::showDeleteConfirmationQuery() + { + + HbMessageBox *popup = new HbMessageBox(HbMessageBox::MessageTypeQuestion); + popup->setDismissPolicy(HbDialog::NoDismiss); + popup->setTimeout(HbDialog::NoTimeout); + popup->setAttribute( Qt::WA_DeleteOnClose, true ); - HbMessageBox popup(HbMessageBox::MessageTypeQuestion); - popup.setDismissPolicy(HbDialog::NoDismiss); - popup.setTimeout(HbDialog::NoTimeout); - popup.setIconVisible(true); - - QString text = 0; + QString text = 0; - switch (mAgendaEntry.type()) { - case AgendaEntry::TypeAppoinment: - case AgendaEntry::TypeEvent: { - text.append(hbTrId("txt_calendar_info_delete_meeting")); - break; - } - case AgendaEntry::TypeAnniversary: { - text.append(hbTrId("txt_calendar_info_delete_anniversary")); - break; - } - case AgendaEntry::TypeTodo: { - text.append(hbTrId("txt_calendar_info_delete_todo_note")); - break; - } - case AgendaEntry::TypeNote: { - text.append(hbTrId("txt_calendar_info_delete_anniversary")); - break; - } - } + switch (mAgendaEntry.type()) { + case AgendaEntry::TypeAppoinment: + case AgendaEntry::TypeEvent: { + text.append(hbTrId("txt_calendar_info_delete_meeting")); + break; + } + case AgendaEntry::TypeAnniversary: { + text.append(hbTrId("txt_calendar_info_delete_anniversary")); + break; + } + case AgendaEntry::TypeTodo: { + text.append(hbTrId("txt_calendar_info_delete_todo_note")); + break; + } + case AgendaEntry::TypeNote: { + text.append(hbTrId("txt_calendar_info_delete_anniversary")); + break; + } + } + popup->setText(text); + + QList list = popup->actions(); + for(int i=0; i < list.count(); i++) + { + popup->removeAction(list[i]); + } + HbAction *deleteAction = + new HbAction(hbTrId("txt_calendar_button_delete"), popup); + popup->addAction(deleteAction); + connect(deleteAction, SIGNAL(triggered()), this , + SLOT(handleDeleteAction())); + popup->addAction(new HbAction(hbTrId("txt_calendar_button_cancel"), popup)); + popup->open(); +} - popup.setText(text); - - popup.setPrimaryAction(new HbAction( - hbTrId("txt_calendar_button_delete"), &popup)); - popup.setSecondaryAction(new HbAction( - hbTrId("txt_calendar_button_cancel"), &popup)); - HbAction *selected = popup.exec(); - if (selected == popup.primaryAction()) { - retStatus = 1; - } +/*! + Handles the delete action + */ +void AgendaEventView::handleDeleteAction() + { + // If delete button is pressed delete the entry + // To notify client that deleting Started + // Calendar Application changing state from viewing to deleting. + mOwner->deletingStarted(); - qDebug() - << "AgendaEventViewer: AgendaEventView::showDeleteConfirmationQuery <--"; - return retStatus; + // Delete the entry. + mOwner->mAgendaUtil->deleteEntry(mAgendaEntry.id()); } /*! @@ -957,36 +933,26 @@ */ void AgendaEventView::markTodoStatus() { - qDebug() << "AgendaEventViewer: AgendaEventView::markTodoStatus -->"; QDateTime currentDateTime = QDateTime::currentDateTime(); // Set the to-do status using the agenda util. - if (AgendaEntry::TodoNeedsAction == mAgendaEntry.status()) { - + if (AgendaEntry::TodoCompleted != mAgendaEntry.status()) { // Update the menu text to mark to-do as undone. mMarkTodoAction->setText(hbTrId("txt_calendar_menu_mark_as_not_done")); - mAgendaEntry.setStatus(AgendaEntry::TodoCompleted); mAgendaEntry.setCompletedDateTime(currentDateTime); mOwner->mAgendaUtil->setCompleted(mAgendaEntry, true, currentDateTime); - - - - } else if (AgendaEntry::TodoCompleted == mAgendaEntry.status()) { + } else { // Update the menu text to mark to-do as done. mMarkTodoAction->setText(hbTrId("txt_calendar_menu_mark_as_done")); - mAgendaEntry.setStatus(AgendaEntry::TodoNeedsAction); mOwner->mAgendaUtil->setCompleted(mAgendaEntry, false, currentDateTime); - - } updateCompletedReminderData(); - qDebug() << "AgendaEventViewer: AgendaEventView::markTodoStatus <--"; } /*! @@ -994,18 +960,32 @@ */ void AgendaEventView::edit() { - qDebug() << "AgendaEventViewer: AgendaEventView::edit -->"; mOwner->editingStarted(); if (AgendaEntry::TypeTodo == mAgendaEntry.type()) { - // Launch the to-do editor using notes editor api - // Construct Note editor for launching the to-do editor - mNoteEditor = new NotesEditor(mOwner->mAgendaUtil, this); - mNoteEditor->edit(mAgendaEntry); + // Load notes editor plugin if not loaded. + if(!mNotesPluginLoaded) { + // Launch the to-do editor using notes editor plugin api + QDir dir(NOTES_EDITOR_PLUGIN_PATH); + QString pluginName = dir.absoluteFilePath(NOTES_EDITOR_PLUGIN_NAME); + + // Create NotesEditor plugin loader object. + mNotesEditorPluginLoader = new QPluginLoader(pluginName); + + // Load the plugin + mNotesPluginLoaded = mNotesEditorPluginLoader->load(); + } + QObject *plugin = qobject_cast ( + mNotesEditorPluginLoader->instance()); + + NotesEditorInterface* interface = + qobject_cast(plugin); + + interface->edit(mAgendaEntry, mOwner->mAgendaUtil); connect( - mNoteEditor, SIGNAL(editingCompleted(bool)), + interface, SIGNAL(editingCompleted(bool)), this, SLOT(handleNoteEditorClosed(bool))); @@ -1018,7 +998,6 @@ } - qDebug() << "AgendaEventViewer: AgendaEventView::edit <--"; } /*! @@ -1026,7 +1005,6 @@ */ void AgendaEventView::deleteAgendaEntry() { - qDebug() << "AgendaEventViewer: AgendaEventView::deleteAgendaEntry -->"; // Before we do anything, check in the entry is repeating // OR its a child item @@ -1038,18 +1016,9 @@ // Query user if he wants to delete whole series or just this occurence showDeleteOccurencePopup(); } else { - if (showDeleteConfirmationQuery()) { - - // To notify client that deleting Started - // Calendar Application changing state from viewing to deleting. - mOwner->deletingStarted(); - - // Delete the entry. - mOwner->mAgendaUtil->deleteEntry(mAgendaEntry.id()); - } + showDeleteConfirmationQuery(); } - qDebug() << "AgendaEventViewer: AgendaEventView::deleteAgendaEntry <--"; } /*! @@ -1057,21 +1026,18 @@ */ void AgendaEventView::saveAgendaEntry() { - qDebug() << "AgendaEventViewer: AgendaEventView::saveAgendaEntry -->"; // Save entry to calendar. mOwner->mAgendaUtil->addEntry(mAgendaEntry); // Close the agenda entry viewer close(); - qDebug() << "AgendaEventViewer: AgendaEventView::saveAgendaEntry <--"; } /*! Closes the event viewer */ void AgendaEventView::close() { - qDebug() << "AgendaEventViewer: AgendaEventView::close -->"; // Remove the view from main window. HbMainWindow *window = hbInstance->allMainWindows().first(); @@ -1084,7 +1050,6 @@ window->removeView(mViewer); mOwner->viewingCompleted(mAgendaEntry.startTime().date()); - qDebug() << "AgendaEventViewer: AgendaEventView::close <--"; } /*! @@ -1092,7 +1057,6 @@ */ void AgendaEventView::handleEntryUpdation(ulong id) { - qDebug() << "AgendaEventViewer: AgendaEventView::handleEntryUpdation -->"; AgendaEntry updatedEntry = mOwner->mAgendaUtil->fetchById(id); @@ -1138,7 +1102,6 @@ close(); } - qDebug() << "AgendaEventViewer: AgendaEventView::handleEntryUpdation <--"; } /*! @@ -1146,7 +1109,6 @@ */ void AgendaEventView::handleEntryDeletion(ulong id) { - qDebug() <<"AgendaEventViewer: AgendaEventView::handleEntryDeletion -->"; if (id == mAgendaEntry.id()) { // Close the agenda entry viewer @@ -1154,7 +1116,6 @@ mOwner->deletingCompleted(); } - qDebug() <<"AgendaEventViewer: AgendaEventView::handleEntryDeletion <--"; } /*! @@ -1163,13 +1124,12 @@ void AgendaEventView::handleNoteEditorClosed(bool status) { Q_UNUSED(status); - qDebug() <<"AgendaEventViewer: AgendaEventView::handleNoteEditorClosed -->"; - // Cleanup. - mNoteEditor->deleteLater(); + // To avoid loading the plugin again for editing, + // Unload the plug-in while destruction. + mOwner->editingCompleted(); - qDebug() <<"AgendaEventViewer: AgendaEventView::handleNoteEditorClosed <--"; } /*! @@ -1177,15 +1137,11 @@ */ void AgendaEventView::handleCalendarEditorClosed() { - qDebug() - <<"AgendaEventViewer: AgendaEventView::handleCalendarEditorClosed -->"; // Cleanup. mCalenEditor->deleteLater(); mOwner->editingCompleted(); - qDebug() - <<"AgendaEventViewer: AgendaEventView::handleCalendarEditorClosed <--"; } /*! @@ -1193,7 +1149,6 @@ */ void AgendaEventView::handleDeleteOccurence(int index) { - qDebug() << "AgendaEventViewer: AgendaEventView::handleDeleteOccurence -->"; // To notify client that deleting Started // Calendar Application changing state from viewing to deleting. @@ -1213,7 +1168,154 @@ break; } - qDebug() << "AgendaEventViewer: AgendaEventView::handleDeleteOccurence <--"; +} + +/*! + Returns subject icon + */ +void AgendaEventView::getSubjectIcon(AgendaEntry::Type type, QString &subjectIcon) + { + switch(type) { + case AgendaEntry::TypeAppoinment: + { + subjectIcon.append("qtg_small_meeting"); + } + break; + case AgendaEntry::TypeTodo: + { + subjectIcon.append("qtg_small_todo"); + } + break; + case AgendaEntry::TypeEvent: + { + subjectIcon.append("qtg_small_day"); + } + break; + case AgendaEntry::TypeAnniversary: + { + subjectIcon.append("qtg_small_anniversary"); + } + break; + default: + break; + } + + } + +/*! + According to maptile fetching status , update the viewer screen. + */ +void AgendaEventView::updateProgressIndicator() +{ + if (!mMaptileStatusReceived) { + QString iconName("qtg_anim_small_loading_"); + mProgressIconCount = mProgressIconCount % 10 + 1; + iconName.append(QVariant(mProgressIconCount).toString()); + QStringList itemData; + itemData.append("qtg_small_location"); + itemData.append(iconName); + itemData.append(QString::null); + mLocationWidget->setProperty(primaryLeftIconItem, true); + mLocationWidget->setEventViewerItemData(itemData, Qt::DecorationRole); + mProgressTimer->start(100); + } + else { + if (mProgressTimer->isActive()) { + mProgressTimer->stop(); + } + if (mMaptileStatus == MapTileService::MapTileFetchingCompleted) { + QStringList itemData; + itemData.append(QString::null); + itemData.append(QString::null); + itemData.append("qtg_small_location"); + mLocationWidget->setProperty(primaryLeftIconItem, false); + mLocationWidget->setEventViewerItemData(itemData, Qt::DecorationRole); + Qt::Orientations orientation=hbInstance->allMainWindows().first()->orientation(); + mMaptilePath.clear(); + mMaptileStatus = mMaptileService->getMapTileImage(mAgendaEntry.id(), MapTileService::AddressPlain, mMaptilePath ,orientation); + addMapTileImage(); + QFile file(mMaptilePath); + if (file.exists()) { + //add to linear layout + int indexMaptileLabel = 3;// index of maptile widget position + mLinearLayout->insertItem(indexMaptileLabel, mMaptileLabel); + mMaptileLabel->show(); + } + file.close(); + + } + else { + QStringList itemData; + itemData.append("qtg_small_location"); + QString stopIcon; + stopIcon.append(QString("qtg_mono_search_stop")); + itemData.append(stopIcon); + itemData.append(QString::null); + mLocationWidget->setProperty(primaryLeftIconItem, true); + mLocationWidget->setEventViewerItemData(itemData, Qt::DecorationRole); + + } + } +} + +/*! + Maptile status received from maptile service + */ +void AgendaEventView::receiveMapTileStatus(int entryid,int addressType, int status) +{ + if (mAgendaEntry.id() == entryid && addressType == MapTileService::AddressPlain) { + mMaptileStatusReceived = true; + mMaptileStatus = status; + updateProgressIndicator(); + } +} + +/*! + Returns progress indication icon as per status of entry in database. + */ +void AgendaEventView::getProgressIndicatorstatus(QString &progressIcon) +{ + MapTileService::AddressType addressType; + addressType = MapTileService::AddressPlain; + int eventId = mAgendaEntry.id(); + mMaptilePath.clear(); + mMaptileStatus = -1; + connect(mMaptileService, SIGNAL(maptileFetchingStatusUpdate(int, + int ,int)), this, SLOT(receiveMapTileStatus(int,int,int))); + Qt::Orientations orientation=hbInstance->allMainWindows().first()->orientation(); + mMaptileStatus = mMaptileService->getMapTileImage(eventId, addressType, mMaptilePath ,orientation); + if (mMaptileStatus == MapTileService::MapTileFetchingNetworkError || mMaptileStatus + == MapTileService::MapTileFetchingInProgress) { + mMaptilePath.clear(); + mMaptileStatusReceived = false; //reseting receiving status value + progressIcon.append(QString("qtg_anim_small_loading_1")); + mProgressTimer->start(100); + } + else if (mMaptileStatus == MapTileService::MapTileFetchingInvalidAddress || mMaptileStatus + == MapTileService::MapTileFetchingUnknownError) { + mMaptilePath.clear(); + //no further need of this coonnection + disconnect(mMaptileService, SIGNAL(maptileFetchingStatusUpdate(int, + int ,int)), this, SLOT(receiveMapTileStatus(int,int,int))); + progressIcon.append(QString("qtg_mono_search_stop")); + } + else { + //no further need of this coonnection + disconnect(mMaptileService, SIGNAL(maptileFetchingStatusUpdate(int, + int ,int)), this, SLOT(receiveMapTileStatus(int,int,int))); + progressIcon.append(QString::null); + } +} +/*! + Reload the maptile image on system orientation change. + */ +void AgendaEventView::changedOrientation(Qt::Orientation orientation) +{ + if (mMaptileStatus == MapTileService::MapTileFetchingCompleted) { + mMaptilePath.clear(); + mMaptileService->getMapTileImage(mAgendaEntry.id(), MapTileService::AddressPlain, mMaptilePath,orientation); + addMapTileImage(); + } } // End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/agendaeventviewer/src/agendaeventviewer_p.cpp --- a/calendarui/agendaeventviewer/src/agendaeventviewer_p.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/agendaeventviewer/src/agendaeventviewer_p.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -16,7 +16,6 @@ */ // System includes. -#include #include #include @@ -43,9 +42,8 @@ */ AgendaEventViewerPrivate::AgendaEventViewerPrivate( AgendaUtil *agendaUtil, QObject *parent) -: QObject(parent) +: QObject(parent),mShowEventViewById(false),mShowEventViewByFileHandle(false),mFileName(NULL),mAction(AgendaEventViewer::ActionNothing) { - qDebug() <<"AgendaEventViewerPrivate::AgendaEventViewerPrivate -->"; // Get the q-pointer.from parent q_ptr = static_cast (parent); @@ -65,8 +63,12 @@ connect( mAgendaUtil, SIGNAL(entriesChanged(QList )), this, SLOT(handleEntriesChanged(QList ))); + + // Register for the calenInstance view creation sucessfully + connect( + mAgendaUtil, SIGNAL(entryViewCreationCompleted(int)), + this, SLOT(viewCreationCompleted(int))); - qDebug() <<"AgendaEventViewerPrivate::AgendaEventViewerPrivate <--"; } /*! @@ -74,14 +76,12 @@ */ AgendaEventViewerPrivate::~AgendaEventViewerPrivate() { - qDebug() <<"AgendaEventViewerPrivate::~AgendaEventViewerPrivate -->"; if (mViewerOwnsAgendaUtil) { delete mAgendaUtil; mAgendaUtil = 0; } - qDebug() <<"AgendaEventViewerPrivate::~AgendaEventViewerPrivate <--"; } /*! @@ -93,18 +93,22 @@ void AgendaEventViewerPrivate::view(const ulong id, AgendaEventViewer::Actions action) { - qDebug() <<"AgendaEventViewerPrivate::view(id) -->"; AgendaEntry entry = mAgendaUtil->fetchById(id); if (entry.isNull()) { + // save the entries , to show the entry once instances are created + // if entry is null exit ,later call back comes in viewCreationCompleted + mAction = action; + mId =id; + //to avoid view creation multiple times + mShowEventViewById = true; return; } // Construct the agenda event view mAgendaEventView = new AgendaEventView(this); mAgendaEventView->execute(entry, action); - qDebug() <<"AgendaEventViewerPrivate::view(id) <--"; } /*! @@ -116,7 +120,6 @@ void AgendaEventViewerPrivate::view(const QFile &fileHandle, AgendaEventViewer::Actions action) { - qDebug() <<"AgendaEventViewerPrivate::view(fileHandle) -->"; // Using calendar importer read the filehandle and generate agenda entry QString filePath = fileHandle.fileName(); @@ -126,8 +129,13 @@ if (!entry.isNull()) { mAgendaEventView = new AgendaEventView(this); mAgendaEventView->execute(entry, action); + } else { + //store the file name + mFileName = filePath ; + mAction = action ; + mShowEventViewByFileHandle = true; + q_ptr->viewingCompleted(QDateTime::currentDateTime().date()); } - qDebug() <<"AgendaEventViewerPrivate::view(fileHandle) <--"; } /*! @@ -137,7 +145,6 @@ void AgendaEventViewerPrivate::view(AgendaEntry entry, AgendaEventViewer::Actions action) { - qDebug() <<"AgendaEventViewerPrivate::view(entry) -->"; if (entry.isNull()) { return; @@ -146,7 +153,6 @@ mAgendaEventView = new AgendaEventView(this); mAgendaEventView->execute(entry, action); - qDebug() <<"AgendaEventViewerPrivate::view(entry) <--"; } /*! @@ -156,7 +162,6 @@ */ void AgendaEventViewerPrivate::viewingCompleted(const QDate date) { - qDebug() <<"AgendaEventViewerPrivate::viewingCompleted -->"; emit q_ptr->viewingCompleted(date); @@ -165,7 +170,6 @@ mAgendaEventView->deleteLater(); } - qDebug() <<"AgendaEventViewerPrivate::viewingCompleted -->"; } /*! @@ -173,11 +177,9 @@ */ void AgendaEventViewerPrivate::editingStarted() { - qDebug() <<"AgendaEventViewerPrivate::editingStarted -->"; emit q_ptr->editingStarted(); - qDebug() <<"AgendaEventViewerPrivate::editingStarted -->"; } /*! @@ -185,11 +187,9 @@ */ void AgendaEventViewerPrivate::editingCompleted() { - qDebug() <<"AgendaEventViewerPrivate::editingCompleted -->"; emit q_ptr->editingCompleted(); - qDebug() <<"AgendaEventViewerPrivate::editingCompleted -->"; } /*! @@ -197,11 +197,9 @@ */ void AgendaEventViewerPrivate::deletingStarted() { - qDebug() <<"AgendaEventViewerPrivate::deletingStarted -->"; emit q_ptr->deletingStarted(); - qDebug() <<"AgendaEventViewerPrivate::deletingStarted -->"; } /*! @@ -209,11 +207,43 @@ */ void AgendaEventViewerPrivate::deletingCompleted() { - qDebug() <<"AgendaEventViewerPrivate::deletingCompleted -->"; emit q_ptr->deletingCompleted(); - qDebug() <<"AgendaEventViewerPrivate::deletingCompleted -->"; } + +/*! + calls when instances of calenInstanceview and + entryInstanceview is created successfully + */ +void AgendaEventViewerPrivate::viewCreationCompleted(int error) + { + + if((KErrNone == error)) + { + AgendaEntry entry; + if (mShowEventViewById) + { + entry = mAgendaUtil->fetchById(mId); + } + else if(mShowEventViewByFileHandle) + { + QString nativeFilePath = QDir::toNativeSeparators(mFileName); + mAgendaUtil->importvCalendar(nativeFilePath, entry); + } + //if entry is there , then show the view + if (!entry.isNull()) + { + mAgendaEventView = new AgendaEventView(this); + mAgendaEventView->execute(entry, mAction); + } + } + //reset the variables + mId = 0; + mFileName.clear(); + mShowEventViewById = false; + mShowEventViewByFileHandle = false; + mAction = AgendaEventViewer::ActionNothing; + } // End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/agendaeventviewer/src/agendaeventvieweritem.cpp --- a/calendarui/agendaeventviewer/src/agendaeventvieweritem.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/agendaeventviewer/src/agendaeventvieweritem.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -40,7 +40,8 @@ */ AgendaEventViewerItem::AgendaEventViewerItem(QGraphicsItem *parent) : HbWidget(parent), mPrimaryText(NULL), mSecondaryText(NULL), - mPrimaryIcon(NULL), mSecondaryIcon(NULL) + mPrimaryIcon(NULL), mSecondaryIcon(NULL),mPrimaryRightIcon(NULL), + mPrimaryLeftIcon(NULL) { // Path for widgetml and css files. @@ -70,10 +71,15 @@ if (!itemData.isEmpty()) { QString firstItemData(QString::null); QString secondItemData(QString::null); - - if (itemData.count() == 2) { + QString thirdItemData(QString::null); + if (itemData.count() == 2) { + firstItemData = itemData.at(0); + secondItemData = itemData.at(1); + } + else if (itemData.count() == 3) { firstItemData = itemData.at(0); secondItemData = itemData.at(1); + thirdItemData = itemData.at(2); } else { firstItemData = itemData.at(0); } @@ -107,28 +113,43 @@ } } else { if (role == Qt::DecorationRole) { - if (!firstItemData.isEmpty()) { - if (!mPrimaryIcon) { - mPrimaryIcon = new HbIconItem(this); + if (!firstItemData.isEmpty()) { + if (!mPrimaryLeftIcon) { + mPrimaryLeftIcon = new HbIconItem(this); + } + HbStyle::setItemName(mPrimaryLeftIcon, "primaryLeftIconItem"); + mPrimaryLeftIcon->setVisible(true); + mPrimaryLeftIcon->setIconName(firstItemData); + + } else { + if (mPrimaryLeftIcon) { + HbStyle::setItemName(mPrimaryLeftIcon,""); + mPrimaryLeftIcon->setVisible(false); + } + + } + if (!secondItemData.isEmpty()) { + if (!mPrimaryRightIcon) { + mPrimaryRightIcon = new HbIconItem(this); } - HbStyle::setItemName(mPrimaryIcon, "primaryIconItem"); - mPrimaryIcon->setVisible(true); - mPrimaryIcon->setIconName(firstItemData); + HbStyle::setItemName(mPrimaryRightIcon, "primaryRightIconItem"); + mPrimaryRightIcon->setVisible(true); + mPrimaryRightIcon->setIconName(secondItemData); } else { - if (mPrimaryIcon) { - HbStyle::setItemName(mPrimaryIcon,""); - mPrimaryIcon->setVisible(false); + if (mPrimaryRightIcon) { + HbStyle::setItemName(mPrimaryRightIcon,""); + mPrimaryRightIcon->setVisible(false); } } - if (!secondItemData.isEmpty()) { + if (!thirdItemData.isEmpty()) { if (!mSecondaryIcon) { mSecondaryIcon = new HbIconItem(this); HbStyle::setItemName(mSecondaryIcon, "secondaryIconItem"); } - mSecondaryIcon->setIconName(secondItemData); + mSecondaryIcon->setIconName(thirdItemData); } else { if (mSecondaryIcon) { diff -r fd30d51f876b -r b6db4fd4947b calendarui/application/application.pro --- a/calendarui/application/application.pro Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/application/application.pro Mon Jun 28 15:22:02 2010 +0530 @@ -25,7 +25,6 @@ CONFIG += hb - symbian: { BLD_INF_RULES.prj_exports += \ @@ -33,9 +32,13 @@ "../rom/calendarresources.iby LANGUAGE_APP_LAYER_IBY_EXPORT_PATH(calendarresources.iby)" \ "../rom/calenregionalutil.iby LANGUAGE_APP_LAYER_IBY_EXPORT_PATH(calenregionalutil.iby)" \ "../rom/calenlunarchinese_variant.iby CUSTOMER_APP_LAYER_IBY_EXPORT_PATH(calenlunarchinese_variant.iby)" \ + "../rom/calenviewerservice.iby CORE_APP_LAYER_IBY_EXPORT_PATH(calenviewerservice.iby)" \ # Generic configuration interface for component cenrep settings "../conf/calendarUI.confml APP_LAYER_CONFML(calendarUI.confml)" \ - "../conf/calendarUI_101F874B.crml APP_LAYER_CRML(calendarUI_101F874B.crml)" + "../conf/calendarUI_101F874B.crml APP_LAYER_CRML(calendarUI_101F874B.crml)" \ + # stubsis is added to provide IAD + "../stubsis/calendar_stub.sis /epoc32/data/z/system/install/calendar_stub.sis" + LIBS += -lcalencontroller \ -lxqservice \ @@ -53,10 +56,8 @@ CONFIG += service SERVICE.FILE = calendar_conf.xml - - RESOURCES += calendar.qrc - - TRANSLATIONS += calendar.ts + + SKINICON = qtg_large_calendar } @@ -66,4 +67,8 @@ SOURCES += main.cpp \ calenserviceprovider.cpp +RESOURCES += calendar.qrc + +TRANSLATIONS += calendar.ts + # End of file --Don't remove this. \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/application/inc/calenserviceprovider.h --- a/calendarui/application/inc/calenserviceprovider.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/application/inc/calenserviceprovider.h Mon Jun 28 15:22:02 2010 +0530 @@ -27,7 +27,7 @@ public: enum CalenView{ MonthView = 0, - DayView + AgendaView }; //Q_DECLARE_USER_METATYPE_ENUM(enum); CalenServiceProvider(CCalenController *controller, QObject* parent = 0); diff -r fd30d51f876b -r b6db4fd4947b calendarui/application/src/calenserviceprovider.cpp --- a/calendarui/application/src/calenserviceprovider.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/application/src/calenserviceprovider.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -15,9 +15,10 @@ * */ //#include -#include #include +#include + #include "calencontroller.h" #include "caleneditor.h" #include "calenserviceprovider.h" @@ -36,17 +37,16 @@ void CalenServiceProvider::launchCalendarApp(const QDateTime& date, int viewId) { - qDebug() << "launchCalendarApp slot getting called -->"; // Check the view ID and launch the corresponding view switch(viewId) { - case 0: + case CalenLauncher::MonthView: // Launch the month view mController->handleServiceManagerSlot(ECalenMonthView, date); break; - case 1: - // Launch the month view - mController->handleServiceManagerSlot(ECalenDayView, date); + case CalenLauncher::AgendaView: + // Launch the agenda view + mController->handleServiceManagerSlot(ECalenAgendaView, date); break; default: // Keep Quiet diff -r fd30d51f876b -r b6db4fd4947b calendarui/application/src/main.cpp --- a/calendarui/application/src/main.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/application/src/main.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -17,10 +17,10 @@ #include -#include #include -#include -#include +#include +#include +#include #include "calencontroller.h" #include "calenserviceprovider.h" @@ -31,33 +31,27 @@ // Main window for providing the scene context HbMainWindow window; - window.setRenderHints( - QPainter::Antialiasing | QPainter::SmoothPixmapTransform); - window.setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate); //For translation, loading and installing translator - QTranslator translator; - QString lang = QLocale::system().name(); - QString path = "Z:/resource/qt/translations/"; - // TODO: Load the appropriate .qm file based on locale - //bool loaded = translator.load("calendar_" + lang, path); - bool loaded = translator.load("calendar_en_GB",":/translations"); - app.installTranslator(&translator); - - //Backup and restore code need to write here. + HbTranslator translator("calendar"); + translator.loadCommon(); + + // Backup and restore code need to write here. - // Check if calendar is launched thru XQService framework - bool isFromServiceFrmwrk = XQServiceUtil::isService(); - CCalenController *controller = new CCalenController(isFromServiceFrmwrk); + CCalenController *controller = new CCalenController(); + + int retValue = 0; + if (controller) { + controller->constructController(); + // Create the Calendar service provider + CalenServiceProvider service(controller); - // Create the Calendar service provider - CalenServiceProvider service(controller); + retValue = app.exec(); - int retValue = app.exec(); - - // delete the controller - controller->Release(); - + // delete the controller + controller->ReleaseCustomisations(); + controller->Release(); + } return retValue; } diff -r fd30d51f876b -r b6db4fd4947b calendarui/bwins/agendaeventvieweru.def --- a/calendarui/bwins/agendaeventvieweru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -EXPORTS - ?view@AgendaEventViewer@@QAEXVAgendaEntry@@W4Actions@1@@Z @ 1 NONAME ; void AgendaEventViewer::view(class AgendaEntry, enum AgendaEventViewer::Actions) - ?view@AgendaEventViewer@@QAEXABVQFile@@W4Actions@1@@Z @ 2 NONAME ; void AgendaEventViewer::view(class QFile const &, enum AgendaEventViewer::Actions) - ??1AgendaEventViewer@@UAE@XZ @ 3 NONAME ; AgendaEventViewer::~AgendaEventViewer(void) - ??0AgendaEventViewer@@QAE@PAVAgendaUtil@@PAVQObject@@@Z @ 4 NONAME ; AgendaEventViewer::AgendaEventViewer(class AgendaUtil *, class QObject *) - ?view@AgendaEventViewer@@QAEXKW4Actions@1@@Z @ 5 NONAME ; void AgendaEventViewer::view(unsigned long, enum AgendaEventViewer::Actions) - ??0AgendaEventViewer@@QAE@PAVQObject@@@Z @ 6 NONAME ; AgendaEventViewer::AgendaEventViewer(class QObject *) - diff -r fd30d51f876b -r b6db4fd4947b calendarui/bwins/calencommonutilsu.def --- a/calendarui/bwins/calencommonutilsu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -EXPORTS - ?isNullTime@CalenDateUtils@@SA_NAAVQDateTime@@@Z @ 1 NONAME ; bool CalenDateUtils::isNullTime(class QDateTime &) - ?roundToPreviousHour@CalenDateUtils@@SAHABH@Z @ 2 NONAME ; int CalenDateUtils::roundToPreviousHour(int const &) - ?onSameMonth@CalenDateUtils@@SA_NABVQDateTime@@0@Z @ 3 NONAME ; bool CalenDateUtils::onSameMonth(class QDateTime const &, class QDateTime const &) - ?timeOfDay@CalenDateUtils@@SAHABVQDateTime@@@Z @ 4 NONAME ; int CalenDateUtils::timeOfDay(class QDateTime const &) - ?minTime@CalenDateUtils@@SA?AVQDateTime@@XZ @ 5 NONAME ; class QDateTime CalenDateUtils::minTime(void) - ?isOnToday@CalenDateUtils@@SA_NABVQDateTime@@@Z @ 6 NONAME ; bool CalenDateUtils::isOnToday(class QDateTime const &) - ?displayTimeOnDay@CalenDateUtils@@SA?AVQDateTime@@ABV2@0@Z @ 7 NONAME ; class QDateTime CalenDateUtils::displayTimeOnDay(class QDateTime const &, class QDateTime const &) - ?endsAtStartOfDayL@CalenAgendaUtils@@SA_NAAVAgendaEntry@@ABVQDateTime@@@Z @ 8 NONAME ; bool CalenAgendaUtils::endsAtStartOfDayL(class AgendaEntry &, class QDateTime const &) - ?removeEntriesEndingAtMidnightL@CalenAgendaUtils@@SAXAAV?$QList@VAgendaEntry@@@@ABVQDateTime@@@Z @ 9 NONAME ; void CalenAgendaUtils::removeEntriesEndingAtMidnightL(class QList &, class QDateTime const &) - ?roundToPreviousHour@CalenDateUtils@@SA?AVQDateTime@@ABV2@@Z @ 10 NONAME ; class QDateTime CalenDateUtils::roundToPreviousHour(class QDateTime const &) - ?pastOf@CalenDateUtils@@SA?AVQDateTime@@ABV2@H@Z @ 11 NONAME ; class QDateTime CalenDateUtils::pastOf(class QDateTime const &, int) - ?maxTime@CalenDateUtils@@SA?AVQDateTime@@XZ @ 12 NONAME ; class QDateTime CalenDateUtils::maxTime(void) - ?timeRangesIntersect@CalenDateUtils@@SA_NABVQDateTime@@000@Z @ 13 NONAME ; bool CalenDateUtils::timeRangesIntersect(class QDateTime const &, class QDateTime const &, class QDateTime const &, class QDateTime const &) - ?limitToValidTime@CalenDateUtils@@SA?AVQDateTime@@ABV2@@Z @ 14 NONAME ; class QDateTime CalenDateUtils::limitToValidTime(class QDateTime const &) - ?today@CalenDateUtils@@SA?AVQDateTime@@XZ @ 15 NONAME ; class QDateTime CalenDateUtils::today(void) - ?isValidDay@CalenDateUtils@@SA_NABVQDateTime@@@Z @ 16 NONAME ; bool CalenDateUtils::isValidDay(class QDateTime const &) - ?beginningOfDay@CalenDateUtils@@SA?AVQDateTime@@ABV2@@Z @ 17 NONAME ; class QDateTime CalenDateUtils::beginningOfDay(class QDateTime const &) - ?onSameDay@CalenDateUtils@@SA_NABVQDateTime@@0@Z @ 18 NONAME ; bool CalenDateUtils::onSameDay(class QDateTime const &, class QDateTime const &) - ?defaultTime@CalenDateUtils@@SA?AVQDateTime@@ABV2@@Z @ 19 NONAME ; class QDateTime CalenDateUtils::defaultTime(class QDateTime const &) - ?futureOf@CalenDateUtils@@SA?AVQDateTime@@ABV2@H@Z @ 20 NONAME ; class QDateTime CalenDateUtils::futureOf(class QDateTime const &, int) - ?now@CalenDateUtils@@SA?AVQDateTime@@XZ @ 21 NONAME ; class QDateTime CalenDateUtils::now(void) - diff -r fd30d51f876b -r b6db4fd4947b calendarui/bwins/calencontrolleru.def --- a/calendarui/bwins/calencontrolleru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -EXPORTS - ?checkMultipleCreation@CCalenController@@AAEXXZ @ 1 NONAME ; void CCalenController::checkMultipleCreation(void) - ?SetDefaultContext@CCalenController@@AAEXXZ @ 2 NONAME ; void CCalenController::SetDefaultContext(void) - ?getFirstView@CCalenController@@QAEHXZ @ 3 NONAME ; int CCalenController::getFirstView(void) - ?handleServiceManagerSlot@CCalenController@@QAEXHABVQDateTime@@@Z @ 4 NONAME ; void CCalenController::handleServiceManagerSlot(int, class QDateTime const &) - ?context@CCalenController@@QAEAAVMCalenContext@@XZ @ 5 NONAME ; class MCalenContext & CCalenController::context(void) - ?ViewManager@CCalenController@@QAEAAVCalenViewManager@@XZ @ 6 NONAME ; class CalenViewManager & CCalenController::ViewManager(void) - ?Infobar@CCalenController@@QAEPAVHbWidget@@XZ @ 7 NONAME ; class HbWidget * CCalenController::Infobar(void) - ?agendaInterface@CCalenController@@QAEPAVAgendaUtil@@XZ @ 8 NONAME ; class AgendaUtil * CCalenController::agendaInterface(void) - ?BroadcastNotification@CCalenController@@QAEXW4TCalenNotification@@@Z @ 9 NONAME ; void CCalenController::BroadcastNotification(enum TCalenNotification) - ?MainWindow@CCalenController@@QAEAAVHbMainWindow@@XZ @ 10 NONAME ; class HbMainWindow & CCalenController::MainWindow(void) - ?CancelNotifications@CCalenController@@QAEXPAVMCalenNotificationHandler@@@Z @ 11 NONAME ; void CCalenController::CancelNotifications(class MCalenNotificationHandler *) - ?Notifier@CCalenController@@QAEAAVCalenNotifier@@XZ @ 12 NONAME ; class CalenNotifier & CCalenController::Notifier(void) - ?InstanceL@CCalenController@@SAPAV1@XZ @ 13 NONAME ; class CCalenController * CCalenController::InstanceL(void) - ?CustomisationManager@CCalenController@@QAEAAVCCalenCustomisationManager@@XZ @ 14 NONAME ; class CCalenCustomisationManager & CCalenController::CustomisationManager(void) - ?IssueCommandL@CCalenController@@QAEHH@Z @ 15 NONAME ; int CCalenController::IssueCommandL(int) - ?Services@CCalenController@@QAEAAVMCalenServices@@XZ @ 16 NONAME ; class MCalenServices & CCalenController::Services(void) - ?InfobarTextL@CCalenController@@QAEPAVQString@@XZ @ 17 NONAME ; class QString * CCalenController::InfobarTextL(void) - ?Release@CCalenController@@QAEXXZ @ 18 NONAME ; void CCalenController::Release(void) - ?RegisterForNotificationsL@CCalenController@@QAEXPAVMCalenNotificationHandler@@W4TCalenNotification@@@Z @ 19 NONAME ; void CCalenController::RegisterForNotificationsL(class MCalenNotificationHandler *, enum TCalenNotification) - ??0CCalenController@@QAE@_N@Z @ 20 NONAME ; CCalenController::CCalenController(bool) - ?GetCommandHandlerL@CCalenController@@QAEPAVMCalenCommandHandler@@H@Z @ 21 NONAME ; class MCalenCommandHandler * CCalenController::GetCommandHandlerL(int) - ??1CCalenController@@QAE@XZ @ 22 NONAME ; CCalenController::~CCalenController(void) - ?OfferMenu@CCalenController@@QAEXPAVHbMenu@@@Z @ 23 NONAME ; void CCalenController::OfferMenu(class HbMenu *) - ?RegisterForNotificationsL@CCalenController@@QAEXPAVMCalenNotificationHandler@@AAV?$RArray@W4TCalenNotification@@@@@Z @ 24 NONAME ; void CCalenController::RegisterForNotificationsL(class MCalenNotificationHandler *, class RArray &) - ?NewServicesL@CCalenController@@UAEPAVMCalenServices@@XZ @ 25 NONAME ; class MCalenServices * CCalenController::NewServicesL(void) - diff -r fd30d51f876b -r b6db4fd4947b calendarui/bwins/calencustomisationmanageru.def --- a/calendarui/bwins/calencustomisationmanageru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -EXPORTS - ?SetPluginAvailabilityL@CCalenCustomisationManager@@QAEXVTUid@@H@Z @ 1 NONAME ; void CCalenCustomisationManager::SetPluginAvailabilityL(class TUid, int) - ?HandleNotificationL@CCalenCustomisationManager@@AAEXW4TCalenNotification@@@Z @ 2 NONAME ; void CCalenCustomisationManager::HandleNotificationL(enum TCalenNotification) - ?HandleNotification@CCalenCustomisationManager@@UAEXW4TCalenNotification@@@Z @ 3 NONAME ; void CCalenCustomisationManager::HandleNotification(enum TCalenNotification) - ?CreateActivePluginListL@CCalenCustomisationManager@@AAEXXZ @ 4 NONAME ; void CCalenCustomisationManager::CreateActivePluginListL(void) - ?AddPluginL@CCalenCustomisationManager@@AAEXPAVCCalenCustomisation@@VTUid@@@Z @ 5 NONAME ; void CCalenCustomisationManager::AddPluginL(class CCalenCustomisation *, class TUid) - ?OfferMenu@CCalenCustomisationManager@@QAEXPAVHbMenu@@@Z @ 6 NONAME ; void CCalenCustomisationManager::OfferMenu(class HbMenu *) - ?PluginInfoArray@CCalenCustomisationManager@@QBEABV?$RPointerArray@VCImplementationInformation@@@@XZ @ 7 NONAME ; class RPointerArray const & CCalenCustomisationManager::PluginInfoArray(void) const - ?DisablePluginL@CCalenCustomisationManager@@AAEXVTUid@@@Z @ 8 NONAME ; void CCalenCustomisationManager::DisablePluginL(class TUid) - ??_ECCalenCustomisationManager@@UAE@I@Z @ 9 NONAME ; CCalenCustomisationManager::~CCalenCustomisationManager(unsigned int) - ?InfobarTextL@CCalenCustomisationManager@@QAEPAVQString@@XZ @ 10 NONAME ; class QString * CCalenCustomisationManager::InfobarTextL(void) - ?NewL@CCalenCustomisationManager@@SAPAV1@AAVMCalenServicesFactory@@AAVMCalenServices@@@Z @ 11 NONAME ; class CCalenCustomisationManager * CCalenCustomisationManager::NewL(class MCalenServicesFactory &, class MCalenServices &) - ?ActivePlugins@CCalenCustomisationManager@@QBEABV?$RArray@VTUid@@@@XZ @ 12 NONAME ; class RArray const & CCalenCustomisationManager::ActivePlugins(void) const - ?PluginAvailabilityFinder@CCalenCustomisationManager@@CAHPBVTUid@@ABUTCalenPluginAvailability@1@@Z @ 13 NONAME ; int CCalenCustomisationManager::PluginAvailabilityFinder(class TUid const *, struct CCalenCustomisationManager::TCalenPluginAvailability const &) - ?UnloadPluginsL@CCalenCustomisationManager@@QAEXABV?$RArray@VTUid@@@@@Z @ 14 NONAME ; void CCalenCustomisationManager::UnloadPluginsL(class RArray const &) - ??1CCalenCustomisationManager@@UAE@XZ @ 15 NONAME ; CCalenCustomisationManager::~CCalenCustomisationManager(void) - ?LoadPluginL@CCalenCustomisationManager@@AAEXVTUid@@@Z @ 16 NONAME ; void CCalenCustomisationManager::LoadPluginL(class TUid) - ?GetCommandHandlerL@CCalenCustomisationManager@@QAEPAVMCalenCommandHandler@@H@Z @ 17 NONAME ; class MCalenCommandHandler * CCalenCustomisationManager::GetCommandHandlerL(int) - ??0CCalenCustomisationManager@@AAE@AAVMCalenServicesFactory@@AAVMCalenServices@@@Z @ 18 NONAME ; CCalenCustomisationManager::CCalenCustomisationManager(class MCalenServicesFactory &, class MCalenServices &) - ?DoImmediatePluginLoadingL@CCalenCustomisationManager@@AAEXXZ @ 19 NONAME ; void CCalenCustomisationManager::DoImmediatePluginLoadingL(void) - ?FindPluginL@CCalenCustomisationManager@@AAEPAVCCalenCustomisation@@VTUid@@@Z @ 20 NONAME ; class CCalenCustomisation * CCalenCustomisationManager::FindPluginL(class TUid) - ?ConstructL@CCalenCustomisationManager@@AAEXXZ @ 21 NONAME ; void CCalenCustomisationManager::ConstructL(void) - ?EnablePluginL@CCalenCustomisationManager@@AAEXVTUid@@@Z @ 22 NONAME ; void CCalenCustomisationManager::EnablePluginL(class TUid) - ?Infobar@CCalenCustomisationManager@@QAEPAVHbWidget@@XZ @ 23 NONAME ; class HbWidget * CCalenCustomisationManager::Infobar(void) - diff -r fd30d51f876b -r b6db4fd4947b calendarui/bwins/caleneditoru.def --- a/calendarui/bwins/caleneditoru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ -EXPORTS - ?metaObject@CalenEditor@@UBEPBUQMetaObject@@XZ @ 1 NONAME ; struct QMetaObject const * CalenEditor::metaObject(void) const - ?edit@CalenEditor@@QAEXVAgendaEntry@@_N@Z @ 2 NONAME ; void CalenEditor::edit(class AgendaEntry, bool) - ?edit@CalenEditor@@QAEXABVQFile@@_N@Z @ 3 NONAME ; void CalenEditor::edit(class QFile const &, bool) - ??_ECalenEditor@@UAE@I@Z @ 4 NONAME ; CalenEditor::~CalenEditor(unsigned int) - ?tr@CalenEditor@@SA?AVQString@@PBD0@Z @ 5 NONAME ; class QString CalenEditor::tr(char const *, char const *) - ?getStaticMetaObject@CalenEditor@@SAABUQMetaObject@@XZ @ 6 NONAME ; struct QMetaObject const & CalenEditor::getStaticMetaObject(void) - ?trUtf8@CalenEditor@@SA?AVQString@@PBD0@Z @ 7 NONAME ; class QString CalenEditor::trUtf8(char const *, char const *) - ?tr@CalenEditor@@SA?AVQString@@PBD0H@Z @ 8 NONAME ; class QString CalenEditor::tr(char const *, char const *, int) - ?entrySaved@CalenEditor@@IAEXXZ @ 9 NONAME ; void CalenEditor::entrySaved(void) - ?qt_metacast@CalenEditor@@UAEPAXPBD@Z @ 10 NONAME ; void * CalenEditor::qt_metacast(char const *) - ?create@CalenEditor@@QAEXVQDateTime@@_NW4CreateType@1@@Z @ 11 NONAME ; void CalenEditor::create(class QDateTime, bool, enum CalenEditor::CreateType) - ??0CalenEditor@@QAE@PAVQObject@@@Z @ 12 NONAME ; CalenEditor::CalenEditor(class QObject *) - ?d_func@CalenEditor@@ABEPBVCalenEditorPrivate@@XZ @ 13 NONAME ; class CalenEditorPrivate const * CalenEditor::d_func(void) const - ?trUtf8@CalenEditor@@SA?AVQString@@PBD0H@Z @ 14 NONAME ; class QString CalenEditor::trUtf8(char const *, char const *, int) - ??0CalenEditor@@QAE@PAVAgendaUtil@@PAVQObject@@@Z @ 15 NONAME ; CalenEditor::CalenEditor(class AgendaUtil *, class QObject *) - ?qt_metacall@CalenEditor@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 16 NONAME ; int CalenEditor::qt_metacall(enum QMetaObject::Call, int, void * *) - ??1CalenEditor@@UAE@XZ @ 17 NONAME ; CalenEditor::~CalenEditor(void) - ?staticMetaObject@CalenEditor@@2UQMetaObject@@B @ 18 NONAME ; struct QMetaObject const CalenEditor::staticMetaObject - ?edit@CalenEditor@@QAEXK_N@Z @ 19 NONAME ; void CalenEditor::edit(unsigned long, bool) - ?dialogClosed@CalenEditor@@IAEXXZ @ 20 NONAME ; void CalenEditor::dialogClosed(void) - ?d_func@CalenEditor@@AAEPAVCalenEditorPrivate@@XZ @ 21 NONAME ; class CalenEditorPrivate * CalenEditor::d_func(void) - ?calendarLaunchFailed@CalenEditor@@IAEXH@Z @ 22 NONAME ; void CalenEditor::calendarLaunchFailed(int) - ?create@CalenEditor@@QAEXVAgendaEntry@@_NW4CreateType@1@@Z @ 23 NONAME ; void CalenEditor::create(class AgendaEntry, bool, enum CalenEditor::CreateType) - diff -r fd30d51f876b -r b6db4fd4947b calendarui/bwins/calenglobaldatau.def --- a/calendarui/bwins/calenglobaldatau.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -EXPORTS - ??0CalenContextImpl@@QAE@XZ @ 1 NONAME ; CalenContextImpl::CalenContextImpl(void) - ??0CalenContextImpl@@QAE@PAVMCalenContextChangeObserver@@@Z @ 2 NONAME ; CalenContextImpl::CalenContextImpl(class MCalenContextChangeObserver *) - ??0CalenContextImpl@@QAE@ABV0@@Z @ 3 NONAME ; CalenContextImpl::CalenContextImpl(class CalenContextImpl const &) - diff -r fd30d51f876b -r b6db4fd4947b calendarui/bwins/calenlauncheru.def --- a/calendarui/bwins/calenlauncheru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -EXPORTS - ?staticMetaObject@CalenLauncher@@2UQMetaObject@@B @ 1 NONAME ; struct QMetaObject const CalenLauncher::staticMetaObject - ?launchCalendarApp@CalenLauncher@@QAEXW4CalenView@1@AAVQDateTime@@_N@Z @ 2 NONAME ; void CalenLauncher::launchCalendarApp(enum CalenLauncher::CalenView, class QDateTime &, bool) - ?calendarLaunchFailed@CalenLauncher@@IAEXH@Z @ 3 NONAME ; void CalenLauncher::calendarLaunchFailed(int) - ??1CalenLauncher@@UAE@XZ @ 4 NONAME ; CalenLauncher::~CalenLauncher(void) - ??_ECalenLauncher@@UAE@I@Z @ 5 NONAME ; CalenLauncher::~CalenLauncher(unsigned int) - ?tr@CalenLauncher@@SA?AVQString@@PBD0H@Z @ 6 NONAME ; class QString CalenLauncher::tr(char const *, char const *, int) - ?trUtf8@CalenLauncher@@SA?AVQString@@PBD0@Z @ 7 NONAME ; class QString CalenLauncher::trUtf8(char const *, char const *) - ?tr@CalenLauncher@@SA?AVQString@@PBD0@Z @ 8 NONAME ; class QString CalenLauncher::tr(char const *, char const *) - ?qt_metacast@CalenLauncher@@UAEPAXPBD@Z @ 9 NONAME ; void * CalenLauncher::qt_metacast(char const *) - ?getStaticMetaObject@CalenLauncher@@SAABUQMetaObject@@XZ @ 10 NONAME ; struct QMetaObject const & CalenLauncher::getStaticMetaObject(void) - ?handleError@CalenLauncher@@QAEXH@Z @ 11 NONAME ; void CalenLauncher::handleError(int) - ?trUtf8@CalenLauncher@@SA?AVQString@@PBD0H@Z @ 12 NONAME ; class QString CalenLauncher::trUtf8(char const *, char const *, int) - ??0CalenLauncher@@QAE@PAVQObject@@@Z @ 13 NONAME ; CalenLauncher::CalenLauncher(class QObject *) - ?metaObject@CalenLauncher@@UBEPBUQMetaObject@@XZ @ 14 NONAME ; struct QMetaObject const * CalenLauncher::metaObject(void) const - ?qt_metacall@CalenLauncher@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 15 NONAME ; int CalenLauncher::qt_metacall(enum QMetaObject::Call, int, void * *) - diff -r fd30d51f876b -r b6db4fd4947b calendarui/bwins/calensettingsu.def --- a/calendarui/bwins/calensettingsu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -EXPORTS - ?tr@CalenSettings@@SA?AVQString@@PBD0@Z @ 1 NONAME ; class QString CalenSettings::tr(char const *, char const *) - ?createModel@CalenSettings@@QAEXXZ @ 2 NONAME ; void CalenSettings::createModel(void) - ?trUtf8@CalenSettings@@SA?AVQString@@PBD0H@Z @ 3 NONAME ; class QString CalenSettings::trUtf8(char const *, char const *, int) - ?handleAlarmSnoozeTimeChange@CalenSettings@@QAEXH@Z @ 4 NONAME ; void CalenSettings::handleAlarmSnoozeTimeChange(int) - ?getStaticMetaObject@CalenSettings@@SAABUQMetaObject@@XZ @ 5 NONAME ; struct QMetaObject const & CalenSettings::getStaticMetaObject(void) - ?metaObject@CalenSettings@@UBEPBUQMetaObject@@XZ @ 6 NONAME ; struct QMetaObject const * CalenSettings::metaObject(void) const - ??_ECalenSettings@@UAE@I@Z @ 7 NONAME ; CalenSettings::~CalenSettings(unsigned int) - ??1CalenSettings@@UAE@XZ @ 8 NONAME ; CalenSettings::~CalenSettings(void) - ?qt_metacall@CalenSettings@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 9 NONAME ; int CalenSettings::qt_metacall(enum QMetaObject::Call, int, void * *) - ?handleRegionalInfoChange@CalenSettings@@QAEXXZ @ 10 NONAME ; void CalenSettings::handleRegionalInfoChange(void) - ?qt_metacast@CalenSettings@@UAEPAXPBD@Z @ 11 NONAME ; void * CalenSettings::qt_metacast(char const *) - ?staticMetaObject@CalenSettings@@2UQMetaObject@@B @ 12 NONAME ; struct QMetaObject const CalenSettings::staticMetaObject - ?handleWeekNumberChange@CalenSettings@@QAEXXZ @ 13 NONAME ; void CalenSettings::handleWeekNumberChange(void) - ?tr@CalenSettings@@SA?AVQString@@PBD0H@Z @ 14 NONAME ; class QString CalenSettings::tr(char const *, char const *, int) - ?populateSettingList@CalenSettings@@QAEXXZ @ 15 NONAME ; void CalenSettings::populateSettingList(void) - ?trUtf8@CalenSettings@@SA?AVQString@@PBD0@Z @ 16 NONAME ; class QString CalenSettings::trUtf8(char const *, char const *) - ??0CalenSettings@@QAE@PAVHbDataForm@@PAVQObject@@@Z @ 17 NONAME ; CalenSettings::CalenSettings(class HbDataForm *, class QObject *) - diff -r fd30d51f876b -r b6db4fd4947b calendarui/bwins/calenviewsu.def --- a/calendarui/bwins/calenviewsu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,147 +0,0 @@ -EXPORTS - ?scrollingFinished@CalenPreviewPane@@QAEXXZ @ 1 NONAME ; void CalenPreviewPane::scrollingFinished(void) - ?setDate@CalenMonthView@@AAEXXZ @ 2 NONAME ; void CalenMonthView::setDate(void) - ?handleGridItemActivated@CalenMonthView@@QAEXXZ @ 3 NONAME ; void CalenMonthView::handleGridItemActivated(void) - ?setFocusToProperDay@CalenMonthGrid@@AAEXXZ @ 4 NONAME ; void CalenMonthGrid::setFocusToProperDay(void) - ??1CalenPreviewPane@@UAE@XZ @ 5 NONAME ; CalenPreviewPane::~CalenPreviewPane(void) - ?mousePressEvent@CalenMonthGrid@@EAEXPAVQGraphicsSceneMouseEvent@@@Z @ 6 NONAME ; void CalenMonthGrid::mousePressEvent(class QGraphicsSceneMouseEvent *) - ?completePopulation@CalenMonthView@@AAEXXZ @ 7 NONAME ; void CalenMonthView::completePopulation(void) - ?handleChangeOrientation@CalenMonthView@@AAEXXZ @ 8 NONAME ; void CalenMonthView::handleChangeOrientation(void) - ?staticMetaObject@CalenSettingsView@@2UQMetaObject@@B @ 9 NONAME ; struct QMetaObject const CalenSettingsView::staticMetaObject - ?upGesture@CalenMonthGrid@@MAEXH@Z @ 10 NONAME ; void CalenMonthGrid::upGesture(int) - ?getStaticMetaObject@CalenSettingsView@@SAABUQMetaObject@@XZ @ 11 NONAME ; struct QMetaObject const & CalenSettingsView::getStaticMetaObject(void) - ?updateMonthDataArrayWithActiveDates@CalenMonthView@@AAEXXZ @ 12 NONAME ; void CalenMonthView::updateMonthDataArrayWithActiveDates(void) - ?scrollingFinished@CalenMonthGrid@@QAEXXZ @ 13 NONAME ; void CalenMonthGrid::scrollingFinished(void) - ?setCurrentIdex@CalenMonthGrid@@QAEXH@Z @ 14 NONAME ; void CalenMonthGrid::setCurrentIdex(int) - ??_ECalenMonthGrid@@UAE@I@Z @ 15 NONAME ; CalenMonthGrid::~CalenMonthGrid(unsigned int) - ?trUtf8@CalenPreviewPane@@SA?AVQString@@PBD0@Z @ 16 NONAME ; class QString CalenPreviewPane::trUtf8(char const *, char const *) - ?trUtf8@CalenMonthGrid@@SA?AVQString@@PBD0@Z @ 17 NONAME ; class QString CalenMonthGrid::trUtf8(char const *, char const *) - ?populatePrevMonth@CalenMonthView@@QAEXXZ @ 18 NONAME ; void CalenMonthView::populatePrevMonth(void) - ?qt_metacall@CalenSettingsView@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 19 NONAME ; int CalenSettingsView::qt_metacall(enum QMetaObject::Call, int, void * *) - ?handleLeftEffectCompleted@CalenMonthView@@AAEXABUEffectStatus@HbEffect@@@Z @ 20 NONAME ; void CalenMonthView::handleLeftEffectCompleted(struct HbEffect::EffectStatus const &) - ?getStaticMetaObject@CalenMonthGrid@@SAABUQMetaObject@@XZ @ 21 NONAME ; struct QMetaObject const & CalenMonthGrid::getStaticMetaObject(void) - ?trUtf8@CalenSettingsView@@SA?AVQString@@PBD0H@Z @ 22 NONAME ; class QString CalenSettingsView::trUtf8(char const *, char const *, int) - ?qt_metacast@CalenMonthView@@UAEPAXPBD@Z @ 23 NONAME ; void * CalenMonthView::qt_metacast(char const *) - ?staticMetaObject@CalenMonthView@@2UQMetaObject@@B @ 24 NONAME ; struct QMetaObject const CalenMonthView::staticMetaObject - ?setupView@CalenMonthView@@QAEXPAVCalenDocLoader@@@Z @ 25 NONAME ; void CalenMonthView::setupView(class CalenDocLoader *) - ?metaObject@CalenMonthGrid@@UBEPBUQMetaObject@@XZ @ 26 NONAME ; struct QMetaObject const * CalenMonthGrid::metaObject(void) const - ?startAutoScroll@CalenPreviewPane@@QAEXXZ @ 27 NONAME ; void CalenPreviewPane::startAutoScroll(void) - ?setView@CalenMonthGrid@@QAEXPAVCalenMonthView@@@Z @ 28 NONAME ; void CalenMonthGrid::setView(class CalenMonthView *) - ?HandleNotification@CalenDayView@@UAEXW4TCalenNotification@@@Z @ 29 NONAME ; void CalenDayView::HandleNotification(enum TCalenNotification) - ?panGesture@CalenMonthGrid@@MAEXABVQPointF@@@Z @ 30 NONAME ; void CalenMonthGrid::panGesture(class QPointF const &) - ?mousePressEvent@CalenPreviewPane@@UAEXPAVQGraphicsSceneMouseEvent@@@Z @ 31 NONAME ; void CalenPreviewPane::mousePressEvent(class QGraphicsSceneMouseEvent *) - ??1CalenSettingsView@@UAE@XZ @ 32 NONAME ; CalenSettingsView::~CalenSettingsView(void) - ?Date@CalenPreviewPane@@QAE?AVQDateTime@@XZ @ 33 NONAME ; class QDateTime CalenPreviewPane::Date(void) - ?tr@CalenPreviewPane@@SA?AVQString@@PBD0H@Z @ 34 NONAME ; class QString CalenPreviewPane::tr(char const *, char const *, int) - ?getInstanceList@CalenMonthView@@AAEXAAV?$QList@VAgendaEntry@@@@VQDateTime@@1@Z @ 35 NONAME ; void CalenMonthView::getInstanceList(class QList &, class QDateTime, class QDateTime) - ?metaObject@CalenMonthView@@UBEPBUQMetaObject@@XZ @ 36 NONAME ; struct QMetaObject const * CalenMonthView::metaObject(void) const - ??0CalenPreviewPane@@QAE@AAVMCalenServices@@PAVQGraphicsItem@@@Z @ 37 NONAME ; CalenPreviewPane::CalenPreviewPane(class MCalenServices &, class QGraphicsItem *) - ?mouseReleaseEvent@CalenPreviewPane@@UAEXPAVQGraphicsSceneMouseEvent@@@Z @ 38 NONAME ; void CalenPreviewPane::mouseReleaseEvent(class QGraphicsSceneMouseEvent *) - ?rowsInPrevMonth@CalenMonthView@@QAEHXZ @ 39 NONAME ; int CalenMonthView::rowsInPrevMonth(void) - ?metaObject@CalenPreviewPane@@UBEPBUQMetaObject@@XZ @ 40 NONAME ; struct QMetaObject const * CalenPreviewPane::metaObject(void) const - ??0CalenDayView@@QAE@AAVMCalenServices@@@Z @ 41 NONAME ; CalenDayView::CalenDayView(class MCalenServices &) - ?populateNextMonth@CalenMonthView@@QAEXXZ @ 42 NONAME ; void CalenMonthView::populateNextMonth(void) - ?handleRightEffectCompleted@CalenMonthView@@AAEXABUEffectStatus@HbEffect@@@Z @ 43 NONAME ; void CalenMonthView::handleRightEffectCompleted(struct HbEffect::EffectStatus const &) - ?qt_metacast@CalenMonthGrid@@UAEPAXPBD@Z @ 44 NONAME ; void * CalenMonthGrid::qt_metacast(char const *) - ?firstDayOfGrid@CalenMonthView@@QAE?AVQDateTime@@XZ @ 45 NONAME ; class QDateTime CalenMonthView::firstDayOfGrid(void) - ?rowsInFutMonth@CalenMonthView@@QAEHXZ @ 46 NONAME ; int CalenMonthView::rowsInFutMonth(void) - ?getCurrGridIndex@CalenMonthView@@QAEHXZ @ 47 NONAME ; int CalenMonthView::getCurrGridIndex(void) - ?launchDayView@CalenMonthView@@QAEXXZ @ 48 NONAME ; void CalenMonthView::launchDayView(void) - ??1CalenDayViewWidget@@UAE@XZ @ 49 NONAME ; CalenDayViewWidget::~CalenDayViewWidget(void) - ??0CalenDayViewWidget@@QAE@AAVMCalenServices@@PAVCalenDocLoader@@@Z @ 50 NONAME ; CalenDayViewWidget::CalenDayViewWidget(class MCalenServices &, class CalenDocLoader *) - ?prependRows@CalenMonthGrid@@QAEXXZ @ 51 NONAME ; void CalenMonthGrid::prependRows(void) - ?orientationChanged@CalenMonthGrid@@MAEXW4Orientation@Qt@@@Z @ 52 NONAME ; void CalenMonthGrid::orientationChanged(enum Qt::Orientation) - ?handleGridItemLongPressed@CalenMonthView@@QAEXHAAVQPointF@@@Z @ 53 NONAME ; void CalenMonthView::handleGridItemLongPressed(int, class QPointF &) - ?qt_metacall@CalenPreviewPane@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 54 NONAME ; int CalenPreviewPane::qt_metacall(enum QMetaObject::Call, int, void * *) - ?trUtf8@CalenPreviewPane@@SA?AVQString@@PBD0H@Z @ 55 NONAME ; class QString CalenPreviewPane::trUtf8(char const *, char const *, int) - ??1CalenThickLinesDrawer@@UAE@XZ @ 56 NONAME ; CalenThickLinesDrawer::~CalenThickLinesDrawer(void) - ?setView@CalenPreviewPane@@QAEXPAVCalenMonthView@@@Z @ 57 NONAME ; void CalenPreviewPane::setView(class CalenMonthView *) - ??_ECalenMonthView@@UAE@I@Z @ 58 NONAME ; CalenMonthView::~CalenMonthView(unsigned int) - ?changeOrientation@CalenMonthView@@UAEXW4Orientation@Qt@@@Z @ 59 NONAME ; void CalenMonthView::changeOrientation(enum Qt::Orientation) - ?populatePreviewPane@CalenMonthView@@QAEXAAVQDateTime@@@Z @ 60 NONAME ; void CalenMonthView::populatePreviewPane(class QDateTime &) - ??0CalenSettingsView@@QAE@AAVMCalenServices@@PAVQGraphicsItem@@@Z @ 61 NONAME ; CalenSettingsView::CalenSettingsView(class MCalenServices &, class QGraphicsItem *) - ?updateModelWithPrevMonth@CalenMonthView@@QAEXXZ @ 62 NONAME ; void CalenMonthView::updateModelWithPrevMonth(void) - ?stopScrolling@CalenPreviewPane@@QAEXXZ @ 63 NONAME ; void CalenPreviewPane::stopScrolling(void) - ?addBackgroundFrame@CalenMonthView@@AAEXXZ @ 64 NONAME ; void CalenMonthView::addBackgroundFrame(void) - ?createGrid@CalenMonthView@@AAEXXZ @ 65 NONAME ; void CalenMonthView::createGrid(void) - ?tr@CalenPreviewPane@@SA?AVQString@@PBD0@Z @ 66 NONAME ; class QString CalenPreviewPane::tr(char const *, char const *) - ?getStaticMetaObject@CalenPreviewPane@@SAABUQMetaObject@@XZ @ 67 NONAME ; struct QMetaObject const & CalenPreviewPane::getStaticMetaObject(void) - ?launchPreviousView@CalenSettingsView@@AAEXXZ @ 68 NONAME ; void CalenSettingsView::launchPreviousView(void) - ?setCurrGridIndex@CalenMonthView@@QAEXH@Z @ 69 NONAME ; void CalenMonthView::setCurrGridIndex(int) - ?setDateToLabel@CalenMonthView@@AAEXXZ @ 70 NONAME ; void CalenMonthView::setDateToLabel(void) - ?addWeekNumbers@CalenMonthView@@AAEXXZ @ 71 NONAME ; void CalenMonthView::addWeekNumbers(void) - ?qt_metacall@CalenThickLinesDrawer@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 72 NONAME ; int CalenThickLinesDrawer::qt_metacall(enum QMetaObject::Call, int, void * *) - ?setupView@CalenDayView@@QAEXPAVCalenDocLoader@@@Z @ 73 NONAME ; void CalenDayView::setupView(class CalenDocLoader *) - ??1CalenMonthView@@UAE@XZ @ 74 NONAME ; CalenMonthView::~CalenMonthView(void) - ?dateFromContext@CalenMonthView@@AAE?AVQDateTime@@ABVMCalenContext@@@Z @ 75 NONAME ; class QDateTime CalenMonthView::dateFromContext(class MCalenContext const &) - ?staticMetaObject@CalenMonthGrid@@2UQMetaObject@@B @ 76 NONAME ; struct QMetaObject const CalenMonthGrid::staticMetaObject - ?paint@CalenThickLinesDrawer@@EAEXPAVQPainter@@PBVQStyleOptionGraphicsItem@@PAVQWidget@@@Z @ 77 NONAME ; void CalenThickLinesDrawer::paint(class QPainter *, class QStyleOptionGraphicsItem const *, class QWidget *) - ?trUtf8@CalenMonthGrid@@SA?AVQString@@PBD0H@Z @ 78 NONAME ; class QString CalenMonthGrid::trUtf8(char const *, char const *, int) - ?initializeForm@CalenSettingsView@@QAEXXZ @ 79 NONAME ; void CalenSettingsView::initializeForm(void) - ?tr@CalenMonthGrid@@SA?AVQString@@PBD0H@Z @ 80 NONAME ; class QString CalenMonthGrid::tr(char const *, char const *, int) - ?goToToday@CalenMonthView@@AAEXXZ @ 81 NONAME ; void CalenMonthView::goToToday(void) - ?trUtf8@CalenThickLinesDrawer@@SA?AVQString@@PBD0H@Z @ 82 NONAME ; class QString CalenThickLinesDrawer::trUtf8(char const *, char const *, int) - ?qt_metacast@CalenPreviewPane@@UAEPAXPBD@Z @ 83 NONAME ; void * CalenPreviewPane::qt_metacast(char const *) - ?docLoader@CalenDayView@@QAEPAVCalenDocLoader@@XZ @ 84 NONAME ; class CalenDocLoader * CalenDayView::docLoader(void) - ?getCurrentIndex@CalenMonthGrid@@QAEHXZ @ 85 NONAME ; int CalenMonthGrid::getCurrentIndex(void) - ?removeWeekNumbers@CalenMonthView@@AAEXXZ @ 86 NONAME ; void CalenMonthView::removeWeekNumbers(void) - ?tr@CalenSettingsView@@SA?AVQString@@PBD0H@Z @ 87 NONAME ; class QString CalenSettingsView::tr(char const *, char const *, int) - ?trUtf8@CalenMonthView@@SA?AVQString@@PBD0H@Z @ 88 NONAME ; class QString CalenMonthView::trUtf8(char const *, char const *, int) - ??0CalenMonthView@@QAE@AAVMCalenServices@@@Z @ 89 NONAME ; CalenMonthView::CalenMonthView(class MCalenServices &) - ?getStaticMetaObject@CalenThickLinesDrawer@@SAABUQMetaObject@@XZ @ 90 NONAME ; struct QMetaObject const & CalenThickLinesDrawer::getStaticMetaObject(void) - ?setNoEntriesLabel@CalenPreviewPane@@QAEXPAVHbLabel@@@Z @ 91 NONAME ; void CalenPreviewPane::setNoEntriesLabel(class HbLabel *) - ??0CalenThickLinesDrawer@@QAE@W4WidgetType@CalendarNamespace@@PAVQGraphicsItem@@@Z @ 92 NONAME ; CalenThickLinesDrawer::CalenThickLinesDrawer(enum CalendarNamespace::WidgetType, class QGraphicsItem *) - ?onLocaleChanged@CalenMonthView@@UAEXH@Z @ 93 NONAME ; void CalenMonthView::onLocaleChanged(int) - ?doPopulation@CalenMonthView@@UAEXXZ @ 94 NONAME ; void CalenMonthView::doPopulation(void) - ?tr@CalenMonthView@@SA?AVQString@@PBD0H@Z @ 95 NONAME ; class QString CalenMonthView::tr(char const *, char const *, int) - ?GetInstanceListL@CalenPreviewPane@@AAEXXZ @ 96 NONAME ; void CalenPreviewPane::GetInstanceListL(void) - ?tr@CalenMonthView@@SA?AVQString@@PBD0@Z @ 97 NONAME ; class QString CalenMonthView::tr(char const *, char const *) - ??0CalenMonthGrid@@QAE@PAVQGraphicsItem@@@Z @ 98 NONAME ; CalenMonthGrid::CalenMonthGrid(class QGraphicsItem *) - ?refreshViewOnGoToDate@CalenMonthView@@EAEXXZ @ 99 NONAME ; void CalenMonthView::refreshViewOnGoToDate(void) - ?appendRows@CalenMonthGrid@@QAEXXZ @ 100 NONAME ; void CalenMonthGrid::appendRows(void) - ?tr@CalenThickLinesDrawer@@SA?AVQString@@PBD0H@Z @ 101 NONAME ; class QString CalenThickLinesDrawer::tr(char const *, char const *, int) - ?mouseReleaseEvent@CalenMonthGrid@@EAEXPAVQGraphicsSceneMouseEvent@@@Z @ 102 NONAME ; void CalenMonthGrid::mouseReleaseEvent(class QGraphicsSceneMouseEvent *) - ?getCurrentDay@CalenMonthView@@QAE?AVQDateTime@@XZ @ 103 NONAME ; class QDateTime CalenMonthView::getCurrentDay(void) - ?staticMetaObject@CalenPreviewPane@@2UQMetaObject@@B @ 104 NONAME ; struct QMetaObject const CalenPreviewPane::staticMetaObject - ?tr@CalenSettingsView@@SA?AVQString@@PBD0@Z @ 105 NONAME ; class QString CalenSettingsView::tr(char const *, char const *) - ?onTwoSecondsTimeout@CalenPreviewPane@@QAEXXZ @ 106 NONAME ; void CalenPreviewPane::onTwoSecondsTimeout(void) - ?timerExpired@CalenMonthGrid@@IAEXXZ @ 107 NONAME ; void CalenMonthGrid::timerExpired(void) - ?tr@CalenThickLinesDrawer@@SA?AVQString@@PBD0@Z @ 108 NONAME ; class QString CalenThickLinesDrawer::tr(char const *, char const *) - ?staticMetaObject@CalenThickLinesDrawer@@2UQMetaObject@@B @ 109 NONAME ; struct QMetaObject const CalenThickLinesDrawer::staticMetaObject - ?populateWithInstanceView@CalenMonthView@@AAEXXZ @ 110 NONAME ; void CalenMonthView::populateWithInstanceView(void) - ?trUtf8@CalenThickLinesDrawer@@SA?AVQString@@PBD0@Z @ 111 NONAME ; class QString CalenThickLinesDrawer::trUtf8(char const *, char const *) - ?downGesture@CalenMonthGrid@@MAEXH@Z @ 112 NONAME ; void CalenMonthGrid::downGesture(int) - ?populateLabel@CalenPreviewPane@@QAEXVQDateTime@@@Z @ 113 NONAME ; void CalenPreviewPane::populateLabel(class QDateTime) - ?doPopulation@CalenDayView@@UAEXXZ @ 114 NONAME ; void CalenDayView::doPopulation(void) - ??1CalenDayView@@UAE@XZ @ 115 NONAME ; CalenDayView::~CalenDayView(void) - ?updateModelWithFutureMonth@CalenMonthView@@QAEXXZ @ 116 NONAME ; void CalenMonthView::updateModelWithFutureMonth(void) - ?monthDataList@CalenMonthView@@QAE?AV?$QList@VCalenMonthData@@@@XZ @ 117 NONAME ; class QList CalenMonthView::monthDataList(void) - ?metaObject@CalenThickLinesDrawer@@UBEPBUQMetaObject@@XZ @ 118 NONAME ; struct QMetaObject const * CalenThickLinesDrawer::metaObject(void) const - ??1CalenMonthGrid@@UAE@XZ @ 119 NONAME ; CalenMonthGrid::~CalenMonthGrid(void) - ?updateWeekNumGridModel@CalenMonthView@@AAEXXZ @ 120 NONAME ; void CalenMonthView::updateWeekNumGridModel(void) - ?qt_metacast@CalenThickLinesDrawer@@UAEPAXPBD@Z @ 121 NONAME ; void * CalenThickLinesDrawer::qt_metacast(char const *) - ?prepareForPopulation@CalenMonthView@@AAEXXZ @ 122 NONAME ; void CalenMonthView::prepareForPopulation(void) - ?handlePreviewPaneGesture@CalenMonthView@@QAEX_N@Z @ 123 NONAME ; void CalenMonthView::handlePreviewPaneGesture(bool) - ?updateMonthGridModel@CalenMonthGrid@@QAEXAAV?$QList@VCalenMonthData@@@@H@Z @ 124 NONAME ; void CalenMonthGrid::updateMonthGridModel(class QList &, int) - ?setActiveDates@CalenMonthGrid@@AAEXVQDate@@@Z @ 125 NONAME ; void CalenMonthGrid::setActiveDates(class QDate) - ?trUtf8@CalenMonthView@@SA?AVQString@@PBD0@Z @ 126 NONAME ; class QString CalenMonthView::trUtf8(char const *, char const *) - ?setContextForActiveDay@CalenMonthView@@QAEXH@Z @ 127 NONAME ; void CalenMonthView::setContextForActiveDay(int) - ?trUtf8@CalenSettingsView@@SA?AVQString@@PBD0@Z @ 128 NONAME ; class QString CalenSettingsView::trUtf8(char const *, char const *) - ??_ECalenSettingsView@@UAE@I@Z @ 129 NONAME ; CalenSettingsView::~CalenSettingsView(unsigned int) - ??_ECalenThickLinesDrawer@@UAE@I@Z @ 130 NONAME ; CalenThickLinesDrawer::~CalenThickLinesDrawer(unsigned int) - ?metaObject@CalenSettingsView@@UBEPBUQMetaObject@@XZ @ 131 NONAME ; struct QMetaObject const * CalenSettingsView::metaObject(void) const - ?getStaticMetaObject@CalenMonthView@@SAABUQMetaObject@@XZ @ 132 NONAME ; struct QMetaObject const & CalenMonthView::getStaticMetaObject(void) - ?qt_metacast@CalenSettingsView@@UAEPAXPBD@Z @ 133 NONAME ; void * CalenSettingsView::qt_metacast(char const *) - ?tr@CalenMonthGrid@@SA?AVQString@@PBD0@Z @ 134 NONAME ; class QString CalenMonthGrid::tr(char const *, char const *) - ?qt_metacall@CalenMonthView@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 135 NONAME ; int CalenMonthView::qt_metacall(enum QMetaObject::Call, int, void * *) - ?setActiveDay@CalenMonthView@@AAEXVQDateTime@@@Z @ 136 NONAME ; void CalenMonthView::setActiveDay(class QDateTime) - ?itemActivated@CalenMonthGrid@@QAEXABVQModelIndex@@@Z @ 137 NONAME ; void CalenMonthGrid::itemActivated(class QModelIndex const &) - ?qt_metacall@CalenMonthGrid@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 138 NONAME ; int CalenMonthGrid::qt_metacall(enum QMetaObject::Call, int, void * *) - ??_ECalenPreviewPane@@UAE@I@Z @ 139 NONAME ; CalenPreviewPane::~CalenPreviewPane(unsigned int) - ?createEditor@CalenMonthView@@AAEXXZ @ 140 NONAME ; void CalenMonthView::createEditor(void) - ?getActiveDay@CalenMonthView@@QAE?AVQDateTime@@XZ @ 141 NONAME ; class QDateTime CalenMonthView::getActiveDay(void) - ?showHideRegionalInformation@CalenMonthView@@AAEXXZ @ 142 NONAME ; void CalenMonthView::showHideRegionalInformation(void) - ?paint@CalenMonthGrid@@EAEXPAVQPainter@@PBVQStyleOptionGraphicsItem@@PAVQWidget@@@Z @ 143 NONAME ; void CalenMonthGrid::paint(class QPainter *, class QStyleOptionGraphicsItem const *, class QWidget *) - ?mouseMoveEvent@CalenPreviewPane@@UAEXPAVQGraphicsSceneMouseEvent@@@Z @ 144 NONAME ; void CalenPreviewPane::mouseMoveEvent(class QGraphicsSceneMouseEvent *) - ?addRemoveActionsInMenu@CalenMonthView@@AAEXXZ @ 145 NONAME ; void CalenMonthView::addRemoveActionsInMenu(void) - diff -r fd30d51f876b -r b6db4fd4947b calendarui/calendarui.pro --- a/calendarui/calendarui.pro Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/calendarui.pro Mon Jun 28 15:22:02 2010 +0530 @@ -17,8 +17,19 @@ TEMPLATE = subdirs CONFIG += ordered -SUBDIRS += agendaeventviewer globaldata settings calenplugins customisationmanager \ - views controller application regionalplugins +SUBDIRS += commonutils \ + calenlauncher \ + caleneditor \ + agendaeventviewer \ + globaldata \ + settings \ + calenplugins \ + customisationmanager \ + views \ + controller \ + application \ + regionalplugins \ + calenviewerservice # End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/caleneditor/bwins/caleneditoru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/caleneditor/bwins/caleneditoru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,25 @@ +EXPORTS + ?metaObject@CalenEditor@@UBEPBUQMetaObject@@XZ @ 1 NONAME ; struct QMetaObject const * CalenEditor::metaObject(void) const + ?edit@CalenEditor@@QAEXVAgendaEntry@@_N@Z @ 2 NONAME ; void CalenEditor::edit(class AgendaEntry, bool) + ?edit@CalenEditor@@QAEXABVQFile@@_N@Z @ 3 NONAME ; void CalenEditor::edit(class QFile const &, bool) + ??_ECalenEditor@@UAE@I@Z @ 4 NONAME ; CalenEditor::~CalenEditor(unsigned int) + ?calendarLaunchFailed@CalenEditor@@IAEXH@Z @ 5 NONAME ; void CalenEditor::calendarLaunchFailed(int) + ?tr@CalenEditor@@SA?AVQString@@PBD0@Z @ 6 NONAME ; class QString CalenEditor::tr(char const *, char const *) + ?getStaticMetaObject@CalenEditor@@SAABUQMetaObject@@XZ @ 7 NONAME ; struct QMetaObject const & CalenEditor::getStaticMetaObject(void) + ?trUtf8@CalenEditor@@SA?AVQString@@PBD0@Z @ 8 NONAME ; class QString CalenEditor::trUtf8(char const *, char const *) + ?tr@CalenEditor@@SA?AVQString@@PBD0H@Z @ 9 NONAME ; class QString CalenEditor::tr(char const *, char const *, int) + ?entrySaved@CalenEditor@@IAEXXZ @ 10 NONAME ; void CalenEditor::entrySaved(void) + ?qt_metacast@CalenEditor@@UAEPAXPBD@Z @ 11 NONAME ; void * CalenEditor::qt_metacast(char const *) + ?create@CalenEditor@@QAEXVQDateTime@@_NW4CreateType@1@@Z @ 12 NONAME ; void CalenEditor::create(class QDateTime, bool, enum CalenEditor::CreateType) + ??0CalenEditor@@QAE@PAVQObject@@@Z @ 13 NONAME ; CalenEditor::CalenEditor(class QObject *) + ?d_func@CalenEditor@@ABEPBVCalenEditorPrivate@@XZ @ 14 NONAME ; class CalenEditorPrivate const * CalenEditor::d_func(void) const + ?trUtf8@CalenEditor@@SA?AVQString@@PBD0H@Z @ 15 NONAME ; class QString CalenEditor::trUtf8(char const *, char const *, int) + ?qt_metacall@CalenEditor@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 16 NONAME ; int CalenEditor::qt_metacall(enum QMetaObject::Call, int, void * *) + ??0CalenEditor@@QAE@PAVAgendaUtil@@PAVQObject@@@Z @ 17 NONAME ; CalenEditor::CalenEditor(class AgendaUtil *, class QObject *) + ??1CalenEditor@@UAE@XZ @ 18 NONAME ; CalenEditor::~CalenEditor(void) + ?staticMetaObject@CalenEditor@@2UQMetaObject@@B @ 19 NONAME ; struct QMetaObject const CalenEditor::staticMetaObject + ?edit@CalenEditor@@QAEXK_N@Z @ 20 NONAME ; void CalenEditor::edit(unsigned long, bool) + ?dialogClosed@CalenEditor@@IAEXXZ @ 21 NONAME ; void CalenEditor::dialogClosed(void) + ?d_func@CalenEditor@@AAEPAVCalenEditorPrivate@@XZ @ 22 NONAME ; class CalenEditorPrivate * CalenEditor::d_func(void) + ?create@CalenEditor@@QAEXVAgendaEntry@@_NW4CreateType@1@@Z @ 23 NONAME ; void CalenEditor::create(class AgendaEntry, bool, enum CalenEditor::CreateType) + diff -r fd30d51f876b -r b6db4fd4947b calendarui/caleneditor/caleneditor.pro --- a/calendarui/caleneditor/caleneditor.pro Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/caleneditor/caleneditor.pro Mon Jun 28 15:22:02 2010 +0530 @@ -44,22 +44,24 @@ } SOURCES += caleneditor.cpp \ - caleneditorcustomitem.cpp \ - caleneditor_p.cpp \ + caleneditorcustomitem.cpp \ + caleneditor_p.cpp \ caleneditordocloader.cpp \ caleneditorreminderfield.cpp \ caleneditorrepeatfield.cpp \ caleneditordatahandler.cpp - + HEADERS += caleneditor.h \ - caleneditorcustomitem.h \ - caleneditorcommon.h \ - caleneditordocloader.h \ - caleneditor_p.h \ - caleneditorreminderfield.h \ - caleneditorrepeatfield.h \ - caleneditordatahandler.h - -RESOURCES += caleneditor.qrc - + caleneditorcustomitem.h \ + caleneditorcommon.h \ + caleneditordocloader.h \ + caleneditor_p.h \ + caleneditorreminderfield.h \ + caleneditorrepeatfield.h \ + caleneditordatahandler.h + +RESOURCES += caleneditor.qrc + +TRANSLATIONS += caleneditor.ts + # End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/caleneditor/data/caleneditor.qrc --- a/calendarui/caleneditor/data/caleneditor.qrc Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/caleneditor/data/caleneditor.qrc Mon Jun 28 15:22:02 2010 +0530 @@ -3,7 +3,4 @@ caleneditorview.docml caleneditorlocationitem.docml - - caleneditor_en_GB.qm - diff -r fd30d51f876b -r b6db4fd4947b calendarui/caleneditor/data/caleneditor_en_GB.qm Binary file calendarui/caleneditor/data/caleneditor_en_GB.qm has changed diff -r fd30d51f876b -r b6db4fd4947b calendarui/caleneditor/data/caleneditorlocationitem.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/caleneditor/data/caleneditorlocationitem.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b calendarui/caleneditor/data/caleneditorview.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/caleneditor/data/caleneditorview.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b calendarui/caleneditor/eabi/caleneditoru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/caleneditor/eabi/caleneditoru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,24 @@ +EXPORTS + _ZN11CalenEditor10entrySavedEv @ 1 NONAME + _ZN11CalenEditor11qt_metacallEN11QMetaObject4CallEiPPv @ 2 NONAME + _ZN11CalenEditor11qt_metacastEPKc @ 3 NONAME + _ZN11CalenEditor12dialogClosedEv @ 4 NONAME + _ZN11CalenEditor16staticMetaObjectE @ 5 NONAME DATA 16 + _ZN11CalenEditor19getStaticMetaObjectEv @ 6 NONAME + _ZN11CalenEditor20calendarLaunchFailedEi @ 7 NONAME + _ZN11CalenEditor4editE11AgendaEntryb @ 8 NONAME + _ZN11CalenEditor4editERK5QFileb @ 9 NONAME + _ZN11CalenEditor4editEmb @ 10 NONAME + _ZN11CalenEditor6createE11AgendaEntrybNS_10CreateTypeE @ 11 NONAME + _ZN11CalenEditor6createE9QDateTimebNS_10CreateTypeE @ 12 NONAME + _ZN11CalenEditorC1EP10AgendaUtilP7QObject @ 13 NONAME + _ZN11CalenEditorC1EP7QObject @ 14 NONAME + _ZN11CalenEditorC2EP10AgendaUtilP7QObject @ 15 NONAME + _ZN11CalenEditorC2EP7QObject @ 16 NONAME + _ZN11CalenEditorD0Ev @ 17 NONAME + _ZN11CalenEditorD1Ev @ 18 NONAME + _ZN11CalenEditorD2Ev @ 19 NONAME + _ZNK11CalenEditor10metaObjectEv @ 20 NONAME + _ZTI11CalenEditor @ 21 NONAME + _ZTV11CalenEditor @ 22 NONAME + diff -r fd30d51f876b -r b6db4fd4947b calendarui/caleneditor/inc/caleneditor.h --- a/calendarui/caleneditor/inc/caleneditor.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/caleneditor/inc/caleneditor.h Mon Jun 28 15:22:02 2010 +0530 @@ -45,6 +45,7 @@ public: enum CreateType{ TypeAppointment = 0, + // TODO: Need to add more types TypeUnKnown = -1 }; diff -r fd30d51f876b -r b6db4fd4947b calendarui/caleneditor/inc/caleneditor_p.h --- a/calendarui/caleneditor/inc/caleneditor_p.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/caleneditor/inc/caleneditor_p.h Mon Jun 28 15:22:02 2010 +0530 @@ -20,6 +20,7 @@ // System includes #include +#include #include #include #include @@ -31,7 +32,6 @@ #include "caleneditorcommon.h" //forward declarations -class QTranslator; class QFile; class HbDataForm; class HbDataFormModel; @@ -42,6 +42,7 @@ class HbCheckBox; class HbComboBox; class HbView; +class HbTranslator; class MCalenServices; class AgendaEntry; class AgendaUtil; @@ -92,6 +93,7 @@ DateTimeToItem, LocationItem, ReminderItem, + ReminderTimeForAllDayItem, RepeatItem, RepeatUntilItem }; @@ -104,7 +106,14 @@ AgendaEntry* originalEntry(); bool isNewEntry(); HbDataFormModelItem* allDayCheckBoxItem(); - + bool isReminderTimeForAllDayAdded(); + bool isAllDayEvent(); + void updateReminderChoices(); + int currentIndexOfReminderField(); + void setCurrentIndexOfReminderField(int index); + void setReminderChoices(); + bool isEditRangeThisOnly(); + bool isAllDayFieldAdded(); private: void edit(const QFile &handle, bool launchCalendar); void edit(AgendaEntry entry, bool launchCalendar); @@ -113,6 +122,7 @@ bool launchCalendar); void create(CalenEditor::CreateType type, AgendaEntry entry, bool launchCalendar); + void openEditor(AgendaEntry entry); void showEditor(AgendaEntry entry); void showEditOccurencePopup(); void setUpView(); @@ -135,7 +145,6 @@ void populateRepeatItem(); void populateDescriptionItem(); void removeDescriptionItem(); - void closeEditor(); bool isChild() const ; @@ -144,7 +153,6 @@ void deleteEntry(bool close = false); bool handleAllDayToSave(); void enableFromTotimeFileds(bool, QDateTime, QDateTime); - int showDeleteConfirmationQuery(); private slots: void handleSubjectChange(const QString subject); @@ -152,8 +160,11 @@ void saveFromDateTime(QDateTime& fromDateTime); void saveToDateTime(QDateTime& toDateTime); void handleLocationChange(const QString location); + void handleLocationChange(const QString location, + const double geoLatitude, const double geoLongitude); void handleDescriptionChange(const QString description); void saveAndCloseEditor(); + void showDeleteConfirmationQuery(bool closeEditor = false); void handleDeleteAction(); void launchSettingsView(); void discardChanges(); @@ -161,6 +172,9 @@ void handleEditOccurence(int index); void handleCancel(); void handleCalendarLaunchError(int error); + void closeEditor(); + void handleLocationEditingFinished(); + void selectEditingFinishedAction(HbAction* action); private: enum EditRange { @@ -170,7 +184,7 @@ }; CalenEditor *q_ptr; - AgendaUtil *mAgendaUtil; + QPointer mAgendaUtil; CalenEditorDocLoader *mEditorDocLoader; HbView *mEditorView; @@ -191,14 +205,15 @@ EditRange mEditRange; QDateTime mNewEntryDateTime; - + + AgendaEntry mEntry; AgendaEntry *mOriginalEntry; AgendaEntry *mEditedEntry; HbAction *mSoftKeyAction; HbAction *mDescriptionAction; HbMainWindow *mMainWindow; - QTranslator *mTranslator; + HbTranslator *mTranslator; bool mNewEntry; bool mDescriptionItemAdded; diff -r fd30d51f876b -r b6db4fd4947b calendarui/caleneditor/inc/caleneditorcommon.h --- a/calendarui/caleneditor/inc/caleneditorcommon.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/caleneditor/inc/caleneditorcommon.h Mon Jun 28 15:22:02 2010 +0530 @@ -35,7 +35,8 @@ CustomWidgetFrom = HbDataFormModelItem::CustomItemBase + 1, CustomWidgetTo, CustomWidgetLocation, - RepeatUntilOffset + RepeatUntilOffset, + ReminderTimeOffset }; #endif /* CALENEDITORCOMMON_H_ */ diff -r fd30d51f876b -r b6db4fd4947b calendarui/caleneditor/inc/caleneditorcustomitem.h --- a/calendarui/caleneditor/inc/caleneditorcustomitem.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/caleneditor/inc/caleneditorcustomitem.h Mon Jun 28 15:22:02 2010 +0530 @@ -39,6 +39,7 @@ ~CalenEditorCustomItem(); virtual HbAbstractViewItem* createItem(); void enableFromTimeFieldAndSetTime(bool, QDateTime); + void disableFromToDateField(); void enableToTimeFieldAndSetTime(bool, QDateTime); void populateDateTime(QDateTime defaultDateTime, bool isFromItem); void populateLocation( QString location); @@ -47,6 +48,7 @@ void enableDateButton(bool value); bool canSetModelIndex(const QModelIndex &index) const; void restore(); + QDateTime getDateTime(); protected: virtual HbWidget* createCustomWidget(); @@ -61,11 +63,13 @@ void saveDate(); void handleLocationTextChange(QString location); void launchLocationPicker(); + void handleEditingFinished(); Q_SIGNALS: void dateTimeUpdated(QDateTime& fromDateTime); void locationTextChanged(QString location); - + void locationTextChanged(QString location, double latitude, double longitude); + void locationEditingFinished(); private: AgendaEntry *mEditedEntry; QDate mDate; @@ -78,6 +82,7 @@ HbPushButton* mPushButtonTime; HbPushButton* mPushButtonDate; HbPushButton *mRepeatUntilWidget; + HbPushButton *mReminderTimeWidget; HbDateTimePicker *mDatePicker; HbDateTimePicker *mTimePicker; diff -r fd30d51f876b -r b6db4fd4947b calendarui/caleneditor/inc/caleneditorreminderfield.h --- a/calendarui/caleneditor/inc/caleneditorreminderfield.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/caleneditor/inc/caleneditorreminderfield.h Mon Jun 28 15:22:02 2010 +0530 @@ -30,6 +30,7 @@ class HbDataFormModelItem; class HbDataForm; class HbDataFormModelItem; +class HbDateTimePicker; class CalenEditorDataHandler; class CalenEditorReminderField : public QObject @@ -43,20 +44,37 @@ virtual ~CalenEditorReminderField(); public: + void setReminderChoices(); void addItemToModel(); void removeItemFromModel(); void populateReminderItem(bool newEntry); QModelIndex modelIndex(); - + void setReminderOff(); + void setDefaultAlarmForAllDay(); + void updateReminderChoicesForAllDay(QDate repeatUntilDate); + void insertReminderTimeField(); + void setDisplayTime(); + void removeReminderTimeField(); + bool isReminderFieldEnabled(); + int reminderItemsCount(); + int currentReminderIndex(); + void setCurrentIndex(int index); + void disableReminderTimeField(); + bool isReminderTimeForAllDayAdded(); private slots: void handleReminderIndexChanged(int index); - + void launchReminderTimePicker(); + void setReminderTimeForAllDay(); private: CalenEditorPrivate* mCalenEditor; HbDataForm* mEditorForm; HbDataFormModel* mCalenEditorModel; HbDataFormModelItem* mReminderItem; + HbDataFormModelItem *mCustomReminderTimeItem; + HbDateTimePicker *mTimePicker; + QTime mReminderTimeForAllDay; QHash mReminderHash; + bool mReminderTimeAdded; }; #endif // CALENEDITORREMINDERFIELD_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/caleneditor/inc/caleneditorrepeatfield.h --- a/calendarui/caleneditor/inc/caleneditorrepeatfield.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/caleneditor/inc/caleneditorrepeatfield.h Mon Jun 28 15:22:02 2010 +0530 @@ -53,6 +53,7 @@ void updateRepeatChoices(); void saveRepeatRule(); bool isRepeatUntilItemAdded(); + QDate repeatUntilDate(); private: void insertRepeatUntilItem(); diff -r fd30d51f876b -r b6db4fd4947b calendarui/caleneditor/src/caleneditor.cpp --- a/calendarui/caleneditor/src/caleneditor.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/caleneditor/src/caleneditor.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -81,6 +81,9 @@ */ void CalenEditor::edit(AgendaEntry entry, bool launchCalendar) { + if(entry.isNull()) { + return; + } d_ptr->edit(entry, launchCalendar); } @@ -118,6 +121,9 @@ void CalenEditor::create(AgendaEntry entry, bool launchCalendar, CalenEditor::CreateType type) { + if(entry.isNull()) { + return; + } d_ptr->create(type, entry, launchCalendar); } diff -r fd30d51f876b -r b6db4fd4947b calendarui/caleneditor/src/caleneditor_p.cpp --- a/calendarui/caleneditor/src/caleneditor_p.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/caleneditor/src/caleneditor_p.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -19,8 +19,8 @@ #include #include #include -#include -#include +#include + #include #include #include @@ -41,11 +41,10 @@ #include #include #include -#include #include -#include #include #include +#include // User includes #include @@ -210,6 +209,7 @@ mEditRange(ThisAndAll), mOriginalEntry(NULL), mEditedEntry(NULL), + mTranslator(new HbTranslator("caleneditor")), mNewEntry(true), mDescriptionItemAdded(false), mIsChild(false), @@ -220,6 +220,7 @@ // First get the q-pointer. q_ptr = static_cast (parent); mMainWindow = NULL; + mTranslator->loadCommon(); if (!agendaUtil) { mAgendaUtil = new AgendaUtil(this); @@ -228,15 +229,6 @@ mAgendaUtil = agendaUtil; mOwnsAgendaUtil = false; } - - // Load the translation file and install the editor specific translator - mTranslator = new QTranslator; - QString lang = QLocale::system().name(); - QString path = "Z:/resource/qt/translations/"; - mTranslator->load("caleneditor_en_GB", ":/translations"); - // TODO: Load the appropriate .qm file based on locale - //bool loaded = mTranslator->load("caleneditor_" + lang, path); - HbApplication::instance()->installTranslator(mTranslator); } /*! @@ -244,6 +236,10 @@ */ CalenEditorPrivate::~CalenEditorPrivate() { + if(mOwnsAgendaUtil) { + delete mAgendaUtil; + mAgendaUtil = NULL; + } if (mOriginalEntry) { delete mOriginalEntry; mOriginalEntry = NULL; @@ -252,12 +248,27 @@ delete mEditedEntry; mEditedEntry = NULL; } + if(mEditorDocLoader) { + delete mEditorDocLoader; + mEditorDocLoader = NULL; + } + if(mReminderField) { + delete mReminderField; + mReminderField = NULL; + } + if(mRepeatField) { + delete mRepeatField; + mRepeatField = NULL; + } + if(mDataHandler) { + delete mDataHandler; + mDataHandler = NULL; + } if (mCalenEditorModel) { delete mCalenEditorModel; mCalenEditorModel = NULL; } // Remove the translator - HbApplication::instance()->removeTranslator(mTranslator); if (mTranslator) { delete mTranslator; mTranslator = 0; @@ -290,7 +301,7 @@ { mNewEntry = false; mLaunchCalendar = launchCalendar; - showEditor(entry); + openEditor(entry); } /*! @@ -301,6 +312,9 @@ { mNewEntry = false; AgendaEntry entry = mAgendaUtil->fetchById(id); + if(entry.isNull()) { + return; + } edit(entry, launchCalendar); } @@ -321,12 +335,14 @@ entry.setType(AgendaEntry::TypeAppoinment); } break; - case CalenEditor::TypeUnKnown: default: + // What ever be the type of entry, currently editor supports only to + // open the entries of TypeAppoinment + entry.setType(AgendaEntry::TypeAppoinment); break; } mLaunchCalendar = launchCalendar; - showEditor(entry); + openEditor(entry); } /*! @@ -344,13 +360,15 @@ entry.setType(AgendaEntry::TypeAppoinment); } break; - case CalenEditor::TypeUnKnown: default: + // What ever be the type of entry, currently editor supports only to + // open the entries of TypeAppoinment + entry.setType(AgendaEntry::TypeAppoinment); break; } mNewEntryDateTime = entry.startTime(); mLaunchCalendar = launchCalendar; - showEditor(entry); + openEditor(entry); } /*! @@ -358,10 +376,11 @@ */ void CalenEditorPrivate::showEditOccurencePopup() { - HbDialog popUp; - popUp.setDismissPolicy(HbDialog::NoDismiss); - popUp.setTimeout(HbDialog::NoTimeout); - + HbDialog *popUp = new HbDialog(); + popUp->setDismissPolicy(HbDialog::NoDismiss); + popUp->setTimeout(HbDialog::NoTimeout); + popUp->setAttribute( Qt::WA_DeleteOnClose, true ); + QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical); HbWidget *editWidget = new HbWidget(); editWidget->setLayout(layout); @@ -376,22 +395,20 @@ layout->addItem(editButtonList); - popUp.setContentWidget(editWidget); - popUp.setHeadingWidget(new HbLabel(hbTrId("txt_calendar_title_edit"))); + popUp->setContentWidget(editWidget); + popUp->setHeadingWidget(new HbLabel(hbTrId("txt_calendar_title_edit"))); - // Create secondary action + // Create cancel action HbAction *cancelAction = new HbAction(hbTrId("txt_calendar_button_softkey1_cancel")); - popUp.setSecondaryAction(cancelAction); + popUp->addAction(cancelAction); + connect(editButtonList, SIGNAL(itemSelected(int)), popUp, SLOT(close())); connect(editButtonList, SIGNAL(itemSelected(int)), this, SLOT(handleEditOccurence(int))); - connect(editButtonList, SIGNAL(itemSelected(int)), &popUp, SLOT(close())); - - connect(cancelAction, SIGNAL(triggered()), &popUp, SLOT(close())); connect(cancelAction, SIGNAL(triggered()), this, SLOT(handleCancel())); // Show the popup - popUp.exec(); + popUp->open(); } /*! @@ -409,6 +426,13 @@ mEditRange = ThisAndAll; break; } + // If user has selected to edit all the occurences, + // then get the parent of it + AgendaEntry entryToBeEdited = mEntry; + if (mEditRange == ThisAndAll) { + entryToBeEdited = mAgendaUtil->parentEntry(mEntry); + } + showEditor(entryToBeEdited); } /*! @@ -418,6 +442,36 @@ { // User has chosen not to edit the event, hence return mEditRange = UserCancelled; + // Do cleanup and return + emit q_ptr->dialogClosed(); + return; +} + +/*! + Opens the editor. + */ +void CalenEditorPrivate::openEditor(AgendaEntry entry) +{ + if (0 < entry.id()) { + mNewEntry = false; + } + if (!mNewEntry) { + // Before we do anything, check in the entry is repeating + // OR its a child item + mIsChild = !(entry.recurrenceId().isNull()); + bool isRepeating = entry.isRepeating(); + // For later reference + mEntry = entry; + if (mIsChild || isRepeating) { + // Query user if he wants to edit whole series + // or just this occurence + showEditOccurencePopup(); + return; + }else { + mEditRange = ThisAndAll; + } + } + showEditor(entry); } /*! @@ -425,52 +479,23 @@ */ void CalenEditorPrivate::showEditor(AgendaEntry entry) { - - if (0 < entry.id()) { - mNewEntry = false; - } - - AgendaEntry entryToBeEdited = entry; - if (!mNewEntry) { - // Before we do anything, check in the entry is repeating - // OR its a child item - mIsChild = !(entry.recurrenceId().isNull()); - bool isRepeating = entry.isRepeating(); - if (mIsChild || isRepeating) { - // Query user if he wants to edit whole series - // or just this occurence - showEditOccurencePopup(); - // If user has selected to edit all the occurences, - // then get the parent of it - if (mEditRange == ThisAndAll) { - entryToBeEdited = mAgendaUtil->parentEntry(entry); - } else if (mEditRange == UserCancelled) { - // Do cleanup and return - emit q_ptr->dialogClosed(); - return; - } - } else { - mEditRange = ThisAndAll; - } - } - - mOriginalEntry = new AgendaEntry(entryToBeEdited); - mEditedEntry = new AgendaEntry(entryToBeEdited); + mOriginalEntry = new AgendaEntry(entry); + mEditedEntry = new AgendaEntry(entry); if (!mEditedEntry->description().isEmpty()) { mDescriptionItemAdded = true; } // Construct the view using docloader setUpView(); - + // Set the title text. mEditorView->setTitle(hbTrId("txt_calendar_title_calendar")); - mSoftKeyAction = new HbAction(Hb::BackAction); + mSoftKeyAction = new HbAction(Hb::BackNaviAction); mEditorView->setNavigationAction(mSoftKeyAction); connect(mSoftKeyAction, SIGNAL(triggered()), this, SLOT(saveAndCloseEditor())); - + // Create the data handler mDataHandler = new CalenEditorDataHandler(this,mEditedEntry, mOriginalEntry); } @@ -513,12 +538,21 @@ HbAction *deleteEventAction = qobject_cast ( mEditorDocLoader->findObject( CALEN_EDITOR_DELETE_EVENT_ACTION)); + deleteEventAction->setText(hbTrId("txt_common_menu_delete")); connect(deleteEventAction, SIGNAL(triggered()), this, - SLOT(handleDeleteAction())); + SLOT(showDeleteConfirmationQuery())); if (!mNewEntry) { - //TODO: Add the text id based on the entry type Anniversary or meeting - headingWidget->setHeading(hbTrId("txt_calendar_subhead_event")); + AgendaEntry::Type entryType = mEditedEntry->type(); + if( entryType == AgendaEntry::TypeAppoinment) { + headingWidget->setHeading(hbTrId("txt_calendar_subhead_meeting")); + }else if(entryType == AgendaEntry::TypeEvent) { + //TODO: Add the text id once available + headingWidget->setHeading(hbTrId("All-day event")); + }else if (entryType == AgendaEntry::TypeTodo) { + headingWidget->setHeading(hbTrId("txt_calendar_subhead_to_do")); + } + } initModel(); @@ -582,14 +616,9 @@ // Add all day check box for new entry creation or while editing // parent entry or existing non repeating event - if (mNewEntry) { + if (mNewEntry || (mEditRange == ThisAndAll)) { addAllDayCheckBoxItem(); - } else { - if (!mEditedEntry->isRepeating() || (mEditRange == ThisAndAll)) { - addAllDayCheckBoxItem(); - } } - addCustomItemFrom(); addCustomItemTo(); addCustomItemLocation(); @@ -598,7 +627,6 @@ if (mEditRange == ThisAndAll) { addRepeatItem(); } - mCalenEditorForm->setModel(mCalenEditorModel); } @@ -793,7 +821,7 @@ QDateTime endTime = mEditedEntry-> startTime().addSecs(durationInSeconds); - // set this to the original entr as well as edited entry + // set this to the original entry as well as edited entry mOriginalEntry->setStartAndEndTime(mOriginalEntry->startTime(), endTime); mEditedEntry->setStartAndEndTime(mEditedEntry->startTime(), endTime); @@ -854,11 +882,32 @@ mAgendaUtil->getNextInstanceTimes(*mEditedEntry, nextInstanceStartTime, nextInstanceEndTime); + + // If no instances earlier then set it to 01/01/1900. + if (prevInstanceStartTime.isNull()) { + prevInstanceStartTime.setDate(QDate(1900, 01, 01)); + prevInstanceStartTime.setTime(QTime(0, 0, 0)); + } + + // If no instances later then set it to 30/01/2100. + if (nextInstanceEndTime.isNull()) { + nextInstanceEndTime.setDate(QDate(2100, 12, 30)); + nextInstanceEndTime.setTime(QTime(0, 0, 0)); + } mViewFromItem->setDateRange( prevInstanceStartTime.addDays(1).date(), nextInstanceStartTime.addDays(-1).date()); mViewToItem->setDateRange(prevInstanceEndTime.date().addDays(1), nextInstanceEndTime.date().addDays(-1)); + + // If repeating daily then disable the date fields as + // date cannot be changed + if ((prevInstanceEndTime.date().daysTo( + mEditedEntry->startTime().date()) == 1) && + (mEditedEntry->endTime().date().daysTo( + nextInstanceStartTime.date()) == 1)) { + mViewFromItem->disableFromToDateField(); + } } } else { toDateTime = fromDateTime.addSecs(60 * 60); @@ -871,13 +920,19 @@ if (mNewEntry) { mOriginalEntry->setStartAndEndTime(fromDateTime, toDateTime); } - if (mAllDayCheckBoxItem - && (mAllDayCheckBoxItem->contentWidgetData("checkState") - == Qt::Checked)) { + if ((mAllDayCheckBoxItem && + (mAllDayCheckBoxItem->contentWidgetData("checkState") == Qt::Checked)) + || (!mNewEntry && mEditedEntry->type() == AgendaEntry::TypeEvent)) { + + // For all-day, we need to substratc 1 minute to get the actual end time + // as we store all-day as 12.00AM to 12.00 AM next day + QDateTime actualEndTime = mEditedEntry->endTime().addSecs(-60); + mViewToItem->populateDateTime(actualEndTime, false); + // If the all day option is checked, we need to // disable the time fields enableFromTotimeFileds(false, mEditedEntry->startTime(), - mEditedEntry->endTime()); + actualEndTime); } } /*! @@ -898,12 +953,19 @@ } QModelIndex index = mCalenEditorModel->index(itemIndex, 0); mViewLocationItem = qobject_cast - (mCalenEditorForm->dataFormViewItem(index)); - + (mCalenEditorForm->itemByIndex(index)); + connect(mViewLocationItem, SIGNAL(locationTextChanged(const QString)), this, SLOT(handleLocationChange(const QString))); - - mViewLocationItem->populateLocation(mEditedEntry->location()); + + connect(mViewLocationItem, SIGNAL(locationTextChanged(const QString, const double, const double)), + this, SLOT(handleLocationChange(const QString, const double, const double))); + + mViewLocationItem->populateLocation(mEditedEntry->location()); + + connect(mViewLocationItem, SIGNAL(locationEditingFinished()), + this, SLOT(handleLocationEditingFinished())); + } /*! Save the changed start time of the event. @@ -935,6 +997,49 @@ // update the repeat choices depending on the meeting duration mRepeatField->updateRepeatChoices(); } + + updateReminderChoices(); +} + +void CalenEditorPrivate::updateReminderChoices() +{ + QDate referenceDate; + + // Start date or repeat until date will be the reference to decide + // whether the event is in past or future. + if (mRepeatField && mRepeatField->isRepeatUntilItemAdded()) { + referenceDate = mRepeatField->repeatUntilDate(); + } else { + referenceDate = mEditedEntry->startTime().date(); + } + + // Check if all day event or not. + if (isAllDayEvent()) { + int currentIndex = mReminderField->currentReminderIndex(); + mReminderField->updateReminderChoicesForAllDay(referenceDate); + int numberOfReminderChoices = mReminderField->reminderItemsCount(); + if (currentIndex >= numberOfReminderChoices) { + currentIndex = 0; + mReminderField->disableReminderTimeField(); + } + mReminderField->setCurrentIndex(currentIndex); + if(currentIndex == 0 && mReminderField->isReminderTimeForAllDayAdded()) { + mReminderField->removeReminderTimeField(); + } + } else { + if ((referenceDate < QDate::currentDate()) + || (referenceDate == QDate::currentDate() + && (mEditedEntry->startTime().time() < QTime::currentTime()))) + { + mReminderField->setReminderOff(); + } else { + // Enabled implies future. If changing from future to future do not + // do anything. + if (!mReminderField->isReminderFieldEnabled()) { + mReminderField->setReminderChoices(); + } + } + } } /*! @@ -943,17 +1048,21 @@ void CalenEditorPrivate::saveToDateTime(QDateTime& toDateTime) { QDateTime startTime = mEditedEntry->startTime(); + bool fromDateChanged = false; // Update the start time accordingly on UI - duration will be 60 mins // bydefault for new entry and if it crosses the starttime if (mNewEntry && toDateTime < startTime) { startTime = toDateTime.addSecs(-3600); - } else { // for exisitng entry + fromDateChanged = true; + } else { + // for exisitng entry // we need to see if user has moved end time before the start time // then substract the duration of the meeting that was saved earlier to // the new end time to get the new start time if (toDateTime < startTime) { int duration = mEditedEntry->durationInSecs(); startTime = toDateTime.addSecs(-duration); + fromDateChanged = true; } } // Set the new start time to the form @@ -968,6 +1077,11 @@ // update the repeat choices depending on the meeting duration mRepeatField->updateRepeatChoices(); } + + // Update reminder choices if start time got changed. + if (fromDateChanged) { + updateReminderChoices(); + } } /*! @@ -977,11 +1091,14 @@ { // Check if all day has been added or not // and calculate the index accordingly + // all day added implies reminder time field is also added int index; - if (mIsAllDayItemAdded) { + if (mIsAllDayItemAdded && !isReminderTimeForAllDayAdded()) { + index = RepeatItem - 1; + } else if (!mNewEntry && isReminderTimeForAllDayAdded()) { index = RepeatItem; } else { - index = RepeatItem - 1; + index = RepeatItem - 2; } mRepeatField->populateRepeatItem(index); @@ -1072,7 +1189,9 @@ void CalenEditorPrivate::handleSubjectChange(const QString subject) { mEditedEntry->setSummary(subject); - addDiscardAction(); + if(!mNewEntry ){ + addDiscardAction(); + } } /*! @@ -1096,15 +1215,49 @@ tempEndTime.setTime(tempEndQTime); enableFromTotimeFileds(false, tempSartTime, tempEndTime); + QDate referenceDate; + if (mRepeatField->isRepeatUntilItemAdded()) { + referenceDate = mRepeatField->repeatUntilDate(); + } else { + referenceDate = mEditedEntry->startTime().date(); + } + mReminderField->updateReminderChoicesForAllDay(referenceDate); + // If the reminder field is enabled and it is not off + // it implies default alarm day and time is being displayed. + if (mReminderField->isReminderFieldEnabled() && + mReminderField->currentReminderIndex() != 0) { + // Set the default alarm for all day. + mReminderField->setDefaultAlarmForAllDay(); + } else { + // Remove reminder time field. + mReminderField->removeReminderTimeField(); + } } else { // AllDayCheckBox in un-checked // Set From/To times buttons editable // Update Start/End Times with Edited entry values enableFromTotimeFileds(true, mEditedEntry->startTime(), mEditedEntry->endTime()); - + // If original entry was an All-day, then we need to save the date that + // is shown on the "To" date push button + if (mOriginalEntry->type() == AgendaEntry::TypeEvent) { + mEditedEntry->setStartAndEndTime(mViewFromItem->getDateTime(), + mViewToItem->getDateTime()); + } + int index; + if (mIsAllDayItemAdded) { + index = ReminderTimeForAllDayItem; + } else { + index = ReminderTimeForAllDayItem - 1; + } + mReminderField->removeReminderTimeField(); + mReminderField->setReminderChoices(); + updateReminderChoices(); } - addDiscardAction(); + + if(!mNewEntry){ + addDiscardAction(); + } } /*! @@ -1114,9 +1267,75 @@ void CalenEditorPrivate::handleLocationChange(const QString location) { mEditedEntry->setLocation(location); + if(!mNewEntry){ + addDiscardAction(); + } +} + + +/*! + Triggered when the location editor is being edited. + \param subject Contains the string displayed in the subject item. + */ +void CalenEditorPrivate::handleLocationChange(const QString location, + const double /*geoLatitude*/, const double /*geoLongitude*/) +{ + mEditedEntry->setLocation(location); + mEditedEntry->clearGeoValue(); addDiscardAction(); } +/*! + * Handles the completion of location editing + */ +void CalenEditorPrivate::handleLocationEditingFinished() +{ + if ( !mOriginalEntry->location().isEmpty() ) + { + AgendaGeoValue entryGeoValue =mAgendaUtil->fetchById(mEditedEntry->id()).geoValue(); + if ( !entryGeoValue.isNull() && (mEditedEntry->location()!=mOriginalEntry->location()) ) + { + + mEditedEntry->setGeoValue(entryGeoValue); + HbMessageBox* confirmationQuery = new HbMessageBox(HbMessageBox::MessageTypeQuestion); + + confirmationQuery->setDismissPolicy(HbDialog::NoDismiss); + confirmationQuery->setTimeout(HbDialog::NoTimeout); + confirmationQuery->setIconVisible(true); + + QString displayText; + displayText = displayText.append("Location changed. Keep existing location on Map?"); + + confirmationQuery->setText(displayText); + + // Remove the default actions. + QList defaultActions = confirmationQuery->actions(); + for (int index=0;indexremoveAction(defaultActions[index]); + } + + defaultActions.clear(); + + confirmationQuery->addAction(new HbAction("Yes")); + confirmationQuery->addAction(new HbAction("No")); + confirmationQuery->open(this, SLOT(selectEditingFinishedAction(HbAction*))); + } + } +} + +/*! + * Handles the editing finished action. + */ +void CalenEditorPrivate::selectEditingFinishedAction(HbAction* action) +{ + HbMessageBox* dlg = static_cast(sender()); + + if (action == dlg->actions().at(1)) + { + mEditedEntry->clearGeoValue(); + } +} /*! Triggered when the description editor is being edited. @@ -1125,7 +1344,9 @@ void CalenEditorPrivate::handleDescriptionChange(const QString description) { mEditedEntry->setDescription(description); - addDiscardAction(); + if(!mNewEntry){ + addDiscardAction(); + } } /*! @@ -1135,14 +1356,16 @@ void CalenEditorPrivate::saveAndCloseEditor() { Action action = handleDone(); - closeEditor(); + if (CalenEditorPrivate::ActionDelete != action) { + closeEditor(); + } if (CalenEditorPrivate::ActionSave == action) { // check if we need to launch the calendar application if (mLaunchCalendar) { CalenLauncher* launcher = new CalenLauncher(this); QDateTime startTime = mEditedEntry->startTime(); - launcher->launchCalendarApp(CalenLauncher::DayView, startTime); + launcher->launchCalendarApp(CalenLauncher::AgendaView, startTime); // connect to the error signal connect(launcher, SIGNAL(calendarLaunchFailed(int)), this, @@ -1165,17 +1388,14 @@ */ void CalenEditorPrivate::handleDeleteAction() { - + // If its a new entry just close the editor if (mNewEntry) { - if (showDeleteConfirmationQuery()) { - closeEditor(); - } + closeEditor(); return; + }else { + // Delete entry and close editor + deleteEntry(true); } - - // Delete entry and close editor - deleteEntry(true); - } /*! @@ -1198,14 +1418,12 @@ /*! * Show delete confirmation query */ -int CalenEditorPrivate::showDeleteConfirmationQuery() +void CalenEditorPrivate::showDeleteConfirmationQuery(bool closeEditor) { - int retStatus = 0; - - HbMessageBox popup(HbMessageBox::MessageTypeQuestion); - popup.setDismissPolicy(HbDialog::NoDismiss); - popup.setTimeout(HbDialog::NoTimeout); - popup.setIconVisible(true); + HbMessageBox *popup = new HbMessageBox(HbMessageBox::MessageTypeQuestion); + popup->setDismissPolicy(HbDialog::NoDismiss); + popup->setTimeout(HbDialog::NoTimeout); + popup->setAttribute( Qt::WA_DeleteOnClose, true ); QString text = 0; @@ -1225,18 +1443,27 @@ } } - popup.setText(text); - - popup.setPrimaryAction(new HbAction(hbTrId("txt_calendar_button_delete"), - &popup)); - popup.setSecondaryAction(new HbAction(hbTrId("txt_calendar_button_cancel"), - &popup)); - HbAction *selected = popup.exec(); - if (selected == popup.primaryAction()) { - retStatus = 1; + popup->setText(text); + + QList list = popup->actions(); + for(int i=0; i < list.count(); i++) + { + popup->removeAction(list[i]); + } + HbAction *deleteAction = new HbAction(hbTrId("txt_calendar_button_delete"), + popup); + popup->addAction(deleteAction); + connect(deleteAction, SIGNAL(triggered()), this, + SLOT(handleDeleteAction())); + HbAction *cancelAction = new HbAction(hbTrId("txt_calendar_button_cancel"), + popup); + // Editor should not be closed for all the cases when cancel is pressed + if(closeEditor) { + connect(cancelAction, SIGNAL(triggered()), this, + SLOT(closeEditor())); } - - return retStatus; + popup->addAction(cancelAction); + popup->open(); } /*! @@ -1273,7 +1500,7 @@ } return CalenEditorPrivate::ActionNothing; case CalenEditorPrivate::ActionDelete: - deleteEntry(); + showDeleteConfirmationQuery(true); return CalenEditorPrivate::ActionDelete; case CalenEditorPrivate::ActionNothing: return CalenEditorPrivate::ActionNothing; @@ -1293,8 +1520,12 @@ if (mIsChild && (mEditRange == ThisOnly)) { // Add the entry mAgendaUtil->updateEntry(*mEditedEntry, true); - // TODO: Add the text id based on meeting or anniversary - HbNotificationDialog::launchDialog(hbTrId("Event updated")); + // TODO: Add the text id once available + if(mEditedEntry->type() == AgendaEntry::TypeAppoinment) { + HbNotificationDialog::launchDialog(hbTrId("Meeting updated")); + }else if(mEditedEntry->type() == AgendaEntry::TypeEvent) { + HbNotificationDialog::launchDialog(hbTrId("All day event updated")); + } emit q_ptr->entrySaved(); return true; } else if ((mEditRange == ThisOnly)) { @@ -1309,22 +1540,31 @@ if (!handleAllDayToSave()) { if (mNewEntry) { mAgendaUtil->addEntry(*mEditedEntry); - } else if (mEditRange == ThisAndAll) { + } else if (mEditRange == ThisAndAll && mOriginalEntry->isRepeating()) { mAgendaUtil->storeRepeatingEntry(*mEditedEntry, true); } else if (!mIsChild && (mEditRange == ThisOnly)) { // Create the new exception - mAgendaUtil->createException(*mEditedEntry); + mAgendaUtil->createException(*mEditedEntry, + mOriginalEntry->startTime()); } else { // Normal entry updation mAgendaUtil->updateEntry(*mEditedEntry, false); } } if (mNewEntry) { - // TODO: Add the text id based on meeting or anniversary - HbNotificationDialog::launchDialog(hbTrId("New Event saved")); + // TODO: Add the text id once available + if(mEditedEntry->type() == AgendaEntry::TypeAppoinment) { + HbNotificationDialog::launchDialog(hbTrId("New meeting saved")); + } else if(mEditedEntry->type() == AgendaEntry::TypeEvent) { + HbNotificationDialog::launchDialog(hbTrId("New all-day saved")); + } } else { - // TODO: Add the text id based on meeting or anniversary - HbNotificationDialog::launchDialog(hbTrId("Event updated")); + // TODO: Add the text id once available + if(mEditedEntry->type() == AgendaEntry::TypeAppoinment) { + HbNotificationDialog::launchDialog(hbTrId("Meeting updated")); + } else if(mEditedEntry->type() == AgendaEntry::TypeEvent) { + HbNotificationDialog::launchDialog(hbTrId("All day event updated")); + } } emit q_ptr->entrySaved(); } else if (error) { @@ -1341,26 +1581,22 @@ */ void CalenEditorPrivate::deleteEntry(bool close) { - // if editor is launched from Notes then don't delete entry // Just exit from calendar editor if (mOriginalEntry->id() > 0) { - // If user is editing single instanc then delete single instance // else delete entry - if (showDeleteConfirmationQuery()) { - if (mEditRange == ThisOnly) { - // User wants to delete only this occurence - mAgendaUtil->deleteRepeatedEntry(*mOriginalEntry, - AgendaUtil::ThisOnly); - } else { - // Delete the entry. - mAgendaUtil->deleteEntry(mOriginalEntry->id()); - } + if (mEditRange == ThisOnly) { + // User wants to delete only this occurence + mAgendaUtil->deleteRepeatedEntry(*mOriginalEntry, + AgendaUtil::ThisOnly); + } else { + // Delete the entry. + mAgendaUtil->deleteEntry(mOriginalEntry->id()); + } - if (close) { - closeEditor(); - } + if (close) { + closeEditor(); } } } @@ -1382,10 +1618,10 @@ QDateTime tempSartTime = CalenDateUtils::beginningOfDay(mEditedEntry->startTime()); - // Set EndTime of AllDay event to 23:59:59 - QDateTime tempEndTime = mEditedEntry->endTime(); + // Set EndTime of AllDay event to 00:00:00 of next day + QDateTime tempEndTime = mEditedEntry->endTime().addDays(1); QTime tempEndQTime = tempEndTime.time(); - tempEndQTime.setHMS(23, 59, 59); + tempEndQTime.setHMS(0, 0, 0); tempEndTime.setTime(tempEndQTime); if (mNewEntry && (mAllDayCheckBoxItem->contentWidgetData("checkState") @@ -1403,19 +1639,43 @@ // Clone the entry to AllDayEntry, Delete old entry from Database mAgendaUtil->cloneEntry(*mEditedEntry, AgendaEntry::TypeEvent); - mAgendaUtil->deleteEntry(mEditedEntry->id()); - + // For later reference for the notification popup + mEditedEntry->setType(AgendaEntry::TypeEvent); return true; - } else if ((mAllDayCheckBoxItem->contentWidgetData("checkState") - != Qt::Checked) && (mEditedEntry->type() - != AgendaEntry::TypeAppoinment)) { - // Editing exissting AllDayentry, and Alldat Box is Not-Checked - // Clone the entry to MeetingEntry, Delete old entry from Database - mAgendaUtil->cloneEntry(*mEditedEntry, AgendaEntry::TypeAppoinment); - mAgendaUtil->deleteEntry(mEditedEntry->id()); - - return true; - } + } else if (mAllDayCheckBoxItem->contentWidgetData("checkState") + != Qt::Checked) { + if (mEditedEntry->type() != AgendaEntry::TypeAppoinment) { + // Editing existing AllDayentry, and Alldat Box is Not-Checked + // Clone the entry to MeetingEntry, Delete old entry from Database + mAgendaUtil->cloneEntry(*mEditedEntry, AgendaEntry::TypeAppoinment); + // For later reference for the notification popup + mEditedEntry->setType(AgendaEntry::TypeAppoinment); + return true; + } + // Check if the duration of the meeting is matching the all-day criteria + // if yes, then we need to store it as all-day instead of normal meeting + else if (mEditedEntry->startTime() == CalenDateUtils::beginningOfDay(mEditedEntry->startTime())) { + // Get the end time and see if it is at the beginning of the end date day + if (mEditedEntry->endTime() == CalenDateUtils::beginningOfDay(mEditedEntry->endTime())) { + // Store it as all-day + mEditedEntry->setType(AgendaEntry::TypeEvent); + // Check if this was an all-day earlier and now user has changed it like that + // or it is a new entry + if (mOriginalEntry->type() == AgendaEntry::TypeEvent || + mNewEntry) { + return false; + } else { + // It was a meeting + // Clone the entry to AllDayEntry, Delete old entry from Database + mEditedEntry->setStartAndEndTime(tempSartTime, tempEndTime); + mAgendaUtil->cloneEntry(*mEditedEntry, AgendaEntry::TypeEvent); + // For later reference for the notification popup + mEditedEntry->setType(AgendaEntry::TypeEvent); + return true; + } + } + } + } return false; } @@ -1462,4 +1722,74 @@ { return mAllDayCheckBoxItem; } + +/*! + Checks if all day item is added and if selected implies reminder time is added. + When editing single occurence irrespective of type of the event + the all day item is not shown. + Used to calculate the index of other items which are dependant on this. + */ +bool CalenEditorPrivate::isReminderTimeForAllDayAdded() +{ + return mReminderField->isReminderTimeForAllDayAdded(); +} + +/*! + Checks if it is an all day event or not. + */ +bool CalenEditorPrivate::isAllDayEvent() +{ + if (mAllDayCheckBoxItem) { + return (mAllDayCheckBoxItem->contentWidgetData("checkState") + == Qt::Checked)? true:false; + } else if (!mNewEntry && mEditedEntry->type() == AgendaEntry::TypeEvent) { + // If editing single occurence then all day item not shown but still it + // is an all day event.. + return true;; + } else { + return false; + } +} + +/*! + Returns the current index of the reminder field. + */ +int CalenEditorPrivate::currentIndexOfReminderField() +{ + return mReminderField->currentReminderIndex(); +} + +/*! + Sets the index. + /param index indicates the index value to be set. + */ +void CalenEditorPrivate::setCurrentIndexOfReminderField(int index) +{ + mReminderField->setCurrentIndex(index); +} + +/*! + Sets the reminder choices for a non all day event. + */ +void CalenEditorPrivate::setReminderChoices() +{ + mReminderField->setReminderChoices(); +} + +/*! + Checks if editing all occurences or a single occurence. + */ +bool CalenEditorPrivate::isEditRangeThisOnly() +{ + return (mEditRange == ThisOnly); +} + +/*! + Checks if all day field is added. + */ +bool CalenEditorPrivate::isAllDayFieldAdded() +{ + return mIsAllDayItemAdded; +} + // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/caleneditor/src/caleneditorcustomitem.cpp --- a/calendarui/caleneditor/src/caleneditorcustomitem.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/caleneditor/src/caleneditorcustomitem.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -55,7 +55,13 @@ \param parent The parent object. */ CalenEditorCustomItem::CalenEditorCustomItem(QGraphicsItem *parent) -:HbDataFormViewItem(parent) +:HbDataFormViewItem(parent), + mPushButtonTime(NULL), + mPushButtonDate(NULL), + mRepeatUntilWidget(NULL), + mReminderTimeWidget(NULL), + mDatePicker(NULL), + mTimePicker(NULL) { mMinDate = CalenDateUtils::minTime().date(); mMaxDate = CalenDateUtils::maxTime().date(); @@ -113,7 +119,8 @@ case CustomWidgetTo: { HbWidget *widgetBottom = new HbWidget(); - QGraphicsLinearLayout *layoutBottom = new QGraphicsLinearLayout(Qt::Horizontal); + QGraphicsLinearLayout *layoutBottom = + new QGraphicsLinearLayout(Qt::Horizontal); widgetBottom->setLayout(layoutBottom); mPushButtonTime = new HbPushButton(this); @@ -133,20 +140,31 @@ CalenEditorDocLoader editorLocationDocLoader; bool loadSuccess = false; - editorLocationDocLoader.load(CALEN_EDITOR_LOCATION_XML_FILE, &loadSuccess); + editorLocationDocLoader.load(CALEN_EDITOR_LOCATION_XML_FILE, + &loadSuccess); Q_ASSERT_X(loadSuccess, "caleneditor.cpp", - "Unable to load caleneditor location view XML"); - HbWidget* widgetLocation = qobject_cast (editorLocationDocLoader.findWidget(CALEN_EDITOR_LOCATION)); - - mLocationLineEdit = qobject_cast( editorLocationDocLoader.findWidget(CALEN_EDITOR_LOCATION_LINEEDIT)); + "Unable to load caleneditor location view XML"); + HbWidget* widgetLocation = qobject_cast ( + editorLocationDocLoader.findWidget(CALEN_EDITOR_LOCATION)); + + mLocationLineEdit = qobject_cast( + editorLocationDocLoader.findWidget( + CALEN_EDITOR_LOCATION_LINEEDIT)); mLocationLineEdit->setMinRows(1); mLocationLineEdit->setMaxRows(4); - mLocationPushButton = qobject_cast(editorLocationDocLoader.findWidget(CALEN_EDITOR_LOCATION_PUSHBUTTON)); + mLocationPushButton = qobject_cast( + editorLocationDocLoader.findWidget( + CALEN_EDITOR_LOCATION_PUSHBUTTON)); mLocationPushButton->setIcon( HbIcon("qtg_mono_location")); - connect(mLocationPushButton, SIGNAL(clicked()), this, SLOT(launchLocationPicker())); + connect(mLocationPushButton, SIGNAL(clicked()), this, + SLOT(launchLocationPicker())); connect(mLocationLineEdit, SIGNAL(textChanged(const QString)), - this, SLOT(handleLocationTextChange(const QString))); + this, SLOT(handleLocationTextChange(const QString))); + + connect(mLocationLineEdit, SIGNAL(editingFinished()), + this, SLOT(handleEditingFinished())); + return widgetLocation; } @@ -156,7 +174,12 @@ return mRepeatUntilWidget; } - + case ReminderTimeOffset: + { + mReminderTimeWidget = new HbPushButton(this); + return mReminderTimeWidget; + } + default: return 0; } @@ -200,10 +223,14 @@ locationString.append(','); } locationString.append(selectedLocation.mCountry); - emit locationTextChanged(locationString); + emit locationTextChanged(locationString, selectedLocation.mLatitude, selectedLocation.mLongitude); mLocationLineEdit->setText(locationString ); } } + +/*! + Populates the date and time in proper formats on the buttons + */ void CalenEditorCustomItem::populateDateTime(QDateTime defaultDateTime, bool isFromItem) { // Store the date and time to be shown @@ -213,17 +240,22 @@ mIsFromItem = isFromItem; mPushButtonDate->setText(mLocale.format(defaultDateTime.date(), - r_qtn_date_usual_with_zero)); + r_qtn_date_usual_with_zero)); mPushButtonTime->setText(mLocale.format(defaultDateTime.time(), - r_qtn_time_usual_with_zero)); + r_qtn_time_usual_with_zero)); } +/*! + Sets the location on the button + */ void CalenEditorCustomItem::populateLocation(QString location ) { mLocationLineEdit->setText( location ); - } +/*! + Sets the date range + */ void CalenEditorCustomItem::setDateRange(QDate start, QDate end) { mMaxDate = end; @@ -236,82 +268,112 @@ } } +/*! + Sets the time range + */ void CalenEditorCustomItem::setTimeRange(QTime start, QTime end) { mMaxTime = start; mMinTime = end; } +/*! + Enables the date button + */ void CalenEditorCustomItem::enableDateButton(bool value) { mPushButtonDate->setEnabled(value); } - +/*! + Handles the location change + */ void CalenEditorCustomItem::handleLocationTextChange(QString location) { emit locationTextChanged(location); } +/*! + Handles the location editing finished + */ +void CalenEditorCustomItem::handleEditingFinished() +{ + emit locationEditingFinished(); +} - +/*! + Launches the date picker + */ void CalenEditorCustomItem::handleDate() { - // Create a date picker - mDatePicker = new HbDateTimePicker(mDate, this); - mDatePicker->setMinimumDate(mMinDate); - mDatePicker->setMaximumDate(mMaxDate); - // Create a popup with datepicker for the user to select date. - HbDialog popUp; - popUp.setDismissPolicy(HbDialog::NoDismiss); - popUp.setTimeout(HbDialog::NoTimeout); + HbDialog *popUp = new HbDialog(); + popUp->setDismissPolicy(HbDialog::NoDismiss); + popUp->setTimeout(HbDialog::NoTimeout); + popUp->setAttribute( Qt::WA_DeleteOnClose, true ); // Set the proper heading if (mIsFromItem) { - popUp.setHeadingWidget(new HbLabel(hbTrId("txt_calendar_title_start_date"))); - }else { - popUp.setHeadingWidget(new HbLabel(hbTrId("txt_calendar_title_end_date"))); - } - - popUp.setContentWidget(mDatePicker); - HbAction *okAction = new HbAction(hbTrId("txt_common_button_ok")); - popUp.setPrimaryAction(okAction); + popUp->setHeadingWidget( + new HbLabel(hbTrId("txt_calendar_title_start_date"))); + }else { + popUp->setHeadingWidget( + new HbLabel(hbTrId("txt_calendar_title_end_date"))); + } + // Create a date picker + if(mDatePicker) { + mDatePicker = NULL; + } + mDatePicker = new HbDateTimePicker(mDate, popUp); + mDatePicker->setMinimumDate(mMinDate); + mDatePicker->setMaximumDate(mMaxDate); + mDatePicker->setDate(mDate); + popUp->setContentWidget(mDatePicker); + HbAction *okAction = new HbAction(hbTrId("txt_common_button_ok"), popUp); + popUp->addAction(okAction); connect(okAction, SIGNAL(triggered()), this, SLOT(saveDate())); - connect(okAction, SIGNAL(triggered()), &popUp, SLOT(close())); - popUp.setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"))); - popUp.exec(); + popUp->addAction(new HbAction(hbTrId("txt_common_button_cancel"), popUp)); + popUp->open(); } +/*! + Launches the time picker + */ void CalenEditorCustomItem::handleTime() { + // Create a popup with time picker for the user to select time. + HbDialog *popUp = new HbDialog(); + popUp->setDismissPolicy(HbDialog::NoDismiss); + popUp->setTimeout(HbDialog::NoTimeout); + popUp->setAttribute( Qt::WA_DeleteOnClose, true ); + + // Set the proper heading + if (mIsFromItem) { + popUp->setHeadingWidget( + new HbLabel(hbTrId("txt_calendar_title_start_time"))); + }else { + popUp->setHeadingWidget( + new HbLabel(hbTrId("txt_calendar_title_end_time"))); + } // Create a time picker. - mTimePicker = new HbDateTimePicker(mTime, this); + if(mTimePicker) { + mTimePicker = NULL; + } + mTimePicker = new HbDateTimePicker(mTime, popUp); + if(mLocale.timeStyle() == HbExtendedLocale::Time12) { mTimePicker->setDisplayFormat("hh:mm ap"); }else { mTimePicker->setDisplayFormat("hh:mm"); } mTimePicker->setTime(mTime); - // Create a popup with time picker for the user to select time. - HbDialog popUp; - popUp.setDismissPolicy(HbDialog::NoDismiss); - popUp.setTimeout(HbDialog::NoTimeout); - - // Set the proper heading - if (mIsFromItem) { - popUp.setHeadingWidget(new HbLabel(hbTrId("txt_calendar_title_start_time"))); - }else { - popUp.setHeadingWidget(new HbLabel(hbTrId("txt_calendar_title_end_time"))); - } - - popUp.setContentWidget(mTimePicker); - HbAction *okAction = new HbAction(hbTrId("txt_common_button_ok")); - popUp.setPrimaryAction(okAction); + popUp->setContentWidget(mTimePicker); + + HbAction *okAction = new HbAction(hbTrId("txt_common_button_ok"), popUp); + popUp->addAction(okAction); connect(okAction, SIGNAL(triggered()), this, SLOT(saveTime())); - connect(okAction, SIGNAL(triggered()), &popUp, SLOT(close())); - popUp.setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"), &popUp)); - popUp.exec(); + popUp->addAction(new HbAction(hbTrId("txt_common_button_cancel"), popUp)); + popUp->open(); } /*! @@ -353,6 +415,18 @@ // Set FromTime in Editor mPushButtonTime->setText(mLocale.format(fromDateTime.time(),r_qtn_time_usual_with_zero)); + + // Store the time + mTime = fromDateTime.time(); +} + +/*! + Disable Date field. + */ +void CalenEditorCustomItem::disableFromToDateField() +{ + // disable the date field. + mPushButtonDate->setEnabled(false); } /*! @@ -364,7 +438,11 @@ mPushButtonTime->setEnabled(enableTimeFiles); // Set ToTime in Editor - mPushButtonTime->setText(mLocale.format(toDateTime.time(),r_qtn_time_usual_with_zero)); + mPushButtonTime->setText(mLocale.format( + toDateTime.time(),r_qtn_time_usual_with_zero)); + + // Store the time + mTime = toDateTime.time(); } /*! @@ -377,7 +455,7 @@ index.data(HbDataFormModelItem::ItemTypeRole).toInt()); if(itemType == CustomWidgetFrom || itemType == CustomWidgetTo || itemType == RepeatUntilOffset - || itemType == CustomWidgetLocation ) { + || itemType == CustomWidgetLocation || itemType == ReminderTimeOffset ) { return true; } else { return false; @@ -400,9 +478,20 @@ mRepeatUntilWidget->setText(modelItem->contentWidgetData("text").toString()); } break; + + case ReminderTimeOffset: + { + mReminderTimeWidget->setText(modelItem->contentWidgetData("text").toString()); + } + break; } } +QDateTime CalenEditorCustomItem::getDateTime() +{ + return QDateTime(mDate, mTime); +} + Q_IMPLEMENT_USER_METATYPE(QLocationPickerItem) // End of file --Don't remove this. 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. diff -r fd30d51f876b -r b6db4fd4947b calendarui/caleneditor/src/caleneditorrepeatfield.cpp --- a/calendarui/caleneditor/src/caleneditorrepeatfield.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/caleneditor/src/caleneditorrepeatfield.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -18,6 +18,7 @@ // System Includes +#include #include #include #include @@ -32,6 +33,9 @@ #include "caleneditorrepeatfield.h" #include "caleneditorcustomitem.h" +// Constants +const int userRole = Qt::UserRole + 100; + /*! \class CalenEditorRepeatField */ @@ -70,8 +74,7 @@ QStringList repeatChoices; repeatChoices << hbTrId("txt_calendar_setlabel_repeat_val_only_once") << hbTrId("txt_calendar_setlabel_repeat_val_daily") - // TODO : add text ID for workdays - << hbTrId("Workdays") + << 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") @@ -125,16 +128,16 @@ // Set the user roles for the combobox items so that we depend on these // roles to identify the correct repeat type when repeat choices are // dynamically removed or added - mRepeatComboBox->setItemData(RepeatOnce, RepeatOnce, Qt::UserRole+100); - mRepeatComboBox->setItemData(RepeatDaily, RepeatDaily, Qt::UserRole+100); + mRepeatComboBox->setItemData(RepeatOnce, RepeatOnce, userRole); + mRepeatComboBox->setItemData(RepeatDaily, RepeatDaily, userRole); mRepeatComboBox->setItemData(RepeatWorkdays, - RepeatWorkdays, Qt::UserRole+100); - mRepeatComboBox->setItemData(RepeatWeekly, RepeatWeekly, Qt::UserRole+100); + RepeatWorkdays, userRole); + mRepeatComboBox->setItemData(RepeatWeekly, RepeatWeekly, userRole); mRepeatComboBox->setItemData(RepeatBiWeekly, - RepeatBiWeekly, Qt::UserRole+100); + RepeatBiWeekly, userRole); mRepeatComboBox->setItemData(RepeatMonthly, - RepeatMonthly, Qt::UserRole+100); - mRepeatComboBox->setItemData(RepeatYearly, RepeatYearly, Qt::UserRole+100); + RepeatMonthly, userRole); + mRepeatComboBox->setItemData(RepeatYearly, RepeatYearly, userRole); if (mCalenEditor->editedEntry()->isRepeating()) { switch (mCalenEditor->editedEntry()->repeatRule().type()) { @@ -178,11 +181,11 @@ AgendaRepeatRule( AgendaRepeatRule::InvalidRule)); } - 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))); } /*! @@ -196,9 +199,9 @@ mIsWorkdays = false; HbExtendedLocale locale = HbExtendedLocale::system(); - // Get the user role w ehave set for this index - QVariant userRole = mRepeatComboBox->itemData(index, Qt::UserRole + 100); - int value = userRole.toInt(); + // Get the user role we have set for this index + QVariant role = mRepeatComboBox->itemData(index, userRole); + int value = role.toInt(); switch (value) { case 1: { if (!mRepeatUntilItemAdded) { @@ -295,7 +298,10 @@ } break; } - mCalenEditor->addDiscardAction(); + if(!mCalenEditor->isNewEntry()) { + mCalenEditor->addDiscardAction(); + } + mCalenEditor->updateReminderChoices(); } /*! @@ -314,10 +320,13 @@ { HbDataFormModelItem::DataItemType itemType = static_cast (RepeatUntilOffset); - - QModelIndex repeatIndex = mCalenEditorModel->indexFromItem(mRepeatItem); + + int index = CalenEditorPrivate::RepeatUntilItem; + if (!mCalenEditor->isReminderTimeForAllDayAdded()) { + index -= 1; + } mCustomRepeatUntilItem = mCalenEditorModel->insertDataFormItem( - CalenEditorPrivate::RepeatUntilItem, + index, itemType, QString( hbTrId( @@ -351,12 +360,19 @@ */ void CalenEditorRepeatField::launchRepeatUntilDatePicker() { + HbDialog *popUp = new HbDialog(); + popUp->setDismissPolicy(HbDialog::NoDismiss); + popUp->setTimeout(HbDialog::NoTimeout); + popUp->setHeadingWidget( new HbLabel( + hbTrId("txt_calendar_title_repeat_until"))); + popUp->setAttribute( Qt::WA_DeleteOnClose, true ); + if (mDatePicker) { mDatePicker = NULL; } if (mRepeatRuleType == AgendaRepeatRule::DailyRule) { QDate minDate = mCalenEditor->editedEntry()->endTime().date().addDays(1); - mDatePicker = new HbDateTimePicker(mRepeatUntilDate); + mDatePicker = new HbDateTimePicker(mRepeatUntilDate, popUp); mDatePicker->setMinimumDate(minDate); mDatePicker->setMaximumDate(QDate(31, 12, 2100)); mDatePicker->setDate(mRepeatUntilDate); @@ -367,36 +383,30 @@ } else { minDate = mCalenEditor->editedEntry()->endTime().date().addDays(14); } - mDatePicker = new HbDateTimePicker(mRepeatUntilDate); + mDatePicker = new HbDateTimePicker(mRepeatUntilDate, popUp); mDatePicker->setMinimumDate(minDate); mDatePicker->setMaximumDate(QDate(31, 12, 2100)); mDatePicker->setDate(mRepeatUntilDate); } else if (mRepeatRuleType == AgendaRepeatRule::MonthlyRule) { QDate minDate = mCalenEditor->editedEntry()->endTime().date().addMonths(1); - mDatePicker = new HbDateTimePicker(mRepeatUntilDate); + mDatePicker = new HbDateTimePicker(mRepeatUntilDate, popUp); mDatePicker->setMinimumDate(minDate); mDatePicker->setMaximumDate(QDate(31, 12, 2100)); mDatePicker->setDate(mRepeatUntilDate); } else if (mRepeatRuleType == AgendaRepeatRule::YearlyRule) { QDate minDate = mCalenEditor->editedEntry()->endTime().date().addYears(1); - mDatePicker = new HbDateTimePicker(mRepeatUntilDate); + mDatePicker = new HbDateTimePicker(mRepeatUntilDate, popUp); mDatePicker->setMinimumDate(minDate); mDatePicker->setMaximumDate(QDate(31, 12, 2100)); mDatePicker->setDate(mRepeatUntilDate); } - HbDialog popUp; - popUp.setDismissPolicy(HbDialog::NoDismiss); - popUp.setTimeout(HbDialog::NoTimeout); - popUp.setContentWidget(mDatePicker); - popUp.setHeadingWidget( new HbLabel( - hbTrId("txt_calendar_title_repeat_until"))); + popUp->setContentWidget(mDatePicker); + HbAction *okAction = new HbAction(hbTrId("txt_common_button_ok")); - popUp.setPrimaryAction(okAction); + popUp->addAction(okAction); connect(okAction, SIGNAL(triggered()), this, SLOT(setRepeatUntilDate())); - connect(okAction, SIGNAL(triggered()), &popUp, SLOT(close())); - popUp.setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"), - &popUp)); - popUp.exec(); + popUp->addAction(new HbAction(hbTrId("txt_common_button_cancel"), popUp)); + popUp->open(); } /*! @@ -411,6 +421,15 @@ r_qtn_date_usual_with_zero); mCustomRepeatUntilItem->setContentWidgetData("text", dateString); } + mCalenEditor->updateReminderChoices(); +} + +/*! + Returns the repeatuntildate displayed. + */ +QDate CalenEditorRepeatField::repeatUntilDate() +{ + return mRepeatUntilDate; } /*! @@ -418,6 +437,9 @@ */ void CalenEditorRepeatField::updateRepeatChoices() { + if (!mRepeatComboBox) { + return; + } // 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 @@ -428,8 +450,7 @@ QStringList repeatChoices; repeatChoices << hbTrId("txt_calendar_setlabel_repeat_val_only_once") << hbTrId("txt_calendar_setlabel_repeat_val_daily") - // TODO : add text ID for workdays - << hbTrId("Workdays") + << 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") @@ -438,19 +459,19 @@ // Set the user roles for the combobox items so that we depend on these // roles to identify the correct repeat type when repeat choices are // dynamically removed or added - mRepeatComboBox->setItemData(RepeatOnce, RepeatOnce, Qt::UserRole + 100); + mRepeatComboBox->setItemData(RepeatOnce, RepeatOnce, userRole); mRepeatComboBox->setItemData(RepeatDaily, RepeatDaily, - Qt::UserRole + 100); + userRole); mRepeatComboBox->setItemData(RepeatWorkdays, - RepeatWorkdays, Qt::UserRole+100); + RepeatWorkdays, userRole); mRepeatComboBox->setItemData(RepeatWeekly, RepeatWeekly, - Qt::UserRole + 100); + userRole); mRepeatComboBox->setItemData(RepeatBiWeekly, RepeatBiWeekly, - Qt::UserRole + 100); + userRole); mRepeatComboBox->setItemData(RepeatMonthly, RepeatMonthly, - Qt::UserRole + 100); + userRole); mRepeatComboBox->setItemData(RepeatYearly, RepeatYearly, - Qt::UserRole + 100); + userRole); int totalCount = mRepeatComboBox->count(); @@ -526,7 +547,6 @@ } // Set the previous user's choice mRepeatComboBox->setCurrentIndex(choice); - handleRepeatIndexChanged(choice); } /*! diff -r fd30d51f876b -r b6db4fd4947b calendarui/calenlauncher/bwins/calenlauncheru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/calenlauncher/bwins/calenlauncheru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,17 @@ +EXPORTS + ?staticMetaObject@CalenLauncher@@2UQMetaObject@@B @ 1 NONAME ; struct QMetaObject const CalenLauncher::staticMetaObject + ?launchCalendarApp@CalenLauncher@@QAEXW4CalenView@1@AAVQDateTime@@_N@Z @ 2 NONAME ; void CalenLauncher::launchCalendarApp(enum CalenLauncher::CalenView, class QDateTime &, bool) + ?calendarLaunchFailed@CalenLauncher@@IAEXH@Z @ 3 NONAME ; void CalenLauncher::calendarLaunchFailed(int) + ??1CalenLauncher@@UAE@XZ @ 4 NONAME ; CalenLauncher::~CalenLauncher(void) + ??_ECalenLauncher@@UAE@I@Z @ 5 NONAME ; CalenLauncher::~CalenLauncher(unsigned int) + ?tr@CalenLauncher@@SA?AVQString@@PBD0H@Z @ 6 NONAME ; class QString CalenLauncher::tr(char const *, char const *, int) + ?trUtf8@CalenLauncher@@SA?AVQString@@PBD0@Z @ 7 NONAME ; class QString CalenLauncher::trUtf8(char const *, char const *) + ?tr@CalenLauncher@@SA?AVQString@@PBD0@Z @ 8 NONAME ; class QString CalenLauncher::tr(char const *, char const *) + ?qt_metacast@CalenLauncher@@UAEPAXPBD@Z @ 9 NONAME ; void * CalenLauncher::qt_metacast(char const *) + ?getStaticMetaObject@CalenLauncher@@SAABUQMetaObject@@XZ @ 10 NONAME ; struct QMetaObject const & CalenLauncher::getStaticMetaObject(void) + ?handleError@CalenLauncher@@QAEXH@Z @ 11 NONAME ; void CalenLauncher::handleError(int) + ?trUtf8@CalenLauncher@@SA?AVQString@@PBD0H@Z @ 12 NONAME ; class QString CalenLauncher::trUtf8(char const *, char const *, int) + ??0CalenLauncher@@QAE@PAVQObject@@@Z @ 13 NONAME ; CalenLauncher::CalenLauncher(class QObject *) + ?metaObject@CalenLauncher@@UBEPBUQMetaObject@@XZ @ 14 NONAME ; struct QMetaObject const * CalenLauncher::metaObject(void) const + ?qt_metacall@CalenLauncher@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 15 NONAME ; int CalenLauncher::qt_metacall(enum QMetaObject::Call, int, void * *) + diff -r fd30d51f876b -r b6db4fd4947b calendarui/calenlauncher/eabi/calenlauncheru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/calenlauncher/eabi/calenlauncheru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,17 @@ +EXPORTS + _ZN13CalenLauncher11handleErrorEi @ 1 NONAME + _ZN13CalenLauncher11qt_metacallEN11QMetaObject4CallEiPPv @ 2 NONAME + _ZN13CalenLauncher11qt_metacastEPKc @ 3 NONAME + _ZN13CalenLauncher16staticMetaObjectE @ 4 NONAME DATA 16 + _ZN13CalenLauncher17launchCalendarAppENS_9CalenViewER9QDateTimeb @ 5 NONAME + _ZN13CalenLauncher19getStaticMetaObjectEv @ 6 NONAME + _ZN13CalenLauncher20calendarLaunchFailedEi @ 7 NONAME + _ZN13CalenLauncherC1EP7QObject @ 8 NONAME + _ZN13CalenLauncherC2EP7QObject @ 9 NONAME + _ZN13CalenLauncherD0Ev @ 10 NONAME + _ZN13CalenLauncherD1Ev @ 11 NONAME + _ZN13CalenLauncherD2Ev @ 12 NONAME + _ZNK13CalenLauncher10metaObjectEv @ 13 NONAME + _ZTI13CalenLauncher @ 14 NONAME + _ZTV13CalenLauncher @ 15 NONAME + diff -r fd30d51f876b -r b6db4fd4947b calendarui/calenlauncher/inc/calenlauncher.h --- a/calendarui/calenlauncher/inc/calenlauncher.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/calenlauncher/inc/calenlauncher.h Mon Jun 28 15:22:02 2010 +0530 @@ -29,7 +29,7 @@ public: enum CalenView{ MonthView = 0, - DayView + AgendaView }; CalenLauncher(QObject* parent = 0); ~CalenLauncher(); diff -r fd30d51f876b -r b6db4fd4947b calendarui/calenplugins/agendaeventviewerplugin/agendaeventviewerplugin.pro --- a/calendarui/calenplugins/agendaeventviewerplugin/agendaeventviewerplugin.pro Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/calenplugins/agendaeventviewerplugin/agendaeventviewerplugin.pro Mon Jun 28 15:22:02 2010 +0530 @@ -39,12 +39,11 @@ TARGET.CAPABILITY = ALL -TCB TARGET.EPOCALLOWDLLDATA = 1 TARGET.UID3 = 0x2002E6A0 - + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE LIBS += -lagendainterface \ -lagendaeventviewer -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE load(data_caging_paths) # plugin stub deployment diff -r fd30d51f876b -r b6db4fd4947b calendarui/calenplugins/calenplugins.pro --- a/calendarui/calenplugins/calenplugins.pro Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/calenplugins/calenplugins.pro Mon Jun 28 15:22:02 2010 +0530 @@ -17,7 +17,6 @@ TEMPLATE = subdirs -SUBDIRS += calensettingsplugin SUBDIRS += agendaeventviewerplugin CONFIG += ordered diff -r fd30d51f876b -r b6db4fd4947b calendarui/calenplugins/calensettingsplugin/calensettingsplugin.pro --- a/calendarui/calenplugins/calensettingsplugin/calensettingsplugin.pro Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -# -# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -# All rights reserved. -# This component and the accompanying materials are made available -# under the terms of "Eclipse Public License v1.0" -# which accompanies this distribution, and is available -# at the URL "http://www.eclipse.org/legal/epl-v10.html". -# -# Initial Contributors: -# Nokia Corporation - initial contribution. -# -# Contributors: -# -# Description: This is the project file defnition for calensettingsplugin. -# - - -TEMPLATE = lib -TARGET = calensettingsplugin -DEPENDPATH += . \ - ./inc \ - ./src -INCLUDEPATH += . \ - ../../inc - -CONFIG += hb plugin - - -symbian: { - - TARGET.EPOCALLOWDLLDATA = 1 - TARGET.UID3 = 0x2002B338 - - LIBS += -lcalensettings \ - -lcpframework - - deploy.path = C: - headers.sources = qmakepluginstubs/calensettingsplugin.qtplugin - headers.path = /resource/qt/plugins/controlpanel - - # This is for new exporting system coming in garden - for(header, headers.sources):BLD_INF_RULES.prj_exports += "./$$header $$deploy.path$$headers.path/$$basename(header)" - - TARGET.CAPABILITY = CAP_GENERAL_DLL - - plugin.sources = calensettingsplugin.dll - plugin.path = \resource\qt\plugins\controlpanel - DEPLOYMENT += plugin -} - -# Input -HEADERS += calensettingsplugin.h \ - calendarsettingsview.h - -SOURCES += calensettingsplugin.cpp \ - calendarsettingsview.cpp - - -# End of file --Don't remove this. \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/calenplugins/calensettingsplugin/inc/calendarsettingsview.h --- a/calendarui/calenplugins/calensettingsplugin/inc/calendarsettingsview.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: - * - * Description: - * -*/ - -#ifndef CalendarSettingsView_H_ -#define CalendarSettingsView_H_ - -#include - -class SettingsUiUtility; - -class CalendarSettingsView : public CpBaseSettingView -{ - Q_OBJECT -public: - explicit CalendarSettingsView(QGraphicsItem *parent = 0); - virtual ~CalendarSettingsView(); -public slots: - -private: - SettingsUiUtility *mSettingsUtility; - -}; -#endif// CalendarSettingsView_H_ diff -r fd30d51f876b -r b6db4fd4947b calendarui/calenplugins/calensettingsplugin/inc/calensettingsplugin.h --- a/calendarui/calenplugins/calensettingsplugin/inc/calensettingsplugin.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: - * - * Description: - * -*/ - - -#ifndef CalenSettingsPlugin_H_ -#define CalenSettingsPlugin_H_ - -#include -#include - -class CpItemDataHelper; - -class CalenSettingsPlugin : public QObject, public CpPluginPlatInterface -{ - Q_OBJECT - Q_INTERFACES(CpPluginPlatInterface) - -public: - CalenSettingsPlugin(); - virtual ~CalenSettingsPlugin(); - - virtual int uid() const; - virtual CpSettingFormItemData *createSettingFormItemData(CpItemDataHelper &itemDataHelper) const; -}; - -#endif /* CalenSettingsPlugin_H_ */ diff -r fd30d51f876b -r b6db4fd4947b calendarui/calenplugins/calensettingsplugin/src/calendarsettingsview.cpp --- a/calendarui/calenplugins/calensettingsplugin/src/calendarsettingsview.cpp Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: - * - * Description: - * -*/ - - -#include -#include "calendarsettingsview.h" -#include "calensettings.h" - -CalendarSettingsView::CalendarSettingsView(QGraphicsItem *parent) -:CpBaseSettingView(0, parent) -{ - HbDataForm *form = settingForm(); - - if (form) { - form->setHeading(hbTrId("txt_calendar_subhead_calendar_settings")); - - CalenSettings *settings = new CalenSettings(form); - settings->createModel(); - settings->populateSettingList(); - } -} - -CalendarSettingsView::~CalendarSettingsView() -{ -} diff -r fd30d51f876b -r b6db4fd4947b calendarui/calenplugins/calensettingsplugin/src/calensettingsplugin.cpp --- a/calendarui/calenplugins/calensettingsplugin/src/calensettingsplugin.cpp Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: - * - * Description: - * -*/ - -#include - -#include "calensettingsplugin.h" -#include "calendarsettingsview.h" -#include - - -CalenSettingsPlugin::CalenSettingsPlugin() -{ -} - -CalenSettingsPlugin::~CalenSettingsPlugin() -{ -} - -int CalenSettingsPlugin::uid() const -{ - // TODO: get a uid and replace it. - return 0x20029F7F; -} - -CpSettingFormItemData *CalenSettingsPlugin::createSettingFormItemData(CpItemDataHelper& itemDataHelper) const -{ - //CpItemDataHelper* pHelper = new CpItemDataHelper(); - - // For now dummyicon - HbIcon* icon = new HbIcon(); - return new CpSettingFormEntryItemDataImpl(itemDataHelper, QString("Calendar application"), - QString("Calendar settings plugin"), *icon); -} - -Q_EXPORT_PLUGIN2(CalenSettingsPlugin, CalenSettingsPlugin) diff -r fd30d51f876b -r b6db4fd4947b calendarui/calenviewerservice/calenviewerservice.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/calenviewerservice/calenviewerservice.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,68 @@ +# +# Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: This is the project specification file for the calenviewerservice exe. +# + +TEMPLATE = app +TARGET = calenviewerservice + +DEPENDPATH += . \ + ./inc \ + ./src \ + ../inc + +INCLUDEPATH += . \ + ./inc \ + ../inc \ + ./traces + +CONFIG += hb + +symbian: { + LIBS += -lagendaeventviewer \ + -lxqservice \ + -lxqserviceutil \ + -lagendainterface \ + -lagendaeventviewer + + TARGET.CAPABILITY = All -TCB + TARGET.UID3 = 0x20031594 + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE +} + +# Input +HEADERS += calenviewerservice.h + +SOURCES += calenviewerservice.cpp \ + main.cpp + +CONFIG += service +SERVICE.FILE = data/calenviewerservice_conf.xml +SERVICE.OPTIONS += embeddable +SERVICE.OPTIONS += hidden + +RSS_RULES += \ + "datatype_list = " \ + " {" \ + " DATATYPE" \ + " {" \ + " priority = EDataTypePriorityHigh;" \ + " type = \"text/x-vCalendar\";" \ + " }," \ + " DATATYPE" \ + " {" \ + " priority = EDataTypePriorityHigh;" \ + " type = \"text/calendar\";" \ + " }" \ + " };" \ \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/calenviewerservice/data/calenviewerservice_conf.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/calenviewerservice/data/calenviewerservice_conf.xml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,11 @@ + + + calenviewerservice + No path + vCal/ICal viewer + + com.nokia.symbian.IFileView + 1.0 + Interface for showing Files + + \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/calenviewerservice/inc/calenviewerservice.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/calenviewerservice/inc/calenviewerservice.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,57 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#ifndef __CALEN_VIEWER_SERVICE_H__ +#define __CALEN_VIEWER_SERVICE_H__ + +// System includes +#include +#include + +// Forward declarations +class AgendaUtil; +class AgendaEventViewer; + +class CalenViewerService : public XQServiceProvider +{ + Q_OBJECT +public: + CalenViewerService(QObject *parent = 0); + ~CalenViewerService(); + +public slots: + bool view(QString file); + bool view(XQSharableFile file); + +private slots: + void entryViewReady(int error); + void handleClientDisconnected(); + +private: + void viewEntry(); + void complete(bool ok); + +private: + QString mFileName; + AgendaUtil *mAgendaUtil; + AgendaEventViewer *mViewer; + bool mEntryViewReady; + bool mWaitingForEntryViewReady; + int mAsyncReqIndex; +}; + +#endif // __CALEN_VIEWER_SERVICE_H__ diff -r fd30d51f876b -r b6db4fd4947b calendarui/calenviewerservice/src/calenviewerservice.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/calenviewerservice/src/calenviewerservice.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,223 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +// System includes +#include +#include +#include + +// User includes +#include "calenviewerservice.h" +#include "agendaeventviewer.h" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "calenviewerserviceTraces.h" +#endif + + +// ---------------------------------------------------------------------------- +// CalenViewerService::CalenViewerService +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +CalenViewerService::CalenViewerService(QObject* parent) : + XQServiceProvider(QLatin1String("calenviewerservice.com.nokia.symbian.IFileView"), parent), + mFileName(0), + mViewer(NULL), + mEntryViewReady(false), + mWaitingForEntryViewReady(false), + mAsyncReqIndex(0) +{ + OstTraceFunctionEntry0( CALENVIEWERSERVICE_CALENVIEWERSERVICE_ENTRY ); + + // Construct the agenda util object + mAgendaUtil = new AgendaUtil(); + connect(mAgendaUtil, SIGNAL(entryViewCreationCompleted(int)), this, SLOT(entryViewReady(int))); + connect(this, SIGNAL(clientDisconnected()), this, SLOT(handleClientDisconnected())); + + publishAll(); + + OstTraceFunctionExit0( CALENVIEWERSERVICE_CALENVIEWERSERVICE_EXIT ); +} + +// ---------------------------------------------------------------------------- +// CalenViewerService::~CalenViewerService +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +CalenViewerService::~CalenViewerService() +{ + OstTraceFunctionEntry0( DUP1_CALENVIEWERSERVICE_CALENVIEWERSERVICE_ENTRY ); + + // Cleanup + if (mAgendaUtil) { + delete mAgendaUtil; + mAgendaUtil = NULL; + } + if (mViewer) { + mViewer->deleteLater(); + mViewer = NULL; + } + + OstTraceFunctionExit0( DUP1_CALENVIEWERSERVICE_CALENVIEWERSERVICE_EXIT ); +} + +// ---------------------------------------------------------------------------- +// CalenViewerService::view +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +bool CalenViewerService::view(QString file) +{ + OstTraceFunctionEntry0( CALENVIEWERSERVICE_VIEW_ENTRY ); + + // Set the request as asynchronous + mAsyncReqIndex = setCurrentRequestAsync(); + + // Store the file name + mFileName = file; + + if (mEntryViewReady) { + // View the entry only after the entry view + // is completely instantiated + viewEntry(); + } else { + OstTrace0( TRACE_NORMAL, DUP1_CALENVIEWERSERVICE_VIEW, "Entry view not ready" ); + // Mark the flag to indicate that after the + // entry view is ready, the file must be opened + mWaitingForEntryViewReady = true; + } + + OstTraceFunctionExit0( CALENVIEWERSERVICE_VIEW_EXIT ); + + return true; +} + +// ---------------------------------------------------------------------------- +// CalenViewerService::view +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +bool CalenViewerService::view(XQSharableFile sf) +{ + OstTraceFunctionEntry0( DUP1_CALENVIEWERSERVICE_VIEW_ENTRY ); + + Q_UNUSED(sf); + + OstTrace0( TRACE_NORMAL, DUP2_CALENVIEWERSERVICE_VIEW, "Functionality not yet present" ); + + // Set the request as asynchronous + mAsyncReqIndex = setCurrentRequestAsync(); + + // TODO: Convert RFile to QFile handle and view + // Support for this has to come from Qt + complete(false); + + OstTraceFunctionExit0( DUP1_CALENVIEWERSERVICE_VIEW_EXIT ); + + return true; +} + +// ---------------------------------------------------------------------------- +// CalenViewerService::entryViewReady +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenViewerService::entryViewReady(int error) +{ + OstTraceFunctionEntry0( CALENVIEWERSERVICE_ENTRYVIEWREADY_ENTRY ); + + Q_UNUSED(error); + + mEntryViewReady = true; + + // Now open the file for viewing + if (mWaitingForEntryViewReady) { + // If control comes here, it means that + // the request to view the file has come before + // the entry view is ready. So view the entry now + viewEntry(); + } + + OstTraceFunctionExit0( CALENVIEWERSERVICE_ENTRYVIEWREADY_EXIT ); +} + +// ---------------------------------------------------------------------------- +// CalenViewerService::handleClientDisconnected +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenViewerService::handleClientDisconnected() +{ + OstTraceFunctionEntry0( CALENVIEWERSERVICE_HANDLECLIENTDISCONNECTED_ENTRY ); + + // Just exit the application + qApp->quit(); + + OstTraceFunctionExit0( CALENVIEWERSERVICE_HANDLECLIENTDISCONNECTED_EXIT ); +} + +// ---------------------------------------------------------------------------- +// CalenViewerService::viewEntry +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenViewerService::viewEntry() +{ + OstTraceFunctionEntry0( CALENVIEWERSERVICE_VIEWENTRY_ENTRY ); + + if (mFileName.isEmpty()) { + // Invalid file name or viewer is already being viewed + OstTrace0( TRACE_NORMAL, CALENVIEWERSERVICE_VIEWENTRY, "Filename is empty" ); + + // Just exit the application + qApp->quit(); + + return; + } + QFile fileHandle(mFileName); + + if (!mViewer) { + mViewer = new AgendaEventViewer(mAgendaUtil, this); + connect(mViewer, SIGNAL(viewingCompleted()), qApp, SLOT(quit())); + } + + // TODO : No indication if the parsing of vcal/ical is successful + mViewer->view(fileHandle, AgendaEventViewer::ActionSave); + complete(true); + + OstTraceFunctionExit0( DUP1_CALENVIEWERSERVICE_VIEWENTRY_EXIT ); +} + +// ---------------------------------------------------------------------------- +// CalenViewerService::complete +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenViewerService::complete(bool ok) +{ + OstTraceFunctionEntry0( CALENVIEWERSERVICE_COMPLETE_ENTRY ); + + // TODO : Pass return value based on whether parsing + // of vcal or ical is successful or not + completeRequest(mAsyncReqIndex, ok); + + OstTraceFunctionExit0( CALENVIEWERSERVICE_COMPLETE_EXIT ); +} + +// End of file --Don't remove this. + diff -r fd30d51f876b -r b6db4fd4947b calendarui/calenviewerservice/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/calenviewerservice/src/main.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: main implementation. +* +*/ + +// System includes +#include +#include + +// User includes +#include "calenviewerservice.h" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "mainTraces.h" +#endif + + +int main (int argc, char *argv[]) +{ + OstTraceFunctionEntry0( _MAIN_ENTRY ); + + HbApplication app(argc, argv); + HbMainWindow mainWindow; + + // Create the service provider + CalenViewerService service; + + mainWindow.show(); + + int retVal = app.exec(); + + OstTraceFunctionExit0( _MAIN_EXIT ); + + return retVal; +} diff -r fd30d51f876b -r b6db4fd4947b calendarui/calenviewerservice/traces/OstTraceDefinitions.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/calenviewerservice/traces/OstTraceDefinitions.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,7 @@ +#ifndef __OSTTRACEDEFINITIONS_H__ +#define __OSTTRACEDEFINITIONS_H__ +// OST_TRACE_COMPILER_IN_USE flag has been added by Trace Compiler +// REMOVE BEFORE CHECK-IN TO VERSION CONTROL +#define OST_TRACE_COMPILER_IN_USE +#include +#endif diff -r fd30d51f876b -r b6db4fd4947b calendarui/calenviewerservice/traces/calenviewerserviceTraces.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/calenviewerservice/traces/calenviewerserviceTraces.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,35 @@ +// Created by TraceCompiler 2.2.2 +// DO NOT EDIT, CHANGES WILL BE LOST + +#ifndef __CALENVIEWERSERVICETRACES_H__ +#define __CALENVIEWERSERVICETRACES_H__ + +#define KOstTraceComponentID 0x20031594 + +#define CALENVIEWERSERVICE_CALENVIEWERSERVICE_ENTRY 0x8a0001 +#define CALENVIEWERSERVICE_CALENVIEWERSERVICE_EXIT 0x8a0002 +#define DUP1_CALENVIEWERSERVICE_CALENVIEWERSERVICE_ENTRY 0x8a0005 +#define DUP1_CALENVIEWERSERVICE_CALENVIEWERSERVICE_EXIT 0x8a0006 +#define CALENVIEWERSERVICE_VIEW_ENTRY 0x8a0007 +#define CALENVIEWERSERVICE_VIEW_EXIT 0x8a0008 +#define DUP1_CALENVIEWERSERVICE_VIEW_ENTRY 0x8a0009 +#define DUP1_CALENVIEWERSERVICE_VIEW_EXIT 0x8a000a +#define CALENVIEWERSERVICE_INSTANCEVIEWREADY_ENTRY 0x8a000b +#define CALENVIEWERSERVICE_INSTANCEVIEWREADY_EXIT 0x8a000c +#define CALENVIEWERSERVICE_ENTRYVIEWREADY_ENTRY 0x8a000d +#define CALENVIEWERSERVICE_ENTRYVIEWREADY_EXIT 0x8a000e +#define CALENVIEWERSERVICE_HANDLECLIENTDISCONNECTED_ENTRY 0x8a000f +#define CALENVIEWERSERVICE_HANDLECLIENTDISCONNECTED_EXIT 0x8a0010 +#define CALENVIEWERSERVICE_VIEWENTRY_ENTRY 0x8a0011 +#define DUP1_CALENVIEWERSERVICE_VIEWENTRY_EXIT 0x8a0012 +#define CALENVIEWERSERVICE_COMPLETE_ENTRY 0x8a0013 +#define CALENVIEWERSERVICE_COMPLETE_EXIT 0x8a0014 +#define CALENVIEWERSERVICE_VIEWENTRY 0x860002 +#define DUP1_CALENVIEWERSERVICE_VIEW 0x860003 +#define DUP2_CALENVIEWERSERVICE_VIEW 0x860004 + + +#endif + +// End of file + diff -r fd30d51f876b -r b6db4fd4947b calendarui/calenviewerservice/traces/fixed_id.definitions --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/calenviewerservice/traces/fixed_id.definitions Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,26 @@ +#Fixed group and trace id definitions. If this file is removed, the identifiers are rebuilt. +[GROUP]TRACE_FLOW=0x8a +[GROUP]TRACE_NORMAL=0x86 +[TRACE]TRACE_FLOW[0x8A]_CALENVIEWERSERVICE_CALENVIEWERSERVICE_ENTRY=0x1 +[TRACE]TRACE_FLOW[0x8A]_CALENVIEWERSERVICE_CALENVIEWERSERVICE_EXIT=0x2 +[TRACE]TRACE_FLOW[0x8A]_CALENVIEWERSERVICE_COMPLETE_ENTRY=0x13 +[TRACE]TRACE_FLOW[0x8A]_CALENVIEWERSERVICE_COMPLETE_EXIT=0x14 +[TRACE]TRACE_FLOW[0x8A]_CALENVIEWERSERVICE_ENTRYVIEWREADY_ENTRY=0xd +[TRACE]TRACE_FLOW[0x8A]_CALENVIEWERSERVICE_ENTRYVIEWREADY_EXIT=0xe +[TRACE]TRACE_FLOW[0x8A]_CALENVIEWERSERVICE_HANDLECLIENTDISCONNECTED_ENTRY=0xf +[TRACE]TRACE_FLOW[0x8A]_CALENVIEWERSERVICE_HANDLECLIENTDISCONNECTED_EXIT=0x10 +[TRACE]TRACE_FLOW[0x8A]_CALENVIEWERSERVICE_INSTANCEVIEWREADY_ENTRY=0xb +[TRACE]TRACE_FLOW[0x8A]_CALENVIEWERSERVICE_INSTANCEVIEWREADY_EXIT=0xc +[TRACE]TRACE_FLOW[0x8A]_CALENVIEWERSERVICE_VIEWENTRY_ENTRY=0x11 +[TRACE]TRACE_FLOW[0x8A]_CALENVIEWERSERVICE_VIEW_ENTRY=0x7 +[TRACE]TRACE_FLOW[0x8A]_CALENVIEWERSERVICE_VIEW_EXIT=0x8 +[TRACE]TRACE_FLOW[0x8A]_DUP1_CALENVIEWERSERVICE_CALENVIEWERSERVICE_ENTRY=0x5 +[TRACE]TRACE_FLOW[0x8A]_DUP1_CALENVIEWERSERVICE_CALENVIEWERSERVICE_EXIT=0x6 +[TRACE]TRACE_FLOW[0x8A]_DUP1_CALENVIEWERSERVICE_VIEWENTRY_EXIT=0x12 +[TRACE]TRACE_FLOW[0x8A]_DUP1_CALENVIEWERSERVICE_VIEW_ENTRY=0x9 +[TRACE]TRACE_FLOW[0x8A]_DUP1_CALENVIEWERSERVICE_VIEW_EXIT=0xa +[TRACE]TRACE_FLOW[0x8A]__MAIN_ENTRY=0x3 +[TRACE]TRACE_FLOW[0x8A]__MAIN_EXIT=0x4 +[TRACE]TRACE_NORMAL[0x86]_CALENVIEWERSERVICE_VIEWENTRY=0x2 +[TRACE]TRACE_NORMAL[0x86]_DUP1_CALENVIEWERSERVICE_VIEW=0x3 +[TRACE]TRACE_NORMAL[0x86]_DUP2_CALENVIEWERSERVICE_VIEW=0x4 diff -r fd30d51f876b -r b6db4fd4947b calendarui/calenviewerservice/traces/mainTraces.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/calenviewerservice/traces/mainTraces.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,16 @@ +// Created by TraceCompiler 2.2.2 +// DO NOT EDIT, CHANGES WILL BE LOST + +#ifndef __MAINTRACES_H__ +#define __MAINTRACES_H__ + +#define KOstTraceComponentID 0x20031594 + +#define _MAIN_ENTRY 0x8a0003 +#define _MAIN_EXIT 0x8a0004 + + +#endif + +// End of file + diff -r fd30d51f876b -r b6db4fd4947b calendarui/cenrep/101F874B.cre Binary file calendarui/cenrep/101F874B.cre has changed diff -r fd30d51f876b -r b6db4fd4947b calendarui/cenrep/101F874B.txt Binary file calendarui/cenrep/101F874B.txt has changed diff -r fd30d51f876b -r b6db4fd4947b calendarui/cenrep/CalendarDomainCRKeys.h --- a/calendarui/cenrep/CalendarDomainCRKeys.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Calendar Domain Cenrep Keys. -* -*/ - -#ifndef CALENDARDOMAINCRKEYS_H -#define CALENDARDOMAINCRKEYS_H - -//#include - -/** Calendar UI Settings API */ -/** Provides access to the Calendar application's settings */ - -const TUid KCRUidCalendar = {0x101F874B}; - -/** -* Calendar alarm sound file, string. -* Default value : "z:\data\sounds\digital\alarm.aac" -**/ -const TUint32 KCalendarSoundFile = 0x00000004; - -/** -* Default Calendar alarm sound file. -* Default value : "z:\data\sounds\digital\alarm.aac" -**/ -const TUint32 KCalendarDefaultSoundFile = 0x00000005; - -#endif \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/cenrep/CalendarInternalCRKeys.h --- a/calendarui/cenrep/CalendarInternalCRKeys.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,107 +0,0 @@ -/* -* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Calendar Internal Cenrep Keys. -* -*/ - - - -#ifndef CALENDARINTERNALCRKEYS_H -#define CALENDARINTERNALCRKEYS_H - -//#include - -/** Calendar UI Settings API */ -/** Provides access to the Calendar application's settings */ - -const TUint32 KCRUidCalendar = {0x101F874B}; - - -/** -* Default alarm time in minutes before event starting time. -* Value is an integer between 0 and 60. Default: 15. -**/ -const TUint32 KCalendarDefaultAlarmTime = 0x00000000; - -/** -* Default starting view for Calendar. Value is an integer between 0 and 2. -* 0 = Month view (default) -* 1 = Week view -* 2 = Day view -**/ -const TUint32 KCalendarDefaultStartView = 0x00000001; - -/** -* Week view title in Calendar application. -* Value is eihter integer 0 or 1 -* 0 = Week number (default) -* 1 = Week dates -**/ -const TUint32 KCalendarWeekViewTitle = 0x00000002; - -/** -* Is Chinese Lunar calendar information shown in Calendar -* (only available if feature is included in ROM image). -* Value is either integer 0 or 1 -* 0 = Off -* 1 = On (default) -* This key value is deprecated and has been replaced by the KCRUidCalenLunarPlugin key. -**/ -const TUint32 KCalendarLunarCalendar = 0x00000003; - -/** -* Calendar alarm sound file, string. -* Default value : "z:\data\sounds\digital\alarm.aac" -**/ -const TUint32 KCalendarSoundFile = 0x00000004; - -/** -* Default Calendar alarm sound file. -* Default value : "z:\data\sounds\digital\alarm.aac" -**/ -const TUint32 KCalendarDefaultSoundFile = 0x00000005; - -/** -* A flag that is set when a Calendar alarm was lost due to time change. -* Default value: 0 -*/ -const TUint32 KCalendarLostAlarm = 0x00000006; - -/** -* Calendar alarm snooze time interval in minutes. -* Default value: 5 -*/ -const TUint32 KCalendarSnoozeTime = 0x00000007; - -//Added as an addition to the Symbian fix -/** -* Calendar Persistent Time to store the last time the System Time updated. -* Default Value : 0 -*/ -const TReal KCalendarPersistentTime = 0x00000009; - -/** -* Text string containing UIDs and enabled/disabled flag (separated -* by commas) for Calendar plugins. -* Default value: Empty -*/ -const TUint32 KCalendarPluginAvailability = 0x0000000A; - -/** -* Defines whether regional information must be shown in the Calendar or not -* Default value: 1 -*/ -const TUint32 KShowRegionalInformation = 0x0000000B; - -#endif // CALENDARINTERNALCRKEYS_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/cenrep/CalendarPrivateCRKeys.h --- a/calendarui/cenrep/CalendarPrivateCRKeys.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -/* -* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Calendar Private Cenrep Keys. -* -*/ - - - -#ifndef CALENDARPRIVATECRKEYS_H -#define CALENDARPRIVATECRKEYS_H - -#include - -/** Calendar UI Local Variation API */ -/** Provides access to the Calendar application's local variation setting */ - -const TUid KCRUidCalendarLV = {0x101F874C}; - - -/** -* Local variation bitmask for Caledar configuration. -* For values refer to CalendarVariant.hrh. -* -**/ -const TUint32 KCalenLVFlags = 0x00000007; - - -/** Calendar Thai Plugin Settings API */ -/** Provides access to the Calendar Thai Plugin's settings */ -const TUid KCRUidCalenThaiPlugin = {0x102823D2}; - -/** -* User modifiable setting -* Is Thai regional Calendar information shown in Calendar -* (only available if feature is included in phone, -* currnet display language is Thai) -* Value is either integer 0 or 1 -* 0 = Off -* 1 = On (default) -**/ -const TUint32 KCalenThaiPluginEnabled = 0x00000000; - - -/** Calendar Lunar Calendar Plugin Settings API */ -/** Provides access to the Calendar Lunar Plugin's settings */ -const TUid KCRUidCalenLunarPlugin = { 0x102823D1 }; - -/** -* User modifiable setting -* Is Chinese Lunar Calendar information shown in Calendar -* (only available if feature is included in phone, -* currnet display language is some of Chinese languages) -* Value is either integer 0 or 1 -* 0 = Off -* 1 = On (default) -**/ -const TUint32 KCalenChineseLunarEnabled = 0x00000000; - - -/** -* User modifiable setting -* Is Vietnamese Lunar Calendar information shown in Calendar -* (only available if feature is included in phone, -* currnet display language is Vietnamese languages) -* Value is either integer 0 or 1 -* 0 = Off -* 1 = On (default) -**/ -const TUint32 KCalenVietnameseLunarEnabled = 0x00000001; - - -/** Calendar UI Extensions Settings API */ -/** Provides access to user settings that enable Calendar UI extensions and customizations */ -const TUid KCRUidCalenUIExtensions = { 0x10282ED7 }; - -/** -* User modifiable setting to enable the AIW External Calendar. -* (only available if an AIW provider is included in phone) -* Value is either integer 0 or 1 -* 0 = Off -* 1 = On (default) -**/ -const TUint32 KCalenExternalCalendarEnabled = 0x00000000; - - -#endif // CALENDARPRIVATECRKEYS_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/cenrep/README.txt --- a/calendarui/cenrep/README.txt Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -Put 101F874B.cre in epoc32/winscw/c/private/10202be9/persists. - -This is a temporary solution until the calendar central repository data gets updated in the platform to include the new plugin setting item. - -Once the platform change has been made, 101F874B.cre and 101F874B.txt can be deleted from this directory. \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/cenrep/keys_calendarUI.xls Binary file calendarui/cenrep/keys_calendarUI.xls has changed diff -r fd30d51f876b -r b6db4fd4947b calendarui/commonutils/bwins/calencommonutilsu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/commonutils/bwins/calencommonutilsu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,20 @@ +EXPORTS + ?roundToPreviousHour@CalenDateUtils@@SAHABH@Z @ 1 NONAME ; int CalenDateUtils::roundToPreviousHour(int const &) + ?onSameMonth@CalenDateUtils@@SA_NABVQDateTime@@0@Z @ 2 NONAME ; bool CalenDateUtils::onSameMonth(class QDateTime const &, class QDateTime const &) + ?timeOfDay@CalenDateUtils@@SAHABVQDateTime@@@Z @ 3 NONAME ; int CalenDateUtils::timeOfDay(class QDateTime const &) + ?minTime@CalenDateUtils@@SA?AVQDateTime@@XZ @ 4 NONAME ; class QDateTime CalenDateUtils::minTime(void) + ?isOnToday@CalenDateUtils@@SA_NABVQDateTime@@@Z @ 5 NONAME ; bool CalenDateUtils::isOnToday(class QDateTime const &) + ?displayTimeOnDay@CalenDateUtils@@SA?AVQDateTime@@ABV2@0@Z @ 6 NONAME ; class QDateTime CalenDateUtils::displayTimeOnDay(class QDateTime const &, class QDateTime const &) + ?endsAtStartOfDay@CalenAgendaUtils@@SA_NAAVAgendaEntry@@ABVQDateTime@@@Z @ 7 NONAME ; bool CalenAgendaUtils::endsAtStartOfDay(class AgendaEntry &, class QDateTime const &) + ?roundToPreviousHour@CalenDateUtils@@SA?AVQDateTime@@ABV2@@Z @ 8 NONAME ; class QDateTime CalenDateUtils::roundToPreviousHour(class QDateTime const &) + ?maxTime@CalenDateUtils@@SA?AVQDateTime@@XZ @ 9 NONAME ; class QDateTime CalenDateUtils::maxTime(void) + ?timeRangesIntersect@CalenDateUtils@@SA_NABVQDateTime@@000@Z @ 10 NONAME ; bool CalenDateUtils::timeRangesIntersect(class QDateTime const &, class QDateTime const &, class QDateTime const &, class QDateTime const &) + ?limitToValidTime@CalenDateUtils@@SA?AVQDateTime@@ABV2@@Z @ 11 NONAME ; class QDateTime CalenDateUtils::limitToValidTime(class QDateTime const &) + ?today@CalenDateUtils@@SA?AVQDateTime@@XZ @ 12 NONAME ; class QDateTime CalenDateUtils::today(void) + ?isValidDay@CalenDateUtils@@SA_NABVQDateTime@@@Z @ 13 NONAME ; bool CalenDateUtils::isValidDay(class QDateTime const &) + ?beginningOfDay@CalenDateUtils@@SA?AVQDateTime@@ABV2@@Z @ 14 NONAME ; class QDateTime CalenDateUtils::beginningOfDay(class QDateTime const &) + ?onSameDay@CalenDateUtils@@SA_NABVQDateTime@@0@Z @ 15 NONAME ; bool CalenDateUtils::onSameDay(class QDateTime const &, class QDateTime const &) + ?defaultTime@CalenDateUtils@@SA?AVQDateTime@@ABV2@@Z @ 16 NONAME ; class QDateTime CalenDateUtils::defaultTime(class QDateTime const &) + ?futureOf@CalenDateUtils@@SA?AVQDateTime@@ABV2@H@Z @ 17 NONAME ; class QDateTime CalenDateUtils::futureOf(class QDateTime const &, int) + ?now@CalenDateUtils@@SA?AVQDateTime@@XZ @ 18 NONAME ; class QDateTime CalenDateUtils::now(void) + diff -r fd30d51f876b -r b6db4fd4947b calendarui/commonutils/eabi/calencommonutilsu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/commonutils/eabi/calencommonutilsu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,20 @@ +EXPORTS + _ZN14CalenDateUtils10isValidDayERK9QDateTime @ 1 NONAME + _ZN14CalenDateUtils11defaultTimeERK9QDateTime @ 2 NONAME + _ZN14CalenDateUtils11onSameMonthERK9QDateTimeS2_ @ 3 NONAME + _ZN14CalenDateUtils14beginningOfDayERK9QDateTime @ 4 NONAME + _ZN14CalenDateUtils16displayTimeOnDayERK9QDateTimeS2_ @ 5 NONAME + _ZN14CalenDateUtils16limitToValidTimeERK9QDateTime @ 6 NONAME + _ZN14CalenDateUtils19roundToPreviousHourERK9QDateTime @ 7 NONAME + _ZN14CalenDateUtils19roundToPreviousHourERKi @ 8 NONAME + _ZN14CalenDateUtils19timeRangesIntersectERK9QDateTimeS2_S2_S2_ @ 9 NONAME + _ZN14CalenDateUtils3nowEv @ 10 NONAME + _ZN14CalenDateUtils5todayEv @ 11 NONAME + _ZN14CalenDateUtils7maxTimeEv @ 12 NONAME + _ZN14CalenDateUtils7minTimeEv @ 13 NONAME + _ZN14CalenDateUtils8futureOfERK9QDateTimei @ 14 NONAME + _ZN14CalenDateUtils9isOnTodayERK9QDateTime @ 15 NONAME + _ZN14CalenDateUtils9onSameDayERK9QDateTimeS2_ @ 16 NONAME + _ZN14CalenDateUtils9timeOfDayERK9QDateTime @ 17 NONAME + _ZN16CalenAgendaUtils16endsAtStartOfDayER11AgendaEntryRK9QDateTime @ 18 NONAME + diff -r fd30d51f876b -r b6db4fd4947b calendarui/commonutils/inc/calenagendautils.h --- a/calendarui/commonutils/inc/calenagendautils.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/commonutils/inc/calenagendautils.h Mon Jun 28 15:22:02 2010 +0530 @@ -43,12 +43,6 @@ public: /** - * Removes entries ending aDay at midnight. - **/ - static void removeEntriesEndingAtMidnightL( QList& list, - const QDateTime& day ); - - /** * Checks that if entry ends at starting midnight of the day, * but has started earlier. * Such entries are not shown in day that they end, because end time @@ -56,7 +50,7 @@ * @returns ETrue, if entry ends at starting midnight of day, but starts before that * EFalse, otherwise **/ - static bool endsAtStartOfDayL( AgendaEntry& entry, + static bool endsAtStartOfDay( AgendaEntry& entry, const QDateTime& day ); }; diff -r fd30d51f876b -r b6db4fd4947b calendarui/commonutils/inc/calendateutils.h --- a/calendarui/commonutils/inc/calendateutils.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/commonutils/inc/calendateutils.h Mon Jun 28 15:22:02 2010 +0530 @@ -62,12 +62,6 @@ static bool isValidDay( const QDateTime& time ); /** - * Return ETrue if aTime is NULL - * @param aTime time to be compared against NULL time - */ - static bool isNullTime( QDateTime& time ); - - /** * Return Min or Max time if aTime goes out of bounds. * Valid range is [CalenDateUtils::MinTime(), CalenDateUtils::MaxTime] * @param aTime time to be checked @@ -125,8 +119,6 @@ */ static QDateTime defaultTime( const QDateTime& date ); - static QDateTime pastOf(const QDateTime& dateTime, int numOfDays); - static QDateTime futureOf(const QDateTime& dateTime, int numOfDays); diff -r fd30d51f876b -r b6db4fd4947b calendarui/commonutils/src/calenagendautils.cpp --- a/calendarui/commonutils/src/calenagendautils.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/commonutils/src/calenagendautils.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -30,43 +30,12 @@ // ============================ CalenAgendaUtils ============================== // ----------------------------------------------------------------------------- -// CalenAgendaUtils::RemoveEntriesStartingAtMidnight +// CalenAgendaUtils::EndsAtStartOfDay // ?implementation_description // (other items were commented in a header). // ----------------------------------------------------------------------------- // - void CalenAgendaUtils::removeEntriesEndingAtMidnightL( QList& list, - const QDateTime& day ) - { - TRACE_ENTRY_POINT; - - // Remove events starting before aDay and ending at midnight - TInt i( 0 ); - - while( i < list.count() ) - { - AgendaEntry& entry = list[i]; - - if( endsAtStartOfDayL( entry, day ) ) - { - list.removeAt( i ); - } - else - { - ++i; - } - } - - TRACE_EXIT_POINT; - } - -// ----------------------------------------------------------------------------- -// CalenAgendaUtils::EndsAtStartOfDayL -// ?implementation_description -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// - bool CalenAgendaUtils::endsAtStartOfDayL( AgendaEntry& entry, + bool CalenAgendaUtils::endsAtStartOfDay( AgendaEntry& entry, const QDateTime& day ) { TRACE_ENTRY_POINT; diff -r fd30d51f876b -r b6db4fd4947b calendarui/commonutils/src/calendateutils.cpp --- a/calendarui/commonutils/src/calendateutils.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/commonutils/src/calendateutils.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -120,17 +120,6 @@ // (other items were commented in a header). // ----------------------------------------------------------------------------- // - bool CalenDateUtils::isNullTime( QDateTime& time ) - { - return( time.isNull() ); - } - -// ----------------------------------------------------------------------------- -// ?classname::?member_function -// ?implementation_description -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// QDateTime CalenDateUtils::limitToValidTime( const QDateTime& time ) { QDateTime valid = time; @@ -169,7 +158,7 @@ // int CalenDateUtils::timeOfDay( const QDateTime& dateTime ) { - QDateTime midnight = CalenDateUtils::beginningOfDay( dateTime ); + QDateTime midnight = beginningOfDay( dateTime ); int resultInSec = midnight.secsTo(dateTime); return (resultInSec/60); @@ -201,15 +190,7 @@ // QDateTime CalenDateUtils::now() { - TTime currentTime; - currentTime.HomeTime(); - TDateTime curDateTime = currentTime.DateTime(); - QDateTime ret; - ret.setDate(QDate(curDateTime.Year(), curDateTime.Month() + 1, curDateTime.Day() + 1)); - ret.setTime(QTime(curDateTime.Hour(), curDateTime.Minute(), curDateTime.Second(), curDateTime.MicroSecond())); - // TODO: need to use QDateTime::currentDateTime() from QT4.6 onwards - //return QDateTime::currentDateTime(); - return ret; + return QDateTime::currentDateTime(); } // ----------------------------------------------------------------------------- @@ -250,44 +231,6 @@ // (other items were commented in a header). // ----------------------------------------------------------------------------- // - QDateTime CalenDateUtils::pastOf(const QDateTime& dateTime, int numOfDays) - { - QDateTime result; - int dayNumber = dateTime.date().day(); - int numOfDaysInMonth = dayNumber; - int month = dateTime.date().month(); - int year = dateTime.date().year(); - int buff = numOfDays; - QDate date(year, month, dayNumber); - while(buff > numOfDaysInMonth) - { - if(month == 1) { - // If January, - month = 12; // December - year--; - } - else { - month--; - } - // Create the qdate with these details - date.setDate(year, month, 1); - // check to see if it goes beyond the next month also - buff = buff - numOfDaysInMonth; - numOfDaysInMonth = date.daysInMonth(); - } - - // Substract buff days from end of the month - int day = numOfDaysInMonth - buff; - date.setYMD(date.year(), date.month(), day); - result.setDate(date); - result.setTime(dateTime.time()); - return result; - } - - // ----------------------------------------------------------------------------- - // (other items were commented in a header). - // ----------------------------------------------------------------------------- - // QDateTime CalenDateUtils::futureOf(const QDateTime& dateTime, int numOfDays) { QDateTime result; diff -r fd30d51f876b -r b6db4fd4947b calendarui/conf/calendarUI.confml Binary file calendarui/conf/calendarUI.confml has changed diff -r fd30d51f876b -r b6db4fd4947b calendarui/conf/calendarUI_101F874B.crml Binary file calendarui/conf/calendarUI_101F874B.crml has changed diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/bwins/calencontrolleru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/controller/bwins/calencontrolleru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,40 @@ +EXPORTS + ?trUtf8@CCalenController@@SA?AVQString@@PBD0H@Z @ 1 NONAME ; class QString CCalenController::trUtf8(char const *, char const *, int) + ?checkMultipleCreation@CCalenController@@AAEXXZ @ 2 NONAME ; void CCalenController::checkMultipleCreation(void) + ??0CCalenController@@QAE@XZ @ 3 NONAME ; CCalenController::CCalenController(void) + ?handleServiceManagerSlot@CCalenController@@QAEXHABVQDateTime@@@Z @ 4 NONAME ; void CCalenController::handleServiceManagerSlot(int, class QDateTime const &) + ?staticMetaObject@CCalenController@@2UQMetaObject@@B @ 5 NONAME ; struct QMetaObject const CCalenController::staticMetaObject + ?qt_metacall@CCalenController@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 6 NONAME ; int CCalenController::qt_metacall(enum QMetaObject::Call, int, void * *) + ?qt_metacast@CCalenController@@UAEPAXPBD@Z @ 7 NONAME ; void * CCalenController::qt_metacast(char const *) + ?BroadcastNotification@CCalenController@@QAEXW4TCalenNotification@@@Z @ 8 NONAME ; void CCalenController::BroadcastNotification(enum TCalenNotification) + ?CancelNotifications@CCalenController@@QAEXPAVMCalenNotificationHandler@@@Z @ 9 NONAME ; void CCalenController::CancelNotifications(class MCalenNotificationHandler *) + ?eventFilter@CCalenController@@UAE_NPAVQObject@@PAVQEvent@@@Z @ 10 NONAME ; bool CCalenController::eventFilter(class QObject *, class QEvent *) + ?tr@CCalenController@@SA?AVQString@@PBD0@Z @ 11 NONAME ; class QString CCalenController::tr(char const *, char const *) + ?getStaticMetaObject@CCalenController@@SAABUQMetaObject@@XZ @ 12 NONAME ; struct QMetaObject const & CCalenController::getStaticMetaObject(void) + ?CustomisationManager@CCalenController@@QAEAAVCCalenCustomisationManager@@XZ @ 13 NONAME ; class CCalenCustomisationManager & CCalenController::CustomisationManager(void) + ?IssueCommandL@CCalenController@@QAEHH@Z @ 14 NONAME ; int CCalenController::IssueCommandL(int) + ?tr@CCalenController@@SA?AVQString@@PBD0H@Z @ 15 NONAME ; class QString CCalenController::tr(char const *, char const *, int) + ?Services@CCalenController@@QAEAAVMCalenServices@@XZ @ 16 NONAME ; class MCalenServices & CCalenController::Services(void) + ?OfferMenu@CCalenController@@QAEXPAVHbMenu@@@Z @ 17 NONAME ; void CCalenController::OfferMenu(class HbMenu *) + ?ReleaseCustomisations@CCalenController@@QAEXXZ @ 18 NONAME ; void CCalenController::ReleaseCustomisations(void) + ?SetDefaultContext@CCalenController@@AAEXXZ @ 19 NONAME ; void CCalenController::SetDefaultContext(void) + ??_ECCalenController@@UAE@I@Z @ 20 NONAME ; CCalenController::~CCalenController(unsigned int) + ?getFirstView@CCalenController@@QAEHXZ @ 21 NONAME ; int CCalenController::getFirstView(void) + ?metaObject@CCalenController@@UBEPBUQMetaObject@@XZ @ 22 NONAME ; struct QMetaObject const * CCalenController::metaObject(void) const + ?Infobar@CCalenController@@QAEPAVHbWidget@@XZ @ 23 NONAME ; class HbWidget * CCalenController::Infobar(void) + ?ViewManager@CCalenController@@QAEAAVCalenViewManager@@XZ @ 24 NONAME ; class CalenViewManager & CCalenController::ViewManager(void) + ?context@CCalenController@@QAEAAVMCalenContext@@XZ @ 25 NONAME ; class MCalenContext & CCalenController::context(void) + ?agendaInterface@CCalenController@@QAEPAVAgendaUtil@@XZ @ 26 NONAME ; class AgendaUtil * CCalenController::agendaInterface(void) + ?constructController@CCalenController@@QAEXXZ @ 27 NONAME ; void CCalenController::constructController(void) + ?MainWindow@CCalenController@@QAEAAVHbMainWindow@@XZ @ 28 NONAME ; class HbMainWindow & CCalenController::MainWindow(void) + ?Notifier@CCalenController@@QAEAAVCalenNotifier@@XZ @ 29 NONAME ; class CalenNotifier & CCalenController::Notifier(void) + ?InstanceL@CCalenController@@SAPAV1@XZ @ 30 NONAME ; class CCalenController * CCalenController::InstanceL(void) + ??1CCalenController@@UAE@XZ @ 31 NONAME ; CCalenController::~CCalenController(void) + ?InfobarTextL@CCalenController@@QAEPAVQString@@XZ @ 32 NONAME ; class QString * CCalenController::InfobarTextL(void) + ?Release@CCalenController@@QAEXXZ @ 33 NONAME ; void CCalenController::Release(void) + ?trUtf8@CCalenController@@SA?AVQString@@PBD0@Z @ 34 NONAME ; class QString CCalenController::trUtf8(char const *, char const *) + ?RegisterForNotificationsL@CCalenController@@QAEXPAVMCalenNotificationHandler@@W4TCalenNotification@@@Z @ 35 NONAME ; void CCalenController::RegisterForNotificationsL(class MCalenNotificationHandler *, enum TCalenNotification) + ?GetCommandHandlerL@CCalenController@@QAEPAVMCalenCommandHandler@@H@Z @ 36 NONAME ; class MCalenCommandHandler * CCalenController::GetCommandHandlerL(int) + ?RegisterForNotificationsL@CCalenController@@QAEXPAVMCalenNotificationHandler@@AAV?$RArray@W4TCalenNotification@@@@@Z @ 37 NONAME ; void CCalenController::RegisterForNotificationsL(class MCalenNotificationHandler *, class RArray &) + ?NewServicesL@CCalenController@@UAEPAVMCalenServices@@XZ @ 38 NONAME ; class MCalenServices * CCalenController::NewServicesL(void) + diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/controller.pro --- a/calendarui/controller/controller.pro Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/controller/controller.pro Mon Jun 28 15:22:02 2010 +0530 @@ -23,6 +23,7 @@ INCLUDEPATH += ./inc \ ../inc \ ../views/inc \ + ../views/dayview/inc \ ../globaldata/inc CONFIG += hb @@ -43,7 +44,8 @@ -lcaleneditor \ -lbafl \ -lagendainterface \ - -lagendaeventviewer + -lagendaeventviewer \ + -lxqserviceutil TARGET.UID3 = 0x10282F25 TARGET.CAPABILITY = CAP_GENERAL_DLL diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/data/calendar.qrc --- a/calendarui/controller/data/calendar.qrc Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/controller/data/calendar.qrc Mon Jun 28 15:22:02 2010 +0530 @@ -1,9 +1,6 @@ - xml/calendayview.docml + xml/calenagendaview.docml xml/calenmonthview.docml - - calendar_en_GB.qm - diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/data/calendar_en_GB.qm Binary file calendarui/controller/data/calendar_en_GB.qm has changed diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/data/xml/calenagendaview.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/controller/data/xml/calenagendaview.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + +
+
+ + + + + + + + + + + +
+
+ + + + + + + + + + +
+ + + + + + + +
diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/data/xml/calenmonthview.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/controller/data/xml/calenmonthview.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,512 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/eabi/calencontrolleru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/controller/eabi/calencontrolleru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,41 @@ +EXPORTS + _ZN16CCalenController10MainWindowEv @ 1 NONAME + _ZN16CCalenController11ViewManagerEv @ 2 NONAME + _ZN16CCalenController11eventFilterEP7QObjectP6QEvent @ 3 NONAME + _ZN16CCalenController11qt_metacallEN11QMetaObject4CallEiPPv @ 4 NONAME + _ZN16CCalenController11qt_metacastEPKc @ 5 NONAME + _ZN16CCalenController12InfobarTextLEv @ 6 NONAME + _ZN16CCalenController12NewServicesLEv @ 7 NONAME + _ZN16CCalenController12getFirstViewEv @ 8 NONAME + _ZN16CCalenController13IssueCommandLEi @ 9 NONAME + _ZN16CCalenController15agendaInterfaceEv @ 10 NONAME + _ZN16CCalenController16staticMetaObjectE @ 11 NONAME DATA 16 + _ZN16CCalenController17SetDefaultContextEv @ 12 NONAME + _ZN16CCalenController18GetCommandHandlerLEi @ 13 NONAME + _ZN16CCalenController19CancelNotificationsEP25MCalenNotificationHandler @ 14 NONAME + _ZN16CCalenController19constructControllerEv @ 15 NONAME + _ZN16CCalenController19getStaticMetaObjectEv @ 16 NONAME + _ZN16CCalenController20CustomisationManagerEv @ 17 NONAME + _ZN16CCalenController21BroadcastNotificationE18TCalenNotification @ 18 NONAME + _ZN16CCalenController21ReleaseCustomisationsEv @ 19 NONAME + _ZN16CCalenController21checkMultipleCreationEv @ 20 NONAME + _ZN16CCalenController24handleServiceManagerSlotEiRK9QDateTime @ 21 NONAME + _ZN16CCalenController25RegisterForNotificationsLEP25MCalenNotificationHandler18TCalenNotification @ 22 NONAME + _ZN16CCalenController25RegisterForNotificationsLEP25MCalenNotificationHandlerR6RArrayI18TCalenNotificationE @ 23 NONAME + _ZN16CCalenController7InfobarEv @ 24 NONAME + _ZN16CCalenController7ReleaseEv @ 25 NONAME + _ZN16CCalenController7contextEv @ 26 NONAME + _ZN16CCalenController8NotifierEv @ 27 NONAME + _ZN16CCalenController8ServicesEv @ 28 NONAME + _ZN16CCalenController9InstanceLEv @ 29 NONAME + _ZN16CCalenController9OfferMenuEP6HbMenu @ 30 NONAME + _ZN16CCalenControllerC1Ev @ 31 NONAME + _ZN16CCalenControllerC2Ev @ 32 NONAME + _ZN16CCalenControllerD0Ev @ 33 NONAME + _ZN16CCalenControllerD1Ev @ 34 NONAME + _ZN16CCalenControllerD2Ev @ 35 NONAME + _ZNK16CCalenController10metaObjectEv @ 36 NONAME + _ZTI16CCalenController @ 37 NONAME + _ZTV16CCalenController @ 38 NONAME + _ZThn8_N16CCalenController12NewServicesLEv @ 39 NONAME + diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/inc/calenactionuiutils.h --- a/calendarui/controller/inc/calenactionuiutils.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/controller/inc/calenactionuiutils.h Mon Jun 28 15:22:02 2010 +0530 @@ -42,13 +42,6 @@ { public: - enum TDeleteConfirmationType - { - EDeleteEntry = 1, - EDeleteToDo, - EDeleteToDos, - EDeleteAll - }; enum TRepeatQueryType { @@ -78,9 +71,6 @@ AgendaEntry& entry, const bool status ); - static int showDeleteConfirmationQueryL(const TDeleteConfirmationType type, - const TInt count = 0); - private: // Construction and destruction // Hiding constructor, because this is static utility class. //lint -e{1526} diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/inc/calencontroller.h --- a/calendarui/controller/inc/calencontroller.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/controller/inc/calencontroller.h Mon Jun 28 15:22:02 2010 +0530 @@ -25,6 +25,7 @@ #include // TApaCommand #include // Q_DECL_EXPORT macro #include +#include #include "hb_calencommands.hrh" // Calendar commands #include "calennotificationhandler.h" // TCalenNotification #include "calenservices.h" @@ -58,29 +59,42 @@ * The controller handles events from the rest of Calendar and delegates * them to the appropriate place (i.e. the action ui classes). */ -class CALENCONTROLLER_EXPORT CCalenController : public MCalenServicesFactory +class CALENCONTROLLER_EXPORT CCalenController : public QObject, public MCalenServicesFactory { - + Q_OBJECT + public: // Construction and destruction - /** + /** * C++ constructor */ - CCalenController(bool isFromServiceFrmwrk); + CCalenController(); /** - * Constructs CCalenController with existing CAknViewAppUi. If the - * controller has been previously initialized with the same CAknViewAppUi, - * the existing instance will be returned. - * @param aAppUi Reference to CAknViewAppUi - * @return CCalenController pointer - */ - static CCalenController* InstanceL(); + * Second phase contruction for controller + */ + void constructController(); + + /** + * Constructs CCalenController with existing CAknViewAppUi. If the + * controller has been previously initialized with the same CAknViewAppUi, + * the existing instance will be returned. + * @param aAppUi Reference to CAknViewAppUi + * @return CCalenController pointer + */ + static CCalenController* InstanceL(); - /** - * CCalenController is a reference counting singleton. Call Release() - * when you are done with it, it will clean itself when it needs to - */ - void Release(); + + /** + * Releases all plugins, should only be called when + * the application is exiting. + */ + void ReleaseCustomisations(); + + /** + * CCalenController is a reference counting singleton. Call Release() + * when you are done with it, it will clean itself when it needs to + */ + void Release(); /** * destructor @@ -205,6 +219,12 @@ */ CCalenCustomisationManager& CustomisationManager(); + /** + * Filters the events eg. Locale/language change events + * @param event + */ + bool eventFilter(QObject *object, QEvent *event); + private: // Construction and destruction /** @@ -222,7 +242,6 @@ CalenContextImpl* mContext; AgendaUtil *mAgendaUtil; // Agenda interface provider CalenServicesImpl* iServices; // Services. - HbMainWindow* iMainWindow; CalenNotifier* iNotifier; // Broadcasts calendar events CCalenStateMachine* iStateMachine; CCalenActionUi* iActionUi; // Default internal command handling diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/inc/calendeleteui.h --- a/calendarui/controller/inc/calendeleteui.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/controller/inc/calendeleteui.h Mon Jun 28 15:22:02 2010 +0530 @@ -29,11 +29,19 @@ #include "calenactionuiutils.h" #include "calennotificationhandler.h" #include "calencommandhandler.h" - +#include "hb_calencommands.hrh" // FORWARD DECLARATIONS class CCalenController; +class HbAction; +enum TDeleteConfirmationType +{ + EDeleteEntry = 1, + EDeleteToDo, + EDeleteToDos, + EDeleteAll +}; // CLASS DECLARATION /** @@ -121,28 +129,21 @@ void deleteEntriesEndingAtMidnight( QDateTime aMidnight ); /** - * Delete entry by passing CCalEntryView and CCalEntry - * Will query user for confirmation before deletion - * @return ETrue user confirms to delete EFalse otherwise - */ - TBool DeleteEntryL( AgendaEntry& aEntry ); - - /** * Delete entry without querying the user */ TBool DeleteEntryWithoutQueryL(); - + /** * Delete the given entry. Ask the user whether to delete the * instance or the entire series. */ - TBool DeleteSingleInstanceL( AgendaEntry& aInstance ); + void DeleteSingleInstanceL( AgendaEntry& aInstance ); /** * Delete the given entry, using aRepeatType to determine * whether to delete the instance or the entire series. */ - TBool DeleteSingleInstanceL( AgendaEntry& aInstance, + void DeleteSingleInstanceL( AgendaEntry& aInstance, AgendaUtil::RecurrenceRange aRepeatType ); /** @@ -152,7 +153,7 @@ * @param aRepeatType Repeat type choosen to apply on delete * @return ETrue is user confirms to delete, EFalse otherwise */ - TBool DoDeleteSingleInstanceL( AgendaEntry& aInstance, + void DoDeleteSingleInstanceL( AgendaEntry& aInstance, bool aHasRepeatType, AgendaUtil::RecurrenceRange aRepeatType ); @@ -162,11 +163,6 @@ void HandleECalenNotifyViewCreatedL(); /** - * Multiple entries delete query - */ - TInt ShowMultipleEntriesDeleteQueryL(int aCount); - - /** * Get the date from user. */ void dateQuery(); @@ -177,7 +173,14 @@ * or the entire series of a repeating entry */ void showRepeatingEntryDeleteQuery(); - + + /** + * Shows a confirmation query to the user if + * he/she wants to delete instance/instances + */ + void showDeleteQuery(const TDeleteConfirmationType type, + const int count = 0); + private: // own methods /** * C++ constructor @@ -200,7 +203,9 @@ public slots: void doCompleted( int aFirstPassError ); - void getSelectedDate(); + void handleDateQuery(HbAction* action); + void handleDeletion(HbAction* action); + void handleDeleteCancel(); private slots: void handleRepeatedEntryDelete(int index); @@ -228,20 +233,22 @@ bool iIsDeleting; // True, if asynchronous delete is running QDateTime iStartTime; QDateTime iEndTime; - QDateTime mDateTime; // Get the date selected by user. HbDateTimePicker *mDatePicker; + HbAction *mDeleteAction; + HbAction *mCancelAction; // Confirmation note id is stored here. Note is shown when asynchronous // delete completes. int iConfirmationNoteId; CCalenController& iController; - + TCalenCommandId mDeleteCommand; + AgendaUtil::RecurrenceRange mRecurrenceRange; + // Stored command if the entry view // needs to constructed asyncronously TCalenCommand iStoredCommand; int iMutlipleContextIdsCount; bool iMoreEntriesToDelete; bool iDisplayQuery; - bool mIsDateValid; int iEntriesToDelete; }; diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/inc/calennotificationhandler.h --- a/calendarui/controller/inc/calennotificationhandler.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/controller/inc/calennotificationhandler.h Mon Jun 28 15:22:02 2010 +0530 @@ -32,6 +32,7 @@ ECalenNotifyInstanceDeleted, ECalenNotifySystemTimeChanged, ECalenNotifySystemLocaleChanged, + ECalenNotifySystemLanguageChanged, ECalenNotifyLostAlarms, ECalenNotifyCmdLineLaunch, ECalenNotifyAvkonViewSwitchLaunch, diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/inc/calenstatetable.h --- a/calendarui/controller/inc/calenstatetable.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/controller/inc/calenstatetable.h Mon Jun 28 15:22:02 2010 +0530 @@ -113,10 +113,10 @@ /* ECalenMonthView */ { EIdle , EIdle, KCalenNoNotification }, - /* ECalenWeekView */ + /* ECalenDayView */ { EIdle , EIdle, KCalenNoNotification }, - /* ECalenDayView */ + /* ECalenAgendaView */ { EIdle , EIdle, KCalenNoNotification }, /* ECalenForwardsToDayView */ diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/inc/calenviewmanager.h --- a/calendarui/controller/inc/calenviewmanager.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/controller/inc/calenviewmanager.h Mon Jun 28 15:22:02 2010 +0530 @@ -28,10 +28,10 @@ #include "hb_calencommands.hrh" #include "calencommandhandler.h" - +class CalenNativeView; class CCalenController; class CalenMonthView; -class CalenDayView; +class CalenAgendaView; class AgendaEventViewer; class CalenLandscapeDayView; class CalenSettingsView; @@ -52,8 +52,12 @@ /** * Constructor */ - CalenViewManager ( CCalenController& aController, - bool isFromServiceFrmwrk); + CalenViewManager ( CCalenController& aController); + + /** + * Second Phase Constructor + */ + void SecondPhaseConstruction(); /** * Destructor @@ -93,7 +97,12 @@ void showPrevDay(); - void removeDayViews(); + void removePreviousView(); + + void constructOtherViews(); + + void launchSettingsView(); + public: // from MCalenNotificationHandler @@ -110,7 +119,7 @@ /** * Loads day view frm the docml */ - void loadDayView(); + void loadAgendaView(); /** * Activates the default view, as retrieved from settings. */ @@ -131,33 +140,35 @@ * to provide illusion of swiping to next or prev * day */ - void loadAlternateDayView(); - - public slots: - void constructOtherViews(); + void loadAlternateAgendaView(); private slots: + void handleMainViewReady(); void handleViewingCompleted(const QDate date); void handleEditingStarted(); void handleEditingCompleted(); void handleDeletingStarted(); void handleDeletingCompleted(); + void handleInstanceViewCreation(int status); + void handleEntryViewCreation(int status); + void handleDayViewReady(); private: // Data CCalenController &mController; CalenMonthView *mCalenMonthView; - CalenDayView *mCalenDayView; + CalenAgendaView *mCalenAgendaView; AgendaEventViewer *mCalenEventViewer; CalenLandscapeDayView *mCalenLandscapeDayView; CalenSettingsView *mSettingsView; - CalenDocLoader *mDayViewDocLoader; + CalenDocLoader *mAgendaViewDocLoader; CalenDocLoader *mMonthViewDocLoader; - CalenDayView *mCalenDayViewAlt; - CalenDocLoader *mDayViewAltDocLoader; + CalenAgendaView *mCalenAgendaViewAlt; + CalenDocLoader *mAgendaViewAltDocLoader; + CalenNativeView *mCalenDayView; int mCurrentViewId; - int mPreviousViewId; + int mPreviousViewsId; int mFirstView; }; diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/src/calenactionui.cpp --- a/calendarui/controller/src/calenactionui.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/controller/src/calenactionui.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -142,23 +142,11 @@ if(aCommand.Command()==ECalenShowSettings) { - launchSettingsView(); + iController.ViewManager().launchSettingsView(); } TRACE_EXIT_POINT; - return continueCommand; } - -// ---------------------------------------------------------------------------- -// CCalenActionUi::launchSettingsView -// Launches settings view -// (other items were commented in a header). -// ---------------------------------------------------------------------------- -// -void CCalenActionUi::launchSettingsView() - { - CalenSettingsView* settingsView = iController.ViewManager().settingsView(); - settingsView->initializeForm(); - iController.Services().MainWindow().setCurrentView(settingsView); + return continueCommand; } // End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/src/calenactionuiutils.cpp --- a/calendarui/controller/src/calenactionuiutils.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/controller/src/calenactionuiutils.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -105,62 +105,4 @@ TRACE_EXIT_POINT; } -int CalenActionUiUtils::showDeleteConfirmationQueryL(const TDeleteConfirmationType type, - const int count) - { - TRACE_ENTRY_POINT; - int retStatus = 0; - - - HbMessageBox popup(HbMessageBox::MessageTypeQuestion); - popup.setIconVisible(true); - popup.setTimeout(HbPopup::NoTimeout); - - QString text = 0; - - switch(type) - { - case CalenActionUiUtils::EDeleteEntry: - { - // TODO: Add the text id - text.append("Delete entry?"); - break; - } - case CalenActionUiUtils::EDeleteToDo: - { - text.append(hbTrId("txt_calendar_info_delete_todo_note")); - break; - } - case CalenActionUiUtils::EDeleteToDos: - {//"Delete %N to-do notes?" - // TODO: Add the text id - text.append("Delete %N to-do's?").arg(count); - break; - } - case CalenActionUiUtils::EDeleteAll: - { - text.append(hbTrId("txt_calendar_info_delete_all_calendar_entries")); - break; - } - default: - break; - } - - popup.setText(text); - - popup.setPrimaryAction(new HbAction( - hbTrId("txt_calendar_button_delete"), &popup)); - popup.setSecondaryAction(new HbAction( - hbTrId("txt_calendar_button_cancel"), &popup)); - HbAction *selected = popup.exec(); - if (selected == popup.primaryAction()) { - retStatus = 1; - } - - TRACE_EXIT_POINT - return retStatus; - } - - - // End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/src/calenbackgroundstate.cpp --- a/calendarui/controller/src/calenbackgroundstate.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/controller/src/calenbackgroundstate.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -100,6 +100,7 @@ switch( cmd ) { + case ECalenAgendaView: case ECalenDayView: SetCurrentState(aStateMachine,CCalenStateMachine::ECalenIdleState); cmdUsed = ETrue; diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/src/calencontroller.cpp --- a/calendarui/controller/src/calencontroller.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/controller/src/calencontroller.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -20,6 +20,8 @@ #include #include #include +#include //Activity Manager +#include // service utils // User includes #include "calencontroller.h" // CCalenController @@ -46,73 +48,99 @@ // (other items were commented in a header). // ---------------------------------------------------------------------------- // -CCalenController::CCalenController(bool isFromServiceFrmwrk) +CCalenController::CCalenController() { TRACE_ENTRY_POINT; - iIsFromServiceFrmWrk = isFromServiceFrmwrk; - iNextServicesCommandBase = KCustomCommandRangeStart; - - // Store the pointer in tls, also avoid multiple creations - checkMultipleCreation(); - - // Get an instance of AgendaUtil interface class - // This will take care of - mAgendaUtil = new AgendaUtil(); - - iStateMachine = CCalenStateMachine::NewL( *this ); + // Check the Application Startup reason, set iIsFromServiceFrmWrk if application + // is started by service framework, false otherwise + /*Hb::ActivationReasonService == qobject_cast(qApp)->activateReason() ? + iIsFromServiceFrmWrk = true: + iIsFromServiceFrmWrk = false; */ - // Create the notifier. - iNotifier = new( ELeave )CalenNotifier( *iStateMachine ); - - // Construct the context - mContext = new CalenContextImpl(iNotifier); + // Check if calendar is launched thru XQService framework + iIsFromServiceFrmWrk = XQServiceUtil::isService(); // Since activateReason + //of hbapplication is not returning right value if the activity is started + //as services so using the above line temporarily untill a fix is available in + // hbappliacation. Need to remove this line after the fix is available for hbapplcation - // Set the default context.Once will start use of calencmdlinelauncher, - // Then need to remove this function - SetDefaultContext(); - - RArray notificationArray; - // Complete construction of the notifier and register the - // global data for notifications - iNotifier->ConstructL(); + iNextServicesCommandBase = KCustomCommandRangeStart; + iRefCount = 0; - // Create the services - iServices = CalenServicesImpl::NewL(); - // Create the customisation manager, and register for - // notifications - iCustomisationManager = CCalenCustomisationManager::NewL( *this, - *iServices ); - // Create the view manager, and register for notifications - iViewManager = new CalenViewManager(*this, isFromServiceFrmwrk ); - + TRACE_EXIT_POINT; +} + +// ---------------------------------------------------------------------------- +// CCalenController::constuctController +// Construct the controller completely +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CCalenController::constructController() +{ + // Store the pointer in tls, also avoid multiple creations + checkMultipleCreation(); + + // Get an instance of AgendaUtil interface class + // This will take care of + mAgendaUtil = new AgendaUtil(); + + iStateMachine = CCalenStateMachine::NewL( *this ); + + // Create the notifier. + iNotifier = new( ELeave )CalenNotifier( *iStateMachine ); + + // Construct the context + mContext = new CalenContextImpl(iNotifier); + + // Set the default context.Once will start use of calencmdlinelauncher, + // Then need to remove this function + SetDefaultContext(); + + RArray notificationArray; + // Complete construction of the notifier and register the + // global data for notifications + iNotifier->ConstructL(); + + // Create the services + iServices = CalenServicesImpl::NewL(); + // Create the customisation manager, and register for + // notifications + iCustomisationManager = CCalenCustomisationManager::NewL( *this, + *iServices ); + // Create the view manager, and register for notifications + iViewManager = new CalenViewManager(*this); + + iViewManager->SecondPhaseConstruction(); + hbInstance->allMainWindows().first()->show(); - - // Create the action uis. - iActionUi = CCalenActionUi::NewL( *this ); - - notificationArray.Append(ECalenNotifySettingsChanged); - notificationArray.Append(ECalenNotifyCheckPluginUnloading); - notificationArray.Append(ECalenNotifyEComRegistryChanged); - - RegisterForNotificationsL( iCustomisationManager,notificationArray); - notificationArray.Reset(); - - notificationArray.Append(ECalenNotifyViewPopulationComplete); - notificationArray.Append(ECalenNotifyExternalDatabaseChanged); - notificationArray.Append(ECalenNotifyMultipleEntriesDeleted); - notificationArray.Append(ECalenNotifyDialogClosed); - notificationArray.Append(ECalenNotifyEntrySaved); - notificationArray.Append(ECalenNotifyEntryDeleted); - notificationArray.Append(ECalenNotifyInstanceDeleted); - notificationArray.Append(ECalenNotifySystemLocaleChanged); - notificationArray.Append(ECalenNotifySystemTimeChanged); - notificationArray.Append(ECalenNotifyEntryClosed); - notificationArray.Append(ECalenNotifySettingsClosed); - - RegisterForNotificationsL( iViewManager, notificationArray ); - notificationArray.Reset(); - notificationArray.Close(); - TRACE_EXIT_POINT; + + // Create the action uis. + iActionUi = CCalenActionUi::NewL( *this ); + + notificationArray.Append(ECalenNotifySettingsChanged); + notificationArray.Append(ECalenNotifyCheckPluginUnloading); + notificationArray.Append(ECalenNotifyEComRegistryChanged); + notificationArray.Append(ECalenNotifySystemLanguageChanged); + + RegisterForNotificationsL( iCustomisationManager,notificationArray); + notificationArray.Reset(); + + notificationArray.Append(ECalenNotifyViewPopulationComplete); + notificationArray.Append(ECalenNotifyExternalDatabaseChanged); + notificationArray.Append(ECalenNotifyMultipleEntriesDeleted); + notificationArray.Append(ECalenNotifyDialogClosed); + notificationArray.Append(ECalenNotifyEntrySaved); + notificationArray.Append(ECalenNotifyEntryDeleted); + notificationArray.Append(ECalenNotifyInstanceDeleted); + notificationArray.Append(ECalenNotifySystemLocaleChanged); + notificationArray.Append(ECalenNotifySystemLanguageChanged); + notificationArray.Append(ECalenNotifySystemTimeChanged); + notificationArray.Append(ECalenNotifyEntryClosed); + notificationArray.Append(ECalenNotifySettingsClosed); + + RegisterForNotificationsL( iViewManager, notificationArray ); + notificationArray.Reset(); + notificationArray.Close(); } void CCalenController::checkMultipleCreation() @@ -171,7 +199,24 @@ TRACE_EXIT_POINT; return self; } + +// ---------------------------------------------------------------------------- +// CCalenController::ReleaseCustomisations +// Releases any plugins by deleting the customisation manager +// should only be called on exiting by the application. +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CCalenController::ReleaseCustomisations() + { + TRACE_ENTRY_POINT; + delete iCustomisationManager; + iCustomisationManager = NULL; + + TRACE_EXIT_POINT; + } + // ---------------------------------------------------------------------------- // CCalenController::Release // Decrement the reference count of this singleton. @@ -204,14 +249,48 @@ CCalenController::~CCalenController() { TRACE_ENTRY_POINT; + + if(iStateMachine) { + delete iStateMachine; + iStateMachine = NULL; + } + if ( iServices ) { iServices->Release(); } - delete iNotifier; - delete iActionUi; - delete iViewManager; - delete iCustomisationManager; + + if( mContext ) + { + delete mContext; + mContext = NULL; + } + // iActionUi has to be deleted before iNotifier + // as the unregistering of the notifications has to be done + if( iActionUi ) + { + delete iActionUi; + iActionUi = NULL; + } + + if( iNotifier ) + { + delete iNotifier; + iNotifier = NULL; + } + + if( iViewManager ) + { + delete iViewManager; + iViewManager = NULL; + } + + if( iCustomisationManager ) + { + delete iCustomisationManager; + iCustomisationManager = NULL; + } + Dll::SetTls( NULL ); TRACE_EXIT_POINT; } @@ -464,7 +543,7 @@ { TRACE_ENTRY_POINT; QDateTime focusTime = mContext->defaultCalTimeForViewsL(); - mContext->setFocusDateAndTimeL(focusTime,KCalenDayViewUidValue ); + mContext->setFocusDateAndTime(focusTime); TRACE_EXIT_POINT; } @@ -519,13 +598,10 @@ if (iIsFromServiceFrmWrk) { // Set the context properly - mContext->setFocusDateAndTimeL(dateTime,KCalenMonthViewUidValue); + mContext->setFocusDateAndTime(dateTime); // launch the appropriate view iViewManager->constructAndActivateView(view); - // Construct other views - iViewManager->constructOtherViews(); - } else { // Calendar was in backgroung but now its being brought to foreground // If current state is editing state or printing state // or deleting state or sending state, then dont do anything as @@ -538,7 +614,7 @@ // simply return - we dont have anything to do } else { // Set the context properly - mContext->setFocusDateAndTimeL(dateTime,KCalenMonthViewUidValue); + mContext->setFocusDateAndTime(dateTime); IssueCommandL(view); } } @@ -559,4 +635,26 @@ } +// ---------------------------------------------------------------------------- +// CCalenController::eventFilter +// Filters and handles the changes in events +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +bool CCalenController::eventFilter(QObject *object, QEvent *event) +{ + switch (event->type()) + { + case QEvent::LanguageChange: + //TODO: Unload the translator and install the locale specific translator + iNotifier->BroadcastNotification( ECalenNotifySystemLanguageChanged ); + break; + case QEvent::LocaleChange: + // TODO: handle the locale changes + break; + default: + break; + } + return QObject::eventFilter(object, event); +} // End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/src/calendeleteui.cpp --- a/calendarui/controller/src/calendeleteui.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/controller/src/calendeleteui.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -29,13 +30,11 @@ // User includes #include "calendarui_debug.h" #include "calendeleteui.h" -#include "hb_calencommands.hrh" #include "calencontext.h" #include "calencontroller.h" #include "CleanupResetAndDestroy.h" #include "caleninstanceid.h" #include "calenactionuiutils.h" -#include "CalendarPrivateCRKeys.h" // includes CalendarInternalCRKeys.h #include "calendateutils.h" #include "calenagendautils.h" @@ -139,28 +138,35 @@ { TRACE_ENTRY_POINT; TBool continueCommand(EFalse); - + switch( aCommand.Command() ) { case ECalenDeleteCurrentEntry: - - DeleteCurrentEntryL(); // Entry & instance + mDeleteCommand = ECalenDeleteCurrentEntry; + DeleteCurrentEntryL(); // Entry & instance break; case ECalenDeleteSeries: - DeleteThisOrAllL( AgendaUtil::ThisAndAll ); + mDeleteCommand = ECalenDeleteSeries; + DeleteThisOrAllL( AgendaUtil::ThisAndAll ); break; case ECalenDeleteCurrentOccurrence: - DeleteThisOrAllL( AgendaUtil::ThisOnly ); + mDeleteCommand = ECalenDeleteCurrentOccurrence; + DeleteThisOrAllL( AgendaUtil::ThisOnly ); break; case ECalenDeleteEntryWithoutQuery: - continueCommand = DeleteEntryWithoutQueryL(); + //TODO: + // This case is not handled currently as no such commands + // has been issued. So this has to be handled once we start + // issuing the command. + /*continueCommand = DeleteEntryWithoutQueryL();*/ break; case ECalenDeleteAllEntries: - DeleteAllEntriesL(); // EntryView & instance + mDeleteCommand = ECalenDeleteAllEntries; + DeleteAllEntriesL(); // EntryView & instance break; case ECalenDeleteEntriesBeforeDate: @@ -186,26 +192,21 @@ // ---------------------------------------------------------------------------- // void CalenDeleteUi::DeleteThisOrAllL( AgendaUtil::RecurrenceRange aRepeatType ) - { - TRACE_ENTRY_POINT; - - bool isDeleted( false ); - - if( iController.context().instanceId().mEntryLocalUid ) - { - AgendaEntry instance = - CalenActionUiUtils::findPossibleInstanceL(iController.context().instanceId(), - iController.Services().agendaInterface() ); - if( !instance.isNull() ) - { - isDeleted = DeleteSingleInstanceL( instance, aRepeatType ); - } - } - iController.BroadcastNotification( isDeleted? ECalenNotifyEntryDeleted : - ECalenNotifyDeleteFailed ); - - TRACE_EXIT_POINT; - } +{ + TRACE_ENTRY_POINT; + + if( iController.context().instanceId().mEntryLocalUid ) + { + AgendaEntry instance = CalenActionUiUtils::findPossibleInstanceL( + iController.context().instanceId(), + iController.Services().agendaInterface() ); + if( !instance.isNull() ) + { + DeleteSingleInstanceL( instance, aRepeatType ); + } + } + TRACE_EXIT_POINT; +} // ---------------------------------------------------------------------------- // CalenDeleteUi::DeleteEntryWithoutQueryL() @@ -228,7 +229,7 @@ if(!iMoreEntriesToDelete) { - iDisplayQuery = ShowMultipleEntriesDeleteQueryL(iMutlipleContextIdsCount); + //iDisplayQuery = ShowMultipleEntriesDeleteQueryL(iMutlipleContextIdsCount); } if(iDisplayQuery) @@ -290,47 +291,34 @@ // void CalenDeleteUi::DeleteCurrentEntryL() { - TRACE_ENTRY_POINT; + TRACE_ENTRY_POINT; - bool deleted( false ); - TCalenNotification notification = ECalenNotifyDeleteFailed; - - // Make sure we're focused on an entry. - if (iController.context().instanceId().mEntryLocalUid) { - // Fetch the entry - AgendaEntry entry = iController.Services().agendaInterface()->fetchById( - iController.context().instanceId().mEntryLocalUid); - - // Check if the entry is a To-Do - if (AgendaEntry::TypeTodo == entry.type()) { - if(!entry.isNull()) { - deleted = DeleteEntryL(entry); - if(deleted) { - // Delete is successful - notification = ECalenNotifyEntryDeleted; - } - } - } - else { - if (entry.isRepeating() || !entry.recurrenceId().isNull()) { - // Show a confirmation note whether the user - // wants to delete the single instance or all of them - showRepeatingEntryDeleteQuery(); - } else { - // If the entry is not a repeating entry, - // delete it directly - deleted = DeleteEntryL(entry); - if (deleted) { - // Delete is successful - notification = ECalenNotifyEntryDeleted; - } - } - } - } - - iController.BroadcastNotification( notification ); - - TRACE_EXIT_POINT; + // Make sure we're focused on an entry. + if (iController.context().instanceId().mEntryLocalUid) { + // Fetch the entry + AgendaEntry entry = iController.Services().agendaInterface()->fetchById( + iController.context().instanceId().mEntryLocalUid); + // Check if the entry is a To-Do + if (AgendaEntry::TypeTodo == entry.type()) { + showDeleteQuery(EDeleteToDo); + } else { + // Show the repeat entry delete query for repeating entries except Anniversary + // Even though the anniversary is repeating + // all the instances will be deleted + if ((entry.isRepeating() || !entry.recurrenceId().isNull()) + && (AgendaEntry::TypeAnniversary != entry.type())) { + // Show a confirmation note whether the user + // wants to delete the single instance or all of them + showRepeatingEntryDeleteQuery(); + } else { + // If the entry is not a repeating entry, + // delete it directly + // Save the entry for later reference in the slot + showDeleteQuery(EDeleteEntry); + } + } + } + TRACE_EXIT_POINT; } // ---------------------------------------------------------------------------- @@ -341,24 +329,12 @@ // void CalenDeleteUi::DeleteAllEntriesL() { - TRACE_ENTRY_POINT; - - ASSERT( !iIsDeleting ); + if(iIsDeleting) { + return; + } - const int buttonId = CalenActionUiUtils::showDeleteConfirmationQueryL( - CalenActionUiUtils::EDeleteAll ); - if( buttonId ) - { - HandleDeleteMultipleEventsL( AgendaUtil::minTime(), AgendaUtil::maxTime(),1 ); - } - else - { - // notify delete failed - iController.BroadcastNotification(ECalenNotifyDeleteFailed); - } - - TRACE_EXIT_POINT; - } + showDeleteQuery(EDeleteAll ); + } // ---------------------------------------------------------------------------- // CalenDeleteUi::DeleteEntriesBeforeDateL @@ -369,63 +345,102 @@ void CalenDeleteUi::DeleteEntriesBeforeDateL() { TRACE_ENTRY_POINT; - - ASSERT( !iIsDeleting ); - - TCalenNotification notification = ECalenNotifyDeleteFailed; - + if(iIsDeleting) { + return; + } // launch the datepicker - mIsDateValid = false; dateQuery(); - - if( mIsDateValid ) - { - // Do delete only if inputted day is after beginning of range - if( mDateTime > AgendaUtil::minTime() ) - { - // Two pass delete: - // 1. pass - // To prevent destroying entries starting and ending midnight - // subtract one second and do delete on that range. - mDateTime = mDateTime.addSecs(-1); - mDateTime = ( mDateTime > AgendaUtil::minTime()? mDateTime : AgendaUtil::minTime()); - - HandleDeleteMultipleEventsL( AgendaUtil::minTime(), - mDateTime,1 ); - notification = ECalenNotifyMultipleEntriesDeleted; - } - } - - iController.BroadcastNotification( notification ); TRACE_EXIT_POINT; } - + +// ---------------------------------------------------------------------------- +// CalenDeleteUi::dateQuery +// Launches the popup for the date selection +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// void CalenDeleteUi::dateQuery() { // Create a popup with datepicker to select the date. + HbDialog *popUp = new HbDialog(); + popUp->setDismissPolicy(HbDialog::NoDismiss); + popUp->setTimeout(HbDialog::NoTimeout ); + popUp->setAttribute( Qt::WA_DeleteOnClose, true ); + popUp->setHeadingWidget(new HbLabel(hbTrId("txt_calendar_title_set_date"))); + QDateTime currentDateTime(CalenDateUtils::today()); QDate currentDate(currentDateTime.date()); - mDatePicker = new HbDateTimePicker(currentDate); + if(mDatePicker) { + mDatePicker = NULL; + } + mDatePicker = new HbDateTimePicker(popUp); mDatePicker->setMinimumDate(CalenDateUtils::minTime().date()); mDatePicker->setMaximumDate(currentDate); - HbDialog popUp; - popUp.setDismissPolicy(HbDialog::NoDismiss); - popUp.setTimeout(HbDialog::NoTimeout ); - popUp.setHeadingWidget(new HbLabel(hbTrId("txt_calendar_title_set_date"))); - popUp.setContentWidget(mDatePicker); - HbAction *okAction = new HbAction(hbTrId("txt_calendar_button_dialog_delete")); - popUp.setPrimaryAction(okAction); - connect(okAction,SIGNAL(triggered()),this,SLOT(getSelectedDate())); - connect(okAction,SIGNAL(triggered()),&popUp,SLOT(close())); - popUp.setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"),&popUp)); - popUp.exec(); + mDatePicker->setDate(currentDate); + + popUp->setContentWidget(mDatePicker); + mDeleteAction = new HbAction( + hbTrId("txt_calendar_button_dialog_delete"), popUp); + popUp->addAction(mDeleteAction); + mCancelAction = new HbAction(hbTrId("txt_common_button_cancel"),popUp); + popUp->addAction(mCancelAction); + // Show the popup + popUp->open(this, SLOT(handleDateQuery(HbAction*))); } +// ---------------------------------------------------------------------------- +// CalenDeleteUi::handleDateQuery +// Handles the selection for the date query +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CalenDeleteUi::handleDateQuery(HbAction* action) +{ + if(action == mDeleteAction) { + // User selected the date before which all the entries has to be deleted + QDate selectedDate(mDatePicker->date()); + // Check if the date is within the range. + if(selectedDate.isValid()) { + QTime time(0,0,0,0); + QDateTime dateTime; + dateTime.setDate(selectedDate); + dateTime.setTime(time); + // Do delete only if inputted day is after beginning of range + if(dateTime > AgendaUtil::minTime()) { + // Two pass delete: + // 1. pass + // To prevent destroying entries starting and ending midnight + // subtract one second and do delete on that range. + dateTime = dateTime.addSecs(-1); + dateTime = ( dateTime > AgendaUtil::minTime()? + dateTime : AgendaUtil::minTime()); + + HandleDeleteMultipleEventsL( AgendaUtil::minTime(), + dateTime, 1); + }else { + iController.BroadcastNotification(ECalenNotifyDeleteFailed); + } + } + }else { + // User pressed cancel + handleDeleteCancel(); + } + // Reset the member variables + mDeleteAction = NULL; + mCancelAction = NULL; +} +// ---------------------------------------------------------------------------- +// CalenDeleteUi::showRepeatingEntryDeleteQuery +// Launches the popup for deleting the repeating entry +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// void CalenDeleteUi::showRepeatingEntryDeleteQuery() { - HbDialog popUp; - popUp.setDismissPolicy(HbDialog::NoDismiss); - popUp.setTimeout(HbDialog::NoTimeout); + HbDialog *popUp = new HbDialog(); + popUp->setDismissPolicy(HbDialog::NoDismiss); + popUp->setTimeout(HbDialog::NoTimeout); + popUp->setAttribute( Qt::WA_DeleteOnClose, true ); QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical); HbWidget *editWidget = new HbWidget(); @@ -441,61 +456,188 @@ layout->addItem(editButtonList); - popUp.setContentWidget(editWidget); - popUp.setHeadingWidget(new HbLabel( + popUp->setContentWidget(editWidget); + popUp->setHeadingWidget(new HbLabel( hbTrId("txt_calendar_title_delete_repeated_entry"))); - connect(editButtonList, SIGNAL(itemSelected(int)), this, - SLOT(handleRepeatedEntryDelete(int))); - connect(editButtonList, SIGNAL(itemSelected(int)), &popUp, SLOT(close())); - - // Create secondary action + // Add cancel action HbAction *cancelAction = new HbAction( hbTrId("txt_calendar_button_softkey1_cancel")); - popUp.setSecondaryAction(cancelAction); - connect(cancelAction, SIGNAL(triggered()), this, SLOT(handleCancel())); - connect(cancelAction, SIGNAL(triggered()), &popUp, SLOT(close())); + popUp->addAction(cancelAction); + connect(editButtonList, SIGNAL(itemSelected(int)), this, + SLOT(handleRepeatedEntryDelete(int))); + connect(editButtonList, SIGNAL(itemSelected(int)), popUp, SLOT(close())); + connect(cancelAction, SIGNAL(triggered()), this, + SLOT(handleDeleteCancel())); // Show the popup - popUp.exec(); + popUp->open(); } -void CalenDeleteUi::getSelectedDate() - { - QDate selectedDate(mDatePicker->date()); - - // Check if the date is within the range. - if(selectedDate.isValid()) - { - QTime time(0,0,0,0); - mDateTime.setDate(selectedDate); - mDateTime.setTime(time); - mIsDateValid = true; - } - } +// ---------------------------------------------------------------------------- +// CalenDeleteUi::handleDeleteCancel +// Handles the cancel action +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CalenDeleteUi::handleDeleteCancel() +{ + iController.BroadcastNotification(ECalenNotifyDeleteFailed); +} void CalenDeleteUi::handleRepeatedEntryDelete(int index) { - // Fetch the entry - // Find all possible instances - AgendaEntry instance = CalenActionUiUtils::findPossibleInstanceL( - iController.context().instanceId(), - iController.Services().agendaInterface()); + // Fetch the entry + // Find all possible instances + AgendaEntry instance = CalenActionUiUtils::findPossibleInstanceL( + iController.context().instanceId(), + iController.Services().agendaInterface()); + + if (!instance.isNull()) { + connect(iController.Services().agendaInterface(), + SIGNAL(entryDeleted(ulong)), + this, SLOT(entryDeleted(ulong))); + switch(index) { + case 0: + // User wants to delete only this occurence + iController.Services().agendaInterface()->deleteRepeatedEntry( + instance, AgendaUtil::ThisOnly); + break; + case 1: + // User wants to delete all the occurences + iController.Services().agendaInterface()->deleteRepeatedEntry( + instance, AgendaUtil::ThisAndAll); + break; + } + } +} - if (!instance.isNull()) { - connect(iController.Services().agendaInterface(), SIGNAL(entryDeleted(ulong)), - this, SLOT(entryDeleted(ulong))); - switch(index) { - case 0: - // User wants to delete only this occurence - iController.Services().agendaInterface()->deleteRepeatedEntry(instance, AgendaUtil::ThisOnly); - break; - case 1: - // User wants to delete all the occurences - iController.Services().agendaInterface()->deleteRepeatedEntry(instance, AgendaUtil::ThisAndAll); - break; +// ---------------------------------------------------------------------------- +// CalenDeleteUi::showDeleteQuery +// Launches the popup for deleting the instance/instances +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CalenDeleteUi::showDeleteQuery(const TDeleteConfirmationType type, + const int count) + { + HbMessageBox *popup = new HbMessageBox(HbMessageBox::MessageTypeQuestion); + popup->setDismissPolicy(HbDialog::NoDismiss); + popup->setTimeout(HbDialog::NoTimeout); + popup->setAttribute( Qt::WA_DeleteOnClose, true ); + + QString text = 0; + + switch(type) + { + case EDeleteEntry: + { + text.append(hbTrId("txt_calendar_info_delete_meeting")); + break; + } + case EDeleteToDo: + { + text.append(hbTrId("txt_calendar_info_delete_todo_note")); + break; + } + case EDeleteToDos: + {//"Delete %N to-do notes?" + // TODO: Add the text id + text.append("Delete %N to-do's?").arg(count); + break; + } + case EDeleteAll: + { + text.append(hbTrId("txt_calendar_info_delete_all_calendar_entries")); + break; + } + default: + break; + } + + popup->setText(text); + + QList list = popup->actions(); + for(int i=0; i < list.count(); i++) + { + popup->removeAction(list[i]); } + mDeleteAction = new HbAction( + hbTrId("txt_calendar_button_dialog_delete"), popup); + popup->addAction(mDeleteAction); + mCancelAction = new HbAction(hbTrId("txt_calendar_button_cancel"), popup); + popup->addAction(mCancelAction); + popup->open(this, SLOT(handleDeletion(HbAction*))); } + +// ---------------------------------------------------------------------------- +// CalenDeleteUi::handleDeletion +// Deletes the entries based on the user selection +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CalenDeleteUi::handleDeletion(HbAction* action) +{ + TCalenNotification notification = ECalenNotifyDeleteFailed; + + if(action == mDeleteAction) { + + switch (mDeleteCommand) { + + case ECalenDeleteCurrentEntry: + { + // Get the entry id + ulong id = iController.context().instanceId().mEntryLocalUid; + connect(iController.Services().agendaInterface(), + SIGNAL(entryDeleted(ulong)), + this, SLOT(entryDeleted(ulong))); + // Delete the entry if the delete button is been pressed + iController.Services().agendaInterface()->deleteEntry(id); + } + break; + + case ECalenDeleteSeries: + case ECalenDeleteCurrentOccurrence: + { + AgendaEntry instance = + CalenActionUiUtils::findPossibleInstanceL( + iController.context().instanceId(), + iController.Services().agendaInterface() ); + if(!instance.isNull()) { + QDateTime recId = instance.recurrenceId().toUTC(); + const bool child = recId.isNull(); + connect(iController.Services().agendaInterface(), + SIGNAL(entryDeleted(ulong)), + this, SLOT(entryDeleted(ulong))); + if( !child || mRecurrenceRange == AgendaUtil::ThisOnly + || mRecurrenceRange == AgendaUtil::ThisAndAll) { + iController.Services().agendaInterface()->deleteRepeatedEntry( + instance, mRecurrenceRange ); + } + } + } + break; + + case ECalenDeleteAllEntries: + { + HandleDeleteMultipleEventsL( AgendaUtil::minTime(), + AgendaUtil::maxTime(),1 ); + } + break; + + default: + break; + + } + } + // If the user presses cancel button the notification will be + // ECalenNotifyDeleteFailed as default. + // Notify the status + iController.BroadcastNotification(notification); + + // Reset the member variables + mDeleteAction = NULL; + mCancelAction = NULL; } void CalenDeleteUi::entryDeleted(ulong id) @@ -518,9 +660,10 @@ int aConfNoteId ) { TRACE_ENTRY_POINT; - - ASSERT( !iIsDeleting ); + if(iIsDeleting) { + return; + } iConfirmationNoteId = aConfNoteId; DeleteDayRangeL( aFirstDay, aLastDay ); @@ -618,7 +761,7 @@ // for CCalEntry type. // First check that if _instance_ ends at midnight, but starts earlier - if( CalenAgendaUtils::endsAtStartOfDayL( entry, aMidnight ) ) + if( CalenAgendaUtils::endsAtStartOfDay( entry, aMidnight ) ) { // Second, check that _entry's_ endtime is exactly the midnight // This prevents us from destroying repeating entries, that has one @@ -639,11 +782,11 @@ // (other items were commented in a header). // ----------------------------------------------------------------------------- // -TBool CalenDeleteUi::DeleteSingleInstanceL( AgendaEntry& aInstance ) +void CalenDeleteUi::DeleteSingleInstanceL( AgendaEntry& aInstance ) { TRACE_ENTRY_POINT; + DoDeleteSingleInstanceL( aInstance, EFalse, AgendaUtil::ThisAndAll ); TRACE_EXIT_POINT; - return DoDeleteSingleInstanceL( aInstance, EFalse, AgendaUtil::ThisAndAll ); } // ----------------------------------------------------------------------------- @@ -652,12 +795,13 @@ // (other items were commented in a header). // ----------------------------------------------------------------------------- // -TBool CalenDeleteUi::DeleteSingleInstanceL( AgendaEntry& aInstance, +void CalenDeleteUi::DeleteSingleInstanceL( AgendaEntry& aInstance, AgendaUtil::RecurrenceRange aRepeatType ) { TRACE_ENTRY_POINT; + DoDeleteSingleInstanceL( aInstance, ETrue, aRepeatType ); TRACE_EXIT_POINT; - return DoDeleteSingleInstanceL( aInstance, ETrue, aRepeatType ); + } // ----------------------------------------------------------------------------- @@ -669,107 +813,42 @@ // (other items were commented in a header). // ----------------------------------------------------------------------------- // -TBool CalenDeleteUi::DoDeleteSingleInstanceL( AgendaEntry& aInstance, - bool aHasRepeatType, - AgendaUtil::RecurrenceRange aRepeatType ) - { - TRACE_ENTRY_POINT; - - bool repeating = aInstance.isRepeating(); - - if( !repeating ) - { - // Even though there is no RRule, the entry might - // have a list of rdates. - QList rDates = aInstance.rDates(); - repeating = ( rDates.count() > 0 ); - } - QDateTime recId = aInstance.recurrenceId().toUTC(); - const bool child = recId.isNull(); - - if( !aHasRepeatType ) - { - aRepeatType = AgendaUtil::ThisAndAll; - } +void CalenDeleteUi::DoDeleteSingleInstanceL( + AgendaEntry& aInstance, + bool aHasRepeatType, + AgendaUtil::RecurrenceRange aRepeatType ) +{ + TRACE_ENTRY_POINT; + bool repeating = aInstance.isRepeating(); - bool doDelete( ETrue ); - - if( !aHasRepeatType && ( child || repeating ) && ( aInstance.type() != AgendaEntry::TypeAnniversary ) ) - { - //doDelete = CalenActionUiUtils::ShowRepeatTypeQueryL( aRepeatType, - // CalenActionUiUtils::EDelete ); - } - else - { - doDelete = CalenActionUiUtils::showDeleteConfirmationQueryL(aInstance.type() == AgendaEntry::TypeTodo ? - CalenActionUiUtils::EDeleteToDo : - CalenActionUiUtils::EDeleteEntry ); - } - - if( doDelete ) - { - if( !child || aRepeatType == AgendaUtil::ThisOnly ) - { - iController.Services().agendaInterface()->deleteRepeatedEntry( aInstance, aRepeatType ); - } - else if( aRepeatType == AgendaUtil::ThisAndAll ) - { - iController.Services().agendaInterface()->deleteRepeatedEntry( aInstance, aRepeatType ); - } - } + if( !repeating ) { + // Even though there is no RRule, the entry might + // have a list of rdates. + QList rDates = aInstance.rDates(); + repeating = ( rDates.count() > 0 ); + } + QDateTime recId = aInstance.recurrenceId().toUTC(); + const bool child = recId.isNull(); - TRACE_EXIT_POINT; - return doDelete; - } - -// ----------------------------------------------------------------------------- -// CalenDeleteUi::DeleteEntryL -// Deletes an entry from the database -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -TBool CalenDeleteUi::DeleteEntryL( AgendaEntry& entry ) - { - TRACE_ENTRY_POINT; - - TBool doDelete = CalenActionUiUtils::showDeleteConfirmationQueryL(entry.type() == AgendaEntry::TypeTodo ? - CalenActionUiUtils::EDeleteToDo : - CalenActionUiUtils::EDeleteEntry ); - - if( doDelete ) - { - iController.Services().agendaInterface()->deleteEntry(entry.id()); - } + if( !aHasRepeatType ) { + aRepeatType = AgendaUtil::ThisAndAll; + } + // For later reference in handleDeletion() + mRecurrenceRange = aRepeatType; - TRACE_EXIT_POINT; - return doDelete; - } - -// ----------------------------------------------------------------------------- -// CalenDeleteUi::ShowMultipleEntriesDeleteQueryL -// For displaying multiple entries deletion confirmation query -// ----------------------------------------------------------------------------- -// -TInt CalenDeleteUi::ShowMultipleEntriesDeleteQueryL(int aCount) + if( !aHasRepeatType && ( child || repeating ) && + ( aInstance.type() != AgendaEntry::TypeAnniversary ) ) { + showRepeatingEntryDeleteQuery(); + } + else { - TRACE_ENTRY_POINT; - if( aCount > 1 ) - { - TRACE_EXIT_POINT; - return CalenActionUiUtils::showDeleteConfirmationQueryL(CalenActionUiUtils::EDeleteToDos, aCount ); - } - else if( aCount == 1 ) - { - TRACE_EXIT_POINT; - return CalenActionUiUtils::showDeleteConfirmationQueryL(CalenActionUiUtils::EDeleteToDo); - } - else - { - TRACE_EXIT_POINT; - return 0; //return 0 for other invalid aCount value ( < 0 ) - } - + showDeleteQuery(aInstance.type() == AgendaEntry::TypeTodo ? + EDeleteToDo : + EDeleteEntry ); } + TRACE_EXIT_POINT; +} + // ----------------------------------------------------------------------------- // CalenDeleteUi::DialogDismissedL diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/src/calendocloader.cpp --- a/calendarui/controller/src/calendocloader.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/controller/src/calendocloader.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -18,14 +18,15 @@ // User includes #include "calendocloader.h" -#include "calendayview.h" -#include "calendayviewwidget.h" +#include "calenagendaview.h" +#include "calenagendaviewwidget.h" #include "calenmonthview.h" #include "calenmonthgrid.h" #include "calenpreviewpane.h" #include "calencontroller.h" #include "calenthicklinesdrawer.h" #include "calencommon.h" +#include "calenpluginlabel.h" // ---------------------------------------------------------------------------- // CalenDocLoader::CalenDocLoader @@ -62,14 +63,14 @@ const QString &name) { MCalenServices &services = mController.Services(); - if (name == QString(CALEN_DAYVIEW)) { - QObject *calenDayView = new CalenDayView(services); - calenDayView->setObjectName(name); - return calenDayView; - } else if (name == QString(CALEN_DAYVIEW_WIDGET)) { - QObject *calenDayViewWidget = new CalenDayViewWidget(services, this); - calenDayViewWidget->setObjectName(name); - return calenDayViewWidget; + if (name == QString(CALEN_AGENDAVIEW)) { + QObject *calenAgendaView = new CalenAgendaView(services); + calenAgendaView->setObjectName(name); + return calenAgendaView; + } else if (name == QString(CALEN_AGENDAVIEW_WIDGET)) { + QObject *calenAgendaViewWidget = new CalenAgendaViewWidget(services, this); + calenAgendaViewWidget->setObjectName(name); + return calenAgendaViewWidget; } else if (name == QString(CALEN_MONTHVIEW)) { // For Month View QObject *calenMonthView = new CalenMonthView(services); calenMonthView->setObjectName(name); @@ -80,17 +81,17 @@ return calenMonthGrid; } else if(name == QString(CALEN_PREVPREVIEWPANE)) { QObject *prevPreviewPane = - new CalenPreviewPane(mController.Services()); + new CalenPreviewPane(services); prevPreviewPane->setObjectName(name); return prevPreviewPane; } else if(name == QString(CALEN_CURRPREVIEWPANE)) { QObject *currPreviewPane = - new CalenPreviewPane(mController.Services()); + new CalenPreviewPane(services); currPreviewPane->setObjectName(name); return currPreviewPane; } else if(name == QString(CALEN_NEXTPREVIEWPANE)) { QObject *nextPreviewPane = - new CalenPreviewPane(mController.Services()); + new CalenPreviewPane(services); nextPreviewPane->setObjectName(name); return nextPreviewPane; } else if (name == QString(CALEN_DAYNAMES_WIDGET)) { @@ -103,7 +104,19 @@ new CalenThickLinesDrawer(CalendarNamespace::CalenWeekNumWidget); calenSWeekNumWidget->setObjectName(name); return calenSWeekNumWidget; - } else { + } else if (name == QString(CALEN_PREVREGIONALINFO)) { + QObject *calenPrevRegionalLabel = new CalenPluginLabel(services); + calenPrevRegionalLabel->setObjectName(name); + return calenPrevRegionalLabel; + } else if (name == QString(CALEN_CURRREGIONALINFO)) { + QObject *calencurrRegionalLabel = new CalenPluginLabel(services); + calencurrRegionalLabel->setObjectName(name); + return calencurrRegionalLabel; + } else if (name == QString(CALEN_NEXTREGIONALINFO)) { + QObject *calenNextRegionalLabel = new CalenPluginLabel(services); + calenNextRegionalLabel->setObjectName(name); + return calenNextRegionalLabel; + } else { return HbDocumentLoader::createObject(type, name); } } diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/src/caleneditui.cpp --- a/calendarui/controller/src/caleneditui.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/controller/src/caleneditui.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -56,7 +56,7 @@ CCalenEditUi::~CCalenEditUi() { TRACE_ENTRY_POINT; - + iController.CancelNotifications(this); TRACE_EXIT_POINT; } @@ -102,7 +102,7 @@ TInt command = aCommand.Command(); MCalenContext& context = iController.Services().Context(); AgendaEntry editedEntry; - QDateTime newEntryDateTime = iController.context().focusDateAndTimeL(); + QDateTime newEntryDateTime = iController.context().focusDateAndTime(); // Check if it is not on same day and set the default time and date accordingly. bool isSameDay = CalenDateUtils::isOnToday(newEntryDateTime); @@ -122,15 +122,17 @@ context.instanceId().mEntryLocalUid ); // For repeating entry, we need to update proper start time here // from the context - if (editedEntry.isRepeating()) { - // Get the instancde time frm the context - QDateTime instanceTime = context.focusDateAndTimeL(); - editedEntry.setStartAndEndTime(instanceTime, editedEntry.endTime()); + if(!editedEntry.isNull()) { + if (editedEntry.isRepeating()) { + // Get the instancde time frm the context + QDateTime instanceTime = context.focusDateAndTime(); + editedEntry.setStartAndEndTime(instanceTime, editedEntry.endTime()); + } + iEditor= new CalenEditor(iController.Services().agendaInterface()); + iEditor->edit(editedEntry, false); + connect(iEditor, SIGNAL(entrySaved()), this, SLOT(handleEntrySaved())); + connect(iEditor, SIGNAL(dialogClosed()), this, SLOT(handleDialogClosed())); } - iEditor= new CalenEditor(iController.Services().agendaInterface()); - iEditor->edit(editedEntry, false); - connect(iEditor, SIGNAL(entrySaved()), this, SLOT(handleEntrySaved())); - connect(iEditor, SIGNAL(dialogClosed()), this, SLOT(handleDialogClosed())); break; default: // Controller decided this class was the place to handle this diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/src/calenidlestate.cpp --- a/calendarui/controller/src/calenidlestate.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/controller/src/calenidlestate.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -96,8 +96,8 @@ switch( cmd ) { case ECalenMonthView: - case ECalenWeekView: case ECalenDayView: + case ECalenAgendaView: case ECalenStartActiveStep: { // set previous state to idle diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/src/calensettingsstate.cpp --- a/calendarui/controller/src/calensettingsstate.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/controller/src/calensettingsstate.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -103,8 +103,8 @@ } break; case ECalenMonthView: + case ECalenAgendaView: case ECalenDayView: - case ECalenLandscapeDayView: case ECalenStartActiveStep: { // set previous state to idle @@ -151,6 +151,11 @@ ActivateCurrentStateL(aStateMachine); } break; + case ECalenNotifySystemLocaleChanged: + { + CCalenState::HandleNotificationL( aNotification, aStateMachine ); + } + break; default: // default is defer all other notifications when we are in setting state iOutstandingNotifications.InsertL(aNotification); diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/src/calenstatemachine.cpp --- a/calendarui/controller/src/calenstatemachine.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/controller/src/calenstatemachine.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -156,12 +156,8 @@ { TRACE_ENTRY_POINT; - TRAPD(error,iStates[iCurrentState]->HandleNotificationL( aNotification, *this)); - if(error!=KErrNone) - { - // do avoid warning - } - + TRAP_IGNORE(iStates[iCurrentState]->HandleNotificationL( aNotification, *this)); + TRACE_EXIT_POINT; } diff -r fd30d51f876b -r b6db4fd4947b calendarui/controller/src/calenviewmanager.cpp --- a/calendarui/controller/src/calenviewmanager.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/controller/src/calenviewmanager.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -17,8 +17,10 @@ //system includes -#include #include +#include +#include // hbapplication +#include // service utils //user includes #include "calenviewmanager.h" @@ -26,7 +28,7 @@ #include "hb_calencommands.hrh" #include "calenservicesimpl.h" #include "calenmonthview.h" -#include "calendayview.h" +#include "calenagendaview.h" #include "calenmonthview.h" #include "agendaeventviewer.h" #include "calennotificationhandler.h" @@ -36,6 +38,7 @@ #include "calendocloader.h" #include "calendarui_debug.h" #include "calencommon.h" +#include "calendayview.h" // ---------------------------------------------------------------------------- // CalenViewManager::CalenViewManager @@ -43,41 +46,108 @@ // (other items were commented in a header). // ---------------------------------------------------------------------------- // -CalenViewManager::CalenViewManager( CCalenController& aController, - bool isFromServiceFrmwrk) +CalenViewManager::CalenViewManager( CCalenController& aController) : mController(aController) { TRACE_ENTRY_POINT; + // Following block intializes member variables mCalenEventViewer = NULL; mMonthViewDocLoader = NULL; - mDayViewDocLoader = NULL; - mDayViewAltDocLoader = NULL; - - mController.MainWindow().setItemVisible(Hb::NaviPaneItem, false); + mAgendaViewDocLoader = NULL; + mAgendaViewAltDocLoader = NULL; + mCalenAgendaView = NULL; + mCalenMonthView = NULL; + mCalenAgendaViewAlt = NULL; + mSettingsView = NULL; + mCalenDayView = NULL; - if (isFromServiceFrmwrk) { - // Dont load any views until our remote slot gets called in - // calenserviceprovider.cpp - // Just have an empty mainwindow - } else { - // Do the normal startup - // Load the month view and active it and add it to main window - mFirstView = ECalenMonthView; - loadMonthView(); - ActivateDefaultViewL(ECalenMonthView); - // Connect to the view ready signal so that we construct other view - // once this view is shown - connect(&mController.MainWindow(), SIGNAL(viewReady()), - this, SLOT(constructOtherViews())); - - mController.MainWindow().addView(mCalenMonthView); - mController.MainWindow().setCurrentView(mCalenMonthView); - } + // Connect to instance view and entry view creation signals from agenda + // interface + connect(mController.agendaInterface(), SIGNAL(instanceViewCreationCompleted(int)), + this, SLOT(handleInstanceViewCreation(int))); + connect(mController.agendaInterface(), SIGNAL(entryViewCreationCompleted(int)), + this, SLOT(handleEntryViewCreation(int))); TRACE_EXIT_POINT; } +void CalenViewManager::SecondPhaseConstruction() +{ + + TRACE_ENTRY_POINT; + + // Check the Application Startup reason from Activity Manager + int activityReason = qobject_cast(qApp)->activateReason(); + + // Check if calendar is launched thru XQService framework + bool isFromServiceFrmWrk = XQServiceUtil::isService(); // Since activateReason + //of hbapplication is not returning right value if the activity is started + //as services so using the above line temporarily untill a fix is available in + // hbappliacation. Need to remove this line after the fix is available for hbapplcation + + + if (Hb::ActivationReasonActivity == activityReason) // Check if application is started + // as an activity + { + // Application is started from an activity + // Extract activity data + QVariant data = qobject_cast(qApp)->activateData(); + // Restore state from activity data + QByteArray serializedModel = data.toByteArray(); + QDataStream stream(&serializedModel, QIODevice::ReadOnly); + int viewId; // int declared for debugging purpose + stream >> viewId; // read stream into an int + + mFirstView = viewId; + if (ECalenMonthView == viewId) // Check if Activity was stored for month view + { + loadMonthView(); // Load month view + } + else if (ECalenAgendaView == viewId) // Check if Activity was stored for agenda view + { + loadAgendaView(); // Load agenda view + } + + ActivateDefaultViewL(viewId); + // Connect to the view ready signal so that we can construct other views + // once this view is ready + connect(&mController.MainWindow(), SIGNAL(viewReady()), + this, SLOT(handleMainViewReady())); + + if (ECalenMonthView == viewId) // Check if Activity was stored for month view + { + mController.MainWindow().addView(mCalenMonthView); // Add month view to main window + mController.MainWindow().setCurrentView(mCalenMonthView); // Set month view as current view + } + else if (ECalenAgendaView == viewId) // Check if Activity was stored for agenda view + { + mController.MainWindow().addView(mCalenAgendaView); // Add agenda view to main window + mController.MainWindow().setCurrentView(mCalenAgendaView); // Set agenda view as current view + } + } else if (isFromServiceFrmWrk/*Hb::ActivationReasonService == activityReason*/) { + // Dont load any views until our remote slot gets called in + // calenserviceprovider.cpp + // Just have an empty mainwindow + } else { + // Do the normal startup + // Load the month view and active it and add it to main window + mFirstView = ECalenMonthView; + loadMonthView(); + ActivateDefaultViewL(ECalenMonthView); + // Connect to the view ready signal so that we construct other view + // once this view is shown + connect(&mController.MainWindow(), SIGNAL(viewReady()), + this, SLOT(handleMainViewReady())); + + mController.MainWindow().addView(mCalenMonthView); + mController.MainWindow().setCurrentView(mCalenMonthView); + } + + TRACE_EXIT_POINT; + +} + // ---------------------------------------------------------------------------- // CalenViewManager::~CalenViewManager // Destructor. @@ -88,12 +158,22 @@ { TRACE_ENTRY_POINT; - delete mCalenMonthView; - delete mCalenDayView; - delete mSettingsView; - delete mDayViewDocLoader; - delete mDayViewAltDocLoader; - delete mMonthViewDocLoader; + if (mSettingsView) { + delete mSettingsView; + mSettingsView = 0; + } + if (mAgendaViewDocLoader) { + delete mAgendaViewDocLoader; + mAgendaViewDocLoader = 0; + } + if (mAgendaViewAltDocLoader) { + delete mAgendaViewAltDocLoader; + mAgendaViewAltDocLoader = 0; + } + if (mMonthViewDocLoader) { + delete mMonthViewDocLoader; + mMonthViewDocLoader = 0; + } TRACE_EXIT_POINT; } @@ -106,18 +186,28 @@ void CalenViewManager::constructAndActivateView(int view) { TRACE_ENTRY_POINT; + // We are here because, some other application is launching calendar with + // the view, hence connect to viewReady() signal to do any lazy loading + // in the slot + + // Connect to the view ready signal so that we construct other view + // once this view is shown + connect(&mController.MainWindow(), SIGNAL(viewReady()), + this, SLOT(handleMainViewReady())); if (view == ECalenMonthView) { mFirstView = ECalenMonthView; loadMonthView(); ActivateDefaultViewL(ECalenMonthView); // Add month view to mainwindow. mController.MainWindow().addView(mCalenMonthView); - } else if (view == ECalenDayView) { - mFirstView = ECalenDayView; - loadDayView(); - ActivateDefaultViewL(ECalenDayView); - // Add day view to mainwindow. - mController.MainWindow().addView(mCalenDayView); + mController.MainWindow().setCurrentView(mCalenMonthView); + } else if (view == ECalenAgendaView) { + mFirstView = ECalenAgendaView; + loadAgendaView(); + ActivateDefaultViewL(ECalenAgendaView); + // Add agenda view to mainwindow. + mController.MainWindow().addView(mCalenAgendaView); + mController.MainWindow().setCurrentView(mCalenAgendaView); } TRACE_EXIT_POINT; } @@ -150,7 +240,7 @@ // Get the calenmonth view from the loader. mCalenMonthView = static_cast (mMonthViewDocLoader->findWidget(CALEN_MONTHVIEW)); - Q_ASSERT_X(mCalenDayView, "calenviewmanager.cpp", + Q_ASSERT_X(mCalenMonthView, "calenviewmanager.cpp", "Unable to load calenMonth view"); // Setup the month view. @@ -158,37 +248,63 @@ } // ---------------------------------------------------------------------------- -// CalenViewManager::loadDayView -// Loads the day view frm the docml +// CalenViewManager::loadAgendaView +// Loads the agenda view frm the docml // (other items were commented in a header). // ---------------------------------------------------------------------------- // -void CalenViewManager::loadDayView() +void CalenViewManager::loadAgendaView() { bool loadSuccess = false; - // Create the day view docloader object. - mDayViewDocLoader = new CalenDocLoader(mController); + // Create the agenda view docloader object. + mAgendaViewDocLoader = new CalenDocLoader(mController); // Load default section - mDayViewDocLoader->load(CALEN_DAYVIEW_XML_FILE, &loadSuccess); + mAgendaViewDocLoader->load(CALEN_AGENDAVIEW_XML_FILE, &loadSuccess); if (!loadSuccess) { qFatal("calenviewmanager.cpp : Unable to load XML"); } - // Get the calenday view from the loader - mCalenDayView = static_cast (mDayViewDocLoader->findWidget(CALEN_DAYVIEW)); - if (!mCalenDayView) { - qFatal("calenviewmanager.cpp : Unable to find day view"); + // Get the calenagenda view from the loader + mCalenAgendaView = static_cast (mAgendaViewDocLoader->findWidget(CALEN_AGENDAVIEW)); + if (!mCalenAgendaView) { + qFatal("calenviewmanager.cpp : Unable to find agenda view"); } - // Setup the day view - mCalenDayView->setupView(mDayViewDocLoader); + // Setup the agenda view + mCalenAgendaView->setupView(mAgendaViewDocLoader); // The following code is done to provide swipe support - // in day view. Idea is to create two views and keep + // in agenda view. Idea is to create two views and keep // switiching between these two using view switch effects // to provide an illusion of flow to the user - loadAlternateDayView(); + loadAlternateAgendaView(); + +} + +// ---------------------------------------------------------------------------- +// CalenViewManager::handleMainViewReady +// Slot to handle viewReady() signal from mainwindow +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CalenViewManager::handleMainViewReady() +{ + // Construct the month view part that is kept for lazy loading + if (mCalenMonthView) { + mCalenMonthView->doLazyLoading(); + } + + // Construct other views + constructOtherViews(); + + // Install the event filter for the controller once the view is ready + // so that system language/locale changes can be handled + //hbInstance->allMainWindows().first()->installEventFilter(&mController); + + // disconnect the view ready signal as we dont need it anymore + disconnect(&mController.MainWindow(), SIGNAL(viewReady()), + this, SLOT(handleMainViewReady())); } // ---------------------------------------------------------------------------- @@ -202,25 +318,32 @@ // Load all other views except mFirstView // NOTE: Right now, since Calendar has only two views, month view - // and day view, when client launches day view, then there is no need + // and agenda view, when client launches agenda view, then there is no need // to construct the month view as per UI REQ., but tomorrow if new views - // come after day view, then we need to construct those views if they are + // come after agenda view, then we need to construct those views if they are // native views. Right now, there is a event viewer but its not a native - // view. Hence, if day view is launched, dont construct month view - if (mFirstView == ECalenDayView) { - // Construct other views as mentioned above - return; - } else { + // view. Hence, if agenda view is launched, dont construct month view + if (mFirstView != ECalenAgendaView) // check if agenda view is not already loaded + { // Load all other views - loadDayView(); + loadAgendaView(); + + if (!mCalenDayView) { + mCalenDayView = new CalenDayView(mController.Services()); + } } + else //agenda view was launched as first view + { + // No implementation yet. UI specs not clear + // to be commented in with some more code once UI specs is frozen + // for agenda view launching as first view after it was saved as activity + // when it was launched from month view + // loadMonthView(); + // mCalenMonthView->doLazyLoading(); + } // Setup the settings view mSettingsView = new CalenSettingsView(mController.Services()); - - // disconnect the view ready signal as we dont need it anymore - disconnect(&mController.MainWindow(), SIGNAL(viewReady()), - this, SLOT(constructOtherViews())); } // ---------------------------------------------------------------------------- @@ -242,31 +365,35 @@ void CalenViewManager::showNextDay() { // Set the context for the next day - QDateTime currentDay = mController.Services().Context().focusDateAndTimeL(); + QDateTime currentDay = mController.Services().Context().focusDateAndTime(); currentDay = currentDay.addDays(1); - mController.Services().Context().setFocusDateL(currentDay, ECalenDayView); - mCurrentViewId = ECalenDayView; + mController.Services().Context().setFocusDate(currentDay); + mCurrentViewId = ECalenAgendaView; // Check which is the currently activated view - if (mController.MainWindow().currentView() == mCalenDayView) { - HbEffect::add(mCalenDayView, + if (mController.MainWindow().currentView() == mCalenAgendaView) { + mCalenAgendaView->disconnectAboutToQuitEvent(); // disconnect mCalenAgendaView to get aboutToQuit Events + HbEffect::add(mCalenAgendaView, ":/fxml/view_hide", "hide"); - HbEffect::add(mCalenDayViewAlt, + HbEffect::add(mCalenAgendaViewAlt, ":/fxml/view_show", "show"); - // Set the other day view as the current view + // Set the other agenda view as the current view // and animate to provide illusion of swipe - mCalenDayViewAlt->doPopulation(); - mController.MainWindow().setCurrentView(mCalenDayViewAlt, true, Hb::ViewSwitchUseNormalAnim); + // It would also connect for aboutToQuit events + mCalenAgendaViewAlt->doPopulation(); + mController.MainWindow().setCurrentView(mCalenAgendaViewAlt, true, Hb::ViewSwitchUseNormalAnim); } else { - HbEffect::add(mCalenDayViewAlt, + mCalenAgendaViewAlt->disconnectAboutToQuitEvent(); // disconnect mCalenAgendaViewAlt to get aboutToQuit Events + HbEffect::add(mCalenAgendaViewAlt, ":/fxml/view_hide", "hide"); - HbEffect::add(mCalenDayView, + HbEffect::add(mCalenAgendaView, ":/fxml/view_show", "show"); - mCalenDayView->doPopulation(); - mController.MainWindow().setCurrentView(mCalenDayView, true, Hb::ViewSwitchUseNormalAnim); + // It would also connect for aboutToQuit events + mCalenAgendaView->doPopulation(); + mController.MainWindow().setCurrentView(mCalenAgendaView, true, Hb::ViewSwitchUseNormalAnim); } } @@ -277,40 +404,55 @@ // void CalenViewManager::showPrevDay() { - QDateTime currentDay = mController.Services().Context().focusDateAndTimeL(); + QDateTime currentDay = mController.Services().Context().focusDateAndTime(); currentDay = currentDay.addDays(-1); - mController.Services().Context().setFocusDateL(currentDay, ECalenDayView); - mCurrentViewId = ECalenDayView; - if (mController.MainWindow().currentView() == mCalenDayView) { - HbEffect::add(mCalenDayView, - ":/fxml/view_show", + mController.Services().Context().setFocusDate(currentDay); + mCurrentViewId = ECalenAgendaView; + if (mController.MainWindow().currentView() == mCalenAgendaView) { + mCalenAgendaView->disconnectAboutToQuitEvent(); // disconnect mCalenAgendaView to get aboutToQuit Events + HbEffect::add(mCalenAgendaView, + ":/fxml/view_hide_back", "hide"); - HbEffect::add(mCalenDayViewAlt, - ":/fxml/view_hide", + HbEffect::add(mCalenAgendaViewAlt, + ":/fxml/view_show_back", "show"); - mCalenDayViewAlt->doPopulation(); - mController.MainWindow().setCurrentView(mCalenDayViewAlt, true, Hb::ViewSwitchUseBackAnim); + // It would also connect for aboutToQuit events + mCalenAgendaViewAlt->doPopulation(); + mController.MainWindow().setCurrentView(mCalenAgendaViewAlt, true, Hb::ViewSwitchUseNormalAnim); } else { - HbEffect::add(mCalenDayViewAlt, - ":/fxml/view_show", + mCalenAgendaViewAlt->disconnectAboutToQuitEvent(); // disconnect mCalenAgendaViewAlt to get aboutToQuit Events + HbEffect::add(mCalenAgendaViewAlt, + ":/fxml/view_hide_back", "hide"); - HbEffect::add(mCalenDayView, - ":/fxml/view_hide", + HbEffect::add(mCalenAgendaView, + ":/fxml/view_show_back", "show"); - mCalenDayView->doPopulation(); - mController.MainWindow().setCurrentView(mCalenDayView, true, Hb::ViewSwitchUseBackAnim); + // It would also connect for aboutToQuit events + mCalenAgendaView->doPopulation(); + mController.MainWindow().setCurrentView(mCalenAgendaView, true, Hb::ViewSwitchUseNormalAnim); } } // ---------------------------------------------------------------------------- -// CalenViewManager::removeDayViews -// other items were commented in a header +// CalenViewManager::removePreviousView +// Remove the previous view from main window // ---------------------------------------------------------------------------- // -void CalenViewManager::removeDayViews() +void CalenViewManager::removePreviousView() { - mController.MainWindow().removeView(mCalenDayView); - mController.MainWindow().removeView(mCalenDayViewAlt); + if (ECalenAgendaView == mCurrentViewId) { + mCalenAgendaView->clearListModel(); + mCalenAgendaViewAlt->clearListModel(); + mController.MainWindow().removeView(mCalenAgendaView); + mController.MainWindow().removeView(mCalenAgendaViewAlt); + } else if (ECalenDayView == mCurrentViewId) { + mController.MainWindow().removeView(mCalenDayView); + } else { + if (ECalenMonthView == mCurrentViewId) { + mController.MainWindow().removeView(mCalenMonthView); + } + } + } // ---------------------------------------------------------------------------- @@ -325,8 +467,8 @@ mCurrentViewId = defaultView; if (ECalenMonthView == defaultView) { mCalenMonthView->doPopulation(); - } else if (ECalenDayView == defaultView) { - mCalenDayView->doPopulation(); + } else if (ECalenAgendaView == defaultView) { + mCalenAgendaView->doPopulation(); } TRACE_EXIT_POINT; } @@ -354,30 +496,40 @@ mCalenMonthView->doPopulation(); mController.MainWindow().setCurrentView(mCalenMonthView); break; - case ECalenDayView: - if (mController.MainWindow().currentView() == mCalenDayView) { + case ECalenAgendaView: + if (mController.MainWindow().currentView() == mCalenAgendaView) { // This happens when settings view or event viewer is opened // from the agenda view. Simply repopulate the view - mCalenDayView->doPopulation(); - mController.MainWindow().setCurrentView(mCalenDayView); - } else if (mController.MainWindow().currentView() == mCalenDayViewAlt){ + if (mCalenAgendaView) { + mCalenAgendaView->doPopulation(); + mController.MainWindow().setCurrentView(mCalenAgendaView); + } + } else if (mController.MainWindow().currentView() == mCalenAgendaViewAlt){ // This happens when settings view or event viewer is opened // from the agenda view. Simply repopulate the view - mCalenDayViewAlt->doPopulation(); - mController.MainWindow().setCurrentView(mCalenDayViewAlt); + if (mCalenAgendaViewAlt) { + mCalenAgendaViewAlt->doPopulation(); + mController.MainWindow().setCurrentView(mCalenAgendaViewAlt); + } } else { - // This is called whenever the day view is opened from the month - // view. Since the day view is not added to the mainwindow, - // add the day views to mainwindow and set any one of them as + // This is called whenever the agenda view is opened from the month + // view. Since the agenda view is not added to the mainwindow, + // add the agenda views to mainwindow and set any one of them as // current view - mCalenDayView->doPopulation(); - mController.MainWindow().addView(mCalenDayView); - mController.MainWindow().setCurrentView(mCalenDayView); - mController.MainWindow().addView(mCalenDayViewAlt); + if (mCalenAgendaView) { + mCalenAgendaView->doPopulation(); + mController.MainWindow().addView(mCalenAgendaView); + mController.MainWindow().setCurrentView(mCalenAgendaView); + mController.MainWindow().addView(mCalenAgendaViewAlt); + } } break; - case ECalenLandscapeDayView: - // For later implementation + case ECalenShowSettings: + mSettingsView->refreshView(); + break; + case ECalenDayView: + mCalenDayView->doPopulation(); + mController.MainWindow().setCurrentView(mCalenDayView); break; } TRACE_EXIT_POINT; @@ -391,12 +543,19 @@ // void CalenViewManager::launchEventView() { + // capture cureent view in case app closed/quits from AgendaEventViewer + if (mCalenMonthView) { + mCalenMonthView->captureScreenshot(true); + } + else if (mCalenAgendaView) { + mCalenAgendaView->captureScreenshot(true); + } MCalenContext& context = mController.Services().Context(); AgendaEntry viewEntry= mController.Services().agendaInterface()->fetchById( context.instanceId().mEntryLocalUid ); if (viewEntry.isRepeating() && viewEntry.type() != AgendaEntry::TypeTodo) { - QDateTime startDateTime = context.focusDateAndTimeL(); + QDateTime startDateTime = context.focusDateAndTime(); viewEntry.setStartAndEndTime(startDateTime, startDateTime.addSecs(viewEntry.durationInSecs())); } @@ -419,30 +578,30 @@ } // ---------------------------------------------------------------------------- -// CalenViewManager::loadAlternateDayView +// CalenViewManager::loadAlternateAgendaView // other items were commented in a header // ---------------------------------------------------------------------------- // -void CalenViewManager::loadAlternateDayView() +void CalenViewManager::loadAlternateAgendaView() { bool loadSuccess = false; - // Create the day view docloader object. - mDayViewAltDocLoader = new CalenDocLoader(mController); + // Create the agenda view docloader object. + mAgendaViewAltDocLoader = new CalenDocLoader(mController); // Load default section - mDayViewAltDocLoader->load(CALEN_DAYVIEW_XML_FILE, &loadSuccess); + mAgendaViewAltDocLoader->load(CALEN_AGENDAVIEW_XML_FILE, &loadSuccess); if (!loadSuccess) { qFatal("calenviewmanager.cpp : Unable to load XML"); } - // Get the calenday view from the loader - mCalenDayViewAlt = static_cast (mDayViewAltDocLoader->findWidget(CALEN_DAYVIEW)); - if (!mCalenDayViewAlt) { - qFatal("calenviewmanager.cpp : Unable to find alternate day view"); + // Get the calenagenda view from the loader + mCalenAgendaViewAlt = static_cast (mAgendaViewAltDocLoader->findWidget(CALEN_AGENDAVIEW)); + if (!mCalenAgendaViewAlt) { + qFatal("calenviewmanager.cpp : Unable to find alternate agenda view"); } - // Setup the day view - mCalenDayViewAlt->setupView(mDayViewAltDocLoader); + // Setup the agenda view + mCalenAgendaViewAlt->setupView(mAgendaViewAltDocLoader); } // ---------------------------------------------------------------------------- @@ -458,25 +617,33 @@ switch (command.Command()) { case ECalenMonthView: - removeDayViews(); + // First remove the previous native view before + // we set the mCurrentViewId with the current view + removePreviousView(); // Add month view to mainwindow. mController.MainWindow().addView(mCalenMonthView); mCurrentViewId = ECalenMonthView; activateCurrentView(); break; + case ECalenAgendaView: + // First remove the previous native view before + // we set the mCurrentViewId with the current view + removePreviousView(); + mCurrentViewId = ECalenAgendaView; + activateCurrentView(); + break; case ECalenDayView: - // Remove month view from mainwindow. - mController.MainWindow().removeView(mCalenMonthView); - mCurrentViewId = ECalenDayView; - activateCurrentView(); + { + // First add new view and use QueuedConnection to assure that + // view is ready before setting it as the current view + mController.MainWindow().addView(mCalenDayView); + QMetaObject::invokeMethod(this, "handleDayViewReady", + Qt::QueuedConnection); + } break; case ECalenEventView: launchEventView(); break; - case ECalenLandscapeDayView: - mCurrentViewId = ECalenLandscapeDayView; - activateCurrentView(); - break; case ECalenStartActiveStep: activateCurrentView(); break; @@ -502,7 +669,6 @@ { TRACE_ENTRY_POINT; switch (notification) { - case ECalenNotifySystemLocaleChanged: case ECalenNotifyExternalDatabaseChanged: case ECalenNotifyDialogClosed: case ECalenNotifyMultipleEntriesDeleted: @@ -510,8 +676,26 @@ case ECalenNotifyEntryDeleted: case ECalenNotifyInstanceDeleted: case ECalenNotifyEntryClosed: + case ECalenNotifySystemLocaleChanged: + case ECalenNotifySystemLanguageChanged: + { + activateCurrentView(); + } + break; case ECalenNotifySettingsClosed: + { + //when setting view closed , switch to the previous view + mCurrentViewId = mPreviousViewsId ; mController.Services().IssueCommandL(ECalenStartActiveStep); + + // invalidate captured screenshots as either agenda view is activated now + if (mCalenMonthView) { + mCalenMonthView->captureScreenshot(); + } else if (mCalenAgendaView) { + mCalenAgendaView->captureScreenshot(); + } + + } break; default: break; @@ -538,17 +722,20 @@ // void CalenViewManager::handleViewingCompleted(const QDate date) { - qDebug() <<"calendar: CalenViewManager::handleEditingCompleted -->"; // Cleanup. mCalenEventViewer->deleteLater(); if (!date.isNull() && date.isValid()) { - mController.Services().Context().setFocusDateL(QDateTime(date), - ECalenDayView); + mController.Services().Context().setFocusDate(QDateTime(date)); } mController.Services().IssueNotificationL(ECalenNotifyEntryClosed); - qDebug() <<"calendar: CalenViewManager::handleEditingCompleted <--"; + // invalidate captured screenshots as either agenda view is activated now + if (mCalenMonthView) { + mCalenMonthView->captureScreenshot(); + } else if (mCalenAgendaView) { + mCalenAgendaView->captureScreenshot(); + } } // ---------------------------------------------------------------------------- @@ -559,11 +746,9 @@ // void CalenViewManager::handleEditingStarted() { - qDebug() <<"calendar: CalenViewManager::handleEditingStarted -->"; mController.IssueCommandL(ECalenEditEntryFromViewer); - qDebug() <<"calendar: CalenViewManager::handleEditingStarted <--"; } // ---------------------------------------------------------------------------- @@ -574,11 +759,9 @@ // void CalenViewManager::handleEditingCompleted() { - qDebug() <<"calendar: CalenViewManager::handleEditingStarted -->"; mController.Services().IssueNotificationL(ECalenNotifyEditorClosedFromViewer); - qDebug() <<"calendar: CalenViewManager::handleEditingStarted <--"; } // ---------------------------------------------------------------------------- @@ -589,11 +772,9 @@ // void CalenViewManager::handleDeletingStarted() { - qDebug() <<"calendar: CalenViewManager::handleEditingStarted -->"; mController.IssueCommandL(ECalenDeleteEntryFromViewer); - qDebug() <<"calendar: CalenViewManager::handleEditingStarted <--"; } // ---------------------------------------------------------------------------- @@ -604,11 +785,91 @@ // void CalenViewManager::handleDeletingCompleted() { - qDebug() <<"calendar: CalenViewManager::handleEditingStarted -->"; mController.Services().IssueNotificationL(ECalenNotifyEntryDeleted); + + // invalidate captured screenshots as either month view or agenda view is activated now + if (mCalenMonthView) { + mCalenMonthView->captureScreenshot(); + } else if (mCalenAgendaView) { + mCalenAgendaView->captureScreenshot(); + } + - qDebug() <<"calendar: CalenViewManager::handleEditingStarted <--"; +} + +// ---------------------------------------------------------------------------- +// CalenViewManager::handleInstanceViewCreation +// Slot to handle completion of instance view creation +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CalenViewManager::handleInstanceViewCreation(int status) +{ + Q_UNUSED(status); + // handleInstanceViewCreation function is called only once. Now that the instance + // view creation is successfull. Events need to be populated on screen + // Ideal colution should be to call a uniform function, e.g. PopulateEvents + // where PopulateEvents should be implemeted by all views. Since the current + // solution for the month view implements the construction in two phases so + // it needs to be refactored and a common solution needs to be put here. So + // that code doesn't break if another view is added tomorow + if (mCalenMonthView) { + mCalenMonthView->fetchEntriesAndUpdateModel(); + } + else if (mCalenAgendaView) { + mCalenAgendaView->doPopulation(); + } +} + +// ---------------------------------------------------------------------------- +// CalenViewManager::handleDeletingCompleted +// Slot to handle completion of entry view creation +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CalenViewManager::handleEntryViewCreation(int status) +{ + // Nothing Yet + Q_UNUSED(status); +} + +// ---------------------------------------------------------------------------- +// CalenViewManager::handleDayViewReady +// Launches day view when it is added to MainWindow and ready to be displayed +// ---------------------------------------------------------------------------- +// +void CalenViewManager::handleDayViewReady() +{ + // Removes current view + // Notice: removing view should be done after new view is set as current to + // avoid situation that there is no current view in application + removePreviousView(); + + // Sets and activates day view + mCurrentViewId = ECalenDayView; + activateCurrentView(); +} + +// ---------------------------------------------------------------------------- +// CalenViewManager::launchSettingsView +// Launches settings view +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CalenViewManager::launchSettingsView() +{ + mPreviousViewsId = mCurrentViewId ; + mCurrentViewId = ECalenShowSettings; + mSettingsView->initializeForm(); + mController.Services().MainWindow().setCurrentView(mSettingsView); + + // capture cureent view in case app closed/quits from settings view + if (mCalenMonthView){ + mCalenMonthView->captureScreenshot(true); + } else if(mCalenAgendaView){ + mCalenAgendaView->captureScreenshot(true); + } } // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/customisationmanager/bwins/calencustomisationmanageru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/customisationmanager/bwins/calencustomisationmanageru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,27 @@ +EXPORTS + ?SetPluginAvailabilityL@CCalenCustomisationManager@@QAEXVTUid@@H@Z @ 1 NONAME ; void CCalenCustomisationManager::SetPluginAvailabilityL(class TUid, int) + ?PluginInfoFinder@CCalenCustomisationManager@@SAHPBVTUid@@ABVCImplementationInformation@@@Z @ 2 NONAME ; int CCalenCustomisationManager::PluginInfoFinder(class TUid const *, class CImplementationInformation const &) + ?HandleNotificationL@CCalenCustomisationManager@@AAEXW4TCalenNotification@@@Z @ 3 NONAME ; void CCalenCustomisationManager::HandleNotificationL(enum TCalenNotification) + ?HandleNotification@CCalenCustomisationManager@@UAEXW4TCalenNotification@@@Z @ 4 NONAME ; void CCalenCustomisationManager::HandleNotification(enum TCalenNotification) + ?CreateActivePluginListL@CCalenCustomisationManager@@AAEXXZ @ 5 NONAME ; void CCalenCustomisationManager::CreateActivePluginListL(void) + ?LoadPluginsBasedOnVariantL@CCalenCustomisationManager@@AAEXXZ @ 6 NONAME ; void CCalenCustomisationManager::LoadPluginsBasedOnVariantL(void) + ?AddPluginL@CCalenCustomisationManager@@AAEXPAVCCalenCustomisation@@VTUid@@@Z @ 7 NONAME ; void CCalenCustomisationManager::AddPluginL(class CCalenCustomisation *, class TUid) + ?OfferMenu@CCalenCustomisationManager@@QAEXPAVHbMenu@@@Z @ 8 NONAME ; void CCalenCustomisationManager::OfferMenu(class HbMenu *) + ?PluginInfoArray@CCalenCustomisationManager@@QBEABV?$RPointerArray@VCImplementationInformation@@@@XZ @ 9 NONAME ; class RPointerArray const & CCalenCustomisationManager::PluginInfoArray(void) const + ?DisablePluginL@CCalenCustomisationManager@@AAEXVTUid@@@Z @ 10 NONAME ; void CCalenCustomisationManager::DisablePluginL(class TUid) + ??_ECCalenCustomisationManager@@UAE@I@Z @ 11 NONAME ; CCalenCustomisationManager::~CCalenCustomisationManager(unsigned int) + ?InfobarTextL@CCalenCustomisationManager@@QAEPAVQString@@XZ @ 12 NONAME ; class QString * CCalenCustomisationManager::InfobarTextL(void) + ?NewL@CCalenCustomisationManager@@SAPAV1@AAVMCalenServicesFactory@@AAVMCalenServices@@@Z @ 13 NONAME ; class CCalenCustomisationManager * CCalenCustomisationManager::NewL(class MCalenServicesFactory &, class MCalenServices &) + ?ActivePlugins@CCalenCustomisationManager@@QBEABV?$RArray@VTUid@@@@XZ @ 14 NONAME ; class RArray const & CCalenCustomisationManager::ActivePlugins(void) const + ?PluginAvailabilityFinder@CCalenCustomisationManager@@CAHPBVTUid@@ABUTCalenPluginAvailability@1@@Z @ 15 NONAME ; int CCalenCustomisationManager::PluginAvailabilityFinder(class TUid const *, struct CCalenCustomisationManager::TCalenPluginAvailability const &) + ?UnloadPluginsL@CCalenCustomisationManager@@QAEXABV?$RArray@VTUid@@@@@Z @ 16 NONAME ; void CCalenCustomisationManager::UnloadPluginsL(class RArray const &) + ??1CCalenCustomisationManager@@UAE@XZ @ 17 NONAME ; CCalenCustomisationManager::~CCalenCustomisationManager(void) + ?LoadPluginL@CCalenCustomisationManager@@AAEXVTUid@@@Z @ 18 NONAME ; void CCalenCustomisationManager::LoadPluginL(class TUid) + ?GetCommandHandlerL@CCalenCustomisationManager@@QAEPAVMCalenCommandHandler@@H@Z @ 19 NONAME ; class MCalenCommandHandler * CCalenCustomisationManager::GetCommandHandlerL(int) + ??0CCalenCustomisationManager@@AAE@AAVMCalenServicesFactory@@AAVMCalenServices@@@Z @ 20 NONAME ; CCalenCustomisationManager::CCalenCustomisationManager(class MCalenServicesFactory &, class MCalenServices &) + ?DoImmediatePluginLoadingL@CCalenCustomisationManager@@AAEXXZ @ 21 NONAME ; void CCalenCustomisationManager::DoImmediatePluginLoadingL(void) + ?FindPluginL@CCalenCustomisationManager@@AAEPAVCCalenCustomisation@@VTUid@@@Z @ 22 NONAME ; class CCalenCustomisation * CCalenCustomisationManager::FindPluginL(class TUid) + ?ConstructL@CCalenCustomisationManager@@AAEXXZ @ 23 NONAME ; void CCalenCustomisationManager::ConstructL(void) + ?EnablePluginL@CCalenCustomisationManager@@AAEXVTUid@@@Z @ 24 NONAME ; void CCalenCustomisationManager::EnablePluginL(class TUid) + ?Infobar@CCalenCustomisationManager@@QAEPAVHbWidget@@XZ @ 25 NONAME ; class HbWidget * CCalenCustomisationManager::Infobar(void) + diff -r fd30d51f876b -r b6db4fd4947b calendarui/customisationmanager/eabi/calencustomisationmanageru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/customisationmanager/eabi/calencustomisationmanageru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,32 @@ +EXPORTS + _ZN26CCalenCustomisationManager10AddPluginLEP19CCalenCustomisation4TUid @ 1 NONAME + _ZN26CCalenCustomisationManager10ConstructLEv @ 2 NONAME + _ZN26CCalenCustomisationManager11FindPluginLE4TUid @ 3 NONAME + _ZN26CCalenCustomisationManager11LoadPluginLE4TUid @ 4 NONAME + _ZN26CCalenCustomisationManager12InfobarTextLEv @ 5 NONAME + _ZN26CCalenCustomisationManager13EnablePluginLE4TUid @ 6 NONAME + _ZN26CCalenCustomisationManager14DisablePluginLE4TUid @ 7 NONAME + _ZN26CCalenCustomisationManager14UnloadPluginsLERK6RArrayI4TUidE @ 8 NONAME + _ZN26CCalenCustomisationManager16PluginInfoFinderEPK4TUidRK26CImplementationInformation @ 9 NONAME + _ZN26CCalenCustomisationManager18GetCommandHandlerLEi @ 10 NONAME + _ZN26CCalenCustomisationManager18HandleNotificationE18TCalenNotification @ 11 NONAME + _ZN26CCalenCustomisationManager19HandleNotificationLE18TCalenNotification @ 12 NONAME + _ZN26CCalenCustomisationManager22SetPluginAvailabilityLE4TUidi @ 13 NONAME + _ZN26CCalenCustomisationManager23CreateActivePluginListLEv @ 14 NONAME + _ZN26CCalenCustomisationManager24PluginAvailabilityFinderEPK4TUidRKNS_24TCalenPluginAvailabilityE @ 15 NONAME + _ZN26CCalenCustomisationManager25DoImmediatePluginLoadingLEv @ 16 NONAME + _ZN26CCalenCustomisationManager26LoadPluginsBasedOnVariantLEv @ 17 NONAME + _ZN26CCalenCustomisationManager4NewLER21MCalenServicesFactoryR14MCalenServices @ 18 NONAME + _ZN26CCalenCustomisationManager7InfobarEv @ 19 NONAME + _ZN26CCalenCustomisationManager9OfferMenuEP6HbMenu @ 20 NONAME + _ZN26CCalenCustomisationManagerC1ER21MCalenServicesFactoryR14MCalenServices @ 21 NONAME + _ZN26CCalenCustomisationManagerC2ER21MCalenServicesFactoryR14MCalenServices @ 22 NONAME + _ZN26CCalenCustomisationManagerD0Ev @ 23 NONAME + _ZN26CCalenCustomisationManagerD1Ev @ 24 NONAME + _ZN26CCalenCustomisationManagerD2Ev @ 25 NONAME + _ZNK26CCalenCustomisationManager13ActivePluginsEv @ 26 NONAME + _ZNK26CCalenCustomisationManager15PluginInfoArrayEv @ 27 NONAME + _ZTI26CCalenCustomisationManager @ 28 NONAME + _ZTV26CCalenCustomisationManager @ 29 NONAME + _ZThn4_N26CCalenCustomisationManager18HandleNotificationE18TCalenNotification @ 30 NONAME + diff -r fd30d51f876b -r b6db4fd4947b calendarui/customisationmanager/inc/calencustomisationmanager.h --- a/calendarui/customisationmanager/inc/calencustomisationmanager.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/customisationmanager/inc/calencustomisationmanager.h Mon Jun 28 15:22:02 2010 +0530 @@ -70,6 +70,9 @@ MCalenServicesFactory& aFactory, MCalenServices& aServices ); + static TBool PluginInfoFinder( const TUid* aUid , + const CImplementationInformation& aArrayItem); + /** * Destructor. */ @@ -145,6 +148,8 @@ void AddPluginL( CCalenCustomisation* aPlugin, TUid aUid ); void CreateActivePluginListL(); + + void LoadPluginsBasedOnVariantL(); void EnablePluginL( TUid aPluginUid ); diff -r fd30d51f876b -r b6db4fd4947b calendarui/customisationmanager/src/calencustomisationmanager.cpp --- a/calendarui/customisationmanager/src/calencustomisationmanager.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/customisationmanager/src/calencustomisationmanager.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -27,8 +27,10 @@ #include "calenservices.h" #include "calencustomisation.h" #include +#include #include "calenservices.h" #include "calenservicesfactory.h" +#include "CalenUid.h" @@ -183,40 +185,96 @@ iActivePlugins.Reset(); iRomBasedPlugins.Reset(); - //Added resolver for corolla release - // Set resolver params - TLanguage lang = User::Language(); - TBuf8<40> langStr; - langStr.Format( _L8("language(%d)"), lang ); - - TEComResolverParams resolverParams; - resolverParams.SetDataType( langStr ); - resolverParams.SetGenericMatch( ETrue ); + REComSession::ListImplementationsL( KCalenCustomisationInterfaceUid, iPluginInfo ); - // REComSession::ListImplementationsL( KCalenCustomisationInterfaceUid, resolverParams, iPluginInfo ); - REComSession::ListImplementationsL( KCalenCustomisationInterfaceUid, iPluginInfo ); + LoadPluginsBasedOnVariantL(); + TInt pluginCount = iPluginInfo.Count(); - for ( TInt pluginIndex(0); pluginIndex < pluginCount; ++pluginIndex ) - { - TUid pluginUid = iPluginInfo[pluginIndex]->ImplementationUid(); - - // If the plugin can not be found or if it is enabled - // add it to the list of active plugins - iActivePlugins.AppendL( pluginUid ); - - // If the plugin is rom-based, store its uid - if ( iPluginInfo[pluginIndex]->RomBased() ) - { - iRomBasedPlugins.AppendL( pluginUid ); - } - - } + if(pluginCount) + { + for ( TInt pluginIndex(0); pluginIndex < pluginCount; ++pluginIndex ) + { + TUid pluginUid = iPluginInfo[pluginIndex]->ImplementationUid(); + + // If the plugin can not be found or if it is enabled + // add it to the list of active plugins + iActivePlugins.AppendL( pluginUid ); + + // If the plugin is rom-based, store its uid + if ( iPluginInfo[pluginIndex]->RomBased() ) + { + iRomBasedPlugins.AppendL( pluginUid ); + } + + } + } TRACE_EXIT_POINT; } // ---------------------------------------------------------------------------- +// CCalenCustomisationManager::LoadPluginsBasedOnVariantL +// Loads the plugin based on the language variant +// ---------------------------------------------------------------------------- +// +void CCalenCustomisationManager::LoadPluginsBasedOnVariantL() +{ + TLanguage languge = User::Language(); + RArray needsToBeRemoved; + + switch(languge) + { + case ELangTaiwanChinese: + case ELangPrcChinese: + case ELangHongKongChinese: + // TODO: Remove the other regional plugins Thai, Vietnamese etc. + break; + case ELangThai: + case ELangEnglish_Thailand: + needsToBeRemoved.Append(KCalenChineseImplUid); + // TODO: Remove the other regional plugin Vietnamese. + break; + case ELangVietnamese: + needsToBeRemoved.Append(KCalenChineseImplUid); + // TODO: Remove the other regional plugin Thai. + break; + + default: + needsToBeRemoved.Append(KCalenChineseImplUid); + // TODO: Remove the other regional plugins Thai, Vietnamese etc. + break; + } + TInt count = needsToBeRemoved.Count(); + if(count) + { + for(TInt i=0; i< count; i++) + { + TInt index = iPluginInfo.Find(needsToBeRemoved[i], + CCalenCustomisationManager::PluginInfoFinder); + if( index != KErrNotFound ) + { + CImplementationInformation* impl = iPluginInfo[index]; + iPluginInfo.Remove(index); + delete impl; + } + } + } + needsToBeRemoved.Close(); +} + +// ---------------------------------------------------------------------------- +// CCalenCustomisationManager::PluginInfoFinder( +// Matches an uid in pluginInfo. +// ---------------------------------------------------------------------------- +// +TBool CCalenCustomisationManager::PluginInfoFinder( const TUid* aUid, + const CImplementationInformation& aArrayItem ) +{ + return (*aUid == aArrayItem.ImplementationUid() ); +} + +// ---------------------------------------------------------------------------- // CCalenCustomisationManager::SetPluginAvailabilityL // Enables or disables the given plugin. // ---------------------------------------------------------------------------- @@ -368,9 +426,17 @@ // ---------------------------------------------------------------------------- // void CCalenCustomisationManager::HandleNotificationL(TCalenNotification aNotification) - { - TRACE_ENTRY_POINT; - Q_UNUSED(aNotification); + { + TRACE_ENTRY_POINT; + switch( aNotification ) + { + case ECalenNotifySystemLanguageChanged: + { + CreateActivePluginListL(); + DoImmediatePluginLoadingL(); + } + break; + } TRACE_EXIT_POINT; } @@ -443,17 +509,19 @@ // Get a new services object from global data MCalenServices* services = iServicesFactory.NewServicesL(); - + CleanupStack::PushL( services ); // Creates the plugin and transfers ownership of the services // object to the plugin. CCalenCustomisation* plugin = CCalenCustomisation::CreateImplementationL( aPluginUid, services ); - - CleanupStack::PushL( plugin ); + CleanupStack::PushL( plugin ); // the plugin array takes ownership of the plugin AddPluginL( plugin, aPluginUid ); + + // Cleanup CleanupStack::Pop( plugin ); + CleanupStack::Pop( services ); TRACE_EXIT_POINT; diff -r fd30d51f876b -r b6db4fd4947b calendarui/eabi/agendaeventvieweru.def --- a/calendarui/eabi/agendaeventvieweru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -EXPORTS - _ZN17AgendaEventViewer4viewE11AgendaEntryNS_7ActionsE @ 1 NONAME - _ZN17AgendaEventViewer4viewERK5QFileNS_7ActionsE @ 2 NONAME - _ZN17AgendaEventViewer4viewEmNS_7ActionsE @ 3 NONAME - _ZN17AgendaEventViewerC1EP10AgendaUtilP7QObject @ 4 NONAME - _ZN17AgendaEventViewerC1EP7QObject @ 5 NONAME - _ZN17AgendaEventViewerC2EP10AgendaUtilP7QObject @ 6 NONAME - _ZN17AgendaEventViewerC2EP7QObject @ 7 NONAME - _ZN17AgendaEventViewerD0Ev @ 8 NONAME - _ZN17AgendaEventViewerD1Ev @ 9 NONAME - _ZN17AgendaEventViewerD2Ev @ 10 NONAME - diff -r fd30d51f876b -r b6db4fd4947b calendarui/eabi/calencommonutilsu.def --- a/calendarui/eabi/calencommonutilsu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -EXPORTS - _ZN14CalenDateUtils10isNullTimeER9QDateTime @ 1 NONAME - _ZN14CalenDateUtils10isValidDayERK9QDateTime @ 2 NONAME - _ZN14CalenDateUtils11defaultTimeERK9QDateTime @ 3 NONAME - _ZN14CalenDateUtils11onSameMonthERK9QDateTimeS2_ @ 4 NONAME - _ZN14CalenDateUtils14beginningOfDayERK9QDateTime @ 5 NONAME - _ZN14CalenDateUtils16displayTimeOnDayERK9QDateTimeS2_ @ 6 NONAME - _ZN14CalenDateUtils16limitToValidTimeERK9QDateTime @ 7 NONAME - _ZN14CalenDateUtils19roundToPreviousHourERK9QDateTime @ 8 NONAME - _ZN14CalenDateUtils19roundToPreviousHourERKi @ 9 NONAME - _ZN14CalenDateUtils19timeRangesIntersectERK9QDateTimeS2_S2_S2_ @ 10 NONAME - _ZN14CalenDateUtils3nowEv @ 11 NONAME - _ZN14CalenDateUtils5todayEv @ 12 NONAME - _ZN14CalenDateUtils6pastOfERK9QDateTimei @ 13 NONAME - _ZN14CalenDateUtils7maxTimeEv @ 14 NONAME - _ZN14CalenDateUtils7minTimeEv @ 15 NONAME - _ZN14CalenDateUtils8futureOfERK9QDateTimei @ 16 NONAME - _ZN14CalenDateUtils9isOnTodayERK9QDateTime @ 17 NONAME - _ZN14CalenDateUtils9onSameDayERK9QDateTimeS2_ @ 18 NONAME - _ZN14CalenDateUtils9timeOfDayERK9QDateTime @ 19 NONAME - _ZN16CalenAgendaUtils17endsAtStartOfDayLER11AgendaEntryRK9QDateTime @ 20 NONAME - _ZN16CalenAgendaUtils30removeEntriesEndingAtMidnightLER5QListI11AgendaEntryERK9QDateTime @ 21 NONAME - diff -r fd30d51f876b -r b6db4fd4947b calendarui/eabi/calencontrolleru.def --- a/calendarui/eabi/calencontrolleru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ -EXPORTS - _ZN16CCalenController10MainWindowEv @ 1 NONAME - _ZN16CCalenController11ViewManagerEv @ 2 NONAME - _ZN16CCalenController12InfobarTextLEv @ 3 NONAME - _ZN16CCalenController12NewServicesLEv @ 4 NONAME - _ZN16CCalenController12getFirstViewEv @ 5 NONAME - _ZN16CCalenController13IssueCommandLEi @ 6 NONAME - _ZN16CCalenController15agendaInterfaceEv @ 7 NONAME - _ZN16CCalenController17SetDefaultContextEv @ 8 NONAME - _ZN16CCalenController18GetCommandHandlerLEi @ 9 NONAME - _ZN16CCalenController19CancelNotificationsEP25MCalenNotificationHandler @ 10 NONAME - _ZN16CCalenController20CustomisationManagerEv @ 11 NONAME - _ZN16CCalenController21BroadcastNotificationE18TCalenNotification @ 12 NONAME - _ZN16CCalenController21checkMultipleCreationEv @ 13 NONAME - _ZN16CCalenController24handleServiceManagerSlotEiRK9QDateTime @ 14 NONAME - _ZN16CCalenController25RegisterForNotificationsLEP25MCalenNotificationHandler18TCalenNotification @ 15 NONAME - _ZN16CCalenController25RegisterForNotificationsLEP25MCalenNotificationHandlerR6RArrayI18TCalenNotificationE @ 16 NONAME - _ZN16CCalenController7InfobarEv @ 17 NONAME - _ZN16CCalenController7ReleaseEv @ 18 NONAME - _ZN16CCalenController7contextEv @ 19 NONAME - _ZN16CCalenController8NotifierEv @ 20 NONAME - _ZN16CCalenController8ServicesEv @ 21 NONAME - _ZN16CCalenController9InstanceLEv @ 22 NONAME - _ZN16CCalenController9OfferMenuEP6HbMenu @ 23 NONAME - _ZN16CCalenControllerC1Eb @ 24 NONAME - _ZN16CCalenControllerC2Eb @ 25 NONAME - _ZN16CCalenControllerD1Ev @ 26 NONAME - _ZN16CCalenControllerD2Ev @ 27 NONAME - _ZTI16CCalenController @ 28 NONAME - _ZTV16CCalenController @ 29 NONAME - diff -r fd30d51f876b -r b6db4fd4947b calendarui/eabi/calencustomisationmanageru.def --- a/calendarui/eabi/calencustomisationmanageru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -EXPORTS - _ZN26CCalenCustomisationManager10AddPluginLEP19CCalenCustomisation4TUid @ 1 NONAME - _ZN26CCalenCustomisationManager10ConstructLEv @ 2 NONAME - _ZN26CCalenCustomisationManager11FindPluginLE4TUid @ 3 NONAME - _ZN26CCalenCustomisationManager11LoadPluginLE4TUid @ 4 NONAME - _ZN26CCalenCustomisationManager12InfobarTextLEv @ 5 NONAME - _ZN26CCalenCustomisationManager13EnablePluginLE4TUid @ 6 NONAME - _ZN26CCalenCustomisationManager14DisablePluginLE4TUid @ 7 NONAME - _ZN26CCalenCustomisationManager14UnloadPluginsLERK6RArrayI4TUidE @ 8 NONAME - _ZN26CCalenCustomisationManager18GetCommandHandlerLEi @ 9 NONAME - _ZN26CCalenCustomisationManager18HandleNotificationE18TCalenNotification @ 10 NONAME - _ZN26CCalenCustomisationManager19HandleNotificationLE18TCalenNotification @ 11 NONAME - _ZN26CCalenCustomisationManager22SetPluginAvailabilityLE4TUidi @ 12 NONAME - _ZN26CCalenCustomisationManager23CreateActivePluginListLEv @ 13 NONAME - _ZN26CCalenCustomisationManager24PluginAvailabilityFinderEPK4TUidRKNS_24TCalenPluginAvailabilityE @ 14 NONAME - _ZN26CCalenCustomisationManager25DoImmediatePluginLoadingLEv @ 15 NONAME - _ZN26CCalenCustomisationManager4NewLER21MCalenServicesFactoryR14MCalenServices @ 16 NONAME - _ZN26CCalenCustomisationManager7InfobarEv @ 17 NONAME - _ZN26CCalenCustomisationManager9OfferMenuEP6HbMenu @ 18 NONAME - _ZN26CCalenCustomisationManagerC1ER21MCalenServicesFactoryR14MCalenServices @ 19 NONAME - _ZN26CCalenCustomisationManagerC2ER21MCalenServicesFactoryR14MCalenServices @ 20 NONAME - _ZN26CCalenCustomisationManagerD0Ev @ 21 NONAME - _ZN26CCalenCustomisationManagerD1Ev @ 22 NONAME - _ZN26CCalenCustomisationManagerD2Ev @ 23 NONAME - _ZNK26CCalenCustomisationManager13ActivePluginsEv @ 24 NONAME - _ZNK26CCalenCustomisationManager15PluginInfoArrayEv @ 25 NONAME - _ZTI26CCalenCustomisationManager @ 26 NONAME - _ZTV26CCalenCustomisationManager @ 27 NONAME - _ZThn4_N26CCalenCustomisationManager18HandleNotificationE18TCalenNotification @ 28 NONAME - diff -r fd30d51f876b -r b6db4fd4947b calendarui/eabi/caleneditoru.def --- a/calendarui/eabi/caleneditoru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -EXPORTS - _ZN11CalenEditor10entrySavedEv @ 1 NONAME - _ZN11CalenEditor11qt_metacallEN11QMetaObject4CallEiPPv @ 2 NONAME - _ZN11CalenEditor11qt_metacastEPKc @ 3 NONAME - _ZN11CalenEditor12dialogClosedEv @ 4 NONAME - _ZN11CalenEditor16staticMetaObjectE @ 5 NONAME DATA 16 - _ZN11CalenEditor19getStaticMetaObjectEv @ 6 NONAME - _ZN11CalenEditor20calendarLaunchFailedEi @ 7 NONAME - _ZN11CalenEditor4editE11AgendaEntryb @ 8 NONAME - _ZN11CalenEditor4editERK5QFileb @ 9 NONAME - _ZN11CalenEditor4editEmb @ 10 NONAME - _ZN11CalenEditor6createE11AgendaEntrybNS_10CreateTypeE @ 11 NONAME - _ZN11CalenEditor6createE9QDateTimebNS_10CreateTypeE @ 12 NONAME - _ZN11CalenEditorC1EP10AgendaUtilP7QObject @ 13 NONAME - _ZN11CalenEditorC1EP7QObject @ 14 NONAME - _ZN11CalenEditorC2EP10AgendaUtilP7QObject @ 15 NONAME - _ZN11CalenEditorC2EP7QObject @ 16 NONAME - _ZN11CalenEditorD0Ev @ 17 NONAME - _ZN11CalenEditorD1Ev @ 18 NONAME - _ZN11CalenEditorD2Ev @ 19 NONAME - _ZNK11CalenEditor10metaObjectEv @ 20 NONAME - _ZTI11CalenEditor @ 21 NONAME - _ZTV11CalenEditor @ 22 NONAME - diff -r fd30d51f876b -r b6db4fd4947b calendarui/eabi/calenglobaldatau.def --- a/calendarui/eabi/calenglobaldatau.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -EXPORTS - _ZN16CalenContextImplC1EP27MCalenContextChangeObserver @ 1 NONAME - _ZN16CalenContextImplC1ERKS_ @ 2 NONAME - _ZN16CalenContextImplC1Ev @ 3 NONAME - _ZN16CalenContextImplC2EP27MCalenContextChangeObserver @ 4 NONAME - _ZN16CalenContextImplC2ERKS_ @ 5 NONAME - _ZN16CalenContextImplC2Ev @ 6 NONAME - diff -r fd30d51f876b -r b6db4fd4947b calendarui/eabi/calenlauncheru.def --- a/calendarui/eabi/calenlauncheru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -EXPORTS - _ZN13CalenLauncher11handleErrorEi @ 1 NONAME - _ZN13CalenLauncher11qt_metacallEN11QMetaObject4CallEiPPv @ 2 NONAME - _ZN13CalenLauncher11qt_metacastEPKc @ 3 NONAME - _ZN13CalenLauncher16staticMetaObjectE @ 4 NONAME DATA 16 - _ZN13CalenLauncher17launchCalendarAppENS_9CalenViewER9QDateTimeb @ 5 NONAME - _ZN13CalenLauncher19getStaticMetaObjectEv @ 6 NONAME - _ZN13CalenLauncher20calendarLaunchFailedEi @ 7 NONAME - _ZN13CalenLauncherC1EP7QObject @ 8 NONAME - _ZN13CalenLauncherC2EP7QObject @ 9 NONAME - _ZN13CalenLauncherD0Ev @ 10 NONAME - _ZN13CalenLauncherD1Ev @ 11 NONAME - _ZN13CalenLauncherD2Ev @ 12 NONAME - _ZNK13CalenLauncher10metaObjectEv @ 13 NONAME - _ZTI13CalenLauncher @ 14 NONAME - _ZTV13CalenLauncher @ 15 NONAME - diff -r fd30d51f876b -r b6db4fd4947b calendarui/eabi/calensettingsu.def --- a/calendarui/eabi/calensettingsu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -EXPORTS - _ZN13CalenSettings11createModelEv @ 1 NONAME - _ZN13CalenSettings11qt_metacallEN11QMetaObject4CallEiPPv @ 2 NONAME - _ZN13CalenSettings11qt_metacastEPKc @ 3 NONAME - _ZN13CalenSettings16staticMetaObjectE @ 4 NONAME DATA 16 - _ZN13CalenSettings19getStaticMetaObjectEv @ 5 NONAME - _ZN13CalenSettings19populateSettingListEv @ 6 NONAME - _ZN13CalenSettings22handleWeekNumberChangeEv @ 7 NONAME - _ZN13CalenSettings24handleRegionalInfoChangeEv @ 8 NONAME - _ZN13CalenSettings27handleAlarmSnoozeTimeChangeEi @ 9 NONAME - _ZN13CalenSettingsC1EP10HbDataFormP7QObject @ 10 NONAME - _ZN13CalenSettingsC2EP10HbDataFormP7QObject @ 11 NONAME - _ZN13CalenSettingsD0Ev @ 12 NONAME - _ZN13CalenSettingsD1Ev @ 13 NONAME - _ZN13CalenSettingsD2Ev @ 14 NONAME - _ZNK13CalenSettings10metaObjectEv @ 15 NONAME - _ZTI13CalenSettings @ 16 NONAME - _ZTV13CalenSettings @ 17 NONAME - diff -r fd30d51f876b -r b6db4fd4947b calendarui/eabi/calenviewsu.def --- a/calendarui/eabi/calenviewsu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,189 +0,0 @@ -EXPORTS - _ZN12CalenDayView12doPopulationEv @ 1 NONAME - _ZN12CalenDayView18HandleNotificationE18TCalenNotification @ 2 NONAME - _ZN12CalenDayView9docLoaderEv @ 3 NONAME - _ZN12CalenDayView9setupViewEP14CalenDocLoader @ 4 NONAME - _ZN12CalenDayViewC1ER14MCalenServices @ 5 NONAME - _ZN12CalenDayViewC2ER14MCalenServices @ 6 NONAME - _ZN12CalenDayViewD0Ev @ 7 NONAME - _ZN12CalenDayViewD1Ev @ 8 NONAME - _ZN12CalenDayViewD2Ev @ 9 NONAME - _ZN14CalenMonthGrid10appendRowsEv @ 10 NONAME - _ZN14CalenMonthGrid10panGestureERK7QPointF @ 11 NONAME - _ZN14CalenMonthGrid11downGestureEi @ 12 NONAME - _ZN14CalenMonthGrid11prependRowsEv @ 13 NONAME - _ZN14CalenMonthGrid11qt_metacallEN11QMetaObject4CallEiPPv @ 14 NONAME - _ZN14CalenMonthGrid11qt_metacastEPKc @ 15 NONAME - _ZN14CalenMonthGrid12timerExpiredEv @ 16 NONAME - _ZN14CalenMonthGrid13itemActivatedERK11QModelIndex @ 17 NONAME - _ZN14CalenMonthGrid14setActiveDatesE5QDate @ 18 NONAME - _ZN14CalenMonthGrid14setCurrentIdexEi @ 19 NONAME - _ZN14CalenMonthGrid15getCurrentIndexEv @ 20 NONAME - _ZN14CalenMonthGrid15mousePressEventEP24QGraphicsSceneMouseEvent @ 21 NONAME - _ZN14CalenMonthGrid16staticMetaObjectE @ 22 NONAME DATA 16 - _ZN14CalenMonthGrid17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 23 NONAME - _ZN14CalenMonthGrid17scrollingFinishedEv @ 24 NONAME - _ZN14CalenMonthGrid18orientationChangedEN2Qt11OrientationE @ 25 NONAME - _ZN14CalenMonthGrid19getStaticMetaObjectEv @ 26 NONAME - _ZN14CalenMonthGrid19setFocusToProperDayEv @ 27 NONAME - _ZN14CalenMonthGrid20updateMonthGridModelER5QListI14CalenMonthDataEi @ 28 NONAME - _ZN14CalenMonthGrid7setViewEP14CalenMonthView @ 29 NONAME - _ZN14CalenMonthGrid9upGestureEi @ 30 NONAME - _ZN14CalenMonthGridC1EP13QGraphicsItem @ 31 NONAME - _ZN14CalenMonthGridC2EP13QGraphicsItem @ 32 NONAME - _ZN14CalenMonthGridD0Ev @ 33 NONAME - _ZN14CalenMonthGridD1Ev @ 34 NONAME - _ZN14CalenMonthGridD2Ev @ 35 NONAME - _ZN14CalenMonthView10createGridEv @ 36 NONAME - _ZN14CalenMonthView11qt_metacallEN11QMetaObject4CallEiPPv @ 37 NONAME - _ZN14CalenMonthView11qt_metacastEPKc @ 38 NONAME - _ZN14CalenMonthView12createEditorEv @ 39 NONAME - _ZN14CalenMonthView12doPopulationEv @ 40 NONAME - _ZN14CalenMonthView12getActiveDayEv @ 41 NONAME - _ZN14CalenMonthView12setActiveDayE9QDateTime @ 42 NONAME - _ZN14CalenMonthView13getCurrentDayEv @ 43 NONAME - _ZN14CalenMonthView13launchDayViewEv @ 44 NONAME - _ZN14CalenMonthView13monthDataListEv @ 45 NONAME - _ZN14CalenMonthView14addWeekNumbersEv @ 46 NONAME - _ZN14CalenMonthView14firstDayOfGridEv @ 47 NONAME - _ZN14CalenMonthView14rowsInFutMonthEv @ 48 NONAME - _ZN14CalenMonthView14setDateToLabelEv @ 49 NONAME - _ZN14CalenMonthView15dateFromContextERK13MCalenContext @ 50 NONAME - _ZN14CalenMonthView15getInstanceListER5QListI11AgendaEntryE9QDateTimeS4_ @ 51 NONAME - _ZN14CalenMonthView15onLocaleChangedEi @ 52 NONAME - _ZN14CalenMonthView15rowsInPrevMonthEv @ 53 NONAME - _ZN14CalenMonthView16getCurrGridIndexEv @ 54 NONAME - _ZN14CalenMonthView16setCurrGridIndexEi @ 55 NONAME - _ZN14CalenMonthView16staticMetaObjectE @ 56 NONAME DATA 16 - _ZN14CalenMonthView17changeOrientationEN2Qt11OrientationE @ 57 NONAME - _ZN14CalenMonthView17populateNextMonthEv @ 58 NONAME - _ZN14CalenMonthView17populatePrevMonthEv @ 59 NONAME - _ZN14CalenMonthView17removeWeekNumbersEv @ 60 NONAME - _ZN14CalenMonthView18addBackgroundFrameEv @ 61 NONAME - _ZN14CalenMonthView18completePopulationEv @ 62 NONAME - _ZN14CalenMonthView19getStaticMetaObjectEv @ 63 NONAME - _ZN14CalenMonthView19populatePreviewPaneER9QDateTime @ 64 NONAME - _ZN14CalenMonthView20prepareForPopulationEv @ 65 NONAME - _ZN14CalenMonthView21refreshViewOnGoToDateEv @ 66 NONAME - _ZN14CalenMonthView22setContextForActiveDayEi @ 67 NONAME - _ZN14CalenMonthView22updateWeekNumGridModelEv @ 68 NONAME - _ZN14CalenMonthView23handleChangeOrientationEv @ 69 NONAME - _ZN14CalenMonthView23handleGridItemActivatedEv @ 70 NONAME - _ZN14CalenMonthView24handlePreviewPaneGestureEb @ 71 NONAME - _ZN14CalenMonthView24populateWithInstanceViewEv @ 72 NONAME - _ZN14CalenMonthView24updateModelWithPrevMonthEv @ 73 NONAME - _ZN14CalenMonthView25handleGridItemLongPressedEiR7QPointF @ 74 NONAME - _ZN14CalenMonthView25handleLeftEffectCompletedERKN8HbEffect12EffectStatusE @ 75 NONAME - _ZN14CalenMonthView26handleRightEffectCompletedERKN8HbEffect12EffectStatusE @ 76 NONAME - _ZN14CalenMonthView26updateModelWithFutureMonthEv @ 77 NONAME - _ZN14CalenMonthView35updateMonthDataArrayWithActiveDatesEv @ 78 NONAME - _ZN14CalenMonthView7setDateEv @ 79 NONAME - _ZN14CalenMonthView9goToTodayEv @ 80 NONAME - _ZN14CalenMonthView9setupViewEP14CalenDocLoader @ 81 NONAME - _ZN14CalenMonthViewC1ER14MCalenServices @ 82 NONAME - _ZN14CalenMonthViewC2ER14MCalenServices @ 83 NONAME - _ZN14CalenMonthViewD0Ev @ 84 NONAME - _ZN14CalenMonthViewD1Ev @ 85 NONAME - _ZN14CalenMonthViewD2Ev @ 86 NONAME - _ZN16CalenPreviewPane11qt_metacallEN11QMetaObject4CallEiPPv @ 87 NONAME - _ZN16CalenPreviewPane11qt_metacastEPKc @ 88 NONAME - _ZN16CalenPreviewPane13populateLabelE9QDateTime @ 89 NONAME - _ZN16CalenPreviewPane13stopScrollingEv @ 90 NONAME - _ZN16CalenPreviewPane15mousePressEventEP24QGraphicsSceneMouseEvent @ 91 NONAME - _ZN16CalenPreviewPane15startAutoScrollEv @ 92 NONAME - _ZN16CalenPreviewPane16GetInstanceListLEv @ 93 NONAME - _ZN16CalenPreviewPane16staticMetaObjectE @ 94 NONAME DATA 16 - _ZN16CalenPreviewPane17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 95 NONAME - _ZN16CalenPreviewPane17scrollingFinishedEv @ 96 NONAME - _ZN16CalenPreviewPane17setNoEntriesLabelEP7HbLabel @ 97 NONAME - _ZN16CalenPreviewPane19getStaticMetaObjectEv @ 98 NONAME - _ZN16CalenPreviewPane19onTwoSecondsTimeoutEv @ 99 NONAME - _ZN16CalenPreviewPane4DateEv @ 100 NONAME - _ZN16CalenPreviewPane7setViewEP14CalenMonthView @ 101 NONAME - _ZN16CalenPreviewPaneC1ER14MCalenServicesP13QGraphicsItem @ 102 NONAME - _ZN16CalenPreviewPaneC2ER14MCalenServicesP13QGraphicsItem @ 103 NONAME - _ZN16CalenPreviewPaneD0Ev @ 104 NONAME - _ZN16CalenPreviewPaneD1Ev @ 105 NONAME - _ZN16CalenPreviewPaneD2Ev @ 106 NONAME - _ZN17CalenSettingsView11qt_metacallEN11QMetaObject4CallEiPPv @ 107 NONAME - _ZN17CalenSettingsView11qt_metacastEPKc @ 108 NONAME - _ZN17CalenSettingsView14initializeFormEv @ 109 NONAME - _ZN17CalenSettingsView16staticMetaObjectE @ 110 NONAME DATA 16 - _ZN17CalenSettingsView18launchPreviousViewEv @ 111 NONAME - _ZN17CalenSettingsView19getStaticMetaObjectEv @ 112 NONAME - _ZN17CalenSettingsViewC1ER14MCalenServicesP13QGraphicsItem @ 113 NONAME - _ZN17CalenSettingsViewC2ER14MCalenServicesP13QGraphicsItem @ 114 NONAME - _ZN17CalenSettingsViewD0Ev @ 115 NONAME - _ZN17CalenSettingsViewD1Ev @ 116 NONAME - _ZN17CalenSettingsViewD2Ev @ 117 NONAME - _ZN18CalenDayViewWidgetC1ER14MCalenServicesP14CalenDocLoader @ 118 NONAME - _ZN18CalenDayViewWidgetC2ER14MCalenServicesP14CalenDocLoader @ 119 NONAME - _ZN18CalenDayViewWidgetD0Ev @ 120 NONAME - _ZN18CalenDayViewWidgetD1Ev @ 121 NONAME - _ZN18CalenDayViewWidgetD2Ev @ 122 NONAME - _ZN21CalenThickLinesDrawer11qt_metacallEN11QMetaObject4CallEiPPv @ 123 NONAME - _ZN21CalenThickLinesDrawer11qt_metacastEPKc @ 124 NONAME - _ZN21CalenThickLinesDrawer16staticMetaObjectE @ 125 NONAME DATA 16 - _ZN21CalenThickLinesDrawer19getStaticMetaObjectEv @ 126 NONAME - _ZN21CalenThickLinesDrawer5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 127 NONAME - _ZN21CalenThickLinesDrawerC1EN17CalendarNamespace10WidgetTypeEP13QGraphicsItem @ 128 NONAME - _ZN21CalenThickLinesDrawerC2EN17CalendarNamespace10WidgetTypeEP13QGraphicsItem @ 129 NONAME - _ZN21CalenThickLinesDrawerD0Ev @ 130 NONAME - _ZN21CalenThickLinesDrawerD1Ev @ 131 NONAME - _ZN21CalenThickLinesDrawerD2Ev @ 132 NONAME - _ZNK14CalenMonthGrid10metaObjectEv @ 133 NONAME - _ZNK14CalenMonthView10metaObjectEv @ 134 NONAME - _ZNK16CalenPreviewPane10metaObjectEv @ 135 NONAME - _ZNK17CalenSettingsView10metaObjectEv @ 136 NONAME - _ZNK21CalenThickLinesDrawer10metaObjectEv @ 137 NONAME - _ZTI14CalenMonthGrid @ 138 NONAME - _ZTI14CalenMonthView @ 139 NONAME - _ZTI16CalenPreviewPane @ 140 NONAME - _ZTI17CalenSettingsView @ 141 NONAME - _ZTI21CalenThickLinesDrawer @ 142 NONAME - _ZTV14CalenMonthGrid @ 143 NONAME - _ZTV14CalenMonthView @ 144 NONAME - _ZTV16CalenPreviewPane @ 145 NONAME - _ZTV17CalenSettingsView @ 146 NONAME - _ZTV21CalenThickLinesDrawer @ 147 NONAME - _ZThn16_N12CalenDayViewD0Ev @ 148 NONAME - _ZThn16_N12CalenDayViewD1Ev @ 149 NONAME - _ZThn16_N14CalenMonthGridD0Ev @ 150 NONAME - _ZThn16_N14CalenMonthGridD1Ev @ 151 NONAME - _ZThn16_N14CalenMonthViewD0Ev @ 152 NONAME - _ZThn16_N14CalenMonthViewD1Ev @ 153 NONAME - _ZThn16_N16CalenPreviewPaneD0Ev @ 154 NONAME - _ZThn16_N16CalenPreviewPaneD1Ev @ 155 NONAME - _ZThn16_N17CalenSettingsViewD0Ev @ 156 NONAME - _ZThn16_N17CalenSettingsViewD1Ev @ 157 NONAME - _ZThn16_N18CalenDayViewWidgetD0Ev @ 158 NONAME - _ZThn16_N18CalenDayViewWidgetD1Ev @ 159 NONAME - _ZThn16_N21CalenThickLinesDrawerD0Ev @ 160 NONAME - _ZThn16_N21CalenThickLinesDrawerD1Ev @ 161 NONAME - _ZThn28_N12CalenDayView18HandleNotificationE18TCalenNotification @ 162 NONAME - _ZThn8_N12CalenDayViewD0Ev @ 163 NONAME - _ZThn8_N12CalenDayViewD1Ev @ 164 NONAME - _ZThn8_N14CalenMonthGrid15mousePressEventEP24QGraphicsSceneMouseEvent @ 165 NONAME - _ZThn8_N14CalenMonthGrid17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 166 NONAME - _ZThn8_N14CalenMonthGridD0Ev @ 167 NONAME - _ZThn8_N14CalenMonthGridD1Ev @ 168 NONAME - _ZThn8_N14CalenMonthViewD0Ev @ 169 NONAME - _ZThn8_N14CalenMonthViewD1Ev @ 170 NONAME - _ZThn8_N16CalenPreviewPane15mousePressEventEP24QGraphicsSceneMouseEvent @ 171 NONAME - _ZThn8_N16CalenPreviewPane17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 172 NONAME - _ZThn8_N16CalenPreviewPaneD0Ev @ 173 NONAME - _ZThn8_N16CalenPreviewPaneD1Ev @ 174 NONAME - _ZThn8_N17CalenSettingsViewD0Ev @ 175 NONAME - _ZThn8_N17CalenSettingsViewD1Ev @ 176 NONAME - _ZThn8_N18CalenDayViewWidgetD0Ev @ 177 NONAME - _ZThn8_N18CalenDayViewWidgetD1Ev @ 178 NONAME - _ZThn8_N21CalenThickLinesDrawer5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 179 NONAME - _ZThn8_N21CalenThickLinesDrawerD0Ev @ 180 NONAME - _ZThn8_N21CalenThickLinesDrawerD1Ev @ 181 NONAME - _ZN14CalenMonthGrid5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 182 NONAME - _ZN14CalenMonthView27showHideRegionalInformationEv @ 183 NONAME - _ZThn8_N14CalenMonthGrid5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 184 NONAME - _ZN16CalenPreviewPane14mouseMoveEventEP24QGraphicsSceneMouseEvent @ 185 NONAME - _ZThn8_N16CalenPreviewPane14mouseMoveEventEP24QGraphicsSceneMouseEvent @ 186 NONAME - _ZN14CalenMonthView22addRemoveActionsInMenuEv @ 187 NONAME - diff -r fd30d51f876b -r b6db4fd4947b calendarui/globaldata/bwins/calenglobaldatau.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/globaldata/bwins/calenglobaldatau.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,6 @@ +EXPORTS + ??0CalenContextImpl@@QAE@XZ @ 1 NONAME ; CalenContextImpl::CalenContextImpl(void) + ??1CalenContextImpl@@QAE@XZ @ 2 NONAME ; CalenContextImpl::~CalenContextImpl(void) + ??0CalenContextImpl@@QAE@PAVMCalenContextChangeObserver@@@Z @ 3 NONAME ; CalenContextImpl::CalenContextImpl(class MCalenContextChangeObserver *) + ??0CalenContextImpl@@QAE@ABV0@@Z @ 4 NONAME ; CalenContextImpl::CalenContextImpl(class CalenContextImpl const &) + diff -r fd30d51f876b -r b6db4fd4947b calendarui/globaldata/eabi/calenglobaldatau.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/globaldata/eabi/calenglobaldatau.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,10 @@ +EXPORTS + _ZN16CalenContextImplC1EP27MCalenContextChangeObserver @ 1 NONAME + _ZN16CalenContextImplC1ERKS_ @ 2 NONAME + _ZN16CalenContextImplC1Ev @ 3 NONAME + _ZN16CalenContextImplC2EP27MCalenContextChangeObserver @ 4 NONAME + _ZN16CalenContextImplC2ERKS_ @ 5 NONAME + _ZN16CalenContextImplC2Ev @ 6 NONAME + _ZN16CalenContextImplD1Ev @ 7 NONAME + _ZN16CalenContextImplD2Ev @ 8 NONAME + diff -r fd30d51f876b -r b6db4fd4947b calendarui/globaldata/inc/calencontext.h --- a/calendarui/globaldata/inc/calencontext.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/globaldata/inc/calencontext.h Mon Jun 28 15:22:02 2010 +0530 @@ -54,10 +54,8 @@ /** * Sets the date and time currently focused. * @param aFocusTime The new focus date and time. - * @param aViewId The view id of the currently active view. */ - virtual void setFocusDateAndTimeL( const QDateTime& focusDateTime, - const int& viewId ) = 0; + virtual void setFocusDateAndTime( const QDateTime& focusDateTime) = 0; /** * Sets the date currently focused. When retrieving the focus @@ -65,29 +63,23 @@ * will be set to the default of view. When retrieving the focus * time only, it will be set to -1. * @param aFocusDate The new focus date and time. - * @param aViewId The view id of the currently active view. */ - virtual void setFocusDateL( const QDateTime& focusDateTime, - const int& viewId ) = 0; + virtual void setFocusDate( const QDateTime& focusDateTime) = 0; /** * Sets the id of the instance currently focused. * @param aInstanceId the id of the focused instance. - * @param aViewId The view id of the currently active view. */ - virtual void setInstanceIdL( const TCalenInstanceId& instanceId, - const int& viewId ) = 0; + virtual void setInstanceId( const TCalenInstanceId& instanceId ) = 0; /** * Sets the time and instance currently focused. * @param aFocusTime The new focus time. If no time is focused, set * the Utc time of this object to be Time::NullTTime. * @param aInstanceId the id of the focused instance. - * @param aViewId The view id of the currently active view. */ - virtual void setFocusDateAndTimeAndInstanceL( const QDateTime& focusDateTime, - const TCalenInstanceId& aInstanceId, - const int& viewId ) = 0; + virtual void setFocusDateAndTimeAndInstance( const QDateTime& focusDateTime, + const TCalenInstanceId& aInstanceId ) = 0; // Getters /** @@ -95,7 +87,8 @@ * @return The currently focused date and time. When no time is * focused, the default time on the current date will be returned. */ - virtual QDateTime focusDateAndTimeL() const = 0; + virtual QDateTime focusDateAndTime() const = 0; + /** * Gets the time currently focused. @@ -111,13 +104,6 @@ */ virtual TCalenInstanceId instanceId() const = 0; - /** - * Gets the id of the currently active view. - * @return The view id of the currently active view. - */ - virtual int viewId() const = 0; - - public: // For Mutliple Context Support /** @@ -154,23 +140,6 @@ */ virtual int mutlipleContextIdsCount() = 0; - /** - * Sets the user selected landmark - * @param aLandMark Landmark object - */ - //virtual void SetLandMark(CPosLandmark* aLandMark) = 0; - - /** - * Returns the user selected landmark - * @return Landmark object - */ - //virtual CPosLandmark* GetLandMark() = 0; - - /** - * Resets the landmark - */ - //virtual void ResetLandMark() = 0; - }; #endif // CALENCONTEXT_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/globaldata/inc/calencontextimpl.h --- a/calendarui/globaldata/inc/calencontextimpl.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/globaldata/inc/calencontextimpl.h Mon Jun 28 15:22:02 2010 +0530 @@ -50,7 +50,7 @@ CALENCONTEXTIMPL_EXPORT CalenContextImpl( MCalenContextChangeObserver* observer ); CALENCONTEXTIMPL_EXPORT CalenContextImpl(); CALENCONTEXTIMPL_EXPORT CalenContextImpl( const CalenContextImpl& context ); - ~CalenContextImpl(); + CALENCONTEXTIMPL_EXPORT ~CalenContextImpl(); public: // from MCalenContext // Utils @@ -72,10 +72,8 @@ /** * Sets the date and time currently focused. * @param aFocusTime The new focus date and time. - * @param aViewId The view id of the currently active view. */ - void setFocusDateAndTimeL( const QDateTime& focusDateTime, - const int& viewId ); + void setFocusDateAndTime( const QDateTime& focusDateTime); /** * Sets the date currently focused. When retrieving the focus @@ -83,29 +81,23 @@ * will be set to the default of view. When retrieving the focus * time only, it will be set to -1. * @param aFocusDate The new focus date and time. - * @param aViewId The view id of the currently active view. */ - void setFocusDateL( const QDateTime& focusDateTime, - const int& viewId ); + void setFocusDate( const QDateTime& focusDateTime ); /** * Sets the id of the instance currently focused. * @param aInstanceId the id of the focused instance. - * @param aViewId The view id of the currently active view. */ - void setInstanceIdL( const TCalenInstanceId& instanceId, - const int& viewId ); + void setInstanceId( const TCalenInstanceId& instanceId ); /** * Sets the time and instance currently focused. * @param aFocusTime The new focus time. If no time is focused, set * the Utc time of this object to be Time::NullTTime. * @param aInstanceId the id of the focused instance. - * @param aViewId The view id of the currently active view. */ - void setFocusDateAndTimeAndInstanceL( const QDateTime& focusDateTime, - const TCalenInstanceId& aInstanceId, - const int& viewId ); + void setFocusDateAndTimeAndInstance( const QDateTime& focusDateTime, + const TCalenInstanceId& aInstanceId); // Getters /** @@ -113,7 +105,7 @@ * @return The currently focused date and time. When no time is * focused, the default time on the current date will be returned. */ - QDateTime focusDateAndTimeL() const; + QDateTime focusDateAndTime() const; /** * Gets the time currently focused. @@ -129,12 +121,6 @@ */ TCalenInstanceId instanceId() const; - /** - * Gets the id of the currently active view. - * @return The view id of the currently active view. - */ - int viewId() const; - public: // Multiple Context support diff -r fd30d51f876b -r b6db4fd4947b calendarui/globaldata/src/calencontextimpl.cpp --- a/calendarui/globaldata/src/calencontextimpl.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/globaldata/src/calencontextimpl.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -71,9 +71,13 @@ // (other items were commented in a header). // ---------------------------------------------------------------------------- // -CalenContextImpl::~CalenContextImpl() - { - } +EXPORT_C CalenContextImpl::~CalenContextImpl() + { + if(mMutlipleContextIds.count()) + { + mMutlipleContextIds.clear(); + } + } // ---------------------------------------------------------------------------- // CalenContextImpl::DefaultTimeForViews @@ -111,23 +115,21 @@ // (other items were commented in a header). // ---------------------------------------------------------------------------- // -void CalenContextImpl::setFocusDateAndTimeL( const QDateTime& focusDateTime, - const int& viewId ) +void CalenContextImpl::setFocusDateAndTime( const QDateTime& focusDateTime) { + mFocusDate = focusDateTime; + mFocusTime = focusDateTime.time().minute() + 1; + + if( mFocusTime < 0 ) + mFocusTime = 0; + mInstanceId = TCalenInstanceId::nullInstanceId(); + // If this fails you're using a context that was constructed yourself. // Use the accessor from the global data instead, or don't try to set // anything on this context. - ASSERT( mObserver ); - - mFocusDate = focusDateTime; - mFocusTime = focusDateTime.time().minute() + 1; - - ASSERT( mFocusTime >= 0 ); - mInstanceId = TCalenInstanceId::nullInstanceId(); - mViewId = viewId; - - mObserver->ContextChanged(); + if(mObserver) + mObserver->ContextChanged(); } // ---------------------------------------------------------------------------- @@ -136,20 +138,17 @@ // (other items were commented in a header). // ---------------------------------------------------------------------------- // -void CalenContextImpl::setFocusDateL( const QDateTime& focusDateTime, - const int& viewId ) +void CalenContextImpl::setFocusDate( const QDateTime& focusDateTime) { + mFocusDate = focusDateTime; + mFocusTime = -1; + mInstanceId = TCalenInstanceId::nullInstanceId(); + // If this fails you're using a context that was constructed yourself. // Use the accessor from the global data instead, or don't try to set // anything on this context. - ASSERT( mObserver ); - - mFocusDate = focusDateTime; - mFocusTime = -1; - mInstanceId = TCalenInstanceId::nullInstanceId(); - mViewId = viewId; - - mObserver->ContextChanged(); + if(mObserver) + mObserver->ContextChanged(); } // ---------------------------------------------------------------------------- @@ -158,22 +157,19 @@ // (other items were commented in a header). // ---------------------------------------------------------------------------- // -void CalenContextImpl::setInstanceIdL( const TCalenInstanceId& aInstanceId, - const int& viewId ) +void CalenContextImpl::setInstanceId( const TCalenInstanceId& aInstanceId ) { + // Set the null date and time + mFocusDate = QDateTime(); + mFocusTime = -1; + mInstanceId = aInstanceId; + // If this fails you're using a context that was constructed yourself. // Use the accessor from the global data instead, or don't try to set // anything on this context. - ASSERT( mObserver ); - - // Set the null date and time - mFocusDate = QDateTime(); - mFocusTime = -1; - mInstanceId = aInstanceId; - mViewId = viewId; - - mObserver->ContextChanged(); + if(mObserver) + mObserver->ContextChanged(); } // ----------------------------------------------------------------------------- @@ -182,23 +178,20 @@ // (other items were commented in a header). // ----------------------------------------------------------------------------- // -void CalenContextImpl::setFocusDateAndTimeAndInstanceL( const QDateTime& focusDateTime, - const TCalenInstanceId& instanceId, - const int& viewId ) +void CalenContextImpl::setFocusDateAndTimeAndInstance( const QDateTime& focusDateTime, + const TCalenInstanceId& instanceId ) { + mFocusDate = focusDateTime; + mFocusTime = focusDateTime.time().minute() + 1; + if( mFocusTime < 0 ) + mFocusTime = 0; + mInstanceId = instanceId; // If this fails you're using a context that was constructed yourself. // Use the accessor from the global data instead, or don't try to set // anything on this context. - ASSERT( mObserver ); - - mFocusDate = focusDateTime; - mFocusTime = focusDateTime.time().minute() + 1; - ASSERT( mFocusTime >= 0 ); - mInstanceId = instanceId; - mViewId = viewId; - - mObserver->ContextChanged(); + if(mObserver) + mObserver->ContextChanged(); } // ----------------------------------------------------------------------------- @@ -207,7 +200,7 @@ // (other items were commented in a header). // ----------------------------------------------------------------------------- // -QDateTime CalenContextImpl::focusDateAndTimeL() const +QDateTime CalenContextImpl::focusDateAndTime() const { QDateTime ret; @@ -250,19 +243,6 @@ } // ----------------------------------------------------------------------------- -// CalenContextImpl::ViewId -// Returns the view id -// (other items were commented in a header). -// ----------------------------------------------------------------------------- -// -int CalenContextImpl::viewId() const - { - TRACE_ENTRY_POINT; - TRACE_EXIT_POINT; - return mViewId; - } - -// ----------------------------------------------------------------------------- // CalenContextImpl::SetMutlipleContextIds // Set multiple context ids // (other items were commented in a header). diff -r fd30d51f876b -r b6db4fd4947b calendarui/inc/CalenConstants.h --- a/calendarui/inc/CalenConstants.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/inc/CalenConstants.h Mon Jun 28 15:22:02 2010 +0530 @@ -63,6 +63,9 @@ }; const TInt KWeekTitleSize(64); + +const QString activityName = "Calendar"; //Activity Name to be stored in Activity Manager DB + // FIXME: can be here now, but later on move to some other header. enum TCalenWeekTitle { diff -r fd30d51f876b -r b6db4fd4947b calendarui/inc/CalenUid.h --- a/calendarui/inc/CalenUid.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/inc/CalenUid.h Mon Jun 28 15:22:02 2010 +0530 @@ -24,7 +24,7 @@ // UIDS of the S60 Calendar native views const TInt KCalenMonthViewUidValue = 0x00000000 ; -const TInt KCalenDayViewUidValue = 0x00000002; +const TInt KCalenAgendaViewUidValue = 0x00000002; const TInt KCalenEventViewUidValue = 0x00000003; const TInt KCalenLandscapeDayViewUidValue = 0x00000004; const TInt KCalenTodoEditorViewUidValue = 0x00000005; @@ -32,12 +32,13 @@ const TUid KUidCalenMonthView = { KCalenMonthViewUidValue }; -const TUid KUidCalenDayView = { KCalenDayViewUidValue }; +const TUid KUidCalenAgendaView = { KCalenAgendaViewUidValue }; const TUid KCalenTodoEditorView = { KCalenTodoEditorViewUidValue }; const TUid KUidCalenEventView = { KCalenEventViewUidValue }; const TUid KUidCalenLandscapeDayView = { KCalenLandscapeDayViewUidValue }; const TUid KUidCalenSettingsView = { KCalenSettingsViewUidValue }; +const TUid KCalenChineseImplUid = {0x2002EA3D}; #endif // CALENUID_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/inc/CalendarInternalCRKeys.h --- a/calendarui/inc/CalendarInternalCRKeys.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,107 +0,0 @@ -/* -* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: ?Description -* -*/ - - -#ifndef CALENDARINTERNALCRKEYS_H -#define CALENDARINTERNALCRKEYS_H - -//#include - -/** Calendar UI Settings API */ -/** Provides access to the Calendar application's settings */ - -const TUid KCRUidCalendar = {0x101F874B}; - - -/** -* Default alarm time in minutes before event starting time. -* Value is an integer between 0 and 60. Default: 15. -**/ -const TUint32 KCalendarDefaultAlarmTime = 0x00000000; - -/** -* Default starting view for Calendar. Value is an integer between 0 and 2. -* 0 = Month view (default) -* 1 = Week view -* 2 = Day view -**/ -const TUint32 KCalendarDefaultStartView = 0x00000001; - -/** -* Week view title in Calendar application. -* Value is eihter integer 0 or 1 -* 0 = Week number (default) -* 1 = Week dates -**/ -const TUint32 KCalendarWeekViewTitle = 0x00000002; - -/** -* Is Chinese Lunar calendar information shown in Calendar -* (only available if feature is included in ROM image). -* Value is either integer 0 or 1 -* 0 = Off -* 1 = On (default) -* This key value is deprecated and has been replaced by the KCRUidCalenLunarPlugin key. -**/ -const TUint32 KCalendarLunarCalendar = 0x00000003; - -/** -* Calendar alarm sound file, string. -* Default value : "z:\data\sounds\digital\alarm.aac" -**/ -const TUint32 KCalendarSoundFile = 0x00000004; - -/** -* Default Calendar alarm sound file. -* Default value : "z:\data\sounds\digital\alarm.aac" -**/ -const TUint32 KCalendarDefaultSoundFile = 0x00000005; - -/** -* A flag that is set when a Calendar alarm was lost due to time change. -* Default value: 0 -*/ -const TUint32 KCalendarLostAlarm = 0x00000006; - -/** -* Calendar alarm snooze time interval in minutes. -* Default value: 5 -*/ -const TUint32 KCalendarSnoozeTime = 0x00000007; - -//Added as an addition to the Symbian fix -/** -* Calendar Persistent Time to store the last time the System Time updated. -* Default Value : 0 -*/ -const TReal KCalendarPersistentTime = 0x00000009; - -/** -* Text string containing UIDs and enabled/disabled flag (separated -* by commas) for Calendar plugins. -* Default value: Empty -*/ -const TUint32 KCalendarPluginAvailability = 0x0000000A; - -/** -* Defines whether regional information must be shown in the Calendar or not -* Default value: 1 -*/ -const TUint32 KShowRegionalInformation = 0x0000000B; - - -#endif // CALENDARINTERNALCRKEYS_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/inc/CalendarPrivateCRKeys.h --- a/calendarui/inc/CalendarPrivateCRKeys.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/inc/CalendarPrivateCRKeys.h Mon Jun 28 15:22:02 2010 +0530 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -11,86 +11,28 @@ * * Contributors: * -* Description: ?Description +* Description: The file contains the uid of keys used by application. +* * */ - #ifndef CALENDARPRIVATECRKEYS_H #define CALENDARPRIVATECRKEYS_H -#include - -/** Calendar UI Local Variation API */ -/** Provides access to the Calendar application's local variation setting */ - -const TUid KCRUidCalendarLV = {0x101F874C}; - +#include /** -* Local variation bitmask for Caledar configuration. -* For values refer to CalendarVariant.hrh. -* +* Defines whether week number must be shown in month view of the calendar. +* Default value: 0 **/ -const TUint32 KCalenLVFlags = 0x00000007; - - -/** Calendar Thai Plugin Settings API */ -/** Provides access to the Calendar Thai Plugin's settings */ -const TUid KCRUidCalenThaiPlugin = {0x102823D2}; - -/** -* User modifiable setting -* Is Thai regional Calendar information shown in Calendar -* (only available if feature is included in phone, -* currnet display language is Thai) -* Value is either integer 0 or 1 -* 0 = Off -* 1 = On (default) -**/ -const TUint32 KCalenThaiPluginEnabled = 0x00000000; - - -/** Calendar Lunar Calendar Plugin Settings API */ -/** Provides access to the Calendar Lunar Plugin's settings */ -const TUid KCRUidCalenLunarPlugin = { 0x102823D1 }; +const long int KCalendarShowWeekNum = 0x00000000; /** -* User modifiable setting -* Is Chinese Lunar Calendar information shown in Calendar -* (only available if feature is included in phone, -* currnet display language is some of Chinese languages) -* Value is either integer 0 or 1 -* 0 = Off -* 1 = On (default) -**/ -const TUint32 KCalenChineseLunarEnabled = 0x00000000; - - -/** -* User modifiable setting -* Is Vietnamese Lunar Calendar information shown in Calendar -* (only available if feature is included in phone, -* currnet display language is Vietnamese languages) -* Value is either integer 0 or 1 -* 0 = Off -* 1 = On (default) -**/ -const TUint32 KCalenVietnameseLunarEnabled = 0x00000001; - - -/** Calendar UI Extensions Settings API */ -/** Provides access to user settings that enable Calendar UI extensions and customizations */ -const TUid KCRUidCalenUIExtensions = { 0x10282ED7 }; - -/** -* User modifiable setting to enable the AIW External Calendar. -* (only available if an AIW provider is included in phone) -* Value is either integer 0 or 1 -* 0 = Off -* 1 = On (default) -**/ -const TUint32 KCalenExternalCalendarEnabled = 0x00000000; - +* Defines whether regional information must be shown in the Calendar. +* Default value: 1 +*/ +const long int KCalendarShowRegionalInfo = 0x00000002; #endif // CALENDARPRIVATECRKEYS_H + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/inc/calenagendautils.h --- a/calendarui/inc/calenagendautils.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/inc/calenagendautils.h Mon Jun 28 15:22:02 2010 +0530 @@ -43,12 +43,6 @@ public: /** - * Removes entries ending aDay at midnight. - **/ - static void removeEntriesEndingAtMidnightL( QList& list, - const QDateTime& day ); - - /** * Checks that if entry ends at starting midnight of the day, * but has started earlier. * Such entries are not shown in day that they end, because end time @@ -56,7 +50,7 @@ * @returns ETrue, if entry ends at starting midnight of day, but starts before that * EFalse, otherwise **/ - static bool endsAtStartOfDayL( AgendaEntry& entry, + static bool endsAtStartOfDay( AgendaEntry& entry, const QDateTime& day ); }; diff -r fd30d51f876b -r b6db4fd4947b calendarui/inc/calencommandhandler.h --- a/calendarui/inc/calencommandhandler.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/inc/calencommandhandler.h Mon Jun 28 15:22:02 2010 +0530 @@ -39,7 +39,6 @@ int iCommand; QDateTime iFocusDateAndTime; TCalenInstanceId iInstanceId; - int iViewId; }; inline TCalenCommand::TCalenCommand() @@ -50,9 +49,8 @@ MCalenContext& aContext) { iCommand = aCommand; - iFocusDateAndTime = aContext.focusDateAndTimeL(); + iFocusDateAndTime = aContext.focusDateAndTime(); iInstanceId = aContext.instanceId(); - iViewId = aContext.viewId(); } inline TInt TCalenCommand::Command() const @@ -62,9 +60,8 @@ inline void TCalenCommand::GetContextL( MCalenContext& aContext ) const { - aContext.setFocusDateAndTimeAndInstanceL( iFocusDateAndTime, - iInstanceId, - iViewId ); + aContext.setFocusDateAndTimeAndInstance( iFocusDateAndTime, + iInstanceId ); } diff -r fd30d51f876b -r b6db4fd4947b calendarui/inc/calencommon.h --- a/calendarui/inc/calencommon.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/inc/calencommon.h Mon Jun 28 15:22:02 2010 +0530 @@ -19,16 +19,17 @@ #ifndef CALENCOMMON_H #define CALENCOMMON_H -#define CALEN_DAYVIEW_XML_FILE ":/xml/calendayview.docml" -#define CALEN_DAYVIEW "dayView" -#define CALEN_DAYVIEW_WIDGET "dayViewWidget" -#define CALEN_DAYVIEW_LISTWIDGET "eventsList" -#define CALEN_DAYVIEW_HEADING "headingWidget" -#define CALEN_DAYVIEW_HEADING_REGIONALPLUGIN_WIDGET "headingRegionalPluginWidget" -#define CALEN_DAYVIEW_MENU_NEW_EVENT "newEventAction" -#define CALEN_DAYVIEW_MENU_GO_TO_TODAY "todayAction" -#define CALEN_DAYVIEW_MENU_GO_TO_DATE "goToDateAction" -#define CALEN_DAYVIEW_MENU_SETTINGS "settingsAction" +#define CALEN_AGENDAVIEW_XML_FILE ":/xml/calenagendaview.docml" +#define CALEN_AGENDAVIEW "agendaView" +#define CALEN_AGENDAVIEW_WIDGET "agendaViewWidget" +#define CALEN_AGENDAVIEW_LISTWIDGET "eventsList" +#define CALEN_AGENDAVIEW_HEADING "headingWidget" +#define CALEN_AGENDAVIEW_HEADING_REGIONALPLUGIN_WIDGET "headingRegionalPluginWidget" +#define CALEN_AGENDAVIEW_MENU_NEW_EVENT "newEventAction" +#define CALEN_AGENDAVIEW_MENU_GO_TO_TODAY "todayAction" +#define CALEN_AGENDAVIEW_MENU_GO_TO_DATE "goToDateAction" +#define CALEN_AGENDAVIEW_MENU_SWITCH_TO_DAYVIEW "switchToDayViewAction" +#define CALEN_AGENDAVIEW_MENU_SETTINGS "settingsAction" #define CALEN_PORTRAIT "portrait" #define CALEN_LANDSCAPE "landscape" #define CALEN_MONTHVIEW_XML_FILE ":/xml/calenmonthview.docml" @@ -41,6 +42,9 @@ #define CALEN_PREVPREVIEWPARENT "prevPaneWidget" #define CALEN_CURRPREVIEWPARENT "currPaneWidget" #define CALEN_NEXTPREVIEWPARENT "nextPaneWidget" +#define CALEN_PREVREGIONALINFO "prevRegionalInfo" +#define CALEN_CURRREGIONALINFO "currRegionalInfo" +#define CALEN_NEXTREGIONALINFO "nextRegionalInfo" #define CALEN_NEXTPANELAYOUT "nextPaneLayout" #define CALEN_CURRPANELAYOUT "currPaneLayout" #define CALEN_PREVPREVIEWPANE "prevPreviewPane" diff -r fd30d51f876b -r b6db4fd4947b calendarui/inc/calendateutils.h --- a/calendarui/inc/calendateutils.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/inc/calendateutils.h Mon Jun 28 15:22:02 2010 +0530 @@ -62,12 +62,6 @@ static bool isValidDay( const QDateTime& time ); /** - * Return ETrue if aTime is NULL - * @param aTime time to be compared against NULL time - */ - static bool isNullTime( QDateTime& time ); - - /** * Return Min or Max time if aTime goes out of bounds. * Valid range is [CalenDateUtils::MinTime(), CalenDateUtils::MaxTime] * @param aTime time to be checked @@ -125,8 +119,6 @@ */ static QDateTime defaultTime( const QDateTime& date ); - static QDateTime pastOf(const QDateTime& dateTime, int numOfDays); - static QDateTime futureOf(const QDateTime& dateTime, int numOfDays); diff -r fd30d51f876b -r b6db4fd4947b calendarui/inc/hb_calencommands.hrh --- a/calendarui/inc/hb_calencommands.hrh Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/inc/hb_calencommands.hrh Mon Jun 28 15:22:02 2010 +0530 @@ -38,8 +38,8 @@ { ECalenMonthView = ECalenViewCommandBase, ECalenWeekView, + ECalenAgendaView, ECalenDayView, - ECalenLandscapeDayView, ECalenTodoEditor, ECalenTodoEditorDone, ECalenForwardsToDayView, diff -r fd30d51f876b -r b6db4fd4947b calendarui/loc/calendar.loc --- a/calendarui/loc/calendar.loc Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2037 +0,0 @@ -/* -* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: This is a localisation file for Calendar -* A _loc file is the one and only place where the logical -* strings to be localised are defined -* -*/ - - - -// LOCALISATION STRINGS - - -//d:Application title for listview -//l:list_single_large_graphic_pane_t1 -// -#define qtn_apps_calendar_list "Calendar" - -//d:Application title for general settings pane -//l:list_single_large_graphic_pane_t1_cp2 -// -#define qtn_cale_title_calendar "Calendar" - -//d:Application title for grid -//l:cell_app_pane_t1 -// -#define qtn_apps_calendar_grid "Calendar" - -//d:Opens New entry SubMenu -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_opt_make_note "New entry" - -//d:Opens delete SubMenu in MonthView -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_opt_delete "Delete" - -//d:Deletes a note -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_om_delete "Delete" - -//d:Discard changes to a note -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_om_cancel_changes "Discard changes" - -//d:Confirmation text when discarding changes to a note -//l:popup_note_window -// -#define qtn_cale_query_cancel_changes "Discard changes?" - -//d:Opens SettingView -//l:list_single_pane_t1_cp2 -// -#define text_calendar_settings "Settings" - -//d:Opens DayView -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_opt_open "Open" - -//d:Opens WeekView -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_opt_view_week "View by weeks" - -//d:Jumps to a specific date -//l:list_single_pane_t1_cp2 -// -#define text_calendar_goto_date "Go to date" - -//d:Opens Meeting note -//l:list_single_popup_submenu_pane_t1 -// -#define qtn_cale_meeting_note "Meeting" - - -//d:Opens Meeting Request note -//d:Option list item for this is "Make Note" -//l:list_single_popup_submenu_pane_t1 -//w: -//r:3.0 -// -#define qtn_cale_meeting_request_note "Meeting Request" - - -//d:Opens Anniversary Note -//l:list_single_popup_submenu_pane_t1 -// -#define qtn_cale_note_anniversary "Anniversary" - -//d:Opens Day Note -//l:list_single_popup_submenu_pane_t1 -// -#define qtn_cale_day_note "Day note" - -//d:Opens MonthView -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_opt_view_month "View month" - -//d:Deletes all notes -//l:list_single_popup_submenu_pane_t1 -// -#define qtn_cale_sub_all "All notes" - -//d:the date before the notes are to be deleted. -//l:list_single_popup_submenu_pane_t1 -// -#define qtn_cale_sub_setdate "Before set date" - -//d:Settings is changed -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_om_change "Change" - -//d:Subject item text of Meeting -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_subject "subject" - -//d:Start date item text of Meeting form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_meeting_date "start date" - -//d:End date item text of Meeting form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_meeting_end "end date" - -//d:Start date and time item text of entry editor -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_start_time_date "start time and date" - -//d:End date and time item text of entry editor -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_end_time_date "end time and date" - -//d:Alarm date and time item text of entry editor -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_alarm_time_date "alarm time and date" - -//d:Start time item text of Meeting form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_meeting_start "start time" - -//d:End time item text of Meeting form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_end_meet_time "end time" - -//d:Alarm item text of Meeting, Anniversary form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_alarm_activity "alarm" - -//d:Alarm time item text of Meeting, Anniversary form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_meeting_alarm "alarm time" - -//d:Alarm date item text of Meeting, Anniversary form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_meeting_alarmdate "alarm date" - -//d:Repeat item text of Meeting, Day form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_meeting_repeat "repeat" - -//d:Repeat until item text of Meeting, Day form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_meeting_until "repeat until" - -//d:Confidentiality item text of Meeting form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_meeting_confident "synchronisation" - -//d:Subject item text of Anniversary form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_anniversary_occasion "occasion" - -//d:Start date item text of Anniversary form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_anniversary_start_date "date" - -//d:Subject item text of Day form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_day_description "description" - -//d:Start date item text of Day form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_day_start_date "start date" - -//d:End date item text of Day form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_day_end_date "end date" - -//d:Occasion item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_occasion "Occasion:" - -//d:Date item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_date "Date:" - -//d:Subject item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_subject "Subject:" - -//d:Location item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_location "Location:" - -//d:Synchronisation item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_sync "Synchronisation:" - -//d:Alarm item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_alarm "Alarm:" - -//d:Repeat item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_repeat_daily "Repeats daily:" - -//d:Repeat item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_repeat_weekly "Repeats weekly:" - -//d:Repeat item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_repeat_fortnightly "Repeats fortnightly:" - -//d:Repeat item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_repeat_monthly "Repeats monthly:" - -//d:Repeat item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_repeat_yearly "Repeats yearly:" - -//d:Repeat item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_repeat_other "Recurring entry:" - -//d:Repeat item text of note viewer when no end date (repeat from ...) -//d:%0U is date entry repeats from -//l:list_form_graphic_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_valid_forever "From %0U" - -//d:Navi pane decoration for event viewers -//d:%0U is current instance date -//d:%1U is index of current instance -//d:%2U is total instance count for current day -//l:navi_text_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_navi "%0U %1U/%2U" - -//d:Repeat item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_repeat "Repeat:" - -//d:Time item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_time "Time:" - -//d:Due date item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_due_date "Due date:" - -//d:Since item text of note viewer (anniversaries only) -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_since "Since:" - -//d:Priority item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_prio "Priority:" - -//d:Description item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_desc "Description:" - -//d:Private item text of note viewer (Sync) -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_sync_private "Private" - -//d:Public item text of note viewer (Sync) -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_sync_public "Public" - -//d:None item text of note viewer (Sync) -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_sync_none "None" - -//d:High item text of note viewer (Priority) -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_prio_high "High" - -//d:Normal item text of note viewer (Priority) -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_prio_normal "Normal" - -//d:Low item text of note viewer (Priority) -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_prio_low "Low" - -//d:Completed item text of note viewer (Priority) -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_completed "Completed:" - -//d:Date and time when appointment starts and ends on the same day -//d:The string is small enough to fit onto one line -//d:%0U is start time -//d:%1U is end time -//d:%2U is start date -//l:popup_preview_text_window/opt1 -//r:3.2 -// -#define qtn_cale_viewer_time_day "%0U - %1U %2U" - -//d:Date and time when appointment starts and ends on the same day -//d:The string is too long to fit onto one line so must include a linebreak -//d:%0U is start time -//d:%1U is end time -//d:%2U is start date -//d:<\x2028> is line break -//l:popup_preview_text_window/opt1 -//r:3.2 -// -#define qtn_cale_viewer_time_day_wrapped "%0U - %1U"<0x2028>"%2U" - -//d:Date and time when appointment starts and ends on different days -//d:The string is small enough to fit onto one line -//d:%0U is start time -//d:%1U is start date -//d:%2U is end time -//d:%3U is end date -//l:popup_preview_text_window/opt1 -//r:3.2 -// -#define qtn_cale_viewer_time_days "%0U %1U - %2U %3U" - -//d:Date and time when appointment starts and ends on different days -//d:The string is too long to fit onto one line so must include a linebreak -//d:%0U is start time -//d:%1U is start date -//d:%2U is end time -//d:%3U is end date -//d:<\x2028> is line break -//l:popup_preview_text_window/opt1 -//r:3.2 -// -#define qtn_cale_viewer_time_days_wrapped "%0U %1U -"<0x2028>"%2U %3U" - -//d:Date and time of alarm (when alarm is on different day to event) -//d:%0U is alarm time -//d:%1U is alarm date -//l:popup_preview_text_window/opt1 -//r:3.2 -// -#define qtn_cale_viewer_alarm_time "%0U %1U" - -//d:Start and end date of event, when event lasts for more than one day -//d:%0U is start date -//d:%1U is end date -//l:msg_body_pane/opt -//r:3.2 -// -#define qtn_cale_viewer_valid_limited "%0U - %1U" - -//d:Error text when adjusting repeating meeting instance times -//l:popup_note_window -//r:3.2 -// -#define qtn_cale_note_cannot_occur_daily "%N day meeting cannot repeat daily" - -//d:Error text when adjusting repeating meeting instance times -//l:popup_note_window -//r:3.2 -// -#define qtn_cale_note_cannot_occur_weekly "%N day meeting cannot repeat weekly" - -//d:Error text when adjusting repeating meeting instance times -//l:popup_note_window -//r:3.2 -// -#define qtn_cale_note_cannot_occur_fortnightly "%N day meeting cannot repeat fortnightly" - -//d:Error text when adjusting repeating meeting instance times -//l:popup_note_window -//r:3.2 -// -#define qtn_cale_note_cannot_occur_monthly "%N day meeting cannot repeat monthly" - -//d:Error text when adjusting repeating meeting instance times -//l:popup_note_window -//r:3.2 -// -#define qtn_cale_note_cannot_occur_yearly "%N day meeting cannot repeat yearly" - -//d:Error text when attempting to move a meeting out of sequence -//l:popup_note_window -//r:3.2 -// -#define qtn_cale_note_child_out_of_sequence "Unable to move a meeting out of sequence" - -//d:Error note when attempting to move an instance of a meeting to a day when an instance already exists -//l:popup_note_window -//r:3.2 -// -#define qtn_cale_note_child_same_day "Two occurrences of a meeting cannot occur on the same day" - -//d:Error note when attempting to move a meeting to overlap another instance of the meeting -//l:popup_note_window -//r:3.2 -// -#define qtn_cale_note_child_overlap "Meeting cannot overlap another instance of itself" - -//d:Alarm active text of Note form -//l:list_form_graphic_pane_t1 -// -#define qtn_cale_alarm_active "Active" - -//d:Alarm off text of the Note form -//l:list_form_graphic_pane_t1 -// -#define qtn_cale_alarm_off "Off" - -//d:Synchronisation type text of the Note form -//l:list_form_graphic_pane_t1 -// -#define qtn_cale_confident_public "Public" - -//d:Synchronisation type text of the Note form -//l:list_form_graphic_pane_t1 -// -#define qtn_cale_confident_private "Private" - -//d:Synchronisation type text of the Note form -//l:list_form_graphic_pane_t1 -// -#define qtn_cale_confident_none "None" - -//d:Repeat type "Not repeated" text of note form -//l:list_set_graphic_pane_t1 -// -#define qtn_cale_not_repeated "Not repeated" - -//d:Repeat type "Every day" text of note form -//l:list_set_graphic_pane_t1 -// -#define text_calendar_every_day "Every day" - -//d:Repeat type "Every week" text of note form -//l:list_set_graphic_pane_t1 -// -#define text_calendar_every_week "Every week" - -//d:Repeat type "Every two weeks" text of note form -//l:list_set_graphic_pane_t1 -// -#define text_calendar_bi_weekly "Every 2 weeks" - -//d:Repeat type "Monthly" text of note form -//l:list_set_graphic_pane_t1 -// -#define qtn_cale_repeat_monthly "Monthly" - -//d:Repeat type "Yearly" text of note form -//l:list_set_graphic_pane_t1 -// -#define text_calendar_every_year "Every year" - -//d:Repeat type "Other" text of note form -//l:list_set_graphic_pane_t1 -// -#define qtn_cale_other "Other" - -//d:Title pane text of Meeting form -//l:title_pane_t2/opt9 -// -#define text_calendar_title_meeting "Meeting" - -//d:Title pane text of Anniversary form -//l:title_pane_t2/opt9 -// -#define qtn_cale_anniversary_title "Anniversary" - -//d:Title pane text of Day form -//l:title_pane_t2/opt9 -// -#define qtn_cale_title_daynote "Day note" - -//d:After confirming the saving,the confirmation note -//d:Calendar note savedis shown -//l:popup_note_window -// -#define text_calendar_note_saved "Note saved" - -//d:The List_Query with the prompt text Save Repeat Note? -//l:heading_pane_t1 -// -#define qtn_cale_lq_save_chang_repeated "Save changes?" - -//d:The List_Query with the prompt text "Edit:" (choices being Series or Occurrence) -//l:heading_pane_t1 -// -#define qtn_cale_lq_edit_recurring "Edit:" - -//d:All notes delete prompt -//l:popup_note_window -// -#define qtn_cale_quest_delete_all_notes "Delete all notes" - -//d:A note delete prompt -//l:popup_note_window -// -#define qtn_cale_quest_delete_event "Delete note?" - -//d:Data query for inputting the date before the notes are to be deleted. -//l:popup_query_data_window -// -#define qtn_cale_prmpt_del_before_date "Delete before set date" - -//d:When deleting a repeated note, -//d:the phone prompts the List_Query -//l:heading_pane_t1 -// -#define qtn_cale_lq_del_repeated_note "Delete repeated note" - -//d:After deleting of notes phone displays the information note -//l:popup_note_window -// -#define qtn_cale_conf_past_note_deleted "Notes from past to set date deleted" - -//d:After deleting of notes phone displays the information note -//l:popup_note_window -// -#define qtn_cale_conf_all_notes_deleted "All notes deleted from Calendar" - -//d:Erase or update note selection list of choice items -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_lq_all_occurences "All occurrences" - -//d:Erase or update selection list of choice items -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_lq_this_occurence "Only this occurrence" - -//d:Edit note selection list of choice items -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_lq_edit_series "All occurrences" - -//d:Edit note selection list of choice items -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_lq_edit_this "Only this occurrence" - -//d:Specified Out of range of date -//l:popup_note_window -// -#define qtn_cale_info_year_limit "Year limit is from 1900 to 2100" - -//d:Error prompt for alarm date too past -//l:popup_note_window -// -#define qtn_cale_date_alarm_past "Alarm date is too past" - -//d:Error prompt for alarm time earlier than note -//l:popup_note_window -// -#define qtn_cale_later_date "Alarm later than note" - -//d:Error prompt for setting alarm time which is past. -//l:popup_note_window -// -#define qtn_cale_not_expired "The time for the note alarm has already expired" - -//d:Error prompt for repeat until date earlier than start date. -//l:popup_note_window -// -#define qtn_cale_info_repeat_invalid "Repeat until has to be later than the start date" - -//d:Confirmaiton prompt for updating start date on repeat note. -//l:popup_note_window -// -#define qtn_cale_quest_change_start_day "Are you sure to change start date of selected recurring note?" - -//d:Error prompt "Note ends before than starts" -//l:popup_note_window -// -#define qtn_cale_info_note_ends_before "Note ends before than starts" - -//d:Error prompt. Date limit could be set only to the past. -//l:popup_note_window -// -#define qtn_cale_date_not_future "Date in the future not allowed" - -//d:Calendar Settings title pane -//l:title_pane_t2/opt9 -// -#define text_calendar_setting_title "Settings" - -//d:Calendar Settings main pane item -//l:list_setting_pane_t1/opt1 -// -#define qtn_cale_default_view "Default view" - -//d:Calendar Settings main pane item -//l:list_setting_pane_t1/opt1 -// -#define qtn_cale_week_format "Week format" - -//d:Calendar Settings main pane item -//l:list_setting_pane_t1/opt1 -// -#define text_calendar_week_title_format "Title of week view" - -//d: Calendar Settings "Default view" item -//l:list_set_graphic_pane_t1 -// -#define qtn_cale_default_day_view "Day View" - -//d: Calendar Settings "Default view" item -//l:list_set_graphic_pane_t1 -// -#define qtn_cale_default_week_view "Week View" - -//d: Calendar Settings "Default view" item -//l:list_set_graphic_pane_t1 -// -#define qtn_cale_default_month_view "Month View" - -//d: Calendar Settings "Title of week view" item -//l:list_set_graphic_pane_t1 -// -#define text_calendar_week_title_numb "Week number" - -//d: Calendar Settings "Title of week view" item -//l:list_set_graphic_pane_t1 -// -#define text_calendar_week_title_dur "Duration of week" - -//d:Calendar Settings "Default Mailbox" item -//l:heading_pane_t1 -//w: -//r:3.0 -// -#define qtn_cale_lq_select_mailbox "Select Default Mailbox: " - -//d:Calendar "Default Mailbox" setting item name. -//l:list_setting_pane_t1/opt1 -//w: -//r:3.0 -// -#define qtn_cale_default_mailbox "Default mailbox" - -//d:Calendar no default mailboxes defined prompt -//l:popup_note_window -//w: -//r:3.0 -// -#define qtn_cale_query_define_mailbox "No mailboxes defined, define now?" - - -//d:Calendar Settings main pane item -//l:list_setting_pane_t1 -//r:3.2 -// -#define qtn_cale_sett_arabic_cale "Arabic calendar" - -//d:Opens external calendar application -//l:list_single_pane_t1_cp2 -//r:3.2 -// -#define qtn_cale_om_external_cale "External calendar" - -//d: Calendar date query prompt -//l:popup_query_data_window -// -#define text_calendar_date_prompt "Date:" - -//d:Title pane text in WeekView main state -//d:currently highlighted day's Week %N -//d:%N was setted week number -//l:title_pane_t2/opt9 -// -#define qtn_cale_week_view_title "Week %N" - -//d:Title pane text in WeekView main state -//d:currently highlighted day's %0U - %1U -//d:The date of dd/mm/yy form is set to %0U or %1U. -//l:title_pane_t2/opt9 -// -#define qtn_cale_title_week_days "%0U -\n %1U" - -//d:Confirmation note. -//d:Message is shown after system time change, but no alarms were missed. -//l:popup_note_window -// -#define qtn_cale_note_system_time_changed "System time changed, Calendar events are updated accordingly" - -//d:Deleting wait note text -//l:popup_note_wait_window -// -#define qtn_cale_wait_deleting_notes "Deleting notes..." - -//d:Location item text of Meeting form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_meeting_location "location" - -//d:Calendar Settings main pane item -//l:list_setting_pane_t1/opt1 -// -#define qtn_chi_cale_sett_lunar_cale "Lunar calendar" - -//d: Calendar Settings "Lunar calendar" item -//l:list_set_graphic_pane_t1 -// -#define qtn_chi_cale_lunar_cale_on "On" - -//d: Calendar Settings "Lunar calendar" item -//l:list_set_graphic_pane_t1 -// -#define qtn_chi_cale_lunar_cale_off "Off" - -//d:Chinese Animal year - Rat -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_rat "Year of the Rat" - -//d:Chinese Animal year - Ox -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_ox "Year of the Ox" - -//d:Chinese Animal year - Tiger -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_tiger "Year of the Tiger" - -//d:Chinese Animal year - Rabbit -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_rabbit "Year of the Rabbit" - -//d:Chinese Animal - Rabbit -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_dragon "Year of the Dragon" - -//d:Chinese Animal - Snake -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_snake "Year of the Snake" - -//d:Chinese Animal - Horse -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_horse "Year of the Horse" - -//d:Chinese Animal - Sheep -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_sheep "Year of the Sheep" - -//d:Chinese Animal - Monkey -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_monkey "Year of the Monkey" - -//d:Chinese Animal - Rooster -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_rooster "Year of the Rooster" - -//d:Chinese Animal - Dog -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_dog "Year of the Dog" - -//d:Chinese Animal - Pig -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_pig "Year of the Pig" - -//d:Chinese Heavenly stem 1 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_1 "Jia" - -//d:Chinese Heavenly stem 2 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_2 "Yi" - -//d:Chinese Heavenly stem 3 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_3 "Bing" - -//d:Chinese Heavenly stem 4 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_4 "Ding" - -//d:Chinese Heavenly stem 5 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_5 "Wu" - -//d:Chinese Heavenly stem 6 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_6 "Ji" - -//d:Chinese Heavenly stem 7 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_7 "Geng" - -//d:Chinese Heavenly stem 8 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_8 "Xing" - -//d:Chinese Heavenly stem 9 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_9 "Reng" - -//d:Chinese Heavenly stem 10 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_10 "Gui" - -//d:Chinese Terrestrial branch 1 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_1 "Zi" - -//d:Chinese Terrestrial branch 2 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_2 "Chou" - -//d:Chinese Terrestrial branch 3 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_3 "Yin" - -//d:Chinese Terrestrial branch 4 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_4 "Mao" - -//d:Chinese Terrestrial branch 5 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_5 "Chen" - -//d:Chinese Terrestrial branch 6 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_6 "Si" - -//d:Chinese Terrestrial branch 7 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_7 "Wu" - -//d:Chinese Terrestrial branch 8 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_8 "Wei" - -//d:Chinese Terrestrial branch 9 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_9 "Shen" - -//d:Chinese Terrestrial branch 10 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_10 "You" - -//d:Chinese Terrestrial branch 11 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_11 "Xu" - -//d:Chinese Terrestrial branch 12 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_12 "Hai" - -//d:Chinese solar items 1 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_1 "Li Chun" - -//d:Chinese solar items 2 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_2 "Yu Shui" - -//d:Chinese solar items 3 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_3 "Jing Zhe" - -//d:Chinese solar items 4 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_4 "Chun Fen" - -//d:Chinese solar items 5 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_5 "Qing Ming" - -//d:Chinese solar items 6 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_6 "Gu Yu" - -//d:Chinese solar items 7 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_7 "Li Xia" - -//d:Chinese solar items 8 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_8 "Xiao Man" - -//d:Chinese solar items 9 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_9 "Mang Zhong" - -//d:Chinese solar items 10 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_10 "Xia Zhi" - -//d:Chinese solar items 11 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_11 "Xiao Shu" - -//d:Chinese solar items 12 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_12 "Da Shu" - -//d:Chinese solar items 13 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_13 "Li Qiu" - -//d:Chinese solar items 14 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_14 "Chu Shu" - -//d:Chinese solar items 15 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_15 "Bai Lu" - -//d:Chinese solar items 16 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_16 "Qiu Fen" - -//d:Chinese solar items 17 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_17 "Han Lu" - -//d:Chinese solar items 18 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_18 "Shuang Jiang" - -//d:Chinese solar items 19 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_19 "Li Dong" - -//d:Chinese solar items 20 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_20 "Xiao Xue" - -//d:Chinese solar items 21 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_21 "Da Xue" - -//d:Chinese solar items 22 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_22 "Dong Zhi" - -//d:Chinese solar items 23 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_23 "Xiao Han" - -//d:Chinese solar items 24 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_24 "Da Han" - -//d:Lunar festivals 1 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_festival_name_1 "Spring festival" - -//d:Lunar festivals 2 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_festival_name_2 "Lantern festival" - -//d:Lunar festivals 3 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_festival_name_3 "Dragon boat festival" - -//d:Lunar festivals 4 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_festival_name_4 "Seventh night festival" - -//d:Lunar festivals 5 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_festival_name_5 "Ghost festival" - -//d:Lunar festivals 6 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_festival_name_6 "Mid autumn festival" - -//d:Lunar festivals 7 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_festival_name_7 "Double ninth festival" - -//d:Lunar festivals 8 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_festival_name_8 "Eighth day of twelfth month festival" - -//d:Lunar festivals 9 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_festival_name_9 "New year's eve" - -//d:Opens Lunar data dialog -//l:list_single_pane_t1_cp2 -// -#define qtn_chi_cale_lunar_data "Show lunar data" - -//d:Title pane sting in "Show lunar data" dialog -//l:heading_pane_t1 -// -#define qtn_chi_cale_lunar_calendar "Lunar calendar" - -//d:Calendar Settings main pane item -//l:list_setting_pane_t1 -// -#define qtn_cale_alarm_tone "Calendar alarm tone" - -//d: Empty listbox -//l: main_list_empty_pane -// -#define qtn_cale_no_events "(No Events)" - -//d: The subject text when the item subject is empty in DayView -//l: list_single_heading_pane_t1 -// -#define qtn_cale_no_subject "" - -//d: Profile Settings Item Edit - setting selection data -//l: list_set_graphic_pane_t1 -#define qtn_tc_off "Off" - -//d: File list dialog header -//l: heading_pane_t1 -#define qtn_tc_popup_heading "Select tone: " - -//d:Default tone selection choice in alarm tone list for Calendar and Clock -//l:list_set_graphic_pane_t1 -// -#define qtn_mode_default_tone "Default tone" - -//d:Options menu item. -//d:Opens Add Description submenu in note editor -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_om_add_descript "Add Description" - -//d:Submenu item for adding new description text to Calendar entry -//d:Opens Notepad Editor. -//l:list_single_popup_submenu_pane_t1 -// -#define qtn_cale_om_descript_new "New" - -//d:Submenu item for adding description text to Calendar entry -//d:from existing Notepad memos. Launches Notepad memo fetch. -//l:list_single_popup_submenu_pane_t1 -// -#define qtn_cale_om_descript_exist "Use existing" - -//d:Options menu item. -//d:Shows Calendar entry description text in Notepad viewer. -//d:Opens Notepad viewer. -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_om_desc_show "Show Description" - -//d:Options menu item. -//d:Removes description text from Calendar entry. -//d:Launches confirmation query before removing. -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_om_desc_remove "Remove Description" - -//d:Title text, when editing Calendar description in Notepad -//l:title_pane_t2/opt9 -// -#define qtn_cale_note_title "Calendar Description" - -//d:Confirmation text, when deleting Calendar description data from -//d:Notepad editor -//l:popup_note_window -// -#define qtn_cale_q_del_notep_desc "Delete Calendar Description?" - -//d:Informatio note text shown, when Calendar description is deleted from -//d:Notepad editor or viewer -//l:popup_note_window -// -#define qtn_cale_inote_desc_del_memo "Calendar description deleted" - -//d:Confirmation text, when deleting Calendar description data from -//d:Calendar meeting editor -//l:popup_note_window -// -#define qtn_cale_query_remove_descr "Remove Description?" - -//d:Header text for Description form item. -//d:One truncated line of description is visible below this. -//l:data_form_wide_pane_t1 -// -#define qtn_cale_meeting_description "Description" - -//d:Title text of title pane -//d:Note View -//l:title_pane_t2/opt9 -// -#define qtn_todo_note_header "To-Do Note" - -//d:Command in options menu. -//d:Delete the selected item. -//l:list_single_pane_t1_cp2 -// -#define qtn_todo_om_delete "Delete" - -//d:Command in options sub-menu. -//d:Set a priority high to selected item. -//l:list_form_graphic_pane_t1 -// -#define qtn_todo_attr_high "High" - -//d:Command in options sub-menu. -//d:Set a priority normal to selected item. -//l:list_form_graphic_pane_t1 -// -#define qtn_todo_attr_normal "Normal" - -//d:Command in options sub-menu. -//d:Set a priority low to selected item. -//l:list_form_graphic_pane_t1 -// -#define qtn_todo_attr_low "Low" - -//d:Command in options menu. -//d:Marked the To-Do item done in List View -//l:list_single_pane_t1_cp2 -// -#define qtn_todo_cmd_task_completed "Task completed" - -//d:Command in options menu. -//d:Unmarked the To-Do item done in List View -//l:list_single_pane_t1_cp2 -// -#define qtn_todo_cmd_restore_task "Restore task" - -//d:Confirmation query prompt. -//d:Deleting the selected one note. -//l:popup_note_window -// -#define qtn_todo_quest_delete_note "Delete note?" - -//d:Confirmation query prompt. -//d:Deleting the marked one or more notes. -//l:popup_note_window -// -#define qtn_todo_quest_delete_notes "Delete\n%N notes?" - -//d:Wait note text in deleting items. -//l:popup_note_wait_window -// -#define qtn_todo_wait_deleting_notes "Deleting notes..." - -//d:Item texts of form -//d:Priority field of To-Do Note form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_todo_note_view_priority "priority" - -//d:Item texts of form -//d:Due date field of To-Do Note form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_todo_note_duedate "due date" - -//d:Item texts of form -//d:Subject field of To-Do Note form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_todo_note_subject "subject" - -//d: Information note text shown in Calendar application start, -//d: when alarms have been passed due system time change -//l:popup_note_window -//w: -//r:3.0 -#define qtn_cale_note_missed_alarms "1 or more alarms missed due to time change" - -//d: Setting item choice to select Todo view as Calendar default view -//l:list_set_graphic_pane_t1 -//w: -//r:3.0 -// -#define qtn_cale_default_todo_view "Todo view" - - -//d: Options Submenu item to create new Todo note -//l:list_single_popup_submenu_pane_t1 -//w: -//r:3.0 -#define qtn_cale_note_todo "Todo" - -//d: Confirmation note shown, when edited Todo note is saved -//l:popup_note_window -//w: -//r:3.0 -#define qtn_cale_note_todo_saved "Todo Note saved" - -//d: Options menu item to open Calendar day view from Todo view -//l:list_single_pane_t1_cp2 -//w: -//r:3.0 -#define qtn_cale_opt_view_day "Day view" - -//d: Options menu item to open Todo view from other Calendar views -//l:list_single_pane_t1_cp2 -//w: -//r:3.0 -#define qtn_cale_opt_view_todo "Todo view" - -//d: Title pane text for Calendar Todo view that shows all users Todo entries -//l:title_pane_t2/opt9 -//w: -//r:3.0 -#define qtn_cale_title_todos "All Todos" - -//d:Snooze time setting header. -//l:list_setting_pane_t1/opt1 -//w: -//r:3.1 -#define qtn_cale_set_snooze_time "Calendar Alarm Snooze Time" - -//d:Context-specific text for the current snooze time value in Calendar Settings. -//l:setting_slider_pane_t2 -//w: -//r:3.1 -#define qtn_sanim_time_out_slider_ykcur "1 minute" - -//d:Context-specific text for the current snooze time value in Calendar Settings. -//d:%U in minutes, plural. -//l:list_set_graphic_pane_t1 -//w: -//r:3.1 -#define qtn_cale_sanim_time_out_slider_cur "%U minutes" - -//d:Context-specific text for the minimum snooze time value in Calendar Settings. -//l:setting_slider_pane_t2 -//w: -//r:3.1 -#define qtn_cale_sanim_time_out_slider_min "1 min." - -//d:Context-specific text for the maximum snooze time value in Calendar Settings. -//l:setting_slider_pane_t2 -//w: -//r:3.1 -#define qtn_snooze_time_max "60 min." - - -//d: Format string for lunar calendar information in Calendar day, week and month views -//d: Format string is used dynamically to display as much information as possible. -//d: If all information doesn't fit some information and separators are dropped. -//d: Localization can affect order of information. -//d: If data element is dropped, empty string is supplied for it. -//d: and either for preceding (or following) separator (%0U) -//d: -//d: e.g. in Chinese, order should be somethinglike (201030405): "%2U%0U%1U%0U%3U%0U%4U%0U%5U" -//d: e.g. in Vietnamese, (304050201): "%3U%0U%4U%0U%5U%0U%2U%0U%1U" -//d: %0U separator between data elements, qtn_cale_lunar_separator -//d: %1U animal year format, qtn_cale_animal_year_in_extra_row -//d: %2U lunar year, qtn_cale_lunar_year -//d: %3U lunar date, either qtn_cale_lunar_date or qtn_cale_lunar_leap_date -//d: %4U festival, qtn_chi_cale_festival_name_X -//d: %5U solar term, qtn_chi_cale_solar_item_X -//l: None -//w: -//r:3.2 -// -#define qtn_cale_extra_row_lunar "%1U%0U%2U%0U%3U%0U%4U%0U%5U" - - -//d: Separator between data elements in Lunar Calendar extra row. -//d: E.g. in Chinese, " " -//d: E.g. in Vietnamese, ", " -//l: (None) -//w: -//r:3.2 -// -#define qtn_cale_lunar_separator ", " - - -//d: Chinese lunar date with day, month and year. -//d: %0U is lunar date. either qtn_cale_lunar_date or qtn_cale_lunar_leap_date -//d: %1U lunar year. qtn_cale_lunar_year -//d: -//l: (None) -//w: -//r:3.2 -// -#define qtn_cale_lunar_full_date "%0U %1U" - - -//d: Chinese lunar date for dates. Used for non-leap month dates. -//d: Localication can add language specific separator and extra symbols. -//d: E.g. in Chinese, character for month should be used: "%0U·%1U" -//d: E.g. in Vietnamese, order is different and separator is slash "%1U/%0U" -//d: %0U is lunar month -//d: %1U lunar day -//l: (None) -//w: -//r:3.2 -// -#define qtn_cale_lunar_date "%0U/%1U" - - -//d: Chinese lunar date for dates that are on leap months. -//d: This should be similar to qtn_cale_lunar_date, -//d: but language specific leap month indicator should be added to correct place. -//d: E.g. in Vietnamese: "%1U/%0U N" -//d: %0U is lunar month -//d: %1U lunar day -//l: (None) -//w: -//r:3.2 -// -#define qtn_cale_lunar_leap_date "%0UL/%1U" - - -//d: Chinese lunar year, combination of heavenly stem and terrestial branch -//d: %0U is heavenly stem (qtn_chi_cale_heav_stem_X) -//d: %1U is terrestial branch (qtn_chi_cale_terr_branch_X) -//d: Localization can add language specific separator between words -//d: and if words are written together, space can be removed (e.g. in Chinese). -//d: E.g. in Chinese "%0U%1U·" -//d: E.g. in Vietnamese "Nam %0U %1U" -//l: (None) -//w: -//r:3.2 -// -#define qtn_cale_lunar_year "%0U %1U" - - -//d: Heading text for chinese festival -//d: in Lunar calendar information pop-up. -//d: It's not shown for dates that do not have festival. -//l: list_single_pane_t1 -//w: -//r:3.2 -// -#define qtn_cale_lunar_info_festival "Festival:" - - -//d: Heading text for chinese solar term -//d: in Lunar calendar information pop-up. -//d: It's not shown for dates that do not have solar term. -//l: list_single_pane_t1 -//w: -//r:3.2 -// -#define qtn_cale_lunar_info_solar "Solar term:" - - -//d: Heading text for chinese lunar calendar date -//d: in Lunar calendar information pop-up. -//d: Data for this header is qtn_cale_lunar_full_date. -//l: list_single_pane_t1 -//w: -//r:3.2 -// -#define qtn_cale_info_lunar_date "Lunar date:" - - -//d: Heading text for animal year -//d: in Lunar calendar information pop-up. -//d: Data for this header is qtn_chi_cale_animal_X -//l: list_single_pane_t1 -//w: -//r:3.2 -// -#define qtn_cale_info_animal_year "Animal year:" - - -//d: Heading text for Gregorian (normal) date -//d: in Lunar calendar information pop-up. -//d: Data for this header is qtn_date_usual_with_zero -//l: list_single_pane_t1 -//w: -//r:3.2 -// -#define qtn_cale_info_western_date "Gregorian date:" - - -//d: Year of Cat. -//d: In Vietnamese Lunar Calendar, year of rabbit of Chinese Lunar Calendar is instead a year of cat. -//l: list_single_pane_t1_cp2 -//w: -//r:3.2 -// -#define qtn_chi_cale_animal_cat "Year of the Cat" - - -//d: Setting item header for Thai Buddhist year display. -//d: Values are On and Off. -//d: If setting is on, Buddhist year is shown on -//d: separate area in month, week and day views -//l: list_set_graphic_pane_t1 -//w: -//r:3.2 -// -#define qtn_cale_sett_thai_year "Show Buddhist year" - -//d: Database conflict note: entry was deleted by other application -//l: popup_note_window -//r: 3.2/5.0 -#define qtn_cale_note_db_conflict "Calendar database conflict. This entry has been deleted by another application." - -//d: Database conflict note: entry was modified by other application -//l: popup_note_window -//r: 3.2/5.0 -#define qtn_cale_note_db_modified "Calendar database conflict. This entry has been modified by another application." - -//d: Menu item for grouping views. -//d: Values are month, week, day and todo. -//l: list_single_pane_t1_cp2 -//w: -//r:4.0 -// -#define qtn_cale_opt_change_view "Change view" - -//d: Menu item for changing to month view. -//d: Value is month. -//l: list_single_popup_submenu_pane_t1 -//w: -//r:4.0 -// -#define qtn_cale_opt_change_month "Month" - -//d: Menu item for changing to week view. -//d: Value is week. -//l: list_single_popup_submenu_pane_t1 -//w: -//r:4.0 -// -#define qtn_cale_opt_change_week "Week" - -//d: Menu item for changing to day view. -//d: Value is day. -//l: list_single_popup_submenu_pane_t1 -//w: -//r:4.0 -// -#define qtn_cale_opt_change_day "Day" - -//d: Menu item for changing to todo view. -//d: Value is todo. -//l: list_single_popup_submenu_pane_t1 -//w: -//r:4.0 -// -#define qtn_cale_opt_change_todo "To-Do" - -//d: Tooltip text for previous view button. -//l: popup_preview_text_window_t1 -//w: -//r:3.2 -// -#define qtn_cale_tooltip_prev_view "Previous view" - -//d: Tooltip text for month view button. -//l: popup_preview_text_window_t1 -//w: -//r:3.2 -// -#define qtn_cale_tooltip_month_view "Month view" - -//d: Tooltip text for week view button. -//l: popup_preview_text_window_t1 -//w: -//r:3.2 -// -#define qtn_cale_tooltip_week_view "Week view" - -//d: Tooltip text for day view button. -//l: popup_preview_text_window_t1 -//w: -//r:3.2 -// -#define qtn_cale_tooltip_day_view "Day view" - -//d: Tooltip text for todo view button. -//l: popup_preview_text_window_t1 -//w: -//r:3.2 -// -#define qtn_cale_tooltip_todo_view "ToDo view" - -//d: Tooltip text for next view button. -//l: popup_preview_text_window_t1 -//w: -//r:3.2 -// -#define qtn_cale_tooltip_next_view "Next view" - -//d: Tooltip text for new entry button. -//l: popup_preview_text_window_t1 -//w: -//r:3.2 -// -#define qtn_cale_tooltip_new_entry "New entry" - -//d: New note query heading, which shows up when MSK is pressed, when day view or to do view is empty -//d: Value is New Entry -//l: heading_pane_t1 -//w: -//r:5.0 -// -#define qtn_cale_lq_new_entry "New entry" - -//d: List item in new note query, which shows up when MSK is pressed when day view or to do view is empty -//d: Value is meeting -//l: list_single_pane_t1_cp2 -//w: -//r:5.0 -// -#define qtn_cale_lq_new_meeting "Meeting" - -//d: List item in new note query, which shows up when MSK is pressed when day view or to do view is empty -//d: Value is mr -//l: list_single_pane_t1_cp2 -//w: -//r:5.0 -// -#define qtn_cale_lq_new_mr "Meeting Request" - -//d: List item in new note query, which shows up when MSK is pressed when day view or to do view is empty -//d: Value is memo -//l: list_single_pane_t1_cp2 -//w: -//r:5.0 -// -#define qtn_cale_lq_new_memo "Memo" - -//d: List item in new note query, which shows up when MSK is pressed when day view or to do view is empty -//d: Value is anniv -//l: list_single_pane_t1_cp2 -//w: -//r:5.0 -// -#define qtn_cale_lq_new_anniversary "Anniversary" - -//d: List item in new note query, which shows up when MSK is pressed, when day view or to do view is empty -//d: Value is todo -//l: list_single_pane_t1_cp2 -//w: -//r:5.0 -// -#define qtn_cale_lq_new_todo "To-Do" - -//d: Edits a note -//d: Value is Edit -//l: list_single_pane_t1_cp2 -//r 3.2 -// -#define qtn_cale_om_edit "Edit" - -//d: Calendar Go to date query prompt -//l: popup_query_data_window_t3/opt2 -// -#define qtn_cale_go_to_date "Go to date:" - -//d: Msk label displayed in Todo/Day view when there are no events for a day -//d: Value is New -//l: control_pane_t3/opt7 -//r: 5.0 -// -#define qtn_cale_msk_new_entry "New" - -//d: Tooltip text for Next View -//l: popup_preview_text_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_tb_next_view "Next view" - -//d: Tooltip text for New Meeting -//l: popup_preview_text_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_tb_new_meeting "New meeting" - -//d: Tooltip text for New ToDo -//l: popup_preview_text_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_tb_new_todo "New to-do" - -//d:Long tap on day opens Long tap menu to create new Meeting note -//l:list_single_pane_t1_cp2 -//w: -//r: 5.0 -// -#define qtn_cale_long_tap_meeting "New meeting" - -//d:Long tap on day opens Long tap menu to create new Anniversary Note -//l:list_single_pane_t1_cp2 -//w: -//r: 5.0 -// -#define qtn_cale_long_tap_anniversary "New anniversary" - -//dLong tap on day opens Long tap menu to create new Day Note -//l:list_single_pane_t1_cp2 -//w: -//r: 5.0 -// -#define qtn_cale_long_tap_memo "New memo" - -//d: Long tap on day opens Long tap menu to create new Todo note -//l:list_single_pane_t1_cp2 -//w: -//r: 5.0 -// -#define qtn_cale_long_tap_todo "New todo" - -//d: Format string for data shown in preview pane -//d: %0U is start time -//d: %1U is hyphen or space -//d: %2U is end time -//d: %3U is subject -//d: %4U is location -//d: %5U is description -//d: %6U is language specific separator -//d: %7U is space -//l: list_single_fp_cale_pane_t2/opt1 -//w: -//r: 5.0 -// -#define qtn_cale_pane_event_data "%0U%1U%2U%7U%3U%6U%4U%6U%5U" - -//d: Title for the preview pane -//d: %0U is currently focused week day -//d: %1U is currently focused date -//l: popup_fixed_preview_cale_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_pane_title "%0U %1U" - -//d: No events in preview pane -//l: popup_fixed_preview_cale_window_t2/opt1 -//w: -//r: 5.0 -// -#define qtn_cale_pane_no_events "(No events)" - -//d: Popup Event Separator -//l: None -//w: -//r: 5.0 -// -#define qtn_cale_popup_event_separator "," - -//d: Options menu item for clearing a missed alarm -//l: list_single_pane_t1_cp2 -//w: -//r: 5.0 -#define qtn_cale_mav_opt_clear "Clear" - -//d: Options menu items for clearing all the missed alarms -//l: list_single_pane_t1_cp2 -//w: -//r: 5.0 -#define qtn_cale_mav_opt_clear_all "Clear all" - -//d: Go to previous view from where Missed Alarms View is launched -//l: list_single_pane_t1_cp2 -//w: -//r: 5.0 -#define qtn_cale_mav_opt_goto_cale "Go to Calendar" - -//d: Options menu item to open Calendar's Missed Alarms View -//l: list_single_pane_t1_cp2 -//w: -//r: 5.0 -#define qtn_cale_opt_mav "Missed alarms" - -//d: Title pane text for Calendar's Missed Alarms view that shows all the missed alarms -//l: title_pane_t2/opt9 -//w: -//r: 5.0 -#define qtn_cale_title_missed_alarms "Missed Alarms" - -//d: Start date and time of the missed alarm event -//l: list_double_graphic_pane_t2 -//w: -//r: 5.0 -#define qtn_cale_mav_start_time "%0U %1U" - -//d: Tooltip text for Clearing a Missed Alarm -//l: popup_preview_text_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_mav_tb_clear "Clear" - -//d: Tooltip text for Clearing all the Missed Alarms -//l: popup_preview_text_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_mav_tb_clearall "Clear all" - -//d: Tooltip text for activating the previous view from where Missed Alarms View is launched -//l: popup_preview_text_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_mav_tb_goto_cale "Go to Calendar" - -//d: Query for viewing the missed alarms view for one missed alarm -//l: popup_note_window -//w: -//r: 5.0 -// -#define qtn_cale_query_view_missed "One missed Calendar event.Do you want to view it?" - -//d: Query for viewing the missed alarms view for multiple missed alarms -//l: popup_note_window -//w: -//r: 5.0 -// -#define qtn_cale_query_view_missed_n "%N missed Calendar events.Do you want to view them?" - -//d: The subject text when the item subject is empty in Missed alarms view -//l: list_double_large_graphic_pane_t1 -//w: -//r: 5.0 -// -#define qtn_cale_mav_unnamed "(Unnamed)" - -//d:Command in stylus popup menu. -//d:Marked the To-Do item done in List View and Preview popup. -//l:list_single_touch_menu_pane_t1 -//w: -//r: 5.0 -// -#define qtn_cale_stylus_popup_cmd_task_completed "Mark as done" - -//d:Command in stylus popup menu. -//d:Unmarked the To-Do item done in List View. -//l:list_single_touch_menu_pane_t1 -//w: -//r: 5.0 -// -#define qtn_cale_stylus_cmd_restore_task "Mark as not done" - -//d:Command in stylus popup menu. -//d:Delete the selected item. -//l:list_single_touch_menu_pane_t1 -//w: -//r: 5.0 -// -#define qtn_cale_stylus_popup_delete "Delete" - -//d:Command in stylus popup menu. -//d:Send the selected item. -//l:list_single_touch_menu_pane_t1 -//w: -//r: 5.0 -// -#define qtn_cale_stylus_popup_send "Send" - -//d:Command in stylus popup menu. -//d:Mark-operation. Marks selected item. -//l:list_single_touch_menu_pane_t1 -//w: -//r: 5.0 -// -#define qtn_cale_stylus_popup_mark "Mark" - -//d:Command in stylus popup menu. -//d:Unmark-operation. Unmarks selected marked item. -//l:list_single_touch_menu_pane_t1 -//w: -//r: 5.0 -// -#define qtn_cale_stylus_popup_unmark "Unmark" - -//d: Tooltip text for editing current calendar note -//l: popup_preview_text_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_tb_edit "Edit" - -//d: Tooltip text for deleting current calendar note -//l: popup_preview_text_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_tb_delete "Delete" - -//d: Tooltip text for sending calendar note -//l: popup_preview_text_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_tb_send "Send" - -//d: Default tone selection choice in alarm tone list for Calendar and Clock -//l: list_single_graphic_pane_t1_cp2 -//w: -//r: 5.0 -#define qtn_cale_tc_no_personal_tone "Default tone" - -//d: "Off" tone selection choice in alarm tone list for Calendar and Clock -//l: list_single_graphic_pane_t1_cp2 -//w: -//r: 5.0 -#define qtn_cale_tc_none "Off" - -//d:Opens Maps application for choosing new location -//l:list_single_pane_t1_cp2 -//w: -//r: 5.1 -#define qtn_cale_om_assign_from_map "Assign from map" - -//d: Msk label displayed in Editors when there is no map location -//d: Value is From map -//l: control_pane_t3/opt7 -//r: 5.1 -// -#define text_softkey_from_map "From map" - -//d:Opens Maps application for choosing new location -//l:list_single_pane_t1_cp2 -//w: -//r: 5.1 -#define qtn_cale_om_find_on_map "Find on map" - -//d:Opens Maps application fto show the location -//l:list_single_pane_t1_cp2 -//w: -//r: 5.1 -#define qtn_cale_om_show_on_map "Show on map" - -//d:Shows Update location query -//l:heading_pane_t1 -//w: -//r: 5.1 -#define qtn_cale_update_location "Update location:" - -//d:Adds selected address to existing location details -//l:list_single_pane_t1_cp2 -//w: -//r: 5.1 -#define qtn_cale_addto_existing_location "Add to existing" - -//d:Replaces existing location details with selected address -//l:list_single_pane_t1_cp2 -//w: -//r: 5.1 -#define qtn_replace_existing_location "Replace existing" - -//d:Confirmation query prompt. -//d:Replace the exisitng map location with new one -//d: %0U is the name of the location with which existing one is being replaced -//l:popup_note_window -//w: -//r: 5.1 -#define qtn_cale_confirm_change_address "Update Address to %U?" - -//d: Confirmation note shown, when address is replaced with new one -//l:popup_note_window -//w: -//r:5.1 -#define qtn_cale_note_address_updated "Address Updated" - -//d: Confirmation note shown, when address with coordinates is manually changed -//l:popup_note_window -//w: -//r:5.1 -#define qtn_cale_confirm_keep_coordinates "Address will be updated. Keep existing map location?" - -//d:Context-specific text for the current snooze time value in Calendar Settings. -//l:list_set_graphic_pane_t1 -//w: -//r:3.1 -#define qtn_cale_sanim_time_out_slider_ykcur "1 minute" - -//d:Context-specific text for the current snooze time value in Calendar Settings. -//d:%U in minutes, plural. -//l:setting_slider_pane_t2 -//w: -//r:3.1 -#define qtn_set_cale_sanim_time_out_slider_cur "%U minutes" -// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/bwins/calenlunarchinesepluginu.def --- a/calendarui/regionalplugins/bwins/calenlunarchinesepluginu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -EXPORTS - ?AnimalYear@CCalenLunarLocalizedInfo@@QAEABVTDesC16@@XZ @ 1 NONAME ; class TDesC16 const & CCalenLunarLocalizedInfo::AnimalYear(void) - ?SolarTerm@CCalenLunarLocalizedInfo@@QAEABVTDesC16@@XZ @ 2 NONAME ; class TDesC16 const & CCalenLunarLocalizedInfo::SolarTerm(void) - ?GregorianDate@CCalenLunarLocalizedInfo@@QAEABVTDesC16@@XZ @ 3 NONAME ; class TDesC16 const & CCalenLunarLocalizedInfo::GregorianDate(void) - ?LunarMonthAndDay@CCalenLunarLocalizedInfo@@QAEABVTDesC16@@XZ @ 4 NONAME ; class TDesC16 const & CCalenLunarLocalizedInfo::LunarMonthAndDay(void) - ?Festival@CCalenLunarLocalizedInfo@@QAEABVTDesC16@@XZ @ 5 NONAME ; class TDesC16 const & CCalenLunarLocalizedInfo::Festival(void) - ?ImplementationGroupProxy@@YAPBUTImplementationProxy@@AAH@Z @ 6 NONAME ; struct TImplementationProxy const * ImplementationGroupProxy(int &) - ?FullLunarDate@CCalenLunarLocalizedInfo@@QAEABVTDesC16@@XZ @ 7 NONAME ; class TDesC16 const & CCalenLunarLocalizedInfo::FullLunarDate(void) - ?LunarYear@CCalenLunarLocalizedInfo@@QAEABVTDesC16@@XZ @ 8 NONAME ; class TDesC16 const & CCalenLunarLocalizedInfo::LunarYear(void) - diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/calenregionalutil/calenregionalutil.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/regionalplugins/calenregionalutil/calenregionalutil.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,92 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: Project file for calenregionalutil module. +# + +TEMPLATE = lib +CONFIG += hb +TARGET = calenregionalutil + +DEPENDPATH += ./inc \ + ./src \ + ./data + +INCLUDEPATH += ./inc +INCLUDEPATH += ../inc \ + ../../inc + +# Input +HEADERS += ./inc/calenextrarowformatter.h \ + ./inc/calenlunarinfo.h \ + ./inc/calenlunarinfoprovider.h \ + ./inc/calenlunarlocalizedinfo.h \ + ./inc/calenlunarlocalizer.h \ + ./inc/calensolarterms.h \ + ./inc/calenregionalpluginuids.h \ + ./inc/calenlunarpaths.h \ + ./inc/calenlunarpanic.h + + +SOURCES += ./src/calenextrarowformatter.cpp \ + ./src/calenlunarinfo.cpp \ + ./src/calenlunarinfoprovider.cpp \ + ./src/calenlunarlocalizedinfo.cpp \ + ./src/calenlunarlocalizer.cpp \ + ./src/calensolarterms.cpp \ + + + + +RESOURCES += calenregionalutil.qrc + +symbian: { + + TARGET.UID2 = 0x1000008d + TARGET.UID3 = 0x20022EDB + TARGET.CAPABILITY = CAP_GENERAL_DLL + TARGET.EPOCALLOWDLLDATA = 1 + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + BLD_INF_RULES.prj_exports += \ + "./inc/calenextrarowformatter.h |../inc/calenextrarowformatter.h" \ + "./inc/calenlunarinfo.h |../inc/calenlunarinfo.h" \ + "./inc/calenlunarinfoprovider.h |../inc/calenlunarinfoprovider.h" \ + "./inc/calenlunarlocalizedinfo.h |../inc/calenlunarlocalizedinfo.h" \ + "./inc/calenlunarlocalizer.h |../inc/calenlunarlocalizer.h" \ + "./inc/calenlunarpanic.h |../inc/calenlunarpanic.h" \ + "./inc/CalenLunarPaths.h |../inc/CalenLunarPaths.h" \ + "./inc/CalenRegionalPluginUids.h |../inc/CalenRegionalPluginUids.h" \ + "./inc/CalenSolarTerms.h |../inc/CalenSolarTerms.h" + + LIBS += -lcalinterimapi \ + -lcone \ + -lecom \ + -leikcdlg \ + -leikctl \ + -leikcoctl \ + -leikcore \ + -leuser \ + -lgdi \ + -lbafl \ + -lplatformenv \ + -lefsrv \ + -lCommonEngine \ + -lccon \ + -lestor \ + -lcentralrepository \ + -lCdlEngine +} + + +# End of file --Don't remove this. \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/calenregionalutil/data/calenregional_en_GB.qm Binary file calendarui/regionalplugins/calenregionalutil/data/calenregional_en_GB.qm has changed diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/calenregionalutil/data/calenregionalutil.qrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/regionalplugins/calenregionalutil/data/calenregionalutil.qrc Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,5 @@ + + + calenregional_en_GB.qm + + \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/calenregionalutil/data/calenregionalutil.rss --- a/calendarui/regionalplugins/calenregionalutil/data/calenregionalutil.rss Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,197 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: This file contains all the resources for the calenregionalutil. -* -*/ - -#include -#include -#include -#include - -#include "calendarregionalplugin.loc" -NAME CLRU - -RESOURCE RSS_SIGNATURE { } - -RESOURCE TBUF r_cale_lunar_separator - { - buf = qtn_cale_lunar_separator; - } - - -RESOURCE TBUF r_cale_extra_row_lunar - { - buf = qtn_cale_extra_row_lunar; - } - -RESOURCE TBUF r_cale_lunar_year - { - buf = qtn_cale_lunar_year; - } - - -RESOURCE TBUF r_cale_lunar_full_date - { - buf = qtn_cale_lunar_full_date; - } - -RESOURCE TBUF r_cale_lunar_leap_date - { - buf = qtn_cale_lunar_leap_date; - } - -RESOURCE TBUF r_cale_lunar_date - { - buf = qtn_cale_lunar_date; - } - -// --------------------------------------------------------- -// -// r_calen_chi_festivals -// Descripter array for Chinese festivals -// -// --------------------------------------------------------- -// -RESOURCE ARRAY r_calen_chi_festivals - { - items = - { - LBUF { txt = qtn_chi_cale_festival_name_1; }, - LBUF { txt = qtn_chi_cale_festival_name_2; }, - LBUF { txt = qtn_chi_cale_festival_name_3; }, - LBUF { txt = qtn_chi_cale_festival_name_4; }, - LBUF { txt = qtn_chi_cale_festival_name_5; }, - LBUF { txt = qtn_chi_cale_festival_name_6; }, - LBUF { txt = qtn_chi_cale_festival_name_7; }, - LBUF { txt = qtn_chi_cale_festival_name_8; }, - LBUF { txt = qtn_chi_cale_festival_name_9; } - }; - } - - -// --------------------------------------------------------- -// -// r_calen_chi_solar_items -// Descripter array for Chinese solar items -// -// --------------------------------------------------------- -// -RESOURCE ARRAY r_calen_chi_solar_items - { - items = - { - LBUF { txt = qtn_chi_cale_solar_item_1; }, - LBUF { txt = qtn_chi_cale_solar_item_2; }, - LBUF { txt = qtn_chi_cale_solar_item_3; }, - LBUF { txt = qtn_chi_cale_solar_item_4; }, - LBUF { txt = qtn_chi_cale_solar_item_5; }, - LBUF { txt = qtn_chi_cale_solar_item_6; }, - LBUF { txt = qtn_chi_cale_solar_item_7; }, - LBUF { txt = qtn_chi_cale_solar_item_8; }, - LBUF { txt = qtn_chi_cale_solar_item_9; }, - LBUF { txt = qtn_chi_cale_solar_item_10; }, - LBUF { txt = qtn_chi_cale_solar_item_11; }, - LBUF { txt = qtn_chi_cale_solar_item_12; }, - LBUF { txt = qtn_chi_cale_solar_item_13; }, - LBUF { txt = qtn_chi_cale_solar_item_14; }, - LBUF { txt = qtn_chi_cale_solar_item_15; }, - LBUF { txt = qtn_chi_cale_solar_item_16; }, - LBUF { txt = qtn_chi_cale_solar_item_17; }, - LBUF { txt = qtn_chi_cale_solar_item_18; }, - LBUF { txt = qtn_chi_cale_solar_item_19; }, - LBUF { txt = qtn_chi_cale_solar_item_20; }, - LBUF { txt = qtn_chi_cale_solar_item_21; }, - LBUF { txt = qtn_chi_cale_solar_item_22; }, - LBUF { txt = qtn_chi_cale_solar_item_23; }, - LBUF { txt = qtn_chi_cale_solar_item_24; } - }; - } - - -// --------------------------------------------------------- -// -// r_calen_chi_heav_stems -// Descriptor array for heavenly stems -// -// --------------------------------------------------------- -// -RESOURCE ARRAY r_calen_chi_heav_stems - { - items = - { - LBUF { txt = qtn_chi_cale_heav_stem_1; }, - LBUF { txt = qtn_chi_cale_heav_stem_2; }, - LBUF { txt = qtn_chi_cale_heav_stem_3; }, - LBUF { txt = qtn_chi_cale_heav_stem_4; }, - LBUF { txt = qtn_chi_cale_heav_stem_5; }, - LBUF { txt = qtn_chi_cale_heav_stem_6; }, - LBUF { txt = qtn_chi_cale_heav_stem_7; }, - LBUF { txt = qtn_chi_cale_heav_stem_8; }, - LBUF { txt = qtn_chi_cale_heav_stem_9; }, - LBUF { txt = qtn_chi_cale_heav_stem_10;} - }; - } - -// --------------------------------------------------------- -// -// r_calen_chi_terr_branches -// Descripter array for Terrestrial branches -// -// --------------------------------------------------------- -// -RESOURCE ARRAY r_calen_chi_terr_branches - { - items = - { - LBUF { txt = qtn_chi_cale_terr_branch_1; }, - LBUF { txt = qtn_chi_cale_terr_branch_2; }, - LBUF { txt = qtn_chi_cale_terr_branch_3; }, - LBUF { txt = qtn_chi_cale_terr_branch_4; }, - LBUF { txt = qtn_chi_cale_terr_branch_5; }, - LBUF { txt = qtn_chi_cale_terr_branch_6; }, - LBUF { txt = qtn_chi_cale_terr_branch_7; }, - LBUF { txt = qtn_chi_cale_terr_branch_8; }, - LBUF { txt = qtn_chi_cale_terr_branch_9; }, - LBUF { txt = qtn_chi_cale_terr_branch_10; }, - LBUF { txt = qtn_chi_cale_terr_branch_11; }, - LBUF { txt = qtn_chi_cale_terr_branch_12; } - }; - } - -// --------------------------------------------------------- -// -// r_calen_chi_animal_years -// Descriptor array for Chinese animal years -// -// --------------------------------------------------------- -// -RESOURCE ARRAY r_calen_chi_animal_years - { - items = - { - LBUF { txt = qtn_chi_cale_animal_rat; }, - LBUF { txt = qtn_chi_cale_animal_ox; }, - LBUF { txt = qtn_chi_cale_animal_tiger; }, - LBUF { txt = qtn_chi_cale_animal_rabbit; }, - LBUF { txt = qtn_chi_cale_animal_dragon; }, - LBUF { txt = qtn_chi_cale_animal_snake; }, - LBUF { txt = qtn_chi_cale_animal_horse; }, - LBUF { txt = qtn_chi_cale_animal_sheep; }, - LBUF { txt = qtn_chi_cale_animal_monkey; }, - LBUF { txt = qtn_chi_cale_animal_rooster; }, - LBUF { txt = qtn_chi_cale_animal_dog; }, - LBUF { txt = qtn_chi_cale_animal_pig; } - }; - } diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/calenregionalutil/eabi/calenregionalutilu.def --- a/calendarui/regionalplugins/calenregionalutil/eabi/calenregionalutilu.def Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/regionalplugins/calenregionalutil/eabi/calenregionalutilu.def Mon Jun 28 15:22:02 2010 +0530 @@ -24,12 +24,4 @@ _ZN24CCalenLunarLocalizedInfoD0Ev @ 23 NONAME _ZN24CCalenLunarLocalizedInfoD1Ev @ 24 NONAME _ZN24CCalenLunarLocalizedInfoD2Ev @ 25 NONAME - _ZTI20CCalenLunarLocalizer @ 26 NONAME - _ZTI23CCalenExtraRowFormatter @ 27 NONAME - _ZTI23CCalenLunarInfoProvider @ 28 NONAME - _ZTI24CCalenLunarLocalizedInfo @ 29 NONAME - _ZTV20CCalenLunarLocalizer @ 30 NONAME - _ZTV23CCalenExtraRowFormatter @ 31 NONAME - _ZTV23CCalenLunarInfoProvider @ 32 NONAME - _ZTV24CCalenLunarLocalizedInfo @ 33 NONAME diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/calenregionalutil/group/bld.inf --- a/calendarui/regionalplugins/calenregionalutil/group/bld.inf Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -/* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: This file provides the information required for building -* CalenInterimUtils -* -*/ - -PRJ_PLATFORMS -DEFAULT - -PRJ_EXPORTS -../inc/calenextrarowformatter.h |../../inc/calenextrarowformatter.h -../inc/calenlunarinfo.h |../../inc/calenlunarinfo.h -../inc/calenlunarinfoprovider.h |../../inc/calenlunarinfoprovider.h -../inc/calenlunarlocalizedinfo.h |../../inc/calenlunarlocalizedinfo.h -../inc/calenlunarlocalizer.h |../../inc/calenlunarlocalizer.h -../inc/calenlunarpanic.h |../../inc/calenlunarpanic.h -../inc/calenlunarpaths.h |../../inc/calenlunarpaths.h -../inc/calenregionalpluginuids.h |../../inc/calenregionalpluginuids.h -../inc/calensolarterms.h |../../inc/calensolarterms.h - -PRJ_MMPFILES -calenregionalutil.mmp - -// End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/calenregionalutil/group/calenregionalutil.mmp --- a/calendarui/regionalplugins/calenregionalutil/group/calenregionalutil.mmp Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -/* -* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Project description file for calendar regional utilities -* -*/ - -#include -#include - -// Target -TARGET calenregionalutil.dll -TARGETTYPE DLL - -UID 0x1000008d 0x20022EDB -CAPABILITY CAP_GENERAL_DLL -VENDORID VID_DEFAULT - -// Includes -USERINCLUDE ../inc -USERINCLUDE ../../inc -USERINCLUDE ../../../inc -USERINCLUDE ../../loc -APP_LAYER_SYSTEMINCLUDE - -// Resource -SOURCEPATH ../data -START RESOURCE calenregionalutil.rss -HEADER -TARGETPATH RESOURCE_FILES_DIR -LANGUAGE_IDS -END // RESOURCE - -// Source -SOURCEPATH ../src -SOURCE calenextrarowformatter.cpp -SOURCE calenlunarinfo.cpp -SOURCE calenlunarinfoprovider.cpp -SOURCE calenlunarlocalizedinfo.cpp -SOURCE calenlunarlocalizer.cpp -SOURCE calensolarterms.cpp - -// Libraries -LIBRARY avkon.lib -LIBRARY calinterimapi.lib -LIBRARY cone.lib -LIBRARY ecom.lib -LIBRARY eikcdlg.lib -LIBRARY eikctl.lib -LIBRARY eikcoctl.lib -LIBRARY eikcore.lib -LIBRARY euser.lib -LIBRARY gdi.lib -LIBRARY bafl.lib -LIBRARY platformenv.lib -LIBRARY efsrv.lib -LIBRARY commonengine.lib -LIBRARY ccon.lib -LIBRARY estor.lib -LIBRARY centralrepository.lib -LIBRARY cdlengine.lib - -// End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/calenregionalutil/inc/calenlunarlocalizer.h --- a/calendarui/regionalplugins/calenregionalutil/inc/calenlunarlocalizer.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/regionalplugins/calenregionalutil/inc/calenlunarlocalizer.h Mon Jun 28 15:22:02 2010 +0530 @@ -26,6 +26,7 @@ #include "CalendarVariant.hrh" #include "calendarui_debug.h" +class QStringList; class CEikonEnv; class TCalenLunarInfo; class TChineseDate; @@ -64,49 +65,40 @@ * Localized names of lunar festivals * Own. */ - CDesCArray* iFestivalNames; - + QStringList iFestivalNames; + /** * Localized names of solar terms * Own. */ - CDesCArray* iSolarTermNames; + QStringList iSolarTermNames; /** * Localized names of animal years * Own. */ - CDesCArray* iAnimalYearNames; + QStringList iAnimalYearNames; /** * Localized names of heavenly stems * Own. */ - CDesCArray* iHeavenlyStemNames; + QStringList iHeavenlyStemNames; /** * Localized names of terrestial branches * Own. */ - CDesCArray* iTerrestialBranchNames; + QStringList iTerrestialBranchNames; - /** - * Format string for western date. - * Own. - */ - HBufC* iGregorianDateFormat; - TBuf<1000> iLunarExtraRowText; - /** * Language independent formatter of extra row information. */ CCalenExtraRowFormatter* iRowFormatter; - TInt iResourceFileOffset; - }; #endif // __CALENLUNARLOCALIZER_H__ diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/calenregionalutil/src/calenextrarowformatter.cpp --- a/calendarui/regionalplugins/calenregionalutil/src/calenextrarowformatter.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/regionalplugins/calenregionalutil/src/calenextrarowformatter.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -15,16 +15,18 @@ * */ - +#include +#include -#include #include #include -#include #include "calendarui_debug.h" #include "CalenExtraRowFormatter.h" +// Constants +const TInt KZero( 0 ); + // ----------------------------------------------------------------------------- // CollapseDuplicatesL // ----------------------------------------------------------------------------- @@ -34,7 +36,7 @@ TRACE_ENTRY_POINT; const TInt sublen = aSub.Length(); - if (aStr.Length() == 0 || sublen == 0) + if (aStr.Length() == KZero || sublen == KZero || aPos < KZero || (aPos >aStr.Length())) { return; } @@ -42,14 +44,14 @@ TPtrC remaining = aStr.Mid( aPos ); TInt fstInRemaining = remaining.Find( aSub ); - if ( fstInRemaining >= 0 ) + if ( fstInRemaining >= KZero ) { TInt restPos = fstInRemaining + sublen; TPtrC rest = remaining.Mid( restPos ); TInt sndInRest = rest.Find( aSub ); // 1) two substrings found in sequence - if (sndInRest == 0) + if (sndInRest == KZero) { // replace second substring with empty string TInt fst = aPos + fstInRemaining; @@ -59,7 +61,7 @@ CollapseDuplicatesL( aStr, fst, aSub ); } // 2) substring found later in string - else if (sndInRest > 0) + else if (sndInRest > KZero) { // continue collapsing from this second substring TInt snd = aPos + restPos + sndInRest; @@ -90,15 +92,15 @@ // Trailing const TInt sublen = aSub.Length(); - if ( aStr.Right( sublen ).Find( aSub ) == 0 ) + if ( aStr.Right( sublen ).Find( aSub ) == KZero ) { aStr.Replace( aStr.Length() - sublen, sublen, KNullDesC ); } // Leading - if ( aStr.Left( sublen ).Find( aSub ) == 0 ) + if ( aStr.Left( sublen ).Find( aSub ) == KZero ) { - aStr.Replace( 0, sublen, KNullDesC ); + aStr.Replace( KZero, sublen, KNullDesC ); } TRACE_EXIT_POINT; @@ -159,45 +161,44 @@ EXPORT_C TPtrC CCalenExtraRowFormatter::FormatExtraRowInformationL( CCalenLunarLocalizedInfo& aLocInfo, RArray& aPrioritizedFields ) - { - TRACE_ENTRY_POINT; - - - if ( aPrioritizedFields.Count() == 0) - { - iText = KNullDesC; - - TRACE_EXIT_POINT; - return iText; - } +{ + TRACE_ENTRY_POINT; + + + if ( aPrioritizedFields.Count() == KZero) + { + iText = KNullDesC; + + TRACE_EXIT_POINT; + return iText; + } - // Initialize substring labels - RArray subLabels; - CleanupClosePushL( subLabels ); - subLabels.AppendL( CCalenLunarLocalizedInfo::EAnimalYear ); - subLabels.AppendL( CCalenLunarLocalizedInfo::ELunarYear ); - subLabels.AppendL( CCalenLunarLocalizedInfo::ELunarMonthAndDay ); - subLabels.AppendL( CCalenLunarLocalizedInfo::EFestival ); - subLabels.AppendL( CCalenLunarLocalizedInfo::ESolarTerm ); - - // ASSERT that all prioritized fields can be found from subLabels - for ( TInt i=0; i < aPrioritizedFields.Count(); i++) - { - ASSERT( subLabels.Find( aPrioritizedFields[i] ) >= 0 ); - } + // Initialize substring labels + RArray subLabels; + CleanupClosePushL( subLabels ); + subLabels.AppendL( CCalenLunarLocalizedInfo::EAnimalYear ); + subLabels.AppendL( CCalenLunarLocalizedInfo::ELunarYear ); + subLabels.AppendL( CCalenLunarLocalizedInfo::ELunarMonthAndDay ); + subLabels.AppendL( CCalenLunarLocalizedInfo::EFestival ); + subLabels.AppendL( CCalenLunarLocalizedInfo::ESolarTerm ); + + // ASSERT that all prioritized fields can be found from subLabels + for ( TInt i=0; i < aPrioritizedFields.Count(); i++) + { + ASSERT( subLabels.Find( aPrioritizedFields[i] ) >= KZero ); + } // Initialize substring array CPtrCArray* subs = new (ELeave) CPtrCArray(10); CleanupStack::PushL( subs ); for ( TInt i = 0; i < subLabels.Count(); i++) - { + { subs->AppendL( TPtrC( KNullDesC ) ); - } - // subs->InsertL( 0, TPtrC( KNullDesC ), 5 ); - + } + // Set wanted fields to substring array for ( TInt i = 0; i < aPrioritizedFields.Count(); i++) - { + { CCalenLunarLocalizedInfo::TField field = aPrioritizedFields[i]; TInt subIx = subLabels.Find( field ); // Replace @@ -206,71 +207,50 @@ subs->InsertL(subIx, TPtrC( aLocInfo.GetField( field ) ) ); RDebug::Print( _L("B sub count %d"), subs->Count() ); RDebug::Print( _L("B field %S"), &(subs->At(subIx)) ); - - } - - // Format all fields to extra row - HBufC* extraRowFmt = StringLoader::LoadLC( R_CALE_EXTRA_ROW_LUNAR ); - - RDebug::RawPrint( *extraRowFmt ); - - TBuf<1000> fmt = *extraRowFmt; - for (TInt i=0; i < subLabels.Count(); i++) - { - RDebug::Print( _L("Before Format") ); - RDebug::RawPrint( fmt ); - StringLoader::Format( iText, - fmt, - i + 1, // %0U is a separator - subs->At( i ) ); - fmt = iText; - RDebug::Print( _L("After Format") ); - RDebug::RawPrint( fmt ); - } - - // Now we have something like "Year of Dog%0U%0U6/11%0U%0U" - // First We need to remove multiple occurences of %0U - _LIT(KSeparatorFmt, "%0U"); - - CollapseDuplicatesL( iText, 0, KSeparatorFmt ); - RDebug::Print( _L("After collapse") ); - RDebug::RawPrint( iText ); - // Remove leading and trailing %0U - // By now, we are sure that there is max 1 %0U in the beginning - // and in the end of string. - RemoveLeadingAndTrailingL( iText, KSeparatorFmt ); - RDebug::Print( _L("After leading and trailing removal") ); - RDebug::RawPrint( iText ); - - - // If there are now separators anymore, then do not fill them - TBool hasSeparators = iText.Find( KSeparatorFmt ) >= 0; - - if ( hasSeparators ) - { + } + TBuf<100> textBuf; + QStringList textDataStringList; + for (TInt i=0; i < subLabels.Count(); i++) { + textBuf = subs->At( i ); + textDataStringList.append( + QString((QChar*)textBuf.Ptr(),textBuf.Length())); + } + // Get the locale specific separator + QString separator = hbTrId("txt_calendar_preview_title_cale_separator"); - // fill in separators - HBufC* separator = StringLoader::LoadLC( R_CALE_LUNAR_SEPARATOR ); - fmt = iText; - StringLoader::Format( iText, - fmt, - 0, // %0U is a separator - *separator ); + // Format all fields to single row + QString textDataString; + textDataString = hbTrId( + "txt_calendar_preview_title_123242526").arg( + textDataStringList.at(0)).arg( + separator).arg( + textDataStringList.at(1)).arg( + textDataStringList.at(2)).arg( + textDataStringList.at(3)).arg( + textDataStringList.at(4)); + + iText = static_cast ( + textDataString.utf16()), textDataString.length(); + + // Now we have something like "Year of Dog%2GengYin%2%2" + // where %2 is the separator txt_calendar_preview_title_cale_separator + // First We need to remove multiple occurences of separator + textBuf = static_cast ( + separator.utf16()), separator.length(); + CollapseDuplicatesL( iText, 0, textBuf); - RDebug::Print( _L("After separator insert") ); - RDebug::RawPrint( iText ); - CleanupStack::PopAndDestroy( separator ); - } - - - CleanupStack::PopAndDestroy( extraRowFmt ); + // Remove leading and trailing separators + // Leading separator won't be there but trailing one is there for sure + RemoveLeadingAndTrailingL( iText, textBuf ); + + // CleanUp CleanupStack::PopAndDestroy( subs ); - CleanupStack::PopAndDestroy( &subLabels ); - - TRACE_EXIT_POINT; - return iText; - } + CleanupStack::PopAndDestroy( &subLabels ); + TRACE_EXIT_POINT; + + return iText; +} //EOF diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/calenregionalutil/src/calenlunarinfo.cpp --- a/calendarui/regionalplugins/calenregionalutil/src/calenlunarinfo.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/regionalplugins/calenregionalutil/src/calenlunarinfo.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -24,7 +24,7 @@ // TCalenLunarInfo::HasFestival // ----------------------------------------------------------------------------- // -TBool TCalenLunarInfo::HasFestival() +EXPORT_C TBool TCalenLunarInfo::HasFestival() { TRACE_ENTRY_POINT; @@ -36,7 +36,7 @@ // TCalenLunarInfo::HasSolarTerm // ----------------------------------------------------------------------------- // -TBool TCalenLunarInfo::HasSolarTerm() +EXPORT_C TBool TCalenLunarInfo::HasSolarTerm() { TRACE_ENTRY_POINT; diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/calenregionalutil/src/calenlunarlocalizer.cpp --- a/calendarui/regionalplugins/calenregionalutil/src/calenlunarlocalizer.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/regionalplugins/calenregionalutil/src/calenlunarlocalizer.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -17,17 +17,16 @@ - +#include +#include +#include +#include -#include #include #include -#include #include #include -#include - #include "calendarui_debug.h" #include "CalenLunarLocalizer.h" @@ -43,8 +42,6 @@ _LIT(KChineseDigits, "\x0030\x4e00\x4e8c\x4e09\x56db\x4e94\x516d\x4e03\x516b\x4e5d"); -_LIT( KResourceChinesePluginFile, "calenregionalutil.rsc" ); -#define KResourcePath KDC_RESOURCE_FILES_DIR // ----------------------------------------------------------------------------- @@ -72,18 +69,7 @@ { TRACE_ENTRY_POINT; - delete iFestivalNames; - delete iSolarTermNames; - delete iHeavenlyStemNames; - delete iTerrestialBranchNames; - delete iAnimalYearNames; - delete iGregorianDateFormat; delete iRowFormatter; - - if( iResourceFileOffset ) - { - CCoeEnv::Static()->DeleteResourceFile( iResourceFileOffset ); - } TRACE_EXIT_POINT; } @@ -102,98 +88,133 @@ // ----------------------------------------------------------------------------- // EXPORT_C void CCalenLunarLocalizer::ConstructL() - { - TRACE_ENTRY_POINT; - - iRowFormatter = CCalenExtraRowFormatter::NewL(); - - TFileName dllName; - // Get the complate path of the DLL from where it is currently loaded - Dll::FileName( dllName ); - - TFileName resourceFilename; - resourceFilename.Append(dllName.Mid(0,2)); - resourceFilename.Append(KResourcePath); - resourceFilename.Append(KResourceChinesePluginFile); - BaflUtils::NearestLanguageFile( CEikonEnv::Static()->FsSession(), resourceFilename ); - // Add the resource file. - iResourceFileOffset = CEikonEnv::Static()->AddResourceFileL( resourceFilename ); +{ + iRowFormatter = CCalenExtraRowFormatter::NewL(); + + iFestivalNames.append(hbTrId("txt_calendar_preview_title_spring_fest")); + iFestivalNames.append(hbTrId("txt_calendar_preview_title_lantern_fest")); + iFestivalNames.append(hbTrId("txt_calendar_preview_title_dragon_fest")); + iFestivalNames.append(hbTrId("txt_calendar_preview_title_seventh_night_fest")); + iFestivalNames.append(hbTrId("txt_calendar_preview_title_ghost_fest")); + iFestivalNames.append(hbTrId("txt_calendar_preview_title_mid_autumn_fest")); + iFestivalNames.append(hbTrId("txt_calendar_preview_title_double_fest")); + iFestivalNames.append(hbTrId("txt_calendar_preview_title_eigth_day_fest")); + iFestivalNames.append(hbTrId("txt_calendar_preview_title_new_year_fest")); + + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_li_chun")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_yu_shui")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_jing_zhe")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_chun_fen")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_qing_ming")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_gu_yu")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_li_xia")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_xiao_man")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_mang_zhong")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_xia_zhi")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_xiao_shu")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_da_shu")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_li_qiu")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_chu_shu")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_bai_lu")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_qiu_fen")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_han_lu")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_shaung_jiang")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_li_dong")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_xiao_xue")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_da_xue")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_dong_zhi")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_xiao_han")); + iSolarTermNames.append(hbTrId("txt_calendar_preview_title_da_han")); - iFestivalNames = iEikEnv->ReadDesCArrayResourceL(R_CALEN_CHI_FESTIVALS); - iSolarTermNames = iEikEnv->ReadDesCArrayResourceL(R_CALEN_CHI_SOLAR_ITEMS); - iHeavenlyStemNames = iEikEnv->ReadDesCArrayResourceL(R_CALEN_CHI_HEAV_STEMS); - iTerrestialBranchNames = iEikEnv->ReadDesCArrayResourceL(R_CALEN_CHI_TERR_BRANCHES); - iAnimalYearNames = iEikEnv->ReadDesCArrayResourceL(R_CALEN_CHI_ANIMAL_YEARS); + iHeavenlyStemNames.append(hbTrId("txt_calendar_preview_title_jia")); + iHeavenlyStemNames.append(hbTrId("txt_calendar_preview_title_yi")); + iHeavenlyStemNames.append(hbTrId("txt_calendar_preview_title_bing")); + iHeavenlyStemNames.append(hbTrId("txt_calendar_preview_title_ding")); + iHeavenlyStemNames.append(hbTrId("txt_calendar_preview_title_wu")); + iHeavenlyStemNames.append(hbTrId("txt_calendar_preview_title_ji")); + iHeavenlyStemNames.append(hbTrId("txt_calendar_preview_title_geng")); + iHeavenlyStemNames.append(hbTrId("txt_calendar_preview_title_xing")); + iHeavenlyStemNames.append(hbTrId("txt_calendar_preview_title_reng")); + iHeavenlyStemNames.append(hbTrId("txt_calendar_preview_title_gui")); - iGregorianDateFormat = StringLoader::LoadL(R_QTN_DATE_USUAL_WITH_ZERO); + iTerrestialBranchNames.append(hbTrId("txt_calendar_preview_title_tbranch_zi")); + iTerrestialBranchNames.append(hbTrId("txt_calendar_preview_title_tbranch_chou")); + iTerrestialBranchNames.append(hbTrId("txt_calendar_preview_title_tbranch_yin")); + iTerrestialBranchNames.append(hbTrId("txt_calendar_preview_title_tbranch_mao")); + iTerrestialBranchNames.append(hbTrId("txt_calendar_preview_title_tbranch_chen")); + iTerrestialBranchNames.append(hbTrId("txt_calendar_preview_title_tbranch_si")); + iTerrestialBranchNames.append(hbTrId("txt_calendar_preview_title_tbranch_wu")); + iTerrestialBranchNames.append(hbTrId("txt_calendar_preview_title_tbranch_wei")); + iTerrestialBranchNames.append(hbTrId("txt_calendar_preview_title_tbranch_shen")); + iTerrestialBranchNames.append(hbTrId("txt_calendar_preview_title_tbranch_you")); + iTerrestialBranchNames.append(hbTrId("txt_calendar_preview_title_tbranch_xu")); + iTerrestialBranchNames.append(hbTrId("txt_calendar_preview_title_tbranch_hai")); - - TRACE_EXIT_POINT; - } + iAnimalYearNames.append(hbTrId("txt_calendar_preview_title_year_of_the_rat")); + iAnimalYearNames.append(hbTrId("txt_calendar_preview_title_year_of_the_ox")); + iAnimalYearNames.append(hbTrId("txt_calendar_preview_title_year_of_the_tiger")); + iAnimalYearNames.append(hbTrId("txt_calendar_preview_title_year_of_the_rabbit")); + iAnimalYearNames.append(hbTrId("txt_calendar_preview_title_year_of_the_dragon")); + iAnimalYearNames.append(hbTrId("txt_calendar_preview_title_year_of_the_snake")); + iAnimalYearNames.append(hbTrId("txt_calendar_preview_title_year_of_the_horse")); + iAnimalYearNames.append(hbTrId("txt_calendar_preview_title_year_of_the_sheep")); + iAnimalYearNames.append(hbTrId("txt_calendar_preview_title_year_of_the_monkey")); + iAnimalYearNames.append(hbTrId("txt_calendar_preview_title_year_of_the_rooster")); + iAnimalYearNames.append(hbTrId("txt_calendar_preview_title_year_of_the_dog")); + iAnimalYearNames.append(hbTrId("txt_calendar_preview_title_year_of_the_pig")); + +} // ----------------------------------------------------------------------------- // CCalenLunarLocalizer::LocalizeL // ----------------------------------------------------------------------------- // EXPORT_C CCalenLunarLocalizedInfo* CCalenLunarLocalizer::LocalizeL( TCalenLunarInfo& aInfo ) - { - TRACE_ENTRY_POINT; - - - CCalenLunarLocalizedInfo* localized = CCalenLunarLocalizedInfo::NewL(); - CleanupStack::PushL( localized ); +{ + CCalenLunarLocalizedInfo* localized = CCalenLunarLocalizedInfo::NewL(); + CleanupStack::PushL( localized ); + - if ( aInfo.HasFestival() ) - { - localized->iFestival.Set( iFestivalNames->MdcaPoint( aInfo.iFestival ) ); - } - - if ( aInfo.HasSolarTerm() ) - { - localized->iSolarTerm.Set( iSolarTermNames->MdcaPoint( aInfo.iSolarTerm ) ); - } + if ( aInfo.HasFestival() ) + { + QString festival = iFestivalNames.at(aInfo.iFestival); + localized->iFestival.Set( static_cast(festival.utf16()),festival.length()); + } - // Animal year - localized->iAnimalYear.Set( iAnimalYearNames->MdcaPoint( aInfo.AnimalYear() ) ); - + if ( aInfo.HasSolarTerm() ) + { + QString solarTerm = iSolarTermNames.at(aInfo.iSolarTerm); + localized->iSolarTerm.Set( static_cast(solarTerm.utf16()),solarTerm.length()); + } - // Lunar year - CPtrCArray* yearSubs = new (ELeave) CPtrCArray(2); - CleanupStack::PushL( yearSubs ); - yearSubs->AppendL( iHeavenlyStemNames->MdcaPoint( aInfo.iHeavenlyStem ) ); - yearSubs->AppendL( iTerrestialBranchNames->MdcaPoint( aInfo.iTerrestialBranch ) ); + // Animal year + QString animalYear = iAnimalYearNames.at(aInfo.AnimalYear()); + localized->iAnimalYear.Set( static_cast(animalYear.utf16()),animalYear.length()); - HBufC* tmp = StringLoader::LoadLC( R_CALE_LUNAR_YEAR, *yearSubs); - RDebug::Print( *tmp ); - localized->iLunarYear = *tmp; - CleanupStack::PopAndDestroy( tmp ); - CleanupStack::PopAndDestroy( yearSubs ); + // Lunar year + QString heavenlyStemNames = iHeavenlyStemNames.at(aInfo.iHeavenlyStem); + QString terrestialBranchNames = iTerrestialBranchNames.at(aInfo.iTerrestialBranch); + QString lunarYear = hbTrId("txt_calendar_info_lunar_year").arg(heavenlyStemNames).arg(terrestialBranchNames); + localized->iLunarYear = static_cast (lunarYear.utf16()), lunarYear.length(); - RDebug::Print( localized->iLunarYear ); + LocalizeMonthAndDayL(localized, aInfo); - LocalizeMonthAndDayL(localized, aInfo); - - // Full lunar date - CPtrCArray* subs = new (ELeave) CPtrCArray(2); - CleanupStack::PushL( subs ); - subs->AppendL( localized->LunarMonthAndDay() ); - subs->AppendL( localized->LunarYear() ); - - tmp = StringLoader::LoadLC( R_CALE_LUNAR_FULL_DATE, *subs ); - localized->iFullLunarDate = *tmp; - CleanupStack::PopAndDestroy( tmp ); - CleanupStack::PopAndDestroy( subs ); - - - aInfo.iGregorianDate.FormatL( localized->iGregorianDate, - *iGregorianDateFormat ); - CleanupStack::Pop( localized ); - - - - TRACE_EXIT_POINT; - return localized; - } + QString monthAndDay = QString::fromUtf16(localized->LunarMonthAndDay().Ptr(),localized->LunarMonthAndDay().Length()); + QString yearString = QString::fromUtf16(localized->LunarYear().Ptr(),localized->LunarYear().Length()); + QString fullLunarDate = hbTrId("txt_calendar_info_lunar_full_date").arg(monthAndDay).arg(yearString); + + localized->iFullLunarDate = static_cast (fullLunarDate.utf16()), fullLunarDate.length(); + + QString format(r_qtn_date_usual_with_zero); + TBuf<100> gregFormatBuf; + gregFormatBuf = static_cast (format.utf16()), format.length(); + + aInfo.iGregorianDate.FormatL( localized->iGregorianDate, gregFormatBuf ); + + CleanupStack::Pop( localized ); + + return localized; +} // ----------------------------------------------------------------------------- @@ -227,24 +248,27 @@ // void CCalenLunarLocalizer::LocalizeMonthAndDayL(CCalenLunarLocalizedInfo* aLocInfo, TCalenLunarInfo& aInfo) - { - // Lunar Month and Day - TInt dateResource = aInfo.iLunarDate.iLeapMonth ? R_CALE_LUNAR_LEAP_DATE : R_CALE_LUNAR_DATE; - TBuf<10> month; - TBuf<10> day; - GetChineseMonth(aInfo.iLunarDate, month); - GetChineseDay(aInfo.iLunarDate, day); +{ + TBuf<10> month; + TBuf<10> day; + GetChineseMonth(aInfo.iLunarDate, month); + GetChineseDay(aInfo.iLunarDate, day); - CPtrCArray* monthAndDaySubs = new (ELeave) CPtrCArray(2); - CleanupStack::PushL( monthAndDaySubs ); - monthAndDaySubs->AppendL(month); - monthAndDaySubs->AppendL(day); - - HBufC* tmp = StringLoader::LoadLC( dateResource, *monthAndDaySubs ); - aLocInfo->iLunarMonthAndDay = *tmp; - CleanupStack::PopAndDestroy( tmp ); - CleanupStack::PopAndDestroy( monthAndDaySubs ); - } + QString formattedString; + if(aInfo.iLunarDate.iLeapMonth) { + formattedString = hbTrId( + "txt_calendar_info_lunar_leap_date").arg( + QString((QChar*)month.Ptr(),month.Length())).arg( + QString((QChar*)day.Ptr(),day.Length())); + }else { + formattedString = hbTrId( + "txt_calendar_info_lunar_date").arg( + QString((QChar*)month.Ptr(),month.Length())).arg( + QString((QChar*)day.Ptr(),day.Length())); + } + aLocInfo->iLunarMonthAndDay = static_cast ( + formattedString.utf16()), formattedString.length(); +} // ----------------------------------------------------------------------------- // CCalenLunarLocalizer::GetChineseMonth diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/calenregionalutil/src/calensolarterms.cpp --- a/calendarui/regionalplugins/calenregionalutil/src/calensolarterms.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/regionalplugins/calenregionalutil/src/calensolarterms.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -47,7 +47,7 @@ // // --------------------------------------------------------------------------- // -CCalenSolarTerms* CCalenSolarTerms::NewL(RFs& aFs) +EXPORT_C CCalenSolarTerms* CCalenSolarTerms::NewL(RFs& aFs) { TRACE_ENTRY_POINT; @@ -65,7 +65,7 @@ // // --------------------------------------------------------------------------- // -CCalenSolarTerms::~CCalenSolarTerms() +EXPORT_C CCalenSolarTerms::~CCalenSolarTerms() { TRACE_ENTRY_POINT; TRACE_EXIT_POINT; @@ -76,7 +76,7 @@ // // --------------------------------------------------------------------------- // -TInt CCalenSolarTerms::CheckSolarTermDateL( const TDateTime& aDate ) +EXPORT_C TInt CCalenSolarTerms::CheckSolarTermDateL( const TDateTime& aDate ) { TRACE_ENTRY_POINT; @@ -180,12 +180,11 @@ if (iCachedYear != year) { RFile file; - RFs& fs = iFs; - TFindFile ffile(fs); + TFindFile ffile(iFs); User::LeaveIfError(ffile.FindByDir(KSolarTermsFile, KSolarTermsPath)); // User::LeaveIfError(ffile.FindByPath(KSolarTermsFile, KSolarTermsPath)); - User::LeaveIfError(file.Open(fs, + User::LeaveIfError(file.Open(iFs, ffile.File(), EFileRead)); CleanupClosePushL(file); diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/eabi/calenlunarchinesepluginu.def --- a/calendarui/regionalplugins/eabi/calenlunarchinesepluginu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,3 +0,0 @@ -EXPORTS - _Z24ImplementationGroupProxyRi @ 1 NONAME - diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/inc/CalenLunarPaths.h --- a/calendarui/regionalplugins/inc/CalenLunarPaths.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -/* -* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Calendar Lunar Plugin - * -*/ - - -#ifndef CALENLUNARPATHS_H -#define CALENLUNARPATHS_H - - -_LIT(KCalenLunarDllFile, "CalenLunar.dll"); - -_LIT(KCalenLunarResourceDrive, "z:"); - -_LIT(KCalenLunarResourceFile, "CalenLunar.rsc"); - - - - -#endif // CALENLUNARPATHS_H - -// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/inc/CalenSolarTerms.h --- a/calendarui/regionalplugins/inc/CalenSolarTerms.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -/* -* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Provides Solar Term dates for Lunar Calendar. Reads and caches -* binary data file that lists solar term dates. -* -*/ - - - -#ifndef C_CALENSOLARTERMS_H -#define C_CALENSOLARTERMS_H - -#include -#include - -class RFs; - -const TInt KSolarTermCount(24); - - -/** - * Provides Solar term dates for Lunar Calendar. - * - * Solar term dates are listed in special binary format file. - * CCalenSolarTerms reads and caches this file one year at a time. - * - * @lib CalenLunar.dll - * @since S60 v3.1 - */ -NONSHARABLE_CLASS( CCalenSolarTerms ) : public CBase - { -public: - IMPORT_C static CCalenSolarTerms* NewL(RFs& aFs); - - IMPORT_C virtual ~CCalenSolarTerms(); - - /** - * Checks if date is solar term date. If it is, returns index to particular solar term, otherwise returns error code - * Index can be then passed to GetSolarTermNameL function. - * - * @since S60 v3.1 - * @param aDateTime date that is checked - * @return index of solar term, if date is solar term date. - * KErrNone, if date is not solar term date - * KErrNotSupported, if date is outside of supported - * range for solar term data. - */ - IMPORT_C TInt CheckSolarTermDateL( const TDateTime& aDateTime ); - - -private: - CCalenSolarTerms(RFs& aFs); - - void ConstructL(); - - /** - * Returns ETrue, if date fits into date range of available solar item - * data. - * @since 3.0 - */ - TBool HasSolarTermDataAvailable(const TDateTime& aDate) const; - - /** - * Reads and caches 24 solar term dates from "SolarItems" file - */ - void ReadSolarTermsL(TDateTime aDate); - -private: // data - /** - * File server handle. - */ - RFs& iFs; - - /** - * Year that is currently cached from file to memory - */ - TInt iCachedYear; - - /** - * Table of solar term dates for currently cached year - */ - TDateTime iSolarTermDates[KSolarTermCount]; - - }; - -#endif // C_CALENSOLARTERMS_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/inc/calenlunarinfo.h --- a/calendarui/regionalplugins/inc/calenlunarinfo.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Calendar Lunar Plugin -* -*/ - -#ifndef __CALENLUNARINFO_H__ -#define __CALENLUNARINFO_H__ - -#include -#include - -class TCalenLunarInfo - { -public: - enum TFestival - { - ENoFestival = KErrNotFound, - EFestivalSpring, - EFestivalLantern, - EFestivalDragonBoat, - EFestivalSeventhNight, - EFestivalGhost, - EFestivalMidAutumn, - EFestivalDoubleNinth, - EFestivalTwelfthMonth, - EFestivalNewYearEve - }; - - enum TAnimalYear - { - EYearOfRat = 0, - EYearOfOx, - EYearOfTiger, - EYearOfRabbit, - EYearOfDragon, - EYearOfSnake, - EYearOfHorse, - EYearOfSheep, - EYearOfMonkey, - EYearOfRooster, - EYearOfDog, - EYearOfPig - }; - - typedef TInt TSolarTerm; - typedef TInt THeavenlyStem; - typedef TInt TTerrestialBranch; - -public: - IMPORT_C TBool HasFestival(); - IMPORT_C TBool HasSolarTerm(); - - IMPORT_C TAnimalYear AnimalYear(); - -public: - TFestival iFestival; - TSolarTerm iSolarTerm; - TChineseDate iLunarDate; - TTime iGregorianDate; - - THeavenlyStem iHeavenlyStem; - TTerrestialBranch iTerrestialBranch; - }; - - -#endif // __CALENLUNARINFO_H__ diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/inc/calenlunarinfoprovider.h --- a/calendarui/regionalplugins/inc/calenlunarinfoprovider.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -/* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Calendar Lunar Plugin - * -*/ - - - -#ifndef __CALENLUNARINFOPROVIDER_H__ -#define __CALENLUNARINFOPROVIDER_H__ - -#include "CalenLunarInfo.h" -#include - - -class CChineseCalendarConverter; -class CCalenSolarTerms; -class RFs; - -class CCalenLunarInfoProvider : public CBase - { -public: // public API - IMPORT_C static CCalenLunarInfoProvider* NewL(RFs& aFs); - - IMPORT_C virtual ~CCalenLunarInfoProvider(); - - IMPORT_C TCalenLunarInfo GetLunarInfoL( const TTime& aDay ); - -private: // own methods - CCalenLunarInfoProvider(); - void ConstructL(RFs& aFs); - -private: // data - CChineseCalendarConverter* iConverter; - CCalenSolarTerms* iSolarTerms; - - }; - -#endif // __CALENLUNARINFOPROVIDER_H__ diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/inc/calenlunarlocalizedinfo.h --- a/calendarui/regionalplugins/inc/calenlunarlocalizedinfo.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,82 +0,0 @@ -/* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Calendar Lunar Plugin - * -*/ - - - -#ifndef __CALENLUNARLOCALIZEDINFO_H__ -#define __CALENLUNARLOCALIZEDINFO_H__ - -#include - -class CCalenLunarLocalizer; - -class CCalenLunarLocalizedInfo : public CBase - { -public: - enum TField - { - EFestival, - ESolarTerm, - EFullLunarDate, - ELunarYear, - ELunarMonthAndDay, - EAnimalYear, - EGregorianDate - }; - - -public: // public API - IMPORT_C static CCalenLunarLocalizedInfo* NewL(); - - IMPORT_C virtual ~CCalenLunarLocalizedInfo(); - - /** - * Get specific field. This is useful, when you have ordered array of TFields - * and you want to process them in a loop. - * If day didn't had e.g. festival or solar term, KNullDesC is returned for those. - */ - IMPORT_C const TDesC& GetField( TField aField ); - - IMPORT_C const TDesC& Festival() { return iFestival; } - IMPORT_C const TDesC& SolarTerm() { return iSolarTerm; } - IMPORT_C const TDesC& FullLunarDate() { return iFullLunarDate; } - IMPORT_C const TDesC& LunarYear() { return iLunarYear; } - IMPORT_C const TDesC& LunarMonthAndDay() { return iLunarMonthAndDay; } - IMPORT_C const TDesC& AnimalYear() { return iAnimalYear; } - IMPORT_C const TDesC& GregorianDate() { return iGregorianDate; } - -private: - CCalenLunarLocalizedInfo(); - - void ConstructL(); - -private: - - TPtrC iFestival; - TPtrC iSolarTerm; - TPtrC iAnimalYear; - - TBuf<50> iLunarYear; - TBuf<50> iLunarMonthAndDay; - TBuf<50> iFullLunarDate; - TBuf<50> iGregorianDate; -private: - friend class CCalenLunarLocalizer; - friend class CCalenLunarVietnameseLocalizer; - }; - -#endif // __CALENLUNARLOCALIZEDINFO_H__ diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/inc/calenlunarlocalizer.h --- a/calendarui/regionalplugins/inc/calenlunarlocalizer.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,112 +0,0 @@ -/* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Calendar Lunar Plugin - * -*/ - - - -#ifndef __CALENLUNARLOCALIZER_H__ -#define __CALENLUNARLOCALIZER_H__ - -#include -#include -#include "CalenLunarLocalizedInfo.h" -#include "CalendarVariant.hrh" -#include "calendarui_debug.h" - -class CEikonEnv; -class TCalenLunarInfo; -class TChineseDate; -class CFont; -class CCalenExtraRowFormatter; - -class CCalenLunarLocalizer : public CBase - { -public: // public API - IMPORT_C static CCalenLunarLocalizer* NewL(); - - IMPORT_C virtual ~CCalenLunarLocalizer(); - - IMPORT_C virtual CCalenLunarLocalizedInfo* LocalizeL( TCalenLunarInfo& aInfo ); - - IMPORT_C virtual TPtrC GetExtraRowTextL( CCalenLunarLocalizedInfo& aLocInfo ); - - -protected: - IMPORT_C CCalenLunarLocalizer(); - - IMPORT_C void ConstructL(); - - TBool TryToFitL( const TDesC& aStr ); - virtual void LocalizeMonthAndDayL(CCalenLunarLocalizedInfo* aLocInfo, - TCalenLunarInfo& aInfo); -private: - void GetChineseDigits(TInt aNum, TDes& aDes); - void GetChineseDay(const TChineseDate& aChineseDate, TDes& aDes); - void GetChineseMonth(const TChineseDate& aChineseDate, TDes& aDes); - -protected: // data - CEikonEnv* iEikEnv; - - /** - * Localized names of lunar festivals - * Own. - */ - CDesCArray* iFestivalNames; - - /** - * Localized names of solar terms - * Own. - */ - CDesCArray* iSolarTermNames; - - /** - * Localized names of animal years - * Own. - */ - CDesCArray* iAnimalYearNames; - - /** - * Localized names of heavenly stems - * Own. - */ - CDesCArray* iHeavenlyStemNames; - - /** - * Localized names of terrestial branches - * Own. - */ - CDesCArray* iTerrestialBranchNames; - - - /** - * Format string for western date. - * Own. - */ - HBufC* iGregorianDateFormat; - - TBuf<1000> iLunarExtraRowText; - - - /** - * Language independent formatter of extra row information. - */ - CCalenExtraRowFormatter* iRowFormatter; - - TInt iResourceFileOffset; - - }; - -#endif // __CALENLUNARLOCALIZER_H__ diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/inc/calenlunarpanic.h --- a/calendarui/regionalplugins/inc/calenlunarpanic.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ -/* -* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Calendar Lunar Plugin - * -*/ - - -#ifndef CALENLUNARPANIC_H -#define CALENLUNARPANIC_H - -enum TCalenLunarPanic - { - EPanicLunarResourceLoading = 1, - EPanicLunarEnvNotfound, - }; - -void Panic(TCalenLunarPanic aReason) - { - _LIT(KPanicText, "CalenLunarPlugin"); - User::Panic(KPanicText,aReason); - } - -#endif diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/loc/calendarregionalplugin.loc --- a/calendarui/regionalplugins/loc/calendarregionalplugin.loc Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2037 +0,0 @@ -/* -* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: This is a localisation file for Calendar -* A _loc file is the one and only place where the logical -* strings to be localised are defined -* -*/ - - - -// LOCALISATION STRINGS - - -//d:Application title for listview -//l:list_single_large_graphic_pane_t1 -// -#define qtn_apps_calendar_list "Calendar" - -//d:Application title for general settings pane -//l:list_single_large_graphic_pane_t1_cp2 -// -#define qtn_cale_title_calendar "Calendar" - -//d:Application title for grid -//l:cell_app_pane_t1 -// -#define qtn_apps_calendar_grid "Calendar" - -//d:Opens New entry SubMenu -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_opt_make_note "New entry" - -//d:Opens delete SubMenu in MonthView -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_opt_delete "Delete" - -//d:Deletes a note -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_om_delete "Delete" - -//d:Discard changes to a note -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_om_cancel_changes "Discard changes" - -//d:Confirmation text when discarding changes to a note -//l:popup_note_window -// -#define qtn_cale_query_cancel_changes "Discard changes?" - -//d:Opens SettingView -//l:list_single_pane_t1_cp2 -// -#define text_calendar_settings "Settings" - -//d:Opens DayView -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_opt_open "Open" - -//d:Opens WeekView -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_opt_view_week "View by weeks" - -//d:Jumps to a specific date -//l:list_single_pane_t1_cp2 -// -#define text_calendar_goto_date "Go to date" - -//d:Opens Meeting note -//l:list_single_popup_submenu_pane_t1 -// -#define qtn_cale_meeting_note "Meeting" - - -//d:Opens Meeting Request note -//d:Option list item for this is "Make Note" -//l:list_single_popup_submenu_pane_t1 -//w: -//r:3.0 -// -#define qtn_cale_meeting_request_note "Meeting Request" - - -//d:Opens Anniversary Note -//l:list_single_popup_submenu_pane_t1 -// -#define qtn_cale_note_anniversary "Anniversary" - -//d:Opens Day Note -//l:list_single_popup_submenu_pane_t1 -// -#define qtn_cale_day_note "Day note" - -//d:Opens MonthView -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_opt_view_month "View month" - -//d:Deletes all notes -//l:list_single_popup_submenu_pane_t1 -// -#define qtn_cale_sub_all "All notes" - -//d:the date before the notes are to be deleted. -//l:list_single_popup_submenu_pane_t1 -// -#define qtn_cale_sub_setdate "Before set date" - -//d:Settings is changed -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_om_change "Change" - -//d:Subject item text of Meeting -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_subject "subject" - -//d:Start date item text of Meeting form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_meeting_date "start date" - -//d:End date item text of Meeting form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_meeting_end "end date" - -//d:Start date and time item text of entry editor -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_start_time_date "start time and date" - -//d:End date and time item text of entry editor -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_end_time_date "end time and date" - -//d:Alarm date and time item text of entry editor -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_alarm_time_date "alarm time and date" - -//d:Start time item text of Meeting form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_meeting_start "start time" - -//d:End time item text of Meeting form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_end_meet_time "end time" - -//d:Alarm item text of Meeting, Anniversary form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_alarm_activity "alarm" - -//d:Alarm time item text of Meeting, Anniversary form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_meeting_alarm "alarm time" - -//d:Alarm date item text of Meeting, Anniversary form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_meeting_alarmdate "alarm date" - -//d:Repeat item text of Meeting, Day form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_meeting_repeat "repeat" - -//d:Repeat until item text of Meeting, Day form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_meeting_until "repeat until" - -//d:Confidentiality item text of Meeting form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_meeting_confident "synchronisation" - -//d:Subject item text of Anniversary form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_anniversary_occasion "occasion" - -//d:Start date item text of Anniversary form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_anniversary_start_date "date" - -//d:Subject item text of Day form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_day_description "description" - -//d:Start date item text of Day form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_day_start_date "start date" - -//d:End date item text of Day form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_day_end_date "end date" - -//d:Occasion item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_occasion "Occasion:" - -//d:Date item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_date "Date:" - -//d:Subject item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_subject "Subject:" - -//d:Location item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_location "Location:" - -//d:Synchronisation item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_sync "Synchronisation:" - -//d:Alarm item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_alarm "Alarm:" - -//d:Repeat item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_repeat_daily "Repeats daily:" - -//d:Repeat item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_repeat_weekly "Repeats weekly:" - -//d:Repeat item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_repeat_fortnightly "Repeats fortnightly:" - -//d:Repeat item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_repeat_monthly "Repeats monthly:" - -//d:Repeat item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_repeat_yearly "Repeats yearly:" - -//d:Repeat item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_repeat_other "Recurring entry:" - -//d:Repeat item text of note viewer when no end date (repeat from ...) -//d:%0U is date entry repeats from -//l:list_form_graphic_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_valid_forever "From %0U" - -//d:Navi pane decoration for event viewers -//d:%0U is current instance date -//d:%1U is index of current instance -//d:%2U is total instance count for current day -//l:navi_text_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_navi "%0U %1U/%2U" - -//d:Repeat item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_repeat "Repeat:" - -//d:Time item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_time "Time:" - -//d:Due date item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_due_date "Due date:" - -//d:Since item text of note viewer (anniversaries only) -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_since "Since:" - -//d:Priority item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_prio "Priority:" - -//d:Description item text of note viewer -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_desc "Description:" - -//d:Private item text of note viewer (Sync) -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_sync_private "Private" - -//d:Public item text of note viewer (Sync) -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_sync_public "Public" - -//d:None item text of note viewer (Sync) -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_sync_none "None" - -//d:High item text of note viewer (Priority) -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_prio_high "High" - -//d:Normal item text of note viewer (Priority) -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_prio_normal "Normal" - -//d:Low item text of note viewer (Priority) -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_prio_low "Low" - -//d:Completed item text of note viewer (Priority) -//l:list_double_graphic_heading_pane_t1 -//r:3.2 -// -#define qtn_cale_viewer_completed "Completed:" - -//d:Date and time when appointment starts and ends on the same day -//d:The string is small enough to fit onto one line -//d:%0U is start time -//d:%1U is end time -//d:%2U is start date -//l:popup_preview_text_window/opt1 -//r:3.2 -// -#define qtn_cale_viewer_time_day "%0U - %1U %2U" - -//d:Date and time when appointment starts and ends on the same day -//d:The string is too long to fit onto one line so must include a linebreak -//d:%0U is start time -//d:%1U is end time -//d:%2U is start date -//d:<\x2028> is line break -//l:popup_preview_text_window/opt1 -//r:3.2 -// -#define qtn_cale_viewer_time_day_wrapped "%0U - %1U"<0x2028>"%2U" - -//d:Date and time when appointment starts and ends on different days -//d:The string is small enough to fit onto one line -//d:%0U is start time -//d:%1U is start date -//d:%2U is end time -//d:%3U is end date -//l:popup_preview_text_window/opt1 -//r:3.2 -// -#define qtn_cale_viewer_time_days "%0U %1U - %2U %3U" - -//d:Date and time when appointment starts and ends on different days -//d:The string is too long to fit onto one line so must include a linebreak -//d:%0U is start time -//d:%1U is start date -//d:%2U is end time -//d:%3U is end date -//d:<\x2028> is line break -//l:popup_preview_text_window/opt1 -//r:3.2 -// -#define qtn_cale_viewer_time_days_wrapped "%0U %1U -"<0x2028>"%2U %3U" - -//d:Date and time of alarm (when alarm is on different day to event) -//d:%0U is alarm time -//d:%1U is alarm date -//l:popup_preview_text_window/opt1 -//r:3.2 -// -#define qtn_cale_viewer_alarm_time "%0U %1U" - -//d:Start and end date of event, when event lasts for more than one day -//d:%0U is start date -//d:%1U is end date -//l:msg_body_pane/opt -//r:3.2 -// -#define qtn_cale_viewer_valid_limited "%0U - %1U" - -//d:Error text when adjusting repeating meeting instance times -//l:popup_note_window -//r:3.2 -// -#define qtn_cale_note_cannot_occur_daily "%N day meeting cannot repeat daily" - -//d:Error text when adjusting repeating meeting instance times -//l:popup_note_window -//r:3.2 -// -#define qtn_cale_note_cannot_occur_weekly "%N day meeting cannot repeat weekly" - -//d:Error text when adjusting repeating meeting instance times -//l:popup_note_window -//r:3.2 -// -#define qtn_cale_note_cannot_occur_fortnightly "%N day meeting cannot repeat fortnightly" - -//d:Error text when adjusting repeating meeting instance times -//l:popup_note_window -//r:3.2 -// -#define qtn_cale_note_cannot_occur_monthly "%N day meeting cannot repeat monthly" - -//d:Error text when adjusting repeating meeting instance times -//l:popup_note_window -//r:3.2 -// -#define qtn_cale_note_cannot_occur_yearly "%N day meeting cannot repeat yearly" - -//d:Error text when attempting to move a meeting out of sequence -//l:popup_note_window -//r:3.2 -// -#define qtn_cale_note_child_out_of_sequence "Unable to move a meeting out of sequence" - -//d:Error note when attempting to move an instance of a meeting to a day when an instance already exists -//l:popup_note_window -//r:3.2 -// -#define qtn_cale_note_child_same_day "Two occurrences of a meeting cannot occur on the same day" - -//d:Error note when attempting to move a meeting to overlap another instance of the meeting -//l:popup_note_window -//r:3.2 -// -#define qtn_cale_note_child_overlap "Meeting cannot overlap another instance of itself" - -//d:Alarm active text of Note form -//l:list_form_graphic_pane_t1 -// -#define qtn_cale_alarm_active "Active" - -//d:Alarm off text of the Note form -//l:list_form_graphic_pane_t1 -// -#define qtn_cale_alarm_off "Off" - -//d:Synchronisation type text of the Note form -//l:list_form_graphic_pane_t1 -// -#define qtn_cale_confident_public "Public" - -//d:Synchronisation type text of the Note form -//l:list_form_graphic_pane_t1 -// -#define qtn_cale_confident_private "Private" - -//d:Synchronisation type text of the Note form -//l:list_form_graphic_pane_t1 -// -#define qtn_cale_confident_none "None" - -//d:Repeat type "Not repeated" text of note form -//l:list_set_graphic_pane_t1 -// -#define qtn_cale_not_repeated "Not repeated" - -//d:Repeat type "Every day" text of note form -//l:list_set_graphic_pane_t1 -// -#define text_calendar_every_day "Every day" - -//d:Repeat type "Every week" text of note form -//l:list_set_graphic_pane_t1 -// -#define text_calendar_every_week "Every week" - -//d:Repeat type "Every two weeks" text of note form -//l:list_set_graphic_pane_t1 -// -#define text_calendar_bi_weekly "Every 2 weeks" - -//d:Repeat type "Monthly" text of note form -//l:list_set_graphic_pane_t1 -// -#define qtn_cale_repeat_monthly "Monthly" - -//d:Repeat type "Yearly" text of note form -//l:list_set_graphic_pane_t1 -// -#define text_calendar_every_year "Every year" - -//d:Repeat type "Other" text of note form -//l:list_set_graphic_pane_t1 -// -#define qtn_cale_other "Other" - -//d:Title pane text of Meeting form -//l:title_pane_t2/opt9 -// -#define text_calendar_title_meeting "Meeting" - -//d:Title pane text of Anniversary form -//l:title_pane_t2/opt9 -// -#define qtn_cale_anniversary_title "Anniversary" - -//d:Title pane text of Day form -//l:title_pane_t2/opt9 -// -#define qtn_cale_title_daynote "Day note" - -//d:After confirming the saving,the confirmation note -//d:Calendar note savedis shown -//l:popup_note_window -// -#define text_calendar_note_saved "Note saved" - -//d:The List_Query with the prompt text Save Repeat Note? -//l:heading_pane_t1 -// -#define qtn_cale_lq_save_chang_repeated "Save changes?" - -//d:The List_Query with the prompt text "Edit:" (choices being Series or Occurrence) -//l:heading_pane_t1 -// -#define qtn_cale_lq_edit_recurring "Edit:" - -//d:All notes delete prompt -//l:popup_note_window -// -#define qtn_cale_quest_delete_all_notes "Delete all notes" - -//d:A note delete prompt -//l:popup_note_window -// -#define qtn_cale_quest_delete_event "Delete note?" - -//d:Data query for inputting the date before the notes are to be deleted. -//l:popup_query_data_window -// -#define qtn_cale_prmpt_del_before_date "Delete before set date" - -//d:When deleting a repeated note, -//d:the phone prompts the List_Query -//l:heading_pane_t1 -// -#define qtn_cale_lq_del_repeated_note "Delete repeated note" - -//d:After deleting of notes phone displays the information note -//l:popup_note_window -// -#define qtn_cale_conf_past_note_deleted "Notes from past to set date deleted" - -//d:After deleting of notes phone displays the information note -//l:popup_note_window -// -#define qtn_cale_conf_all_notes_deleted "All notes deleted from Calendar" - -//d:Erase or update note selection list of choice items -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_lq_all_occurences "All occurrences" - -//d:Erase or update selection list of choice items -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_lq_this_occurence "Only this occurrence" - -//d:Edit note selection list of choice items -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_lq_edit_series "All occurrences" - -//d:Edit note selection list of choice items -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_lq_edit_this "Only this occurrence" - -//d:Specified Out of range of date -//l:popup_note_window -// -#define qtn_cale_info_year_limit "Year limit is from 1900 to 2100" - -//d:Error prompt for alarm date too past -//l:popup_note_window -// -#define qtn_cale_date_alarm_past "Alarm date is too past" - -//d:Error prompt for alarm time earlier than note -//l:popup_note_window -// -#define qtn_cale_later_date "Alarm later than note" - -//d:Error prompt for setting alarm time which is past. -//l:popup_note_window -// -#define qtn_cale_not_expired "The time for the note alarm has already expired" - -//d:Error prompt for repeat until date earlier than start date. -//l:popup_note_window -// -#define qtn_cale_info_repeat_invalid "Repeat until has to be later than the start date" - -//d:Confirmaiton prompt for updating start date on repeat note. -//l:popup_note_window -// -#define qtn_cale_quest_change_start_day "Are you sure to change start date of selected recurring note?" - -//d:Error prompt "Note ends before than starts" -//l:popup_note_window -// -#define qtn_cale_info_note_ends_before "Note ends before than starts" - -//d:Error prompt. Date limit could be set only to the past. -//l:popup_note_window -// -#define qtn_cale_date_not_future "Date in the future not allowed" - -//d:Calendar Settings title pane -//l:title_pane_t2/opt9 -// -#define text_calendar_setting_title "Settings" - -//d:Calendar Settings main pane item -//l:list_setting_pane_t1/opt1 -// -#define qtn_cale_default_view "Default view" - -//d:Calendar Settings main pane item -//l:list_setting_pane_t1/opt1 -// -#define qtn_cale_week_format "Week format" - -//d:Calendar Settings main pane item -//l:list_setting_pane_t1/opt1 -// -#define text_calendar_week_title_format "Title of week view" - -//d: Calendar Settings "Default view" item -//l:list_set_graphic_pane_t1 -// -#define qtn_cale_default_day_view "Day View" - -//d: Calendar Settings "Default view" item -//l:list_set_graphic_pane_t1 -// -#define qtn_cale_default_week_view "Week View" - -//d: Calendar Settings "Default view" item -//l:list_set_graphic_pane_t1 -// -#define qtn_cale_default_month_view "Month View" - -//d: Calendar Settings "Title of week view" item -//l:list_set_graphic_pane_t1 -// -#define text_calendar_week_title_numb "Week number" - -//d: Calendar Settings "Title of week view" item -//l:list_set_graphic_pane_t1 -// -#define text_calendar_week_title_dur "Duration of week" - -//d:Calendar Settings "Default Mailbox" item -//l:heading_pane_t1 -//w: -//r:3.0 -// -#define qtn_cale_lq_select_mailbox "Select Default Mailbox: " - -//d:Calendar "Default Mailbox" setting item name. -//l:list_setting_pane_t1/opt1 -//w: -//r:3.0 -// -#define qtn_cale_default_mailbox "Default mailbox" - -//d:Calendar no default mailboxes defined prompt -//l:popup_note_window -//w: -//r:3.0 -// -#define qtn_cale_query_define_mailbox "No mailboxes defined, define now?" - - -//d:Calendar Settings main pane item -//l:list_setting_pane_t1 -//r:3.2 -// -#define qtn_cale_sett_arabic_cale "Arabic calendar" - -//d:Opens external calendar application -//l:list_single_pane_t1_cp2 -//r:3.2 -// -#define qtn_cale_om_external_cale "External calendar" - -//d: Calendar date query prompt -//l:popup_query_data_window -// -#define text_calendar_date_prompt "Date:" - -//d:Title pane text in WeekView main state -//d:currently highlighted day's Week %N -//d:%N was setted week number -//l:title_pane_t2/opt9 -// -#define qtn_cale_week_view_title "Week %N" - -//d:Title pane text in WeekView main state -//d:currently highlighted day's %0U - %1U -//d:The date of dd/mm/yy form is set to %0U or %1U. -//l:title_pane_t2/opt9 -// -#define qtn_cale_title_week_days "%0U -\n %1U" - -//d:Confirmation note. -//d:Message is shown after system time change, but no alarms were missed. -//l:popup_note_window -// -#define qtn_cale_note_system_time_changed "System time changed, Calendar events are updated accordingly" - -//d:Deleting wait note text -//l:popup_note_wait_window -// -#define qtn_cale_wait_deleting_notes "Deleting notes..." - -//d:Location item text of Meeting form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_cale_note_meeting_location "location" - -//d:Calendar Settings main pane item -//l:list_setting_pane_t1/opt1 -// -#define qtn_chi_cale_sett_lunar_cale "Lunar calendar" - -//d: Calendar Settings "Lunar calendar" item -//l:list_set_graphic_pane_t1 -// -#define qtn_chi_cale_lunar_cale_on "On" - -//d: Calendar Settings "Lunar calendar" item -//l:list_set_graphic_pane_t1 -// -#define qtn_chi_cale_lunar_cale_off "Off" - -//d:Chinese Animal year - Rat -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_rat "Year of the Rat" - -//d:Chinese Animal year - Ox -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_ox "Year of the Ox" - -//d:Chinese Animal year - Tiger -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_tiger "Year of the Tiger" - -//d:Chinese Animal year - Rabbit -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_rabbit "Year of the Rabbit" - -//d:Chinese Animal - Rabbit -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_dragon "Year of the Dragon" - -//d:Chinese Animal - Snake -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_snake "Year of the Snake" - -//d:Chinese Animal - Horse -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_horse "Year of the Horse" - -//d:Chinese Animal - Sheep -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_sheep "Year of the Sheep" - -//d:Chinese Animal - Monkey -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_monkey "Year of the Monkey" - -//d:Chinese Animal - Rooster -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_rooster "Year of the Rooster" - -//d:Chinese Animal - Dog -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_dog "Year of the Dog" - -//d:Chinese Animal - Pig -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_animal_pig "Year of the Pig" - -//d:Chinese Heavenly stem 1 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_1 "Jia" - -//d:Chinese Heavenly stem 2 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_2 "Yi" - -//d:Chinese Heavenly stem 3 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_3 "Bing" - -//d:Chinese Heavenly stem 4 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_4 "Ding" - -//d:Chinese Heavenly stem 5 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_5 "Wu" - -//d:Chinese Heavenly stem 6 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_6 "Ji" - -//d:Chinese Heavenly stem 7 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_7 "Geng" - -//d:Chinese Heavenly stem 8 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_8 "Xing" - -//d:Chinese Heavenly stem 9 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_9 "Reng" - -//d:Chinese Heavenly stem 10 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_heav_stem_10 "Gui" - -//d:Chinese Terrestrial branch 1 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_1 "Zi" - -//d:Chinese Terrestrial branch 2 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_2 "Chou" - -//d:Chinese Terrestrial branch 3 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_3 "Yin" - -//d:Chinese Terrestrial branch 4 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_4 "Mao" - -//d:Chinese Terrestrial branch 5 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_5 "Chen" - -//d:Chinese Terrestrial branch 6 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_6 "Si" - -//d:Chinese Terrestrial branch 7 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_7 "Wu" - -//d:Chinese Terrestrial branch 8 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_8 "Wei" - -//d:Chinese Terrestrial branch 9 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_9 "Shen" - -//d:Chinese Terrestrial branch 10 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_10 "You" - -//d:Chinese Terrestrial branch 11 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_11 "Xu" - -//d:Chinese Terrestrial branch 12 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_terr_branch_12 "Hai" - -//d:Chinese solar items 1 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_1 "Li Chun" - -//d:Chinese solar items 2 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_2 "Yu Shui" - -//d:Chinese solar items 3 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_3 "Jing Zhe" - -//d:Chinese solar items 4 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_4 "Chun Fen" - -//d:Chinese solar items 5 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_5 "Qing Ming" - -//d:Chinese solar items 6 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_6 "Gu Yu" - -//d:Chinese solar items 7 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_7 "Li Xia" - -//d:Chinese solar items 8 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_8 "Xiao Man" - -//d:Chinese solar items 9 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_9 "Mang Zhong" - -//d:Chinese solar items 10 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_10 "Xia Zhi" - -//d:Chinese solar items 11 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_11 "Xiao Shu" - -//d:Chinese solar items 12 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_12 "Da Shu" - -//d:Chinese solar items 13 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_13 "Li Qiu" - -//d:Chinese solar items 14 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_14 "Chu Shu" - -//d:Chinese solar items 15 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_15 "Bai Lu" - -//d:Chinese solar items 16 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_16 "Qiu Fen" - -//d:Chinese solar items 17 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_17 "Han Lu" - -//d:Chinese solar items 18 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_18 "Shuang Jiang" - -//d:Chinese solar items 19 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_19 "Li Dong" - -//d:Chinese solar items 20 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_20 "Xiao Xue" - -//d:Chinese solar items 21 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_21 "Da Xue" - -//d:Chinese solar items 22 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_22 "Dong Zhi" - -//d:Chinese solar items 23 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_23 "Xiao Han" - -//d:Chinese solar items 24 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_solar_item_24 "Da Han" - -//d:Lunar festivals 1 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_festival_name_1 "Spring festival" - -//d:Lunar festivals 2 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_festival_name_2 "Lantern festival" - -//d:Lunar festivals 3 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_festival_name_3 "Dragon boat festival" - -//d:Lunar festivals 4 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_festival_name_4 "Seventh night festival" - -//d:Lunar festivals 5 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_festival_name_5 "Ghost festival" - -//d:Lunar festivals 6 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_festival_name_6 "Mid autumn festival" - -//d:Lunar festivals 7 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_festival_name_7 "Double ninth festival" - -//d:Lunar festivals 8 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_festival_name_8 "Eighth day of twelfth month festival" - -//d:Lunar festivals 9 -//l:navi_text_pane_t1 -// -#define qtn_chi_cale_festival_name_9 "New year's eve" - -//d:Opens Lunar data dialog -//l:list_single_pane_t1_cp2 -// -#define qtn_chi_cale_lunar_data "Show lunar data" - -//d:Title pane sting in "Show lunar data" dialog -//l:heading_pane_t1 -// -#define qtn_chi_cale_lunar_calendar "Lunar calendar" - -//d:Calendar Settings main pane item -//l:list_setting_pane_t1 -// -#define qtn_cale_alarm_tone "Calendar alarm tone" - -//d: Empty listbox -//l: main_list_empty_pane -// -#define qtn_cale_no_events "(No Events)" - -//d: The subject text when the item subject is empty in DayView -//l: list_single_heading_pane_t1 -// -#define qtn_cale_no_subject "" - -//d: Profile Settings Item Edit - setting selection data -//l: list_set_graphic_pane_t1 -#define qtn_tc_off "Off" - -//d: File list dialog header -//l: heading_pane_t1 -#define qtn_tc_popup_heading "Select tone: " - -//d:Default tone selection choice in alarm tone list for Calendar and Clock -//l:list_set_graphic_pane_t1 -// -#define qtn_mode_default_tone "Default tone" - -//d:Options menu item. -//d:Opens Add Description submenu in note editor -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_om_add_descript "Add Description" - -//d:Submenu item for adding new description text to Calendar entry -//d:Opens Notepad Editor. -//l:list_single_popup_submenu_pane_t1 -// -#define qtn_cale_om_descript_new "New" - -//d:Submenu item for adding description text to Calendar entry -//d:from existing Notepad memos. Launches Notepad memo fetch. -//l:list_single_popup_submenu_pane_t1 -// -#define qtn_cale_om_descript_exist "Use existing" - -//d:Options menu item. -//d:Shows Calendar entry description text in Notepad viewer. -//d:Opens Notepad viewer. -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_om_desc_show "Show Description" - -//d:Options menu item. -//d:Removes description text from Calendar entry. -//d:Launches confirmation query before removing. -//l:list_single_pane_t1_cp2 -// -#define qtn_cale_om_desc_remove "Remove Description" - -//d:Title text, when editing Calendar description in Notepad -//l:title_pane_t2/opt9 -// -#define qtn_cale_note_title "Calendar Description" - -//d:Confirmation text, when deleting Calendar description data from -//d:Notepad editor -//l:popup_note_window -// -#define qtn_cale_q_del_notep_desc "Delete Calendar Description?" - -//d:Informatio note text shown, when Calendar description is deleted from -//d:Notepad editor or viewer -//l:popup_note_window -// -#define qtn_cale_inote_desc_del_memo "Calendar description deleted" - -//d:Confirmation text, when deleting Calendar description data from -//d:Calendar meeting editor -//l:popup_note_window -// -#define qtn_cale_query_remove_descr "Remove Description?" - -//d:Header text for Description form item. -//d:One truncated line of description is visible below this. -//l:data_form_wide_pane_t1 -// -#define qtn_cale_meeting_description "Description" - -//d:Title text of title pane -//d:Note View -//l:title_pane_t2/opt9 -// -#define qtn_todo_note_header "To-Do Note" - -//d:Command in options menu. -//d:Delete the selected item. -//l:list_single_pane_t1_cp2 -// -#define qtn_todo_om_delete "Delete" - -//d:Command in options sub-menu. -//d:Set a priority high to selected item. -//l:list_form_graphic_pane_t1 -// -#define qtn_todo_attr_high "High" - -//d:Command in options sub-menu. -//d:Set a priority normal to selected item. -//l:list_form_graphic_pane_t1 -// -#define qtn_todo_attr_normal "Normal" - -//d:Command in options sub-menu. -//d:Set a priority low to selected item. -//l:list_form_graphic_pane_t1 -// -#define qtn_todo_attr_low "Low" - -//d:Command in options menu. -//d:Marked the To-Do item done in List View -//l:list_single_pane_t1_cp2 -// -#define qtn_todo_cmd_task_completed "Task completed" - -//d:Command in options menu. -//d:Unmarked the To-Do item done in List View -//l:list_single_pane_t1_cp2 -// -#define qtn_todo_cmd_restore_task "Restore task" - -//d:Confirmation query prompt. -//d:Deleting the selected one note. -//l:popup_note_window -// -#define qtn_todo_quest_delete_note "Delete note?" - -//d:Confirmation query prompt. -//d:Deleting the marked one or more notes. -//l:popup_note_window -// -#define qtn_todo_quest_delete_notes "Delete\n%N notes?" - -//d:Wait note text in deleting items. -//l:popup_note_wait_window -// -#define qtn_todo_wait_deleting_notes "Deleting notes..." - -//d:Item texts of form -//d:Priority field of To-Do Note form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_todo_note_view_priority "priority" - -//d:Item texts of form -//d:Due date field of To-Do Note form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_todo_note_duedate "due date" - -//d:Item texts of form -//d:Subject field of To-Do Note form -//l:list_double_graphic_heading_pane_t1 -// -#define qtn_todo_note_subject "subject" - -//d: Information note text shown in Calendar application start, -//d: when alarms have been passed due system time change -//l:popup_note_window -//w: -//r:3.0 -#define qtn_cale_note_missed_alarms "1 or more alarms missed due to time change" - -//d: Setting item choice to select Todo view as Calendar default view -//l:list_set_graphic_pane_t1 -//w: -//r:3.0 -// -#define qtn_cale_default_todo_view "Todo view" - - -//d: Options Submenu item to create new Todo note -//l:list_single_popup_submenu_pane_t1 -//w: -//r:3.0 -#define qtn_cale_note_todo "Todo" - -//d: Confirmation note shown, when edited Todo note is saved -//l:popup_note_window -//w: -//r:3.0 -#define qtn_cale_note_todo_saved "Todo Note saved" - -//d: Options menu item to open Calendar day view from Todo view -//l:list_single_pane_t1_cp2 -//w: -//r:3.0 -#define qtn_cale_opt_view_day "Day view" - -//d: Options menu item to open Todo view from other Calendar views -//l:list_single_pane_t1_cp2 -//w: -//r:3.0 -#define qtn_cale_opt_view_todo "Todo view" - -//d: Title pane text for Calendar Todo view that shows all users Todo entries -//l:title_pane_t2/opt9 -//w: -//r:3.0 -#define qtn_cale_title_todos "All Todos" - -//d:Snooze time setting header. -//l:list_setting_pane_t1/opt1 -//w: -//r:3.1 -#define qtn_cale_set_snooze_time "Calendar Alarm Snooze Time" - -//d:Context-specific text for the current snooze time value in Calendar Settings. -//l:setting_slider_pane_t2 -//w: -//r:3.1 -#define qtn_sanim_time_out_slider_ykcur "1 minute" - -//d:Context-specific text for the current snooze time value in Calendar Settings. -//d:%U in minutes, plural. -//l:list_set_graphic_pane_t1 -//w: -//r:3.1 -#define qtn_cale_sanim_time_out_slider_cur "%U minutes" - -//d:Context-specific text for the minimum snooze time value in Calendar Settings. -//l:setting_slider_pane_t2 -//w: -//r:3.1 -#define qtn_cale_sanim_time_out_slider_min "1 min." - -//d:Context-specific text for the maximum snooze time value in Calendar Settings. -//l:setting_slider_pane_t2 -//w: -//r:3.1 -#define qtn_snooze_time_max "60 min." - - -//d: Format string for lunar calendar information in Calendar day, week and month views -//d: Format string is used dynamically to display as much information as possible. -//d: If all information doesn't fit some information and separators are dropped. -//d: Localization can affect order of information. -//d: If data element is dropped, empty string is supplied for it. -//d: and either for preceding (or following) separator (%0U) -//d: -//d: e.g. in Chinese, order should be somethinglike (201030405): "%2U%0U%1U%0U%3U%0U%4U%0U%5U" -//d: e.g. in Vietnamese, (304050201): "%3U%0U%4U%0U%5U%0U%2U%0U%1U" -//d: %0U separator between data elements, qtn_cale_lunar_separator -//d: %1U animal year format, qtn_cale_animal_year_in_extra_row -//d: %2U lunar year, qtn_cale_lunar_year -//d: %3U lunar date, either qtn_cale_lunar_date or qtn_cale_lunar_leap_date -//d: %4U festival, qtn_chi_cale_festival_name_X -//d: %5U solar term, qtn_chi_cale_solar_item_X -//l: None -//w: -//r:3.2 -// -#define qtn_cale_extra_row_lunar "%1U%0U%2U%0U%3U%0U%4U%0U%5U" - - -//d: Separator between data elements in Lunar Calendar extra row. -//d: E.g. in Chinese, " " -//d: E.g. in Vietnamese, ", " -//l: (None) -//w: -//r:3.2 -// -#define qtn_cale_lunar_separator ", " - - -//d: Chinese lunar date with day, month and year. -//d: %0U is lunar date. either qtn_cale_lunar_date or qtn_cale_lunar_leap_date -//d: %1U lunar year. qtn_cale_lunar_year -//d: -//l: (None) -//w: -//r:3.2 -// -#define qtn_cale_lunar_full_date "%0U %1U" - - -//d: Chinese lunar date for dates. Used for non-leap month dates. -//d: Localication can add language specific separator and extra symbols. -//d: E.g. in Chinese, character for month should be used: "%0U·%1U" -//d: E.g. in Vietnamese, order is different and separator is slash "%1U/%0U" -//d: %0U is lunar month -//d: %1U lunar day -//l: (None) -//w: -//r:3.2 -// -#define qtn_cale_lunar_date "%0U/%1U" - - -//d: Chinese lunar date for dates that are on leap months. -//d: This should be similar to qtn_cale_lunar_date, -//d: but language specific leap month indicator should be added to correct place. -//d: E.g. in Vietnamese: "%1U/%0U N" -//d: %0U is lunar month -//d: %1U lunar day -//l: (None) -//w: -//r:3.2 -// -#define qtn_cale_lunar_leap_date "%0UL/%1U" - - -//d: Chinese lunar year, combination of heavenly stem and terrestial branch -//d: %0U is heavenly stem (qtn_chi_cale_heav_stem_X) -//d: %1U is terrestial branch (qtn_chi_cale_terr_branch_X) -//d: Localization can add language specific separator between words -//d: and if words are written together, space can be removed (e.g. in Chinese). -//d: E.g. in Chinese "%0U%1U·" -//d: E.g. in Vietnamese "Nam %0U %1U" -//l: (None) -//w: -//r:3.2 -// -#define qtn_cale_lunar_year "%0U %1U" - - -//d: Heading text for chinese festival -//d: in Lunar calendar information pop-up. -//d: It's not shown for dates that do not have festival. -//l: list_single_pane_t1 -//w: -//r:3.2 -// -#define qtn_cale_lunar_info_festival "Festival:" - - -//d: Heading text for chinese solar term -//d: in Lunar calendar information pop-up. -//d: It's not shown for dates that do not have solar term. -//l: list_single_pane_t1 -//w: -//r:3.2 -// -#define qtn_cale_lunar_info_solar "Solar term:" - - -//d: Heading text for chinese lunar calendar date -//d: in Lunar calendar information pop-up. -//d: Data for this header is qtn_cale_lunar_full_date. -//l: list_single_pane_t1 -//w: -//r:3.2 -// -#define qtn_cale_info_lunar_date "Lunar date:" - - -//d: Heading text for animal year -//d: in Lunar calendar information pop-up. -//d: Data for this header is qtn_chi_cale_animal_X -//l: list_single_pane_t1 -//w: -//r:3.2 -// -#define qtn_cale_info_animal_year "Animal year:" - - -//d: Heading text for Gregorian (normal) date -//d: in Lunar calendar information pop-up. -//d: Data for this header is qtn_date_usual_with_zero -//l: list_single_pane_t1 -//w: -//r:3.2 -// -#define qtn_cale_info_western_date "Gregorian date:" - - -//d: Year of Cat. -//d: In Vietnamese Lunar Calendar, year of rabbit of Chinese Lunar Calendar is instead a year of cat. -//l: list_single_pane_t1_cp2 -//w: -//r:3.2 -// -#define qtn_chi_cale_animal_cat "Year of the Cat" - - -//d: Setting item header for Thai Buddhist year display. -//d: Values are On and Off. -//d: If setting is on, Buddhist year is shown on -//d: separate area in month, week and day views -//l: list_set_graphic_pane_t1 -//w: -//r:3.2 -// -#define qtn_cale_sett_thai_year "Show Buddhist year" - -//d: Database conflict note: entry was deleted by other application -//l: popup_note_window -//r: 3.2/5.0 -#define qtn_cale_note_db_conflict "Calendar database conflict. This entry has been deleted by another application." - -//d: Database conflict note: entry was modified by other application -//l: popup_note_window -//r: 3.2/5.0 -#define qtn_cale_note_db_modified "Calendar database conflict. This entry has been modified by another application." - -//d: Menu item for grouping views. -//d: Values are month, week, day and todo. -//l: list_single_pane_t1_cp2 -//w: -//r:4.0 -// -#define qtn_cale_opt_change_view "Change view" - -//d: Menu item for changing to month view. -//d: Value is month. -//l: list_single_popup_submenu_pane_t1 -//w: -//r:4.0 -// -#define qtn_cale_opt_change_month "Month" - -//d: Menu item for changing to week view. -//d: Value is week. -//l: list_single_popup_submenu_pane_t1 -//w: -//r:4.0 -// -#define qtn_cale_opt_change_week "Week" - -//d: Menu item for changing to day view. -//d: Value is day. -//l: list_single_popup_submenu_pane_t1 -//w: -//r:4.0 -// -#define qtn_cale_opt_change_day "Day" - -//d: Menu item for changing to todo view. -//d: Value is todo. -//l: list_single_popup_submenu_pane_t1 -//w: -//r:4.0 -// -#define qtn_cale_opt_change_todo "To-Do" - -//d: Tooltip text for previous view button. -//l: popup_preview_text_window_t1 -//w: -//r:3.2 -// -#define qtn_cale_tooltip_prev_view "Previous view" - -//d: Tooltip text for month view button. -//l: popup_preview_text_window_t1 -//w: -//r:3.2 -// -#define qtn_cale_tooltip_month_view "Month view" - -//d: Tooltip text for week view button. -//l: popup_preview_text_window_t1 -//w: -//r:3.2 -// -#define qtn_cale_tooltip_week_view "Week view" - -//d: Tooltip text for day view button. -//l: popup_preview_text_window_t1 -//w: -//r:3.2 -// -#define qtn_cale_tooltip_day_view "Day view" - -//d: Tooltip text for todo view button. -//l: popup_preview_text_window_t1 -//w: -//r:3.2 -// -#define qtn_cale_tooltip_todo_view "ToDo view" - -//d: Tooltip text for next view button. -//l: popup_preview_text_window_t1 -//w: -//r:3.2 -// -#define qtn_cale_tooltip_next_view "Next view" - -//d: Tooltip text for new entry button. -//l: popup_preview_text_window_t1 -//w: -//r:3.2 -// -#define qtn_cale_tooltip_new_entry "New entry" - -//d: New note query heading, which shows up when MSK is pressed, when day view or to do view is empty -//d: Value is New Entry -//l: heading_pane_t1 -//w: -//r:5.0 -// -#define qtn_cale_lq_new_entry "New entry" - -//d: List item in new note query, which shows up when MSK is pressed when day view or to do view is empty -//d: Value is meeting -//l: list_single_pane_t1_cp2 -//w: -//r:5.0 -// -#define qtn_cale_lq_new_meeting "Meeting" - -//d: List item in new note query, which shows up when MSK is pressed when day view or to do view is empty -//d: Value is mr -//l: list_single_pane_t1_cp2 -//w: -//r:5.0 -// -#define qtn_cale_lq_new_mr "Meeting Request" - -//d: List item in new note query, which shows up when MSK is pressed when day view or to do view is empty -//d: Value is memo -//l: list_single_pane_t1_cp2 -//w: -//r:5.0 -// -#define qtn_cale_lq_new_memo "Memo" - -//d: List item in new note query, which shows up when MSK is pressed when day view or to do view is empty -//d: Value is anniv -//l: list_single_pane_t1_cp2 -//w: -//r:5.0 -// -#define qtn_cale_lq_new_anniversary "Anniversary" - -//d: List item in new note query, which shows up when MSK is pressed, when day view or to do view is empty -//d: Value is todo -//l: list_single_pane_t1_cp2 -//w: -//r:5.0 -// -#define qtn_cale_lq_new_todo "To-Do" - -//d: Edits a note -//d: Value is Edit -//l: list_single_pane_t1_cp2 -//r 3.2 -// -#define qtn_cale_om_edit "Edit" - -//d: Calendar Go to date query prompt -//l: popup_query_data_window_t3/opt2 -// -#define qtn_cale_go_to_date "Go to date:" - -//d: Msk label displayed in Todo/Day view when there are no events for a day -//d: Value is New -//l: control_pane_t3/opt7 -//r: 5.0 -// -#define qtn_cale_msk_new_entry "New" - -//d: Tooltip text for Next View -//l: popup_preview_text_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_tb_next_view "Next view" - -//d: Tooltip text for New Meeting -//l: popup_preview_text_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_tb_new_meeting "New meeting" - -//d: Tooltip text for New ToDo -//l: popup_preview_text_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_tb_new_todo "New to-do" - -//d:Long tap on day opens Long tap menu to create new Meeting note -//l:list_single_pane_t1_cp2 -//w: -//r: 5.0 -// -#define qtn_cale_long_tap_meeting "New meeting" - -//d:Long tap on day opens Long tap menu to create new Anniversary Note -//l:list_single_pane_t1_cp2 -//w: -//r: 5.0 -// -#define qtn_cale_long_tap_anniversary "New anniversary" - -//dLong tap on day opens Long tap menu to create new Day Note -//l:list_single_pane_t1_cp2 -//w: -//r: 5.0 -// -#define qtn_cale_long_tap_memo "New memo" - -//d: Long tap on day opens Long tap menu to create new Todo note -//l:list_single_pane_t1_cp2 -//w: -//r: 5.0 -// -#define qtn_cale_long_tap_todo "New todo" - -//d: Format string for data shown in preview pane -//d: %0U is start time -//d: %1U is hyphen or space -//d: %2U is end time -//d: %3U is subject -//d: %4U is location -//d: %5U is description -//d: %6U is language specific separator -//d: %7U is space -//l: list_single_fp_cale_pane_t2/opt1 -//w: -//r: 5.0 -// -#define qtn_cale_pane_event_data "%0U%1U%2U%7U%3U%6U%4U%6U%5U" - -//d: Title for the preview pane -//d: %0U is currently focused week day -//d: %1U is currently focused date -//l: popup_fixed_preview_cale_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_pane_title "%0U %1U" - -//d: No events in preview pane -//l: popup_fixed_preview_cale_window_t2/opt1 -//w: -//r: 5.0 -// -#define qtn_cale_pane_no_events "(No events)" - -//d: Popup Event Separator -//l: None -//w: -//r: 5.0 -// -#define qtn_cale_popup_event_separator "," - -//d: Options menu item for clearing a missed alarm -//l: list_single_pane_t1_cp2 -//w: -//r: 5.0 -#define qtn_cale_mav_opt_clear "Clear" - -//d: Options menu items for clearing all the missed alarms -//l: list_single_pane_t1_cp2 -//w: -//r: 5.0 -#define qtn_cale_mav_opt_clear_all "Clear all" - -//d: Go to previous view from where Missed Alarms View is launched -//l: list_single_pane_t1_cp2 -//w: -//r: 5.0 -#define qtn_cale_mav_opt_goto_cale "Go to Calendar" - -//d: Options menu item to open Calendar's Missed Alarms View -//l: list_single_pane_t1_cp2 -//w: -//r: 5.0 -#define qtn_cale_opt_mav "Missed alarms" - -//d: Title pane text for Calendar's Missed Alarms view that shows all the missed alarms -//l: title_pane_t2/opt9 -//w: -//r: 5.0 -#define qtn_cale_title_missed_alarms "Missed Alarms" - -//d: Start date and time of the missed alarm event -//l: list_double_graphic_pane_t2 -//w: -//r: 5.0 -#define qtn_cale_mav_start_time "%0U %1U" - -//d: Tooltip text for Clearing a Missed Alarm -//l: popup_preview_text_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_mav_tb_clear "Clear" - -//d: Tooltip text for Clearing all the Missed Alarms -//l: popup_preview_text_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_mav_tb_clearall "Clear all" - -//d: Tooltip text for activating the previous view from where Missed Alarms View is launched -//l: popup_preview_text_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_mav_tb_goto_cale "Go to Calendar" - -//d: Query for viewing the missed alarms view for one missed alarm -//l: popup_note_window -//w: -//r: 5.0 -// -#define qtn_cale_query_view_missed "One missed Calendar event.Do you want to view it?" - -//d: Query for viewing the missed alarms view for multiple missed alarms -//l: popup_note_window -//w: -//r: 5.0 -// -#define qtn_cale_query_view_missed_n "%N missed Calendar events.Do you want to view them?" - -//d: The subject text when the item subject is empty in Missed alarms view -//l: list_double_large_graphic_pane_t1 -//w: -//r: 5.0 -// -#define qtn_cale_mav_unnamed "(Unnamed)" - -//d:Command in stylus popup menu. -//d:Marked the To-Do item done in List View and Preview popup. -//l:list_single_touch_menu_pane_t1 -//w: -//r: 5.0 -// -#define qtn_cale_stylus_popup_cmd_task_completed "Mark as done" - -//d:Command in stylus popup menu. -//d:Unmarked the To-Do item done in List View. -//l:list_single_touch_menu_pane_t1 -//w: -//r: 5.0 -// -#define qtn_cale_stylus_cmd_restore_task "Mark as not done" - -//d:Command in stylus popup menu. -//d:Delete the selected item. -//l:list_single_touch_menu_pane_t1 -//w: -//r: 5.0 -// -#define qtn_cale_stylus_popup_delete "Delete" - -//d:Command in stylus popup menu. -//d:Send the selected item. -//l:list_single_touch_menu_pane_t1 -//w: -//r: 5.0 -// -#define qtn_cale_stylus_popup_send "Send" - -//d:Command in stylus popup menu. -//d:Mark-operation. Marks selected item. -//l:list_single_touch_menu_pane_t1 -//w: -//r: 5.0 -// -#define qtn_cale_stylus_popup_mark "Mark" - -//d:Command in stylus popup menu. -//d:Unmark-operation. Unmarks selected marked item. -//l:list_single_touch_menu_pane_t1 -//w: -//r: 5.0 -// -#define qtn_cale_stylus_popup_unmark "Unmark" - -//d: Tooltip text for editing current calendar note -//l: popup_preview_text_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_tb_edit "Edit" - -//d: Tooltip text for deleting current calendar note -//l: popup_preview_text_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_tb_delete "Delete" - -//d: Tooltip text for sending calendar note -//l: popup_preview_text_window_t1 -//w: -//r: 5.0 -// -#define qtn_cale_tb_send "Send" - -//d: Default tone selection choice in alarm tone list for Calendar and Clock -//l: list_single_graphic_pane_t1_cp2 -//w: -//r: 5.0 -#define qtn_cale_tc_no_personal_tone "Default tone" - -//d: "Off" tone selection choice in alarm tone list for Calendar and Clock -//l: list_single_graphic_pane_t1_cp2 -//w: -//r: 5.0 -#define qtn_cale_tc_none "Off" - -//d:Opens Maps application for choosing new location -//l:list_single_pane_t1_cp2 -//w: -//r: 5.1 -#define qtn_cale_om_assign_from_map "Assign from map" - -//d: Msk label displayed in Editors when there is no map location -//d: Value is From map -//l: control_pane_t3/opt7 -//r: 5.1 -// -#define text_softkey_from_map "From map" - -//d:Opens Maps application for choosing new location -//l:list_single_pane_t1_cp2 -//w: -//r: 5.1 -#define qtn_cale_om_find_on_map "Find on map" - -//d:Opens Maps application fto show the location -//l:list_single_pane_t1_cp2 -//w: -//r: 5.1 -#define qtn_cale_om_show_on_map "Show on map" - -//d:Shows Update location query -//l:heading_pane_t1 -//w: -//r: 5.1 -#define qtn_cale_update_location "Update location:" - -//d:Adds selected address to existing location details -//l:list_single_pane_t1_cp2 -//w: -//r: 5.1 -#define qtn_cale_addto_existing_location "Add to existing" - -//d:Replaces existing location details with selected address -//l:list_single_pane_t1_cp2 -//w: -//r: 5.1 -#define qtn_replace_existing_location "Replace existing" - -//d:Confirmation query prompt. -//d:Replace the exisitng map location with new one -//d: %0U is the name of the location with which existing one is being replaced -//l:popup_note_window -//w: -//r: 5.1 -#define qtn_cale_confirm_change_address "Update Address to %U?" - -//d: Confirmation note shown, when address is replaced with new one -//l:popup_note_window -//w: -//r:5.1 -#define qtn_cale_note_address_updated "Address Updated" - -//d: Confirmation note shown, when address with coordinates is manually changed -//l:popup_note_window -//w: -//r:5.1 -#define qtn_cale_confirm_keep_coordinates "Address will be updated. Keep existing map location?" - -//d:Context-specific text for the current snooze time value in Calendar Settings. -//l:list_set_graphic_pane_t1 -//w: -//r:3.1 -#define qtn_cale_sanim_time_out_slider_ykcur "1 minute" - -//d:Context-specific text for the current snooze time value in Calendar Settings. -//d:%U in minutes, plural. -//l:setting_slider_pane_t2 -//w: -//r:3.1 -#define qtn_set_cale_sanim_time_out_slider_cur "%U minutes" -// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/lunarVietnamese/src/calenlunarvietnameseplugin.cpp --- a/calendarui/regionalplugins/lunarVietnamese/src/calenlunarvietnameseplugin.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/regionalplugins/lunarVietnamese/src/calenlunarvietnameseplugin.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -73,6 +73,7 @@ { TRACE_ENTRY_POINT; iLabelControl = NULL; + setFlag(QGraphicsItem::ItemHasNoContents, false); TRACE_EXIT_POINT; } diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/lunarchinese/bwins/calenlunarchinesepluginu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/regionalplugins/lunarchinese/bwins/calenlunarchinesepluginu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,10 @@ +EXPORTS + ?ImplementationGroupProxy@@YAPBUTImplementationProxy@@AAH@Z @ 1 NONAME ; struct TImplementationProxy const * ImplementationGroupProxy(int &) + ?AnimalYear@CCalenLunarLocalizedInfo@@QAEABVTDesC16@@XZ @ 2 NONAME ; class TDesC16 const & CCalenLunarLocalizedInfo::AnimalYear(void) + ?SolarTerm@CCalenLunarLocalizedInfo@@QAEABVTDesC16@@XZ @ 3 NONAME ; class TDesC16 const & CCalenLunarLocalizedInfo::SolarTerm(void) + ?GregorianDate@CCalenLunarLocalizedInfo@@QAEABVTDesC16@@XZ @ 4 NONAME ; class TDesC16 const & CCalenLunarLocalizedInfo::GregorianDate(void) + ?LunarMonthAndDay@CCalenLunarLocalizedInfo@@QAEABVTDesC16@@XZ @ 5 NONAME ; class TDesC16 const & CCalenLunarLocalizedInfo::LunarMonthAndDay(void) + ?Festival@CCalenLunarLocalizedInfo@@QAEABVTDesC16@@XZ @ 6 NONAME ; class TDesC16 const & CCalenLunarLocalizedInfo::Festival(void) + ?FullLunarDate@CCalenLunarLocalizedInfo@@QAEABVTDesC16@@XZ @ 7 NONAME ; class TDesC16 const & CCalenLunarLocalizedInfo::FullLunarDate(void) + ?LunarYear@CCalenLunarLocalizedInfo@@QAEABVTDesC16@@XZ @ 8 NONAME ; class TDesC16 const & CCalenLunarLocalizedInfo::LunarYear(void) + diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/lunarchinese/data/2002EA3C.rss --- a/calendarui/regionalplugins/lunarchinese/data/2002EA3C.rss Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/regionalplugins/lunarchinese/data/2002EA3C.rss Mon Jun 28 15:22:02 2010 +0530 @@ -19,7 +19,6 @@ #define CALENLUNARPLUGINREG_H #include -#include "calendarregionalplugin.loc" #include "calenregionalpluginuids.h" @@ -38,7 +37,7 @@ { implementation_uid = CALENLUNARPLUGIN_CHINESE_IMPLEMENTATION_UID; version_no = 1; - display_name = qtn_chi_cale_sett_lunar_cale; + //display_name = qtn_chi_cale_sett_lunar_cale; // Supported languages can be inserted as follows: // "language(1)||language(14)||language(151) // Numbers can be Symbian language codes (TLanguage) diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/lunarchinese/data/CalenLunarChinesePluginData.rss --- a/calendarui/regionalplugins/lunarchinese/data/CalenLunarChinesePluginData.rss Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,100 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: This file contains all the resources for the Lunar plugin. -* -*/ - - - -#include -#include -#include -#include - -#include "calendarregionalplugin.loc" - -NAME CLU2 - -RESOURCE RSS_SIGNATURE { } - - -//---------------------------------------------------- -//---------------------------------------------------- -// -RESOURCE DIALOG r_calen_lunar_details_dialog - { - flags = EGeneralQueryFlags; - buttons = R_AVKON_SOFTKEYS_OK_EMPTY; - items = - { - DLG_LINE - { - type = EAknCtPopupHeadingPane; - id = EAknMessageQueryHeaderId; - control = AVKON_HEADING - { - label = qtn_chi_cale_lunar_calendar; - headinglayout = R_AVKON_LIST_HEADING_PANE; - }; - }, - DLG_LINE - { - type = EAknCtMessageQuery; - id = EAknMessageQueryContentId; - control = AVKON_MESSAGE_QUERY - { - }; - } - }; - } - - -//---------------------------------------------------- -// Menu item text "Show lunar details" -//---------------------------------------------------- -// -RESOURCE TBUF r_calendar_show_lunar_data - { - buf = qtn_chi_cale_lunar_data; - } - - -//---------------------------------------------------- -// Details dialog item headers -//---------------------------------------------------- -// -RESOURCE TBUF r_calendar_lunar_info_festival - { - buf = qtn_cale_lunar_info_festival; - } - -RESOURCE TBUF r_calendar_lunar_info_solar - { - buf = qtn_cale_lunar_info_solar; - } - -RESOURCE TBUF r_calendar_lunar_info_date - { - buf = qtn_cale_info_lunar_date; - } - -RESOURCE TBUF r_calendar_lunar_info_animal_year - { - buf = qtn_cale_info_animal_year; - } - -RESOURCE TBUF r_calendar_lunar_info_western_date - { - buf = qtn_cale_info_western_date; - } diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/lunarchinese/eabi/calenlunarchinesepluginu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/regionalplugins/lunarchinese/eabi/calenlunarchinesepluginu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,3 @@ +EXPORTS + _Z24ImplementationGroupProxyRi @ 1 NONAME + diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/lunarchinese/inc/CalenLunarChinesePlugin.h --- a/calendarui/regionalplugins/lunarchinese/inc/CalenLunarChinesePlugin.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/regionalplugins/lunarchinese/inc/CalenLunarChinesePlugin.h Mon Jun 28 15:22:02 2010 +0530 @@ -34,7 +34,7 @@ //FORWARD DECLARE class QString; - +class HbTranslator; class HbWidget; class HbMenu; @@ -78,7 +78,7 @@ private: void FormatExtraRowStringL(); void UpdateLocalizerInfoL(); - void ExecuteMessageDialogL( TDesC& aMsgText ); + void ExecuteMessageDialogL( QString aMsgText ); public: void ShowDetailsL(); @@ -112,7 +112,7 @@ HBufC* iInfoBarText; TInt iStart; TInt iEnd; - TInt iResourceFileOffset; + HbTranslator* iTranslator; }; #endif //__CALENLUNARCHINESEPLUGIN_H__ diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/lunarchinese/lunarchinese.pro --- a/calendarui/regionalplugins/lunarchinese/lunarchinese.pro Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/regionalplugins/lunarchinese/lunarchinese.pro Mon Jun 28 15:22:02 2010 +0530 @@ -50,13 +50,11 @@ -laknicon \ -legul \ -lflogger \ - -lavkon \ -lcalenregionalutil symbian: { -INCLUDEPATH += /epoc32/include/ecom \ - ../loc +INCLUDEPATH += /epoc32/include/ecom TARGET.UID2 = 0x10009D8D #SYMBIAN_ECOM_PLUGIN_UID TARGET.UID3 = 0x2002EA3C #CALENLUNARCHINESEPLUGIN_DLL_UID @@ -82,12 +80,6 @@ "LANGUAGE_IDS" \ "END" \ \ -"START RESOURCE calenlunarchineseplugindata.rss" \ -"HEADER" \ -"TARGETPATH RESOURCE_FILES_DIR" \ -"LANGUAGE_IDS" \ -"END" \ -\ "TARGETTYPE plugin" @@ -96,6 +88,7 @@ MMP_RULES -= "OPTION_REPLACE ARMCC --export_all_vtbl -D__QT_NOEFFECTMACRO_DONOTUSE" } - +# TODO: uncomment below line once ts file is released to platform +#TRANSLATIONS += calenregional.ts # End of file --Don't remove this. \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/lunarchinese/src/CalenLunarChinesePlugin.cpp --- a/calendarui/regionalplugins/lunarchinese/src/CalenLunarChinesePlugin.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/regionalplugins/lunarchinese/src/CalenLunarChinesePlugin.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -16,18 +16,18 @@ */ -#include -#include -#include -#include -#include - #include +#include #include #include #include #include #include +#include + +#include +#include +#include #include "calendarui_debug.h" #include "CalenLunarChinesePlugin.h" @@ -39,10 +39,8 @@ #include "hb_calencommands.hrh" //CONSTANTS -_LIT( KFieldSeparator, "\n" ); -_LIT( KHeaderSeparator, "\n "); -_LIT( KResourceChinesePluginFile, "calenlunarchineseplugindata.rsc" ); -#define KResourcePath KDC_RESOURCE_FILES_DIR +static const QString fieldSeparator("\n"); +static const QString headerSeparator("\n "); const TInt KFieldCount = 5; @@ -57,8 +55,7 @@ :iLocalizer(NULL), iLocInfo(NULL), iServices(aServices), - iInfoBarText(NULL), - iResourceFileOffset( NULL ) + iInfoBarText(NULL) { TRACE_ENTRY_POINT; @@ -104,13 +101,17 @@ } delete iInfoProvider; + iInfoProvider = NULL; delete iLocalizer; + iLocalizer = NULL; delete iLocInfo; + iLocInfo = NULL; - if( iResourceFileOffset ) - { - CCoeEnv::Static()->DeleteResourceFile( iResourceFileOffset ); - } + // Remove the translator for plugin + if (iTranslator) { + delete iTranslator; + iTranslator = 0; + } TRACE_EXIT_POINT; } @@ -121,29 +122,18 @@ void CCalenLunarChinesePlugin::ConstructL() { TRACE_ENTRY_POINT; - - TFileName dllName; - // Get the complate path of the DLL from where it is currently loaded - Dll::FileName( dllName ); - - TFileName resourceFilename; - resourceFilename.Append(dllName.Mid(0,2)); - resourceFilename.Append(KResourcePath); - resourceFilename.Append(KResourceChinesePluginFile); - BaflUtils::NearestLanguageFile( CEikonEnv::Static()->FsSession(), - resourceFilename ); - // Add the resource file. - iResourceFileOffset = CEikonEnv::Static()->AddResourceFileL( - resourceFilename ); - iServices->RegisterForNotificationsL( this, ECalenNotifyContextChanged ); iServices->GetCommandRange( iStart, iEnd ); + // Install the translator before the CCalenLunarLocalizer is constructed + iTranslator = new HbTranslator("calenregional"); + iLocalizer = CCalenLunarLocalizer::NewL(); iInfoProvider = CCalenLunarInfoProvider::NewL( CEikonEnv::Static()->FsSession() ); + TRACE_EXIT_POINT; } @@ -274,7 +264,7 @@ void CCalenLunarChinesePlugin::UpdateLocalizerInfoL() { TRACE_ENTRY_POINT; - QDateTime focusDateTime= iServices->Context().focusDateAndTimeL(); + QDateTime focusDateTime= iServices->Context().focusDateAndTime(); TDateTime tempDateTime( focusDateTime.date().year(), static_cast(focusDateTime.date().month() - 1), @@ -312,87 +302,75 @@ // ----------------------------------------------------------------------------- // void CCalenLunarChinesePlugin::ShowDetailsL( ) - { - TRACE_ENTRY_POINT; - HBufC* msgText = HBufC::NewLC( 1000 ); - if ( iLocInfo ) - { - TInt headerIds[KFieldCount] = { - R_CALENDAR_LUNAR_INFO_FESTIVAL, - R_CALENDAR_LUNAR_INFO_SOLAR, - R_CALENDAR_LUNAR_INFO_DATE, - R_CALENDAR_LUNAR_INFO_ANIMAL_YEAR, - R_CALENDAR_LUNAR_INFO_WESTERN_DATE - }; - - RPointerArray headersArray; - - for ( TInt i=0; i < KFieldCount; i++) - { - headersArray.Append( StringLoader::LoadL( headerIds[i] ) ); - } - - CPtrCArray* fieldsArray = new (ELeave) CPtrCArray(5); - CleanupStack::PushL( fieldsArray ); - fieldsArray->AppendL( iLocInfo->Festival() ); - fieldsArray->AppendL( iLocInfo->SolarTerm() ); - fieldsArray->AppendL( iLocInfo->FullLunarDate() ); - fieldsArray->AppendL( iLocInfo->AnimalYear() ); - fieldsArray->AppendL( iLocInfo->GregorianDate() ); - - for (TInt i=0; i < KFieldCount; i++) - { - TPtrC fieldPtrC = fieldsArray->At(i); - if ( fieldPtrC != KNullDesC ) - { - msgText->Des().Append( *(headersArray[i]) ); - msgText->Des().Append( KHeaderSeparator ); - msgText->Des().Append( fieldPtrC ); - if ( i < KFieldCount - 1 ) // not last - { - msgText->Des().Append( KFieldSeparator ); - } - } - } - CleanupStack::PopAndDestroy( fieldsArray ); - headersArray.ResetAndDestroy(); - } - - - ExecuteMessageDialogL(*msgText); - - CleanupStack::PopAndDestroy( msgText ); - - TRACE_EXIT_POINT; - } +{ + QString msgText; + if(iLocInfo) { + QStringList headerIds; + headerIds.append(hbTrId("txt_calendar_info_festival")); + headerIds.append(hbTrId("txt_calendar_solar_term")); + headerIds.append(hbTrId("txt_calendar_lunar_date")); + headerIds.append(hbTrId("txt_calendar_animal_year")); + headerIds.append(hbTrId("txt_calendar_gregorian_date")); + + QStringList fieldInfo; + QString data; + + data = QString::fromUtf16(iLocInfo->Festival().Ptr(),iLocInfo->Festival().Length()); + fieldInfo.append(data); + data = QString::fromUtf16(iLocInfo->SolarTerm().Ptr(),iLocInfo->SolarTerm().Length()); + fieldInfo.append(data); + data = QString::fromUtf16(iLocInfo->FullLunarDate().Ptr(),iLocInfo->FullLunarDate().Length()); + fieldInfo.append(data); + data = QString::fromUtf16(iLocInfo->AnimalYear().Ptr(),iLocInfo->AnimalYear().Length()); + fieldInfo.append(data); + data = QString::fromUtf16(iLocInfo->GregorianDate().Ptr(),iLocInfo->GregorianDate().Length()); + fieldInfo.append(data); + // Append the data in the proper order + for (TInt i=0; i < KFieldCount; i++) { + if(!fieldInfo.at(i).isEmpty()) { + msgText.append(headerIds[i]); + msgText.append(headerSeparator); + msgText.append(fieldInfo[i]); + if ( i < KFieldCount - 1 ) { + // not last item + msgText.append(fieldSeparator); + } + } + } + } + ExecuteMessageDialogL(msgText); +} // ----------------------------------------------------------------------------- -// CCalenLunarChinesePlugin::ShowMessageDialogL +// CCalenLunarChinesePlugin::ExecuteMessageDialogL // ----------------------------------------------------------------------------- -// -void CCalenLunarChinesePlugin::ExecuteMessageDialogL(TDesC& aMsgText) +// +void CCalenLunarChinesePlugin::ExecuteMessageDialogL(QString aMsgText) { TRACE_ENTRY_POINT; - QString text = QString::fromUtf16(aMsgText.Ptr(),aMsgText.Length()); + // Instantiate a popup + HbMessageBox *popup = new HbMessageBox(); + popup->setDismissPolicy(HbDialog::NoDismiss); + popup->setTimeout(HbDialog::NoTimeout); + popup->setIconVisible(false); + popup->setAttribute( Qt::WA_DeleteOnClose, true ); - // Instantiate a popup - HbMessageBox popup; - popup.setDismissPolicy(HbDialog::NoDismiss); - popup.setTimeout(HbDialog::NoTimeout); - popup.setIconVisible(false); + popup->setHeadingWidget(new HbLabel(hbTrId("txt_calendar_title_lunar_calendar"))); + popup->setText(aMsgText); + + // Remove the default actions + QList list = popup->actions(); + for(int i=0; i < list.count(); i++) + { + popup->removeAction(list[i]); + } + // Sets the primary action + popup->addAction(new HbAction(hbTrId("txt_calendar_button_close"), popup)); - popup.setHeadingWidget(new HbLabel("Lunar Calendar")); - popup.setText(text); - - // Sets the primary action - popup.setPrimaryAction(new HbAction(hbTrId("txt_calendar_button_cancel"), - &popup)); - - // Launch popup syncronously - popup.exec(); + // Launch popup + popup->open(); TRACE_EXIT_POINT; } - //EOF diff -r fd30d51f876b -r b6db4fd4947b calendarui/regionalplugins/regionalplugins.pro --- a/calendarui/regionalplugins/regionalplugins.pro Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/regionalplugins/regionalplugins.pro Mon Jun 28 15:22:02 2010 +0530 @@ -14,8 +14,6 @@ # Description: Project definition file for calendar regional plugins # -BLD_INF_RULES.prj_mmpfiles += "./calenregionalutil/group/calenregionalutil.mmp" - BLD_INF_RULES.prj_exports += \ "./calenregionalutil/inc/calenextrarowformatter.h |./inc/calenextrarowformatter.h" \ "./calenregionalutil/inc/calenlunarinfo.h |./inc/calenlunarinfo.h" \ @@ -31,5 +29,6 @@ "./lunarchinese/data/SolarItems /epoc32/release/winscw/urel/z/private/10005901/solaritems" TEMPLATE = subdirs -SUBDIRS += lunarchinese +SUBDIRS += calenregionalutil \ + lunarchinese CONFIG += ordered diff -r fd30d51f876b -r b6db4fd4947b calendarui/rom/Calendar.iby --- a/calendarui/rom/Calendar.iby Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: IBY file for non-localizable elements of Calendar.app -* -*/ - - - -#ifndef CALENDAR_IBY -#define CALENDAR_IBY - - -S60_APP_EXE( calendar ) - - -// Backup registration file -data = ZPRIVATE\10005901\backup_registration.xml PRIVATE\10005901\backup_registration.xml - - - -// Application registration file. -data=DATAZ_\private\10003a3f\import\apps\CALENDAR_REG.RSC \private\10003a3f\import\apps\CALENDAR_REG.RSC -data=\epoc32\data\c\resource\qt\plugins\controlpanel\calensettingsplugin.qtplugin resource\qt\plugins\controlpanel\calensettingsplugin.qtplugin -data=\epoc32\data\z\pluginstub\calengriditemstyleplugin.qtplugin \private\10005901\calengriditemstyleplugin.qtplugin -data=\epoc32\data\z\resource\qt\plugins\calendar\agendaeventviewerplugin.qtplugin resource\qt\plugins\calendar\agendaeventviewerplugin.qtplugin - -// Stub sis -// data=DATAZ_\system\install\calendar_stub.sis \System\Install\calendar_stub.sis - -file=ABI_DIR\BUILD_DIR\calencommonutils.dll SHARED_LIB_DIR\calencommonutils.dll -file=ABI_DIR\BUILD_DIR\calenglobaldata.dll SHARED_LIB_DIR\calenglobaldata.dll -file=ABI_DIR\BUILD_DIR\calencustomisationmanager.dll SHARED_LIB_DIR\calencustomisationmanager.dll -file=ABI_DIR\BUILD_DIR\caleneditor.dll SHARED_LIB_DIR\caleneditor.dll -file=ABI_DIR\BUILD_DIR\calenviews.dll SHARED_LIB_DIR\calenviews.dll -file=ABI_DIR\BUILD_DIR\calensettings.dll SHARED_LIB_DIR\calensettings.dll -file=ABI_DIR\BUILD_DIR\calensettingsplugin.dll SHARED_LIB_DIR\calensettingsplugin.dll -file=ABI_DIR\BUILD_DIR\calengriditemstyleplugin.dll SHARED_LIB_DIR\calengriditemstyleplugin.dll -file=ABI_DIR\BUILD_DIR\calencontroller.dll SHARED_LIB_DIR\calencontroller.dll -file=ABI_DIR\BUILD_DIR\agendaeventviewer.dll SHARED_LIB_DIR\agendaeventviewer.dll -file=ABI_DIR\BUILD_DIR\calenlauncher.dll SHARED_LIB_DIR\calenlauncher.dll -file=ABI_DIR\BUILD_DIR\agendaeventviewerplugin.dll SHARED_LIB_DIR\agendaeventviewerplugin.dll - -#endif // CALENDAR_IBY - -// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/rom/CalendarResources.iby --- a/calendarui/rom/CalendarResources.iby Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: IBY file for localizable elements of Calendar.app -* -*/ - - - -#ifndef CALENDARRESOURCE_IBY -#define CALENDARRESOURCE_IBY -#include - -// Application resource file. -data=DATAZ_\resource\apps\CALENDAR.RSC APP_RESOURCE_DIR\CALENDAR.RSC -data=DATAZ_\QT_TRANSLATIONS_DIR\calendar.qm QT_TRANSLATIONS_DIR\calendar.qm - -#endif // CALENDARRESOURCE_IBY - -// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/rom/calendar.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/rom/calendar.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: IBY file for non-localizable elements of Calendar.app +* +*/ + + + +#ifndef CALENDAR_IBY +#define CALENDAR_IBY + + +S60_APP_EXE( calendar ) + + +// Backup registration file +data = ZPRIVATE\10005901\backup_registration.xml PRIVATE\10005901\backup_registration.xml + + + +// Application registration file. +data=DATAZ_\private\10003a3f\import\apps\calendar_reg.rsc \private\10003a3f\import\apps\calendar_reg.rsc +data=\epoc32\data\z\resource\qt\plugins\calendar\agendaeventviewerplugin.qtplugin resource\qt\plugins\calendar\agendaeventviewerplugin.qtplugin + +// Stub sis +data=DATAZ_\system\install\calendar_stub.sis \System\Install\calendar_stub.sis + +file=ABI_DIR\BUILD_DIR\calencommonutils.dll SHARED_LIB_DIR\calencommonutils.dll +file=ABI_DIR\BUILD_DIR\calenglobaldata.dll SHARED_LIB_DIR\calenglobaldata.dll +file=ABI_DIR\BUILD_DIR\calencustomisationmanager.dll SHARED_LIB_DIR\calencustomisationmanager.dll +file=ABI_DIR\BUILD_DIR\caleneditor.dll SHARED_LIB_DIR\caleneditor.dll +file=ABI_DIR\BUILD_DIR\calenviews.dll SHARED_LIB_DIR\calenviews.dll +file=ABI_DIR\BUILD_DIR\calensettings.dll SHARED_LIB_DIR\calensettings.dll +file=ABI_DIR\BUILD_DIR\calencontroller.dll SHARED_LIB_DIR\calencontroller.dll +file=ABI_DIR\BUILD_DIR\agendaeventviewer.dll SHARED_LIB_DIR\agendaeventviewer.dll +file=ABI_DIR\BUILD_DIR\calenlauncher.dll SHARED_LIB_DIR\calenlauncher.dll +file=ABI_DIR\BUILD_DIR\agendaeventviewerplugin.dll SHARED_LIB_DIR\agendaeventviewerplugin.dll + +#endif // CALENDAR_IBY + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/rom/calendarresources.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/rom/calendarresources.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,31 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* The iby file for calendar resources +* +*/ + + + +#ifndef CALENDARRESOURCE_IBY +#define CALENDARRESOURCE_IBY +#include + +// Application resource file. +S60_APP_RESOURCE(calendar) +data=DATAZ_/QT_TRANSLATIONS_DIR/calendar.qm QT_TRANSLATIONS_DIR/calendar.qm + +#endif // CALENDARRESOURCE_IBY + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/rom/calenlunarchinese_variant.iby --- a/calendarui/rom/calenlunarchinese_variant.iby Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/rom/calenlunarchinese_variant.iby Mon Jun 28 15:22:02 2010 +0530 @@ -22,13 +22,6 @@ #ifdef RD_CALENDAR_PLUGIN_FW ECOM_PLUGIN( calenlunarchineseplugin.dll , calenlunarchineseplugin.rsc ) - -data=DATAZ_\RESOURCE_FILES_DIR\calenlunarchineseplugindata.rsc RESOURCE_FILES_DIR\calenlunarchineseplugindata.rsc - -//TODO: once we have USER_RESOURCE_FILES_LOCALIZED defined -//#define USER_RESOURCE_FILES_LOCALIZED calenlunarchineseplugindata -//#include - #endif #endif // __SERIES60_LUNAR_CALENDAR diff -r fd30d51f876b -r b6db4fd4947b calendarui/rom/calenregionalutil.iby --- a/calendarui/rom/calenregionalutil.iby Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/rom/calenregionalutil.iby Mon Jun 28 15:22:02 2010 +0530 @@ -19,7 +19,6 @@ #define CALENREGIONALUTIL_IBY file=ABI_DIR\BUILD_DIR\calenregionalutil.dll SHARED_LIB_DIR\calenregionalutil.dll -data=DATAZ_\RESOURCE_FILES_DIR\calenregionalutil.rsc RESOURCE_FILES_DIR\calenregionalutil.rsc data=DATAZ_\private\10005901\SolarItems private\10005901\SolarItems #endif // CALENREGIONALUTIL_IBY diff -r fd30d51f876b -r b6db4fd4947b calendarui/rom/calenviewerservice.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/rom/calenviewerservice.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: IBY file for non-localizable elements of calenviewerservice.exe +* +*/ + + + +#ifndef CALEN_VIEWER_SERVICE_IBY +#define CALEN_VIEWER_SERVICE_IBY + + +S60_APP_EXE(calenviewerservice) +S60_APP_RESOURCE(calenviewerservice) + +// Application registration file. +data=DATAZ_\private\10003a3f\import\apps\calenviewerservice_reg.rsc \private\10003a3f\import\apps\calenviewerservice_reg.rsc + + +#endif // CALEN_VIEWER_SERVICE_IBY + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/settings/bwins/calensettingsu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/settings/bwins/calensettingsu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,26 @@ +EXPORTS + ?tr@CalenSettings@@SA?AVQString@@PBD0@Z @ 1 NONAME ; class QString CalenSettings::tr(char const *, char const *) + ?removeRegionalInfoItem@CalenSettings@@AAEXXZ @ 2 NONAME ; void CalenSettings::removeRegionalInfoItem(void) + ?createModel@CalenSettings@@QAEXXZ @ 3 NONAME ; void CalenSettings::createModel(void) + ?trUtf8@CalenSettings@@SA?AVQString@@PBD0H@Z @ 4 NONAME ; class QString CalenSettings::trUtf8(char const *, char const *, int) + ?isPluginEnabled@CalenSettings@@QAE_NXZ @ 5 NONAME ; bool CalenSettings::isPluginEnabled(void) + ?getStaticMetaObject@CalenSettings@@SAABUQMetaObject@@XZ @ 6 NONAME ; struct QMetaObject const & CalenSettings::getStaticMetaObject(void) + ?populateRegionalInfo@CalenSettings@@AAEXXZ @ 7 NONAME ; void CalenSettings::populateRegionalInfo(void) + ?qt_metacall@CalenSettings@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 8 NONAME ; int CalenSettings::qt_metacall(enum QMetaObject::Call, int, void * *) + ?handleRegionalInfoChange@CalenSettings@@QAEXXZ @ 9 NONAME ; void CalenSettings::handleRegionalInfoChange(void) + ?qt_metacast@CalenSettings@@UAEPAXPBD@Z @ 10 NONAME ; void * CalenSettings::qt_metacast(char const *) + ?staticMetaObject@CalenSettings@@2UQMetaObject@@B @ 11 NONAME ; struct QMetaObject const CalenSettings::staticMetaObject + ?tr@CalenSettings@@SA?AVQString@@PBD0H@Z @ 12 NONAME ; class QString CalenSettings::tr(char const *, char const *, int) + ??0CalenSettings@@QAE@AAVMCalenServices@@PAVHbDataForm@@PAVQObject@@@Z @ 13 NONAME ; CalenSettings::CalenSettings(class MCalenServices &, class HbDataForm *, class QObject *) + ?trUtf8@CalenSettings@@SA?AVQString@@PBD0@Z @ 14 NONAME ; class QString CalenSettings::trUtf8(char const *, char const *) + ?setStartDayOfWeek@CalenSettings@@QAEXH@Z @ 15 NONAME ; void CalenSettings::setStartDayOfWeek(int) + ?handleAlarmSnoozeTimeChange@CalenSettings@@QAEXH@Z @ 16 NONAME ; void CalenSettings::handleAlarmSnoozeTimeChange(int) + ?addRegionalInfoItem@CalenSettings@@AAEXXZ @ 17 NONAME ; void CalenSettings::addRegionalInfoItem(void) + ?metaObject@CalenSettings@@UBEPBUQMetaObject@@XZ @ 18 NONAME ; struct QMetaObject const * CalenSettings::metaObject(void) const + ?updateShowWeekItem@CalenSettings@@AAEXXZ @ 19 NONAME ; void CalenSettings::updateShowWeekItem(void) + ??1CalenSettings@@UAE@XZ @ 20 NONAME ; CalenSettings::~CalenSettings(void) + ??_ECalenSettings@@UAE@I@Z @ 21 NONAME ; CalenSettings::~CalenSettings(unsigned int) + ?handleWeekNumberChange@CalenSettings@@QAEXXZ @ 22 NONAME ; void CalenSettings::handleWeekNumberChange(void) + ?addWeekNumberItem@CalenSettings@@QAEXXZ @ 23 NONAME ; void CalenSettings::addWeekNumberItem(void) + ?populateSettingList@CalenSettings@@QAEXXZ @ 24 NONAME ; void CalenSettings::populateSettingList(void) + diff -r fd30d51f876b -r b6db4fd4947b calendarui/settings/eabi/calensettingsu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/settings/eabi/calensettingsu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,26 @@ +EXPORTS + _ZN13CalenSettings11createModelEv @ 1 NONAME + _ZN13CalenSettings11qt_metacallEN11QMetaObject4CallEiPPv @ 2 NONAME + _ZN13CalenSettings11qt_metacastEPKc @ 3 NONAME + _ZN13CalenSettings15isPluginEnabledEv @ 4 NONAME + _ZN13CalenSettings16staticMetaObjectE @ 5 NONAME DATA 16 + _ZN13CalenSettings17addWeekNumberItemEv @ 6 NONAME + _ZN13CalenSettings17setStartDayOfWeekEi @ 7 NONAME + _ZN13CalenSettings18updateShowWeekItemEv @ 8 NONAME + _ZN13CalenSettings19addRegionalInfoItemEv @ 9 NONAME + _ZN13CalenSettings19getStaticMetaObjectEv @ 10 NONAME + _ZN13CalenSettings19populateSettingListEv @ 11 NONAME + _ZN13CalenSettings20populateRegionalInfoEv @ 12 NONAME + _ZN13CalenSettings22handleWeekNumberChangeEv @ 13 NONAME + _ZN13CalenSettings22removeRegionalInfoItemEv @ 14 NONAME + _ZN13CalenSettings24handleRegionalInfoChangeEv @ 15 NONAME + _ZN13CalenSettings27handleAlarmSnoozeTimeChangeEi @ 16 NONAME + _ZN13CalenSettingsC1ER14MCalenServicesP10HbDataFormP7QObject @ 17 NONAME + _ZN13CalenSettingsC2ER14MCalenServicesP10HbDataFormP7QObject @ 18 NONAME + _ZN13CalenSettingsD0Ev @ 19 NONAME + _ZN13CalenSettingsD1Ev @ 20 NONAME + _ZN13CalenSettingsD2Ev @ 21 NONAME + _ZNK13CalenSettings10metaObjectEv @ 22 NONAME + _ZTI13CalenSettings @ 23 NONAME + _ZTV13CalenSettings @ 24 NONAME + diff -r fd30d51f876b -r b6db4fd4947b calendarui/settings/inc/calensettings.h --- a/calendarui/settings/inc/calensettings.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/settings/inc/calensettings.h Mon Jun 28 15:22:02 2010 +0530 @@ -19,6 +19,7 @@ #define CALENSETTINGS_H #include +#include class QPersistentModelIndex; class QModelIndex; @@ -31,6 +32,8 @@ class HbLineEdit; class XQSettingsManager; class XQSettingsKey; +class MCalenServices; + #ifdef CALENSETTINGS_DLL #define CALENSETTINGS_EXPORT Q_DECL_EXPORT @@ -43,31 +46,44 @@ Q_OBJECT public: - CalenSettings(HbDataForm *form, QObject *parent = 0); + CalenSettings(MCalenServices& services, HbDataForm *form, QObject *parent = 0); ~CalenSettings(); void createModel(); void populateSettingList(); + void addWeekNumberItem(); + bool isPluginEnabled(); + +private: + void updateShowWeekItem(); + void addRegionalInfoItem(); + void removeRegionalInfoItem(); + void populateRegionalInfo(); public slots: void handleAlarmSnoozeTimeChange(int index); void handleWeekNumberChange(); void handleRegionalInfoChange(); + //set the start day of the week to the locale + void setStartDayOfWeek(const int index); private: + MCalenServices &mServices; HbDataForm *mSettingsForm; HbDataFormModel *mSettingsModel; HbDataFormModelItem *mAlarmSnoozeTimeItem; HbDataFormModelItem* mShowWeekNumberItem; HbDataFormModelItem* mShowRegionalInfoItem; - + HbDataFormModelItem* mShowWeekStartOnInfoItem; + HbComboBox* mStartOfWeekItem; + QHash mAlarmSnoozeTimeHash; XQSettingsManager *mSettingsManager; XQSettingsKey *mAlarmSnoozeCenrepKey; XQSettingsKey *mWeekNumberCenrepKey; XQSettingsKey *mShowRegionalInfoKey; - uint mAlarmSnoozeTime; - uint mShowWeekNumber; - uint mShowRegionalInfo; + int mStartOfWeek; + bool mWeekNumberItemAdded; + bool mRegionalpluginActive; }; #endif // CALENSETTINGS_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/settings/settings.pro --- a/calendarui/settings/settings.pro Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/settings/settings.pro Mon Jun 28 15:22:02 2010 +0530 @@ -19,9 +19,10 @@ CONFIG += hb DEPENDPATH += . \ ../../inc + INCLUDEPATH += . \ ../../inc \ - ../cenrep + ../inc DEFINES += CALENSETTINGS_DLL diff -r fd30d51f876b -r b6db4fd4947b calendarui/settings/src/calensettings.cpp --- a/calendarui/settings/src/calensettings.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/settings/src/calensettings.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -23,42 +23,67 @@ #include #include #include +#include #include "calensettings.h" -#include // includes CalendarInternalCRKeys.h +#include "calenservices.h" +#include "calendarprivatecrkeys.h" -CalenSettings::CalenSettings(HbDataForm *form, QObject *parent) +// Constants +const int KValueZero( 0 ); +const int KValueOne( 1 ); + + +CalenSettings::CalenSettings(MCalenServices& services, HbDataForm *form, QObject *parent) :QObject(parent), + mServices(services), mSettingsForm(form), - mSettingsModel(0), - mShowRegionalInfoItem(NULL) + mSettingsModel(NULL), + mAlarmSnoozeTimeItem(NULL), + mShowWeekNumberItem(NULL), + mShowRegionalInfoItem(NULL), + mShowWeekStartOnInfoItem(NULL), + mStartOfWeekItem(NULL), + mWeekNumberItemAdded(false), + mRegionalpluginActive(false) { - mSettingsManager = new XQSettingsManager(this); + mSettingsManager = new XQSettingsManager(this); mAlarmSnoozeCenrepKey = new XQSettingsKey( - XQSettingsKey::TargetCentralRepository, - KCRUidCalendar, KCalendarSnoozeTime); + XQSettingsKey::TargetCentralRepository, + KCRUidCalendar, KCalendarSnoozeTime); mWeekNumberCenrepKey = new XQSettingsKey( - XQSettingsKey::TargetCentralRepository, - KCRUidCalendar, KCalendarWeekViewTitle); - mShowRegionalInfoKey = new XQSettingsKey(XQSettingsKey::TargetCentralRepository, - KCRUidCalendar, KShowRegionalInformation); - - // Read the initial values from the cenrep - QVariant value = mSettingsManager->readItemValue(*mAlarmSnoozeCenrepKey); - mAlarmSnoozeTime = value.toUInt(); - - value = mSettingsManager->readItemValue(*mWeekNumberCenrepKey); - mShowWeekNumber = value.toUInt(); - - value = mSettingsManager->readItemValue(*mShowRegionalInfoKey); - mShowRegionalInfo = value.toUInt(); + XQSettingsKey::TargetCentralRepository, + KCRUidCalendar, KCalendarShowWeekNum); + mShowRegionalInfoKey = new XQSettingsKey( + XQSettingsKey::TargetCentralRepository, + KCRUidCalendar, KCalendarShowRegionalInfo); } +/*! + Destructor + */ CalenSettings::~CalenSettings() { - // Nothing yet. + if (mSettingsManager) { + delete mSettingsManager; + } + // Delete the cenrep keys + delete mAlarmSnoozeCenrepKey; + delete mWeekNumberCenrepKey; + delete mShowRegionalInfoKey; + + if (mSettingsModel) { + delete mSettingsModel; + } + if (mAlarmSnoozeTimeHash.count()) { + // Clear the contents + mAlarmSnoozeTimeHash.clear(); + } } +/*! + Creates the settings model + */ void CalenSettings::createModel() { // Remove the model. @@ -69,193 +94,289 @@ } // Create a model and set it. - mSettingsModel = new HbDataFormModel(); + mSettingsModel = new HbDataFormModel(mSettingsForm); // Create the alarm snooze choices QStringList alarmSnoozeChoices; alarmSnoozeChoices << hbTrId( - "txt_calendar_setlabel_alarm_snooze_time_val_5_minu") - << hbTrId("txt_calendar_setlabel_alarm_snooze_time_val_10_min") - << hbTrId("txt_calendar_setlabel_alarm_snooze_time_val_15_min") - << hbTrId("txt_calendar_setlabel_alarm_snooze_time_val_30_min"); + "txt_calendar_setlabel_reminder_snooze_time_val_5_m") + << hbTrId("txt_calendar_setlabel_reminder_snooze_time_val_10") + << hbTrId("txt_calendar_setlabel_reminder_snooze_time_val_15") + << hbTrId("txt_calendar_setlabel_reminder_snooze_time_val_30"); + // Build the hash map for the alarm snooze time. + // The values are five, ten, fifteen and thirty minutes + mAlarmSnoozeTimeHash[0] = 5; + mAlarmSnoozeTimeHash[1] = 10; + mAlarmSnoozeTimeHash[2] = 15; + mAlarmSnoozeTimeHash[3] = 30; // Append Alarm Snooze Time Setting item mAlarmSnoozeTimeItem = new HbDataFormModelItem(); mAlarmSnoozeTimeItem->setType(HbDataFormModelItem::ComboBoxItem); mAlarmSnoozeTimeItem->setData(HbDataFormModelItem::LabelRole, - QString(hbTrId("txt_calendar_setlabel_alarm_snooze_time"))); + QString(hbTrId("txt_calendar_setlabel_reminder_snooze_time"))); mAlarmSnoozeTimeItem->setContentWidgetData(QString("items"), - alarmSnoozeChoices); + alarmSnoozeChoices); mAlarmSnoozeTimeItem->setContentWidgetData(QString("currentIndex"), 0); mSettingsForm->addConnection(mAlarmSnoozeTimeItem, SIGNAL(currentIndexChanged(int)), this, SLOT(handleAlarmSnoozeTimeChange(int))); mSettingsModel->appendDataFormItem(mAlarmSnoozeTimeItem); - // Append Show Week Number settings item - mShowWeekNumberItem = new HbDataFormModelItem(); - mShowWeekNumberItem->setType(HbDataFormModelItem::ToggleValueItem); - QStringList values; - values << hbTrId("txt_calendar_button_no") - << hbTrId("txt_calendar_button_yes"); - mShowWeekNumberItem->setData(HbDataFormModelItem::LabelRole, - QString(hbTrId("txt_calendar_setlabel_show_week_numbers"))); - + // Create the weekday list based on start of week. + QStringList weekdaysList; + weekdaysList + << hbTrId("txt_calendar_setlabel_week_starts_on_val_monday") + << hbTrId("txt_calendar_setlabel_week_starts_on_val_tuesday") + << hbTrId("txt_calendar_setlabel_week_starts_on_val_wednesday") + << hbTrId("txt_calendar_setlabel_week_starts_on_val_thursday") + << hbTrId("txt_calendar_setlabel_week_starts_on_val_friday") + << hbTrId("txt_calendar_setlabel_week_starts_on_val_saturday") + << hbTrId("txt_calendar_setlabel_week_starts_on_val_sunday"); + // Start of week item. + mShowWeekStartOnInfoItem = mSettingsModel->appendDataFormItem( + HbDataFormModelItem::ComboBoxItem, + hbTrId("txt_calendar_setlabel_week_starts_on")); - // For HbPushButton type properties -- to be used for toggle value item - mShowWeekNumberItem->setContentWidgetData(QString("text"), - QString(hbTrId("txt_calendar_button_no"))); - mShowWeekNumberItem->setContentWidgetData(QString("additionalText"), - QString(hbTrId("txt_calendar_button_yes"))); - - mSettingsForm->addConnection(mShowWeekNumberItem, SIGNAL(clicked()), - this, SLOT(handleWeekNumberChange())); - mSettingsModel->appendDataFormItem(mShowWeekNumberItem); - - // TODO: Append the regional information setting only if any regional plugins have been - // loaded by the customisation manager + // Get start of week from the locale. + HbExtendedLocale locale = HbExtendedLocale::system(); + mStartOfWeek = locale.startOfWeek(); + mShowWeekStartOnInfoItem->setContentWidgetData("items", weekdaysList); + mShowWeekStartOnInfoItem->setContentWidgetData("currentIndex", mStartOfWeek); + mSettingsForm->addConnection(mShowWeekStartOnInfoItem, + SIGNAL(currentIndexChanged(int)), + this, SLOT(setStartDayOfWeek(int))); + // Add the show week number item in the model + addWeekNumberItem(); + + if (isPluginEnabled()) { + addRegionalInfoItem(); + } +} + +/*! + Adds the regional info item to the model + */ +void CalenSettings::addRegionalInfoItem() +{ + mRegionalpluginActive = true; mShowRegionalInfoItem = new HbDataFormModelItem(); mShowRegionalInfoItem->setType(HbDataFormModelItem::ToggleValueItem); mShowRegionalInfoItem->setData(HbDataFormModelItem::LabelRole, - QString("Show regional info")); + QString(hbTrId("txt_calendar_setlabel_show_lunar_calendar"))); // For HbPushButton type properties -- to be used for toggle value item mShowRegionalInfoItem->setContentWidgetData(QString("text"), - QString(hbTrId("txt_calendar_button_no"))); + QString(hbTrId("txt_calendar_button_no"))); mShowRegionalInfoItem->setContentWidgetData(QString("additionalText"), - QString(hbTrId("txt_calendar_button_yes"))); + QString(hbTrId("txt_calendar_button_yes"))); mSettingsForm->addConnection(mShowRegionalInfoItem, SIGNAL(clicked()), - this, SLOT(handleRegionalInfoChange())); + this, SLOT(handleRegionalInfoChange())); mSettingsModel->appendDataFormItem(mShowRegionalInfoItem); } +/*! + Removes the regional info item from the model + */ +void CalenSettings::removeRegionalInfoItem() +{ + mSettingsForm->removeConnection(mShowRegionalInfoItem, SIGNAL(clicked()), + this, SLOT(handleRegionalInfoChange())); + mSettingsModel->removeItem(mShowRegionalInfoItem); + mRegionalpluginActive = false; +} + +/*! + Handles the alarm snooze time change + */ void CalenSettings::handleAlarmSnoozeTimeChange(int index) { -switch(index) - { - case 0: - { - mSettingsManager->writeItemValue(*mAlarmSnoozeCenrepKey, 5); - } - break; - case 1: - { - mSettingsManager->writeItemValue(*mAlarmSnoozeCenrepKey, 10); - } - break; - case 2: - { - mSettingsManager->writeItemValue(*mAlarmSnoozeCenrepKey, 15); - } - break; - case 3: - { - mSettingsManager->writeItemValue(*mAlarmSnoozeCenrepKey, 30); - } - break; - default: - break; - } -QVariant value = mSettingsManager->readItemValue(*mAlarmSnoozeCenrepKey); - uint time = value.toUInt(); + if(mAlarmSnoozeTimeHash.value(index) > KValueZero) { + mSettingsManager->writeItemValue(*mAlarmSnoozeCenrepKey, mAlarmSnoozeTimeHash[index]); + } } +/*! + Handles the week number change + */ void CalenSettings::handleWeekNumberChange() { QVariant data = mShowWeekNumberItem->contentWidgetData(QString("text")); QString value = data.toString(); - if(!value.compare(hbTrId("txt_calendar_button_no"))) - { + if (!value.compare(hbTrId("txt_calendar_button_no"))) { // User has made it OFF. - mShowWeekNumber = 0; - mSettingsManager->writeItemValue(*mWeekNumberCenrepKey, 0); + mSettingsManager->writeItemValue(*mWeekNumberCenrepKey, KValueZero); + } else if (!value.compare(hbTrId("txt_calendar_button_yes"))) { + // User has made it ON. + mSettingsManager->writeItemValue(*mWeekNumberCenrepKey, KValueOne); } - else if(!value.compare(hbTrId("txt_calendar_button_yes"))) - { +} + +/*! + Handles the regional info option change + */ +void CalenSettings::handleRegionalInfoChange() +{ + QVariant data = mShowRegionalInfoItem->contentWidgetData(QString("text")); + QString value = data.toString(); + if (!value.compare(hbTrId("txt_calendar_button_no"))) { + // User has made it OFF + mSettingsManager->writeItemValue(*mShowRegionalInfoKey, KValueZero); + } else if (!value.compare(hbTrId("txt_calendar_button_yes"))) { // User has made it ON. - mShowWeekNumber = 1; - mSettingsManager->writeItemValue(*mWeekNumberCenrepKey, 1); + mSettingsManager->writeItemValue(*mShowRegionalInfoKey, KValueOne); } } -void CalenSettings::handleRegionalInfoChange() -{ - QVariant data = mShowRegionalInfoItem->contentWidgetData(QString("text")); - QString value = data.toString(); - if(!value.compare(hbTrId("txt_calendar_button_no"))) { - // User has made it OFF - mShowRegionalInfo = 0; - mSettingsManager->writeItemValue(*mShowRegionalInfoKey, 0); - } else if(!value.compare(hbTrId("txt_calendar_button_yes"))) { - // User has made it ON. - mShowRegionalInfo = 1; - mSettingsManager->writeItemValue(*mShowRegionalInfoKey, 1); - } -} - +/*! + Populates the settings model + */ void CalenSettings::populateSettingList() { - // Read the values from cenrep - // Read the initial values from the cenrep - QVariant value = mSettingsManager->readItemValue(*mAlarmSnoozeCenrepKey); - mAlarmSnoozeTime = value.toUInt(); - - value = mSettingsManager->readItemValue(*mWeekNumberCenrepKey); - mShowWeekNumber = value.toUInt(); - - // set the value to the form - int choiceIndex = 0; - switch(mAlarmSnoozeTime) - { - case 5: - choiceIndex = 0; - break; - case 10: - choiceIndex = 1; - break; - case 15: - choiceIndex = 2; - break; - case 30: - choiceIndex = 3; - break; - default: - choiceIndex = 0; - break; - } - mAlarmSnoozeTimeItem->setContentWidgetData(QString("currentIndex"), - choiceIndex); - if(mShowWeekNumber) - { - mShowWeekNumberItem->setContentWidgetData(QString("text"), - QString(hbTrId("txt_calendar_button_yes"))); - mShowWeekNumberItem->setContentWidgetData(QString("additionalText"), - QString(hbTrId("txt_calendar_button_no"))); - } - else - { - mShowWeekNumberItem->setContentWidgetData(QString("text"), - QString(hbTrId("txt_calendar_button_no"))); - mShowWeekNumberItem->setContentWidgetData(QString("additionalText"), - QString(hbTrId("txt_calendar_button_yes"))); - } - - value = mSettingsManager->readItemValue(*mShowRegionalInfoKey); - mShowRegionalInfo = value.toUInt(); - - if (mShowRegionalInfo) { - mShowRegionalInfoItem->setContentWidgetData(QString("text"), - QString(hbTrId("txt_calendar_button_yes"))); - mShowRegionalInfoItem->setContentWidgetData(QString("additionalText"), - QString(hbTrId("txt_calendar_button_no"))); - } else { - mShowRegionalInfoItem->setContentWidgetData(QString("text"), - QString(hbTrId("txt_calendar_button_no"))); - mShowRegionalInfoItem->setContentWidgetData(QString("additionalText"), - QString(hbTrId("txt_calendar_button_yes"))); - } - - mSettingsForm->setModel(mSettingsModel); + // Read the values from cenrep + // Read the initial values from the cenrep + QVariant value = mSettingsManager->readItemValue(*mAlarmSnoozeCenrepKey); + uint alarmSnoozeTime = value.toUInt(); + + // Get the value from the hash and set the value to the form + int choiceIndex = mAlarmSnoozeTimeHash.key(alarmSnoozeTime); + mAlarmSnoozeTimeItem->setContentWidgetData(QString("currentIndex"), + choiceIndex); + // Get start of week from the locale. + HbExtendedLocale locale = HbExtendedLocale::system(); + mStartOfWeek = locale.startOfWeek(); + + mShowWeekStartOnInfoItem->setContentWidgetData("currentIndex", mStartOfWeek); + //update the show week number option + updateShowWeekItem(); + // Check the the regional info plugin is loaded now or not + if (isPluginEnabled()) { + // If the plugin was already there just populate the item + // else add the regional info item and then populate + if (mRegionalpluginActive) { + populateRegionalInfo(); + }else { + addRegionalInfoItem(); + populateRegionalInfo(); + } + }else { + // If the plugin is removed now and if it was loaded before + // remove the item + if (mRegionalpluginActive) { + removeRegionalInfoItem(); + } + } + mSettingsForm->setModel(mSettingsModel); +} + +/*! + Populates the regional info item + */ +void CalenSettings::populateRegionalInfo() +{ + QVariant value = mSettingsManager->readItemValue(*mShowRegionalInfoKey); + uint showRegionalInfo = value.toUInt(); + + if (showRegionalInfo) { + mShowRegionalInfoItem->setContentWidgetData( + QString("text"), QString(hbTrId("txt_calendar_button_yes"))); + mShowRegionalInfoItem->setContentWidgetData( + QString("additionalText"), QString( + hbTrId("txt_calendar_button_no"))); + } else { + mShowRegionalInfoItem->setContentWidgetData( + QString("text"), QString(hbTrId("txt_calendar_button_no"))); + mShowRegionalInfoItem->setContentWidgetData( + QString("additionalText"), QString( + hbTrId("txt_calendar_button_yes"))); + } +} + +/*! + Adds the week number item in the model + */ +void CalenSettings::addWeekNumberItem() +{ + mWeekNumberItemAdded = true; + // Append Show Week Number settings item + mShowWeekNumberItem = new HbDataFormModelItem(); + mShowWeekNumberItem->setType(HbDataFormModelItem::ToggleValueItem); + + QStringList values; + values << hbTrId("txt_calendar_button_no") + << hbTrId("txt_calendar_button_yes"); + mShowWeekNumberItem->setData(HbDataFormModelItem::LabelRole, + QString(hbTrId("txt_calendar_setlabel_show_week_numbers"))); + + mSettingsModel->appendDataFormItem(mShowWeekNumberItem); + mSettingsForm->addConnection(mShowWeekNumberItem, SIGNAL(clicked()), + this, SLOT(handleWeekNumberChange())); +} + +/*! + Returns true if the regional plugin is loaded + */ +bool CalenSettings::isPluginEnabled() +{ + QString *pluginInfo = mServices.InfobarTextL(); + if (!pluginInfo) { + return false; + } else { + return true; + } +} + +/*! + Sets the start day of the week to the locale + Is called when user selects week day + */ +void CalenSettings::setStartDayOfWeek(const int index) +{ + TLocale locale; + TDay day = (TDay)index; + //set the start day of the week to locale + locale.SetStartOfWeek(day); + locale.Set(); + updateShowWeekItem(); +} + +/*! + Updates the show week number option + */ +void CalenSettings::updateShowWeekItem() +{ + // Get start of week from the locale. + HbExtendedLocale locale = HbExtendedLocale::system(); + mStartOfWeek = locale.startOfWeek(); + mShowWeekStartOnInfoItem->setContentWidgetData("currentIndex", mStartOfWeek); + + // Read the value form cenrep + QVariant value = mSettingsManager->readItemValue(*mWeekNumberCenrepKey); + uint showWeekNumber = value.toUInt(); + + //if start day is not Monday + //set the show week number option dimmed , + //else set to proper status + if(mStartOfWeek != HbExtendedLocale::Monday) { + mShowWeekNumberItem->setContentWidgetData(QString("text"), + QString(hbTrId("txt_calendar_button_no"))); + mShowWeekNumberItem->setContentWidgetData(QString("additionalText"), + QString(hbTrId("txt_calendar_button_yes"))); + mShowWeekNumberItem->setEnabled(false); + } else { + if(showWeekNumber) { + mShowWeekNumberItem->setContentWidgetData(QString("text"), + QString(hbTrId("txt_calendar_button_yes"))); + mShowWeekNumberItem->setContentWidgetData(QString("additionalText"), + QString(hbTrId("txt_calendar_button_no"))); + } else { + mShowWeekNumberItem->setContentWidgetData(QString("text"), + QString(hbTrId("txt_calendar_button_no"))); + mShowWeekNumberItem->setContentWidgetData(QString("additionalText"), + QString(hbTrId("txt_calendar_button_yes"))); + } + mShowWeekNumberItem->setEnabled(true); + } } // End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/sis/calendar.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/sis/calendar.pkg Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,70 @@ +; +; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +; All rights reserved. +; This component and the accompanying materials are made available +; under the terms of "Eclipse Public License v1.0" +; which accompanies this distribution, and is available +; at the URL "http://www.eclipse.org/legal/epl-v10.html". +; +; Initial Contributors: +; Nokia Corporation - initial contribution. +; +; Contributors: +; +; Description: pkg file of Calendar Application for IAD. +; + +; Language +&EN + +; standard SIS file header +#{"Calendar"}, (0x10005901), 1, 0, 0, TYPE=SA, RU + +; Localised vendor name +%{"Nokia"} + +; Unique vendor name +:"Nokia" + +;Calendar engine part +"/epoc32/release/armv5/urel/AgnVersit2.dll" - "!:/sys/bin/AgnVersit2.dll" +"/epoc32/release/armv5/urel/CalenImp.dll" - "!:/sys/bin/CalenImp.dll" +"/epoc32/release/armv5/urel/CalenInterimUtils2.dll" - "!:/sys/bin/CalenInterimUtils2.dll" +"/epoc32/release/armv5/urel/Versit2.dll" - "!:/sys/bin/Versit2.dll" +"/epoc32/data/z/resource/agnversit2strings.rsc" - "!:/resource/agnversit2strings.rsc" +"/epoc32/data/z/resource/plugins/AGNVERSIT2.rsc" - "!:/resource/plugins/AGNVERSIT2.rsc" + +;Agenda Interface file to be installed +"/epoc32/release/armv5/urel/agendainterface.dll" - "!:/sys/bin/agendainterface.dll" + +; Calendar executable and default resource files + +"/epoc32/release/armv5/urel/calendar.exe" - "!:/sys/bin/calendar.exe" +"/epoc32/data/Z/private/10003a3f/import/apps/calendar_reg.rsc" - "!:/private/10003a3f/import/apps/calendar_reg.rsc" +"/epoc32/data/z/resource/apps/calendar.r01" - "!:/resource/apps/calendar.rsc" +"/epoc32/data/z/resource/qt/translations/calendar_en.qm" - "!:/resource/qt/translations/calendar.qm" + +"/epoc32/release/armv5/urel/calenviewerservice.exe" - "!:/sys/bin/calenviewerservice.exe" +"/epoc32/data/Z/private/10003a3f/import/apps/calenviewerservice_reg.rsc" - "!:/private/10003a3f/import/apps/calenviewerservice_reg.rsc" +"/epoc32/data/z/resource/apps/calenviewerservice.rsc" - "!:/resource/apps/calenviewerservice.rsc" + +"/epoc32/release/armv5/urel/calenviews.dll" - "!:/sys/bin/calenviews.dll" +"/epoc32/release/armv5/urel/calensettings.dll" - "!:/sys/bin/calensettings.dll" +"/epoc32/release/armv5/urel/calenglobaldata.dll" - "!:/sys/bin/calenglobaldata.dll" +"/epoc32/release/armv5/urel/calencustomisationmanager.dll" - "!:/sys/bin/calencustomisationmanager.dll" +"/epoc32/release/armv5/urel/calencontroller.dll" - "!:/sys/bin/calencontroller.dll" +"/epoc32/release/armv5/urel/calencommonutils.dll" - "!:/sys/bin/calencommonutils.dll" +"/epoc32/release/armv5/urel/calenlauncher.dll" - "!:/sys/bin/calenlauncher.dll" +"/epoc32/release/armv5/urel/caleneditor.dll" - "!:/sys/bin/caleneditor.dll" +"/epoc32/release/armv5/urel/agendaeventviewer.dll" - "!:/sys/bin/agendaeventviewer.dll" +"/epoc32/release/armv5/urel/calenregionalutil.dll" - "!:/sys/bin/calenregionalutil.dll" + +;ECom files to be installed +"/epoc32/release/armv5/urel/calenlunarchineseplugin.dll" - "!:/sys/bin/calenlunarchineseplugin.dll" +"/epoc32/data/z/resource/plugins/calenlunarchineseplugin.rsc" - "!:/resource/plugins/calenlunarchineseplugin.rsc" + +;Qt plugin files to be installed +"/epoc32/release/armv5/urel/agendaeventviewerplugin.dll" - "!:/sys/bin/agendaeventviewerplugin.dll" +"/epoc32/data/z/resource/qt/plugins/calendar/agendaeventviewerplugin.qtplugin" - "!:/resource/qt/plugins/calendar/agendaeventviewerplugin.qtplugin" + +;END OF FILE diff -r fd30d51f876b -r b6db4fd4947b calendarui/sis/createandsign.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/sis/createandsign.bat Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,22 @@ +rem +rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: Bat file to create Calendar Application's sisx. +rem + +@echo -------- Create sis packages --------- +makesis calendar.pkg + +@echo -------- Sign and rename sis packages ----------- +signsis calendar.sis calendar.sisx Nokia_RnDCert_02.der Nokia_RnDCert_02.key + diff -r fd30d51f876b -r b6db4fd4947b calendarui/sis/nokia_rndcert_02.der Binary file calendarui/sis/nokia_rndcert_02.der has changed diff -r fd30d51f876b -r b6db4fd4947b calendarui/sis/nokia_rndcert_02.key --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/sis/nokia_rndcert_02.key Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQC/TDP7KKIaf5+uW4OD2iVZuUMC2a+SeQTjf6srlKcOm+CpPNXn +uLNm/8fdEnyOIuRXPRKmqhs1n0JkxEGHynELWMTuKXbQx9SRAGUXzyneGn+IJNnO +vOKHWgKCouX2hfI8rtkdqJpqmO460gGsMgw+lsbeyWyW9lnfLxq+ZC7sqQIDAQAB +AoGBALmUWZE8GBaQ3P4u9WUCSd3DJkkrmXIFSULSZeH/chlwCwDjbbhArHothVzo +REE3hEFFlERvHbplZ+mNouzy7boduvgUzbksGrbGMLJ2qO1GzWWVwV+GzOWKd3ss +/98Gwoy5R8pjnkqUE2wP1iJFw0FjvUTKcYv/z6t3LLJ0CsoBAkEA+c7ixvsviQ3J +s0INytCKU2bf8fqFQJi1VI82ukxNsujGTQ9upVSjuvqPvWyDvvTdrUBHqO+3qPut +sEh01Q8aiQJBAMQKDJPVRu4ud3mwUfEavzL5EjqwG1k9VCNGYsT4FwtrHcxu1oP/ +pk6M3rIZukqomoEEnHWPMwhrK3fhBqi0OSECQQDr40VXege4FnH5OI2Hj4afHMyp +VdQQXGMWFyopnzXblFz0lXb43cTCIiorR9XcMqNFHybLypkWE5o+lRzlt55pAkBQ +P/zeF5Sts//cpL0mgdh7OVKpC6ZmZaCnwAx2rUhhuDu+kDDoYCLoTOps5fNI1LRK +1GRoC3LMo3Jr5IYhUYWBAkBpCpN6k4JU/mszq98EojHerQNxk8sPqvQKUzTutohT +1gLX9yepGayB/TtT2EEJDkWOlnTy/dvN6W3vzbJYz97x +-----END RSA PRIVATE KEY----- diff -r fd30d51f876b -r b6db4fd4947b calendarui/sisx/calendarui_armv5_urel.pkg --- a/calendarui/sisx/calendarui_armv5_urel.pkg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -; calendarui_armv5_urel.pkg generated by qmake at Wed Feb 25 16:36:32 2009 -; This file is generated by qmake and should not be modified by the user -; - -; Language -&EN - -; SIS header: name, uid, version -#{"calendarui"},(0xE4be93e0),1,0,0 - -; Localised Vendor name -%{"Nokia, Qt Software"} - -; Unique Vendor name -:"Nokia, Qt Software" - -; Dependencies -[0x101F7961],0,0,0,{"S60ProductID"} -[0x102032BE],0,0,0,{"S60ProductID"} -[0x102752AE],0,0,0,{"S60ProductID"} -[0x1028315F],0,0,0,{"S60ProductID"} -(0x2001E61C), 4, 5, 0, {"QtLibs pre-release"} - -; Executable and default resource files -"\epoc32\release\armv5\urel\agendainterface.dll" - "!:\sys\bin\agendainterface.dll" -"\epoc32\release\armv5\urel\hb_calencommonutils.dll" - "!:\sys\bin\hb_calencommonutils.dll" -"\epoc32\release\armv5\urel\hb_calenglobaldata.dll" - "!:\sys\bin\hb_calenglobaldata.dll" -"\epoc32\release\armv5\urel\calensettings.dll" - "!:\sys\bin\calensettings.dll" -"\epoc32\release\armv5\urel\hb_calencustomisationmanager.dll" - "!:\sys\bin\hb_calencustomisationmanager.dll" -;"\epoc32\release\armv5\urel\hb_CalenEditorPlugin.dll" - "!:\sys\bin\hb_CalenEditorPlugin.dll" -"\epoc32\release\armv5\urel\caleneditor.dll" - "!:\sys\bin\caleneditor.dll" -"\epoc32\release\armv5\urel\hb_calenviews.dll" - "!:\sys\bin\hb_calenviews.dll" -"\epoc32\release\armv5\urel\hb_calencontroller.dll" - "!:\sys\bin\hb_calencontroller.dll" -;"\epoc32\data\z\resource\plugins\hb_CalenEditorPlugin.rsc" - "!:\resource\plugins\hb_CalenEditorPlugin.rsc" -"\epoc32\release\armv5\urel\calendarapp.exe" - "!:\sys\bin\calendarapp.exe" -"\epoc32\data\z\resource\apps\calendarapp.rsc" - "!:\resource\apps\calendarapp.rsc" -"\epoc32\data\Z\private\10003a3f\import\Apps\calendarapp_reg.rsc" - "!:\private\10003a3f\import\apps\calendarapp_reg.rsc" -;"\epoc32\release\armv5\urel\calenregionalutil.dll" - "!:\sys\bin\calenregionalutil.dll" -;"\epoc32\data\z\resource\calenregionalutil.rsc" - "!:\resource\calenregionalutil.rsc" -;"\epoc32\data\z\resource\calenlunarchineseplugindata.rsc" - "!:\resource\calenlunarchineseplugindata.rsc" -;"\epoc32\data\z\resource\plugins\hb_calenlunarchineseplugin.rsc" - "!:\resource\plugins\hb_calenlunarchineseplugin.rsc" -;"\epoc32\release\armv5\urel\hb_calenlunarchineseplugin.dll" - "!:\sys\bin\hb_calenlunarchineseplugin.dll" -;"\epoc32\data\z\resource\plugins\hb_calenthaiplugin.rsc" - "!:\resource\plugins\hb_calenthaiplugin.rsc" -;"\epoc32\release\armv5\urel\hb_calenthaiplugin.dll" - "!:\sys\bin\hb_calenthaiplugin.dll" - - - diff -r fd30d51f876b -r b6db4fd4947b calendarui/sisx/calendarui_armv5_urel.sis Binary file calendarui/sisx/calendarui_armv5_urel.sis has changed diff -r fd30d51f876b -r b6db4fd4947b calendarui/sisx/createandsign.bat --- a/calendarui/sisx/createandsign.bat Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -@rem -@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -@rem All rights reserved. -@rem This component and the accompanying materials are made available -@rem under the terms of "Eclipse Public License v1.0" -@rem which accompanies this distribution, and is available -@rem at the URL "http://www.eclipse.org/legal/epl-v10.html". -@rem -@rem Initial Contributors: -@rem Nokia Corporation - initial contribution. -@rem -@rem Contributors: -@rem -@rem Description: -@rem - -@echo -------- Create sis packages --------- -makesis calendarui_armv5_urel.pkg - -@echo -------- Sign and rename sis packages ----------- -signsis calendarui_armv5_urel.sis hb_calendarui.sisx Nokia_RnDCert_02.der Nokia_RnDCert_02.key - diff -r fd30d51f876b -r b6db4fd4947b calendarui/sisx/hb_calendarui.sisx Binary file calendarui/sisx/hb_calendarui.sisx has changed diff -r fd30d51f876b -r b6db4fd4947b calendarui/sisx/nokia_rndcert_02.der Binary file calendarui/sisx/nokia_rndcert_02.der has changed diff -r fd30d51f876b -r b6db4fd4947b calendarui/sisx/nokia_rndcert_02.key --- a/calendarui/sisx/nokia_rndcert_02.key Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICXQIBAAKBgQC/TDP7KKIaf5+uW4OD2iVZuUMC2a+SeQTjf6srlKcOm+CpPNXn -uLNm/8fdEnyOIuRXPRKmqhs1n0JkxEGHynELWMTuKXbQx9SRAGUXzyneGn+IJNnO -vOKHWgKCouX2hfI8rtkdqJpqmO460gGsMgw+lsbeyWyW9lnfLxq+ZC7sqQIDAQAB -AoGBALmUWZE8GBaQ3P4u9WUCSd3DJkkrmXIFSULSZeH/chlwCwDjbbhArHothVzo -REE3hEFFlERvHbplZ+mNouzy7boduvgUzbksGrbGMLJ2qO1GzWWVwV+GzOWKd3ss -/98Gwoy5R8pjnkqUE2wP1iJFw0FjvUTKcYv/z6t3LLJ0CsoBAkEA+c7ixvsviQ3J -s0INytCKU2bf8fqFQJi1VI82ukxNsujGTQ9upVSjuvqPvWyDvvTdrUBHqO+3qPut -sEh01Q8aiQJBAMQKDJPVRu4ud3mwUfEavzL5EjqwG1k9VCNGYsT4FwtrHcxu1oP/ -pk6M3rIZukqomoEEnHWPMwhrK3fhBqi0OSECQQDr40VXege4FnH5OI2Hj4afHMyp -VdQQXGMWFyopnzXblFz0lXb43cTCIiorR9XcMqNFHybLypkWE5o+lRzlt55pAkBQ -P/zeF5Sts//cpL0mgdh7OVKpC6ZmZaCnwAx2rUhhuDu+kDDoYCLoTOps5fNI1LRK -1GRoC3LMo3Jr5IYhUYWBAkBpCpN6k4JU/mszq98EojHerQNxk8sPqvQKUzTutohT -1gLX9yepGayB/TtT2EEJDkWOlnTy/dvN6W3vzbJYz97x ------END RSA PRIVATE KEY----- diff -r fd30d51f876b -r b6db4fd4947b calendarui/stubsis/calendar_stub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/stubsis/calendar_stub.pkg Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,27 @@ +; +; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +; All rights reserved. +; This component and the accompanying materials are made available +; under the terms of "Eclipse Public License v1.0" +; which accompanies this distribution, and is available +; at the URL "http://www.eclipse.org/legal/epl-v10.html". +; +; Initial Contributors: +; Nokia Corporation - initial contribution. +; +; Contributors: +; +; Description: pkg file of Calendar Application for IAD. +; + +; Language +&EN + +; Header +#{"Calendar"}, (0x10005901), 1, 0, 0, TYPE=SA + +; Localised vendor name +%{"Nokia"} + +; Unique vendor name +:"Nokia" \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/stubsis/calendar_stub.sis Binary file calendarui/stubsis/calendar_stub.sis has changed diff -r fd30d51f876b -r b6db4fd4947b calendarui/tsrc/tsrc.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/tsrc/tsrc.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,27 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# This is the project specification file for calendarui test code +# + +# include test components here + +TEMPLATE = subdirs +SUBDIRS += unittest_calenviewerservice \ + unittest_calencommonutils \ + ../views/dayview/tsrc \ + +CONFIG += ordered + +# End of file --Don't remove this diff -r fd30d51f876b -r b6db4fd4947b calendarui/tsrc/unittest_calencommonutils/inc/test_calenagendautils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/tsrc/unittest_calencommonutils/inc/test_calenagendautils.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,42 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#ifndef __TEST_CALENAGENDAUTILS_H__ +#define __TEST_CALENAGENDAUTILS_H__ + +#include + +class TestCalenAgendaUtils : public QObject +{ + Q_OBJECT +public: + TestCalenAgendaUtils(); + ~TestCalenAgendaUtils(); + +private slots: + void init(); + void cleanup(); + + void test_endsAtStartOfDay(); + +private: + +}; + +#endif // __TEST_CALENAGENDAUTILS_H__ + +// End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/tsrc/unittest_calencommonutils/inc/test_calendateutils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/tsrc/unittest_calencommonutils/inc/test_calendateutils.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,55 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#ifndef __TEST_CALENDATEUTILS_H__ +#define __TEST_CALENDATEUTILS_H__ + +#include + +class TestCalenDateUtils : public QObject +{ + Q_OBJECT +public: + TestCalenDateUtils(); + ~TestCalenDateUtils(); + +private slots: + void init(); + void cleanup(); + + void test_onSameDay(); + void test_onSameMonth(); + void test_beginningOfDay(); + void test_displayTimeOnDay(); + void test_timeRangesIntersect(); + void test_isValidDay(); + void test_limitToValidTime(); + void test_maxTime(); + void test_minTime(); + void test_timeOfDay(); + void test_roundToPreviousHour(); + void test_roundToPreviousHourFromMinutes(); + void test_now(); + void test_today(); + void test_isOnToday(); + void test_defaultTime(); + void test_futureOf(); +}; + +#endif // __TEST_CALENDATEUTILS_H__ + +// End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/tsrc/unittest_calencommonutils/rom/unittest_calencommonutils.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/tsrc/unittest_calencommonutils/rom/unittest_calencommonutils.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Image description file for test project +* +*/ + +#ifndef UNITTEST_CALENCOMMONUTILS_IBY +#define UNITTEST_CALENCOMMONUTILS_IBY + +S60_APP_EXE(utcalencommonutils) +S60_APP_RESOURCE(utcalencommonutils) + +// Application registration file. +data=DATAZ_\private\10003a3f\import\apps\utcalencommonutils_reg.rsc \private\10003a3f\import\apps\utcalencommonutils_reg.rsc + + +#endif // UNITTEST_CALENCOMMONUTILS_IBY \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/tsrc/unittest_calencommonutils/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/tsrc/unittest_calencommonutils/src/main.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,55 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +// System includes +#include +#include + +// User includes +#include "test_calenagendautils.h" +#include "test_calendateutils.h" + +int main(int argc, char *argv[]) +{ + HbApplication app(argc, argv); + + TestCalenDateUtils testDateUtils; + + char *args[3]; + args[0] = argv[0]; + args[1] = "-o"; + args[2] = "c:\\data\\TestCalenDateUtils.txt"; + + int retDateUtils = QTest::qExec(&testDateUtils, 3, args); + + + TestCalenAgendaUtils testAgendaUtils; + + args[2] = "c:\\data\\TestCalenAgendaUtils.txt"; + + int retAgendaUtils = QTest::qExec(&testAgendaUtils, 3, args); + + // Core dump if HbIconLoader instance is not destroyed before the + // application instance. HbIconLoader uses QCoreApplication::aboutToQuit() + // signal to destroy itself. app.exec() where the signal is normally emitted + // is not called here. So, invoking the signal explicitly. + QMetaObject::invokeMethod(&app, "aboutToQuit", Qt::DirectConnection); + + return (retDateUtils && retAgendaUtils); +} + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/tsrc/unittest_calencommonutils/src/test_calenagendautils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/tsrc/unittest_calencommonutils/src/test_calenagendautils.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,92 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include +#include + +#include "calenagendautils.h" +#include "test_calenagendautils.h" + +/*! + \class TestCalenAgendaUtils + + This is unittest class for CalenAgendaUtils apis. + */ + +TestCalenAgendaUtils::TestCalenAgendaUtils() +{ + // No implementation yet +} + +TestCalenAgendaUtils::~TestCalenAgendaUtils() +{ + // No implementation yet +} + +/*! + This function is called to before every testcase. + */ +void TestCalenAgendaUtils::init() +{ + // No implementation yet +} + +/*! + This function is called after every testcase. + */ +void TestCalenAgendaUtils::cleanup() +{ + // No implementation yet +} + +/*! + This function is to test the api of CalenDateUtils::endsAtStartOfDayL. + */ +void TestCalenAgendaUtils::test_endsAtStartOfDay() +{ + AgendaEntry entry; + entry.setSummary("summary"); + entry.setStartAndEndTime(QDateTime(QDate(2010, 5, 1), QTime(12, 30)), + QDateTime(QDate(2010, 5, 6), QTime(2, 59))); + bool outPut = CalenAgendaUtils::endsAtStartOfDay( + entry, + QDateTime(QDate(2010, 5, 6))); + QVERIFY(!outPut); + + entry.setStartAndEndTime(QDateTime(QDate(2010, 5, 1), QTime(1, 35)), + QDateTime(QDate(2010, 5, 6), QTime(23, 59))); + outPut = CalenAgendaUtils::endsAtStartOfDay( + entry, + QDateTime(QDate(2010, 5, 6))); + QVERIFY(!outPut); + + entry.setStartAndEndTime(QDateTime(QDate(2010, 5, 1), QTime(2, 30)), + QDateTime(QDate(2010, 5, 5), QTime(23, 59, 59, 999))); + outPut = CalenAgendaUtils::endsAtStartOfDay( + entry, + QDateTime(QDate(2010, 5, 6))); + QVERIFY(!outPut); + + entry.setStartAndEndTime(QDateTime(QDate(2010, 5, 1), QTime(1, 35)), + QDateTime(QDate(2010, 5, 6))); + outPut = CalenAgendaUtils::endsAtStartOfDay( + entry, + QDateTime(QDate(2010, 5, 6))); + QVERIFY(outPut); + +} +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/tsrc/unittest_calencommonutils/src/test_calendateutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/tsrc/unittest_calencommonutils/src/test_calendateutils.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,393 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include +#include + +#include "calendateutils.h" +#include "test_calendateutils.h" + +/*! + \class TestCalenDateUtils + + This is unittest class for CalenDateUtils apis. + */ + +TestCalenDateUtils::TestCalenDateUtils() +{ + // No implementation yet +} + +TestCalenDateUtils::~TestCalenDateUtils() +{ + // No implementation yet +} + +/*! + This function is called to before every testcase. + */ +void TestCalenDateUtils::init() +{ + // No implementation yet +} + +/*! + This function is called after every testcase. + */ +void TestCalenDateUtils::cleanup() +{ + // No implementation yet +} + +/*! + This function is to test the api of CalenDateUtils::onSameDay. + */ +void TestCalenDateUtils::test_onSameDay() +{ + QDateTime firstParam(QDate(2010, 10, 9)); + QDateTime secondParam(QDate(2009, 22, 9)); + QCOMPARE(CalenDateUtils::onSameDay(firstParam, secondParam), false); + + firstParam = QDateTime(QDate(2010, 2, 30)); + secondParam = QDateTime::currentDateTime(); + QCOMPARE(CalenDateUtils::onSameDay(firstParam, secondParam), false); + + firstParam = QDateTime(QDate(2010, 12, 5), QTime(6, 44)); + secondParam = QDateTime(QDate(2010, 12, 5), QTime(9, 33)); + QCOMPARE(CalenDateUtils::onSameDay(firstParam, secondParam), true); + + firstParam = QDateTime(QDate(-1756, 12, 5)); + secondParam = QDateTime(QDate(1900, 5, 9)); + QCOMPARE(CalenDateUtils::onSameDay(firstParam, secondParam), false); + +} + +/*! + This function is to test the api of CalenDateUtils::onSameMonth. + */ +void TestCalenDateUtils::test_onSameMonth() +{ + QDateTime firstParam(QDate(2010, 10, 9)); + QDateTime secondParam(QDate(2010, 22, 9)); + QCOMPARE(CalenDateUtils::onSameMonth(firstParam, secondParam), false); + + firstParam = QDateTime(QDate(2010, 2, 13)); + secondParam = QDateTime(QDate(2009, 2, 3)); + QCOMPARE(CalenDateUtils::onSameMonth(firstParam, secondParam), false); + + firstParam = QDateTime(QDate(2010, 12, 5)); + secondParam = QDateTime(QDate(2010, 12, 6)); + QCOMPARE(CalenDateUtils::onSameMonth(firstParam, secondParam), true); + + firstParam = QDateTime(QDate(2010, 13, 5)); + secondParam = QDateTime(QDate(2010, 12, 9)); + QCOMPARE(CalenDateUtils::onSameMonth(firstParam, secondParam), false); +} + +/*! + This function is to test the api of CalenDateUtils::beginningOfDay. + */ +void TestCalenDateUtils::test_beginningOfDay() +{ + QDateTime expectedDate(QDate(2010, 5, 4), QTime(0, 0)); + QDateTime param(QDate(2010, 5, 4), QTime(15, 44)); + QCOMPARE(CalenDateUtils::beginningOfDay(param), expectedDate); + + expectedDate = QDateTime(QDate(2010, 3, 3), QTime(0, 0)); + param = QDateTime(QDate(2010, 3, 3), QTime(2, 33)); + QCOMPARE(CalenDateUtils::beginningOfDay(param), expectedDate); + + expectedDate = QDateTime(QDate(2010, 3, 5)); + param = QDateTime(QDate(2010, 3, 5), QTime(23, 59, 59, 999)); + QCOMPARE(CalenDateUtils::beginningOfDay(param), expectedDate); + + expectedDate = QDateTime(QDate(2010, 12, 15), QTime(0, 0)); + param = QDateTime(QDate(2010, 12, 15), QTime(24, 59)); + QCOMPARE(CalenDateUtils::beginningOfDay(param), expectedDate); +} + +/*! + This function is to test the api of CalenDateUtils::displayTimeOnDay. + */ +void TestCalenDateUtils::test_displayTimeOnDay() +{ + QDateTime firstParam(QDate(2010, 10, 9), QTime(12, 45)); + QDateTime secondParam(QDate(2010, 10, 9)); + QDateTime actualOutput; + QDateTime expectedOutput = firstParam; + + actualOutput = CalenDateUtils::displayTimeOnDay(firstParam, secondParam); + QCOMPARE(actualOutput, expectedOutput); + + firstParam = QDateTime(QDate(2010, 2, 13)); + secondParam = QDateTime(QDate(2009, 2, 3), QTime(23, 59)); + actualOutput = QDateTime(); + expectedOutput = CalenDateUtils::beginningOfDay(secondParam); + + actualOutput = CalenDateUtils::displayTimeOnDay(firstParam, secondParam); + QCOMPARE(actualOutput, expectedOutput); + + firstParam = QDateTime(QDate(2010, 1, 5)); + secondParam = QDateTime(QDate(2010, 13, 6)); + actualOutput = QDateTime(); + + actualOutput = CalenDateUtils::displayTimeOnDay(firstParam, secondParam); + QVERIFY(!actualOutput.isValid()); + +} + +/*! + This function is to test the api of CalenDateUtils::displayTimeOnDay. + */ +void TestCalenDateUtils::test_timeRangesIntersect() +{ + QDateTime firstStartTime(QDate(2010, 10, 9), QTime(12, 45)); + QDateTime firstEndTime(QDate(2010, 10, 10)); + QDateTime secondStartTime(QDate(2010, 6, 5)); + QDateTime secondEndTime(QDate(2010, 10, 9)); + + bool actualOutput = CalenDateUtils::timeRangesIntersect(firstStartTime, + firstEndTime, + secondStartTime, + secondEndTime); + QCOMPARE(actualOutput, false); + + firstStartTime = QDateTime(QDate(2009, 5, 7)); + firstEndTime = QDateTime(QDate(2009, 5, 6)); + secondStartTime = QDateTime(QDate(2009, 5, 6)); + secondEndTime = QDateTime(QDate(2009, 5, 6)); + actualOutput = true; + + actualOutput = CalenDateUtils::timeRangesIntersect(firstStartTime, + firstEndTime, + secondStartTime, + secondEndTime); + QCOMPARE(actualOutput, false); + + firstStartTime = QDateTime(QDate(2009, 5, 7)); + firstEndTime = QDateTime(QDate(2009, 6, 11)); + secondStartTime = QDateTime(QDate(2009, 5, 7), QTime(2,0)); + secondEndTime = QDateTime(QDate(2009, 5, 8)); + actualOutput = false; + + actualOutput = CalenDateUtils::timeRangesIntersect(firstStartTime, + firstEndTime, + secondStartTime, + secondEndTime); + QCOMPARE(actualOutput, true); + +} + +/*! + This function is to test the api of CalenDateUtils::isValidDay. + */ +void TestCalenDateUtils::test_isValidDay() +{ + QVERIFY(!CalenDateUtils::isValidDay(QDateTime(QDate(1899,12,28)))); + + QVERIFY(CalenDateUtils::isValidDay(QDateTime(QDate(2100,12,31)))); + + QVERIFY(CalenDateUtils::isValidDay(QDateTime(QDate(2100,12,30)))); + + QVERIFY(!CalenDateUtils::isValidDay(QDateTime(QDate(2100,2,31)))); + +} + +/*! + This function is to test the api of CalenDateUtils::limitToValidTime. + */ +void TestCalenDateUtils::test_limitToValidTime() +{ + QDateTime dateTime(QDate(1899, 12, 28)); + + QDateTime actualOutput = CalenDateUtils::limitToValidTime(dateTime); + QCOMPARE(actualOutput , QDateTime(QDate(1900,1,1))); + + dateTime = QDateTime(QDate(2010, 10, 20)); + actualOutput = CalenDateUtils::limitToValidTime(dateTime); + QCOMPARE(actualOutput, QDateTime(QDate(2010,10,20))); + + dateTime = QDateTime(); + actualOutput = CalenDateUtils::limitToValidTime(dateTime); + QCOMPARE(actualOutput, QDateTime(QDate(1900,1,1))); + + dateTime = QDateTime(QDate(2101, 1, 1)); + actualOutput = CalenDateUtils::limitToValidTime(dateTime); + QCOMPARE(actualOutput, QDateTime(QDate(2100,12,31))); + + dateTime = QDateTime(QDate(2100, 12, 31), QTime(12,55)); + actualOutput = CalenDateUtils::limitToValidTime(dateTime); + QCOMPARE(actualOutput, QDateTime(QDate(2100,12,31))); + + dateTime = QDateTime(QDate(2010,2,31)); + actualOutput = CalenDateUtils::limitToValidTime(dateTime); + QCOMPARE(actualOutput, QDateTime(QDate(1900,1,1))); + +} + +/*! + This function is to test the api of CalenDateUtils::maxTime. + */ +void TestCalenDateUtils::test_maxTime() +{ + QCOMPARE(CalenDateUtils::maxTime() , QDateTime(QDate(2100,12,31))); +} + +/*! + This function is to test the api of CalenDateUtils::minTime. + */ +void TestCalenDateUtils::test_minTime() +{ + QCOMPARE(CalenDateUtils::minTime() , QDateTime(QDate(1900,1,1))); +} + +/*! + This function is to test the api of CalenDateUtils::timeOfDay. + */ +void TestCalenDateUtils::test_timeOfDay() +{ + QDateTime dateTime = QDateTime(QDate(1900, 1, 1)); + int actulOutput = CalenDateUtils::timeOfDay(dateTime); + int expectedOutput = 0; + QCOMPARE(actulOutput, expectedOutput); + + dateTime = QDateTime(QDate(2010, 12, 8), QTime(12, 30)); + expectedOutput = 750; + actulOutput = CalenDateUtils::timeOfDay(dateTime); + QCOMPARE(actulOutput, expectedOutput); + + dateTime = QDateTime(QDate(2010, 12, 8), QTime(6, 59, 59, 999)); + expectedOutput = 420; + actulOutput = CalenDateUtils::timeOfDay(dateTime); + QCOMPARE(actulOutput, expectedOutput); + + dateTime = QDateTime(QDate(2010, 4, 31), QTime(7, 0)); + expectedOutput = 420; + actulOutput = CalenDateUtils::timeOfDay(dateTime); + QCOMPARE(actulOutput, expectedOutput); + + dateTime = QDateTime(QDate(2010, 4, 7), QTime(6, 59, 59)); + expectedOutput = 419; + actulOutput = CalenDateUtils::timeOfDay(dateTime); + QCOMPARE(actulOutput, expectedOutput); + + dateTime = QDateTime(QDate(2010, 4, 7), QTime(12, 60, 60)); + expectedOutput = 0; + actulOutput = CalenDateUtils::timeOfDay(dateTime); + QCOMPARE(actulOutput, expectedOutput); +} + +/*! + This function is to test the api of CalenDateUtils::roundToPreviousHour. + */ +void TestCalenDateUtils::test_roundToPreviousHour() +{ + QDateTime dateTime = QDateTime(QDate(1900, 1, 1), QTime(23, 59, 59)); + QDateTime actulOutput = CalenDateUtils::roundToPreviousHour(dateTime); + QDateTime expectedOutput(QDate(1900, 1, 1), QTime(23, 0)); + QCOMPARE(actulOutput, expectedOutput); + + dateTime = QDateTime(QDate(2010, 12, 8), QTime(12, 30)); + expectedOutput = QDateTime(QDate(2010, 12, 8), QTime(12, 0)); + actulOutput = CalenDateUtils::roundToPreviousHour(dateTime); + QCOMPARE(actulOutput, expectedOutput); + + dateTime = QDateTime(QDate(2010, 12, 8), QTime(6, 59, 59, 999)); + expectedOutput = QDateTime(QDate(2010, 12, 8), QTime(6, 0)); + actulOutput = CalenDateUtils::roundToPreviousHour(dateTime); + QCOMPARE(actulOutput, expectedOutput); + + dateTime = QDateTime(QDate(2010, 4, 3), QTime(12, 60, 60)); + expectedOutput = QDateTime(QDate(2010, 4, 3)); + actulOutput = CalenDateUtils::roundToPreviousHour(dateTime); + QCOMPARE(actulOutput, expectedOutput); +} + +/*! + This function is to test the api of CalenDateUtils::roundToPreviousHour. + */ +void TestCalenDateUtils::test_roundToPreviousHourFromMinutes() +{ + int minutes = 145; + int actulOutput = CalenDateUtils::roundToPreviousHour(minutes); + int expectedOutput = 120; + QCOMPARE(actulOutput, expectedOutput); + + minutes = -255; + expectedOutput = -240; + actulOutput = CalenDateUtils::roundToPreviousHour(minutes); + QCOMPARE(actulOutput, expectedOutput); + + minutes = 606; + expectedOutput = 600; + actulOutput = CalenDateUtils::roundToPreviousHour(minutes); + QCOMPARE(actulOutput, expectedOutput); +} + +/*! + This function is to test the api of CalenDateUtils::now. + */ +void TestCalenDateUtils::test_now() +{ + QCOMPARE(CalenDateUtils::now() , QDateTime::currentDateTime()); +} + +/*! + This function is to test the api of CalenDateUtils::today. + */ +void TestCalenDateUtils::test_today() +{ + QDateTime expectedTime = QDateTime::currentDateTime(); + expectedTime.setTime(QTime(0,0)); + QCOMPARE(CalenDateUtils::today() , expectedTime ); +} + +/*! + This function is to test the api of CalenDateUtils::isOnToday. + */ +void TestCalenDateUtils::test_isOnToday() +{ + QVERIFY(CalenDateUtils::isOnToday(QDateTime::currentDateTime())); + QDateTime dateTime = QDateTime::currentDateTime().addDays(1); + QVERIFY(!CalenDateUtils::isOnToday(dateTime)); +} + +/*! + This function is to test the api of CalenDateUtils::defaultTime. + */ +void TestCalenDateUtils::test_defaultTime() +{ + QDateTime dateTime = QDateTime(QDate(2010, 3, 2)); + QDateTime expectedOutput = dateTime; + // 8:00 am is default time for Calendar Editor + expectedOutput.setTime(QTime(8, 0)); + QDateTime actualOutput = CalenDateUtils::defaultTime(dateTime); + QCOMPARE(actualOutput, expectedOutput); +} + +/*! + This function is to test the api of CalenDateUtils::futureOf. + */ +void TestCalenDateUtils::test_futureOf() +{ + QDateTime dateTime = QDateTime(QDate(2009, 10, 30)); + QDateTime expectedOutput = QDateTime(QDate(2009, 11, 26)); + QDateTime actualOutput = CalenDateUtils::futureOf(dateTime, 27); + QCOMPARE(actualOutput, expectedOutput); +} + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/tsrc/unittest_calencommonutils/unittest_calencommonutils.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/tsrc/unittest_calencommonutils/unittest_calencommonutils.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,50 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: This is the project specification file for the calencommonutils. +# + +TEMPLATE = app +TARGET = utcalencommonutils +CONFIG += qtestlib +CONFIG += symbian_test +CONFIG += hb +DEPENDPATH += . \ + ./inc \ + ./src + +INCLUDEPATH += . \ + ../../inc + + +# Input +HEADERS += test_calendateutils.h \ + test_calenagendautils.h + +SOURCES += main.cpp \ + test_calendateutils.cpp \ + test_calenagendautils.cpp + +symbian : { + + TARGET.CAPABILITY = ALL -TCB + TARGET.UID3 = 0x200315AE + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + LIBS += -lcalencommonutils \ + -lagendainterface + BLD_INF_RULES.prj_testexports += \ + "./rom/unittest_calencommonutils.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unittest_calencommonutils.iby)" +} + +# End of file --Don't remove this. \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/tsrc/unittest_calenviewerservice/data/meeting.ics --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/tsrc/unittest_calenviewerservice/data/meeting.ics Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,19201 @@ +BEGIN:VCALENDAR +PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN +VERSION:2.0 +METHOD:REQUEST +X-MS-OLK-FORCEINSPECTOROPEN:TRUE +BEGIN:VEVENT +ATTACH;ENCODING=BASE64;VALUE=BINARY;X-FILENAME=EPIC_10.2_Day_View_X0.ppt:0M + 8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAARAAAADwgAAAAAAAAA + EAAA/v///wAAAAD+////AAAAAP4HAAD/BwAAAAgAAAEIAAACCAAAAwgAAAQIAAAFCAAABggAAA + cIAAAICAAACQgAAAoIAAALCAAADAgAAA0IAAAOCAAA//////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////9gIRvwuQQAAFpSSf52ugV0Qw2h4sySG6vyDgAAAAAAAAAAAABgAAAASwAAAO + DzDQAA5goAhwQAAAD+eNrNlz9oG1ccx5/k1qntQAzp4CFQBUqJBwVdnRarSxy5MUihKRaBUOGh + 4pCJkGphnyE2orSDEB2E6CA8CS1F2qRNt1lTsTYbOsjbZbzxhhJuaOD6ffe7e3f6a4UO6fP3Se + +k8+f33u/3ez/dC7AlxhZObzEWYPcXGdpH6AuBT9jHeF8J8k/46HbwGfvRHi2JzwJBy7JYE6Mn + KxfsNxbCH2/0HmIP7FfGtvi9+LOb8zbaOOlDN8zBeocZvk//9f36Avot9Dvon6E/BuOXd2Ta4v + 5/srLD9qd6MmQ7cI2me5v9D9p5q1Y5TCnpRG43Ksel/6JpfMvQtKsLrd/Vem2t19TVmq5W/DI6 + JU+tImS2FK5GzmzIpJl83SdtSLrQYFiX1htPM/n1Yf4UWzOtzMPX1Bo06EAVoW41N0OOCR383C + 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 + AUgAJQAApAASgABaAAFIACUAAKQAEoAAWgABSAAlAACkABKAAFoAAUgAJQAApAASgABaAAFIAC + UAAKQAEoAAWgABSAAlAACkABKAAFoAAUgAJQAApAASgABaAAFIACUAAKQAEoAAWgABSAAlAACk + ABKAAFoAAUgAJQAApAASgABaAAFIACUAAKQAEoAAWgABSAAlAACkABKAAFoAAUgAJQAApAASgA + BaAAFIACUAAKQAEoAAWgABSAAlAACkABKAAFoAAUgAJQAApAASgABaAAFIACUAAKQAEoAAWgAB + SAAlAACkABKAAFoAAUgAJQAApAASgABaAAFIACUAAKQAEoAAWgABSAAlAACkABKAAFoAAUgAJQ + AApAASgABaAAFIACUAAKQAEoAAWgABSAAlAACkABKAAFoEDlFPj/HtMbsKDIy20AAAAASUVORK + 5CYIIAbh7wlCMAANeTI5S4Hbcl6S2ovIyNfJX/iVBORw0KGgoAAAANSUhEUgAABgsAAAA8CAYA + AABYZopwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AA + AAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAXEQAAFxEByibzPwAAIuxJREFUeF7t + nevvZldVx+cPMCG+IPGFCdGQGGi5Sjvt9DaUNqWhpXQGJ16xGMFQ7YUSGkjREi6lnekAb0yMb/ + CFJiioUV9Ap1MUghRpAY2oTdRgiPY2tIxtwzh17PjseWb3d357zt57rX05ez3Mp8nJ9Pf89tn7 + uz9rre9e5zkM3bGDfyAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgA + AEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAA + BCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAA + QgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAE + IAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABC + AAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQg + AAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIA + ABCEAAAhCAAAQgAAEIQAACEIDAjh0XryB8+5xzfvqkv1772p85uWvXq4dcr3jFT518yUt+7OTL + XvYTQ9YP921JjyUtjpMlPZa0wCbuHcSpna9aY6k5M6xpt6THkha8LF2vlmKFlnHnTk/2Peemvq + lvzbntx/bOSa0mS3osaRld39ZY8Hwvf/6wFDu0jOttNF5sKU6jvc+y1/RmQx6Mqdc3vOGVp77H + d9/pT653tHrR8a7VRG7yF6/du9/wwuc/f+D/Rlw33vhzLzgtIzVM921JjyUtjpElPZa0wCbuHc + Spna9aY6k5L6xpt6THkha8LF2vlmKFlnHnTk/2Peemvqlvzbntx/bOSa0mS3osaRld39ZYhHll + SZ8lLaPzhjjJnxMt5Y0lLeTwuN6GPBjzLOK5B9/p/1GrlwU3hC8L9u274sQTTxz6nxHXpz992/ + 86PSM1TPdtSY8lLY6RJT2WtMAm7h3EqZ2vWmOpOS+sabekx5IWvCxdr5ZihZZx505P9j3npr6p + b8257cf2zkmtJkt6LGkZXd/WWIR5ZUmfJS2j84Y4yZ8TLeWNJS3k8LjehjwY8yziuQff6X+m28 + uCvXuveP6xxw49s/T16KOHnjl48JZjbqN79lzxvPt5aQ1+Pbd2qMeSFtisc2MuTrCxy8ZKffta + Pnjw1lN+4zzv8cfH+Y3GW5xOdx08+N5T2t/+9s3RPsdds/fWY/H5dM5bPwNHeT15E8+bEX2cj0 + fsz+m5U+IhmvljY1PrpuYPz8yS+efWjvVOrebXcKaPS9fTiJqKxc+aFutnlKYOWowN67fW+2o0 + +f7aP897bTVztrg39JtR33nwDJvvP635jaVnWCve5/N4rldpUa/aOejPt74b69UTW+8pY96qzS + XteO2zgnb+1Hh/3i72smDPnsuPPfnkfUeWv7545MCBW591G73+eqfhiwM0+H27tUM9I5i4Nee0 + wGadn7CJ16k9Nnbqe13L99679pu15x0a6Dcab3E6Dx1ZHQyntO/du0na57hr9t56LD6fPuetn4 + GjzkHyJnXuLO/z63jEru16SjxEM39sbGpdqfaUDu2+Yv1BiX7t2uF4e70K/X8spjynzXuflRze + Xr/13lde276/3nqe99rK52zzvcT2WI37zoNn2Fz/eaYPj+r51rFavrdJ9w0j63t77ObYjIoV/X + mqH+7X21jqKWPe2vvs0T4rtNPjz9vFXhZcf/3u55544vD3Rlx3333TU+uXBZcN0zDdtyU9lrQ4 + Rpb0WNICm7h3WIvTPffcfNpvdj/35JNjPE/rs06nu/bvv+W09jdujHa/1yl37f57jLeUl5a04G + VpT7AUK7SMO3d6su85N/VNfZecp71zUqvJkh5LWkbX91afZ+N5PsyrrViN+87DayJvxp3fGr8h + TpsRp9HeF/caG17YM497zq2pVYve2pONP28Xe1nw1rdeevT737//keWvQ4984hM3PeY2eu21l6 + w0HBqgwe/brR3qGcHErTmnBTbr/IRNvE7tsbFT3+taXhn3Kb9Ze97hgX6j8Ran8/Aj99yz1n7d + dZdtkPY57pq9tx6Lz6fPeetn4KhzkLxJnTvL+/w6HrFru54SD9HMHxubWleqPaVDu69Yf1CiX7 + t2ON5er0L/H4spz2nz3mclh7fXb733lde276+3nue9tvI523wvsT1W477z4Bk213+e6cOjer51 + rJbvbdJ9w8j63h67OTajYkV/nuqH+/U2lnrKmLf2Pnu0zwrt9PjzdrGXBddee9GRp546/NCI62 + Mf+83vrl8W7BqmYbpvS3osaXGMLOmxpAU2ce+wFqePf9z7jfO8B4Z4nt5nnc4HHrrrLq/94g3S + vs6N7dzHnDX4vIy7pZq1pAWf3xyf7503PefvOTc5nPbA3uw1Zz9aNsNvLMVpdH1v9Xk2nufDet + uK1bjvPLwm8ob61pwHFvOGHN6MHO59LpAHY/LAn7eLvSx485t3PfbUU1/60ojrox+98Z/dRq+6 + apyG6b4t6bGkxTGypMeSFtjEvcNqnJznPf30GM/T+qzT6S7P8uqrN0e736vXPvKswedl+W6pZi + 1pwec3z+d79ZU987Ln3ORw2gN7s9ec/WjZDL+xFKfR9W2NRVhvlvpQa6ws6UEL3qc5K8PnzF59 + n0aTpRzufS6cTXvV5MBS3Bd7WXDVVRd87+jRL//FiOvOO9/1rfXLgnEapvu2pMeSFsfIkh5LWm + AT9w57cXq3Kb/ReO6HP/wbG6v9zjttcbeUl5a04GXpPshSrNAy7tzpyb7n3NQ39a3pOfzY3jmp + 1WRJjyUto+vbWp8X5pWlWFnSMjpviJP8+zdLeWNJCzk8rrchD8Y8i/jzdrGXBVdccf6/P/PMV/ + 5wxHXHHb/+NbfRkRqm+7akx5IWx8iSHktaYBP3DuLUzlc/9CFbXqk5L8gDakSTL34sebMZeXO2 + xannfnvOTa+SPo97s9d4IFrwPk2+WDgzLeXsHDtL+ixp4VzYDK8hTpzfJWdC77zBy8b4h+e+2M + uCyy57/SPPPvvV3xtxfeAD7/xrt9FLL33dMA3TfVvSY0mLY2RJjyUtsIl7h9U4Oc977rkxnqf1 + WafTXZ7l7t0/uzHa/V699pFnDT4vy3dLNWtJCz6/eT7fq6/smZc95yaH0x7Ym73m7EfLZviNpT + iNrm9rLMJ6s9SHWmNlSQ9a8D7NWRk+Z/bq+zSaLOVw73PhbNqrJgeW4r7Yy4JVYX3n2LG//WTs + CoScrB03vf/223/1vtMvC5Iapvd4PS00h3No9Ui0uDWk43qzCWPpfk5xrNGT2/OSWkpikNPfi8 + 0cl+lnuXj1zuGeXHJxWppNzut6eFBsTm1cJdokYzTxbqFd4wvSs6nU5zVacrm7JBut7lIvk64j + HVcapyl7jVdqYyatQcl+l/QyiZ65Hkta+1Iu0jj1YKNhkPOVcL8955Yy8/HTas+dcdJ6kuaKVa + 9xuqR5LI23dNxcDFprCdfQxEuqRZqrPep7jqGWf652auJkhY2GiZaHJk9S541bV+pLueehUr+Z + 0yfJMameUlaSnkVT215vqZ7YWpo8q+n7JHEaoUUSp/DMluROaZxiemq8uLWWmh5Uc35LzsIaLj + Vacnmj9WRpfac8I7emNA+0THPrxupFokerJRcXqRbNujnf8vsMxn1m9XOTf24IBeza9Zp/OH78 + wY/PXX6s/134c+zz2Lhwjfe975f/yo1NaQjXyM0t1Ty3X6mekGGOX05zjRZ3r0TPnAaNrpZslt + IiZRPyn/KMxXb6eW82Eg1+TEstubrP6ZJqKY2TVp9GT8oPc3VT40Expl77RRfF/ToXD4lPTGOh + 5ZvTnvN5jS/UMJbkQYmWXF7U+LxUj3TcUrGq0SOJ01y+xj5bwuel+y3JlZozZ3pvau0SXb3jpP + WhUI80JlLvm87fc25tbks8URKrkj1ZyBuN7lIvlq4hHVfjw6Vr9O5vc15Tkita79OyKdUkqSdt + Had6z1yPl9KjYSLxklCLlEVpfpRo0uaNpkeo0VPCKnxOSml12nK50ouNJs9KfVgapxFacnGay3 + 9pvFrnTanvuT201qLt81r6j5S/lFcPNr38JtUPSNaU7lXKTtqHt+6dYvNN+UjzxM8leRaRnvch + Pz93oK/ny4Jzv/X881//nfDyAnKfS8fNrXHrrb/45+7+XbvmNfh73Jjpv09/ns5bo8XNI9Gj0S + LRPMdFqsWNk+qJrRNjFo5vyWYJLaVsPE8pF2mspHHSrFtaU1ItnmGs3mJx9J9LcqY0TiW1JdUT + 80PJmrUelPeDV836dS4W0pj30F/DfS4HazXW6AnXlnLNxzV9BtZ6ptRXatho/EKip6eWXj4vjZ + Nk/6ma7sGmVFMPLbm+swWbuVqeO+vCcZL99py7xhMl2jU5LDkTzwbvk9aOdFzLOE35L+17mlzN + 9TDavjLWx4U1Lo1Jab+d2pdkbcmYGjalXhXuqyZnc35f2/O5+bX6UrVSq0erZfqcNLf20n1oiY + 9I81jLxpKWXJxGeHFJHku8WBsnCRtpjrTwYm3eaLS1ZtPLb0pyo6QfbvFsKOUvYS+dq7WvSteV + 9OB+n37O03/2e1lw/vnnfPPEiW98MLy8gNzn0nFza9x88y98zt1/3nnzGjS63NgaLe5+rZ7Yej + lmc/sKP9NqSe0/tZ50D1o90nmn2qT3aLVo2DgNmvGt80bKIBZTLZvUektr0XLXjvdsYp4nqcvc + mrUeFNNwyy1rr9y589xZv5ZqH6G/lnvItJaxtkakHlVSLzVacrGU6p6Os6Snp5YlfD7FvyRXes + apRk/POPk9a/RJ9ZT6imT+nnPP1b3UEyXaY2dJ616hRos175Pmp3RcDZtcnDTsSvrb3POPlEGr + HneTfHhuzxpeJXlT6lUtnlmlXiP1t1QfrO1DUz1CrZ7SOElqV5MvnpdWT0n/JNW1yVp8fKRxko + yr7ftK8ljyPKmNU46NND9anQvaHNboW4qNVFNMT0luhGtK9yrVuoS3SrWUPEOn6rVk3ZgGz93P + efrPfi8Ldu585UMvvPDQ7eHlBeQ+l46bW+OWW37+T9z9O3e+YlaDRpcbW6PF3a/VE1svx2xuX+ + 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 + Jncu06kvslcSrJ59KYSfRI9pWqVen9Ei0aNjU11VqL5yNlkTuPpfNIGUz3K51b6qulLEu0a86M + XC6VcJDuNaYzXLNEQ4kXS2NZM66GjYSDZIzXX6MllzclXlyjR5ozUj41WlJspOvnvE9S462Y1L + LQ5oKWkbQPDZnNrSP129o+q8RDtFzcGqWx07CR5GJrLdKzY0ScSvqc0jhpfFg6trWWUTWVqpeS + WqrJ4Rj73myk+5wbV5MHc/vtvdfS5y8po5KeUnoGz83t7z39Z7+XBRdf/Lp/PHbsawfmLi/C/y + 78WXJPbG73+fvf/ytfcHOmNIT35zSUaPZraPXktGi4hfvUanH3p/RItcbipdWj1aLRp9WSY7N0 + Hltik+O+ZD1J45TTLMvhB2c9L+VX0nquYXbm+k7ngy965SWXOL8u1y5lLN2rhJe0XjVxrWEs0a + PRUsNKokUTsxLd0xguoUeqsbWWJXxeure5cdJ7Nb2TZs7SmuoVJ432VA5r5pEwmO5XM/dUY+y+ + kKUmT7TapX2/xH9KONTkjYaL5IyS1pR0Xek4Wa8iez6TxKnkrFoiTpr8kejR8JfUTU2cYnHRPg + dI8jjFpjcTSVzCPWg0SfwzxahEX6qmlsibkp5FU0t+/pZsStYv6UFLc0mjr5TLaC+W5k1p/UnP + S02PMcdsiVgt7cM5H4/p6ek3Es7SnlUT8xF7LTmPNfWsfRYprUHvTf7+03/2e1mwe/fr/uWHP/ + zq78auQMjJuXGSMXP3ffCD73zA3bt792tVGnLr5X4f26tETzh3bC3puBot7l7pOtJxNXo0a8yN + TeXh9HeSOGnYpHJaokmixxIbjZY5jhImboyES0mcvH6pDj9uS0/a8yQel/OY3O/Ltb8+6ZVSH0 + /p66ddd9bkdOR+v4SXaWsp1NS6RqzpidW3JP9bsznbfL7GWzUe2ytOGg2p/kBbEzlfme5XM3du + 3tiZqemVcmvUxCqsH83ea/p/qYcspUcaD+m4Gjala2hqS5oz0jhpxi3FJlc3Nb2Ev1cTK018NM + 9GJRqkWjR5MtUs1VQao9r+P7X/Uk2lrKa1k2M41Zbrt0r1zLFZyodj55HknMrxODNn0t9R1fSW + 0vqK9QfSvcTWkdZf6bOLls3SNSWpbynj3nnTi400N2rOY+2532uvmvO4h5dJ6k2yrvfsYGy/lw + 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 + AHyAFygBwgB8gBcoAcIAc2Mwd4WcAbLfNvtDCXzTQX4kbcyAFygBwgB8gBcoAcIAfIAXKAHCAH + yAFygBwgB8iBzckBXhbwsoCXBeQAOUAOkAPkADlADpAD5AA5QA6QA+QAOUAOkAPkADlADpADZ3 + kONHtZ8OYVyG+urm9Prt9f/fvuQdee1bq3rq53DFo/3LclPZa0OE6W9FjSApu4fxCndt5qjaXm + zLCm3ZIeS1rwsnS9WooVWsadOz3Z95yb+qa+Nee2H9s7J7WaLOmxpGV0fVtjwfO9/PnDUuzQMq + 630XixpTiN9j7LXtObDXkwpl5vD77Ld9/rf2h18Q8EIAABCEAAAhCAAAQgAAEIQAACEIAABCAA + AQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAA + EIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAAB + CEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQ + hAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEI + QAACEIAABCAAAQhAAAIQgAAEIAABCEAAAhCAAAQgAAEIQAACEIAABCAAAQhAAAIQ2LHj/wErRg + lhXMyFLgAAAABJRU5ErkJgggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAOgDzS8AAAEA6QMoAAAA + YBgAAOAQAACPEAAA6BcAAAUAAAAKAAAAAgAAAAMAAAABAAIAAAAAAQ8ACQRoEwAAAAAKBAQAAA + AKAAAADwDMD7oAAAAAAM0PCAAAAAAAAAABAAAAAQDDDxgAAAABAAAAAAAAAAEAAAAAAAAABAAA + AAGUEwAQALoPIAAAAHQAaABpAG4AawAtAGMAZQBsAGwAIABTAGwAaQBkAGUAIAC6DzIAAABUAE + MATABhAHkAbwB1AHQALgBBAGMAdABpAHYAZQBEAG8AYwB1AG0AZQBuAHQALgAxADAAug8gAAAA + dABoAGkAbgBrAC0AYwBlAGwAbAAgAFMAbABpAGQAZQAPAMwPug8AAAAAzQ8IAAAAAAAAAAEAAA + ABAMMPGAAAAAQAAAAAAAAAAgAAAAMAAAAFAAAAAJQTABAAug8SAAAAVwBvAHIAawBzAGgAZQBl + AHQAIAC6DxoAAABFAHgAYwBlAGwALgBTAGgAZQBlAHQALgA4ADAAug9AAAAATQBpAGMAcgBvAH + MAbwBmAHQAIABPAGYAZgBpAGMAZQAgAEUAeABjAGUAbAAgAFcAbwByAGsAcwBoAGUAZQB0AAAA + wQ/+DgAACAAAAOwJAADABwAAAQAJAAADeQcAAAEAIQYAAAAABAAAAAMBCAAFAAAACwIAAAAABQ + AAAAwCSwBgAAUAAAAJAgAAAAAFAAAAAQL///8ApQAAAEELxgCIACAAIAAAAAAAIAAgAAAAIAAo + AAAAIAAAAEAAAAABAAEAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///wAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAP/////8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAAAfwAAAH8AAAB/AAA + AfwAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAGAAAABgAAAAYAAAAOAAA + AHgAAAD4AAAB+AAAA//AAAf/wAAP//////IQYAAEELRgBmACAAIAAAAAAAIAAgAAAAIAAoAAAA + IAAAACAAAAABABgAAAAAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvaaUjHFac2FKa1E5Y0kxY0 + kxY0kxY0kxY0kxY0kxY0kxY0kxY0kxY0kxY0kxY0kxY0kxY0kxY0kxY0kxY0kxY0kxY0kxY0kx + Y0kxAAAAAAAAAAAAAAAAAAAAAAAAAAAAvaaU/+/e3s/G3se13r6t3r6l57aU57aM57aM57aM57 + aM57aM766E766E766E766E76Z776Z796Zz96Zz955r955j955j955jY0kxAAAAAAAAAAAAAAAA + AAAAAAAAAAAAvaaU/+/n/+/n/+/n/+/n/+/e/+/e/+/e/+/e/+/e/+fe/+fe/+fe/+fW/+fW/+ + fW/+fW/+fW/+fO/9/O/9/O/9/O/9/O955jY0kxAAAAAAAAAAAAAAAAAAAAAAAAAAAAvaac/+/n + /+/n/+/n/+/n/+/n/+/n/+/n/+/n/+/e/+/e/+/e/+/e/+fe/+fe/+fW/+fW/+fW/+fW/+fW/+ + fO/9/O/9/O955jY0kxAAAAAAAAAAAAAAAAAAAAAAAAAAAAvaac/+/n/+/n3raU3raU1q6U1q6M + 1q6M1q6M1q6MtY5rtY5rtY5rtY5rtY5rtY5rtY5rtY5rtY5rtY5r/+fW/+fO/+fO955rY0kxAA + AAAAAAAAAAAAAAAAAAAAAAAAAAvaac//fv//fv3raU//fv//fv//fv/+/v1q6M/+/n/+/n1q6M + ///3tY5r/+/e/+/e1qaE///3tY5r/+fW/+fW/+fW/+fO955rY0kxAAAAAAAAAAAAAAAAAAAAAA + AAAAAAva6c//fv//fv3rac//fv//fv//fv//fv1q6U//fv//fv1q6M///3tY5r/+/n/+/n1qaE + ///3tY5r/+fe/+fW/+fW/+fW96ZzY0kxAAAAAAAAAAAAAAAAAAAAAAAAAAAAva6c//fv//fv3r + ac3rac3rac3raU3raU3raU1q6U//fv1q6M///3tY5r/+/n/+/n1q6M///3tY5r/+/e/+fe/+fe + /+fW96ZzY0kxAAAAAAAAAAAAAAAAAAAAAAAAAAAAva6c//f3//f33r6c//f3//f3//f3//f33r + aU//fv//fv1q6U///3tY5r1q6M1q6M1q6M///3tY5r/+/e/+/e/+fe/+fe76Z7Y0kxAAAAAAAA + AAAAAAAAAAAAAAAAAAAAxq6c///3//f33r6l//f3//f3//f3//f33rac//f3//f33raU///3tY + 5r//fv//fv1q6M///3tY5r/+/n/+/n/+/e/+fe76Z7Y0kxAAAAAAAAAAAAAAAAAAAAAAAAAAAA + xq6c///3///3576l576l3r6l3r6c3r6c3rac3rac//f33raU3raUtY5r//fv//fv1q6M///3tY + 5r/+/n/+/n/+/n/+/e766EY0kxAAAAAAAAAAAAAAAAAAAAAAAAAAAAxq6c///3///3576l///3 + ///3///3///33r6c///3///3//f3//f3//f3//f3//fv1q6U1q6MtY5r/+/n/+/n/+/n/+/e76 + 6EY0kxAAAAAAAAOXFKOXFKOXFKMWlCMWlCMWlCKWFCKWFCKWFCIVkxIVkxIVkxGFExGFExGFEx + GEkp///3///33raU//f3//f3//f3//fv//fv//fv/+/n/+/n/+/n766EY0kxAAAAAAAAOXFKa6 + Z7Y6ZzY6ZzWp5zWp5zUpZrUpZrSpZaSpZaSpZaOY5SOY5SMY5KMY5KGEkp3r6c3rac3rac3rac + 3raU3raU3raU3q6U//fv//fv/+/v/+/n57aMY0kxAAAAAAAAQnlSa6Z77/fv7/fv5/fn5+/n5+ + /n3u/e3u/e3u/e3u/e3u/e3ufe3ufeMY5KGEkp////////3r6c///3///3//f3//f33raU//fv + //fv/+/v/+/n57aMY0kxAAAAAAAAQnlSc66E7/fv7/fv7/fv5/fn5+/n5+/n3u/e3u/e3u/e3u + /e3u/e3ufeOY5SGFEx////////3r6c///3///3///3//f33raU//fv//fv//fv//fv57aUY0kx + AAAAAAAAQoZac66E7/fv7/fv7/fv7/fv7/fv5+/nhK6MKVEpKVEpKVEpKVEp3u/eOY5SGFEx57 + 6l576l576l3r6l3r6c3r6c3rac3rac//f3//fv//fv//fv57aUY0kxAAAAAAAASoZje7aM9//3 + UqZaKVEpKVEpKVEpKVEpGHEYa7ZzSpZaSpZKIVkx3u/eSpZaIVkx////////576l////////// + /3///33rac//f3//f3//fv//fv576cY0kxAAAAAAAAUo5jhL6U9//39/f3UqZaY7ZzUqZaGHEY + e8eESpZaSpZKIVkxhK6M3u/eSpZaIVkx////////576l///////////3///33r6c//f3//f3// + fv//fv576cY0kxAAAAAAAAUpZrjLaU9//39//39//3UqZaMYYxhL6USpZaSpZKIVkxY55jY55j + 3u/eSpZaIVkx58et58et58et58el576l576l576l3r6l//f3//f3//f3//fv3r6lY0kxAAAAAA + AAWp5zlMec////9//39//3MYYxlMecWq5jUqZaMWlCAGkA5/fn5+/n5+/nUpZrKWFC//////// + 58et///////////////3576l///3//f3//f3//fv3r6lY0kxAAAAAAAAY6ZzlMec////////OZ + ZCnNela7ZzWq5jQoZKUqZaMYYxAGkA5/fn5+/nUpZrKWFC////////58et//////////////// + 3s/G3se13r6l3r6l3r6l3r6lY0kxAAAAAAAAa6Z7nNel////SpZKrde1c757c757SpZaUoZaY7 + ZrUqZaMYYxAGkA5/fnWp5zMWlC78+178+178+158et58et58etva6cjHFajHFajHFac2FKc2FK + a1E5Y0kxAAAAAAAAc66EnNel////Y7ZrY65rY65rUp5a9//39//3UoZaUoZaUoZaUoZa7/fvWp + 5zMWlC////////////////////////xq6c79e978+958+158et576tY0kxAAAAAAAAAAAAc66E + rde1////////////////////////9//39//39/f37/fv7/fv7/fvY6ZzOXFK////////////// + //////////xq6c/+/n/+/e99/W79fGY0kxAAAAAAAAAAAAAAAAe7aMrde1//////////////// + ////////////9//39//39/f37/fv7/fvY6ZzOXFK78+978+9////////////////xral/+/n/+ + /e99/WY0kxAAAAAAAAAAAAAAAAAAAAe7aMrde1rde1nNelnNellMeclMeclMecjLaUhL6Ue7aM + c66Ec66Ec66Ea6Z7OXFK////////////////////////xral/+/n/+/ea1E5AAAAAAAAAAAAAA + AAAAAAAAAAhL6Ue7aMc66Ec66Ea6Z7Y6ZzWp5zUpZrUo5jSoZjSoZjQoZaQnlSQnlSOXFKOXFK + ////////////////////////xral/+/njHFaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAA1r61//////////////////////////////////////////////////////////// + ////zralnIZzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1r611r611r + 611r611r6tzr6tzr6tzr6tzr6tzr6tzr6tzr6tzr6tzratzratzralzralzralAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + CgAAACYGDwAJAEljb25Pbmx5AAAFAAAACQIAAAAABQAAAAIBAQAAABwAAAD7AvX/AAAAAAAAkA + EAAAAAAAAAAFRhaG9tYQAAzhQKtcSjEwBArfN3Sa3zdyBA9XcxEGbSBAAAAC0BAAAFAAAALgEG + AAAAEwAAADIKJAAwABAABAAAAAAAYABLAE1pY3Jvc29mdCBFeGNlbCAQAAAAMgoxADAACQAEAA + AAAABgAEsAV29ya3NoZWV0IAUAAAAuAQEAAAAoAAAAJgYPAEYAQzpcV0lOTlRcSW5zdGFsbGVy + XHs5MDExMDQwOS02MDAwLTExRDMtOENGRS0wMTUwMDQ4MzgzQzl9XHhsaWNvbnMuZXhlAAYAAA + AmBg8AAgAxAAMAAAAAAA8A1w9kAQAAAADTDwQAAAAGAAAAAAC6D6QAAABoAHQAdABwADoALwAv + AHcAaQBrAGkAcwAuAGkAbgAuAG4AbwBrAGkAYQAuAGMAbwBtAC8AUwBEAEQAaQBmAGYAZQByAG + UAbgB0AGkAYQB0AGkAbgBnAFMAVwAvAEQAUwBXAF8AWAAwAF8ATQBpAGwAZQBzAHQAbwBuAGUA + XwBDAHIAaQB0AGUAcgBpAGEAXwBEAHIAYQBmAHQAXwB2ADAAXwAyABAAug+kAAAAaAB0AHQAcA + A6AC8ALwB3AGkAawBpAHMALgBpAG4ALgBuAG8AawBpAGEALgBjAG8AbQAvAFMARABEAGkAZgBm + AGUAcgBlAG4AdABpAGEAdABpAG4AZwBTAFcALwBEAFMAVwBfAFgAMABfAE0AaQBsAGUAcwB0AG + 8AbgBlAF8AQwByAGkAdABlAHIAaQBhAF8ARAByAGEAZgB0AF8AdgAwAF8AMgAPANcPZAEAAAAA + 0w8EAAAACgAAAAAAug+kAAAAaAB0AHQAcAA6AC8ALwB3AGkAawBpAHMALgBpAG4ALgBuAG8Aaw + BpAGEALgBjAG8AbQAvAFMARABEAGkAZgBmAGUAcgBlAG4AdABpAGEAdABpAG4AZwBTAFcALwBE + AFMAVwBfAFgAMABfAE0AaQBsAGUAcwB0AG8AbgBlAF8AQwByAGkAdABlAHIAaQBhAF8ARAByAG + EAZgB0AF8AdgAwAF8AMgAQALoPpAAAAGgAdAB0AHAAOgAvAC8AdwBpAGsAaQBzAC4AaQBuAC4A + bgBvAGsAaQBhAC4AYwBvAG0ALwBTAEQARABpAGYAZgBlAHIAZQBuAHQAaQBhAHQAaQBuAGcAUw + BXAC8ARABTAFcAXwBYADAAXwBNAGkAbABlAHMAdABvAG4AZQBfAEMAcgBpAHQAZQByAGkAYQBf + AEQAcgBhAGYAdABfAHYAMABfADIADwDyA3IDAAAvAMgP6gAAADAA0g8EAAAAAgAAAAAAug8oAA + AAGCAcIAj/FDA7/1v/CDAKMAwwDjAQMOX/BP8kACgAWwBcAHsAYv/h/xAAug+mAAAAATACMAz/ + Dv/7MBr/G/8f/wH/mzCcMP0w/jCdMJ4wBTD8MBkgHSAJ/xUwPf9d/wkwCzANMA8wETCwADAgMi + AzIAMh4P8F/0EwQzBFMEcwSTBjMIMwhTCHMI4woTCjMKUwpzCpMMMw4zDlMOcw7jD1MPYwIQAl + ACkALAAuADoAOwA/AF0AfQBh/2P/ZP9l/2f/aP9p/2r/a/9s/23/bv9v/3D/nv+f/w8A1QfIAQ + AAAAC3D0QAAABOAG8AawBpAGEAIABTAGEAbgBzACAAVwBpAGQAZQAAALyoEwC8qBMAbJYTAGCV + EwAcNikwYJUTAAgAAAAPANUHAAAGIhAAtw9EAAAAQQByAGkAYQBsAAAAUwBhAG4AcwAgAFcAaQ + BkAGUAAAC8qBMAvKgTAGyWEwBglRMAHDYpMGCVEwAIAAAADwDVBwAABAAgALcPRAAAAE4AbwBr + AGkAYQAgAEwAYQByAGcAZQAAAGkAZABlAAAAvKgTALyoEwBslhMAYJUTABw2KTBglRMACAAAAA + 8A1QcAAAYiMAC3D0QAAABOAG8AawBpAGEAIABTAGEAbgBzAAAAAABpAGQAZQAAALyoEwC8qBMA + bJYTAGCVEwAcNikwYJUTAAgAAAAPANUHAAAGIkAAtw9EAAAAUwBpAG0AUwB1AG4AAABhAG4Acw + AAAAAAaQBkAGUAAAC8qBMAvKgTAGyWEwBglRMAHDYpMGCVEwAIAAAADwDVB4YABAJQALcPRAAA + AFYAZQByAGQAYQBuAGEAAABuAHMAAAAAAGkAZABlAAAAvKgTALyoEwBslhMAYJUTABw2KTBglR + MACAAAAA8A1QcAAAYiAACkDwgAAACAAEAAAAAAAAAApQ8QAAAAAAAQiC4AAAAAAOABAgAAAAAA + qQ8KAAAABwAAAAIACQQAAEAAow9uAAAABQD//T8ABAAiIAEAZAAAAAAEAABkAA8ADwAAAAAAQA + IAAAAAAgAAAP//7wAAAAAA//8AAP//EgAAAAABAAAABQAAIAEgAQAAAAAABQAAQAJAAgAAAAAA + BQAAYANgAwAAAAAABQAAgASABAAAAAAPAAsEdgoAAA8AAPBuCgAAAAAG8CgBAAABjAAAJAAAAN + 4CAAAjAAAADwAAAGcAAAAhAAAACAAAAAEAAAAKAAAAIwAAAAoAAAARAAAAEgAAABMAAAAGAAAA + FQAAAN0AAAAXAAAAKAAAABkAAAAEAAAAGwAAAOcAAAAdAAAALAAAAB8AAAAGAAAADgAAAAQAAA + AQAAAABAAAABIAAAAEAAAAFAAAAAQAAAAWAAAABAAAABgAAAAEAAAAGgAAAAQAAAAcAAAABAAA + AB4AAAAEAAAAIAAAAAQAAAAiAAAABAAAAA0AAAACAAAADAAAAAEAAAALAAAAAQAAAAoAAAABAA + AACQAAAAEAAAAIAAAAAQAAAAcAAAABAAAABgAAAAEAAAAFAAAAAQAAAAQAAAABAAAAAwAAAAEA + AAACAAAAAQAAAF8AAfDcAAAAMgAH8CQAAAADBFpSSf52ugV0Qw2h4sySG6v/AMEEAAABAAAAAA + AAAAAAAABiAAfwJAAAAAYGvzXfp868n+DX1bQZK52w5P8AewsAAAEAAADBBAAAAAAAAGIAB/Ak + AAAABgaiac2Nad4RX3G7A1DIGZc7/wBeCwAAAQAAADwQAAAAAAAAYgAH8CQAAAAGBlCrFhQ7Dq + 2LBpgSLEmzJqf/APg2AAABAAAAmhsAAAAAAABiAAfwJAAAAAYG15MjlLgdtyXpLai8jI18lf8A + nCMAAAEAAACSUgAAAAAAAAMIC/AAAwAAgQB4YQEAggCirQAAgwB4YQEAhACirQAAhQACAAAAhw + ABAAAAiAAAAAAAiQAAAAAAvwACAA8ADAH0AAAQDQEAAAAgDgEAAAAggAEAAAAAgQEAAAAIggEA + AAEAgwH///8AhAEAAAEAhQEAAAAghsEAAAAAh8EAAAAAiAEAAAAAiQEAAAAAigEAAAAAiwEAAA + AAjAEAAAAAjQEAAAAAjgEAAAAAjwEAAAAAkAEAAAAAkQEAAAAAkgEAAAAAkwEAAAAAlAEAAAAA + lQEAAAAAlgEAAAAAl8EAAAAAmAEAAAAAmQEAAAAAmgEAAAAAmwEAAAAAnAEDAABAvwEcAB4AwA + EBAAAIwQEAAAEAwgH///8AwwEAAAAgxAEAAAAAxcEAAAAAxsEAAAAAxwEAAAAAyAEAAAAAyQEA + AAAAygEAAAAAywE1JQAAzAEAAAgAzQEAAAAAzgEAAAAAz8EAAAAA1wECAAAA/wEOAA4AAAIAAA + AAAQICAAAIAgLLy8sAAwIAAAAgBAIAAAEABQI4YwAABgI4YwAABwIAAAAACAIAAAAACQIAAAEA + CgIAAAAACwIAAAAADAIAAAEADQIAAAAADgIAAAAADwIAAQAAEAIAAAAAEQIAAAAAPwIAAAMAgA + IAAAAAgQIAAAEAggIFAAAAgwKcMQAAhAIAAAAAhQLw+QYAhgIAAAAAhwL3AAAQiAIAAAAgvwIB + AA8AwAIAAAAAwQIAAAAAwgJkAAAAwwIAAAAAxAIAAAAAxQIAAAAAxgIAAAAAxwIAAAAAyAIAAA + AAyQIAAAAAygIwdQAAywLQEhMAzAIw7ez/zQJAVIkAzgIAgAAAzwIAgP//0AIAAHn/0QIyAAAA + 0gIgTgAA0wJQwwAA1AIAAAAA1QIQJwAA1gJwlAAA1wKwPP//2AIAAAAA2QIQJwAA2gJwlAAA/w + IWAB8ABAMBAAAAQQOoKQEAQgMAAAAAQwMDAAAARAN8vgEARQMAAAAAfwMAAA8AhAN8vgEAhQMA + AAAAhgN8vgEAhwMAAAAAcw0i8QoFAACMAAEAAACNADBlAQB/AQAAQACeAf////+fAf////+gAQ + AAACChwQAAAACiAf////+jAf////+kAQAAACClwQAAAACmAf////+nAf////+/AQAAIADZAf// + ///aAf/////bAQAAACDcwQAAAADdAf/////eAf/////fAQAAACDgwQAAAADhAf/////iAf//// + //AQAAwAASAv////8TAv////8UAgAAACAVwgAAAAAWAv////8XAv////8YAgAAACAZwgAAAAAa + Av////8bAv////+JAv////+KAv////+LAgAAACCMwgAAAACNAv////+PAwAAAACQAwIAAACRAw + AAAACSAwIAAAC/AwCCAIJABQAAAABBBQAAAQBCBf///wBDBQAAACBEBQAAAABFxQAAAABGxQAA + AABHBQAAAABIBQAAAABJBQAAAABKBQAAAABLBTUlAABMBQAACABNBQAAAABOBQAAAABPxQAAAA + BQBQAAAABRBQAAAABSBQEAAABTBQEAAABUBQEAAABVBQEAAABXBQIAAABZBf////9aBf////9b + BQAAACBcxQAAAABdBf////9eBf////9fBQAAACBgxQAAAABhBf////9iBf////9/BQYATgCABQ + AAAACBBQAAAQCCBf///wCDBQAAACCEBQAAAACFxQAAAACGxQAAAACHBQAAAACIBQAAAACJBQAA + AACKBQAAAACLBTUlAACMBQAACACNBQAAAACOBQAAAACPxQAAAACQBQAAAACRBQAAAACSBQEAAA + CTBQEAAACUBQEAAACVBQEAAACXBQIAAACZBf////+aBf////+bBQAAACCcxQAAAACdBf////+e + Bf////+fBQAAACCgxQAAAAChBf////+iBf////+/BQYATgDABQAAAADBBQAAAQDCBf///wDDBQ + AAACDEBQAAAADFxQAAAADGxQAAAADHBQAAAADIBQAAAADJBQAAAADKBQAAAADLBTUlAADMBQAA + CADNBQAAAADOBQAAAADPxQAAAADQBQAAAADRBQAAAADSBQEAAADTBQEAAADUBQEAAADVBQEAAA + DXBQIAAADZBf/////aBf/////bBQAAACDcxQAAAADdBf/////eBf/////fBQAAACDgxQAAAADh + Bf/////iBf//////BQYATgAABgAAAAABBgAAAQACBv///wADBgAAACAEBgAAAAAFxgAAAAAGxg + AAAAAHBgAAAAAIBgAAAAAJBgAAAAAKBgAAAAALBjUlAAAMBgAACAANBgAAAAAOBgAAAAAPxgAA + AAAQBgAAAAARBgAAAAASBgEAAAATBgEAAAAUBgEAAAAVBgEAAAAXBgIAAAAZBv////8aBv//// + 8bBgAAACAcxgAAAAAdBv////8eBv////8fBgAAACAgxgAAAAAhBv////8iBv////8/BgYATgBA + BgAAAABBBgAAAQBCBv///wBDBgAAACBEBgAAAABFxgAAAABGxgAAAABHBgAAAABIBgAAAABJBg + AAAABKBgAAAABLBjUlAABMBgAACABNBgAAAABOBgAAAABPxgAAAABQBgAAAABRBgAAAABSBgEA + AABTBgEAAABUBgEAAABVBgEAAABXBgIAAABZBv////9aBv////9bBgAAACBcxgAAAABdBv//// + 9eBv////9fBgAAACBgxgAAAABhBv////9iBv////9/BgYADgCAABrxIAAAAP//mQCv1PAA/+gF + AAAzzADr6dgA5A5iAHLPUQCZzAAAQAAe8RAAAAAHAAAI5A5iAAQAAAjh8P8AHwDwDzgAAAAAAP + MDFAAAAAYAAAAEAAAAAAAAAAQAAIAAAAAAAADzAxQAAAAHAAAABAAAAAAAAAAmAACAAAAAAA8A + 0AdbAwAAHwAUBBwAAAAAABUEFAAAACGA8QUAypo7xCZvOADKmjsBAQAAHwATBDwAAAAAAP0DNA + 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 + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHyQzU7DMBCE70i8g+Urih04II + Sa9MDPEZAoD7A4m8Sq/+TdVs3b46RFQqhwsta7M/NpVuuDd2KPmWwMjbxWtRQYTOxsGBr5sXmu + 7qQghtCBiwEbOSHJdXt5sdpMCUkUdaBGjszpXmsyI3ogFROGsulj9sBlzINOYLYwoL6p61ttYm + AMXPHsIdvVI/awcyyeDuX7SJLRkRQPx8M5q5GQkrMGuJDqfeh+pVSnBFWUyw2NNtFVwZD6bMK8 + +TvgpHst1WTboXiDzC/gC4Zm+HT4zpNDUv+bnKGMfW8NdtHsfGlApYxU3gXYO/XD+ptcL0W3Xw + AAAP//AwBQSwMEFAAGAAgAAAAhAO3kDEu7AAAAJgEAAAsACAJfcmVscy8ucmVscyCiBAIooAAC + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + AAfwABAO8BgABAa8MFhwABAAAAvwAEAAQAvwEBABEA/wEBABkAPwMAAAgAgMMYAAAAvwMAAAIA + UgBlAGMAdABhAG4AZwBsAGUAIAAyAAAAEwAi8QYAAAD/AQAAQAAAABDwCAAAAAAAdADsF8cCDw + AR8BAAAAAAAMMLCAAAAAAAAAABABMADwAN8FQAAAAAAJ8PBAAAAAAAAAAAAKgPIAAAAENsaWNr + IHRvIGVkaXQgTWFzdGVyIHRpdGxlIHN0eWxlAACiDwYAAAAhAAAAAAAAAKoPCgAAACEAAAABAA + AAAAAPAATwrgUAABIACvAIAAAAAwwAAAAKAADTAAvwZgAAAH8AAQDvAYAAIGHDBYEAeGEBAIIA + oq0AAIMAeGEBAIQAoq0AAL8ABAAEAL8BAQARAMsBnDEAAP8BAQAZAD8DAAAIAIDDGAAAAL8DAA + ACAFIAZQBjAHQAYQBuAGcAbABlACAAMwAAABMAIvEGAAAA/wEAAEAAAAAQ8AgAAADHAnoA8xcD + Dw8AEfAQAAAAAADDCwgAAAABAAAAAgATAA8ADfDyBAAAAACfDwQAAAABAAAAAACgD6YEAABOAG + 8AawBpAGEAIABQAG8AdwBlAHIAUABvAGkAbgB0ACAAMgAwADAAOAAgAFQAZQBtAHAAbABhAHQA + ZQAsACAAQQA0ACAACwBUAGkAdABsAGUAIABmAG8AbgB0ADoAIABOAG8AawBpAGEAIABMAGEAcg + BnAGUAIABiAG8AbABkACAAMwAyACAAcAB0AAsAQwBvAHAAeQAgAGYAbwBuAHQAOgAgAE4AbwBr + AGkAYQAgAFMAYQBuAHMAIABXAGkAZABlACAAMgAwACAAcAB0ACAAKAByAGUAZwB1AGwAYQByAC + wAIABiAG8AbABkACAAbwByACAAaQB0AGEAbABpAGMAKQANADEAcwB0ACAATABlAHYAZQBsACAA + QgB1AGwAbABlAHQADQAyAG4AZAAgAEwAZQB2AGUAbAAgAEIAdQBsAGwAZQB0ACAAKABzAGkAeg + BlADoAIAAxADgAIABwAHQAKQANADMAcgBkACAATABlAHYAZQBsACAAQgB1AGwAbABlAHQAIAAo + AHMAaQB6AGUAOgAgADEANgAgAHAAdAApAA0ANAB0AGgAIABMAGUAdgBlAGwAIABCAHUAbABsAG + UAdAAgACgAcwBpAHoAZQA6ACAAMQA0ACAAcAB0ACkADQBGAG8AbwB0AGUAcgAgACgAZgBvAG4A + dAA6ACAATgBvAGsAaQBhACAAUwBhAG4AcwAgAFcAaQBkAGUALAAgADgAIABwAHQAKQA6AAsAHC + CpADIAMAAwADgAIABOAG8AawBpAGEAIAAgACAAVgAxACAARgBpAGwAZQBuAGEAbQBlACAALgBw + AHAAdAAgAC8AIAB5AHkAeQB5AC0AbQBtAC0AZABkACAALwAgAEkAbgBpAHQAaQBhAGwAcwAdIC + AAaQBzACAAcwBlAHQAIAB2AGkAYQAgABwgSQBuAHMAZQByAHQAHSAgAG0AZQBuAHUAIAAvACAA + HCBTAGwAaQBkAGUAIABuAHUAbQBiAGUAcgAdIBMgIABOAE8AVAAgAHYAaQBhACAAUwBMAEkARA + BFACAATQBBAFMAVABFAFIADQBOAG8AawBpAGEAIABQAG8AdwBlAHIAUABvAGkAbgB0ACAAcABy + AGUAcwBlAG4AdABhAHQAaQBvAG4AcwAgAHMAaABvAHUAbABkACAAYQBsAHcAYQB5AHMAIABiAG + UAIABtAGEAcgBrAGUAZAAgAHcAaQB0AGgAIAB0AGgAZQAgAGEAcABwAHIAbwBwAHIAaQBhAHQA + ZQAgAGwAZQB2AGUAbAAgAG8AZgAgAGMAbwBuAGYAaQBkAGUAbgB0AGkAYQBsAGkAdAB5ADoAIA + BDAG8AbQBwAGEAbgB5ACAAQwBvAG4AZgBpAGQAZQBuAHQAaQBhAGwAIAAoAGQAZQBmAGEAdQBs + AHQAKQAsACAAQwBvAG4AZgBpAGQAZQBuAHQAaQBhAGwAIABvAHIAIABTAGUAYwByAGUAdAAuAC + AATQBvAHIAZQAgAGkAbgBmAG8AIABmAHIAbwBtACAAQwBvAHIAcABvAHIAYQB0AGUAIABTAGUA + YwB1AHIAaQB0AHkAIAB3AGUAYgAuAAAAog8eAAAAkwAAAAAAHwAAAAEAHwAAAAIAHwAAAAMAZA + EAAAAAAACqDwoAAABUAgAAAQAAAAAADwAE8H8JAAASAArwCAAAAAQMAAAACgAA0wAL8GYAAAB/ + AAEA7wGAACAUwwWBAHhhAQCCAKKtAACDAHhhAQCEAKKtAAC/AAQABAC/AQEAEQDLAZwxAAD/AQ + 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 + 0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/Pg0KPGE6Y2xyTWFwIHhtbG5zOmE9Imh0dHA6Ly9z + Y2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9kcmF3aW5nbWwvMjAwNi9tYWluIiBiZzE9Imx0MS + IgdHgxPSJkazEiIGJnMj0ibHQyIiB0eDI9ImRrMiIgYWNjZW50MT0iYWNjZW50MSIgYWNjZW50 + Mj0iYWNjZW50MiIgYWNjZW50Mz0iYWNjZW50MyIgYWNjZW50ND0iYWNjZW50NCIgYWNjZW50NT + 0iYWNjZW50NSIgYWNjZW50Nj0iYWNjZW50NiIgaGxpbms9ImhsaW5rIiBmb2xIbGluaz0iZm9s + SGxpbmsiLz6wAB4E8wUAAFBLAwQUAAYACAAAACEATY7z/P0AAAC7AQAAEwAAAFtDb250ZW50X1 + R5cGVzXS54bWx8kMtOxDAMRfdI/EOULWrSYYEQajsLHisELIYPsBK3jchLcTqa/j1pZ5AADaws + P67PtZvtwVm2x0Qm+JZvRM0ZehW08UPL33dP1S1nlMFrsMFjy2ckvu0uL5rdHJFYUXtq+ZhzvJ + OS1IgOSISIvnT6kBzkkqZBRlAfMKC8rusbqYLP6HOVlx28ax6wh8lm9ngo5aOThJY4uz8OLqyW + Q4zWKMjFqdx7/YtSnQiiKNcZGk2kq2KDy7OEpfM34KR7La9JRiN7g5RfwBUbUieSZEvxGeYw5R + /JRvy/9ozv0PdGoQ5qcuUnIiakEtcTnBXfQF+3yPX13ScAAAD//wMAUEsDBBQABgAIAAAAIQBw + 8DjcvgAAADgBAAALAAAAX3JlbHMvLnJlbHOEj8EKwjAQRO+C/xD2btN6EJGmvYggeBL9gCXZts + E2Cdko9u/N0YLgcRjmzUzdvqdRvCiy9U5BVZQgyGlvrOsV3G+nzR4EJ3QGR+9IwUwMbbNe1Vca + MeUQDzawyBTHCoaUwkFK1gNNyIUP5LLT+ThhyjL2MqB+YE9yW5Y7Gb8Z0CyY4mwUxLOpQNzmkJ + v/s33XWU1Hr58TufSjQvJoDV1w9s+UsRh7SgpM5G9jIaoi7wfZ1HLxt/kAAAD//wMAUEsDBBQA + BgAIAAAAIQByMEDFwAIAANoHAAAhAAAAZHJzL3NsaWRlTGF5b3V0cy9zbGlkZUxheW91dDEueG + 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 + UAIABiAG8AbABkACAAMwAyACAAcAB0AAsAQwBvAHAAeQAgAGYAbwBuAHQAOgAgAE4AbwBrAGkA + YQAgAFMAYQBuAHMAIABXAGkAZABlACAAMgAwACAAcAB0ACAAKAByAGUAZwB1AGwAYQByACwAIA + BiAG8AbABkACAAbwByACAAaQB0AGEAbABpAGMAKQANADEAcwB0ACAATABlAHYAZQBsACAAQgB1 + AGwAbABlAHQADQAyAG4AZAAgAEwAZQB2AGUAbAAgAEIAdQBsAGwAZQB0ACAAKABzAGkAegBlAD + oAIAAxADgAIABwAHQAKQANADMAcgBkACAATABlAHYAZQBsACAAQgB1AGwAbABlAHQAIAAoAHMA + aQB6AGUAOgAgADEANgAgAHAAdAApAA0ANAB0AGgAIABMAGUAdgBlAGwAIABCAHUAbABsAGUAdA + AgACgAcwBpAHoAZQA6ACAAMQA0ACAAcAB0ACkADQBGAG8AbwB0AGUAcgAgACgAZgBvAG4AdAA6 + ACAATgBvAGsAaQBhACAAUwBhAG4AcwAgAFcAaQBkAGUALAAgADgAIABwAHQAKQA6AAsAHCCpAD + IAMAAwADgAIABOAG8AawBpAGEAIAAgACAAVgAxACAARgBpAGwAZQBuAGEAbQBlACAALgBwAHAA + dAAgAC8AIAB5AHkAeQB5AC0AbQBtAC0AZABkACAALwAgAEkAbgBpAHQAaQBhAGwAcwAdICAAaQ + BzACAAcwBlAHQAIAB2AGkAYQAgABwgSQBuAHMAZQByAHQAHSAgAG0AZQBuAHUAIAAvACAAHCBT + AGwAaQBkAGUAIABuAHUAbQBiAGUAcgAdIBMgIABOAE8AVAAgAHYAaQBhACAAUwBMAEkARABFAC + AATQBBAFMAVABFAFIADQBOAG8AawBpAGEAIABQAG8AdwBlAHIAUABvAGkAbgB0ACAAcAByAGUA + cwBlAG4AdABhAHQAaQBvAG4AcwAgAHMAaABvAHUAbABkACAAYQBsAHcAYQB5AHMAIABiAGUAIA + BtAGEAcgBrAGUAZAAgAHcAaQB0AGgAIAB0AGgAZQAgAGEAcABwAHIAbwBwAHIAaQBhAHQAZQAg + AGwAZQB2AGUAbAAgAG8AZgAgAGMAbwBuAGYAaQBkAGUAbgB0AGkAYQBsAGkAdAB5ADoAIABDAG + 8AbQBwAGEAbgB5ACAAQwBvAG4AZgBpAGQAZQBuAHQAaQBhAGwAIAAoAGQAZQBmAGEAdQBsAHQA + KQAsACAAQwBvAG4AZgBpAGQAZQBuAHQAaQBhAGwAIABvAHIAIABTAGUAYwByAGUAdAAuACAATQ + BvAHIAZQAgAGkAbgBmAG8AIABmAHIAbwBtACAAQwBvAHIAcABvAHIAYQB0AGUAIABTAGUAYwB1 + AHIAaQB0AHkAIAB3AGUAYgAuAAAAog8eAAAAkwAAAAAAHwAAAAEAHwAAAAIAHwAAAAMAZAEAAA + AAAACqDwoAAABUAgAAAQAAAAAADwAE8GIJAAASAArwCAAAAAYQAAAACgAA0wAL8GYAAAB/AAEA + 7wGAAIDk9gaBAHhhAQCCAKKtAACDAHhhAQCEAKKtAAC/AAQABAC/AQEAEQDLAZwxAAD/AQEAGQ + A/AwAACACAwxgAAAC/AwAAAgBSAGUAYwB0AGEAbgBnAGwAZQAgADQAAAAjACLxIQgAAP8BAABA + AKnDFQgAAFBLAwQUAAYACAAAACEAWuMRZv4AAADiAQAAEwAAAFtDb250ZW50X1R5cGVzXS54bW + yUkU1PxCAQhu8m/gcyV9NSPRhjSvdg9ahG1x8wgWlLtgXCYN3999L9uBjXxCPMvM/7BOrVdhrF + TJGtdwquywoEOe2Ndb2Cj/VTcQeCEzqDo3ekYEcMq+byol7vArHIaccKhpTCvZSsB5qQSx/I5U + nn44QpH2MvA+oN9iRvqupWau8SuVSkhQFN3VKHn2MSj9t8fTCJNDKIh8Pi0qUAQxitxpRN5ezM + j5bi2FDm5H6HBxv4KmuA/LVhmZwvOOZe8tNEa0i8YkzPOGUNaSJL479cpLn8G7JYTlz4rrOayj + Zym2NvNJ+sztF5wEAZ/V/8+5I7weX+h5pvAAAA//8DAFBLAwQUAAYACAAAACEAMd1fYdIAAACP + AQAACwAAAF9yZWxzLy5yZWxzpJDBasMwDIbvg72D0b1x2kMZo05vhV5LB7sKW0lMY8tYJm3fvq + YwWEZvO+oX+j7x7/a3MKmZsniOBtZNC4qiZefjYODrfFh9gJKC0eHEkQzcSWDfvb/tTjRhqUcy + +iSqUqIYGEtJn1qLHSmgNJwo1k3POWCpYx50QnvBgfSmbbc6/2ZAt2CqozOQj24D6nxP1fyHHb + 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 + EAAP//AwBQSwMEFAAGAAgAAAAhAA3RkJ+2AAAAGwEAACcAAAB0aGVtZS90aGVtZS9fcmVscy90 + aGVtZU1hbmFnZXIueG1sLnJlbHOEj00KwjAUhPeCdwhvb9O6EJEm3YjQrdQDhOQ1DTY/JFHs7Q + 2uLAguh2G+mWm7l53JE2My3jFoqhoIOumVcZrBbbjsjkBSFk6J2TtksGCCjm837RVnkUsoTSYk + UiguMZhyDidKk5zQilT5gK44o49W5CKjpkHIu9BI93V9oPGbAXzFJL1iEHvVABmWUJr/s/04Go + lnLx8WXf5RQXPZhQUoosbM4CObqkwEylu6usTfAAAA//8DAFBLAQItABQABgAIAAAAIQCCirwT + +gAAABwCAAATAAAAAAAAAAAAAAAAAAAAAABbQ29udGVudF9UeXBlc10ueG1sUEsBAi0AFAAGAA + gAAAAhAKXWp+fAAAAANgEAAAsAAAAAAAAAAAAAAAAAKwEAAF9yZWxzLy5yZWxzUEsBAi0AFAAG + AAgAAAAhAGt5lhaDAAAAigAAABwAAAAAAAAAAAAAAAAAFAIAAHRoZW1lL3RoZW1lL3RoZW1lTW + FuYWdlci54bWxQSwECLQAUAAYACAAAACEASuaTAFsHAAB4HwAAFgAAAAAAAAAAAAAAAADRAgAA + dGhlbWUvdGhlbWUvdGhlbWUxLnhtbFBLAQItABQABgAIAAAAIQAN0ZCftgAAABsBAAAnAAAAAA + AAAAAAAAAAAGAKAAB0aGVtZS90aGVtZS9fcmVscy90aGVtZU1hbmFnZXIueG1sLnJlbHNQSwUG + AAAAAAUABQBdAQAAWwsAAAAAAAAPBDoBAAA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPS + JVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+DQo8YTpjbHJNYXAgeG1sbnM6YT0iaHR0cDovL3Nj + aGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYXdpbmdtbC8yMDA2L21haW4iIGJnMT0ibHQxIi + B0eDE9ImRrMSIgYmcyPSJsdDIiIHR4Mj0iZGsyIiBhY2NlbnQxPSJhY2NlbnQxIiBhY2NlbnQy + PSJhY2NlbnQyIiBhY2NlbnQzPSJhY2NlbnQzIiBhY2NlbnQ0PSJhY2NlbnQ0IiBhY2NlbnQ1PS + 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 + eCdwhvb9O6EJEm3YjQrdQDhOQ1DTY/JFHs7Q2uLAguh2G+mWm7l53JE2My3jFoqhoIOumVcZrB + bbjsjkBSFk6J2TtksGCCjm837RVnkUsoTSYkUiguMZhyDidKk5zQilT5gK44o49W5CKjpkHIu9 + BI93V9oPGbAXzFJL1iEHvVABmWUJr/s/04GolnLx8WXf5RQXPZhQUoosbM4CObqkwEylu6usTf + AAAA//8DAFBLAQItABQABgAIAAAAIQCCirwT+gAAABwCAAATAAAAAAAAAAAAAAAAAAAAAABbQ2 + 9udGVudF9UeXBlc10ueG1sUEsBAi0AFAAGAAgAAAAhAKXWp+fAAAAANgEAAAsAAAAAAAAAAAAA + AAAAKwEAAF9yZWxzLy5yZWxzUEsBAi0AFAAGAAgAAAAhAGt5lhaDAAAAigAAABwAAAAAAAAAAA + AAAAAAFAIAAHRoZW1lL3RoZW1lL3RoZW1lTWFuYWdlci54bWxQSwECLQAUAAYACAAAACEA75dL + kmEGAAAyGwAAFgAAAAAAAAAAAAAAAADRAgAAdGhlbWUvdGhlbWUvdGhlbWUxLnhtbFBLAQItAB + QABgAIAAAAIQAN0ZCftgAAABsBAAAnAAAAAAAAAAAAAAAAAGYJAAB0aGVtZS90aGVtZS9fcmVs + cy90aGVtZU1hbmFnZXIueG1sLnJlbHNQSwUGAAAAAAUABQBdAQAAYQoAAAAAAAAPBDoBAAA8P3 + htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+DQo8 + YTpjbHJNYXAgeG1sbnM6YT0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL2RyYX + dpbmdtbC8yMDA2L21haW4iIGJnMT0ibHQxIiB0eDE9ImRrMSIgYmcyPSJsdDIiIHR4Mj0iZGsy + IiBhY2NlbnQxPSJhY2NlbnQxIiBhY2NlbnQyPSJhY2NlbnQyIiBhY2NlbnQzPSJhY2NlbnQzIi + BhY2NlbnQ0PSJhY2NlbnQ0IiBhY2NlbnQ1PSJhY2NlbnQ1IiBhY2NlbnQ2PSJhY2NlbnQ2IiBo + bGluaz0iaGxpbmsiIGZvbEhsaW5rPSJmb2xIbGluayIvPgAAJwR0BQAAUEsDBBQABgAIAAAAIQ + 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 + ECLQAUAAYACAAAACEAa3mWFoMAAACKAAAAHAAAAAAAAAAAAAAAAAAUAgAAdGhlbWUvdGhlbWUv + dGhlbWVNYW5hZ2VyLnhtbFBLAQItABQABgAIAAAAIQDvl0uSYQYAADIbAAAWAAAAAAAAAAAAAA + AAANECAAB0aGVtZS90aGVtZS90aGVtZTEueG1sUEsBAi0AFAAGAAgAAAAhAA3RkJ+2AAAAGwEA + ACcAAAAAAAAAAAAAAAAAZgkAAHRoZW1lL3RoZW1lL19yZWxzL3RoZW1lTWFuYWdlci54bWwucm + Vsc1BLBQYAAAAABQAFAF0BAABhCgAAAAAAAA8EOgEAADw/eG1sIHZlcnNpb249IjEuMCIgZW5j + b2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4NCjxhOmNsck1hcCB4bWxuczphPSJodH + RwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvZHJhd2luZ21sLzIwMDYvbWFpbiIgYmcx + PSJsdDEiIHR4MT0iZGsxIiBiZzI9Imx0MiIgdHgyPSJkazIiIGFjY2VudDE9ImFjY2VudDEiIG + FjY2VudDI9ImFjY2VudDIiIGFjY2VudDM9ImFjY2VudDMiIGFjY2VudDQ9ImFjY2VudDQiIGFj + Y2VudDU9ImFjY2VudDUiIGFjY2VudDY9ImFjY2VudDYiIGhsaW5rPSJobGluayIgZm9sSGxpbm + s9ImZvbEhsaW5rIi8+DwDuA4DmAQACAO8DGAAAABAAAAAAAAAAAAAAAAQAAIAAAQAABwAAAAAA + +QMQAAAAAAAAAAAAAAADCgEAApw3BQ8ADATI5QEADwAC8MDlAQDwAAjwCAAAAGYAAABmBAAADw + AD8KjlAQAPAATwKAAAAAEACfAQAAAAAAAAAAAAAAAAAAAAAAAAAAIACvAIAAAAAAQAAAUAAAAP + AATwDgEAABIACvAIAAAAAgQAABAKAABzAAvwRgAAAAsBAQAAAD8BAAABAL8BAAAQAP8BAAAIAD + 8CAAACAIDDHAAAAL8DAgACAFIAZQBjAHQAYQBuAGcAbABlACAAMQAzADAAAAAAABDwCAAAAAAA + AABkAGQADwAR8JgAAAAAAMELBAAAAAEAAAAPAIgThAAAAA8AiRN8AAAAAAC6DzIAAABUAEgASQ + BOAEsAQwBFAEwATABTAEgAQQBQAEUARABPAE4ATwBUAEQARQBMAEUAVABFABAAug86AAAAdABo + AGkAbgBrAGMAZQBsAGwAQQBjAHQAaQB2AGUARABvAGMARABvAE4AbwB0AEQAZQBsAGUAdABlAA + 8ABPDbAQAAogwK8AgAAAADBAAAAAoAANMAC/B4AAAAfwABAO8BgADAKXAIgQB4YQEAggCirQAA + gwB4YQEAhACirQAAvwAEAAQAvwEBABEAywGcMQAA/wEQABgAPwMAAAgAgMMqAAAAvwMAAAIARg + BvAG8AdABlAHIAIABQAGwAYQBjAGUAaABvAGwAZABlAHIAIAAzAAAAEwAi8QYAAAD/AQAAQAAA + ABDwCAAAAA4QWQHFC4cQDwAR8IAAAAAPAIgTeAAAAA8AiRNwAAAAAAC6DzIAAABUAEgASQBOAE + sAQwBFAEwATABTAEgAQQBQAEUARABPAE4ATwBUAEQARQBMAEUAVABFABAAug8uAAAAcABhAFAA + WgBLAEIAZwBzAHMAUwBrAFcATwBXAHQATgBaAFYAaQBuAEMAXwBBAA8ADfCdAAAAAACfDwQAAA + AEAAAAAACoDzkAAACpIDIwMDggIE5va2lhIAkgVjEuMCBFcGljIFRlbXBsYXRlIC5wcHQgLyAy + MDA5LTA4LTA0IC8gU0MAAKEPHAAAADoAAAAAAARwAAAAAFoAAAAAADoAAAAAAAIACAAAAKoPDg + AAADoAAAAHAAAAAAAABAAAAACmDw4AAADxAAAA/gDUAdAC8AMQBQ8ABPCIAQAAogwK8AgAAAAE + BAAAAAoAAIMAC/BmAAAAfwABAO8BgADgKnAIvwAEAAQAvwEBABEA/wEQABgAPwMAAAgAgMM2AA + AAvwMAAAIAUwBsAGkAZABlACAATgB1AG0AYgBlAHIAIABQAGwAYQBjAGUAaABvAGwAZABlAHIA + IAA0AAAAAAAQ8AgAAAAKEHAAWwGHEA8AEfCAAAAADwCIE3gAAAAPAIkTcAAAAAAAug8yAAAAVA + BIAEkATgBLAEMARQBMAEwAUwBIAEEAUABFAEQATwBOAE8AVABEAEUATABFAFQARQAQALoPLgAA + AHAAZwBpADcAXwBLAEcAOQBrAEgAawBXAC4ASABaAFUAdABEADkAegBnAGQAQQAPAA3wagAAAA + AAnw8EAAAABAAAAAAAoA8CAAAAKgAAAKEPGgAAAAIAAAAAAARgAAAAAAAAAAACAAAAAAACAAgA + AADYDwQAAAAAAAAAAACqDwoAAAACAAAAAQAAAAAAAACmDwwAAADwAAAA1AHQAvADEAUPAATwtg + EAABIACvAIAAAABQQAACACAAATAQvwfgAAAAQAAAAAAH8AAQDvAYAAACxwCIEAoIwAAIIAoIwA + AIMAoIwAAIQAoIwAAIUAAAAAAIcAAAAAAIgAAAAAAL8ABAAEAL8BAAARAP8BAAARAAEDAgwAAD + 8DAAAIAIDDGAAAAL8DAAACAFIAZQBjAHQAYQBuAGcAbABlACAAMgAAAAAAEPAIAAAAAABcAJYU + QgEPABHwkAAAAAAAwwsIAAAA/////w0AEwAPAIgTeAAAAA8AiRNwAAAAAAC6DzIAAABUAEgASQ + BOAEsAQwBFAEwATABTAEgAQQBQAEUARABPAE4ATwBUAEQARQBMAEUAVABFABAAug8uAAAAcABF + AGIAeABxAHMAcgBpAEQAcwAwAC4AeQAwAC4AdwBHAHQAUQB6AEoAQwBnAA8ADfBwAAAAAACfDw + QAAAAAAAAAAACoDygAAAAzLiBJbXBsZW1lbnRhdGlvbiBQbGFubmluZwtQcm9qZWN0IFBsYW4L + AAChDxYAAAApAAAAAAAAAAoABwApAAAAAAACABwAAACqDw4AAAApAAAABwAAAAAACQgAAA8ABP + ACAwAAEgAK8AgAAAAGBAAAAAoAAPMAC/ByAAAAfwAAAO8BgABABdwFgQB4YQEAggCirQAAgwB4 + YQEAhACirQAAvwAEAAQAgQEAAAAIvwEQABAAwAEBAAAIywHOGAAA/wEIABgAPwMAAAgAgMMYAA + AAvwMAAAIAUgBlAGMAdABhAG4AZwBsAGUAIAAzAAAAEwAi8QYAAAD/AQAAQAAAABDwCAAAAJQC + yQB0DIQPDwAR8IAAAAAPAIgTeAAAAA8AiRNwAAAAAAC6DzIAAABUAEgASQBOAEsAQwBFAEwATA + BTAEgAQQBQAEUARABPAE4ATwBUAEQARQBMAEUAVABFABAAug8uAAAAcABTAHYAYQBRADMAbQBD + ADcAUQBrAC4ARABwAF8AQQBRAHoAQgBMAFYAUgB3AA8ADfDKAQAAAACfDwQAAAAEAAAAAACoD9 + AAAABQcm9qZWN0IGRlbGl2ZXJpZXMgQ2FsZW5kYXIgRGF5IHZpZXcgdG8gMTAuMiBhcyBhIHBh + cnQgb2YgMTAuMiBDYWxlbmRhciBSZXN0b3JhdGlvbiBFcGljLCA0MTctNzEzOTYuDTQxNy03MD + c5OTogQ2FsZW5kYXIgRGF5IHZpZXcgd2l0aCB0aW1lbGluZSBmb3IgMTAuMg1Qcm9qZWN0IGtl + eSBkZXBlbmRlbmNpZXMgYXJlDTEwLjIgT3JiaXQNMTAuMiBPcmdhbml6ZXINAAChD5oAAABlAA + AAAAAhAAAABQAAAAADNAAAAAEAIQAAAAUAAAAAAx0AAAAAACEAAAAFAAAAAAMaAAAAAQAhAAAA + BQAAAAADAQAAAAAAIAAAAAAAAANlAAAAAABDAAMAAwAQADQAAAAAAEMAAwADABAAHQAAAAAEQw + AABAMAAwAQABoAAAAABEMAAAQDAAMAEAABAAAAAARDAAAEAwADABAAAACqDyIAAABlAAAAAQAA + AAAAMwAAAAcAAAAAAAsEAAA5AAAAAQAAAAAAAACmDxIAAAD5AgAA4AF5AKQBKQHQAvADEAUPAA + PwPJIAAA8ABPB5DgAAAQAJ8BAAAAAKDQAAywEAANAXAADABQAAAgAK8AgAAAAHBAAAAQIAAEMA + C/AsAAAABAAAAAAAfwABAOEAgMMUAAAAvwMAAAIARwByAG8AdQBwACAAMQA4ADUAAAAzACLxfQ + 0AAJ8DAQAAAKDDHgAAAKnDTQ0AAAYACAAEAK0AAACtAAAAegAAAKcAAACtAAAArQAAAFBLAwQU + AAYACAAAACEAk169kvsAAADhAQAAEwAAAFtDb250ZW50X1R5cGVzXS54bWyUkUFOwzAQRfdI3M + HyFsUOXSCEknRByhIQKgcY2ZPEajK2PCa0t8dpy4IFRSwt6/3/vqZa76dRzBjZearlrSqlQDLe + Oupr+b59Ku6l4ARkYfSEtTwgy3VzfVVtDwFZZJq4lkNK4UFrNgNOwMoHpPzT+ThBys/Y6wBmBz + 3qVVneaeMpIaUiLRmyqV6yQHQWxSvE9AxT7tE2ssaVb71ROUqKxxOz1NYSQhidgZSl9UxWTVz4 + rnMGVRt5c6RuFko3VYsdfIxJbPa58rQy4sh/BP5cUJztVSaPpTy4wBcaLhufzX5bbf0nRZz/O7 + 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 + ARAAAAERQAAA8AA/CiaAAADwAE8CgAAAABAAnwEAAAAAAAAAAAAAAAAAAAAAAAAAACAArwCAAA + AAAUAAAFAAAADwAE8FMBAACiDArwCAAAAAIUAAAACgAA0wAL8HgAAAB/AAEA7wGAACAUPAeBAH + hhAQCCAKKtAACDAHhhAQCEAKKtAAC/AAQABAC/AQEAEQDLAZwxAAD/ARAAGAA/AwAACACAwyoA + AAC/AwAAAgBGAG8AbwB0AGUAcgAgAFAAbABhAGMAZQBoAG8AbABkAGUAcgAgADMAAAATACLxBg + AAAP8BAABAAAAAEPAIAAAADhBVAsULehAPAA3wnQAAAAAAnw8EAAAABAAAAAAAqA85AAAAqSAy + MDA4ICBOb2tpYSAJIFYxLjAgRXBpYyBUZW1wbGF0ZSAucHB0IC8gMjAwOS0wOC0wNCAvIFNDAA + ChDxwAAAA6AAAAAAAEcAAAAABaAAAAAAA6AAAAAAACAAgAAACqDw4AAAA6AAAABwAAAAAAAAQA + AAAApg8OAAAA8QAAAP4A1AHQAvADEAUPAATwAAEAAKIMCvAIAAAAAxQAAAAKAACDAAvwZgAAAH + 8AAQDvAYAAgBE8B78ABAAEAL8BAQARAP8BEAAYAD8DAAAIAIDDNgAAAL8DAAACAFMAbABpAGQA + ZQAgAE4AdQBtAGIAZQByACAAUABsAGEAYwBlAGgAbwBsAGQAZQByACAANAAAAAAAEPAIAAAACh + CGAFsBehAPAA3wagAAAAAAnw8EAAAABAAAAAAAoA8CAAAAKgAAAKEPGgAAAAIAAAAAAARgAAAA + AAAAAAACAAAAAAACAAgAAADYDwQAAAAAAAAAAACqDwoAAAACAAAAAQAAAAAAAACmDwwAAADwAA + AA1AHQAvADEAUPAATwQQEAABIACvAIAAAABBQAACACAAATAQvwfgAAAAQAAAAAAH8AAQDvAYAA + QA48B4EAoIwAAIIAoIwAAIMAoIwAAIQAoIwAAIUAAAAAAIcAAAAAAIgAAAAAAL8ABAAEAL8BAA + ARAP8BAAARAAEDAgwAAD8DAAAIAIDDGAAAAL8DAAACAFIAZQBjAHQAYQBuAGcAbABlACAAMgAA + AAAAEPAIAAAAAABcAJYUQgEPABHwEAAAAAAAwwsIAAAA/////w0AEwAPAA3wewAAAAAAnw8EAA + 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 + 9Eb2MueG1s7J1dc+JYs6XvJ2L+g0IXEzMXddr42zUvfcLY5a6KqK7XYdyney43QoDaYosjbaps + //rJvSVAsqHBLrCx/NgRtgAZw0bSyly5cuW//vN2GHvfwzSLEt30G/+x43uhDpJupPtN/4/riw + /HvpcZpbsqTnTY9O/CzP/PX//n//jX6OOn3eQiVcPQk6fQ2cdR0x8YM/r4yy9ZMAiHKvuPZBRq + eayXpENl5Gba/2WUhlmojTLy74bxL7s7O4e/DFWk/V/lCfX331I1GkSBe9rL1N4XfPt+mXpRt+ + kfHx7sH/melv/Y9H9Lk/HIO9hr+L8Uez38U/WxX3qyr0lwkxUvVK3yQrup+iFrUHmNnk5+S+Vt + un/6i3ttD/+rfRP5Cx8N5FXfNv393ZP9k8Oj3ZMD+1Llr/Id3Mbjv77tpcNf/6U+Jr3eT79a+e + eNk73DowPfu5PNxu7xUWPPvgj1Mbw1P/30gTz/ye7J0cmxHCKB/If9o5P93YP94m1O3knxKfzs + v7Ovuniqc2WUN06jZ3yMRnXiUI419dF04uLXZeqWRO74LY26+f+JumdJ7P2QVTs6PmlMVq0vjx + f3H8h73TvKF7N09+7e/snBzqO7Dw8PGofF0pf2Pjg4Pt6Zs3dj90g+NPeqSnvv7u8eH8/5l/v7 + +3P23ts7PJjzSvb2jht7x4+eu9E42JXvR/fvHezvNHYf3b17tH8451l25W3O2/twZ2/OS1n0JP + a5H7/N472TIznQ7CnkPrzfis/KpN6g6R/tHO/Iy3efaOB+3raS7p3d6sjv4iOOM9M2d3HoVnZk + HxzJtWWo0q9NX657snHlNuLvsfsd6a5cq9ymivtyeYx9rxv2rlWnfS/HfmN/Xz49LzX53qH6ql + vpjb08eL1Em1P3Jx2Vhb4XywVPFw/LnwyU7svF5XKsA3n6hnvdsW6P3EvPRsFlYLzvSp62sWO/ + indd3qMV9uzrL+872U3umz162jMP92sczJ5S9i326IzPYrngylPai3coN/JXYG7dxy+LPt2jM2 + 7fX9+6ReyML+SdTm98E4hw98t59jUz+Ycla2yfN/8h630zHkbD5G85fWUlYlmJpt+LPlx8EZyx + q2qXtOMWMd9j3PS1PK1FoTS6kUu/TtpuSy46Si7G+YPaYkwc3Yef3dPaVY8ji1fybNnQnMWhks + 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 + AAJwAAACcgAAAPAAPwhsMAAA8ABPAoAAAAAQAJ8BAAAAAAAAAAAAAAAAAAAAAAAAAAAgAK8AgA + AAAAIAAABQAAAA8ABPCSAQAAogwK8AgAAAACIAAAAAoAANMAC/B4AAAAfwABAO8BgABgv28HgQ + B4YQEAggCirQAAgwB4YQEAhACirQAAvwAEAAQAvwEBABEAywGcMQAA/wEQABgAPwMAAAgAgMMq + AAAAvwMAAAIARgBvAG8AdABlAHIAIABQAGwAYQBjAGUAaABvAGwAZABlAHIAIAA0AAAAEwAi8Q + YAAAD/AQAAQAAAABDwCAAAAA4QjQD5CocQDwAN8NwAAAAAAJ8PBAAAAAQAAAAAAKAPbAAAACoA + IAAgACAAIAAgACAAIACpACAAMgAwADAANQAgACAATgBvAGsAaQBhACAACQBQACYAUABmAE0AIA + BwAHIAbwBjAGUAcwBzACAATwB2AGUAcgB2AGkAZQB3ACAAEyAgAHYAIAAyAEgAMAA2AAAAoQ8c + AAAANwAAAAAABHAAAAAAWgAAAAAANwAAAAAAAgAIAAAA2A8EAAAAAAAAAAAAqg8OAAAANwAAAA + cAAAAAAAAEAAAAAKYPDgAAAPEAAAD+ANQB0ALwAxAFDwAD8E1yAAAPAATwvQ0AAAEACfAQAAAA + ZBIAAI8AAADiFwAAeQUAAAIACvAIAAAAAyAAAAECAABDAAvwLAAAAAQAAAAAAH8AAQDhAIDDFA + AAAL8DAAACAEcAcgBvAHUAcAAgADIAMgAyAAAAMwAi8TENAACfAwEAAACgwx4AAACpwwENAAAG + AAgABABoAAAAxwAAAMgAAADHAAAAyAAAAMgAAABQSwMEFAAGAAgAAAAhAJNevZL7AAAA4QEAAB + MAAABbQ29udGVudF9UeXBlc10ueG1slJFBTsMwEEX3SNzB8hbFDl0ghJJ0QcoSECoHGNmTxGoy + tjwmtLfHacuCBUUsLev9/76mWu+nUcwY2Xmq5a0qpUAy3jrqa/m+fSrupeAEZGH0hLU8IMt1c3 + 1VbQ8BWWSauJZDSuFBazYDTsDKB6T80/k4QcrP2OsAZgc96lVZ3mnjKSGlIi0ZsqleskB0FsUr + xPQMU+7RNrLGlW+9UTlKiscTs9TWEkIYnYGUpfVMVk1c+K5zBlUbeXOkbhZKN1WLHXyMSWz2uf + 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 + HeCt0EDwAN8MIAAAAAAJ8PBAAAAAQAAAAAAKAPeAAAAEEAcABwAHIAbwB2AGUAZAAgAGMAbwBz + AHQAIABmAG8AcgAgADEASAAvADIAMAAxADAAOgAgADMANgAgADAANwAwAKwgDQBTAFQAUAAgAG + YAbwByACAAMgBIAC8AMgAwADEAMAA6ACAAMgA0ADkAIAAyADAAMACsIAAAqg8YAAAAPAAAAAcA + AAAAAAsEAAABAAAAAQAAAAAAAACmDw4AAADxAAAA4AHUAdAC8AMQBRAA8AcgAAAA////AAAAAA + CAgIAAADPMAAQEdwCv1PAARKUcAPnyBgAPAIgTkQAAAA8AihOJAAAAAAC6DxAAAABfAF8AXwBQ + AFAAVAAxADAAAACLE2kAAAAAAOsuCAAAAJw6xQHAwtqGAAAAKwQAAAAAAAAAHwBE8T0AAAAAAC + fxIAAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAP////8SAAAADwA98Q0AAABAAULxBQAAAAEJ + AAAADwACKwAAAAAAACIECAAAAAEAAAACAAAADwDuA7zUAAACAO8DGAAAABAAAAAAAAAAAAAAAA + QAAIAHAQAABwAAAAAA+QMQAAAAAAAAAAAAAAADCgEAAtzhBQ8ADAQE1AAADwAC8PzTAADQAQjw + CAAAACsAAAArLAAADwAD8OTTAAAPAATwKAAAAAEACfAQAAAAAAAAAAAAAAAAAAAAAAAAAAIACv + AIAAAAACwAAAUAAAAPAATwUwEAAKIMCvAIAAAAAiwAAAAKAADTAAvweAAAAH8AAQDvAYAAwAA+ + CIEAeGEBAIIAoq0AAIMAeGEBAIQAoq0AAL8ABAAEAL8BAQARAMsBnDEAAP8BEAAYAD8DAAAIAI + DDKgAAAL8DAAACAEYAbwBvAHQAZQByACAAUABsAGEAYwBlAGgAbwBsAGQAZQByACAAMwAAABMA + IvEGAAAA/wEAAEAAAAAQ8AgAAAAOEFkBxQuHEA8ADfCdAAAAAACfDwQAAAAEAAAAAACoDzkAAA + CpIDIwMDggIE5va2lhIAkgVjEuMCBFcGljIFRlbXBsYXRlIC5wcHQgLyAyMDA5LTA4LTA0IC8g + U0MAAKEPHAAAADoAAAAAAARwAAAAAFoAAAAAADoAAAAAAAIACAAAAKoPDgAAADoAAAAHAAAAAA + AABAAAAACmDw4AAADxAAAA/gDUAdAC8AMQBQ8ABPAAAQAAogwK8AgAAAADLAAAAAoAAIMAC/Bm + AAAAfwABAO8BgABgbzwIvwAEAAQAvwEBABEA/wEQABgAPwMAAAgAgMM2AAAAvwMAAAIAUwBsAG + kAZABlACAATgB1AG0AYgBlAHIAIABQAGwAYQBjAGUAaABvAGwAZABlAHIAIAA0AAAAAAAQ8AgA + AAAKEHAAWwGHEA8ADfBqAAAAAACfDwQAAAAEAAAAAACgDwIAAAAqAAAAoQ8aAAAAAgAAAAAABG + AAAAAAAAAAAAIAAAAAAAIACAAAANgPBAAAAAAAAAAAAKoPCgAAAAIAAAABAAAAAAAAAKYPDAAA + APAAAADUAdAC8AMQBQ8ABPA4AQAAEgAK8AgAAAAELAAAIAIAABMBC/B+AAAABAAAAAAAfwABAO + 8BgADAAz4IgQCgjAAAggCgjAAAgwCgjAAAhACgjAAAhQAAAAAAhwAAAAAAiAAAAAAAvwAEAAQA + vwEAABEA/wEAABEAAQMCDAAAPwMAAAgAgMMYAAAAvwMAAAIAUgBlAGMAdABhAG4AZwBsAGUAIA + AyAAAAAAAQ8AgAAAAAAFwAlhRCAQ8AEfAQAAAAAADDCwgAAAD/////DQATAA8ADfByAAAAAACf + DwQAAAAAAAAAAACoDyoAAAAzLjcgSW1wbGVtZW50YXRpb24gUGxhbm5pbmcLUmlza3MgQW5hbH + lzaXMAAKEPFgAAACsAAAAAAAAACgAHACsAAAAAAAIAHAAAAKoPDgAAACsAAAAHAAAAAAAJCAAA + DwAD8OHOAAAPAATwyBsAAAEACfAQAAAAxAAAAJ8CAAD6FwAAZQ8AAAIACvAIAAAABSwAAAECAA + BDAAvwKgAAAAQAAAAAAH8AAQDhAIDDEgAAAL8DAAACAEcAcgBvAHUAcAAgADgAOAAAADMAIvFW + GwAAnwMBAAAAoMMaAAAAqcMqGwAABQAIAAQA4AAAAMYBAADcAQAAxgEAAMYBAABQSwMEFAAGAA + gAAAAhAJNevZL7AAAA4QEAABMAAABbQ29udGVudF9UeXBlc10ueG1slJFBTsMwEEX3SNzB8hbF + Dl0ghJJ0QcoSECoHGNmTxGoytjwmtLfHacuCBUUsLev9/76mWu+nUcwY2Xmq5a0qpUAy3jrqa/ + m+fSrupeAEZGH0hLU8IMt1c31VbQ8BWWSauJZDSuFBazYDTsDKB6T80/k4QcrP2OsAZgc96lVZ + 3mnjKSGlIi0ZsqleskB0FsUrxPQMU+7RNrLGlW+9UTlKiscTs9TWEkIYnYGUpfVMVk1c+K5zBl + UbeXOkbhZKN1WLHXyMSWz2ufK0MuLIfwT+XFCc7VUmj6U8uMAXGi4bn81+W239J0Wc/zu7zdgb + zt9W+nig5gsAAP//AwBQSwMEFAAGAAgAAAAhADj9If/WAAAAlAEAAAsAAABfcmVscy8ucmVsc6 + SQwWrDMAyG74O9g9F9cZrDGKNOL6PQa+kewNiKYxpbRjLZ+vYzg8EyettRv9D3iX9/+EyLWpEl + Ujaw63pQmB35mIOB98vx6QWUVJu9XSijgRsKHMbHh/0ZF1vbkcyxiGqULAbmWsur1uJmTFY6Kp + jbZiJOtraRgy7WXW1APfT9s+bfDBg3THXyBvjkB1CXW2nmP+wUHZPQVDtHSdM0RXePqj195DOu + jWI5YDXgWb5DxrVrz4G+79390xvYljm6I9uEb+S2fhyoZT96vely/AIAAP//AwBQSwMEFAAGAA + gAAAAhALGx+E7ZFgAA2iACAA4AAABkcnMvZTJvRG9jLnhtbOxd3W7jOLK+X+C8g6CLg11g0x27 + naSTGfci7kymA+Rkgth95pqSaJsbihQoOn9X+xr7evskW6QU+Sd22ollS2JXN+DIMi1Lxarix/ + r99R8PMffuqEqZFF2/9WHf96gIZcTEqOt/H5zvffa9VBMRES4F7fqPNPX/8eV//vJrcvJbW54r + ElMPLiHSk6Trj7VOTj5+TMMxjUn6QSZUwGdDqWKi4a0afUwUTanQRMPPxfxje3//8GNMmPC/wA + XF3e+KJGMW2steK3MuvLq7Vh6Luv5R6+gQbkbAL3b935WcJN7nz/7HfNDiN8nJaOZalzK8TfP7 + JOvcZ6TIPZBg7hY9IX9X8JQt86Mf7a0t/qp5hmuVfbzsaR6GKv7yKzmRw+HGd/PQ9T+1Wq0DmL + FHuKn9w4N265O5NXJCH/TGlw/h+sedT+3j9oHvhfALB61jmIH9/OGfnySn8qY/Z+46v9QZ0cSb + KPaOadIk4BRYiZzogOd/7HTYE78rFmW/w6Kvknv3Xb990OkcHeZUG8Hn+fnD44NP8NyWmDOngd + pt+P/i/OfDTqtledE8RXGVDtCrddyxFJu7A628MczewcHh/n52u6G924eejB7NUQB/8xvnqe7r + R07tvSTmwwQEIibqsuvD1MPBjT3gd9z+ZSICAbOHhI9AprnvRXQ4IEH/CYToEEQOvqZ0NpqSS9 + FTt3b4UAp9ar8SkJT6HgcpFdOPx0SMQCSuJyK0lze3wkU/sbeeJuF1qL07ApdtwS/AbxgpmB/R + o0PzpbmxB9OhcH464nSofzA2HxFMvnLQFHBZo3UovMnuQj+081soRgST/tPgwRIymJzD0xZvrk + C32fPAQZepzm4d6Gyum70AzW8nMYvlP4ExgYAcqNH1qdj73gcFCZRtdQxdA6MevGzIpOsLuK7R + n4rdgtISsm+PQJ4I6JHsQ2G0I2dP9Ju9riE9Z0bTwtUipjRIHhylsf7KKYHpzBiGC3NrQp4zzp + 8JbYkgOYvMySUUCUaZ5gJSzY6iwyENdfbUMF9m0j39mNAhCeEuruQtI16fiNT7k0XwMAnT4fic + xIzDnX3qwLOMiUqpZYnsTlRGN/3lhqW3hgdgJuEV6AivwMHmTMHpOiy4+Xi/Awo95+jpm0HX73 + Q6Rs0Br/eKN2Opnv6AhWvIJQiyzI9889xcXFrh/nxwZHSXofUQngsO4yTq+qkY+V4mG6FW9htz + BHnBSEvJlqhUn5F0nHGbvUCmF2BlEpFlpjEl0W8istR8nm6415hGwD8U5tIc2ZGaML7OSCAdPF + z2jDfmGVvtI8N2zj3jTfaMA5fncZA9Y8/leezl88gHsqfM8bzKGhTnuejB8WDJmOn516Q0GD2r + +5lRRtOAfslUTrbE4kJrF+CmLbRDtnd+sb2FtpHLaz+Uis6tr4D8RXRNFLmpBK40iYpTQu0alr + i6ZCMscQNeIiwRCEtw/2/tLAaxWkgKe9oK9v9NWlCLXf+1kgEJGGf6cQ6c7Hbzj6usteQ10sBx + k28acfPfbENVDzf/aGUvwcqOm3+w+i/Y1i/ihIR6boHF3f/aLgrc/aNT4u2OF8Qlblg4EJeg97 + 8M7z/ikpe4xPj8vXgU649ezDQb2UgvD6AKBHz9Nf0bApb3xVQgYNkmYGk7GimCgAUBi3VvzkZX + zMRHvAiaWyuKwkRVKGPaycIYj9r7RxATaU9gdEX9oyuyyMVZ7AIhoTZyEV6nEYdUKRvL+MIHsT + JA8E2xgX+ogC2aLyxTGU/Lmre4pVvzFkDKW29ry5T7Okm1jDe8x5+TdJylyHN5OO+bpJVpWleO + O72+8P66oTRsWWK/BacBxIDDJugC6Pj/jN5veL9bkt6/1VzzjUn6LsKtG1Nfzsr2PiKuuMctc6 + aQ79OHK+52S3zZJIoGlApk0jxJpRyBmqQ0QpKWStJgPjRnJsjpVeiNYr8q1UnqMVXIpKUyKUkS + zkJrQEbKlkrZgEJO9mLqwHrb3N2qgL83aek3KqAJRPWaRNSY4FL1nPNbDpwKGsGjZWr8LW+i4P + JS4c60XC6ViKbKJWgCYfmcxo3gU6hA0CD5f78rY7dgqkk0JYqSMllgS5apDwv3OA3T+FG20IzP + rZ7VQvTD0rIXpVcLmZJs14m4rkZ9/GyJuK6memEi7hsTcWdri2Ddj7wYV7MLbK0IU/m5l8wi1b + Z1iPhj02pl1eEPV9ctxB9uRJ0i/kD88bMX+ET88VqBzw7CD4Qfy+1EWB51myVgb2YqpLgKIxF+ + IPxA+DEte4oeg8UaKAg/Nq7VjtaPbeYVu7o0I/xww8LTK7NAW/nel0+d9rFJTV3Z42TveQR2Or + HO8zU6nZxOtLyaxLnWg1LhAQuvqWKy6ETx7gYoNQQoahQUDWFsV5rnOmpzSfDlxjRAGTZiyZs1 + UOmzuD8RC9mW7Rmryl6rbVsXkJMwnfneqWIEWves7q5yDp1+vOeoLu+e6bF3Rh69O0gvhIY/sf + RI6lGiOKPKHCYyTRlEgP0yZ7PJirLatiyzjYWe5QolTxsVWcjVi9Ywz00nihGrewyVLHk7s0yu + jJ5dqwWRyxJ4xhR0TpqTp5lMqiXtonY2Zy/C3X76uVoZ/FjlNKForcqnC2UcTwSzZcNQwDZpyL + YrOOJpiTJmbf6bttDb1Yy9GrdepVrE1WvR0omS1SjJ0pSsLJeDgrVOG9Fd6UCnEjgc3Guhf2Kb + /glXM2DQP4H+CWsQn617utI/sVjPFNqyQ7dprGeag9AGtmWvuZ1tsVH9bhIti6yRK3AQ1NGmsp + k1rGKipvqRryys0TzMXzE1ve8XyKLWOb+y5svavY4KuU8TGrLhDypqIatGdMFZ+6nzmhsW+bRs + Po0kTcV//vVvhzxrVatTXO7Bi7+pXR72CYUuhbiLO7Bj1ZGu77OeI4cyAa151muBsJY3vWKKUi + EnozEy6ExI1ZW8zYvfvx084TJf9jI/nAjH3PsVSzyyaNksGtE0VCwxvetQkZalSKH0MHJq+Zx6 + R7lMYipw17RJtNQsxvcIBFjXUe4bbSjVNIWstVEd6Yo7JynA+AWtitgt7IWE7NsjsH6RxLw1Hw + qpYsLZE/1mN0srKpg2nENdit6pGJSuruBfpaW50fwZv9K7oUqiovpE9Xmiv4BsrS7ejvyJ7qWK + VyRkzk1rVhVeENwdlb2Pjxlk6eLuCDkU8h3AFsGtp2kuWf1FCvKOo8eGlOiJoiv7iOAKjys8rv + D8pTcZt0e4PYLtEROhVG7VDahY3BGFlo1CWZxAqzDwJb3afBVXelzpKxb9V7qDIncid1bMnas7 + rSJzInNWzJxDOREReuHLimoyFqsxRShaNhSFoH2Msi8toqmO8t5oX3wyJinyZ1n86VQ1lmrW9+ + oKprhaTATb2blRTAT7yWA/Gewng/1kVldUx3a6m1ebqA5/uNpsBfEH4o9zxrmxrKwX/FNd78Wa + N5R5rZcMfIZdZGzQ2Rq9LK4glMNW5NXkTe1isDDba6WEOgvmuela6i1xGFGx970P2VpPXb9Vw9 + Y7P5v5A+EHH4muH2plS2e+I2a1umUL68W6AbEQflyKnrq1mbljIkaQSXBtqqyYE9YxJ/pJaHFk + El6H2rsjHBYP2xgtL/Y6ayDp0eGLsQcwGOvC/jD/uZGxvgg/sJ2ufliaTlLd0ozWDzeWZvS+VO + 59waaekFEH1exPh9jUc7OgGwcbzRQ5zRfijrkUcubyXJky8VCjj40E9DjG/oOpblSXtDRRzKVy + dU5Lmu0o/r8kTn5xMMbZ5ZlLOBHCqZISLs+Wl1IoACLFL3OuIMCtiTHFZS/XyouJuuz6COgR0C + v9aM29COhXtRI/Y25l2zut/ubUHvTbMFoPtmbL/N87iyVA0VolWqGM44lwrqMUShhgxlHXRwkj + MeOwvr7sALar/tQB1feUOtR9AGULZSthOhyfVy5bEXWwZ4LL8uViLXGX58u5Vg8uTxaadRvlPN + HUpSYVTguWaSM046hE024RV5pHYkBMxjQadT7CFGM1fA/tT6vsTwPXekk5rQfRtmus2Zt2od6V + 5QkBRlNmCpF7o5C7c63jcdFCk25NTLrOtc9B2ULZqolsTVwqdOm0XIVQkxRBYaNAoUtNCZ2WLT + RiNMmIQR9CmmiIp67jtL2vSABKFyLCmiBCgzMc6gPptGRBdiT6IKuvXHM60fJqEtuuI12fKBKw + 8JoqJiNzb+SkrvX00Ae5ygd5yrkMnWpS4rQerCMQROFaJVxESOiqpOo4aYje89W0qJwxCzCwGs + Nlw6oxxOTWoUZGuIbhLrkmu+SIasI4dajXotPCBbvkOsINxIirMGKa0JANMQm5QbGFTvX5c1Ab + ThsP2IYQUHYGCq3oh56MHq2RKixK0Bzvdz5/9k09mpuuP30z6PqdTucg67fRK96MpXr6446qIZ + f3XV/mR3lp6ksPzv0MVfRdbZR4Yz2DYuDyPGIZ27LK2BqNYsu7aOWNu/5Re/+ofWBVgbYl6qfq + JgC1c62ycI5U9/Ujz3rPLFTDwuY+5KRo3fOiUVQ7t9YUI4JJ/2nwYKkaTM6l0MUbbO5Tlu0GeL + ywjvX/dHBfUU2Tn4KmUD6UjhRxK8CjYpoil5YR4DQr+TF5rKNF4X0ODOROJqituBixcmovVkzR + wCGrf8WkRNVZtuqEXs2cUzFCHhU2ZGhIQlA+V/KWEa9PROr9ySLqez/wdMwuRsijZfNoQEPiVG + 5M1Vr0jDwil5bNpXeM3iMKLUuJshQ5tGwOhVAvZNCyGJQgf5bNnylNIF7bpdZQVS/0dRT3zeIs + KqYo1GNPpKAuNVWqmKIfUI+WrUf/xM08buZtRAkXhrdSyVl0zji3byqWd0FdCtSsmJioO8vWne + mjCMdKCvaEShSVaF2V6FcCNvuIOJS2hYrUMa9nKCPUoKhB66pB75ke19E6gjEjYF7xvVQrdguO + WCH79sj3QpKYt+ZDIVVMOCC0bzZMJIAiKdwx7dmD9nBcKtSgqEHrqkERg5aQD4aBI1Btfzikod + 5GRLhbFfYr3iJ9WIBL0xS2Zb2Dqdj73od1/MlknO1D5khg12pmXyfPK3kJy3yTANOUZFap7zDr + z9WMuEtr/xM3LmfEYdZfGCdR10/FyPcIH4muH2plE9ne4dlIVKrPSDr27giHaxrXSFYYTsmJiG + y21piS6DdoKaYfE7sFMXsOyJyNaeR7YHfLjvJicoyvMxKWeS56Ga8O+ED2lDkW0jhl4EL24+l5 + GApjBkvGLD+vIVvYXiTP68PsPvB5JWGvoi5omN23DSzXaiP+YBvuhqvDHz9D1QFXn/EmX7dcxl + hYdaCsqgNQdADxB+KP1yzzTdqyF5nwHYQfCD8eWnmRj7mNZ3VbSjR/uGEaQPiB8IOLfmKR01yz + 9n3zL1c6syOmxo1Vjd2nI3bbBB7NH9swf3xC+IHwA+HH7q32aP1wA2L16u19+dRpHxs3eVbnFQ + 74Hbin4C8TEaQbdv295xGZB4z7XkSHAxL0wcN+dAgudhirdPYdSi5FT93a7w+h8OCpdZqZODm4 + LhRzE9OPxxBoxsToeiJC+JF9P6OSG0ikqa2g3mcfcbBKcmF86VPtYKqTyzM2SRYAqzKaBSZ0Wb + DQkO2dX9Q3WMjleUKxsoEcdlXcoDQIRDGSma/3WdyfiIWyYW0IYh/nPRb2Wm1bL5ichOnM904V + I7CyF8Oed/6FIoSSiBAriaK1iSN8V3OFotUo0dIkvUXBaoRgKcopbGZQwBolYLCqCUE5ylgjZK + yO07RZ6SiXYXxA9T2loo6ThtaM3H1XgHhvwCh0iycQYl7HCUMpW9UIz72UR5d1IgpXo+Cheynv + KFzYIvkHjQN2ZYtyKxPaZcH6ZQ4SQmZg1oTPeE+Soinosy8YvcXaEKZoubdJUz70Ftsc0rnI5n + JLM+xK2aG3uKwIxF3NGHqLIShnxg/41v5Du5on3FI1akuF9gobzmYi3lC4oJ7ezqvouQzUn8sO + zuF1CHHCOKe3dM7b2cqF1vamgUITkJGidOHSZUrB4tJFYsYfu34ZUYTgKr7lDrXMdhlmeGdf/w + +3XY3admEwBthkmxJRjbLVKNlCkwaaNCptDOAy1sAQDBQuFK4tpW5hCEZjIKGxFdoY3Q9z5icM + xrB1DVcVHMrLDJUSjPFaEaFpFdtlucQ1bzzgIHyYzocNINlhVwNXK+7OlvVztXPDjYVaYoBVhb + GrwdJuB3NdDWDp1dazqpU3hoI37f2j9oFvWAirDQNtsNsBVD96dsjbskdQKEGDtwROvy//rOJm + SxenZ146SRKptMdSB22UFdM3ognAFih8NQfwGx29UTFFPSmQTcswH4E6LzJF3bN2V82ldZT3zR + JuK6YoSRLOQgixlA5ln1dMU292+UeOLcGbPKtUTZJQNOHYW3mTyLJZgn7Ahb/shf/CoRpvVStT + VKAlK9CYOBQ7iNzJBHQ5BUPJ1GTSaEAa4MJe1sLuEVzZy17ZFXOpzGTV2nMoleduNciKqYsbpZ + KBE2rTsrUpG9YR3TfS5YTMWTZz3iMSLQ2J1lHMG71Niicp2piQPW3IHhdG9c1VfnpRSWtp59ty + 60PN2pQTJe9YhAoUObSuHBowQRQaQpFB68qgEeXsjqo6IqdGbpA+LFByGvfewDyEakxLU5JZod + lhqoCrYfSzqQKupkNgqgC24M0X2d6PUwUwJcDSClMCHEsJaO8j/tiojieYF6rDH66uzYg/3Fib + B9b5IXoup2P2smccAIbo2WRCIc8Z51D/CFQDF9PzXCzHGavOz6UqIv5A/PFEv9mQOpdSEjsIPx + B+PCx1AyUq1WckHXt3hHd960cyPQ8hkU1ORGSPxpREv0FZFf2YQLSpkAIqut53/ZhGvsepyI7s + SE0YX2ek1dkIPxB+mDXc+i/XsmlWx6sIPy5FT93ahRFaQY8g+/p6IkJtTmTIrJ+EdiKTcFpjaN + /8yzuocjEd0aPDF2MPpkPR/OGY+eMA4QfCD4Qfu4dYN5luxkJNAgs1bdH7sllLy/8KAAAA///c + VcFu2zAM/RVD96GJl6xdUBeI2wY7BF0Qe9iZluVYiywZkty1+fpRtJM4XYHt3EtCio8S+R4lf4 + knkwmLrFcJw38Ba53aPdmV0X6pdjphBTjBIgVe6nO4Br2TerfpNPcBf3cLC6WzlgfDtXzDffQM + uO0UT8Azru5ury4Rqaj+ws7PUNzjjFhW/h/YAVF098oSlNeiEej0VfiXeCjhhCi67JC/YF2wKL + oVdntylp03T10T+ddWJAwsFJJvhJWmDHvAwkOxdr7vqN3QcUKXGwRuNzbad41szC9JLCqkKWFC + f/qRscgdkA5knEUFBXtIlzBtNDLsvJV7PFCbjCwWcWiPQW1sA0oexDdKDZooqRGNu5XS+leyXO + PvlQAU7ahIqFeblVTqqACxY5QswyI5dleciCK1jnK5MUxUleC+bxyVDONADFXAsYwns5cQZaBd + 9FOW2E0rPa9X0EiFpX2eYTM1WCdoWIhFAaP0TDZZp99kxaOkT9OYFIQFd6O8pZWgRrBj5Wc9aO + 5a+vUvqSlfSUGOQjVg1wn7Opnd3LDgbMdOnrDZbDZHdjGSnpza2MP3Z2ErZX4nzAzWMP3rCNem + 8XVQmKSrkCU0m7ZMmNM7FgFdKO4tZVzQ694O7HQY2AtUa51/AFf3U02hfiat6XRJvNYCykddDt + PbjxbW1YgSL7HA0QgWIT1I9T9IurjrwJvS29BjfDO/nn/AHrd9j/lH1jHve0w/co/poKPKTWqD + ffkC5qd1pVO083cw7697fDf6pwS/c3gt/OAV+JCiu7PQ1pI/gIexj3a7eIzNykIj7v4AAAD//w + MAUEsDBBQABgAIAAAAIQB0ytZExAAAAN4AAAAPAAAAZHJzL2Rvd25yZXYueG1sRE/LisIwFN0L + /kO4ghuxqS5UOo0iiqAgDj6Y9aW505ZpbkoTbfXrzUKY5eG801VnKvGgxpWWFUyiGARxZnXJuY + LbdTdegHAeWWNlmRQ8ycFq2e+lmGjb8pkeF5+LEMIuQQWF93UipcsKMugiWxMH7tc2Bn2ATS51 + g20IN5WcxvFMGiw5NBRY06ag7O9yNwper1s7+rnuD4u4yo+n6cY/t99aqeGgW3+B8NT5f/HHvd + cK5pP5LOwNd8IVkMs3AAAA//8DAFBLAQItABQABgAIAAAAIQCTXr2S+wAAAOEBAAATAAAAAAAA + AAAAAAAAAAAAAABbQ29udGVudF9UeXBlc10ueG1sUEsBAi0AFAAGAAgAAAAhADj9If/WAAAAlA + EAAAsAAAAAAAAAAAAAAAAALAEAAF9yZWxzLy5yZWxzUEsBAi0AFAAGAAgAAAAhALGx+E7ZFgAA + 2iACAA4AAAAAAAAAAAAAAAAAKwIAAGRycy9lMm9Eb2MueG1sUEsBAi0AFAAGAAgAAAAhAHTK1k + TEAAAA3gAAAA8AAAAAAAAAAAAAAAAAMBkAAGRycy9kb3ducmV2LnhtbFBLBQYAAAAABAAEAPMA + AAAhGgAAAAAAABDwCAAAAJ8CxAD6F2UPDwAE8MIEAAASAArwCAAAAAYsAAACCgAAswAL8EIAAA + B/AAAABACAAABWRAiBAHhhAQCCAKKtAACDAHhhAQCEAKKtAAC/AAQABACBAQIAAAi/ARAAFAD/ + AQAACAC/AwAAAgATACLx2gMAAKnD1AMAAFBLAwQUAAYACAAAACEA2+H2y+4AAACFAQAAEwAAAF + tDb250ZW50X1R5cGVzXS54bWx8kM9OwzAMh+9IvEPkK2pTOCCE2u5A4QgIjQewEreN1jpRHMr2 + 9qTbuCDg6D8/f59cb/bzpBaK4jw3cF1WoIiNt46HBt63T8UdKEnIFifP1MCBBDbt5UW9PQQSld + MsDYwphXutxYw0o5Q+EOdJ7+OMKZdx0AHNDgfSN1V1q43nRJyKtN6Atu6ox48pqcd9bp9MIk0C + 6uG0uLIawBAmZzBlU72w/UEpzoQyJ487MrogV1kD9K+EdfI34Jx7ya+JzpJ6xZiecc4a2kbR1n + 9ypKX8/8hqOUvh+94ZKrsoXY690fJtpY9PbL8AAAD//wMAUEsDBBQABgAIAAAAIQBa9CxbvwAA + ABUBAAALAAAAX3JlbHMvLnJlbHNsz8FqwzAMBuD7YO9gdF+U7lDGiNNbodfSPoCxlcQstoxksv + XtZ3pqx46S+D9Jw+EnrWYj0cjZwq7rwVD2HGKeLVwvx7cPMFpdDm7lTBZupHAYX1+GM62utpAu + sahpSlYLS63lE1H9Qslpx4Vym0wsydVWyozF+S83E773/R7l0YDxyTSnYEFOYQfmcitt8x87RS + +sPNXOc0Kepuj/UzHwdz7T1hQnM1ULQfTeFNq6dhzgOODTM+MvAAAA//8DAFBLAwQUAAYACAAA + ACEA8QgM4dMAAAD5AAAADwAAAGRycy9kb3ducmV2LnhtbESPQWvCQBCF7wX/wzJCb3WTHERSVy + lKaT2aCtLbNDsmi9nZsLvR5N938dAe37zhe3zr7Wg7cSMfjGMF+SIDQVw7bbhRcPp6f1mBCBFZ + Y+eYFEwUYLuZPa2x1O7OR7pVsREJwqFEBW2MfSllqFuyGBauJ07dxXmLMUXfSO3xnuC2k0WWLa + VFw2mhxZ52LdXXarAKTHU9uN33MuwPU5bv83EYVqdBqef5+PYKItIY/5/PRXCF/SsfqE+tIJlc + PqYfb/QRQyT/uCTTZAly8wsAAP//AwBQSwECLQAUAAYACAAAACEA2+H2y+4AAACFAQAAEwAAAA + AAAAAAAAAAAAAAAAAAW0NvbnRlbnRfVHlwZXNdLnhtbFBLAQItABQABgAIAAAAIQBa9CxbvwAA + ABUBAAALAAAAAAAAAAAAAAAAAB8BAABfcmVscy8ucmVsc1BLAQItABQABgAIAAAAIQDxCAzh0w + AAAPkAAAAPAAAAAAAAAAAAAAAAAAcCAABkcnMvZG93bnJldi54bWxQSwUGAAAAAAMAAwC3AAAA + BwMAAAAAAAAP8BAAAADEAAAAnwIAAAcHAAB/AwAADwAN8GYAAAAAAJ8PBAAAAAQAAAAAAKgPBA + AAAFJpc2sAAKEPHgAAAAUAAAAAACAAAAAAAAADBQAAAAEABgABAA4AAAAAAAAAqg8KAAAABQAA + AAEAAAAAAAAApg8OAAAA8QAAAOAB1AHQAvADEAUPAATw0QQAABIACvAIAAAABywAAAIKAACzAA + vwQgAAAH8AAAAEAIAA4FpECIEAeGEBAIIAoq0AAIMAeGEBAIQAoq0AAL8ABAAEAIEBAgAACL8B + EAAUAP8BAAAIAL8DAAACABMAIvHaAwAAqcPUAwAAUEsDBBQABgAIAAAAIQDb4fbL7gAAAIUBAA + ATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbHyQz07DMAyH70i8Q+QralM4IITa7kDhCAiNB7ASt43W + OlEcyvb2pNu4IODoPz9/n1xv9vOkForiPDdwXVagiI23jocG3rdPxR0oScgWJ8/UwIEENu3lRb + 09BBKV0ywNjCmFe63FjDSjlD4Q50nv44wpl3HQAc0OB9I3VXWrjedEnIq03oC27qjHjympx31u + n0wiTQLq4bS4shrAECZnMGVTvbD9QSnOhDInjzsyuiBXWQP0r4R18jfgnHvJr4nOknrFmJ5xzh + raRtHWf3Kkpfz/yGo5S+H73hkquyhdjr3R8m2lj09svwAAAP//AwBQSwMEFAAGAAgAAAAhAFr0 + LFu/AAAAFQEAAAsAAABfcmVscy8ucmVsc2zPwWrDMAwG4Ptg72B0X5TuUMaI01uh19I+gLGVxC + y2jGSy9e1nemrHjpL4P0nD4SetZiPRyNnCruvBUPYcYp4tXC/Htw8wWl0ObuVMFm6kcBhfX4Yz + ra62kC6xqGlKVgtLreUTUf1CyWnHhXKbTCzJ1VbKjMX5LzcTvvf9HuXRgPHJNKdgQU5hB+ZyK2 + 3zHztFL6w81c5zQp6m6P9TMfB3PtPWFCczVQtB9N4U2rp2HOA44NMz4y8AAAD//wMAUEsDBBQA + BgAIAAAAIQA64SmR0wAAAPkAAAAPAAAAZHJzL2Rvd25yZXYueG1sRI8xT8MwEIV3JP6DdUhs1A + lDVYW6FWqFoGNDGNiO+Bpbjc+R7bTJv8fqAOO7d/qevvV2cr24UIjWs4JyUYAgbr223CloPt+e + ViBiQtbYeyYFM0XYbu7v1lhpf+UjXerUiQzhWKECk9JQSRlbQw7jwg/EuTv54DDlGDqpA14z3P + XyuSiW0qHlvGBwoJ2h9lyPToGtzwe/+17G/WEuyn05jeOqGZV6fJheX0AkmtL/s/nqG1n+lTfU + h1aQTU7v80+w+ogxUbhdsmm2BLn5BQAA//8DAFBLAQItABQABgAIAAAAIQDb4fbL7gAAAIUBAA + ATAAAAAAAAAAAAAAAAAAAAAABbQ29udGVudF9UeXBlc10ueG1sUEsBAi0AFAAGAAgAAAAhAFr0 + LFu/AAAAFQEAAAsAAAAAAAAAAAAAAAAAHwEAAF9yZWxzLy5yZWxzUEsBAi0AFAAGAAgAAAAhAD + rhKZHTAAAA+QAAAA8AAAAAAAAAAAAAAAAABwIAAGRycy9kb3ducmV2LnhtbFBLBQYAAAAAAwAD + ALcAAAAHAwAAAAAAAA/wEAAAAAcHAACfAgAAvQgAAH8DAAAPAA3wdQAAAAAAnw8EAAAABAAAAA + AAqA8FAAAAU2NvcmUAAKEPHgAAAAYAAAAAACAAAAAAAAADBgAAAAEABgABAA4AAAAAAAAAqg8Y + AAAABQAAAAcAAAAAAAsEAAABAAAAAQAAAAAAAACmDw4AAADxAAAA4AHUAdAC8AMQBQ8ABPDJBA + AAEgAK8AgAAAAILAAAAgoAALMAC/BCAAAAfwAAAAQAgAAAXEQIgQB4YQEAggCirQAAgwB4YQEA + hACirQAAvwAEAAQAgQECAAAIvwEQABQA/wEAAAgAvwMAAAIAEwAi8doDAACpw9QDAABQSwMEFA + AGAAgAAAAhANvh9svuAAAAhQEAABMAAABbQ29udGVudF9UeXBlc10ueG1sfJDPTsMwDIfvSLxD + 5CtqUzgghNruQOEICI0HsBK3jdY6URzK9vak27gg4Og/P3+fXG/286QWiuI8N3BdVqCIjbeOhw + bet0/FHShJyBYnz9TAgQQ27eVFvT0EEpXTLA2MKYV7rcWMNKOUPhDnSe/jjCmXcdABzQ4H0jdV + dauN50ScirTegLbuqMePKanHfW6fTCJNAurhtLiyGsAQJmcwZVO9sP1BKc6EMiePOzK6IFdZA/ + SvhHXyN+Cce8mvic6SesWYnnHOGtpG0dZ/cqSl/P/IajlL4fveGSq7KF2OvdHybaWPT2y/AAAA + //8DAFBLAwQUAAYACAAAACEAWvQsW78AAAAVAQAACwAAAF9yZWxzLy5yZWxzbM/BasMwDAbg+2 + DvYHRflO5QxojTW6HX0j6AsZXELLaMZLL17Wd6aseOkvg/ScPhJ61mI9HI2cKu68FQ9hxini1c + L8e3DzBaXQ5u5UwWbqRwGF9fhjOtrraQLrGoaUpWC0ut5RNR/ULJaceFcptMLMnVVsqMxfkvNx + O+9/0e5dGA8ck0p2BBTmEH5nIrbfMfO0UvrDzVznNCnqbo/1Mx8Hc+09YUJzNVC0H03hTaunYc + 4Djg0zPjLwAAAP//AwBQSwMEFAAGAAgAAAAhADv21kfTAAAA+QAAAA8AAABkcnMvZG93bnJldi + 54bWxEj02LwjAURfcD/ofwBHdj2hFEqlGKMh8urW7cvTbPNtgkJUm1/fcTXMws77uPczmb3aBb + 9iDnlTUC0nkCjExlpTK1gMv5830FzAc0EltrSMBIHnbbydsGM2mf5kSPItQsQozPUEATQpdx7q + uGNPq57cjE7madxhCjq7l0+Ixw3fKPJFlyjcrEhQY72jdU3YteC1DF/Wj316U/HMckPaRD368u + vRCz6ZCvgQUawv9zmS/Kr/yvfKF+pIBocvseS6fkCX0g97pE02gJfPsLAAD//wMAUEsBAi0AFA + AGAAgAAAAhANvh9svuAAAAhQEAABMAAAAAAAAAAAAAAAAAAAAAAFtDb250ZW50X1R5cGVzXS54 + bWxQSwECLQAUAAYACAAAACEAWvQsW78AAAAVAQAACwAAAAAAAAAAAAAAAAAfAQAAX3JlbHMvLn + JlbHNQSwECLQAUAAYACAAAACEAO/bWR9MAAAD5AAAADwAAAAAAAAAAAAAAAAAHAgAAZHJzL2Rv + d25yZXYueG1sUEsFBgAAAAADAAMAtwAAAAcDAAAAAAAAD/AQAAAAvQgAAJ8CAACTCwAAfwMAAA + 8ADfBtAAAAAACfDwQAAAAEAAAAAACoDwsAAABQcm9iYWJpbGl0eQAAoQ8eAAAADAAAAAAAIAAA + AAAAAAMMAAAAAQAGAAEADgAAAAAAAACqDwoAAAAMAAAAAQAAAAAAAACmDw4AAADxAAAA4AHUAd + AC8AMQBQ8ABPDUBAAAEgAK8AgAAAAJLAAAAgoAALMAC/BCAAAAfwAAAAQAgAAgXUQIgQB4YQEA + ggCirQAAgwB4YQEAhACirQAAvwAEAAQAgQECAAAIvwEQABQA/wEAAAgAvwMAAAIAEwAi8dwDAA + Cpw9YDAABQSwMEFAAGAAgAAAAhANvh9svuAAAAhQEAABMAAABbQ29udGVudF9UeXBlc10ueG1s + fJDPTsMwDIfvSLxD5CtqUzgghNruQOEICI0HsBK3jdY6URzK9vak27gg4Og/P3+fXG/286QWiu + I8N3BdVqCIjbeOhwbet0/FHShJyBYnz9TAgQQ27eVFvT0EEpXTLA2MKYV7rcWMNKOUPhDnSe/j + jCmXcdABzQ4H0jdVdauN50ScirTegLbuqMePKanHfW6fTCJNAurhtLiyGsAQJmcwZVO9sP1BKc + 6EMiePOzK6IFdZA/SvhHXyN+Cce8mvic6SesWYnnHOGtpG0dZ/cqSl/P/IajlL4fveGSq7KF2O + vdHybaWPT2y/AAAA//8DAFBLAwQUAAYACAAAACEAWvQsW78AAAAVAQAACwAAAF9yZWxzLy5yZW + xzbM/BasMwDAbg+2DvYHRflO5QxojTW6HX0j6AsZXELLaMZLL17Wd6aseOkvg/ScPhJ61mI9HI + 2cKu68FQ9hxini1cL8e3DzBaXQ5u5UwWbqRwGF9fhjOtrraQLrGoaUpWC0ut5RNR/ULJaceFcp + tMLMnVVsqMxfkvNxO+9/0e5dGA8ck0p2BBTmEH5nIrbfMfO0UvrDzVznNCnqbo/1Mx8Hc+09YU + JzNVC0H03hTaunYc4Djg0zPjLwAAAP//AwBQSwMEFAAGAAgAAAAhANQP36bVAAAA+QAAAA8AAA + BkcnMvZG93bnJldi54bWxEjzFvwjAQhfdK/Q/WIXUrThoJoRSDEKhqGTqQsnS7xkdiEZ8j24Hk + 39diaMd37/Q9favNaDtxJR+MYwX5PANBXDttuFFw+np7XoIIEVlj55gUTBRgs358WGGp3Y2PdK + 1iIxKEQ4kK2hj7UspQt2QxzF1PnLqz8xZjir6R2uMtwW0nX7JsIS0aTgst9rRrqb5Ug1VgqsvB + 7b4XYX+Ysnyfj8OwPA1KPc3G7SuISGP8f84L91kUf+Ud9aEVJJPz+/TjjT5iiOTvl2SaLEGufw + EAAP//AwBQSwECLQAUAAYACAAAACEA2+H2y+4AAACFAQAAEwAAAAAAAAAAAAAAAAAAAAAAW0Nv + bnRlbnRfVHlwZXNdLnhtbFBLAQItABQABgAIAAAAIQBa9CxbvwAAABUBAAALAAAAAAAAAAAAAA + AAAB8BAABfcmVscy8ucmVsc1BLAQItABQABgAIAAAAIQDUD9+m1QAAAPkAAAAPAAAAAAAAAAAA + AAAAAAcCAABkcnMvZG93bnJldi54bWxQSwUGAAAAAAMAAwC3AAAACQMAAAAAAAAP8BAAAACTCw + AAnwIAALMNAAB/AwAADwAN8HYAAAAAAJ8PBAAAAAQAAAAAAKgPBgAAAEltcGFjdAAAoQ8eAAAA + BwAAAAAAIAAAAAAAAAMHAAAAAQAGAAEADgAAAAAAAACqDxgAAAAGAAAABwAAAAAACwQAAAEAAA + ABAAAAAAAAAKYPDgAAAPEAAADgAdQB0ALwAxAFDwAE8OwEAAASAArwCAAAAAosAAACCgAAswAL + 8EIAAAB/AAAABACAAMBsPAiBAHhhAQCCAKKtAACDAHhhAQCEAKKtAAC/AAQABACBAQIAAAi/AR + AAFAD/AQAACAC/AwAAAgATACLx2wMAAKnD1QMAAFBLAwQUAAYACAAAACEA2+H2y+4AAACFAQAA + EwAAAFtDb250ZW50X1R5cGVzXS54bWx8kM9OwzAMh+9IvEPkK2pTOCCE2u5A4QgIjQewEreN1j + pRHMr29qTbuCDg6D8/f59cb/bzpBaK4jw3cF1WoIiNt46HBt63T8UdKEnIFifP1MCBBDbt5UW9 + PQQSldMsDYwphXutxYw0o5Q+EOdJ7+OMKZdx0AHNDgfSN1V1q43nRJyKtN6Atu6ox48pqcd9bp + 9MIk0C6uG0uLIawBAmZzBlU72w/UEpzoQyJ487MrogV1kD9K+EdfI34Jx7ya+JzpJ6xZiecc4a + 2kbR1n9ypKX8/8hqOUvh+94ZKrsoXY690fJtpY9PbL8AAAD//wMAUEsDBBQABgAIAAAAIQBa9C + xbvwAAABUBAAALAAAAX3JlbHMvLnJlbHNsz8FqwzAMBuD7YO9gdF+U7lDGiNNbodfSPoCxlcQs + toxksvXtZ3pqx46S+D9Jw+EnrWYj0cjZwq7rwVD2HGKeLVwvx7cPMFpdDm7lTBZupHAYX1+GM6 + 2utpAusahpSlYLS63lE1H9Qslpx4Vym0wsydVWyozF+S83E773/R7l0YDxyTSnYEFOYQfmcitt + 8x87RS+sPNXOc0Kepuj/UzHwdz7T1hQnM1ULQfTeFNq6dhzgOODTM+MvAAAA//8DAFBLAwQUAA + YACAAAACEA2hIRR9QAAAD5AAAADwAAAGRycy9kb3ducmV2LnhtbESPQWvCQBCF74X+h2WE3uom + PYikriJKaT1YMAqlt2l2TBazs2F3o8m/7+LF45s3fI9vsRpsK67kg3GsIJ9mIIgrpw3XCk7Hj9 + c5iBCRNbaOScFIAVbL56cFFtrd+EDXMtYiQTgUqKCJsSukDFVDFsPUdcSpOztvMaboa6k93hLc + tvIty2bSouG00GBHm4aqS9lbBaa87Nzmdxa2uzHLt/nQ9/NTr9TLZFi/g4g0xMfz/pv2P4/yjv + rSCpLJ+XP880YfMETy90syTZYgl/8AAAD//wMAUEsBAi0AFAAGAAgAAAAhANvh9svuAAAAhQEA + ABMAAAAAAAAAAAAAAAAAAAAAAFtDb250ZW50X1R5cGVzXS54bWxQSwECLQAUAAYACAAAACEAWv + QsW78AAAAVAQAACwAAAAAAAAAAAAAAAAAfAQAAX3JlbHMvLnJlbHNQSwECLQAUAAYACAAAACEA + 2hIRR9QAAAD5AAAADwAAAAAAAAAAAAAAAAAHAgAAZHJzL2Rvd25yZXYueG1sUEsFBgAAAAADAA + MAtwAAAAgDAAAAAAAAD/AQAAAAsw0AAJ8CAAD6FwAAfwMAAA8ADfCPAAAAAACfDwQAAAAEAAAA + AACoDx8AAABSaXNrIG1nbXQvIG1pdGlnYXRpb24gYWN0aW9uKHMpAAChDx4AAAAgAAAAAAAgAA + AAAAAAAyAAAAABAAYAAQAOAAAAAAAAAKoPGAAAAB8AAAAHAAAAAAALBAAAAQAAAAEAAAAAAAAA + pg8OAAAA8QAAAOAB1AHQAvADEAUPAATwXgUAABIACvAIAAAACywAAAIKAACjAAvwPAAAAH8AAA + AEAIAAAGw8CIEAeGEBAIIAoq0AAIMAeGEBAIQAoq0AAL8ABAAEAL8BAQAVAP8BAAAIAL8DAAAC + ABMAIvHcAwAAqcPWAwAAUEsDBBQABgAIAAAAIQDb4fbL7gAAAIUBAAATAAAAW0NvbnRlbnRfVH + lwZXNdLnhtbHyQz07DMAyH70i8Q+QralM4IITa7kDhCAiNB7ASt43WOlEcyvb2pNu4IODoPz9/ + n1xv9vOkForiPDdwXVagiI23jocG3rdPxR0oScgWJ8/UwIEENu3lRb09BBKV0ywNjCmFe63FjD + SjlD4Q50nv44wpl3HQAc0OB9I3VXWrjedEnIq03oC27qjHjympx31un0wiTQLq4bS4shrAECZn + MGVTvbD9QSnOhDInjzsyuiBXWQP0r4R18jfgnHvJr4nOknrFmJ5xzhraRtHWf3Kkpfz/yGo5S+ + H73hkquyhdjr3R8m2lj09svwAAAP//AwBQSwMEFAAGAAgAAAAhAFr0LFu/AAAAFQEAAAsAAABf + cmVscy8ucmVsc2zPwWrDMAwG4Ptg72B0X5TuUMaI01uh19I+gLGVxCy2jGSy9e1nemrHjpL4P0 + nD4SetZiPRyNnCruvBUPYcYp4tXC/Htw8wWl0ObuVMFm6kcBhfX4Yzra62kC6xqGlKVgtLreUT + Uf1CyWnHhXKbTCzJ1VbKjMX5LzcTvvf9HuXRgPHJNKdgQU5hB+ZyK23zHztFL6w81c5zQp6m6P + 9TMfB3PtPWFCczVQtB9N4U2rp2HOA44NMz4y8AAAD//wMAUEsDBBQABgAIAAAAIQDHjXii1QAA + APkAAAAPAAAAZHJzL2Rvd25yZXYueG1sRI9BSwMxEIXvgv8hjODNJioUWZuWUilKi4eu2vN0M7 + sbupksSexu/72hB3t884bv8c0Wo+vEiUK0njU8ThQI4soby42G76/1wwuImJANdp5Jw5kiLOa3 + NzMsjB94R6cyNSJDOBaooU2pL6SMVUsO48T3xLmrfXCYcgyNNAGHDHedfFJqKh1azgst9rRqqT + qWv07D2m7q6eqz25blaPb1Znv8eTNK6/u7cfkKItGYrs9qqJ6Xw395QX0YDdmkfj8fgjU7jInC + 5ZJNsyXI+R8AAAD//wMAUEsBAi0AFAAGAAgAAAAhANvh9svuAAAAhQEAABMAAAAAAAAAAAAAAA + AAAAAAAFtDb250ZW50X1R5cGVzXS54bWxQSwECLQAUAAYACAAAACEAWvQsW78AAAAVAQAACwAA + AAAAAAAAAAAAAAAfAQAAX3JlbHMvLnJlbHNQSwECLQAUAAYACAAAACEAx414otUAAAD5AAAADw + AAAAAAAAAAAAAAAAAHAgAAZHJzL2Rvd25yZXYueG1sUEsFBgAAAAADAAMAtwAAAAkDAAAAAAAA + D/AQAAAAxAAAAH8DAAAHBwAA9wUAAA8ADfAGAQAAAACfDwQAAAAEAAAAAACoD44AAABPcmJpdC + BDdXN0b20gbGlzdCBpdGVtIEFQSSAoSGJBYnN0cmFjdEl0ZW1WaWV3KSBoYXMgbm90IGJlZW4g + dXNlZCBieSBvdGhlciBhcHBsaWNhdGlvbiBiZWZvcmUsIHRoZXJlICBtYXkgYmUgZXJyb3JzIG + 9yIHByb2JsZW1zIGluIE9yYml0IGFyZWEuAAChDyYAAACPAAAAAAAgAAAAAAAAA44AAAAAAEMA + AwADAAwAAQAAAAAAAgAMAAAAqg8YAAAAjgAAAAcAAAAAAAsEAAABAAAAAQAAAAAAAACmDw4AAA + DxAAAA4AHUAdAC8AMQBQ8ABPDEBAAAEgAK8AgAAAAMLAAAAgoAAKMAC/A8AAAAfwAAAAQAgABA + YjwIgQB4YQEAggCirQAAgwB4YQEAhACirQAAvwAEAAQAvwEBABUA/wEAAAgAvwMAAAIAEwAi8d + wDAACpw9YDAABQSwMEFAAGAAgAAAAhANvh9svuAAAAhQEAABMAAABbQ29udGVudF9UeXBlc10u + eG1sfJDPTsMwDIfvSLxD5CtqUzgghNruQOEICI0HsBK3jdY6URzK9vak27gg4Og/P3+fXG/286 + QWiuI8N3BdVqCIjbeOhwbet0/FHShJyBYnz9TAgQQ27eVFvT0EEpXTLA2MKYV7rcWMNKOUPhDn + Se/jjCmXcdABzQ4H0jdVdauN50ScirTegLbuqMePKanHfW6fTCJNAurhtLiyGsAQJmcwZVO9sP + 1BKc6EMiePOzK6IFdZA/SvhHXyN+Cce8mvic6SesWYnnHOGtpG0dZ/cqSl/P/IajlL4fveGSq7 + KF2OvdHybaWPT2y/AAAA//8DAFBLAwQUAAYACAAAACEAWvQsW78AAAAVAQAACwAAAF9yZWxzLy + 5yZWxzbM/BasMwDAbg+2DvYHRflO5QxojTW6HX0j6AsZXELLaMZLL17Wd6aseOkvg/ScPhJ61m + I9HI2cKu68FQ9hxini1cL8e3DzBaXQ5u5UwWbqRwGF9fhjOtrraQLrGoaUpWC0ut5RNR/ULJac + eFcptMLMnVVsqMxfkvNxO+9/0e5dGA8ck0p2BBTmEH5nIrbfMfO0UvrDzVznNCnqbo/1Mx8Hc+ + 09YUJzNVC0H03hTaunYc4Djg0zPjLwAAAP//AwBQSwMEFAAGAAgAAAAhAGnGxMPVAAAA+QAAAA + 8AAABkcnMvZG93bnJldi54bWxEj8FOwzAQRO9I/IO1SNyoA4eC0roVKiqgRhwaKOdtvE6sxuvI + Nm3691g9wHF2Vm/05svR9eJIIVrPCu4nBQjixmvLrYKvz/XdE4iYkDX2nknBmSIsF9dXcyy1P/ + GWjnVqRYZwLFFBl9JQShmbjhzGiR+Ic2d8cJhyDK3UAU8Z7nr5UBRT6dByXuhwoFVHzaH+cQrW + dmOmq4++qutRf5tNddi96EKp25vxeQYi0Zj+n18r82j2f+UF9a4VZBPzdt4Hq7cYE4XLJZtmS5 + CLXwAAAP//AwBQSwECLQAUAAYACAAAACEA2+H2y+4AAACFAQAAEwAAAAAAAAAAAAAAAAAAAAAA + W0NvbnRlbnRfVHlwZXNdLnhtbFBLAQItABQABgAIAAAAIQBa9CxbvwAAABUBAAALAAAAAAAAAA + AAAAAAAB8BAABfcmVscy8ucmVsc1BLAQItABQABgAIAAAAIQBpxsTD1QAAAPkAAAAPAAAAAAAA + AAAAAAAAAAcCAABkcnMvZG93bnJldi54bWxQSwUGAAAAAAMAAwC3AAAACQMAAAAAAAAP8BAAAA + AHBwAAfwMAAL0IAAD3BQAADwAN8GwAAAAAAJ8PBAAAAAQAAAAAAKgPAgAAADE2AAChDxgAAAAD + AAAAAAAgAAAAAAAAAwMAAAAAAAIADAAAAKoPGAAAAAIAAAAHAAAAAAALBAAAAQAAAAEAAAAAAA + AApg8OAAAA8QAAAOAB1AHQAvADEAUPAATwwwQAABIACvAIAAAADSwAAAIKAACjAAvwPAAAAH8A + AAAEAIAAYBA+CIEAeGEBAIIAoq0AAIMAeGEBAIQAoq0AAL8ABAAEAL8BAQAVAP8BAAAIAL8DAA + ACABMAIvHcAwAAqcPWAwAAUEsDBBQABgAIAAAAIQDb4fbL7gAAAIUBAAATAAAAW0NvbnRlbnRf + VHlwZXNdLnhtbHyQz07DMAyH70i8Q+QralM4IITa7kDhCAiNB7ASt43WOlEcyvb2pNu4IODoPz + 9/n1xv9vOkForiPDdwXVagiI23jocG3rdPxR0oScgWJ8/UwIEENu3lRb09BBKV0ywNjCmFe63F + jDSjlD4Q50nv44wpl3HQAc0OB9I3VXWrjedEnIq03oC27qjHjympx31un0wiTQLq4bS4shrAEC + ZnMGVTvbD9QSnOhDInjzsyuiBXWQP0r4R18jfgnHvJr4nOknrFmJ5xzhraRtHWf3Kkpfz/yGo5 + S+H73hkquyhdjr3R8m2lj09svwAAAP//AwBQSwMEFAAGAAgAAAAhAFr0LFu/AAAAFQEAAAsAAA + BfcmVscy8ucmVsc2zPwWrDMAwG4Ptg72B0X5TuUMaI01uh19I+gLGVxCy2jGSy9e1nemrHjpL4 + P0nD4SetZiPRyNnCruvBUPYcYp4tXC/Htw8wWl0ObuVMFm6kcBhfX4Yzra62kC6xqGlKVgtLre + UTUf1CyWnHhXKbTCzJ1VbKjMX5LzcTvvf9HuXRgPHJNKdgQU5hB+ZyK23zHztFL6w81c5zQp6m + 6P9TMfB3PtPWFCczVQtB9N4U2rp2HOA44NMz4y8AAAD//wMAUEsDBBQABgAIAAAAIQCJlUK21Q + AAAPkAAAAPAAAAZHJzL2Rvd25yZXYueG1sRI9BawIxEIXvBf9DGKG3mm2hS9kapVikRenB1Xoe + N7O7wc1km6S6/vsGD/X45g3f45vOB9uJE/lgHCt4nGQgiCunDTcKdtvlwwuIEJE1do5JwYUCzG + ejuykW2p15Q6cyNiJBOBSooI2xL6QMVUsWw8T1xKmrnbcYU/SN1B7PCW47+ZRlubRoOC202NOi + pepY/loFS7Oq88VXty7LQe/r1fr4/a4zpe7Hw9sriEhDvD0//zhp8v/yivrUCpJJ/XE5eKM3GC + L56yWZJkuQsz8AAAD//wMAUEsBAi0AFAAGAAgAAAAhANvh9svuAAAAhQEAABMAAAAAAAAAAAAA + AAAAAAAAAFtDb250ZW50X1R5cGVzXS54bWxQSwECLQAUAAYACAAAACEAWvQsW78AAAAVAQAACw + AAAAAAAAAAAAAAAAAfAQAAX3JlbHMvLnJlbHNQSwECLQAUAAYACAAAACEAiZVCttUAAAD5AAAA + DwAAAAAAAAAAAAAAAAAHAgAAZHJzL2Rvd25yZXYueG1sUEsFBgAAAAADAAMAtwAAAAkDAAAAAA + AAD/AQAAAAvQgAAH8DAACTCwAA9wUAAA8ADfBrAAAAAACfDwQAAAAEAAAAAACoDwEAAAA0AACh + DxgAAAACAAAAAAAgAAAAAAAAAwIAAAAAAAIADAAAAKoPGAAAAAEAAAAHAAAAAAALBAAAAQAAAA + EAAAAAAAAApg8OAAAA8QAAAOAB1AHQAvADEAUPAATwwwQAABIACvAIAAAADiwAAAIKAACjAAvw + PAAAAH8AAAAEAIAAAF9ECIEAeGEBAIIAoq0AAIMAeGEBAIQAoq0AAL8ABAAEAL8BAQAVAP8BAA + AIAL8DAAACABMAIvHcAwAAqcPWAwAAUEsDBBQABgAIAAAAIQDb4fbL7gAAAIUBAAATAAAAW0Nv + bnRlbnRfVHlwZXNdLnhtbHyQz07DMAyH70i8Q+QralM4IITa7kDhCAiNB7ASt43WOlEcyvb2pN + u4IODoPz9/n1xv9vOkForiPDdwXVagiI23jocG3rdPxR0oScgWJ8/UwIEENu3lRb09BBKV0ywN + jCmFe63FjDSjlD4Q50nv44wpl3HQAc0OB9I3VXWrjedEnIq03oC27qjHjympx31un0wiTQLq4b + S4shrAECZnMGVTvbD9QSnOhDInjzsyuiBXWQP0r4R18jfgnHvJr4nOknrFmJ5xzhraRtHWf3Kk + pfz/yGo5S+H73hkquyhdjr3R8m2lj09svwAAAP//AwBQSwMEFAAGAAgAAAAhAFr0LFu/AAAAFQ + EAAAsAAABfcmVscy8ucmVsc2zPwWrDMAwG4Ptg72B0X5TuUMaI01uh19I+gLGVxCy2jGSy9e1n + emrHjpL4P0nD4SetZiPRyNnCruvBUPYcYp4tXC/Htw8wWl0ObuVMFm6kcBhfX4Yzra62kC6xqG + lKVgtLreUTUf1CyWnHhXKbTCzJ1VbKjMX5LzcTvvf9HuXRgPHJNKdgQU5hB+ZyK23zHztFL6w8 + 1c5zQp6m6P9TMfB3PtPWFCczVQtB9N4U2rp2HOA44NMz4y8AAAD//wMAUEsDBBQABgAIAAAAIQ + CJlUK21QAAAPkAAAAPAAAAZHJzL2Rvd25yZXYueG1sRI9BawIxEIXvBf9DGKG3mm2hS9kapVik + RenB1XoeN7O7wc1km6S6/vsGD/X45g3f45vOB9uJE/lgHCt4nGQgiCunDTcKdtvlwwuIEJE1do + 5JwYUCzGejuykW2p15Q6cyNiJBOBSooI2xL6QMVUsWw8T1xKmrnbcYU/SN1B7PCW47+ZRlubRo + OC202NOipepY/loFS7Oq88VXty7LQe/r1fr4/a4zpe7Hw9sriEhDvD0//zhp8v/yivrUCpJJ/X + E5eKM3GCL56yWZJkuQsz8AAAD//wMAUEsBAi0AFAAGAAgAAAAhANvh9svuAAAAhQEAABMAAAAA + AAAAAAAAAAAAAAAAAFtDb250ZW50X1R5cGVzXS54bWxQSwECLQAUAAYACAAAACEAWvQsW78AAA + AVAQAACwAAAAAAAAAAAAAAAAAfAQAAX3JlbHMvLnJlbHNQSwECLQAUAAYACAAAACEAiZVCttUA + AAD5AAAADwAAAAAAAAAAAAAAAAAHAgAAZHJzL2Rvd25yZXYueG1sUEsFBgAAAAADAAMAtwAAAA + kDAAAAAAAAD/AQAAAAkwsAAH8DAACzDQAA9wUAAA8ADfBrAAAAAACfDwQAAAAEAAAAAACoDwEA + AAA0AAChDxgAAAACAAAAAAAgAAAAAAAAAwIAAAAAAAIADAAAAKoPGAAAAAEAAAAHAAAAAAALBA + AAAQAAAAEAAAAAAAAApg8OAAAA8QAAAOAB1AHQAvADEAUPAATwugUAABIACvAIAAAADywAAAIK + AACjAAvwPAAAAH8AAAAEAIAAIPRdCIEAeGEBAIIAoq0AAIMAeGEBAIQAoq0AAL8ABAAEAL8BAQ + AVAP8BAAAIAL8DAAACABMAIvHdAwAAqcPXAwAAUEsDBBQABgAIAAAAIQDb4fbL7gAAAIUBAAAT + AAAAW0NvbnRlbnRfVHlwZXNdLnhtbHyQz07DMAyH70i8Q+QralM4IITa7kDhCAiNB7ASt43WOl + Ecyvb2pNu4IODoPz9/n1xv9vOkForiPDdwXVagiI23jocG3rdPxR0oScgWJ8/UwIEENu3lRb09 + BBKV0ywNjCmFe63FjDSjlD4Q50nv44wpl3HQAc0OB9I3VXWrjedEnIq03oC27qjHjympx31un0 + wiTQLq4bS4shrAECZnMGVTvbD9QSnOhDInjzsyuiBXWQP0r4R18jfgnHvJr4nOknrFmJ5xzhra + RtHWf3Kkpfz/yGo5S+H73hkquyhdjr3R8m2lj09svwAAAP//AwBQSwMEFAAGAAgAAAAhAFr0LF + u/AAAAFQEAAAsAAABfcmVscy8ucmVsc2zPwWrDMAwG4Ptg72B0X5TuUMaI01uh19I+gLGVxCy2 + jGSy9e1nemrHjpL4P0nD4SetZiPRyNnCruvBUPYcYp4tXC/Htw8wWl0ObuVMFm6kcBhfX4Yzra + 62kC6xqGlKVgtLreUTUf1CyWnHhXKbTCzJ1VbKjMX5LzcTvvf9HuXRgPHJNKdgQU5hB+ZyK23z + HztFL6w81c5zQp6m6P9TMfB3PtPWFCczVQtB9N4U2rp2HOA44NMz4y8AAAD//wMAUEsDBBQABg + AIAAAAIQDy+Jxs1gAAAPkAAAAPAAAAZHJzL2Rvd25yZXYueG1sRI9BawIxEIXvBf9DmIK3mq0H + KVujiEUsigfXVuhtupndDbuZLEmq679v8NAe37zhe3zz5WA7cSEfjGMFz5MMBHHptOFawcdp8/ + QCIkRkjZ1jUnCjAMvF6GGOuXZXPtKliLVIEA45Kmhi7HMpQ9mQxTBxPXHqKuctxhR9LbXHa4Lb + Tk6zbCYtGk4LDfa0bqhsix+rYGN21Wx96PZFMehztdu3n286U2r8OKxeQUQa4v+zPX+t2ulfeU + e9awXJpNrevr3RRwyR/P2STJMlyMUvAAAA//8DAFBLAQItABQABgAIAAAAIQDb4fbL7gAAAIUB + AAATAAAAAAAAAAAAAAAAAAAAAABbQ29udGVudF9UeXBlc10ueG1sUEsBAi0AFAAGAAgAAAAhAF + r0LFu/AAAAFQEAAAsAAAAAAAAAAAAAAAAAHwEAAF9yZWxzLy5yZWxzUEsBAi0AFAAGAAgAAAAh + APL4nGzWAAAA+QAAAA8AAAAAAAAAAAAAAAAABwIAAGRycy9kb3ducmV2LnhtbFBLBQYAAAAAAw + ADALcAAAAKAwAAAAAAAA/wEAAAALMNAAB/AwAA+hcAAPcFAAAPABHwgAAAAA8AiBN4AAAADwCK + EzAAAAAAALoPEAAAAF8AXwBfAFAAUABUADEAMAAAAIsTEAAAAAAAsQ8IAAAAAAAAAwAAAQAPAI + oTOAAAAAAAug8OAAAAXwBfAF8AUABQAFQAOQAAAIsTGgAAAAAArA8SAAAAAAAAAgEAAAAQAAAA + AAAAAAAADwAN8NkAAAAAAJ8PBAAAAAQAAAAAAKgPWwAAAEZpbmQgcHJvYmxlbXMgd2l0aCBEYX + kgdmlldyBkZW1vIGFzIGVhcmxpZXIgYXMgcG9zc2libGU7DURpcmVjdCBjb21tdW5pY3Rpb24g + dG8gT3JiaXQgdGVhbS4AAKEPIAAAAFwAAAAAACEAAAAFAAAAAANcAAAAAAAmAAQADAAAAAD+AA + CqDyIAAAA5AAAAAQAAAAAAIgAAAAcAAAAAAAsEAAABAAAAAQAAAAAAAACmDxAAAAD5AAAA4AHY + ANQB0ALwAxAFDwAE8EgGAAASAArwCAAAABAsAAACCgAAowAL8DwAAAB/AAAABACAAEDyXQiBAH + hhAQCCAKKtAACDAHhhAQCEAKKtAAC/AAQABAC/AQEAFQD/AQAACAC/AwAAAgATACLx3AMAAKnD + 1gMAAFBLAwQUAAYACAAAACEA2+H2y+4AAACFAQAAEwAAAFtDb250ZW50X1R5cGVzXS54bWx8kM + 9OwzAMh+9IvEPkK2pTOCCE2u5A4QgIjQewEreN1jpRHMr29qTbuCDg6D8/f59cb/bzpBaK4jw3 + cF1WoIiNt46HBt63T8UdKEnIFifP1MCBBDbt5UW9PQQSldMsDYwphXutxYw0o5Q+EOdJ7+OMKZ + dx0AHNDgfSN1V1q43nRJyKtN6Atu6ox48pqcd9bp9MIk0C6uG0uLIawBAmZzBlU72w/UEpzoQy + J487MrogV1kD9K+EdfI34Jx7ya+JzpJ6xZiecc4a2kbR1n9ypKX8/8hqOUvh+94ZKrsoXY690f + JtpY9PbL8AAAD//wMAUEsDBBQABgAIAAAAIQBa9CxbvwAAABUBAAALAAAAX3JlbHMvLnJlbHNs + z8FqwzAMBuD7YO9gdF+U7lDGiNNbodfSPoCxlcQstoxksvXtZ3pqx46S+D9Jw+EnrWYj0cjZwq + 7rwVD2HGKeLVwvx7cPMFpdDm7lTBZupHAYX1+GM62utpAusahpSlYLS63lE1H9Qslpx4Vym0ws + ydVWyozF+S83E773/R7l0YDxyTSnYEFOYQfmcitt8x87RS+sPNXOc0Kepuj/UzHwdz7T1hQnM1 + ULQfTeFNq6dhzgOODTM+MvAAAA//8DAFBLAwQUAAYACAAAACEADip5D9UAAAD5AAAADwAAAGRy + cy9kb3ducmV2LnhtbESPQU8CMRCF7yb+h2ZMvElXDmhWCjEQooEYYRHOw3Z2t2E73bQVln9vw0 + GOb97ke/nG09624kQ+GMcKngcZCOLSacO1gp/t4ukVRIjIGlvHpOBCAaaT+7sx5tqdeUOnItYi + QTjkqKCJsculDGVDFsPAdcSpq5y3GFP0tdQezwluWznMspG0aDgtNNjRrKHyWPxaBQuzrEazr3 + ZVFL3eV8vVcTfXmVKPD/37G4hIfbw9H75fyrX8L6+oT60gmVQfl4M3eoMhkr9ekmmyBDn5AwAA + //8DAFBLAQItABQABgAIAAAAIQDb4fbL7gAAAIUBAAATAAAAAAAAAAAAAAAAAAAAAABbQ29udG + VudF9UeXBlc10ueG1sUEsBAi0AFAAGAAgAAAAhAFr0LFu/AAAAFQEAAAsAAAAAAAAAAAAAAAAA + HwEAAF9yZWxzLy5yZWxzUEsBAi0AFAAGAAgAAAAhAA4qeQ/VAAAA+QAAAA8AAAAAAAAAAAAAAA + AABwIAAGRycy9kb3ducmV2LnhtbFBLBQYAAAAAAwADALcAAAAJAwAAAAAAAA/wEAAAAMQAAAD3 + BQAABwcAADAKAAAPAA3w8AEAAAAAnw8EAAAABAAAAAAAoA+GAQAATgBlAHcAIABzAHQAeQBsAG + UAIABVAEkAIABzAHAAZQBjAGkAZgBpAGMAYQB0AGkAbwBuACAAZABvAGUAcwBuABkgdAAgAHAA + cgBvAHYAaQBkAGUAIABlAG4AbwB1AGcAaAAgAGYAdQBuAGMAdABpAG8AbgAgAGQAZQBzAGMAcg + BpAHAAdABpAG8AbgAgAGYAbwByACAAZABlAHYAZQBsAG8AcABtAGUAbgB0ACAAYQBuAGQAIAB0 + AGUAcwB0AGkAbgBnACAAdABlAGEAbQAsACAAbQBvAHIAZQAgAGUAcgByAG8AcgAgAG8AcgAgAG + 0AaQBzAHMAaQBuAGcAIABmAGUAYQB0AHUAcgBlAHMAIABvAHIAIABpAG4AYwBvAHIAcgBlAGMA + dAAgAGkAbQBwAGwAZQBtAGUAbgB0AGEAdABpAG8AbgAgAG0AYQB5ACAAYgBlACAAZgBvAHUAbg + BkACAAaQBuACAAdABoAGUAIABsAGEAdABlACAAcABoAGEAcwBlAC4AAAChDxgAAADEAAAAAAAg + AAAAAAAAA8QAAAAAAAIADAAAAKoPGAAAAMMAAAAHAAAAAAALBAAAAQAAAAEAAAAAAAAApg8OAA + AA8QAAAOAB1AHQAvADEAUPAATwxAQAABIACvAIAAAAESwAAAIKAACjAAvwPAAAAH8AAAAEAIAA + YPZdCIEAeGEBAIIAoq0AAIMAeGEBAIQAoq0AAL8ABAAEAL8BAQAVAP8BAAAIAL8DAAACABMAIv + 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 + V9agXZpPm4HILRW4yJwvWSTbMlyPkvAAAA//8DAFBLAQItABQABgAIAAAAIQDb4fbL7gAAAIUB + AAATAAAAAAAAAAAAAAAAAAAAAABbQ29udGVudF9UeXBlc10ueG1sUEsBAi0AFAAGAAgAAAAhAF + r0LFu/AAAAFQEAAAsAAAAAAAAAAAAAAAAAHwEAAF9yZWxzLy5yZWxzUEsBAi0AFAAGAAgAAAAh + APcOwaHVAAAA+QAAAA8AAAAAAAAAAAAAAAAABwIAAGRycy9kb3ducmV2LnhtbFBLBQYAAAAAAw + ADALcAAAAJAwAAAAAAAA/wEAAAALMNAAD3BQAA+hcAADAKAAAPABHwgAAAAA8AiBN4AAAADwCK + EzAAAAAAALoPEAAAAF8AXwBfAFAAUABUADEAMAAAAIsTEAAAAAAAsQ8IAAAAAAAAAwAAAQAPAI + oTOAAAAAAAug8OAAAAXwBfAF8AUABQAFQAOQAAAIsTGgAAAAAArA8SAAAAAAAAAgEAAAAQAAAA + AAAAAAAADwAN8HoBAAAAAJ8PBAAAAAQAAAAAAKgPBgEAAEludml0ZSBVSSBkZXNpZ25lciB0by + BzcHJpbnQgZGVtbyAmIHBsYW5uaW5nIHNlc3Npb247DURpcmVjdCBjb21tdW5pY2F0aW9uIGJl + dHdlZW4gZGV2ZWxvcG1lbnQsIHRlc3RpbmcgdGVhbSBhbmQgVUkgZGVzaWduZXI7DVRlc3Rpbm + cgdGVhbSBwcm92aWRlIG1pc3NpbmcgdXNlIGNhc2Ugb3IgZXhjZXB0aW9uIGNhc2VzIHRvIFVJ + IGRlc2lnbmVyOw1BbGxvY2F0ZSBhbm90aGVyIFVJIGRlc2lnbmVyIHRvIG1ha2UgZGV0YWlsZW + QgVUkgc3BlY2lmaWNhdGlvbi4AAKEPIAAAAAcBAAAAACEAAAAFAAAAAAMHAQAAAAAmAAQADAAA + AAD+AACqDxgAAAAGAQAABwAAAAAACwQAAAEAAAABAAAAAAAAAKYPEAAAAPkAAADgAdgA1AHQAv + ADEAUPAATwTwUAABIACvAIAAAAFSwAAAIKAACjAAvwPAAAAH8AAAAEAIAAIPpdCIEAeGEBAIIA + oq0AAIMAeGEBAIQAoq0AAL8ABAAEAL8BAQAVAP8BAAAIAL8DAAACABMAIvHdAwAAqcPXAwAAUE + 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 + ZyK23zHztFL6w81c5zQp6m6P9TMfB3PtPWFCczVQtB9N4U2rp2HOA44NMz4y8AAAD//wMAUEsD + BBQABgAIAAAAIQAYieRZ1QAAAPkAAAAPAAAAZHJzL2Rvd25yZXYueG1sRI9BTwIxEIXvJv6HZk + y8SVcPxKwUYkCigXhgRbkO29ltw3a6aSss/96GgxzfvMn38k1mg+vEkUK0nhU8jgoQxLXXllsF + 26/lwzOImJA1dp5JwZkizKa3NxMstT/xho5VakWGcCxRgUmpL6WMtSGHceR74tw1PjhMOYZW6o + CnDHedfCqKsXRoOS8Y7GluqD5Uv07B0q6a8fyzW1fVoH+a1frwvdCFUvd3w+sLiERDuj4v3oLZ + bf/LC+pDK8gmzft5H6zeYEwULpdsmi1BTv8AAAD//wMAUEsBAi0AFAAGAAgAAAAhANvh9svuAA + AAhQEAABMAAAAAAAAAAAAAAAAAAAAAAFtDb250ZW50X1R5cGVzXS54bWxQSwECLQAUAAYACAAA + ACEAWvQsW78AAAAVAQAACwAAAAAAAAAAAAAAAAAfAQAAX3JlbHMvLnJlbHNQSwECLQAUAAYACA + AAACEAGInkWdUAAAD5AAAADwAAAAAAAAAAAAAAAAAHAgAAZHJzL2Rvd25yZXYueG1sUEsFBgAA + AAADAAMAtwAAAAkDAAAAAAAAD/AQAAAAxAAAAO0MAAAHBwAAZQ8AAA8ADfD5AAAAAACfDwQAAA + AEAAAAAACoD48AAABJQUQgc3VwcG9ydCBpcyBkZXBlbmRpbmcgb24gQ2FsZW5kYXIgYXBwbGlj + YXRpb24gSUFEIHN1cHBvcnQgc2NoZWR1bGUuIEl0IG1heSBiZSBhIHJpc2sgZm9yIHJlbGVhc2 + Ugc2NoZWR1bGUgaWYgd2UgbXVzdCBwcm92aWRlIGJpbmFyeSBkZWxpdmVyLgAAoQ8YAAAAkAAA + AAAAIAAAAAAAAAOQAAAAAAACAAwAAACqDxgAAACPAAAABwAAAAAACwQAAAEAAAABAAAAAAAAAK + YPDgAAAPEAAADgAdQB0ALwAxAFDwAE8MUEAAASAArwCAAAABssAAACCgAAowAL8DwAAAB/AAAA + BACAAOAhXwiBAHhhAQCCAKKtAACDAHhhAQCEAKKtAAC/AAQABAC/AQEAFQD/AQAACAC/AwAAAg + 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 + oPDgAAACgAAAAHAAAAAAAJCAAADwAE8I0DAAASAArwCAAAAAUwAAAACgAA8wAL8HIAAAB/AAAA + 7wGAAMDm5waBAHhhAQCCAKKtAACDAHhhAQCEAKKtAAC/AAQABACBAQAAAAi/ARAAEADAAQEAAA + jLAc4YAAD/AQgAGAA/AwAACACAwxgAAAC/AwAAAgBSAGUAYwB0AGEAbgBnAGwAZQAgADMAAAAT + ACLxBgAAAP8BAABAAAAAEPAIAAAAlALJAJQXDw8PAA3w3QIAAAAAnw8EAAAABAAAAAAAqA8hAQ + AADUFyY2hpdGVjdHVyZQ1BcmNoaXRlY3R1cmUgcHJlLXN0dWR5IHdhcyBhcHByb3ZlZA1VSSBk + ZXNpZ24NVUkgc3BlY2lmaWNhdGlvbiAob25lIHBhZ2UgVUkgZmxvdyB3aXRoIGZldyB0ZXh0KS + BpcyBhdmFpbGFibGUsIG1pc3NpbmcgdXNlIGNhc2VzLCB1cGRhdGUgaXMgb25nb2luZy4NUGFy + dGlhbCBidXkNVGlldG8gaXMgcmVzcG9uc2libGUgZm9yIERheSB2aWV3IGltcGxlbWVudGF0aW + 9uDUlQUg1ObyBJUFIgaXNzdWUgc2luY2UgcG9ydGluZyBmcm9tIEJ1c2luZXNzIENhbGVuZGFy + IDkuMiBEYXkgdmlldwAAoQ82AQAAAQAAAAEAAAAAAA0AAAAAACEAAAAFAAAAAAMkAAAAAQAhAA + AABQAAAAADCgAAAAAAIQAAAAUAAAAAA2YAAAABACEAAAAFAAAAAAMMAAAAAAAhAAAABQAAAAAD + MQAAAAEAIQAAAAUAAAAAAwQAAAAAACEAAAAFAAAAAAM/AAAAAQAhAAAABQAAAAADAQAAAAAAQw + ADAAMACQANAAAAAABDAAMAAwAQACQAAAAABEMAAAQDAAMAEAAKAAAAAARDAAAEAwADABAAZgAA + AAAIQwAACAMAAwAQAAwAAAAACEMAAAgDAAMAEAAwAAAAAAxDAAAMAwADABAAAQAAAAAMQwAADA + MAAwAOAAMAAAAADEMAAAwDAAMAEAABAAAAAAxDAAAMAwADAA4APwAAAAAMQwAADAMAAwAQAAAA + qg9IAAAAAQAAAAEAAAAAAKAAAAAHAAAAAAALBAAADQAAAAEAAAAAADAAAAAHAAAAAAALBAAAAQ + AAAAEAAAAAAEMAAAAHAAAAAAAJCAAAAACmDxIAAAD5AgAA4AF5AKQBKQHQAvADEAUQAPAHIAAA + AP///wAAAAAAgICAAAAzzAAEBHcAr9TwAESlHAD58gYADwCIEzgAAAAPAIoTMAAAAAAAug8QAA + AAXwBfAF8AUABQAFQAMQAwAAAAixMQAAAAAADrLggAAADee8kBYNaI8gAAIgQIAAAAAQAAAAIA + AAAPAO4DXwsAAAIA7wMYAAAAEAAAAAAAAAAAAAAABAAAgAkBAAAHAAAAAAD5AxAAAAAAAAAAAA + AAAAMKAQACsP0FDwAMBKcKAAAPAALwnwoAABACCPAIAAAABwAAAAcIAAAPAAPwhwoAAA8ABPAo + AAAAAQAJ8BAAAAAAAAAAAAAAAAAAAAAAAAAAAgAK8AgAAAAACAAABQAAAA8ABPBTAQAAogwK8A + gAAAADCAAAAAoAANMAC/B4AAAAfwABAO8BgACAbTwIgQB4YQEAggCirQAAgwB4YQEAhACirQAA + vwAEAAQAvwEBABEAywGcMQAA/wEQABgAPwMAAAgAgMMqAAAAvwMAAAIARgBvAG8AdABlAHIAIA + BQAGwAYQBjAGUAaABvAGwAZABlAHIAIAAzAAAAEwAi8QYAAAD/AQAAQAAAABDwCAAAAA4QWQHF + C4cQDwAN8J0AAAAAAJ8PBAAAAAQAAAAAAKgPOQAAAKkgMjAwOCAgTm9raWEgCSBWMS4wIEVwaW + MgVGVtcGxhdGUgLnBwdCAvIDIwMDktMDgtMDQgLyBTQwAAoQ8cAAAAOgAAAAAABHAAAAAAWgAA + AAAAOgAAAAAAAgAIAAAAqg8OAAAAOgAAAAcAAAAAAAAEAAAAAKYPDgAAAPEAAAD+ANQB0ALwAx + AFDwAE8AABAACiDArwCAAAAAQIAAAACgAAgwAL8GYAAAB/AAEA7wGAAKBuPAi/AAQABAC/AQEA + EQD/ARAAGAA/AwAACACAwzYAAAC/AwAAAgBTAGwAaQBkAGUAIABOAHUAbQBiAGUAcgAgAFAAbA + BhAGMAZQBoAG8AbABkAGUAcgAgADQAAAAAABDwCAAAAAoQcABbAYcQDwAN8GoAAAAAAJ8PBAAA + AAQAAAAAAKAPAgAAACoAAAChDxoAAAACAAAAAAAEYAAAAAAAAAAAAgAAAAAAAgAIAAAA2A8EAA + AAAAAAAAAAqg8KAAAAAgAAAAEAAAAAAAAApg8MAAAA8AAAANQB0ALwAxAFDwAE8EgBAAASAArw + CAAAAAUIAAAgAgAAEwEL8H4AAAAEAAAAAAB/AAEA7wGAAKACPgiBAKCMAACCAKCMAACDAKCMAA + CEAKCMAACFAAAAAACHAAAAAACIAAAAAAC/AAQABAC/AQAAEQD/AQAAEQABAwIMAAA/AwAACACA + wxgAAAC/AwAAAgBSAGUAYwB0AGEAbgBnAGwAZQAgADIAAAAAABDwCAAAAAAAcQDfEEIBDwAR8B + AAAAAAAMMLCAAAAP////8NABMADwAN8IIAAAAAAJ8PBAAAAAAAAAAAAKgPMgAAADMuOSBJbXBs + ZW1lbnRhdGlvbiBQbGFubmluZzoLRXBpYyBwbGFubmluZyBzdW1tYXJ5AAChDx4AAAAzAAAAAA + AAAAoABwAdAAAAAAAAABYAAAAAAAIAHAAAAKoPDgAAADMAAAAHAAAAAAAJCAAADwAE8PsEAAAS + AArwCAAAAAYIAAAACgAA8wAL8HIAAAB/AAAA7wGAAOAEPgiBAHhhAQCCAKKtAACDAHhhAQCEAK + KtAAC/AAQABACBAQAAAAi/ARAAEADAAQEAAAjLAc4YAAD/AQgAGAA/AwAACACAwxgAAAC/AwAA + AgBSAGUAYwB0AGEAbgBnAGwAZQAgADMAAAATACLxBgAAAP8BAABAAAAAEPAIAAAAtgJwAOkXcw + 8PAA3wSwQAAAAAnw8EAAAABAAAAAAAqA/ZAQAAQnVkZ2V0ICYgZnVuZGluZw0xSC8yMDEwIGNv + c3Qgd2FzIGFwcHJvdmVkLCAySC8yMDEwIGNvc3QgaGFzIG5vdCBiZWVuIGFwcHJvdmVkLg0NRG + V2aWF0aW9ucyBpbiBYMC1NaWxlc3RvbmUgY3JpdGVyaWEgY2hlY2tsaXN0DWh0dHA6Ly93aWtp + cy5pbi5ub2tpYS5jb20vU0REaWZmZXJlbnRpYXRpbmdTVy9EU1dfWDBfTWlsZXN0b25lX0NyaX + RlcmlhX0RyYWZ0X3YwXzINUDEyIFByb2plY3QgaW5mb3JtYXRpb24gbWFuYWdlbWVudCBzdHJ1 + Y3R1cmVzIGluIHBsYWNlDVAxNE1haW50ZW5hbmNlIHBsYW4gZG9uZQ1WMSBRdWFsaXR5IGtpY2 + stb2ZmIG1lZXRpbmcgaGVsZA1WMiBQcm9qZWN0IHF1YWxpdHkgdGFyZ2V0cyBkZWZpbmVkIChx + dWFsaXR5IHBsYW4pDVYzIFByb2plY3QgdGVzdGluZyBwbGFuIGNyZWF0ZWQgd2l0aCB0ZXN0aW + 5nIHNjb3BlIGFuZCBhcHByb2FjaA1EMSBBcHByb3ZlZCBVSSBzcGVjaWZpY2F0aW9uIGV4aXN0 + cw0AAKEPqAEAABEAAAAAACEAAAAFAAAAAAM/AAAAAQAhAAAABQAAAAADAQAAAAEAIAAAAAAAAA + MuAAAAAAAhAAAABQAAAAADUwAAAAAAIAAAAAAAAAMHAQAAAQAhAAAABQAAAAADAQAAAAAAIQAA + AAUAAAAAAxEAAAAAAEMAAwADABAAGwAAAAAEQwAABAMAAwAOACIAAAAABEcAAAQDAAMADgD/AA + D+AQAAAAAEQwAABAMAAwAOAAEAAAAACGMAAAgDAAQAAwAOAAEAAAAADEMAAAwDAAMADgAuAAAA + ABBDAAAQAwADABAAUgAAAAAUAgAAFA4AAQAAAAAUQwAAFAMAAwAMAAMAAAABFAIAARQQAAEAAA + AAFAIAABQQADIAAAABFAIAARQQAAEAAAAAFEMAABQDAAMADAAbAAAAARQCAAEUEAABAAAAABQC + AAAUEACPAAAAARQCAAEUEAABAAAAABRDAAAUAwADAAwAAgAAAAEUAgABFBAAAQAAAAAUAgAAFB + AAIAAAAAEUAgABFBAAAQAAAAAUQwAAFAMAAwAMAAEAAAAAFEMAABQDAAMADAAAAKoPXAAAABEA + AAABAAAAAAAZAAAABwAAAAAACwQAACUAAAABAAAAAAABAAAABwAAAAAACQQECC8AAAABAAAAAA + BSAAAAAQAAAAAACAEAAAEAAAAAAAEAAAAHAAAAAAAJCAAADwDyDxgAAAAAAPMPEAAAAAAAAAAK + AAAABAAAAAiQEwAAAN8PCAAAAH8AAADRAAAAAACmDxIAAAD5AgAA4AF5AKQBKQHQAvADEAUPAA + TwegAAALIECvAIAAAAAggAABAKAABzAAvwPgAAAARBAQAAAAsBAgAAAD8BAAABAL8BAAAQAP8B + AAAIAD8CAAACAIDDFAAAAE8AYgBqAGUAYwB0ACAANgA3AAAAAAAQ8AgAAACOACAWYBhQAg8AEf + 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 + AAALQAAAAFAAAAzAAAAAYAAADYAAAABwAAAOQAAAAIAAAA9AAAAAkAAAAAAQAAEgAAAAwBAAAK + AAAAMAEAAAsAAAA8AQAADAAAAEgBAAANAAAAVAEAAA4AAABgAQAADwAAAGgBAAARAAAAcAEAAA + IAAADkBAAAHgAAAAgAAABTbGlkZSAxAB4AAAAEAAAAAAAAAB4AAAAQAAAAQ2xhcmtlIFN0ZXZl + AAAAAB4AAAAEAAAAAAAAAB4AAAAEAAAAAAAAAB4AAAAIAAAAYmxhbmsAAAAeAAAABAAAAGRsdQ + AeAAAABAAAADI3NgAeAAAAHAAAAE1pY3Jvc29mdCBPZmZpY2UgUG93ZXJQb2ludABAAAAA8ET9 + bT8CAABAAAAA0GPDpdrXvQFAAAAAUCPgroXjyQFAAAAA0LgY1oj2ygEDAAAADwAAAAMAAAA4BA + AARwAAAKjQAAD/////AwAAAAgAiRB0CwAAAQAJAAADTGgAAAAAMWgAAAAABQAAAAsCAAAAAAUA + AAAMApkCwAMFAAAABwEDAAAAMWgAAEELIADMAG8AoAAAAAAAmQLAAwAAAAAoAAAAoAAAAG8AAA + ABABgAAAAAACDQAAAAAAAAAAAAAAAAAAAAAAAA//////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////vf//cwBz//+9//////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////vf//cwBz//+9////////////3v//AEKUvXMAc5S9QkJzQkJCQkJCAE + JCAAAAc0IA3t69c0KU//+93v//c0KUQpRzQgBCc3NCAEJz3r1zlJSUc3OUc3NzAEJzlHMAAEKU + 3r1zQkKUvb1zQnOUAABCAAAAvZRC3r29c5S9QkJzc0JCc3Nz3v+9QkKUc0JC3v+9QkKUQkJC3r + 1zQnO9lHNC///e//////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////3v//3t7e/97e//////////// + ////////////////3v///97e////////////////////3v///97e////////////////////// + //3t7e////////////3v//vZSU////3v//vZSU////////3t7e//////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////3lIp////54xrzjEA54xr1lox52tK3lIp54Rr3mtC997W3nta54xz3oRj3nNK3mtC77 + Wl54Rr3nNK//////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////1koY54xr3mNC54Rj1k + oh55R7////98691mM51lox1lIp53ta9/f33nNS772t3nNK1mM51koY99bO//////////////// + ////////////////////3v//c3OUAEJzAAAAlHMAAEKUQgAAQkJClHNC///e3v//c3OUAEJzQg + AA3t6U3t7eQkKUc3NCQkJzvb1z3t7eQkKU/96U//////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////1kIQ1lop/+/v55yE54Rj1lox52tC3lIp54xr3mtK9869 + 3ntS77Wc3nta9869997W3koY55Rz////////////////////////////////////////////Qk + JKY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3Nz + Y2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2 + tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tz + a3NzY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3NzY2tza3 + NzY2tza3NzGCEh//////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////GBgY5/f35+/v5+/35+/v5/f35+/v + 5+/35+/v5/f35+/v5+/35+/v5/f35+/v5+/35+/v5/f35+/v5+/35+/v5/f35+/v5+/35+/v5/ + f35+/v5+/35+/v5/f35+/v5+/35+/v5/f35+/v5+/35+/v5/f35+/v5+/35+/v5/f35+/v5+/3 + 5+/v5/f35+/v5+/35+/v5/f35+/v5+/35+/v5/f35+/v5+/35+/v5/f35+/v5+/35+/v5/f35+ + /v5+/35+/v5/f35+/v5+/35+/v5/f35+/v5+/35+/v5/f35+/v5+/35+/vCAgI//////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////AAAA////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////AAAA////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////AAAA3v + //QkKUc3NC3t69c3OUQkJzlJRCc3OUc3NzQkJzc0JC//+9//////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////QnO9AEJClHMAQkKUQkJCvb1zc0KUc5RzlHNz///e//// + ////////////////////////////////////////////////////////////////////////// + //////AAAA//////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////AAAA////////3v///97e//////////// + ////////////3t7////e////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////3t7e////////////////////////////////////////////// + //////////////////////////////////////////////////////AAAA//////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////AAAA////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////AAAA////////////////7+/v9+/v7+/v9+/v7+/v9+/v7+ + /v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v////7+/v + 9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+ + /v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v////9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v + 7+/v9+/v7+/v9+/v7+/v9+/v7+/v////////////////////////////////////KTEx7/f39/ + f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f3 + 7/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/ + f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f3 + 9/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f3// + //AAAA////////////////9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v + 7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v////9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+ + /v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn + 9+/v7+fn////7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+ + /v////////////////////////////////////KSkx1v//QkKUa3NC1ta1a3OUQkJrlJRCa2uU + lJRztbW1QkKUtbVr1r299/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39/ + //9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39/// + Qmu1AEJClGsAQkKUQkJCtb1za0KUa5RzlGtr9//e9/f39///9/f39///9/f39///9/f39///9/ + f39///9/f39///9/f39///9/f39///9/f39///9/f39///////AAAA////////////3v//AEKM + a2sAAABrQgAAAEJCtYxCQmuMAABCrWsA9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+ + /v7+/v9+/v7+/v////zu/vQkKMAEJCAAAAAAAAQgAAAEJCa0IAQkJr1s6MAEKMlGsAAEKMQgAA + jIxCQkKMa0JC9++t7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v////QmutAEJCAAAAaw + AA9++t7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v//////////////////////// + ////////////KTEx7/f39/f3zvf399be7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/ + f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f3 + 9/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f3ztbW9/ + f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f3 + 7/f39/f/7/f39/f37/f3////AAAA////////////////////////////////3v//3r29////// + ////////////////////////////////////////////////////////////////////////// + ////lN7/3pRz////////////////////////3v//3r29////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////KSkp9///9/f39/ + //9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39/// + 9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/ + f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f3 + 9///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///////AA + AA////////////////3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW + 3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O////3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s + 7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O + 3tbW////3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O// + //////////////////////////////////AAAA//////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////AAAA////////////////3tbW1s7O + 3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3t + bW1s7O3s7O////3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O + 1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O////1s7O3s7O1s7O3tbW1s + 7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3s7O//////////////////////////// + ////////AAAA3v//vb29QkKUvb1zc3OUQkJzvb1zQkKUvb1z3t7eAEKUQgAAAEJCvZRC3t7eQk + KUQkJCAEJCAAAA3pRC//////////////////////////////////////////////////////// + ////////////////////////////////////////////c3O9c5RzlHNz///e////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////AAAA////////////3v//ADF7hFoAADF7pXs5pXt73tbW3s7O3tbW3s + 7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O////vc7OpZycADF7 + AAAAOTEAAAA5AAAAOQAAADExAAAAAAAApVoA3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3t + bW3s7O3tbW3s7O3tbW3s7O3tbW////UlKcADFaMQAAYylK3tac3s7O3tbW3s7O3tbW3s7O3tbW + 3s7O3tbW3s7O3tbW3s7O////////////////////////////////////AAAA////////////// + //////////////////3v///97e////////////3v///97e////3t7////e//////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////AAAA// + //////////////3s7Otc7OpZyctZSU3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW + 1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW////3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s + 7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O + ////1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3tbW////// + //////////////////////////////AAAA//////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////AAAA//////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////AAAA////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////AAAA////////////////hISEhISEhISEhISEhISEhISEhISEhISEhISEhI + SEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE////hISEhISEhISEhISE + hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhI + SEhISEhISEhISEhISEhISE////hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE + hISEhISEhISEhISE////////////////////////////////////KSkx1v//a2uU1t69AEKUlH + MAlGuU1v/eAEKUAAAAlEIA9//e9/f39///9/f39///9/f39///9/f39///9/f39///9/f39/// + 9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/ + f39///9/f39///a2u1a5RzQkJra3NClGtr9//e9/f39///9/f39///9/f39///9/f39///9/f3 + 9///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///9/f39///////AAAA////// + //////////hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE + hISEhISEhISEhISEhISEhISEhISE////hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhI + SEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE//// + 59bG///n////1uf//+fW1uf/ra3GxsbG/+fG5+f////n////rdb/hISEhISEhISE////////// + //////////////////////////KTEx7/f31vf379bW9/f/7/f31vf3lJSU99be7/f39/f37/f3 + 9/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/ + f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/ + 7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/f39/f/7/f39/f37/ + f39/f/7/f39/f37/f39/f/7/f39/f37/f3////AAAA////////////////hISEhISEhISEhISE + hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhI + SE////hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE + hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE////hISEhISEhISEhISEhISElISElK + 2thISEhISEhISEhISEhISEhISEhISEhISEhISE//////////////////////////////////// + UlJS5/f33u/v5+/33ufv5/f33u/v5+/33ufv5/f33u/v5+/33ufv5/f33u/v5+/33ufv5/f33u + /v5+/33ufv5/f33u/v5+/33ufv5/f33u/v5+/33ufv5/f33u/v5+/33ufv5/f33u/v5+/33ufv + 5/f33u/v5+/33ufv5/f33u/v5+/33ufv5/f33u/v5+/33ufv5/f33u/v5+/33ufv5/f33u/v5+ + /33ufv5/f33u/v5+/33ufv5/f33u/v5+/33ufv5/f33u/v5+/33ufv5/f33u/v5+/33ufv5/f3 + 3u/v5+/35+/vISEh////////////////hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhI + SEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE////hISEhISEhISEhISEhISE + hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhI + SEhISEhISEhISEhISE////hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE + hISEhISEhISE////////////////////////////////////OUpK3ufv5+/33ufn5+/v3ufv5+ + /33ufn5+/v3ufv5+/33ufn5+/v3ufv5+/33ufn5+/v3ufv5+/33ufn5+/v3ufv5+/33ufn5+/v + 3ufv5+/33ufn5+/v3ufv5+/33ufn5+/v3ufv5+/33ufn5+/v3ufv5+/33ufn5+/v3ufv5+/33u + fn5+/v3ufv5+/33ufn5+/v3ufv5+/33ufn5+/v3ufv5+/33ufn5+/v3ufv5+/33ufn5+/v3ufv + 5+/33ufn5+/v3ufv5+/33ufn5+/v3ufv5+/33ufn5+/v3ufv5+/33ufn5+/3AAgI////////// + ///////+fG////5////+fn1uf/ra3G1tbG/+fWxtb/ra2txsbG1ufGhISthISEhISEhISEhISE + hISEhISEhISEhISEhISEhISE////lISE/+fG////1uf//+fW////////1uf/ra3G/+fGxsbn5/ + /WlJTG/+fG5////+fn5+f/5//nhJTGhISEhISEhISEhISEhISEhISEhISEhISEhISE/////+fG + ////rcbnra2t/+fG////xtb/1ufGhISthISEhISEhISEhISEhISEhISEhISE////////////// + //////////////////////AAAA//////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////AAAA////////////////hISEhISEhISEhISEhISE + ra2UhISUhISElISElK2thISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE// + //hISEhISEhISEhISEhISEhISEhISElISEra2tra2tlK2thISEhISEhISEhISEhISEhISEhISE + hISEhISEhISEhISEhISEhISEhISEhISEhISEhISE////hISElISEra2tlK2thISEhISEhISEhI + SEhISEhISEhISEhISEhISEhISEhISEhISE////////////////////////////////////AAAA + 3v//AEKUlHMAvb29lJSUAEKUQgAAAEJClEIA///evf//c3NzAABzAAAAc3MAAABzAAAAvXMA// + //3v//AEKUc0IAQkJzAEJCAAAAAAAAAAAAAAAAQkIAAABCAAAAlHMAvZSU//////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////AAAA////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AAAA////////3v//3r293v//3r29// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////vf///729////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////AAAA////////////// + //hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE + hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhI + SEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE + hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE////////////////// + //////////////////AAAA//////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////AAAA/////////////////+fG////1v//rYSt///W//// + ////////////////////5///rZTGxtbWxq2t///Wxuf/hISUhISEhISEhISEhISEhISEhISEhI + SEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE + hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhI + SEhISEhISEhISEhISEhISEhISEhISE////////////////////////////////////AAAA3v// + c3OUAEJzlJRCc3NzAABzAAAAAAAAlHMAAEKUlHMAlL29AABzQgAA/96U////3v//lJSUQkKUc5 + RCAABzAAAAlHMAlHOU3v/evb29QkKUlHNC3v/eAEKUAAAAc3MAAABzAAAAQgAA/96U//////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////AAAA////////////////hISEhISEhISEhISErZSEhJSthISEhISEhISErZSEhJSthISEhI + SElISElK2thISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE + hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhI + SEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE + hISE////////////////////////////////////OTk55+/v5+/vxu/vxq215+/v5+/v5+/v5+ + /35+/v5+/vxu/vxq215+/v5+/v5+/v5+/35+/v5+/v5+/v5+/35+/v5+/v5+/v5+/35+/vra2t + 5+/v5+/35+/v5+/v5+/v5+/35+/v5+/vrc7v58615+/v5+/v5+/v5+/35+/v5+/v5+/v5+/35+ + /v5+/v5+/v5+/35+/v5+/v5+/v5+/35+/v5+/v5+/v5+/35+/v5+/v5+/v5+/35+/v5+/v5+/v + 5+/35+/v5+/v5+/v5+/35+/v5+/v5+/v5+/35+/v5+/v5+/v5+/3GBgY////////////9/f3// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////GBgY5/f35+/v5+/35+/v5/f35+/v5+/35+/v5/f35+/v5+/35+/v5/f35+/v + 5+/35+/v5/f35+/v5+/35+/v5/f35+/v5+/35+/v5/f35+/v5+/35+/v5/f35+/v5+/35+/v5/ + f35+/v5+/35+/v5/f35+/v5+/35+/v5/f35+/v5+/35+/v5/f35+/v5+/35+/v5/f35+/v5+/3 + 5+/v5/f35+/v5+/35+/v5/f35+/v5+/35+/v5/f35+/v5+/35+/v5/f35+/v5+/35+/v5/f35+ + /v5+/35+/v5/f35+/v5+/35+/vCAgI//////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////AAAA//////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + AAAA////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////AAAA////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////AAAA////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////AAAA//////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////AAAA////////////////9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn + 9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+ + /v7+fn9+/v7+/v9+/v7+fn9+/v7+/v////7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v + 7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+ + fn9+/v7+/v9+/v7+fn9+/v7+/v////////////////////////////////AAAA//////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////AAAA + ////////////3v//ra2tAEKMa2sAAABrAAAAlGsAQkKMlIxCjK2tAABrAAAAAAAAAAAAAAAAjI + xCAABrQgAAQmtCQgBC986M7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v + 9/f33v//QkKMQkJCAEJCQgAAAEJCrYxCQkKMAEJCAAAAa0IAQkJrrYxC1u/vQkKMQkJCAEJCAA + AAQgAAlIxCra2tlIyMQkKMQkJCQkJCQkJCQkJC986M7+/v9+/v7+/v9+/v7+/v9+/v7+/v9/f3 + ////////////////////////////////AAAA////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AAAA//////////////////f37+fn9/ + f37+/v//f37+fn9/f3zu/v3rW17+fn9/f37+/v//f3zufn1rW17+/v//f37+fn9/f37+/v//f3 + 7+fn9/f37+/v//f37+fn9/f37+/v//f37+fn9/f37+/v//f37+fn////7+/v//f3zufn1rW1zu + /vvbW1zq2t9/f37+/v//f37+fn9/f37+/v//f37+fn9/f3zu/v3rW1zufn1rW17+/v//f37+fn + 9/f37+/v//f37+fn9/f37+/v//f37+fn9/f37+/v//f37+fn////////////////////////// + //////AAAA//////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////AAAA//////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////AAAA//////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////AAAA//// + ////////////3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s + 7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O + ////3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3t + bW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O//// + ////////////////////////////AAAA////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////AAAA////////////3v//ADmEAAAAYzkAjI + xjADmErYw5OTmEADk5AAAAAAAAAAAArWMA597e5+fn597e7+fn597e5+fn597e7+fn597e5+fn + 597e7+fn597e5+fn597e7+fn597e5+fn597e7+fn597e7+fn3v//QjmMOTk5ADk5rYQ5ra2tAD + mEOQAAOTk5jIw5ADmErYw5OTmEjIw5OTmExq1j597e7+fn597e5+fn597e7+fn597e5+fn597e + 7+fn597e5+fn597e7+fn597e5+fn597e7+fn597e7+/v////////////////////////////// + //AAAA//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////AAAA////////////////////9/f3//f39/f3////9/f3//f39/f3////9/f3 + //f39/f3////9/f3//f39/f3////9/f3//f39/f3////9/f3//f39/f3////9/f3//f39/f3// + //9/f3//f39/f3////9/f3////9/f3////1vf3vbW11rW1////9/f3//f39/f33v//1rW1//f3 + 9/f33v//1rW1//f39/f3////9/f3//f39/f3////9/f3//f39/f3////9/f3//f39/f3////9/ + f3//f39/f3////9/f3////////////////////////////////AAAA//////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////AAAA//////// + ////////7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+ + /v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v//f3//// + 9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+ + /v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v//f3//////// + ////////////////////////AAAA////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////AAAA////////////3v//AEKMa2sAlGtrADmMtY + xCa4yMAABrjGMAtYyM7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v + 7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v3v//jK2tAABrAAAAAAAArYw5AEKMjG + sAQkKMra1ja0KM7++t9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn + 9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v////////////////////////////////AA + AA//////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////AAAA////////////////9/f3//f3zu/vvbW11rW1//f37+/v//f39/f3//f37+/v + //f39/f3//f37+/v//f39/f3//f37+/v//f39/f3//f37+/v//f39/f3//f37+/v//f39/f3// + f37+/v//f39/f3//////////f39/f3//f3zu/v3rW11vf33rW1zu/v3rW19/f3//f37+/v//f3 + 9/f3//f37+/v//f39/f3//f37+/v//f39/f3//f37+/v//f39/f3//f37+/v//f39/f3//f37+ + /v//f39/f3//f3////////////////////////////////AAAA//////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////AAAA//////////// + //////////f3//////////////f3//////////////f3//////////////f3////////////// + f3//////////////f3//////////////f3//////////////f3//////////////f3//////// + //////f3//////////////f3//////////////f3//////////////f3//////////////f3// + ////////////f3//////////////f3//////////////f3//////////////f3//////////// + ////////////////////AAAA////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////AAAA////////////////3tbW3tbW3tbW3tbW3tbW3t + bW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW + 3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW597e////3tbW3tbW3tbW3tbW3tbW3tbW3tbW3t + bW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW + 3tbW3tbW3tbW3tbW3tbW3tbW3tbW3tbW597e////////////////////////////////AAAA// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////AAAA////////////3v//ADl7pXsxADl7AAAAYzkAhJR7AABaAAAAAAAApVoA3tbW3s7O + 3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3t + bW3s7O3tbW3s7O3v//ADF7AAAAAAAAYzkAOTFahHs5OTF7OTk5va17OTl7OTExpZxaOTF7ADk5 + vXsx3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s + 7O3tbW3s7O////////////////////////////////AAAA//////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////AAAA//////////////// + 597e5+fn597e7+fnxt7exq2t597e7+fn597e5+fn597e7+fn597e5+fn597e7+fn597e5+fn59 + 7e7+fn597e5+fn597e7+fn597e5+fn597e7+fn597e5+fn597e7+fn597e7+fn////7+fn597e + 5+fn597e7+fn597e5+fn597e7+fn597exufnxqWl7+fnxt7exq2t597e7+fn597e5+fn597e7+ + fn597e5+fn597e7+fn597e5+fn597e7+fn597e5+fn597e7+fn597e7+/v//////////////// + ////////////////AAAA////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////AAAA////////////////////9/f3//f39/f3////9/f3// + f39/f3////9/f3//f39/f3////9/f3//f39/f3////9/f3//f39/f3////9/f3//f39/f3//// + 9/f3//f39/f3////9/f3//f39/f3////9/f3////9/f3////9/f3//f39/f3////9/f3//f39/ + f3////9/f3//f39/f3////9/f3//f39/f3////9/f3//f39/f3////9/f3//f39/f3////9/f3 + //f39/f3////9/f3//f39/f3////9/f3////////////////////////////////AAAA////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //AAAA////////////////7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v + 9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+ + /v7+/v//f3////9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v + 7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+ + /v//f3////////////////////////////////AAAA//////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////AAAA////////////////9+/v + 7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+ + fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v////7+fn9+/v7+/v + 9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+ + /v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v//////////////////// + ////////////AAAA////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////AAAA////////////3v//QkKMa4xCAABrAAAAAAAAlGsAjIyMAE + KMrYxCQkKMAEJCAAAAAAAAAAAArWsA9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v + 7+/v9+/v7+/v9+/v7+/v9+/v7+/v9/f33v//AEKMAAAAAAAAa0IAAEJra0IAta2MQkKMta1rra + 2tlIyMra2tAEKMAAAAQgAA786M9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v + 9+/v7+/v9+/v7+/v9+/v7+/v9/f3////////////////////////////////AAAA////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////AA + AA//////////////////f37+fn9/f3rc7v/9a17+fn9/f37+/v//f37+fn9/f37+/v//f37+fn + 9/f37+/v//f37+fn9/f37+/v//f37+fn9/f37+/v//f37+fn9/f37+/v//f37+fn9/f37+/v// + f37+fn////7+/v//f37+fn9/f37+/v3vf3zq2t1vf3ra2t3rW1zufn1rW17+/v//f37+fn9/f3 + 7+/v//f37+fn9/f37+/v//f37+fn9/f37+/v//f37+fn9/f37+/v//f37+fn9/f37+/v//f37+ + fn////////////////////////////////AAAA//////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////AAAA//////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////AAAA////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////AAAA////////////////3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s + 7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW + 1s7O3s7O1s7O3tbW1s7O3s7O1s7O////1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s + 7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O + 3s7O1s7O3tbW1s7O3s7O1s7O////////////////////////////////AAAA////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////AAAA// + //////////3v//OTF7Y3s5AABaY1oAAABahFoAhHt7ADl7pXsxOTl7ADExAAAAAAAAAAAApVoA + 3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O59 + 7e3v//ADl7AAAAAAAAAAAAYzkAADFaAAAAAAAAOQAA3q17vdbWY1p7OTla3q173tbW3s7O3tbW + 3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O597e// + //////////////////////////////AAAA//////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////AAAA////////////////5+fn3tbWxt7e + vZyc5+fn3tbW597e3tbW5+fn3tbW597e3tbW5+fn3tbW597e3tbW5+fn3tbW597e3tbW5+fn3t + bW597e3tbW5+fn3tbW597e3tbW5+fn3tbW597e3tbW5+fn3tbW////3tbW5+fn3tbW597evdbW + xq2t3tbW597e3tbW5+fn3tbW597e3tbW5+fn3tbW597e3tbW5+fn3tbW597e3tbW5+fn3tbW59 + 7e3tbW5+fn3tbW597e3tbW5+fn3tbW597e3tbW5+fn3tbW//////////////////////////// + ////AAAA////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////AAAA////////////////9/f3//////f3////9/f3//////f3////9/f3// + ////f3////9/f3//////f3////9/f3//////f3////9/f3//////f3////9/f3//////f3//// + 9/f3//////f3////9/f3////////////9/f3//////f3////9/f3//////f3////9/f3////// + f3////9/f3//////f3////9/f3//////f3////9/f3//////f3////9/f3//////f3////9/f3 + //////f3////9/f3////////////////////////////////////AAAA////////////////// + ////////////////////////////////////////////////////////////////////////// + lJTe//+9////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////AAAA////// + //////////9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn + 9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v// + //7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v + 7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v////// + //////////////////////////AAAA//////////////////////////////////////////// + ////AHO93r1zAEKU3r1zvb29QkKU/96U3v//AEKUlHMAvb29lL29vZSUAEKU3r1zvb293r29vd + 7eAEKUQgAA3t6U3r29//////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////AAAA////////////3v//AEKMAAAAa0IAta2M + AEKMAAAAa0IAa2trAEJrAAAAjGsAAEKMAAAAtWsA7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+ + /v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9/f33v//AEKMrYxCQkKMjIxCQkKMQkJC + AEJCAAAAAAAAAAAAAAAAQgAAQkJCQkJCQkJCjIxCa0KM7++t9+/v7+/v9+/v7+/v9+/v7+/v9+ + /v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9/f3//////////////////////////////// + AAAA////////////////////////////////////3qXe/96U////c3O93v+9AEKU3pRC////AH + O9/71z3v//AEKUlHMAc0KUAHNzvZRCAEKU3r1zAEKUvb1zvZSUQkKUAEJC3r1zc0KU//+9//// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////AAAA//////////////////f37+fn1vf3zq2t//f37+fn9/f37+/v//f37+fn9/ + f37+/v//f37+fn9/f37+/v//f37+fn9/f37+/v//f37+fn9/f37+/v//f37+fn9/f37+/v//f3 + 7+fn9/f37+/v//f37+fn////7+/v//f37+fn1vf3ra2t3rW17+fn9/f37+/v//f37+fn9/f37+ + /v//f37+fn9/f37+/v//f37+fn9/f37+/v//f37+fn9/f37+/v//f37+fn9/f37+/v//f37+fn + 9/f37+/v//f37+fn////////////////////////////////AAAA////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////AAAA////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////AAAA//////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////AAAA////////////////3s7O1s7O3tbW1s7O3s7O + 1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s + 7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O////1s7O3s7O1s7O3tbW1s7O3s7O1s7O + 3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s + 7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O////////////////////////////////AAAA + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////AAAA////////////3v//Y1p7OTlapZRaY1p7ADFaAAAAhFoAADl7AAAApVoA3s7O3t + bW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW + 3s7O3tbW3s7O597e3v//ADl7AAAAAAAAAAAAOQAAva17Y1p7hJR7AABaAAAAAAAAhDEA3ta13s + 7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O + 3tbW3s7O597e////////////////////////////////AAAA////////////////////////// + //////////////////////AHO93r1zAEKU3r1zvb29QkKU/96U3v//AEKUlHMAvb29AEKU3pRC + 3t7elJS9///e////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////AAAA////////////// + //5+fn3tbW597e3tbW5+fn3tbW597e3tbW5+fn3tbW597e3tbW5+fn3tbW597e3tbW5+fn3tbW + 597e3tbW5+fn3tbW597e3tbW5+fn3tbW597e3tbW5+fn3tbW597e3tbW5+fn3tbW////3tbW5+ + fn3tbW597e3tbW5+fnvdbWxqWl3tbWrcbn3rWc597e3tbW5+fn3tbW597e3tbW5+fn3tbW597e + 3tbW5+fn3tbW597e3tbW5+fn3tbW597e3tbW5+fn3tbW597e3tbW5+fn3tbW////////////// + //////////////////AAAA////////////////////////////////////3qXe/96U////c3O9 + 3v+9AEKU3pRC////AHO9/71z3v//AEKUlHMAQkKUAEJCvb1zlJSUcwBz//+9////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////AAAA////////////////9/f3//////f3////9/f3//// + //f3////9/f3//////f3////9/f3//////f3////9/f3//////f3////9/f3//////f3////9/ + f3//////f3////9/f3//////f3////9/f3////////////9/f3//////f3////9/f3//////f3 + ////9/f3//////f3////9/f3//////f3////9/f3//////f3////9/f3//////f3////9/f3// + ////f3////9/f3//////f3////9/f3////////////////////////////////////AAAA//// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////AAAA////////////7+/vhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhI + SEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE + hISEhISElJSU9/f3hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhI + SEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE + hISElJSU////////////////////////////////AAAA////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////AAAA////////////9/f35+ + fG1sbn///W1tb////Wxtb/rcbGlISE1sbG///W5////+fnxuf/hISUhISEhISEhISEhISEhISE + hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISElJSU9/f3/+fG5////+ + fn5+f/5//nhJTGhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE + hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISElJSU////////////////// + //////////////AAAA////////////////////////////////vf///729//////////////// + ////////////////3t7////e////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////AAAA////////////9/f3paWlnJyctaWltb29paWlnJycpaWl + paWlpaWlnJycpaWlpaWlpaWlnJycpaWlpaWlpaWlnJycpaWlpaWlpaWlnJycpaWlpaWlpaWlnJ + ycpaWlpaWlpaWlnJycpaWlpaWlpaWlpaWl9/f3paWlpaWlnJycpaWlpaWlpaWlnJycpaWlpaWl + paWlnJycpaWlpaWlpaWlnJycpaWlpaWlpaWlnJycpaWlpaWlpaWlnJycpaWlpaWlpaWlnJycpa + WlpaWlpaWlnJycpaWlpaWlpaWlpaWl////////////////////////////////AAAA//////// + ////3v//3r293v//vb29AEKU3pRCvd7eQkKU3t6Uc0KUlJRz3v/eAEKUQgAA/96UlJS93v/eAE + KUvZRCQkKU3t6UAEKUvZRCQkKU3t6Uvb29vb29AEKUvZRCQkKU3t6Uvb29vb29c0KUvd6UQkKU + /96UQnO93t6UAEKU3r1zvb29QkKU/96U////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + AAAA////////////7+/v5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ + fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn + 5+fn7+/v7+/v5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ + fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn + 7+/v////////////////////////////////AAAA////3qXe/96U3v//AEKUvZRCc0KUAHNzvb + 1z3pSUAHO9/71zAHO9cwAA3v+9lL29AABzvb1zvb29/729AHO93pRCAHO93r1zAEKU/71zAHO9 + 3r1zAEKU/71zAHO93pRCAHO93r1zAEKU/71zAHO9vXMAAHO93r1zQkKU3t6UAEKU3r1zc0KUAH + Nz/71z//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////AAAA////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////AAAA//////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////AAAA////////////9/f33s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW + 3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s + 7O3tbW3s7O3tbW3s7O3tbW3s7O7+fn9+/v3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O + 3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW797e9/f33s7O3tbW3s7O3tbW3s7O3tbW3s7O3t + bW3s7O3tbW3s7O3tbW3s7O7+fn////////////////////////////////AAAA//////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////AAAA + ////////////7+/v3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s + 7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW + 597e9+/v1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s + 7O3tbW1s7O7+fn7+/v3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW597e + ////////////////////////////////AAAA////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////AAAA////////////1vf3OTF7OTk5pZ + RaOTl7OTEx3rV7OVqUADk5hFoAOTl7pXsx3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O + 3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O7+/v1u/vADl7hFoAYzl7AFpaOQ + AA3q173tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW797e9/f33s7O3tbW + 3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O7+/v////////////////////////// + //////AAAA////////////////////////////////////////////////vd7eAEKUvZRC3r29 + ////AHO93r1zAEKU3r1zvb29QkKU/96U////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////AAAA////////////////////////vb29//////////////////////// + vf///729////////////////////////////////////////////////////////////////// + //////////////////////////////////3v//3r29//////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////AAAA//////////////// + ////////////////////////////vf//lEJzAHOU3r1zc0KU//+9c3O93v+9AEKU3pRC////AH + O9/71z//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////AAAA//// + ////////////7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+ + /v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v//f3 + ////9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+ + /v9+/v9/f3////7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v//f3//// + ////////////////////////////AAAA////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////AAAA////////////9/f39+/v7+fn9+/v7+ + /v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn + 9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v9+/v////7+/v9+/v7+fn9+/v7+/v9+ + /v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn//f39/f39+/v7+fn9+/v + 7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v9+/v////////////////////////////// + //AAAA//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////3t7////e//////////// + ////////////////////////////////////////////////////////////////////////// + //////////////AAAA////////////3v//AEKMQgAAra1rQkKMQkJC986MQmutAEJCjGsAQkKM + rYxC9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+ + /v9+/v7+/v9+/v7+/v//f33v//AEKMa0IAAEJrAAAAQgAA786M9+/v7+/v9+/v7+/v9+/v7+/v + 9+/v7+/v9+/v7+/v9+/v7+/v9+/v9/f3////7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+ + /v7+/v9+/v7+/v//f3////////////////////////////////AAAA//////////////////// + ////////////////////////vf//AABz3pRCAHO9/71zvb3e///e////vb3e3v/eAEKU/71zvb + 3e///eQpTe/71zQpTe/71z////3v//AEKUAAAA3r1zvb29QkKU3t6Uvb29vb29AEKUvZRCAEKU + 3r1z3r293v//AEKUvZRCAEKU/71zlJS9///ec3O9vd6UQkKU/96Uc3O9c3Nz//+9c3O9c3Nz3t + 6Uc5S9vb2U3r29////lJS9vd69vb29lL293r29AEKU3pRCvd7elL29AABC/96UAAAA//////// + ////9/f39+/v7+/vta2t7+fn9+/v7+/v9+/v7+fn9+/vre/v962t7+fn9+/v7+/v9+/v7+fn9+ + /v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v9/f3//// + 7+fn1u/vzq2t9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+ + /v//f39/f39+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v9/f3//////// + ////////////////////////AAAA////////////////////////////////////3qXe/96U// + //QpTe/71zc3O9//+9AHO93r1zlHOUAHOl3r1zAEKU3pRCAHO93r1zAEKUvZRCAEKU3pRC//// + 3v//AEKUAAAA3r1z3r29AHO93r1zAEKU/71zAHO9vZRCAEKU3r1zc0KU3v+9AEKUvZRCAEKUvb + 1zvb293r29lN7evXNCAHO93r1zvd7elJSU3r29vd7eQpSUc3NCQgBzAEJC/71zvf//AABzvZRC + AEKUAAAA/71zAHO9c3MAvZSUAEKUAAAA/71zAAAA////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////AA + AA//////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////AAAA////////////7+/v3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O + 1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s + 7O3s7O1s7O3tbW597e9+/v1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O + 3tbW1s7O3s7O1s7O3tbW1s7O7+fn7+/v3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s + 7O1s7O3tbW597e////////////////////////////////AAAA//////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////AAAA//////////// + 9/f33s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3t + bW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O7+/v9+/v3tbW + 3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW79 + 7e9/f33s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O7+/v//////////// + ////////////////////AAAA////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////AAAA////////////zu/vOTF7WjEx3tac1s7O3s7O1s + 7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O + 3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O597e1vf3ADF7YzEAOTFaYzk5Wlpa3s6U1s7O3t + bW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O7+fn7+/v3s7O1s7O3tbW1s7O3s7O + 1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O597e////////////////////////////////AAAA// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////AAAA//////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////3v//3r29//////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////AAAA////////////3v//AEKUvZRCAEKU + 3r1z3r29lJS93v/eAEKU3pRC3t7e////AHO93r1zAEKU3r1zvb29QkKU/96U3v//AEKUAAAA3r + 1zvb29QkKU3t6Uvb29vb29AEKUvZRCAEKU3r1z3r293v//lL29vZSUQkKU/96UQnO9c3NCAEJz + vZRCvb29AEKU/71zlJS9vd69AEKUvZRCvb293r293v//AEKUAAAA3pRCvd7eQkKU3r1zvf//AA + Bz3pRCAHO9vXNC///e////vb3e///eAHO9/71zAHO9AEJCAAAAvXMAAAAA////////////9/f3 + 9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+ + /v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v9+/v////7+/v9+/v + 7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn//f39/ + f39+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v9+/v//////////////// + ////////////////AAAA////////////3v//AEKU3r1zAEKU3r1zAEKUcwAA//+9AHO9vb1zlE + Jz///ec3O93v+9AEKU3pRC////AHO9/71z3v//AEKUAAAA3r1z3r29AHO93r1zAEKU/71zAHO9 + vZRCAEKU3r1zc0KU3v+9AEKU3pRCAHO93r1zAEKUcwAAAHNz3r1zQkKUAEJCvb1zAABz3pRCAH + O93r1zAEKU/71z3v//AEKUAAAAvb1z3pSUQnO9/96U////QpTe/71zc3O9AHNz3r1zlHOUAHOl + /71zc3O9//+9AHO9AAAAAAAA/96UAAAA////////////////7+/v9+/v7+/v9+/v7+/v9+/v7+ + /v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v + 9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v//f3////9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+ + /v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v7+/v9+/v9/f3////7+/v9+/v7+/v9+/v7+/v9+/v + 7+/v9+/v7+/v9+/v7+/v9+/v7+/v//f3////////////////////////////////AAAA////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //AAAA////////////1vf3AEKMQgAA986M7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v + 7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+ + fn9+/v9/f33v//ADmMa0IAa0JrQmtrQjk5986M7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v + 9+/v7+fn9+/v7+/v//f39/f39+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+/v7+/v9+/v7+fn9+ + /v9/f3////////////////////////////////AAAA//////////////////////////////// + vf///729////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////3t7////e////////////////////////////////////////////////////// + //////////////////////////////////////////////////AAAA//////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////3v//3r29 + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////AAAA////////////3v//3r293v//vb29AEKU3pRCvd7eQkKU3t6Uc0KUlJRz3v + /eAEKUvZRCQkKU3t6U3r293t7eQnO9QkJC3t6U3r29vd7eQkKU/96UQnO93t6UAEKUAAAA3r1z + vb29QkKU3t6Uvb29vb29AEKUvZRCAEKU3r1z3r293v//AEKUvZRCAEKU/71zlJS9///ec3O9vd + 6UQkKU/96Uc3O9c3Nz//+9c5S9AEJz3pRC////AHO93r1zAEKU3r1zvb29QkKU/96U3v//AEKU + /71zQnO93t6UAEKU/71z////AAAA////////////7+/v3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s + 7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O + 3s7O1s7O3tbW1s7O3s7O1s7O3tbW597e9+/v1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3t + bW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O7+fn7+/v3tbW1s7O3s7O1s7O3tbW1s7O3s7O + 1s7O3tbW1s7O3s7O1s7O3tbW597e////////////////////////////////AAAA////3qXe/9 + 6U3v//AEKUvZRCc0KUAHNzvb1z3pSUAHO9/71zAHO9cwAA//+9AHO93pRCAHO93r1zlL29vZSU + vd7eAABz3r1zAEKU3pRCAHO93r1zQkKU3t6UAEKUAAAA3r1z3r29AHO93r1zAEKU/71zAHO9vZ + RCAEKU3r1zc0KU3v+9AEKUvZRCAEKUvb1zvb293r29lN7evXNCAHO93r1zvd7elJSUvb29cwBz + AHNz/71z////c3O93v+9AEKU3pRC////AHO9/71z3v//AEKU3r1zQkKU3t6UAEKU/71z////AA + AA////////////9/f33s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW + 3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s + 7O7+/v9+/v3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O + 3tbW3s7O3tbW797e9/f33s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O7+ + /v////////////////////////////////AAAA//////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////AAAA////////////zu/vOVp7AAAx + AAAAWloAAABaAAAApVoAtc7OOTF7ADExAAAAWloAAABaOQAAOTk5tZRa3s7O1s7O3tbW1s7O3s + 7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O597e9/f31s7O3s7O1s7O3tbW + 1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O7+fn7+/v3s7O1s + 7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O1s7O3tbW1s7O3s7O597e//////////////////////// + ////////MTExAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAMTEx////////////9/f33s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s + 7O3tbW3s7O3tbW3s7O3tbWvc7OvZyc3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O + 3tbW3s7O3tbW3s7O3tbW3s7O7+fn9+/v3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3t + bW3s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW797e9/f33s7O3tbW3s7O3tbW3s7O3tbW3s7O3tbW + 3s7O3tbW3s7O3tbW3s7O7+fn////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////1tbWhISEhISEhISE + hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhI + SEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEtbW11tbWhISEhISEhISEhISEhISE + hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEtbW11tbWhISEhISEhI + SEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEtbW1//////////////////////////// + ////////////////////////3sb/zjEA/8Zz////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////1s7O/+fGrcbnra2txq2t///W1uf/1sbW///W////// + //xuf/hISUhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE + hISEhISEhISEhISEhISEtbW11tbW5+fG5+fn1sbn///W////rdb/hISEhISEhISEhISEhISEhI + SEhISEhISEhISEhISEhISEhISEhISEtbW11s7O1tbGxtbWhISUhISEhISEhISEhISEhISEhISE + hISEhISEhISEhISEtbW1////////////////////////zoS9/8Zz////1oS9/96U1qXezjEA3j + EA1qWU/8Zz1qXezjEA51oA1qW9zjEA96VC1qXe1jEA/96UzoS9/8Zz////zoS9zjEAzjEA51oA + 1oSU996U1lqU/96U////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////1tbWhISElISEra2tlK2thISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE + hISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEtbW11t + bWhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISE + hISEtbW11tbWhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEhISEtbW1////// + //////////////////zoS91jEA/96U1oS9996U1lqU/96UzoS91lpC98ZzzlqUzjEA1jEA1lpC + /96U////1qXe/8Zz////zoS91jEA/96UzoS9zjEA78Zz51pz1oSU996U1lqU/96U////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////zoS998Zz + 3lqUzoRz1jEAzlpCzjEA1jEAzlpC/8ZzzoS9zjEA1jEAzlpCzjEA/8ZzzoS93jEA//+9zoS998 + Zz3lqU1oRz1oRzzjEA51oAzoSUzjEA1jEA/96U//////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////zoS9zjEA3jEA//+9////////////////// + //////////////////////////////1qXe/8Zz////zoS9zjEA3jEA1oRz/96U//////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////1qXe/8Zz//////////////////// + ////////////////////////////1oS9/96U////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////1oS9/96U//////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + zoS9zjEA51oA///e////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////7///zjFzzjEA76VCzlqU98ZzzlqU74QA1oS9996U1lqU796U3jFzzoRzzjEA51oA1oSU + 1oRzzjEA51oA1oSU996U1lqU796U3jFz1qWUzjEA51oA1oSU996U1lqU1oRzzjEAzjEAzjEA51 + oA1qW91jEA1oRz/8Zz1qXezjEA3jEA1oRz996U1lqU/96U////zoS9/8Zz////zoS9zjEAzjEA + 51oA1oSU996U1lqU1lpC996U1lqU1oRz/8Zz1oS9996U1lqUzlpCzjEA1jEA/96U////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////3sb/74QA//// + ////1qXe96VC1oS9996U1lqU796U3jFz1oRz/96UzoS9zjEAzjEAzjEA3jEA1oRz996U1lqU79 + 6U1jFzzlpCzjEA3jEA1oRz996U1lqU1oRz98ZzzlqU78Zz51pz1qW9/8Zz1qXe98Zz1lqU/96U + zoS91jEA996U1lqU/96U////zoS91jEA/96UzoS9zjEA78Zz51pz1oSU996U1lqU1lpC996U1l + qU1oRz/8Zz1oS9996UzlqU1jEA996U1lqU/96U//////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////1qXezjEA/8Zz////////1qXe96VCzoS9zjEAzjEAzj + EA3jEAzoRzzjEA1jEA1lpCzlpCzjEA3jEAzoRzzjEAzjEAzjEA3jEAzoRzzjEA3jEAzoRzzjEA + 1jEAzlpC3jEA1qWUzjEA51oAzoSU3jEAzoRz98ZzzlqUzjEA1jEAzlpCzjEA1jEA/96U////zo + S998Zz3lqU1oRz1oRzzjEA51oAzoSUzjEA1jEAzlpCzjEA1jEAzlpC/8ZzzoS9zjEAzjEAzjEA + zjEA1jEA/96U////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////zoS9zjEA74QA////////zoS996VC////////////////////////////////1oS9/96U + ////////////////////////////////////////////////////1qXe/8Zz////////////1q + Xe/8Zz////////////////////////////////////////zoS9zjEA3jEA1oRz/96U//////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////1oS9/96U////////////////////////// + //////////////////////////////////////////////////////1qXe/8Zz//////////// + ////////////////////////////////1oS9/96U////////////////////////////////1q + Xe/8Zz//////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/v8AAAUBAgAAAAAAAAAAAAAAAAAAAAAAAgAAAALVzdWc + LhsQk5cIACss+a5EAAAABdXN1ZwuGxCTlwgAKyz5rkwEAAAIBAAAEQAAAAEAAACQAAAAAwAAAJ + gAAAAOAAAAuAAAAA8AAADEAAAABAAAANgAAAAGAAAA4AAAAAcAAADoAAAACAAAAPAAAAAJAAAA + +AAAAAoAAAAAAQAAFwAAAAgBAAALAAAAEAEAABAAAAAYAQAAEwAAACABAAAWAAAAKAEAAA0AAA + AwAQAADAAAAI0DAAACAAAA5AQAAB4AAAAYAAAAQTQgUGFwZXIgKDIxMHgyOTcgbW0pAAAAHgAA + AAQAAAAAAAAAHgAAAAwAAABOb2tpYSBPeWoAAAADAAAAyQUPAAMAAACnAQAAAwAAAAoAAAADAA + AACgAAAAMAAAAAAAAAAwAAAAAAAAADAAAAAAAMAAsAAAAAAAAACwAAAAAAAAALAAAAAAAAAAsA + AAAAAAAAHhAAABQAAAAQAAAATm9raWEgU2FucyBXaWRlAAYAAABBcmlhbAAMAAAATm9raWEgTG + FyZ2UACwAAAE5va2lhIFNhbnMABwAAAFNpbVN1bgAIAAAAVmVyZGFuYQAGAAAAQkxBTksACAAA + ADFfQkxBTksAEQAAAHRoaW5rLWNlbGwgU2xpZGUAIQAAAE1pY3Jvc29mdCBPZmZpY2UgRXhjZW + wgV29ya3NoZWV0ACkAAAAzLiBJbXBsZW1lbnRhdGlvbiBQbGFubmluZyBQcm9qZWN0IFBsYW4g + ADQAAAAzLjEgSW1wbGVtZW50YXRpb24gUGxhbm5pbmcgSGlnaC1sZXZlbCBBcmNoaXRlY3R1cm + UALQAAADMuMiBJbXBsZW1lbnRhdGlvbiBQbGFubmluZyBLZXkgZGVwZW5kZW5jaWVzADcAAAAz + LjMgSW1wbGVtZW50YXRpb24gUGxhbm5pbmc6IEVwaWMgZWZmb3J0IGluIG1hbiBtb250aHMACA + AAAFNsaWRlIDUACAAAAFNsaWRlIDYAMgAAADMuNiBJbXBsZW1lbnRhdGlvbiBQbGFubmluZzog + UmVzb3VyY2UgJiBjb3N0IHBsYW4AKwAAADMuNyBJbXBsZW1lbnRhdGlvbiBQbGFubmluZyBSaX + NrcyBBbmFseXNpcwAoAAAAMy44IEltcGxlbWVudGF0aW9uIFBsYW5uaW5nIFRlY2hub2xvZ3kg + ADMAAAAzLjkgSW1wbGVtZW50YXRpb24gUGxhbm5pbmc6IEVwaWMgcGxhbm5pbmcgc3VtbWFyeQ + AMEAAACAAAAB4AAAALAAAARm9udHMgVXNlZAADAAAABgAAAB4AAAAGAAAAVGhlbWUAAwAAAAIA + AAAeAAAAFQAAAEVtYmVkZGVkIE9MRSBTZXJ2ZXJzAAMAAAACAAAAHgAAAA0AAABTbGlkZSBUaX + RsZXMAAwAAAAoAAAAEAgAAAwAAAAAAAAAgAAAAAQAAADgAAAACAAAAQAAAAAEAAAACAAAADAAA + AF9QSURfSExJTktTAAIAAADkBAAAQQAAALwBAAAMAAAAAwAAAAcAAAADAAAABgAAAAMAAAAAAA + AAAwAAAAcAAAAfAAAAUwAAAGgAdAB0AHAAOgAvAC8AdwBpAGsAaQBzAC4AaQBuAC4AbgBvAGsA + aQBhAC4AYwBvAG0ALwBTAEQARABpAGYAZgBlAHIAZQBuAHQAaQBhAHQAaQBuAGcAUwBXAC8ARA + BTAFcAXwBYADAAXwBNAGkAbABlAHMAdABvAG4AZQBfAEMAcgBpAHQAZQByAGkAYQBfAEQAcgBh + AGYAdABfAHYAMABfADIAAAAAAB8AAAABAAAAAAAAAAMAAAAHAAAAAwAAAAYAAAADAAAAAAAAAA + MAAAAHAAAAHwAAAFMAAABoAHQAdABwADoALwAvAHcAaQBrAGkAcwAuAGkAbgAuAG4AbwBrAGkA + YQAuAGMAbwBtAC8AUwBEAEQAaQBmAGYAZQByAGUAbgB0AGkAYQB0AGkAbgBnAFMAVwAvAEQAUw + BXAF8AWAAwAF8ATQBpAGwAZQBzAHQAbwBuAGUAXwBDAHIAaQB0AGUAcgBpAGEAXwBEAHIAYQBm + AHQAXwB2ADAAXwAyAAAAAAAfAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAA9g8bAAAAFAAAAF/AkeN3jw4AAwD0AwMAYDJkbHUIAAAAZABsAHUAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + ABAAAAAgAAAAMAAAAEAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAA + AA8AAAAQAAAAEQAAABIAAAATAAAAFAAAABUAAAAWAAAAFwAAABgAAAAZAAAAGgAAABsAAAAcAA + AAHQAAAB4AAAAfAAAAIAAAACEAAAAiAAAAIwAAACQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoA + AAArAAAALAAAAC0AAAAuAAAALwAAADAAAAAxAAAAMgAAADMAAAA0AAAANQAAADYAAAA3AAAAOA + AAADkAAAA6AAAAOwAAAP7///89AAAAPgAAAD8AAABAAAAAQQAAAEIAAABDAAAARAAAAEUAAABG + AAAARwAAAEgAAABJAAAASgAAAEsAAABMAAAATQAAAE4AAABPAAAAUAAAAFEAAABSAAAAUwAAAF + QAAABVAAAAVgAAAFcAAABYAAAAWQAAAFoAAABbAAAAXAAAAF0AAABeAAAAXwAAAGAAAABhAAAA + YgAAAGMAAABkAAAAZQAAAGYAAABnAAAAaAAAAGkAAABqAAAAawAAAGwAAABtAAAAbgAAAG8AAA + BwAAAAcQAAAHIAAABzAAAAdAAAAHUAAAB2AAAAdwAAAHgAAAB5AAAAegAAAHsAAAB8AAAAfQAA + AH4AAAB/AAAAgAAAAIEAAACCAAAAgwAAAIQAAACFAAAAhgAAAIcAAACIAAAAiQAAAIoAAACLAA + AAjAAAAI0AAACOAAAAjwAAAJAAAACRAAAAkgAAAJMAAACUAAAAlQAAAJYAAACXAAAAmAAAAJkA + AACaAAAAmwAAAJwAAACdAAAAngAAAJ8AAACgAAAAoQAAAKIAAACjAAAApAAAAKUAAACmAAAApw + AAAKgAAACpAAAAqgAAAKsAAACsAAAArQAAAK4AAACvAAAAsAAAALEAAACyAAAAswAAALQAAAC1 + AAAAtgAAALcAAAC4AAAAuQAAALoAAAC7AAAAvAAAAL0AAAC+AAAAvwAAAMAAAADBAAAAwgAAAM + MAAADEAAAAxQAAAMYAAADHAAAAyAAAAMkAAADKAAAAywAAAMwAAADNAAAAzgAAAM8AAADQAAAA + 0QAAANIAAADTAAAA1AAAANUAAADWAAAA1wAAANgAAADZAAAA2gAAANsAAADcAAAA3QAAAN4AAA + DfAAAA4AAAAOEAAADiAAAA4wAAAOQAAADlAAAA5gAAAOcAAADoAAAA6QAAAOoAAADrAAAA7AAA + AO0AAADuAAAA7wAAAPAAAADxAAAA8gAAAPMAAAD0AAAA9QAAAPYAAAD3AAAA+AAAAPkAAAD6AA + AA+wAAAPwAAAD9AAAA/gAAAP8AAAAAAQAAAQEAAAIBAAADAQAABAEAAAUBAAAGAQAABwEAAAgB + AAAJAQAACgEAAAsBAAAMAQAADQEAAA4BAAAPAQAAEAEAABEBAAASAQAAEwEAABQBAAAVAQAAFg + EAABcBAAAYAQAAGQEAABoBAAAbAQAAHAEAAB0BAAAeAQAAHwEAACABAAAhAQAAIgEAACMBAAAk + AQAAJQEAACYBAAAnAQAAKAEAACkBAAAqAQAAKwEAACwBAAAtAQAALgEAAC8BAAAwAQAAMQEAAD + IBAAAzAQAANAEAADUBAAA2AQAANwEAADgBAAA5AQAAOgEAADsBAAA8AQAAPQEAAD4BAAA/AQAA + QAEAAEEBAABCAQAAQwEAAEQBAABFAQAARgEAAEcBAABIAQAASQEAAEoBAABLAQAATAEAAE0BAA + BOAQAATwEAAFABAABRAQAAUgEAAFMBAABUAQAAVQEAAFYBAABXAQAAWAEAAFkBAABaAQAAWwEA + AFwBAABdAQAAXgEAAF8BAABgAQAAYQEAAGIBAABjAQAAZAEAAGUBAABmAQAAZwEAAGgBAABpAQ + AAagEAAGsBAABsAQAAbQEAAG4BAABvAQAAcAEAAHEBAAByAQAAcwEAAHQBAAB1AQAAdgEAAHcB + AAB4AQAAeQEAAHoBAAB7AQAAfAEAAH0BAAB+AQAAfwEAAIABAACBAQAAggEAAIMBAACEAQAAhQ + EAAIYBAACHAQAAiAEAAIkBAACKAQAAiwEAAIwBAACNAQAAjgEAAI8BAACQAQAAkQEAAJIBAACT + AQAAlAEAAJUBAACWAQAAlwEAAJgBAACZAQAAmgEAAJsBAACcAQAAnQEAAJ4BAACfAQAAoAEAAK + EBAACiAQAAowEAAKQBAAClAQAApgEAAKcBAACoAQAAqQEAAKoBAACrAQAArAEAAK0BAACuAQAA + rwEAALABAACxAQAAsgEAALMBAAC0AQAAtQEAALYBAAC3AQAAuAEAALkBAAC6AQAAuwEAALwBAA + C9AQAAvgEAAL8BAADAAQAAwQEAAMIBAADDAQAAxAEAAMUBAADGAQAAxwEAAMgBAADJAQAAygEA + AMsBAADMAQAAzQEAAM4BAADPAQAA0AEAANEBAADSAQAA0wEAANQBAADVAQAA1gEAANcBAADYAQ + AA2QEAANoBAADbAQAA3AEAAN0BAADeAQAA3wEAAOABAADhAQAA4gEAAOMBAADkAQAA5QEAAOYB + AADnAQAA6AEAAOkBAADqAQAA6wEAAOwBAADtAQAA7gEAAO8BAADwAQAA8QEAAPIBAADzAQAA9A + EAAPUBAAD2AQAA9wEAAPgBAAD5AQAA+gEAAPsBAAD8AQAA/QEAAP4BAAD/AQAAAAIAAAECAAAC + AgAAAwIAAAQCAAAFAgAABgIAAAcCAAAIAgAACQIAAAoCAAALAgAADAIAAA0CAAAOAgAADwIAAB + ACAAARAgAAEgIAABMCAAAUAgAAFQIAABYCAAAXAgAAGAIAABkCAAAaAgAAGwIAABwCAAAdAgAA + HgIAAB8CAAAgAgAAIQIAACICAAAjAgAAJAIAACUCAAAmAgAAJwIAACgCAAApAgAAKgIAACsCAA + AsAgAALQIAAC4CAAAvAgAAMAIAADECAAAyAgAAMwIAADQCAAA1AgAANgIAADcCAAA4AgAAOQIA + ADoCAAA7AgAAPAIAAD0CAAA+AgAAPwIAAEACAABBAgAAQgIAAEMCAABEAgAARQIAAEYCAABHAg + AASAIAAEkCAABKAgAASwIAAEwCAABNAgAATgIAAE8CAABQAgAAUQIAAFICAABTAgAAVAIAAFUC + AABWAgAAVwIAAFgCAABZAgAAWgIAAFsCAABcAgAAXQIAAF4CAABfAgAAYAIAAGECAABiAgAAYw + IAAGQCAABlAgAAZgIAAGcCAABoAgAAaQIAAGoCAABrAgAAbAIAAG0CAABuAgAAbwIAAHACAABx + AgAAcgIAAHMCAAB0AgAAdQIAAHYCAAB3AgAAeAIAAHkCAAB6AgAAewIAAHwCAAB9AgAAfgIAAH + 8CAACAAgAAgQIAAIICAACDAgAAhAIAAIUCAACGAgAAhwIAAIgCAACJAgAAigIAAIsCAACMAgAA + jQIAAI4CAACPAgAAkAIAAJECAACSAgAAkwIAAJQCAACVAgAAlgIAAJcCAACYAgAAmQIAAJoCAA + CbAgAAnAIAAJ0CAACeAgAAnwIAAKACAAChAgAAogIAAKMCAACkAgAApQIAAKYCAACnAgAAqAIA + AKkCAACqAgAAqwIAAKwCAACtAgAArgIAAK8CAACwAgAAsQIAALICAACzAgAAtAIAALUCAAC2Ag + AAtwIAALgCAAC5AgAAugIAALsCAAC8AgAAvQIAAL4CAAC/AgAAwAIAAMECAADCAgAAwwIAAMQC + AADFAgAAxgIAAMcCAADIAgAAyQIAAMoCAADLAgAAzAIAAM0CAADOAgAAzwIAANACAADRAgAA0g + IAANMCAADUAgAA1QIAANYCAADXAgAA2AIAANkCAADaAgAA2wIAANwCAADdAgAA3gIAAN8CAADg + AgAA4QIAAOICAADjAgAA5AIAAOUCAADmAgAA5wIAAOgCAADpAgAA6gIAAOsCAADsAgAA7QIAAO + 4CAADvAgAA8AIAAPECAADyAgAA8wIAAPQCAAD1AgAA9gIAAPcCAAD4AgAA+QIAAPoCAAD7AgAA + /AIAAP0CAAD+AgAA/wIAAAADAAABAwAAAgMAAAMDAAAEAwAABQMAAAYDAAAHAwAACAMAAAkDAA + AKAwAACwMAAAwDAAANAwAADgMAAA8DAAAQAwAAEQMAABIDAAATAwAAFAMAABUDAAAWAwAAFwMA + ABgDAAAZAwAAGgMAABsDAAAcAwAAHQMAAB4DAAAfAwAAIAMAACEDAAAiAwAAIwMAACQDAAAlAw + AAJgMAACcDAAAoAwAAKQMAACoDAAArAwAALAMAAC0DAAAuAwAALwMAADADAAAxAwAAMgMAADMD + AAA0AwAANQMAADYDAAA3AwAAOAMAADkDAAA6AwAAOwMAADwDAAA9AwAAPgMAAD8DAABAAwAAQQ + MAAEIDAABDAwAARAMAAEUDAABGAwAARwMAAEgDAABJAwAASgMAAEsDAABMAwAATQMAAE4DAABP + AwAAUAMAAFEDAABSAwAAUwMAAFQDAABVAwAAVgMAAFcDAABYAwAAWQMAAFoDAABbAwAAXAMAAF + 0DAABeAwAAXwMAAGADAABhAwAAYgMAAGMDAABkAwAAZQMAAGYDAABnAwAAaAMAAGkDAABqAwAA + awMAAGwDAABtAwAAbgMAAG8DAABwAwAAcQMAAHIDAABzAwAAdAMAAHUDAAB2AwAAdwMAAHgDAA + B5AwAAegMAAHsDAAB8AwAAfQMAAH4DAAB/AwAAgAMAAIEDAACCAwAAgwMAAIQDAACFAwAAhgMA + AIcDAACIAwAAiQMAAIoDAACLAwAAjAMAAI0DAACOAwAAjwMAAJADAACRAwAAkgMAAJMDAACUAw + AAlQMAAJYDAACXAwAAmAMAAJkDAACaAwAAmwMAAJwDAACdAwAAngMAAJ8DAACgAwAAoQMAAKID + AACjAwAApAMAAKUDAACmAwAApwMAAKgDAACpAwAAqgMAAKsDAACsAwAArQMAAK4DAACvAwAAsA + MAALEDAACyAwAAswMAALQDAAC1AwAAtgMAALcDAAC4AwAAuQMAALoDAAC7AwAAvAMAAL0DAAC+ + AwAAvwMAAMADAADBAwAAwgMAAMMDAADEAwAAxQMAAMYDAADHAwAAyAMAAMkDAADKAwAAywMAAM + wDAADNAwAAzgMAAM8DAADQAwAA0QMAANIDAADTAwAA1AMAANUDAADWAwAA1wMAANgDAADZAwAA + 2gMAANsDAADcAwAA3QMAAN4DAADfAwAA4AMAAOEDAADiAwAA4wMAAOQDAADlAwAA5gMAAOcDAA + DoAwAA6QMAAOoDAADrAwAA7AMAAO0DAADuAwAA7wMAAPADAADxAwAA8gMAAPMDAAD0AwAA9QMA + APYDAAD3AwAA+AMAAPkDAAD6AwAA+wMAAPwDAAD9AwAA/gMAAP8DAAAABAAAAQQAAAIEAAADBA + AABAQAAAUEAAAGBAAABwQAAAgEAAAJBAAACgQAAAsEAAAMBAAADQQAAA4EAAAPBAAAEAQAABEE + AAASBAAAEwQAABQEAAAVBAAAFgQAABcEAAAYBAAAGQQAABoEAAAbBAAAHAQAAB0EAAAeBAAAHw + QAACAEAAAhBAAAIgQAACMEAAAkBAAAJQQAACYEAAAnBAAAKAQAACkEAAAqBAAAKwQAACwEAAAt + BAAALgQAAC8EAAAwBAAAMQQAADIEAAAzBAAANAQAADUEAAA2BAAANwQAADgEAAA5BAAAOgQAAD + sEAAA8BAAAPQQAAD4EAAA/BAAAQAQAAEEEAABCBAAAQwQAAEQEAABFBAAARgQAAEcEAABIBAAA + SQQAAEoEAABLBAAATAQAAE0EAABOBAAATwQAAFAEAABRBAAAUgQAAFMEAABUBAAAVQQAAFYEAA + BXBAAAWAQAAFkEAABaBAAAWwQAAFwEAABdBAAAXgQAAF8EAABgBAAAYQQAAGIEAABjBAAAZAQA + AGUEAABmBAAAZwQAAGgEAABpBAAAagQAAGsEAABsBAAAbQQAAG4EAABvBAAAcAQAAHEEAAByBA + AAcwQAAHQEAAB1BAAAdgQAAHcEAAB4BAAAeQQAAHoEAAB7BAAAfAQAAH0EAAB+BAAAfwQAAIAE + AACBBAAAggQAAIMEAACEBAAAhQQAAIYEAACHBAAAiAQAAIkEAACKBAAAiwQAAIwEAACNBAAAjg + QAAI8EAACQBAAAkQQAAJIEAACTBAAAlAQAAJUEAACWBAAAlwQAAJgEAACZBAAAmgQAAJsEAACc + BAAAnQQAAJ4EAACfBAAAoAQAAKEEAACiBAAAowQAAKQEAAClBAAApgQAAKcEAACoBAAAqQQAAK + oEAACrBAAArAQAAK0EAACuBAAArwQAALAEAACxBAAAsgQAALMEAAC0BAAAtQQAALYEAAC3BAAA + uAQAALkEAAC6BAAAuwQAALwEAAC9BAAAvgQAAL8EAADABAAAwQQAAMIEAADDBAAAxAQAAMUEAA + DGBAAAxwQAAMgEAADJBAAAygQAAMsEAADMBAAAzQQAAM4EAADPBAAA0AQAANEEAADSBAAA0wQA + ANQEAADVBAAA1gQAANcEAADYBAAA2QQAANoEAADbBAAA3AQAAN0EAADeBAAA3wQAAOAEAADhBA + AA4gQAAOMEAADkBAAA5QQAAOYEAADnBAAA6AQAAOkEAADqBAAA6wQAAOwEAADtBAAA7gQAAO8E + AADwBAAA8QQAAPIEAADzBAAA9AQAAPUEAAD2BAAA9wQAAPgEAAD5BAAA+gQAAPsEAAD8BAAA/Q + QAAP4EAAD/BAAAAAUAAAEFAAACBQAAAwUAAAQFAAAFBQAABgUAAAcFAAAIBQAACQUAAAoFAAAL + BQAADAUAAA0FAAAOBQAADwUAABAFAAARBQAAEgUAABMFAAAUBQAAFQUAABYFAAAXBQAAGAUAAB + kFAAAaBQAAGwUAABwFAAAdBQAAHgUAAB8FAAAgBQAAIQUAACIFAAAjBQAAJAUAACUFAAAmBQAA + JwUAACgFAAApBQAAKgUAACsFAAAsBQAALQUAAC4FAAAvBQAAMAUAADEFAAAyBQAAMwUAADQFAA + A1BQAANgUAADcFAAA4BQAAOQUAADoFAAA7BQAAPAUAAD0FAAA+BQAAPwUAAEAFAABBBQAAQgUA + AEMFAABEBQAARQUAAEYFAABHBQAASAUAAEkFAABKBQAASwUAAEwFAABNBQAATgUAAE8FAABQBQ + AAUQUAAFIFAABTBQAAVAUAAFUFAABWBQAAVwUAAFgFAABZBQAAWgUAAFsFAABcBQAAXQUAAF4F + AABfBQAAYAUAAGEFAABiBQAAYwUAAGQFAABlBQAAZgUAAGcFAABoBQAAaQUAAGoFAABrBQAAbA + UAAG0FAABuBQAAbwUAAHAFAABxBQAAcgUAAHMFAAB0BQAAdQUAAHYFAAB3BQAAeAUAAHkFAAB6 + BQAAewUAAHwFAAB9BQAAfgUAAH8FAACABQAAgQUAAIIFAACDBQAAhAUAAIUFAACGBQAAhwUAAI + gFAACJBQAAigUAAIsFAACMBQAAjQUAAI4FAACPBQAAkAUAAJEFAACSBQAAkwUAAJQFAACVBQAA + lgUAAJcFAACYBQAAmQUAAJoFAACbBQAAnAUAAJ0FAACeBQAAnwUAAKAFAAChBQAAogUAAKMFAA + CkBQAApQUAAKYFAACnBQAAqAUAAKkFAACqBQAAqwUAAKwFAACtBQAArgUAAK8FAACwBQAAsQUA + ALIFAACzBQAAtAUAALUFAAC2BQAAtwUAALgFAAC5BQAAugUAALsFAAC8BQAAvQUAAL4FAAC/BQ + AAwAUAAMEFAADCBQAAwwUAAMQFAADFBQAAxgUAAMcFAADIBQAAyQUAAMoFAADLBQAAzAUAAM0F + AADOBQAAzwUAANAFAADRBQAA0gUAANMFAADUBQAA1QUAANYFAADXBQAA2AUAANkFAADaBQAA2w + UAANwFAADdBQAA3gUAAN8FAADgBQAA4QUAAOIFAADjBQAA5AUAAOUFAADmBQAA5wUAAOgFAADp + BQAA6gUAAOsFAADsBQAA7QUAAO4FAADvBQAA8AUAAPEFAADyBQAA8wUAAPQFAAD1BQAA9gUAAP + cFAAD4BQAA+QUAAPoFAAD7BQAA/AUAAP0FAAD+BQAA/wUAAAAGAAABBgAAAgYAAAMGAAAEBgAA + BQYAAAYGAAAHBgAACAYAAAkGAAAKBgAACwYAAAwGAAANBgAADgYAAA8GAAAQBgAAEQYAABIGAA + ATBgAAFAYAABUGAAAWBgAAFwYAABgGAAAZBgAAGgYAABsGAAAcBgAAHQYAAB4GAAAfBgAAIAYA + ACEGAAAiBgAAIwYAACQGAAAlBgAAJgYAACcGAAAoBgAAKQYAACoGAAArBgAALAYAAC0GAAAuBg + AALwYAADAGAAAxBgAAMgYAADMGAAA0BgAANQYAADYGAAA3BgAAOAYAADkGAAA6BgAAOwYAADwG + AAA9BgAAPgYAAD8GAABABgAAQQYAAEIGAABDBgAARAYAAEUGAABGBgAARwYAAEgGAABJBgAASg + YAAEsGAABMBgAATQYAAE4GAABPBgAAUAYAAFEGAABSBgAAUwYAAFQGAABVBgAAVgYAAFcGAABY + BgAAWQYAAFoGAABbBgAAXAYAAF0GAABeBgAAXwYAAGAGAABhBgAAYgYAAGMGAABkBgAAZQYAAG + YGAABnBgAAaAYAAGkGAABqBgAAawYAAGwGAABtBgAAbgYAAG8GAABwBgAAcQYAAHIGAABzBgAA + dAYAAHUGAAB2BgAAdwYAAHgGAAB5BgAAegYAAHsGAAB8BgAAfQYAAH4GAAB/BgAAgAYAAIEGAA + CCBgAAgwYAAIQGAACFBgAAhgYAAIcGAACIBgAAiQYAAIoGAACLBgAAjAYAAI0GAACOBgAAjwYA + AJAGAACRBgAAkgYAAJMGAACUBgAAlQYAAJYGAACXBgAAmAYAAJkGAACaBgAAmwYAAJwGAACdBg + AAngYAAJ8GAACgBgAAoQYAAKIGAACjBgAApAYAAKUGAACmBgAApwYAAKgGAACpBgAAqgYAAKsG + AACsBgAArQYAAK4GAACvBgAAsAYAALEGAACyBgAAswYAALQGAAC1BgAAtgYAALcGAAC4BgAAuQ + YAALoGAAC7BgAAvAYAAL0GAAC+BgAAvwYAAMAGAADBBgAAwgYAAMMGAADEBgAAxQYAAMYGAADH + BgAAyAYAAMkGAADKBgAAywYAAMwGAADNBgAAzgYAAM8GAADQBgAA0QYAANIGAADTBgAA1AYAAN + UGAADWBgAA1wYAANgGAADZBgAA2gYAANsGAADcBgAA3QYAAN4GAADfBgAA4AYAAOEGAADiBgAA + 4wYAAOQGAADlBgAA5gYAAOcGAADoBgAA6QYAAOoGAADrBgAA7AYAAO0GAADuBgAA7wYAAPAGAA + DxBgAA8gYAAPMGAAD0BgAA9QYAAPYGAAD3BgAA+AYAAPkGAAD6BgAA+wYAAPwGAAD9BgAA/gYA + AP8GAAAABwAAAQcAAAIHAAADBwAABAcAAAUHAAAGBwAABwcAAAgHAAAJBwAACgcAAAsHAAAMBw + AADQcAAA4HAAAPBwAAEAcAABEHAAASBwAAEwcAABQHAAAVBwAAFgcAABcHAAAYBwAAGQcAABoH + AAAbBwAAHAcAAB0HAAAeBwAAHwcAACAHAAAhBwAAIgcAACMHAAAkBwAAJQcAACYHAAAnBwAAKA + cAACkHAAAqBwAAKwcAACwHAAAtBwAALgcAAC8HAAAwBwAAMQcAADIHAAAzBwAANAcAADUHAAA2 + BwAANwcAADgHAAA5BwAAOgcAADsHAAA8BwAAPQcAAD4HAAA/BwAAQAcAAEEHAABCBwAAQwcAAE + QHAABFBwAARgcAAEcHAABIBwAASQcAAEoHAABLBwAATAcAAE0HAABOBwAATwcAAFAHAABRBwAA + UgcAAFMHAABUBwAAVQcAAFYHAABXBwAAWAcAAFkHAABaBwAAWwcAAFwHAABdBwAAXgcAAF8HAA + BgBwAAYQcAAGIHAABjBwAAZAcAAGUHAABmBwAAZwcAAGgHAABpBwAAagcAAGsHAABsBwAAbQcA + AG4HAABvBwAAcAcAAHEHAAByBwAAcwcAAHQHAAB1BwAAdgcAAHcHAAB4BwAAeQcAAHoHAAB7Bw + AAfAcAAH0HAAB+BwAAfwcAAIAHAACBBwAAggcAAIMHAAD+////hQcAAIYHAACHBwAAiAcAAIkH + AACKBwAAiwcAAIwHAACNBwAAjgcAAI8HAACQBwAAkQcAAJIHAACTBwAAlAcAAJUHAACWBwAAlw + cAAJgHAACZBwAAmgcAAJsHAACcBwAAnQcAAJ4HAACfBwAAoAcAAKEHAACiBwAAowcAAKQHAACl + BwAApgcAAKcHAACoBwAAqQcAAKoHAACrBwAArAcAAK0HAACuBwAArwcAALAHAACxBwAAsgcAAL + MHAAC0BwAAtQcAALYHAAC3BwAAuAcAALkHAAC6BwAAuwcAALwHAAC9BwAAvgcAAL8HAADABwAA + wQcAAMIHAADDBwAAxAcAAMUHAADGBwAAxwcAAMgHAADJBwAAygcAAMsHAADMBwAAzQcAAM4HAA + DPBwAA0AcAANEHAADSBwAA0wcAANQHAADVBwAA1gcAANcHAADYBwAA2QcAANoHAADbBwAA3AcA + AN0HAADeBwAA3wcAAOAHAADhBwAA4gcAAOMHAADkBwAA5QcAAOYHAADnBwAA6AcAAOkHAADqBw + AA6wcAAOwHAADtBwAA/v///+8HAADwBwAA8QcAAPIHAADzBwAA9AcAAPUHAAD+////9wcAAPgH + AAD5BwAA+gcAAPsHAAD8BwAA/QcAAP7////9/////f////3////9/////f////3////9/////f + ////3////9/////f////3////9/////f////3////9/////f///xAIAAD+//////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////////////////////////////UgBvAG8AdAAg + AEUAbgB0AHIAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB + YABQH//////////wMAAAAQjYFkm0/PEYbqAKoAuSnoAAAAAAAAAAAAAAAAAAAAAAAAAAD+//// + AAAAAAAAAABQAGkAYwB0AHUAcgBlAHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAEgACAf///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAudgAAAAAAAEMAdQByAHIAZQBuAHQAIABVAHMAZQByAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAIBAQAAAP//////////AAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9gcAAAAQAAAAAAAABQBTAHUAbQBtAGEAcg + B5AEkAbgBmAG8AcgBtAGEAdABpAG8AbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACgAAgEC + AAAABQAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACEBwAAUNIAAA + AAAABQAG8AdwBlAHIAUABvAGkAbgB0ACAARABvAGMAdQBtAGUAbgB0AAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAKAACAf///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAADwAAACbjw4AAAAAAAUARABvAGMAdQBtAGUAbgB0AFMAdQBtAG0AYQByAHkASQBu + AGYAbwByAG0AYQB0AGkAbwBuAAAAAAAAAAAAAAA4AAIBBAAAAP//////////AAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7gcAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////// + ////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAP///////////////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAA== +ATTENDEE;CN="ext Tuomas.J.Iivarinen@tieto.com";RSVP=TRUE:mailto:Tuomas.J.Ii + varinen@tieto.com +ATTENDEE;CN="ext Pawel.Grygiel@tieto.com";RSVP=TRUE:mailto:Pawel.Grygiel@ti + eto.com +ATTENDEE;CN="Lehtonen Kalle.Ju (Nokia-D/Tampere)";RSVP=TRUE:mailto:kalle.ju + .lehtonen@nokia.com +ATTENDEE;CN="Tiitinen Tommi (Nokia-D/Tampere)";RSVP=TRUE:mailto:tommi.tiiti + nen@nokia.com +ATTENDEE;CN="Ojala Jouni (Nokia-D/Tampere)";RSVP=TRUE:mailto:jouni.ojala@no + kia.com +ATTENDEE;CN="V Ravi-Iyer (Nokia-D/Bangalore)";RSVP=TRUE:mailto:ravi-iyer.v@ + nokia.com +ATTENDEE;CN="Murugasen Mathan (Nokia-D/Bangalore)";RSVP=TRUE:mailto:Mathan. + Murugasen@nokia.com +CLASS:PUBLIC +CREATED:20100519T104559Z +DESCRIPTION:When: 19.05.2010 10:00-11:00 (GMT+02:00) Helsinki\, Kyiv\, Riga + \, Sofia\, Tallinn\, Vilnius.\nWhere: Live Meeting\n\nNote: The GMT offset + above does not reflect daylight saving time adjustments.\n\n*~*~*~*~*~*~* + ~*~*~*\n\nAgenda:\n\nGo through Day view X0 material and discussion open i + ssue.\n\n\n \nBr\,\nDongsheng.\n\n---------------------------------------- + -------------------------------------------------------------------------- + ---------------------\nFinland: +358 7180 71870\; \nPoland: +48 71 718 121 + 5 \nBeijing:+8610 8711 1870 \nChengdu: +86 288 689 0188 ext 1870 and press + "#" \n\nConference ID: 21439 andPIN:1017\n-+-----+-----+-----+-----+----- + +-----+-----+-----+-\n\n\nDongsheng Lu has invited you to present at an on + line meeting using Microsoft® Office Live Meeting service.\nJoin the meet + ing \nAUDIO INFORMATION \nComputer Audio\nTo use computer a + udio\, you need speakers and a microphone\, or a headset.\nFIRST-TIME USER + S \nTo save time before the meeting\, check your system to make sure it is ready to use Office Live + Meeting.\nNotes \nOffice Live Meeting can be used to record meetings. By p + articipating in this meeting\, you agree that your communications may be r + ecorded at any time during the meeting. You will be notified on screen if + recording of the meeting is active.\nTROUBLESHOOTING \nUnable to join the + meeting? Follow these steps:\n 1. Copy this address and paste into your w + eb browser: \n https://www206.livemeeting.com/cc/_XML/nokia/join\n 2. Cop + y and paste the required information:\n Meeting ID: D2BTWM\n Entry Code: + F2H=s\;'=X\n Location: https://www206.livemeeting.com/cc/_XML/nokia\nIf + you still cannot enter the meeting\, contact support. \nNOTICE + \nOffice Live Meeting can be used to record meetings. By participating in + this meeting\, you agree that your communications may be monitored or rec + orded at any time during the meeting.\n\n\n +DTEND:20100519T080000Z +DTSTAMP:20100518T125406Z +DTSTART:20100519T070000Z +LAST-MODIFIED:20100519T104559Z +LOCATION:Live Meeting +ORGANIZER;CN="Lu Dongsheng (Nokia-D/Tampere)":mailto:dongsheng.lu@nokia.com +PRIORITY:5 +SEQUENCE:0 +SUMMARY;LANGUAGE=en-us:Day view X0 workshop. +TRANSP:OPAQUE +UID:040000008200E00074C5B7101A82E00800000000F000B626A1F6CA01000000000000000 + 0100000004D2DBA4A9642AB49B9120B2E5F04066A +X-ALT-DESC;FMTTYPE=text/html:\n\n\n\n\n\n\n\n\n

When: 19.05.2010 10:00- + 11:00 (GMT+02:00) Helsinki\, Kyiv\, Riga\, Sofia\, Tallinn\, Vilnius.\n\n
Where: Live Meeting\n

\n\n

Note: The GMT offset above does not reflect daylight savi + ng time adjustments.\n

\n\n

*~*~*~*~*~*~* + ~*~*~*\n

\n\n

Agenda:\ + n

\n\n

Go through Day view X0 material and + discussion open issue.\n

\n
\n\n

 \;\n\n
Br\,\n\n
Dongsheng.\n

\n\n

---- + -------------------------------------------------------------------------- + ---------------------------------------------------------

\n\n

Finland: +358 7180 71870\; \n\n
Poland: +48 71 718 1215 \n\n
Beijing:+8610 8711 1870 \n\n
Chengdu: +86 288 689 0188 ext 1870 and press "\;#"\; \n< + /P>\n\n

Conference ID: 21439 andPIN:1017\n\n
-+-----+-----+-----+-----+-----+ + -----+-----+-----+-\n

\n
\n\n

Do + ngsheng Lu has invited you to present at an online meeting using Microsoft + ® Office Live Meeting service.\n\n
Join the meeting + \n\n
AUDIO INFORM + ATION \n\n
Computer Audio
\n\n
< + FONT SIZE=2 FACE="Tahoma">To use computer audio\, you need speakers and a + microphone\, or a headset.
\n\n
FIRST-TIME USERS < + /B>\n\n
To save time before the meeting\, check your system to make sure it is ready to use Office Live Meeti + ng.\n\n
Notes \n\n
Office Live Meeting can be used to record meetings. By participating i + n this meeting\, you agree that your communications may be recorded at any + time during the meeting. You will be notified on screen if recording of t + he meeting is active.

\n\n

TROUBLESHOOTING + \n\n
Unable to join the meeting? \; Foll + ow these steps:\n\n
 \; \; \; \; \; \;&n + bsp\; 1. \; \; \; \; \; Cop + y this address and paste into your web browser: \n\n
 \;&nbs + p\; \; \; \; \; \;  \; \; \; \; \; +  \; \; https://www206.livemeeting.com/cc/_XML/nokia/j + oin\n\n
 \; \; \; \; \; \; \; 2. \; \; \; \; \; Copy and pa + ste the required information:\n\n
 \; \; \; \;&n + bsp\; \; \;  \; \; \; \; \; \; \; Meeting ID: D2BTWM\n\n
 \; \;&nbs + p\; \; \; \; \;  \; \; \; \; \; \; +  \; Entry Code: F2H=s\;'=X\n\n
&n + bsp\; \; \; \; \; \; \;  \; \; \;  + \; \; \; \; Location: https://www206.livemeeting.com/c + c/_XML/nokia\n\n
If you still can + not enter the meeting\, < + U>contact support.\n\n
NOTICE \n\n
Off + ice Live Meeting can be used to record meetings. By participating in this + meeting\, you agree that your communications may be monitored or recorded + at any time during the meeting.

\n
\n\n\n +X-MICROSOFT-CDO-BUSYSTATUS:BUSY +X-MICROSOFT-CDO-IMPORTANCE:1 +X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY +X-MICROSOFT-DISALLOW-COUNTER:FALSE +X-MS-OLK-APPTLASTSEQUENCE:0 +X-MS-OLK-CONFTYPE:0 +END:VEVENT +END:VCALENDAR diff -r fd30d51f876b -r b6db4fd4947b calendarui/tsrc/unittest_calenviewerservice/data/meeting.vcs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/tsrc/unittest_calenviewerservice/data/meeting.vcs Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,23 @@ +BEGIN:VCALENDAR +PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN +VERSION:1.0 +BEGIN:VEVENT +DTSTART:20100514T053000Z +DTEND:20100514T093000Z +LOCATION:Hara 5004 +UID:040000008200E00074C5B7101A82E00800000000C0BE6AE8BFE7CA01000000000000000 + 0100000008F4AF94160A11240BBE3C983058E3269 +DESCRIPTION;ENCODING=QUOTED-PRINTABLE:= +When: Friday, May 14, 2010 11:00 AM-3:00 PM (GMT+05:30) Chennai, Kolkata,= + Mumbai, New Delhi.=0D=0AWhere: Hara 5004 =0D=0A=0D=0ANote: The GMT offse= +t above does not reflect daylight saving time adjustments.=0D=0A=0D=0A*~*= +~*~*~*~*~*~*~*~*=0D=0A=0D=0AHello All,=0D=0A=0D=0AAs all of you know Ravi= + is taking Experience Owner responsibility from wk 19 and like to discuss= + with us face to face the Organizer opportunity and future. =0D=0AHe will= + put further agenda of this meeting.=0D=0A=0D=0AThe workshop will be thre= +e hours but due to room availability 2 hrs will be pre lunch session and = +1 hr post lunch session.=0D=0A=0D=0ARegards=0D=0ASudhansu=0D=0A=0D=0A +SUMMARY:workshop to discuss possibilities on organizer.. +PRIORITY:3 +END:VEVENT +END:VCALENDAR diff -r fd30d51f876b -r b6db4fd4947b calendarui/tsrc/unittest_calenviewerservice/inc/test_calenviewerservice.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/tsrc/unittest_calenviewerservice/inc/test_calenviewerservice.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,44 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#ifndef __TEST_CALENVIWRSRV_H__ +#define __TEST_CALENVIWRSRV_H__ + +#include +#include + +class TestCalenViewerService : public QObject +{ + Q_OBJECT +public: + TestCalenViewerService(); + ~TestCalenViewerService(); + +private slots: + void init(); + void cleanup(); + + void testOpeningVCal(); + void testOpeningICal(); + +private: + +}; + +#endif // __TEST_CALENVIWRSRV_H__ + +// End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/tsrc/unittest_calenviewerservice/rom/unittest_calenviewerservice.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/tsrc/unittest_calenviewerservice/rom/unittest_calenviewerservice.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,31 @@ +/* +* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Image description file for test project +* +*/ + +#ifndef __UT_CALENVIEWER_SERVICE_IBY__ +#define __UT_CALENVIEWER_SERVICE_IBY__ + +S60_APP_EXE(utcalenviewerservice) +S60_APP_RESOURCE(utcalenviewerservice) + +// Application registration file. +data=DATAZ_\private\10003a3f\import\apps\utcalenviewerservice_reg.rsc \private\10003a3f\import\apps\utcalenviewerservice_reg.rsc + +// Test files +data=DATAZ_\data\others\meeting.vcs \data\others\meeting.vcs +data=DATAZ_\data\others\meeting.ics \data\others\meeting.ics + +#endif // __UT_CALENVIEWER_SERVICE_IBY__ \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/tsrc/unittest_calenviewerservice/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/tsrc/unittest_calenviewerservice/src/main.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,45 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +// System includes +#include +#include + +// User includes +#include "test_calenviewerservice.h" + +int main(int argc, char *argv[]) +{ + HbApplication app(argc, argv); + + TestCalenViewerService tc; + + char *args[3]; + args[0] = argv[0]; + args[1] = "-o"; + args[2] = "c:\\data\\TestCalenViewerService.txt"; + + int ret = QTest::qExec(&tc, 3, args); + // Core dump if HbIconLoader instance is not destroyed before the + // application instance. HbIconLoader uses QCoreApplication::aboutToQuit() + // signal to destroy itself. app.exec() where the signal is normally emitted + // is not called here. So, invoking the signal explicitly. + QMetaObject::invokeMethod(&app, "aboutToQuit", Qt::DirectConnection); + return ret; +} + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/tsrc/unittest_calenviewerservice/src/test_calenviewerservice.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/tsrc/unittest_calenviewerservice/src/test_calenviewerservice.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,92 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#include +#include + +#include "test_calenviewerservice.h" + +TestCalenViewerService::TestCalenViewerService() +{ + // No implementation yet +} + +TestCalenViewerService::~TestCalenViewerService() +{ + // No implementation yet +} + +void TestCalenViewerService::init() +{ + // No implementation yet +} + +void TestCalenViewerService::cleanup() +{ + // No implementation yet +} + +void TestCalenViewerService::testOpeningVCal() +{ + QTest::qWait(2); + + QFile file("z:\\data\\others\\meeting.vcs"); + + XQApplicationManager mAppMgr; + XQAiwRequest *request; + QVERIFY(request = mAppMgr.create(file)); + + // Set function parameters + QList args; + args << file.fileName(); + request->setArguments(args); + request->setEmbedded(true); + + // Send the request + bool res; + QVERIFY(res = request->send()); + + delete request; +} + +void TestCalenViewerService::testOpeningICal() +{ + // TODO: Both the test cases cannot be run in sequence + // due to some issues in Qt/Highway framework. Need to + // re-check on newer version and then modify the test case + // if required + + /*QTest::qWait(2); + + QFile file("z:\\data\\others\\meeting.ics"); + + XQApplicationManager mAppMgr; + XQAiwRequest *request; + QVERIFY(request = mAppMgr.create(file)); + + // Set function parameters + QList args; + args << file.fileName(); + request->setArguments(args); + request->setEmbedded(true); + + // Send the request + bool res; + QVERIFY(res = request->send()); + + delete request;*/ +} diff -r fd30d51f876b -r b6db4fd4947b calendarui/tsrc/unittest_calenviewerservice/unittest_calenviewerservice.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/tsrc/unittest_calenviewerservice/unittest_calenviewerservice.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,42 @@ +# +# Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: This is the project specification file for the calenviewerservice. +# + +TEMPLATE = app +TARGET = utcalenviewerservice +CONFIG += qtestlib +CONFIG += symbian_test +CONFIG += hb +DEPENDPATH += . inc src +INCLUDEPATH += . + +# Input +HEADERS += inc/test_calenviewerservice.h +SOURCES += src/main.cpp src/test_calenviewerservice.cpp + +symbian : { + + TARGET.CAPABILITY = ALL -TCB + TARGET.UID3 = 0xE0003364 + + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + LIBS += -lxqserviceutil -lxqservice + + BLD_INF_RULES.prj_testexports += \ + "./rom/unittest_calenviewerservice.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unittest_calenviewerservice.iby)" \ + "./data/meeting.vcs z:/data/others/meeting.vcs" \ + "./data/meeting.ics z:/data/others/meeting.ics" +} diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/bwins/calenviewsu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/bwins/calenviewsu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,162 @@ +EXPORTS + ?scrollingFinished@CalenPreviewPane@@QAEXXZ @ 1 NONAME ; void CalenPreviewPane::scrollingFinished(void) + ?fetchEntriesAndUpdateModel@CalenMonthView@@QAEXXZ @ 2 NONAME ; void CalenMonthView::fetchEntriesAndUpdateModel(void) + ?setDate@CalenMonthView@@AAEXXZ @ 3 NONAME ; void CalenMonthView::setDate(void) + ?showHideRegionalInformation@CalenMonthView@@AAEXXZ @ 4 NONAME ; void CalenMonthView::showHideRegionalInformation(void) + ?updateMonthGridWithEventIndicators@CalenMonthGrid@@QAEXAAV?$QList@VCalenMonthData@@@@@Z @ 5 NONAME ; void CalenMonthGrid::updateMonthGridWithEventIndicators(class QList &) + ?handleGridItemActivated@CalenMonthView@@QAEXXZ @ 6 NONAME ; void CalenMonthView::handleGridItemActivated(void) + ?setFocusToProperDay@CalenMonthGrid@@AAEXXZ @ 7 NONAME ; void CalenMonthGrid::setFocusToProperDay(void) + ??1CalenPreviewPane@@UAE@XZ @ 8 NONAME ; CalenPreviewPane::~CalenPreviewPane(void) + ?mousePressEvent@CalenMonthGrid@@EAEXPAVQGraphicsSceneMouseEvent@@@Z @ 9 NONAME ; void CalenMonthGrid::mousePressEvent(class QGraphicsSceneMouseEvent *) + ?completePopulation@CalenMonthView@@AAEXXZ @ 10 NONAME ; void CalenMonthView::completePopulation(void) + ??0CalenAgendaViewWidget@@QAE@AAVMCalenServices@@PAVCalenDocLoader@@@Z @ 11 NONAME ; CalenAgendaViewWidget::CalenAgendaViewWidget(class MCalenServices &, class CalenDocLoader *) + ?handleAppendingRows@CalenMonthGrid@@AAEXAAV?$QList@VCalenMonthData@@@@@Z @ 12 NONAME ; void CalenMonthGrid::handleAppendingRows(class QList &) + ?handleChangeOrientation@CalenMonthView@@AAEXXZ @ 13 NONAME ; void CalenMonthView::handleChangeOrientation(void) + ?staticMetaObject@CalenSettingsView@@2UQMetaObject@@B @ 14 NONAME ; struct QMetaObject const CalenSettingsView::staticMetaObject + ?docLoader@CalenAgendaView@@QAEPAVCalenDocLoader@@XZ @ 15 NONAME ; class CalenDocLoader * CalenAgendaView::docLoader(void) + ?getStaticMetaObject@CalenSettingsView@@SAABUQMetaObject@@XZ @ 16 NONAME ; struct QMetaObject const & CalenSettingsView::getStaticMetaObject(void) + ?updateMonthDataArrayWithActiveDates@CalenMonthView@@AAEXXZ @ 17 NONAME ; void CalenMonthView::updateMonthDataArrayWithActiveDates(void) + ?scrollingFinished@CalenMonthGrid@@QAEXXZ @ 18 NONAME ; void CalenMonthGrid::scrollingFinished(void) + ?setCurrentIdex@CalenMonthGrid@@QAEXH@Z @ 19 NONAME ; void CalenMonthGrid::setCurrentIdex(int) + ?setupView@CalenAgendaView@@QAEXPAVCalenDocLoader@@@Z @ 20 NONAME ; void CalenAgendaView::setupView(class CalenDocLoader *) + ??_ECalenMonthGrid@@UAE@I@Z @ 21 NONAME ; CalenMonthGrid::~CalenMonthGrid(unsigned int) + ?trUtf8@CalenPreviewPane@@SA?AVQString@@PBD0@Z @ 22 NONAME ; class QString CalenPreviewPane::trUtf8(char const *, char const *) + ?trUtf8@CalenMonthGrid@@SA?AVQString@@PBD0@Z @ 23 NONAME ; class QString CalenMonthGrid::trUtf8(char const *, char const *) + ?populatePrevMonth@CalenMonthView@@QAEXXZ @ 24 NONAME ; void CalenMonthView::populatePrevMonth(void) + ?qt_metacall@CalenSettingsView@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 25 NONAME ; int CalenSettingsView::qt_metacall(enum QMetaObject::Call, int, void * *) + ??1CalenPluginLabel@@UAE@XZ @ 26 NONAME ; CalenPluginLabel::~CalenPluginLabel(void) + ?handleLeftEffectCompleted@CalenMonthView@@AAEXABUEffectStatus@HbEffect@@@Z @ 27 NONAME ; void CalenMonthView::handleLeftEffectCompleted(struct HbEffect::EffectStatus const &) + ?getStaticMetaObject@CalenMonthGrid@@SAABUQMetaObject@@XZ @ 28 NONAME ; struct QMetaObject const & CalenMonthGrid::getStaticMetaObject(void) + ?trUtf8@CalenSettingsView@@SA?AVQString@@PBD0H@Z @ 29 NONAME ; class QString CalenSettingsView::trUtf8(char const *, char const *, int) + ?qt_metacast@CalenMonthView@@UAEPAXPBD@Z @ 30 NONAME ; void * CalenMonthView::qt_metacast(char const *) + ?staticMetaObject@CalenMonthView@@2UQMetaObject@@B @ 31 NONAME ; struct QMetaObject const CalenMonthView::staticMetaObject + ?setupView@CalenMonthView@@QAEXPAVCalenDocLoader@@@Z @ 32 NONAME ; void CalenMonthView::setupView(class CalenDocLoader *) + ?metaObject@CalenMonthGrid@@UBEPBUQMetaObject@@XZ @ 33 NONAME ; struct QMetaObject const * CalenMonthGrid::metaObject(void) const + ?startAutoScroll@CalenPreviewPane@@QAEXXZ @ 34 NONAME ; void CalenPreviewPane::startAutoScroll(void) + ?doLazyLoading@CalenMonthView@@QAEXXZ @ 35 NONAME ; void CalenMonthView::doLazyLoading(void) + ?setView@CalenMonthGrid@@QAEXPAVCalenMonthView@@@Z @ 36 NONAME ; void CalenMonthGrid::setView(class CalenMonthView *) + ??1CalenSettingsView@@UAE@XZ @ 37 NONAME ; CalenSettingsView::~CalenSettingsView(void) + ?Date@CalenPreviewPane@@QAE?AVQDateTime@@XZ @ 38 NONAME ; class QDateTime CalenPreviewPane::Date(void) + ?tr@CalenPreviewPane@@SA?AVQString@@PBD0H@Z @ 39 NONAME ; class QString CalenPreviewPane::tr(char const *, char const *, int) + ?metaObject@CalenMonthView@@UBEPBUQMetaObject@@XZ @ 40 NONAME ; struct QMetaObject const * CalenMonthView::metaObject(void) const + ??0CalenPreviewPane@@QAE@AAVMCalenServices@@PAVQGraphicsItem@@@Z @ 41 NONAME ; CalenPreviewPane::CalenPreviewPane(class MCalenServices &, class QGraphicsItem *) + ?rowsInPrevMonth@CalenMonthView@@QAEHXZ @ 42 NONAME ; int CalenMonthView::rowsInPrevMonth(void) + ?handlePrependingRows@CalenMonthGrid@@AAEXAAV?$QList@VCalenMonthData@@@@@Z @ 43 NONAME ; void CalenMonthGrid::handlePrependingRows(class QList &) + ?metaObject@CalenPreviewPane@@UBEPBUQMetaObject@@XZ @ 44 NONAME ; struct QMetaObject const * CalenPreviewPane::metaObject(void) const + ?clearListModel@CalenAgendaView@@QAEXXZ @ 45 NONAME ; void CalenAgendaView::clearListModel(void) + ?gestureEvent@CalenMonthGrid@@MAEXPAVQGestureEvent@@@Z @ 46 NONAME ; void CalenMonthGrid::gestureEvent(class QGestureEvent *) + ??0CalenDayView@@QAE@AAVMCalenServices@@@Z @ 47 NONAME ; CalenDayView::CalenDayView(class MCalenServices &) + ?populateNextMonth@CalenMonthView@@QAEXXZ @ 48 NONAME ; void CalenMonthView::populateNextMonth(void) + ?handleRightEffectCompleted@CalenMonthView@@AAEXABUEffectStatus@HbEffect@@@Z @ 49 NONAME ; void CalenMonthView::handleRightEffectCompleted(struct HbEffect::EffectStatus const &) + ?qt_metacast@CalenMonthGrid@@UAEPAXPBD@Z @ 50 NONAME ; void * CalenMonthGrid::qt_metacast(char const *) + ?firstDayOfGrid@CalenMonthView@@QAE?AVQDateTime@@XZ @ 51 NONAME ; class QDateTime CalenMonthView::firstDayOfGrid(void) + ?rowsInFutMonth@CalenMonthView@@QAEHXZ @ 52 NONAME ; int CalenMonthView::rowsInFutMonth(void) + ?launchDayView@CalenMonthView@@QAEXXZ @ 53 NONAME ; void CalenMonthView::launchDayView(void) + ?getCurrGridIndex@CalenMonthView@@QAEHXZ @ 54 NONAME ; int CalenMonthView::getCurrGridIndex(void) + ?gestureEvent@CalenPreviewPane@@MAEXPAVQGestureEvent@@@Z @ 55 NONAME ; void CalenPreviewPane::gestureEvent(class QGestureEvent *) + ?prependRows@CalenMonthGrid@@QAEXXZ @ 56 NONAME ; void CalenMonthGrid::prependRows(void) + ?orientationChanged@CalenMonthGrid@@MAEXW4Orientation@Qt@@@Z @ 57 NONAME ; void CalenMonthGrid::orientationChanged(enum Qt::Orientation) + ?qt_metacall@CalenPreviewPane@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 58 NONAME ; int CalenPreviewPane::qt_metacall(enum QMetaObject::Call, int, void * *) + ?trUtf8@CalenPreviewPane@@SA?AVQString@@PBD0H@Z @ 59 NONAME ; class QString CalenPreviewPane::trUtf8(char const *, char const *, int) + ??1CalenThickLinesDrawer@@UAE@XZ @ 60 NONAME ; CalenThickLinesDrawer::~CalenThickLinesDrawer(void) + ?setView@CalenPreviewPane@@QAEXPAVCalenMonthView@@@Z @ 61 NONAME ; void CalenPreviewPane::setView(class CalenMonthView *) + ??_ECalenMonthView@@UAE@I@Z @ 62 NONAME ; CalenMonthView::~CalenMonthView(unsigned int) + ??1CalenAgendaView@@UAE@XZ @ 63 NONAME ; CalenAgendaView::~CalenAgendaView(void) + ?populatePreviewPane@CalenMonthView@@QAEXAAVQDateTime@@@Z @ 64 NONAME ; void CalenMonthView::populatePreviewPane(class QDateTime &) + ??0CalenSettingsView@@QAE@AAVMCalenServices@@PAVQGraphicsItem@@@Z @ 65 NONAME ; CalenSettingsView::CalenSettingsView(class MCalenServices &, class QGraphicsItem *) + ??0CalenAgendaView@@QAE@AAVMCalenServices@@@Z @ 66 NONAME ; CalenAgendaView::CalenAgendaView(class MCalenServices &) + ?updateModelWithPrevMonth@CalenMonthView@@QAEXXZ @ 67 NONAME ; void CalenMonthView::updateModelWithPrevMonth(void) + ?stopScrolling@CalenPreviewPane@@QAEXXZ @ 68 NONAME ; void CalenPreviewPane::stopScrolling(void) + ?refreshView@CalenSettingsView@@QAEXXZ @ 69 NONAME ; void CalenSettingsView::refreshView(void) + ?addBackgroundFrame@CalenMonthView@@AAEXXZ @ 70 NONAME ; void CalenMonthView::addBackgroundFrame(void) + ?createGrid@CalenMonthView@@AAEXXZ @ 71 NONAME ; void CalenMonthView::createGrid(void) + ?tr@CalenPreviewPane@@SA?AVQString@@PBD0@Z @ 72 NONAME ; class QString CalenPreviewPane::tr(char const *, char const *) + ?getStaticMetaObject@CalenPreviewPane@@SAABUQMetaObject@@XZ @ 73 NONAME ; struct QMetaObject const & CalenPreviewPane::getStaticMetaObject(void) + ?launchPreviousView@CalenSettingsView@@AAEXXZ @ 74 NONAME ; void CalenSettingsView::launchPreviousView(void) + ?setCurrGridIndex@CalenMonthView@@QAEXH@Z @ 75 NONAME ; void CalenMonthView::setCurrGridIndex(int) + ?setDateToLabel@CalenMonthView@@AAEXXZ @ 76 NONAME ; void CalenMonthView::setDateToLabel(void) + ?addWeekNumbers@CalenMonthView@@AAEXXZ @ 77 NONAME ; void CalenMonthView::addWeekNumbers(void) + ?downGesture@CalenMonthGrid@@AAEXXZ @ 78 NONAME ; void CalenMonthGrid::downGesture(void) + ?qt_metacall@CalenThickLinesDrawer@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 79 NONAME ; int CalenThickLinesDrawer::qt_metacall(enum QMetaObject::Call, int, void * *) + ?setupView@CalenDayView@@QAEXPAVCalenDocLoader@@@Z @ 80 NONAME ; void CalenDayView::setupView(class CalenDocLoader *) + ?upGesture@CalenMonthGrid@@AAEXXZ @ 81 NONAME ; void CalenMonthGrid::upGesture(void) + ??1CalenMonthView@@UAE@XZ @ 82 NONAME ; CalenMonthView::~CalenMonthView(void) + ?dateFromContext@CalenMonthView@@AAE?AVQDateTime@@ABVMCalenContext@@@Z @ 83 NONAME ; class QDateTime CalenMonthView::dateFromContext(class MCalenContext const &) + ?staticMetaObject@CalenMonthGrid@@2UQMetaObject@@B @ 84 NONAME ; struct QMetaObject const CalenMonthGrid::staticMetaObject + ?trUtf8@CalenMonthGrid@@SA?AVQString@@PBD0H@Z @ 85 NONAME ; class QString CalenMonthGrid::trUtf8(char const *, char const *, int) + ?paint@CalenThickLinesDrawer@@EAEXPAVQPainter@@PBVQStyleOptionGraphicsItem@@PAVQWidget@@@Z @ 86 NONAME ; void CalenThickLinesDrawer::paint(class QPainter *, class QStyleOptionGraphicsItem const *, class QWidget *) + ?initializeForm@CalenSettingsView@@QAEXXZ @ 87 NONAME ; void CalenSettingsView::initializeForm(void) + ?tr@CalenMonthGrid@@SA?AVQString@@PBD0H@Z @ 88 NONAME ; class QString CalenMonthGrid::tr(char const *, char const *, int) + ?handlePanGestureFinished@CalenMonthGrid@@AAEXXZ @ 89 NONAME ; void CalenMonthGrid::handlePanGestureFinished(void) + ?goToToday@CalenMonthView@@AAEXXZ @ 90 NONAME ; void CalenMonthView::goToToday(void) + ?trUtf8@CalenThickLinesDrawer@@SA?AVQString@@PBD0H@Z @ 91 NONAME ; class QString CalenThickLinesDrawer::trUtf8(char const *, char const *, int) + ?onContextChanged@CalenMonthView@@EAEXXZ @ 92 NONAME ; void CalenMonthView::onContextChanged(void) + ?qt_metacast@CalenPreviewPane@@UAEPAXPBD@Z @ 93 NONAME ; void * CalenPreviewPane::qt_metacast(char const *) + ?getCurrentIndex@CalenMonthGrid@@QAEHXZ @ 94 NONAME ; int CalenMonthGrid::getCurrentIndex(void) + ?tr@CalenSettingsView@@SA?AVQString@@PBD0H@Z @ 95 NONAME ; class QString CalenSettingsView::tr(char const *, char const *, int) + ?removeWeekNumbers@CalenMonthView@@AAEXXZ @ 96 NONAME ; void CalenMonthView::removeWeekNumbers(void) + ?trUtf8@CalenMonthView@@SA?AVQString@@PBD0H@Z @ 97 NONAME ; class QString CalenMonthView::trUtf8(char const *, char const *, int) + ??0CalenMonthView@@QAE@AAVMCalenServices@@@Z @ 98 NONAME ; CalenMonthView::CalenMonthView(class MCalenServices &) + ?getStaticMetaObject@CalenThickLinesDrawer@@SAABUQMetaObject@@XZ @ 99 NONAME ; struct QMetaObject const & CalenThickLinesDrawer::getStaticMetaObject(void) + ?setNoEntriesLabel@CalenPreviewPane@@QAEXPAVHbLabel@@@Z @ 100 NONAME ; void CalenPreviewPane::setNoEntriesLabel(class HbLabel *) + ??0CalenThickLinesDrawer@@QAE@W4WidgetType@CalendarNamespace@@PAVQGraphicsItem@@@Z @ 101 NONAME ; CalenThickLinesDrawer::CalenThickLinesDrawer(enum CalendarNamespace::WidgetType, class QGraphicsItem *) + ?onLocaleChanged@CalenMonthView@@UAEXH@Z @ 102 NONAME ; void CalenMonthView::onLocaleChanged(int) + ?doPopulation@CalenMonthView@@UAEXXZ @ 103 NONAME ; void CalenMonthView::doPopulation(void) + ?tr@CalenMonthView@@SA?AVQString@@PBD0H@Z @ 104 NONAME ; class QString CalenMonthView::tr(char const *, char const *, int) + ?captureScreenshot@CalenNativeView@@QAEX_N@Z @ 105 NONAME ; void CalenNativeView::captureScreenshot(bool) + ?GetInstanceListL@CalenPreviewPane@@AAEXXZ @ 106 NONAME ; void CalenPreviewPane::GetInstanceListL(void) + ?getInstanceList@CalenMonthView@@AAEXAAV?$QList@VQDate@@@@VQDateTime@@1@Z @ 107 NONAME ; void CalenMonthView::getInstanceList(class QList &, class QDateTime, class QDateTime) + ?tr@CalenMonthView@@SA?AVQString@@PBD0@Z @ 108 NONAME ; class QString CalenMonthView::tr(char const *, char const *) + ??0CalenMonthGrid@@QAE@PAVQGraphicsItem@@@Z @ 109 NONAME ; CalenMonthGrid::CalenMonthGrid(class QGraphicsItem *) + ?refreshViewOnGoToDate@CalenMonthView@@EAEXXZ @ 110 NONAME ; void CalenMonthView::refreshViewOnGoToDate(void) + ?appendRows@CalenMonthGrid@@QAEXXZ @ 111 NONAME ; void CalenMonthGrid::appendRows(void) + ?HandleNotification@CalenAgendaView@@UAEXW4TCalenNotification@@@Z @ 112 NONAME ; void CalenAgendaView::HandleNotification(enum TCalenNotification) + ?tr@CalenThickLinesDrawer@@SA?AVQString@@PBD0H@Z @ 113 NONAME ; class QString CalenThickLinesDrawer::tr(char const *, char const *, int) + ??0CalenPluginLabel@@QAE@AAVMCalenServices@@PAVQGraphicsItem@@@Z @ 114 NONAME ; CalenPluginLabel::CalenPluginLabel(class MCalenServices &, class QGraphicsItem *) + ?mouseReleaseEvent@CalenMonthGrid@@EAEXPAVQGraphicsSceneMouseEvent@@@Z @ 115 NONAME ; void CalenMonthGrid::mouseReleaseEvent(class QGraphicsSceneMouseEvent *) + ?updateMonthGridWithInActiveMonths@CalenMonthGrid@@QAEXAAV?$QList@VCalenMonthData@@@@@Z @ 116 NONAME ; void CalenMonthGrid::updateMonthGridWithInActiveMonths(class QList &) + ?getCurrentDay@CalenMonthView@@QAE?AVQDateTime@@XZ @ 117 NONAME ; class QDateTime CalenMonthView::getCurrentDay(void) + ?staticMetaObject@CalenPreviewPane@@2UQMetaObject@@B @ 118 NONAME ; struct QMetaObject const CalenPreviewPane::staticMetaObject + ?doPopulation@CalenAgendaView@@UAEXXZ @ 119 NONAME ; void CalenAgendaView::doPopulation(void) + ?tr@CalenSettingsView@@SA?AVQString@@PBD0@Z @ 120 NONAME ; class QString CalenSettingsView::tr(char const *, char const *) + ?onTwoSecondsTimeout@CalenPreviewPane@@QAEXXZ @ 121 NONAME ; void CalenPreviewPane::onTwoSecondsTimeout(void) + ?tr@CalenThickLinesDrawer@@SA?AVQString@@PBD0@Z @ 122 NONAME ; class QString CalenThickLinesDrawer::tr(char const *, char const *) + ?staticMetaObject@CalenThickLinesDrawer@@2UQMetaObject@@B @ 123 NONAME ; struct QMetaObject const CalenThickLinesDrawer::staticMetaObject + ?populateWithInstanceView@CalenMonthView@@AAEXXZ @ 124 NONAME ; void CalenMonthView::populateWithInstanceView(void) + ?trUtf8@CalenThickLinesDrawer@@SA?AVQString@@PBD0@Z @ 125 NONAME ; class QString CalenThickLinesDrawer::trUtf8(char const *, char const *) + ??1CalenAgendaViewWidget@@UAE@XZ @ 126 NONAME ; CalenAgendaViewWidget::~CalenAgendaViewWidget(void) + ?populateLabel@CalenPreviewPane@@QAEXVQDateTime@@@Z @ 127 NONAME ; void CalenPreviewPane::populateLabel(class QDateTime) + ?doPopulation@CalenDayView@@UAEXXZ @ 128 NONAME ; void CalenDayView::doPopulation(void) + ??1CalenDayView@@UAE@XZ @ 129 NONAME ; CalenDayView::~CalenDayView(void) + ?updateModelWithFutureMonth@CalenMonthView@@QAEXXZ @ 130 NONAME ; void CalenMonthView::updateModelWithFutureMonth(void) + ?monthDataList@CalenMonthView@@QAE?AV?$QList@VCalenMonthData@@@@XZ @ 131 NONAME ; class QList CalenMonthView::monthDataList(void) + ?updateMonthGridModel@CalenMonthGrid@@QAEXAAV?$QList@VCalenMonthData@@@@H_N@Z @ 132 NONAME ; void CalenMonthGrid::updateMonthGridModel(class QList &, int, bool) + ??1CalenMonthGrid@@UAE@XZ @ 133 NONAME ; CalenMonthGrid::~CalenMonthGrid(void) + ?metaObject@CalenThickLinesDrawer@@UBEPBUQMetaObject@@XZ @ 134 NONAME ; struct QMetaObject const * CalenThickLinesDrawer::metaObject(void) const + ?updateWeekNumGridModel@CalenMonthView@@AAEXXZ @ 135 NONAME ; void CalenMonthView::updateWeekNumGridModel(void) + ?qt_metacast@CalenThickLinesDrawer@@UAEPAXPBD@Z @ 136 NONAME ; void * CalenThickLinesDrawer::qt_metacast(char const *) + ?prepareForPopulation@CalenMonthView@@AAEXXZ @ 137 NONAME ; void CalenMonthView::prepareForPopulation(void) + ?handlePreviewPaneGesture@CalenMonthView@@QAEX_N@Z @ 138 NONAME ; void CalenMonthView::handlePreviewPaneGesture(bool) + ?updateDayLabel@CalenMonthView@@AAEXXZ @ 139 NONAME ; void CalenMonthView::updateDayLabel(void) + ?setActiveDates@CalenMonthGrid@@AAEXVQDate@@@Z @ 140 NONAME ; void CalenMonthGrid::setActiveDates(class QDate) + ?trUtf8@CalenMonthView@@SA?AVQString@@PBD0@Z @ 141 NONAME ; class QString CalenMonthView::trUtf8(char const *, char const *) + ?setContextForActiveDay@CalenMonthView@@QAEXH@Z @ 142 NONAME ; void CalenMonthView::setContextForActiveDay(int) + ?trUtf8@CalenSettingsView@@SA?AVQString@@PBD0@Z @ 143 NONAME ; class QString CalenSettingsView::trUtf8(char const *, char const *) + ??_ECalenSettingsView@@UAE@I@Z @ 144 NONAME ; CalenSettingsView::~CalenSettingsView(unsigned int) + ??_ECalenThickLinesDrawer@@UAE@I@Z @ 145 NONAME ; CalenThickLinesDrawer::~CalenThickLinesDrawer(unsigned int) + ?metaObject@CalenSettingsView@@UBEPBUQMetaObject@@XZ @ 146 NONAME ; struct QMetaObject const * CalenSettingsView::metaObject(void) const + ?getStaticMetaObject@CalenMonthView@@SAABUQMetaObject@@XZ @ 147 NONAME ; struct QMetaObject const & CalenMonthView::getStaticMetaObject(void) + ?changeOrientation@CalenMonthView@@EAEXW4Orientation@Qt@@@Z @ 148 NONAME ; void CalenMonthView::changeOrientation(enum Qt::Orientation) + ?paint@CalenMonthGrid@@EAEXPAVQPainter@@PBVQStyleOptionGraphicsItem@@PAVQWidget@@@Z @ 149 NONAME ; void CalenMonthGrid::paint(class QPainter *, class QStyleOptionGraphicsItem const *, class QWidget *) + ?tr@CalenMonthGrid@@SA?AVQString@@PBD0@Z @ 150 NONAME ; class QString CalenMonthGrid::tr(char const *, char const *) + ?qt_metacast@CalenSettingsView@@UAEPAXPBD@Z @ 151 NONAME ; void * CalenSettingsView::qt_metacast(char const *) + ?qt_metacall@CalenMonthView@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 152 NONAME ; int CalenMonthView::qt_metacall(enum QMetaObject::Call, int, void * *) + ?disconnectAboutToQuitEvent@CalenAgendaView@@QAEXXZ @ 153 NONAME ; void CalenAgendaView::disconnectAboutToQuitEvent(void) + ?setActiveDay@CalenMonthView@@AAEXVQDateTime@@@Z @ 154 NONAME ; void CalenMonthView::setActiveDay(class QDateTime) + ?itemActivated@CalenMonthGrid@@QAEXABVQModelIndex@@@Z @ 155 NONAME ; void CalenMonthGrid::itemActivated(class QModelIndex const &) + ?qt_metacall@CalenMonthGrid@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 156 NONAME ; int CalenMonthGrid::qt_metacall(enum QMetaObject::Call, int, void * *) + ?createEditor@CalenMonthView@@AAEXXZ @ 157 NONAME ; void CalenMonthView::createEditor(void) + ??_ECalenPreviewPane@@UAE@I@Z @ 158 NONAME ; CalenPreviewPane::~CalenPreviewPane(unsigned int) + ?getActiveDay@CalenMonthView@@QAE?AVQDateTime@@XZ @ 159 NONAME ; class QDateTime CalenMonthView::getActiveDay(void) + ?addRemoveActionsInMenu@CalenMonthView@@AAEXXZ @ 160 NONAME ; void CalenMonthView::addRemoveActionsInMenu(void) + diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/dayview.pri --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/dayview.pri Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,60 @@ +# Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: Project definition include file for Day View + +# Input + +# Enables panning-effect when swiching between days +# Uncomment to enable +#DEFINES += CALENDAYVIEW_PANNING_ENABLED + +INCLUDEPATH += ./dayview/inc \ + $${EPOCROOT}sf/mw/hb/include/hbwidgets/private + +DEPENDPATH += ./dayview/inc \ + ./dayview/src + +HEADERS += calendayview.h \ + calendaycommonheaders.h \ + calendayutils.h \ + calendaycontentscrollarea.h \ + calendayhourscrollarea.h \ + calendaycontentwidget.h \ + calendaymodelmanager.h \ + calendaymodel.h \ + calendayitemview.h \ + calendaycontainer.h \ + calendayinfo.h \ + calendayitem.h \ + calendayhourelement.h \ + calendaystatusstrip.h \ + calendayeventspane.h + +SOURCES += calendayview.cpp \ + calendayutils.cpp \ + calendaycontentscrollarea.cpp \ + calendayhourscrollarea.cpp \ + calendaycontentwidget.cpp \ + calendaymodelmanager.cpp \ + calendaymodel.cpp \ + calendayitemview.cpp \ + calendaycontainer.cpp \ + calendayinfo.cpp \ + calendayitem.cpp \ + calendayhourelement.cpp \ + calendaystatusstrip.cpp \ + calendayeventspane.cpp + +RESOURCES += dayview/resources/calendaywidgets.qrc + +# End of file --Don't remove this. \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/inc/calendaycommonheaders.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/inc/calendaycommonheaders.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,67 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: CalenDay commons. +* +*/ + +#ifndef CALENDAYCOMMONHEADERS_H_ +#define CALENDAYCOMMONHEADERS_H_ + +// Constants + +/*! + Default timeout for scrolling between days [ms] + */ +const int KCalenScrollDaysTimeout = 600; + +/*! + Value [%] defines how long (depending on content area width) should horizontal + pan gesture be to change day to previous/next. + If the gesture is shorter - current view is not changed. + */ +const int KCalenHScrollMoveParam = 30; //!< Percentage + +/*! + Value [degree] defines the max. angle of swipe gesture which should change day. + */ +const qreal KCalenSwipeAngle = 30; + + +// Enumerations + +/*! + \enum CalenPanDirection + \brief Enumeration identifies pan gesture directions. + */ +enum CalenPanDirection +{ + ECalenPanNotSet = 0, + ECalenPanVertical, + ECalenPanHorizontal +}; + +/*! + \enum CalenScrollDirection + \brief Enumeration identifies horizontal scroll directions of scroll area. + + ECalenScrollNoDayChange means that move does not change the current day. + */ +enum CalenScrollDirection +{ + ECalenScrollNoDayChange = 0, + ECalenScrollToNext, + ECalenScrollToPrev +}; + +#endif /* CALENDAYCOMMONHEADERS_H_ */ diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/inc/calendaycontainer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/inc/calendaycontainer.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,191 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Day view control of calendar +* +*/ + +#ifndef CALENDAYCONTAINER_H +#define CALENDAYCONTAINER_H + +//System includes +#include + +#include "../../../../../mw/hb/src/hbwidgets/itemviews/hbabstractitemcontainer_p.h" + +//User includes + +//Forward declarations +class CalenDayInfo; +class TouchEventAbsorber; + +class CalenDayContainer : public HbAbstractItemContainer +{ + Q_OBJECT + +public: + + /** + * Constructor. + */ + CalenDayContainer(QGraphicsItem *parent = 0); + + /** + * Destructor. + */ + ~CalenDayContainer(); + + /** + * + */ + void itemAdded (int index, HbAbstractViewItem *item, bool animate); + + /** + * + */ + void itemRemoved (HbAbstractViewItem *item, bool animate); + + /** + * + */ + void reset(); + + /** + * + */ + void viewResized (const QSizeF &size); + + /** + * Sets day's info structer to the container. + * + * @param dayInfo Day info. + */ + void setDayInfo( CalenDayInfo* dayInfo ); + +public slots: + + /** + * Slot handles layout switch. + * @param orientation Current device orientation + */ + void orientationChanged(Qt::Orientation orientation); + +protected: + + /** + * + */ + HbAbstractViewItem * createDefaultPrototype() const; + + /** + * + */ + void setItemModelIndex(HbAbstractViewItem *item, const QModelIndex &index); + + /** + * Updates geometry of a timed event. + */ + void updateTimedEventGeometry(HbAbstractViewItem *item, + const QModelIndex &index); + + /** + * Updates geometry of a all-day events + */ + void updateAllDayEventGeometry(HbAbstractViewItem *item, + const QModelIndex &index); + + /** + * Structure with event layout values. + * + * eventAreaX X value for event area start. + * eventAreaWidth The width of event area. + * eventMargin Margins between the multiple events. + * slotHeight Half hour slot's height. + * unitInPixels no. of pixels in 1un + */ + + struct LayoutValues { + LayoutValues() + :eventAreaX(0), + eventAreaWidth(0), + eventMargin(0), + slotHeight(0), + unitInPixels(0), + maxColumns(0) + {} + + qreal eventAreaX; + qreal eventAreaWidth; + qreal eventMargin; + qreal slotHeight; + qreal unitInPixels; + int maxColumns; + }; + + /** + * Gets event layout values. + * + * @param layoutValues structure to be filled with layout data + */ + void getTimedEventLayoutValues(LayoutValues& layoutValues); + + + /** + * creates absorbers which prevent touching to small items + * (according to UI spec items smaller than ... are untouchable) + */ + void createTouchEventAbsorbers(); + + /** + * + */ + TouchEventAbsorber* crateAbsorberBetweenSlots(int startSlot, int endSlot); + +private: + + bool mGeometryUpdated; + + QDateTime mDateTime; + + /** + * Day event info. + * Not own. + */ + CalenDayInfo* mInfo; + + LayoutValues mLayoutValues; + QList mAbsorbers; +}; + + + +class TouchEventAbsorber : public HbWidget + { + Q_OBJECT + public: + TouchEventAbsorber(QGraphicsItem *parent=0); + ~TouchEventAbsorber(); + + protected: + void gestureEvent(QGestureEvent *event); + +#ifdef _DEBUG + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, + QWidget *widget); +#endif + + }; + +#endif // CALENDAYCONTAINER_H + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/inc/calendaycontentscrollarea.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/inc/calendaycontentscrollarea.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: CalenDayContentScrollArea class definition. + * + */ + +#ifndef CALENDAYCONTENTSCROLLAREA_H_ +#define CALENDAYCONTENTSCROLLAREA_H_ + +// System includes +#include + +// User includes +#include "calendaycommonheaders.h" + +// Class declaration +class CalenDayContentScrollArea : public HbScrollArea +{ +Q_OBJECT + +public: + CalenDayContentScrollArea(QGraphicsItem *parent = 0); + virtual ~CalenDayContentScrollArea(); + +signals: + void scrollAreaMoveStarted(CalenScrollDirection scrollTo); + void scrollAreaMoveFinished(CalenScrollDirection scrollTo); + +public slots: + void scrollToMiddleWidget(); + +protected: + bool scrollByAmount(const QPointF &delta); + + void gestureEvent(QGestureEvent *event); + bool eventFilter(QObject *obj, QEvent *event); + bool event(QEvent *e); + +private: // private functions + void checkPanDirection(QPanGesture *panGesture); + void moveTo(const QPointF &newPosition, int time = 0); + +private slots: + void moveFinished(); + void orientationChanged(Qt::Orientation orientation); + +private: // data + QPointF mStartPosition; //!< Start position of movement + + qreal mContentWidth; //!< Content width + + Qt::Orientation mOrientation; //!< Stores current orientation + + /*! + \brief Pan gesture direction indicator + + Member is used when switching widgets by panning gesture is enabled. + */ + CalenPanDirection mPanDayDirection; + + bool mIsMoving; //!< Indicates if moving of scroll area is in progress + + /*! + \brief Scroll area horizontal move direction + */ + CalenScrollDirection mMoveDirection; +}; + +#endif /* CALENDAYCONTENTSCROLLAREA_H_ */ diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/inc/calendaycontentwidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/inc/calendaycontentwidget.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: CalenDayContentWidget class definition. + * + */ + +#ifndef CALENDAYCONTENTWIDGET_H_ +#define CALENDAYCONTENTWIDGET_H_ + +// System includes +#include + +// User includes +#include "calendaycommonheaders.h" + +// Forward declarations +class QGraphicsLinearLayout; +class CalenDayModelManager; + + +class CalenDayContentWidget : public HbWidget +{ +Q_OBJECT + +public: + /*! + \enum CalenWidgetPosition + \brief Enumeration identifies widget position if queue. + */ + enum CalenWidgetPosition + { + ECalenLastWidget = 0, + ECalenFirstWidget + }; + +public: + CalenDayContentWidget(CalenDayModelManager &modelManager, + QGraphicsItem *parent = 0); + ~CalenDayContentWidget(); + + void add(HbWidget* item, CalenWidgetPosition where = ECalenLastWidget); + HbWidget* take(CalenWidgetPosition which); + void remove(CalenWidgetPosition which); + +signals: + void widgetsRelayoutFinished(CalenScrollDirection scrollTo); + void scrollPositionChanged(const QPointF &newPos); + +public slots: + void relayoutWidgets(CalenScrollDirection scrollTo); + void widgetScrolled(const QPointF &newPos); + +private: + void initializeViews(QGraphicsItem *parent); + +private: + QGraphicsLinearLayout* mLayout; //!< Linear layout for day views + + QList mWidgets; //!< List of widget instances + + CalenDayModelManager &mModelManager; //!< Reference to model manager +}; + +#endif /* CALENDAYCONTENTWIDGET_H_ */ diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/inc/calendayeventspane.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/inc/calendayeventspane.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,44 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Day view control of calendar +* +*/ + +#ifndef CALENDAYEVENTSPANE_H_ +#define CALENDAYEVENTSPANE_H_ + +// System includes +#include +#include + +class CalenDayEventsPane : public HbWidget +{ +public: + CalenDayEventsPane(HbWidget *parent=0); + virtual ~CalenDayEventsPane(); + + void drawTopLine(bool drawTopLine = false); + +protected: + void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, + QWidget * widget); + +private: + QColor mHourLineColor; + qreal mUnitInPixels; + QPen mCustomDashedPen; + bool mDrawTopLine; //!< Flag indicates if top line should be drawn +}; + +#endif /* CALENDAYEVENTSPANE_H_ */ diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/inc/calendayhourelement.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/inc/calendayhourelement.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,61 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Day view control of calendar +* +*/ + +#ifndef CALENDAYHOURELEMENT_H +#define CALENDAYHOURELEMENT_H + +//System includes +#include +#include +#include + +//User includes + + +//Forward declarations +class CalenDayHourScrollArea; + +class CalenDayHourElement : public HbWidget +{ + Q_OBJECT + +public: + + /** + * Constructor. + */ + CalenDayHourElement(const QTime &time, QGraphicsItem *parent=0); + + /** + * Destructor. + */ + virtual ~CalenDayHourElement(); + + /** + * + */ + void paint(QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget); + +private: + + CalenDayHourScrollArea *mContainer; + QTime mHour; + QColor mHourLineColor; + qreal mUnitInPixels; +}; + +#endif // CALENDAYHOURELEMENT_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/inc/calendayhourscrollarea.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/inc/calendayhourscrollarea.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: CalenDayHourScrollArea class definition. + * + */ + +#ifndef CALENDAYHOURSCROLLAREA_H_ +#define CALENDAYHOURSCROLLAREA_H_ + +// System includes +#include +#include + +// User includes +#include "calendaycommonheaders.h" + +//forward declarations +class CalenDayHourElement; + +// Class declaration +class CalenDayHourScrollArea : public HbScrollArea +{ +Q_OBJECT + +public: + CalenDayHourScrollArea(QGraphicsItem *parent = 0); + virtual ~CalenDayHourScrollArea(); + void setDateTime(const QDateTime &dateTime); + QDateTime dateTime() const; + + void scrollToHour(int hour); + +public slots: + void scrollVertically(const QPointF &newPosition); + +private: + QDateTime mDateTime; + QList mHourElements; +}; + +#endif /* CALENDAYHOURSCROLLAREA_H_ */ diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/inc/calendayinfo.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/inc/calendayinfo.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,759 @@ +/* +* Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Storage class for day and week views. +* +*/ + +#ifndef CALENDAYINFO_H +#define CALENDAYINFO_H + +// INCLUDES +#include +#include +#include +#include + +#include +#include "caleninstanceid.h" + + +// +/** Scrolling directions **/ +enum TScrollDirection + { + EScrollUp, + EScrollDown, + EScrollLeft, + EScrollRight + }; + +//Constants +const int KFSCalMaxDescriptionLength = 100; +const int KFSCalStartingHour = 8; +const int KFSCalSlotsInHour = 2; + +/** + * An interval containing a start and end slot. + * The start slot belongs to the interval, the end slot + * is the first slot outside of the interval. If the end slot + * is before or at the same slot as the start slot, the interval + * is considered empty. + */ +class CalenSlotInterval + { +public: + /** + * Check if this interval overlaps the second interval. + */ + bool Overlaps( const CalenSlotInterval& aInterval ) const; + + /** + * Add aOffset to all slot coordinates later than aPos + */ + void AddOffset( int aOffset, int aPos ); + + /** + * Set this interval to be the minimum interval + * containing both this original interval and aInterval. + */ + void Union( const CalenSlotInterval& aInterval ); + + /** + * Check if aInterval lies directly next to this interval. + */ + bool Adjacent( const CalenSlotInterval& aInterval ) const; + + /** + * Check if this interval is empty. + */ + bool IsEmpty() const; + + /** + * Set this interval to be the area contained in both + * this interval and to aInterval. + */ + void Intersect( const CalenSlotInterval& aInterval ); + + /** + * Remove aInterval from this interval. If aInterval lies + * within this interval, the result is two separate intervals. + * This object contains one of them, aSecondPart contains the other one. + * If the result is just one single interval, this interval contains that + * and aSecondPart is set to an empty interval. + */ + void Subtract( const CalenSlotInterval& aInterval, CalenSlotInterval& aSecondPart ); + + /** + * Check if this interval starts later than aInterval. + */ + bool operator>( const CalenSlotInterval& aInterval ) const; + + /** + * The starting slot of the interval. This is the first slot + * that belongs to the interval. + */ + int iStartSlot; + + /** + * The ending slot of the interval. This is the first slot + * that doesn't belong to the interval. + */ + int iEndSlot; + }; + + +/** + * Class for storing a calendar instance and the range it occupies. + */ +struct CalenTimedEventInfo : public CalenSlotInterval + { +public: + /** + * The id of the calendar instance + */ + TCalenInstanceId iId; + + /** + * Status of the entry, needed for setting the displayed color later + */ + AgendaEntry::Status iStatus; + + /** + * Replication status of the entry, needed for setting the displayed color + * later. + */ +// AgendaEntry::TReplicationStatus iReplicationStatus; + }; + +/** + * Class for storing general time intervals and their associated + * status (needed for displaying the interval). + */ +struct CalenEventInterval : public CalenSlotInterval + { +public: + /** + * The status of this interval, if it represents only one calendar + * instance. + */ + AgendaEntry::Status iStatus; + + /** + * The replication status of this interval, if it represents only one + * calendar instance. + */ +// AgendaEntry::TReplicationStatus iReplicationStatus; + + /** + * A flag saying that this interval represents a conflict between two or + * more calendar instances. + */ + bool iOverlap; + }; + + + +/** + * A class containing a sequence of non-overlapping events, + * visualised as a column. + */ +class CalenTimeColumn : public CalenSlotInterval + { +public: + + /** + * Explicitly frees the memory used by the event array. + */ + void Close(); + + /** + * Add a new event to this column. Events must be added sequentially, + * and must not overlap earlier events in this column. + */ + void AddEvent( const CalenTimedEventInfo& aEvent ); + + /** + * Check if a new event can be added to this column. + */ + bool CanFitEvent( const CalenTimedEventInfo& aEvent ); + + /** + * Check if this column contains an event with the id aId. + */ + bool ContainsEvent( const TCalenInstanceId& aId ); + + /** + * Add aOffset to all slot coordinates later than aPos + */ + void AddOffset( int aOffset, int aPos ); + + /** + * Event array. + */ + QList iEventArray; + }; + + +/** + * A class containing one or more columns with events, + * where every event overlaps at least one event in some other + * column. (Otherwise that event should be added to a separate region.) + */ +class CalenTimeRegion : public CalenSlotInterval + { +public: + + /** + * Explicitly frees the memory used by data structures. + */ + void Close(); + + /** + * Check if the given interval overlaps with this region. + */ + bool Overlaps( const CalenSlotInterval& aInterval ) const; + + /** + * Add an event to this region. Events must be added sequentially, + * and must overlap this region (unless it's the first event of the region). + */ + void AddEvent( const CalenTimedEventInfo& aEvent ); + + /** + * Add aOffset to all slot coordinates later than aPos + */ + void AddOffset( int aOffset, int aPos ); + +private: + + /** + * Add the event to the bookkeeping of overlapping/nonoverlapping + * intervals. + */ + void AddInterval( const CalenTimedEventInfo& aEvent ); + +public: + + QList iColumns; + QList iIntervals; + }; + + +/** + * A container struct, used by the clients of the slot info storage, + * to provide data in. + */ +struct SCalenApptInfo + { + QModelIndex iIndex; + QDateTime iStartTime; + QDateTime iEndTime; + bool iAllDay; + TCalenInstanceId iId; + AgendaEntry::Status iStatus; +// AgendaEntry::TReplicationStatus iReplicationStatus; + TBufC iSummary; + TUint32 iColor; + }; + + +/** + * Storage class for storing all calendar instances within one day. This + * class organises the data according to the way it will be needed in the + * day and week view. + */ +class CalenDayInfo + { +public: + + enum TSlotsInHour + { + EOne = 1, + ETwo, + EThree, + EFour + }; + +public: // Constructors and destructor + + /** + * C++ default constructor. + */ + CalenDayInfo( TSlotsInHour aSlotsInHour ); + + /** + * Destructor + */ + virtual ~CalenDayInfo(); + + +public: // New functions + + /** + * Reset the storage, remove all data and set the state back to normal. + */ + void Reset(); + + /** + * Add a timed event. All timed events must be added in increasing + * order (sorted by starting time). + */ + void InsertTimedEvent( const SCalenApptInfo& aItemInfo ); + + /** + * Add an untimed event. + */ +// void InsertUntimedEventL( const CCalInstance& aInstance ); + + /** + * Add an untimed event. (Nonleaving version, useful for testing.) + */ + void InsertUntimedEvent( AgendaEntry::Type aType, + const TCalenInstanceId& aId ); + /** + * Add an allday event. + */ + void InsertAlldayEvent( const SCalenApptInfo& aItemInfo ); + + /** + * Is the given event allday event + * @param aStart time to be checked + * @param aEnd time to be checked + * @return true if this is allday event, false otherwise + */ + static bool IsAlldayEvent( QDateTime aStart, QDateTime aEnd ); + + /** + * Is the given event allday event + * @param aInstance Instance to be checked + * @return true if this is allday event, false otherwise + */ +// static bool IsAlldayEvent( const CCalInstance& aInstance ); + + /** + * Return the slot number where this class would insert the + * untimed events if nothing else is specified. + */ + int SuggestedUntimedSlotPos(); + + /** + * Return how many untimed slots is needed for this day. + */ + int NeededUntimedSlotCount(); + + /** + * Update the indexing to take the current amount of untimed slots + * into account. This must be called after all untimed events + * have been added. + * + * @param aSlot the slot where the untimed events are to be added. + * If negative, uses the default, otherwise aSlot must + * be less than or equal to the default position as + * returned by SuggestedUntimedSlotPos(). + * @param aUntimedCount the number of slots to insert for untimed events. If + * aSlot is specified, this must be larger or equal + * to NeededUntimedSlotCount(). + */ + int UpdateUntimedPos( int aSlot = -1, int aUntimedCount = 0 ); + + /** + * Return the first slot containing a non-allday event. + * If this class doesn't contain any data, returns KErrNotFound. + */ + int FirstOccupiedSlot(); + + /** + * Return the last slot containing a non-allday event. + * If this class doesn't contain any data, returns KErrNotFound. + */ + int LastOccupiedSlot(); + + int EarliestEndSlot(); + int LastStartSlot(); + + + /** + * Convert a starting time into a slot index. + */ + int SlotIndexForStartTime( QDateTime aStartTime ); + + /** + * Convert an ending time into a slot index. + */ + int SlotIndexForEndTime( QDateTime aStartTime ); + + /** + * Get information about where the item aItemInfo + * should be displayed. The parameters are filled + * on return. + * + * @param aStartSlot the first slot of the event + * @param aEndSlot the first slot after the event + * @param aColumnIndex the column in which this event is located + * @param aColumns the total number of columns in the region + * this event belongs to + */ + void GetLocation( const SCalenApptInfo& aItemInfo, + int& aStartSlot, + int& aEndSlot, + int& aColumnIndex, + int& aColumns ); + + /** + * Get the number of allday events + */ + int AlldayCount(); + + /** + * Get the number of todo events + */ + int TodoCount(); + + /** + * Check if a slot is the first slot of an hour. + */ + bool IsHourStartSlot( const int& aSlotIndex ) const; + + /** + * Check if a slot is an extra slot (for untimed events). + */ + bool IsExtraSlot( const int& aSlotIndex ) const; + + /** + * Convert a slot index into a hour + */ + int HourFromSlotIndex( const int& aSlotIndex ) const; + + /** + * Convert a hour into a slot index. + */ + int SlotIndexFromHour( int aHour ); + + /** + * Rounds the slot number up (towards earlier hours) to an even hour + */ + int RoundHourUp( int aSlot ); + + /** + * Rounds the slot number down (towards later hours) to an even hour + */ + int RoundHourDown( int aSlot ); + + /** + * Get the starting slot of the current selection + */ + void GetSelectedSlot( int& aSlot, int& aRegion, int& aColumnIndex, int& aColumns ); + + /** + * Try to move the selection in the given direction + * + * @return true if able to move the selection, false if + * unable to move (indicating that the selection should move + * to the next/previous day). + */ + bool MoveSelection( TScrollDirection aDirection ); + + /** + * Move the selected slot within the currently selected event. + */ + void MoveSelectionInEvent( TScrollDirection aDirection ); + + /** + * Make sure the selected slot within the currently selected event is valid. + */ + void UpdateSelectionInEvent(); + + /** + * Check if any event currently is selected. + */ + bool IsEventSelected() const; + + /** + * Check if the current selection actually denotes + * more than one event (the todo event slot is selected, + * containing more than one todo). + */ + bool IsMultipleEventsSelected() const; + + /** + * Check if an allday event currently is selected. + */ + bool IsAlldayEventSelected() const; + + /** + * Get the instance id of the currently selected event. + */ + TCalenInstanceId SelectedEvent(); + + /** + * Update the state to make the given calendar instance selected + * + * @return KErrNotFound if the instance isn't found, KErrNone otherwise. + */ + int SelectEvent( const TCalenInstanceId& aId ); + + /** + * Get the instance id of an untimed event. Maximally one + * todo event is counted into this, i.e. aIndex = 1 never returns + * a todo event even though there are more than one. + */ + TCalenInstanceId UntimedEvent( int aIndex ); + + /** + * Get info about an allday event. + */ + const CalenTimedEventInfo& AlldayEvent( int aIndex ); + + /** + * Move the selection to the given slot, possibly selecting + * an event. + */ + void SelectSlot( int aSlot ); + + /** + * Return the list of regions. + */ + const QList& RegionList() const; + + /** + * Get the list of event intervals (for use in week view and ribbon). + */ + void GetEventIntervals( QList& aArray ) const; + + /** + * Return the interval which is selected currently. + */ + CalenSlotInterval SelectedInterval(); + + /** + * Sets selection within a region + * + * @param aRegion Region index. + * @param aColumn Column index. + * @param aSlot Slot number (has to be aligned to full hour). + */ + bool SetSelectionInRegion( int aRegion, int aColumn, int aSlot ); + +private: + + enum TMoveDirection + { + EMoveDirectionUp = -1, + EMoveDirectionDown = 1 + }; + + /** + * See if any region overlaps the given interval. Regions are searched + * in the direction specified by aDirection, e.g. if aDirection < 0, + * this returns the last overlapping region, if aDirection > 0, returns + * the first overlapping instead. + * + * @return the index of the found overlapping region, or -1 if no + * matching region was found. + */ + int FindRegion( const CalenSlotInterval& aInterval, int aDirection ); + + /** + * See if any event overlaps the given interval within the current column. + * Events are searched in the direction specified by aDirection, + * e.g. if aDirection < 0, this returns the last overlapping event, + * if aDirection > 0, returns the first overlapping instead. + * + * @return the index within the column of the overlapping event, or -1 if no + * matching event was found. + */ + int FindEvent( const CalenSlotInterval& aInterval, int aDirection ); + + /** + * Update the selection state by selecting the first event which ends at + * the end of the current region. + */ + void EnterRegionFromBelow(); + + /** + * Update the selection state by selecting the first event which starts + * at the start of the current region. + */ + void EnterRegionFromAbove(); + + /** + * Try to move the selection in the given direction, when an + * empty area is selected. + * + * @return true if able to move the selection, false if + * unable to move (indicating that the selection should move + * to the next/previous day). + */ + bool MoveInEmptyArea( TScrollDirection aDirection ); + + /** + * Try to move the selection in the given direction, when the + * selection is in a region. + * + * @return true if able to move the selection, false if + * unable to move (indicating that the selection should move + * to the next/previous day). + */ + bool MoveInRegion( TScrollDirection aDirection ); + + /** + * Try to move the selection in the given direction, when an + * allday event is selected + * + * @return true if able to move the selection, false if + * unable to move (indicating that the selection should move + * to the next/previous day). + */ + bool MoveInAlldayEvent( TScrollDirection aDirection ); + + /** + * Update the selection state by moving from one ordinary event column + * to another, in the given direction + */ + void MoveBetweenColumns( TScrollDirection aDirection ); + + /** + * Update the selection state by moving in the given direction + */ + void MoveInColumn( int aDirection ); + + /** + * The selection should be moved out of the current region (in the given + * direction), update the selection state according to what there is + * outside of the region. + */ + void MoveOutFromRegion( int aDirection ); + + /** + * Set the selected slot within the current event according to the selection + * direction. + */ + void SetSelectionInEvent( int aDirection ); + + /** + * Determines how large area to scan for new events/regions when moving in the + * given direction. + * + * I.e., if moving upwards, returns the whole interval from the start of aInterval + * up to the next slot which can be focused as an empty slot. If aInterval doesn't + * start on an even hour, the returned interval is from the start of the first whole + * hour before the interval, to the start of aInterval. + * + * If moving downwards, returns the whole interval from the end of aInterval to the + * end of the next whole hour after the interval. + * + */ + CalenSlotInterval NextFocusArea( const CalenSlotInterval& aInterval, int aDirection ); + + /** + * Return the next slot to focus if moving in the given direction from the interval + * and focusing an empty slot. + */ + int NextEmptyFocusSlot( const CalenSlotInterval& aInterval, int aDirection ); + + /** + * Return the interval which the current selection state represents, if + * an empty area is selected. + */ + CalenSlotInterval EmptySelectionInterval(); + + /** + * Backup the whole selection state. + */ + void StoreOrigSelection(); + + /** + * Check if the current selection state is valid, if not, reset it + * to the backed up copy + * @return true if selection state is valid, false if not. + */ + bool ValidateSelection(); + +private: // New data + + QList iRegionList; + QList iUntimedEvents; + QList iTodoEvents; + QList iAlldayEvents; + + int iLastStartSlot; + int iEarliestEndSlot; + /** + * The total number of untimed slots. + */ + int iUntimedSlotCount; + /** + * The slot index of the first untimed slot. + */ + int iFirstUntimedSlot; + /** + * The number of empty untimed slots. + */ + int iEmptyUntimedSlots; + /** + * The number of slots per hour. + */ + TSlotsInHour iSlotsInHour; + + /** + * Chooses which allday event is selected. If none currently is selected, + * this is negative. This variable overrides the rest selection variables. + * If this points to an allday event, the other variables are ignored, + * except iSelectedSlot which is used for returning to the original place + * if moving back to the ordinary events. + */ + int iSelectedAlldayEvent; + + /** + * Chooses which region currently is selected. If none currently is selected, + * this is negative. If this points to a region, iSelectedColumn and + * iSelectedColumnEventIndex are taken into account. + */ + int iSelectedRegion; + + /** + * Chooses which column is selected within the currently selected region. + * If this is equal to the number of columns, the last, implicit, empty column + * is selected. + */ + int iSelectedColumn; + /** + * Chooses which event is selected within the currently selected column. If + * none is selected, this is negative. + */ + int iSelectedColumnEventIndex; + /** + * Chooses which slot in the day currently is in focus. This must always point + * to a valid slot. If an event is selected within a column, it points to an + * slot within that event. If no event is selected, it points to the start + * of the currently selected empty time region (which is iSlotsInHour slots long). + * If an allday event is selected, this points to the last selected slot in the + * ordinary day area. + */ + int iSelectedSlot; + + // copies of the current selection state, to be used for reverting to the original + // state if the selection is moved to an invalid position + int iOrigSelectedAlldayEvent; + int iOrigSelectedRegion; + int iOrigSelectedColumn; + int iOrigSelectedSlot; + int iOrigSelectedColumnEventIndex; + + }; + +#endif // CALENDAYINFO_H + + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/inc/calendayitem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/inc/calendayitem.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,62 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Day view control of calendar +* +*/ + +#ifndef CALENDAYITEM_H +#define CALENDAYITEM_H + +//System includes +#include +#include +#include + +//Forward declarations +class AgendaEntry; +class CalenDayStatusStrip; + + +class CalenDayItem : public HbAbstractViewItem +{ + Q_OBJECT + Q_PROPERTY( bool eventDescription READ hasEventDescription ) + Q_PROPERTY( bool backgroundFrame READ hasBackgroundFrame ) + +public: + CalenDayItem(); + virtual ~CalenDayItem(); + HbAbstractViewItem * createItem(); + void updateChildItems(); + bool hasEventDescription() const { return mEventDesc->isVisible();} + bool hasBackgroundFrame() const { return mBg->isVisible();} + +protected: + void resizeEvent(QGraphicsSceneResizeEvent *event); + +private: + CalenDayItem(const CalenDayItem &source); + void setDescription(const AgendaEntry &entry, bool allDayEvent); + void setStatusStrip(const AgendaEntry &entry, bool allDayEvent); + + bool mUpdated; + HbFrameItem *mBg; + HbTextItem *mEventDesc; + CalenDayStatusStrip *mColorStripe; + qreal mEventDescMinWidth; + qreal mFrameMinWidth; + +}; + +#endif // CALENDAYITEM_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/inc/calendayitemview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/inc/calendayitemview.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,184 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Day view control of calendar +* +*/ + +#ifndef CALENDAYITEMVIEW_H +#define CALENDAYITEMVIEW_H + +//System includes +#include +#include + +//User includes + +//Forward declarations +class CalenDayInfo; +class CalenDayContainer; +class MCalenServices; + +class CalenDayItemView : public HbAbstractItemView +{ + Q_OBJECT + +public: + enum CalendarPanDirection { + CalendarPanNotSet, + CalendarPanVertical, + CalendarPanHorizontal + }; + + enum CalendaRecycleDays { + CalendarNoRecycle, + CalendarBackwardRecycle, + CalendarForwardRecycle + }; + + /** + * Constructor. + */ + CalenDayItemView(MCalenServices &services, HbModelIterator* iterator, QGraphicsItem *parent); + + /** + * Destructor. + */ + ~CalenDayItemView(); + + /** + * + */ + void scrollTo(const QModelIndex &index, HbAbstractItemView::ScrollHint hint = EnsureVisible); + +public slots: + + /** + * + */ + virtual void reset(); + + /** + * Handles signal that is emitted when reset() is called, before the model's + * internal state (e.g. persistent model indexes) has been invalidated. + */ + void modelAboutToBeReset(); + + /** + * Handles signal that is emitted when reset() is called, after the model's + * internal state (e.g. persistent model indexes) has been invalidated. + */ + void modelReset(); + + /** + * + */ + void scrollVertically(const QPointF &newPosition); + +private slots: + + /** + * This function is called when a touch down event is received within Abstract view item that is representing index. + */ + void itemPressed(const QPointF &position); + + /** + * This function is called when a touch release event is received within Abstract view item that is representing index. + */ + void itemReleased(const QPointF &position); + + /** + * This function is called when the item specified by index is activated by the user. + */ + void itemActivated(const QPointF &position); + + /** + * This function is called when long press event is received within Abstract view item viewItem. + * + * @param item The item. + * @param coords is scene position where the long press event happened + */ + void itemLongPressed(HbAbstractViewItem*, QPointF); + + /** + * Slot which is called whenever the orientation of the device changes + * @param orientation Current device orientation + */ + void orientationChanged(Qt::Orientation orientation); + + /** + * Opens currently selected model item. + */ + void openSelectedItem(); + + /** + * Edits currently selected model item. + */ + void editSelectedItem(); + + /** + * Deletes currently selected model item. + */ + void deleteSelectedItem(); + +private: + + /** + * Connects item view's slots. + */ + void setupSlots(); + + /** + * Creates Context menu. + */ + void setupContextMenu(); + + /** + * Sets context to currently selected model item and issues calendar command. + * + * @param command Calendar command. + */ + bool issueCommandOnSelectedItem( int command ); + + /** + * Clears current selection in Selection Model. + */ + void clearSelectionInModel(); + +private: + + /** + * Calendar services. Not owned. + */ + MCalenServices &mServices; + + /** + * Item container. + */ + CalenDayContainer* mContainer; + + /** + * Day event info. + * Own. + */ + CalenDayInfo* mInfo; + + /** + * context menu + */ + HbMenu* mContextMenu; +}; + +#endif // CALENDAYITEMVIEW_H + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/inc/calendaymodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/inc/calendaymodel.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,64 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Single day item view model +* +*/ + +#ifndef CALENDAYMODEL_H +#define CALENDAYMODEL_H + +//System includes +#include +#include +#include + +#include + +//User includes + +//Forward declarations +class MCalenServices; + +//Constantss +const int CalenDayEntry = Qt::UserRole + 1; + +Q_DECLARE_METATYPE(AgendaEntry) + +class CalenDayModel : public QAbstractListModel +{ + Q_OBJECT +public: + CalenDayModel(const QDateTime &date, MCalenServices &services, + QObject *parent = 0); + + // from QAbstractListModel + int rowCount(const QModelIndex &parent = QModelIndex()) const; + QVariant data(const QModelIndex &index, int role) const; + + void refreshModel(const QDateTime &date); + + QDateTime modelDate() const; + + +private: + void loadAndStoreInstances(const QDateTime& date); + +private: + MCalenServices &mServices; + QVariantList mEntryList; + QDateTime mDateTime; +}; + +#endif //CALENDAYMODEL_H + diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/inc/calendaymodelmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/inc/calendaymodelmanager.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,69 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Model manager holds models for three day views +* +*/ +#ifndef CALENDAYMODELMANAGER_H +#define CALENDAYMODELMANAGER_H + +#include +#include +#include + +#include "calendaycommonheaders.h" + +class QAbstractItemModel; +class MCalenServices; +class CalenDayModel; + +class CalenDayModelManager : public QObject +{ + Q_OBJECT + +public: + enum ModelDay { + PreviousDay = 0, + CurrentDay = 1, + NextDay = 2, + NumberOfDays + }; + +public: + CalenDayModelManager(MCalenServices &services, bool emptyModels, + QObject *parent = 0); + ~CalenDayModelManager(); + + QAbstractItemModel &getModel(CalenDayModelManager::ModelDay day); + + void refreshAllModels(); + void refreshSingleModel(CalenDayModelManager::ModelDay day); + MCalenServices &getServices() { + return mServices; + } + +public slots: + void viewsScrollingFinished(CalenScrollDirection scrollTo); + +private: + void createAllModels(); + void moveBackward(); + void moveForeward(); + +private: + QMap mModels; + MCalenServices &mServices; + QDateTime mCurrentDayTime; +}; + +#endif//CALENDAYMODELMANAGER_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/inc/calendaystatusstrip.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/inc/calendaystatusstrip.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Day view control of calendar + * + */ + + +#ifndef CALENDAYSTATUSSTRIP_H +#define CALENDAYSTATUSSTRIP_H + +#include +#include + +class CalenDayStatusStrip : public HbWidget +{ + Q_OBJECT + Q_ENUMS(DrawingStyle) +public: + /*! + \brief It specifiy how status Strip should be drawed. + + OnlyFrame -- draw not filled rectangle + StripWithLines -- draw filled rectangle with transparent diagonal lines + Filled -- draw filled rectangle + */ + enum DrawingStyle + { + OnlyFrame, + StripWithLines, + Filled + }; + + + CalenDayStatusStrip(HbWidget *parent = 0); + ~CalenDayStatusStrip(); + + qreal range() const; + + QColor color() const; + + CalenDayStatusStrip::DrawingStyle drawingStyle() const; + + QPair startEndTime() const; + + void setRange(qreal mRange); + + void setColor(QColor mStripColor); + + void setDrawingStyle(CalenDayStatusStrip::DrawingStyle mDrawingStyle); + + void setStartEndTime(const QTime &startTime, const QTime &endTime); + + +protected: + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, + QWidget *widget = 0); + + QPolygonF diagonalLine(QPointF startPoint, qreal dx, qreal dy); + + + QPair calculateStartEndPostion( + const QTime &startTime, + const QTime &endTime + ); + + qreal calculateMinuteHeight(const QTime &start, const QTime &end); + +private: + qreal mRange; //! mStartEndEventTime; + + static const qreal mMinute;//! +#include + +// User includes +#include "calennativeview.h" +#include "calendaycommonheaders.h" +#include "hb_calencommands.hrh" // command ids + +// Forward declarations +class QGraphicsLinearLayout; +class XQSettingsManager; +class QVariant; +class HbGroupBox; +class AgendaEntry; +class CalenDocLoader; +class CalenDayContentScrollArea; +class CalenDayContentWidget; +class CalenDayHourScrollArea; +class CalenDayModelManager; + + +// Constants + + +#ifdef CALENVIEWS_DLL +#define CALENDAYVIEW_EXPORT Q_DECL_EXPORT +#else +#define CALENDAYVIEW_EXPORT Q_DECL_IMPORT +#endif + +class CalenDayView : public CalenNativeView +{ + Q_OBJECT + +public: + + /** + * Constructor. + * + * @param services Calendar services. + */ + CALENDAYVIEW_EXPORT CalenDayView( MCalenServices &services ); + + /** + * Destructor. + */ + CALENDAYVIEW_EXPORT virtual ~CalenDayView(); + +public: + +//From CalenNativeView + + /** + * Handles locale change. + * + * @param reason Change reason. + */ + virtual void onLocaleChanged(int reason); + +//From CalenView + + /** + * Handles view (re)population. + * + */ + CALENDAYVIEW_EXPORT virtual void doPopulation(); + + /** + * Informs the organizer that the view's population is complete. + */ + virtual void populationComplete(); + +//From MCalenNotificationHandler + + /** + * The function handles calendar notifications. + */ + virtual void HandleNotification( const TCalenNotification notification ); + +public: + //API + + /** + * Sets up the view accroding to the 'xml' + * + * @param docLoader Loaded document. + */ + CALENDAYVIEW_EXPORT void setupView(CalenDocLoader* docLoader); + +private slots: + + /** + * Handles 'back' functionality; + */ + void onBack(); + + /** + * Updates selected date member and context + */ + void dayChangeStarted(CalenScrollDirection direction); + + /** + * Refreshes the model + */ + void dayChanged(CalenScrollDirection direction); + + /** + * Sets new date as heading text. Triggerd after fadeOut effect. + */ + void setHeadingText(const HbEffect::EffectStatus &status); + + /** + * Handles actions from menu + */ + void runNewMeeting(); + void runGoToToday(); + void runChangeToAgendaView(); + void runLunarData(); + + void showRegionalInformation(const HbEffect::EffectStatus &status); + void showRegionalInformationFadeIn(); + void showHideRegionalInformationChanged(const XQSettingsKey& key, const QVariant& var); + +public slots: + void changeView(TCalenCommandId viewId); +private: + /** + * + */ + void getCurrentDate(); + + /** + * setup menu for the view + */ + void setupMenu(); + + /** + * Connects view's slots. + */ + void setupSlots(); + + /** + * Scrolls content to correct position after view repopulation + */ + void setupViewport(); + +private: // members related to view management and gesture handling + + CalenDayContentScrollArea* mContentScrollArea; //!< Scroll area for content (events) + + CalenDayContentWidget* mContentWidget; //!< Content widget + + CalenDayHourScrollArea* mHourScrollArea; //!< Scroll area for hour elements + + CalenDayModelManager* mModelManager; + + QGraphicsLinearLayout* mVLayout; + + +private: + + XQSettingsManager* mSettingsManager; + XQSettingsKey mRegionalInfo; + MCalenServices &mServices; + + /** + * Current date/time. + */ + QDateTime mDate; + + HbGroupBox *mHeadingLabel; + + HbGroupBox *mRegionalInfoGroupBox; + /*! + * \brief It keep pointer to go to Today action from menu. + */ + HbAction *mGoToTodayMenuAction; +}; + + +#endif // CALEDAYVIEW_H + +//End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/resources/calendayhourelement.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/resources/calendayhourelement.css Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ +CalenDayHourElement{ + layout: customCalendarLayout; +} + +CalenDayHourElement::time { + color: var(qtc_cal_view_text); + + fixed-width: 8.04un; + font-variant: secondary; + text-height: var(hb-param-text-height-secondary); + + text-align: right; +} + +CalenDayHourElement::ampm { + color: var(qtc_cal_view_text); + + fixed-width: 8.04un; + font-variant: secondary; + text-height: var(hb-param-text-height-secondary); + + text-align: right; +} + +CalenDayHourElement::bottomSpacer{ + pref-height: 3un; + size-policy-vertical: expanding; +} \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/resources/calendayhourelement.widgetml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/resources/calendayhourelement.widgetml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/resources/calendayitem.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/resources/calendayitem.css Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,30 @@ +CalenDayItem{ + layout: noIconLayout; +} + +CalenDayItem[!eventDescription][!backgroundFrame]{ + layout: noIconNoTextNoBkgLayout; +} + +CalenDayItem[!eventDescription][backgroundFrame]{ + layout: noIconNoTextLayout; +} + +CalenDayItem::eventDescription { + color: var(qtc_cal_meeting_text); + font-variant: secondary; + text-height: var(hb-param-text-height-secondary); + text-align: center center; + text-line-count-min: 1; + size-policy-vertical: expanding; +} + +CalenDayItem::colorStripe { + pref-width: 1.5un; + size-policy-horizontal: fixed; +} + +CalenDayItem::spacerItem{ + pref-width: 1.5un; + size-policy-horizontal: expanding; +} diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/resources/calendayitem.widgetml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/resources/calendayitem.widgetml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/resources/calendaywidgets.qrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/resources/calendaywidgets.qrc Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,10 @@ + + + calendayhourelement.css + calendayhourelement.widgetml + calendayitem.css + calendayitem.widgetml + fade_out.fxml + fade_in.fxml + + diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/resources/fade_in.fxml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/resources/fade_in.fxml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,10 @@ + + + + 0.2 + + 0.0 + 1.0 + + + diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/resources/fade_out.fxml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/resources/fade_out.fxml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,10 @@ + + + + 0.2 + + 1.0 + 0.0 + + + diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/src/calendaycontainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/src/calendaycontainer.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,531 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Day view control of calendar +* +*/ + +//System includes +#include +#include +#include + +#ifdef _DEBUG + #include +#endif + +#include +#include +#include +#include + +//User includes +#include "calendaycontainer.h" +#include "calendayutils.h" +#include "calendayeventspane.h" +#include "calendayitem.h" +#include "calendaymodel.h" +#include "calendayinfo.h" +#include "calendayview.h" + +// ----------------------------------------------------------------------------- +// CalenDayContainer() +// Constructor +// ----------------------------------------------------------------------------- +// +CalenDayContainer::CalenDayContainer(QGraphicsItem *parent) : + HbAbstractItemContainer(parent), mGeometryUpdated(false), mInfo(0) +{ + getTimedEventLayoutValues(mLayoutValues); + + // Get the height of element + qreal paneHeight = CalenDayUtils::instance()->hourElementHeight(); + + QGraphicsLinearLayout* timeLinesLayout = new QGraphicsLinearLayout( + Qt::Vertical, this); + for (int i = 0; i < 24; i++) { + CalenDayEventsPane* element = new CalenDayEventsPane(this); + element->setPreferredHeight(paneHeight); + element->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); + // Draw top line at midnight + if (i == 0) { + element->drawTopLine(true); + } + timeLinesLayout->addItem(element); + } + timeLinesLayout->setContentsMargins(0.0, 0.0, 0.0, 0.0); + timeLinesLayout->setSpacing(0.0); + + setLayout(timeLinesLayout); +} + +// ----------------------------------------------------------------------------- +// ~CalenDayContainer() +// Destructor +// ----------------------------------------------------------------------------- +// +CalenDayContainer::~CalenDayContainer() +{ +} + +// ----------------------------------------------------------------------------- +// itemAdded() +// +// ----------------------------------------------------------------------------- +// +void CalenDayContainer::itemAdded( int index, HbAbstractViewItem *item, + bool animate ) +{ + Q_UNUSED( index ) + Q_UNUSED( item ) + Q_UNUSED( animate ) +} + +// ----------------------------------------------------------------------------- +// reset() +// +// ----------------------------------------------------------------------------- +// +void CalenDayContainer::reset() +{ + // remove absorbers if exist + if (mAbsorbers.count()) + { + qDeleteAll(mAbsorbers); + mAbsorbers.clear(); + } + + // shrink event area when all-day events available after reset + getTimedEventLayoutValues(mLayoutValues); + + // position need to be maintained while changing model + QPointF position(pos()); + HbAbstractItemContainer::reset(); + setPos( position ); +} + +// ----------------------------------------------------------------------------- +// itemRemoved() +// +// ----------------------------------------------------------------------------- +// +void CalenDayContainer::itemRemoved( HbAbstractViewItem *item, bool animate ) +{ + Q_UNUSED( item ) + Q_UNUSED( animate ) +} + +// ----------------------------------------------------------------------------- +// viewResized() +// +// ----------------------------------------------------------------------------- +// +void CalenDayContainer::viewResized (const QSizeF &size) +{ + resize(size); + if (!mGeometryUpdated) { + mGeometryUpdated = true; + updateGeometry(); + } +} + +// ----------------------------------------------------------------------------- +// createDefaultPrototype() +// +// ----------------------------------------------------------------------------- +// +HbAbstractViewItem * CalenDayContainer::createDefaultPrototype() const +{ + CalenDayItem *calendarViewItem = new CalenDayItem; + return calendarViewItem; +} + +// ----------------------------------------------------------------------------- +// setItemModelIndex() +// +// ----------------------------------------------------------------------------- +// +void CalenDayContainer::setItemModelIndex(HbAbstractViewItem *item, + const QModelIndex &index) +{ + QVariant variant = index.data( CalenDayEntry ); + AgendaEntry entry = variant.value(); + + if (entry.isTimedEntry()) { + updateTimedEventGeometry( item, index ); + item->setParentItem(this); + } + else if( entry.type() == AgendaEntry::TypeEvent ){ + updateAllDayEventGeometry( item, index ); + item->setParentItem(this); + } + else { + item->setVisible(false); + } + + // last item + if (index.row() == index.model()->rowCount() - 1) { + createTouchEventAbsorbers(); + } + + HbAbstractItemContainer::setItemModelIndex(item, index); +} + +// ----------------------------------------------------------------------------- +// updateTimedEventGeometry() +// Updates geometry of a timed event. +// ----------------------------------------------------------------------------- +// +void CalenDayContainer::updateTimedEventGeometry(HbAbstractViewItem *item, + const QModelIndex &index) +{ +//safety check + if ( !mInfo ) { + return; + } + + QVariant variant = index.data( CalenDayEntry ); + AgendaEntry entry = variant.value(); + +//1. get 'virtual' event position from DayInfo +//TODO: k.g.: Day Info should store model index instead of keeping redundant data + SCalenApptInfo apptInfo; + apptInfo.iIndex = index; + + QDateTime start; + QDateTime end; + QDateTime currentDate; + currentDate = static_cast(index.model())->modelDate(); + CalenDayUtils::instance()->getEventValidStartEndTime( start, end, entry, + currentDate ); + apptInfo.iStartTime = start; + apptInfo.iEndTime = end; + + TCalenInstanceId id = TCalenInstanceId::nullInstanceId(); + id.mEntryLocalUid = index.row(); //index.row() - temporary ID + id.mInstanceTime = apptInfo.iStartTime; + apptInfo.iId = id; + apptInfo.iAllDay = 0; + apptInfo.iColor = 0xffff; + + int startSlot, endSlot, columnIdx, columns; + mInfo->GetLocation( apptInfo, startSlot, endSlot, columnIdx, columns ); + + +//2. set timed event's geometry + qreal eventStartX(mLayoutValues.eventAreaX ); + qreal eventStartY(0.0); + qreal eventWidth(mLayoutValues.eventAreaWidth); + qreal eventHeight(0.0); + + //event's startY/height + eventStartY = startSlot * mLayoutValues.slotHeight; + eventHeight = (endSlot - startSlot) * mLayoutValues.slotHeight; + + //event's startX/width + eventWidth /= columns; + + //In case when eventWidth will be smaller then 3.0un we need to + //make spacings between events smaller. + //Check whether it's possible to shring them so the bubbles + //width can stay at 3.0un (time stripe + frame margins). + qreal minWidth = 3.0 * mLayoutValues.unitInPixels; + if(eventWidth - mLayoutValues.eventMargin < minWidth){ + + //Calculate new margin value + //from totalMarginSpace we need to subtract + //mLayoutValues.eventMargin because first margin is always 1.5un + qreal totalMarginSpace = mLayoutValues.eventAreaWidth - minWidth * columns - mLayoutValues.eventMargin; + qreal newMarginValue = totalMarginSpace / (columns - 1); + + //check if we managed to pack all the events into space we have + if(newMarginValue > 0){ + + eventWidth = minWidth; + } + else{ + //there's not enough space + //new minWidth it's 1.5un (time stripe only) + minWidth = 1.5 * mLayoutValues.unitInPixels; + totalMarginSpace = mLayoutValues.eventAreaWidth - minWidth * columns - mLayoutValues.eventMargin; + newMarginValue = totalMarginSpace / (columns - 1); + eventWidth = minWidth; + } + + //First column margin should be always 1.5un (mLayoutValues.eventMargin) + eventStartX += columnIdx * (eventWidth + newMarginValue) + mLayoutValues.eventMargin; + } + else{ + //add margins between the event + eventStartX += columnIdx * eventWidth + mLayoutValues.eventMargin; + eventWidth -= mLayoutValues.eventMargin; + } + + QRectF eventGeometry( eventStartX, eventStartY, eventWidth, eventHeight ); + item->setGeometry(eventGeometry);} + + +// ----------------------------------------------------------------------------- +// updateAllDayEventGeometry() +// Updates geometry of a timed event. +// ----------------------------------------------------------------------------- +// +void CalenDayContainer::updateAllDayEventGeometry(HbAbstractViewItem *item, + const QModelIndex &index) +{ + //safety check + if ( !mInfo ) { + return; + } + + QVariant variant = index.data( CalenDayEntry ); + AgendaEntry entry = variant.value(); + + //1. get 'virtual' event position from DayInfo + //TODO: k.g.: Day Info should store model index instead of keeping redundant data + SCalenApptInfo apptInfo; + apptInfo.iIndex = index; + + + QDateTime start; + QDateTime end; + QDateTime currentDate; + currentDate = static_cast(index.model())->modelDate(); + CalenDayUtils::instance()->getEventValidStartEndTime( start, end, entry, + currentDate ); + apptInfo.iStartTime = start; + apptInfo.iEndTime = end; + + TCalenInstanceId id = TCalenInstanceId::nullInstanceId(); + id.mEntryLocalUid = index.row(); //index.row() - temporary ID + id.mInstanceTime = apptInfo.iStartTime; + apptInfo.iId = id; + apptInfo.iAllDay = true; + apptInfo.iColor = 0xffff; + + int startSlot, endSlot, columnIdx, columns; + mInfo->GetLocation( apptInfo, startSlot, endSlot, columnIdx, columns ); + + //2. set timed event's geometry + qreal eventStartX(0.0); + qreal eventStartY(0.0); + qreal eventWidth(mLayoutValues.eventAreaX); + qreal eventHeight = (endSlot - startSlot) * mLayoutValues.slotHeight; + + + //event's startX/width + if ( columns > 1 ) { + eventWidth /= columns; + eventStartX += columnIdx * eventWidth + mLayoutValues.eventMargin; + //add margins between the event + eventWidth -= mLayoutValues.eventMargin; + } else { + eventStartX += mLayoutValues.eventMargin; + eventWidth -= mLayoutValues.eventMargin; + } + + QRectF eventGeometry( eventStartX, eventStartY, eventWidth, eventHeight ); + item->setGeometry(eventGeometry); + +} + + +// ----------------------------------------------------------------------------- +// movingBackwards() +// +// ----------------------------------------------------------------------------- +// +void CalenDayContainer::getTimedEventLayoutValues(LayoutValues& layoutValues) +{ + // get the width of content area + qreal contentWidth = CalenDayUtils::instance()->contentWidth(); +//1.time column width -> eventAreaX[out] + HbStyle style; + HbDeviceProfile deviceProfile; + layoutValues.unitInPixels = deviceProfile.unitValue(); + + if ( mInfo && mInfo->AlldayCount()) + { // 9.5 -> all-day area width + layoutValues.eventAreaX = 9.5 * layoutValues.unitInPixels; + } + else + { + layoutValues.eventAreaX = 0; + } + +//2. event area width -> eventAreaWidth[out] + qreal emptyRightColumnWidth(0.0); + emptyRightColumnWidth = 6.0 * layoutValues.unitInPixels; //pix (according to UI spec) + layoutValues.eventAreaWidth = contentWidth - emptyRightColumnWidth - layoutValues.eventAreaX ; +//3. margins between the overlapping events -> eventMargin[out] + layoutValues.eventMargin = 1.5 * layoutValues.unitInPixels; +//4. half-hour slot'h height -> slotHeight[out] + //curent slot height corresponds to half an hour + layoutValues.slotHeight = + CalenDayUtils::instance()->hourElementHeight() / 2; + + // 8.2 un (min. touchable event) from layout guide + layoutValues.maxColumns = layoutValues.eventAreaWidth / (8.2 * layoutValues.unitInPixels); +} + +// ----------------------------------------------------------------------------- +// setDayInfo() +// Sets day's info structer to the container. +// ----------------------------------------------------------------------------- +// +void CalenDayContainer::setDayInfo( CalenDayInfo* dayInfo ) +{ + mInfo = dayInfo; +} + +// ----------------------------------------------------------------------------- +// orientationChanged() +// Slot handles layout switch. +// ----------------------------------------------------------------------------- +// +void CalenDayContainer::orientationChanged(Qt::Orientation orientation) +{ + getTimedEventLayoutValues(mLayoutValues); + + Q_UNUSED( orientation ) + QList items = this->items(); + int count(items.count()); + for (int i = 0; i < count; i++) { + QModelIndex modelIndex = items[i]->modelIndex(); + if (modelIndex.isValid()) { + QVariant variant = modelIndex.data(CalenDayEntry); + AgendaEntry entry = variant.value (); + if (entry.isTimedEntry()) { + updateTimedEventGeometry(items[i], modelIndex); + } + } + } + + createTouchEventAbsorbers(); +} + +// ----------------------------------------------------------------------------- +// createTouchEventAbsorbers() +// Creates absorbers which prevent touching to small items +// ----------------------------------------------------------------------------- +// +void CalenDayContainer::createTouchEventAbsorbers() +{ + // remove absorbers if exist + if (mAbsorbers.count()) + { + qDeleteAll(mAbsorbers); + mAbsorbers.clear(); + } + + const QList& regionList = mInfo->RegionList(); + + for(int i=0; i < regionList.count(); i++) + { + if(regionList[i].iColumns.count() > mLayoutValues.maxColumns ) + { + TouchEventAbsorber* absorber = + crateAbsorberBetweenSlots(regionList[i].iStartSlot, regionList[i].iEndSlot); + + mAbsorbers.append(absorber); + } + } + +} + +// ----------------------------------------------------------------------------- +// crateAbsorberBetweenSlots() +// Creates single absorber in given location +// ----------------------------------------------------------------------------- +// +TouchEventAbsorber *CalenDayContainer::crateAbsorberBetweenSlots + (int startSlot, int endSlot) +{ + TouchEventAbsorber *absorber = new TouchEventAbsorber(this); + absorber->setZValue(1000); + absorber->setVisible(true); + + absorber->setGeometry( mLayoutValues.eventAreaX, // x + startSlot * mLayoutValues.slotHeight, // y + mLayoutValues.eventAreaWidth, // w + (endSlot-startSlot) * mLayoutValues.slotHeight ); // h + + return absorber; +} + + +// ----------------------------------------------------------------------------- +// TouchEventAbsorber::gestureEvent() +// Handles tap event on overlapping area (currently it leads to Agenda View - +// as described in UI spec) +// ----------------------------------------------------------------------------- +// +void TouchEventAbsorber::gestureEvent(QGestureEvent *event) +{ + QTapGesture *tapGesture = qobject_cast (event->gesture( + Qt::TapGesture)); + + if (tapGesture && tapGesture->state() == Qt::GestureFinished) + { + CalenDayView* dayView = static_cast + (CalenDayUtils::instance()->mainWindow()->currentView()); + + dayView->changeView(ECalenAgendaView); + } +} + +// ----------------------------------------------------------------------------- +// TouchEventAbsorber() +// default ctor +// ----------------------------------------------------------------------------- +// +TouchEventAbsorber::TouchEventAbsorber(QGraphicsItem *parent) : HbWidget(parent) +{ +#ifdef _DEBUG + setFlag(QGraphicsItem::ItemHasNoContents, false); +#endif + grabGesture(Qt::TapGesture); +} + +// ----------------------------------------------------------------------------- +// TouchEventAbsorber() +// default dtor +// ----------------------------------------------------------------------------- +// +TouchEventAbsorber::~TouchEventAbsorber() +{ + +} + +// ----------------------------------------------------------------------------- +// TouchEventAbsorber::paint() +// used for debugging purposes to see absorbers areas +// ----------------------------------------------------------------------------- +// +#ifdef _DEBUG +void TouchEventAbsorber::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, + QWidget *widget) +{ + Q_UNUSED(option) + Q_UNUSED(widget) + + painter->save(); + QPen pen; + pen.setWidth(2); + pen.setColor(Qt::red); + painter->setPen(pen); + painter->drawRect(boundingRect()); + painter->restore(); +} +#endif +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/src/calendaycontentscrollarea.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/src/calendaycontentscrollarea.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,412 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: CalenDayContentScrollArea implementation. + * + */ + +// System includes +#include +#include + +#include +#include + +// User includes +#include "calendaycontentscrollarea.h" +#include "calendayutils.h" + +/*! + \class CalenDayContentScrollArea + \brief Scrollable container class for content widgets. + + It handles horizontal scrolling and swipe or pan gestures. + */ + +/*! + \brief Constructor + + Configures scroll area settings and resets internal stares of widget. + Gets the width of device. + + \param parent The parent of scroll area widget + */ +CalenDayContentScrollArea::CalenDayContentScrollArea(QGraphicsItem *parent) : + HbScrollArea(parent), mPanDayDirection(ECalenPanNotSet), mIsMoving(false), + mMoveDirection(ECalenScrollNoDayChange) +{ + // Set scroll settings + setScrollDirections(Qt::Horizontal); + setClampingStyle(StrictClamping); + setHorizontalScrollBarPolicy(HbScrollArea::ScrollBarAlwaysOff); + +#ifdef CALENDAYVIEW_PANNING_ENABLED + grabGesture(Qt::PanGesture); + ungrabGesture(Qt::SwipeGesture); +#else + grabGesture(Qt::SwipeGesture); + ungrabGesture(Qt::PanGesture); +#endif + + // Get the width of content area and orientation of screen + mContentWidth = CalenDayUtils::instance()->contentWidth(); + mOrientation = CalenDayUtils::instance()->orientation(); + + // Connect to main window's orientationChanged SIGNAL to handle orientation + // switching + connect(CalenDayUtils::instance()->mainWindow(), + SIGNAL(orientationChanged(Qt::Orientation)), this, + SLOT(orientationChanged(Qt::Orientation))); +} + +/*! + \brief Destructor + */ +CalenDayContentScrollArea::~CalenDayContentScrollArea() +{ +} + +/*! + \brief Scrolls to middle widget. + + Scrolling to middle widget is done if needed. + Resets internal pan direction flag. + */ +void CalenDayContentScrollArea::scrollToMiddleWidget() +{ + QPointF currentPosition = contentWidget()->pos(); + QPointF destPosition = QPointF(mContentWidth, currentPosition.y()); + + // Scroll only when x position is wrong + if (currentPosition.x() != destPosition.x()) { + scrollContentsTo(QPointF(mContentWidth, currentPosition.y()), 0); + } + + // Reset pan direction flag and scrolling flag + mPanDayDirection = ECalenPanNotSet; +} + +/*! + \brief Scrolls the view by the amount indicated by "delta". + + Checks the direction of pan gesture and promotes leading direction. + + \param delta Move offset + \return Returns TRUE if the view was able to scroll, FALSE otherwise + */ +bool CalenDayContentScrollArea::scrollByAmount(const QPointF &delta) +{ + QPointF newDelta(delta); + if (mPanDayDirection == ECalenPanVertical) { + newDelta.setX(0); + } + else + if (mPanDayDirection == ECalenPanHorizontal) { + newDelta.setY(0); + } + else { + // Pan direction not set + } + + return HbScrollArea::scrollByAmount(newDelta); +} + +/*! + \brief Handles pan gesture event (horizontal) or swipe gesture. + + Ignores vertical pan gestures. + + \param event Gesture event to be handled + */ +void CalenDayContentScrollArea::gestureEvent(QGestureEvent *event) +{ +#ifdef CALENDAYVIEW_PANNING_ENABLED + // Process a pan gesture event + if (QPanGesture *panGesture = qobject_cast (event->gesture( + Qt::PanGesture))) { + + // Checks pan gesture direction + checkPanDirection(panGesture); + + // Put the gesture forward before working with finished gesture + HbScrollArea::gestureEvent(event); + + // If gesture is finished move the scroll area to next or previous + // widget or resume to gesture start point + if (panGesture->state() == Qt::GestureFinished) { + // Pan direction should be reseted when scrolling ends + + // Gets the offset of pan gesture. + QPointF offset = panGesture->offset(); + + // Note: in horizontal orientation x should is treaten as Y, y as X. + QPointF movement; + if (mOrientation == Qt::Vertical) { + movement = offset; + } + else { + movement.setX(offset.y()); + movement.setY(offset.x()); + } + + // Gesture was long enough for place movement + if (qAbs(movement.x()) > (KCalenHScrollMoveParam * mContentWidth / 100)) { + if (movement.x() < 0) { + mMoveDirection = ECalenScrollToNext; + moveTo(QPointF((-mStartPosition.x() + mContentWidth), + -mStartPosition.y()), KCalenScrollDaysTimeout); + } + else { + mMoveDirection = ECalenScrollToPrev; + moveTo(QPointF(-mStartPosition.x() - mContentWidth, + -mStartPosition.y()), KCalenScrollDaysTimeout); + } + } + // Gesture was short one, reset to gesture start point + else { + qreal startPos = mStartPosition.x(); + bool isNegative = false; + if (startPos < 0) { + isNegative = true; + } + startPos = qAbs(startPos); + qreal normalizeValue = mContentWidth / 2; + + while (startPos > normalizeValue) { + normalizeValue += mContentWidth; + } + + if (isNegative) { + mStartPosition.setX(-(normalizeValue - (mContentWidth / 2))); + } + else { + mStartPosition.setX(normalizeValue - (mContentWidth / 2)); + } + + mMoveDirection = ECalenScrollNoDayChange; + moveTo(-mStartPosition, KCalenScrollDaysTimeout); + } + } + } + else { + HbScrollArea::gestureEvent(event); + } +#else + // Let the content scroll area ignore pan gestures + if (QPanGesture *panGesture = qobject_cast (event->gesture( + Qt::PanGesture))) { + // do nothing with pan gesture + } + + if (HbSwipeGesture *swipeGesture = + qobject_cast (event->gesture(Qt::SwipeGesture))) { + if (swipeGesture->state() == Qt::GestureStarted) { + mStartPosition = contentWidget()->pos(); + + qreal swipeAngle = swipeGesture->sceneSwipeAngle(); + if (CalenDayUtils::instance()->isHorizontalSwipe(swipeAngle)) { + if (QSwipeGesture::Left == + swipeGesture->sceneHorizontalDirection()) { + mMoveDirection = ECalenScrollToNext; + moveTo(QPointF((-mStartPosition.x() + mContentWidth), + -mStartPosition.y()), KCalenScrollDaysTimeout); + } + else if (QSwipeGesture::Right == + swipeGesture->sceneHorizontalDirection()) { + mMoveDirection = ECalenScrollToPrev; + moveTo(QPointF(-mStartPosition.x() - mContentWidth, + -mStartPosition.y()), KCalenScrollDaysTimeout); + } + } + } + } +#endif +} + +/*! + \brief Filters pan gesture events. + + Filters events if this object has been installed as an event filter for + the watched object. Handles horizontal pan gestures (ignores vertical). + When moving scroll area all gesture events are blocked. + + \param obj Watched object + \param event Event to be filtered + \return Returns TRUE if event was handled. FALSE otherwise. + */ +bool CalenDayContentScrollArea::eventFilter(QObject *obj, QEvent *event) +{ + Q_UNUSED(obj); + + bool handled = false; + + // Check if we get a gesture event + if (event->type() == QEvent::Gesture) { + + // Blocks handling of gesture events if scrolling started by + // pan gesture is in progress + if (mIsMoving) { + handled = true; + } + else { + QGestureEvent* gesture = static_cast (event); + + // Check if we get a pan gesture + QPanGesture *panGesture = qobject_cast ( + gesture->gesture(Qt::PanGesture)); + if (panGesture) { + checkPanDirection(panGesture); + if (mPanDayDirection == ECalenPanHorizontal) { + gestureEvent(gesture); + handled = true; + } + } + } + } + + return handled; +} + +/*! + \brief Overriden event handler. + + Handles events: + - gesture/focus events blocked when horizontal scrolling is in progress + - layout request event - scrolls to middle widget if current position is wrong + + \param e Event to be handled + \return Returns TRUE if event was handled. FALSE otherwise. + */ +bool CalenDayContentScrollArea::event(QEvent *e) +{ + bool result = false; + + // Blocks base class handler for certain events if scrolling started + // by pan gesture is in progress + if (mIsMoving && (e->type() == QEvent::Gesture || e->type() + == QEvent::GestureOverride || e->type() == QEvent::FocusOut + || e->type() == QEvent::FocusIn)) { + result = true; + } + if (!result) { + // Call base class handler + result = HbScrollArea::event(e); + + // Scroll to middle widget when layout request + if (e->type() == QEvent::LayoutRequest) { + scrollToMiddleWidget(); + } + } + + return result; +} + +/*! + \brief Checks the direction of pan gesture. + + Changes the scrolling style according to movement direction, + stores the orientation of the pan gesture. + Function is used when switching widgets by panning gesture is enabled. + + \param panGesture Pan gesture event + */ +void CalenDayContentScrollArea::checkPanDirection(QPanGesture *panGesture) +{ + // Gets the offset of pan gesture. + QPointF offset = panGesture->offset(); + + // Note: in horizontal orientation x should is treaten as Y, y as X. + QPointF movement; + if (mOrientation == Qt::Vertical) { + movement = offset; + } + else { + movement.setX(offset.y()); + movement.setY(offset.x()); + } + + // If gesture is started check leading movement direction + if (panGesture->state() == Qt::GestureStarted) { + if (qAbs(movement.x()) < qAbs(movement.y())) { + mPanDayDirection = ECalenPanVertical; + } + else { + mStartPosition = contentWidget()->pos(); + mPanDayDirection = ECalenPanHorizontal; + } + } +} + +/*! + \brief Scrolls the contents to the newPosition in a given time. + + Sets the flag to indicate that scrolling is in progress. Use this function + for scrolling with timeout > 0 to block gesture and focus events during + scroll area movement. + + \param newPosition Destination position + \param time Time of scroll movement + */ +void CalenDayContentScrollArea::moveTo(const QPointF &newPosition, int time) +{ + // Connect to scrollingEnded SIGNAL to get feedback when scrolling ends + connect(this, SIGNAL(scrollingEnded()), this, SLOT(moveFinished())); + + // Scroll the content to new position and set isMoving flag + scrollContentsTo(newPosition, time); + mIsMoving = true; + + // Emit signal that moving has just started + if (mMoveDirection != ECalenScrollNoDayChange) { + emit scrollAreaMoveStarted(mMoveDirection); + } +} + +/*! + \brief Slot which is called when moving of scroll area is finished. + + Resets internal isMoving flag. + */ +void CalenDayContentScrollArea::moveFinished() +{ + // Disconnect from signal, move is finished now + disconnect(this, SIGNAL(scrollingEnded()), this, SLOT(moveFinished())); + mIsMoving = false; + + // Emit signal that moving has just finished and reset direction + if (mMoveDirection != ECalenScrollNoDayChange) { + emit scrollAreaMoveFinished(mMoveDirection); + mMoveDirection = ECalenScrollNoDayChange; + } +} + +/*! + \brief Slot which is called whenever the orientation of the device changes. + + Stores screen width and orientation in private members. + + \param orientation Current device orientation + */ +void CalenDayContentScrollArea::orientationChanged(Qt::Orientation orientation) +{ + // Update the width of content area + mContentWidth = CalenDayUtils::instance()->contentWidth(); + mOrientation = orientation; + + // Reset flag related to moving + mPanDayDirection = ECalenPanNotSet; + mMoveDirection = ECalenScrollNoDayChange; + mIsMoving = false; +} + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/src/calendaycontentwidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/src/calendaycontentwidget.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: CalenDayContentWidget implementation. + * + */ + +// System includes +#include +#include + +// User includes +#include "calendaymodelmanager.h" +#include "calendaycontentwidget.h" +#include "calendayitemview.h" +#include "calendaycontentscrollarea.h" + +/*! + \class CalenDayContentWidget + \brief Content widget is a container class for horizontal layouted widgets. + */ + +/*! + \brief Constructor + + \param parent The parent of central widget + */ +CalenDayContentWidget::CalenDayContentWidget( + CalenDayModelManager &modelManager, + QGraphicsItem *parent) : + HbWidget(parent), mLayout(NULL), mModelManager(modelManager) +{ + mWidgets.clear(); + initializeViews(parent); +} + +/*! + \brief Destructor + */ +CalenDayContentWidget::~CalenDayContentWidget() +{ + // Just clear widget list - parent object will destroy its children + mWidgets.clear(); +} + +/*! + \brief Adds the widget to central widget and layouts it horizontally. + + Ownership of item is passed to CalenDayContentWidget. + + \param item Widget to be added + \param where Place where widget should be added (as first/last item) + */ +void CalenDayContentWidget::add(HbWidget* item, CalenWidgetPosition where) +{ + // Create linear, horizontal layout if not exist + if (!mLayout) { + mLayout = new QGraphicsLinearLayout(Qt::Horizontal, NULL); + mLayout->setContentsMargins(0.0, 0.0, 0.0, 0.0); + mLayout->setSpacing(0.0); + } + + switch (where) { + case ECalenFirstWidget: { + mLayout->insertItem(0, item); + mWidgets.insert(0, item); + break; + } + case ECalenLastWidget: + default: { + mLayout->addItem(item); + mWidgets.append(item); + } + } + + // If layout has no parent - apply it to central widget + if (mLayout && !mLayout->parentLayoutItem()) { + setLayout(mLayout); + } +} + +/*! + \brief Takes the widget and removes it from central widget. + + Ownership of item is passed to caller. + + \param which Indicates which widget should be taken (first/last) + \return Pointer to HbWidget or NULL if widget was not found + */ +HbWidget* CalenDayContentWidget::take(CalenWidgetPosition which) +{ + Q_ASSERT(mLayout); + + HbWidget* itemToTake = NULL; + switch (which) { + case ECalenFirstWidget: { + itemToTake = mWidgets.takeFirst(); + break; + } + case ECalenLastWidget: + default: { + itemToTake = mWidgets.takeLast(); + } + } + + if (itemToTake) { + mLayout->removeItem(itemToTake); + } + + return itemToTake; +} + +/*! + \brief Removed the widget from central widget. + + Widget is removed and deleted. + + \param which Indicates which widget should be removed (first/last) + */ +void CalenDayContentWidget::remove(CalenWidgetPosition which) +{ + Q_ASSERT(mLayout); + + HbWidget* itemToRemove = NULL; + switch (which) { + case ECalenFirstWidget: { + itemToRemove = mWidgets.takeFirst(); + break; + } + case ECalenLastWidget: + default: { + itemToRemove = mWidgets.takeLast(); + } + } + + if (itemToRemove) { + mLayout->removeItem(itemToRemove); + delete itemToRemove; + } +} + +/*! + \brief Performs relayout of widgets when it is needed. + + Relayout is done depending on last scroll move: + - if widget was scrolled to next: first widget is taken and added as last + - if widget was scrolled to prev: last widget is taken and inserted as first + + Emits widgetsRelayoutFinished SIGNAL when relayout is over. + + \param scrollTo Direction of last movement + */ +void CalenDayContentWidget::relayoutWidgets(CalenScrollDirection scrollTo) +{ + HbWidget* widget = NULL; + switch (scrollTo) { + case ECalenScrollToNext: { + widget = take(ECalenFirstWidget); + add(widget, ECalenLastWidget); + break; + } + case ECalenScrollToPrev: + default: { + widget = take(ECalenLastWidget); + add(widget, ECalenFirstWidget); + } + } + emit widgetsRelayoutFinished(scrollTo); +} + +/*! + \brief SLOT handles simultanous vertical scrolling of owned widgets. + + \param newPos New scroll position + */ +void CalenDayContentWidget::widgetScrolled(const QPointF &newPos) +{ + for (int i = 0; i < mWidgets.count(); i++) { + CalenDayItemView *view = + static_cast (mWidgets[i]); + view->scrollVertically(newPos); + } + emit scrollPositionChanged(newPos); +} + +/*! + \brief Initializes content widgets and adds them to layout. + + \param parent Parent object + */ +void CalenDayContentWidget::initializeViews(QGraphicsItem *parent) +{ + // Create item views + HbModelIterator *iterator(0); + + iterator = new HbModelIterator(&mModelManager.getModel( + CalenDayModelManager::PreviousDay)); + CalenDayItemView *prevItemView = new CalenDayItemView( + mModelManager.getServices(), iterator, 0); + + iterator = new HbModelIterator(&mModelManager.getModel( + CalenDayModelManager::CurrentDay)); + CalenDayItemView *currItemView = new CalenDayItemView( + mModelManager.getServices(), iterator, 0); + + iterator = new HbModelIterator(&mModelManager.getModel( + CalenDayModelManager::NextDay)); + CalenDayItemView *nextItemView = new CalenDayItemView( + mModelManager.getServices(), iterator, 0); + + // Connecting views with widgetScrolled SLOT + // to support simultanous vertical scrolling + connect(prevItemView, SIGNAL(scrollPositionChanged(const QPointF&)), this, + SLOT(widgetScrolled(const QPointF&))); + connect(currItemView, SIGNAL(scrollPositionChanged(const QPointF&)), this, + SLOT(widgetScrolled(const QPointF&))); + connect(nextItemView, SIGNAL(scrollPositionChanged(const QPointF&)), this, + SLOT(widgetScrolled(const QPointF&))); + + // Install event filters to receive events necessary for gesture handling + CalenDayContentScrollArea* scrollArea = + static_cast (parent); + prevItemView->installEventFilter(scrollArea); + currItemView->installEventFilter(scrollArea); + nextItemView->installEventFilter(scrollArea); + + // Add views to layout + add(prevItemView); + add(currItemView); + add(nextItemView); +} + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/src/calendayeventspane.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/src/calendayeventspane.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,108 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Day view control of calendar +* +*/ +// System includes +#include +#include + +// User includes +#include "CalenDayEventsPane.h" + +/*! + \class CalenDayEventsPane + \brief Events pane draws timelines in content view. + */ + +/*! + \brief Constructor + + \param parent The parent of widget + */ +CalenDayEventsPane::CalenDayEventsPane(HbWidget *parent) : HbWidget(parent), + mDrawTopLine(false) +{ + // Necessary when widget implements own paint method + setFlag(QGraphicsItem::ItemHasNoContents, false); + + HbDeviceProfile deviceProfile; + mUnitInPixels = deviceProfile.unitValue(); + mHourLineColor = HbColorScheme::color("qtc_cal_day_hour_lines"); + + // Set custom dashed pen + mCustomDashedPen.setWidth(0.15); + QVector dashes; + dashes << 5 << 5; + mCustomDashedPen.setDashPattern(dashes); + mCustomDashedPen.setCapStyle(Qt::FlatCap); + mCustomDashedPen.setColor(mHourLineColor); +} + +/*! + \brief Destructor + */ +CalenDayEventsPane::~CalenDayEventsPane() +{ +} + +/*! + \brief Shows/hides a line at top of event pane. + + \param drawTopLine Flag to be set if top line should be drawn. + */ +void CalenDayEventsPane::drawTopLine(bool drawTopLine) +{ + mDrawTopLine = drawTopLine; +} + +/*! + \brief Paints the item with given painter. + + \param painter + \param option + \param widget + */ +void CalenDayEventsPane::paint(QPainter *painter, + const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + Q_UNUSED(widget) + + QRectF drawArea = option->rect; + + const qreal hourLineThickness = 0.15; //un (according to UI spec) + + painter->save(); + + // Draw full hour line + QPen linePen = QPen(mHourLineColor, hourLineThickness * mUnitInPixels); + painter->setPen(linePen); + QLineF fullHourLine(drawArea.bottomLeft(), drawArea.bottomRight()); + painter->drawLine(fullHourLine); + + // Draw extra line on top if needed + if (mDrawTopLine) { + fullHourLine = QLineF(drawArea.topLeft(), drawArea.topRight()); + painter->drawLine(fullHourLine); + } + + // Draw half hour line + painter->setPen(mCustomDashedPen); + qreal halfHourYPos = drawArea.height() / 2; + QLineF halfHourLine(drawArea.left(), halfHourYPos, drawArea.right(), halfHourYPos); + painter->drawLine(halfHourLine); + + painter->restore(); +} + diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/src/calendayhourelement.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/src/calendayhourelement.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,143 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Day view control of calendar +* +*/ + +//System includes +#include +#include +#include +#include +#include +#include +#include + +//User includes +#include "calendayhourelement.h" +#include "calendaycontainer.h" +#include "calendayhourscrollarea.h" + +// Constants + +/*! + \brief CalenDayHourElement() + Constructor +*/ +CalenDayHourElement::CalenDayHourElement(const QTime &time, QGraphicsItem *parent) : + HbWidget(parent), mHour(time) +{ + // Necessary when widget implements own paint method + setFlag(QGraphicsItem::ItemHasNoContents, false); + + HbDeviceProfile deviceProfile; + mUnitInPixels = deviceProfile.unitValue(); + + mHourLineColor = HbColorScheme::color("qtc_cal_day_hour_lines"); + + //Create text items + HbExtendedLocale systemLocale = HbExtendedLocale::system(); + + //Get current time format and (if there's a need) separate time from am/pm text + QChar timeSeparator = ' '; + QStringList timeTextList = systemLocale.format(time, r_qtn_time_usual_with_zero).split( + timeSeparator); + + //prepend 0 if needed to achieve format - 01:00 + QString timeString = timeTextList[0]; + if (timeString.length() < 5) { + timeString.prepend('0'); + } + + QString ampmString = ""; + if (timeTextList.count() > 1) { + ampmString = timeTextList[1].toLower(); + } + + HbTextItem* timeTextItem = new HbTextItem(timeString, this); + HbTextItem* ampmTextItem = new HbTextItem(ampmString, this); + + HbStyle::setItemName(timeTextItem, QLatin1String("time")); + HbStyle::setItemName(ampmTextItem, QLatin1String("ampm")); + + mContainer = static_cast (parent); + +} + +/*! + \brief CalenDayHourElement() + Destructor +*/ +CalenDayHourElement::~CalenDayHourElement() +{ + +} + +/*! + \brief CalenDayHourElement() + paint +*/ +void CalenDayHourElement::paint( + QPainter * painter, + const QStyleOptionGraphicsItem * option, + QWidget * widget) +{ + Q_UNUSED(widget); + + QRectF drawArea = option->rect; + + const qreal hourLineThickness = 0.15; //un (according to UI spec) + const qreal timeLineThickness = 0.75; //un (according to UI spec) + + painter->save(); + + //Draw full hour line + QPen linePen = QPen(mHourLineColor, hourLineThickness * mUnitInPixels); + painter->setPen(linePen); + QLineF fullHourLine(drawArea.bottomLeft(), drawArea.bottomRight()); + + painter->drawLine(fullHourLine); + + //Draw extra line on top for midnight + if (mHour.hour() == 0) { + fullHourLine = QLineF(drawArea.topLeft(), drawArea.topRight()); + painter->drawLine(fullHourLine); + } + + QDateTime currentDateTime = QDateTime::currentDateTime(); + + //Draw the time line in theme color + if (mContainer) { + QDateTime containersDateTime = mContainer->dateTime(); + + if (currentDateTime.date() == containersDateTime.date() && currentDateTime.time().hour() + == mHour.hour()) { + + qreal currentTimeY = drawArea.height() * currentDateTime.time().minute() / 60; + + QColor color = HbColorScheme::color("qtc_cal_month_current_day"); + + painter->setPen(QPen(color, timeLineThickness * mUnitInPixels, Qt::SolidLine, + Qt::FlatCap)); + QLineF currentTimeline(drawArea.left(), drawArea.top() + currentTimeY, drawArea.right(), drawArea.top() + + currentTimeY); + painter->drawLine(currentTimeline); + + } + } + + painter->restore(); +} + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/src/calendayhourscrollarea.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/src/calendayhourscrollarea.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: CalenDayHourScrollArea implementation. + * + */ + +// System includes +#include + +// User includes +#include "calendayhourscrollarea.h" +#include "calendayhourelement.h" +#include "calendayutils.h" + +/*! + \class CalenDayHourScrollArea + \brief Scrollable container class for hour elements. + + It handles vertical scrolling. + */ + +/*! + \brief Constructor + + Configures scroll area settings and resets internal stares of widget. + Gets the width of device. + + \param parent The parent of scroll area widget + */ +CalenDayHourScrollArea::CalenDayHourScrollArea(QGraphicsItem *parent) : + HbScrollArea(parent), + mDateTime(QDateTime()) +{ + // Set scroll settings + setScrollDirections(Qt::Vertical); + setScrollingStyle(HbScrollArea::PanWithFollowOn); + setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAlwaysOff); + grabGesture(Qt::PanGesture, Qt::ReceivePartialGestures); + + // Get height and width of hour elements and set fixed size policy + qreal hourElementHeight = CalenDayUtils::instance()->hourElementHeight(); + qreal hourElementWidth = CalenDayUtils::instance()->hourElementWidth(); + + // Create widget for hour elements + HbWidget *hourWidget = new HbWidget(); + + // Create and insert hour elements into vertical layout + QGraphicsLinearLayout* hourLayout = new QGraphicsLinearLayout(Qt::Vertical, + NULL); + for (int i = 0; i < 24; i++) { + CalenDayHourElement* element = new CalenDayHourElement(QTime(i, 0), + this); + element->setPreferredWidth(hourElementWidth); + element->setPreferredHeight(hourElementHeight); + element->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, + QSizePolicy::Fixed)); + hourLayout->addItem(element); + + mHourElements.append(element); + } + + hourLayout->setContentsMargins(0.0, 0.0, 0.0, 0.0); + hourLayout->setSpacing(0.0); + + // Fix the size of scroll area + setMinimumWidth(hourElementWidth); + setMaximumWidth(hourElementWidth); + + // Apply hour layout for new widget and set content widget to scroll area + hourWidget->setLayout(hourLayout); + setContentWidget(hourWidget); +} + +/*! + \brief Destructor + */ +CalenDayHourScrollArea::~CalenDayHourScrollArea() +{ +} + +/*! + \brief SLOT scrolls the view vertically to new position. + + \param newPosition New position + */ +void CalenDayHourScrollArea::scrollVertically(const QPointF &newPosition) +{ + QPointF currentPos = contentWidget()->pos(); + if (abs(newPosition.y()) != abs(currentPos.y())) { + currentPos.setY(newPosition.y()); + scrollContentsTo(currentPos, 0); + } +} + +/*! + \brief Sets date and time for this container. + + \param dateTime new date and time + */ +void CalenDayHourScrollArea::setDateTime(const QDateTime &dateTime) +{ + mDateTime = dateTime; +} +/*! + \brief Returns date and time assigned to current view. +*/ +QDateTime CalenDayHourScrollArea::dateTime() const +{ + return mDateTime; +} + +/*! + \brief Scroll view to given hour. + + \param An hour In 24 hour format (0 - 23) +*/ +void CalenDayHourScrollArea::scrollToHour(int hour) +{ + CalenDayHourElement *hourElement = mHourElements.at(hour); + QRectF hourElementRect = hourElement->rect(); + hourElementRect = hourElement->mapRectToParent(hourElementRect); + QPointF newPos = hourElementRect.topLeft(); + + //Ensure that we won't scroll out of bound + CalenDayHourElement *lastElement = mHourElements.last(); + qreal bottomEdge = lastElement->mapRectToParent(lastElement->rect()).bottom(); + qreal viewHeight = rect().height(); + + if(bottomEdge - newPos.y() < viewHeight){ + newPos.setY(bottomEdge - viewHeight); + } + + scrollContentsTo(newPos); +} + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/src/calendayinfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/src/calendayinfo.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,2362 @@ +/* +* Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Storage class for day and week views. +* +*/ + + +// INCLUDES +#include "calendayinfo.h" +#include "calenagendautils.h" +#include "calenconstants.h" +#include "calendateutils.h" + +namespace +{ +const int KUntimedDefaultSlot(16); +} + +/*! + \brief CalenDayInfo::CalenDayInfo +*/ +CalenDayInfo::CalenDayInfo(TSlotsInHour aSlotsInHour) : + iFirstUntimedSlot(KUntimedDefaultSlot), iSlotsInHour(aSlotsInHour) +{ + iSelectedSlot = KFSCalStartingHour * iSlotsInHour; + iSelectedRegion = KErrNotFound; + iSelectedColumn = 0; + iSelectedAlldayEvent = KErrNotFound; + iEarliestEndSlot = KErrNotFound; + iLastStartSlot = KErrNotFound; +} + +/*! + \brief Destructor +*/ +CalenDayInfo::~CalenDayInfo() +{ + for (int i = 0; i < iRegionList.count(); i++) { + iRegionList[i].Close(); + } + iRegionList.clear(); + iUntimedEvents.clear();//Close(); + iTodoEvents.clear();//Close(); + iAlldayEvents.clear();//Close(); +} + +/*! + \brief CalenDayInfo::Reset +*/ +void CalenDayInfo::Reset() +{ + for (int i = 0; i < iRegionList.count(); i++) { + iRegionList[i].Close(); + } + iRegionList.clear();//Reset(); + iUntimedEvents.clear();//Reset(); + iTodoEvents.clear();//Reset(); + iAlldayEvents.clear();//Reset(); + + iUntimedSlotCount = 0; + iFirstUntimedSlot = KFSCalStartingHour * iSlotsInHour; + + iSelectedSlot = KFSCalStartingHour * iSlotsInHour; + iSelectedRegion = KErrNotFound; + iSelectedColumn = 0; + iSelectedAlldayEvent = KErrNotFound; + iEarliestEndSlot = KErrNotFound; + iLastStartSlot = KErrNotFound; +} + +/*! + \brief CalenDayInfo::InsertTimedEvent +*/ +void CalenDayInfo::InsertTimedEvent(const SCalenApptInfo& aItemInfo) +{ + + int startIndex = SlotIndexForStartTime(aItemInfo.iStartTime); + int endIndex = SlotIndexForEndTime(aItemInfo.iEndTime); + if (endIndex == startIndex) { + endIndex++; + } + if (iRegionList.count() > 0) { + // the timed events must be added in order + ASSERT( startIndex >= iLastStartSlot ); + } + + CalenTimedEventInfo info; + info.iStartSlot = startIndex; + info.iEndSlot = endIndex; + info.iId = aItemInfo.iId; + info.iStatus = aItemInfo.iStatus; + // info.iReplicationStatus = aItemInfo.iReplicationStatus; + iLastStartSlot = startIndex; + if (iEarliestEndSlot == KErrNotFound || endIndex < iEarliestEndSlot) { + iEarliestEndSlot = endIndex; + } + + bool added(false); + if (iRegionList.count() > 0) { + // Since events are added in order, the event either overlaps the + // last region or doesn't overlap any region at all + CalenTimeRegion& region = iRegionList[iRegionList.count() - 1]; + if (region.Overlaps(info)) { + region.AddEvent(info); + added = true; + } + } + + if (!added) { + // If it didn't overlap the last region, add a new region for this event. + iRegionList.append(CalenTimeRegion()); + CalenTimeRegion& region = iRegionList[iRegionList.count() - 1]; + region.AddEvent(info); + + // Do rounding of the region ends + if (iRegionList.count() >= 2) { + // Check if the previous region end time can be rounded down + CalenTimeRegion& prevRegion = iRegionList[iRegionList.count() - 2]; + int end = RoundHourDown(prevRegion.iEndSlot); + if (end <= region.iStartSlot) { + prevRegion.iEndSlot = end; + } + // Check if the start time of the new region can be rounded up + int start = RoundHourUp(region.iStartSlot); + if (start >= prevRegion.iEndSlot) { + region.iStartSlot = start; + } + } + else { + // No previous region, round the start time up + region.iStartSlot = RoundHourUp(region.iStartSlot); + } + } +} + +/*! + \brief CalenDayInfo::InsertAlldayEvent +*/ +void CalenDayInfo::InsertAlldayEvent(const SCalenApptInfo& aItemInfo) +{ + CalenTimedEventInfo info; + info.iStartSlot = 0; + info.iEndSlot = iSlotsInHour * KCalenHoursInDay + iUntimedSlotCount; + info.iId = aItemInfo.iId; + info.iStatus = aItemInfo.iStatus; + // info.iReplicationStatus = aItemInfo.iReplicationStatus; + + iAlldayEvents.append(info); +} + +/*! + \brief CalenDayInfo::IsAllDayEvent +*/ +bool CalenDayInfo::IsAlldayEvent(QDateTime aStart, QDateTime aEnd) +{ + bool isAllDay(false); + + if (!CalenDateUtils::onSameDay(aStart, aEnd)) { + QDateTime startMidnight = CalenDateUtils::beginningOfDay(aStart); + QDateTime endMidnight = CalenDateUtils::beginningOfDay(aEnd); + + if ((aStart == startMidnight) && (aEnd == endMidnight)) { + isAllDay = true; + } + } + return isAllDay; +} + +/*! + \brief CalenDayInfo::IsAllDayEvent + Allday event is an event starting and ending at midnight, + with a duration of n*24h. +*/ +/* +bool CalenDayInfo::IsAlldayEvent(const CCalInstance& aInstance) +{ + bool isAllDay(false); + + // If getting the start or end time fails, return false. + QDateTime start; + QDateTime end; + TRAPD( error, + { + start = aInstance.StartTimeL().TimeLocalL(); + end = aInstance.EndTimeL().TimeLocalL(); + }); + + if (error == KErrNone && !CalenDateUtils::onSameDay(start, end)) { + QDateTime startMidnight = CalenDateUtils::beginningOfDay(start); + QDateTime endMidnight = CalenDateUtils::beginningOfDay(end); + + if ((start == startMidnight) && (end == endMidnight)) { + isAllDay = true; + } + } + + if (error != KErrNone) { + CEikonEnv::Static()->HandleError(error);//codescanner::eikonenvstatic + } + + return isAllDay; +} +*/ + +/*! + \brief CalenDayInfo::AlldayCount +*/ +int CalenDayInfo::AlldayCount() +{ + return iAlldayEvents.count(); +} + +/*! + \brief CalenDayInfo::TodoCount +*/ +int CalenDayInfo::TodoCount() +{ + return iTodoEvents.count(); +} + +/*! + \brief CalenDayInfo::GetLocation +*/ +void CalenDayInfo::GetLocation( + const SCalenApptInfo& aItemInfo, + int& aStartSlot, + int& aEndSlot, + int& aColumnIndex, + int& aColumns) +{ + int startIndex = SlotIndexForStartTime(aItemInfo.iStartTime); + int endIndex = SlotIndexForEndTime(aItemInfo.iEndTime); + if (endIndex == startIndex) { + endIndex++; + } + + aStartSlot = startIndex; + aEndSlot = endIndex; + + CalenSlotInterval interval; + interval.iStartSlot = startIndex; + interval.iEndSlot = endIndex; + + bool found(false); + // Scan through all allday events and see if it matches any of them + for (int i = 0; i < iAlldayEvents.count() && !found; i++) { + if (aItemInfo.iId == iAlldayEvents[i].iId) { + aColumns = iAlldayEvents.count(); + aColumnIndex = i; + found = true; + } + } + + // Scan through all regions and see if the event overlaps any region. + // If it overlaps a region, the event must be in that region. + for (int i = 0; i < iRegionList.count() && !found; i++) { + CalenTimeRegion& region = iRegionList[i]; + if (region.Overlaps(interval)) { + // Scan through all columns and look for the event + aColumns = region.iColumns.count(); + for (int j = 0; j < aColumns && !found; j++) { + if (region.iColumns[j].ContainsEvent(aItemInfo.iId)) { + aColumnIndex = j; + found = true; + } + } + // the event should be in this region if it overlaps the region + ASSERT( found ); + } + } + // the event should have been found somewhere + ASSERT( found ); +} + +/*! + \brief CalenDayInfo::GetSelectedSlot +*/ +void CalenDayInfo::GetSelectedSlot(int& aSlot, int& aRegion, int& aColumnIndex, int& aColumns) +{ + + aSlot = iSelectedSlot; + aColumnIndex = iSelectedColumn; + if (iSelectedRegion >= 0) { + aColumns = iRegionList[iSelectedRegion].iColumns.count(); + aRegion = iSelectedRegion; + } + else { + aColumns = 0; + aRegion = KErrNotFound; + } +} + +/*! + \brief CalenDayInfo::FindRegion +*/ +int CalenDayInfo::FindRegion(const CalenSlotInterval& aInterval, int aDirection) +{ + // Setup the start and end region indices for iterating + int start, end; + if (aDirection > 0) { + start = 0; + end = iRegionList.count(); + } + else { + start = iRegionList.count() - 1; + end = -1; + } + + int region = KErrNotFound; + + // Iterate over the regions, in the order given, looking for a region + // overlapping this interval + for (int i = start; i != end && region < 0; i += aDirection) { + if (iRegionList[i].Overlaps(aInterval)) { + region = i; + } + } + return region; +} + +/*! + \brief Find an event within the given interval of the current column, + searching in the given direction. +*/ +int CalenDayInfo::FindEvent(const CalenSlotInterval& aInterval, int aDirection) +{ + ASSERT( iSelectedRegion >= 0 && iSelectedRegion < iRegionList.count() ); + + CalenTimeRegion& region = iRegionList[iSelectedRegion]; + int index = KErrNotFound; + + if (iSelectedColumn < region.iColumns.count()) { + CalenTimeColumn& column = region.iColumns[iSelectedColumn]; + int start, end; + if (aDirection > 0) { + start = 0; + end = column.iEventArray.count(); + } + else { + start = column.iEventArray.count() - 1; + end = -1; + } + + // Iterate over the events in the chosen column in the order given, + // looking for an event overlapping this interval + for (int i = start; i != end && index < 0; i += aDirection) { + if (column.iEventArray[i].Overlaps(aInterval)) { + index = i; + } + } + } + return index; +} + +/*! + \brief CalenDayInfo::IsEventSelected +*/ +bool CalenDayInfo::IsEventSelected() const +{ + bool selected(false); + if (iSelectedAlldayEvent >= 0) { + selected = true; + } + else + if (iSelectedRegion >= 0 && iSelectedColumn < iRegionList[iSelectedRegion].iColumns.count() + && iSelectedColumnEventIndex >= 0) { + selected = true; + } + else + if (IsExtraSlot(iSelectedSlot) && iSelectedSlot - iFirstUntimedSlot + >= iEmptyUntimedSlots) { + selected = true; + } + else { + // if no event is selected, the selection slot must be a hour starting slot or an extra slot + ASSERT( IsHourStartSlot( iSelectedSlot ) || IsExtraSlot( iSelectedSlot ) ); + selected = false; + } + return selected; +} + +/*! + \brief CalenDayInfo::IsMultipleEventsSelected +*/ +bool CalenDayInfo::IsMultipleEventsSelected() const +{ + bool isMultiple(false); + if (iSelectedAlldayEvent >= 0) { + // If an allday event is selected, disregard the value of + // iSelectedSlot + isMultiple = false; + } + else + if (IsExtraSlot(iSelectedSlot)) { + int index = iSelectedSlot - iFirstUntimedSlot - iEmptyUntimedSlots; + isMultiple = (index == 0) && iTodoEvents.count() > 1; + } + return isMultiple; +} + +/*! + \brief CalenDayInfo::IsAlldayEventSelected +*/ +bool CalenDayInfo::IsAlldayEventSelected() const +{ + bool selected(false); + if (iSelectedAlldayEvent >= 0) { + ASSERT( iSelectedAlldayEvent < iAlldayEvents.count() ); + selected = true; + } + return selected; +} + +/*! + \brief CalenDayInfo::UntimedEvent +*/ +TCalenInstanceId CalenDayInfo::UntimedEvent(int aIndex) +{ + TCalenInstanceId id; + if (iTodoEvents.count() > 0 && aIndex == 0) { + id = iTodoEvents[0]; + } + else { + // If we have one or more todo items, the first slot is used for them + // (but not more than one slot) + if (iTodoEvents.count() > 0) { + aIndex--; + } + + if (aIndex >= 0 && aIndex < iUntimedEvents.count()) { + id = iUntimedEvents[aIndex]; + } + else { + // should not happen + User::Invariant(); + } + } + + return id; +} + +/*! + \brief CalenDayInfo::AlldayEvent +*/ +const CalenTimedEventInfo& CalenDayInfo::AlldayEvent(int aIndex) +{ + ASSERT( aIndex >= 0 && aIndex < iAlldayEvents.count() ); + return iAlldayEvents[aIndex]; +} + +/*! + \brief CalenDayInfo::SelectedEvent +*/ +TCalenInstanceId CalenDayInfo::SelectedEvent() +{ + TCalenInstanceId id; + if (iSelectedAlldayEvent >= 0) { + ASSERT( iSelectedAlldayEvent < iAlldayEvents.count() ); + id = iAlldayEvents[iSelectedAlldayEvent].iId; + } + else + if (iSelectedRegion >= 0) { + ASSERT( iSelectedRegion < iRegionList.count() ); + + CalenTimeRegion& region = iRegionList[iSelectedRegion]; + if (iSelectedColumn < region.iColumns.count()) { + CalenTimeColumn& column = region.iColumns[iSelectedColumn]; + if (iSelectedColumnEventIndex >= 0 && iSelectedColumnEventIndex + < column.iEventArray.count()) { + CalenTimedEventInfo& info = column.iEventArray[iSelectedColumnEventIndex]; + id = info.iId; + } + else { + // should not happen, no event selected in the column + User::Invariant(); + } + } + else { + // should not happen, the empty column was selected + User::Invariant(); + } + } + else + if (IsExtraSlot(iSelectedSlot)) { + int index = iSelectedSlot - iFirstUntimedSlot - iEmptyUntimedSlots; + id = UntimedEvent(index); + } + else { + // should not happen + User::Invariant(); + } + + return id; +} + +/*! + \brief CalenDayInfo::SelectEvent + Return KErrNotFound if not found, otherwise KErrNone +*/ +int CalenDayInfo::SelectEvent(const TCalenInstanceId& aId) +{ + // Id can be of allday event, untimed event or other events + + // Look for this event id in all event data structures and set + // the state accordingly if it was found + + for (int i(0); i < iAlldayEvents.count(); i++) { + TCalenInstanceId id = iAlldayEvents[i].iId; + if (id == aId) { + iSelectedAlldayEvent = i; + iSelectedRegion = KErrNotFound; + return KErrNone; + } + } + + for (int i(0); i < iTodoEvents.count(); i++) { + TCalenInstanceId id = iTodoEvents[i]; + if (id == aId) { + iSelectedAlldayEvent = KErrNotFound; + iSelectedRegion = KErrNotFound; + iSelectedSlot = iFirstUntimedSlot + iEmptyUntimedSlots; + return KErrNone; + } + } + + for (int i(0); i < iUntimedEvents.count(); i++) { + TCalenInstanceId id = iUntimedEvents[i]; + if (id == aId) { + iSelectedAlldayEvent = KErrNotFound; + iSelectedRegion = KErrNotFound; + iSelectedSlot = iFirstUntimedSlot + iEmptyUntimedSlots + i; + if (iTodoEvents.count() > 0) { + iSelectedSlot++; + } + return KErrNone; + } + } + + for (int i(0); i < iRegionList.count(); i++) { + CalenTimeRegion& region = iRegionList[i]; + for (int col(0); col < region.iColumns.count(); col++) { + for (int ind(0); ind < region.iColumns[col].iEventArray.count(); ind++) { + if (region.iColumns[col].iEventArray[ind].iId == aId) { + iSelectedAlldayEvent = KErrNotFound; + iSelectedRegion = i; + iSelectedColumn = col; + iSelectedColumnEventIndex = ind; + SetSelectionInEvent(EMoveDirectionDown); + return KErrNone; + } + } + } + } + + return KErrNotFound; +} + +/*! + \brief CalenDayInfo::EnterRegionFromBelow +*/ +void CalenDayInfo::EnterRegionFromBelow() +{ + ASSERT( iSelectedRegion >= 0 && iSelectedRegion < iRegionList.count() ); + iSelectedColumn = KErrNotFound; + CalenTimeRegion& region = iRegionList[iSelectedRegion]; + int latestEnd = region.iStartSlot; + // Look for the column with the latest end + for (int i = 0; i < region.iColumns.count(); i++) { + CalenTimeColumn& column = region.iColumns[i]; + ASSERT( column.iEventArray.count()> 0 ); + if (column.iEndSlot > latestEnd) { + // found a column with an event touching the end of the region + latestEnd = column.iEndSlot; + iSelectedColumn = i; + iSelectedColumnEventIndex = column.iEventArray.count() - 1; + SetSelectionInEvent(EMoveDirectionUp); + } + } + ASSERT( iSelectedColumn >= 0 ); +} + +/*! + \brief CalenDayInfo::EnterRegionFromAbove +*/ +void CalenDayInfo::EnterRegionFromAbove() +{ + ASSERT( iSelectedRegion >= 0 && iSelectedRegion < iRegionList.count() ); + iSelectedColumn = KErrNotFound; + CalenTimeRegion& region = iRegionList[iSelectedRegion]; + int earliestStart = region.iEndSlot; + // Look for the column with the earliest start + for (int i = 0; i < region.iColumns.count(); i++) { + CalenTimeColumn& column = region.iColumns[i]; + ASSERT( column.iEventArray.count()> 0 ); + if (column.iStartSlot < earliestStart) { + // found a column with an event + earliestStart = column.iStartSlot; + iSelectedColumn = i; + iSelectedColumnEventIndex = 0; + SetSelectionInEvent(EMoveDirectionDown); + } + } + ASSERT( iSelectedColumn >= 0 ); +} + +/*! + \brief CalenDayInfo::NextFocusArea + Determines how large area to scan for new events/regions when moving in + the given direction. If no events are found in this area, focus an + empty slot instead +*/ +CalenSlotInterval CalenDayInfo::NextFocusArea(const CalenSlotInterval& aInterval, int aDirection) +{ + // NOTE: the comments are written with the visual layout in mind. + // upwards == up in the display, towards earlier times + // downwards == down in the display, towards later times + CalenSlotInterval target; + target.iEndSlot = 0; + target.iStartSlot = 0; + + if (IsExtraSlot(aInterval.iStartSlot)) { + // Special case logic for moving within the extra slots. + + // The index within the extra slot area + int extraIndex = aInterval.iStartSlot - iFirstUntimedSlot; + // Generally, move just one slot at a time in this area + int newIndex = extraIndex + aDirection; + + if (newIndex < iEmptyUntimedSlots) { + // Moved upwards past the first slot, return + // the whole last hour before the untimed slot area + target.iEndSlot = iFirstUntimedSlot; + target.iStartSlot = target.iEndSlot - iSlotsInHour; + } + else + if (newIndex >= iUntimedSlotCount) { + // Moved downwards past the last untimed slot, return + // the whole first hour after the untimed slot area + target.iStartSlot = iFirstUntimedSlot + iUntimedSlotCount; + target.iEndSlot = target.iStartSlot + iSlotsInHour; + } + else { + // Moved normally within the untimed slot area + target.iStartSlot = aInterval.iStartSlot + aDirection; + target.iEndSlot = target.iStartSlot + 1; + } + return target; + } + + // Helper interval for the whole untimed area + CalenSlotInterval untimedInterval; + untimedInterval.iStartSlot = iFirstUntimedSlot; + untimedInterval.iEndSlot = untimedInterval.iStartSlot + iUntimedSlotCount; + + if (aDirection < 0) { + // Moving upwards + // Create a target interval of one hour upwards + target.iEndSlot = aInterval.iStartSlot; + target.iStartSlot = aInterval.iStartSlot - iSlotsInHour; + + if (iUntimedSlotCount > 0 && untimedInterval.Overlaps(target)) { + // The target interval overlaps the untimed area + if (iUntimedSlotCount > iEmptyUntimedSlots) { + // Make the interval start at the last untimed slot + target.iStartSlot = untimedInterval.iEndSlot - 1; + } + else { + // Untimed area containing no actual events. + // Include one whole hour before the untimed area. + target.iStartSlot = iFirstUntimedSlot - iSlotsInHour; + } + return target; + } + + // Round the start slot upwards to an even hour + target.iStartSlot = RoundHourUp(target.iStartSlot); + } + else { + // Moving downwards + // Create a target interval of one hour downwards + target.iStartSlot = aInterval.iEndSlot; + target.iEndSlot = aInterval.iEndSlot + iSlotsInHour; + + if (iUntimedSlotCount > 0 && untimedInterval.Overlaps(target)) { + // The target interval overlaps the untimed area + + // Assumption: There can't be any regions before the untimed area + if (iUntimedSlotCount > iEmptyUntimedSlots) { + // Make the interval end at the first untimed slot containing + // an event + target.iStartSlot = untimedInterval.iStartSlot + iEmptyUntimedSlots; + target.iEndSlot = target.iStartSlot + 1; + } + else { + // Untimed area containing no actual events. + // Include one whole hour after the untimed area. + target.iStartSlot = untimedInterval.iStartSlot + iUntimedSlotCount; + target.iEndSlot = target.iStartSlot + iSlotsInHour; + } + return target; + } + + target.iEndSlot = RoundHourDown(target.iEndSlot); + } + + return target; +} + +/*! + \brief CalenDayInfo::NextEmptyFocusSlot + If no events are found in an empty area scanned, focus this slot instead +*/ +int CalenDayInfo::NextEmptyFocusSlot(const CalenSlotInterval& aInterval, int aDirection) +{ + // NOTE: the comments are written with the visual layout in mind. + // upwards == up in the display, towards earlier times + // downwards == down in the display, towards later times + + int target(0); + + // If the next focus area logic says we should go to an untimed slot, + // skip the rest of this method + CalenSlotInterval testInterval = NextFocusArea(aInterval, aDirection); + if (IsExtraSlot(testInterval.iStartSlot)) { + target = testInterval.iStartSlot; + } + else { + if (aDirection < 0) { + // Moving upwards, target slot is the start of the area returned by + // NextFocusArea. This always is an even hour. + target = testInterval.iStartSlot; + ASSERT( IsHourStartSlot( target ) ); + } + else { + target = testInterval.iStartSlot; + if (!IsHourStartSlot(target)) { + // If the interval doesn't start on an even hour, round downwards. + target = RoundHourDown(target); + } + } + } + + return target; +} + +/*! + \brief CalenDayInfo::EmptySelectionInterval + Create an interval representation of the current focus area +*/ +CalenSlotInterval CalenDayInfo::EmptySelectionInterval() +{ + CalenSlotInterval target; + target.iEndSlot = 0; + target.iStartSlot = 0; + + if (IsExtraSlot(iSelectedSlot)) { + // Return an interval consisting of one single slot + target.iStartSlot = iSelectedSlot; + target.iEndSlot = target.iStartSlot + 1; + } + else { + // Round the start slot to an even hour if it isn't. + // NOTE: This actually updates the selection state! + // Only call this method if no event actually is selected. + if (!IsHourStartSlot(iSelectedSlot)) { + iSelectedSlot = RoundHourUp(iSelectedSlot); + } + target.iStartSlot = iSelectedSlot; + target.iEndSlot = iSelectedSlot + iSlotsInHour; + } + + return target; +} + +/*! + \brief CalenDayInfo::SelectedInterval +*/ +CalenSlotInterval CalenDayInfo::SelectedInterval() +{ + CalenSlotInterval selection; + selection.iStartSlot = selection.iEndSlot = 0; + + if (iSelectedAlldayEvent >= 0) { + selection.iStartSlot = 0; + selection.iEndSlot = iSlotsInHour * KCalenHoursInDay + iUntimedSlotCount; + } + else + if (iSelectedRegion >= 0) { + + CalenTimeRegion& region = iRegionList[iSelectedRegion]; + if (iSelectedColumn < region.iColumns.count()) { + CalenTimeColumn& column = region.iColumns[iSelectedColumn]; + if (iSelectedColumnEventIndex >= 0 && iSelectedColumnEventIndex + < column.iEventArray.count()) { + CalenTimedEventInfo& info = column.iEventArray[iSelectedColumnEventIndex]; + // gets only the CalenSlotInterval part from the CalenTimedEventInfo struct + selection = info; + } + } + } + + if (selection.IsEmpty()) { + // No selection was set in the cases above, no event is selected, thus + // use the empty area selection interval instead. + selection = EmptySelectionInterval(); + } + return selection; +} + +/*! + \brief CalenDayInfo::SetSelectionInRegion + Sets selection within a region +*/ +bool CalenDayInfo::SetSelectionInRegion(int aRegion, int aColumn, int aSlot) +{ + bool selected(false); + StoreOrigSelection(); + //validate given values + if (aRegion >= 0 && aRegion < iRegionList.count()) {//ASSERT( iSelectedRegion >= 0 && iSelectedRegion < iRegionList.count() ); + CalenSlotInterval interval; + //TODO: round aSlot hour to full hour down???? + interval.iStartSlot = aSlot; + interval.iEndSlot = interval.iStartSlot + 1; + + CalenTimeRegion& region = iRegionList[aRegion]; + if (region.Overlaps(interval)) { + if (aColumn >= 0 && aColumn < region.iColumns.count()) { + bool eventFound(false); + CalenTimeColumn& column = region.iColumns[aColumn]; + if (column.Overlaps(interval)) { + ASSERT( column.iEventArray.count()> 0 ); + for (int i = 0; i < column.iEventArray.count(); i++) { + CalenTimedEventInfo& event = column.iEventArray[i]; + if (event.Overlaps(interval)) { + iSelectedColumnEventIndex = i; + + iSelectedAlldayEvent = KErrNotFound; + iSelectedRegion = aRegion; + iSelectedColumn = aColumn; + iSelectedSlot = aSlot; + selected = true; + eventFound = true; + break; + } + + } + } + + if (!eventFound) { + iSelectedAlldayEvent = KErrNotFound; + iSelectedRegion = aRegion; + iSelectedColumn = aColumn; + iSelectedSlot = aSlot; + iSelectedColumnEventIndex = KErrNotFound; + selected = true; + } + } + else + if (aColumn == iRegionList[aRegion].iColumns.count()) {//empty selection on right selected + iSelectedAlldayEvent = KErrNotFound; + iSelectedRegion = aRegion; + iSelectedColumn = aColumn; + iSelectedSlot = aSlot; + iSelectedColumnEventIndex = KErrNotFound; + selected = true; + } + } + } + + return selected; +} + +/*! + \brief CalenDayInfo::MoveOutFromRegion +*/ +void CalenDayInfo::MoveOutFromRegion(int aDirection) +{ + CalenTimeRegion& region = iRegionList[iSelectedRegion]; + CalenSlotInterval targetInterval = NextFocusArea(region, aDirection); + int next = iSelectedRegion + aDirection; + // Check what the next region would be and if we should move into that + // or into an empty area + if (next >= 0 && next < iRegionList.count()) { + if (iRegionList[next].Overlaps(targetInterval)) { + iSelectedRegion = next; + if (aDirection < 0) { + EnterRegionFromBelow(); + } + else { + EnterRegionFromAbove(); + } + } + else { + iSelectedRegion = KErrNotFound; + iSelectedSlot = NextEmptyFocusSlot(region, aDirection); + } + } + else { + iSelectedRegion = KErrNotFound; + iSelectedSlot = NextEmptyFocusSlot(region, aDirection); + } +} + +/*! + \brief CalenDayInfo::MoveInColumn +*/ +void CalenDayInfo::MoveInColumn(int aDirection) +{ + CalenTimeRegion& region = iRegionList[iSelectedRegion]; + if (iSelectedColumn < region.iColumns.count()) { + CalenTimeColumn& column = region.iColumns[iSelectedColumn]; + if (iSelectedColumnEventIndex >= 0) { + // We currently have an event in a column selected + CalenSlotInterval curInterval = column.iEventArray[iSelectedColumnEventIndex]; + CalenSlotInterval targetInterval = NextFocusArea(curInterval, aDirection); + + int next = iSelectedColumnEventIndex + aDirection; + // Check if the target interval overlaps the next event in this column + if (next >= 0 && next < column.iEventArray.count()) { + if (column.iEventArray[next].Overlaps(targetInterval)) { + iSelectedColumnEventIndex = next; + SetSelectionInEvent(aDirection); + } + else { + iSelectedColumnEventIndex = KErrNotFound; + iSelectedSlot = NextEmptyFocusSlot(curInterval, aDirection); + } + } + else { + // There's no next event in this column, focus an empty area instead. + iSelectedColumnEventIndex = KErrNotFound; + iSelectedSlot = NextEmptyFocusSlot(curInterval, aDirection); + } + } + else { + // No event selected in the current column, find the target interval + // and check if there's any event there + CalenSlotInterval curInterval = EmptySelectionInterval(); + CalenSlotInterval targetInterval = NextFocusArea(curInterval, aDirection); + iSelectedColumnEventIndex = FindEvent(targetInterval, aDirection); + if (iSelectedColumnEventIndex >= 0) { + SetSelectionInEvent(aDirection); + } + else { + iSelectedSlot = NextEmptyFocusSlot(curInterval, aDirection); + } + } + + // If the new selection lies outside of the region, move out from the region. + CalenSlotInterval selection = SelectedInterval(); + if (selection.iStartSlot < region.iStartSlot || selection.iEndSlot > region.iEndSlot) { + MoveOutFromRegion(aDirection); + } + + } + else { + // The empty column was selected, just move up/down in that column + iSelectedSlot = NextEmptyFocusSlot(EmptySelectionInterval(), aDirection); + + // When moving in the empty column, move out from the region only if + // the selection moved completely out from the region. + CalenSlotInterval selection = SelectedInterval(); + if (!selection.Overlaps(region)) { + // The target selection is completely outside of the current region + int next = iSelectedRegion + aDirection; + if (next >= 0 && next < iRegionList.count() && iRegionList[next].Overlaps(selection)) { + // The target selection overlaps the next region, move into that, + // stay within the rightmost empty column + iSelectedRegion = next; + iSelectedColumn = iRegionList[next].iColumns.count(); + iSelectedColumnEventIndex = KErrNotFound; + } + else { + // Move out from the current region + iSelectedRegion = KErrNotFound; + iSelectedColumn = KErrNotFound; + iSelectedColumnEventIndex = KErrNotFound; + // iSelectedSlot was update above, keep the same value + } + } + + } + +} + +/*! + \brief CalenDayInfo::MoveInAlldayEvent +*/ +bool CalenDayInfo::MoveInAlldayEvent(TScrollDirection aDirection) +{ + ASSERT( iSelectedAlldayEvent >= 0 ); + bool moved(true); + switch (aDirection) { + case EScrollUp: { + // don't do anything + } + break; + case EScrollDown: { + // don't do anything + } + break; + case EScrollLeft: { + if (iSelectedAlldayEvent > 0) { + // there are more allday events to the left, select next + iSelectedAlldayEvent--; + } + else { + // move to previous day + moved = false; + } + } + break; + case EScrollRight: { + if (iSelectedAlldayEvent < iAlldayEvents.count() - 1) { + // there are more allday events to the right, select next + iSelectedAlldayEvent++; + } + else { + iSelectedAlldayEvent = KErrNotFound; + // find a region to select + if (iSelectedRegion >= 0) { + // keep using the old selection state + } + else { + // find a new suitable selection + + // if iSelectedSlot was moved to the empty untimed slot area, + // move it down to a real slot + + if (iSelectedSlot >= iFirstUntimedSlot && iSelectedSlot < iFirstUntimedSlot + + iEmptyUntimedSlots) { + iSelectedSlot = iFirstUntimedSlot + iEmptyUntimedSlots; + } + + CalenSlotInterval interval = EmptySelectionInterval(); + + iSelectedRegion = FindRegion(interval, EMoveDirectionDown); + int firstRegion = iSelectedRegion; + bool found(false); + // Iterate over all regions overlapping this interval, see + // if any of them has events in this column + while (iSelectedRegion >= 0 && iSelectedRegion < iRegionList.count() + && iRegionList[iSelectedRegion].Overlaps(interval) && !found) { + + ASSERT( iSelectedRegion < iRegionList.count() ); + CalenTimeRegion& region = iRegionList[iSelectedRegion]; + + ASSERT( region.iColumns.count()> 0 ); + iSelectedColumn = 0; + CalenTimeColumn& column = region.iColumns[iSelectedColumn]; + + iSelectedColumnEventIndex = FindEvent(interval, EMoveDirectionDown); + if (iSelectedColumnEventIndex >= 0) { + ASSERT( iSelectedColumnEventIndex < column.iEventArray.count() ); + // Keep using the old selected slot also here, just + // update it to make sure it's within the actual event + UpdateSelectionInEvent(); + found = true; + } + else { + // Check the next region + iSelectedRegion++; + } + } + + if (!found) { + iSelectedRegion = firstRegion; + iSelectedColumn = 0; + iSelectedSlot = interval.iStartSlot; + } + + } + } + } + break; + default: + // Do nothing + break; + } + + return moved; +} + +/*! + \brief CalenDayInfo::MoveBetweenColumns +*/ +void CalenDayInfo::MoveBetweenColumns(TScrollDirection aDirection) +{ + // Moving to another column + CalenSlotInterval selection = SelectedInterval(); + if (IsEventSelected()) { + // If moving from an event, just use the selected + // slot pos within the event, not the whole event + // interval. + selection.iStartSlot = iSelectedSlot; + selection.iEndSlot = selection.iStartSlot + iSlotsInHour; + // Crop the selection to be within the event + selection.Intersect(SelectedInterval()); + } + + switch (aDirection) { + case EScrollLeft: { + iSelectedColumn--; + break; + } + case EScrollRight: { + iSelectedColumn++; + break; + } + default: + // Do nothing + break; + } + + // First try finding events exactly in the selection area + iSelectedColumnEventIndex = FindEvent(selection, EMoveDirectionDown); + if (iSelectedColumnEventIndex >= 0) { + // An event was found in the given interval + // Keep using the old selection position, just update it to make + // sure it's within the event + UpdateSelectionInEvent(); + } + else { + // No event found in the interval + + // Expand the interval to even hour endings + selection.iStartSlot = RoundHourUp(selection.iStartSlot); + selection.iEndSlot = RoundHourDown(selection.iEndSlot); + CalenTimeRegion& region = iRegionList[iSelectedRegion]; + // Crop the selection to the current region + selection.Intersect(region); + + // Try again with the possibly larger interval + iSelectedColumnEventIndex = FindEvent(selection, EMoveDirectionDown); + if (iSelectedColumnEventIndex >= 0) { + // An event was found in the given interval + // Keep using the old selection position, just update it to make + // sure it's within the event + UpdateSelectionInEvent(); + } + else { + // Still no events found. Select an empty interval if possible. + + if (!IsHourStartSlot(selection.iStartSlot)) { + // The starting slot isn't a hour start slot. Rounding directly + // would move the interval outside of the region. See if we can + // round the starting slot down instead and still be within + // the region. + int start = RoundHourDown(selection.iStartSlot); + if (start + iSlotsInHour <= region.iEndSlot) { + // Ok, an empty selection fits within the region. + iSelectedSlot = start; + } + } + else + if (!IsHourStartSlot(selection.iEndSlot)) { + // The ending slot isn't a hour start slot. Rounding directly + // could move the interval outside of the region. See if we can + // round the upwards instead and still be within + // the region. + int start = RoundHourUp(selection.iEndSlot - iSlotsInHour); + if (start >= region.iStartSlot) { + // Ok, an empty selection fits within the region. + iSelectedSlot = start; + } + } + + // Make sure the selected interval really is a valid + // empty interval selection (this forces rounding if needed) + selection = EmptySelectionInterval(); + + // Check the final target interval once more. + iSelectedColumnEventIndex = FindEvent(selection, EMoveDirectionDown); + if (iSelectedColumnEventIndex >= 0) { + // An event was found in the given interval + UpdateSelectionInEvent(); + } + else { + // No even found, use the empty selection + + // If not within the region, move out + if (selection.iStartSlot < region.iStartSlot) { + MoveOutFromRegion(EMoveDirectionUp); + } + else + if (selection.iEndSlot > region.iEndSlot) { + MoveOutFromRegion(EMoveDirectionDown); + } + } + } + + } + +} + +/*! + \brief CalenDayInfo::MoveInRegion +*/ +bool CalenDayInfo::MoveInRegion(TScrollDirection aDirection) +{ + ASSERT( iSelectedAlldayEvent < 0 && iSelectedRegion >= 0 ); + bool moved(true); + switch (aDirection) { + case EScrollUp: { + MoveInColumn(EMoveDirectionUp); + } + break; + case EScrollDown: { + MoveInColumn(EMoveDirectionDown); + } + break; + + case EScrollLeft: { + ASSERT( iSelectedRegion < iRegionList.count() ); + CalenTimeRegion& region = iRegionList[iSelectedRegion]; + ASSERT( iSelectedColumn >= 0 && iSelectedColumn <= region.iColumns.count() ); + if (iSelectedColumn == 0) { + if (iAlldayEvents.count() > 0) { + // remember the last selection state + iSelectedAlldayEvent = iAlldayEvents.count() - 1; + } + else { + // move to previous day + moved = false; + } + } + else { + MoveBetweenColumns(aDirection); + } + } + break; + + case EScrollRight: { + ASSERT( iSelectedRegion < iRegionList.count() ); + CalenTimeRegion& region = iRegionList[iSelectedRegion]; + if (iSelectedColumn < region.iColumns.count() - 1) { + MoveBetweenColumns(aDirection); + } + else + if (iSelectedColumn == region.iColumns.count() - 1) { + // In the last column, moving to the empty column + iSelectedColumn++; + iSelectedColumnEventIndex = KErrNotFound; + + // Round the selection to an empty interval + EmptySelectionInterval(); + } + else { + // in the last, empty column + // move to next day + moved = false; + } + } + break; + + default: + // Do nothing + break; + } + + return moved; +} + +/*! + \brief CalenDayInfo::MoveInEmptyArea +*/ +bool CalenDayInfo::MoveInEmptyArea(TScrollDirection aDirection) +{ + ASSERT( iSelectedAlldayEvent < 0 && iSelectedRegion < 0 ); + bool moved(true); + switch (aDirection) { + case EScrollUp: { + CalenSlotInterval curInterval = EmptySelectionInterval(); + CalenSlotInterval targetInterval = NextFocusArea(curInterval, EMoveDirectionUp); + iSelectedRegion = FindRegion(targetInterval, EMoveDirectionUp); + if (iSelectedRegion >= 0) { + EnterRegionFromBelow(); + } + else { + iSelectedSlot = NextEmptyFocusSlot(curInterval, EMoveDirectionUp); + } + + } + break; + case EScrollDown: { + CalenSlotInterval curInterval = EmptySelectionInterval(); + CalenSlotInterval targetInterval = NextFocusArea(curInterval, EMoveDirectionDown); + iSelectedRegion = FindRegion(targetInterval, EMoveDirectionDown); + if (iSelectedRegion >= 0) { + EnterRegionFromAbove(); + } + else { + iSelectedSlot = NextEmptyFocusSlot(curInterval, EMoveDirectionDown); + } + } + break; + case EScrollLeft: { + if (iAlldayEvents.count() > 0) { + iSelectedAlldayEvent = iAlldayEvents.count() - 1; + } + else { + // move to previous day + moved = false; + } + } + break; + case EScrollRight: { + // move to next day + moved = false; + } + break; + default: + // Do nothing + break; + } + + return moved; +} + +/*! + \brief CalenDayInfo::MoveSelection +*/ +bool CalenDayInfo::MoveSelection(TScrollDirection aDirection) +{ + bool moved(true); + StoreOrigSelection(); + if (iSelectedAlldayEvent >= 0) { + // focused on an allday event + moved = MoveInAlldayEvent(aDirection); + } + else + if (iSelectedRegion >= 0) { + // focused on some event region + moved = MoveInRegion(aDirection); + } + else { + // focused on an empty, plain area + moved = MoveInEmptyArea(aDirection); + } + if (!ValidateSelection()) { + moved = false; + } + return moved; +} + +/*! + \brief CalenDayInfo::MoveSelectionInEvent +*/ +void CalenDayInfo::MoveSelectionInEvent(TScrollDirection aDirection) +{ + ASSERT( IsEventSelected() ); + + switch (aDirection) { + case EScrollUp: { + iSelectedSlot -= KFSCalSlotsInHour; + } + break; + case EScrollDown: { + iSelectedSlot += KFSCalSlotsInHour; + } + break; + + default: + // Do nothing + break; + } + + UpdateSelectionInEvent(); + + if (iSelectedAlldayEvent >= 0) { + // if an allday event is selected, invalidate + // the old region/event selection + iSelectedRegion = KErrNotFound; + } +} + +/*! + \brief CalenDayInfo::UpdateSelectionInEvent +*/ +void CalenDayInfo::UpdateSelectionInEvent() +{ + ASSERT( IsEventSelected() ); + CalenSlotInterval event = SelectedInterval(); + + if (iSelectedSlot < event.iStartSlot) { + iSelectedSlot = event.iStartSlot; + } + if (iSelectedSlot >= event.iEndSlot) { + iSelectedSlot = event.iEndSlot - 1; + } + +} + +/*! + \brief CalenDayInfo::SetSelectionInEvent +*/ +void CalenDayInfo::SetSelectionInEvent(int aDirection) +{ + CalenSlotInterval event = SelectedInterval(); + if (aDirection > 0) { + iSelectedSlot = event.iStartSlot; + } + else { + iSelectedSlot = event.iEndSlot - 1; + } +} + +/*! + \brief CalenDayInfo::StoreOrigSelection +*/ +void CalenDayInfo::StoreOrigSelection() +{ + iOrigSelectedAlldayEvent = iSelectedAlldayEvent; + iOrigSelectedRegion = iSelectedRegion; + iOrigSelectedColumn = iSelectedColumn; + iOrigSelectedSlot = iSelectedSlot; + iOrigSelectedColumnEventIndex = iSelectedColumnEventIndex; +} + +/*! + \brief CalenDayInfo::ValidateSelection +*/ +bool CalenDayInfo::ValidateSelection() +{ + bool validate(true); + if (iSelectedSlot < 0 || iSelectedSlot >= iSlotsInHour * KCalenHoursInDay + iUntimedSlotCount) { + // tried to move outside of the day + // revert to the original coords + iSelectedAlldayEvent = iOrigSelectedAlldayEvent; + iSelectedRegion = iOrigSelectedRegion; + iSelectedColumn = iOrigSelectedColumn; + iSelectedSlot = iOrigSelectedSlot; + iSelectedColumnEventIndex = iOrigSelectedColumnEventIndex; + validate = false; + } + return validate; +} + +/*! + \brief CalenDayInfo::SelectSlot +*/ +void CalenDayInfo::SelectSlot(int aSlot) +{ + // Check for special case: empty untimed slot is selected + if (aSlot >= iFirstUntimedSlot && aSlot < iFirstUntimedSlot + iEmptyUntimedSlots) { + aSlot = iFirstUntimedSlot + iEmptyUntimedSlots; + } + + iSelectedAlldayEvent = KErrNotFound; + iSelectedSlot = aSlot; + CalenSlotInterval interval = EmptySelectionInterval(); + iSelectedRegion = FindRegion(interval, EMoveDirectionDown); + if (iSelectedRegion >= 0) { + CalenTimeRegion& region = iRegionList[iSelectedRegion]; + int regCount(region.iColumns.count()); + for (int i = 0; i < regCount; i++) { + CalenTimeColumn& column = region.iColumns[i]; + int colCount(column.iEventArray.count()); + for (int j = 0; j < colCount; j++) { + if (column.iEventArray[j].Overlaps(interval)) { + iSelectedColumn = i; + iSelectedColumnEventIndex = j; + iSelectedSlot = aSlot; + UpdateSelectionInEvent(); + return; + } + } + } + // Regions can have empty areas where there aren't any events, + // due to rounding of the ends of the region to whole hours. + // A region cannot, however, have a empty complete whole hour. + // Therefore, this cannot occur. + User::Invariant(); + } +} + +/*! + \brief CalenDayInfo::RegionList +*/ +const QList& CalenDayInfo::RegionList() const +{ + return iRegionList; +} + +/*! + \brief CalenDayInfo::GetEventIntervals +*/ +void CalenDayInfo::GetEventIntervals(QList& aArray) const +{ + int regCount(iRegionList.count()); + for (int i = 0; i < regCount; i++) { + const CalenTimeRegion& region = iRegionList[i]; + for (int j = 0; j < region.iIntervals.count(); j++) { + aArray.append(region.iIntervals[j]); + } + } +} + +/*! + \brief CalenDayInfo::InsertUntimedEventL +*/ +/* +void CalenDayInfo::InsertUntimedEventL(const CCalInstance& aInstance) +{ + if (CalenAgendaUtils::IsTimedEntryL(aInstance.Entry().EntryTypeL())) { + // timed entry added as untimed event + User::Invariant(); + } + + TCalenInstanceId id = TCalenInstanceId::CreateL(aInstance); + InsertUntimedEvent(aInstance.Entry().EntryTypeL(), id); +} +*/ + +/*! + \brief CalenDayInfo::InsertUntimedEvent +*/ +void CalenDayInfo::InsertUntimedEvent(AgendaEntry::Type aType, const TCalenInstanceId& aId) +{ + if (aType == AgendaEntry::TypeTodo) { + iTodoEvents.append(aId); + } + else { + iUntimedEvents.append(aId); + } +} + +/*! + \brief CalenDayInfo::SuggestedUntimedSlotPos +*/ +int CalenDayInfo::SuggestedUntimedSlotPos() +{ + int slot = KFSCalStartingHour * iSlotsInHour; + if (iRegionList.count() > 0) { + CalenTimeRegion& region = iRegionList[0]; + if (region.iStartSlot < slot) { + slot = RoundHourUp(region.iStartSlot); + } + } + return slot; +} + +/*! + \brief CalenDayInfo::NeededUntimedSlotCount +*/ +int CalenDayInfo::NeededUntimedSlotCount() +{ + int count = iUntimedEvents.count(); + if (iTodoEvents.count() > 0) { + count++; + } + return count; +} + +/*! + \brief CalenDayInfo::NeededUntimedSlotCount +*/ +int CalenDayInfo::UpdateUntimedPos(int aSlot, int aUntimedCount) +{ + int newValue = NeededUntimedSlotCount(); + + // If this method is called many times, first undo the previous modifications + int regCount(iRegionList.count()); + for (int i = 0; i < regCount; i++) { + iRegionList[i].AddOffset(-iUntimedSlotCount, iFirstUntimedSlot); + } + if (iSelectedSlot >= iFirstUntimedSlot) { + iSelectedSlot -= iUntimedSlotCount; + } + + // Reset the untimed slot count + iUntimedSlotCount = 0; + + // Get the default values + iFirstUntimedSlot = SuggestedUntimedSlotPos(); + iUntimedSlotCount = newValue; + + // If parameters were given, use them instead of the defaults + if (aSlot >= 0) { + ASSERT( aSlot <= iFirstUntimedSlot ); + ASSERT( iUntimedSlotCount <= aUntimedCount ); + + iFirstUntimedSlot = aSlot; + iUntimedSlotCount = aUntimedCount; + } + + iEmptyUntimedSlots = iUntimedSlotCount - NeededUntimedSlotCount(); + + // Add the new offset to all regions and update the selected slot + regCount = iRegionList.count(); + for (int i = 0; i < regCount; i++) { + iRegionList[i].AddOffset(iUntimedSlotCount, iFirstUntimedSlot); + } + if (iSelectedSlot >= iFirstUntimedSlot) { + iSelectedSlot += iUntimedSlotCount; + } + int eventCount(iAlldayEvents.count()); + for (int i = 0; i < eventCount; i++) { + iAlldayEvents[i].iEndSlot = iSlotsInHour * KCalenHoursInDay + iUntimedSlotCount; + } + + // Do rounding of the end of the last region. This should be done when no + // more events will be added, but there's no real harm if new events are + // added after this. + if (iRegionList.count() > 0) { + // Round the end of the last region down + CalenTimeRegion& lastRegion = iRegionList[iRegionList.count() - 1]; + lastRegion.iEndSlot = RoundHourDown(lastRegion.iEndSlot); + } + + return iFirstUntimedSlot; +} + +/*! + \brief Returns the index of the first occupied slot +*/ +int CalenDayInfo::FirstOccupiedSlot() +{ + + int firstNonemptySlot(KErrNotFound); + + if (iUntimedSlotCount > 0) { + firstNonemptySlot = iFirstUntimedSlot; + } + else { + if (iRegionList.count() > 0) { + CalenTimeRegion& region = iRegionList[0]; + firstNonemptySlot = region.iStartSlot; + } + } + + return firstNonemptySlot; +} + +/*! + \brief Returns the index of the last occupied slot +*/ +int CalenDayInfo::LastOccupiedSlot() +{ + int lastNonemptySlot(KErrNotFound); + if (iRegionList.count() > 0) { + int lastIndex = iRegionList.count() - 1; + CalenTimeRegion& region = iRegionList[lastIndex]; + lastNonemptySlot = region.iEndSlot; + } + else { + if (iUntimedSlotCount > 0) { + lastNonemptySlot = iFirstUntimedSlot + iUntimedSlotCount - 1; + } + } + return lastNonemptySlot; +} + +/*! + \brief Returns the index of the earliest end slot +*/ +int CalenDayInfo::EarliestEndSlot() +{ + int earliestEndSlot(KErrNotFound); + int untimedEventCount = iUntimedSlotCount - iEmptyUntimedSlots; + if (untimedEventCount > 0) { + earliestEndSlot = iFirstUntimedSlot + iEmptyUntimedSlots; + // add 1, since end slot is actually the one that is right after.. + earliestEndSlot++; + } + else { + if (iRegionList.count() > 0) { + earliestEndSlot = iEarliestEndSlot + iEmptyUntimedSlots; + } + } + return earliestEndSlot; +} + +/*! + \brief Returns the index of the last start slot +*/ +int CalenDayInfo::LastStartSlot() +{ + int lastStartSlot(KErrNotFound); + + if (iRegionList.count() > 0) { + lastStartSlot = iLastStartSlot + iUntimedSlotCount; + } + else { + if (iUntimedSlotCount - iEmptyUntimedSlots > 0) { + lastStartSlot = iFirstUntimedSlot + iUntimedSlotCount - 1; + } + } + return lastStartSlot; +} + +/*! + \brief Returns the index of a slot where this event should start drawing, + based on the start time +*/ +int CalenDayInfo::SlotIndexForStartTime(QDateTime aStartTime) +{ + // For example, 1/2 hour accuracy (iSlotsInHour == 2): + // Start drawing with the previus half hour: 9:15 -> 9:00, 9:59-> 9:30. + + + // TDateTime dt = aStartTime.DateTime(); + // int minutes = dt.Minute(); + // int hours = dt.Hour(); + int minutes = aStartTime.time().minute();//dt.Minute(); + int hours = aStartTime.time().hour();//dt.Hour(); + + // calculate index based on the hour. + int slotIndex = hours * iSlotsInHour; + + switch (iSlotsInHour) { + case EOne: // do nothing + break; + case ETwo: { + if (minutes >= 30) { + slotIndex++; + } + } + break; + case EThree: { + if (minutes >= 20) { + slotIndex++; + } + if (minutes >= 40) { + slotIndex++; + } + } + break; + case EFour: // followthrough + default: { + if (minutes >= 15) { + slotIndex++; + } + if (minutes >= 30) { + slotIndex++; + } + if (minutes >= 45) { + slotIndex++; + } + + } + } + + if (slotIndex >= iFirstUntimedSlot) { + slotIndex += iUntimedSlotCount; + } + return slotIndex; +} + +/*! + \brief Returns the index of a slot where this event should end drawing, + based on the end time +*/ +int CalenDayInfo::SlotIndexForEndTime(QDateTime aEndTime) +{ + // For example, 1/2 hour accuracy (iSlotsInHour == 2): + // End drawing with the next half hour: 9:10 -> 9:30, 9:59-> 10:00. + + // TDateTime dt = aEndTime.DateTime(); + // int minutes = dt.Minute(); + // int hours = dt.Hour(); + int minutes = aEndTime.time().minute(); + int hours = aEndTime.time().hour(); + + // calculate index based on the hour. + int slotIndex = hours * iSlotsInHour; + + switch (iSlotsInHour) { + case EOne: { + if (minutes > 0) { + slotIndex++; + } + } + + break; + case ETwo: { + if (minutes > 0) { + slotIndex++; + } + if (minutes > 30) { + slotIndex++; + } + } + break; + case EThree: { + if (minutes > 0) { + slotIndex++; + } + if (minutes > 20) { + slotIndex++; + } + if (minutes > 40) { + slotIndex++; + } + } + break; + case EFour: // followthrough + default: { + if (minutes > 0) { + slotIndex++; + } + + if (minutes > 15) { + slotIndex++; + } + if (minutes > 30) { + slotIndex++; + } + if (minutes > 45) { + slotIndex++; + } + + } + } + + if (slotIndex >= iFirstUntimedSlot) { + slotIndex += iUntimedSlotCount; + } + + return slotIndex; + +} + +/*! + \brief CalenDayInfo::IsHourStartSlot +*/ +bool CalenDayInfo::IsHourStartSlot(const int& aSlotIndex) const +{ + bool isHourStartSlot(false); + if (IsExtraSlot(aSlotIndex)) { + isHourStartSlot = false; + } + else { + int hourIndex(aSlotIndex); + if (aSlotIndex >= iFirstUntimedSlot + iUntimedSlotCount) { + hourIndex -= iUntimedSlotCount; + } + int hour = hourIndex / iSlotsInHour; + int startIndOfHour = hour * iSlotsInHour; + if (hourIndex - startIndOfHour > 0) { + isHourStartSlot = false; + } + else { + isHourStartSlot = true; + } + } + return isHourStartSlot; + +} + +/*! + \brief CalenDayInfo::IsExtraSlot +*/ +bool CalenDayInfo::IsExtraSlot(const int& aSlotIndex) const +{ + return (aSlotIndex >= iFirstUntimedSlot) && (aSlotIndex < (iFirstUntimedSlot + + iUntimedSlotCount)); +} + +/*! + \brief CalenDayInfo::HourFromSlotIndex + Returns the corresponding hour, or KErrNone if index is not hour slot index +*/ +int CalenDayInfo::HourFromSlotIndex(const int& aSlotInd) const +{ + + int hour(KErrNotFound); + + if (!IsExtraSlot(aSlotInd)) { + + if (aSlotInd < 0) { + // round downwards, to the previous starting hour + // e.g. iSlotsInHour = 2, aSlotInd = -1, hour = -1, + // which by SlotIndexFromHour corresponds to slot -2 + hour = (aSlotInd - iSlotsInHour + 1) / iSlotsInHour; + } + else + if (aSlotInd < iFirstUntimedSlot) { + hour = aSlotInd / iSlotsInHour; + } + else + if (aSlotInd >= iFirstUntimedSlot + iUntimedSlotCount) { + hour = (aSlotInd - iUntimedSlotCount) / iSlotsInHour; + } + } + return hour; +} + +/*! + \brief CalenDayInfo::SlotIndexFromHour + Returns the corresponding hour, or KErrNone if index is not hour slot index +*/ +int CalenDayInfo::SlotIndexFromHour(int aHour) +{ + + int slotIndex(KErrNotFound); + + if (aHour >= iFirstUntimedSlot / iSlotsInHour) { + slotIndex = aHour * iSlotsInHour + iUntimedSlotCount; + } + else { + slotIndex = aHour * iSlotsInHour; + } + + return slotIndex; +} + +/*! + \brief CalenDayInfo::RoundHourUp + Rounds the slot number up (towards earlier hours) to an even hour +*/ +int CalenDayInfo::RoundHourUp(int aSlot) +{ + if (!IsExtraSlot(aSlot)) { + aSlot = SlotIndexFromHour(HourFromSlotIndex(aSlot)); + } + return aSlot; +} + +/*! + \brief CalenDayInfo::RoundHourDown + Rounds the slot number down (towards later hours) to an even hour +*/ +int CalenDayInfo::RoundHourDown(int aSlot) +{ + if (!IsExtraSlot(aSlot) && !IsHourStartSlot(aSlot)) { + aSlot = SlotIndexFromHour(HourFromSlotIndex(aSlot + iSlotsInHour)); + } + return aSlot; +} + +/*! + \brief CalenSlotInterval::Overlaps +*/ +bool CalenSlotInterval::Overlaps(const CalenSlotInterval& aInterval) const +{ + return aInterval.iStartSlot < iEndSlot && aInterval.iEndSlot > iStartSlot; +} + +/*! + \brief CalenSlotInterval::AddOffset +*/ +void CalenSlotInterval::AddOffset(int aOffset, int aPos) +{ + if (iStartSlot >= aPos) { + iStartSlot += aOffset; + } + if (iEndSlot >= aPos) { + iEndSlot += aOffset; + } +} + +/*! + \brief CalenSlotInterval::Union +*/ +void CalenSlotInterval::Union(const CalenSlotInterval& aInterval) +{ + if (!aInterval.IsEmpty()) { + iStartSlot = Min(iStartSlot, aInterval.iStartSlot); + iEndSlot = Max(iEndSlot, aInterval.iEndSlot); + } +} + +/*! + \brief CalenSlotInterval::Adjacent +*/ +bool CalenSlotInterval::Adjacent(const CalenSlotInterval& aInterval) const +{ + bool adjacent(false); + if (Overlaps(aInterval)) { + adjacent = true; + } + else { + adjacent = iStartSlot == aInterval.iEndSlot || iEndSlot == aInterval.iStartSlot; + } + return adjacent; +} + +/*! + \brief CalenSlotInterval::IsEmpty +*/ +bool CalenSlotInterval::IsEmpty() const +{ + return iStartSlot >= iEndSlot; +} + +/*! + \brief CalenSlotInterval::Intersect +*/ +void CalenSlotInterval::Intersect(const CalenSlotInterval& aInterval) +{ + if (aInterval.IsEmpty()) { + iEndSlot = iStartSlot; + } + else { + iStartSlot = Max(iStartSlot, aInterval.iStartSlot); + iEndSlot = Min(iEndSlot, aInterval.iEndSlot); + } +} + +/*! + \brief CalenSlotInterval::Subtract +*/ +void CalenSlotInterval::Subtract(const CalenSlotInterval& aInterval, CalenSlotInterval& aSecondPart) +{ + aSecondPart.iStartSlot = aSecondPart.iEndSlot = 0; + if (!aInterval.IsEmpty() && Overlaps(aInterval)) { + if (aInterval.iStartSlot <= iStartSlot) { + iStartSlot = aInterval.iEndSlot; + } + else + if (aInterval.iEndSlot >= iEndSlot) { + iEndSlot = aInterval.iStartSlot; + } + else { + aSecondPart.iStartSlot = aInterval.iEndSlot; + aSecondPart.iEndSlot = iEndSlot; + iEndSlot = aInterval.iStartSlot; + } + } +} + +/*! + \brief CalenSlotInterval::operator> +*/ +bool CalenSlotInterval::operator>(const CalenSlotInterval& aInterval) const +{ + return iStartSlot > aInterval.iStartSlot; +} + +/*! + \brief CalenTimeColumn::Close +*/ +void CalenTimeColumn::Close() +{ + iEventArray.clear(); +} + +/*! + \brief CalenTimeColumn::AddEvent +*/ +void CalenTimeColumn::AddEvent(const CalenTimedEventInfo& aEvent) +{ + ASSERT( aEvent.iStartSlot < aEvent.iEndSlot ); + ASSERT( CanFitEvent( aEvent ) ); + + if (iEventArray.count() == 0) { + iStartSlot = aEvent.iStartSlot; + } + iEndSlot = aEvent.iEndSlot; + iEventArray.append(aEvent); +} + +/*! + \brief CalenTimeColumn::CanFitEvent +*/ +bool CalenTimeColumn::CanFitEvent(const CalenTimedEventInfo& aEvent) +{ + return (aEvent.iStartSlot >= iEndSlot) || (iEventArray.count() == 0); +} + +/*! + \brief CalenTimeColumn::ContainsEvent +*/ +bool CalenTimeColumn::ContainsEvent(const TCalenInstanceId& aId) +{ + bool contains(false); + int eventCount(iEventArray.count()); + for (int i = 0; i < eventCount && !contains; i++) { + if (iEventArray[i].iId == aId) { + contains = true; + } + } + return contains; +} + +/*! + \brief CalenTimeColumn::AddOffset +*/ +void CalenTimeColumn::AddOffset(int aOffset, int aPos) +{ + if (aOffset != 0) { + CalenSlotInterval::AddOffset(aOffset, aPos); + int eventCount(iEventArray.count()); + for (int i = 0; i < eventCount; i++) { + iEventArray[i].AddOffset(aOffset, aPos); + } + } +} + +/*! + \brief CalenTimeRegion::Close +*/ +void CalenTimeRegion::Close() +{ + int colCount(iColumns.count()); + for (int i = 0; i < colCount; i++) { + iColumns[i].Close(); + } + iColumns.clear(); + iIntervals.clear(); +} + +/*! + \brief CalenTimeRegion::Overlaps +*/ +bool CalenTimeRegion::Overlaps(const CalenSlotInterval& aInterval) const +{ + // the base class implementation would be ok, but we might want the assertion here + ASSERT( iColumns.count()> 0 ); + return CalenSlotInterval::Overlaps(aInterval); +} + +/*! + \brief CalenTimeRegion::AddOffset +*/ +void CalenTimeRegion::AddOffset(int aOffset, int aPos) +{ + if (aOffset != 0) { + CalenSlotInterval::AddOffset(aOffset, aPos); + int colCount(iColumns.count()); + for (int i = 0; i < colCount; i++) { + iColumns[i].AddOffset(aOffset, aPos); + } + int intervalCount(iIntervals.count()); + for (int i = 0; i < intervalCount; i++) { + iIntervals[i].AddOffset(aOffset, aPos); + } + } + +} + +/*! + \brief CalenTimeRegion::AddEvent +*/ +void CalenTimeRegion::AddEvent(const CalenTimedEventInfo& aEvent) +{ + if (iColumns.count() == 0) { + // This is the first event added to this region + iStartSlot = aEvent.iStartSlot; + iEndSlot = aEvent.iEndSlot; + } + else { + // Check that the events actually are added in the correct order + ASSERT( aEvent.iStartSlot >= iStartSlot ); + ASSERT( aEvent.iStartSlot < iEndSlot ); + + if (aEvent.iEndSlot > iEndSlot) { + iEndSlot = aEvent.iEndSlot; + } + } + + AddInterval(aEvent); + + // If the event fits in one of the existing columns, add it to that one + bool added(false); + int colCount(iColumns.count()); + for (int i = 0; i < colCount && !added; i++) { + if (iColumns[i].CanFitEvent(aEvent)) { + iColumns[i].AddEvent(aEvent); + added = true; + } + } + + if (!added) { + // otherwise create a new column for it + iColumns.append(CalenTimeColumn()); + iColumns[iColumns.count() - 1].AddEvent(aEvent); + } +} + +/*! + \brief CalenTimeRegion::AddInterval +*/ +void CalenTimeRegion::AddInterval(const CalenTimedEventInfo& aEvent) +{ + /* + * Here are a few examples of different possible cases for this method. + * The first picture of each example shows the initial situation in the + * array, and the new event to be added. The transformations performed + * are shown with a few intermediate steps. + * + * nO = newOverlap, nE = newEvent + * + * Example one: + * + * ------------------ + * | newEvent | + * -------------------------------- + * ... | lastOverlap | tail | + * -------------------------- + * + * -------------- + * | newEvent | + * -------------------------------- + * ... | lastOverlap | tail | + * -------------------------- + * + * -------------- + * | nO | nE | + * -------------------------------- + * ... | lastOverlap | tail | + * -------------------------- + * + * Result: + * -------------------------------- + * ... | lastOverlap | nE | + * -------------------------------- + * + * + * Example two: + * ------------------ + * | newEvent | + * ------------------------------------------- + * ... | lastOverlap | tail | + * ------------------------------- + * + * ------------------ + * | nO | newEvent | + * ------------------------------------------- + * ... | lastOverlap | tail | + * ------------------------------- + * + * Result: + * ------------------------------------------- + * ... | lastOverlap | tail | nO | newEvent | + * ------------------------------------------- + * + * + * Example three: + * -------------- + * | newEvent | + * ----------------------------------------------------- + * ... | lastOverlap | tail | + * ----------------------------------------------------- + * + * -------------- + * | newOverlap | + * ----------------------------------------------------- + * ... | lastOverlap | tail | + * ----------------------------------------------------- + * + * -------------- + * | newOverlap | + * ----------------------------------------------------- + * ... | lastOverlap | tail | | tailPart2 | + * ----------------------------------------------------- + * + * Result: + * ----------------------------------------------------- + * ... | lastOverlap | tail | newOverlap | tailPart2 | + * ----------------------------------------------------- + */ + + // Fill out the new event + CalenEventInterval newEvent; + newEvent.iStartSlot = aEvent.iStartSlot; + newEvent.iEndSlot = aEvent.iEndSlot; + newEvent.iStatus = aEvent.iStatus; + // newEvent.iReplicationStatus = aEvent.iReplicationStatus; + newEvent.iOverlap = false; + + // a pointer to the last interval which is an overlap interval + CalenEventInterval* lastOverlap = NULL; + // If nonempty, this is the last interval after the last overlap + CalenEventInterval tail; + tail.iStartSlot = tail.iEndSlot = 0; + + // Find lastOverlap and tail. + if (iIntervals.count() >= 1) { + // lastInterval is a pointer to the last interval in the array + CalenEventInterval* lastInterval = &iIntervals[iIntervals.count() - 1]; + + // If this is an overlap interval, we haven't got any tail. + if (lastInterval->iOverlap) { + lastOverlap = lastInterval; + } + else { + tail = *lastInterval; + } + + // If there's at least two intervals, and the last one wasn't an overlap, + // the second last one must be an overlap. + if (iIntervals.count() >= 2 && !lastOverlap) { + lastOverlap = &iIntervals[iIntervals.count() - 2]; + ASSERT( lastOverlap->iOverlap ); + } + } + + // If we got a tail, remove it from the array (it will be readded + // at the end if needed) + if (!tail.IsEmpty()) { + iIntervals.removeAt(iIntervals.count() - 1); + } + + CalenEventInterval empty; + if (lastOverlap) { + // Remove the part which already is marked as an overlap + // from the new event. The new event can't start before the + // last overlap starts since events are added in order, therefore + // the second subtraction result interval will remain empty. + newEvent.Subtract(*lastOverlap, empty); + ASSERT( empty.IsEmpty() ); + } + + // Create a new interval, representing the overlap between the old tail + // and the new event + CalenEventInterval newOverlap = newEvent; + newOverlap.iOverlap = true; + newOverlap.Intersect(tail); + + CalenEventInterval tailPart2 = tail; // initialize iOverlap and iStatus from tail + // Remove the new overlap from the old tail, possibly creating two separate intervals. + tail.Subtract(newOverlap, tailPart2); + + // If the subtraction only yielded one single interval, but it's + // after newOverlap, make tailPart2 contain that and make tail empty. + if (tail > newOverlap) { + tailPart2 = tail; + tail.iEndSlot = tail.iStartSlot; + } + + // Remove the new overlap from the new event. Since we already removed the old + // overlap, this subtraction can't produce two intervals either. + newEvent.Subtract(newOverlap, empty); + ASSERT( empty.IsEmpty() ); + + // If the new overlap is adjacent to the old one, expand the old one + // and set the new overlap to be empty. + if (lastOverlap && newOverlap.Adjacent(*lastOverlap)) { + lastOverlap->Union(newOverlap); + newOverlap.iEndSlot = newOverlap.iStartSlot; + } + + // Add all the new intervals, if they're non-empty. + if (!tail.IsEmpty()) { + iIntervals.append(tail); + } + if (!newOverlap.IsEmpty()) { + iIntervals.append(newOverlap); + } + if (!tailPart2.IsEmpty()) { + iIntervals.append(tailPart2); + } + if (!newEvent.IsEmpty()) { + iIntervals.append(newEvent); + } + +} + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/src/calendayitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/src/calendayitem.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,239 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Event view item, exact size and position of event is set in +* CalenDayContainer::setItemModelIndex based on event duration +* +*/ + +//System includes +#include +#include +#include +#include +#include + + +//User inlcudes +#include "calendayitem.h" +#include "calendaystatusstrip.h" +#include "calendaymodel.h" + +// ----------------------------------------------------------------------------- +// CalenDayItem() +// Constructor. +// ----------------------------------------------------------------------------- +// +CalenDayItem::CalenDayItem(): + mUpdated(false), mBg(0), mEventDesc(0), mColorStripe(0), + mEventDescMinWidth(0.0), mFrameMinWidth(0.0) +{ +} + +// ----------------------------------------------------------------------------- +// CalenBCDayView() +// Copy constructor. +// ----------------------------------------------------------------------------- +// +CalenDayItem::CalenDayItem(const CalenDayItem & source) : + HbAbstractViewItem(source), mUpdated(false), mBg(0), mEventDesc(0), + mColorStripe(0), mEventDescMinWidth(0.0), mFrameMinWidth(0.0) +{ + // TODO: "qtg_fr_btn_pressed" need to replaced with qtg_fr_cal_meeting_bg + // when available + mBg = new HbFrameItem("qtg_fr_btn_pressed", HbFrameDrawer::NinePieces, this); + mEventDesc = new HbTextItem(this); + // TODO: probably ElideLeft needed for mirrored layout + mEventDesc->setElideMode(Qt::ElideRight); + mEventDesc->setTextWrapping(Hb::TextWrapAnywhere); + + mColorStripe = new CalenDayStatusStrip(this); + + HbStyle::setItemName(mBg, QLatin1String("backgroundFrame")); + HbStyle::setItemName(mEventDesc, QLatin1String("eventDescription")); + HbStyle::setItemName(static_cast(mColorStripe), QLatin1String("colorStripe")); + + HbDeviceProfile deviceProfile; + HbStyle style; + + qreal horizontalSpacing = 0.0; + qreal rightMargin = 0.0; + + style.parameter(QString("hb-param-margin-gene-middle-horizontal"), + horizontalSpacing, deviceProfile); + style.parameter(QString("hb-param-margin-gene-right"), + rightMargin, deviceProfile); + + qreal stripeWidth = 1.5 * deviceProfile.unitValue(); //1.5un according to UI spec + + mFrameMinWidth = 2 * horizontalSpacing + stripeWidth; //smallest width for which background frame is displayed + mEventDescMinWidth = mFrameMinWidth + rightMargin;//smallest width for which text can be displayed + + //Minimum width is assured by widgetml and css + //additionally called here to prevent minimum size hint caching inside effectiveSizeHint + setMinimumWidth(stripeWidth); +} + +// ----------------------------------------------------------------------------- +// ~CalenDayItem() +// Destructor. +// ----------------------------------------------------------------------------- +// +CalenDayItem::~CalenDayItem() +{ +} + +// ----------------------------------------------------------------------------- +// +// ----------------------------------------------------------------------------- +// +HbAbstractViewItem * CalenDayItem::createItem() +{ + CalenDayItem* newItem = new CalenDayItem(*this); + return newItem; +} + + +// ----------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- +// +void CalenDayItem::updateChildItems() +{ + // there is no need to update items after creation + if (!mUpdated) + { + AgendaEntry entry; + entry = modelIndex().data( CalenDayEntry ).value(); + + bool isAllDayEvent = (entry.type() == AgendaEntry::TypeEvent) + && !entry.isTimedEntry(); + + setDescription(entry, isAllDayEvent); + setStatusStrip(entry, isAllDayEvent); + + mUpdated = true; + } + + //TODO: check if needed + //repolish(); + //HbAbstractViewItem::updateChildItems(); +} + + +// ----------------------------------------------------------------------------- +// setDescription() +// ----------------------------------------------------------------------------- +// +void CalenDayItem::setDescription(const AgendaEntry &entry, bool allDayEvent) +{ + QString description(entry.summary()); + QString location(entry.location()); + + + int separtorPos = 0; + + if(!location.isEmpty()) { + if ( !description.isEmpty() ) { + separtorPos = description.count(); + description.append(", "); + } + + description.append(location); + } + + if ( description.isEmpty() ) { + description.append(hbTrId("txt_calendar_dblist_unnamed")); + } + + //Description of all day events has to be displayed vertically + if(allDayEvent){ + + QString verticalString; + for(int i=0; isetText(description); +} + +/*! + \brief It set all needed things for status strip from Agenda Entry. + + \param entry Status Strip is created from Agenda Entry + */ +void CalenDayItem::setStatusStrip(const AgendaEntry &entry, bool allDayEvent) +{ + QColor color = HbColorScheme::color("qtc_cal_month_current_day"); + mColorStripe->setColor(color); + + if (!allDayEvent) { + mColorStripe->setStartEndTime(entry.startTime().time(), + entry.endTime().time()); + } else { + // This is workaround for displaying all-day events. + // Now for MS Outlook compability all-day events' start and end time is + // 00:00:00 and 00:00:00 next day respectively. + // To draw it correctly we need times like those visible for user in + // editor: 00:00:00 to 23:59:59 (the same day) + mColorStripe->setStartEndTime(entry.startTime().time(), + entry.endTime().time().addSecs(-1)); + } + + switch (entry.status()) { + case AgendaEntry::Confirmed: + mColorStripe->setDrawingStyle(CalenDayStatusStrip::Filled); + break; + case AgendaEntry::Tentative: + mColorStripe->setDrawingStyle(CalenDayStatusStrip::StripWithLines); + break; + case AgendaEntry::Cancelled: + mColorStripe->setDrawingStyle(CalenDayStatusStrip::OnlyFrame); + break; + default: + mColorStripe->setDrawingStyle(CalenDayStatusStrip::Filled); + break; + } +} + +void CalenDayItem::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_UNUSED(event) + + qreal width = rect().width(); + + if(width < mEventDescMinWidth){ + mEventDesc->hide(); + } else{ + mEventDesc->show(); + } + + if(width < mFrameMinWidth){ + mBg->hide(); + } else{ + mBg->show(); + } + + //Necessary to switch layout + repolish(); +} + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/src/calendayitemview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/src/calendayitemview.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,393 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Day view control of calendar +* +*/ + +//System includes +#include +#include +#include +#include +#include + +//User includes +#include "calendayitemview.h" +#include "calendayutils.h" +#include "calendaycontainer.h" +#include "calendayinfo.h" +#include "calendaymodel.h" +#include "calenservices.h" +#include "calencontext.h" +#include "CalenUid.h" + + +// ----------------------------------------------------------------------------- +// CalenDayItemView() +// Constructor +// ----------------------------------------------------------------------------- +// +CalenDayItemView::CalenDayItemView( MCalenServices &services, HbModelIterator *iterator, QGraphicsItem *parent ) +: HbAbstractItemView(mContainer = new CalenDayContainer(), iterator, parent), + mServices( services ) +{ + mInfo = new CalenDayInfo( CalenDayInfo::ETwo ); + mContainer->setDayInfo( mInfo ); + + //setup Selection Model + QItemSelectionModel* selModel = new QItemSelectionModel(this->model()); + if ( selModel ) { + setSelectionMode( HbAbstractItemView::SingleSelection ); + setSelectionModel( selModel ); + } + + setScrollDirections(Qt::Vertical); + setScrollingStyle(HbScrollArea::PanWithFollowOn); + setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAlwaysOff); + + grabGesture(Qt::PanGesture); + ungrabGesture(Qt::SwipeGesture); + + //TODO: KG: Animate item pressed?! HbAbstractItemView::TouchDown + setEnabledAnimations( HbAbstractItemView::None ); + + // Get the width of content and fix its size + qreal contentWidth = CalenDayUtils::instance()->contentWidth(); + setMinimumWidth(contentWidth); + setMaximumWidth(contentWidth); + + setupSlots(); + setupContextMenu(); +} + +// ----------------------------------------------------------------------------- +// ~CalenDayItemView() +// Destructor +// ----------------------------------------------------------------------------- +// +CalenDayItemView::~CalenDayItemView() +{ + delete mInfo; +} + +// ----------------------------------------------------------------------------- +// scrollTo() +// +// ----------------------------------------------------------------------------- +// +void CalenDayItemView::scrollTo(const QModelIndex &index, HbAbstractItemView::ScrollHint hint) +{ + HbAbstractItemView::scrollTo(index, hint); +} + +// ----------------------------------------------------------------------------- +// reset() +// +// ----------------------------------------------------------------------------- +// +void CalenDayItemView::reset() +{ +// CalenDayItemView::reset(); +} + +// ----------------------------------------------------------------------------- +// modelAboutToBeReset() +// Handles signal that is emitted when reset() is called, before the model's +// internal state (e.g. persistent model indexes) has been invalidated. +// ----------------------------------------------------------------------------- +// +void CalenDayItemView::modelAboutToBeReset() +{ + +} + +// ----------------------------------------------------------------------------- +// modelReset() +// Handles signal that is emitted when reset() is called, after the model's +// internal state (e.g. persistent model indexes) has been invalidated. +// ----------------------------------------------------------------------------- +// +void CalenDayItemView::modelReset() +{ + if ( !mInfo ) { + return; + } + //reset day info + mInfo->Reset(); + + CalenDayModel* model(0); + model = static_cast(this->model()); + if ( !model ) { + return; + } + int rowCount = model->rowCount( ); + SCalenApptInfo apptInfo; + for( int row = 0; row < rowCount; row++ ) { + QModelIndex idx = model->index( row, 0 ); + QVariant variant = idx.data( CalenDayEntry ); + AgendaEntry entry = variant.value(); + apptInfo.iIndex = idx; + + QDateTime start; + QDateTime end; + QDateTime currDate( model->modelDate() ); + CalenDayUtils::instance()->getEventValidStartEndTime( start, end, + entry, currDate ); + + apptInfo.iStartTime = start; + apptInfo.iEndTime = end; + + TCalenInstanceId id = TCalenInstanceId::nullInstanceId();//index.row() - temporary ID + id.mEntryLocalUid = row; + id.mInstanceTime = apptInfo.iStartTime; + apptInfo.iId = id; + apptInfo.iColor = 0xffff; + + if ( entry.isTimedEntry() ) + { + apptInfo.iAllDay = false; + mInfo->InsertTimedEvent( apptInfo ); + } + else if( entry.type() == AgendaEntry::TypeEvent) //all-day event + { + apptInfo.iAllDay = true; + mInfo->InsertAlldayEvent( apptInfo ); + } + } + + HbAbstractItemView::reset(); +} + +// ----------------------------------------------------------------------------- +// scrollVertically() +// +// ----------------------------------------------------------------------------- +// +void CalenDayItemView::scrollVertically( const QPointF &newPosition ) +{ + QPointF currentPos = contentWidget()->pos(); + if (abs(newPosition.y()) != abs(currentPos.y())) { + currentPos.setY(newPosition.y()); + scrollContentsTo(currentPos, 0); + } +} + +// ----------------------------------------------------------------------------- +// itemPressed() +// This function is called when a touch down event is received within Abstract view item that is representing index. +// ----------------------------------------------------------------------------- +// +void CalenDayItemView::itemPressed( const QPointF &position ) +{ + Q_UNUSED( position ) +} + +// ----------------------------------------------------------------------------- +// itemReleased() +// This function is called when a touch release event is received within Abstract view item that is representing index. +// ----------------------------------------------------------------------------- +// +void CalenDayItemView::itemReleased( const QPointF &position ) +{ + Q_UNUSED( position ) +} + +// ----------------------------------------------------------------------------- +// itemActivated() +// This function is called when the item specified by index is activated by the user. +// ----------------------------------------------------------------------------- +// +void CalenDayItemView::itemActivated( const QPointF &position ) +{ + Q_UNUSED( position ) + HbAbstractViewItem *item = qobject_cast(sender()); + QModelIndex index = item->modelIndex(); + QItemSelectionModel* selModel( selectionModel() ); + if ( index.isValid() && selModel) { + selModel->select( index, QItemSelectionModel::Current | QItemSelectionModel::Select ); + openSelectedItem(); + } +} + +// ----------------------------------------------------------------------------- +// itemLongPressed() +// This function is called when long press event is received within Abstract view item viewItem. +// ----------------------------------------------------------------------------- +// +void CalenDayItemView::itemLongPressed(HbAbstractViewItem* item, QPointF coords) +{ + QModelIndex index = item->modelIndex(); + QItemSelectionModel* selModel( selectionModel() ); + if ( index.isValid() && selModel && mContextMenu) { + selModel->select( index, QItemSelectionModel::Current | QItemSelectionModel::Select ); + mContextMenu->setPreferredPos( coords, HbPopup::BottomRightCorner ); + mContextMenu->open(); + } +} + +// ----------------------------------------------------------------------------- +// orientationChanged() +// Slot which is called whenever the orientation of the device changes. +// ----------------------------------------------------------------------------- +// +void CalenDayItemView::orientationChanged( Qt::Orientation orientation ) +{ + // Update the width of screen + qreal contentWidth = CalenDayUtils::instance()->contentWidth(); + setMinimumWidth(contentWidth); + setMaximumWidth(contentWidth); + if( mContainer ) { + mContainer->orientationChanged( orientation ); + } +} + +// ----------------------------------------------------------------------------- +// openSelectedItem() +// Opens currently selected model item. +// ----------------------------------------------------------------------------- +// +void CalenDayItemView::openSelectedItem() +{ + issueCommandOnSelectedItem( ECalenEventView ); +} + +// ----------------------------------------------------------------------------- +// editSelectedItem() +// Edits currently selected model item. +// ----------------------------------------------------------------------------- +// +void CalenDayItemView::editSelectedItem() +{ + issueCommandOnSelectedItem( ECalenEditCurrentEntry ); +} + +// ----------------------------------------------------------------------------- +// deleteSelectedIten() +// Deletes currently selected model item. +// ----------------------------------------------------------------------------- +// +void CalenDayItemView::deleteSelectedItem() +{ + issueCommandOnSelectedItem( ECalenDeleteCurrentEntry ); +} + +// ----------------------------------------------------------------------------- +// setupSlots() +// Connects item view's slots. +// ----------------------------------------------------------------------------- +// +void CalenDayItemView::setupSlots() +{ + // Connect to main window's orientationChanged signal to handle orientation + // switching + QObject::connect(CalenDayUtils::instance()->mainWindow(), + SIGNAL(orientationChanged(Qt::Orientation)), this, + SLOT(orientationChanged(Qt::Orientation))); + + // Connect with model signals + if (this->model()) { + QObject::connect(this->model(), SIGNAL(modelAboutToBeReset()), this, + SLOT(modelAboutToBeReset())); + QObject::connect(this->model(), SIGNAL(modelReset()), this, + SLOT(modelReset())); + } + if (mContainer) { + // Connect with base class to enable handling item press by model index + QObject::connect(mContainer, SIGNAL(itemCreated(HbAbstractViewItem *)), + this, SLOT(itemCreated(HbAbstractViewItem*))); + } + QObject::connect(this, SIGNAL(pressed(const QPointF&)), this, + SLOT(itemPressed(const QPointF&))); + QObject::connect(this, SIGNAL(released(const QPointF&)), this, + SLOT(itemReleased(const QPointF&))); + QObject::connect(this, SIGNAL(activated(const QPointF&)), this, + SLOT(const QPointF&)); + QObject::connect(this, SIGNAL(longPressed(HbAbstractViewItem*, QPointF)), + this, SLOT(itemLongPressed(HbAbstractViewItem*, QPointF))); +} + +// ----------------------------------------------------------------------------- +// setupSlots() +// Creates Context menu. +// ----------------------------------------------------------------------------- +// +void CalenDayItemView::setupContextMenu() +{ + mContextMenu = new HbMenu(); + HbAction *openAction = mContextMenu->addAction(hbTrId("txt_common_menu_open")); + if (openAction) { + connect(openAction, SIGNAL(triggered()), this, SLOT(openSelectedItem())); + } + HbAction *editAction = mContextMenu->addAction(hbTrId("txt_common_menu_edit")); + if (editAction) { + connect(editAction, SIGNAL(triggered()), this, SLOT(editSelectedItem())); + } + HbAction *deleteAction = mContextMenu->addAction(hbTrId("txt_common_menu_delete")); + if (deleteAction) { + connect(deleteAction, SIGNAL(triggered()), this, + SLOT(deleteSelectedItem())); + } +} + +// ----------------------------------------------------------------------------- +// issueCommandOnSelectedItem() +// Sets context to currently selected model item and issues calendar command. +// ----------------------------------------------------------------------------- +// +bool CalenDayItemView::issueCommandOnSelectedItem( int command ) +{ + bool retVal(false); + QItemSelectionModel* selModel(selectionModel()); + if (!selModel){ + return retVal; + } + QModelIndex index( selModel->currentIndex() ); + if( index.isValid() ) { + retVal = true; + QVariant variant = index.data( CalenDayEntry ); + AgendaEntry entry = variant.value(); + QDateTime start; + QDateTime end; + CalenDayModel* model(0); + model = static_cast(this->model()); + QDateTime currDate( model->modelDate() ); + CalenDayUtils::instance()->getEventValidStartEndTime( start, end, + entry, currDate ); + TRAPD(error, + mServices.Context().setFocusDateAndTimeAndInstance(start, + TCalenInstanceId::create(entry)); + mServices.IssueCommandL( command ); + ); + if( error ) { + retVal = false; + } + clearSelectionInModel(); + } + return retVal; +} + +// ----------------------------------------------------------------------------- +// clearSelectionInModel() +// Clears current selection in Selection Model. +// ----------------------------------------------------------------------------- +// +void CalenDayItemView::clearSelectionInModel() +{ + QItemSelectionModel* selModel(selectionModel()); + if (selModel) { + selModel->clear(); + } +} + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/src/calendaymodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/src/calendaymodel.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,113 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Single day item view model +* +*/ + + + +#include +#include +#include "calendaymodel.h" + + +/*! + BC Day Model constructor + \a date defined day for which entries will be fetched \a services is handle to + organizer services \a parent + */ +CalenDayModel::CalenDayModel(const QDateTime &date, MCalenServices &services, + QObject *parent) + : QAbstractListModel(parent), mServices(services) +{ + if (date.isValid()) + { + loadAndStoreInstances(date); + } +} + +/* + \reimp + */ +int CalenDayModel::rowCount( const QModelIndex &parent ) const +{ + Q_UNUSED( parent ) + return mEntryList.count(); +} + +/* + \reimp + */ +QVariant CalenDayModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + { + return QVariant(); + } + + if (index.row() >= mEntryList.count()) + { + return QVariant(); + } + + if (role == CalenDayEntry) + { + return mEntryList.at(index.row()); + } + else + { + return QVariant(); + } +} + +/*! + Resets model. Old events are removed. Evenets for given day are fetched. + \a date defined day for which entries will be fetched + */ +void CalenDayModel::refreshModel(const QDateTime &date) +{ + beginResetModel(); + loadAndStoreInstances(date); + endResetModel(); +} + + +/*! + Fetches entries via. organizer API and stores it in member container + */ +void CalenDayModel::loadAndStoreInstances(const QDateTime &date) +{ + mDateTime = date; + //Filter flags + AgendaUtil::FilterFlags filter = AgendaUtil::FilterFlags( + AgendaUtil::IncludeAppointments | AgendaUtil::IncludeEvents); + QList list; + // Fetch the instance list from the agenda interface + list = mServices.agendaInterface()->createEntryIdListForDay(date, filter); + + mEntryList.clear(); + + foreach(AgendaEntry entry, list) + { + mEntryList.append(QVariant::fromValue(entry)); + } +} + +/*! + Retruns date (day). Model holds events for this day. + */ +QDateTime CalenDayModel::modelDate() const +{ + return mDateTime; +} diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/src/calendaymodelmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/src/calendaymodelmanager.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,167 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Model manager holds models for three day views +* +*/ + +#include +#include + +#include "calendaymodelmanager.h" +#include "calendaymodel.h" + +/*! + BC Model Manager constructor. Model manager use calendar context to + populate models with proper events. + \a services is handle to organizer services \a emptyModels if true created models + are not populated with events \a parent + */ +CalenDayModelManager::CalenDayModelManager(MCalenServices &services, bool emptyModels, + QObject *parent) + : QObject(parent), mServices (services) +{ + if (emptyModels) + { + mCurrentDayTime = QDateTime(); + } + else + { + mCurrentDayTime = mServices.Context().focusDateAndTime(); + } + createAllModels(); +} + +CalenDayModelManager::~CalenDayModelManager() +{ + // not needed now +} + + +void CalenDayModelManager::viewsScrollingFinished(CalenScrollDirection scrollTo) + { + if (scrollTo == ECalenScrollToNext) + { + moveForeward(); + } + else + { + moveBackward(); + } + } + + +/*! + Reorganize models after move to previous day. + */ +void CalenDayModelManager::moveBackward() +{ + mCurrentDayTime = mServices.Context().focusDateAndTime(); + + CalenDayModel* tmp = mModels[NextDay]; + tmp->refreshModel( mCurrentDayTime.addDays(-1)); + + mModels[NextDay] = mModels[CurrentDay]; + mModels[CurrentDay] = mModels[PreviousDay]; + mModels[PreviousDay] = tmp; +} + +/*! + Reorganize models after move to next day. + */ +void CalenDayModelManager::moveForeward() +{ + mCurrentDayTime = mServices.Context().focusDateAndTime(); + + CalenDayModel* tmp = mModels[PreviousDay]; + tmp->refreshModel( mCurrentDayTime.addDays(1)); + + mModels[PreviousDay] = mModels[CurrentDay]; + mModels[CurrentDay] = mModels[NextDay]; + mModels[NextDay] = tmp; +} + +/*! + Returns given model + /a day defines model, can be (PreviousDay, CurrentDay, NextDay) only. + */ +QAbstractItemModel &CalenDayModelManager::getModel(ModelDay day) +{ + return *(mModels[day]); +} + +/*! + Creates all models objects durring construction. + */ +void CalenDayModelManager::createAllModels() +{ + + mModels[CurrentDay] = new CalenDayModel(mCurrentDayTime, mServices, this); + + QDateTime previousDayTime; + QDateTime nextDayTime; + + if (mCurrentDayTime.isValid()) + { + previousDayTime = mCurrentDayTime.addDays(-1); + nextDayTime = mCurrentDayTime.addDays(1); + } + + mModels[PreviousDay] = new CalenDayModel(previousDayTime, mServices, this); + mModels[NextDay] = new CalenDayModel(nextDayTime, mServices, this); +} + + +/*! + Refetch data for all models. Context calendar is used to fill models + with correct events. Should be used for full (three days) repopulation. + */ +void CalenDayModelManager::refreshAllModels() + { + mCurrentDayTime = mServices.Context().focusDateAndTime(); + + mModels[PreviousDay]->refreshModel(mCurrentDayTime.addDays(-1)); + mModels[CurrentDay]->refreshModel(mCurrentDayTime); + mModels[NextDay]->refreshModel(mCurrentDayTime.addDays(1)); + } + +/*! + Refetch data given day model. Context calendar is used to fill model + with correct events. + /a day defines model, can be (PreviousDay, CurrentDay, NextDay) only. + */ +void CalenDayModelManager::refreshSingleModel(CalenDayModelManager::ModelDay day) + { + switch (day) + { + case PreviousDay: + { + mModels[PreviousDay]->refreshModel(mCurrentDayTime.addDays(-1)); + } + break; + case CurrentDay: + { + mModels[CurrentDay]->refreshModel(mCurrentDayTime); + } + break; + case NextDay: + { + mModels[PreviousDay]->refreshModel(mCurrentDayTime.addDays(1)); + } + break; + default: + break; + } + } + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/src/calendaystatusstrip.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/src/calendaystatusstrip.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,290 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Day view control of calendar + * + */ + +#include +#include + +#include "calendaystatusstrip.h" + +qreal const CalenDayStatusStrip::mMinute = 60; +qreal const CalenDayStatusStrip::mMinimumTime = 5; + +/*! + Constructor + */ +CalenDayStatusStrip::CalenDayStatusStrip(HbWidget *parent) + : HbWidget(parent), mRange(2), + mDrawingStyle(CalenDayStatusStrip::Filled) +{ + setFlag(QGraphicsItem::ItemHasNoContents,false); + +} + +/*! + Destructor + */ +CalenDayStatusStrip::~CalenDayStatusStrip() +{ + +} + +/*! + \brief Return range beatween two filled lines in StripWithLines drawing + styles. + + \sa CalenDayStatusStrip::DrawingStyle, setRange + */ +qreal CalenDayStatusStrip::range() const +{ + return mRange; +} + +/*! + \brief Return color drawing + + \sa setColor + */ +QColor CalenDayStatusStrip::color() const +{ + return mColor; +} + +/*! + \brief Return style of drawing. + + \sa CalenDayStatusStrip::DrawingStyle, setDrawingStyle + */ +CalenDayStatusStrip::DrawingStyle CalenDayStatusStrip::drawingStyle() const +{ + return mDrawingStyle; +} + +/*! + \brief Return orginal start and entime fo event + + \sa setStartEndTime + */ +QPair CalenDayStatusStrip::startEndTime() const +{ + return mStartEndEventTime; +} + +/*! + \brief It set range beatween two filled lines in StripWithLines drawing + styles. + + \param range Range beatween two filled lines + + \sa CalenDayStatusStrip::DrawingStyle, range + */ +void CalenDayStatusStrip::setRange(qreal range) +{ + mRange = range; +} + +/*! + \brief It set color drawing + + \param stripColor Color of drawing + + \sa stripColor + */ +void CalenDayStatusStrip::setColor(QColor stripColor) +{ + mColor = stripColor; +} + +/*! + \brief It set drawing style of strip + + \param drawingStyle Style of strip drawing. + + \sa CalenDayStatusStrip::DrawingStyle, drawingStyle + */ +void +CalenDayStatusStrip::setDrawingStyle(CalenDayStatusStrip::DrawingStyle drawingStyle) +{ + mDrawingStyle = drawingStyle; +} + +/*! + It set start and end time of event + + \param startTime Start of event + \param endTime End of event + */ +void CalenDayStatusStrip::setStartEndTime(const QTime &startTime, + const QTime &endTime) +{ + mStartEndEventTime.first = startTime; + mStartEndEventTime.second = endTime; + + //check if startEndEvent is longer than mMinimumTimeminutes; + if (mStartEndEventTime.first.secsTo(mStartEndEventTime.second) < mMinute * mMinimumTime) { + mStartEndEventTime.second = QTime(mStartEndEventTime.first.hour(), + mStartEndEventTime.first.minute() + mMinimumTime); + } +} + +/*! + \brief Reimplemented function... + + Reimplemented function to draw status strip. + It is based on CalenDayStatusStrip::DrawingStyle, range and color + */ +void CalenDayStatusStrip::paint( + QPainter *painter, + const QStyleOptionGraphicsItem *option, + QWidget *widget) +{ + Q_UNUSED(option); + Q_UNUSED(widget); + + //calculate bubble start and end time of bubble + QPair startEndEvent = + calculateStartEndPostion(mStartEndEventTime.first, + mStartEndEventTime.second + ); + //calculate how big is Minute + qreal minuteHeight = calculateMinuteHeight(startEndEvent.first, + startEndEvent.second + ); + + painter->save();// saves the painter state. + + + //calculate how long is event in minutes + qreal eventMinutes = + mStartEndEventTime.first.secsTo(mStartEndEventTime.second) / mMinute; + //calculate height and width of status stripe + qreal dx = size().width() - 1; + qreal dy = eventMinutes * minuteHeight; + + //calculate time from wehre it should be drawed + qreal startTime = + startEndEvent.first.secsTo(mStartEndEventTime.first) / mMinute; + //this is done because bubble can be drawed from half hour + startTime = startTime > 30 ? startTime - 30 : startTime; + //calculate status stripe height + qreal startTimeHeight = startTime * minuteHeight; + + //set bounding rect of drawed area + QRectF bounding(boundingRect()); + //set size smaller by 1px in each side + bounding.setRect(bounding.left() + 1, bounding.top() + startTimeHeight, + dx - 1, dy - 1 + ); + + //set clip region + painter->setClipRect(bounding, Qt::IntersectClip); + + //prepare brush and paint + QBrush brush(mColor); + painter->setBrush(brush); + QPen pen; + pen.setWidth(1); + pen.setBrush(brush); + pen.setCapStyle(Qt::RoundCap); + pen.setJoinStyle(Qt::RoundJoin); + + painter->setPen(pen); + QPointF startPoint(0, dy + dx); + + switch (mDrawingStyle) { + case StripWithLines: + for (int i = 0; startPoint.y() > 0; i++) { + painter->drawPolygon(diagonalLine(startPoint, dx, 3)); + startPoint.setY(startPoint.y() - 6 - mRange); + } + case OnlyFrame: + painter->setBrush(Qt::NoBrush); + break; + } + + //draw rectangle + painter->drawRect(bounding); + + // restore the painter + painter->restore(); +} + +/*! + \brief It preapre points to draw filled polygon when StripWithLines style is + on. + */ +QPolygonF +CalenDayStatusStrip::diagonalLine(QPointF startPoint, qreal dx, qreal dy) +{ + QPolygonF polygon; + polygon << QPointF(startPoint.x(), startPoint.y()); + polygon << QPointF(startPoint.x(), startPoint.y() - dy); + polygon << QPointF(startPoint.x() + dx, startPoint.y() - 2 * dy); + polygon << QPointF(startPoint.x() + dx, startPoint.y() - dy); + return polygon; +} + +/*! + Return time for position 0 and height in widget + + \param startTime Start of event + \param endTime End of event + \return Draw region of bubble + */ + QPair CalenDayStatusStrip::calculateStartEndPostion( + const QTime &startTime, + const QTime &endTime + ) +{ + + QTime start; + QTime end; + + if (startTime.minute() < 30) { + start = QTime(startTime.hour(), 0); + } + else { + start = QTime(startTime.hour(), 30); + } + + if (endTime.minute() == 0) { + end = endTime; + } + else if (endTime.hour() == 23) { + end = QTime(endTime.hour(), 59); + } + else if (endTime.minute() <= 30) { + end = QTime(endTime.hour(), 30); + } + else { + end = QTime(endTime.hour() + 1, 0); + } + + return QPair (start, end); +} + +/*! + Calculate height of one minute from widget height, and start/end time. + */ +qreal CalenDayStatusStrip::calculateMinuteHeight(const QTime &start, + const QTime &end) +{ + qreal min = start.secsTo(end) / mMinute; + + qreal height = size().height(); + + return height / min; +} diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/src/calendayutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/src/calendayutils.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,234 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: CalenDayUtils utility class implementation. +* +*/ + +// System includes +#include +#include +#include +#include + +// User includes +#include "calendayutils.h" +#include "calendaycommonheaders.h" +#include "agendaentry.h" +#include "calendateutils.h" + +// Initialization of static member +CalenDayUtils* CalenDayUtils::mInstance = 0; + +/*! + \class CalenDayUtils + \brief Singleton utility class. + + Class cannot be used in console applications. + + Provided functionalities (getters): + - screen width of device + - default width of hour element + - default height of hour element + - default width of content area + - current orientation of screen + - pointer to the main window of application + */ + +/*! + \brief Returns the instance of CalenDayUtils class + */ +CalenDayUtils *CalenDayUtils::instance() +{ + if (!mInstance) { + mInstance = new CalenDayUtils(); + } + return mInstance; +} + +/*! + \brief Destructor + */ +CalenDayUtils::~CalenDayUtils() +{ + +} + +/*! + \brief screenWidth + + \return Width of main window's screen + */ +qreal CalenDayUtils::screenWidth() const +{ + ASSERT(mMainWindow); + + return mMainWindow->layoutRect().width(); +} + +/*! + \brief hourElementWidth + + \return Width of hour element + */ +qreal CalenDayUtils::hourElementWidth() const +{ + return mHourElementWidth; +} + +/*! + \brief hourElementHeight + + \return Height of hour element + */ +qreal CalenDayUtils::hourElementHeight() const +{ + return mHourElementHeight; +} + +/*! + \brief contentWidth + + \return Width of content area + */ +qreal CalenDayUtils::contentWidth() const +{ + return (screenWidth() - mHourElementWidth); +} + +/*! + \brief orientation + + \return Orientation of main window + */ +Qt::Orientation CalenDayUtils::orientation() const +{ + ASSERT(mMainWindow); + + return mMainWindow->orientation(); +} + +/*! + \brief mainWindow + + \return Pointer to main window of application + */ +HbMainWindow* CalenDayUtils::mainWindow() +{ + ASSERT(mMainWindow); + + return mMainWindow; +} + +/*! + \brief isHorizontalSwipe + + \return TRUE if horizontal swipe was recognized (angle in specific range) + */ +bool CalenDayUtils::isHorizontalSwipe(qreal angle) const +{ + bool isHSwipe = false; + if ((angle < KCalenSwipeAngle) || + ((angle > 180 - KCalenSwipeAngle) && (angle < 180 + KCalenSwipeAngle)) || + (angle > 360 - KCalenSwipeAngle)) { + isHSwipe = true; + } + + return isHSwipe; +} + +/*! + \brief getEventValidStartEndTime + \brief Get event's valid start/end time from agenda entry. + */ +void CalenDayUtils::getEventValidStartEndTime( QDateTime& start, QDateTime& end, + AgendaEntry& entry, QDateTime& currentDate ) +{ + start = entry.startTime(); + end = entry.endTime(); + + if ( !CalenDateUtils::onSameDay( start, currentDate ) ) { + start = CalenDateUtils::beginningOfDay( currentDate ); + } + + if ( !CalenDateUtils::onSameDay( end, currentDate ) ) { + QDateTime tommorrow( currentDate.addDays( 1 )); + end = CalenDateUtils::beginningOfDay( tommorrow ).addSecs( -60 ); + } +} + +/*! + \brief Constructor + */ +CalenDayUtils::CalenDayUtils() : mMainWindow(NULL) +{ + if (HbInstance::instance()->allMainWindows().count() > 0) { + mMainWindow = HbInstance::instance()->allMainWindows().first(); + } + mHourElementWidth = calculateHourElementWidth(); + mHourElementHeight = calculateHourElementHeight(); +} + +/*! + \brief Calculates the width of hour element according to UI spec. + + \return Calculated width of hour element + */ +qreal CalenDayUtils::calculateHourElementWidth() const +{ + HbStyle style; + HbDeviceProfile deviceProfile; + qreal unitInPixels = deviceProfile.unitValue(); + + // Calculate element's preferred width + qreal prefWidth = 0.0; + qreal textWidth = 0.0; + qreal horizontalSpacing = 0.0; + + textWidth = 8.04 * unitInPixels; // pix (according to UI spec) + style.parameter(QString("hb-param-margin-gene-middle-horizontal"), + horizontalSpacing, deviceProfile); + prefWidth = horizontalSpacing * 2 + textWidth; + + return prefWidth; +} + +/*! + \brief Calculates the height of hour element according to UI spec. + + \return Calculated height of hour element + */ +qreal CalenDayUtils::calculateHourElementHeight() const +{ + HbStyle style; + HbDeviceProfile deviceProfile; + + qreal unitInPixels = deviceProfile.unitValue(); + + // Calculate element's preferred height + qreal prefHeight = 0.0; + qreal textHeight = 0.0; + qreal verticalSpacing = 0.0; + + qreal bottomSpacer = 3.0 * unitInPixels; + style.parameter(QString("hb-param-text-height-secondary"), textHeight, + deviceProfile); + style.parameter(QString("hb-param-margin-gene-middle-vertical"), + verticalSpacing, deviceProfile); + + prefHeight = textHeight * 2; //time + ampm + prefHeight += verticalSpacing * 2; + prefHeight += bottomSpacer; + + return prefHeight; +} diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/src/calendayview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/src/calendayview.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,516 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: CalenDayView class definition. + * + */ + +//system includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +//user includes +#include "calendayview.h" +#include "calencontext.h" +#include "calenservices.h" +#include "calendocloader.h" +#include "calendateutils.h" //useful date/time utils +#include "calendaycontentscrollarea.h" +#include "calendaycontentwidget.h" +#include "calendayhourscrollarea.h" +#include "calendaymodelmanager.h" +#include "CalenUid.h" +#include "CalendarPrivateCRKeys.h" +#include "calenpluginlabel.h" +#include "calendaymodel.h" + +//constants + +// ----------------------------------------------------------------------------- +// CalenDayView() +// Constructor. +// ----------------------------------------------------------------------------- +// +CalenDayView::CalenDayView(MCalenServices &services) : + CalenNativeView(services), mContentScrollArea(NULL), mContentWidget(NULL), + mHourScrollArea(NULL), mSettingsManager(NULL), + mRegionalInfo(XQSettingsKey::TargetCentralRepository, KCRUidCalendar, + KCalendarShowRegionalInfo), + mServices(services), mRegionalInfoGroupBox(NULL), mGoToTodayMenuAction(NULL) +{ + setupMenu(); + + // Create model manager + mModelManager = new CalenDayModelManager(mServices, true, this); + + mVLayout = new QGraphicsLinearLayout(Qt::Vertical, NULL); + mVLayout->setContentsMargins(0.0, 0.0, 0.0, 0.0); + mVLayout->setSpacing(0.0); + + // Create heading label and insert into layout + mHeadingLabel = new HbGroupBox(); + HbEffect::add(mHeadingLabel, ":/fade_out.fxml", "fadeOut"); + HbEffect::add(mHeadingLabel, ":/fade_in.fxml", "fadeIn"); + + mSettingsManager = new XQSettingsManager(this); + + // Add day info + mVLayout->addItem(mHeadingLabel); + + //show regional info if set so + showRegionalInformationFadeIn(); + mSettingsManager->startMonitoring(mRegionalInfo); + + // Put hour scroll area and content scroll area into horizontal layout + QGraphicsLinearLayout *hLayout = new QGraphicsLinearLayout(Qt::Horizontal, NULL); + hLayout->setContentsMargins(0.0, 0.0, 0.0, 0.0); + hLayout->setSpacing(0.0); + + // Create scroll area for content (events) + mContentScrollArea = new CalenDayContentScrollArea(this); + + // Create and apply central widget for scroll area + mContentWidget = new CalenDayContentWidget(*mModelManager, mContentScrollArea); + mContentScrollArea->setContentWidget(mContentWidget); + + // Create scroll area for hour elements + mHourScrollArea = new CalenDayHourScrollArea(this); + + hLayout->addItem(mHourScrollArea); + hLayout->addItem(mContentScrollArea); + + mVLayout->addItem(hLayout); + setLayout(mVLayout); + + setupSlots(); + + //setup Back functionality + if (ECalenDayView != mServices.getFirstView()) { + HbAction* action = new HbAction(Hb::BackNaviAction, this); + setNavigationAction(action); + // Connect to the signal triggered by clicking on back button. + connect(action, SIGNAL(triggered()), this, SLOT(onBack())); + } + + HbStyleLoader::registerFilePath(":/calendayhourelement.css"); + HbStyleLoader::registerFilePath(":/calendayhourelement.widgetml"); + HbStyleLoader::registerFilePath(":/calendayitem.css"); + HbStyleLoader::registerFilePath(":/calendayitem.widgetml"); +} + +// ----------------------------------------------------------------------------- +// ~CalenDayView() +// Destructor. +// ----------------------------------------------------------------------------- +// +CalenDayView::~CalenDayView() +{ + mSettingsManager->stopMonitoring(mRegionalInfo); +} + +// ----------------------------------------------------------------------------- +// onLocaleChanged() +// Handles locale change. +// ----------------------------------------------------------------------------- +// +void CalenDayView::onLocaleChanged(int reason) +{ + Q_UNUSED( reason ) +} + +// ----------------------------------------------------------------------------- +// From CalenView +// doPopulation() +// Handles view (re)population. +// ----------------------------------------------------------------------------- +// +void CalenDayView::doPopulation() +{ + // Triggers fading effect for heading label + getCurrentDate(); + HbEffect::start(mHeadingLabel, "fadeOut", this, "setHeadingText"); + + mModelManager->refreshAllModels(); + //Set date and time for hour scroll area. + //It's later used by hour element to display timeline + mHourScrollArea->setDateTime(mDate); + + //set in menu go to today visible + QDateTime currentDateTime = QDateTime::currentDateTime(); + if (mGoToTodayMenuAction and currentDateTime.date() == mDate.date()) { + mGoToTodayMenuAction->setVisible(false); + } + else if(mGoToTodayMenuAction) { + mGoToTodayMenuAction->setVisible(true); + } + + setupViewport(); + + populationComplete(); +} + +// ----------------------------------------------------------------------------- +// From CalenView +// populationComplete() +// Informs the organizer that the view's population is complete. +// ----------------------------------------------------------------------------- +// +void CalenDayView::populationComplete() +{ + CalenNativeView::populationComplete(); +} + +// ----------------------------------------------------------------------------- +// From MCalenNotificationHandler +// HandleNotification() +// The function handles calendar notifications. +// ----------------------------------------------------------------------------- +// +void CalenDayView::HandleNotification(const TCalenNotification notification) +{ + Q_UNUSED( notification ) +} + +// ----------------------------------------------------------------------------- +// setupView() +// Sets up the view accroding to the 'xml' +// ----------------------------------------------------------------------------- +// +void CalenDayView::setupView(CalenDocLoader* docLoader) +{ + Q_UNUSED( docLoader ) +} + +//private slots + +// ----------------------------------------------------------------------------- +// onBack() +// Handles 'back' functionality; +// ----------------------------------------------------------------------------- +// +void CalenDayView::onBack() +{ + TRAP_IGNORE(mServices.IssueCommandL(ECalenMonthView)); +} + +// ----------------------------------------------------------------------------- +// dayChange() +// ----------------------------------------------------------------------------- +// +void CalenDayView::dayChangeStarted(CalenScrollDirection direction) +{ + if (direction == ECalenScrollToNext) { + mDate = mDate.addDays(1); + } + else { + mDate = mDate.addDays(-1); + } + + //set in menu go to today visible + QDateTime currentDateTime = QDateTime::currentDateTime(); + if (mGoToTodayMenuAction and currentDateTime.date() == mDate.date()) { + mGoToTodayMenuAction->setVisible(false); + } + else if(mGoToTodayMenuAction) { + mGoToTodayMenuAction->setVisible(true); + } + + // Triggers fading effect for heading label. + HbEffect::start(mHeadingLabel, "fadeOut", this, "setHeadingText"); + HbEffect::start(mRegionalInfoGroupBox, "fadeOut", this, "showRegionalInformation"); + + mServices.Context().setFocusDate(mDate); +} + +// ----------------------------------------------------------------------------- +// dayChanged() +// ----------------------------------------------------------------------------- +// +void CalenDayView::dayChanged(CalenScrollDirection direction) +{ + mModelManager->viewsScrollingFinished(direction); + mHourScrollArea->setDateTime(mDate); +} + +// ----------------------------------------------------------------------------- +// getCurrentDate() +// ----------------------------------------------------------------------------- +// +void CalenDayView::getCurrentDate() +{ + mDate = CalenNativeView::mServices.Context().focusDateAndTime(); +} + +// ----------------------------------------------------------------------------- +// setupMenu() +// ----------------------------------------------------------------------------- +// +void CalenDayView::setupMenu() +{ + menu()->addAction(hbTrId("txt_calendar_opt_new_event"), this, SLOT(runNewMeeting())); + //get pointer to this position, because need to change visibility + mGoToTodayMenuAction = menu()->addAction(hbTrId("txt_calendar_opt_go_to_today"), this, SLOT(runGoToToday())); + menu()->addAction(hbTrId("txt_calendar_opt_go_to_date"), this, SLOT(goToDate())); + //TODO: Add id for this text + //"Switch to Agenda view" + menu()->addAction(hbTrId("txt_calendar_opt_switch_to_agenda_view"), this, SLOT(runChangeToAgendaView())); + //TODO: Add id for this text (lunar data) + //"Show lunar data" + if (pluginEnabled()) + { + menu()->addAction(hbTrId("txt_calendar_opt_show_lunar_data"), this, SLOT(runLunarData())); + } + menu()->addAction(hbTrId("txt_calendar_opt_settings"), this, SLOT(launchSettingsView())); +} + +/*! + \brief Ot change Day view to Agenda View + */ +void CalenDayView::runChangeToAgendaView() +{ + changeView(ECalenAgendaView); +} + +/*! + \brief Shows lunar data in popup box + */ +void CalenDayView::runLunarData() +{ + TRAP_IGNORE(mServices.IssueCommandL(ECalenRegionalPluginTapEvent)); +} + +// ----------------------------------------------------------------------------- +// setupSlots() +// ----------------------------------------------------------------------------- +// +void CalenDayView::setupSlots() +{ + // Connecting other view-related signals/slots + connect(mContentScrollArea, + SIGNAL(scrollAreaMoveStarted(CalenScrollDirection)), this, + SLOT(dayChangeStarted(CalenScrollDirection))); + + connect(mContentScrollArea, + SIGNAL(scrollAreaMoveFinished(CalenScrollDirection)), mContentWidget, + SLOT(relayoutWidgets(CalenScrollDirection))); + + connect(mContentWidget, SIGNAL( + widgetsRelayoutFinished(CalenScrollDirection)), mContentScrollArea, + SLOT(scrollToMiddleWidget())); + + connect(mContentWidget, + SIGNAL(widgetsRelayoutFinished(CalenScrollDirection)), this, + SLOT(dayChanged(CalenScrollDirection))); + + connect(mContentWidget, SIGNAL(scrollPositionChanged(const QPointF &)), + mHourScrollArea, SLOT(scrollVertically(const QPointF &))); + + connect(mHourScrollArea, SIGNAL(scrollPositionChanged(const QPointF &)), + mContentWidget, SLOT(widgetScrolled(const QPointF &))); + + connect(mSettingsManager, SIGNAL(valueChanged(XQSettingsKey, QVariant)), + this, SLOT(showHideRegionalInformationChanged(XQSettingsKey, QVariant))); +} + +// ----------------------------------------------------------------------------- +// runNewMeeting() +// ----------------------------------------------------------------------------- +// +void CalenDayView::runNewMeeting() +{ + QDateTime dateTime(mDate); + TRAP_IGNORE( + dateTime.setTime(mServices.Context().defaultCalTimeForViewsL().time()); + mServices.Context().setFocusDateAndTime(dateTime); + mServices.IssueCommandL(ECalenNewMeeting) + ); +} + +// ----------------------------------------------------------------------------- +// runGoToToday() +// ----------------------------------------------------------------------------- +// +void CalenDayView::runGoToToday() +{ + mServices.Context().setFocusDateAndTime(CalenDateUtils::today()); + TRAP_IGNORE(mServices.IssueCommandL(ECalenGotoToday)); + refreshViewOnGoToDate(); +} + + +// ----------------------------------------------------------------------------- +// changeView() +// ----------------------------------------------------------------------------- +// +void CalenDayView::changeView(TCalenCommandId viewId) +{ + TRAP_IGNORE(mServices.IssueCommandL(viewId)); +} + +// ---------------------------------------------------------------------------- +// CalenDayView::setHeadingText +// Sets heading text according to date from model and locale. +// It's connected to modelReset signal +// ---------------------------------------------------------------------------- +// +void CalenDayView::setHeadingText(const HbEffect::EffectStatus &status) +{ + Q_UNUSED(status) + + // Format the date as per the device locale settings + HbExtendedLocale systemLocale = HbExtendedLocale::system(); + + // Get localised name of the day from locale + QString dayString = systemLocale.dayName(mDate.date().dayOfWeek()); + // Append a single space + dayString.append(" "); + // Set the heading + + // Append the date which is formatted as per the locale + mHeadingLabel->setHeading(hbTrId("txt_calendar_subhead_1_2").arg(dayString).arg( + systemLocale.format(mDate.date(), r_qtn_date_usual_with_zero))); + + HbEffect::start(mHeadingLabel, "fadeIn"); +} + +// ---------------------------------------------------------------------------- +// CalenDayView::showHideRegionalInformation +// To run effect on lunar data label +// ---------------------------------------------------------------------------- +// +void CalenDayView::showRegionalInformation(const HbEffect::EffectStatus &status) +{ + Q_UNUSED(status); + showRegionalInformationFadeIn(); +} + +// ---------------------------------------------------------------------------- +// CalenDayView::showRegionalInformationFadeIn +// To run effect on lunar data label and change text according to date change +// ---------------------------------------------------------------------------- +// +void CalenDayView::showRegionalInformationFadeIn() + { + showHideRegionalInformationChanged(mRegionalInfo, 3); + HbEffect::start(mRegionalInfoGroupBox, "fadeIn"); + } + +// ---------------------------------------------------------------------------- +// CalenDayView::showHideRegionalInformationChanged +// To Show and hide regional plugin label depends upon settings +// ---------------------------------------------------------------------------- +// +void CalenDayView::showHideRegionalInformationChanged(const XQSettingsKey& key, const QVariant&) + { + if (key.key() == mRegionalInfo.key()) + { + int showRegionalInfo = + mSettingsManager->readItemValue(mRegionalInfo).toUInt(); + + if (showRegionalInfo) + { + QString *pluginString = pluginText(); + if (pluginString) + { + if (!mRegionalInfoGroupBox) + { + mRegionalInfoGroupBox = new HbGroupBox(); + CalenPluginLabel *regionalInfo = new CalenPluginLabel( + mServices, this); + HbEffect::add(mRegionalInfoGroupBox, ":/fade_out.fxml", + "fadeOut"); + HbEffect::add(mRegionalInfoGroupBox, ":/fade_in.fxml", "fadeIn"); + + // add margins to calenpluginlabel + + HbStyle style; + HbDeviceProfile deviceProfile; + qreal marginLeft = 0.0; + qreal marginRight = 0.0; + qreal marginTop = 0.0; + qreal marginBottom = 0.0; + style.parameter(QString("hb-param-margin-gene-left"), marginLeft, deviceProfile); + style.parameter(QString("hb-param-margin-gene-right"), marginRight, deviceProfile); + style.parameter(QString("hb-param-margin-gene-top"), marginTop, deviceProfile); + style.parameter(QString("hb-param-margin-gene-bottom"), marginBottom, deviceProfile); + + regionalInfo->setContentsMargins(1, 1, 1, 1); + + // qreal width = mRegionalInfoGroupBox->size().width(); + // qreal height = mRegionalInfoGroupBox->size().height() + marginTop + marginBottom; + + // mRegionalInfoGroupBox->resize(width, height); + + mRegionalInfoGroupBox->setContentWidget(regionalInfo); + } + + if (pluginEnabled()) + { + HbLabel *pluginInfoLabel = qobject_cast ( + mRegionalInfoGroupBox->contentWidget()); + + pluginInfoLabel->setPlainText(*pluginString); + + mVLayout->insertItem(1, mRegionalInfoGroupBox); + } + } + } + else + { + + if (mRegionalInfoGroupBox) + { + mVLayout->removeItem(mRegionalInfoGroupBox); + delete mRegionalInfoGroupBox; + mRegionalInfoGroupBox = NULL; + } + } + } + } + +// ---------------------------------------------------------------------------- +// CalenDayView::setupViewport +// Scrolls view according to current day and events +// ---------------------------------------------------------------------------- +// +void CalenDayView::setupViewport() +{ + QDateTime currentTime = QDateTime::currentDateTime(); + + //Filter flags (only timed events) + AgendaUtil::FilterFlags filter = AgendaUtil::FilterFlags( + AgendaUtil::IncludeAppointments ); + QList list; + // Fetch the instance list from the agenda interface + list = mServices.agendaInterface()->fetchEntriesInRange(currentTime, currentTime, filter); + + // If we have event in current day and hour, scroll to this event + if(mDate.date() == currentTime.date() && !list.isEmpty()){ + int hourToScrollTo(list.first().startTime().time().hour()); + mHourScrollArea->scrollToHour(hourToScrollTo); + } + else{ + //Scroll view to 7am + mHourScrollArea->scrollToHour(7); + } +} + +//End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/tsrc.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/tsrc.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,26 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# This is the project specification file for calendayview test code +# + +# include test components here + +TEMPLATE = subdirs + +SUBDIRS += unittests + +CONFIG += ordered + +# End of file --Don't remove this diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaycontainer/calendayinfo.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaycontainer/calendayinfo.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,117 @@ +/* +* Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Mocked classes for testing CalenDayInfo class +* +*/ + +#ifndef CALENDAYINFO_H +#define CALENDAYINFO_H + +#include +#include "caleninstanceid.h" + +const int KFSCalMaxDescriptionLength = 100; + +/*! + Mocked struct SCalenApptInfo + */ +struct SCalenApptInfo +{ + QModelIndex iIndex; + QDateTime iStartTime; + QDateTime iEndTime; + bool iAllDay; + TCalenInstanceId iId; + AgendaEntry::Status iStatus; + TBufC iSummary; + TUint32 iColor; +}; + +/*! + Mocked class CalenTimeColumn + */ +class CalenTimeColumn +{ +public: + CalenTimeColumn() { + + } + + ~CalenTimeColumn() { + + } +}; + +/*! + Mocked class CalenTimeRegion + */ +class CalenTimeRegion +{ +public: + CalenTimeRegion() { + + } + + ~CalenTimeRegion() { + + } + + QList iColumns; + + int iStartSlot; + int iEndSlot; +}; + +/*! + Mocked class CalenDayInfo + */ +class CalenDayInfo +{ +public: + enum TSlotsInHour + { + EOne = 1, ETwo, EThree, EFour + }; + +public: + + CalenDayInfo(TSlotsInHour aSlotsInHour) { + Q_UNUSED(aSlotsInHour) + } + virtual ~CalenDayInfo(); + + void GetLocation( const SCalenApptInfo& aItemInfo, int& aStartSlot, + int& aEndSlot, int& aColumnIndex, int& aColumns ) { + Q_UNUSED(aItemInfo) + Q_UNUSED(aStartSlot) + Q_UNUSED(aEndSlot) + Q_UNUSED(aColumnIndex) + Q_UNUSED(aColumns) + } + + int AlldayCount() { + return 0; + } + + const QList& RegionList() const { + return mList; + } + +public: + QList mList; +}; + +#endif // CALENDAYINFO_H + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaycontainer/calendayview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaycontainer/calendayview.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,73 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Mocked classes for testing CalenDayContainer class +* +*/ + +#ifndef CALENSERVICES_H +#define CALENSERVICES_H + +/*! + Mocked class MCalenServices + */ +class MCalenServices +{ +public: + MCalenServices() { + + } + + ~MCalenServices() { + + } +}; + +#endif // CALENSERVICES_H + +#ifndef CALEDAYVIEW_H +#define CALEDAYVIEW_H + +#include + +enum TCalenCommandId +{ + ECalenMonthView = 0, + ECalenWeekView, + ECalenAgendaView +}; + +/*! + Mocked class CalenDayView + */ +class CalenDayView : public HbView +{ +public: + + CalenDayView(MCalenServices &services) { + Q_UNUSED(services) + } + + virtual ~CalenDayView() { + + } + + void changeView(TCalenCommandId viewId) { + Q_UNUSED(viewId) + } +}; + +#endif // CALEDAYVIEW_H + +//End of file + diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaycontainer/caleninstanceid.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaycontainer/caleninstanceid.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,44 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Mocked classes for testing CalenDayContainer class +* +*/ + +#ifndef CALENINSTANCEID_H +#define CALENINSTANCEID_H + +/*! + Mocked class TCalenInstanceId + */ +class TCalenInstanceId +{ +public: + TCalenInstanceId() { + + } + + static TCalenInstanceId nullInstanceId() { + return TCalenInstanceId(); + } + +public: // data members + ulong mEntryLocalUid; + QDateTime mInstanceTime; + AgendaEntry::Type mType; + bool mInstanceViewed; +}; + +#endif // CALENINSTANCEID_H + + diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaycontainer/hbinstance.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaycontainer/hbinstance.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,98 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Mocked classes for testing CalenDayUtils class +* +*/ + +#ifndef HBMAINWINDOW_H +#define HBMAINWINDOW_H + +#include + +// Test variables +extern QRectF gTestWindowRect; +extern Qt::Orientation gTestOrientation; + +/*! + Mocked class HbMainWindow (simulating window in unittests) + */ +class HbMainWindow +{ +public: + HbMainWindow() { + mView = new HbView(); + } + + ~HbMainWindow() { + if (mView) { + delete mView; + mView = 0; + } + } + + QRectF layoutRect() const { + return gTestWindowRect; + } + + Qt::Orientation orientation() const { + return gTestOrientation; + } + + HbView *HbMainWindow::currentView() const { + return mView; + } + + HbView *mView; +}; + +#endif // HBMAINWINDOW_H + +#ifndef HBINSTANCE_H +#define HBINSTANCE_H + +#include + +/*! + Mocked class HbInstance (simulating hbinstance in unittests) + */ +class HbInstance +{ +public: + + static HbInstance *instance() { + return new HbInstance(); + } + + QList allMainWindows() const { + return mMainWindows; + } + + HbInstance() { + HbMainWindow* window = new HbMainWindow(); + mMainWindows.append(window); + } + + ~HbInstance() { + for (int i = 0; i < mMainWindows.count(); i++) { + delete mMainWindows[i]; + } + mMainWindows.clear(); + } + + QList mMainWindows; +}; + +#endif // HBINSTANCE_H + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaycontainer/rom/unittest_calendaycontainer.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaycontainer/rom/unittest_calendaycontainer.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Image description file for test project +* +*/ + +#ifndef UNITTEST_CALENDAYCONTAINER_IBY +#define UNITTEST_CALENDAYCONTAINER_IBY + +S60_APP_EXE(unittest_calendaycontainer) +S60_APP_RESOURCE(unittest_calendaycontainer) + +// Application registration file. +data=DATAZ_\private\10003a3f\import\apps\unittest_calendaycontainer_reg.rsc \private\10003a3f\import\apps\unittest_calendaycontainer_reg.rsc + + +#endif // UNITTEST_CALENDAYCONTAINER_IBY \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaycontainer/unittest_calendaycontainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaycontainer/unittest_calendaycontainer.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Test class for CalenDayContainerWidget + * + */ +#include + +#include "calendaycontainer.h" + +// Test variables +QRectF gTestWindowRect = QRectF(0, 0, 10, 20); +Qt::Orientation gTestOrientation = Qt::Horizontal; + +class TestCalenDayContainer : public QObject +{ +Q_OBJECT + +public: + TestCalenDayContainer(); + virtual ~TestCalenDayContainer(); + +private slots: + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); + + void testConstructors(); + +private: + CalenDayContainer *mContainer; +}; + +/*! + Constructor + */ +TestCalenDayContainer::TestCalenDayContainer() : + mContainer(NULL) +{ + +} + +/*! + Destructor + */ +TestCalenDayContainer::~TestCalenDayContainer() +{ + +} + +/*! + Called before testcase + */ +void TestCalenDayContainer::initTestCase() +{ +} + +/*! + Called after testcase + */ +void TestCalenDayContainer::cleanupTestCase() +{ + +} + +/*! + Called before every function + */ +void TestCalenDayContainer::init() +{ + mContainer = new CalenDayContainer(); +} + +/*! + Called after everyfunction + */ +void TestCalenDayContainer::cleanup() +{ + if (mContainer) { + delete mContainer; + mContainer = NULL; + } +} + +/*! + Test function for constructors + 1. Test if container is not initialized + 2. Test if container is correcty created + */ +void TestCalenDayContainer::testConstructors() +{ + //1) + CalenDayContainer *testContainer = 0; + QVERIFY(!testContainer); + + //2) + testContainer = new CalenDayContainer(); + QVERIFY(testContainer); + + delete testContainer; +} + +QTEST_MAIN(TestCalenDayContainer); +#include "unittest_calendaycontainer.moc" diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaycontainer/unittest_calendaycontainer.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaycontainer/unittest_calendaycontainer.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,71 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: calendaycontentwidget test project file +# + +TEMPLATE = app +TARGET = unittest_calendaycontainer + +MOC_DIR = moc + +CONFIG += qtestlib +CONFIG += symbian_test +CONFIG += hb + +INCLUDEPATH += . \ + ../../../inc/ \ + ./../../../../inc/ \ + ./../../../../../inc/ + +DEPENDPATH += . \ + ../../../inc/ \ + ../../../src/ \ + ./../../../../inc/ \ + ./../../../../../inc/ + +# Input +HEADERS += calendaycontainer.h \ + calendayutils.h \ + calendayeventspane.h \ + calendayitem.h \ + calendaystatusstrip.h \ + calendaymodel.h + +SOURCES += unittest_calendaycontainer.cpp \ + calendaycontainer.cpp \ + calendayutils.cpp \ + calendayeventspane.cpp \ + calendayitem.cpp \ + calendaystatusstrip.cpp \ + calendaymodel.cpp + +symbian : { + TARGET.CAPABILITY = CAP_APPLICATION + MMP_RULES += "USERINCLUDE ." + + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + LIBS += -lagendainterface \ + -lxqsettingsmanager + + BLD_INF_RULES.prj_testexports += \ + "./rom/unittest_calendaycontainer.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unittest_calendaycontainer.iby)" + + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + LIBS += -lagendainterface \ + -lcalencommonutils +} + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaycontentwidget/calendaycontentwidgetheaders.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaycontentwidget/calendaycontentwidgetheaders.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,70 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Mocked classes for testing CalenDayContentWidget class +* +*/ + +#ifndef CALENSERVICES_H +#define CALENSERVICES_H + +/*! + Mocked class MCalenServices + */ +class MCalenServices +{ +public: + MCalenServices() { + + } + + ~MCalenServices() { + + } +}; + +#endif // CALENSERVICES_H + + +#ifndef CALENDAYITEMVIEW_H +#define CALENDAYITEMVIEW_H + +#include +#include +#include +#include + +/*! + Mocked class CalenDayItemView + */ +class CalenDayItemView : public HbWidget +{ + Q_OBJECT + +public: + CalenDayItemView(MCalenServices &services, HbModelIterator *iterator, + QGraphicsItem *parent) : HbWidget(parent) { + Q_UNUSED(services) + Q_UNUSED(iterator) + } + + void scrollVertically(const QPointF &newPosition) { + Q_UNUSED(newPosition) + } + +signals: + void scrollPositionChanged(const QPointF&); +}; + +#endif // CALENDAYITEMVIEW_H + diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaycontentwidget/calendaymodelmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaycontentwidget/calendaymodelmanager.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,97 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Mocked classes for testing CalenDayContentWidget class +* +*/ + + +#include "calendaycontentwidgetheaders.h" + + +#ifndef CALENDAYMODELMANAGER_H +#define CALENDAYMODELMANAGER_H + +#include + +/*! + Test class TestAbstractListModel + */ +class TestAbstractListModel : public QAbstractListModel +{ + Q_OBJECT + +public: + TestAbstractListModel() : QAbstractListModel() { + } + + ~TestAbstractListModel() { + } + + int rowCount(const QModelIndex &parent) const { + Q_UNUSED(parent); + return 0; + } + + QVariant data(const QModelIndex &index, int role) const { + Q_UNUSED(index); + Q_UNUSED(role); + return QVariant(0); + } +}; + +/*! + Test class CalenDayModelManager + */ +class CalenDayModelManager : public QObject +{ +public: + enum ModelDay { + PreviousDay = 0, + CurrentDay = 1, + NextDay = 2, + NumberOfDays + }; + + CalenDayModelManager() : QObject() { + mModel = new TestAbstractListModel(); + mServices = new MCalenServices(); + } + + ~CalenDayModelManager() { + if (mModel) { + delete mModel; + mModel = NULL; + } + + if (mServices) { + delete mServices; + mServices = NULL; + } + } + + QAbstractItemModel &getModel(CalenDayModelManager::ModelDay day) { + Q_UNUSED(day) + return *mModel; + } + + MCalenServices &getServices() { + return *mServices; + } + +public: + TestAbstractListModel *mModel; + MCalenServices *mServices; +}; + +#endif//CALENDAYMODELMANAGER_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaycontentwidget/rom/unittest_calendaycontentwidget.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaycontentwidget/rom/unittest_calendaycontentwidget.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Image description file for test project +* +*/ + +#ifndef UNITTEST_CALENDAYCONTENTWIDGET_IBY +#define UNITTEST_CALENDAYCONTENTWIDGET_IBY + +S60_APP_EXE(unittest_calendaycontentwidget) +S60_APP_RESOURCE(unittest_calendaycontentwidget) + +// Application registration file. +data=DATAZ_\private\10003a3f\import\apps\unittest_calendaycontentwidget_reg.rsc \private\10003a3f\import\apps\unittest_unittest_calendaycontentwidget_reg.rsc + + +#endif // UNITTEST_CALENDAYCONTENTWIDGET_IBY \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaycontentwidget/unittest_calendaycontentwidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaycontentwidget/unittest_calendaycontentwidget.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Test class for CalenDayContentWidget + * + */ +#include +#include + + +#include "calendaymodelmanager.h" +#include "calendaycontentwidget.h" + +class TestCalenContentWidget : public QObject +{ +Q_OBJECT + +public: + TestCalenContentWidget(); + virtual ~TestCalenContentWidget(); + +private slots: + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); + + void testConstructors(); + +private: + CalenDayModelManager *mModelMgr; + CalenDayContentWidget *mContentWidget; +}; + +/*! + Constructor + */ +TestCalenContentWidget::TestCalenContentWidget() : + mModelMgr(NULL), mContentWidget(NULL) +{ + +} + +/*! + Destructor + */ +TestCalenContentWidget::~TestCalenContentWidget() +{ + +} + +/*! + Called before testcase + */ +void TestCalenContentWidget::initTestCase() +{ + mModelMgr = new CalenDayModelManager(); +} + +/*! + Called after testcase + */ +void TestCalenContentWidget::cleanupTestCase() +{ + if (mModelMgr) { + delete mModelMgr; + } +} + +/*! + Called before every function + */ +void TestCalenContentWidget::init() +{ + +} + +/*! + Called after everyfunction + */ +void TestCalenContentWidget::cleanup() +{ + if (mContentWidget) { + delete mContentWidget; + mContentWidget = NULL; + } +} + +/*! + Test class for constructors + 1. Test if content widget is correcty created + */ +void TestCalenContentWidget::testConstructors() +{ + QVERIFY(!mContentWidget); + mContentWidget = new CalenDayContentWidget(*mModelMgr); + QVERIFY(mContentWidget); +} + +QTEST_MAIN(TestCalenContentWidget); +#include "unittest_calendaycontentwidget.moc" diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaycontentwidget/unittest_calendaycontentwidget.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaycontentwidget/unittest_calendaycontentwidget.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,50 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: calendaycontentwidget test project file +# + +TEMPLATE = app +TARGET = unittest_calendaycontentwidget + +MOC_DIR = moc + +CONFIG += qtestlib +CONFIG += symbian_test +CONFIG += hb + +INCLUDEPATH += . \ + ../../../inc/ \ + +DEPENDPATH += . \ + ../../../inc/ \ + ../../../src/ + +# Input +HEADERS += calendaymodelmanager.h \ + calendaycontentwidgetheaders.h \ + calendaycontentwidget.h + + +SOURCES += unittest_calendaycontentwidget.cpp \ + calendaycontentwidget.cpp + +symbian : { + TARGET.CAPABILITY = CAP_APPLICATION + MMP_RULES += "USERINCLUDE ." + + BLD_INF_RULES.prj_testexports += \ + "./rom/unittest_calendaycontentwidget.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unittest_calendaycontentwidget.iby)" +} + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayeventspane/rom/unittest_calendayeventspane.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayeventspane/rom/unittest_calendayeventspane.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Image description file for test project +* +*/ + +#ifndef UNITTEST_CALENDAYEVENTSPANE_IBY +#define UNITTEST_CALENDAYEVENTSPANE_IBY + +S60_APP_EXE(unittest_calendayeventspane) +S60_APP_RESOURCE(unittest_calendayeventspane) + +// Application registration file. +data=DATAZ_\private\10003a3f\import\apps\unittest_calendayeventspane_reg.rsc \private\10003a3f\import\apps\unittest_calendayeventspane_reg.rsc + + +#endif // UNITTEST_CALENDAYEVENTSPANE_IBY \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayeventspane/unittest_calendayeventspane.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayeventspane/unittest_calendayeventspane.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Test class for CalenDayContentWidget + * + */ +#include +#include +#include + +#include "calendayeventspane.h" + +class TestCalenEventsPane : public QObject +{ +Q_OBJECT + +public: + TestCalenEventsPane(); + virtual ~TestCalenEventsPane(); + +private slots: + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); + + void testConstructors(); + +private: + CalenDayEventsPane *mEventsPane; +}; + +/*! + Constructor + */ +TestCalenEventsPane::TestCalenEventsPane() : + mEventsPane(NULL) +{ + +} + +/*! + Destructor + */ +TestCalenEventsPane::~TestCalenEventsPane() +{ + +} + +/*! + Called before testcase + */ +void TestCalenEventsPane::initTestCase() +{ +} + +/*! + Called after testcase + */ +void TestCalenEventsPane::cleanupTestCase() +{ + +} + +/*! + Called before every function + */ +void TestCalenEventsPane::init() +{ + mEventsPane = new CalenDayEventsPane(); +} + +/*! + Called after everyfunction + */ +void TestCalenEventsPane::cleanup() +{ + if (mEventsPane) { + delete mEventsPane; + mEventsPane = NULL; + } +} + +/*! + Test function for constructors + 1. Test if events pane is not initialized + 2. Test if events pane is correcty created + */ +void TestCalenEventsPane::testConstructors() +{ + //1) + CalenDayEventsPane *testEventsPane = 0; + QVERIFY(!testEventsPane); + + //2) + testEventsPane = new CalenDayEventsPane(); + QVERIFY(testEventsPane); + delete testEventsPane; +} + +QTEST_MAIN(TestCalenEventsPane); +#include "unittest_calendayeventspane.moc" diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayeventspane/unittest_calendayeventspane.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayeventspane/unittest_calendayeventspane.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,48 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: calendaycontentwidget test project file +# + +TEMPLATE = app +TARGET = unittest_calendayeventspane + +MOC_DIR = moc + +CONFIG += qtestlib +CONFIG += symbian_test +CONFIG += hb + +INCLUDEPATH += . \ + ../../../inc/ \ + +DEPENDPATH += . \ + ../../../inc/ \ + ../../../src/ + +# Input +HEADERS += calendayeventspane.h + + +SOURCES += unittest_calendayeventspane.cpp \ + calendayeventspane.cpp + +symbian : { + TARGET.CAPABILITY = CAP_APPLICATION + MMP_RULES += "USERINCLUDE ." + + BLD_INF_RULES.prj_testexports += \ + "./rom/unittest_calendayeventspane.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unittest_calendayeventspane.iby)" +} + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayhourelement/rom/unittest_calendayhourelement.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayhourelement/rom/unittest_calendayhourelement.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Image description file for test project +* +*/ + +#ifndef UNITTEST_CALENDAYHOURELEMENT_IBY +#define UNITTEST_CALENDAYHOURELEMENT_IBY + +S60_APP_EXE(unittest_calendayhourelement) +S60_APP_RESOURCE(unittest_calendayhourelement) + +// Application registration file. +data=DATAZ_\private\10003a3f\import\apps\unittest_calendayhourelement_reg.rsc \private\10003a3f\import\apps\unittest_calendayhourelement_reg.rsc + + +#endif // UNITTEST_CALENDAYHOURELEMENT_IBY \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayhourelement/unittest_calendayhourelement.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayhourelement/unittest_calendayhourelement.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Test class for CalenDayContentWidget + * + */ +#include +#include + +#include "calendayhourelement.h" + +class TestCalenDayHourElement : public QObject +{ +Q_OBJECT + +public: + TestCalenDayHourElement(); + virtual ~TestCalenDayHourElement(); + +private slots: + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); + + void testConstructors(); + +private: + CalenDayHourElement *mHourElement; + QTime mTime; +}; + +/*! + Constructor + */ +TestCalenDayHourElement::TestCalenDayHourElement() : + mHourElement(NULL) +{ + +} + +/*! + Destructor + */ +TestCalenDayHourElement::~TestCalenDayHourElement() +{ + +} + +/*! + Called before testcase + */ +void TestCalenDayHourElement::initTestCase() +{ +} + +/*! + Called after testcase + */ +void TestCalenDayHourElement::cleanupTestCase() +{ + +} + +/*! + Called before every function + */ +void TestCalenDayHourElement::init() +{ + mHourElement = new CalenDayHourElement(mTime); +} + +/*! + Called after everyfunction + */ +void TestCalenDayHourElement::cleanup() +{ + if (mHourElement) { + delete mHourElement; + mHourElement = NULL; + } +} + +/*! + Test function for constructors + 1. Test if content widget is not initialized + 2. Test if content widget is correcty created + */ +void TestCalenDayHourElement::testConstructors() +{ + //1) + CalenDayHourElement *testHourElement = 0; + QVERIFY(!testHourElement); + + testHourElement = new CalenDayHourElement(mTime); + + QVERIFY(testHourElement); + + delete testHourElement; +} + +QTEST_MAIN(TestCalenDayHourElement); +#include "unittest_calendayhourelement.moc" diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayhourelement/unittest_calendayhourelement.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayhourelement/unittest_calendayhourelement.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,50 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: calendaycontentwidget test project file +# + +TEMPLATE = app +TARGET = unittest_calendayhourelement + +MOC_DIR = moc + +CONFIG += qtestlib +CONFIG += symbian_test +CONFIG += hb + +INCLUDEPATH += . \ + ../../../inc/ \ + +DEPENDPATH += . \ + ../../../inc/ \ + ../../../src/ + +# Input +HEADERS += calendayhourelement.h \ + calendayhourscrollarea.h + + +SOURCES += unittest_calendayhourelement.cpp \ + calendayhourelement.cpp \ + calendayhourscrollarea.cpp + +symbian : { + TARGET.CAPABILITY = CAP_APPLICATION + MMP_RULES += "USERINCLUDE ." + + BLD_INF_RULES.prj_testexports += \ + "./rom/unittest_calendayhourelement.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unittest_calendayhourelement.iby)" +} + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayhourscrollarea/rom/unittest_calendayhourscrollarea.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayhourscrollarea/rom/unittest_calendayhourscrollarea.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Image description file for test project +* +*/ + +#ifndef UNITTEST_CALENDAYHOURSCROLLAREA_IBY +#define UNITTEST_CALENDAYHOURSCROLLAREA_IBY + +S60_APP_EXE(unittest_calendayhourscrollarea) +S60_APP_RESOURCE(unittest_calendayhourscrollarea) + +// Application registration file. +data=DATAZ_\private\10003a3f\import\apps\unittest_calendayhourscrollarea_reg.rsc \private\10003a3f\import\apps\unittest_calendayhourscrollarea_reg.rsc + + +#endif // UNITTEST_CALENDAYHOURSCROLLAREA_IBY \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayhourscrollarea/unittest_calendayhourscrollarea.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayhourscrollarea/unittest_calendayhourscrollarea.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Test class for CalenDayContentWidget + * + */ +#include +#include + +#include "calendayhourscrollarea.h" + +class TestCalenDayHourScrollArea : public QObject +{ +Q_OBJECT + +public: + TestCalenDayHourScrollArea(); + virtual ~TestCalenDayHourScrollArea(); + +private slots: + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); + + void testConstructors(); + +private: + CalenDayHourScrollArea *mHourScrollArea; +}; + +/*! + Constructor + */ +TestCalenDayHourScrollArea::TestCalenDayHourScrollArea() : + mHourScrollArea(NULL) +{ + +} + +/*! + Destructor + */ +TestCalenDayHourScrollArea::~TestCalenDayHourScrollArea() +{ + +} + +/*! + Called before testcase + */ +void TestCalenDayHourScrollArea::initTestCase() +{ +} + +/*! + Called after testcase + */ +void TestCalenDayHourScrollArea::cleanupTestCase() +{ + +} + +/*! + Called before every function + */ +void TestCalenDayHourScrollArea::init() +{ + mHourScrollArea = new CalenDayHourScrollArea(); +} + +/*! + Called after everyfunction + */ +void TestCalenDayHourScrollArea::cleanup() +{ + if (mHourScrollArea) { + delete mHourScrollArea; + mHourScrollArea = NULL; + } +} + +/*! + Test function for constructors + 1. Test if hour scroll area is not initialized + 2. Test if hour scroll area is correcty created + */ +void TestCalenDayHourScrollArea::testConstructors() +{ + //1) + CalenDayHourScrollArea *testHourScrollArea = 0; + QVERIFY(!testHourScrollArea); + + testHourScrollArea = new CalenDayHourScrollArea(); + + QVERIFY(testHourScrollArea); + + delete testHourScrollArea; +} + +QTEST_MAIN(TestCalenDayHourScrollArea); +#include "unittest_calendayhourscrollarea.moc" diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayhourscrollarea/unittest_calendayhourscrollarea.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayhourscrollarea/unittest_calendayhourscrollarea.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,61 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: calendaycontentwidget test project file +# + +TEMPLATE = app +TARGET = unittest_calendayhourscrollarea + +MOC_DIR = moc + +CONFIG += qtestlib +CONFIG += symbian_test +CONFIG += hb + +INCLUDEPATH += . \ + ../../../inc/ \ + ./../../../../inc/ \ + ./../../../../../inc/ + +DEPENDPATH += . \ + ../../../inc/ \ + ../../../src/ \ + ./../../../../inc/ \ + ./../../../../../inc/ + +# Input +HEADERS += calendayhourelement.h \ + calendayhourscrollarea.h \ + calendayutils.h + + +SOURCES += unittest_calendayhourscrollarea.cpp \ + calendayhourelement.cpp \ + calendayhourscrollarea.cpp \ + calendayutils.cpp + +symbian : { + TARGET.CAPABILITY = CAP_APPLICATION + MMP_RULES += "USERINCLUDE ." + + BLD_INF_RULES.prj_testexports += \ + "./rom/unittest_calendayhourscrollarea.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unittest_calendayhourscrollarea.iby)" + + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + LIBS += -lagendainterface \ + -lcalencommonutils +} + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayinfo/rom/unittest_calendayinfo.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayinfo/rom/unittest_calendayinfo.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Image description file for test project +* +*/ + +#ifndef UNITTEST_CALENDAYINFO_IBY +#define UNITTEST_CALENDAYINFO_IBY + +S60_APP_EXE(unittest_calendayinfo) +S60_APP_RESOURCE(unittest_calendayinfo) + +// Application registration file. +data=DATAZ_\private\10003a3f\import\apps\unittest_calendayinfo_reg.rsc \private\10003a3f\import\apps\unittest_calendayinfo_reg.rsc + + +#endif // UNITTEST_CALENDAYINFO_IBY \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayinfo/unittest_calendayinfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayinfo/unittest_calendayinfo.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Test class for CalenDayContentWidget + * + */ +#include +#include + + +#include + +#include "calendayinfo.h" +#include "calendaycommonheaders.h" + +class TestCalenDayInfo : public QObject +{ +Q_OBJECT + +public: + TestCalenDayInfo(); + virtual ~TestCalenDayInfo(); + +private slots: + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); + + void testConstructors(); + +private: + CalenDayInfo *mInfo; +}; + +/*! + Constructor + */ +TestCalenDayInfo::TestCalenDayInfo() : + mInfo(NULL) +{ + +} + +/*! + Destructor + */ +TestCalenDayInfo::~TestCalenDayInfo() +{ + +} + +/*! + Called before testcase + */ +void TestCalenDayInfo::initTestCase() +{ +} + +/*! + Called after testcase + */ +void TestCalenDayInfo::cleanupTestCase() +{ + +} + +/*! + Called before every function + */ +void TestCalenDayInfo::init() +{ + mInfo = new CalenDayInfo(CalenDayInfo::ETwo); +} + +/*! + Called after everyfunction + */ +void TestCalenDayInfo::cleanup() +{ + if (mInfo) { + delete mInfo; + mInfo = NULL; + } +} + +/*! + Test function for constructors + 1. Test if CalenDayInfo is not initialized + 2. Test if CalenDayInfo is correcty created + */ +void TestCalenDayInfo::testConstructors() +{ + //1) + CalenDayInfo *testCalenDayInfo = 0; + QVERIFY(!testCalenDayInfo); + + //2) + testCalenDayInfo = new CalenDayInfo(CalenDayInfo::ETwo); + QVERIFY(testCalenDayInfo); +} + + +QTEST_MAIN(TestCalenDayInfo); + +#include "unittest_calendayinfo.moc" diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayinfo/unittest_calendayinfo.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayinfo/unittest_calendayinfo.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,61 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: calendaycontentwidget test project file +# + +TEMPLATE = app +TARGET = unittest_calendayinfo + +MOC_DIR = moc + +CONFIG += qtestlib +CONFIG += symbian_test +CONFIG += hb + +INCLUDEPATH += . \ + ../../inc/ \ + ../../../inc/ \ + ../../../../../inc/ \ + ../../../../../commonutils/inc/ + +DEPENDPATH += . \ + ../../inc/ \ + ../../../inc/ \ + ../../../../../inc/ \ + ../../../../../commonutils/inc/ \ + ../../../src/ + +# Input +HEADERS += calendayinfo.h \ + calinstance.h \ + caleninstanceid.h \ + calenagendautils.h \ + calenconstants.h \ + calendateutils.h + + +SOURCES += unittest_calendayinfo.cpp \ + calendayinfo.cpp + +symbian : { + TARGET.CAPABILITY = CAP_APPLICATION + MMP_RULES += "USERINCLUDE ." + + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + BLD_INF_RULES.prj_testexports += \ + "./rom/unittest_calendayinfo.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unittest_calendayinfo.iby)" +} + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayitem/rom/unittest_calendayitem.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayitem/rom/unittest_calendayitem.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Image description file for test project +* +*/ + +#ifndef UNITTEST_CALENDAYITEM_IBY +#define UNITTEST_CALENDAYITEM_IBY + +S60_APP_EXE(unittest_calendayitem) +S60_APP_RESOURCE(unittest_calendayitem) + +// Application registration file. +data=DATAZ_\private\10003a3f\import\apps\unittest_calendayitem_reg.rsc \private\10003a3f\import\apps\unittest_calendayitem_reg.rsc + + +#endif // UNITTEST_CALENDAYITEM_IBY \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayitem/unittest_calendayitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayitem/unittest_calendayitem.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Test class for CalenDayContentWidget + * + */ +#include +#include + + +#include "calendayitem.h" + +class TestCalenDayItem : public QObject +{ +Q_OBJECT + +public: + TestCalenDayItem(); + virtual ~TestCalenDayItem(); + +private slots: + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); + + void testConstructors(); + void testCreateItem(); + +private: + CalenDayItem *mItem; +}; + +/*! + Constructor + */ +TestCalenDayItem::TestCalenDayItem() : + mItem(NULL) +{ + +} + +/*! + Destructor + */ +TestCalenDayItem::~TestCalenDayItem() +{ + +} + +/*! + Called before testcase + */ +void TestCalenDayItem::initTestCase() +{ +} + +/*! + Called after testcase + */ +void TestCalenDayItem::cleanupTestCase() +{ + +} + +/*! + Called before every function + */ +void TestCalenDayItem::init() +{ + mItem = new CalenDayItem(); +} + +/*! + Called after everyfunction + */ +void TestCalenDayItem::cleanup() +{ + if (mItem) { + delete mItem; + mItem = NULL; + } +} + +/*! + Test function for constructors + 1. Test if content widget is not initialized + 2. Test if content widget is correcty created + */ +void TestCalenDayItem::testConstructors() +{ + //1) + CalenDayItem *testItem = 0; + QVERIFY(!testItem); + + //2) + testItem = new CalenDayItem(); + QVERIFY(testItem); + delete testItem; +} + +/*! + Test function for creating new abstract items. + 1. Test if item is created + 2. Test if is the same as orginal. + */ +void TestCalenDayItem::testCreateItem() +{ + HbAbstractViewItem *testItem = mItem->createItem(); + QVERIFY(testItem); + + delete testItem; +} + +QTEST_MAIN(TestCalenDayItem); +#include "unittest_calendayitem.moc" diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayitem/unittest_calendayitem.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayitem/unittest_calendayitem.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,55 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: calendaycontentwidget test project file +# + +TEMPLATE = app +TARGET = unittest_calendayitem + +MOC_DIR = moc + +CONFIG += qtestlib +CONFIG += symbian_test +CONFIG += hb + +INCLUDEPATH += . \ + ../../../inc/ \ + ../../../../inc/ + +DEPENDPATH += . \ + ../../../inc/ \ + ../../../src/ + +# Input +HEADERS += calendayitem.h \ + calendaystatusstrip.h + + +SOURCES += unittest_calendayitem.cpp \ + calendayitem.cpp \ + calendaystatusstrip.cpp + +symbian : { + TARGET.CAPABILITY = CAP_APPLICATION + MMP_RULES += "USERINCLUDE ." + + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + LIBS += -lagendainterface + + BLD_INF_RULES.prj_testexports += \ + "./rom/unittest_calendayitem.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unittest_calendayitem.iby)" +} + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayitemview/calencontext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayitemview/calencontext.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,38 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#ifndef CALENCONTEXT_H +#define CALENCONTEXT_H + +#include +#include "calendayinfo.h" + +class MCalenContext +{ + public: + MCalenContext() {} + + void setFocusDateAndTimeAndInstance( const QDateTime& focusDateTime, + const TCalenInstanceId& aInstanceId ) + { + Q_UNUSED(focusDateTime); + Q_UNUSED(aInstanceId); + } + +}; + +#endif diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayitemview/calendaycontainer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayitemview/calendaycontainer.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + */ + +#ifndef CALENDAYCONTAINER_H +#define CALENDAYCONTAINER_H + +//System includes +#include + +#include "../../../../../mw/hb/src/hbwidgets/itemviews/hbabstractitemcontainer_p.h" + +//User includes + +//Forward declarations +#include "calendayinfo.h" + +class CalenDayContainer : public HbAbstractItemContainer +{ + Q_OBJECT + +public: + + /** + * Constructor. + */ + CalenDayContainer(QGraphicsItem *parent = 0) + { + Q_UNUSED(parent); + } + + /** + * Destructor. + */ + ~CalenDayContainer(){} + + /** + * + */ + void itemAdded (int index, HbAbstractViewItem *item, bool animate) + { + Q_UNUSED(index); + Q_UNUSED(item); + Q_UNUSED(animate); + } + + /** + * + */ + void itemRemoved (HbAbstractViewItem *item, bool animate) + { + Q_UNUSED(item); + Q_UNUSED(animate); + } + + /** + * + */ + //void reset(); + + /** + * + */ + void viewResized (const QSizeF &size) + { + Q_UNUSED(size); + } + + /** + * Sets day's info structer to the container. + * + * @param dayInfo Day info. + */ + void setDayInfo( CalenDayInfo* dayInfo ) + { + Q_UNUSED(dayInfo); + } + +public slots: + + /** + * Slot handles layout switch. + * @param orientation Current device orientation + */ + void orientationChanged(Qt::Orientation orientation) + { + Q_UNUSED(orientation); + } + +protected: + + /** + * + */ + HbAbstractViewItem * createDefaultPrototype() const{ return 0;} + + /** + * + */ + // void setItemModelIndex(HbAbstractViewItem *item, const QModelIndex &index); + + /** + * Updates geometry of a timed event. + */ + // void updateTimedEventGeometry(HbAbstractViewItem *item, + // const QModelIndex &index); + + /** + * Updates geometry of a all-day events + */ + // void updateAllDayEventGeometry(HbAbstractViewItem *item, + // const QModelIndex &index); + + /** + * Structure with event layout values. + * + * eventAreaX X value for event area start. + * eventAreaWidth The width of event area. + * eventMargin Margins between the multiple events. + * slotHeight Half hour slot's height. + * unitInPixels no. of pixels in 1un + */ + + /*struct LayoutValues { + LayoutValues() + :eventAreaX(0), + eventAreaWidth(0), + eventMargin(0), + slotHeight(0), + unitInPixels(0), + maxColumns(0) + {} + + qreal eventAreaX; + qreal eventAreaWidth; + qreal eventMargin; + qreal slotHeight; + qreal unitInPixels; + int maxColumns; + }; + */ + /** + * Gets event layout values. + * + * @param layoutValues structure to be filled with layout data + */ + //void getTimedEventLayoutValues(LayoutValues& layoutValues); + + + /** + * creates absorbers which prevent touching to small items + * (according to UI spec items smaller than ... are untouchable) + */ + //void createTouchEventAbsorbers(); + + /** + * + */ + //TouchEventAbsorber* crateAbsorberBetweenSlots(int startSlot, int endSlot); + +private: + + //bool mGeometryUpdated; + + //QDateTime mDateTime; + + /** + * Day event info. + * Not own. + */ + //CalenDayInfo* mInfo; + + // LayoutValues mLayoutValues; + //QList mAbsorbers; +}; + + + +class TouchEventAbsorber : public HbWidget + { + Q_OBJECT + public: + TouchEventAbsorber(QGraphicsItem *parent=0); + ~TouchEventAbsorber(); + + protected: + void gestureEvent(QGestureEvent *event); + +#ifdef _DEBUG + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, + QWidget *widget); +#endif + + }; + +#endif // CALENDAYCONTAINER_H + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayitemview/calendayinfo.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayitemview/calendayinfo.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + */ + +#ifndef CALENDAYINFO_H +#define CALENDAYINFO_H + +#include +#include "caleninstanceid.h" +#include + +//from hb_calencommands.hrh + +enum TCalenCommandId + { + ECalenMonthView, + ECalenWeekView, + ECalenAgendaView, + ECalenDayView, + ECalenTodoEditor, + ECalenTodoEditorDone, + ECalenForwardsToDayView, + ECalenNextView, + ECalenPrevView, + ECalenSwitchView, + ECalenShowToolbar, + ECalenHideToolbar, + ECalenUpdateToolbar, + ECalenHidePreview, + ECalenShowPreview, + ECalenStartActiveStep, + ECalenGotoToday, + ECalenGotoDate, + ECalenEventView, + ECalenCmdPromptThenEdit, + ECalenFasterAppExit, + ECalenShowNextDay, + ECalenShowPrevDay, + ECalenNewMeeting, + ECalenNewAnniv, + ECalenNewDayNote, + ECalenNewReminder, + ECalenNewMeetingRequest, + ECalenNewEntry, + ECalenEditCurrentEntry, + ECalenEditSeries, + ECalenEditOccurrence, + ECalenEditEntryFromViewer, + ECalenViewCurrentEntry, + ECalenNotifyFocusChange, + ECalenCompleteTodo, + ECalenRestoreTodo, + ECalenSend, + ECalenDeleteCurrentEntry, + ECalenDeleteEntryWithoutQuery, + ECalenDeleteSeries, + ECalenDeleteCurrentOccurrence, + ECalenDeleteAllEntries, + ECalenDeleteEntriesBeforeDate, + ECalenCancelDelete, + ECalenDeleteEntryFromViewer, + ECalenShowSettings, + ECalenGetLocation, + ECalenShowLocation, + ECalenGetLocationAndSave, + ECalenMissedAlarmsView, + ECalenMissedEventView, + ECalenCmdClear, + ECalenCmdClearAll, + ECalenCmdGotoCalendar, + ECalenMissedAlarmsViewFromIdle, + ECalenMissedEventViewFromIdle, + ECalenLastCommand, + ECalenRegionalPluginTapEvent + }; + +//////////////////end of hb_calencommands.hrh + +struct SCalenApptInfo + { + QModelIndex iIndex; + QDateTime iStartTime; + QDateTime iEndTime; + bool iAllDay; + TCalenInstanceId iId; +// AgendaEntry::Status iStatus; +// AgendaEntry::TReplicationStatus iReplicationStatus; + // TBufC iSummary; + TUint32 iColor; + }; + +class CalenDayInfo +{ +public: + + enum TSlotsInHour + { + EOne = 1, + ETwo, + EThree, + EFour + }; + +public: // Constructors and destructor + + /** + * C++ default constructor. + */ + CalenDayInfo( TSlotsInHour aSlotsInHour ) {Q_UNUSED(aSlotsInHour);} + +public: + + void Reset() {} + + void InsertTimedEvent( const SCalenApptInfo& aItemInfo ) {Q_UNUSED(aItemInfo);} + + //void InsertUntimedEvent( AgendaEntry::Type aType, + // const TCalenInstanceId& aId ); + + void InsertAlldayEvent( const SCalenApptInfo& aItemInfo ){Q_UNUSED(aItemInfo);} + + //static bool IsAlldayEvent( QDateTime aStart, QDateTime aEnd ); + + + //int SuggestedUntimedSlotPos(); + + //int NeededUntimedSlotCount(); + + //int UpdateUntimedPos( int aSlot = -1, int aUntimedCount = 0 ); + + //int FirstOccupiedSlot(); + + //int LastOccupiedSlot(); + + //int EarliestEndSlot(); + //int LastStartSlot(); + + + //int SlotIndexForStartTime( QDateTime aStartTime ); + + //int SlotIndexForEndTime( QDateTime aStartTime ); + + //void GetLocation( const SCalenApptInfo& aItemInfo, + // int& aStartSlot, + // int& aEndSlot, + // int& aColumnIndex, + // int& aColumns ); + + //int AlldayCount(); + + //int TodoCount(); + + //bool IsHourStartSlot( const int& aSlotIndex ) const; + + //bool IsExtraSlot( const int& aSlotIndex ) const; + + //int HourFromSlotIndex( const int& aSlotIndex ) const; + + //int SlotIndexFromHour( int aHour ); + + //int RoundHourUp( int aSlot ); + + //int RoundHourDown( int aSlot ); + + //void GetSelectedSlot( int& aSlot, int& aRegion, int& aColumnIndex, int& aColumns ); + + //bool MoveSelection( TScrollDirection aDirection ); + + //void MoveSelectionInEvent( TScrollDirection aDirection ); + + //void UpdateSelectionInEvent(); + + //bool IsEventSelected() const; + + // bool IsMultipleEventsSelected() const; + + //bool IsAlldayEventSelected() const; + + //TCalenInstanceId SelectedEvent(); + + //int SelectEvent( const TCalenInstanceId& aId ); + + //TCalenInstanceId UntimedEvent( int aIndex ); + + //const CalenTimedEventInfo& AlldayEvent( int aIndex ); + + //void SelectSlot( int aSlot ); + + + //const QList& RegionList() const; + + + //void GetEventIntervals( QList& aArray ) const; + + + // CalenSlotInterval SelectedInterval(); + + // bool SetSelectionInRegion( int aRegion, int aColumn, int aSlot ); +}; + +#endif diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayitemview/calendaymodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayitemview/calendaymodel.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,72 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Single day item view model +* +*/ + +#ifndef CALENDAYMODEL_H +#define CALENDAYMODEL_H + +//System includes +#include +#include +#include + +#include + +//User includes + +//Forward declarations +class MCalenServices; + +//Constantss +const int CalenDayEntry = Qt::UserRole + 1; + +Q_DECLARE_METATYPE(AgendaEntry) +class CalenDayModel : public QAbstractListModel +{ + Q_OBJECT +public: + CalenDayModel(const QDateTime &date, MCalenServices &services, + QObject *parent = 0) + { + Q_UNUSED(date) + Q_UNUSED(parent) + Q_UNUSED(date) + }; + + // from QAbstractListModel + int rowCount(const QModelIndex &parent = QModelIndex()) const + { + return 0; + } + QVariant data(const QModelIndex &index, int role) const + { + Q_UNUSED(index) + Q_UNUSED(role) + return QVariant(); + } + + void refreshModel(const QDateTime &date) + { + Q_UNUSED(date) + }; + + QDateTime modelDate() const + {return QDateTime();} + +}; + +#endif //CALENDAYMODEL_H + diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayitemview/calenservices.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayitemview/calenservices.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + */ + +#ifndef CALENSERVICES_H +#define CALENSERVICES_H + +#include "calencontext.h" + +/*! + Mocked class MCalenServices + */ +class MCalenServices +{ +public: + MCalenServices() { + + } + + ~MCalenServices() { + + } + + MCalenContext Context() {return MCalenContext();} + + bool IssueCommandL( quint32 aCommand ) {Q_UNUSED(aCommand); return true;} +}; + +#endif // CALENSERVICES_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayitemview/hbinstance.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayitemview/hbinstance.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,96 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Mocked classes for testing CalenDayUtils class +* +*/ + +#ifndef HBMAINWINDOW_H +#define HBMAINWINDOW_H + +#include +#include +#include + +// Test variables +extern QRectF gTestWindowRect; +extern Qt::Orientation gTestOrientation; + + + +/*! + Mocked class HbMainWindow (simulating window in unittests) + */ +class HbMainWindow +: public QObject +{ + Q_OBJECT +public: + HbMainWindow(QObject *parent = 0) : QObject(parent){ + Q_UNUSED(parent); + } + + ~HbMainWindow() { + } + + QRectF layoutRect() const { + return gTestWindowRect; + } + + Qt::Orientation orientation() const { + return gTestOrientation; + } +signals: + void orientationChanged(Qt::Orientation); +}; + +#endif // HBMAINWINDOW_H + +#ifndef HBINSTANCE_H +#define HBINSTANCE_H + +#include + +/*! + Mocked class HbInstance (simulating hbinstance in unittests) + */ +class HbInstance +{ +public: + + static HbInstance *instance() { + return new HbInstance(); + } + + QList allMainWindows() const { + return mMainWindows; + } + + HbInstance() { + HbMainWindow* window = new HbMainWindow(); + mMainWindows.append(window); + } + + ~HbInstance() { + for (int i = 0; i < mMainWindows.count(); i++) { + delete mMainWindows[i]; + } + mMainWindows.clear(); + } + + QList mMainWindows; +}; + +#endif // HBINSTANCE_H + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayitemview/rom/unittest_calendayitemview.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayitemview/rom/unittest_calendayitemview.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Image description file for test project +* +*/ + +#ifndef UNITTEST_CALENDAYITEMVIEW_IBY +#define UNITTEST_CALENDAYITEMVIEW_IBY + +S60_APP_EXE(unittest_calendayitemview) +S60_APP_RESOURCE(unittest_calendayitemview) + +// Application registration file. +data=DATAZ_\private\10003a3f\import\apps\unittest_calendayitemview_reg.rsc \private\10003a3f\import\apps\unittest_calendayitemview_reg.rsc + + +#endif // UNITTEST_CALENDAYITEMVIEW_IBY \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayitemview/unittest_calendayitemview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayitemview/unittest_calendayitemview.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + */ +#include +#include +#include + +#include "calenservices.h" +#include "calendayitemview.h" + +// Test variables +QRectF gTestWindowRect = QRectF(0, 0, 10, 20); +Qt::Orientation gTestOrientation = Qt::Horizontal; + +class TestCalenItemView : public QObject +{ +Q_OBJECT + +public: + TestCalenItemView(); + virtual ~TestCalenItemView(); + +private slots: + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); + + void testConstructors(); +private: + MCalenServices mMCalenServices; + +}; + +/*! + Constructor + */ +TestCalenItemView::TestCalenItemView() +{ + +} + +/*! + Destructor + */ +TestCalenItemView::~TestCalenItemView() +{ + +} + +/*! + Called before testcase + */ +void TestCalenItemView::initTestCase() +{ +} + +/*! + Called after testcase + */ +void TestCalenItemView::cleanupTestCase() +{ + +} + +/*! + Called before every function + */ +void TestCalenItemView::init() +{ + +} + +/*! + Called after everyfunction + */ +void TestCalenItemView::cleanup() +{ + +} + +/*! + Test function for constructors + 1. Test if content widget is not initialized + 2. Test if content widget is correcty created + */ +void TestCalenItemView::testConstructors() +{ + //1) + CalenDayItemView *testItemView = 0; + QVERIFY(!testItemView); + + //2) + HbModelIterator *iterator = new HbModelIterator(); + testItemView = new CalenDayItemView(mMCalenServices,iterator,0); + QVERIFY(testItemView); + delete testItemView; +} + +QTEST_MAIN(TestCalenItemView); +#include "unittest_calendayitemview.moc" diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayitemview/unittest_calendayitemview.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayitemview/unittest_calendayitemview.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,68 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: calendaycontentwidget test project file +# + +TEMPLATE = app +TARGET = unittest_calendayitemview + +MOC_DIR = moc + +CONFIG += qtestlib +CONFIG += symbian_test +CONFIG += hb + +INCLUDEPATH += . \ + ../../../inc/ \ + ../../../src/ \ + ./../../../../inc/ \ + ./../../../../../inc/ + +DEPENDPATH += . \ + ../../../inc/ \ + ../../../src/ \ + ./../../../../inc/ \ + ./../../../../../inc/ + +# Input +HEADERS += calencontext.h \ + calendayinfo.h \ + calenservices.h \ + CalenUid.h \ + calendayitemview.h \ + caleninstanceid.h \ + calendaycontainer.h \ + calendayutils.h \ + hbinstance.h \ + calendaymodel.h + + +SOURCES += unittest_calendayitemview.cpp \ + calendayitemview.cpp \ + calendayutils.cpp + +symbian : { + TARGET.CAPABILITY = CAP_APPLICATION + MMP_RULES += "USERINCLUDE ." + + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + LIBS += -lagendainterface \ + -lcalencommonutils + + BLD_INF_RULES.prj_testexports += \ + "./rom/unittest_calendayitemview.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unittest_calendayitemview.iby)" +} + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaymodel/calenservices.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaymodel/calenservices.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,86 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Mocked classes for testing CalenDayModel class +* +*/ + +#ifndef AGENDAUTIL_H +#define AGENDAUTIL_H + +#include + +/*! + Mocked class AgendaUtil + */ +class AgendaUtil +{ +public: + enum FilterFlags { + IncludeAppointments = 0x01, + IncludeReminders = 0x02, + IncludeEvents = 0x03 + }; + +public: + AgendaUtil() { + + } + + ~AgendaUtil() { + + } + + QList createEntryIdListForDay(const QDateTime &date,AgendaUtil::FilterFlags filter) + { + QList agenda; + AgendaEntry entry; + agenda << entry; + return agenda; + } +}; + +#endif // AGENDAUTIL_H + +#ifndef CALENSERVICES_H +#define CALENSERVICES_H + +/*! + Mocked class MCalenServices + */ +class MCalenServices +{ +public: + MCalenServices() : mAgendaUtil(NULL) { + mAgendaUtil = new AgendaUtil(); + } + + ~MCalenServices() { + if (mAgendaUtil) { + delete mAgendaUtil; + mAgendaUtil = NULL; + } + } + + AgendaUtil* agendaInterface() { + return mAgendaUtil; + } + +public: + AgendaUtil* mAgendaUtil; +}; + +#endif // CALENSERVICES_H + +// End of file + diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaymodel/rom/unittest_calendaymodel.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaymodel/rom/unittest_calendaymodel.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Image description file for test project +* +*/ + +#ifndef UNITTEST_CALENDAYMODEL_IBY +#define UNITTEST_CALENDAYMODEL_IBY + +S60_APP_EXE(unittest_calendaymodel) +S60_APP_RESOURCE(unittest_calendaymodel) + +// Application registration file. +data=DATAZ_\private\10003a3f\import\apps\unittest_calendaymodel_reg.rsc \private\10003a3f\import\apps\unittest_calendaymodel_reg.rsc + + +#endif // UNITTEST_CALENDAYMODEL_IBY \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaymodel/unittest_calendaymodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaymodel/unittest_calendaymodel.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Test class for CalenDayModel + * + */ +#include + +#include "calendaymodel.h" +#include "calenservices.h" + +class TestCalenDayModel : public QObject +{ +Q_OBJECT + +public: + TestCalenDayModel(); + virtual ~TestCalenDayModel(); + +private slots: + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); + + void testConstructors(); + +private: + QDateTime mDateTime; + MCalenServices *mServices; + CalenDayModel *mModel; +}; + +/*! + Constructor + */ +TestCalenDayModel::TestCalenDayModel() : + mServices(NULL), mModel(NULL) +{ + +} + +/*! + Destructor + */ +TestCalenDayModel::~TestCalenDayModel() +{ + +} + +/*! + Called before testcase + */ +void TestCalenDayModel::initTestCase() +{ + mDateTime = QDateTime::currentDateTime(); + mServices = new MCalenServices(); +} + +/*! + Called after testcase + */ +void TestCalenDayModel::cleanupTestCase() +{ + if (mServices) { + delete mServices; + } +} + +/*! + Called before every function + */ +void TestCalenDayModel::init() +{ + mModel = new CalenDayModel(mDateTime, *mServices); +} + +/*! + Called after everyfunction + */ +void TestCalenDayModel::cleanup() +{ + if (mModel) { + delete mModel; + mModel = NULL; + } +} + +/*! + Test function for constructors + 1. Test if model is not initialized + 2. Test if model is correcty created + */ +void TestCalenDayModel::testConstructors() +{ + //1) + CalenDayModel *testModel = 0; + QVERIFY(!testModel); + + //2) + testModel = new CalenDayModel(mDateTime, *mServices); + QVERIFY(testModel); + + delete testModel; +} + +QTEST_MAIN(TestCalenDayModel); +#include "unittest_calendaymodel.moc" diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaymodel/unittest_calendaymodel.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaymodel/unittest_calendaymodel.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,51 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: CalenDayModel test project file +# + +TEMPLATE = app +TARGET = unittest_calendaymodel + +MOC_DIR = moc + +CONFIG += qtestlib +CONFIG += symbian_test +CONFIG += hb + +INCLUDEPATH += . \ + ../../../inc/ \ + ../../../../inc/ + +DEPENDPATH += . \ + ../../../inc/ \ + ../../../src/ + +# Input +HEADERS += calendaymodel.h + +SOURCES += unittest_calendaymodel.cpp \ + calendaymodel.cpp + +symbian : { + TARGET.CAPABILITY = CAP_APPLICATION + MMP_RULES += "USERINCLUDE ." + + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + LIBS += -lagendainterface + + BLD_INF_RULES.prj_testexports += \ + "./rom/unittest_calendaymodel.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unittest_calendaymodel.iby)" +} + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaymodelmanager/calencontext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaymodelmanager/calencontext.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,46 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Calendar context, info on what's currently focused +* +*/ + + +#ifndef CALENCONTEXT_H +#define CALENCONTEXT_H +#include + +// FORWARD DECLARATIONS +class TCalenInstanceId; +class QDateTime; + +// INCLUDES + +// CLASS DEFINITIONS +/** + * The controller handles events from the rest of Calendar and delegates + * them to the appropriate place (i.e. the action ui classes). + */ +class MCalenContext + { +public : + QDateTime focusDateAndTime() + { + return QDateTime(QDate(2000, 10, 10)); + } + + }; + +#endif // CALENCONTEXT_H + +// End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaymodelmanager/calendaymodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaymodelmanager/calendaymodel.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,70 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Single day item view model +* +*/ + +#ifndef CALENDAYMODEL_H +#define CALENDAYMODEL_H + +//System includes +#include +#include +#include + +#include + +//User includes + +//Forward declarations +class MCalenServices; + +//Constantss +const int CalenDayEntry = Qt::UserRole + 1; + +Q_DECLARE_METATYPE(AgendaEntry) + +class CalenDayModel : public QAbstractListModel +{ + Q_OBJECT +public: + CalenDayModel(const QDateTime &date, MCalenServices &services, + QObject *parent = 0){ + Q_UNUSED(date); + Q_UNUSED(services); + Q_UNUSED(parent); + } + + // from QAbstractListModel + int rowCount(const QModelIndex &parent = QModelIndex()) const{ + Q_UNUSED(parent); + return 0; + } + QVariant data(const QModelIndex &index, int role) const{ + Q_UNUSED(index); + Q_UNUSED(role); + return 0; + } + + void refreshModel(const QDateTime &date){ + Q_UNUSED(date); + } + + QDateTime modelDate(){ + return QDateTime(QDate(2000, 10, 10)); + } +}; + +#endif //CALENDAYMODEL_H + diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaymodelmanager/calenservices.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaymodelmanager/calenservices.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,33 @@ +/* + * calenservices.h + * + * Created on: Jun 21, 2010 + * Author: zabinpio + */ + +#ifndef CALENSERVICES_H_ +#define CALENSERVICES_H_ + +#include "calencontext.h" + +/*! + Mocked class MCalenServices + */ +class MCalenServices +{ +public: + MCalenServices() { + + } + + MCalenContext& Context(){ + return mContext; + } + + ~MCalenServices() { + + } + + MCalenContext mContext; +}; +#endif /* CALENSERVICES_H_ */ diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaymodelmanager/rom/unittest_calendaymodelmanager.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaymodelmanager/rom/unittest_calendaymodelmanager.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Image description file for test project +* +*/ + +#ifndef UNITTEST_CALENDAYMODELMANAGER_IBY +#define UNITTEST_CALENDAYMODELMANAGER_IBY + +S60_APP_EXE(unittest_calendaymodelmanager) +S60_APP_RESOURCE(unittest_calendaymodelmanager) + +// Application registration file. +data=DATAZ_\private\10003a3f\import\apps\unittest_calendaymodelmanager_reg.rsc \private\10003a3f\import\apps\unittest_calendaymodelmanager_reg.rsc + + +#endif //UNITTEST_CALENDAYMODELMANAGER_IBY \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaymodelmanager/unittest_calendaymodelmanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaymodelmanager/unittest_calendaymodelmanager.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Test class for CalenDayContainerWidget + * + */ +#include + +#include "calenservices.h" +#include "calendaymodelmanager.h" + +class TestCalenDayModelManager : public QObject +{ +Q_OBJECT + +public: + TestCalenDayModelManager(); + virtual ~TestCalenDayModelManager(); + +private slots: + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); + + void testConstructors(); + +private: + CalenDayModelManager *mManager; +}; + +/*! + Constructor + */ +TestCalenDayModelManager::TestCalenDayModelManager() : +mManager(NULL) +{ + +} + +/*! + Destructor + */ +TestCalenDayModelManager::~TestCalenDayModelManager() +{ + +} + +/*! + Called before testcase + */ +void TestCalenDayModelManager::initTestCase() +{ +} + +/*! + Called after testcase + */ +void TestCalenDayModelManager::cleanupTestCase() +{ + +} + +/*! + Called before every function + */ +void TestCalenDayModelManager::init() +{ + //mManager = new CalenDayModelManager(); +} + +/*! + Called after everyfunction + */ +void TestCalenDayModelManager::cleanup() +{ + // if (mManager) { + // delete mManager; + // mManager = NULL; + // } +} + +/*! + Test function for constructors + 1. Test if container is not initialized + 2. Test if container is correcty created + */ +void TestCalenDayModelManager::testConstructors() +{ + //1) + MCalenServices services; + + CalenDayModelManager *testManager = 0; + CalenDayModelManager *testManager2 = 0; + QVERIFY(!testManager); + QVERIFY(!testManager2); + + //2) + testManager = new CalenDayModelManager(services, false, 0); + testManager2 = new CalenDayModelManager(services, true, 0); + QVERIFY(testManager); + QVERIFY(testManager2); + + delete testManager; + delete testManager2; +} + +QTEST_MAIN(TestCalenDayModelManager); +#include "unittest_calendaymodelmanager.moc" diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaymodelmanager/unittest_calendaymodelmanager.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaymodelmanager/unittest_calendaymodelmanager.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,38 @@ +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# Initial Contributors: +# Nokia Corporation - initial contribution. +# Contributors: +# Description: calendaycontentwidget test project file +TEMPLATE = app +TARGET = unittest_calendaymodelmanager +MOC_DIR = moc +CONFIG += qtestlib +CONFIG += symbian_test +CONFIG += hb +INCLUDEPATH += . \ + ../../../inc/ +DEPENDPATH += . \ + ../../../inc/ \ + ../../../src/ + +# Input +HEADERS += calencontext.h \ + calendaymodel.h \ + calenservices.h \ + calendaymodelmanager.h + +SOURCES += calendaymodelmanager.cpp \ + unittest_calendaymodelmanager.cpp + +symbian: { + TARGET.CAPABILITY = CAP_APPLICATION + MMP_RULES += "USERINCLUDE ." + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + BLD_INF_RULES.prj_testexports += \ + "./rom/unittest_calendaymodelmanager.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unittest_calendaymodelmanager.iby)" +} diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaystatusstrip/calendaystatusstriptest.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaystatusstrip/calendaystatusstriptest.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Class needed by testing to have acces to private data memebers + * + */ + + +#ifndef CALENDAYSTATUSSTRIPTEST_H +#define CALENDAYSTATUSSTRIPTEST_H + +#include "calenDaystatusstrip.h" + +class CalenDayStatusStripTest : public CalenDayStatusStrip +{ + + Q_OBJECT +public: + CalenDayStatusStripTest(HbWidget *parent = 0) + : CalenDayStatusStrip(parent) + { + + } + friend class TestCalenStatusStrip; +}; + +#endif // CALENDAYSTATUSSTRIPTEST_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaystatusstrip/rom/unittest_calendaystatusstrip.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaystatusstrip/rom/unittest_calendaystatusstrip.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Image description file for test project +* +*/ + +#ifndef UNITTEST_CALENDAYSTATUSSTRIP_IBY +#define UNITTEST_CALENDAYSTATUSSTRIP_IBY + +S60_APP_EXE(unittest_calendaystatusstrip) +S60_APP_RESOURCE(unittest_calendaystatusstrip) + +// Application registration file. +data=DATAZ_\private\10003a3f\import\apps\unittest_calendaystatusstrip_reg.rsc \private\10003a3f\import\apps\unittest_calendaystatusstrip_reg.rsc + + +#endif // UNITTEST_CALENDAYSTATUSSTRIP_IBY \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaystatusstrip/unittest_calendaystatusstrip.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaystatusstrip/unittest_calendaystatusstrip.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,368 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Test class for CalenDayContentWidget + * + */ + +#include +#include + +#include "calendaystatusstriptest.h" + +#include +#include +#include + +const qreal WIDGET_WIDTH = 50; +const qreal WIDGET_HEIGHT = 150; + +class TestCalenStatusStrip : public QObject +{ +Q_OBJECT + +public: + TestCalenStatusStrip(); + virtual ~TestCalenStatusStrip(); + +private slots: + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); + + void testConstructors(); + void testSetGetColor(); + void testSetGetRange(); + void testSetGetDrawingStyle_data(); + void testSetGetDrawingStyle(); + void testStartEndTime(); + void testCreatingDiagonalLine(); + void testCalculateStartEndTimePosition_data(); + void testCalculateStartEndTimePosition(); + void testCalculateMinuteHegiht(); + void testPaint(); + +private: + CalenDayStatusStripTest *mStatusStrip; +}; + + + + +/*! + Constructor + */ +TestCalenStatusStrip::TestCalenStatusStrip() : + mStatusStrip(NULL) +{ + +} + +/*! + Destructor + */ +TestCalenStatusStrip::~TestCalenStatusStrip() +{ + +} + +/*! + Called before testcase + */ +void TestCalenStatusStrip::initTestCase() +{ +} + +/*! + Called after testcase + */ +void TestCalenStatusStrip::cleanupTestCase() +{ + +} + +/*! + Called before every function + */ +void TestCalenStatusStrip::init() +{ + mStatusStrip = new CalenDayStatusStripTest(); +} + +/*! + Called after everyfunction + */ +void TestCalenStatusStrip::cleanup() +{ + if (mStatusStrip) { + delete mStatusStrip; + mStatusStrip = NULL; + } +} + +/*! + Test function for constructors + 1. Test if content widget is not initialized + 2. Test if content widget is correcty created + */ +void TestCalenStatusStrip::testConstructors() +{ + //1) + CalenDayStatusStrip *testStatusStrip = 0; + QVERIFY(!testStatusStrip); + + //2) + testStatusStrip = new CalenDayStatusStrip(); + QVERIFY(testStatusStrip); + delete testStatusStrip; +} + +/*! + Test function for geting and setting color + 1. Test setting red color + 2. Test change color to blue + */ +void TestCalenStatusStrip::testSetGetColor() +{ + //1) + mStatusStrip->setColor(QColor(Qt::red)); + QColor testColor = mStatusStrip->color(); + QCOMPARE(QColor(Qt::red),testColor); + + //2) + mStatusStrip->setColor(QColor(Qt::blue)); + testColor = mStatusStrip->color(); + QCOMPARE(QColor(Qt::blue),testColor); +} + +/*! + Test function for geting and setting range + 1. Test setting 5px range + 2. Test change range to 1px + */ +void TestCalenStatusStrip::testSetGetRange() +{ + //1) + mStatusStrip->setRange(5); + QCOMPARE((qreal)5,mStatusStrip->range()); + + //2) + mStatusStrip->setRange(1); + QCOMPARE((qreal)1,mStatusStrip->range()); +} + +/*! + Preapre data for \sa testSetGetDrawingStyle + Add new enum \sa CalenDayStatusStrip::DrawingStyle + 1)OnlyFrame + 2)StripWithLines + 3)Filled + */ +void TestCalenStatusStrip::testSetGetDrawingStyle_data() +{ + QTest::addColumn("testedValue"); + QTest::addColumn("testValue"); + + QTest::newRow("OnlyFrame") << CalenDayStatusStrip::OnlyFrame + << CalenDayStatusStrip::OnlyFrame; + QTest::newRow("StripWithLines") << CalenDayStatusStrip::StripWithLines + << CalenDayStatusStrip::StripWithLines; + QTest::newRow("Filled") << CalenDayStatusStrip::Filled + << CalenDayStatusStrip::Filled; +} + +/*! + Test settting and getting drawing style on preapred data + + \sa testSetGetDrawingStyle_data + */ +void TestCalenStatusStrip::testSetGetDrawingStyle() +{ + //get data to test + QFETCH(CalenDayStatusStrip::DrawingStyle, testedValue); + QFETCH(CalenDayStatusStrip::DrawingStyle, testValue); + + //set data + mStatusStrip->setDrawingStyle(testedValue); + + //check data + QCOMPARE(mStatusStrip->drawingStyle(),testValue); +} + +/*! + Test setting and getting start and end time of event + 1)Set end and start of event + 2)Change values + */ +void TestCalenStatusStrip::testStartEndTime() +{ + QPair startEndTime; + startEndTime.first = QTime(12,12,12); + startEndTime.second = QTime(15,15,15); + + mStatusStrip->setStartEndTime(startEndTime.first,startEndTime.second); + + QCOMPARE(mStatusStrip->startEndTime().first,startEndTime.first); + QCOMPARE(mStatusStrip->startEndTime().second,startEndTime.second); + + startEndTime.first = QTime(1,1,1); + startEndTime.second = QTime(5,5,5); + + mStatusStrip->setStartEndTime(startEndTime.first,startEndTime.second); + + QCOMPARE(mStatusStrip->startEndTime().first,startEndTime.first); + QCOMPARE(mStatusStrip->startEndTime().second,startEndTime.second); +} + +/*! + Test creating polygon to draw diagonal line on widget + */ +void TestCalenStatusStrip::testCreatingDiagonalLine() +{ + qreal dx = 10; + qreal dy = 1; + QPointF point(0,60); + QVector points; + + points << QPointF(0,60); + points << QPointF(0,59); + points << QPointF(10,58); + points << QPointF(10,59); + + QPolygonF testValue(points); + QPolygonF testedValue = mStatusStrip->diagonalLine(point,dx,dy); + + QCOMPARE(testedValue,testValue); +} + +/*! + Prepare data for \sa testCalculateStartEndTimePosition + Add new start and end time of event. + 1)Full time start and end + 2)Exactly 30min time start and end + 3)More than 30min time start and end + 4)time start > 30m and end > 23h30m + */ +void TestCalenStatusStrip::testCalculateStartEndTimePosition_data() +{ + QTest::addColumn("testedStartValue"); + QTest::addColumn("testedEndValue"); + QTest::addColumn("testStartValue"); + QTest::addColumn("testEndValue"); + + QTest::newRow("Full time start and end") << QTime(10,00,00) + << QTime(11,00,00) + << QTime(10,00,00) + << QTime(11,00,00); + QTest::newRow("Exactly 30min time start and end") << QTime(10,30,00) + << QTime(11,30,00) + << QTime(10,30,00) + << QTime(11,30,00); + QTest::newRow("More than 30min time start and end") << QTime(10,40,00) + << QTime(12,35,00) + << QTime(10,30,00) + << QTime(13,00,00); + QTest::newRow("time start > 30m and end > 23h30m") << QTime(20,35,00) + << QTime(23,35,00) + << QTime(20,30,00) + << QTime(23,59,00); +} + +/*! + Test calculating start and end time drawing of event bubble on prepared data + \sa testCalculateStartEndTimePosition_data + */ +void TestCalenStatusStrip::testCalculateStartEndTimePosition() +{ + //get prepared data + QFETCH(QTime, testedStartValue); + QFETCH(QTime, testedEndValue); + QFETCH(QTime, testStartValue); + QFETCH(QTime, testEndValue); + + //run function + QPair testStartEndValue + = mStatusStrip->calculateStartEndPostion(testedStartValue, + testedEndValue); + //check data + QCOMPARE(testStartEndValue.first,testStartValue); + QCOMPARE(testStartEndValue.second,testEndValue); +} + +/*! + Test calculating minute height based on widget height and given time. + 1)Calculate on given time + 2)Change time of event + */ +void TestCalenStatusStrip::testCalculateMinuteHegiht() +{ + qreal testedValue; + qreal testValue; + mStatusStrip->resize(WIDGET_WIDTH,WIDGET_HEIGHT); + + //1) + testedValue = mStatusStrip->calculateMinuteHeight(QTime(10,00,0), + QTime(11,00,0)); + testValue = WIDGET_HEIGHT / (qreal)60; + QCOMPARE(testedValue,testValue); + + //2) + testedValue = mStatusStrip->calculateMinuteHeight(QTime(10,00,0), + QTime(11,30,0)); + testValue = WIDGET_HEIGHT / (qreal)90; + QCOMPARE(testedValue,testValue); +} + + +/*! + Test drawing widget. + + If there is no SAVE_IMAGES macro defined it will only run this function. + If there is macro defined and c:\unittest folder created then image will be + created so user can see if it draw in good way. + */ +void TestCalenStatusStrip::testPaint() +{ + //preapre data needed to draw on widget + mStatusStrip->setColor(QColor(Qt::red)); + QPair startEndTime; + startEndTime.first = QTime(10,20,0); + startEndTime.second = QTime(15,10,00); + + //set event time + mStatusStrip->setStartEndTime(startEndTime.first,startEndTime.second); + + //resize widget to be bigger than (0,0) + mStatusStrip->resize(WIDGET_WIDTH,WIDGET_HEIGHT); + QSize size = mStatusStrip->size().toSize(); + + //create image that will simulate widget where painting should be done + QImage img(size,QImage::Format_RGB32); + //create painter which will be used to paint + QPainter painter(&img); + //fill image with white color to have better filings with look of "paper" + painter.fillRect(0,0,size.width(),size.height(),QColor(Qt::white)); + //run paint + mStatusStrip->paint(&painter,0); + +#ifdef SAVE_IMAGES + //save drawed image + img.save("c:/unittest/TestCalenStatusStrip_testPaint.jpg"); + +#endif + +} + +QTEST_MAIN(TestCalenStatusStrip); +#include "unittest_calendaystatusstrip.moc" diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendaystatusstrip/unittest_calendaystatusstrip.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendaystatusstrip/unittest_calendaystatusstrip.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,53 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: calendaycontentwidget test project file +# + +TEMPLATE = app +TARGET = unittest_calendaystatusstrip + +#uncoment it if want to get images from test where it is posible. +#it need folder in c:/unittest path +#DEFINES += SAVE_IMAGES + +MOC_DIR = moc + +CONFIG += qtestlib +CONFIG += symbian_test +CONFIG += hb + +INCLUDEPATH += . \ + ../../../inc/ \ + +DEPENDPATH += . \ + ../../../inc/ \ + ../../../src/ + +# Input +HEADERS += calendaystatusstrip.h \ + calendaystatusstriptest.h + + +SOURCES += unittest_calendaystatusstrip.cpp \ + calendaystatusstrip.cpp + +symbian : { + TARGET.CAPABILITY = CAP_APPLICATION + MMP_RULES += "USERINCLUDE ." + + BLD_INF_RULES.prj_testexports += \ + "./rom/unittest_calendaystatusstrip.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unittest_calendaystatusstrip.iby)" +} + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayutils/hbinstance.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayutils/hbinstance.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,85 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Mocked classes for testing CalenDayUtils class +* +*/ + +#ifndef HBMAINWINDOW_H +#define HBMAINWINDOW_H + +// Test variables +extern QRectF gTestWindowRect; +extern Qt::Orientation gTestOrientation; + +/*! + Mocked class HbMainWindow (simulating window in unittests) + */ +class HbMainWindow +{ +public: + HbMainWindow() { + } + + ~HbMainWindow() { + } + + QRectF layoutRect() const { + return gTestWindowRect; + } + + Qt::Orientation orientation() const { + return gTestOrientation; + } +}; + +#endif // HBMAINWINDOW_H + +#ifndef HBINSTANCE_H +#define HBINSTANCE_H + +#include + +/*! + Mocked class HbInstance (simulating hbinstance in unittests) + */ +class HbInstance +{ +public: + + static HbInstance *instance() { + return new HbInstance(); + } + + QList allMainWindows() const { + return mMainWindows; + } + + HbInstance() { + HbMainWindow* window = new HbMainWindow(); + mMainWindows.append(window); + } + + ~HbInstance() { + for (int i = 0; i < mMainWindows.count(); i++) { + delete mMainWindows[i]; + } + mMainWindows.clear(); + } + + QList mMainWindows; +}; + +#endif // HBINSTANCE_H + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayutils/rom/unittest_calendayutils.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayutils/rom/unittest_calendayutils.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Image description file for test project +* +*/ + +#ifndef UNITTEST_CALENDAYUTILS_IBY +#define UNITTEST_CALENDAYUTILS_IBY + +S60_APP_EXE(unittest_calendayutils) +S60_APP_RESOURCE(unittest_calendayutils) + +// Application registration file. +data=DATAZ_\private\10003a3f\import\apps\unittest_calendayutils_reg.rsc \private\10003a3f\import\apps\unittest_calendayutils_reg.rsc + + +#endif // UNITTEST_CALENDAYUTILS_IBY \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayutils/unittest_calendayutils.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayutils/unittest_calendayutils.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Test class for CalenDayContentWidget + * + */ +#include +#include + +#include "calendayutils.h" +#include "calendaycommonheaders.h" + +// Test variables +QRectF gTestWindowRect = QRectF(0, 0, 10, 20); +Qt::Orientation gTestOrientation = Qt::Horizontal; + +class TestCalenDayUtils : public QObject +{ +Q_OBJECT + +public: + TestCalenDayUtils(); + virtual ~TestCalenDayUtils(); + +private slots: + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); + + void testConstructors(); + void testHorizontalSwipe(); + void testOrientation(); + +private: + CalenDayUtils *mUtils; +}; + +/*! + Constructor + */ +TestCalenDayUtils::TestCalenDayUtils() : + mUtils(NULL) +{ + +} + +/*! + Destructor + */ +TestCalenDayUtils::~TestCalenDayUtils() +{ + +} + +/*! + Called before testcase + */ +void TestCalenDayUtils::initTestCase() +{ +} + +/*! + Called after testcase + */ +void TestCalenDayUtils::cleanupTestCase() +{ + +} + +/*! + Called before every function + */ +void TestCalenDayUtils::init() +{ +} + +/*! + Called after everyfunction + */ +void TestCalenDayUtils::cleanup() +{ +} + +/*! + Test function for constructors + 1. Test if content widget is not initialized + 2. Test if content widget is correcty created + */ +void TestCalenDayUtils::testConstructors() +{ + //1) + CalenDayUtils *testUtils = 0; + QVERIFY(!testUtils); + + //2) + testUtils = CalenDayUtils::instance(); + QVERIFY(testUtils); +} + +/*! + Test function for checking if swipe is horizontal or not + 1)test Horizontal swipe + 2)test no horizontal swipe + */ +void TestCalenDayUtils::testHorizontalSwipe() +{ + //1) + QCOMPARE(CalenDayUtils::instance()->isHorizontalSwipe(KCalenSwipeAngle-5), + true); + + //2) + QCOMPARE(CalenDayUtils::instance()->isHorizontalSwipe(KCalenSwipeAngle+5), + false); +} + +/*! + Test function for getting main window's orientation + 1)test if horizontal orientation is returned + 2)test if vertical orientation is returned + */ +void TestCalenDayUtils::testOrientation() +{ + //1) + gTestOrientation = Qt::Horizontal; + QCOMPARE(CalenDayUtils::instance()->orientation(), Qt::Horizontal); + + //2) + gTestOrientation = Qt::Vertical; + QCOMPARE(CalenDayUtils::instance()->orientation(), Qt::Vertical); +} + +QTEST_MAIN(TestCalenDayUtils); +#include "unittest_calendayutils.moc" diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayutils/unittest_calendayutils.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayutils/unittest_calendayutils.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,58 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: calendaycontentwidget test project file +# + +TEMPLATE = app +TARGET = unittest_calendayutils + +MOC_DIR = moc + +CONFIG += qtestlib +CONFIG += symbian_test +CONFIG += hb + +INCLUDEPATH += . \ + ../../../inc/ \ + ./../../../../inc/ \ + ./../../../../../inc/ + +DEPENDPATH += . \ + ../../../inc/ \ + ../../../src/ \ + ./../../../../inc/ \ + ./../../../../../inc/ + +# Input +HEADERS += calendayutils.h \ + calendaycommonheaders.h + + +SOURCES += unittest_calendayutils.cpp \ + calendayutils.cpp + +symbian : { + TARGET.CAPABILITY = CAP_APPLICATION + MMP_RULES += "USERINCLUDE ." + + BLD_INF_RULES.prj_testexports += \ + "./rom/unittest_calendayutils.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unittest_calendayutils.iby)" + + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + LIBS += -lagendainterface \ + -lcalencommonutils +} + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/CalenUid.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/CalenUid.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,45 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: UIDS used by the S60 Calendar +* +*/ + + +#ifndef CALENUID_H +#define CALENUID_H + +// UID of the S60 Calendar application +const TUid KUidCalendar = { 0x10005901 }; + +// UIDS of the S60 Calendar native views +const TInt KCalenMonthViewUidValue = 0x00000000 ; +const TInt KCalenAgendaViewUidValue = 0x00000002; +const TInt KCalenEventViewUidValue = 0x00000003; +const TInt KCalenLandscapeDayViewUidValue = 0x00000004; +const TInt KCalenTodoEditorViewUidValue = 0x00000005; +const TInt KCalenSettingsViewUidValue = 0x00000006; + + +const TUid KUidCalenMonthView = { KCalenMonthViewUidValue }; +const TUid KUidCalenAgendaView = { KCalenAgendaViewUidValue }; +const TUid KCalenTodoEditorView = { KCalenTodoEditorViewUidValue }; +const TUid KUidCalenEventView = { KCalenEventViewUidValue }; +const TUid KUidCalenLandscapeDayView = { KCalenLandscapeDayViewUidValue }; +const TUid KUidCalenSettingsView = { KCalenSettingsViewUidValue }; + +const TUid KCalenChineseImplUid = {0x2002EA3D}; + +#endif // CALENUID_H + +// End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/CalendarPrivateCRKeys.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/CalendarPrivateCRKeys.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,38 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: The file contains the uid of keys used by application. +* +* +*/ + +#ifndef CALENDARPRIVATECRKEYS_H +#define CALENDARPRIVATECRKEYS_H + +#include + +/** +* Defines whether week number must be shown in month view of the calendar. +* Default value: 0 +**/ +const long int KCalendarShowWeekNum = 0x00000000; + +/** +* Defines whether regional information must be shown in the Calendar. +* Default value: 1 +*/ +const long int KCalendarShowRegionalInfo = 0x00000002; + +#endif // CALENDARPRIVATECRKEYS_H + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calencontext.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calencontext.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Calendar context, info on what's currently focused + * + */ + +#ifndef CALENCONTEXT_H +#define CALENCONTEXT_H +#include + +// FORWARD DECLARATIONS +class TCalenInstanceId; +class QDateTime; + +// INCLUDES + +// CLASS DEFINITIONS +/** + * The controller handles events from the rest of Calendar and delegates + * them to the appropriate place (i.e. the action ui classes). + */ +class MCalenContext + { +public: + QDateTime focusDateAndTime() + { + return QDateTime(QDate(2000, 10, 10)); + } + + void setFocusDate(const QDateTime& focusDateTime) + { + Q_UNUSED(focusDateTime); + } + + void setFocusDateAndTime(const QDateTime& focusDateTime) + { + Q_UNUSED(focusDateTime); + } + + QDateTime defaultCalTimeForViewsL() + { + return QDateTime(QDate(2000, 10, 10)); + } + + }; + +#endif // CALENCONTEXT_H +// End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calendateutils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calendateutils.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,188 @@ +/* + * Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: ?Description + * + */ + +#ifndef __CALENDATEUTILS_H__ +#define __CALENDATEUTILS_H__ + +#include +#include // Q_DECL_EXPORT macro +#ifdef CALENDATEUTILS_DLL +#define CALENDATEUTIL_EXPORT Q_DECL_EXPORT +#else +#define CALENDATEUTIL_EXPORT Q_DECL_IMPORT +#endif + +// forward declarations +class QDateTime; + +/** + * CalenDateUtils contains static utility functions useful + * when comparing and calculating with dates and times. + * + * @lib Calendar.app + * @since 2.1 + */ + +class CalenDateUtils + { +public: + static bool onSameDay(const QDateTime& x, const QDateTime& y) + { + Q_UNUSED(x);Q_UNUSED(y); + return false; + } + static bool onSameMonth(const QDateTime& x, const QDateTime& y) + { + Q_UNUSED(x);Q_UNUSED(y); + return false; + } + static QDateTime beginningOfDay(const QDateTime& startTime) + { + Q_UNUSED(startTime); + return QDateTime(); + } + static QDateTime displayTimeOnDay(const QDateTime& startTime, + const QDateTime& day) + { + Q_UNUSED(startTime);Q_UNUSED(day); + return QDateTime(); + } + + static bool timeRangesIntersect(const QDateTime& xStart, + const QDateTime& xEnd, const QDateTime& yStart, + const QDateTime& yEnd) + { + Q_UNUSED(xStart);Q_UNUSED(xEnd);Q_UNUSED(yStart);Q_UNUSED(yEnd); + return false; + } + + /** + * Is aTime between KCalenMaxYear/KCalenMaxMonth/KCalenMaxDay + * and KCalenMinYear/KCalenMinMonth/KCalenMinDay. + * Min/Max day is defined agenda server. + * @param aTime aTime to be checked + * @return EFalse : Out of range + */ + static bool isValidDay(const QDateTime& time) + { + Q_UNUSED(time); + return false; + } + + /** + * Return Min or Max time if aTime goes out of bounds. + * Valid range is [CalenDateUtils::MinTime(), CalenDateUtils::MaxTime] + * @param aTime time to be checked + * @return aTime, if aTime in [CalenDateUtils::MinTime(), CalenDateUtils::MaxTime] + * CalenDateUtils::MinTime(), if aTime < CalenDateUtils::MinTime() + * CalenDateUtils::MaxTime(), if aTime > CalenDateUtils::MaxTime() + */ + static QDateTime limitToValidTime(const QDateTime& time) + { + Q_UNUSED(time); + return QDateTime(); + } + + /** + * Return maximum allowed time. (31. + */ + static QDateTime maxTime() + { + return QDateTime(); + } + + /** + * Return minimum allowed time. + */ + static QDateTime minTime() + { + return QDateTime(); + } + + /** + * Return time of day as a minutes from midnight. Useful to get hours::minutes component of datetime, + * regardless of date + */ + static int timeOfDay(const QDateTime& dateTime) + { + Q_UNUSED(dateTime); + return 0; + } + + /** + * Round QDateTime to previous full hour, e.g. RoundToPreviousHour( 23.11.2006 9:31 ) = 23.11.2006 9:00 + */ + static QDateTime roundToPreviousHour(const QDateTime& dateTime) + { + Q_UNUSED(dateTime); + return QDateTime(); + } + + /** + * Round QDateTimeIntervalMinutes to previous full hour, e.g. RoundToPreviousHour( 130 min ) = 120 min + */ + static int roundToPreviousHour(const int& minutes) + { + Q_UNUSED(minutes); + return 0; + } + + /** + * @return current time. + */ + static QDateTime now() + { + return QDateTime(); + } + + /** + * @return today with time component set to 00:00. + */ + static QDateTime today() + { + return QDateTime(); + } + + /** + * @return ETrue if given aTime is on today, EFalse otherwise + */ + static bool isOnToday(const QDateTime& time) + { + Q_UNUSED(time); + return false; + } + + /* + * Given aDate = DD::MM::YY @ hh:mm:ss, it returns a QDateTime obj DD::MM::YY @ 08:00 am + * @param: aDate, which has the DD::MM::YY + */ + static QDateTime defaultTime(const QDateTime& date) + { + Q_UNUSED(date); + return QDateTime(); + } + + static QDateTime futureOf(const QDateTime& dateTime, int numOfDays) + { + Q_UNUSED(dateTime);Q_UNUSED(numOfDays); + return QDateTime(); + } + }; + +#endif // __CALENDATEUTILS_H__ + +// End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calendaycontentscrollarea.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calendaycontentscrollarea.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: CalenDayContentScrollArea class definition. + * + */ + +#ifndef CALENDAYCONTENTSCROLLAREA_H_ +#define CALENDAYCONTENTSCROLLAREA_H_ + +// System includes +#include + +#include "calendaycommonheaders.h" + +// Class declaration +class CalenDayContentScrollArea : public HbScrollArea + { +Q_OBJECT + +public: + CalenDayContentScrollArea(QGraphicsItem *parent = 0) + { + Q_UNUSED(parent); + } + virtual ~CalenDayContentScrollArea() + { + } + + signals: + void scrollAreaMoveStarted(CalenScrollDirection scrollTo); + void scrollAreaMoveFinished(CalenScrollDirection scrollTo); + +public slots: + void scrollToMiddleWidget() + { + } + +protected: + bool scrollByAmount(const QPointF &delta) + { + Q_UNUSED(delta); + return false; + } + + void gestureEvent(QGestureEvent *event) + { + Q_UNUSED(event); + } + bool eventFilter(QObject *obj, QEvent *event) + { + Q_UNUSED(obj);Q_UNUSED(event); + return false; + } + bool event(QEvent *e) + { + Q_UNUSED(e); + return false; + } + }; + +#endif /* CALENDAYCONTENTSCROLLAREA_H_ */ diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calendaycontentwidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calendaycontentwidget.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: CalenDayContentWidget class definition. + * + */ + +#ifndef CALENDAYCONTENTWIDGET_H_ +#define CALENDAYCONTENTWIDGET_H_ + +// System includes +#include + +// User includes +#include "calendaycommonheaders.h" + +// Forward declarations +class QGraphicsLinearLayout; +class CalenDayModelManager; + +class CalenDayContentWidget : public HbWidget + { +Q_OBJECT + +public: + /*! + \enum CalenWidgetPosition + \brief Enumeration identifies widget position if queue. + */ + enum CalenWidgetPosition + { + ECalenLastWidget = 0, ECalenFirstWidget + }; + +public: + CalenDayContentWidget(CalenDayModelManager &modelManager, + QGraphicsItem *parent = 0) + { + Q_UNUSED(parent); + Q_UNUSED(modelManager); + } + ~CalenDayContentWidget() + { + } + + void add(HbWidget* item, CalenWidgetPosition where = ECalenLastWidget) + { + Q_UNUSED(item); + Q_UNUSED(where); + } + HbWidget* take(CalenWidgetPosition which) + { + Q_UNUSED(which); + return 0; + } + void remove(CalenWidgetPosition which) + { + Q_UNUSED(which); + } + + signals: + void widgetsRelayoutFinished(CalenScrollDirection scrollTo); + void scrollPositionChanged(const QPointF &newPos); + +public slots: + void relayoutWidgets(CalenScrollDirection scrollTo) + { + Q_UNUSED(scrollTo); + } + void widgetScrolled(const QPointF &newPos) + { + Q_UNUSED(newPos); + } + }; + +#endif /* CALENDAYCONTENTWIDGET_H_ */ diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calendayhourscrollarea.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calendayhourscrollarea.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: CalenDayHourScrollArea class definition. + * + */ + +#ifndef CALENDAYHOURSCROLLAREA_H_ +#define CALENDAYHOURSCROLLAREA_H_ + +// System includes +#include +#include + +// User includes +#include "calendaycommonheaders.h" + +// Class declaration +class CalenDayHourScrollArea : public HbScrollArea + { +Q_OBJECT + +public: + CalenDayHourScrollArea(QGraphicsItem *parent = 0) + { + Q_UNUSED(parent); + } + virtual ~CalenDayHourScrollArea() + { + } + void setDateTime(const QDateTime &dateTime) + { + Q_UNUSED(dateTime); + } + QDateTime dateTime() + { + return QDateTime(); + } + + void scrollToHour(int hour) + { + Q_UNUSED(hour); + } + +public slots: + void scrollVertically(const QPointF &newPosition) + { + Q_UNUSED(newPosition); + } + + }; + +#endif /* CALENDAYHOURSCROLLAREA_H_ */ diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calendaymodelmanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calendaymodelmanager.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Model manager holds models for three day views + * + */ +#ifndef CALENDAYMODELMANAGER_H +#define CALENDAYMODELMANAGER_H + +#include +#include +#include + +#include "calendaycommonheaders.h" +#include +class QAbstractItemModel; +class MCalenServices; +class CalenDayModel; + +/*! + Test class TestAbstractListModel + */ +class TestAbstractListModel : public QAbstractListModel +{ + Q_OBJECT + +public: + TestAbstractListModel() : QAbstractListModel() { + } + + ~TestAbstractListModel() { + } + + int rowCount(const QModelIndex &parent) const { + Q_UNUSED(parent); + return 0; + } + + QVariant data(const QModelIndex &index, int role) const { + Q_UNUSED(index); + Q_UNUSED(role); + return QVariant(0); + } +}; + +class CalenDayModelManager : public QObject + { +Q_OBJECT + +public: + enum ModelDay + { + PreviousDay = 0, CurrentDay = 1, NextDay = 2, NumberOfDays + }; + +public: + CalenDayModelManager(MCalenServices &services, bool emptyModels, QObject *parent = 0) : + mServices(services) + { + Q_UNUSED(emptyModels); + Q_UNUSED(parent); + } + ~CalenDayModelManager() + { + } + + QAbstractItemModel &getModel(CalenDayModelManager::ModelDay day) + { + Q_UNUSED(day); + model = new TestAbstractListModel(); + return *model; + } + + void refreshAllModels() + { + } + void refreshSingleModel(CalenDayModelManager::ModelDay day) + { + Q_UNUSED(day); + } + MCalenServices &getServices() + { + return mServices; + } + +public slots: + void viewsScrollingFinished(CalenScrollDirection scrollTo) + { + Q_UNUSED(scrollTo); + } + +private: + void createAllModels() + { + } + void moveBackward() + { + } + void moveForeward() + { + } + +private: + QMap mModels; + MCalenServices &mServices; + QDateTime mCurrentDayTime; + TestAbstractListModel* model; + }; + +#endif//CALENDAYMODELMANAGER_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calendayutils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calendayutils.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: CalenDayUtils utility class header. + * + */ + +#ifndef CALENDAYUTILS_H_ +#define CALENDAYUTILS_H_ + +class CalenDayUtils + { +public: + static CalenDayUtils *instance() + { + } + ~CalenDayUtils() + { + } + + qreal screenWidth() + { + return 0; + } + qreal hourElementWidth() + { + return 0; + } + qreal hourElementHeight() + { + return 0; + } + qreal contentWidth() + { + return 0; + } + + Qt::Orientation orientation() + { + return 1; + } + + HbMainWindow* mainWindow() + { + return 0; + } + + bool isHorizontalSwipe(qreal angle) + { + Q_UNUSED(angle); + return false; + } + +protected: + CalenDayUtils() + { + } + }; + +#endif /* CALENDAYUTILS_H_ */ diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calendocloader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calendocloader.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Class declaration for CalenDocLoader. + * +*/ + + +#ifndef CALENDOCLOADER_H +#define CALENDOCLOADER_H + +// system includes +#include + +// forward declaration +class CCalenController; + +// Class declaration +/** + * @class CalenDocLoader + * @brief The loader class for application + * Inherits from HbDocumentLoader. + */ +class CalenDocLoader : public HbDocumentLoader +{ +public: + + CalenDocLoader(CCalenController &controller) : mController(controller){} + ~CalenDocLoader(){} + +protected: + + virtual QObject *createObject(const QString &type, const QString &name){Q_UNUSED(type); Q_UNUSED(name); return 0;} + +private: + + CCalenController &mController; +}; + +#endif // CALENDOCLOADER_H + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calennativeview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calennativeview.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,92 @@ +/* +* Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: This class is the base class of all Calendar views. + * +*/ + + +#ifndef CALENNATIVEVIEW_H +#define CALENNATIVEVIEW_H + +#ifdef CALENVIEWS_DLL +#define CALENNATIVEVIEW_EXPORT Q_DECL_EXPORT +#else +#define CALENNATIVEVIEW_EXPORT Q_DECL_IMPORT +#endif + +// System includes +#include +#include +#include + +// User includes +#include "calennotificationhandler.h" // MCalenNotificationHandler +#include "calenview.h" + +const int WORKAROUND_TO_LIMIT_MAX_SPEED=8000; + +class MCalenServices; +class HbDateTimePicker; + +class CalenNativeView : public CalenView, + public MCalenNotificationHandler + { + Q_OBJECT + + public: // Constructors and destructor + /** + * Destructor. + */ + virtual ~CalenNativeView(){} + virtual void populationComplete(){} + TBool pluginEnabled(){return EFalse;} + virtual void refreshViewOnGoToDate(){} + QString *pluginText() {QString* str = new QString("string"); return str;} + /** + * captureScreenshot captures the current screenshot + */ + CALENNATIVEVIEW_EXPORT void captureScreenshot(bool captureScreenShot = false) {Q_UNUSED(captureScreenShot);} + + protected: // New functions + CalenNativeView( MCalenServices& services ) : mServices(services){} + + void HandleNotification( const TCalenNotification notification ){Q_UNUSED(notification);} + virtual void onLocaleChanged(int reason) {Q_UNUSED(reason);} + virtual void onContextChanged() {} + + protected slots: + + void goToDate(){} + void goToSelectedDate(){} + void deleteBeforeDate(){} + void deleteAllEntries(){} + void launchSettingsView(){} + virtual void changeOrientation(Qt::Orientation orientation){Q_UNUSED(orientation);} + /** + * saveActivity saves the current view as an activity + * + */ + void saveActivity(){} + + protected: + + MCalenServices &mServices; // not owned. + int mActivityId; // Recent Activity ID, currently it holdes wither of ECalenMonthView or ECalenAgendaView + QVariantHash mScreenShotMetadata; // Screenshot + + }; + +#endif // CALENNATIVEVIEW_H + +// End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calennotificationhandler.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calennotificationhandler.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,83 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Notification interface for S60 Calendar customizations +* +*/ + +#ifndef CALENNOTIFICATIONHANDLER_H +#define CALENNOTIFICATIONHANDLER_H + +enum TCalenNotification + { + ECalenNotifyAll = 0, // Receive all notifications + ECalenNotifyEntryInstanceViewCreated, + ECalenNotifyEntryInstanceViewCreationFailed, + ECalenNotifyContextChanged, + ECalenNotifyExternalDatabaseChanged, + ECalenNotifyEntrySaved, + ECalenNotifyEntryDeleted, + ECalenNotifyMultipleEntriesDeleted, + ECalenNotifyInstanceSaved, + ECalenNotifyInstanceDeleted, + ECalenNotifySystemTimeChanged, + ECalenNotifySystemLocaleChanged, + ECalenNotifySystemLanguageChanged, + ECalenNotifyLostAlarms, + ECalenNotifyCmdLineLaunch, + ECalenNotifyAvkonViewSwitchLaunch, + ECalenNotifySettingsChanged, + ECalenNotifyViewCreationStarted, + ECalenNotifyDialogClosed, + ECalenNotifyCommandFailed, + ECalenNotifyDeleteFailed, + ECalenNotifyEntryClosed, + ECalenNotifySettingsClosed, + ECalenNotifySettingsCRepKeyChanged, + ECalenNotifyPluginEnabledDisabled, + ECalenNotifyEComRegistryChanged, + ECalenNotifyResourceChanged, + ECalenNotifyViewPopulationComplete, + ECalenNotifyAppForegrounded, + ECalenNotifyAppBackgrounded, + ECalenNotifyMarkedEntryDeleted, + ECalenNotifyCheckPluginUnloading, + ECalenNotifyEntrySent, + ECalenNotifyCancelDelete, + ECalenNotifyDayViewClosed, + ECalenNotifyMapClosed, + ECalenNotifyCancelMapLaunch, + ECalenNotifyMissedAlarmViewClosed, + ECalenNotifyMissedEventViewClosed, + ECalenNotifyEditorClosedFromViewer, + /*ECalenNotifyUserDefined1, + ECalenNotifyUserDefined2,*/ + ECalenNotifyThaiPluginEnabled, + ECalenNotifyThaiPluginDisabled, + ECalenNotifyUserDefined3, + ECalenNotifyUserDefined4, + ECalenNotifyLast + }; + +/** + * Class for handling calendar notifications. + */ +class MCalenNotificationHandler + { + public: // New functions + virtual void HandleNotification( const TCalenNotification aNotification ) = 0; + }; + +#endif // CALENNOTIFICATIONHANDLER_H + +// End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calenpluginlabel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calenpluginlabel.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,43 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: CalenPluginLabel class definition. +* +*/ + +#ifndef CALENPLUGINLABEL_H +#define CALENPLUGINLABEL_H + +// System includes +#include + +class MCalenServices; +class CalenPluginLabel : public HbLabel +{ + Q_OBJECT + +public: + Q_DECL_EXPORT CalenPluginLabel(MCalenServices &services, QGraphicsItem *parent = 0) : mServices(services){Q_UNUSED(parent);} + Q_DECL_EXPORT ~CalenPluginLabel(){} + +protected: + void gestureEvent(QGestureEvent *event){Q_UNUSED(event);} + + +private: + MCalenServices &mServices; +}; + +#endif /* CALENPLUGINLABEL_H */ + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calenservices.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calenservices.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,39 @@ +/* + * calenservices.h + * + * Created on: Jun 21, 2010 + * Author: zabinpio + */ + +#ifndef CALENSERVICES_H_ +#define CALENSERVICES_H_ + +#include "calencontext.h" + +/*! + Mocked class MCalenServices + */ +class AgendaUtil; + +class MCalenServices +{ +public: + MCalenServices() { + + } + + MCalenContext& Context(){ + return mContext; + } + + int getFirstView(){ return 0;} + TBool IssueCommandL( TInt aCommand ){ Q_UNUSED(aCommand); return EFalse;} + AgendaUtil* agendaInterface() {return 0;} + + ~MCalenServices() { + + } + + MCalenContext mContext; +}; +#endif /* CALENSERVICES_H_ */ diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calenview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/calenview.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,49 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Baseclass for creating customised views + * +*/ + +#ifndef CALENVIEW_H +#define CALENVIEW_H + +// INCLUDES +#include + + +/** + * CCalenView is the base class for + * creating customised calendar views. + */ +class CalenView : public HbView + { + public: // Enumerations + enum TNextPopulationStep + { + EKeepGoing, + EWaitForInstanceView, + EWaitForEntryView, + EDone + }; + + public: // New functions + + virtual TNextPopulationStep ActiveStepL(){return EDone;} + virtual void CancelPopulation(){} + + }; + +#endif // CALENVIEW_H + +// End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/hb_calencommands.hrh --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/hb_calencommands.hrh Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,102 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Calendar controller commands +* +*/ + + +#ifndef HB_CALENCOMMANDS_HRH +#define HB_CALENCOMMANDS_HRH + + +// 1000 commands for each action ui. +// We start from 10000 because otherwise we might overlap other command ranges, +// e.g. Avkon == 3000. + +enum TCalenCommandBase + { + ECalenViewCommandBase = 20000, + ECalenEditCommandBase = 20100, + ECalenDeleteCommandBase = 20200, + ECalenSettingsCommandBase = 20300, + ECalenMapCommandBase = 20400, + ECalenMissedAlarmCommandBase = 20500 + }; + +enum TCalenCommandId + { + ECalenMonthView = ECalenViewCommandBase, + ECalenWeekView, + ECalenAgendaView, + ECalenDayView, + ECalenTodoEditor, + ECalenTodoEditorDone, + ECalenForwardsToDayView, + ECalenNextView, + ECalenPrevView, + ECalenSwitchView, + ECalenShowToolbar, + ECalenHideToolbar, + ECalenUpdateToolbar, + ECalenHidePreview, + ECalenShowPreview, + ECalenStartActiveStep, + ECalenGotoToday, + ECalenGotoDate, + ECalenEventView, + ECalenCmdPromptThenEdit, + ECalenFasterAppExit, + ECalenShowNextDay, + ECalenShowPrevDay, + ECalenNewMeeting = ECalenEditCommandBase, + ECalenNewAnniv, + ECalenNewDayNote, + ECalenNewReminder, + ECalenNewMeetingRequest, + ECalenNewEntry, + ECalenEditCurrentEntry, + ECalenEditSeries, + ECalenEditOccurrence, + ECalenEditEntryFromViewer, + ECalenViewCurrentEntry, + ECalenNotifyFocusChange, + ECalenCompleteTodo, + ECalenRestoreTodo, + ECalenSend, + ECalenDeleteCurrentEntry = ECalenDeleteCommandBase, + ECalenDeleteEntryWithoutQuery, + ECalenDeleteSeries, + ECalenDeleteCurrentOccurrence, + ECalenDeleteAllEntries, + ECalenDeleteEntriesBeforeDate, + ECalenCancelDelete, + ECalenDeleteEntryFromViewer, + ECalenShowSettings = ECalenSettingsCommandBase, + ECalenGetLocation = ECalenMapCommandBase, + ECalenShowLocation, + ECalenGetLocationAndSave, + ECalenMissedAlarmsView = ECalenMissedAlarmCommandBase, + ECalenMissedEventView, + ECalenCmdClear, + ECalenCmdClearAll, + ECalenCmdGotoCalendar, + ECalenMissedAlarmsViewFromIdle, + ECalenMissedEventViewFromIdle, + ECalenLastCommand, + ECalenRegionalPluginTapEvent + }; + +#endif // HB_CALENCOMMANDS_HRH + +// End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/hbeffect.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/hbeffect.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,183 @@ +/**************************************************************************** + ** + ** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). + ** All rights reserved. + ** Contact: Nokia Corporation (developer.feedback@nokia.com) + ** + ** This file is part of the HbCore module of the UI Extensions for Mobile. + ** + ** GNU Lesser General Public License Usage + ** This file may be used under the terms of the GNU Lesser General Public + ** License version 2.1 as published by the Free Software Foundation and + ** appearing in the file LICENSE.LGPL included in the packaging of this file. + ** Please review the following information to ensure the GNU Lesser General + ** Public License version 2.1 requirements will be met: + ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + ** + ** In addition, as a special exception, Nokia gives you certain additional + ** rights. These rights are described in the Nokia Qt LGPL Exception + ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. + ** + ** If you have questions regarding the use of this file, please contact + ** Nokia at developer.feedback@nokia.com. + ** + ****************************************************************************/ + +#ifndef HBEFFECT_H +#define HBEFFECT_H + +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE +class QGraphicsItem; +class QVariant; +QT_END_NAMESPACE + +class HbEffect + { + +public: + + struct EffectStatus + { + QGraphicsItem *item; + QString effectEvent; + Hb::EffectEvent reason; + QVariant userData; + }; + + static bool start(QGraphicsItem *item, const QString &itemType, + const QString &effectEvent, QObject *receiver = 0, + const char *member = 0, const QVariant &userData = QVariant(), + const QRectF &extRect = QRectF()) + { + Q_UNUSED(item); + Q_UNUSED(itemType); + Q_UNUSED(effectEvent); + Q_UNUSED(receiver); + Q_UNUSED(member); + Q_UNUSED(userData); + Q_UNUSED(extRect); + return false; + } + + static bool start(QGraphicsItem *item, const QString &effectEvent, + QObject *receiver = 0, const char *member = 0, + const QVariant &userData = QVariant(), const QRectF &extRect = + QRectF()) + { + Q_UNUSED(item); + Q_UNUSED(effectEvent); + Q_UNUSED(receiver); + Q_UNUSED(member); + Q_UNUSED(userData); + Q_UNUSED(extRect); + return false; + } + + static bool start(const QList &items, + const QString &itemType, const QString &effectEvent, + QObject *receiver = 0, const char *member = 0, + const QVariant &userData = QVariant()) + { + Q_UNUSED(items); + Q_UNUSED(itemType); + Q_UNUSED(effectEvent); + Q_UNUSED(receiver); + Q_UNUSED(member); + Q_UNUSED(userData); + return false; + } + + static bool effectRunning(QGraphicsItem *item, const QString &effectEvent = + QString()) + { + Q_UNUSED(item); + Q_UNUSED(effectEvent); + return false; + } + + static bool cancel(QGraphicsItem *item, const QString &effectEvent = + QString(), bool clearEffect = false, bool sendCallback = true, + bool itemIsValid = true) + { + Q_UNUSED(item); + Q_UNUSED(effectEvent); + Q_UNUSED(clearEffect); + Q_UNUSED(sendCallback); + Q_UNUSED(itemIsValid); + return false; + } + + static bool add(const QString &itemType, const QString &filePath, + const QString &effectEvent = QString()) + { + Q_UNUSED(itemType); + Q_UNUSED(filePath); + Q_UNUSED(effectEvent); + return false; + } + static bool add(const QStringList &itemType, const QStringList &filePath, + const QStringList &effectEvent = QStringList()) + { + Q_UNUSED(itemType); + Q_UNUSED(filePath); + Q_UNUSED(effectEvent); + return false; + } + + static bool add(QGraphicsItem *item, const QString &filePath, + const QString &effectEvent = QString()) + { + Q_UNUSED(item); + Q_UNUSED(filePath); + Q_UNUSED(effectEvent); + return false; + } + static bool add(QGraphicsItem *item, const QStringList &filePath, + const QStringList &effectEvent = QStringList()) + { + Q_UNUSED(item); + Q_UNUSED(filePath); + Q_UNUSED(effectEvent); + return false; + } + + static bool remove(const QString &itemType, const QString &filePath, + const QString &effectEvent = QString()) + { + Q_UNUSED(itemType); + Q_UNUSED(filePath); + Q_UNUSED(effectEvent); + return false; + } + static bool remove(QGraphicsItem *item, const QString &filePath, + const QString &effectEvent = QString()) + { + Q_UNUSED(item); + Q_UNUSED(filePath); + Q_UNUSED(effectEvent); + return false; + } + static bool remove(QGraphicsItem *item) + { + Q_UNUSED(item); + return false; + } + + static void enable(QGraphicsItem *item) + { + Q_UNUSED(item); + } + static void disable(QGraphicsItem *item) + { + Q_UNUSED(item); + } + }; + +Q_DECLARE_METATYPE(HbEffect::EffectStatus) + +#endif // HBEFFECT_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/rom/unittest_calendayview.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/rom/unittest_calendayview.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Image description file for test project +* +*/ + +#ifndef UNITTEST_CALENDAYITEM_IBY +#define UNITTEST_CALENDAYITEM_IBY + +S60_APP_EXE(unittest_calendayitem) +S60_APP_RESOURCE(unittest_calendayitem) + +// Application registration file. +data=DATAZ_\private\10003a3f\import\apps\unittest_calendayview_reg.rsc \private\10003a3f\import\apps\unittest_calendayview_reg.rsc + + +#endif // UNITTEST_CALENDAYITEM_IBY \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/unittest_calendayview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/unittest_calendayview.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Test class for CalenDayContainerWidget + * + */ +#include + +#include "calenservices.h" +#include "calendateutils.h" +#include "calendaymodelmanager.h" +#include "calendayview.h" + +class TestCalenDayView : public QObject +{ +Q_OBJECT + +public: + TestCalenDayView(); + virtual ~TestCalenDayView(); + +private slots: + void initTestCase(); + void cleanupTestCase(); + void init(); + void cleanup(); + + void testConstructors(); + +private: + CalenDayView *mView; +}; + +/*! + Constructor + */ +TestCalenDayView::TestCalenDayView() : + mView(NULL) +{ + +} + +/*! + Destructor + */ +TestCalenDayView::~TestCalenDayView() +{ + +} + +/*! + Called before testcase + */ +void TestCalenDayView::initTestCase() +{ +} + +/*! + Called after testcase + */ +void TestCalenDayView::cleanupTestCase() +{ + +} + +/*! + Called before every function + */ +void TestCalenDayView::init() +{ + +} + +/*! + Called after everyfunction + */ +void TestCalenDayView::cleanup() +{ + +} + +void TestCalenDayView::testConstructors() +{ + MCalenServices services; + //1) + CalenDayView *testView = 0; + QVERIFY(!testView); + + //2) + testView = new CalenDayView(services); + QVERIFY(testView); + + delete testView; +} + +int main(int argc, char ** argv) + +{ + +argc++; + +argc++; + +char * argvNew[3]; + +argvNew[0]= argv[0]; + +argvNew[1]= const_cast("-o"); + +argvNew[2]= const_cast("c:\\unittest\\TestCalenDayView.txt");//set place where //output chould be + +QApplication app(argc, argvNew); + +TestCalenDayView testFile;//file with class containing unit tests + +QTest::qExec(&testFile,argc,argvNew); + +} +#include "unittest_calendayview.moc" diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittest_calendayview/unittest_calendayview.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittest_calendayview/unittest_calendayview.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,67 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: calendaycontentwidget test project file +# + +TEMPLATE = app +TARGET = unittest_calendayview + +MOC_DIR = moc + +CONFIG += qtestlib +CONFIG += symbian_test +CONFIG += hb + +INCLUDEPATH += . \ + ../../../inc/ \ + +DEPENDPATH += . \ + ../../../inc/ \ + ../../../src/ \ + +# Input +HEADERS += hbeffect.h \ + calendateutils.h \ + calenservices.h \ + calencontext.h \ + calennotificationhandler.h \ + calenview.h \ + calennativeview.h \ + hb_calencommands.hrh \ + calendocloader.h \ + calendarcrkeys.h \ + calenuid.h \ + calenpluginlabel.h \ + calendaymodelmanager.h \ + calendaycontentwidget.h \ + calendaycontentscrollarea.h \ + calendayhourscrollarea.h \ + calendayutils.h \ + calendateutils.h \ + calendayview.h + +SOURCES += unittest_calendayview.cpp \ + calendayview.cpp + +symbian : { + TARGET.CAPABILITY = CAP_APPLICATION + MMP_RULES += "USERINCLUDE ." + + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + LIBS += -lagendainterface \ + -lxqsettingsmanager +} + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/dayview/tsrc/unittests/unittests.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/dayview/tsrc/unittests/unittests.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,35 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: calendayview project file for all unittests +# + +TEMPLATE = subdirs + +SUBDIRS = unittest_calendaycontentwidget \ + unittest_calendaystatusstrip \ + unittest_calendayutils \ + unittest_calendayitem \ + unittest_calendayhourelement \ + unittest_calendayhourscrollarea \ + unittest_calendayeventspane \ + unittest_calendayinfo \ + unittest_calendaycontainer \ + unittest_calendaymodel \ + unittest_calendayitemview \ + unittest_calendaymodelmanager \ + unittest_calendayview + +CONFIG += symbian_test + +# End of file --Don't remove this. \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/eabi/calenviewsu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/eabi/calenviewsu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,215 @@ +EXPORTS + _ZN12CalenDayView12doPopulationEv @ 1 NONAME + _ZN12CalenDayView9setupViewEP14CalenDocLoader @ 2 NONAME + _ZN12CalenDayViewC1ER14MCalenServices @ 3 NONAME + _ZN12CalenDayViewC2ER14MCalenServices @ 4 NONAME + _ZN12CalenDayViewD0Ev @ 5 NONAME + _ZN12CalenDayViewD1Ev @ 6 NONAME + _ZN12CalenDayViewD2Ev @ 7 NONAME + _ZN14CalenMonthGrid10appendRowsEv @ 8 NONAME + _ZN14CalenMonthGrid11downGestureEv @ 9 NONAME + _ZN14CalenMonthGrid11prependRowsEv @ 10 NONAME + _ZN14CalenMonthGrid11qt_metacallEN11QMetaObject4CallEiPPv @ 11 NONAME + _ZN14CalenMonthGrid11qt_metacastEPKc @ 12 NONAME + _ZN14CalenMonthGrid12gestureEventEP13QGestureEvent @ 13 NONAME + _ZN14CalenMonthGrid13itemActivatedERK11QModelIndex @ 14 NONAME + _ZN14CalenMonthGrid14setActiveDatesE5QDate @ 15 NONAME + _ZN14CalenMonthGrid14setCurrentIdexEi @ 16 NONAME + _ZN14CalenMonthGrid15getCurrentIndexEv @ 17 NONAME + _ZN14CalenMonthGrid15mousePressEventEP24QGraphicsSceneMouseEvent @ 18 NONAME + _ZN14CalenMonthGrid16staticMetaObjectE @ 19 NONAME DATA 16 + _ZN14CalenMonthGrid17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 20 NONAME + _ZN14CalenMonthGrid17scrollingFinishedEv @ 21 NONAME + _ZN14CalenMonthGrid18orientationChangedEN2Qt11OrientationE @ 22 NONAME + _ZN14CalenMonthGrid19getStaticMetaObjectEv @ 23 NONAME + _ZN14CalenMonthGrid19handleAppendingRowsER5QListI14CalenMonthDataE @ 24 NONAME + _ZN14CalenMonthGrid19setFocusToProperDayEv @ 25 NONAME + _ZN14CalenMonthGrid20handlePrependingRowsER5QListI14CalenMonthDataE @ 26 NONAME + _ZN14CalenMonthGrid20updateMonthGridModelER5QListI14CalenMonthDataEib @ 27 NONAME + _ZN14CalenMonthGrid24handlePanGestureFinishedEv @ 28 NONAME + _ZN14CalenMonthGrid33updateMonthGridWithInActiveMonthsER5QListI14CalenMonthDataE @ 29 NONAME + _ZN14CalenMonthGrid34updateMonthGridWithEventIndicatorsER5QListI14CalenMonthDataE @ 30 NONAME + _ZN14CalenMonthGrid5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 31 NONAME + _ZN14CalenMonthGrid7setViewEP14CalenMonthView @ 32 NONAME + _ZN14CalenMonthGrid9upGestureEv @ 33 NONAME + _ZN14CalenMonthGridC1EP13QGraphicsItem @ 34 NONAME + _ZN14CalenMonthGridC2EP13QGraphicsItem @ 35 NONAME + _ZN14CalenMonthGridD0Ev @ 36 NONAME + _ZN14CalenMonthGridD1Ev @ 37 NONAME + _ZN14CalenMonthGridD2Ev @ 38 NONAME + _ZN14CalenMonthView10createGridEv @ 39 NONAME + _ZN14CalenMonthView11qt_metacallEN11QMetaObject4CallEiPPv @ 40 NONAME + _ZN14CalenMonthView11qt_metacastEPKc @ 41 NONAME + _ZN14CalenMonthView12createEditorEv @ 42 NONAME + _ZN14CalenMonthView12doPopulationEv @ 43 NONAME + _ZN14CalenMonthView12getActiveDayEv @ 44 NONAME + _ZN14CalenMonthView12setActiveDayE9QDateTime @ 45 NONAME + _ZN14CalenMonthView13doLazyLoadingEv @ 46 NONAME + _ZN14CalenMonthView13getCurrentDayEv @ 47 NONAME + _ZN14CalenMonthView13launchDayViewEv @ 48 NONAME + _ZN14CalenMonthView13monthDataListEv @ 49 NONAME + _ZN14CalenMonthView14addWeekNumbersEv @ 50 NONAME + _ZN14CalenMonthView14firstDayOfGridEv @ 51 NONAME + _ZN14CalenMonthView14rowsInFutMonthEv @ 52 NONAME + _ZN14CalenMonthView14setDateToLabelEv @ 53 NONAME + _ZN14CalenMonthView14updateDayLabelEv @ 54 NONAME + _ZN14CalenMonthView15dateFromContextERK13MCalenContext @ 55 NONAME + _ZN14CalenMonthView15getInstanceListER5QListI5QDateE9QDateTimeS4_ @ 56 NONAME + _ZN14CalenMonthView15onLocaleChangedEi @ 57 NONAME + _ZN14CalenMonthView15rowsInPrevMonthEv @ 58 NONAME + _ZN14CalenMonthView16getCurrGridIndexEv @ 59 NONAME + _ZN14CalenMonthView16onContextChangedEv @ 60 NONAME + _ZN14CalenMonthView16setCurrGridIndexEi @ 61 NONAME + _ZN14CalenMonthView16staticMetaObjectE @ 62 NONAME DATA 16 + _ZN14CalenMonthView17changeOrientationEN2Qt11OrientationE @ 63 NONAME + _ZN14CalenMonthView17populateNextMonthEv @ 64 NONAME + _ZN14CalenMonthView17populatePrevMonthEv @ 65 NONAME + _ZN14CalenMonthView17removeWeekNumbersEv @ 66 NONAME + _ZN14CalenMonthView18addBackgroundFrameEv @ 67 NONAME + _ZN14CalenMonthView18completePopulationEv @ 68 NONAME + _ZN14CalenMonthView19getStaticMetaObjectEv @ 69 NONAME + _ZN14CalenMonthView19populatePreviewPaneER9QDateTime @ 70 NONAME + _ZN14CalenMonthView20prepareForPopulationEv @ 71 NONAME + _ZN14CalenMonthView21refreshViewOnGoToDateEv @ 72 NONAME + _ZN14CalenMonthView22addRemoveActionsInMenuEv @ 73 NONAME + _ZN14CalenMonthView22setContextForActiveDayEi @ 74 NONAME + _ZN14CalenMonthView22updateWeekNumGridModelEv @ 75 NONAME + _ZN14CalenMonthView23handleChangeOrientationEv @ 76 NONAME + _ZN14CalenMonthView23handleGridItemActivatedEv @ 77 NONAME + _ZN14CalenMonthView24handlePreviewPaneGestureEb @ 78 NONAME + _ZN14CalenMonthView24populateWithInstanceViewEv @ 79 NONAME + _ZN14CalenMonthView24updateModelWithPrevMonthEv @ 80 NONAME + _ZN14CalenMonthView25handleLeftEffectCompletedERKN8HbEffect12EffectStatusE @ 81 NONAME + _ZN14CalenMonthView26fetchEntriesAndUpdateModelEv @ 82 NONAME + _ZN14CalenMonthView26handleRightEffectCompletedERKN8HbEffect12EffectStatusE @ 83 NONAME + _ZN14CalenMonthView26updateModelWithFutureMonthEv @ 84 NONAME + _ZN14CalenMonthView27showHideRegionalInformationEv @ 85 NONAME + _ZN14CalenMonthView35updateMonthDataArrayWithActiveDatesEv @ 86 NONAME + _ZN14CalenMonthView7setDateEv @ 87 NONAME + _ZN14CalenMonthView9goToTodayEv @ 88 NONAME + _ZN14CalenMonthView9setupViewEP14CalenDocLoader @ 89 NONAME + _ZN14CalenMonthViewC1ER14MCalenServices @ 90 NONAME + _ZN14CalenMonthViewC2ER14MCalenServices @ 91 NONAME + _ZN14CalenMonthViewD0Ev @ 92 NONAME + _ZN14CalenMonthViewD1Ev @ 93 NONAME + _ZN14CalenMonthViewD2Ev @ 94 NONAME + _ZN15CalenAgendaView12doPopulationEv @ 95 NONAME + _ZN15CalenAgendaView14clearListModelEv @ 96 NONAME + _ZN15CalenAgendaView18HandleNotificationE18TCalenNotification @ 97 NONAME + _ZN15CalenAgendaView26disconnectAboutToQuitEventEv @ 98 NONAME + _ZN15CalenAgendaView9docLoaderEv @ 99 NONAME + _ZN15CalenAgendaView9setupViewEP14CalenDocLoader @ 100 NONAME + _ZN15CalenAgendaViewC1ER14MCalenServices @ 101 NONAME + _ZN15CalenAgendaViewC2ER14MCalenServices @ 102 NONAME + _ZN15CalenAgendaViewD0Ev @ 103 NONAME + _ZN15CalenAgendaViewD1Ev @ 104 NONAME + _ZN15CalenAgendaViewD2Ev @ 105 NONAME + _ZN15CalenNativeView17captureScreenshotEb @ 106 NONAME + _ZN16CalenPluginLabelC1ER14MCalenServicesP13QGraphicsItem @ 107 NONAME + _ZN16CalenPluginLabelC2ER14MCalenServicesP13QGraphicsItem @ 108 NONAME + _ZN16CalenPluginLabelD0Ev @ 109 NONAME + _ZN16CalenPluginLabelD1Ev @ 110 NONAME + _ZN16CalenPluginLabelD2Ev @ 111 NONAME + _ZN16CalenPreviewPane11qt_metacallEN11QMetaObject4CallEiPPv @ 112 NONAME + _ZN16CalenPreviewPane11qt_metacastEPKc @ 113 NONAME + _ZN16CalenPreviewPane12gestureEventEP13QGestureEvent @ 114 NONAME + _ZN16CalenPreviewPane13populateLabelE9QDateTime @ 115 NONAME + _ZN16CalenPreviewPane13stopScrollingEv @ 116 NONAME + _ZN16CalenPreviewPane15startAutoScrollEv @ 117 NONAME + _ZN16CalenPreviewPane16GetInstanceListLEv @ 118 NONAME + _ZN16CalenPreviewPane16staticMetaObjectE @ 119 NONAME DATA 16 + _ZN16CalenPreviewPane17scrollingFinishedEv @ 120 NONAME + _ZN16CalenPreviewPane17setNoEntriesLabelEP7HbLabel @ 121 NONAME + _ZN16CalenPreviewPane19getStaticMetaObjectEv @ 122 NONAME + _ZN16CalenPreviewPane19onTwoSecondsTimeoutEv @ 123 NONAME + _ZN16CalenPreviewPane4DateEv @ 124 NONAME + _ZN16CalenPreviewPane7setViewEP14CalenMonthView @ 125 NONAME + _ZN16CalenPreviewPaneC1ER14MCalenServicesP13QGraphicsItem @ 126 NONAME + _ZN16CalenPreviewPaneC2ER14MCalenServicesP13QGraphicsItem @ 127 NONAME + _ZN16CalenPreviewPaneD0Ev @ 128 NONAME + _ZN16CalenPreviewPaneD1Ev @ 129 NONAME + _ZN16CalenPreviewPaneD2Ev @ 130 NONAME + _ZN17CalenSettingsView11qt_metacallEN11QMetaObject4CallEiPPv @ 131 NONAME + _ZN17CalenSettingsView11qt_metacastEPKc @ 132 NONAME + _ZN17CalenSettingsView11refreshViewEv @ 133 NONAME + _ZN17CalenSettingsView14initializeFormEv @ 134 NONAME + _ZN17CalenSettingsView16staticMetaObjectE @ 135 NONAME DATA 16 + _ZN17CalenSettingsView18launchPreviousViewEv @ 136 NONAME + _ZN17CalenSettingsView19getStaticMetaObjectEv @ 137 NONAME + _ZN17CalenSettingsViewC1ER14MCalenServicesP13QGraphicsItem @ 138 NONAME + _ZN17CalenSettingsViewC2ER14MCalenServicesP13QGraphicsItem @ 139 NONAME + _ZN17CalenSettingsViewD0Ev @ 140 NONAME + _ZN17CalenSettingsViewD1Ev @ 141 NONAME + _ZN17CalenSettingsViewD2Ev @ 142 NONAME + _ZN21CalenAgendaViewWidgetC1ER14MCalenServicesP14CalenDocLoader @ 143 NONAME + _ZN21CalenAgendaViewWidgetC2ER14MCalenServicesP14CalenDocLoader @ 144 NONAME + _ZN21CalenAgendaViewWidgetD0Ev @ 145 NONAME + _ZN21CalenAgendaViewWidgetD1Ev @ 146 NONAME + _ZN21CalenAgendaViewWidgetD2Ev @ 147 NONAME + _ZN21CalenThickLinesDrawer11qt_metacallEN11QMetaObject4CallEiPPv @ 148 NONAME + _ZN21CalenThickLinesDrawer11qt_metacastEPKc @ 149 NONAME + _ZN21CalenThickLinesDrawer16staticMetaObjectE @ 150 NONAME DATA 16 + _ZN21CalenThickLinesDrawer19getStaticMetaObjectEv @ 151 NONAME + _ZN21CalenThickLinesDrawer5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 152 NONAME + _ZN21CalenThickLinesDrawerC1EN17CalendarNamespace10WidgetTypeEP13QGraphicsItem @ 153 NONAME + _ZN21CalenThickLinesDrawerC2EN17CalendarNamespace10WidgetTypeEP13QGraphicsItem @ 154 NONAME + _ZN21CalenThickLinesDrawerD0Ev @ 155 NONAME + _ZN21CalenThickLinesDrawerD1Ev @ 156 NONAME + _ZN21CalenThickLinesDrawerD2Ev @ 157 NONAME + _ZNK14CalenMonthGrid10metaObjectEv @ 158 NONAME + _ZNK14CalenMonthView10metaObjectEv @ 159 NONAME + _ZNK16CalenPreviewPane10metaObjectEv @ 160 NONAME + _ZNK17CalenSettingsView10metaObjectEv @ 161 NONAME + _ZNK21CalenThickLinesDrawer10metaObjectEv @ 162 NONAME + _ZTI14CalenMonthGrid @ 163 NONAME + _ZTI14CalenMonthView @ 164 NONAME + _ZTI16CalenPreviewPane @ 165 NONAME + _ZTI17CalenSettingsView @ 166 NONAME + _ZTI21CalenThickLinesDrawer @ 167 NONAME + _ZTV14CalenMonthGrid @ 168 NONAME + _ZTV14CalenMonthView @ 169 NONAME + _ZTV16CalenPreviewPane @ 170 NONAME + _ZTV17CalenSettingsView @ 171 NONAME + _ZTV21CalenThickLinesDrawer @ 172 NONAME + _ZThn16_N12CalenDayViewD0Ev @ 173 NONAME + _ZThn16_N12CalenDayViewD1Ev @ 174 NONAME + _ZThn16_N14CalenMonthGridD0Ev @ 175 NONAME + _ZThn16_N14CalenMonthGridD1Ev @ 176 NONAME + _ZThn16_N14CalenMonthViewD0Ev @ 177 NONAME + _ZThn16_N14CalenMonthViewD1Ev @ 178 NONAME + _ZThn16_N15CalenAgendaViewD0Ev @ 179 NONAME + _ZThn16_N15CalenAgendaViewD1Ev @ 180 NONAME + _ZThn16_N16CalenPluginLabelD0Ev @ 181 NONAME + _ZThn16_N16CalenPluginLabelD1Ev @ 182 NONAME + _ZThn16_N16CalenPreviewPaneD0Ev @ 183 NONAME + _ZThn16_N16CalenPreviewPaneD1Ev @ 184 NONAME + _ZThn16_N17CalenSettingsViewD0Ev @ 185 NONAME + _ZThn16_N17CalenSettingsViewD1Ev @ 186 NONAME + _ZThn16_N21CalenAgendaViewWidgetD0Ev @ 187 NONAME + _ZThn16_N21CalenAgendaViewWidgetD1Ev @ 188 NONAME + _ZThn16_N21CalenThickLinesDrawerD0Ev @ 189 NONAME + _ZThn16_N21CalenThickLinesDrawerD1Ev @ 190 NONAME + _ZThn28_N15CalenAgendaView18HandleNotificationE18TCalenNotification @ 191 NONAME + _ZThn8_N12CalenDayViewD0Ev @ 192 NONAME + _ZThn8_N12CalenDayViewD1Ev @ 193 NONAME + _ZThn8_N14CalenMonthGrid15mousePressEventEP24QGraphicsSceneMouseEvent @ 194 NONAME + _ZThn8_N14CalenMonthGrid17mouseReleaseEventEP24QGraphicsSceneMouseEvent @ 195 NONAME + _ZThn8_N14CalenMonthGrid5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 196 NONAME + _ZThn8_N14CalenMonthGridD0Ev @ 197 NONAME + _ZThn8_N14CalenMonthGridD1Ev @ 198 NONAME + _ZThn8_N14CalenMonthViewD0Ev @ 199 NONAME + _ZThn8_N14CalenMonthViewD1Ev @ 200 NONAME + _ZThn8_N15CalenAgendaViewD0Ev @ 201 NONAME + _ZThn8_N15CalenAgendaViewD1Ev @ 202 NONAME + _ZThn8_N16CalenPluginLabelD0Ev @ 203 NONAME + _ZThn8_N16CalenPluginLabelD1Ev @ 204 NONAME + _ZThn8_N16CalenPreviewPaneD0Ev @ 205 NONAME + _ZThn8_N16CalenPreviewPaneD1Ev @ 206 NONAME + _ZThn8_N17CalenSettingsViewD0Ev @ 207 NONAME + _ZThn8_N17CalenSettingsViewD1Ev @ 208 NONAME + _ZThn8_N21CalenAgendaViewWidgetD0Ev @ 209 NONAME + _ZThn8_N21CalenAgendaViewWidgetD1Ev @ 210 NONAME + _ZThn8_N21CalenThickLinesDrawer5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 211 NONAME + _ZThn8_N21CalenThickLinesDrawerD0Ev @ 212 NONAME + _ZThn8_N21CalenThickLinesDrawerD1Ev @ 213 NONAME + diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/inc/calenagendaview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/inc/calenagendaview.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,189 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Class declaration for the agenda view +* +*/ + +#ifndef CALENAGENDAVIEW_H +#define CALENAGENDAVIEW_H + +// System includes +#include + +// User includes +#include "calennativeview.h" + +// Forward declarations +class QGraphicsSceneMouseEvent; +class CalenAgendaViewWidget; +class CalenDocLoader; + +#ifdef CALENVIEWS_DLL +#define CALENAGENDAVIEW_EXPORT Q_DECL_EXPORT +#else +#define CALENAGENDAVIEW_EXPORT Q_DECL_IMPORT +#endif + +/** + * @class CalenAgendaView + * @brief Class declaration for the agenda view + * which shows the list of events &/ to-do's (if any) + * for any given day in the calendar. User can do other + * basic operations like creating, viewing or deleting + * an event + */ +class CalenAgendaView : public CalenNativeView + { + Q_OBJECT + +public: + /** + * @brief Constructor + * @param services A reference to the MCalenServices object + */ + CALENAGENDAVIEW_EXPORT CalenAgendaView(MCalenServices &services); + + /** + * @brief Default C++ constructor + */ + CALENAGENDAVIEW_EXPORT virtual ~CalenAgendaView(); + + /** + * @brief Initializes the view after its creation + * Must be called only after the view and its children are constructed + * @param docLoader Pointer to the document loader object which has + * loaded this view from the .docml file + */ + CALENAGENDAVIEW_EXPORT void setupView(CalenDocLoader *docLoader); + + /** + * @brief Activates the current view. Sets this view as the current + * view of the application's main window. Must be called only after + * the view has been constructed and initialized + */ + CALENAGENDAVIEW_EXPORT virtual void doPopulation(); + + /** + * @brief Callback function for any notifications that has been + * subscribed by this view + * @param notification The event for which notification is being sent + */ + CALENAGENDAVIEW_EXPORT void HandleNotification(const TCalenNotification notification); + + /** + * @brief Getter function for the document loader. Called from the content + * widget in order get its children + */ + CALENAGENDAVIEW_EXPORT CalenDocLoader* docLoader(); + + /** + * @brief clears the list model from the view + */ + CALENAGENDAVIEW_EXPORT void clearListModel(); + + /** + * disconnectAboutToQuitEvent disconnects for the aboutToQuit events + * + */ + CALENAGENDAVIEW_EXPORT void disconnectAboutToQuitEvent(); + + /* + * @brief Refreshes the view with the date set in the context + */ + void refreshViewOnGoToDate(); + +protected: + void gestureEvent(QGestureEvent *event); + +private: + + /** + * @brief Connects to all the toolbar and menu actions associated + * with this view + */ + void setupActions(); + + /** + * @brief Callback function for listening to locale changes like + * time format, date format etc + */ + void onLocaleChanged(int reason); + +private slots: + + /** + * @brief Slot which is called whenever the orientation of the device changes + * @param orientation The current device orientation + */ + void orientationChanged(Qt::Orientation orientation); + + /** + * @brief Slot which launches back the month view + */ + void launchMonthView(); + + /** + * @brief Slot which launches the day view + */ + void launchDayView(); + +private: + + /** + * @var mDate + * @brief The date for which this view is being shown + */ + QDateTime mDate; + + /** + * @var mSoftKeyAction + * TODO: This may not be required going ahead + */ + HbAction *mSoftKeyAction; + + /** + * @var mAgendaViewWidget + * @brief The pointer to the content widget of this view + */ + CalenAgendaViewWidget *mAgendaViewWidget; + + /** + * @var mDocLoader + * @brief Pointer to the document loader which has loaded + * this view + */ + CalenDocLoader *mDocLoader; + + /** + * @var mGoToTodayAction + * Action which provides "Go to today" functionality + */ + HbAction *mGoToTodayAction; + + /** + * @var mSwitchToDayViewAction + * Action which provides "Switch to day view" functionality + */ + HbAction *mSwitchToDayViewAction; + + // TODO: Remove these after gestures are available + QPointF mTapPoint; + bool mActionTaken; + bool mIsAboutToQuitEventConnected; // bool to check if agenda view is registered to get aboutToQuit signals + +}; + +#endif /* CALENAGENDAVIEW_H */ + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/inc/calenagendaviewwidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/inc/calenagendaviewwidget.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,362 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: CalenAgendaViewWidget class definition. +* +*/ + +#ifndef CALENAGENDAVIEWWIDGET_H +#define CALENAGENDAVIEWWIDGET_H + +// System includes +#include +#include +#include +#include + +// User includes + +// Forward declarations +class QStandardItemModel; +class QGraphicsSceneMouseEvent; // TODO: Remove this after gestures are supported +class HbAbstractViewItem; +class HbGroupBox; +class HbListView; +class QPluginLoader; +class HbLabel; +class HbAction; +class HbDateTimePicker; +class XQSettingsManager; +class MCalenServices; +class CalenAgendaView; +class AgendaEntry; +class CalenDocLoader; +class CalenEventListViewItem; +class NotesEditor; + +/** + * @class CalenAgendaViewWidget + * @brief The content widget for the agenda view. + * It is responsible for showing all the events &/ to-do's + * (if any) for a particular day selected by the user + */ +class CalenAgendaViewWidget : public HbWidget + { + Q_OBJECT + +public: + + /** + * @brief Constructor + * @param services The reference to the MCalenServices object + * @param docLoader The document loader object + */ + IMPORT_C CalenAgendaViewWidget(MCalenServices &services, + CalenDocLoader *docLoader); + + /** + * @brief Default C++ destructor + */ + IMPORT_C ~CalenAgendaViewWidget(); + + /** + * @brief Initializes the widget to show all the events/to-do's + * for the selected day + * @param view Pointer to the view to which this is the content + */ + void setupWidget(CalenAgendaView *view); + + /** + * @brief Prepares the widget to be shown. + * Initializes the widget with the day's events and other details + */ + void showWidget(); + + /** + * @brief Called from the view whenever the orientation of the + * device changes + */ + void orientationChanged(Qt::Orientation); + + /** + * @brief Callback function to handle system locale change + */ + void handleLocaleChange(); + + /** + * @brief clears the list model from the view + */ + void clearListModel(); + +private: + + /** + * @brief Sets the context based on the item selected by the user + * @param entry The entry using which the context is deduced + */ + void setContextFromHighlight(AgendaEntry entry); + + /** + * @brief Initializes the child widgets of this widget + */ + void initChildWidgets(); + + /** + * @brief Populates the list with the events for the current day. + * Does nothing if the day has no events. To be called whenever + * the view has to be refreshed + */ + void populateListWidget(); + + /** + * @brief Gets the instance list for day + */ + void getInstanceList(); + + /** + * @brief Sets the heading text to show the date for which this + * widget is being shown + */ + void setHeadingText(); + + /** + * @brief Creates and adds an item to the list at position index + * @param index The position in the list when the item is added + * @param entry The entry whose details must be shown in the item + */ + void createListItem(int index, AgendaEntry entry); + + /** + * @brief Creates and add a list item for the event + * @param index The position in the list when the item is added + * @param entry The entry whose details must be shown in the item + */ + void addTimedEventToList(int index, AgendaEntry entry); + + /** + * @brief Creates and add a list item for the event which is non timed + * @param index The position in the list when the item is added + * @param entry The entry whose details must be shown in the item + */ + void addNonTimedEventToList(int index, AgendaEntry entry); + + /** + * @brief Sets strecthing to list items showing non-timed events + */ + void handleListItemStretching(Qt::Orientation orientation); + + /** + * @brief Returns the index in the list to which scrolling must + * happen. For ex: After creating a new event, the list must scroll + * to the newly created event + */ + int getIndexToScrollTo(); + + /** + * @brief To Show and hide regional plugin label depends upon settings + */ + + void showHideRegionalInformation(); + + + +private slots: + + /** + * @brief Opens the editor to create a new entry + */ + void createNewEvent(); + + /** + * @brief Opens the entry at position index in the list for + * editing in the editor. Does nothing if the index is invalid + */ + void editEntry(); + + /** + * @brief Opens the entry at position index in the list for + * viewing in the viewer. Does nothing if the index is invalid + */ + void viewEntry(); + + /** + * @brief Deletes the entry at position index in the list. + * Does nothing if the list is empty + */ + void deleteEntry(); + + /** + * @brief Marks a to-do as done + */ + void markAsDone(); + + /** + * @brief Handles long press on a particular item. Presents a + * context menu with various operations that the user can + * perform + * @param ite, The index item which is being long pressed + * @param coords The (x, y) co-ordinates where the long tap has + * occured + */ + void itemLongPressed(HbAbstractViewItem *item, const QPointF &coords); + + /** + * @brief Handles user selection on a particular item of a + * particular event in the list. Default action is to view it + * @param index Index of the item which was selected + */ + void itemActivated(const QModelIndex &index); + + /** + * @brief Called whenever a editing a to-do is completed + * @param status Inidcates if the editing was successful or not + */ + void noteEditingCompleted(bool status); + + /** + * @brief Callback function for navigating to today's agenda + * This option must be available only if the view is showing + * events for some day other than the current day + */ + void goToToday(); + + /** + * @brief This slot connected to aboutToClose()signal of contextmenu + * To reset the flag of mLongTapEventFlag + */ + void contextMenuClosed(); + + /** + * @brief Called when contextMenu item is triggered + */ + void contextManuTriggered(HbAction *action); + +private: + /** + * @var mDate + * @brief Stores the date for which this widget is being shown + */ + QDateTime mDate; + + /** + * @var mInstanceArray + * @brief Holds the list of instances for the day + */ + QList mInstanceArray; + + /** + * @var mHeadingLabel + * @brief The heading widget which shows the date + */ + HbGroupBox *mHeadingLabel; + + /** + * @var mEventsList + * @brief The list view which shows the list of events + */ + HbListView *mEventsList; + + /** + * @var mServices + * @brief The reference to the MCalenServices object + */ + MCalenServices &mServices; + + /** + * @var mView + * @brief The pointer to the view + */ + CalenAgendaView *mView; + + /** + * @var mDocLoader + * @brief The pointer to the document loader which has + * loaded this widget + */ + CalenDocLoader *mDocLoader; + + /** + * @var mListViewPrototype + * @brief Acts as the item prototype for list view. + * Allows providing own layout for list items + */ + CalenEventListViewItem *mListViewPrototype; + + /** + * @var mEmptyListLabel + * @brief The pointer to the empty view label + */ + HbLabel *mEmptyListLabel; + + /** + * @var mListModel + * @brief The event list model + */ + QStandardItemModel *mListModel; + + /** + * @var mSelectedIndex + * @brief Stores the index of the item being acted upon + * Since there is no focus, it becomes necessary to store the + * index of the item on which user is performing some action + */ + int mSelectedIndex; + + /** + * @var NotesEditorPluginLoader + * @brief Pointer to the notes editor plugin loader + */ + QPointer mNotesEditorPluginLoader; + + /** + * @var mDatePicker + * @brief The date picker component + */ + HbDateTimePicker *mDatePicker; + + /** + * @var mRegionalPluginLayout + * @brief Regional Plugin layout pointer + */ + QGraphicsLinearLayout* mRegionalPluginLayout; + + /** + * @var mRegionalInfoGroupBox + * @brief Regional Plugin Info groupbox + */ + HbGroupBox *mRegionalInfoGroupBox; + + /** + * @var mSettingsManager + * @brief Setting Manager pointer + */ + + XQSettingsManager *mSettingsManager; + + /** + * @var mLongTapeventFlag + * @brief Set flag true if contextmenu is opened + */ + bool mLongTapEventFlag; + + /** + * @var mNotesPluginLoaded + * @brief Holds notes editor plugin load info. + */ + bool mNotesPluginLoaded; + +}; + +#endif //CALENAGENDAVIEWWIDGET_H + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/inc/calendayview.h --- a/calendarui/views/inc/calendayview.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,170 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Class declaration for the day/agenda view -* -*/ - -#ifndef CALENDAYVIEW_H -#define CALENDAYVIEW_H - -// System includes -#include - -// User includes -#include "calennativeview.h" - -// Forward declarations -class QGraphicsSceneMouseEvent; -class CalenDayViewWidget; -class CalenDocLoader; - -#ifdef CALENVIEWS_DLL -#define CALENDAYVIEW_EXPORT Q_DECL_EXPORT -#else -#define CALENDAYVIEW_EXPORT Q_DECL_IMPORT -#endif - -/** - * @class CalenDayView - * @brief Class declaration for the day/agenda view - * which shows the list of events &/ to-do's (if any) - * for any given day in the calendar. User can do other - * basic operations like creating, viewing or deleting - * an event - */ -class CalenDayView : public CalenNativeView - { - Q_OBJECT - -public: - /** - * @brief Constructor - * @param services A reference to the MCalenServices object - */ - CALENDAYVIEW_EXPORT CalenDayView(MCalenServices &services); - - /** - * @brief Default C++ constructor - */ - CALENDAYVIEW_EXPORT virtual ~CalenDayView(); - - /** - * @brief Initializes the view after its creation - * Must be called only after the view and its children are constructed - * @param docLoader Pointer to the document loader object which has - * loaded this view from the .docml file - */ - CALENDAYVIEW_EXPORT void setupView(CalenDocLoader *docLoader); - - /** - * @brief Activates the current view. Sets this view as the current - * view of the application's main window. Must be called only after - * the view has been constructed and initialized - */ - CALENDAYVIEW_EXPORT virtual void doPopulation(); - - /** - * @brief Callback function for any notifications that has been - * subscribed by this view - * @param notification The event for which notification is being sent - */ - CALENDAYVIEW_EXPORT void HandleNotification(const TCalenNotification notification); - - /** - * @brief Getter function for the document loader. Called from the content - * widget in order get its children - */ - CALENDAYVIEW_EXPORT CalenDocLoader* docLoader(); - - /** - * @brief Refreshes the view with the date set in the context - */ - void refreshViewOnGoToDate(); - -protected: - - // TODO: Remove these after gestures are available - void mousePressEvent(QGraphicsSceneMouseEvent *event); - void mouseMoveEvent(QGraphicsSceneMouseEvent *event); - bool eventFilter(QObject *source, QEvent *event); - -private: - - /** - * @brief Connects to all the toolbar and menu actions associated - * with this view - */ - void setupActions(); - - /** - * @brief Callback function for listening to locale changes like - * time format, date format etc - */ - void onLocaleChanged(int reason); - -private slots: - - /** - * @brief Slot which is called whenever the orientation of the device changes - * @param orientation The current device orientation - */ - void orientationChanged(Qt::Orientation orientation); - - /** - * @brief Slot which launches back the month view - */ - void launchMonthView(); - -private: - - /** - * @var mDate - * @brief The date for which this view is being shown - */ - QDateTime mDate; - - /** - * @var mSoftKeyAction - * TODO: This may not be required going ahead - */ - HbAction *mSoftKeyAction; - - /** - * @var mDayViewWidget - * @brief The pointer to the content widget of this view - */ - CalenDayViewWidget *mDayViewWidget; - - /** - * @var mDocLoader - * @brief Pointer to the document loader which has loaded - * this view - */ - CalenDocLoader *mDocLoader; - - /** - * @var mGoToTodayAction - * Action which provides "Go to today" functionality - */ - HbAction *mGoToTodayAction; - - // TODO: Remove these after gestures are available - QPointF mTapPoint; - bool mActionTaken; - -}; - -#endif /* CALENDAYVIEW_H */ - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/inc/calendayviewwidget.h --- a/calendarui/views/inc/calendayviewwidget.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,328 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: CalenDayViewWidget class definition. -* -*/ - -#ifndef CALENDAYVIEWWIDGET_H -#define CALENDAYVIEWWIDGET_H - -// System includes -#include -#include -#include - -// User includes - -// Forward declarations -class QStandardItemModel; -class QGraphicsSceneMouseEvent; // TODO: Remove this after gestures are supported -class HbAbstractViewItem; -class HbGroupBox; -class HbListView; -class HbLabel; -class HbDateTimePicker; -class XQSettingsManager; -class MCalenServices; -class CalenDayView; -class AgendaEntry; -class CalenDocLoader; -class CalenEventListViewItem; -class NotesEditor; - -/** - * @class CalenDayViewWidget - * @brief The content widget for the day/agenda view. - * It is responsible for showing all the events &/ to-do's - * (if any) for a particular day selected by the user - */ -class CalenDayViewWidget : public HbWidget - { - Q_OBJECT - -public: - - /** - * @brief Constructor - * @param services The reference to the MCalenServices object - * @param docLoader The document loader object - */ - IMPORT_C CalenDayViewWidget(MCalenServices &services, - CalenDocLoader *docLoader); - - /** - * @brief Default C++ destructor - */ - IMPORT_C ~CalenDayViewWidget(); - - /** - * @brief Initializes the widget to show all the events/to-do's - * for the selected day - * @param view Pointer to the view to which this is the content - */ - void setupWidget(CalenDayView *view); - - /** - * @brief Prepares the widget to be shown. - * Initializes the widget with the day's events and other details - */ - void showWidget(); - - /** - * @brief Called from the view whenever the orientation of the - * device changes - */ - void orientationChanged(Qt::Orientation); - - /** - * @brief Callback function to handle system locale change - */ - void handleLocaleChange(); - -private: - - /** - * @brief Sets the context based on the item selected by the user - * @param entry The entry using which the context is deduced - */ - void setContextFromHighlight(AgendaEntry entry); - - /** - * @brief Initializes the child widgets of this widget - */ - void initChildWidgets(); - - /** - * @brief Populates the list with the events for the current day. - * Does nothing if the day has no events. To be called whenever - * the view has to be refreshed - */ - void populateListWidget(); - - /** - * @brief Gets the instance list for day - */ - void getInstanceList(); - - /** - * @brief Sets the heading text to show the date for which this - * widget is being shown - */ - void setHeadingText(); - - /** - * @brief Creates and adds an item to the list at position index - * @param index The position in the list when the item is added - * @param entry The entry whose details must be shown in the item - */ - void createListItem(int index, AgendaEntry entry); - - /** - * @brief Creates and add a list item for the event - * @param index The position in the list when the item is added - * @param entry The entry whose details must be shown in the item - */ - void addTimedEventToList(int index, AgendaEntry entry); - - /** - * @brief Creates and add a list item for the event which is non timed - * @param index The position in the list when the item is added - * @param entry The entry whose details must be shown in the item - */ - void addNonTimedEventToList(int index, AgendaEntry entry); - - /** - * @brief Sets strecthing to list items showing non-timed events - */ - void handleListItemStretching(Qt::Orientation orientation); - - /** - * @brief Returns the index in the list to which scrolling must - * happen. For ex: After creating a new event, the list must scroll - * to the newly created event - */ - int getIndexToScrollTo(); - - /** - * @brief To Show and hide regional plugin label depends upon settings - */ - - void showHideRegionalInformation(); - -private slots: - - /** - * @brief Opens the editor to create a new entry - */ - void createNewEvent(); - - /** - * @brief Opens the entry at position index in the list for - * editing in the editor. Does nothing if the index is invalid - */ - void editEntry(); - - /** - * @brief Opens the entry at position index in the list for - * viewing in the viewer. Does nothing if the index is invalid - */ - void viewEntry(); - - /** - * @brief Deletes the entry at position index in the list. - * Does nothing if the list is empty - */ - void deleteEntry(); - - /** - * @brief Marks a to-do as done - */ - void markAsDone(); - - /** - * @brief Handles long press on a particular item. Presents a - * context menu with various operations that the user can - * perform - * @param ite, The index item which is being long pressed - * @param coords The (x, y) co-ordinates where the long tap has - * occured - */ - void itemLongPressed(HbAbstractViewItem *item, const QPointF &coords); - - /** - * @brief Handles user selection on a particular item of a - * particular event in the list. Default action is to view it - * @param index Index of the item which was selected - */ - void itemActivated(const QModelIndex &index); - - /** - * @brief Called whenever a editing a to-do is completed - * @param status Inidcates if the editing was successful or not - */ - void noteEditingCompleted(bool status); - - /** - * @brief Callback function for navigating to today's agenda - * This option must be available only if the view is showing - * events for some day other than the current day - */ - void goToToday(); - -private: - /** - * @var mDate - * @brief Stores the date for which this widget is being shown - */ - QDateTime mDate; - - /** - * @var mInstanceArray - * @brief Holds the list of instances for the day - */ - QList mInstanceArray; - - /** - * @var mHeadingLabel - * @brief The heading widget which shows the date - */ - HbGroupBox *mHeadingLabel; - - /** - * @var mEventsList - * @brief The list view which shows the list of events - */ - HbListView *mEventsList; - - /** - * @var mServices - * @brief The reference to the MCalenServices object - */ - MCalenServices &mServices; - - /** - * @var mView - * @brief The pointer to the view - */ - CalenDayView *mView; - - /** - * @var mDocLoader - * @brief The pointer to the document loader which has - * loaded this widget - */ - CalenDocLoader *mDocLoader; - - /** - * @var mListViewPrototype - * @brief Acts as the item prototype for list view. - * Allows providing own layout for list items - */ - CalenEventListViewItem *mListViewPrototype; - - /** - * @var mEmptyListLabel - * @brief The pointer to the empty view label - */ - HbLabel *mEmptyListLabel; - - /** - * @var mListModel - * @brief The event list model - */ - QStandardItemModel *mListModel; - - /** - * @var mSelectedIndex - * @brief Stores the index of the item being acted upon - * Since there is no focus, it becomes necessary to store the - * index of the item on which user is performing some action - */ - int mSelectedIndex; - - /** - * @var NotesEditor - * @brief Pointer to the notes editor - */ - NotesEditor *mNotesEditor; - - /** - * @var mDatePicker - * @brief The date picker component - */ - HbDateTimePicker *mDatePicker; - - /** - * @var mRegionalPluginLayout - * @brief Regional Plugin layout pointer - */ - QGraphicsLinearLayout* mRegionalPluginLayout; - - /** - * @var mRegionalInfoGroupBox - * @brief Regional Plugin Info groupbox - */ - HbGroupBox *mRegionalInfoGroupBox; - - /** - * @var mSettingsManager - * @brief Setting Manager pointer - */ - - XQSettingsManager *mSettingsManager; -}; - -#endif //CALENDAYVIEWWIDGET_H - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/inc/caleneventlistviewitem.h --- a/calendarui/views/inc/caleneventlistviewitem.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/inc/caleneventlistviewitem.h Mon Jun 28 15:22:02 2010 +0530 @@ -24,17 +24,12 @@ class CalenEventListViewItem : public HbListViewItem { Q_OBJECT - Q_PROPERTY(bool timeFormat12 READ timeFormat12Hr WRITE setTimeFormat12Hr) public: CalenEventListViewItem(QGraphicsItem *parent = 0); ~CalenEventListViewItem(); HbAbstractViewItem * createItem(); void updateChildItems(); - bool timeFormat12Hr(); - void setTimeFormat12Hr(bool format); -private: - bool timeFormat12; }; #endif // __CALEN_EVENT_LIST_VIEW_ITEM_H__ diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/inc/calengriditemprototype.h --- a/calendarui/views/inc/calengriditemprototype.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/inc/calengriditemprototype.h Mon Jun 28 15:22:02 2010 +0530 @@ -28,13 +28,19 @@ class HbIconItem; class HbTextItem; class HbFrameItem; -class CalenGridItem; +class CalenTodayIndicatorLineDrawer; + +// CONSTANTS +const QString focusIconName = "qtg_fr_cal_focused_day_ind"; +const QString eventIndname = "qtg_graf_cal_event_ind"; class CalenGridItemPrototype : public HbGridViewItem { Q_OBJECT public: + CalenGridItemPrototype(QColor todayIndColor, QColor activeColor, QColor inActiveColor, + QGraphicsWidget *parent = 0); CalenGridItemPrototype(QGraphicsWidget *parent = 0); virtual ~CalenGridItemPrototype() { @@ -46,19 +52,18 @@ void pressStateChanged(bool pressed,bool animate); void pressStateChanged(bool animate); bool canSetModelIndex(const QModelIndex& index); + void createPrimitives(); private: - void drawUnderline(bool underlineEnabled); -private: - QGraphicsLinearLayout *mLayout; - CalenGridItem *mWidget; + QColor mTodayUnderLineColor; + QColor mActiveTextColor; + QColor mInActiveTextColor; QColor mCurrentDateColor; QColor mGridBorderColor; HbIconItem *mEventIndicatorItem; HbTextItem *mMonthDayInfoItem; HbFrameItem *mFocusIndicatorItem; - HbIconItem *mTodayIndicatorItem; - QColor mTodayUnderLineColor; + CalenTodayIndicatorLineDrawer *mTodayIndicatorItem; }; #endif // CALENGRIDITEMPROTOTYPE_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/inc/calenmonthgrid.h --- a/calendarui/views/inc/calenmonthgrid.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/inc/calenmonthgrid.h Mon Jun 28 15:22:02 2010 +0530 @@ -56,19 +56,30 @@ ~CalenMonthGrid(); void setView(CalenMonthView *view); void updateMonthGridModel(QList &monthDataArray, - int indexToBeScrolled); + int indexToBeScrolled, bool isFirstTime); + void updateMonthGridWithInActiveMonths( + QList &monthDataArray); + void updateMonthGridWithEventIndicators( + QList &monthDataArray); void setCurrentIdex(int index); int getCurrentIndex(); protected: void orientationChanged(Qt::Orientation newOrientation); + void gestureEvent(QGestureEvent *event); private: + void downGesture(); + void upGesture(); + void handlePrependingRows(QList &monthDataList); + void handleAppendingRows(QList &monthDataList); + void handlePanGestureFinished(); void mousePressEvent(QGraphicsSceneMouseEvent* event); void mouseReleaseEvent(QGraphicsSceneMouseEvent* event); void setFocusToProperDay(); void setActiveDates(QDate activeDate); - void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget); + void paint(QPainter* painter, + const QStyleOptionGraphicsItem* option, QWidget* widget); public slots: void scrollingFinished(); @@ -76,12 +87,6 @@ void appendRows(); void itemActivated(const QModelIndex &index); -protected slots: - void downGesture(int value); - void upGesture(int value); - void panGesture(const QPointF &delta); - void timerExpired(); - private: QStandardItemModel *mModel; QList mMonthDataArray; @@ -97,6 +102,8 @@ QColor mGridLineColor; QColor mGridBorderColor; QGraphicsWidget* mContentWidget; + QList mLocalisedDates; + QPointF mStartPos; }; #endif // CALENMONTHGRID_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/inc/calenmonthview.h --- a/calendarui/views/inc/calenmonthview.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/inc/calenmonthview.h Mon Jun 28 15:22:02 2010 +0530 @@ -23,6 +23,7 @@ #include #include #include +#include // User includes #include "calennativeview.h" @@ -46,7 +47,6 @@ class CalenPluginLabel; // Constants -const int KCalenDaysInWeek = 7; const int KNumOfVisibleRows = 6; #ifdef CALENVIEWS_DLL @@ -66,8 +66,8 @@ public: // From CCalenView virtual void doPopulation(); void setupView(CalenDocLoader *docLoader); + void doLazyLoading(); void handleGridItemActivated(); - void handleGridItemLongPressed(int index, QPointF &coords); void setContextForActiveDay(int index); QDateTime getCurrentDay(); QDateTime getActiveDay(); @@ -84,6 +84,8 @@ void populatePreviewPane(QDateTime &dateTime); void handlePreviewPaneGesture(bool rightGesture); QDateTime firstDayOfGrid(); + void fetchEntriesAndUpdateModel(); + void launchDayView(); private: void createGrid(); @@ -93,8 +95,8 @@ QDateTime dateFromContext( const MCalenContext &context ); void setActiveDay(QDateTime day); void setDate(); - void getInstanceList(QList &list, - QDateTime rangeStart, QDateTime rangeEnd); + void getInstanceList(QList &list, + QDateTime rangeStart, QDateTime rangeEnd); void handleChangeOrientation(); void setDateToLabel(); void updateWeekNumGridModel(); @@ -104,6 +106,7 @@ void refreshViewOnGoToDate(); void showHideRegionalInformation(); void onContextChanged(); + void updateDayLabel(); private slots: void createEditor(); @@ -112,9 +115,6 @@ void handleLeftEffectCompleted(const HbEffect::EffectStatus &status); void handleRightEffectCompleted(const HbEffect::EffectStatus &status); void addRemoveActionsInMenu(); - -public slots: - void launchDayView(); void changeOrientation(Qt::Orientation orientation); private: @@ -173,6 +173,8 @@ CalenPluginLabel *mCurrRegionalInfo; CalenPluginLabel *mNextRegionalInfo; HbMenu *mDeleteSubMenu; + QColor mWeekDaysColor; + bool mIsAboutToQuitEventConnected; // bool to check if month view is registered to get aboutToQuit signals }; #endif //CALENMONTHVIEW_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/inc/calennativeview.h --- a/calendarui/views/inc/calennativeview.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/inc/calennativeview.h Mon Jun 28 15:22:02 2010 +0530 @@ -19,6 +19,12 @@ #ifndef CALENNATIVEVIEW_H #define CALENNATIVEVIEW_H +#ifdef CALENVIEWS_DLL +#define CALENNATIVEVIEW_EXPORT Q_DECL_EXPORT +#else +#define CALENNATIVEVIEW_EXPORT Q_DECL_IMPORT +#endif + // System includes #include #include @@ -47,6 +53,10 @@ TBool pluginEnabled(); virtual void refreshViewOnGoToDate(); QString *pluginText(); + /** + * captureScreenshot captures the current screenshot + */ + CALENNATIVEVIEW_EXPORT void captureScreenshot(bool captureScreenShot = false); protected: // New functions CalenNativeView( MCalenServices& services ); @@ -63,13 +73,20 @@ void deleteAllEntries(); void launchSettingsView(); virtual void changeOrientation(Qt::Orientation orientation); + /** + * saveActivity saves the current view as an activity + * + */ + void saveActivity(); protected: MCalenServices &mServices; // not owned. - + int mActivityId; // Recent Activity ID, currently it holdes wither of ECalenMonthView or ECalenAgendaView + QVariantHash mScreenShotMetadata; // Screenshot private: HbDateTimePicker *mDatePicker; + bool mIsCapturedScreenShotValid; // to check if the captured screenshot is valid }; #endif // CALENNATIVEVIEW_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/inc/calenpluginlabel.h --- a/calendarui/views/inc/calenpluginlabel.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/inc/calenpluginlabel.h Mon Jun 28 15:22:02 2010 +0530 @@ -27,11 +27,12 @@ Q_OBJECT public: - CalenPluginLabel(MCalenServices &services, QGraphicsItem *parent = 0); - ~CalenPluginLabel(); + IMPORT_C CalenPluginLabel(MCalenServices &services, QGraphicsItem *parent = 0); + IMPORT_C ~CalenPluginLabel(); -private: - void mousePressEvent(QGraphicsSceneMouseEvent *event); +protected: + void gestureEvent(QGestureEvent *event); + private: MCalenServices &mServices; diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/inc/calenpreviewpane.h --- a/calendarui/views/inc/calenpreviewpane.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/inc/calenpreviewpane.h Mon Jun 28 15:22:02 2010 +0530 @@ -23,7 +23,6 @@ // System includes #include #include -#include // Forward declarations class HbLabel; @@ -50,12 +49,12 @@ void populateLabel( QDateTime date); QDateTime Date(); void startAutoScroll(); - void mousePressEvent(QGraphicsSceneMouseEvent* event); - void mouseReleaseEvent(QGraphicsSceneMouseEvent* event); - void mouseMoveEvent(QGraphicsSceneMouseEvent* event); void setView(CalenMonthView* view); void stopScrolling(); +protected: + void gestureEvent(QGestureEvent *event); + private: void GetInstanceListL(); @@ -82,6 +81,8 @@ HbLabel* mNoEntriesLabel; bool mIsNoEntriesAdded; bool mIsGestureHandled; + qreal mHtDiff; + int mScrollDuration; }; #endif /* CALENPREVIEWPANE_H_ */ diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/inc/calensettingsview.h --- a/calendarui/views/inc/calensettingsview.h Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/inc/calensettingsview.h Mon Jun 28 15:22:02 2010 +0530 @@ -44,19 +44,20 @@ public: void initializeForm(); + void refreshView(); private slots: void launchPreviousView(); private: - /** - * @var mSoftKeyAction - * @brief Holder for soft key action - */ - HbAction *mSoftKeyAction; + MCalenServices &mServices; HbDataForm *mCalenSettingsForm; CalenSettings *mCalenSettings; - MCalenServices &mServices; + /** + * @var mSoftKeyAction + * @brief Holder for soft key action + */ + HbAction *mSoftKeyAction; }; #endif // DTSETTINGVIEW_H diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/inc/calentodayindicatorlinedrawer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/inc/calentodayindicatorlinedrawer.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,43 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: CalenTodayIndicatorLineDrawer class definition. +* +*/ + +#ifndef CALENTODAYINDICATORLINEDRAWER_H +#define CALENTODAYINDICATORLINEDRAWER_H + +// System includes +#include + +class CalenTodayIndicatorLineDrawer : public HbWidgetBase +{ + Q_OBJECT + +public: + CalenTodayIndicatorLineDrawer( QGraphicsItem* parent = NULL ); + virtual ~CalenTodayIndicatorLineDrawer(); + +private: + void paint( + QPainter* painter, const QStyleOptionGraphicsItem* option, + QWidget* widget); + +private slots: + void handleThemeChange(); + +}; +#endif /* CALENTODAYINDICATORLINEDRAWER_H */ + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/resources/caleneventlistviewitem.css --- a/calendarui/views/resources/caleneventlistviewitem.css Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/resources/caleneventlistviewitem.css Mon Jun 28 15:22:02 2010 +0530 @@ -6,72 +6,78 @@ layout: custom-stretch; } -CalenEventListViewItem[timeFormat12="true"]::text-1{ - fixed-width: 13.5un; - text-height: var(hb-param-text-height-secondary); - text-align: left; - top: -var(hb-param-margin-gene-top); - left: -var(hb-param-margin-gene-left); - right: var(hb-param-margin-gene-right); - text-line-count-max: 2; - text-line-count-min: 2; +CalenEventListViewItem::icon-1[layoutName="custom"]{ + left: -var(hb-param-margin-gene-left); + right: var(hb-param-margin-gene-middle-horizontal); + fixed-width: var(hb-param-graphic-size-primary-small); + fixed-height: var(hb-param-graphic-size-primary-small); +} + +CalenEventListViewItem::icon-2{ + top: -var(hb-param-margin-gene-top); + right: var(hb-param-margin-gene-middle-horizontal); + fixed-width: var(hb-param-graphic-size-secondary); + fixed-height: var(hb-param-graphic-size-secondary); } -CalenEventListViewItem[timeFormat12="false"]::text-1{ - fixed-width: 9.5un; - text-height: var(hb-param-text-height-secondary); - text-align: right; - top: -var(hb-param-margin-gene-top); - left: -var(hb-param-margin-gene-left); - right: var(hb-param-margin-gene-right); - text-line-count-max: 2; - text-line-count-min: 2; +CalenEventListViewItem::icon-3{ + top: -var(hb-param-margin-gene-top); + right: var(hb-param-margin-gene-right); + fixed-width: var(hb-param-graphic-size-secondary); + fixed-height: var(hb-param-graphic-size-secondary); } -CalenEventListViewItem::text-2[layoutName="custom"]{ - font-variant: primary; - text-align: left; +CalenEventListViewItem::icon-4{ + right: var(hb-param-margin-gene-right); + fixed-width: var(hb-param-graphic-size-secondary); + fixed-height: var(hb-param-graphic-size-secondary); +} + +CalenEventListViewItem::text-1{ + left: -var(hb-param-margin-gene-left); top: -var(hb-param-margin-gene-top); - right: var(hb-param-margin-gene-middle-horizontal); - min-width: 29un; + right: var(hb-param-margin-gene-middle-horizontal); + font-variant: secondary; + text-height: var(hb-param-text-height-secondary); + } -CalenEventListViewItem::text-3[layoutName="custom"]{ - font-variant: secondary; - text-align: left; - top: -var(hb-param-margin-gene-middle-vertical); - bottom: var(hb-param-margin-gene-bottom); - right: var(hb-param-margin-gene-middle-horizontal); - min-width: 34un; +CalenEventListViewItem::text-2{ + top: -var(hb-param-margin-gene-top); + font-variant: primary; + text-height: var(hb-param-text-height-secondary); + text-align: left; + fixed-width: 29un; } -CalenEventListViewItem::icon-1[layoutName="custom"]{ - top: -var(hb-param-margin-gene-top); - left: -var(hb-param-margin-gene-top); - right: var(hb-param-margin-gene-middle-horizontal); +CalenEventListViewItem::text-3{ + top: -var(hb-param-margin-gene-middle-vertical); + bottom: var(hb-param-margin-gene-bottom); + font-variant: secondary; + text-height: var(hb-param-text-height-secondary); + text-align: left; + fixed-width: 35un; } -CalenEventListViewItem::icon-2[layoutName="custom"]{ - top: -var(hb-param-margin-gene-top); - right: var(hb-param-margin-gene-middle-horizontal); - text-align: right; - fixed-width: var(hb-param-graphic-size-secondary); - fixed-height: var(hb-param-graphic-size-secondary); +CalenEventListViewItem::text-4{ + font-variant: secondary; + text-height: var(hb-param-text-height-secondary); +} + +CalenEventListViewItem::text-2:landscape[stretchItem="false"]{ + fixed-width: 70un; } -CalenEventListViewItem::icon-3[layoutName="custom"]{ - top: -var(hb-param-margin-gene-top); - right: var(hb-param-margin-gene-right); - fixed-width: var(hb-param-graphic-size-secondary); - fixed-height: var(hb-param-graphic-size-secondary); +CalenEventListViewItem::text-3:landscape[stretchItem="false"]{ + fixed-width: 70un; } -CalenEventListViewItem::icon-4[layoutName="custom"]{ - top: -var(hb-param-margin-gene-middle-vertical); - right: var(hb-param-margin-gene-right); - bottom: var(hb-param-margin-gene-bottom); - fixed-width: var(hb-param-graphic-size-secondary); - fixed-height: var(hb-param-graphic-size-secondary); +CalenEventListViewItem::text-2:landscape[stretchItem="true"]{ + fixed-width: 35un; + bottom: var(hb-param-margin-gene-bottom); } - +CalenEventListViewItem::text-3:landscape[stretchItem="true"]{ + fixed-width: 40un; + top: -var(hb-param-margin-gene-top); +} diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/resources/caleneventlistviewitem.widgetml --- a/calendarui/views/resources/caleneventlistviewitem.widgetml Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/resources/caleneventlistviewitem.widgetml Mon Jun 28 15:22:02 2010 +0530 @@ -2,54 +2,52 @@ - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/resources/caleneventlistviewitem_color.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/resources/caleneventlistviewitem_color.css Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,35 @@ +CalenEventListViewItem::text-4{ + color: var(qtc_list_item_content_normal); +} + +CalenEventListViewItem::text-4[state="pressed"]{ + color: var(qtc_list_item_pressed); +} + +CalenEventListViewItem::text-4[state="disabled"]{ + color: var(qtc_list_item_disabled); +} + +CalenEventListViewItem::icon-3{ + color: var(qtc_list_item_content_normal); +} + +CalenEventListViewItem::icon-3[state="pressed"]{ + color: var(qtc_list_item_pressed); +} + +CalenEventListViewItem::icon-3[state="disabled"]{ + color: var(qtc_list_item_disabled); +} + +CalenEventListViewItem::icon-4{ + color: var(qtc_list_item_content_normal); +} + +CalenEventListViewItem::icon-4[state="pressed"]{ + color: var(qtc_list_item_pressed); +} + +CalenEventListViewItem::icon-4[state="disabled"]{ + color: var(qtc_list_item_disabled); +} \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/resources/calengriditemprototype.css --- a/calendarui/views/resources/calengriditemprototype.css Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/resources/calengriditemprototype.css Mon Jun 28 15:22:02 2010 +0530 @@ -36,5 +36,4 @@ left: -0.75un; right: 0.75un; fixed-height: 0.75un; - background-color: red; } diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/resources/calenresources.qrc --- a/calendarui/views/resources/calenresources.qrc Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/resources/calenresources.qrc Mon Jun 28 15:22:02 2010 +0530 @@ -4,12 +4,15 @@ calengriditemprototype.css caleneventlistviewitem.widgetml caleneventlistviewitem.css + caleneventlistviewitem_color.css qgn_indi_cdr_meeting_layer0.svg qtg_mono_exception.png view_show_normal.fxml view_hide_normal.fxml + view_hide_back.fxml + view_show_back.fxml portrait_preview_pane_show_on_left_gesture_normal.fxml portrait_preview_pane_hide_on_left_gesture_normal.fxml portrait_preview_pane_show_on_right_gesture_normal.fxml diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/resources/view_hide_back.fxml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/resources/view_hide_back.fxml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,10 @@ + + + + 0.35 + + extrect.right + 1 + + + diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/resources/view_show_back.fxml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/resources/view_show_back.fxml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,10 @@ + + + + 0.35 + + -1 + extrect.left + + + \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/src/calenagendaview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/src/calenagendaview.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,347 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: CalenAgendaView implementation. +* +*/ + +// System includes +#include +#include +#include +#include +#include +#include // hbapplication +#include // Activity Manager + +// User includes +#include "calenagendaview.h" +#include "calendocloader.h" +#include "calenagendaviewwidget.h" +#include "calenservices.h" +#include "calencommon.h" +#include "calencontext.h" +#include "calendateutils.h" +#include "calenconstants.h" + +// ---------------------------------------------------------------------------- +// CalenAgendaView::CalenAgendaView +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +CalenAgendaView::CalenAgendaView(MCalenServices &services): +CalenNativeView(services), +mSoftKeyAction(NULL), +mGoToTodayAction(NULL), +mSwitchToDayViewAction(NULL), +mActionTaken(false), +mIsAboutToQuitEventConnected(false) +{ + // No implementation yet + grabGesture(Qt::SwipeGesture); +} + +// ---------------------------------------------------------------------------- +// CalenAgendaView::~CalenAgendaView +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +CalenAgendaView::~CalenAgendaView() +{ + // No implementation yet +} + +// ---------------------------------------------------------------------------- +// CalenAgendaView::setupView +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaView::setupView(CalenDocLoader *docLoader) +{ + if (!docLoader) { + // Nothing can be done. Simply return + return; + } + // Store the document loader for reference later + mDocLoader = docLoader; + + // Listen to orientation change events + connect(&(mServices.MainWindow()), SIGNAL(orientationChanged(Qt::Orientation)), + this, SLOT(orientationChanged(Qt::Orientation))); + + // Get the pointer to the content widget + mAgendaViewWidget = qobject_cast(mDocLoader->findWidget(CALEN_AGENDAVIEW_WIDGET)); + if (!mAgendaViewWidget) { + qFatal("calenagendaview.cpp : Unable to find the content widget"); + } + mAgendaViewWidget->setupWidget(this); + + // Initialize all the menu and toolbar actions + setupActions(); + // get a poitner to activity manager + HbActivityManager* activityManager = qobject_cast(qApp)->activityManager(); + + // clean up any previous versions of this activity, if any, i.e. activityName, from the activity manager. + // Ignore return value, first boot would always return False. bool declared + // only for debugging purpose. + bool ok = activityManager->removeActivity(activityName); + +} + +// ---------------------------------------------------------------------------- +// CalenAgendaView::doPopulation +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaView::doPopulation() + { + // The content widget has not been constructed. Don't do anything + if (!mAgendaViewWidget) { + return; + } + // Get the day for which this view is being shown from the context + mDate = mServices.Context().focusDateAndTime(); + + // Check if the current day being shown is "Today" + if (mGoToTodayAction) { + if (mDate.date() == CalenDateUtils::today().date()) { + // Hide the "Go to today" option + mGoToTodayAction->setVisible(false); + } else { + mGoToTodayAction->setVisible(true); + } + } + + // Set self as the current view + // mServices.MainWindow().setCurrentView(this); + + // Dont override the soft key behavior if day view is the first view + if (ECalenAgendaView != mServices.getFirstView()) { + mSoftKeyAction = new HbAction(Hb::BackNaviAction); + setNavigationAction(mSoftKeyAction); + // Connect to the signal triggered by clicking on back button. + connect(mSoftKeyAction, SIGNAL(triggered()), this, + SLOT(launchMonthView())); + if (mSwitchToDayViewAction) { + mSwitchToDayViewAction->setVisible(true); + } + } else { + if (mSwitchToDayViewAction) { + mSwitchToDayViewAction->setVisible(false); + } + } + // Initialize the content widget + mAgendaViewWidget->showWidget(); + + //set Current Activity as day view + mActivityId = ECalenAgendaView; + + // connect to receive a call back on Day View exit. Call back would result in saveActivity + // to be called in Native View + if (!mIsAboutToQuitEventConnected) // check if already not connected + { + connect(qobject_cast(qApp), SIGNAL(aboutToQuit()), this, SLOT(saveActivity())); + mIsAboutToQuitEventConnected = true; + } + + + // Population is complete, issue a notification + populationComplete(); + } + +/*! + Funtion to refresh the current view upon selecting a date + from GoToDate popup + */ +void CalenAgendaView::refreshViewOnGoToDate() +{ + // Get the day for which this view is being shown from the context + mDate = mServices.Context().focusDateAndTime(); + + // Check if the current day being shown is "Today" + if (mGoToTodayAction) { + if (mDate.date() == CalenDateUtils::today().date()) { + // Hide the "Go to today" option + mGoToTodayAction->setVisible(false); + } else { + mGoToTodayAction->setVisible(true); + } + } + + // Initialize the content widget + mAgendaViewWidget->showWidget(); +} + +// ---------------------------------------------------------------------------- +// CalenAgendaView::HandleNotification +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaView::HandleNotification(const TCalenNotification notification) +{ + Q_UNUSED(notification) + // No implementation yet +} + +// ---------------------------------------------------------------------------- +// CalenAgendaView::docLoader +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +CalenDocLoader* CalenAgendaView::docLoader() +{ + return mDocLoader; +} + +/* + Function to listen for gestures +*/ +void CalenAgendaView::gestureEvent(QGestureEvent *event) +{ + if(HbSwipeGesture *gesture = qobject_cast(event->gesture(Qt::SwipeGesture))) { + if (gesture->state() == Qt::GestureStarted) { + if(QSwipeGesture::Left == gesture->sceneHorizontalDirection()) { + mServices.IssueCommandL(ECalenShowNextDay); + event->accept(Qt::SwipeGesture); + } else if(QSwipeGesture::Right == gesture->sceneHorizontalDirection()) { + mServices.IssueCommandL(ECalenShowPrevDay); + event->accept(Qt::SwipeGesture); + } + } + } +} + +// ---------------------------------------------------------------------------- +// CalenAgendaView::createToolBar +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaView::setupActions() +{ + // Get the actions associated with this view + HbAction *newEventAction = qobject_cast + (mDocLoader->findObject(CALEN_AGENDAVIEW_MENU_NEW_EVENT)); + if (!newEventAction) { + qFatal("calenagendaview.cpp : Unable to find new event action"); + } + // Connect to the signal triggered by new event action + connect(newEventAction, SIGNAL(triggered()), mAgendaViewWidget, SLOT(createNewEvent())); + + mGoToTodayAction = qobject_cast + (mDocLoader->findObject(CALEN_AGENDAVIEW_MENU_GO_TO_TODAY)); + if (!mGoToTodayAction) { + qFatal("calenagendaview.cpp : Unable to find go to today action"); + } + // Connect to the signal triggered by go to Today action + connect(mGoToTodayAction, SIGNAL(triggered()), mAgendaViewWidget, SLOT(goToToday())); + + HbAction *goToDateAction = qobject_cast + (mDocLoader->findObject(CALEN_AGENDAVIEW_MENU_GO_TO_DATE)); + if (!goToDateAction) { + qFatal("calenagendaview.cpp : Unable to find go to date action"); + } + // Connect to the signal triggered by go to Date action + connect(goToDateAction, SIGNAL(triggered()), this, SLOT(goToDate())); + + mSwitchToDayViewAction = qobject_cast + (mDocLoader->findObject(CALEN_AGENDAVIEW_MENU_SWITCH_TO_DAYVIEW)); + if (!mSwitchToDayViewAction) { + qFatal("calenagendaview.cpp : Unable to find go to date action"); + } + // Connect to the signal triggered by switch to dayview action + connect(mSwitchToDayViewAction, SIGNAL(triggered()), this, SLOT(launchDayView())); + + HbAction *settingsAction = qobject_cast + (mDocLoader->findObject(CALEN_AGENDAVIEW_MENU_SETTINGS)); + if (!settingsAction) { + qFatal("calenagendaview.cpp : Unable to find settings action"); + } + // Connect to the signal triggered by settings action + connect(settingsAction, SIGNAL(triggered()), this, SLOT(launchSettingsView())); +} + +// ---------------------------------------------------------------------------- +// CalenAgendaView::onLocaleChanged +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaView::onLocaleChanged(int reason) +{ + Q_UNUSED(reason) + // Notify the content widget about the change + if(mAgendaViewWidget) { + mAgendaViewWidget->handleLocaleChange(); + } +} + +// ---------------------------------------------------------------------------- +// CalenAgendaView::orientationChanged +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaView::orientationChanged(Qt::Orientation orientation) +{ + // Notify the content widget about the change + if (mAgendaViewWidget) { + mAgendaViewWidget->orientationChanged(orientation); + } +} + +// ---------------------------------------------------------------------------- +// CalenAgendaView::launchMonthView +// ---------------------------------------------------------------------------- +// +void CalenAgendaView::launchMonthView() +{ + // Issue the command to launch the month view + mServices.IssueCommandL(ECalenMonthView); + // month view launched now, disconnect to get the call backs for saveActivity + // on aboutToQuit signal + disconnectAboutToQuitEvent(); +} + +// ---------------------------------------------------------------------------- +// CalenAgendaView::launchDayView +// ---------------------------------------------------------------------------- +// +void CalenAgendaView::launchDayView() +{ + // Issue the command to launch the day view + mServices.IssueCommandL(ECalenDayView); +} + +// ---------------------------------------------------------------------------- +// clears the list model +// ---------------------------------------------------------------------------- +// +void CalenAgendaView::clearListModel() + { + // day view is removed from the list disconnect for aboutToQuit events + disconnectAboutToQuitEvent(); + mAgendaViewWidget->clearListModel(); + } + +// ---------------------------------------------------------------------------- +// disconnectAboutToQuitEvent disconnects for the aboutToQuit events +// ---------------------------------------------------------------------------- +// +void CalenAgendaView::disconnectAboutToQuitEvent() + { + if (mIsAboutToQuitEventConnected) + { + disconnect(qobject_cast(qApp), SIGNAL(aboutToQuit()), this, SLOT(saveActivity())); + mIsAboutToQuitEventConnected = false; + } + } + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/src/calenagendaviewwidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/src/calenagendaviewwidget.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,1142 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: CalenAgendaViewWidget implementation +* +*/ + +// System includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// User includes +#include "calenagendaviewwidget.h" +#include "calencommon.h" +#include "calenagendaview.h" +#include "calendocloader.h" +#include "calenservices.h" +#include "calencontext.h" +#include "calendateutils.h" +#include "CalenUid.h" +#include "caleneventlistviewitem.h" +#include "calenpluginlabel.h" +#include "calendarprivatecrkeys.h" + +// Constants +const QString singleSpace(" "); +const QString doubleSpace(" "); +const QString space(" "); +const QString singleHyphen("-"); +const QString customLayout("custom"); +const char *stretchLayout("stretchItem"); +const QString toDoIcon("qtg_small_todo"); +const QString reminderIcon("qtg_mono_alarm"); +const QString locationIcon("qtg_mono_location"); +const QString repeatIcon("qtg_mono_repeat"); +// TODO: Replace with actual image name once its available +//const QString allDayIcon("qtg_small_allday"); +const QString allDayIcon(":/qgn_indi_cdr_meeting_layer0.svg"); +const QString exceptionIcon("qtg_mono_repeat_exception"); +const int singleColumn(1); + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::CalenAgendaViewWidget +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +EXPORT_C CalenAgendaViewWidget::CalenAgendaViewWidget(MCalenServices &services, + CalenDocLoader *docLoader) : +mServices(services), +mDocLoader(docLoader), +mRegionalInfoGroupBox(NULL), +mLongTapEventFlag(false), +mNotesPluginLoaded(false) +{ + // Construct the list view prototype + mListViewPrototype = new CalenEventListViewItem(this); + + // Create the list model + mListModel = new QStandardItemModel(this); + + // Register the custom docml and css to provide our own style to the list items + HbStyleLoader::registerFilePath(":/"); + + //Create the setting manager + mSettingsManager = new XQSettingsManager(this); +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::~CalenAgendaViewWidget +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +EXPORT_C CalenAgendaViewWidget::~CalenAgendaViewWidget() +{ + // Unload notes editor if loaded. + if (mNotesEditorPluginLoader) { + mNotesEditorPluginLoader->unload(); + delete mNotesEditorPluginLoader; + mNotesEditorPluginLoader = 0; + } + + if (mListViewPrototype) { + delete mListViewPrototype; + mListViewPrototype = NULL; + } + if (mListModel) { + // Do not delete the model since its owned by the view + mListModel->clear(); + } + if (mSettingsManager) { + delete mSettingsManager; + mSettingsManager = NULL; + } +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::setupWidget +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::setupWidget(CalenAgendaView *view) +{ + // Store the view for future reference + mView = view; + + if (!mDocLoader) { + // Nothing much can be done. Simply return + return; + } + + // Initialize the child widgets + initChildWidgets(); +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::showWidget +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::showWidget() +{ + // Get the date for which this view has been launched + mDate = mServices.Context().focusDateAndTime(); + + // Set the heading text + setHeadingText(); + + // Get the instance list + getInstanceList(); + + // Check if regional information needs to be shown + // and add it or remove it + showHideRegionalInformation(); + + // Load the appropriate section based on the number of events for the day + if (0 == mInstanceArray.count()) { + // There are no entries for the day + // Load and show the empty list section + bool loadSuccess = false; + + // Hide the list which shows the events + mEventsList->hide(); + + // Show the empty list text + mEmptyListLabel->show(); + + // Get the current device orientation + int orientation = mServices.MainWindow().orientation(); + if (Qt::Vertical == orientation) { + mDocLoader->load(CALEN_AGENDAVIEW_XML_FILE, "emptyList", &loadSuccess); + } else { + mDocLoader->load(CALEN_AGENDAVIEW_XML_FILE, "emptyLandscape", &loadSuccess); + } + if (!loadSuccess) { + qFatal("calenagendaviewwidget.cpp : Unable to load empty list section"); + } + } else { + // Hide the empty view label + mEmptyListLabel->hide(); + + // Show the events list + mEventsList->show(); + + // There are one or more events. Load the non-empty section + bool loadSuccess = false; + mDocLoader->load(CALEN_AGENDAVIEW_XML_FILE, "nonEmptyList", &loadSuccess); + if (!loadSuccess) { + qFatal("calenagendaviewwidget.cpp : Unable to load non-empty list section"); + } + // Now populate the list with the events + populateListWidget(); + } +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::orientationChanged +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::orientationChanged(Qt::Orientation orientation) +{ + // Load the appropriate section based on the number of events for the day + if (0 == mInstanceArray.count()) { + // There are no entries for the day + // Load and show the empty list section + bool loadSuccess = false; + + // Hide the list which shows the events + mEventsList->hide(); + + // Show the empty list text + mEmptyListLabel->show(); + + if (Qt::Vertical == orientation) { + mDocLoader->load(CALEN_AGENDAVIEW_XML_FILE, "emptyList", &loadSuccess); + } else { + mDocLoader->load(CALEN_AGENDAVIEW_XML_FILE, "emptyLandscape", &loadSuccess); + } + if (!loadSuccess) { + qFatal("calenagendaviewwidget.cpp : Unable to load empty list section"); + } + } else { + // Hide the empty view label + mEmptyListLabel->hide(); + + // Show the events list + mEventsList->show(); + + // There are one or more events. Load the non-empty section + bool loadSuccess = false; + mDocLoader->load(CALEN_AGENDAVIEW_XML_FILE, "nonEmptyList", &loadSuccess); + if (!loadSuccess) { + qFatal("calenagendaviewwidget.cpp : Unable to load non-empty list section"); + } + handleListItemStretching(orientation); + } +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::handleLocaleChange +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::handleLocaleChange() +{ + +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::setContextFromHighlight +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::setContextFromHighlight(AgendaEntry entry) +{ + if (entry.isTimedEntry()) { + // Timed entry. + QDateTime start = entry.startTime(); + // start.setDate(mDate.date()); + mServices.Context().setFocusDateAndTimeAndInstance(start, + TCalenInstanceId::create(entry)); + } else { + // Untimed entry. + if (CalenDateUtils::onSameDay(TCalenInstanceId::create(entry).mInstanceTime, + mDate)) { + mServices.Context().setInstanceId(TCalenInstanceId::create(entry)); + } else { + // Multi-day untimed note (either multi-day day note or weird todo). + // Focus on the instance and set the focus time to the highlighted day. + mServices.Context().setFocusDateAndTimeAndInstance(mDate, + TCalenInstanceId::create(entry)); + } + } +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::initChildWidgets +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::initChildWidgets() +{ + // Get the pointer to the events list + mEventsList = static_cast (mDocLoader->findWidget(CALEN_AGENDAVIEW_LISTWIDGET)); + if (!mEventsList) { + qFatal("calenagendaviewwidget.cpp : Unable to find the events list"); + } + // NOTE: Layout name MUST be same as the name mentioned in the css + mEventsList->setLayoutName(customLayout); + + // TODO : remove this line after gestures are available + mEventsList->installEventFilter(mView); + + // Connect to the long press and activation signals + connect(mEventsList, SIGNAL(longPressed(HbAbstractViewItem*, const QPointF&)), + this, SLOT(itemLongPressed(HbAbstractViewItem*, const QPointF&))); + connect(mEventsList, SIGNAL(activated(const QModelIndex&)), this, + SLOT(itemActivated(const QModelIndex&))); + + // Get the pointer to label from the loader. + mHeadingLabel = qobject_cast (mDocLoader->findWidget(CALEN_AGENDAVIEW_HEADING)); + if (!mHeadingLabel) { + qFatal("calenagendaviewwidget.cpp : Unable to find heading widget"); + } + + // Get the pointer to the empty view label + mEmptyListLabel = qobject_cast (mDocLoader->findWidget("noEventsLabel")); + if (!mEmptyListLabel) { + qFatal("calenagendaviewwidget.cpp : Unable to find empty list label"); + } + HbWidget *headingPluginWidget = + qobject_cast (mDocLoader->findWidget(CALEN_AGENDAVIEW_HEADING_REGIONALPLUGIN_WIDGET)); + + mRegionalPluginLayout = static_cast(headingPluginWidget->layout()); + +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::populateListWidget +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::populateListWidget() +{ + // Recycle the list items so that only needed rows + // are added or removed + if (mInstanceArray.count() == 0) { + // Reset the list + mEventsList->reset(); + // Clear the model to ensure it does not have any old items + mListModel->clear(); + return; + } else if (mInstanceArray.count() > mListModel->rowCount()) { + // There are more events than the number of items + // in the list. Add more rows + mListModel->insertRows(0, mInstanceArray.count() - mListModel->rowCount()); + } else if (mInstanceArray.count() < mListModel->rowCount()) { + // There are less number of events than the number + // of items in the list. Remove the extra rows + mListModel->removeRows(0, mListModel->rowCount() - mInstanceArray.count()); + } + mListModel->setColumnCount(singleColumn); + + // Add all the events to the list + for (int index = 0; index < mInstanceArray.count(); index++) { + // Get each of the entry details + AgendaEntry entry = mInstanceArray[index]; + // Create a list item for each entry + createListItem(index, entry); + } + // Add the item on to the list widget + mEventsList->setModel(mListModel, mListViewPrototype); + + // Now get the item to scroll to + int scrollToIndex = getIndexToScrollTo(); + if (mListModel->rowCount() > 0) { + // Scroll to the index only if index is valid + mEventsList->scrollTo(mListModel->index(scrollToIndex, 0)); + } +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::getInstanceList +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::getInstanceList() +{ + // Clear the previous instance list + mInstanceArray.clear(); + + // Check if the date is valid + if (!CalenDateUtils::isValidDay(mDate)) { + mDate = CalenDateUtils::today(); + } + + // Set the filter flags to fetch all relevant entries + AgendaUtil::FilterFlags filter = AgendaUtil::FilterFlags(AgendaUtil::IncludeAnniversaries | + AgendaUtil::IncludeAppointments | + AgendaUtil::IncludeEvents | + AgendaUtil::IncludeReminders | + AgendaUtil::IncludeIncompletedTodos); + + // Fetch the instance list from the agenda interface + mInstanceArray = mServices.agendaInterface()->createEntryIdListForDay(mDate, filter); + +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::setDateToLabel +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::setHeadingText() + { + // Format the date as per the device locale settings + HbExtendedLocale systemLocale = HbExtendedLocale::system(); + + // Get localised name of the day from locale + QString dayString = systemLocale.dayName(mDate.date().dayOfWeek()); + // Append a single space + dayString.append(singleSpace); + // Set the heading + // Append the date which is formatted as per the locale + mHeadingLabel->setHeading(hbTrId( + "txt_calendar_subhead_1_2").arg(dayString).arg( + systemLocale.format(mDate.date(), r_qtn_date_usual_with_zero))); +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::createListItem +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::createListItem(int index, AgendaEntry entry) +{ + if (index < 0 || entry.isNull()) { + // Not a valid index or entry. Dont do anything + return; + } + // Check if the entry is a timed entry + // TODO: Right now, only appointment/meeting type is being handled + // Handle other timed entry types like reminder etc + if (entry.isTimedEntry()) { + // Get the text and icon data for the entry + addTimedEventToList(index, entry); + } else { + addNonTimedEventToList(index, entry); + } +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::addTimedEventToList +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::addTimedEventToList(int index, AgendaEntry entry) +{ + // Create text and icon list to set to the model + QVariantList textData; + QVariantList iconData; + bool twoLines = false; + + /** + * IMPORTANT NOTE: All the text and icon items must be + * inserted into the variant list in a specific order. + * If not, chaos will set it!!! + * On a more serious note, the mesh layout depends on the + * fact that the icons and text data will be added in a + * particular order. If one of the items go missing, the + * layout might get messed up. Also in case a particular item + * is not required to be added in the middle of the list, an + * empty QVariant must be added to indicate to the list view + * that the item must be removed from the layout. + * Do not mess with the order in case you are not sure what + * you are exactly doing. + */ + + // The first icon to show to-do or all day should not be shown + // Append empty data to the icons list + iconData << QVariant(); + + // Check if alarm is enabled for the entry + if (entry.alarm().isNull()) { + // Insert a blank icon. Else the next icon + // will get replaced in this icon's position + iconData << QVariant(); + } else { + iconData << HbIcon(reminderIcon); + } + + // Check if the entry is recurring + if (entry.isRepeating()) { + iconData << HbIcon(repeatIcon); + } else if (!entry.recurrenceId().isNull()) { + // This is an exceptional entry + iconData << HbIcon(exceptionIcon); + } else { + // Insert a blank icon. Else the next icon + // will get replaced in this icon's position + iconData << QVariant(); + } + + HbExtendedLocale locale = HbExtendedLocale::system(); + // Get the start time and format as per the locale + QDateTime startTime = entry.startTime(); + QTime eventStartTime; + + if (CalenDateUtils::beginningOfDay(startTime) + < CalenDateUtils::beginningOfDay(mDate)) { + // event is started previous day, show StarTime as 12:00 am in Agendaview, + eventStartTime.setHMS(00, 00, 00); + } else { + eventStartTime = entry.startTime().time(); + } + QString eventTime = locale.format(eventStartTime, r_qtn_time_usual_with_zero); + + // Get the event end time + QDateTime endTime = entry.endTime(); + QTime eventEndTime; + + if (CalenDateUtils::beginningOfDay(endTime) + > CalenDateUtils::beginningOfDay(mDate)) { + // event has MidNight crossover, show EndTime as 11:59pm in Agendaview, + eventEndTime.setHMS(23, 59, 59); + } else { + eventEndTime = entry.endTime().time(); + } + + if (eventStartTime < eventEndTime) { + // Raise the flag to indicate that the list item + // would wrap to two lines + twoLines = true; + // Append '-' to indicate an end time is present + eventTime.append(singleHyphen); + } else { + // To align the subject properly if the start and endtime are same + eventTime.append(doubleSpace); + } + + // Add the event time to the text list + // This MUST be the first item to be added to the list + textData << eventTime; + + // Get the entry subject + QString subject = entry.summary(); + if (subject.isEmpty() || subject.isNull()) { + // No subject. Add "(No subject)" text + subject.append(hbTrId("txt_calendar_dblist_unnamed")); + } + // Add the subject to the text list + // This MUST be the second item in the list + textData << subject; + + // Check if the entry has location + // TODO: This must change to check for geo-location + // This MUST be the third item in the list + if (entry.location().isEmpty()) { + // Insert a blank icon. Else the next icon + // will get replaced in this icon's position + iconData << QVariant(); + if (twoLines) { + /** + * NOTE: If the primary text is wrapping to two + * lines, then the location must be set as blank + * since the bottom of the list item is anchored to + * the bottom of the secondary text. Else the bottom + * of the list will overlap on the primary text + */ + textData << singleSpace; + } else { + /** + * Else, set the secondary text to empty to indicate + * to the list view to remove the item itself and + * shrink its size to a single line size + */ + textData << QVariant(); + } + } else { + // TODO: Location icon must be shown + // only if valid geo-coordinates are present + if (!entry.geoValue().isNull()){ + iconData << HbIcon(locationIcon); + } + else { + iconData << HbIcon(); + } + textData << entry.location(); + } + // Add the end time to the list item + if (eventStartTime < eventEndTime) { + QString endtime = locale.format(eventEndTime, r_qtn_time_usual_with_zero); + endtime.append(singleSpace); + textData << endtime; + }else { + textData<index(index, 0); + mListModel->setData(listIndex, textData, Qt::DisplayRole); + mListModel->setData(listIndex, iconData, Qt::DecorationRole); + + // Disable item stretching by removing the dynamic property + HbListViewItem *listViewItem = static_cast + (mEventsList->itemByIndex(mListModel->index(index, 0))); + if (listViewItem) { + listViewItem->setProperty(stretchLayout, false); + } +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::addNonTimedEventToList +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::addNonTimedEventToList(int index, AgendaEntry entry) +{ + QVariantList textData; + QVariantList iconData; + + /** + * IMPORTANT NOTE: All the text and icon items must be + * inserted into the variant list in a specific order. + * If not, chaos will set it!!! + * On a more serious note, the mesh layout depends on the + * fact that the icons and text data will be added in a + * particular order. If one of the items go missing, the + * layout might get messed up. Also in case a particular item + * is not required to be added in the middle of the list, an + * empty QVariant must be added to indicate to the list view + * that the item must be removed from the layout. + * Do not mess with the order in case you are not sure what + * you are exactly doing. + */ + + // The first column text has to be empty + textData << QVariant(); + + // Get the entry subject + QString subject = entry.summary(); + if (subject.isEmpty() || subject.isNull()) { + // No subject. Add "(No subject)" text + subject.append(hbTrId("txt_calendar_dblist_unnamed")); + } + // Add the subject to the text list + // This MUST be the second item in the list + textData << subject; + + // Get the entry type + AgendaEntry::Type entryType = entry.type(); + + if (entryType == AgendaEntry::TypeAnniversary) { + // Nothing to do as of now as anniversary events + // cannot be created + // TODO: To be handled in case of sync + } else if (entryType == AgendaEntry::TypeEvent) { + // This is an all day event + // Append the all-day icon + iconData << HbIcon(allDayIcon); + + // Check if alarm is enabled for the entry + if (entry.alarm().isNull()) { + // Insert a blank icon. Else next text item will get shifted to left + iconData << HbIcon(); + } else { + // if entry is not repeating in place of reminder icon put a blank + // icon and move reminder icon to the place of repeating icon + if (!entry.isRepeating()) { + iconData << HbIcon(); + } + iconData << HbIcon(reminderIcon); + } + + // Check if the entry is recurring + if (entry.isRepeating()) { + iconData << HbIcon(repeatIcon); + } else { + // put the blank icon only when both reminder and repeating icons + // are not there + if (entry.alarm().isNull()) { + iconData << HbIcon(); + } + } + + // Append the location + if (!entry.location().isEmpty()) { + textData << entry.location(); + // TODO: Location icon must be shown + // only if valid geo-coordinates are present + if (!entry.geoValue().isNull()){ + iconData << HbIcon(locationIcon); + }else { + iconData << HbIcon(); + } + } else { + textData << QVariant(); + } + // The fourth text item has to be empty + textData << QVariant(); + + } else if (entryType == AgendaEntry::TypeTodo) { + // Append the to-do icon + iconData << HbIcon(toDoIcon); + + // Get the due date + QDateTime dueDate = entry.endTime(); + + // Append the date first + QString dueDateString(hbTrId("txt_calendar_dblist_val_due_on_1")); + QString dueText; + dueText.setNum(dueDate.date().day()); + dueText.append(singleSpace); + + // Append the month name next + HbExtendedLocale locale = HbExtendedLocale::system(); + QString month = locale.monthName(dueDate.date().month()); + dueText.append(month); + dueText.append(singleSpace); + + // Append the year + QString year; + year.setNum(dueDate.date().year()); + dueText.append(year); + + textData << dueDateString.arg(dueText); + + // The fourth text item has to be empty + textData << QVariant(); + + // Check if alarm is enabled for the entry + if (entry.alarm().isNull()) { + // Insert a blank icon. Else next text item will get shifted to left + iconData << HbIcon(); + } else { + // if entry is not repeating in place of reminder icon put a blank + // icon and move reminder icon to the place of repeating icon + if (!entry.isRepeating()) { + iconData << HbIcon(); + } + iconData << HbIcon(reminderIcon); + } + + // Check if the entry is recurring + if (entry.isRepeating()) { + iconData << HbIcon(repeatIcon); + } else { + // Insert the blank icon only when both reminder and repeating icons + // are not there + if (entry.alarm().isNull()) { + iconData << HbIcon(); + } + } + } + + // Get the list model index and set the text and icon data + QModelIndex listIndex = mListModel->index(index, 0); + mListModel->setData(listIndex, textData, Qt::DisplayRole); + mListModel->setData(listIndex, iconData, Qt::DecorationRole); + + // Enable item stretching by adding the dynamic property + HbListViewItem *listViewItem = static_cast + (mEventsList->itemByIndex(mListModel->index(index, 0))); + Qt::Orientation orientation = mServices.MainWindow().orientation(); + // Apply stretch only for landscape orientation + if (listViewItem) { + if (Qt::Horizontal == orientation) { + listViewItem->setProperty(stretchLayout, true); + } else { + listViewItem->setProperty(stretchLayout, false); + } + } +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::handleListItemStretching +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::handleListItemStretching(Qt::Orientation orientation) +{ + if (mInstanceArray.count() == 0) { + // Nothing much to do. Simply return + return; + } + for(int index = 0; index < mInstanceArray.count() ; index ++) { + AgendaEntry entry = mInstanceArray[index]; + if (!entry.isNull()) { + AgendaEntry::Type eventType = entry.type(); + switch(eventType) { + // Apply the stretching to only to-do's, + // anniversary and all-day event types + case AgendaEntry::TypeTodo: + case AgendaEntry::TypeEvent: + case AgendaEntry::TypeAnniversary: + { + // Get the list view item corresponding to the index + HbListViewItem *listItem = static_cast + (mEventsList->itemByIndex(mListModel->index(index, 0))); + if (listItem) { + if (orientation == Qt::Horizontal) { + // Set a dynamic property to indicate that this list item + // must be stretched in landscape. + // NOTE: Property name MUST match the name specified in + // css file, else wierd things might happen + listItem->setProperty(stretchLayout, true); + } + } + } + break; + default: + { + HbListViewItem *listItem = static_cast + (mEventsList->itemByIndex(mListModel->index(index, 0))); + if (listItem) { + listItem->setProperty(stretchLayout, false); + } + break; + } + } + } + } +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::getIndexToScrollTo +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +int CalenAgendaViewWidget::getIndexToScrollTo() +{ + int scrollIndex = 0; + TCalenInstanceId instanceId = mServices.Context().instanceId(); + if (instanceId == TCalenInstanceId::nullInstanceId()) { + // If the instance is not set, then scroll to zero index + return scrollIndex; + } + + for (int index = 0 ; index < mInstanceArray.count() ; index++) { + AgendaEntry entry = mInstanceArray[index]; + if (entry.id() == instanceId.mEntryLocalUid) { + // Match found. + scrollIndex = index; + break; + } + } + return scrollIndex; +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::showHideRegionalInformation +// To Show and hide regional plugin label depends upon settings +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::showHideRegionalInformation() +{ + if (mView->pluginEnabled()) { + XQSettingsKey regionalInfo(XQSettingsKey::TargetCentralRepository, + KCRUidCalendar, KCalendarShowRegionalInfo); + + int showRegionalInfo = + mSettingsManager->readItemValue(regionalInfo).toUInt(); + if (showRegionalInfo) { + + if (!mRegionalInfoGroupBox) { + mRegionalInfoGroupBox = new HbGroupBox(); + CalenPluginLabel *regionalInfo = new CalenPluginLabel( + mServices, this); + regionalInfo->setFontSpec(HbFontSpec(HbFontSpec::Primary)); + mRegionalInfoGroupBox->setContentWidget(regionalInfo); + mRegionalPluginLayout->insertItem(1, mRegionalInfoGroupBox); + } + QString *pluginString = mView->pluginText(); + HbLabel *pluginInfoLabel = qobject_cast + (mRegionalInfoGroupBox->contentWidget()); + pluginInfoLabel->setPlainText(*pluginString); + } + } else { + if (mRegionalInfoGroupBox) { + mRegionalPluginLayout->removeItem(mRegionalInfoGroupBox); + delete mRegionalInfoGroupBox; + mRegionalInfoGroupBox = NULL; + } + } +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::createNewEvent +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::createNewEvent() +{ + // Issue a command to launch editor to create + // a new event + mServices.IssueCommandL(ECalenNewMeeting); +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::editEntry +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::editEntry() +{ + // Check if the selected index is valid + if (mSelectedIndex < 0 || mSelectedIndex > mInstanceArray.count()) { + return; + } + + // Get the entry details first + AgendaEntry entry = mInstanceArray[mSelectedIndex]; + if (AgendaEntry::TypeTodo == entry.type()) { + // Load the notes editor plugin if not loaded. + if (!mNotesPluginLoaded) { + // Launch the to-do editor using notes editor plugin api + QDir dir(NOTES_EDITOR_PLUGIN_PATH); + QString pluginName = dir.absoluteFilePath(NOTES_EDITOR_PLUGIN_NAME); + + // Create NotesEditor plugin loader object. + mNotesEditorPluginLoader = new QPluginLoader(pluginName); + + // Load the plugin + mNotesPluginLoaded = mNotesEditorPluginLoader->load(); + } + + QObject *plugin = qobject_cast ( + mNotesEditorPluginLoader->instance()); + + NotesEditorInterface* interface = + qobject_cast(plugin); + + interface->edit(entry, mServices.agendaInterface()); + + connect( + interface, SIGNAL(editingCompleted(bool)), + this, SLOT(noteEditingCompleted(bool))); + } else { + // Set the context + setContextFromHighlight(entry); + // Issue a command to launch the editor to edit this entry + mServices.IssueCommandL(ECalenEditCurrentEntry); + } +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::viewEntry +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::viewEntry() +{ + // Get the entry details first + AgendaEntry entry = mInstanceArray[mSelectedIndex]; + + // Set the context + setContextFromHighlight(entry); + + // Launch the event viewer. + mServices.IssueCommandL(ECalenEventView); +} + + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::deleteEntry +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::deleteEntry() +{ + // Check if the selected index is valid + if (mSelectedIndex < 0 || mSelectedIndex > mInstanceArray.count()) { + return; + } + + // Get the entry details + AgendaEntry entry = mInstanceArray[mSelectedIndex]; + // Set the context + setContextFromHighlight(entry); + // Issue the command to delete the entry + mServices.IssueCommandL(ECalenDeleteCurrentEntry); +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::markAsDone +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::markAsDone() +{ + // Check if the selected index is valid + if (mSelectedIndex < 0 || mSelectedIndex > mInstanceArray.count()) { + return; + } + + // Get the entry details + AgendaEntry entry = mInstanceArray[mSelectedIndex]; + + // Check again if the event is of type to-to + if (AgendaEntry::TypeTodo == entry.type()) { + // Set the status of the to-do as completed + entry.setStatus(AgendaEntry::TodoCompleted); + // Update the completed date and time + entry.setCompletedDateTime(mDate); + + // Update the entry in the database + mServices.agendaInterface()->setCompleted(entry, true, mDate); + mServices.IssueCommandL(ECalenStartActiveStep); + } +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::itemLongPressed +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::itemLongPressed(HbAbstractViewItem* listViewItem, + const QPointF& coords) +{ + mLongTapEventFlag = true; + // Update the selection index first + mSelectedIndex = listViewItem->modelIndex().row(); + + if (mSelectedIndex < 0 || mSelectedIndex > mInstanceArray.count()) { + // Invalid index + return; + } + + AgendaEntry entry = mInstanceArray[mSelectedIndex]; + + // Create new menu. + HbMenu *contextMenu = new HbMenu(); + + // Add the open option + HbAction *openAction = contextMenu->addAction( + hbTrId("txt_common_menu_open")); + + // Check the type of event + if (AgendaEntry::TypeTodo == entry.type()) { + // Add an option to mark the note as complete + HbAction *completeAction = contextMenu->addAction( + hbTrId("txt_calendar_menu_mark_as_done")); + } + + // Add the edit option + HbAction *editAction = contextMenu->addAction( + hbTrId("txt_common_menu_edit")); + + // Add the delete option + HbAction *deleteAction = contextMenu->addAction( + hbTrId("txt_common_menu_delete")); + + contextMenu->setDismissPolicy(HbMenu::TapAnywhere); + + // Show context sensitive menu. + // Param const QPointF& coordinate - is a longpress position. + contextMenu->setPreferredPos(coords); + connect(contextMenu, SIGNAL(aboutToClose()), + this, + SLOT(contextMenuClosed())); + + contextMenu->open(this, SLOT(contextManuTriggered(HbAction *))); +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::itemActivated +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::itemActivated(const QModelIndex &index) +{ + // Update the selection index first + mSelectedIndex = index.row(); + + // Check if the selected index is valid + if (mSelectedIndex < 0 || mSelectedIndex > mInstanceArray.count()) { + return; + } + if( !mLongTapEventFlag ) { + // Open the event for viewing + viewEntry(); + } +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::itemActivated +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::noteEditingCompleted(bool status) +{ + // We need to refresh the list since user + // might have marked the to-do as complete or + // edited it or deleted it. So get the instance + // list again + if (status) { + mServices.IssueCommandL(ECalenStartActiveStep); + } +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::goToToday +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::goToToday() +{ + // First check if we are not already + // showing today's agenda + if (mDate == CalenDateUtils::today()) { + return; + } + + // Set the context for the current day + mServices.Context().setFocusDate(CalenDateUtils::today()); + + mView->refreshViewOnGoToDate(); +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::contextMenuClosed +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::contextMenuClosed() +{ + mLongTapEventFlag = false; +} + +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::contextManuTriggered +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::contextManuTriggered(HbAction *action) +{ + if (action->text() == hbTrId("txt_common_menu_open")) { + viewEntry(); + } else if (action->text() == hbTrId("txt_calendar_menu_mark_as_done")) { + markAsDone(); + } else if (action->text() == hbTrId("txt_common_menu_edit")) { + editEntry(); + } else { + if (action->text() == hbTrId("txt_common_menu_delete")) { + deleteEntry(); + } + } +} +// ---------------------------------------------------------------------------- +// CalenAgendaViewWidget::clearListModel +// clears the list model +// ---------------------------------------------------------------------------- +// +void CalenAgendaViewWidget::clearListModel() + { + mListModel->clear(); + } + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/src/calendayview.cpp --- a/calendarui/views/src/calendayview.cpp Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,311 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: CalenDayView implementation. -* -*/ - -// System includes -#include -#include -#include - -// User includes -#include "calendayview.h" -#include "calendocloader.h" -#include "calendayviewwidget.h" -#include "calenservices.h" -#include "calencommon.h" -#include "calencontext.h" -#include "calendateutils.h" - -// ---------------------------------------------------------------------------- -// CalenDayView::CalenDayView -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -CalenDayView::CalenDayView(MCalenServices &services): -CalenNativeView(services), -mSoftKeyAction(NULL), -mGoToTodayAction(NULL), -mActionTaken(false) -{ - // No implementation yet -} - -// ---------------------------------------------------------------------------- -// CCalenDayView::~CalenDayView -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -CalenDayView::~CalenDayView() -{ - // No implementation yet -} - -// ---------------------------------------------------------------------------- -// CCalenDayView::setupView -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayView::setupView(CalenDocLoader *docLoader) -{ - if (!docLoader) { - // Nothing can be done. Simply return - return; - } - // Store the document loader for reference later - mDocLoader = docLoader; - - // Listen to orientation change events - connect(&(mServices.MainWindow()), SIGNAL(orientationChanged(Qt::Orientation)), - this, SLOT(orientationChanged(Qt::Orientation))); - - // Get the pointer to the content widget - mDayViewWidget = qobject_cast(mDocLoader->findWidget(CALEN_DAYVIEW_WIDGET)); - if (!mDayViewWidget) { - qFatal("calendayview.cpp : Unable to find the content widget"); - } - mDayViewWidget->setupWidget(this); - - // Initialize all the menu and toolbar actions - setupActions(); -} - -// ---------------------------------------------------------------------------- -// CCalenDayView::doPopulation -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayView::doPopulation() - { - // The content widget has not been constructed. Don't do anything - if (!mDayViewWidget) { - return; - } - // Get the day for which this view is being shown from the context - mDate = mServices.Context().focusDateAndTimeL(); - - // Check if the current day being shown is "Today" - if (mGoToTodayAction) { - if (mDate.date() == CalenDateUtils::today().date()) { - // Hide the "Go to today" option - mGoToTodayAction->setVisible(false); - } else { - mGoToTodayAction->setVisible(true); - } - } - - // Set self as the current view - // mServices.MainWindow().setCurrentView(this); - - // Dont override the soft key behavior if day view is the first view - if (ECalenDayView != mServices.getFirstView()) { - mSoftKeyAction = new HbAction(Hb::BackAction); - setNavigationAction(mSoftKeyAction); - // Connect to the signal triggered by clicking on back button. - connect(mSoftKeyAction, SIGNAL(triggered()), this, - SLOT(launchMonthView())); - } - // Initialize the content widget - mDayViewWidget->showWidget(); - - // Population is complete, issue a notification - populationComplete(); - } - -/*! - Funtion to refresh the current view upon selecting a date - from GoToDate popup - */ -void CalenDayView::refreshViewOnGoToDate() -{ - // Get the day for which this view is being shown from the context - mDate = mServices.Context().focusDateAndTimeL(); - - // Check if the current day being shown is "Today" - if (mGoToTodayAction) { - if (mDate.date() == CalenDateUtils::today().date()) { - // Hide the "Go to today" option - mGoToTodayAction->setVisible(false); - } else { - mGoToTodayAction->setVisible(true); - } - } - - // Initialize the content widget - mDayViewWidget->showWidget(); -} - -// ---------------------------------------------------------------------------- -// CCalenDayView::HandleNotification -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayView::HandleNotification(const TCalenNotification notification) -{ - Q_UNUSED(notification) - // No implementation yet -} - -// ---------------------------------------------------------------------------- -// CCalenDayView::docLoader -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -CalenDocLoader* CalenDayView::docLoader() -{ - return mDocLoader; -} - -// ---------------------------------------------------------------------------- -// CalenDayView::handleLocaleChange -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayView::mousePressEvent(QGraphicsSceneMouseEvent *event) -{ - // TODO: Remove these after gestures are available - mTapPoint = event->pos(); - event->accept(); -} - -// ---------------------------------------------------------------------------- -// CalenDayView::handleLocaleChange -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayView::mouseMoveEvent(QGraphicsSceneMouseEvent *event) -{ - // TODO: Remove these after gestures are available - QPointF curPos = event->pos(); - if (abs(curPos.y() - mTapPoint.y()) > 20) { - event->accept(); - return; - } - if (curPos.x() - mTapPoint.x() > 50) { - mTapPoint = QPointF(0, 0); - mServices.IssueCommandL(ECalenShowPrevDay); - mActionTaken = true; - } else if (curPos.x() - mTapPoint.x() < -50) { - mTapPoint = QPointF(0, 0); - mServices.IssueCommandL(ECalenShowNextDay); - mActionTaken = true; - } - event->accept(); -} - -// ---------------------------------------------------------------------------- -// CCalenDayView::eventFilter -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -bool CalenDayView::eventFilter(QObject *source, QEvent *event) -{ - // TODO : remove this line after gestures are available - mActionTaken = false; - Q_UNUSED(source) - if (event->type() == QEvent::GraphicsSceneMousePress) { - QGraphicsSceneMouseEvent *mouseEvent = static_cast(event); - mousePressEvent(mouseEvent); - } else if (event->type() == QEvent::GraphicsSceneMouseMove) { - QGraphicsSceneMouseEvent *mouseEvent = static_cast(event); - mouseMoveEvent(mouseEvent); - } - if (mActionTaken) { - // Swipe gesture has been enforced. - // Do not pass the event to the source - return true; - } - return false; -} - -// ---------------------------------------------------------------------------- -// CCalenDayView::createToolBar -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayView::setupActions() -{ - // Get the actions associated with this view - HbAction *newEventAction = qobject_cast - (mDocLoader->findObject(CALEN_DAYVIEW_MENU_NEW_EVENT)); - if (!newEventAction) { - qFatal("calendayview.cpp : Unable to find new event action"); - } - // Connect to the signal triggered by new event action - connect(newEventAction, SIGNAL(triggered()), mDayViewWidget, SLOT(createNewEvent())); - - mGoToTodayAction = qobject_cast - (mDocLoader->findObject(CALEN_DAYVIEW_MENU_GO_TO_TODAY)); - if (!mGoToTodayAction) { - qFatal("calendayview.cpp : Unable to find go to today action"); - } - // Connect to the signal triggered by new event action - connect(mGoToTodayAction, SIGNAL(triggered()), mDayViewWidget, SLOT(goToToday())); - - HbAction *goToDateAction = qobject_cast - (mDocLoader->findObject(CALEN_DAYVIEW_MENU_GO_TO_DATE)); - if (!goToDateAction) { - qFatal("calendayview.cpp : Unable to find go to date action"); - } - // Connect to the signal triggered by new event action - connect(goToDateAction, SIGNAL(triggered()), this, SLOT(goToDate())); - - HbAction *settingsAction = qobject_cast - (mDocLoader->findObject(CALEN_DAYVIEW_MENU_SETTINGS)); - if (!settingsAction) { - qFatal("calendayview.cpp : Unable to find settings action"); - } - // Connect to the signal triggered by new event action - connect(settingsAction, SIGNAL(triggered()), this, SLOT(launchSettingsView())); -} - -// ---------------------------------------------------------------------------- -// CCalenDayView::onLocaleChanged -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayView::onLocaleChanged(int reason) -{ - Q_UNUSED(reason) - // Notify the content widget about the change - if(mDayViewWidget) { - mDayViewWidget->handleLocaleChange(); - } -} - -// ---------------------------------------------------------------------------- -// CCalenDayView::orientationChanged -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayView::orientationChanged(Qt::Orientation orientation) -{ - // Notify the content widget about the change - if (mDayViewWidget) { - mDayViewWidget->orientationChanged(orientation); - } -} - -// ---------------------------------------------------------------------------- -// CCalenDayView::launchMonthView -// ---------------------------------------------------------------------------- -// -void CalenDayView::launchMonthView() -{ - // Issue the command to launch the month view - mServices.IssueCommandL(ECalenMonthView); -} - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/src/calendayviewwidget.cpp --- a/calendarui/views/src/calendayviewwidget.cpp Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1054 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: CalenDayViewWidget implementation -* -*/ - -// System includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// User includes -#include "calendayviewwidget.h" -#include "calencommon.h" -#include "calendayview.h" -#include "calendocloader.h" -#include "calenservices.h" -#include "calencontext.h" -#include "calendateutils.h" -#include "CalenUid.h" -#include "caleneventlistviewitem.h" -#include "calenpluginlabel.h" -#include "CalendarInternalCRKeys.h" - -// Constants -static const QString singleSpace(" "); -static const QString newLine("\n"); -static const QString customLayout("custom"); -static const char *stretchLayout("stretchItem"); -// TODO: Replace with actual image names later -static const QString toDoIcon("qtg_small_todo"); -static const QString reminderIcon("qtg_mono_alarm"); -static const QString locationIcon("qtg_mono_location"); -static const QString repeatIcon("qtg_mono_repeat"); -static const QString allDayIcon(":/qgn_indi_cdr_meeting_layer0.svg"); -static const QString exceptionIcon(":/qtg_mono_exception.png"); -static const int singleColumn(1); - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::CalenDayViewWidget -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -EXPORT_C CalenDayViewWidget::CalenDayViewWidget(MCalenServices &services, - CalenDocLoader *docLoader) : -mServices(services), -mDocLoader(docLoader), -mRegionalInfoGroupBox(NULL) -{ - // Construct the list view prototype - mListViewPrototype = new CalenEventListViewItem(this); - - // Create the list model - mListModel = new QStandardItemModel(this); - - // Register the custom docml and css to provide our own style to the list items - HbStyleLoader::registerFilePath(":/"); - - //Create the setting manager - mSettingsManager = new XQSettingsManager(this); -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::~CalenDayViewWidget -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -EXPORT_C CalenDayViewWidget::~CalenDayViewWidget() -{ - if (mListViewPrototype) { - delete mListViewPrototype; - mListViewPrototype = NULL; - } - if (mListModel) { - // Do not delete the model since its owned by the view - mListModel->clear(); - } -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::setupWidget -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::setupWidget(CalenDayView *view) -{ - // Store the view for future reference - mView = view; - - if (!mDocLoader) { - // Nothing much can be done. Simply return - return; - } - - // Initialize the child widgets - initChildWidgets(); -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::showWidget -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::showWidget() -{ - // Get the date for which this view has been launched - mDate = mServices.Context().focusDateAndTimeL(); - - // Set the heading text - setHeadingText(); - - // Get the instance list - getInstanceList(); - - // Check if regional information needs to be shown - // and add it or remove it - showHideRegionalInformation(); - - // Load the appropriate section based on the number of events for the day - if (0 == mInstanceArray.count()) { - // There are no entries for the day - // Load and show the empty list section - bool loadSuccess = false; - - // Hide the list which shows the events - mEventsList->hide(); - - // Show the empty list text - mEmptyListLabel->show(); - - // Get the current device orientation - int orientation = mServices.MainWindow().orientation(); - if (Qt::Vertical == orientation) { - mDocLoader->load(CALEN_DAYVIEW_XML_FILE, "emptyList", &loadSuccess); - } else { - mDocLoader->load(CALEN_DAYVIEW_XML_FILE, "emptyLandscape", &loadSuccess); - } - if (!loadSuccess) { - qFatal("calendayviewwidget.cpp : Unable to load empty list section"); - } - } else { - // Hide the empty view label - mEmptyListLabel->hide(); - - // Show the events list - mEventsList->show(); - - // There are one or more events. Load the non-empty section - bool loadSuccess = false; - mDocLoader->load(CALEN_DAYVIEW_XML_FILE, "nonEmptyList", &loadSuccess); - if (!loadSuccess) { - qFatal("calendayviewwidget.cpp : Unable to load non-empty list section"); - } - // Now populate the list with the events - populateListWidget(); - } -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::orientationChanged -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::orientationChanged(Qt::Orientation orientation) -{ - // Load the appropriate section based on the number of events for the day - if (0 == mInstanceArray.count()) { - // There are no entries for the day - // Load and show the empty list section - bool loadSuccess = false; - - // Hide the list which shows the events - mEventsList->hide(); - - // Show the empty list text - mEmptyListLabel->show(); - - if (Qt::Vertical == orientation) { - mDocLoader->load(CALEN_DAYVIEW_XML_FILE, "emptyList", &loadSuccess); - } else { - mDocLoader->load(CALEN_DAYVIEW_XML_FILE, "emptyLandscape", &loadSuccess); - } - if (!loadSuccess) { - qFatal("calendayviewwidget.cpp : Unable to load empty list section"); - } - } else { - // Hide the empty view label - mEmptyListLabel->hide(); - - // Show the events list - mEventsList->show(); - - // There are one or more events. Load the non-empty section - bool loadSuccess = false; - mDocLoader->load(CALEN_DAYVIEW_XML_FILE, "nonEmptyList", &loadSuccess); - if (!loadSuccess) { - qFatal("calendayviewwidget.cpp : Unable to load non-empty list section"); - } - handleListItemStretching(orientation); - } -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::handleLocaleChange -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::handleLocaleChange() -{ - if(mListViewPrototype) { - HbExtendedLocale locale = HbExtendedLocale::system(); - HbExtendedLocale::TimeStyle timeStyle = locale.timeStyle(); - if (HbExtendedLocale::Time12 == timeStyle) { - mListViewPrototype->setTimeFormat12Hr(true); - } else { - mListViewPrototype->setTimeFormat12Hr(false); - } - - } -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::setContextFromHighlight -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::setContextFromHighlight(AgendaEntry entry) -{ - if (entry.isTimedEntry()) { - // Timed entry. - QDateTime start = entry.startTime(); - // start.setDate(mDate.date()); - mServices.Context().setFocusDateAndTimeAndInstanceL(start, - TCalenInstanceId::create(entry), - KCalenDayViewUidValue); - } else { - // Untimed entry. - if (CalenDateUtils::onSameDay(TCalenInstanceId::create(entry).mInstanceTime, - mDate)) { - mServices.Context().setInstanceIdL(TCalenInstanceId::create(entry), - KCalenDayViewUidValue); - } else { - // Multi-day untimed note (either multi-day day note or weird todo). - // Focus on the instance and set the focus time to the highlighted day. - mServices.Context().setFocusDateAndTimeAndInstanceL(mDate, - TCalenInstanceId::create(entry), - KCalenDayViewUidValue); - } - } -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::initChildWidgets -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::initChildWidgets() -{ - // Get the pointer to the events list - mEventsList = static_cast (mDocLoader->findWidget(CALEN_DAYVIEW_LISTWIDGET)); - if (!mEventsList) { - qFatal("calendayviewwidget.cpp : Unable to find the events list"); - } - // NOTE: Layout name MUST be same as the name mentioned in the css - mEventsList->setLayoutName(customLayout); - - // TODO : remove this line after gestures are available - mEventsList->installEventFilter(mView); - - // Connect to the long press and activation signals - connect(mEventsList, SIGNAL(longPressed(HbAbstractViewItem*, const QPointF&)), - this, SLOT(itemLongPressed(HbAbstractViewItem*, const QPointF&))); - connect(mEventsList, SIGNAL(activated(const QModelIndex&)), this, - SLOT(itemActivated(const QModelIndex&))); - - // Get the pointer to label from the loader. - mHeadingLabel = qobject_cast (mDocLoader->findWidget(CALEN_DAYVIEW_HEADING)); - if (!mHeadingLabel) { - qFatal("calendayviewwidget.cpp : Unable to find heading widget"); - } - - // Get the pointer to the empty view label - mEmptyListLabel = qobject_cast (mDocLoader->findWidget("noEventsLabel")); - if (!mEmptyListLabel) { - qFatal("calendayviewwidget.cpp : Unable to find empty list label"); - } - HbWidget *headingPluginWidget = - qobject_cast (mDocLoader->findWidget(CALEN_DAYVIEW_HEADING_REGIONALPLUGIN_WIDGET)); - - mRegionalPluginLayout = static_cast(headingPluginWidget->layout()); - -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::populateListWidget -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::populateListWidget() -{ - // Recycle the list items so that only needed rows - // are added or removed - if (mInstanceArray.count() == 0) { - // Reset the list - mEventsList->reset(); - // Clear the model to ensure it does not have any old items - mListModel->clear(); - return; - } else if (mInstanceArray.count() > mListModel->rowCount()) { - // There are more events than the number of items - // in the list. Add more rows - mListModel->insertRows(0, mInstanceArray.count() - mListModel->rowCount()); - } else if (mInstanceArray.count() < mListModel->rowCount()) { - // There are less number of events than the number - // of items in the list. Remove the extra rows - mListModel->removeRows(0, mListModel->rowCount() - mInstanceArray.count()); - } - mListModel->setColumnCount(singleColumn); - - // Add all the events to the list - for (int index = 0; index < mInstanceArray.count(); index++) { - // Get each of the entry details - AgendaEntry entry = mInstanceArray[index]; - // Create a list item for each entry - createListItem(index, entry); - } - // Add the item on to the list widget - mEventsList->setModel(mListModel, mListViewPrototype); - - // Now get the item to scroll to - int scrollToIndex = getIndexToScrollTo(); - if (mListModel->rowCount() > 0) { - // Scroll to the index only if index is valid - mEventsList->scrollTo(mListModel->index(scrollToIndex, 0)); - } -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::getInstanceList -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::getInstanceList() -{ - // Clear the previous instance list - mInstanceArray.clear(); - - // Check if the date is valid - if (!CalenDateUtils::isValidDay(mDate)) { - mDate = CalenDateUtils::today(); - } - - // Set the filter flags to fetch all relevant entries - AgendaUtil::FilterFlags filter = AgendaUtil::FilterFlags(AgendaUtil::IncludeAnniversaries | - AgendaUtil::IncludeAppointments | - AgendaUtil::IncludeEvents | - AgendaUtil::IncludeReminders | - AgendaUtil::IncludeIncompletedTodos); - - // Fetch the instance list from the agenda interface - mInstanceArray = mServices.agendaInterface()->createEntryIdListForDay(mDate, filter); - - if (0 == mInstanceArray.count()) { - // There are no events to populate - // Hide the events list - mEventsList->hide(); - // Show the empty list text - mEmptyListLabel->show(); - return; - } -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::setDateToLabel -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::setHeadingText() - { - // Format the date as per the device locale settings - HbExtendedLocale systemLocale = HbExtendedLocale::system(); - - // Get localised name of the day from locale - QString dayString = systemLocale.dayName(mDate.date().dayOfWeek()); - // Append a single space - dayString.append(singleSpace); - // Set the heading - // Append the date which is formatted as per the locale - mHeadingLabel->setHeading(hbTrId( - "txt_calendar_subhead_1_2").arg(dayString).arg( - systemLocale.format(mDate.date(), r_qtn_date_usual_with_zero))); -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::createListItem -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::createListItem(int index, AgendaEntry entry) -{ - if (index < 0 || entry.isNull()) { - // Not a valid index or entry. Dont do anything - return; - } - // Check if the entry is a timed entry - // TODO: Right now, only appointment/meeting type is being handled - // Handle other timed entry types like reminder etc - if (entry.isTimedEntry()) { - // Get the text and icon data for the entry - addTimedEventToList(index, entry); - } else { - addNonTimedEventToList(index, entry); - } -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::addTimedEventToList -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::addTimedEventToList(int index, AgendaEntry entry) -{ - // Create text and icon list to set to the model - QVariantList textData; - QVariantList iconData; - bool twoLines = false; - - /** - * IMPORTANT NOTE: All the text and icon items must be - * inserted into the variant list in a specific order. - * If not, chaos will set it!!! - * On a more serious note, the mesh layout depends on the - * fact that the icons and text data will be added in a - * particular order. If one of the items go missing, the - * layout might get messed up. Also in case a particular item - * is not required to be added in the middle of the list, an - * empty QVariant must be added to indicate to the list view - * that the item must be removed from the layout. - * Do not mess with the order in case you are not sure what - * you are exactly doing. - */ - - // The first icon to show to-do or all day should not be shown - // Append empty data to the icons list - iconData << QVariant(); - - // Check if alarm is enabled for the entry - if (entry.alarm().isNull()) { - // Insert a blank icon. Else the next icon - // will get replaced in this icon's position - iconData << QVariant(); - } else { - iconData << HbIcon(reminderIcon); - } - - // Check if the entry is recurring - if (entry.isRepeating()) { - iconData << HbIcon(repeatIcon); - } else if (!entry.recurrenceId().isNull()) { - // This is an exceptional entry - iconData << HbIcon(exceptionIcon); - } else { - // Insert a blank icon. Else the next icon - // will get replaced in this icon's position - iconData << QVariant(); - } - - HbExtendedLocale locale = HbExtendedLocale::system(); - // Get the start time and format as per the locale - QDateTime startTime = entry.startTime(); - QTime eventStartTime; - - if (CalenDateUtils::beginningOfDay(startTime) - < CalenDateUtils::beginningOfDay(mDate)) { - // event is started previous day, show StarTime as 12:00 am in Agendaview, - eventStartTime.setHMS(00, 00, 00); - } else { - eventStartTime = entry.startTime().time(); - } - QString eventTime = locale.format(eventStartTime, r_qtn_time_usual_with_zero); - - // Get the event end time - QDateTime endTime = entry.endTime(); - QTime eventEndTime; - - if (CalenDateUtils::beginningOfDay(endTime) - > CalenDateUtils::beginningOfDay(mDate)) { - // event has MidNight crossover, show EndTime as 11:59pm in Agendaview, - eventEndTime.setHMS(23, 59, 59); - } else { - eventEndTime = entry.endTime().time(); - } - - if (eventStartTime < eventEndTime) { - // Raise the flag to indicate that the list item - // would wrap to two lines - twoLines = true; - // Append '-' to indicate an end time is present - eventTime.append("-"); - // Append new line to wrap to next line - eventTime.append(newLine); - // Event is a not a zero duration meeting - // Only in this case, append the end time - eventTime.append(locale.format(eventEndTime, r_qtn_time_usual_with_zero)); - } else { - // Append new line to wrap to next line - eventTime.append(newLine); - } - // Add the event time to the text list - // This MUST be the first item to be added to the list - textData << eventTime; - - // Get the entry subject - QString subject = entry.summary(); - if (subject.isEmpty() || subject.isNull()) { - // No subject. Add "(No subject)" text - subject.append(hbTrId("txt_calendar_dblist_unnamed")); - } - // Add the subject to the text list - // This MUST be the second item in the list - textData << subject; - - // Check if the entry has location - // TODO: This must change to check for geo-location - // This MUST be the third item in the list - if (entry.location().isEmpty()) { - // Insert a blank icon. Else the next icon - // will get replaced in this icon's position - iconData << QVariant(); - if (twoLines) { - /** - * NOTE: If the primary text is wrapping to two - * lines, then the location must be set as blank - * since the bottom of the list item is anchored to - * the bottom of the secondary text. Else the bottom - * of the list will overlap on the primary text - */ - textData << singleSpace; - } else { - /** - * Else, set the secondary text to empty to indicate - * to the list view to remove the item itself and - * shrink its size to a single line size - */ - textData << QVariant(); - } - } else { - // TODO: Location icon must be shown - // only if valid geo-coordinates are present - // iconData << HbIcon(locationIcon); - textData << entry.location(); - } - - // Get the list model index and set the text and icon data - QModelIndex listIndex = mListModel->index(index, 0); - mListModel->setData(listIndex, textData, Qt::DisplayRole); - mListModel->setData(listIndex, iconData, Qt::DecorationRole); - - // Disable item stretching by removing the dynamic property - HbListViewItem *listViewItem = static_cast - (mEventsList->itemByIndex(mListModel->index(index, 0))); - if (listViewItem) { - listViewItem->setProperty(stretchLayout, false); - } -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::addNonTimedEventToList -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::addNonTimedEventToList(int index, AgendaEntry entry) -{ - QVariantList textData; - QVariantList iconData; - - /** - * IMPORTANT NOTE: All the text and icon items must be - * inserted into the variant list in a specific order. - * If not, chaos will set it!!! - * On a more serious note, the mesh layout depends on the - * fact that the icons and text data will be added in a - * particular order. If one of the items go missing, the - * layout might get messed up. Also in case a particular item - * is not required to be added in the middle of the list, an - * empty QVariant must be added to indicate to the list view - * that the item must be removed from the layout. - * Do not mess with the order in case you are not sure what - * you are exactly doing. - */ - - // The first column text has to be empty - textData << QVariant(); - - // Get the entry subject - QString subject = entry.summary(); - if (subject.isEmpty() || subject.isNull()) { - // No subject. Add "(No subject)" text - subject.append(hbTrId("txt_calendar_dblist_unnamed")); - } - // Add the subject to the text list - // This MUST be the second item in the list - textData << subject; - - // Get the entry type - AgendaEntry::Type entryType = entry.type(); - - if (entryType == AgendaEntry::TypeAnniversary) { - // Nothing to do as of now as anniversary events - // cannot be created - // TODO: To be handled in case of sync - } else if (entryType == AgendaEntry::TypeEvent) { - // This is an all day event - // Append the all-day icon - iconData << HbIcon(allDayIcon); - - // Check if alarm is enabled for the entry - if (entry.alarm().isNull()) { - // Insert a blank icon. Else the next icon - // will get replaced in this icon's position - iconData << QVariant(); - } else { - iconData << HbIcon(reminderIcon); - } - - // Check if the entry is recurring - if (entry.isRepeating()) { - iconData << HbIcon(repeatIcon); - } else { - // Insert a blank icon. Else the next icon - // will get replaced in this icon's position - iconData << QVariant(); - } - - // Append the location - if (!entry.location().isEmpty()) { - textData << entry.location(); - // TODO: Location icon must be shown - // only if valid geo-coordinates are present - // iconData << HbIcon(locationIcon); - } else { - textData << singleSpace; - } - - } else if (entryType == AgendaEntry::TypeTodo) { - // Append the to-do icon - iconData << HbIcon(toDoIcon); - - // Get the due date - QDateTime dueDate = entry.endTime(); - - // Append the date first - QString dueDateString(hbTrId("txt_calendar_dblist_val_due_on_1")); - QString dueText; - dueText.setNum(dueDate.date().day()); - dueText.append(singleSpace); - - // Append the month name next - HbExtendedLocale locale = HbExtendedLocale::system(); - QString month = locale.monthName(dueDate.date().month()); - dueText.append(month); - dueText.append(singleSpace); - - // Append the year - QString year; - year.setNum(dueDate.date().year()); - dueText.append(year); - - textData << dueDateString.arg(dueText); - - // Check if alarm is enabled for the entry - if (entry.alarm().isNull()) { - // Insert a blank icon. Else the next icon - // will get replaced in this icon's position - iconData << QVariant(); - } else { - iconData << HbIcon(reminderIcon); - } - - // Check if the entry is recurring - if (entry.isRepeating()) { - iconData << HbIcon(repeatIcon); - } else { - // Insert a blank icon. Else the next icon - // will get replaced in this icon's position - iconData << QVariant(); - } - } - - // Get the list model index and set the text and icon data - QModelIndex listIndex = mListModel->index(index, 0); - mListModel->setData(listIndex, textData, Qt::DisplayRole); - mListModel->setData(listIndex, iconData, Qt::DecorationRole); - - // Enable item stretching by adding the dynamic property - HbListViewItem *listViewItem = static_cast - (mEventsList->itemByIndex(mListModel->index(index, 0))); - Qt::Orientation orientation = mServices.MainWindow().orientation(); - // Apply stretch only for landscape orientation - if (listViewItem) { - if (Qt::Horizontal == orientation) { - listViewItem->setProperty(stretchLayout, true); - } else { - listViewItem->setProperty(stretchLayout, false); - } - } -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::handleListItemStretching -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::handleListItemStretching(Qt::Orientation orientation) -{ - if (mInstanceArray.count() == 0) { - // Nothing much to do. Simply return - return; - } - for(int index = 0; index < mInstanceArray.count() ; index ++) { - AgendaEntry entry = mInstanceArray[index]; - if (!entry.isNull()) { - AgendaEntry::Type eventType = entry.type(); - switch(eventType) { - // Apply the stretching to only to-do's, - // anniversary and all-day event types - case AgendaEntry::TypeTodo: - case AgendaEntry::TypeEvent: - case AgendaEntry::TypeAnniversary: - { - // Get the list view item corresponding to the index - HbListViewItem *listItem = static_cast - (mEventsList->itemByIndex(mListModel->index(index, 0))); - if (listItem) { - if (orientation == Qt::Horizontal) { - // Set a dynamic property to indicate that this list item - // must be stretched in landscape. - // NOTE: Property name MUST match the name specified in - // css file, else wierd things might happen - listItem->setProperty(stretchLayout, true); - } - } - } - break; - default: - { - HbListViewItem *listItem = static_cast - (mEventsList->itemByIndex(mListModel->index(index, 0))); - if (listItem) { - listItem->setProperty(stretchLayout, false); - } - break; - } - } - } - } -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::getIndexToScrollTo -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -int CalenDayViewWidget::getIndexToScrollTo() -{ - int scrollIndex = 0; - TCalenInstanceId instanceId = mServices.Context().instanceId(); - if (instanceId == TCalenInstanceId::nullInstanceId()) { - // If the instance is not set, then scroll to zero index - return scrollIndex; - } - - for (int index = 0 ; index < mInstanceArray.count() ; index++) { - AgendaEntry entry = mInstanceArray[index]; - if (entry.id() == instanceId.mEntryLocalUid) { - // Match found. - scrollIndex = index; - break; - } - } - return scrollIndex; -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::showHideRegionalInformation -// To Show and hide regional plugin label depends upon settings -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::showHideRegionalInformation() -{ - XQSettingsKey regionalInfo(XQSettingsKey::TargetCentralRepository, - KCRUidCalendar.iUid, KShowRegionalInformation); - - int showRegionalInfo = mSettingsManager->readItemValue(regionalInfo).toUInt(); - if (showRegionalInfo) { - - if (!mRegionalInfoGroupBox) { - mRegionalInfoGroupBox = new HbGroupBox(); - CalenPluginLabel *regionalInfo = new CalenPluginLabel( - mServices, this); - mRegionalInfoGroupBox->setContentWidget(regionalInfo); - mRegionalPluginLayout->insertItem(1, mRegionalInfoGroupBox); - } - - if (mView->pluginEnabled()) { - QString *pluginString = mView->pluginText(); - HbLabel *pluginInfoLabel = qobject_cast - (mRegionalInfoGroupBox->contentWidget()); - pluginInfoLabel->setPlainText(*pluginString); - } - } else { - if (mRegionalInfoGroupBox) { - mRegionalPluginLayout->removeItem(mRegionalInfoGroupBox); - delete mRegionalInfoGroupBox; - mRegionalInfoGroupBox = NULL; - } - } -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::createNewEvent -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::createNewEvent() -{ - // Issue a command to launch editor to create - // a new event - mServices.IssueCommandL(ECalenNewMeeting); -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::editEntry -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::editEntry() -{ - // Check if the selected index is valid - if (mSelectedIndex < 0 || mSelectedIndex > mInstanceArray.count()) { - return; - } - - // Get the entry details first - AgendaEntry entry = mInstanceArray[mSelectedIndex]; - if (AgendaEntry::TypeTodo == entry.type()) { - // Launch the to-do editor - mNotesEditor = new NotesEditor(mView); - mNotesEditor->edit(entry); - connect(mNotesEditor, SIGNAL(editingCompleted(bool)), this, SLOT(noteEditingCompleted(bool))); - } else { - // Set the context - setContextFromHighlight(entry); - // Issue a command to launch the editor to edit this entry - mServices.IssueCommandL(ECalenEditCurrentEntry); - } -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::viewEntry -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::viewEntry() -{ - // Get the entry details first - AgendaEntry entry = mInstanceArray[mSelectedIndex]; - - // Set the context - setContextFromHighlight(entry); - - // Launch the event viewer. - mServices.IssueCommandL(ECalenEventView); -} - - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::deleteEntry -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::deleteEntry() -{ - // Check if the selected index is valid - if (mSelectedIndex < 0 || mSelectedIndex > mInstanceArray.count()) { - return; - } - - // Get the entry details - AgendaEntry entry = mInstanceArray[mSelectedIndex]; - // Set the context - setContextFromHighlight(entry); - // Issue the command to delete the entry - mServices.IssueCommandL(ECalenDeleteCurrentEntry); -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::markAsDone -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::markAsDone() -{ - // Check if the selected index is valid - if (mSelectedIndex < 0 || mSelectedIndex > mInstanceArray.count()) { - return; - } - - // Get the entry details - AgendaEntry entry = mInstanceArray[mSelectedIndex]; - - // Check again if the event is of type to-to - if (AgendaEntry::TypeTodo == entry.type()) { - // Set the status of the to-do as completed - entry.setStatus(AgendaEntry::TodoCompleted); - // Update the completed date and time - entry.setCompletedDateTime(mDate); - - // Update the entry in the database - AgendaUtil agendaUtil; - agendaUtil.setCompleted(entry, true, mDate); - - mServices.IssueCommandL(ECalenStartActiveStep); - } -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::itemLongPressed -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::itemLongPressed(HbAbstractViewItem* listViewItem, - const QPointF& coords) -{ - // Update the selection index first - mSelectedIndex = listViewItem->modelIndex().row(); - - if (mSelectedIndex < 0 || mSelectedIndex > mInstanceArray.count()) { - // Invalid index - return; - } - - AgendaEntry entry = mInstanceArray[mSelectedIndex]; - - // Create new menu. - HbMenu *contextMenu = new HbMenu(); - - // Add the open option - HbAction *openAction = contextMenu->addAction(hbTrId("txt_common_menu_open")); - connect(openAction, SIGNAL(triggered()), this, SLOT(viewEntry())); - - // Check the type of event - if (AgendaEntry::TypeTodo == entry.type()) { - // Add an option to mark the note as complete - HbAction *completeAction = contextMenu->addAction(hbTrId("txt_calendar_menu_mark_as_done")); - connect(completeAction, SIGNAL(triggered()), this, SLOT(markAsDone())); - } - - // Add the edit option - HbAction *editAction = contextMenu->addAction(hbTrId("txt_common_menu_edit")); - connect(editAction, SIGNAL(triggered()), this, SLOT(editEntry())); - - // Add the delete option - HbAction *deleteAction = contextMenu->addAction(hbTrId("txt_common_menu_delete")); - connect(deleteAction, SIGNAL(triggered()), this, SLOT(deleteEntry())); - - contextMenu->setDismissPolicy(HbMenu::TapAnywhere); - - // Show context sensitive menu. - // Param const QPointF& coordinate - is a longpress position. - contextMenu->exec(coords); -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::itemActivated -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::itemActivated(const QModelIndex &index) -{ - // Update the selection index first - mSelectedIndex = index.row(); - - // Check if the selected index is valid - if (mSelectedIndex < 0 || mSelectedIndex > mInstanceArray.count()) { - return; - } - - // Open the event for viewing - viewEntry(); -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::itemActivated -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::noteEditingCompleted(bool status) -{ - Q_UNUSED(status); - // Delete the notes editor instance - mNotesEditor->deleteLater(); - - // We need to refresh the list since user - // might have marked the to-do as complete or - // edited it or deleted it. So get the instance - // list again - if (status) { - mServices.IssueCommandL(ECalenStartActiveStep); - } -} - -// ---------------------------------------------------------------------------- -// CalenDayViewWidget::goToToday -// Rest of the details are commented in the header -// ---------------------------------------------------------------------------- -// -void CalenDayViewWidget::goToToday() -{ - // First check if we are not already - // showing today's agenda - if (mDate == CalenDateUtils::today()) { - return; - } - - // Set the context for the current day - mServices.Context().setFocusDateL(CalenDateUtils::today(), KCalenDayViewUidValue); - - mView->refreshViewOnGoToDate(); -} - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/src/caleneventlistviewitem.cpp --- a/calendarui/views/src/caleneventlistviewitem.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/src/caleneventlistviewitem.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -24,8 +24,6 @@ CalenEventListViewItem::CalenEventListViewItem(QGraphicsItem *parent) : HbListViewItem(parent) { - HbExtendedLocale locale = HbExtendedLocale::system(); - timeFormat12 = (HbExtendedLocale::Time12 == locale.timeStyle()) ? true : false; } CalenEventListViewItem::~CalenEventListViewItem() @@ -43,15 +41,4 @@ HbListViewItem::updateChildItems(); } -bool CalenEventListViewItem::timeFormat12Hr() -{ - return timeFormat12; -} - -void CalenEventListViewItem::setTimeFormat12Hr(bool format) -{ - timeFormat12 = format; -} - - // End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/src/calengriditemprototype.cpp --- a/calendarui/views/src/calengriditemprototype.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/src/calengriditemprototype.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -16,7 +16,6 @@ */ // System includes -#include #include #include #include @@ -32,8 +31,8 @@ // User includes #include "calengriditemprototype.h" #include "calencommon.h" +#include "calentodayindicatorlinedrawer.h" -#define GRIDLINE_WIDTH 0.075 //units /*! \class CalenGridItemPrototype @@ -43,19 +42,55 @@ /*! Constructor. */ -CalenGridItemPrototype::CalenGridItemPrototype(QGraphicsWidget *parent) : +CalenGridItemPrototype::CalenGridItemPrototype(QColor todayIndColor, QColor activeColor, QColor inActiveColor, + QGraphicsWidget *parent) : HbGridViewItem(parent), - mLayout(0), + mTodayUnderLineColor(todayIndColor), + mActiveTextColor(activeColor), + mInActiveTextColor(inActiveColor), mCurrentDateColor(Qt::black), mGridBorderColor(Qt::gray), mEventIndicatorItem(0), mMonthDayInfoItem(0), mFocusIndicatorItem(0), - mTodayIndicatorItem(0), - mTodayUnderLineColor(Qt::gray) + mTodayIndicatorItem(0) { - mTodayUnderLineColor = HbColorScheme::color("qtc_cal_month_current_day"); + } + +/*! + Constructs all the primitives +*/ +void CalenGridItemPrototype::createPrimitives() +{ + if (!mMonthDayInfoItem) { + mMonthDayInfoItem = new HbTextItem(this); + HbStyle::setItemName(mMonthDayInfoItem, + QLatin1String("monthDayInfoTextItem")); + mMonthDayInfoItem->setElideMode(Qt::ElideNone); } + + if (!mFocusIndicatorItem) { + mFocusIndicatorItem = new HbFrameItem(this); + mFocusIndicatorItem->frameDrawer().setFrameType( + HbFrameDrawer::NinePieces); + mFocusIndicatorItem->setZValue(-1); + HbStyle::setItemName( + mFocusIndicatorItem, QLatin1String("focusIconItem")); + } + + if (!mEventIndicatorItem) { + mEventIndicatorItem = new HbIconItem(this); + HbStyle::setItemName( + mEventIndicatorItem, QLatin1String("eventIconItem")); + } + + if (!mTodayIndicatorItem) { + mTodayIndicatorItem = new CalenTodayIndicatorLineDrawer(this); + HbStyle::setItemName( + mTodayIndicatorItem, QLatin1String("todayIndicatorItem")); + } + +} /*! From HbAbstractViewItem. @@ -65,7 +100,16 @@ */ HbAbstractViewItem *CalenGridItemPrototype::createItem() { - return new CalenGridItemPrototype(*this); + CalenGridItemPrototype* item = new CalenGridItemPrototype(*this); + item->createPrimitives(); + + // Set the default frame to NULL so that HbGridView does not add its + // default frame for items + HbFrameBackground frame; + frame.setFrameGraphicsName(QString("")); + item->setDefaultFrame(frame); + + return item; } /*! @@ -74,101 +118,70 @@ \sa HbAbstractViewItem, HbGridViewItem */ void CalenGridItemPrototype::updateChildItems() -{ - - // base class implementation - HbGridViewItem::updateChildItems(); - +{ // Here update content of each item. QVariant monthDayRole; - QVariant monthFocusRole; + bool monthFocusRole; bool underlineEnabled = false; - QVariant monthEventRole; - QVariant monthTextColorRole; + bool monthEventRole; + bool monthTextColorRole; QVariant itemData = modelIndex().data(Qt::UserRole + 1); if (itemData.isValid()) { if (itemData.canConvert()) { + // Get the item list QVariantList itemList = itemData.toList(); // Get the day text monthDayRole = itemList.at(CalendarNamespace::CalendarMonthDayRole); if (monthDayRole.canConvert()) { - QString monthDayText = monthDayRole.toString(); - - if (!mMonthDayInfoItem) { - mMonthDayInfoItem = new HbTextItem(this); - HbStyle::setItemName(mMonthDayInfoItem, - QLatin1String("monthDayInfoTextItem")); - - } - - mMonthDayInfoItem->setText(monthDayText); - mMonthDayInfoItem->setElideMode(Qt::ElideNone); + mMonthDayInfoItem->setText(monthDayRole.toString()); } // Get the focus data - monthFocusRole = itemList.at(CalendarNamespace::CalendarMonthFocusRole); - if (monthFocusRole.canConvert()) { - QString focusIconPath = monthFocusRole.toString(); - if (!mFocusIndicatorItem) { - mFocusIndicatorItem = new HbFrameItem(this); - mFocusIndicatorItem->frameDrawer().setFrameType(HbFrameDrawer::NinePieces); - mFocusIndicatorItem->setZValue(-1); - HbStyle::setItemName(mFocusIndicatorItem, QLatin1String("focusIconItem")); - } - mFocusIndicatorItem->frameDrawer().setFrameGraphicsName(focusIconPath); + monthFocusRole = itemList.at(CalendarNamespace::CalendarMonthFocusRole).value(); + if (monthFocusRole) { + mFocusIndicatorItem->frameDrawer().setFrameGraphicsName(focusIconName); + } else { + mFocusIndicatorItem->frameDrawer().setFrameGraphicsName(QString("")); } // Get the today indicator role - underlineEnabled = itemList.at(CalendarNamespace::CalendarMonthUnderlineRole).value(); - drawUnderline(underlineEnabled); + underlineEnabled = itemList.at( + CalendarNamespace::CalendarMonthUnderlineRole). + value(); + if(underlineEnabled) { + mTodayIndicatorItem->show(); + } else { + mTodayIndicatorItem->hide(); + } // Get the event indicator data - monthEventRole = itemList.at(CalendarNamespace::CalendarMonthEventRole); - if (monthEventRole.canConvert()) { - QString eventIconPath = monthEventRole.toString(); - if (!mEventIndicatorItem) { - mEventIndicatorItem = new HbIconItem(this); - HbStyle::setItemName(mEventIndicatorItem, QLatin1String("eventIconItem")); - } - mEventIndicatorItem->setIconName(eventIconPath); + monthEventRole = itemList.at(CalendarNamespace::CalendarMonthEventRole).value(); + if (monthEventRole) { + // Set the event indicator + //QString iconName(focusIconName); + mEventIndicatorItem->setIconName(eventIndname); + } else { + mEventIndicatorItem->setIconName(QString("")); } // Get the text color - monthTextColorRole = itemList.at(CalendarNamespace::CalendarMonthTextColorRole); - if (monthTextColorRole.canConvert()) { - QColor monthTextColor = monthTextColorRole.value(); - mMonthDayInfoItem->setTextColor(monthTextColor); + monthTextColorRole = itemList.at(CalendarNamespace::CalendarMonthTextColorRole).value(); + if (monthTextColorRole) { + // Set the active text color + mMonthDayInfoItem->setTextColor(mActiveTextColor); + } else { + // Set the inactive text color + mMonthDayInfoItem->setTextColor(mInActiveTextColor); } } } + // base class implementation + HbGridViewItem::updateChildItems(); } /*! - Function to create the underline icon item - */ -void CalenGridItemPrototype::drawUnderline(bool underlineEnabled) -{ - if (underlineEnabled) { - if (!mTodayIndicatorItem) { - mTodayIndicatorItem = new HbIconItem(this); - HbStyle::setItemName(mTodayIndicatorItem, - QLatin1String("todayIndicatorItem")); - if (mTodayUnderLineColor.isValid()) { - mTodayIndicatorItem->setColor(mTodayUnderLineColor); - } - } - } else { - if (mTodayIndicatorItem) { - delete mTodayIndicatorItem; - mTodayIndicatorItem = NULL; - } - } -} - - -/*! Function overwritten to avoid default behavior */ void CalenGridItemPrototype::pressStateChanged(bool pressed,bool animate) diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/src/calenmonthgrid.cpp --- a/calendarui/views/src/calenmonthgrid.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/src/calenmonthgrid.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -16,14 +16,13 @@ */ // System includes -#include -#include -#include -#include #include #include #include #include +#include +#include +#include // User includes #include "calenmonthgrid.h" @@ -32,10 +31,13 @@ #include "calenmonthview.h" #include "calendateutils.h" #include "calencommon.h" +#include "calenconstants.h" // Constants -#define SCROLL_SPEEED 1000 +#define SCROLL_SPEEED 3000 #define GRIDLINE_WIDTH 0.075 //units +#define MAX_PAN_DIRECTION_THRESHOLD 50 +#define MIN_PAN_DIRECTION_THRESHOLD 20 /*! \class CalenMonthGrid @@ -53,7 +55,7 @@ mIsPanGesture(false), mIsAtomicScroll(true), mView(NULL), - mCurrentRow(0), + mCurrentRow(-100), mIsNonActiveDayFocused(false), mIgnoreItemActivated(false), mGridBorderColor(Qt::gray) @@ -66,33 +68,30 @@ setSelectionMode(HbGridView::NoSelection); setUniformItemSizes(true); setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAlwaysOff); - setClampingStyle(HbScrollArea::StrictClamping ); + setClampingStyle(HbScrollArea::StrictClamping); + setEnabledAnimations(HbAbstractItemView::None); + setFrictionEnabled(false); + setFlag(QGraphicsItem::ItemHasNoContents, false); + resetTransform(); // Get the content widget of the scroll area to draw the grid lines mContentWidget = contentWidget(); - // Get the color of the grid lines + // Get the all required colors + // Color of the grid lines mGridLineColor = HbColorScheme::color("qtc_cal_grid_line"); - // Create the prototype - CalenGridItemPrototype* gridItemPrototype = new CalenGridItemPrototype(this); - // Create the model - mModel = new QStandardItemModel(14*KCalenDaysInWeek, 1, this); - // Set the mode and the prototype - setModel(mModel,gridItemPrototype); + // Get the localised dates well before + // TODO: Need to update the mLocalisedDates when user changes the + // phone language keeping calendar application in background + HbExtendedLocale locale = HbExtendedLocale::system(); + for (int i = 1; i <= 31; i++) { + mLocalisedDates.append(locale.toString(i)); + } - // Register the widgetml and css files - HbStyleLoader::registerFilePath(":/"); - - // Set the layout name - setLayoutName("calendarCustomGridItem"); - + // Connect to scrolling finished signal connect(this, SIGNAL(scrollingEnded()), this, SLOT(scrollingFinished())); - - // Connect to item activated signal - connect(this, SIGNAL(activated(const QModelIndex &)), this, - SLOT(itemActivated(const QModelIndex &))); } /*! @@ -100,6 +99,7 @@ */ CalenMonthGrid::~CalenMonthGrid() { + // Nothing Yet } /*! @@ -114,55 +114,66 @@ Updates the model with the proper dates and sets the required user roles */ void CalenMonthGrid::updateMonthGridModel(QList &monthDataArray, - int indexToBeScrolled) + int indexToBeScrolled, bool isFirstTime) { - // Check the counts - int dataCount = monthDataArray.count(); - int rowCount = mModel->rowCount(); - int countDiff = dataCount - rowCount; - if (countDiff < 0) { - // Delete extra rows in the model - mModel->removeRows(dataCount,abs(countDiff)); - } else if (countDiff > 0) { - // Add the necessary number of rows - mModel->insertRows(rowCount,countDiff); + int loopStart = 0; + int loopEnd = monthDataArray.count(); + if (isFirstTime) { + // Create the model with only 42 items as visible to the user + mModel = new QStandardItemModel(KCalenDaysInWeek * KNumOfVisibleRows, + 1, this); + loopStart = (mView->rowsInPrevMonth()) * KCalenDaysInWeek; + loopEnd = loopStart + (KCalenDaysInWeek * KNumOfVisibleRows); + } else { + // Block the signals generated by model, this is being done as + // we want to avoid the overload of view listening to signals + mModel->blockSignals(true); + + // Check the counts + int dataCount = monthDataArray.count(); + int rowCount = mModel->rowCount(); + int countDiff = dataCount - rowCount; + if (countDiff < 0) { + // Delete extra rows in the model + mModel->removeRows(dataCount,abs(countDiff)); + } else if (countDiff > 0) { + // Add the necessary number of rows + mModel->insertRows(rowCount,countDiff); + } + loopEnd = dataCount; } + QDateTime currDate = mView->getCurrentDay(); QDateTime currDateTime = CalenDateUtils::beginningOfDay(currDate); QDateTime activeDay = mView->getActiveDay(); QDateTime activeDateTime = CalenDateUtils::beginningOfDay(activeDay); QModelIndex currentIndex; - - // Get the default text color to be set - QColor textColor = HbColorScheme::color("qtc_cal_month_notactive_dates"); - HbExtendedLocale locale = HbExtendedLocale::system(); - for (int i = 0; i < dataCount; i++) { + int modelIndex = 0; + for (int i = loopStart; i < loopEnd; i++) { QDateTime dateTime = monthDataArray[i].Day(); - currentIndex = mModel->index(i, 0); - // Get the localised string for the day - QString date = locale.toString(dateTime.date().day()); + currentIndex = mModel->index(modelIndex++, 0); // Create the variant list to contain the date to depict a grid item QVariantList itemData; - // NOTE: Add the data in the order mentioned in the + // !!!NOTE!!!: Add the data in the order mentioned in the // CalendarNamespace::DataRole enum. Dont change the order. - itemData << date; + itemData << mLocalisedDates.at(dateTime.date().day()-1); // Check for active day if (activeDateTime == CalenDateUtils::beginningOfDay(dateTime)) { - mCurrentRow = currentIndex.row(); - // Set the focus icon - itemData << QString("qtg_fr_cal_focused_day_ind"); + mCurrentRow = i; + // Set the focus attribute to true + itemData << true; } else { // reset the highlight - itemData << QString(""); + itemData << false; } // Check for current day if (currDateTime == CalenDateUtils::beginningOfDay(dateTime)) { - // Set the underline icon + // Set the underline attribute to true itemData << true; } else { itemData << false; @@ -170,61 +181,166 @@ // Check for events if (monthDataArray[i].HasEvents()) { - // Set the underline icon - itemData << QString("qtg_graf_cal_event_ind"); + // Set the event indicator attribute + itemData << true; } else { - itemData << QString(""); + itemData << false; } // Add default text color - itemData << textColor; + if (monthDataArray[i].isActive()) { + itemData << true; + } else { + itemData << false; + } mModel->itemFromIndex(currentIndex)->setData(itemData); } + + if (isFirstTime) { + // Color of the today indicator + QColor todayIndColor = HbColorScheme::color("qtc_cal_month_current_day"); + // Color of the active dates + QColor mActiveTextColor = + HbColorScheme::color("qtc_cal_month_active_dates"); + // Color of the inactive dates + QColor mInActiveTextColor = + HbColorScheme::color("qtc_cal_month_notactive_dates"); + + // Create the prototype + CalenGridItemPrototype* gridItemPrototype = new CalenGridItemPrototype( + todayIndColor, mActiveTextColor, mInActiveTextColor, this); + + // Set the mode and the prototype + setModel(mModel,gridItemPrototype); + + // Register the widgetml and css files + HbStyleLoader::registerFilePath(":/"); + + // Set the layout name + setLayoutName("calendarCustomGridItem"); + } else { + // Since, we have finished setData, Now unblock the signals + mModel->blockSignals(false); + + // Since till now, we had blocked signals being generated frm the mode + // view will be unaware of the items that we added. Hence, inform the view + // explicitly in one shot + QModelIndex leftIndex = mModel->index(0, 0); + QModelIndex rightIndex = mModel->index(loopEnd-1, 0); + dataChanged(leftIndex, rightIndex); + + // NOTE: To make sure that we always display proper month, + // two calls have been made to scrollTo(), one with top + // visible item and other with bottom visible item + // Calculate the first visible item in the grid + QModelIndex firstVisibleIndex = mModel->index(indexToBeScrolled - + (KNumOfVisibleRows * KCalenDaysInWeek - 1), 0); + scrollTo(firstVisibleIndex); + + + // Calculate the last visible item in the grid + QModelIndex lastVisibleIndex = mModel->index(indexToBeScrolled, 0); + scrollTo(lastVisibleIndex); + } mMonthDataArray = monthDataArray; - - // Get the active month - QDateTime activeDate = mView->getActiveDay(); - // Set the text color properly - setActiveDates(activeDate.date()); - - // NOTE: To make sure that we always display proper month, - // two calls have been made to scrollTo(), one with top - // visible item and other with bottom visible item - // Calculate the first visible item in the grid - QModelIndex firstVisibleIndex = mModel->index(indexToBeScrolled - - (KNumOfVisibleRows * KCalenDaysInWeek - 1), 0); - scrollTo(firstVisibleIndex); - - - // Calculate the last visible item in the grid - QModelIndex lastVisibleIndex = mModel->index(indexToBeScrolled, 0); - scrollTo(lastVisibleIndex); } /*! - Listens for down gesture + Updates the view with jprevious month dates when calendar is opened for the + first time to improve the opening time */ -void CalenMonthGrid::downGesture (int value) -{ - Q_UNUSED(value) - mDirection = down; - // Before we start scrolling, setthe active text color to previous month - QDateTime activeDate = mView->getActiveDay(); - setActiveDates(activeDate.addMonths(-1).date()); - HbScrollArea::downGesture(SCROLL_SPEEED); +void CalenMonthGrid::updateMonthGridWithInActiveMonths( + QList &monthDataArray) +{ + mMonthDataArray = monthDataArray; + + // Prepend the required rows + handlePrependingRows(monthDataArray); + + // Append the required rows + handleAppendingRows(monthDataArray); + + int rowsInPrevMonth = mView->rowsInPrevMonth(); + + // Calculate the proper index to be scrolled to + int itemToBeScrolled = rowsInPrevMonth * KCalenDaysInWeek; + QModelIndex indexToBeScrolled = mModel->index(itemToBeScrolled, 0); + mIsAtomicScroll = true; + scrollTo(indexToBeScrolled); + + // Scroll to proper index + itemToBeScrolled = ((rowsInPrevMonth + KNumOfVisibleRows) * + KCalenDaysInWeek) - 1; + indexToBeScrolled = mModel->index(itemToBeScrolled, 0); + mIsAtomicScroll = true; + scrollTo(indexToBeScrolled); + + // Update the sart position of the content widget + mStartPos = mContentWidget->pos(); + + // Now connect to the signal which gets emitted when any item on the grid + // is tapped. + connect(this, SIGNAL(activated(const QModelIndex &)), this, + SLOT(itemActivated(const QModelIndex &))); } /*! - Listens for Up gesture + Updates the view with just event indicators */ -void CalenMonthGrid::upGesture (int value) +void CalenMonthGrid::updateMonthGridWithEventIndicators( + QList &monthDataArray) +{ + mMonthDataArray = monthDataArray; + for(int i = 0; i < monthDataArray.count(); i++) { + // Check if the day has events + if (monthDataArray[i].HasEvents()) { + QModelIndex itemIndex = mModel->index(i,0); + QVariant itemData = itemIndex.data(Qt::UserRole + 1); + QVariantList list = itemData.toList(); + list.replace(CalendarNamespace::CalendarMonthEventRole, true); + mModel->itemFromIndex(itemIndex)->setData(list); + } + } +} + +/*! + Scrolls the content dowmwards + */ +void CalenMonthGrid::downGesture() { - Q_UNUSED(value) - mDirection = up; - // Before we start scrolling, setthe active text color to future month - QDateTime activeDate = mView->getActiveDay(); - setActiveDates(activeDate.addMonths(1).date()); - HbScrollArea::upGesture(SCROLL_SPEEED); + // Make sure that content widget is properly placed + if (mIsNonActiveDayFocused) { + mIsAtomicScroll = true; + int itemToBeScrolled = mView->rowsInPrevMonth() * KCalenDaysInWeek; + QModelIndex indexToBeScrolled = mModel->index(itemToBeScrolled, 0); + scrollTo(indexToBeScrolled); + } + mDirection = down; + mIsAtomicScroll = false; + setAttribute(Hb::InteractionDisabled); + QPointF targetPos(0.0, 0.0); + scrollContentsTo(targetPos,500); +} + +/*! + Scrolls the content upwards + */ +void CalenMonthGrid::upGesture() +{ + // Make sure that content widget is properly placed + if (mIsNonActiveDayFocused) { + mIsAtomicScroll = true; + int itemToBeScrolled = mView->rowsInPrevMonth() * KCalenDaysInWeek; + itemToBeScrolled += KNumOfVisibleRows * KCalenDaysInWeek; + QModelIndex indexToBeScrolled = mModel->index(itemToBeScrolled, 0); + scrollTo(indexToBeScrolled); + } + mDirection = up; + mIsAtomicScroll = false; + setAttribute(Hb::InteractionDisabled); + QPointF targetPos(0.0, mStartPos.y() - size().height()); + scrollContentsTo(-targetPos,500); + } /*! @@ -232,7 +348,6 @@ */ void CalenMonthGrid::mousePressEvent(QGraphicsSceneMouseEvent* event) { - mPressedPos = event->pos(); // Pass it to parent HbGridView::mousePressEvent(event); } @@ -242,43 +357,88 @@ */ void CalenMonthGrid::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) { - int posDiff = mPressedPos.y() - event->pos().y(); - if (posDiff < -50) { - mDirection = down; - } else if (posDiff > 50){ - mDirection = up; + // Pass it grid view if pan gesture is not in progress else pass it to + // scrollarea. Problem here is, if we pass to gridview when panning, then + // its emitting item activated signal simply becasue of which focus item + // is getting changed when you finish the pan / shake + if (!mIsPanGesture) { + HbGridView::mouseReleaseEvent(event); + } else { + HbScrollArea::mouseReleaseEvent(event); } - // Pass it to parent - HbGridView::mouseReleaseEvent(event); } /*! - Listens for pan gesture + Function to list for all the gesture events */ -void CalenMonthGrid::panGesture(const QPointF & delta) +void CalenMonthGrid::gestureEvent(QGestureEvent *event) { - if (!mIsPanGesture) { - mIsPanGesture = true; - mIgnoreItemActivated = true; - - // Get to know the direction of the gesture - if (delta.y() > 0) { - mDirection = down; - } else { - mDirection = up; - } - } else { // This case is when user changes the direction while panning - // without lifting the finger - // Check if direction has changed - if (((delta.y() > 0) && (mDirection == up)) - || ((delta.y() < 0) && (mDirection == down))) { - // Direction has changed, ignore this pan - return; - } - } - // Call the parent class to perform the pan gesture - // When scrolling finished, month grid will adjust to show the proper month - HbScrollArea::panGesture(delta); + if(HbPanGesture *gesture = qobject_cast(event->gesture(Qt::PanGesture))) { + if (gesture->state() == Qt::GestureStarted) { + setAttribute(Hb::InteractionDisabled); + mIsAtomicScroll = false; + if (!mIsPanGesture) { + mDirection = invalid; + mStartPos = mContentWidget->pos(); + // TODO: This work aroung till framework provides an api + // to know the direciton of the pan, until then we need + // calculate the direction explicitly + // Get to know the direction of the gesture + // Use our defined threshold temporarily till scrollarea + // frm orbit side is made clever enough not to scroll in other direction + // apart frm the registered scroll direction + QPointF delta = gesture->delta(); + if (abs(delta.x()) > MAX_PAN_DIRECTION_THRESHOLD) { + // Now see if y coord diff has crossed threshold + if (delta.y() > MAX_PAN_DIRECTION_THRESHOLD) { + mIsPanGesture = true; + mIgnoreItemActivated = true; + mDirection = down; + } else if (delta.y() < -MAX_PAN_DIRECTION_THRESHOLD){ + mIsPanGesture = true; + mIgnoreItemActivated = true; + mDirection = up; + } else { + event->accept(Qt::PanGesture); + return; + } + } else if (abs(delta.x()) < MAX_PAN_DIRECTION_THRESHOLD) { + if (delta.y() > MIN_PAN_DIRECTION_THRESHOLD) { + mIsPanGesture = true; + mIgnoreItemActivated = true; + mDirection = down; + } else if (delta.y() < -MIN_PAN_DIRECTION_THRESHOLD){ + mIsPanGesture = true; + mIgnoreItemActivated = true; + mDirection = up; + }else { + event->accept(Qt::PanGesture); + return; + } + } + } + } + } else if(HbSwipeGesture *gesture = qobject_cast(event->gesture(Qt::SwipeGesture))) { + if (gesture->state() == Qt::GestureStarted) { + setAttribute(Hb::InteractionDisabled); + mIsAtomicScroll = false; + mDirection = invalid; + if (gesture->sceneVerticalDirection() == QSwipeGesture::Down) { + mDirection = down; + } else if (gesture->sceneVerticalDirection() == QSwipeGesture::Up) { + mDirection = up; + } else { + event->accept(Qt::SwipeGesture); + return; + } + } + } + + if (mDirection!= invalid) { + // Call the parent class to perform the pan gesture + // When scrolling finished, month grid will adjust to show the proper month + HbScrollArea::gestureEvent(event); + } } /*! @@ -286,42 +446,100 @@ */ void CalenMonthGrid::scrollingFinished() { - if (mIsPanGesture) { - mIsPanGesture = false; - if (mDirection == up) { - // Make a request for upgesture - upGesture(SCROLL_SPEEED); - return; // return immediately - } else if (mDirection == down) { - // Make a request for upgesture - downGesture(SCROLL_SPEEED); - return; // return immediately + handlePanGestureFinished(); + } else if(!mIsAtomicScroll) { + QDateTime activeDate = mView->getActiveDay(); + if(mDirection == down) { // down gesture + if (!mIsNonActiveDayFocused) { + setActiveDates(activeDate.addMonths(-1).date()); + } + prependRows(); + } else if (mDirection == up) { //up gesture + if (!mIsNonActiveDayFocused) { + setActiveDates(activeDate.addMonths(1).date()); + } + appendRows(); } - } else if(!mIsAtomicScroll) { - // Before we do anything, set the focus to proper date - // Set it only when non active day was focussed. When inactive day - // was focussed, we need to focus the same day - if (!mIsNonActiveDayFocused) { - setFocusToProperDay(); - } - // To improve the performance, lets start the timer for 10 ms, - // return immediately and do the other things after that - QTimer::singleShot(10, this, SLOT(timerExpired())); + mDirection = invalid; } else { mIsAtomicScroll = false; + mDirection = invalid; } mIgnoreItemActivated = false; + setAttribute(Hb::InteractionDisabled, false); } -void CalenMonthGrid::timerExpired() +/*! + Function to handle completion of pan gesture + */ +void CalenMonthGrid::handlePanGestureFinished() { - if(mDirection == down) { // down gesture - prependRows(); - } else if (mDirection == up) { //up gesture - appendRows(); + mIsPanGesture = false; + // Get the first item that is visible + QList list = visibleItems(); + HbAbstractViewItem* item = list[0]; + QModelIndex modelIndex = item->modelIndex(); + + // Get the date which is visible at the above row + QDateTime date = mMonthDataArray[modelIndex.row()].Day(); + + // Check if this date belong to current active month or + // previous month else future month + QDateTime activeMonth = mView->getActiveDay(); + QDateTime prevMonth = activeMonth.addMonths(-1); + QDateTime nextMonth = activeMonth.addMonths(1); + int month = date.date().month(); + if (month == activeMonth.date().month()) { + // Then pan is completed on current month + // Check if the date is more than half of the current month or it is + // more than or equal to half of the future month + if (date.date().day() > (activeMonth.date().daysInMonth()) / 2 || + date.addDays(KNumOfVisibleRows*KCalenDaysInWeek).date().day() >= + (prevMonth.date().daysInMonth()) / 2) { + // up gesture to bring the next month + upGesture(); + } else { + // we should again show the current month by scrolling downwards + mDirection = down; + mIsAtomicScroll = true; + setAttribute(Hb::InteractionDisabled); + scrollContentsTo(-mStartPos,500); + } + } else if (month == prevMonth.date().month()) { + // first visible item belongs to previous month + // Check if the date is more than half of the previous month + if (date.date().day() > (prevMonth.date().daysInMonth()) / 2) { + // we should again show the current month by scrolling upwards + mDirection = up; + mIsAtomicScroll = true; + setAttribute(Hb::InteractionDisabled); + scrollContentsTo(-mStartPos,500); + } else { + // down gesture to show the previous month + downGesture(); + } + } else if (month == prevMonth.addMonths(-1).date().month()) { + // first visible date belong to previous to previous month + // hence, scroll down to bring the previous month + downGesture(); + } else if (month == nextMonth.date().month()) { + // first visible item belongs to next month + // Check if the date is more than half of the next month + if (date.date().day() > (nextMonth.date().daysInMonth()) / 2) { + // up gesture to bring the next month + upGesture(); + } else { + // we should again show the current month by scrolling upwards + mDirection = invalid; + setAttribute(Hb::InteractionDisabled); + scrollContentsTo(-mStartPos,500); + } + } else if (month == nextMonth.addMonths(1).date().month()) { + // first visible date belongs to next to next month + // hence, scroll up to show the next month + upGesture(); } - mDirection = invalid; } /*! @@ -330,43 +548,84 @@ */ void CalenMonthGrid::prependRows() { + // Before we do anything, set the focus to proper date + // Set it only when non active day was focussed. When inactive day + // was focussed, we need to focus the same day + if (!mIsNonActiveDayFocused) { + setFocusToProperDay(); + } + + // Block the signals generated by model, this is being done as + // we want to avoid the overload of view listening to signals + mModel->blockSignals(true); + mIsNonActiveDayFocused = false; - QDateTime currDate = mView->getCurrentDay(); - QDateTime currDateTime = CalenDateUtils::beginningOfDay( currDate ); + int rowsInFutMonthEarlier = mView->rowsInFutMonth(); int rowsInPrevMonthEarlier = mView->rowsInPrevMonth(); + // remove the cells in the future month + int deleteFromIndex = (rowsInPrevMonthEarlier + KNumOfVisibleRows) * KCalenDaysInWeek; + int numOfIndices = rowsInFutMonthEarlier * KCalenDaysInWeek; + // Get the updated dates from the view mView->updateModelWithPrevMonth(); QList monthDataList = mView->monthDataList(); mMonthDataArray = monthDataList; - int listCount = monthDataList.count(); - // Get the updated rows to be inserted - int rowsInPrevMonth = mView->rowsInPrevMonth(); - int rowsInFutMonth = mView->rowsInFutMonth(); + + // Prepend the required rows + handlePrependingRows(monthDataList); + + // Since, we have finished setData, Now unblock the signals + mModel->blockSignals(false); - // remove the cells in the future month - int deleteFromIndex = (rowsInPrevMonthEarlier + KNumOfVisibleRows) * KCalenDaysInWeek; - int numOfIndices = rowsInFutMonthEarlier * KCalenDaysInWeek; - int count = mModel->rowCount(); + int rowsInPrevMonth = mView->rowsInPrevMonth(); + int countToBeAdded = rowsInPrevMonth * KCalenDaysInWeek; + + // Since till now, we had blocked signals being generated frm the model + // view will be unaware of the items that we added. Hence, inform the view + // explicitly in one shot + QModelIndex leftIndex = mModel->index(0, 0); + QModelIndex rightIndex = mModel->index(countToBeAdded-1, 0); + dataChanged(leftIndex, rightIndex); + + // Now remove the necessary items frm the model + mModel->removeRows(deleteFromIndex+countToBeAdded, numOfIndices); + mIsAtomicScroll = true; + int itemToBeScrolled = rowsInPrevMonth * KCalenDaysInWeek; + QModelIndex indexToBeScrolled = mModel->index(itemToBeScrolled, 0); + scrollTo(indexToBeScrolled); - count = mModel->rowCount(); + // Scroll to proper index + itemToBeScrolled = ((rowsInPrevMonth + KNumOfVisibleRows) * + KCalenDaysInWeek) - 1; + indexToBeScrolled = mModel->index(itemToBeScrolled, 0); + mIsAtomicScroll = true; + scrollTo(indexToBeScrolled); + // Update the mCurrentRow + mCurrentRow += countToBeAdded; + // Update the sart position of the content widget + mStartPos = mContentWidget->pos(); +} + +/*! + Helper function that prepends the required rows to the model + */ +void CalenMonthGrid::handlePrependingRows(QList &monthDataList) +{ + QDateTime currDate = mView->getCurrentDay(); + QDateTime currDateTime = CalenDateUtils::beginningOfDay( currDate ); + int rowsInPrevMonth = mView->rowsInPrevMonth(); // Add the new days int countToBeAdded = rowsInPrevMonth * KCalenDaysInWeek; mModel->insertRows(0, countToBeAdded); - count = mModel->rowCount(); - - // Get the default text color to be set - QColor textColor = HbColorScheme::color("qtc_cal_month_notactive_dates"); - HbExtendedLocale locale = HbExtendedLocale::system(); for (int i = 0; i < countToBeAdded; i++) { QDateTime dateTime = monthDataList[i].Day(); // Get the localised string for the day - QString date = locale.toString(dateTime.date().day()); QModelIndex currentIndex = mModel->index(i, 0); // Create the variant list to contain the date to depict a grid item @@ -374,14 +633,14 @@ // NOTE: Add the data in the order mentioned in the // CalendarNamespace::DataRole enum. Dont change the order. - itemData << date; + itemData << mLocalisedDates.at(dateTime.date().day()-1);; - // Diable the focus role - itemData << QString(""); + // Disable the focus role + itemData << false; // Check for current day if (currDateTime == CalenDateUtils::beginningOfDay( dateTime )) { - // Set the underline icon + // Set the underline icon attribute itemData << true; } else { itemData << false; @@ -389,39 +648,18 @@ // Update the event indicators if (monthDataList[i].HasEvents()) { - // Set the event indicator icon - itemData << QString("qtg_graf_cal_event_ind"); + // Set the event indicator attribute + itemData << true; } else { - itemData << QString(""); + itemData << false; } // Add default text color - - itemData << textColor; + itemData << false; // Set the data to model mModel->itemFromIndex(currentIndex)->setData(itemData); } - - // Update the mCurrentRow - mCurrentRow += countToBeAdded; - // Scroll to proper index - int itemToBeScrolled = ((rowsInPrevMonth + KNumOfVisibleRows) * - KCalenDaysInWeek) - 1; - QModelIndex indexToBeScrolled = mModel->index(itemToBeScrolled, 0); - QMap data; - data = mModel->itemData(indexToBeScrolled); - QVariant value = data.value(Qt::DisplayRole); - int date = value.toInt(); - mIsAtomicScroll = true; - scrollTo(indexToBeScrolled); - - // Now remove the necessary items frm the model - mModel->removeRows(deleteFromIndex+countToBeAdded, numOfIndices); - mIsAtomicScroll = true; - itemToBeScrolled = rowsInPrevMonth * KCalenDaysInWeek; - indexToBeScrolled = mModel->index(itemToBeScrolled, 0); - scrollTo(indexToBeScrolled); } /*! @@ -430,9 +668,19 @@ */ void CalenMonthGrid::appendRows() { + // Before we do anything, set the focus to proper date + // Set it only when non active day was focussed. When inactive day + // was focussed, we need to focus the same day + if (!mIsNonActiveDayFocused) { + setFocusToProperDay(); + } + + // Block the signals generated by model, this is being done as + // we want to avoid the overload of view listening to signals + mModel->blockSignals(true); + mIsNonActiveDayFocused = false; - QDateTime currDate = mView->getCurrentDay(); - QDateTime currDateTime = CalenDateUtils::beginningOfDay( currDate ); + int rowsInFutMonth = mView->rowsInFutMonth(); int rowsInPrevMonth = mView->rowsInPrevMonth(); // remove the cells in the previous month @@ -442,40 +690,80 @@ mView->updateModelWithFutureMonth(); QList monthDataList = mView->monthDataList(); mMonthDataArray = monthDataList; - // Get the updated rows to be inserted + + // Get the model count before we add any rows into the mode + int rowCount = mModel->rowCount(); + // Append the required rows + handleAppendingRows(monthDataList); + + // Since, we have finished setData, Now unblock the signals + mModel->blockSignals(false); + + // Since till now, we had blocked signals being generated frm the mode + // view will be unaware of the items that we added. Hence, inform the view + // explicitly in one shot + QModelIndex leftIndex = mModel->index(rowCount-1, 0); + QModelIndex rightIndex = mModel->index(mModel->rowCount()-1, 0); + dataChanged(leftIndex, rightIndex); + + // Update the mCurrentRow + mCurrentRow -= (countToBeDeleted); + for (int i = 0; i < countToBeDeleted; i++) { + mModel->removeRow(0); + } + + mIsAtomicScroll = true; + + rowsInFutMonth = mView->rowsInFutMonth(); rowsInPrevMonth = mView->rowsInPrevMonth(); - rowsInFutMonth = mView->rowsInFutMonth(); + + // Calculate the proper index to be scrolled to + int itemToBeScrolled = rowsInPrevMonth * KCalenDaysInWeek; + QModelIndex indexToBeScrolled = mModel->index(itemToBeScrolled, 0); + scrollTo(indexToBeScrolled); + + itemToBeScrolled = ((rowsInPrevMonth + KNumOfVisibleRows) * + KCalenDaysInWeek) - 1; + indexToBeScrolled = mModel->index(itemToBeScrolled, 0); + mIsAtomicScroll = true; + scrollTo(indexToBeScrolled); + + // Update the sart position of the content widget + mStartPos = mContentWidget->pos(); +} + +/*! + Helper function that appends the required rows to the model + */ +void CalenMonthGrid::handleAppendingRows(QList &monthDataList) +{ + QDateTime currDate = mView->getCurrentDay(); + QDateTime currDateTime = CalenDateUtils::beginningOfDay( currDate ); + int rowsInFutMonth = mView->rowsInFutMonth(); int countToBeAdded = rowsInFutMonth * KCalenDaysInWeek; int lastVisibleIndex = monthDataList.count() - countToBeAdded; int rowCount = mModel->rowCount(); mModel->insertRows(rowCount, countToBeAdded); - // Get the default text color to be set - QColor textColor = HbColorScheme::color("qtc_cal_month_notactive_dates"); for (int i = 0; i < countToBeAdded; i++) { - QMap data; QModelIndex currentIndex = mModel->index(rowCount + i, 0); QDateTime dateTime = monthDataList[lastVisibleIndex + i].Day(); - HbExtendedLocale locale = HbExtendedLocale::system(); - // Get the localised string for the day - QString date = locale.toString(dateTime.date().day()); - data.insert(CalendarNamespace::CalendarMonthDayRole, date); // Create the variant list to contain the date to depict a grid item QVariantList itemData; // NOTE: Add the data in the order mentioned in the // CalendarNamespace::DataRole enum. Dont change the order. - itemData << date; + itemData << mLocalisedDates.at(dateTime.date().day()-1);; // Disable the focus role - itemData << QString(""); + itemData << false; // Check for current day if (currDateTime == CalenDateUtils::beginningOfDay( dateTime )) { - // Set the underline icon + // Set the underline icon attribute itemData << true; } else { itemData << false; @@ -483,30 +771,18 @@ // Update the event indicators if (monthDataList[lastVisibleIndex + i].HasEvents()) { - // Set the underline icon - itemData << QString("qtg_graf_cal_event_ind"); + // Set the event indicator attribute + itemData << true; } else { - itemData << QString(""); + itemData << false; } // Add default text color - itemData << textColor; + itemData << false; // Set the data to model mModel->itemFromIndex(currentIndex)->setData(itemData); } - - // Update the mCurrentRow - mCurrentRow -= (countToBeDeleted); - for (int i = 0; i < countToBeDeleted; i++) { - mModel->removeRow(0); - } - mIsAtomicScroll = true; - - // Calculate the proper index to be scrolled to - int itemToBeScrolled = rowsInPrevMonth * KCalenDaysInWeek; - QModelIndex indexToBeScrolled = mModel->index(itemToBeScrolled, 0); - scrollTo(indexToBeScrolled); } /*! @@ -521,14 +797,18 @@ mIsNonActiveDayFocused = false; // Check if the same item has been tapped twice if (mCurrentRow == index.row()) { - // Launch the agenda view + // Launch the Day view mView->launchDayView(); } else { // Reset the focus attribute to this item QModelIndex itemIndex = mModel->index(mCurrentRow,0); + if(itemIndex.row() < 0 || itemIndex.row() >= mModel->rowCount() || + itemIndex.column() < 0 || itemIndex.column() > mModel->columnCount()) { + return; + } QVariant itemData = itemIndex.data(Qt::UserRole + 1); QVariantList list = itemData.toList(); - list.replace(CalendarNamespace::CalendarMonthFocusRole, QString("")); + list.replace(CalendarNamespace::CalendarMonthFocusRole, false); mModel->itemFromIndex(itemIndex)->setData(list); // Inform view to update the context and preview panes @@ -537,7 +817,7 @@ itemData = itemIndex.data(Qt::UserRole + 1); list = itemData.toList(); list.replace(CalendarNamespace::CalendarMonthFocusRole, - QString("qtg_fr_cal_focused_day_ind")); + true); mModel->itemFromIndex(itemIndex)->setData(list); // Check if inactive date is tapped QDateTime activeMonth = mView->getActiveDay(); @@ -547,17 +827,19 @@ mIsNonActiveDayFocused = true; mNonActiveFocusedDay = mMonthDataArray[mCurrentRow].Day(); - // Get the current active month - QDateTime activeMonth = mView->getActiveDay(); - // Add one month to it + // Add one month to active month activeMonth = activeMonth.addMonths(1); if (activeMonth.date().month() == mNonActiveFocusedDay.date().month()) { + mDirection = up; // up gesture - upGesture(SCROLL_SPEEED); + upGesture(); + setActiveDates(activeMonth.date()); } else { + mDirection = down; // down gesture - downGesture(SCROLL_SPEEED); + downGesture(); + setActiveDates(activeMonth.addMonths(-2).date()); } } mView->setContextForActiveDay(index.row()); @@ -588,7 +870,7 @@ QModelIndex index = mModel->index(mCurrentRow,0); QVariant itemData = index.data(Qt::UserRole + 1); QVariantList list = itemData.toList(); - list.replace(CalendarNamespace::CalendarMonthFocusRole, QString("")); + list.replace(CalendarNamespace::CalendarMonthFocusRole, false); mModel->itemFromIndex(index)->setData(list); // Search for this date in the model @@ -598,7 +880,7 @@ itemData = index.data(Qt::UserRole + 1); list = itemData.toList(); list.replace(CalendarNamespace::CalendarMonthFocusRole, - QString("qtg_fr_cal_focused_day_ind")); + true); mModel->itemFromIndex(index)->setData(list); mCurrentRow = i; mView->setContextForActiveDay(i); @@ -635,15 +917,12 @@ end = firstDateInGrid.daysTo(endOfActiveMonth); // Set the active text color - QColor textColor = HbColorScheme::color("qtc_cal_month_active_dates"); - if (textColor.isValid()) { - for (int i = start; i < end; i++) { - QModelIndex index = mModel->index(i,0); - QVariant itemData = index.data(Qt::UserRole + 1); - QVariantList list = itemData.toList(); - list.replace(CalendarNamespace::CalendarMonthTextColorRole, textColor); - mModel->itemFromIndex(index)->setData(list); - } + for (int i = start; i < end; i++) { + QModelIndex index = mModel->index(i,0); + QVariant itemData = index.data(Qt::UserRole + 1); + QVariantList list = itemData.toList(); + list.replace(CalendarNamespace::CalendarMonthTextColorRole, true); + mModel->itemFromIndex(index)->setData(list); } // Now set the inactive text color to those which were active before the swipe @@ -683,15 +962,12 @@ } // Set the inactive text color - textColor = HbColorScheme::color("qtc_cal_month_notactive_dates"); - if (textColor.isValid()) { - for (int i = start; i < end; i++) { - QModelIndex index = mModel->index(i,0); - QVariant itemData = index.data(Qt::UserRole + 1); - QVariantList list = itemData.toList(); - list.replace(CalendarNamespace::CalendarMonthTextColorRole, textColor); - mModel->itemFromIndex(index)->setData(list); - } + for (int i = start; i < end; i++) { + QModelIndex index = mModel->index(i,0); + QVariant itemData = index.data(Qt::UserRole + 1); + QVariantList list = itemData.toList(); + list.replace(CalendarNamespace::CalendarMonthTextColorRole, false); + mModel->itemFromIndex(index)->setData(list); } } @@ -719,6 +995,29 @@ Q_UNUSED(newOrientation) // We are overriding this function to avoid the default behavior of // hbgridview on orientation change as it swaps the row and column counts + // Calculate the proper index to be scrolled to + int rowsInPrevMonth; + int itemToBeScrolled; + QModelIndex indexToBeScrolled; + if (newOrientation == Qt::Horizontal) { + rowsInPrevMonth = mView->rowsInPrevMonth(); + itemToBeScrolled = rowsInPrevMonth * KCalenDaysInWeek; + indexToBeScrolled = mModel->index(itemToBeScrolled, 0); + mIsAtomicScroll = true; + scrollTo(indexToBeScrolled); + } else { + rowsInPrevMonth = mView->rowsInPrevMonth(); + itemToBeScrolled = rowsInPrevMonth * KCalenDaysInWeek; + indexToBeScrolled = mModel->index(itemToBeScrolled, 0); + mIsAtomicScroll = true; + scrollTo(indexToBeScrolled); + + itemToBeScrolled = ((rowsInPrevMonth + KNumOfVisibleRows) * + KCalenDaysInWeek) - 1; + indexToBeScrolled = mModel->index(itemToBeScrolled, 0); + mIsAtomicScroll = true; + scrollTo(indexToBeScrolled); + } } /*! @@ -730,29 +1029,51 @@ { Q_UNUSED(option); Q_UNUSED(widget); + painter->setRenderHint(QPainter::NonCosmeticDefaultPen); // Set the required attributes to the pen QPen pen; + HbDeviceProfile deviceProf; + qreal unitValue = deviceProf.unitValue(); + qreal widthInPixels = GRIDLINE_WIDTH * unitValue; pen.setStyle(Qt::SolidLine); - pen.setWidth(GRIDLINE_WIDTH); + pen.setWidth(widthInPixels); if (mGridLineColor.isValid()) { pen.setBrush(mGridLineColor); } else { pen.setBrush(mGridBorderColor); } - // Set the pen to the painter + //store the old pen first + QPen oldPen = painter->pen(); + // Set the new pen to the painter painter->setPen(pen); // Get the sizes of content widget qreal contentHeight = mContentWidget->size().height(); qreal contentWidth = mContentWidget->size().width(); + qreal rowWidth = 0.0; + int numOfRows = 0; + QPointF startPoint = mContentWidget->pos(); - // Get the num of rows - int numOfRows = mModel->rowCount() / KCalenDaysInWeek; - // Draw horizontal lines - qreal rowWidth = contentHeight / numOfRows; + // NOTE!!!: There is a filcker when we blindly draw equally spaced lines + // on complete content widget when scrolling is finished. This happens only + // when content widget size is changed due to the change in total number + // of rows when we append or prepend rows. Hence, to avoid this, we draw + // lines on complete content widget only when it is scrolling. + // That means, as soon as scrolling is finished, we will end up drawing + // only 6 lines that are visible to the user. + if (mDirection == invalid) { + // Start point is left most point on the screen + startPoint = QPointF(0,0); + rowWidth = size().height() / KNumOfVisibleRows; + numOfRows = KNumOfVisibleRows; + } else { + // Get the num of rows + numOfRows = mModel->rowCount() / KCalenDaysInWeek; + // Draw horizontal lines + rowWidth = contentHeight / numOfRows; + } - QPointF startPoint = mContentWidget->pos(); QPointF endPoint(startPoint.x() + contentWidth, startPoint.y()); @@ -780,6 +1101,8 @@ // Draw the lines for the points in the vector list painter->drawLines(pointList); + // Set the old pen back + painter->setPen(oldPen); } // End of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/src/calenmonthview.cpp --- a/calendarui/views/src/calenmonthview.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/src/calenmonthview.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -29,6 +29,8 @@ #include #include #include +#include // hbapplication +#include //Activity Manager //user includes #include "calenmonthview.h" @@ -46,8 +48,9 @@ #include "calendocloader.h" #include "calenthicklinesdrawer.h" #include "calencommon.h" -#include "CalendarInternalCRKeys.h" +#include "calendarprivatecrkeys.h" #include "calenpluginlabel.h" +#include "calenconstants.h" /*! \class CalenMonthView @@ -62,23 +65,26 @@ mGoToTodayAction(0), mPrevRegionalInfo(0), mCurrRegionalInfo(0), - mNextRegionalInfo(0) + mNextRegionalInfo(0), + mIsAboutToQuitEventConnected(false) { mIsWeekNumbersShown = 0; mOrientation = mServices.MainWindow().orientation(); // Read the date from the context - mDate = mServices.Context().focusDateAndTimeL(); + mDate = mServices.Context().focusDateAndTime(); mCurrentDay = mDate; // Create the settings manager instance and settings key for week number mSettingsManager = new XQSettingsManager(this); mWeekNumberCenrepKey = new XQSettingsKey(XQSettingsKey::TargetCentralRepository, - KCRUidCalendar.iUid, KCalendarWeekViewTitle); + KCRUidCalendar, KCalendarShowWeekNum); mLocale = HbExtendedLocale::system(); mFirstWeekLabel = NULL; mIsPrevPaneGesture = false; + // Get the week day color from the theme + mWeekDaysColor = HbColorScheme::color("qtc_cal_week_day"); } /*! @@ -100,7 +106,7 @@ mDocLoader->findWidget(CALEN_MONTH_TITLE)); // Set the title text color QColor monthTitleColor = HbColorScheme::color("qtc_cal_monthgrid_title"); - if (monthTitleColor.isValid()) { + if (mTitleLabel && monthTitleColor.isValid()) { mTitleLabel->setTextColor(monthTitleColor); } @@ -131,18 +137,6 @@ mSeventhDayLabel = qobject_cast ( mDocLoader->findWidget(CALEN_MONTVIEW_SEVENTH_DAY_LABEL)); - - // Set the short day names to these labels - // TODO: Need to read start of the week from the locale - // and update the labels accortdingly - int startOfDay = mLocale.startOfWeek(); - mFirstDayLabel->setPlainText(hbTrId("txt_calendar_grid_day_mo")); - mSecondDayLabel->setPlainText(hbTrId("txt_calendar_grid_day_tu")); - mThirdDayLabel->setPlainText(hbTrId("txt_calendar_grid_day_we")); - mFourthDayLabel->setPlainText(hbTrId("txt_calendar_grid_day_th")); - mFifthDayLabel->setPlainText(hbTrId("txt_calendar_grid_day_fr")); - mSixthDayLabel->setPlainText(hbTrId("txt_calendar_grid_day_sa")); - mSeventhDayLabel->setPlainText(hbTrId("txt_calendar_grid_day_su")); // Get the weeknumber widget mWeekNumberWidget @@ -209,22 +203,51 @@ mMonthGrid->setView(this); + + + mIsFirstTimeLoad = true; + // get a pointner to activity manager + HbActivityManager* activityManager = qobject_cast(qApp)->activityManager(); + + // clean up any previous versions of this activity, if any, i.e. activityName, from the activity manager. + // Ignore return value, first boot would always return False. bool declared + // only for debugging purpose. + bool ok = activityManager->removeActivity(activityName); + +} + +/*! + Constructs the remaining part of the month view that was kept as + part if lazy loading + */ +void CalenMonthView::doLazyLoading() +{ + // Add background items to all the widgets + addBackgroundFrame(); + + // Construct and add the previous month and next month items to the view + mMonthGrid->updateMonthGridWithInActiveMonths(mMonthDataArray); + + // Check if regional information needs to be shown + // and add it or remove it + showHideRegionalInformation(); + // Connect to the menu actions HbAction - *newEventAction = - qobject_cast ( + *newEventAction = + qobject_cast ( mDocLoader->findObject(CALEN_MONTVIEW_MENU_NEWEVENT)); connect(newEventAction, SIGNAL(triggered()), this, SLOT(createEditor())); mGoToTodayAction = - qobject_cast ( + qobject_cast ( mDocLoader->findObject(CALEN_MONTVIEW_MENU_GOTOTODAY)); connect(mGoToTodayAction, SIGNAL(triggered()), this, SLOT(goToToday())); HbAction - *goToDateAction = - qobject_cast ( + *goToDateAction = + qobject_cast ( mDocLoader->findObject(CALEN_MONTVIEW_MENU_GOTODATE)); connect(goToDateAction, SIGNAL(triggered()), this, SLOT(goToDate())); @@ -269,12 +292,7 @@ // Connect to the signal when options menu is shown // This is required to add/remove dynamically some options connect(menu(), SIGNAL(aboutToShow ()), this, - SLOT(addRemoveActionsInMenu())); - - mIsFirstTimeLoad = true; - - // Add background items to all the widgets - addBackgroundFrame(); + SLOT(addRemoveActionsInMenu())); } /*! @@ -303,7 +321,15 @@ = qobject_cast ( mDocLoader->findWidget(CALEN_MONTVIEW_SIXTH_WEEK_LABEL)); } - + + // Set the text colors well before instead of setting it again and again + mFirstWeekLabel->setTextColor(mWeekDaysColor); + mSecondWeekLabel->setTextColor(mWeekDaysColor); + mThirdWeekLabel->setTextColor(mWeekDaysColor); + mFourthWeekLabel->setTextColor(mWeekDaysColor); + mFifthWeekLabel->setTextColor(mWeekDaysColor); + mSixthWeekLabel->setTextColor(mWeekDaysColor); + // Calculate the week numbers and set them to the week labels updateWeekNumGridModel(); @@ -392,107 +418,121 @@ { // Set the background items for all the widgets HbFrameItem* frame = NULL; + HbFrameDrawer *drawer = NULL; HbWidget* monthViewExceptPreviewPane = qobject_cast ( mDocLoader->findWidget(CALEN_MONTHVIEW_EXCEPT_PANE)); if (monthViewExceptPreviewPane) { + drawer = new HbFrameDrawer("qtg_fr_cal_monthgrid_bg", HbFrameDrawer::NinePieces); // The grid background - frame = new HbFrameItem(this); - frame->frameDrawer().setFrameType(HbFrameDrawer::NinePieces); - - frame->frameDrawer().setFrameGraphicsName("qtg_fr_cal_monthgrid_bg"); + frame = new HbFrameItem(drawer, this); monthViewExceptPreviewPane->setBackgroundItem(frame->graphicsItem(), -2); } if (mTitleLabel) { // The month title - frame = new HbFrameItem(this); - frame->frameDrawer().setFrameType(HbFrameDrawer::ThreePiecesHorizontal); - - frame->frameDrawer().setFrameGraphicsName("qtg_fr_cal_monthgrid_title_bg"); - mTitleLabel->setBackgroundItem(frame->graphicsItem(), -2); + drawer = new HbFrameDrawer("qtg_fr_cal_monthgrid_title_bg", HbFrameDrawer::ThreePiecesHorizontal); + if (drawer) + frame = new HbFrameItem(drawer, this); + if(frame) + mTitleLabel->setBackgroundItem(frame->graphicsItem(), -2); } // Set the frame to the preview pane - frame = new HbFrameItem(this); - frame->frameDrawer().setFrameType(HbFrameDrawer::NinePieces); - - frame->frameDrawer().setFrameGraphicsName("qtg_fr_cal_preview_bg"); - mPrevPaneLayoutWidget->setBackgroundItem(frame->graphicsItem(), -5); + drawer = new HbFrameDrawer("qtg_fr_cal_preview_bg", HbFrameDrawer::NinePieces); + if (drawer) + frame = new HbFrameItem(drawer, this); + if(frame) + mPrevPaneLayoutWidget->setBackgroundItem(frame->graphicsItem(), -5); // Set the frame to the preview pane - frame = new HbFrameItem(this); - frame->frameDrawer().setFrameType(HbFrameDrawer::NinePieces); - - frame->frameDrawer().setFrameGraphicsName("qtg_fr_cal_preview_bg"); + drawer = new HbFrameDrawer("qtg_fr_cal_preview_bg", HbFrameDrawer::NinePieces); + if(drawer) + frame = new HbFrameItem(drawer, this); + if(frame) mCurrPaneLayoutWidget->setBackgroundItem(frame->graphicsItem(), -5); // Set the frame to the preview pane - frame = new HbFrameItem(this); - frame->frameDrawer().setFrameType(HbFrameDrawer::NinePieces); - - frame->frameDrawer().setFrameGraphicsName("qtg_fr_cal_preview_bg"); - mNextPaneLayoutWidget->setBackgroundItem(frame->graphicsItem(), -5); + drawer = new HbFrameDrawer("qtg_fr_cal_preview_bg", HbFrameDrawer::NinePieces); + if(drawer) + frame = new HbFrameItem(drawer, this); + if(frame) + mNextPaneLayoutWidget->setBackgroundItem(frame->graphicsItem(), -5); } void CalenMonthView::showHideRegionalInformation() { - XQSettingsKey regionalInfo(XQSettingsKey::TargetCentralRepository, - KCRUidCalendar.iUid, KShowRegionalInformation); - - int showRegionalInfo = mSettingsManager->readItemValue(regionalInfo).toUInt(); - if (showRegionalInfo) { - - // Add the regional information to the preview panes - if (!mPrevRegionalInfo) { - mPrevRegionalInfo = new CalenPluginLabel(mServices, this); - mPrevPaneLayout->insertItem(0, mPrevRegionalInfo); + if (pluginEnabled()) { + XQSettingsKey regionalInfo(XQSettingsKey::TargetCentralRepository, + KCRUidCalendar, KCalendarShowRegionalInfo); + + int showRegionalInfo = + mSettingsManager->readItemValue(regionalInfo).toUInt(); + if (showRegionalInfo) { + + // Add the regional information to the preview panes + if (!mPrevRegionalInfo) { + mPrevRegionalInfo = qobject_cast + (mDocLoader->findWidget(CALEN_PREVREGIONALINFO)); + mPrevRegionalInfo->show(); + mPrevPaneLayout->insertItem(0, mPrevRegionalInfo); - HbFrameItem *frameCurr = new HbFrameItem(this); - frameCurr->frameDrawer().setFrameType(HbFrameDrawer::ThreePiecesHorizontal); - frameCurr->frameDrawer().setFrameGraphicsName("qtg_fr_cal_preview_title_bg"); - mPrevRegionalInfo->setBackgroundItem(frameCurr->graphicsItem(), -2); - } - if (!mCurrRegionalInfo) { - mCurrRegionalInfo = new CalenPluginLabel(mServices, this); - mCurrPaneLayout->insertItem(0, mCurrRegionalInfo); - - HbFrameItem *frameCurr = new HbFrameItem(this); - frameCurr->frameDrawer().setFrameType(HbFrameDrawer::ThreePiecesHorizontal); - frameCurr->frameDrawer().setFrameGraphicsName("qtg_fr_cal_preview_title_bg"); - mCurrRegionalInfo->setBackgroundItem(frameCurr->graphicsItem(), -2); - } - if (!mNextRegionalInfo) { - mNextRegionalInfo = new CalenPluginLabel(mServices, this); - mNextPaneLayout->insertItem(0, mNextRegionalInfo); + HbFrameItem *frameCurr = new HbFrameItem(this); + frameCurr->frameDrawer().setFrameType( + HbFrameDrawer::ThreePiecesHorizontal); + frameCurr->frameDrawer().setFrameGraphicsName( + "qtg_fr_cal_preview_title_bg"); + mPrevRegionalInfo->setBackgroundItem( + frameCurr->graphicsItem(), -2); + } + if (!mCurrRegionalInfo) { + mCurrRegionalInfo = qobject_cast + (mDocLoader->findWidget(CALEN_CURRREGIONALINFO)); + mCurrRegionalInfo->show(); + mCurrPaneLayout->insertItem(0, mCurrRegionalInfo); - HbFrameItem *frameCurr = new HbFrameItem(this); - frameCurr->frameDrawer().setFrameType(HbFrameDrawer::ThreePiecesHorizontal); - frameCurr->frameDrawer().setFrameGraphicsName("qtg_fr_cal_preview_title_bg"); - mNextRegionalInfo->setBackgroundItem(frameCurr->graphicsItem(), -2); - } - - if (pluginEnabled()) { + HbFrameItem *frameCurr = new HbFrameItem(this); + frameCurr->frameDrawer().setFrameType( + HbFrameDrawer::ThreePiecesHorizontal); + frameCurr->frameDrawer().setFrameGraphicsName( + "qtg_fr_cal_preview_title_bg"); + mCurrRegionalInfo->setBackgroundItem( + frameCurr->graphicsItem(), -2); + } + if (!mNextRegionalInfo) { + mNextRegionalInfo = qobject_cast + (mDocLoader->findWidget(CALEN_NEXTREGIONALINFO)); + mNextRegionalInfo->show(); + mNextPaneLayout->insertItem(0, mNextRegionalInfo); + + HbFrameItem *frameCurr = new HbFrameItem(this); + frameCurr->frameDrawer().setFrameType( + HbFrameDrawer::ThreePiecesHorizontal); + frameCurr->frameDrawer().setFrameGraphicsName( + "qtg_fr_cal_preview_title_bg"); + mNextRegionalInfo->setBackgroundItem( + frameCurr->graphicsItem(), -2); + } QString *pluginString = pluginText(); mPrevRegionalInfo->setPlainText(*pluginString); mCurrRegionalInfo->setPlainText(*pluginString); mNextRegionalInfo->setPlainText(*pluginString); + } else { + if (mPrevRegionalInfo) { + mPrevPaneLayout->removeItem(mPrevRegionalInfo); + mPrevRegionalInfo->hide(); + mPrevRegionalInfo = NULL; + } + if (mCurrRegionalInfo) { + mPrevPaneLayout->removeItem(mCurrRegionalInfo); + mCurrRegionalInfo->hide(); + mCurrRegionalInfo = NULL; + } + if (mNextRegionalInfo) { + mPrevPaneLayout->removeItem(mNextRegionalInfo); + mNextRegionalInfo->hide(); + mNextRegionalInfo = NULL; + } } - } else { - if (mPrevRegionalInfo) { - mPrevPaneLayout->removeItem(mPrevRegionalInfo); - delete mPrevRegionalInfo; - mPrevRegionalInfo = NULL; - } - if (mCurrRegionalInfo) { - mPrevPaneLayout->removeItem(mCurrRegionalInfo); - delete mCurrRegionalInfo; - mCurrRegionalInfo = NULL; - } - if (mNextRegionalInfo) { - mPrevPaneLayout->removeItem(mNextRegionalInfo); - delete mNextRegionalInfo; - mNextRegionalInfo = NULL; - } - } + } } /*! @@ -529,29 +569,20 @@ long weekNumber(day.date().weekNumber()); mWeekNumbers.append(weekNumber); } - - // Get the week day color from the theme - QColor weekDayColor = HbColorScheme::color("qtc_cal_week_day"); // Update the week labels text QString text = QString::number(mWeekNumbers.at(0)); mFirstWeekLabel->setPlainText(text); - mFirstWeekLabel->setTextColor(weekDayColor); text = QString::number(mWeekNumbers.at(1)); mSecondWeekLabel->setPlainText(text); - mSecondWeekLabel->setTextColor(weekDayColor); text = QString::number(mWeekNumbers.at(2)); mThirdWeekLabel->setPlainText(text); - mThirdWeekLabel->setTextColor(weekDayColor); text = QString::number(mWeekNumbers.at(3)); mFourthWeekLabel->setPlainText(text); - mFourthWeekLabel->setTextColor(weekDayColor); text = QString::number(mWeekNumbers.at(4)); mFifthWeekLabel->setPlainText(text); - mFifthWeekLabel->setTextColor(weekDayColor); text = QString::number(mWeekNumbers.at(5)); mSixthWeekLabel->setPlainText(text); - mSixthWeekLabel->setTextColor(weekDayColor); } /*! @@ -560,24 +591,26 @@ void CalenMonthView::goToToday() { QDateTime today = CalenDateUtils::today(); + // Set the context and repopulate the view + MCalenContext &context = mServices.Context(); + context.setFocusDateAndTime(today); + // First check if we are not alread // showing today's month view if (mDate == today) { return; } else if (mActiveMonth.date().year() == today.date().year() && mActiveMonth.date().month() == today.date().month()) { + mDate = today; // User is in current month only, so just set the focus to current // date grid item and refresh the preview pane int currIndex = mFirstDayOfGrid.daysTo(today); setCurrGridIndex(currIndex); - return; + // Populate the preview panes + populatePreviewPane(mDate); + } else { + refreshViewOnGoToDate(); } - - // Set the context and repopulate the view - MCalenContext &context = mServices.Context(); - context.setFocusDateAndTimeL(today, KCalenMonthViewUidValue); - - refreshViewOnGoToDate(); } /* @@ -610,38 +643,62 @@ */ void CalenMonthView::doPopulation() { - if (!mIsFirstTimeLoad) { - Qt::Orientation orientation = mServices.MainWindow().orientation(); - if (mOrientation != orientation) { - mOrientation = orientation; - handleChangeOrientation(); - } + + // Get the layout and add the preview pane layout. + QGraphicsLinearLayout* viewLayout = static_cast + (widget()->layout()); + if (viewLayout->count() == 1) { + // Count is 1 implies view has only month grid. + // Add the preview pane at corresponding position. + viewLayout->addItem(mCurrPaneParent); } - mIsFirstTimeLoad = false; + // prepare for the population like reading the date frm the context // calculating the start of the grid etc., prepareForPopulation(); - - // fetch list of required calendar instances - populateWithInstanceView(); - - populatePreviewPane(mDate); - - // Create the grid items with proper dates + + // Populate the view and preview panes only if we are not opening the calendar + if (!mIsFirstTimeLoad) { + // fetch list of required calendar instances + populateWithInstanceView(); + // Populate the preview panes + populatePreviewPane(mDate); + } + + + //update the day label + //if changes in locale setting + updateDayLabel(); + + // Create the grid items with proper dates createGrid(); - // Check if regional information needs to be shown - // and add it or remove it - showHideRegionalInformation(); // Complete the population completePopulation(); + //set Currect Activity to month view + mActivityId = ECalenMonthView; + + // connect to receive a call back on Month View exit. Call back would result in saveActivity + // to be called in Native View. + if (!mIsAboutToQuitEventConnected) // check if not already connected + { + connect(qobject_cast(qApp), SIGNAL(aboutToQuit()), this, SLOT(saveActivity())); + mIsAboutToQuitEventConnected = true; + } + + // Population is complete, inform it populationComplete(); - // Start the auto scroll on current preview pane - mCurrPreviewPane->startAutoScroll(); + // Handle regional data here if we are not populating the month view for + // the first time + if (!mIsFirstTimeLoad) { + showHideRegionalInformation(); + } + // Reset the first time load flag + mIsFirstTimeLoad = false; } /*! @@ -651,6 +708,7 @@ { setActiveDay(dateFromContext(mServices.Context())); setDate(); + updateMonthDataArrayWithActiveDates(); } /*! @@ -658,18 +716,19 @@ */ void CalenMonthView::refreshViewOnGoToDate() { - setActiveDay(dateFromContext(mServices.Context())); - setDate(); + prepareForPopulation(); setDateToLabel(); // fetch list of required calendar instances populateWithInstanceView(); populatePreviewPane(mDate); - mMonthGrid->updateMonthGridModel(mMonthDataArray, mIndexToBeScrolled); - - // Start the auto scroll on current preview pane - mCurrPreviewPane->startAutoScroll(); + mMonthGrid->updateMonthGridModel(mMonthDataArray, mIndexToBeScrolled, + mIsFirstTimeLoad); + // Update the week Numbers model + if (mIsWeekNumbersShown) { + updateWeekNumGridModel(); + } } /*! @@ -680,13 +739,13 @@ QDateTime ret; if (AgendaEntry::TypeTodo == context.instanceId().mType) { QDateTime today = CalenDateUtils::today(); - if (context.focusDateAndTimeL() < today) { + if (context.focusDateAndTime() < today) { ret = today; } else { - ret = context.focusDateAndTimeL(); + ret = context.focusDateAndTime(); } } else { - ret = context.focusDateAndTimeL(); + ret = context.focusDateAndTime(); } return ret; } @@ -708,8 +767,6 @@ date.setDate(date.year(), date.month(), 1); QDateTime firstDayOfPrevMonth(date, day.time()); - // TODO: Need to consider the week start frm the locale object - TLocale locale; int offset(firstDayOfPrevMonth.date().dayOfWeek() - (mLocale.startOfWeek() + 1)); if (offset < 0) { @@ -804,11 +861,22 @@ void CalenMonthView::createGrid() { // Update the month grid - mMonthGrid->updateMonthGridModel(mMonthDataArray, mIndexToBeScrolled); - - // Read the week number setting from cenrep - QVariant value = mSettingsManager->readItemValue(*mWeekNumberCenrepKey); - mIsWeekNumbersShown = value.toUInt(); + mMonthGrid->updateMonthGridModel(mMonthDataArray, mIndexToBeScrolled, + mIsFirstTimeLoad); + // Get start of week from the locale. + HbExtendedLocale locale = HbExtendedLocale::system(); + int startOfWeek = locale.startOfWeek(); + if(startOfWeek != HbExtendedLocale::Monday) + { + //if the start of week is other than Monday, don't show the week number + mIsWeekNumbersShown = 0; + } + else + { + // Read the week number setting from cenrep + QVariant value = mSettingsManager->readItemValue(*mWeekNumberCenrepKey); + mIsWeekNumbersShown = value.toUInt(); + } if (mIsWeekNumbersShown) { // Add week numbers to week grid addWeekNumbers(); @@ -905,7 +973,7 @@ date.setDate(date.year(), date.month(), 1); // Get the first day of the future month QDateTime firstDayOfFutMonth(date, futureMonthDateTime.time()); - TLocale locale; + int offset = firstDayOfFutMonth.date().dayOfWeek() - (mLocale.startOfWeek() + 1); if (offset < 0) { @@ -1002,7 +1070,8 @@ void CalenMonthView::updateMonthDataArrayWithActiveDates() { int activeMonth = mActiveMonth.date().month(); - for (int i = 0; i < mMonthDataArray.count(); i++) { + int monthDataCount = mMonthDataArray.count(); + for (int i = 0; i < monthDataCount; i++) { if (mMonthDataArray[i].Day().date().month() == activeMonth) { // Set the active flag mMonthDataArray[i].setActive(true); @@ -1016,7 +1085,7 @@ /*! Fetches the calenda entries for a given range */ -void CalenMonthView::getInstanceList(QList &list, +void CalenMonthView::getInstanceList(QList &list, QDateTime rangeStart, QDateTime rangeEnd) { AgendaUtil::FilterFlags filter = @@ -1025,7 +1094,7 @@ | AgendaUtil::IncludeEvents | AgendaUtil::IncludeReminders | AgendaUtil::IncludeIncompletedTodos); - list = mAgendaUtil->fetchEntriesInRange(rangeStart, rangeEnd, filter); + mAgendaUtil->markDatesWithEvents(rangeStart, rangeEnd, filter, list); } /*! @@ -1040,21 +1109,14 @@ const int todayIndex(gridStart.daysTo(today)); QDateTime gridEnd(mLastDayOfGrid.date(), QTime(23, 59, 59, 0)); - QList list; - - AgendaUtil::FilterFlags filter = - AgendaUtil::FilterFlags(AgendaUtil::IncludeAnniversaries - | AgendaUtil::IncludeAppointments - | AgendaUtil::IncludeEvents - | AgendaUtil::IncludeReminders - | AgendaUtil::IncludeIncompletedTodos); // Get the list of dates which have events QList datesWithEvents; - mAgendaUtil->markDatesWithEvents(gridStart,gridEnd,filter,datesWithEvents); + getInstanceList(datesWithEvents,gridStart,gridEnd); // Parse thru the list of dates and set the required flags - for(int i(0); i < datesWithEvents.count(); i++) { + int datesEventsCount = datesWithEvents.count(); + for(int i(0); i < datesEventsCount; i++) { int offset = mFirstDayOfGrid.date().daysTo(datesWithEvents.at(i)); mMonthDataArray[offset].SetHasEvents(true); } @@ -1068,7 +1130,6 @@ */ void CalenMonthView::populatePrevMonth() { - QList list; const QDateTime gridStart(CalenDateUtils::beginningOfDay(mFirstDayOfGrid)); const QDateTime today(CalenDateUtils::today()); @@ -1077,23 +1138,16 @@ QDateTime gridEnd(end.date(), QTime(23, 59, 59, 0)); - AgendaUtil::FilterFlags filter = - AgendaUtil::FilterFlags(AgendaUtil::IncludeAnniversaries - | AgendaUtil::IncludeAppointments - | AgendaUtil::IncludeEvents - | AgendaUtil::IncludeReminders - | AgendaUtil::IncludeIncompletedTodos); - // Get the list of dates which have events QList datesWithEvents; - mAgendaUtil->markDatesWithEvents(gridStart,gridEnd,filter,datesWithEvents); + getInstanceList(datesWithEvents,gridStart,gridEnd); // Parse thru the list of dates and set the required flags - for(int i(0); i < datesWithEvents.count(); i++) { + int datesEventsCount = datesWithEvents.count(); + for(int i(0); i < datesEventsCount; i++) { int offset = mFirstDayOfGrid.date().daysTo(datesWithEvents.at(i)); mMonthDataArray[offset].SetHasEvents(true); } - datesWithEvents.clear(); } @@ -1112,27 +1166,31 @@ const int todayIndex(gridStart.daysTo(today)); // grid index for "today" QDateTime gridEnd(mLastDayOfGrid.date(), QTime(23, 59, 59, 0)); - - AgendaUtil::FilterFlags filter = - AgendaUtil::FilterFlags(AgendaUtil::IncludeAnniversaries - | AgendaUtil::IncludeAppointments - | AgendaUtil::IncludeEvents - | AgendaUtil::IncludeReminders - | AgendaUtil::IncludeIncompletedTodos); - // Get the list of dates which have events QList datesWithEvents; - mAgendaUtil->markDatesWithEvents(gridStart,gridEnd,filter,datesWithEvents); + getInstanceList(datesWithEvents,gridStart,gridEnd); // Parse thru the list of dates and set the required flags - for(int i(0); i < datesWithEvents.count(); i++) { + int datesEventsCount = datesWithEvents.count(); + for(int i(0); i < datesEventsCount; i++) { int offset = mFirstDayOfGrid.date().daysTo(datesWithEvents.at(i)); mMonthDataArray[offset].SetHasEvents(true); } - + datesWithEvents.clear(); +} - - datesWithEvents.clear(); +/*! + Function that gets called when instacne view is created, so that it can + query agenda server for any entries + */ +void CalenMonthView::fetchEntriesAndUpdateModel() +{ + // Get to know if entries are there from the agenda server + populateWithInstanceView(); + // Update the month grid model + mMonthGrid->updateMonthGridWithEventIndicators(mMonthDataArray); + // Populate the preview panes + populatePreviewPane(mDate); } /*! @@ -1143,6 +1201,9 @@ mPrevPreviewPane->populateLabel(dateTime.addDays(-1)); mCurrPreviewPane->populateLabel(dateTime); mNextPreviewPane->populateLabel(dateTime.addDays(1)); + + // Start the auto scroll on current preview pane + mCurrPreviewPane->startAutoScroll(); } /*! @@ -1163,43 +1224,18 @@ } /*! - Handles the long press on a grid item - */ -void CalenMonthView::handleGridItemLongPressed(int index, QPointF &coords) -{ - QDateTime newActiveDay = CalenDateUtils::futureOf(mFirstDayOfGrid, index); - - // set the context - mServices.Context().setFocusDateL(newActiveDay, KCalenMonthViewUidValue); - - HbMenu *contextMenu = new HbMenu(this); - - connect(contextMenu->addAction(hbTrId("txt_common_menu_open")), SIGNAL( triggered() ), this, - SLOT( launchDayView())); - // TODO: Add the text id - connect(contextMenu->addAction("New Todo"), SIGNAL( triggered() ), this, - SLOT( createEditor())); - - // Show context sensitive menu. - // Param const QPointF& coordinate - is a longpress position. - contextMenu->exec(coords); -} - -/*! Sets the context w.r.t to the active day */ void CalenMonthView::setContextForActiveDay(int index) { QDateTime newActiveDay = mFirstDayOfGrid.addDays(index); // Set the context - mServices.Context().setFocusDateL(newActiveDay, KCalenMonthViewUidValue); + mServices.Context().setFocusDate(newActiveDay); mDate = newActiveDay; setDateToLabel(); if(!mIsPrevPaneGesture) { populatePreviewPane(mDate); - // Start the auto scroll on current preview pane - mCurrPreviewPane->startAutoScroll(); } else { // reset flag mIsPrevPaneGesture = false; @@ -1216,11 +1252,18 @@ } /*! - Slot to launch the agenda view + Slot to launch the Day view */ void CalenMonthView::launchDayView() { mServices.IssueCommandL(ECalenDayView); + // day view launched now, disconnect to get the call backs for saveActivity + // on aboutToQuit signal + if (mIsAboutToQuitEventConnected) + { + disconnect(qobject_cast(qApp), SIGNAL(aboutToQuit()), this, SLOT(saveActivity())); + mIsAboutToQuitEventConnected = false; + } } /*! @@ -1228,13 +1271,11 @@ */ void CalenMonthView::changeOrientation(Qt::Orientation orientation) { - if (this == mServices.MainWindow().currentView()) { if (mOrientation != orientation) { // change the orientation here mOrientation = orientation; handleChangeOrientation(); } - } } /*! @@ -1260,16 +1301,11 @@ QGraphicsLinearLayout* viewLayout = static_cast (widget()->layout()); viewLayout->removeAt(1); - viewLayout->addItem(mCurrPaneParent); - - - // Check the weeknumber setting and update it accordingly - if (mIsWeekNumbersShown) { - // Add week numbers to week grid - addWeekNumbers(); - } else { - // remove the weeknumbergrid from the layout - removeWeekNumbers(); + // Add this item only when orientaion is changed on month view + // if it is changed in other views, adding the preview pane here was + // overlapping with the month grid, hence, its been added in dopopulation() + if (this == mServices.MainWindow().currentView()) { + viewLayout->addItem(mCurrPaneParent); } } @@ -1439,4 +1475,43 @@ mCurrPreviewPane->startAutoScroll(); mPrevPreviewPane->populateLabel(mDate.addDays(-1)); } +/*! + update the Day labels + */ +void CalenMonthView::updateDayLabel() +{ + // Set the short day names to these labels + int startOfWeek = mLocale.startOfWeek(); + int weekDayIndex = startOfWeek; + QStringList weekDayArray ; + weekDayArray < labels; + // append seven day labels + labels.append(mFirstDayLabel); + labels.append(mSecondDayLabel); + labels.append(mThirdDayLabel); + labels.append(mFourthDayLabel); + labels.append(mFifthDayLabel); + labels.append(mSixthDayLabel); + labels.append(mSeventhDayLabel); + for(int i=0;i < KCalenDaysInWeek; i++ ) + { + labels.at(i)->setPlainText(weekDayArray[weekDayIndex]); + if(weekDayIndex == KCalenDaysInWeek - 1 )//Sunday + { + weekDayIndex = 0;//reset to monday + continue; + } + weekDayIndex++;//increase the index for next value + } + labels.clear(); + weekDayArray.clear(); +} // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/src/calennativeview.cpp --- a/calendarui/views/src/calennativeview.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/src/calennativeview.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -24,6 +24,8 @@ #include #include #include +#include //Activity Manager +#include //hbapplication //user includes #include @@ -32,6 +34,7 @@ #include "calencontext.h" #include "calensettingsview.h" #include "calendateutils.h" +#include "calenconstants.h" /*! \class CalenNativeView @@ -42,12 +45,13 @@ Default constructor. */ CalenNativeView::CalenNativeView(MCalenServices &services) : - mServices(services) + mServices(services), mIsCapturedScreenShotValid(false) { setTitle(hbTrId("txt_calendar_title_calendar")); // Create services API and register for notifications RArray notificationArray; + CleanupClosePushL(notificationArray); notificationArray.Append(ECalenNotifySystemTimeChanged); notificationArray.Append(ECalenNotifySystemLocaleChanged); @@ -55,7 +59,7 @@ mServices.RegisterForNotificationsL(this, notificationArray); - notificationArray.Reset(); + CleanupStack::PopAndDestroy(¬ificationArray); } /*! @@ -95,27 +99,28 @@ */ void CalenNativeView::goToDate() { - // Get the current date. - QDateTime currentDateTime = CalenDateUtils::today(); - QDate currentDate = currentDateTime.date(); - mDatePicker = new HbDateTimePicker(currentDate, this); - + // Create a popup with datepicker for the user to select date. + HbDialog *popUp = new HbDialog(); + popUp->setDismissPolicy(HbDialog::NoDismiss); + popUp->setTimeout(HbDialog::NoTimeout); + popUp->setAttribute( Qt::WA_DeleteOnClose, true ); + popUp->setHeadingWidget(new HbLabel(hbTrId("txt_calendar_opt_go_to_date"))); + + if(mDatePicker) { + mDatePicker = NULL; + } + mDatePicker = new HbDateTimePicker(QDate::currentDate(), popUp); // Set the date range. mDatePicker->setMinimumDate(CalenDateUtils::minTime().date()); mDatePicker->setMaximumDate(CalenDateUtils::maxTime().date()); - - // Create a popup with datepicker for the user to select date. - HbDialog popUp; - popUp.setDismissPolicy(HbDialog::NoDismiss); - popUp.setTimeout(HbDialog::NoTimeout); - popUp.setHeadingWidget(new HbLabel(hbTrId("txt_calendar_opt_go_to_date"))); - popUp.setContentWidget(mDatePicker); + mDatePicker->setDate(QDate::currentDate()); + + popUp->setContentWidget(mDatePicker); HbAction *okAction = new HbAction(hbTrId("txt_common_button_ok")); - popUp.setPrimaryAction(okAction); + popUp->addAction(okAction); connect(okAction, SIGNAL(triggered()), this, SLOT(goToSelectedDate())); - connect(okAction, SIGNAL(triggered()), &popUp, SLOT(close())); - popUp.setSecondaryAction(new HbAction(hbTrId("txt_common_button_cancel"), &popUp)); - popUp.exec(); + popUp->addAction(new HbAction(hbTrId("txt_common_button_cancel"), popUp)); + popUp->open(); } /* @@ -130,11 +135,11 @@ selectedDate >= CalenDateUtils::minTime().date() && selectedDate <= CalenDateUtils::maxTime().date()) { MCalenContext& context = mServices.Context(); - QDateTime contextDate = context.focusDateAndTimeL(); + QDateTime contextDate = context.focusDateAndTime(); //Set the selected date to contextDate. contextDate.setDate(selectedDate); - context.setFocusDateAndTimeL(contextDate, KCalenMonthViewUidValue); + context.setFocusDateAndTime(contextDate); } refreshViewOnGoToDate(); } @@ -202,4 +207,49 @@ return mServices.InfobarTextL(); } +// ---------------------------------------------------------------------------- +// captureScreenshot caltures screen shot for the given viewId +// @param viewId view for which screenshot needs to be captured +// ---------------------------------------------------------------------------- +// +void CalenNativeView::captureScreenshot(bool captureScreenShot) + { + // get a screenshot for saving to the activity manager. It's done for once + // to optimize the performance + if (captureScreenShot) { + mScreenShotMetadata.clear(); // remove any screenshot captured earlier + mScreenShotMetadata.insert("screenshot", QPixmap::grabWidget(mainWindow(), mainWindow()->rect())); + } + mIsCapturedScreenShotValid = captureScreenShot; // set the validity of the screenshot captured + } + +// ---------------------------------------------------------------------------- +// saveActivity saves the activity for current view +// ---------------------------------------------------------------------------- +// +void CalenNativeView::saveActivity() + { + // Get a pointer to activity manager + HbActivityManager* activityManager = qobject_cast(qApp)->activityManager(); + + // check if alerady a valid screen shot is captured + if (!mIsCapturedScreenShotValid) { + mScreenShotMetadata.clear(); // remove any screenshot captured earlier + mScreenShotMetadata.insert("screenshot", QPixmap::grabWidget(mainWindow(), mainWindow()->rect())); + } + + // Save any data necessary to save the state + QByteArray serializedActivity; + QDataStream stream(&serializedActivity, QIODevice::WriteOnly | QIODevice::Append); + stream << mActivityId; + + bool ok(false); + // Save activity + ok = activityManager->addActivity(activityName, serializedActivity, mScreenShotMetadata); + + // Check is activity saved sucessfully + if ( !ok ) { + qFatal("Add failed" ); // Panic is activity is not saved successfully + } + } //End Of File diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/src/calenpluginlabel.cpp --- a/calendarui/views/src/calenpluginlabel.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/src/calenpluginlabel.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -16,6 +16,7 @@ */ // System includes +#include // User includes #include "calenservices.h" @@ -29,31 +30,37 @@ /*! constructor */ -CalenPluginLabel::CalenPluginLabel(MCalenServices& services, +Q_DECL_EXPORT CalenPluginLabel::CalenPluginLabel(MCalenServices& services, QGraphicsItem* parent) : HbLabel(parent),mServices(services) { setAlignment(Qt::AlignCenter); - setFontSpec(HbFontSpec(HbFontSpec::Secondary)); - setPlainText("Reg plugin"); + grabGesture(Qt::TapGesture); } /*! Destructor */ -CalenPluginLabel::~CalenPluginLabel() +Q_DECL_EXPORT CalenPluginLabel::~CalenPluginLabel() { } + /*! - To handle mouse press event. - \sa QGraphicsItem - */ -void CalenPluginLabel::mousePressEvent(QGraphicsSceneMouseEvent* event) + Functo listen for all gestures +*/ +void CalenPluginLabel::gestureEvent(QGestureEvent *event) { - Q_UNUSED(event); - - mServices.IssueCommandL(ECalenRegionalPluginTapEvent); + if(HbTapGesture *gesture = qobject_cast(event->gesture(Qt::TapGesture))) { + if (gesture->state() == Qt::GestureFinished) { + if (gesture->tapStyleHint() == HbTapGesture::Tap) { + // Regional label is tapped + mServices.IssueCommandL(ECalenRegionalPluginTapEvent); + event->accept(Qt::TapGesture); + } + } + } } + // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/src/calenpreviewpane.cpp --- a/calendarui/views/src/calenpreviewpane.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/src/calenpreviewpane.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -27,6 +27,8 @@ #include #include #include +#include +#include #include #include @@ -42,7 +44,9 @@ // Macros #define TWO_SECONDS_TIMER 2000 // millseconds -#define SCROLLING_SPEED 50 +#define SCROLLING_SPEED 10 +#define MAX_PAN_DIRECTION_THRESHOLD 50 +#define MIN_PAN_DIRECTION_THRESHOLD 20 static const QString EMPTYSTRING(" "); @@ -59,6 +63,8 @@ mIsNoEntriesAdded = true; mIsGestureHandled = false; mNoEntriesLabel = 0; + mHtDiff = 0.0; + mScrollDuration = 0; setAcceptDrops(true); setScrollDirections(Qt::Vertical); setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAlwaysOff); @@ -101,7 +107,7 @@ GetInstanceListL(); // Get the content of the scroll area - QGraphicsWidget* content = this->contentWidget(); + QGraphicsWidget* content = contentWidget(); // Adjust the layout QGraphicsLinearLayout* layout = static_cast (content->layout()); @@ -154,11 +160,16 @@ // No summary display "No subject" summary.append(hbTrId("txt_calendar_dblist_unnamed")); } - QDateTime startTime = mInstanceArray[i].startTime(); - HbExtendedLocale systemLocale =HbExtendedLocale::system(); - QString start = systemLocale.format(startTime.time(), - r_qtn_time_usual_with_zero); - start.append(EMPTYSTRING); + // Chcek the entry type, based on the type display time field in + // preview pane. + QString start; + if(mInstanceArray[i].type() != AgendaEntry::TypeTodo ) { + QDateTime startTime = mInstanceArray[i].startTime(); + HbExtendedLocale systemLocale =HbExtendedLocale::system(); + start = systemLocale.format(startTime.time(), + r_qtn_time_usual_with_zero); + start.append(EMPTYSTRING); + } // Append summary to start time QString text = start.append(summary); label->setPlainText(text); @@ -238,9 +249,6 @@ { if (mIsNoEntriesAdded) { scrollContentsTo(QPointF(0.0,0.0)); - - // Call pan gesture with zero delta just to stop the scfrolling - HbScrollArea::panGesture(QPointF(0.0,0.0)); return; } @@ -259,17 +267,30 @@ mTwoSecTimer->stop(); disconnect(mTwoSecTimer, SIGNAL(timeout()), this, SLOT(onTwoSecondsTimeout())); - // Start the scrolling in the proper direction + + // Calculate the timer and the height difference of pane and its content + if (!mScrollDuration) { + qreal contentHeight = contentWidget()->size().height(); + qreal paneHeight = size().height(); + mHtDiff = contentHeight - paneHeight; + if (mHtDiff > 0) { // content is more than widget height, we need to scroll + mScrollDuration = mHtDiff / SCROLLING_SPEED; + } + } + + // Start the scrolling in the proper direction if (mScrollDirection == up) { // Start scrolling upwards mScrollDirection = down; mNumOfScrolls++; - upGesture(SCROLLING_SPEED); + QPointF targetPos(0.0, -mHtDiff); + scrollContentsTo(-targetPos, mScrollDuration * 1000); } else if (mScrollDirection == down) { mScrollDirection = up; mNumOfScrolls++; // Start scrolling downwards - downGesture(SCROLLING_SPEED); + QPointF targetPos(0.0, 0.0); + scrollContentsTo(targetPos, mScrollDuration * 1000); } } @@ -290,44 +311,59 @@ } /*! - Function to listen mouse press events + Function to listen for all gestures */ -void CalenPreviewPane::mousePressEvent(QGraphicsSceneMouseEvent* event) -{ - mIsGestureHandled = false; - mPressedPos = event->pos(); - event->accept(); -} - -/*! - Function to listen mouse release events - */ -void CalenPreviewPane::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) +void CalenPreviewPane::gestureEvent(QGestureEvent *event) { - qreal posDiff = mPressedPos.x()-event->pos().x(); - if (abs(posDiff) < 50 && !mIsGestureHandled) { - // Preview pane tapped - mServices.IssueCommandL(ECalenDayView); - } - event->accept(); -} - -/*! - Function to listen mouse move events - */ -void CalenPreviewPane::mouseMoveEvent(QGraphicsSceneMouseEvent* event) -{ - qreal posDiff = mPressedPos.x()-event->pos().x(); - if (posDiff < -50) { - mIsGestureHandled = true; - // right gesture - mView->handlePreviewPaneGesture(true); - } else if (posDiff > 50) { - mIsGestureHandled = true; - // left gesture - mView->handlePreviewPaneGesture(false); - } - event->accept(); + if(HbPanGesture *gesture = qobject_cast(event->gesture(Qt::PanGesture))) { + if (gesture->state() == Qt::GestureStarted) { + // TODO: This work aroung till framework provides an api + // to know the direciton of the pan, until then we need + // calculate the direction explicitly + // Get to know the direction of the gesture + QPointF delta = gesture->delta(); + if (abs(delta.y()) > MAX_PAN_DIRECTION_THRESHOLD) { + // Now see if y coord diff has crossed threshold + if (delta.x() > MAX_PAN_DIRECTION_THRESHOLD) { + mIsGestureHandled = true; + // right gesture + mView->handlePreviewPaneGesture(true); + event->accept(Qt::PanGesture); + } else if (delta.x() < -MAX_PAN_DIRECTION_THRESHOLD){ + mIsGestureHandled = true; + // left gesture + mView->handlePreviewPaneGesture(false); + event->accept(Qt::PanGesture); + } else { + event->accept(Qt::PanGesture); + return; + } + } else if (abs(delta.y()) < MAX_PAN_DIRECTION_THRESHOLD) { + if (delta.x() > MIN_PAN_DIRECTION_THRESHOLD) { + mIsGestureHandled = true; + // right gesture + mView->handlePreviewPaneGesture(true); + event->accept(Qt::PanGesture); + } else if (delta.x() < -MIN_PAN_DIRECTION_THRESHOLD){ + mIsGestureHandled = true; + // left gesture + mView->handlePreviewPaneGesture(false); + event->accept(Qt::PanGesture); + }else { + event->accept(Qt::PanGesture); + return; + } + } + } + } else if(HbTapGesture *gesture = qobject_cast(event->gesture(Qt::TapGesture))) { + if (gesture->state() == Qt::GestureFinished) { + if (gesture->tapStyleHint() == HbTapGesture::Tap) { + // Preview pane tapped + mServices.IssueCommandL(ECalenAgendaView); + event->accept(Qt::TapGesture); + } + } + } } /*! diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/src/calensettingsview.cpp --- a/calendarui/views/src/calensettingsview.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/src/calensettingsview.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -31,7 +31,11 @@ #include "calensettings.h" CalenSettingsView::CalenSettingsView(MCalenServices& services, QGraphicsItem *parent) -:HbView(parent), mServices(services) +:HbView(parent), + mServices(services), + mCalenSettingsForm(NULL), + mCalenSettings(NULL), + mSoftKeyAction(NULL) { mCalenSettingsForm = new HbDataForm(this); @@ -40,17 +44,26 @@ setTitle(hbTrId("txt_calendar_title_calendar")); // Construct the settings utility. - mCalenSettings = new CalenSettings(mCalenSettingsForm); - mCalenSettings->createModel(); - - - setWidget(mCalenSettingsForm); + if(mCalenSettingsForm) + { + mCalenSettings = new CalenSettings(mServices, mCalenSettingsForm); + if(mCalenSettings) + { + mCalenSettings->createModel(); + setWidget(mCalenSettingsForm); + } + } } CalenSettingsView::~CalenSettingsView() { - // Nothing yet. + if (mCalenSettings) { + delete mCalenSettings; + } + if (mSoftKeyAction) { + delete mSoftKeyAction; + } } void CalenSettingsView::launchPreviousView() @@ -61,30 +74,27 @@ this, SLOT(launchPreviousView())); mServices.MainWindow().removeView(this); mServices.IssueNotificationL(ECalenNotifySettingsClosed); - - //TODO :: For ART3 we are launching agenda view later we have to use week view - // GEt the current orientation - /* Qt::Orientation orientation = mServices.MainWindow().orientation(); - if(orientation == Qt::Vertical) - { - mServices.IssueCommandL(ECalenDayView); - } - else if(orientation == Qt::Horizontal) - { - mServices.IssueCommandL(ECalenLandscapeDayView); - }*/ } void CalenSettingsView::initializeForm() - { +{ mCalenSettings->populateSettingList(); // Add view on main window and set back softkey mServices.MainWindow().addView(this); - mSoftKeyAction = new HbAction(Hb::BackAction); - setNavigationAction(mSoftKeyAction); - connect(mSoftKeyAction, SIGNAL(triggered()), + mSoftKeyAction = new HbAction(Hb::BackNaviAction); + if(mSoftKeyAction) + { + setNavigationAction(mSoftKeyAction); + connect(mSoftKeyAction, SIGNAL(triggered()), this, SLOT(launchPreviousView())); + } +} + +void CalenSettingsView::refreshView() + { + //populate the new items + mCalenSettings->populateSettingList(); } // End of file diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/src/calenthicklinesdrawer.cpp --- a/calendarui/views/src/calenthicklinesdrawer.cpp Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/src/calenthicklinesdrawer.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -20,6 +20,7 @@ #include #include #include +#include // User includes #include "calenthicklinesdrawer.h" @@ -39,10 +40,11 @@ */ CalenThickLinesDrawer::CalenThickLinesDrawer( CalendarNamespace::WidgetType type, QGraphicsItem* parent): - HbWidget(parent), - mGridBorderColor(Qt::black) + HbWidget(parent) { typeOfWidget = type; + mGridBorderColor = HbColorScheme::color("qtc_cal_grid_line"); + setFlag(QGraphicsItem::ItemHasNoContents, false); } /*! diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/src/calentodayindicatorlinedrawer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/src/calentodayindicatorlinedrawer.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,80 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: CalenTodayIndicatorLineDrawer implementation. +* +*/ + +// System includes +#include +#include +#include +#include +#include + +// User includes +#include "CalenTodayIndicatorLineDrawer.h" + +/*! + \class CalenTodayIndicatorLineDrawer. + + Class to draw the today indicator line. + */ + +/*! + Constructor. + */ +CalenTodayIndicatorLineDrawer::CalenTodayIndicatorLineDrawer( + QGraphicsItem* parent): HbWidgetBase(parent) +{ + connect( + HbTheme::instance(), SIGNAL(changed()), + this, SLOT(handleThemeChange())); + setFlag(QGraphicsItem::ItemHasNoContents, false); +} + +/*! + Destructor. + */ +CalenTodayIndicatorLineDrawer::~CalenTodayIndicatorLineDrawer() +{ + +} + +/*! + To paint the today indicator line. + */ +void CalenTodayIndicatorLineDrawer::paint( + QPainter* painter, const QStyleOptionGraphicsItem* option, + QWidget* widget) +{ + Q_UNUSED(option); + Q_UNUSED(widget); + QPen pen; + pen.setStyle(Qt::SolidLine); + pen.setBrush(HbColorScheme::color("qtc_cal_month_current_day")); + painter->setPen(pen); + QRectF controlRect = this->boundingRect(); + painter->fillRect( + controlRect, HbColorScheme::color("qtc_cal_month_current_day")); +} + +/*! + To handle the theme change for the today indicator line. + */ +void CalenTodayIndicatorLineDrawer::handleThemeChange() +{ + update(); +} + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b calendarui/views/views.pro --- a/calendarui/views/views.pro Mon May 03 12:30:32 2010 +0300 +++ b/calendarui/views/views.pro Mon Jun 28 15:22:02 2010 +0530 @@ -37,8 +37,8 @@ -lcalencommonutils \ -lcalensettings \ -lagendainterface \ - -lxqsettingsmanager \ - -lnoteseditor + -lxqsettingsmanager + TARGET.UID3 = 0x10282F26 TARGET.CAPABILITY = CAP_GENERAL_DLL @@ -52,28 +52,32 @@ calenmonthgrid.h \ calengriditemprototype.h \ calennativeview.h \ - calendayview.h \ + calenagendaview.h \ caleneventlistviewitem.h \ - calendayviewwidget.h \ + calenagendaviewwidget.h \ calenpreviewpane.h \ calensettingsview.h \ calenthicklinesdrawer.h \ - calenpluginlabel.h + calenpluginlabel.h \ + calentodayindicatorlinedrawer.h SOURCES += calenmonthview.cpp \ calenmonthdata.cpp \ calenmonthgrid.cpp \ calengriditemprototype.cpp \ calennativeview.cpp \ - calendayview.cpp \ + calenagendaview.cpp \ caleneventlistviewitem.cpp \ - calendayviewwidget.cpp \ + calenagendaviewwidget.cpp \ calenpreviewpane.cpp \ calensettingsview.cpp \ calenthicklinesdrawer.cpp \ - calenpluginlabel.cpp + calenpluginlabel.cpp \ + calentodayindicatorlinedrawer.cpp RESOURCES += calenresources.qrc +include(dayview/dayview.pri) + # End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clock.pro --- a/clock/clock.pro Mon May 03 12:30:32 2010 +0300 +++ b/clock/clock.pro Mon Jun 28 15:22:02 2010 +0530 @@ -19,8 +19,7 @@ SUBDIRS += \ clockengines \ clockmw \ - clockui \ - ftudatetimewizard + clockui CONFIG += ordered @@ -28,12 +27,14 @@ BLD_INF_RULES.prj_exports += \ "./rom/clock.iby CORE_APP_LAYER_IBY_EXPORT_PATH(clock.iby)" \ "./rom/clockengines.iby CORE_APP_LAYER_IBY_EXPORT_PATH(clockengines.iby)" \ - "./rom/ftudatetimewizard.iby CORE_APP_LAYER_IBY_EXPORT_PATH(ftudatetimewizard.iby)" \ "./rom/clockresources.iby LANGUAGE_APP_LAYER_IBY_EXPORT_PATH(clockresources.iby)" \ \ "./conf/clockapp.confml APP_LAYER_CONFML(clockapp.confml)" \ + "./conf/CI_clockapp.confml APP_LAYER_CONFML(CI_clockapp.confml)" \ "./conf/clockapp_101F874D.crml APP_LAYER_CRML(clockapp_101F874D.crml)" \ "./conf/clockapp_101F8876.crml APP_LAYER_CRML(clockapp_101F8876.crml)" \ + # stubsis is added to provide IAD + "./stubsis/clock_stub.sis /epoc32/data/z/system/install/clock_stub.sis" } # End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockengines/clockserver/server/inc/clockprivatecrkeys.h --- a/clock/clockengines/clockserver/server/inc/clockprivatecrkeys.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: The file contains the uid of keys used by cenrep sheet -* -*/ - -#ifndef __CLOCKPRIVATECRKEYS_H__ -#define __CLOCKPRIVATECRKEYS_H__ - -/** Nitz Settings API */ -/** Provides access to the Nitz status.*/ -const TUid KCRUidNitz = { 0x101F8876 }; - -/** Nitz state key */ -const TUint32 KNitzState = 0x00000000; - -/** Active Protocol key */ -const TUint32 KActiveProtocol = 0x00000001; - -/** Previous alarm time high */ -const TUint32 KPreviousAlarmTime = 0x00000002; - -/** CountDownTimer alert file */ -const TUint32 KCountDownSoundFile = 0x00000003; - -/** Valid Nitz Info key */ -const TUint32 KValidNitz = 0x00000004; - -/** FTU date time plugin edited date */ -const TUint32 KFtuPluginDate = 0x00000005; -#endif // __CLOCKPRIVATECRKEYS_H__ - -// End of file - diff -r fd30d51f876b -r b6db4fd4947b clock/clockengines/clockserver/server/src/clockserver.cpp --- a/clock/clockengines/clockserver/server/src/clockserver.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockengines/clockserver/server/src/clockserver.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -216,7 +216,7 @@ CRepository* cenRep( NULL ); // Open the repository. - TRAPD( errVal, cenRep = CRepository::NewL( KCRUidNitz ) ); + TRAPD( errVal, cenRep = CRepository::NewL( TUid::Uid(KCRUidNitz ) ) ); if( KErrNone == errVal ) { // Read the key. @@ -248,7 +248,7 @@ CRepository* cenRep( NULL ); // Open the repository. - TRAPD( errVal, cenRep = CRepository::NewL( KCRUidNitz ) ); + TRAPD( errVal, cenRep = CRepository::NewL( TUid::Uid(KCRUidNitz ) ) ); if( KErrNone == errVal ) { // Update the key. diff -r fd30d51f876b -r b6db4fd4947b clock/clockengines/clockserver/server/src/clockserverimpl.cpp --- a/clock/clockengines/clockserver/server/src/clockserverimpl.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockengines/clockserver/server/src/clockserverimpl.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -31,13 +31,11 @@ #include "clockservermccobserver.h" #include "clockecomlistener.h" #include "clock_debug.h" -#include "clockprivatecrkeys.h" // Constants const TInt KZeroIndex( 0 ); const TInt KSingleZone( 1 ); const TInt KSinglePlugin( 1 ); -const TInt KSetValidNitz( 1 ); const TUid KTimeSourceInterfaceUID = { 0x200159A7 }; const TInt KNitzPlugin( 0x200159A5 ); @@ -508,6 +506,11 @@ } } + // Initialise the attributes to null. + TTime invalidTime( 0 ); + iTimeAttributes->iDstOffset = TTimeIntervalMinutes( 0 ); + iTimeAttributes->iTimeZoneOffset = TTimeIntervalMinutes( 0 ); + iTimeAttributes->iUtcDateTime = invalidTime.DateTime(); // Get all the information related to the plugin. // The UTC time. TRAP_IGNORE( aPluginImpl.GetTimeInformationL( EUTCTime, iTimeAttributes ) ); @@ -519,29 +522,14 @@ // Set a flag saying we have plugin data. iPluginData = ETrue; - // Get the first boot status from cenrep. If it is the first boot, clockserver will not update the time. - TBool staleBoot( EFalse ); - - CRepository* cenRep( NULL ); - - TRAPD( errorVal, cenRep = CRepository::NewL( KCRUidStartup ) ); - - if( errorVal == KErrNone ) - { - errorVal = cenRep->Get( KStartupFirstBoot, staleBoot ); - } - - // Cleanup. - delete cenRep; - cenRep = NULL; - if( iMccReceived ) { __PRINTS( "We have already recieved the MCC" ); // Try to resolve the timezone id with the data that we have recieved. TInt timezoneId; - TRAP_IGNORE( TInt errorVal = iTzResolver->GetTimeZoneL( *iTimeAttributes, iMcc, timezoneId ) ); + TInt errorVal = 0; + TRAP_IGNORE( errorVal = iTzResolver->GetTimeZoneL( *iTimeAttributes, iMcc, timezoneId ) ); __PRINT( "CClkSrvImpl::NotifyTimeChangeL - timeZoneId: %d", timezoneId ); @@ -564,23 +552,6 @@ if( KInvalidTimeZoneId != timezoneId ) { // A valid new zone was found successfully - - // Update the key for ValidNitz for the first boot - if(!staleBoot) - { - TInt validNitz( KSetValidNitz ); - CRepository* cenRep( NULL ); - - TRAPD( errorVal, cenRep = CRepository::NewL( KCRUidNitz ) ); - if( errorVal == KErrNone ) - { - errorVal = cenRep->Set( KValidNitz, validNitz ); - } - // Cleanup. - delete cenRep; - cenRep = NULL; - } - CTzId* newTzId = CTzId::NewL( timezoneId ); CleanupStack::PushL( newTzId ); @@ -592,12 +563,9 @@ { // The new zone is different than the current one // GOAL 3: Set the DST zone of the device - //if( staleBoot ) - //{ - __PRINTS( "Not the first boot and the timezone ID is different. Setting the zone." ); + __PRINTS( "Timezone ID is different. Setting the zone." ); - TRAP_IGNORE( tz.SetTimeZoneL( *newTzId ) ); - // } + TRAP_IGNORE( tz.SetTimeZoneL( *newTzId ) ); } CleanupStack::PopAndDestroy( newTzId ); @@ -612,12 +580,9 @@ // Set the UTC time only. This is being done because with the UTC time, // before the time is being set, the dst properties for the timezone are being checked. // If its not the first boot, then set the time. - //if( staleBoot ) - // { - __PRINTS( "Not the first boot. Setting the UTC time." ); + __PRINTS( "Setting the UTC time." ); - TRAP_IGNORE( User::SetUTCTime( nwUtcTime ) ); - // } + TRAP_IGNORE( User::SetUTCTime( nwUtcTime ) ); } // Reset the flags. @@ -633,8 +598,9 @@ // Try to resolve the timezone id with the data that we have recieved. TInt timezoneId; + TInt errorVal = 0; const TBuf< 4 > invalidMCC( KInvalidMCC ); - TRAP_IGNORE( TInt errorVal = iTzResolver->GetTimeZoneL( *iTimeAttributes, invalidMCC, timezoneId ) ); + TRAP_IGNORE( errorVal = iTzResolver->GetTimeZoneL( *iTimeAttributes, invalidMCC, timezoneId ) ); if( KErrNone == errorVal ) { @@ -649,23 +615,6 @@ if( KInvalidTimeZoneId != timezoneId ) { // A valid new zone was found successfully - - // Update the key for ValidNitz for the first boot - if(!staleBoot) - { - TInt validNitz( KSetValidNitz ); - CRepository* cenRep( NULL ); - - TRAPD( errorVal, cenRep = CRepository::NewL( KCRUidNitz ) ); - if( errorVal == KErrNone ) - { - errorVal = cenRep->Set( KValidNitz, validNitz ); - } - // Cleanup. - delete cenRep; - cenRep = NULL; - } - CTzId* newTzId = CTzId::NewL( timezoneId ); CleanupStack::PushL( newTzId ); @@ -674,12 +623,9 @@ // The new zone is different than the current one // GOAL 3: Set the DST zone of the device // If firstboot then don't set the time. - //if( staleBoot ) - // { - __PRINTS( "Not the first boot and the timezone ID is different. Setting the zone." ); + __PRINTS( "The timezone ID is different. Setting the zone." ); - TRAP_IGNORE( tz.SetTimeZoneL( *newTzId ) ); - // } + TRAP_IGNORE( tz.SetTimeZoneL( *newTzId ) ); } CleanupStack::PopAndDestroy( newTzId ); } @@ -693,12 +639,9 @@ // Set the UTC time only. This is being done because with the UTC time, // before the time is being set, the dst properties for the timezone are being checked. // Set the time only if its not the first boot. - //if( staleBoot ) - // { - __PRINTS( "Not the first boot. Setting the UTC time." ); + __PRINTS( "Setting the UTC time." ); - TRAP_IGNORE( User::SetUTCTime( nwUtcTime ) ); - // } + TRAP_IGNORE( User::SetUTCTime( nwUtcTime ) ); } } __PRINTS( "Notifying the timechange to client" ); @@ -733,26 +676,50 @@ // Lets see if we can narrow down to a single timezone with the MCC recieved. RArray< CTzId > tzIdArray; - // Try and fetch the timezone ID using the MCC recieved. - TRAP_IGNORE( iTzResolver->TzIdFromMccL( iMcc, tzIdArray, KInvalidTimeZoneId ) ); + // This parte of code introduced due to error ID EASH-82DPPC(3G Tests for NITZ and GPRS Interaction) + // Fix is bascially to narrowing down to single timezone id if NITZ packet is received prior to MCC. + // In first IF state we are trying to narrowdown to single timezone ID, if not possible try to use MCC to get timezone + // In second IF , we are using MCC to narrow down to single timezone ID directly as dont have NITZ info. + if( iTimeAttributes ) + { + __PRINTS("timeatrrtibutes has value"); - // Code to check if its the first boot. - // Get the first boot status from cenrep. If it is the first boot, clockserver will not update the time. - TBool staleBoot( EFalse ); - - CRepository* cenRep( NULL ); + TTime invalidTime(0); + if( iTimeAttributes->iDstOffset != TTimeIntervalMinutes( 0 ) && + iTimeAttributes->iTimeZoneOffset != TTimeIntervalMinutes( 0 ) && + iTimeAttributes->iUtcDateTime.Year() != invalidTime.DateTime().Year() ) + { + // Try to resolve the timezone id with the data that we have recieved. + TInt timezoneId; + TRAP_IGNORE( TInt errorVal = iTzResolver->GetTimeZoneL( *iTimeAttributes, iMcc, timezoneId ) ); + + __PRINT("TIMEZONE ID %d", timezoneId ); + + // Append the timezone id to array. - TRAPD( errorVal, cenRep = CRepository::NewL( KCRUidStartup ) ); - - if( errorVal == KErrNone ) - { - errorVal = cenRep->Get( KStartupFirstBoot, staleBoot ); + CTzId* matchingDSTZoneId = CTzId::NewL( timezoneId ); + CleanupStack::PushL( matchingDSTZoneId ); + + tzIdArray.AppendL( *matchingDSTZoneId ); + + CleanupStack::PopAndDestroy( matchingDSTZoneId ); + + matchingDSTZoneId = NULL; } + else + { + __PRINTS("NOT ABLE TO NARROW DOWN TO TIMEZONE ID WITH RECEIVED NITZ HENCE TRY WITH MCC"); + // Not able to narrow down to single timezone id with received NITZ packet hence try with MCC. + TRAP_IGNORE( iTzResolver->TzIdFromMccL( iMcc, tzIdArray, KInvalidTimeZoneId ) ); + } + } + else + { + __PRINTS("NO NITZ INFO HENCE TRY WITH MCC"); + // No NITZ info hecne try with MCC to get the time zone Id. + TRAP_IGNORE( iTzResolver->TzIdFromMccL( iMcc, tzIdArray, KInvalidTimeZoneId ) ); + } - // Cleanup - delete cenRep; - cenRep = NULL; - // A single matching timezone was found. Set it as the default one. if( KSingleZone == tzIdArray.Count() ) { @@ -780,18 +747,41 @@ // The new zone is different than the current one // Set the DST zone of the device // Set the zone only for subsequent boots. - if( staleBoot ) - { - __PRINTS( "Not the first boot and the timezone ID is different. Setting the zone." ); + __PRINTS( "The timezone ID is different. Setting the zone." ); - TRAP_IGNORE( tz.SetTimeZoneL( *newTzId ) ); - } + TRAP_IGNORE( tz.SetTimeZoneL( *newTzId ) ); } CleanupStack::PopAndDestroy( newTzId ); } CleanupStack::PopAndDestroy( currentCTzId ); - CleanupStack::PopAndDestroy( &tz ); - } + CleanupStack::PopAndDestroy( &tz ); + + } + + // Set the time on device and set the attributes to null so that we avoid setting old value. + if( iTimeAttributes ) + { + // Time sent by nw is UTC + TTime nwUtcTime( iTimeAttributes->iUtcDateTime); + + // Set the UTC time only. This is being done because with the UTC time, + // before the time is being set, the dst properties for the timezone are being checked. + // If its not the first boot, then set the time. + __PRINTS( "Setting the UTC time." ); + + TRAP_IGNORE( User::SetUTCTime( nwUtcTime ) ); + + // Setting the attributes to null again as we dont trust on + // previous NITZ data recevied by device.If device receive + // NITZ data again attributes would get filled with actual value. + // Has been kept outside because this statement is valid for + // first boot also. + + iTimeAttributes->iDstOffset = TTimeIntervalMinutes( 0 ); + iTimeAttributes->iTimeZoneOffset = TTimeIntervalMinutes( 0 ); + TTime invalidTime( 0 ); + iTimeAttributes->iUtcDateTime = invalidTime.DateTime(); + } } // Notify the sessions about the change in mcc. diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/bwins/clockalarmclientu.def --- a/clock/clockmw/bwins/clockalarmclientu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -EXPORTS - ?setAlarmRepeatType@AlarmClient@@AAEXW4AlarmRepeatType@@AAW4TAlarmRepeatDefinition@@@Z @ 1 NONAME ; void AlarmClient::setAlarmRepeatType(enum AlarmRepeatType, enum TAlarmRepeatDefinition &) - ?staticMetaObject@AlarmClient@@2UQMetaObject@@B @ 2 NONAME ; struct QMetaObject const AlarmClient::staticMetaObject - ?metaObject@AlarmClient@@UBEPBUQMetaObject@@XZ @ 3 NONAME ; struct QMetaObject const * AlarmClient::metaObject(void) const - ?trUtf8@AlarmClient@@SA?AVQString@@PBD0H@Z @ 4 NONAME ; class QString AlarmClient::trUtf8(char const *, char const *, int) - ?startListener@AlarmClient@@QAEXXZ @ 5 NONAME ; void AlarmClient::startListener(void) - ?alarmStateChanged@AlarmClient@@IAEXH@Z @ 6 NONAME ; void AlarmClient::alarmStateChanged(int) - ?toggleAlarmStatus@AlarmClient@@QAEXHH@Z @ 7 NONAME ; void AlarmClient::toggleAlarmStatus(int, int) - ?notifyChange@AlarmClient@@QAEXH@Z @ 8 NONAME ; void AlarmClient::notifyChange(int) - ?tr@AlarmClient@@SA?AVQString@@PBD0@Z @ 9 NONAME ; class QString AlarmClient::tr(char const *, char const *) - ?setAlarmState@AlarmClient@@AAEXW4AlarmState@@AAW4TAlarmState@@@Z @ 10 NONAME ; void AlarmClient::setAlarmState(enum AlarmState, enum TAlarmState &) - ?getStaticMetaObject@AlarmClient@@SAABUQMetaObject@@XZ @ 11 NONAME ; struct QMetaObject const & AlarmClient::getStaticMetaObject(void) - ?trUtf8@AlarmClient@@SA?AVQString@@PBD0@Z @ 12 NONAME ; class QString AlarmClient::trUtf8(char const *, char const *) - ?qt_metacast@AlarmClient@@UAEPAXPBD@Z @ 13 NONAME ; void * AlarmClient::qt_metacast(char const *) - ??0AlarmClient@@QAE@PAVQObject@@@Z @ 14 NONAME ; AlarmClient::AlarmClient(class QObject *) - ??1AlarmClient@@UAE@XZ @ 15 NONAME ; AlarmClient::~AlarmClient(void) - ?tr@AlarmClient@@SA?AVQString@@PBD0H@Z @ 16 NONAME ; class QString AlarmClient::tr(char const *, char const *, int) - ?setAlarm@AlarmClient@@QAEXAAUAlarmInfo@@@Z @ 17 NONAME ; void AlarmClient::setAlarm(struct AlarmInfo &) - ?deleteAlarm@AlarmClient@@QAEXH@Z @ 18 NONAME ; void AlarmClient::deleteAlarm(int) - ?stopListener@AlarmClient@@QAEXXZ @ 19 NONAME ; void AlarmClient::stopListener(void) - ??_EAlarmClient@@UAE@I@Z @ 20 NONAME ; AlarmClient::~AlarmClient(unsigned int) - ?getAlarmList@AlarmClient@@QAEXAAV?$QList@UAlarmInfo@@@@@Z @ 21 NONAME ; void AlarmClient::getAlarmList(class QList &) - ?setAlarmState@AlarmClient@@AAEXW4TAlarmState@@AAW4AlarmState@@@Z @ 22 NONAME ; void AlarmClient::setAlarmState(enum TAlarmState, enum AlarmState &) - ?setAlarmRepeatType@AlarmClient@@AAEXW4TAlarmRepeatDefinition@@AAW4AlarmRepeatType@@@Z @ 23 NONAME ; void AlarmClient::setAlarmRepeatType(enum TAlarmRepeatDefinition, enum AlarmRepeatType &) - ?qt_metacall@AlarmClient@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 24 NONAME ; int AlarmClient::qt_metacall(enum QMetaObject::Call, int, void * *) - ?getAlarmInfo@AlarmClient@@QAEHHAAUAlarmInfo@@@Z @ 25 NONAME ; int AlarmClient::getAlarmInfo(int, struct AlarmInfo &) - diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/bwins/clocksettingsutilityu.def --- a/clock/clockmw/bwins/clocksettingsutilityu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -EXPORTS - ?timeFormat@SettingsUtility@@QAEHAAVQStringList@@@Z @ 1 NONAME ; int SettingsUtility::timeFormat(class QStringList &) - ?setSnoozeTime@SettingsUtility@@QAEXH@Z @ 2 NONAME ; void SettingsUtility::setSnoozeTime(int) - ?setDateFormat@SettingsUtility@@QAEXABVQString@@@Z @ 3 NONAME ; void SettingsUtility::setDateFormat(class QString const &) - ?time@SettingsUtility@@QAE?AVQString@@XZ @ 4 NONAME ; class QString SettingsUtility::time(void) - ?staticMetaObject@SettingsUtility@@2UQMetaObject@@B @ 5 NONAME ; struct QMetaObject const SettingsUtility::staticMetaObject - ?clockType@SettingsUtility@@QAEHAAVQStringList@@@Z @ 6 NONAME ; int SettingsUtility::clockType(class QStringList &) - ?setDateSeparator@SettingsUtility@@QAEXABVQString@@@Z @ 7 NONAME ; void SettingsUtility::setDateSeparator(class QString const &) - ?autoUpdate@SettingsUtility@@QAEHAAVQStringList@@@Z @ 8 NONAME ; int SettingsUtility::autoUpdate(class QStringList &) - ?dateSeparator@SettingsUtility@@QAEHAAVQStringList@@@Z @ 9 NONAME ; int SettingsUtility::dateSeparator(class QStringList &) - ?setTimeZone@SettingsUtility@@QAEXABVQString@@@Z @ 10 NONAME ; void SettingsUtility::setTimeZone(class QString const &) - ?setAutoUpdate@SettingsUtility@@QAEXABVQString@@@Z @ 11 NONAME ; void SettingsUtility::setAutoUpdate(class QString const &) - ?setTime@SettingsUtility@@QAEXABVQString@@@Z @ 12 NONAME ; void SettingsUtility::setTime(class QString const &) - ??_ESettingsUtility@@UAE@I@Z @ 13 NONAME ; SettingsUtility::~SettingsUtility(unsigned int) - ??0SettingsUtility@@QAE@PAVQObject@@@Z @ 14 NONAME ; SettingsUtility::SettingsUtility(class QObject *) - ?qt_metacall@SettingsUtility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 15 NONAME ; int SettingsUtility::qt_metacall(enum QMetaObject::Call, int, void * *) - ?setClockType@SettingsUtility@@QAEXABVQString@@@Z @ 16 NONAME ; void SettingsUtility::setClockType(class QString const &) - ?setTimeFormat@SettingsUtility@@QAEXABVQString@@@Z @ 17 NONAME ; void SettingsUtility::setTimeFormat(class QString const &) - ?settingsChanged@SettingsUtility@@IAEXW4SettingsItemChanged@@VQString@@@Z @ 18 NONAME ; void SettingsUtility::settingsChanged(enum SettingsItemChanged, class QString) - ?timeFormatString@SettingsUtility@@QAE?AVQString@@XZ @ 19 NONAME ; class QString SettingsUtility::timeFormatString(void) - ?tr@SettingsUtility@@SA?AVQString@@PBD0H@Z @ 20 NONAME ; class QString SettingsUtility::tr(char const *, char const *, int) - ?setStartOfWeek@SettingsUtility@@QAEXH@Z @ 21 NONAME ; void SettingsUtility::setStartOfWeek(int) - ?getStaticMetaObject@SettingsUtility@@SAABUQMetaObject@@XZ @ 22 NONAME ; struct QMetaObject const & SettingsUtility::getStaticMetaObject(void) - ?workdays@SettingsUtility@@QAEHAAVQStringList@@@Z @ 23 NONAME ; int SettingsUtility::workdays(class QStringList &) - ?date@SettingsUtility@@QAE?AVQString@@XZ @ 24 NONAME ; class QString SettingsUtility::date(void) - ?dateFormat@SettingsUtility@@QAEHAAVQStringList@@@Z @ 25 NONAME ; int SettingsUtility::dateFormat(class QStringList &) - ?setTimeSeparator@SettingsUtility@@QAEXABVQString@@@Z @ 26 NONAME ; void SettingsUtility::setTimeSeparator(class QString const &) - ?qt_metacast@SettingsUtility@@UAEPAXPBD@Z @ 27 NONAME ; void * SettingsUtility::qt_metacast(char const *) - ?snoozeTime@SettingsUtility@@QAEHAAVQStringList@@@Z @ 28 NONAME ; int SettingsUtility::snoozeTime(class QStringList &) - ?setWorkdays@SettingsUtility@@QAEXABVQString@@@Z @ 29 NONAME ; void SettingsUtility::setWorkdays(class QString const &) - ?dateFormatString@SettingsUtility@@QAE?AVQString@@XZ @ 30 NONAME ; class QString SettingsUtility::dateFormatString(void) - ?metaObject@SettingsUtility@@UBEPBUQMetaObject@@XZ @ 31 NONAME ; struct QMetaObject const * SettingsUtility::metaObject(void) const - ?timeZone@SettingsUtility@@QAE?AVQString@@XZ @ 32 NONAME ; class QString SettingsUtility::timeZone(void) - ?timeSeparator@SettingsUtility@@QAEHAAVQStringList@@@Z @ 33 NONAME ; int SettingsUtility::timeSeparator(class QStringList &) - ??1SettingsUtility@@UAE@XZ @ 34 NONAME ; SettingsUtility::~SettingsUtility(void) - ?trUtf8@SettingsUtility@@SA?AVQString@@PBD0@Z @ 35 NONAME ; class QString SettingsUtility::trUtf8(char const *, char const *) - ?tr@SettingsUtility@@SA?AVQString@@PBD0@Z @ 36 NONAME ; class QString SettingsUtility::tr(char const *, char const *) - ?trUtf8@SettingsUtility@@SA?AVQString@@PBD0H@Z @ 37 NONAME ; class QString SettingsUtility::trUtf8(char const *, char const *, int) - ?setDate@SettingsUtility@@QAEXABVQString@@@Z @ 38 NONAME ; void SettingsUtility::setDate(class QString const &) - diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/bwins/clockstopwatchengineu.def --- a/clock/clockmw/bwins/clockstopwatchengineu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -EXPORTS - ?startTimer@StopwatchEngine@@QAEXXZ @ 1 NONAME ; void StopwatchEngine::startTimer(void) - ?stopTimer@StopwatchEngine@@QAEXXZ @ 2 NONAME ; void StopwatchEngine::stopTimer(void) - ??_EStopwatchEngine@@UAE@I@Z @ 3 NONAME ; StopwatchEngine::~StopwatchEngine(unsigned int) - ??0StopwatchEngine@@QAE@PAVStopwatchObserver@@@Z @ 4 NONAME ; StopwatchEngine::StopwatchEngine(class StopwatchObserver *) - ?RunL@StopwatchEngine@@MAEXXZ @ 5 NONAME ; void StopwatchEngine::RunL(void) - ?DoCancel@StopwatchEngine@@MAEXXZ @ 6 NONAME ; void StopwatchEngine::DoCancel(void) - ??1StopwatchEngine@@UAE@XZ @ 7 NONAME ; StopwatchEngine::~StopwatchEngine(void) - diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/bwins/timezoneclientu.def --- a/clock/clockmw/bwins/timezoneclientu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -EXPORTS - ??_ETimezoneClient@@UAE@I@Z @ 1 NONAME ; TimezoneClient::~TimezoneClient(unsigned int) - ?locationSelectorModel@TimezoneClient@@QAEPAVQStandardItemModel@@XZ @ 2 NONAME ; class QStandardItemModel * TimezoneClient::locationSelectorModel(void) - ?getUtcDstOffsetL@TimezoneClient@@QAE_NAAHABVCTzId@@@Z @ 3 NONAME ; bool TimezoneClient::getUtcDstOffsetL(int &, class CTzId const &) - ?getLocations@TimezoneClient@@QAE?AV?$QList@ULocationInfo@@@@XZ @ 4 NONAME ; class QList TimezoneClient::getLocations(void) - ?getCityOffsetByNameAndId@TimezoneClient@@QAEHABVQString@@H@Z @ 5 NONAME ; int TimezoneClient::getCityOffsetByNameAndId(class QString const &, int) - ?intToMonth@TimezoneClient@@AAE?AW4TMonth@@H@Z @ 6 NONAME ; enum TMonth TimezoneClient::intToMonth(int) - ?getDstZoneOffset@TimezoneClient@@AAEHH@Z @ 7 NONAME ; int TimezoneClient::getDstZoneOffset(int) - ?environmentCallback@TimezoneClient@@SAHPAX@Z @ 8 NONAME ; int TimezoneClient::environmentCallback(void *) - ?trUtf8@TimezoneClient@@SA?AVQString@@PBD0H@Z @ 9 NONAME ; class QString TimezoneClient::trUtf8(char const *, char const *, int) - ?getStandardOffset@TimezoneClient@@QAEHH@Z @ 10 NONAME ; int TimezoneClient::getStandardOffset(int) - ?getCurrentZoneInfoL@TimezoneClient@@QAE?AULocationInfo@@XZ @ 11 NONAME ; struct LocationInfo TimezoneClient::getCurrentZoneInfoL(void) - ?createWorldClockModel@TimezoneClient@@QAEXXZ @ 12 NONAME ; void TimezoneClient::createWorldClockModel(void) - ?dstOn@TimezoneClient@@QAE_NH@Z @ 13 NONAME ; bool TimezoneClient::dstOn(int) - ?tr@TimezoneClient@@SA?AVQString@@PBD0H@Z @ 14 NONAME ; class QString TimezoneClient::tr(char const *, char const *, int) - ?setAsCurrentLocationL@TimezoneClient@@QAEXAAULocationInfo@@@Z @ 15 NONAME ; void TimezoneClient::setAsCurrentLocationL(struct LocationInfo &) - ?timeUpdateOn@TimezoneClient@@QAE_NXZ @ 16 NONAME ; bool TimezoneClient::timeUpdateOn(void) - ?staticMetaObject@TimezoneClient@@2UQMetaObject@@B @ 17 NONAME ; struct QMetaObject const TimezoneClient::staticMetaObject - ?qt_metacast@TimezoneClient@@UAEPAXPBD@Z @ 18 NONAME ; void * TimezoneClient::qt_metacast(char const *) - ?trUtf8@TimezoneClient@@SA?AVQString@@PBD0@Z @ 19 NONAME ; class QString TimezoneClient::trUtf8(char const *, char const *) - ?getDstRulesL@TimezoneClient@@QAEXAAVQDateTime@@0H@Z @ 20 NONAME ; void TimezoneClient::getDstRulesL(class QDateTime &, class QDateTime &, int) - ?getSavedLocations@TimezoneClient@@QAE?AV?$QList@ULocationInfo@@@@XZ @ 21 NONAME ; class QList TimezoneClient::getSavedLocations(void) - ?listUpdated@TimezoneClient@@IAEXXZ @ 22 NONAME ; void TimezoneClient::listUpdated(void) - ?populateCities@TimezoneClient@@AAEXXZ @ 23 NONAME ; void TimezoneClient::populateCities(void) - ?tr@TimezoneClient@@SA?AVQString@@PBD0@Z @ 24 NONAME ; class QString TimezoneClient::tr(char const *, char const *) - ?getStaticMetaObject@TimezoneClient@@SAABUQMetaObject@@XZ @ 25 NONAME ; struct QMetaObject const & TimezoneClient::getStaticMetaObject(void) - ?metaObject@TimezoneClient@@UBEPBUQMetaObject@@XZ @ 26 NONAME ; struct QMetaObject const * TimezoneClient::metaObject(void) const - ?setDateTime@TimezoneClient@@QAEXVQDateTime@@@Z @ 27 NONAME ; void TimezoneClient::setDateTime(class QDateTime) - ??0TimezoneClient@@QAE@PAVQObject@@@Z @ 28 NONAME ; TimezoneClient::TimezoneClient(class QObject *) - ?setTimeUpdateOn@TimezoneClient@@QAEX_N@Z @ 29 NONAME ; void TimezoneClient::setTimeUpdateOn(bool) - ?getCountries@TimezoneClient@@QAEXAAV?$QMap@VQString@@H@@@Z @ 30 NONAME ; void TimezoneClient::getCountries(class QMap &) - ?getCityGroupIdByName@TimezoneClient@@QAEHABVQString@@@Z @ 31 NONAME ; int TimezoneClient::getCityGroupIdByName(class QString const &) - ?checkForDstChange@TimezoneClient@@QAE_NAAUAlarmInfo@@@Z @ 32 NONAME ; bool TimezoneClient::checkForDstChange(struct AlarmInfo &) - ?getCitiesForCountry@TimezoneClient@@QAEXHAAV?$QMap@VQString@@H@@@Z @ 33 NONAME ; void TimezoneClient::getCitiesForCountry(int, class QMap &) - ?isDSTOnL@TimezoneClient@@QAE_NH@Z @ 34 NONAME ; bool TimezoneClient::isDSTOnL(int) - ?timechanged@TimezoneClient@@IAEXXZ @ 35 NONAME ; void TimezoneClient::timechanged(void) - ??1TimezoneClient@@UAE@XZ @ 36 NONAME ; TimezoneClient::~TimezoneClient(void) - ?saveLocations@TimezoneClient@@QAEXABV?$QList@ULocationInfo@@@@@Z @ 37 NONAME ; void TimezoneClient::saveLocations(class QList const &) - ?getLocationInfo@TimezoneClient@@QAEXHHAAULocationInfo@@@Z @ 38 NONAME ; void TimezoneClient::getLocationInfo(int, int, struct LocationInfo &) - ?qt_metacall@TimezoneClient@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 39 NONAME ; int TimezoneClient::qt_metacall(enum QMetaObject::Call, int, void * *) - ?addCity@TimezoneClient@@QAE?AULocationInfo@@HAAVQString@@H@Z @ 40 NONAME ; struct LocationInfo TimezoneClient::addCity(int, class QString &, int) - ?getAllTimeZoneOffsets@TimezoneClient@@QAE?AV?$QList@H@@XZ @ 41 NONAME ; class QList TimezoneClient::getAllTimeZoneOffsets(void) - ?getCountriesForUTCOffset@TimezoneClient@@QAE?AV?$QList@ULocationInfo@@@@H@Z @ 42 NONAME ; class QList TimezoneClient::getCountriesForUTCOffset(int) - ?getAllTimeZoneIds@TimezoneClient@@QAE?AV?$QList@H@@XZ @ 43 NONAME ; class QList TimezoneClient::getAllTimeZoneIds(void) - diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/clockalarms/bwins/clockalarmclientu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockmw/clockalarms/bwins/clockalarmclientu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ +EXPORTS + ?deleteSnoozedAlarm@AlarmClient@@QAEHH@Z @ 1 NONAME ; int AlarmClient::deleteSnoozedAlarm(int) + ?setAlarmRepeatType@AlarmClient@@AAEXW4AlarmRepeatType@@AAW4TAlarmRepeatDefinition@@@Z @ 2 NONAME ; void AlarmClient::setAlarmRepeatType(enum AlarmRepeatType, enum TAlarmRepeatDefinition &) + ?staticMetaObject@AlarmClient@@2UQMetaObject@@B @ 3 NONAME ; struct QMetaObject const AlarmClient::staticMetaObject + ?metaObject@AlarmClient@@UBEPBUQMetaObject@@XZ @ 4 NONAME ; struct QMetaObject const * AlarmClient::metaObject(void) const + ?trUtf8@AlarmClient@@SA?AVQString@@PBD0H@Z @ 5 NONAME ; class QString AlarmClient::trUtf8(char const *, char const *, int) + ?startListener@AlarmClient@@QAEXXZ @ 6 NONAME ; void AlarmClient::startListener(void) + ?alarmStateChanged@AlarmClient@@IAEXH@Z @ 7 NONAME ; void AlarmClient::alarmStateChanged(int) + ?toggleAlarmStatus@AlarmClient@@QAEXHH@Z @ 8 NONAME ; void AlarmClient::toggleAlarmStatus(int, int) + ?notifyChange@AlarmClient@@QAEXH@Z @ 9 NONAME ; void AlarmClient::notifyChange(int) + ?tr@AlarmClient@@SA?AVQString@@PBD0@Z @ 10 NONAME ; class QString AlarmClient::tr(char const *, char const *) + ?setAlarmState@AlarmClient@@AAEXW4AlarmState@@AAW4TAlarmState@@@Z @ 11 NONAME ; void AlarmClient::setAlarmState(enum AlarmState, enum TAlarmState &) + ?getStaticMetaObject@AlarmClient@@SAABUQMetaObject@@XZ @ 12 NONAME ; struct QMetaObject const & AlarmClient::getStaticMetaObject(void) + ?trUtf8@AlarmClient@@SA?AVQString@@PBD0@Z @ 13 NONAME ; class QString AlarmClient::trUtf8(char const *, char const *) + ?qt_metacast@AlarmClient@@UAEPAXPBD@Z @ 14 NONAME ; void * AlarmClient::qt_metacast(char const *) + ??0AlarmClient@@QAE@PAVQObject@@@Z @ 15 NONAME ; AlarmClient::AlarmClient(class QObject *) + ??1AlarmClient@@UAE@XZ @ 16 NONAME ; AlarmClient::~AlarmClient(void) + ?tr@AlarmClient@@SA?AVQString@@PBD0H@Z @ 17 NONAME ; class QString AlarmClient::tr(char const *, char const *, int) + ?setAlarm@AlarmClient@@QAEXAAUAlarmInfo@@@Z @ 18 NONAME ; void AlarmClient::setAlarm(struct AlarmInfo &) + ?deleteAlarm@AlarmClient@@QAEXH@Z @ 19 NONAME ; void AlarmClient::deleteAlarm(int) + ?stopListener@AlarmClient@@QAEXXZ @ 20 NONAME ; void AlarmClient::stopListener(void) + ??_EAlarmClient@@UAE@I@Z @ 21 NONAME ; AlarmClient::~AlarmClient(unsigned int) + ?getAlarmList@AlarmClient@@QAEXAAV?$QList@UAlarmInfo@@@@@Z @ 22 NONAME ; void AlarmClient::getAlarmList(class QList &) + ?setAlarmState@AlarmClient@@AAEXW4TAlarmState@@AAW4AlarmState@@@Z @ 23 NONAME ; void AlarmClient::setAlarmState(enum TAlarmState, enum AlarmState &) + ?setAlarmRepeatType@AlarmClient@@AAEXW4TAlarmRepeatDefinition@@AAW4AlarmRepeatType@@@Z @ 24 NONAME ; void AlarmClient::setAlarmRepeatType(enum TAlarmRepeatDefinition, enum AlarmRepeatType &) + ?getAlarmInfo@AlarmClient@@QAEHHAAUAlarmInfo@@@Z @ 25 NONAME ; int AlarmClient::getAlarmInfo(int, struct AlarmInfo &) + ?qt_metacall@AlarmClient@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 26 NONAME ; int AlarmClient::qt_metacall(enum QMetaObject::Call, int, void * *) + diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/clockalarms/eabi/clockalarmclientu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockmw/clockalarms/eabi/clockalarmclientu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ +EXPORTS + _ZN11AlarmClient11deleteAlarmEi @ 1 NONAME + _ZN11AlarmClient11qt_metacallEN11QMetaObject4CallEiPPv @ 2 NONAME + _ZN11AlarmClient11qt_metacastEPKc @ 3 NONAME + _ZN11AlarmClient12getAlarmInfoEiR9AlarmInfo @ 4 NONAME + _ZN11AlarmClient12getAlarmListER5QListI9AlarmInfoE @ 5 NONAME + _ZN11AlarmClient12notifyChangeEi @ 6 NONAME + _ZN11AlarmClient12stopListenerEv @ 7 NONAME + _ZN11AlarmClient13setAlarmStateE10AlarmStateR11TAlarmState @ 8 NONAME + _ZN11AlarmClient13setAlarmStateE11TAlarmStateR10AlarmState @ 9 NONAME + _ZN11AlarmClient13startListenerEv @ 10 NONAME + _ZN11AlarmClient16staticMetaObjectE @ 11 NONAME DATA 16 + _ZN11AlarmClient17alarmStateChangedEi @ 12 NONAME + _ZN11AlarmClient17toggleAlarmStatusEii @ 13 NONAME + _ZN11AlarmClient18deleteSnoozedAlarmEi @ 14 NONAME + _ZN11AlarmClient18setAlarmRepeatTypeE15AlarmRepeatTypeR22TAlarmRepeatDefinition @ 15 NONAME + _ZN11AlarmClient18setAlarmRepeatTypeE22TAlarmRepeatDefinitionR15AlarmRepeatType @ 16 NONAME + _ZN11AlarmClient19getStaticMetaObjectEv @ 17 NONAME + _ZN11AlarmClient8setAlarmER9AlarmInfo @ 18 NONAME + _ZN11AlarmClientC1EP7QObject @ 19 NONAME + _ZN11AlarmClientC2EP7QObject @ 20 NONAME + _ZN11AlarmClientD0Ev @ 21 NONAME + _ZN11AlarmClientD1Ev @ 22 NONAME + _ZN11AlarmClientD2Ev @ 23 NONAME + _ZNK11AlarmClient10metaObjectEv @ 24 NONAME + _ZTI11AlarmClient @ 25 NONAME + _ZTV11AlarmClient @ 26 NONAME + diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/clockalarms/inc/alarmclient.h --- a/clock/clockmw/clockalarms/inc/alarmclient.h Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockmw/clockalarms/inc/alarmclient.h Mon Jun 28 15:22:02 2010 +0530 @@ -56,6 +56,7 @@ void getAlarmList(QList& alarmList); void setAlarm(AlarmInfo& alarmInfo); void deleteAlarm(int alarmId); + int deleteSnoozedAlarm(int alarmId); int getAlarmInfo(int alarmId, AlarmInfo& alarmInfo); void toggleAlarmStatus(int alarmId, int alarmStatus); diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/clockalarms/src/alarmclient.cpp --- a/clock/clockmw/clockalarms/src/alarmclient.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockmw/clockalarms/src/alarmclient.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -18,8 +18,6 @@ // System includes #include -#include - // User includes #include "alarmclient.h" #include "alarmlistener.h" @@ -34,18 +32,11 @@ AlarmClient::AlarmClient(QObject* parent) :QObject(parent), mListener(0) -{ - qDebug("clock: AlarmClient::AlarmClient() -->"); - +{ // Connect to the alarm server. User::LeaveIfError(mAlarmSrvSession.Connect()); - - qDebug("clock: AlarmClient::AlarmClient() - Connection done, looks ok."); - // Construct the listener, but do not start it. mListener = new AlarmListener(this, mAlarmSrvSession); - - qDebug("clock: AlarmClient::AlarmClient() <--"); } /*! @@ -53,7 +44,6 @@ */ AlarmClient::~AlarmClient() { - qDebug("clock: AlarmClient::~AlarmClient() -->"); if (mListener) { mListener->stop(); @@ -61,8 +51,6 @@ mListener = 0; } mAlarmSrvSession.Close(); - - qDebug("clock: AlarmClient::~AlarmClient() <--"); } /*! @@ -72,8 +60,6 @@ */ void AlarmClient::getAlarmList(QList& alarmList) { - qDebug() << "clock: AlarmClient::getAlarmList -->"; - // This will hold the alarm ids returned from alarm server. RArray alarmIdArray; AlarmInfo alarmInfo; @@ -135,8 +121,6 @@ } // Cleanup. alarmIdArray.Close(); - - qDebug() << "clock: AlarmClient::getAlarmList <--"; } /*! @@ -144,8 +128,6 @@ */ void AlarmClient::setAlarm(AlarmInfo& alarmInfo) { - qDebug() << "clock: AlarmClient::setAlarm -->"; - // Get the current home time TTime homeTime; homeTime.HomeTime(); @@ -222,14 +204,10 @@ alarmInfo.alarmDateTime = alarmDate; } - - qDebug() << "clock: AlarmClient::setAlarm <--"; } void AlarmClient::setAlarmState(TAlarmState state, AlarmState& alarmState) { - qDebug() << "clock: AlarmClient::setAlarmState -->"; - switch (state) { case EAlarmStateInPreparation: alarmState = InPreparation; @@ -253,13 +231,10 @@ break; } - qDebug() << "clock: AlarmClient::setAlarmState <--"; } void AlarmClient::setAlarmState(AlarmState state, TAlarmState& alarmState) { - qDebug() << "clock: AlarmClient::setAlarmState -->"; - switch (state) { case InPreparation: alarmState = EAlarmStateInPreparation; @@ -282,15 +257,11 @@ default: break; } - - qDebug() << "clock: AlarmClient::setAlarmState <--"; } void AlarmClient::setAlarmRepeatType( TAlarmRepeatDefinition repeat, AlarmRepeatType& repeatType) { - qDebug() << "clock: AlarmClient::setAlarmRepeatType -->"; - switch (repeat) { case EAlarmRepeatDefintionRepeatOnce: repeatType = Once; @@ -307,15 +278,11 @@ default: break; } - - qDebug() << "clock: AlarmClient::setAlarmRepeatType <--"; } void AlarmClient::setAlarmRepeatType( AlarmRepeatType repeat, TAlarmRepeatDefinition& repeatType) { - qDebug() << "clock: AlarmClient::setAlarmRepeatType -->"; - switch (repeat) { case Once: repeatType = EAlarmRepeatDefintionRepeatOnce; @@ -332,24 +299,41 @@ default: break; } - - qDebug() << "clock: AlarmClient::setAlarmRepeatType <--"; } void AlarmClient::deleteAlarm(int alarmId) { - qDebug() << "clock: AlarmClient::deleteAlarm -->"; - // Request the alarmserver to delete the alarm. mAlarmSrvSession.AlarmDelete(alarmId); +} - qDebug() << "clock: AlarmClient::deleteAlarm <--"; +/*! + Delete the snoozed alarm. + + \param alarmId needs to be deleted and reset again. + \return int error value if any. + */ +int AlarmClient::deleteSnoozedAlarm(int alarmId) +{ + AlarmInfo alarmInfo; + int retVal(KErrNone); + int returnVal = getAlarmInfo(alarmId, alarmInfo); + if (KErrNone != retVal) { + return retVal; + } + returnVal = mAlarmSrvSession.AlarmDelete(alarmId); + if (KErrNone != retVal) { + return retVal; + } + alarmInfo.alarmState = InPreparation; + alarmInfo.nextDueTime = alarmInfo.origAlarmTime; + setAlarm(alarmInfo); + + return retVal; } int AlarmClient::getAlarmInfo(int alarmId, AlarmInfo& alarmInfo) { - qDebug() << "clock: AlarmClient::getAlarmInfo -->"; - TASShdAlarm tempSharedAlarm; // Get the requested alarm info from the alarm server. @@ -373,11 +357,15 @@ tempSharedAlarm.NextDueTime().DateTime().Minute(), tempSharedAlarm.NextDueTime().DateTime().Second()); - // Alarm day + // Alarm date alarmInfo.alarmDateTime.setYMD( tempSharedAlarm.OriginalExpiryTime().DateTime().Year(), tempSharedAlarm.OriginalExpiryTime().DateTime().Month()+1, tempSharedAlarm.OriginalExpiryTime().DateTime().Day()+1); + + // Set alarm day. + alarmInfo.alarmDay = + tempSharedAlarm.OriginalExpiryTime().DayNoInWeek(); // The alarm status if (EAlarmStatusEnabled == tempSharedAlarm.Status()) { @@ -404,46 +392,31 @@ alarmInfo.volumeStatus = AlarmVolumeOff; } } - - qDebug() << "clock: AlarmClient::getAlarmInfo <--"; - return error; } void AlarmClient::toggleAlarmStatus(int alarmId, int alarmStatus) { - qDebug() << "clock: AlarmClient::toggleAlarmStatus -->"; mAlarmSrvSession.SetAlarmStatus(alarmId, (TAlarmStatus)alarmStatus); - qDebug() << "clock: AlarmClient::toggleAlarmStatus <--"; } void AlarmClient::startListener() { - qDebug("clock: AlarmClient::startListener() -->"); + mListener->start(); - mListener->start(); - - qDebug("clock: AlarmClient::startListener() <--"); } void AlarmClient::stopListener() { - qDebug("clock: AlarmClient::stopListener() -->"); - mListener->stop(); - qDebug("clock: AlarmClient::stopListener() <--"); } void AlarmClient::notifyChange(int alarmId) { - qDebug() << "clock: AlarmClient::notifyChange -->"; - - emit alarmStateChanged(alarmId); - - qDebug() << "clock: AlarmClient::notifyChange <--"; + emit alarmStateChanged(alarmId); } // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/clockalarms/src/alarmlistener.cpp --- a/clock/clockmw/clockalarms/src/alarmlistener.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockmw/clockalarms/src/alarmlistener.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -25,57 +25,39 @@ mClient(client), mSession(session) { - qDebug("clock: AlarmListener::AlarmListener -->"); - - // Nothing to do. - - qDebug("clock: AlarmListener::AlarmListener <--"); + // Nothing to do. } AlarmListener::~AlarmListener() { - qDebug("clock: AlarmListener::~AlarmListener -->"); - if (IsActive()) { Cancel(); } - qDebug("clock: AlarmListener::~AlarmListener <--"); } void AlarmListener::start() { - qDebug("clock: AlarmListener::start -->"); - // Add the AO to the scheduler. CActiveScheduler::Add(this); // Subscrive for async notification from alarm server. mSession.NotifyChange(iStatus, mAlarmId); - qDebug("clock: AlarmListener::start - Successfully subscribed for change notifiation."); - // Set the AO active. SetActive(); - qDebug("clock: AlarmListener::start <--"); } void AlarmListener::stop() { - qDebug("clock: AlarmListener::stop -->"); - if (IsActive()) { Cancel(); } - - qDebug("clock: AlarmListener::stop <--"); } void AlarmListener::RunL() { - qDebug("clock: AlarmListener::RunL --"); - if (iStatus != KRequestPending) { // We get notification for various changes with the alarm server. // Only the required Events are used to emit a signal. @@ -95,18 +77,13 @@ SetActive(); } - - qDebug("clock: AlarmListener::RunL <--"); } void AlarmListener::DoCancel() { - qDebug("clock: AlarmListener::DoCancel -->"); - // Cancel async request. mSession.NotifyChangeCancel(); - qDebug("clock: AlarmListener::DoCancel <--"); } // End of file diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/clocksettingsutility/bwins/clocksettingsutilityu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockmw/clocksettingsutility/bwins/clocksettingsutilityu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,34 @@ +EXPORTS + ?timeFormat@SettingsUtility@@QAEHAAVQStringList@@@Z @ 1 NONAME ; int SettingsUtility::timeFormat(class QStringList &) + ?setSnoozeTime@SettingsUtility@@QAEXH@Z @ 2 NONAME ; void SettingsUtility::setSnoozeTime(int) + ?workdays@SettingsUtility@@QAEHAAVQStringList@@@Z @ 3 NONAME ; int SettingsUtility::workdays(class QStringList &) + ?setDateFormat@SettingsUtility@@QAEXABVQString@@@Z @ 4 NONAME ; void SettingsUtility::setDateFormat(class QString const &) + ?time@SettingsUtility@@QAE?AVQString@@XZ @ 5 NONAME ; class QString SettingsUtility::time(void) + ?staticMetaObject@SettingsUtility@@2UQMetaObject@@B @ 6 NONAME ; struct QMetaObject const SettingsUtility::staticMetaObject + ?clockType@SettingsUtility@@QAEHAAVQStringList@@@Z @ 7 NONAME ; int SettingsUtility::clockType(class QStringList &) + ?setDateSeparator@SettingsUtility@@QAEXABVQString@@@Z @ 8 NONAME ; void SettingsUtility::setDateSeparator(class QString const &) + ?date@SettingsUtility@@QAE?AVQString@@XZ @ 9 NONAME ; class QString SettingsUtility::date(void) + ?dateFormat@SettingsUtility@@QAEHAAVQStringList@@@Z @ 10 NONAME ; int SettingsUtility::dateFormat(class QStringList &) + ?dateSeparator@SettingsUtility@@QAEHAAVQStringList@@@Z @ 11 NONAME ; int SettingsUtility::dateSeparator(class QStringList &) + ?setTimeSeparator@SettingsUtility@@QAEXABVQString@@@Z @ 12 NONAME ; void SettingsUtility::setTimeSeparator(class QString const &) + ?snoozeTime@SettingsUtility@@QAEHAAVQStringList@@@Z @ 13 NONAME ; int SettingsUtility::snoozeTime(class QStringList &) + ?qt_metacast@SettingsUtility@@UAEPAXPBD@Z @ 14 NONAME ; void * SettingsUtility::qt_metacast(char const *) + ?setWorkdays@SettingsUtility@@QAEXABVQString@@@Z @ 15 NONAME ; void SettingsUtility::setWorkdays(class QString const &) + ?dateFormatString@SettingsUtility@@QAE?AVQString@@XZ @ 16 NONAME ; class QString SettingsUtility::dateFormatString(void) + ??_ESettingsUtility@@UAE@I@Z @ 17 NONAME ; SettingsUtility::~SettingsUtility(unsigned int) + ?metaObject@SettingsUtility@@UBEPBUQMetaObject@@XZ @ 18 NONAME ; struct QMetaObject const * SettingsUtility::metaObject(void) const + ??0SettingsUtility@@QAE@PAVQObject@@@Z @ 19 NONAME ; SettingsUtility::SettingsUtility(class QObject *) + ?qt_metacall@SettingsUtility@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 20 NONAME ; int SettingsUtility::qt_metacall(enum QMetaObject::Call, int, void * *) + ?timeSeparator@SettingsUtility@@QAEHAAVQStringList@@@Z @ 21 NONAME ; int SettingsUtility::timeSeparator(class QStringList &) + ?setClockType@SettingsUtility@@QAEXABVQString@@@Z @ 22 NONAME ; void SettingsUtility::setClockType(class QString const &) + ?setTimeFormat@SettingsUtility@@QAEXABVQString@@@Z @ 23 NONAME ; void SettingsUtility::setTimeFormat(class QString const &) + ?settingsChanged@SettingsUtility@@IAEXW4SettingsItemChanged@@VQString@@@Z @ 24 NONAME ; void SettingsUtility::settingsChanged(enum SettingsItemChanged, class QString) + ?timeFormatString@SettingsUtility@@QAE?AVQString@@XZ @ 25 NONAME ; class QString SettingsUtility::timeFormatString(void) + ?tr@SettingsUtility@@SA?AVQString@@PBD0H@Z @ 26 NONAME ; class QString SettingsUtility::tr(char const *, char const *, int) + ??1SettingsUtility@@UAE@XZ @ 27 NONAME ; SettingsUtility::~SettingsUtility(void) + ?setStartOfWeek@SettingsUtility@@QAEXH@Z @ 28 NONAME ; void SettingsUtility::setStartOfWeek(int) + ?trUtf8@SettingsUtility@@SA?AVQString@@PBD0@Z @ 29 NONAME ; class QString SettingsUtility::trUtf8(char const *, char const *) + ?tr@SettingsUtility@@SA?AVQString@@PBD0@Z @ 30 NONAME ; class QString SettingsUtility::tr(char const *, char const *) + ?trUtf8@SettingsUtility@@SA?AVQString@@PBD0H@Z @ 31 NONAME ; class QString SettingsUtility::trUtf8(char const *, char const *, int) + ?getStaticMetaObject@SettingsUtility@@SAABUQMetaObject@@XZ @ 32 NONAME ; struct QMetaObject const & SettingsUtility::getStaticMetaObject(void) + diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/clocksettingsutility/eabi/clocksettingsutilityu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockmw/clocksettingsutility/eabi/clocksettingsutilityu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,34 @@ +EXPORTS + _ZN15SettingsUtility10dateFormatER11QStringList @ 1 NONAME + _ZN15SettingsUtility10snoozeTimeER11QStringList @ 2 NONAME + _ZN15SettingsUtility10timeFormatER11QStringList @ 3 NONAME + _ZN15SettingsUtility11qt_metacallEN11QMetaObject4CallEiPPv @ 4 NONAME + _ZN15SettingsUtility11qt_metacastEPKc @ 5 NONAME + _ZN15SettingsUtility11setWorkdaysERK7QString @ 6 NONAME + _ZN15SettingsUtility12setClockTypeERK7QString @ 7 NONAME + _ZN15SettingsUtility13dateSeparatorER11QStringList @ 8 NONAME + _ZN15SettingsUtility13setDateFormatERK7QString @ 9 NONAME + _ZN15SettingsUtility13setSnoozeTimeEi @ 10 NONAME + _ZN15SettingsUtility13setTimeFormatERK7QString @ 11 NONAME + _ZN15SettingsUtility13timeSeparatorER11QStringList @ 12 NONAME + _ZN15SettingsUtility14setStartOfWeekEi @ 13 NONAME + _ZN15SettingsUtility15settingsChangedE19SettingsItemChanged7QString @ 14 NONAME + _ZN15SettingsUtility16dateFormatStringEv @ 15 NONAME + _ZN15SettingsUtility16setDateSeparatorERK7QString @ 16 NONAME + _ZN15SettingsUtility16setTimeSeparatorERK7QString @ 17 NONAME + _ZN15SettingsUtility16staticMetaObjectE @ 18 NONAME DATA 16 + _ZN15SettingsUtility16timeFormatStringEv @ 19 NONAME + _ZN15SettingsUtility19getStaticMetaObjectEv @ 20 NONAME + _ZN15SettingsUtility4dateEv @ 21 NONAME + _ZN15SettingsUtility4timeEv @ 22 NONAME + _ZN15SettingsUtility8workdaysER11QStringList @ 23 NONAME + _ZN15SettingsUtility9clockTypeER11QStringList @ 24 NONAME + _ZN15SettingsUtilityC1EP7QObject @ 25 NONAME + _ZN15SettingsUtilityC2EP7QObject @ 26 NONAME + _ZN15SettingsUtilityD0Ev @ 27 NONAME + _ZN15SettingsUtilityD1Ev @ 28 NONAME + _ZN15SettingsUtilityD2Ev @ 29 NONAME + _ZNK15SettingsUtility10metaObjectEv @ 30 NONAME + _ZTI15SettingsUtility @ 31 NONAME + _ZTV15SettingsUtility @ 32 NONAME + diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/clocksettingsutility/inc/settingsutility.h --- a/clock/clockmw/clocksettingsutility/inc/settingsutility.h Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockmw/clocksettingsutility/inc/settingsutility.h Mon Jun 28 15:22:02 2010 +0530 @@ -42,11 +42,11 @@ ~SettingsUtility(); public: - void setTime(const QString &time); +// void setTime(const QString &time); QString time(); - void setTimeZone(const QString &timezone); - QString timeZone(); +/* void setTimeZone(const QString &timezone); + QString timeZone();*/ void setTimeFormat(const QString &format); int timeFormat(QStringList &format); @@ -57,10 +57,10 @@ void setTimeSeparator(const QString &separator); int timeSeparator(QStringList &list); - void setAutoUpdate(const QString &value); - int autoUpdate(QStringList &list); +/* void setAutoUpdate(const QString &value); + int autoUpdate(QStringList &list);*/ - void setDate(const QString &date); +// void setDate(const QString &date); QString date(); void setDateFormat(const QString &format); @@ -91,8 +91,6 @@ QStringList mDateSeparatorList; QStringList mAutoUpdateValueList; QStringList mSnoozeValueList; - - TimezoneClient *mTimeZoneClient; }; #endif // SETTINGSUTILITY_H diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/clocksettingsutility/src/settingsutility.cpp --- a/clock/clockmw/clocksettingsutility/src/settingsutility.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockmw/clocksettingsutility/src/settingsutility.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -37,21 +37,13 @@ SettingsUtility::SettingsUtility(QObject *parent) :QObject(parent) { - qDebug("clock: SettingsUtility::SettingsUtility -->"); - mTimeSeparatorList << tr(".") << tr(":"); - mClockTypeList << tr("Analog") << tr("Digital"); + mClockTypeList << hbTrId("txt_clock_button_digital") << hbTrId("txt_clock_button_analog"); mTimeFormatList << hbTrId("txt_clk_setlabel_val_24_hour") << hbTrId("txt_clk_setlabel_val_12_hour"); mDateFormatList << hbTrId("txt_clk_setlabel_val_dd_mm_yyyy") << hbTrId("txt_clk_setlabel_val_mm_dd_yyyy") << hbTrId("txt_clk_setlabel_val_yyyy_mm_dd"); mDateSeparatorList << tr(".") << tr(":") << tr("/") << tr("-"); mAutoUpdateValueList << tr("ON") << tr("OFF"); mSnoozeValueList << tr("5 minutes") << tr("15 minutes") << tr(" 30 minutes") << tr("1 hour"); - - mTimeZoneClient = new TimezoneClient(this); - - qDebug("clock: SettingsUtility::SettingsUtility <--"); - -// mSettingsMamager = new XQSettingsManager(this); } /*! @@ -59,23 +51,11 @@ */ SettingsUtility::~SettingsUtility() { - // Nothing yet. + // Nothing. } /*! - - */ -void SettingsUtility::setTime(const QString &time) -{ - QTime newTime = QTime::fromString(time, timeFormatString()); - - if (newTime.isValid()) { - mTimeZoneClient->setDateTime(QDateTime(QDate::currentDate(), newTime)); - } -} - -/*! - + Returns the current time in the device. */ QString SettingsUtility::time() { @@ -85,64 +65,6 @@ /*! */ -void SettingsUtility::setTimeZone(const QString &timezone) -{ - Q_UNUSED(timezone) -} - -/*! - - */ -QString SettingsUtility::timeZone() -{ - QStringList dummyList; - - // Get the current zone info. - LocationInfo currentZoneInfo = mTimeZoneClient->getCurrentZoneInfoL(); - - // Construct the GMT +/- X string. - QString gmtOffset(hbTrId("txt_common_common_gmt")); - - int utcOffset = currentZoneInfo.zoneOffset; - int offsetInHours (utcOffset/60); - int offsetInMinutes (utcOffset%60); - - // Check wether the offset is +ve or -ve. - if (0 < utcOffset) { - // We have a positive offset. Append the '+' character. - gmtOffset += tr("+ "); - } else if (0 > utcOffset) { - // We have a negative offset. Append the '-' character. - gmtOffset += tr("- "); - offsetInHours = -offsetInHours; - } else { - // We dont have an offset. We are at GMT zone. - } - - // Append the hour component. - gmtOffset += QString::number(offsetInHours); - - // Append the time separator. - gmtOffset += mTimeSeparatorList.at(timeSeparator(dummyList)); - - // Append the minute component. - // If minute component is less less than 10, append a '00' - if (0 <= offsetInMinutes && offsetInMinutes < 10) { - gmtOffset += tr("00"); - } else { - gmtOffset += QString::number(offsetInMinutes); - } - - gmtOffset += tr(" "); - // TODO: append city name when more than one cities else country name. - gmtOffset += currentZoneInfo.cityName; - - return gmtOffset; -} - -/*! - - */ void SettingsUtility::setTimeFormat(const QString& format) { TLocale locale; @@ -234,8 +156,6 @@ */ int SettingsUtility::timeSeparator(QStringList &list) { - qDebug() << "clock: SettingsUtility::timeSeparator -->"; - TLocale locale; TChar separatorChar = locale.TimeSeparator(1); int value = -1; @@ -249,70 +169,14 @@ } list = mTimeSeparatorList; - - qDebug() << "clock: SettingsUtility::timeSeparator <--"; - return value; } /*! */ -void SettingsUtility::setAutoUpdate(const QString &value) -{ - // TODO: implement the changes after server is in place. - // 1. Inform the server about the setting. - // 2. Get the status of the change from server - // 3. Emit the signal to inform the clients of the change in the settings item, - // pass the enum of settings item changed and the updated value. - - if (0 == value.compare(tr("ON"), Qt::CaseInsensitive)) { - mTimeZoneClient->setTimeUpdateOn(true); - } else { - mTimeZoneClient->setTimeUpdateOn(false); - } - - emit settingsChanged(AutoTimeUpdate, value); -} - -/*! - - */ -int SettingsUtility::autoUpdate(QStringList &list) -{ - // TODO: implement properly. this is jst a dummy implementation. - int value = 1; - - bool autoUpdate = mTimeZoneClient->timeUpdateOn(); - - if (autoUpdate) { - value = 0; - } - list = mAutoUpdateValueList; - return value; -} - -/*! - - */ -void SettingsUtility::setDate(const QString &date) -{ - QDate newDate = QDate::fromString(date, dateFormatString()); - - if (newDate.isValid()) { - mTimeZoneClient->setDateTime(QDateTime(newDate, QTime::currentTime())); - } -} - -/*! - - */ QString SettingsUtility::date() { - qDebug() << "clock: SettingsUtility::date -->"; - - qDebug() << "clock: SettingsUtility::date <--"; - return QDate::currentDate().toString(dateFormatString()); } @@ -456,9 +320,9 @@ QStringList dummyList; if (ETime24 == locale.TimeFormat()) { - format = QString("h:mm"); + format = QString("hh:mm"); } else if (ETime12 == locale.TimeFormat()) { - format = QString("h:mm ap"); + format = QString("hh:mm ap"); } QString separator = mTimeSeparatorList.at(timeSeparator(dummyList)); diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/clocktimezone/bwins/timezoneclientu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockmw/clocktimezone/bwins/timezoneclientu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,53 @@ +EXPORTS + ?deleteInstance@TimezoneClient@@QAEXXZ @ 1 NONAME ; void TimezoneClient::deleteInstance(void) + ?addCity@TimezoneClient@@QAE?AULocationInfo@@HAAVQString@@H@Z @ 2 NONAME ; struct LocationInfo TimezoneClient::addCity(int, class QString &, int) + ?isNull@TimezoneClient@@QAE_NXZ @ 3 NONAME ; bool TimezoneClient::isNull(void) + ??_ETimezoneClient@@UAE@I@Z @ 4 NONAME ; TimezoneClient::~TimezoneClient(unsigned int) + ?getLocations@TimezoneClient@@QAEAAV?$QList@ULocationInfo@@@@XZ @ 5 NONAME ; class QList & TimezoneClient::getLocations(void) + ?getDstRulesL@TimezoneClient@@AAEXAAVQDateTime@@0H@Z @ 6 NONAME ; void TimezoneClient::getDstRulesL(class QDateTime &, class QDateTime &, int) + ?locationSelectorModel@TimezoneClient@@QAEPAVQStandardItemModel@@XZ @ 7 NONAME ; class QStandardItemModel * TimezoneClient::locationSelectorModel(void) + ?getUtcDstOffsetL@TimezoneClient@@AAE_NAAHABVCTzId@@@Z @ 8 NONAME ; bool TimezoneClient::getUtcDstOffsetL(int &, class CTzId const &) + ??0TimezoneClient@@AAE@XZ @ 9 NONAME ; TimezoneClient::TimezoneClient(void) + ?intToMonth@TimezoneClient@@AAE?AW4TMonth@@H@Z @ 10 NONAME ; enum TMonth TimezoneClient::intToMonth(int) + ?getDstZoneOffset@TimezoneClient@@AAEHH@Z @ 11 NONAME ; int TimezoneClient::getDstZoneOffset(int) + ?environmentCallback@TimezoneClient@@SAHPAX@Z @ 12 NONAME ; int TimezoneClient::environmentCallback(void *) + ?trUtf8@TimezoneClient@@SA?AVQString@@PBD0H@Z @ 13 NONAME ; class QString TimezoneClient::trUtf8(char const *, char const *, int) + ?getStandardOffset@TimezoneClient@@QAEHH@Z @ 14 NONAME ; int TimezoneClient::getStandardOffset(int) + ?getCurrentZoneInfoL@TimezoneClient@@QAE?AULocationInfo@@XZ @ 15 NONAME ; struct LocationInfo TimezoneClient::getCurrentZoneInfoL(void) + ?dstOn@TimezoneClient@@QAE_NH@Z @ 16 NONAME ; bool TimezoneClient::dstOn(int) + ?createWorldClockModel@TimezoneClient@@QAEXXZ @ 17 NONAME ; void TimezoneClient::createWorldClockModel(void) + ?tr@TimezoneClient@@SA?AVQString@@PBD0H@Z @ 18 NONAME ; class QString TimezoneClient::tr(char const *, char const *, int) + ?setAsCurrentLocationL@TimezoneClient@@QAEXAAULocationInfo@@@Z @ 19 NONAME ; void TimezoneClient::setAsCurrentLocationL(struct LocationInfo &) + ?eventMonitor@TimezoneClient@@AAEXABVXQSettingsKey@@ABVQVariant@@@Z @ 20 NONAME ; void TimezoneClient::eventMonitor(class XQSettingsKey const &, class QVariant const &) + ?getInstance@TimezoneClient@@SAPAV1@XZ @ 21 NONAME ; class TimezoneClient * TimezoneClient::getInstance(void) + ?getCityGroupIdByName@TimezoneClient@@AAEHABVQString@@@Z @ 22 NONAME ; int TimezoneClient::getCityGroupIdByName(class QString const &) + ?getCityOffsetByNameAndId@TimezoneClient@@AAEHABVQString@@H@Z @ 23 NONAME ; int TimezoneClient::getCityOffsetByNameAndId(class QString const &, int) + ?getAllTimeZoneOffsets@TimezoneClient@@QAE?AV?$QList@H@@XZ @ 24 NONAME ; class QList TimezoneClient::getAllTimeZoneOffsets(void) + ?getCitiesForCountry@TimezoneClient@@AAEXHAAV?$QMap@VQString@@H@@@Z @ 25 NONAME ; void TimezoneClient::getCitiesForCountry(int, class QMap &) + ?getCountriesForUTCOffset@TimezoneClient@@QAE?AV?$QList@ULocationInfo@@@@H@Z @ 26 NONAME ; class QList TimezoneClient::getCountriesForUTCOffset(int) + ??1TimezoneClient@@EAE@XZ @ 27 NONAME ; TimezoneClient::~TimezoneClient(void) + ?timeUpdateOn@TimezoneClient@@QAE_NXZ @ 28 NONAME ; bool TimezoneClient::timeUpdateOn(void) + ?staticMetaObject@TimezoneClient@@2UQMetaObject@@B @ 29 NONAME ; struct QMetaObject const TimezoneClient::staticMetaObject + ?qt_metacast@TimezoneClient@@UAEPAXPBD@Z @ 30 NONAME ; void * TimezoneClient::qt_metacast(char const *) + ?autoTimeUpdateChanged@TimezoneClient@@IAEXH@Z @ 31 NONAME ; void TimezoneClient::autoTimeUpdateChanged(int) + ?trUtf8@TimezoneClient@@SA?AVQString@@PBD0@Z @ 32 NONAME ; class QString TimezoneClient::trUtf8(char const *, char const *) + ?listUpdated@TimezoneClient@@IAEXXZ @ 33 NONAME ; void TimezoneClient::listUpdated(void) + ?getSavedLocations@TimezoneClient@@QAE?AV?$QList@ULocationInfo@@@@XZ @ 34 NONAME ; class QList TimezoneClient::getSavedLocations(void) + ?getLocationInfo@TimezoneClient@@AAEXHHAAULocationInfo@@@Z @ 35 NONAME ; void TimezoneClient::getLocationInfo(int, int, struct LocationInfo &) + ?getAllTimeZoneIds@TimezoneClient@@QAE?AV?$QList@H@@XZ @ 36 NONAME ; class QList TimezoneClient::getAllTimeZoneIds(void) + ?populateCities@TimezoneClient@@AAEXXZ @ 37 NONAME ; void TimezoneClient::populateCities(void) + ?tr@TimezoneClient@@SA?AVQString@@PBD0@Z @ 38 NONAME ; class QString TimezoneClient::tr(char const *, char const *) + ?setDateTime@TimezoneClient@@QAEXVQDateTime@@@Z @ 39 NONAME ; void TimezoneClient::setDateTime(class QDateTime) + ?metaObject@TimezoneClient@@UBEPBUQMetaObject@@XZ @ 40 NONAME ; struct QMetaObject const * TimezoneClient::metaObject(void) const + ?getStaticMetaObject@TimezoneClient@@SAABUQMetaObject@@XZ @ 41 NONAME ; struct QMetaObject const & TimezoneClient::getStaticMetaObject(void) + ?mTimezoneClient@TimezoneClient@@0PAV1@A @ 42 NONAME ; class TimezoneClient * TimezoneClient::mTimezoneClient + ?cityUpdated@TimezoneClient@@IAEXXZ @ 43 NONAME ; void TimezoneClient::cityUpdated(void) + ?setTimeUpdateOn@TimezoneClient@@QAEX_N@Z @ 44 NONAME ; void TimezoneClient::setTimeUpdateOn(bool) + ?mReferenceCount@TimezoneClient@@0_NA @ 45 NONAME ; bool TimezoneClient::mReferenceCount + ?getCountries@TimezoneClient@@QAEXAAV?$QMap@VQString@@H@@@Z @ 46 NONAME ; void TimezoneClient::getCountries(class QMap &) + ?checkForDstChange@TimezoneClient@@QAE_NAAUAlarmInfo@@@Z @ 47 NONAME ; bool TimezoneClient::checkForDstChange(struct AlarmInfo &) + ?isDSTOnL@TimezoneClient@@QAE_NH@Z @ 48 NONAME ; bool TimezoneClient::isDSTOnL(int) + ?timechanged@TimezoneClient@@IAEXXZ @ 49 NONAME ; void TimezoneClient::timechanged(void) + ?saveLocations@TimezoneClient@@QAEXABV?$QList@ULocationInfo@@@@@Z @ 50 NONAME ; void TimezoneClient::saveLocations(class QList const &) + ?qt_metacall@TimezoneClient@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 51 NONAME ; int TimezoneClient::qt_metacall(enum QMetaObject::Call, int, void * *) + diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/clocktimezone/clocktimezone.pro --- a/clock/clockmw/clocktimezone/clocktimezone.pro Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockmw/clocktimezone/clocktimezone.pro Mon Jun 28 15:22:02 2010 +0530 @@ -41,7 +41,8 @@ -lbafl \ -ltimezonelocalization \ -ltzclient \ - -lclockserverclient + -lclockserverclient \ + -lxqsettingsmanager BLD_INF_RULES.prj_exports += \ "../../data/timezonedata/timezonelocalization.loc APP_LAYER_LOC_EXPORT_PATH(timezonelocalization.loc)" \ diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/clocktimezone/eabi/timezoneclientu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockmw/clocktimezone/eabi/timezoneclientu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,55 @@ +EXPORTS + _ZN14TimezoneClient10intToMonthEi @ 1 NONAME + _ZN14TimezoneClient11cityUpdatedEv @ 2 NONAME + _ZN14TimezoneClient11getInstanceEv @ 3 NONAME + _ZN14TimezoneClient11listUpdatedEv @ 4 NONAME + _ZN14TimezoneClient11qt_metacallEN11QMetaObject4CallEiPPv @ 5 NONAME + _ZN14TimezoneClient11qt_metacastEPKc @ 6 NONAME + _ZN14TimezoneClient11setDateTimeE9QDateTime @ 7 NONAME + _ZN14TimezoneClient11timechangedEv @ 8 NONAME + _ZN14TimezoneClient12eventMonitorERK13XQSettingsKeyRK8QVariant @ 9 NONAME + _ZN14TimezoneClient12getCountriesER4QMapI7QStringiE @ 10 NONAME + _ZN14TimezoneClient12getDstRulesLER9QDateTimeS1_i @ 11 NONAME + _ZN14TimezoneClient12getLocationsEv @ 12 NONAME + _ZN14TimezoneClient12timeUpdateOnEv @ 13 NONAME + _ZN14TimezoneClient13saveLocationsERK5QListI12LocationInfoE @ 14 NONAME + _ZN14TimezoneClient14deleteInstanceEv @ 15 NONAME + _ZN14TimezoneClient14populateCitiesEv @ 16 NONAME + _ZN14TimezoneClient15getLocationInfoEiiR12LocationInfo @ 17 NONAME + _ZN14TimezoneClient15mReferenceCountE @ 18 NONAME DATA 1 + _ZN14TimezoneClient15mTimezoneClientE @ 19 NONAME DATA 4 + _ZN14TimezoneClient15setTimeUpdateOnEb @ 20 NONAME + _ZN14TimezoneClient16getDstZoneOffsetEi @ 21 NONAME + _ZN14TimezoneClient16getUtcDstOffsetLERiRK5CTzId @ 22 NONAME + _ZN14TimezoneClient16staticMetaObjectE @ 23 NONAME DATA 16 + _ZN14TimezoneClient17checkForDstChangeER9AlarmInfo @ 24 NONAME + _ZN14TimezoneClient17getAllTimeZoneIdsEv @ 25 NONAME + _ZN14TimezoneClient17getSavedLocationsEv @ 26 NONAME + _ZN14TimezoneClient17getStandardOffsetEi @ 27 NONAME + _ZN14TimezoneClient19environmentCallbackEPv @ 28 NONAME + _ZN14TimezoneClient19getCitiesForCountryEiR4QMapI7QStringiE @ 29 NONAME + _ZN14TimezoneClient19getCurrentZoneInfoLEv @ 30 NONAME + _ZN14TimezoneClient19getStaticMetaObjectEv @ 31 NONAME + _ZN14TimezoneClient20getCityGroupIdByNameERK7QString @ 32 NONAME + _ZN14TimezoneClient21autoTimeUpdateChangedEi @ 33 NONAME + _ZN14TimezoneClient21createWorldClockModelEv @ 34 NONAME + _ZN14TimezoneClient21getAllTimeZoneOffsetsEv @ 35 NONAME + _ZN14TimezoneClient21locationSelectorModelEv @ 36 NONAME + _ZN14TimezoneClient21setAsCurrentLocationLER12LocationInfo @ 37 NONAME + _ZN14TimezoneClient24getCityOffsetByNameAndIdERK7QStringi @ 38 NONAME + _ZN14TimezoneClient24getCountriesForUTCOffsetEi @ 39 NONAME + _ZN14TimezoneClient5dstOnEi @ 40 NONAME + _ZN14TimezoneClient6isNullEv @ 41 NONAME + _ZN14TimezoneClient7addCityEiR7QStringi @ 42 NONAME + _ZN14TimezoneClient8isDSTOnLEi @ 43 NONAME + _ZN14TimezoneClientC1Ev @ 44 NONAME + _ZN14TimezoneClientC2Ev @ 45 NONAME + _ZN14TimezoneClientD0Ev @ 46 NONAME + _ZN14TimezoneClientD1Ev @ 47 NONAME + _ZN14TimezoneClientD2Ev @ 48 NONAME + _ZNK14TimezoneClient10metaObjectEv @ 49 NONAME + _ZTI14TimezoneClient @ 50 NONAME + _ZTV14TimezoneClient @ 51 NONAME + _ZThn8_N14TimezoneClientD0Ev @ 52 NONAME + _ZThn8_N14TimezoneClientD1Ev @ 53 NONAME + diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/clocktimezone/inc/timezoneclient.h --- a/clock/clockmw/clocktimezone/inc/timezoneclient.h Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockmw/clocktimezone/inc/timezoneclient.h Mon Jun 28 15:22:02 2010 +0530 @@ -41,6 +41,8 @@ class CEnvironmentChangeNotifier; class QStandardItemModel; class CTzLocalizer; +class XQSettingsManager; +class XQSettingsKey; const int KInitialEvent = ( EChangesLocale | @@ -56,29 +58,31 @@ Q_OBJECT public: - TimezoneClient(QObject* parent = 0); + /*TIMEZONECLIENT_EXPORT*/ static TimezoneClient* getInstance(); + /*TIMEZONECLIENT_EXPORT*/ void deleteInstance(); + /*TIMEZONECLIENT_EXPORT*/ bool isNull(); + +private: + TimezoneClient(); ~TimezoneClient(); +private: + +private: + static TimezoneClient *mTimezoneClient; + static bool mReferenceCount; + +// TODO: still refatoring public: - QList getLocations(); - bool getUtcDstOffsetL(int &dstOffset, - const CTzId &tzId); - LocationInfo getCurrentZoneInfoL(); - void setAsCurrentLocationL(LocationInfo &location); - bool isDSTOnL(int timezoneId); - int getStandardOffset(int timezoneId); - void getDstRulesL( - QDateTime &startTime, QDateTime &endTime,int timezoneId); + /*TIMEZONECLIENT_EXPORT*/ QList &getLocations(); + /*TIMEZONECLIENT_EXPORT*/ LocationInfo getCurrentZoneInfoL(); + /*TIMEZONECLIENT_EXPORT*/ void setAsCurrentLocationL(LocationInfo &location); + /*TIMEZONECLIENT_EXPORT*/ bool isDSTOnL(int timezoneId); + /*TIMEZONECLIENT_EXPORT*/ int getStandardOffset(int timezoneId); QList getSavedLocations(); void saveLocations(const QList &locationList); void getCountries(QMap& countries); - void getCitiesForCountry( - int id, QMap& cities); - void getLocationInfo( - int groupId, int cityIndex, LocationInfo& cityInfo); bool dstOn(int tzId); - int getCityGroupIdByName(const QString& name); - int getCityOffsetByNameAndId(const QString& name, int tzId); void setDateTime(QDateTime dateTime); void setTimeUpdateOn(bool timeUpdate = true); bool timeUpdateOn(); @@ -96,13 +100,25 @@ signals: void timechanged(); void listUpdated(); - + void autoTimeUpdateChanged(int value); + void cityUpdated(); + private: int getDstZoneOffset(int tzId); TMonth intToMonth(int month); + bool getUtcDstOffsetL(int &dstOffset, const CTzId &tzId); + void getDstRulesL( + QDateTime &startTime, QDateTime &endTime,int timezoneId); + void getCitiesForCountry( + int id, QMap& cities); + void getLocationInfo( + int groupId, int cityIndex, LocationInfo& cityInfo); + int getCityGroupIdByName(const QString& name); + int getCityOffsetByNameAndId(const QString& name, int tzId); private slots: - void populateCities(); + void populateCities(); + void eventMonitor(const XQSettingsKey& key, const QVariant& value); public: CEnvironmentChangeNotifier *mNotifier; @@ -112,14 +128,16 @@ QMap mAllCountries; QList mAllLocations; QStandardItemModel *mWorldClockModel; + XQSettingsManager *mSettingsManager; + XQSettingsKey *mAutoTimeUpdateKey; QList mTimeZoneIds; - bool mTimeUpdateOn; - int mFetchCount; +// bool mTimeUpdateOn; int mCountryCount; + int mAutoTimeUpdateValue; }; -#endif // __TIMEZONECLIENT_H__ +#endif // __TIMEZONECLIENT_H__ // End of file diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/clocktimezone/src/timezoneclient.cpp --- a/clock/clockmw/clocktimezone/src/timezoneclient.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockmw/clocktimezone/src/timezoneclient.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -19,18 +19,19 @@ // System includes #include #include -#include #include #include #include #include #include +#include +#include // User includes #include "timezoneclient.h" #include "clockcommon.h" -#include "debug.h" #include "clockserverclt.h" +#include "clockprivatecrkeys.h" const int KDaysInWeek(7); const int KZerothRule(0); @@ -44,39 +45,72 @@ tzserver and timezonelocalization. */ +TimezoneClient* TimezoneClient::mTimezoneClient = 0; +bool TimezoneClient::mReferenceCount = false; /*! - Default constructor. + Call this funtion to instantiate the TimezoneClient class. + */ +TimezoneClient* TimezoneClient::getInstance() +{ + if (!mTimezoneClient) { + mTimezoneClient = new TimezoneClient(); + mReferenceCount = true; + } - \param parent The parent. + return mTimezoneClient; +} + +/*! + Call this function to clean up the instance of TimezoneClient class. */ -TimezoneClient::TimezoneClient(QObject* parent) -:QObject(parent), - mTimeUpdateOn(false), - mFetchCount(0) +void TimezoneClient::deleteInstance() { - qDebug("clock: TimezoneClient::TimezoneClient() -->"); + if (mReferenceCount) { + delete mTimezoneClient; + mTimezoneClient = 0; + } +} +/*! + Call this function to check if the object is NULL. + */ +bool TimezoneClient::isNull() +{ + return !mReferenceCount; +} + +/*! + The constructor. + */ +TimezoneClient::TimezoneClient() +{ TCallBack callback(environmentCallback, this); mNotifier = CEnvironmentChangeNotifier::NewL( CActive::EPriorityStandard, callback); mNotifier->Start(); - RClkSrvInterface clkSrvInterface1; - User::LeaveIfError(clkSrvInterface1.Connect()); - TBool aUpdate; - clkSrvInterface1.IsAutoTimeUpdateOn(aUpdate); - if(aUpdate){ - mTimeUpdateOn = true; - } - else { - mTimeUpdateOn = false; - } - clkSrvInterface1.Close(); - mTzLocalizer = CTzLocalizer::NewL(); - qDebug("clock: TimezoneClient::TimezoneClient() <--"); + // Create the settings manager. + mSettingsManager = new XQSettingsManager(this); + + // Create the key for auto time update. + mAutoTimeUpdateKey = new XQSettingsKey( + XQSettingsKey::TargetCentralRepository, + KCRUidNitz, + KActiveProtocol); + + // Start the monitoring for the auto time update key. + mSettingsManager->startMonitoring(*mAutoTimeUpdateKey); + + // Get the value of auto time update from cenrep. + mAutoTimeUpdateValue = timeUpdateOn(); + + // Listen to the key value changes. + connect( + mSettingsManager, SIGNAL(valueChanged(XQSettingsKey, QVariant)), + this, SLOT(eventMonitor(XQSettingsKey, QVariant))); } /*! @@ -99,6 +133,11 @@ if (mTimeZoneIds.count()) { mTimeZoneIds.clear(); } + // Clear the locations if exist. + if (mAllLocations.count()) { + mAllLocations.clear(); + } + } /*! @@ -109,20 +148,15 @@ valid cityName, countryName, tz id and city group id. None of the other data is filled. */ -QList TimezoneClient::getLocations() +QList& TimezoneClient::getLocations() { - qDebug("clock: TimezoneClient::getLocations() -->"); - - // This list will contain the info of the cities fetched from tz server. - QList infoList; - - // Construct the timezone localizer. - CTzLocalizer* localizer = CTzLocalizer::NewL(); - CleanupStack::PushL(localizer); + if (mAllLocations.count()) { + mAllLocations.clear(); + } // Get the cities, in alphabetical-ascending sorted order. CTzLocalizedCityArray* cityArray = - localizer->GetCitiesL(CTzLocalizer::ETzAlphaNameAscending); + mTzLocalizer->GetCitiesL(CTzLocalizer::ETzAlphaNameAscending); ASSERT(cityArray); CleanupStack::PushL(cityArray); int cityCount = cityArray->Count(); @@ -150,7 +184,7 @@ if (country) { delete country; } - country = localizer->GetCityGroupL(cityGroupId); + country = mTzLocalizer->GetCityGroupL(cityGroupId); countryName.Set(country->Name()); } @@ -162,16 +196,12 @@ cityName.Ptr(), cityName.Length()); cityInfo.countryName = QString::fromUtf16( countryName.Ptr(), countryName.Length()); - infoList.append(cityInfo); + mAllLocations.append(cityInfo); } // Cleanup. CleanupStack::PopAndDestroy(cityArray); - CleanupStack::PopAndDestroy(localizer); - - qDebug("clock: TimezoneClient::getLocations() <--"); - - return infoList; + return mAllLocations; } bool TimezoneClient::getUtcDstOffsetL(int& dstOffset, const CTzId& timezoneId) @@ -246,8 +276,6 @@ LocationInfo TimezoneClient::getCurrentZoneInfoL() { - qDebug() << "clock: TimezoneClient::getCurrentZoneInfoL -->"; - // Current zone info. LocationInfo currentLocation; int timezoneId(0); @@ -281,140 +309,130 @@ timeZones.Close(); zoneOffsets.Close(); - // Construct CTzLocalizer object to get the timezone from the ID. - CTzLocalizer* tzLocalizer = CTzLocalizer::NewL(); - // Get all the localized timezones for the current timezone ID. CTzLocalizedTimeZone* localizedTimeZone(NULL); - if (tzLocalizer) { - // Get the currently set localized timezone. - CleanupStack::PushL(tzLocalizer); - localizedTimeZone = - tzLocalizer->GetLocalizedTimeZoneL(tzId->TimeZoneNumericID()); + localizedTimeZone = + mTzLocalizer->GetLocalizedTimeZoneL(tzId->TimeZoneNumericID()); + + if (localizedTimeZone) { + CleanupStack::PushL(localizedTimeZone); - if (localizedTimeZone) { - CleanupStack::PushL(localizedTimeZone); + // Get the frequently used localized city. + CTzLocalizedCity* localizedCity(0); + localizedCity = mTzLocalizer->GetFrequentlyUsedZoneCityL( + CTzLocalizedTimeZone::ECurrentZone); + CleanupStack::PushL(localizedCity); - // Get the frequently used localized city. - CTzLocalizedCity* localizedCity(0); - localizedCity = tzLocalizer->GetFrequentlyUsedZoneCityL( - CTzLocalizedTimeZone::ECurrentZone); - CleanupStack::PushL(localizedCity); + // Get all the city groups. + CTzLocalizedCityGroupArray* cityGroupArray = + mTzLocalizer->GetAllCityGroupsL( + CTzLocalizer::ETzAlphaNameAscending); + CleanupStack::PushL(cityGroupArray); - // Get all the city groups. - CTzLocalizedCityGroupArray* cityGroupArray = - tzLocalizer->GetAllCityGroupsL( - CTzLocalizer::ETzAlphaNameAscending); - CleanupStack::PushL(cityGroupArray); - - // Get the index of the country corresponding to the city group ID. - int countryIndex(1); + // Get the index of the country corresponding to the city group ID. + int countryIndex(1); - for (int index = 0; index < cityGroupArray->Count(); index++) { - if (localizedCity->GroupId() == - cityGroupArray->At(index).Id()) { - countryIndex = index; - } + for (int index = 0; index < cityGroupArray->Count(); index++) { + if (localizedCity->GroupId() == + cityGroupArray->At(index).Id()) { + countryIndex = index; } + } - // Get all the cities within the currently set country. - CTzLocalizedCityArray* cityList = tzLocalizer->GetCitiesInGroupL( - (cityGroupArray->At(countryIndex )).Id(), - CTzLocalizer::ETzAlphaNameAscending); - CleanupStack::PushL(cityList); + // Get all the cities within the currently set country. + CTzLocalizedCityArray* cityList = mTzLocalizer->GetCitiesInGroupL( + (cityGroupArray->At(countryIndex )).Id(), + CTzLocalizer::ETzAlphaNameAscending); + CleanupStack::PushL(cityList); - // Check if automatic time update is enabled. - bool timeUpdateOn( false ); + // Check if automatic time update is enabled. + bool timeUpdateOn( false ); - // Connect to the clock server. - // TODO: connect to the clock server and get auto update status in - // var: timeUpdateOn - // Check if the country contains only one city or if automatic - // time update is on. - if (1 == cityList->Count() || timeUpdateOn) { - // If yes, then display only the country name. - // TODO - } else { - // Display city name. - // TODO: - } + // Connect to the clock server. + // TODO: connect to the clock server and get auto update status in + // var: timeUpdateOn + // Check if the country contains only one city or if automatic + // time update is on. + if (1 == cityList->Count() || timeUpdateOn) { + // If yes, then display only the country name. + // TODO + } else { + // Display city name. + // TODO: + } - // Get the country name. - TPtrC countryName(cityGroupArray->At(countryIndex).Name()); - currentLocation.countryName = QString::fromUtf16( - countryName.Ptr(), countryName.Length()); - - // Get the city name. - TPtrC cityName(localizedCity->Name()); - currentLocation.cityName = QString::fromUtf16( - cityName.Ptr(), cityName.Length()); + // Get the country name. + TPtrC countryName(cityGroupArray->At(countryIndex).Name()); + currentLocation.countryName = QString::fromUtf16( + countryName.Ptr(), countryName.Length()); - // Get the UTC offset. - timezoneId = localizedCity->TimeZoneId(); + // Get the city name. + TPtrC cityName(localizedCity->Name()); + currentLocation.cityName = QString::fromUtf16( + cityName.Ptr(), cityName.Length()); - if (timezoneId) { - // Check if the DST is on for the current timezone. - if (isDSTOnL(timezoneId)) { - // Get the offset with DST enabled. - getUtcDstOffsetL(utcOffset, *tzId); + // Get the UTC offset. + timezoneId = localizedCity->TimeZoneId(); - currentLocation.dstOn = true; - currentLocation.timezoneId = timezoneId; - currentLocation.zoneOffset = utcOffset; - } else { - // Use the standard offset. - currentLocation.dstOn = false; - currentLocation.timezoneId = timezoneId; - currentLocation.zoneOffset = initialTimeZoneOffset; - } + if (timezoneId) { + // Check if the DST is on for the current timezone. + if (isDSTOnL(timezoneId)) { + // Get the offset with DST enabled. + getUtcDstOffsetL(utcOffset, *tzId); + + currentLocation.dstOn = true; + currentLocation.timezoneId = timezoneId; + currentLocation.zoneOffset = utcOffset; + } else { + // Use the standard offset. + currentLocation.dstOn = false; + currentLocation.timezoneId = timezoneId; + currentLocation.zoneOffset = initialTimeZoneOffset; } - - // Cleanup. - CleanupStack::PopAndDestroy( cityList ); - CleanupStack::PopAndDestroy( cityGroupArray ); - CleanupStack::PopAndDestroy( localizedCity ); - CleanupStack::PopAndDestroy( localizedTimeZone ); } // Cleanup. - CleanupStack::PopAndDestroy( tzLocalizer ); + CleanupStack::PopAndDestroy( cityList ); + CleanupStack::PopAndDestroy( cityGroupArray ); + CleanupStack::PopAndDestroy( localizedCity ); + CleanupStack::PopAndDestroy( localizedTimeZone ); } // Cleanup. CleanupStack::PopAndDestroy( tzId ); CleanupStack::PopAndDestroy( &tzHandle ); - - qDebug() << "clock: TimezoneClient::getCurrentZoneInfoL <--"; - return currentLocation; } void TimezoneClient::setAsCurrentLocationL(LocationInfo &location) { - Debug::writeDebugMsg( +/* Debug::writeDebugMsg( "In time zone client setAsCurrentLocationL " + location.cityName + " " + location.countryName + " " + - QString::number(location.zoneOffset)); + QString::number(location.zoneOffset));*/ - // Construct CTzLocalizer object. - CTzLocalizer* tzLocalizer = CTzLocalizer::NewL(); - CleanupStack::PushL( tzLocalizer ); - tzLocalizer->SetTimeZoneL( location.timezoneId ); + LocationInfo prevLocationInfo ; + prevLocationInfo = getCurrentZoneInfoL(); + + mTzLocalizer->SetTimeZoneL( location.timezoneId ); TPtrC ptrCityName( reinterpret_cast(location.cityName.constData())); CTzLocalizedCity* localizedCity = - tzLocalizer->FindCityByNameL(ptrCityName, location.timezoneId); + mTzLocalizer->FindCityByNameL(ptrCityName, location.timezoneId); CleanupStack::PushL( localizedCity ); - tzLocalizer->SetFrequentlyUsedZoneL( + mTzLocalizer->SetFrequentlyUsedZoneL( *localizedCity, CTzLocalizedTimeZone::ECurrentZone); // Cleanup. CleanupStack::PopAndDestroy( localizedCity ); - CleanupStack::PopAndDestroy( tzLocalizer ); + + if(prevLocationInfo.timezoneId == location.timezoneId) { + emit cityUpdated(); + } } bool TimezoneClient::isDSTOnL(int timezoneId) @@ -588,16 +606,11 @@ void TimezoneClient::getCountries(QMap& countries) { - // Construct the timezone localizer. - CTzLocalizer* localizer = CTzLocalizer::NewL(); - CleanupStack::PushL(localizer); - // Get all the city groups(countries). QTime t; t.start(); CTzLocalizedCityGroupArray* cityGroupArray = - localizer->GetAllCityGroupsL(CTzLocalizer::ETzAlphaNameAscending); - qDebug() << "Fetching city groups from tzloc: " << t.elapsed(); + mTzLocalizer->GetAllCityGroupsL(CTzLocalizer::ETzAlphaNameAscending); CleanupStack::PushL(cityGroupArray); t.restart(); @@ -611,27 +624,18 @@ countryName.Ptr(),countryName.Length()); countries[qCountryName] = cityGroup.Id(); } - qDebug() << "Converting " << - cityGroupArray->Count() << - "countries to qstring: " << - t.elapsed(); // Cleanup. CleanupStack::PopAndDestroy(cityGroupArray); - CleanupStack::PopAndDestroy(localizer); } void TimezoneClient::getCitiesForCountry(int id, QMap& cities) { - // Construct the timezone localizer. - CTzLocalizer* localizer = CTzLocalizer::NewL(); - CleanupStack::PushL(localizer); - // Get the city group for the given id. - CTzLocalizedCityArray* cityArray = localizer->GetCitiesInGroupL(id, + CTzLocalizedCityArray* cityArray = mTzLocalizer->GetCitiesInGroupL(id, CTzLocalizer::ETzAlphaNameAscending); CleanupStack::PushL(cityArray); - CTzLocalizedCityArray* unsortedArray = localizer->GetCitiesInGroupL(id, + CTzLocalizedCityArray* unsortedArray = mTzLocalizer->GetCitiesInGroupL(id, CTzLocalizer::ETzUnsorted); CleanupStack::PushL(unsortedArray); @@ -654,7 +658,6 @@ // Cleanup. CleanupStack::PopAndDestroy(unsortedArray); CleanupStack::PopAndDestroy(cityArray); - CleanupStack::PopAndDestroy(localizer); } void TimezoneClient::getLocationInfo( @@ -663,15 +666,12 @@ TRAPD( error, - // Construct the localizer. - CTzLocalizer* localizer = CTzLocalizer::NewLC(); - // Get the localized city group. - CTzLocalizedCityGroup* cityGroup = localizer->GetCityGroupL(groupId); + CTzLocalizedCityGroup* cityGroup = mTzLocalizer->GetCityGroupL(groupId); CleanupStack::PushL(cityGroup); // Get the localized city array for the given city group. - CTzLocalizedCityArray* cityArray = localizer->GetCitiesInGroupL( + CTzLocalizedCityArray* cityArray = mTzLocalizer->GetCitiesInGroupL( groupId, CTzLocalizer::ETzUnsorted); CleanupStack::PushL(cityArray); @@ -690,7 +690,6 @@ // Cleanup. CleanupStack::PopAndDestroy(cityArray); CleanupStack::PopAndDestroy(cityGroup); - CleanupStack::PopAndDestroy(localizer); ) Q_UNUSED(error) } @@ -787,11 +786,8 @@ TPtrC namePtr; namePtr.Set(name.utf16(), name.length()); - // Construct the timezone localizer. - CTzLocalizer *localizer = CTzLocalizer::NewLC(); - // Get the citygroup matching the name. - CTzLocalizedCityGroup *cityGroup = localizer->FindCityGroupByNameL(namePtr); + CTzLocalizedCityGroup *cityGroup = mTzLocalizer->FindCityGroupByNameL(namePtr); CleanupStack::PushL(cityGroup); // Get the id. @@ -799,7 +795,6 @@ // Cleanup. CleanupStack::PopAndDestroy(cityGroup); - CleanupStack::PopAndDestroy(localizer); return id; } @@ -809,11 +804,8 @@ TPtrC namePtr; namePtr.Set(name.utf16(), name.length()); - // Construct the timezone localizer. - CTzLocalizer *localizer = CTzLocalizer::NewLC(); - // Get the citygroup matching the name. - CTzLocalizedCityArray *cityArray = localizer->GetCitiesL(tzId); + CTzLocalizedCityArray *cityArray = mTzLocalizer->GetCitiesL(tzId); CleanupStack::PushL(cityArray); int id; @@ -828,10 +820,8 @@ // Cleanup. CleanupStack::PopAndDestroy(cityArray); - CleanupStack::PopAndDestroy(localizer); return id; - } void TimezoneClient::setDateTime(QDateTime dateTime) @@ -850,21 +840,25 @@ void TimezoneClient::setTimeUpdateOn(bool timeUpdate) { - RClkSrvInterface clkSrvInterface; - User::LeaveIfError(clkSrvInterface.Connect()); - if (timeUpdate) { - clkSrvInterface.ActivateAllProtocols(); - } - else { - clkSrvInterface.DeActivateAllProtocols(); - } - mTimeUpdateOn = timeUpdate; + RClkSrvInterface clkSrvInterface; + User::LeaveIfError(clkSrvInterface.Connect()); + if (timeUpdate) { + clkSrvInterface.ActivateAllProtocols(); + } + else { + clkSrvInterface.DeActivateAllProtocols(); + } clkSrvInterface.Close(); } bool TimezoneClient::timeUpdateOn() { - return mTimeUpdateOn; + TBool autoTimeUpdateOn; + RClkSrvInterface clkSrvInterface; + User::LeaveIfError(clkSrvInterface.Connect()); + clkSrvInterface.IsAutoTimeUpdateOn(autoTimeUpdateOn); + clkSrvInterface.Close(); + return autoTimeUpdateOn; } QStandardItemModel *TimezoneClient::locationSelectorModel() @@ -1245,4 +1239,29 @@ return info; } + +/*! + Slot which is called when the value changes in cevrep. + + \param key The key which got changed in cenrep. + \param value The new value of that key. + */ +void TimezoneClient::eventMonitor(const XQSettingsKey& key, const QVariant& value) +{ + if (key.uid() == KCRUidNitz && key.key() == KActiveProtocol) { + if (mSettingsManager->error() == XQSettingsManager::NoError) { + + // New value of auto time update. + int autoTimeUpdate = value.toInt(); + + // Check if the auto time update value has actually changed. + bool keyValueChanged = (autoTimeUpdate != mAutoTimeUpdateValue); + + if(keyValueChanged) { + mAutoTimeUpdateValue = autoTimeUpdate; + emit autoTimeUpdateChanged(mAutoTimeUpdateValue); + } + } + } +} // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/eabi/clockalarmclientu.def --- a/clock/clockmw/eabi/clockalarmclientu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -EXPORTS - _ZN11AlarmClient11deleteAlarmEi @ 1 NONAME - _ZN11AlarmClient11qt_metacallEN11QMetaObject4CallEiPPv @ 2 NONAME - _ZN11AlarmClient11qt_metacastEPKc @ 3 NONAME - _ZN11AlarmClient12getAlarmInfoEiR9AlarmInfo @ 4 NONAME - _ZN11AlarmClient12getAlarmListER5QListI9AlarmInfoE @ 5 NONAME - _ZN11AlarmClient12notifyChangeEi @ 6 NONAME - _ZN11AlarmClient12stopListenerEv @ 7 NONAME - _ZN11AlarmClient13setAlarmStateE10AlarmStateR11TAlarmState @ 8 NONAME - _ZN11AlarmClient13setAlarmStateE11TAlarmStateR10AlarmState @ 9 NONAME - _ZN11AlarmClient13startListenerEv @ 10 NONAME - _ZN11AlarmClient16staticMetaObjectE @ 11 NONAME DATA 16 - _ZN11AlarmClient17alarmStateChangedEi @ 12 NONAME - _ZN11AlarmClient17toggleAlarmStatusEii @ 13 NONAME - _ZN11AlarmClient18setAlarmRepeatTypeE15AlarmRepeatTypeR22TAlarmRepeatDefinition @ 14 NONAME - _ZN11AlarmClient18setAlarmRepeatTypeE22TAlarmRepeatDefinitionR15AlarmRepeatType @ 15 NONAME - _ZN11AlarmClient19getStaticMetaObjectEv @ 16 NONAME - _ZN11AlarmClient8setAlarmER9AlarmInfo @ 17 NONAME - _ZN11AlarmClientC1EP7QObject @ 18 NONAME - _ZN11AlarmClientC2EP7QObject @ 19 NONAME - _ZN11AlarmClientD0Ev @ 20 NONAME - _ZN11AlarmClientD1Ev @ 21 NONAME - _ZN11AlarmClientD2Ev @ 22 NONAME - _ZNK11AlarmClient10metaObjectEv @ 23 NONAME - _ZTI11AlarmClient @ 24 NONAME - _ZTV11AlarmClient @ 25 NONAME - diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/eabi/clocksettingsutilityu.def --- a/clock/clockmw/eabi/clocksettingsutilityu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -EXPORTS - _ZN15SettingsUtility10autoUpdateER11QStringList @ 1 NONAME - _ZN15SettingsUtility10dateFormatER11QStringList @ 2 NONAME - _ZN15SettingsUtility10snoozeTimeER11QStringList @ 3 NONAME - _ZN15SettingsUtility10timeFormatER11QStringList @ 4 NONAME - _ZN15SettingsUtility11qt_metacallEN11QMetaObject4CallEiPPv @ 5 NONAME - _ZN15SettingsUtility11qt_metacastEPKc @ 6 NONAME - _ZN15SettingsUtility11setTimeZoneERK7QString @ 7 NONAME - _ZN15SettingsUtility11setWorkdaysERK7QString @ 8 NONAME - _ZN15SettingsUtility12setClockTypeERK7QString @ 9 NONAME - _ZN15SettingsUtility13dateSeparatorER11QStringList @ 10 NONAME - _ZN15SettingsUtility13setAutoUpdateERK7QString @ 11 NONAME - _ZN15SettingsUtility13setDateFormatERK7QString @ 12 NONAME - _ZN15SettingsUtility13setSnoozeTimeEi @ 13 NONAME - _ZN15SettingsUtility13setTimeFormatERK7QString @ 14 NONAME - _ZN15SettingsUtility13timeSeparatorER11QStringList @ 15 NONAME - _ZN15SettingsUtility14setStartOfWeekEi @ 16 NONAME - _ZN15SettingsUtility15settingsChangedE19SettingsItemChanged7QString @ 17 NONAME - _ZN15SettingsUtility16dateFormatStringEv @ 18 NONAME - _ZN15SettingsUtility16setDateSeparatorERK7QString @ 19 NONAME - _ZN15SettingsUtility16setTimeSeparatorERK7QString @ 20 NONAME - _ZN15SettingsUtility16staticMetaObjectE @ 21 NONAME DATA 16 - _ZN15SettingsUtility16timeFormatStringEv @ 22 NONAME - _ZN15SettingsUtility19getStaticMetaObjectEv @ 23 NONAME - _ZN15SettingsUtility4dateEv @ 24 NONAME - _ZN15SettingsUtility4timeEv @ 25 NONAME - _ZN15SettingsUtility7setDateERK7QString @ 26 NONAME - _ZN15SettingsUtility7setTimeERK7QString @ 27 NONAME - _ZN15SettingsUtility8timeZoneEv @ 28 NONAME - _ZN15SettingsUtility8workdaysER11QStringList @ 29 NONAME - _ZN15SettingsUtility9clockTypeER11QStringList @ 30 NONAME - _ZN15SettingsUtilityC1EP7QObject @ 31 NONAME - _ZN15SettingsUtilityC2EP7QObject @ 32 NONAME - _ZN15SettingsUtilityD0Ev @ 33 NONAME - _ZN15SettingsUtilityD1Ev @ 34 NONAME - _ZN15SettingsUtilityD2Ev @ 35 NONAME - _ZNK15SettingsUtility10metaObjectEv @ 36 NONAME - _ZTI15SettingsUtility @ 37 NONAME - _ZTV15SettingsUtility @ 38 NONAME - diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/eabi/clockstopwatchengineu.def --- a/clock/clockmw/eabi/clockstopwatchengineu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ -EXPORTS - _ZN15StopwatchEngine10startTimerEv @ 1 NONAME - _ZN15StopwatchEngine4RunLEv @ 2 NONAME - _ZN15StopwatchEngine8DoCancelEv @ 3 NONAME - _ZN15StopwatchEngine9stopTimerEv @ 4 NONAME - _ZN15StopwatchEngineC1EP17StopwatchObserver @ 5 NONAME - _ZN15StopwatchEngineC2EP17StopwatchObserver @ 6 NONAME - _ZN15StopwatchEngineD0Ev @ 7 NONAME - _ZN15StopwatchEngineD1Ev @ 8 NONAME - _ZN15StopwatchEngineD2Ev @ 9 NONAME - _ZTI15StopwatchEngine @ 10 NONAME - _ZTV15StopwatchEngine @ 11 NONAME - diff -r fd30d51f876b -r b6db4fd4947b clock/clockmw/eabi/timezoneclientu.def --- a/clock/clockmw/eabi/timezoneclientu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -EXPORTS - _ZN14TimezoneClient10intToMonthEi @ 1 NONAME - _ZN14TimezoneClient11listUpdatedEv @ 2 NONAME - _ZN14TimezoneClient11qt_metacallEN11QMetaObject4CallEiPPv @ 3 NONAME - _ZN14TimezoneClient11qt_metacastEPKc @ 4 NONAME - _ZN14TimezoneClient11setDateTimeE9QDateTime @ 5 NONAME - _ZN14TimezoneClient11timechangedEv @ 6 NONAME - _ZN14TimezoneClient12getCountriesER4QMapI7QStringiE @ 7 NONAME - _ZN14TimezoneClient12getDstRulesLER9QDateTimeS1_i @ 8 NONAME - _ZN14TimezoneClient12getLocationsEv @ 9 NONAME - _ZN14TimezoneClient12timeUpdateOnEv @ 10 NONAME - _ZN14TimezoneClient13saveLocationsERK5QListI12LocationInfoE @ 11 NONAME - _ZN14TimezoneClient14populateCitiesEv @ 12 NONAME - _ZN14TimezoneClient15getLocationInfoEiiR12LocationInfo @ 13 NONAME - _ZN14TimezoneClient15setTimeUpdateOnEb @ 14 NONAME - _ZN14TimezoneClient16getDstZoneOffsetEi @ 15 NONAME - _ZN14TimezoneClient16getUtcDstOffsetLERiRK5CTzId @ 16 NONAME - _ZN14TimezoneClient16staticMetaObjectE @ 17 NONAME DATA 16 - _ZN14TimezoneClient17checkForDstChangeER9AlarmInfo @ 18 NONAME - _ZN14TimezoneClient17getSavedLocationsEv @ 19 NONAME - _ZN14TimezoneClient17getStandardOffsetEi @ 20 NONAME - _ZN14TimezoneClient19environmentCallbackEPv @ 21 NONAME - _ZN14TimezoneClient19getCitiesForCountryEiR4QMapI7QStringiE @ 22 NONAME - _ZN14TimezoneClient19getCurrentZoneInfoLEv @ 23 NONAME - _ZN14TimezoneClient19getStaticMetaObjectEv @ 24 NONAME - _ZN14TimezoneClient20getCityGroupIdByNameERK7QString @ 25 NONAME - _ZN14TimezoneClient21createWorldClockModelEv @ 26 NONAME - _ZN14TimezoneClient21locationSelectorModelEv @ 27 NONAME - _ZN14TimezoneClient21setAsCurrentLocationLER12LocationInfo @ 28 NONAME - _ZN14TimezoneClient24getCityOffsetByNameAndIdERK7QStringi @ 29 NONAME - _ZN14TimezoneClient5dstOnEi @ 30 NONAME - _ZN14TimezoneClient8isDSTOnLEi @ 31 NONAME - _ZN14TimezoneClientC1EP7QObject @ 32 NONAME - _ZN14TimezoneClientC2EP7QObject @ 33 NONAME - _ZN14TimezoneClientD0Ev @ 34 NONAME - _ZN14TimezoneClientD1Ev @ 35 NONAME - _ZN14TimezoneClientD2Ev @ 36 NONAME - _ZNK14TimezoneClient10metaObjectEv @ 37 NONAME - _ZTI14TimezoneClient @ 38 NONAME - _ZTV14TimezoneClient @ 39 NONAME - _ZThn8_N14TimezoneClientD0Ev @ 40 NONAME - _ZThn8_N14TimezoneClientD1Ev @ 41 NONAME - _ZN14TimezoneClient17getAllTimeZoneIdsEv @ 42 NONAME - _ZN14TimezoneClient21getAllTimeZoneOffsetsEv @ 43 NONAME - _ZN14TimezoneClient24getCountriesForUTCOffsetEi @ 44 NONAME - _ZN14TimezoneClient7addCityEiR7QStringi @ 45 NONAME - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/bwins/clockalarmeditoru.def --- a/clock/clockui/bwins/clockalarmeditoru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -EXPORTS - ??1ClockAlarmEditor@@UAE@XZ @ 1 NONAME ; ClockAlarmEditor::~ClockAlarmEditor(void) - ??0ClockAlarmEditor@@QAE@HPAVQGraphicsWidget@@@Z @ 2 NONAME ; ClockAlarmEditor::ClockAlarmEditor(int, class QGraphicsWidget *) - ?showAlarmEditor@ClockAlarmEditor@@QAEXXZ @ 3 NONAME ; void ClockAlarmEditor::showAlarmEditor(void) - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/bwins/clockappcontrolleru.def --- a/clock/clockui/bwins/clockappcontrolleru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,4 +0,0 @@ -EXPORTS - ??1ClockAppController@@UAE@XZ @ 1 NONAME ; ClockAppController::~ClockAppController(void) - ??0ClockAppController@@QAE@PAVQObject@@@Z @ 2 NONAME ; ClockAppController::ClockAppController(class QObject *) - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/bwins/clockcityselectionlistu.def --- a/clock/clockui/bwins/clockcityselectionlistu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -EXPORTS - ??_EClockCitySelectionList@@UAE@I@Z @ 1 NONAME ; ClockCitySelectionList::~ClockCitySelectionList(unsigned int) - ??1ClockCitySelectionList@@UAE@XZ @ 2 NONAME ; ClockCitySelectionList::~ClockCitySelectionList(void) - ?d_func@ClockCitySelectionList@@ABEPBVClockCitySelectionListPrivate@@XZ @ 3 NONAME ; class ClockCitySelectionListPrivate const * ClockCitySelectionList::d_func(void) const - ?citySelected@ClockCitySelectionList@@IAEXULocationInfo@@@Z @ 4 NONAME ; void ClockCitySelectionList::citySelected(struct LocationInfo) - ?trUtf8@ClockCitySelectionList@@SA?AVQString@@PBD0@Z @ 5 NONAME ; class QString ClockCitySelectionList::trUtf8(char const *, char const *) - ?qt_metacast@ClockCitySelectionList@@UAEPAXPBD@Z @ 6 NONAME ; void * ClockCitySelectionList::qt_metacast(char const *) - ??0ClockCitySelectionList@@QAE@PAVQObject@@@Z @ 7 NONAME ; ClockCitySelectionList::ClockCitySelectionList(class QObject *) - ?closeCityList@ClockCitySelectionList@@QAEXXZ @ 8 NONAME ; void ClockCitySelectionList::closeCityList(void) - ?trUtf8@ClockCitySelectionList@@SA?AVQString@@PBD0H@Z @ 9 NONAME ; class QString ClockCitySelectionList::trUtf8(char const *, char const *, int) - ?qt_metacall@ClockCitySelectionList@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 10 NONAME ; int ClockCitySelectionList::qt_metacall(enum QMetaObject::Call, int, void * *) - ??0ClockCitySelectionList@@QAE@PAVTimezoneClient@@PAVQObject@@@Z @ 11 NONAME ; ClockCitySelectionList::ClockCitySelectionList(class TimezoneClient *, class QObject *) - ?metaObject@ClockCitySelectionList@@UBEPBUQMetaObject@@XZ @ 12 NONAME ; struct QMetaObject const * ClockCitySelectionList::metaObject(void) const - ?d_func@ClockCitySelectionList@@AAEPAVClockCitySelectionListPrivate@@XZ @ 13 NONAME ; class ClockCitySelectionListPrivate * ClockCitySelectionList::d_func(void) - ?showCityList@ClockCitySelectionList@@QAEXXZ @ 14 NONAME ; void ClockCitySelectionList::showCityList(void) - ?staticMetaObject@ClockCitySelectionList@@2UQMetaObject@@B @ 15 NONAME ; struct QMetaObject const ClockCitySelectionList::staticMetaObject - ?tr@ClockCitySelectionList@@SA?AVQString@@PBD0H@Z @ 16 NONAME ; class QString ClockCitySelectionList::tr(char const *, char const *, int) - ?tr@ClockCitySelectionList@@SA?AVQString@@PBD0@Z @ 17 NONAME ; class QString ClockCitySelectionList::tr(char const *, char const *) - ?getStaticMetaObject@ClockCitySelectionList@@SAABUQMetaObject@@XZ @ 18 NONAME ; struct QMetaObject const & ClockCitySelectionList::getStaticMetaObject(void) - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/bwins/clocksettingsviewu.def --- a/clock/clockui/bwins/clocksettingsviewu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -EXPORTS - ??0ClockSettingsView@@QAE@PAVQObject@@@Z @ 1 NONAME ; ClockSettingsView::ClockSettingsView(class QObject *) - ?loadSettingsView@ClockSettingsView@@QAEXXZ @ 2 NONAME ; void ClockSettingsView::loadSettingsView(void) - ??1ClockSettingsView@@UAE@XZ @ 3 NONAME ; ClockSettingsView::~ClockSettingsView(void) - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/bwins/clockviewmanageru.def --- a/clock/clockui/bwins/clockviewmanageru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -EXPORTS - ?showView@ClockViewManager@@QAEXW4ClockViews@@@Z @ 1 NONAME ; void ClockViewManager::showView(enum ClockViews) - ??1ClockViewManager@@UAE@XZ @ 2 NONAME ; ClockViewManager::~ClockViewManager(void) - ??0ClockViewManager@@QAE@AAVClockAppControllerIf@@PAVQObject@@@Z @ 3 NONAME ; ClockViewManager::ClockViewManager(class ClockAppControllerIf &, class QObject *) - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/bwins/clockviewsu.def --- a/clock/clockui/bwins/clockviewsu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -EXPORTS - ?setupView@ClockMainView@@QAEXAAVClockAppControllerIf@@PAVClockDocLoader@@@Z @ 1 NONAME ; void ClockMainView::setupView(class ClockAppControllerIf &, class ClockDocLoader *) - ??0ClockWorldView@@QAE@PAVQGraphicsItem@@@Z @ 2 NONAME ; ClockWorldView::ClockWorldView(class QGraphicsItem *) - ??1ClockWorldView@@UAE@XZ @ 3 NONAME ; ClockWorldView::~ClockWorldView(void) - ??1ClockMainView@@UAE@XZ @ 4 NONAME ; ClockMainView::~ClockMainView(void) - ?setupView@ClockWorldView@@QAEXAAVClockAppControllerIf@@PAVClockDocLoader@@@Z @ 5 NONAME ; void ClockWorldView::setupView(class ClockAppControllerIf &, class ClockDocLoader *) - ??0ClockMainView@@QAE@PAVQGraphicsItem@@@Z @ 6 NONAME ; ClockMainView::ClockMainView(class QGraphicsItem *) - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/bwins/clockwidgetprotou.def --- a/clock/clockui/bwins/clockwidgetprotou.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -EXPORTS - ??0SkinnableClock@@QAE@PAVQGraphicsItem@@@Z @ 1 NONAME ; SkinnableClock::SkinnableClock(class QGraphicsItem *) - ?updateDisplay@SkinnableClock@@QAEX_N@Z @ 2 NONAME ; void SkinnableClock::updateDisplay(bool) - ?updateClockType@SkinnableClock@@QAEXXZ @ 3 NONAME ; void SkinnableClock::updateClockType(void) - ??1SkinnableClock@@UAE@XZ @ 4 NONAME ; SkinnableClock::~SkinnableClock(void) - ?staticMetaObject@SkinnableClock@@2UQMetaObject@@B @ 5 NONAME ; struct QMetaObject const SkinnableClock::staticMetaObject - ??_ESkinnableClock@@UAE@I@Z @ 6 NONAME ; SkinnableClock::~SkinnableClock(unsigned int) - ?qt_metacast@SkinnableClock@@UAEPAXPBD@Z @ 7 NONAME ; void * SkinnableClock::qt_metacast(char const *) - ?startChangeType@SkinnableClock@@AAEXXZ @ 8 NONAME ; void SkinnableClock::startChangeType(void) - ?trUtf8@SkinnableClock@@SA?AVQString@@PBD0@Z @ 9 NONAME ; class QString SkinnableClock::trUtf8(char const *, char const *) - ?trUtf8@SkinnableClock@@SA?AVQString@@PBD0H@Z @ 10 NONAME ; class QString SkinnableClock::trUtf8(char const *, char const *, int) - ?metaObject@SkinnableClock@@UBEPBUQMetaObject@@XZ @ 11 NONAME ; struct QMetaObject const * SkinnableClock::metaObject(void) const - ?tr@SkinnableClock@@SA?AVQString@@PBD0H@Z @ 12 NONAME ; class QString SkinnableClock::tr(char const *, char const *, int) - ?qt_metacall@SkinnableClock@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 13 NONAME ; int SkinnableClock::qt_metacall(enum QMetaObject::Call, int, void * *) - ?paint@SkinnableClock@@MAEXPAVQPainter@@PBVQStyleOptionGraphicsItem@@PAVQWidget@@@Z @ 14 NONAME ; void SkinnableClock::paint(class QPainter *, class QStyleOptionGraphicsItem const *, class QWidget *) - ?tr@SkinnableClock@@SA?AVQString@@PBD0@Z @ 15 NONAME ; class QString SkinnableClock::tr(char const *, char const *) - ?getStaticMetaObject@SkinnableClock@@SAABUQMetaObject@@XZ @ 16 NONAME ; struct QMetaObject const & SkinnableClock::getStaticMetaObject(void) - ?clockTypeAnalog@SkinnableClock@@QAE_NXZ @ 17 NONAME ; bool SkinnableClock::clockTypeAnalog(void) - ?setClockTypeAnalog@SkinnableClock@@AAEX_N@Z @ 18 NONAME ; void SkinnableClock::setClockTypeAnalog(bool) - ?finishChangeType@SkinnableClock@@QAEXABUEffectStatus@HbEffect@@@Z @ 19 NONAME ; void SkinnableClock::finishChangeType(struct HbEffect::EffectStatus const &) - ?clockFormat24@SkinnableClock@@QAE_NXZ @ 20 NONAME ; bool SkinnableClock::clockFormat24(void) - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockalarmeditor/bwins/clockalarmeditoru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockalarmeditor/bwins/clockalarmeditoru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,5 @@ +EXPORTS + ??1ClockAlarmEditor@@UAE@XZ @ 1 NONAME ; ClockAlarmEditor::~ClockAlarmEditor(void) + ?showAlarmEditor@ClockAlarmEditor@@QAEXXZ @ 2 NONAME ; void ClockAlarmEditor::showAlarmEditor(void) + ??0ClockAlarmEditor@@QAE@AAVAlarmClient@@HPAVQObject@@@Z @ 3 NONAME ; ClockAlarmEditor::ClockAlarmEditor(class AlarmClient &, int, class QObject *) + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockalarmeditor/clockalarmeditor.pro --- a/clock/clockui/clockalarmeditor/clockalarmeditor.pro Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockalarmeditor/clockalarmeditor.pro Mon Jun 28 15:22:02 2010 +0530 @@ -27,7 +27,8 @@ DEPENDPATH += \ ./inc \ - ./src + ./src \ + ./data symbian: { TARGET.CAPABILITY += ALL -TCB @@ -43,13 +44,15 @@ SOURCES += \ clockalarmeditor.cpp \ - clockalarmcustomitem.cpp + clockalarmcustomitem.cpp HEADERS += \ clockalarmeditor.h \ - clockalarmcustomitem.h\ - clockalarmeditordefines.h + clockalarmcustomitem.h \ + clockalarmeditordefines.h + +RESOURCES += clockalarmeditor.qrc + +TRANSLATIONS += clockalarmeditor.ts -RESOURCES += \ - data/clockalarmeditor.qrc # End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockalarmeditor/data/clockalarmeditor.qrc --- a/clock/clockui/clockalarmeditor/data/clockalarmeditor.qrc Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockalarmeditor/data/clockalarmeditor.qrc Mon Jun 28 15:22:02 2010 +0530 @@ -1,6 +1,6 @@ - - translations/clockalarmeditor.qm + + xml/clockalarmeditor.docml - + \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockalarmeditor/data/translations/clockalarmeditor.qm Binary file clock/clockui/clockalarmeditor/data/translations/clockalarmeditor.qm has changed diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockalarmeditor/data/translations/clockalarmeditor.ts --- a/clock/clockui/clockalarmeditor/data/translations/clockalarmeditor.ts Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,409 +0,0 @@ - - - - - - 1st label in Regional date & time settings view - Time format - Time format - qtl_dataform_heading_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Title for Date and time settings view - Clock - Clock - - Common - Common - Co - False - - - The time and date information will be displayed in 2nd row - %1, %2 - %1, %2 - qtl_list_sec_large_graphic - CP main view_time & date plugin_P11 - list - CP - False - - - Setting item to clock display type. Tap to toggle values. - Digital - Digital - qtl_dataform_button_sec - Clock_Date & time settings_P04_1 - button - Cl - False - - - This text is displayed in 1st row - Time & date - Time & date - qtl_list_pri_large_graphic - CP main view_time & date plugin_P11 - list - CP - False - - - Note displayed after alarm is set (every week) - Alarm occurs every week on %1 at %2 - Alarm occurs every week on %1 at %2 - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - Title for the time picker tumbler widget - Alarm time - Alarm time - qtl_dialog_pri_heading - Tumbler - title - Tu - False - - - 2nd value in combo box list for Date format label - mm dd yyyy - mm dd yyyy - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_2_val - Cl - False - - - Note displayed after alarm is set (time remaining) (hrs, min) - Time to alarm %1 hours and %2 minute - Time to alarm %1 hours and %2 minute - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - 3rd field in Regional date & time settings view - Date format - Date format - qtl_dataform_heading_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Tapping on this button opens advanced date and time view - Regional date & time settings - Regional date & time settings - qtl_dataform_button_sec - Clock_Date & time settings_P04_1 - button - Cl - False - - - Popup Information which comes after setting the alarm. - Alarm will occur at %1 after automatic daylight saving update - Alarm will occur at %1 after automatic daylight saving update - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - - Time - Time - qtl_dialog_pri_heading - Tumbler - title - Tu - False - - - Sub-title for Regiional date & time settings - Regional date & time settings - Regional date & time settings - qtl_groupbox_simple_sec - Clock_Date & time settings_P04_3 - subhead - Cl - False - - - 5th label for Place in Clock settings view - Place - Place - qtl_dataform_heading_pri - Clock_Date & time settings_P04_1 - formlabel_1 - Cl - False - - - 1st Value in combo box list for Time format label - 24 hour - 24 hour - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_1_val - Cl - False - - - - DST - DST - - Common - setlabel_1 - Co - False - - - Note displayed after alarm is set (Everyday Time) - Alarm occurs every day at %1 - Alarm occurs every day at %1 - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - Alarm snooze time details in the list box (5mins, 10mins, 15mins, 30mins) - %Ln minutes - - (s)%Ln minutes - (p)%Ln minutes - - qtl_dataform_combobox_sec - Clock_Date & time settings_P04_1 - set - Cl - False - - - Setting item to clock display type. Tap to toggle values. - Analog - Analog - qtl_dataform_button_sec - Clock_Date & time settings_P04_1 - button - Cl - False - - - 6th field in Regional date & time settings view - Week starts on - Week starts on - qtl_dataform_heading_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Note displayed after alarm is set (time remaining) - Time to alarm %1 hour and %2 minute - Time to alarm %1 hour and %2 minute - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - 3rd value in combo box list for Date format label - yyyy mm dd - yyyy mm dd - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_3_val - Cl - False - - - Note displayed after alarm is set (only once) - Alarm occurs once only on next %1 at %2 - Alarm occurs once only on next %1 at %2 - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - Note displayed after alarm is set (time remaining) (hr, mins) - Time to alarm %1 hour and %2 minutes - Time to alarm %1 hour and %2 minutes - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - Title for the date picker tumbler widget - Alarm date - Alarm date - qtl_dialog_pri_heading - Tumbler - title - Tu - False - - - - Date - Date - qtl_dialog_pri_heading - Tumbler - title - Tu - False - - - - GMT - GMT - - Common - Common - Co - False - - - 1st label in Date and time settings view - Use network date & time - Use network date & time - qtl_checkbox_sec - Clock_Date & time settings_P04_1 - setlabel_1 - Cl - False - - - Subtitle for the time seperator drop down list - Time separator - Time separator - qtl_dataform_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Subtitle for the date seperator drop down list - Date separator - Date separator - qtl_dataform_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Label for Workdays in Alarm editor - Workdays - Workdays - qtl_dataform_heading_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Label to the date field (picker) in the settings view - Date - Date - qtl_dataform_pri - Clock_Date & time settings_P04_1 - setlabel_1 - Cl - False - - - Label to the time field (picker) in the settings view - Time - Time - qtl_dataform_pri - Clock_Date & time settings_P04_1 - setlabel_1 - Cl - False - - - 2nd value in combo box list for Time format label - 12 hour - 12 hour - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_2_val - Cl - False - - - Note displayed after alarm is set (time remaining) (hrs, mins) - Time to alarm %1 hours and %2 minutes - Time to alarm %1 hours and %2 minutes - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - Note displayed after alarm is set (workdays) - Alarm occurs workdays at %1 - Alarm occurs workdays at %1 - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - Primary text label for Clock Type - Clock Type - Clock Type - qtl_dataform_pri - Clock_Date & time settings_P04_1 - setlabel_5 - Cl - False - - - Sub-title for Date & time settings view - Date & time - Date & time - qtl_groupbox_simple_sec - Clock_Date & time settings_P04_1 - subhead - Cl - False - - - 1st value in combo box list for Date format label - dd mm yyyy - dd mm yyyy - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_1_val - Cl - False - - - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockalarmeditor/data/xml/clockalarmeditor.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockalarmeditor/data/xml/clockalarmeditor.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockalarmeditor/eabi/clockalarmeditoru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockalarmeditor/eabi/clockalarmeditoru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,8 @@ +EXPORTS + _ZN16ClockAlarmEditor15showAlarmEditorEv @ 1 NONAME + _ZN16ClockAlarmEditorC1ER11AlarmClientiP7QObject @ 2 NONAME + _ZN16ClockAlarmEditorC2ER11AlarmClientiP7QObject @ 3 NONAME + _ZN16ClockAlarmEditorD0Ev @ 4 NONAME + _ZN16ClockAlarmEditorD1Ev @ 5 NONAME + _ZN16ClockAlarmEditorD2Ev @ 6 NONAME + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockalarmeditor/inc/clockalarmeditor.h --- a/clock/clockui/clockalarmeditor/inc/clockalarmeditor.h Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockalarmeditor/inc/clockalarmeditor.h Mon Jun 28 15:22:02 2010 +0530 @@ -36,20 +36,23 @@ class HbAction; class HbDateTimePicker; class HbDialog; +class HbTranslator; class XQSettingsManager; class XQSettingsKey; class AlarmClient; class TimezoneClient; class ClockAlarmCustomItem; -class QTranslator; + -class ClockAlarmEditor : public HbView +class ClockAlarmEditor : public QObject { Q_OBJECT public: CLOCKALARMEDITOR_EXPORT ClockAlarmEditor( - int alarmId = 0, QGraphicsWidget *parent = 0); + AlarmClient& alarmClient, + int alarmId = 0, + QObject *parent = 0); CLOCKALARMEDITOR_EXPORT virtual ~ClockAlarmEditor(); public: @@ -61,10 +64,10 @@ void handleDiscardAction(); void handleTimeChange(const QString &text); void handleOccurenceChanged(int index); - void handleCancelAction(); void handleOkAction(); void launchTimePicker(); - void handleAlarmSoundChanged(); + void handleAlarmSoundChanged(int checkedState); + void selectedAction(HbAction *action); signals: void alarmSet(); @@ -73,7 +76,6 @@ void initModel(); void populateModelItems(); void initAlarmInfo(); - void createMenu(); void createToolbar(); void setAlarm( QString timeInfo, QString descInfo, int repeatType, @@ -85,9 +87,12 @@ void displayRemainingTimeNote(AlarmInfo& alarmInfo); void getDayText(int alarmDay,QString& dayText); int getRemainingSeconds(QDateTime& alarmDateTime); + void launchDialog(QString title, QString text = 0); + void sortAlarmDaysList(QStringList& alarmDays); private: int mAlarmId; + int mStartOfWeek; bool mAlarmDayItemInserted; QString mTimeFormat; @@ -99,7 +104,7 @@ HbDataFormModelItem *mAlarmSoundItem; HbDataFormModelItem *mAlarmDescription; - HbView *mPreviousView; + HbView *mAlarmEditorView; HbAction *mDiscardAction; HbAction *mDeleteAction; HbAction *mDoneAction; @@ -111,10 +116,10 @@ XQSettingsManager *mSettingsManager; XQSettingsKey *mPreviosAlarmTime; - AlarmClient *mAlarmClient; + AlarmClient &mAlarmClient; AlarmInfo mAlarmInfo; TimezoneClient *mTimezoneClient; - QTranslator *mTranslator; + HbTranslator *mTranslator; }; #endif // CLOCKALARMEDITOR_H diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockalarmeditor/src/clockalarmeditor.cpp --- a/clock/clockui/clockalarmeditor/src/clockalarmeditor.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockalarmeditor/src/clockalarmeditor.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -17,7 +17,6 @@ // System includes #include - #include #include #include @@ -25,21 +24,21 @@ #include #include #include -#include -#include #include -#include -#include #include #include #include -#include +#include +#include +#include +#include +#include #include #include -#include + // User includes -#include "clockcommon.h" +#include "clockprivatecrkeys.h" #include "clockalarmeditor.h" #include "alarmclient.h" #include "settingsutility.h" @@ -52,6 +51,7 @@ const int KOneMinute(1); const int KOneHour(1); const int KSecondsInOneDay(24 * 60 * 60); +const int KDaysInWeek(7); /*! \class ClockAlarmEditor @@ -68,9 +68,12 @@ edit. \param parent The parent object. */ -ClockAlarmEditor::ClockAlarmEditor(int alarmId, QGraphicsWidget *parent) -:HbView(parent), +ClockAlarmEditor::ClockAlarmEditor( + AlarmClient &alarmClient, int alarmId, + QObject *parent) +:QObject(parent), mAlarmId(alarmId), + mStartOfWeek(0), mAlarmDayItemInserted(false), mAlarmEditorForm(0), mAlarmEditorModel(0), @@ -79,39 +82,14 @@ mAlarmDayItem(0), mAlarmSoundItem(0), mAlarmDescription(0), - mAlarmClient(0) - { - + mAlarmClient(alarmClient) +{ // Load the translation file and install the alarmeditor specific translator - mTranslator = new QTranslator; - //QString lang = QLocale::system().name(); - //QString path = "Z:/resource/qt/translations/"; - mTranslator->load("clockalarmeditor",":/translations"); - // TODO: Load the appropriate .qm file based on locale - //bool loaded = mTranslator->load("caleneditor_" + lang, path); - HbApplication::instance()->installTranslator(mTranslator); - - // Create the Alarm Editor DataForm. - mAlarmEditorForm = new HbDataForm(this); - - // Set the title text of the Clock Alarm Editor view. - setTitle(hbTrId("txt_common_common_clock")); - - // Create the alarm client object. - mAlarmClient = new AlarmClient(this); - - // Set the heading of the Alarm Editor DataForm. - if (mAlarmId && mAlarmClient) { - mAlarmEditorForm->setHeading( - hbTrId("txt_clock_subhead_alarm")); - } - else - { - mAlarmEditorForm->setHeading(hbTrId("txt_clock_subhead_new_alarm")); - } - + mTranslator = new HbTranslator("clockalarmeditor"); + mTranslator->loadCommon(); + // create the timezone client object - mTimezoneClient = new TimezoneClient(this); + mTimezoneClient = TimezoneClient::getInstance(); // Create the settings manager. mSettingsManager = new XQSettingsManager(this); @@ -124,31 +102,68 @@ // TODO: do i need to delete this object ?? SettingsUtility *settingsUtil = new SettingsUtility(this); mTimeFormat = settingsUtil->timeFormatString(); + + // Get start of week from the locale. + HbExtendedLocale locale = HbExtendedLocale::system(); + mStartOfWeek = locale.startOfWeek(); + + // Create the HbDocumentLoader object. + HbDocumentLoader *loader = new HbDocumentLoader(); + bool success; + loader->load(":/xml/clockalarmeditor.docml", &success); + + mAlarmEditorView = qobject_cast( + loader->findWidget("alarmEditorView")); + + // Get the subtitle groupBox. + HbGroupBox *subtitleGroupBox = qobject_cast( + loader->findWidget("subtitleGroupBox")); + + // Set the heading of the subtitle groupBox. + if (mAlarmId) { + subtitleGroupBox->setHeading(hbTrId("txt_clock_subhead_alarm")); + } else { + subtitleGroupBox->setHeading(hbTrId("txt_clock_subhead_new_alarm")); + } + + // Get the Alarm Editor DataForm. + mAlarmEditorForm = qobject_cast ( + loader->findWidget("alarmEditorForm")); + // Create the alarm info structure with desired values. initAlarmInfo(); // Creates & initializes the DataFormModel for the AlarmEditor DataForm. initModel(); - + QList prototypes = mAlarmEditorForm->itemPrototypes(); ClockAlarmCustomItem *customItem = new ClockAlarmCustomItem(mAlarmEditorForm); prototypes.append(customItem); mAlarmEditorForm->setItemPrototypes(prototypes); - // Create the menu. - createMenu(); + // Get the menu items for the alarm editor. + mDeleteAction = qobject_cast ( + loader->findObject("deleteAction")); + mDiscardAction = qobject_cast( + loader->findObject("discardChanges")); + + // Connect the signals for the menu item. + connect( + mDeleteAction, SIGNAL(triggered()), + this, SLOT(handleDeleteAction())); + connect( + mDiscardAction, SIGNAL(triggered()), + this, SLOT(handleDiscardAction())); // Add the done soft key action. - mDoneAction = new HbAction(Hb::DoneAction); + mDoneAction = new HbAction(Hb::DoneNaviAction); connect( mDoneAction, SIGNAL(triggered()), this, SLOT(handleDoneAction())); - setNavigationAction(mDoneAction); + mAlarmEditorView->setNavigationAction(mDoneAction); - // Sets the AlarmEditor DataForm to the Clock AlarmEditor view. - setWidget(mAlarmEditorForm); } /*! @@ -156,16 +171,7 @@ */ ClockAlarmEditor::~ClockAlarmEditor() { - if (mAlarmClient) { - delete mAlarmClient; - mAlarmClient = 0; - } - if(mTimezoneClient) { - delete mTimezoneClient; - mTimezoneClient = 0; - } // Remove the translator - HbApplication::instance()->removeTranslator(mTranslator); if (mTranslator) { delete mTranslator; mTranslator = 0; @@ -180,9 +186,8 @@ { // Store the current view and set alarm editor as current view. HbMainWindow *window = hbInstance->allMainWindows().first(); - mPreviousView = window->currentView(); - window->addView(this); - window->setCurrentView(this); + window->addView(mAlarmEditorView); + window->setCurrentView(mAlarmEditorView); } /*! @@ -193,6 +198,10 @@ int alarmDayIndex = -1; if (mAlarmDayItemInserted) { alarmDayIndex = mAlarmDayItem->contentWidgetData("currentIndex").toInt(); + alarmDayIndex += mStartOfWeek; + if(alarmDayIndex >= KDaysInWeek){ + alarmDayIndex -= KDaysInWeek; + } } setAlarm( @@ -229,24 +238,20 @@ // Reset alarm day item. if (mAlarmDayItemInserted) { + int currentIndex = mAlarmInfo.alarmDateTime.dayOfWeek() - 1; + currentIndex -= mStartOfWeek; + if(0 > currentIndex){ + currentIndex += KDaysInWeek; + } mAlarmDayItem->setContentWidgetData( - "currentIndex", - mAlarmInfo.alarmDateTime.dayOfWeek() - 1); + "currentIndex",currentIndex); } // Reset for alarm sound. - QStringList alarmSoundOptions; - alarmSoundOptions << tr("On") - << tr("Off"); - if (AlarmVolumeOn == mAlarmInfo.volumeStatus) { - mAlarmSoundItem->setContentWidgetData("text", alarmSoundOptions[0]); - mAlarmSoundItem->setContentWidgetData( - "additionalText", alarmSoundOptions[1]); + mAlarmSoundItem->setContentWidgetData("checkState", Qt::Checked); } else { - mAlarmSoundItem->setContentWidgetData("text", alarmSoundOptions[1]); - mAlarmSoundItem->setContentWidgetData( - "additionalText", alarmSoundOptions[0]); + mAlarmSoundItem->setContentWidgetData("checkState", Qt::Unchecked); } mAlarmDescription->setContentWidgetData("text", mAlarmInfo.alarmDesc); @@ -280,6 +285,11 @@ alarmDayIndex = 0; } if (mAlarmDayItemInserted) { + alarmDayIndex -= mStartOfWeek; + + if(0 > alarmDayIndex){ + alarmDayIndex += KDaysInWeek; + } mAlarmDayItem->setContentWidgetData( "currentIndex", alarmDayIndex); @@ -320,15 +330,14 @@ QString(hbTrId("txt_clock_formlabel_day")), mAlarmEditorModel->invisibleRootItem()); + // Add the alarm days beginning from the start of week. QStringList alarmDays; - alarmDays << hbTrId("txt_clk_setlabel_val_monday") - << hbTrId("txt_clk_setlabel_val_tuesday") - << hbTrId("txt_clk_setlabel_val_wednesday") - << hbTrId("txt_clk_setlabel_val_thursday") - << hbTrId("txt_clk_setlabel_val_friday") - << hbTrId("txt_clk_setlabel_val_saturday") - << hbTrId("txt_clk_setlabel_val_sunday"); + sortAlarmDaysList(alarmDays); + alarmDayIndex -= mStartOfWeek; + if(0 > alarmDayIndex){ + alarmDayIndex += KDaysInWeek; + } mAlarmDayItem->setContentWidgetData("items", alarmDays); mAlarmDayItem->setContentWidgetData( "currentIndex", @@ -351,16 +360,6 @@ } /*! - Called when `Cancel' is pressed on the Dialog. - */ -void ClockAlarmEditor::handleCancelAction() -{ - // Close the dialog. - mTimePickerDialog->close(); - mTimePickerDialog->deleteLater(); -} - -/*! Called when `OK' is pressed on the Dialog. */ void ClockAlarmEditor::handleOkAction() @@ -372,9 +371,6 @@ // Update the selected time value. mAlarmTimeItem->setContentWidgetData("text",newAlarmTime.toString(mTimeFormat)); - // Close the dialog. - handleCancelAction(); - if (mAlarmInfo.nextDueTime != newAlarmTime ) { handleTimeChange(newAlarmTime.toString(mTimeFormat)); } @@ -385,65 +381,58 @@ */ void ClockAlarmEditor::launchTimePicker() { - - - if (mTimePickerDialog) { - delete mTimePickerDialog; - } - - // Create the dialog. - mTimePickerDialog = new HbDialog; - mTimePickerDialog->setTimeout(HbDialog::NoTimeout); - mTimePickerDialog->setDismissPolicy(HbDialog::NoDismiss); + if (mTimePickerDialog) { + delete mTimePickerDialog; + } - // Set the heading for the dialog. - HbLabel * timeLabel = - new HbLabel(hbTrId("txt_tumbler_title_alarm_time"), - mTimePickerDialog); - mTimePickerDialog->setHeadingWidget(timeLabel); + // Create the dialog. + mTimePickerDialog = new HbDialog; + mTimePickerDialog->setTimeout(HbDialog::NoTimeout); + mTimePickerDialog->setDismissPolicy(HbDialog::NoDismiss); + mTimePickerDialog->setAttribute(Qt::WA_DeleteOnClose, true); + // Set the heading for the dialog. + HbLabel * timeLabel = + new HbLabel(hbTrId("txt_tumbler_title_alarm_time"), + mTimePickerDialog); + mTimePickerDialog->setHeadingWidget(timeLabel); - SettingsUtility *settingsUtil = new SettingsUtility(this); - QStringList timeSeparator; - int index = settingsUtil->timeFormat(timeSeparator); - QString tumblerDisplayFormat = - mTimeFormat.replace(timeSeparator.at(index), QString(".")); + SettingsUtility *settingsUtil = new SettingsUtility(this); + QStringList timeSeparator; + int index = settingsUtil->timeFormat(timeSeparator); + + QString tumblerDisplayFormat = + mTimeFormat.replace(timeSeparator.at(index), QString(".")); - // Create the tumbler. - HbDateTimePicker *timePicker = new HbDateTimePicker(mTimePickerDialog); - timePicker->setDisplayFormat(tumblerDisplayFormat); - // Set the tumbler as the content widget. - mTimePickerDialog->setContentWidget(timePicker); - - QString timeString = mAlarmTimeItem->contentWidgetData("text").toString(); - QTime time = QTime::fromString(timeString, mTimeFormat); - timePicker->setTime(time); + // Create the tumbler. + HbDateTimePicker *timePicker = new HbDateTimePicker(mTimePickerDialog); + timePicker->setDisplayFormat(tumblerDisplayFormat); + + mTimePickerDialog->setContentWidget(timePicker); + + QString timeString = mAlarmTimeItem->contentWidgetData("text").toString(); + QTime time = QTime::fromString(timeString, mTimeFormat); + timePicker->setTime(time); - mOkAction = - new HbAction(QString(hbTrId("txt_common_button_ok")), - mTimePickerDialog); - mTimePickerDialog->setPrimaryAction(mOkAction); - connect( - mOkAction, SIGNAL(triggered()), - this, SLOT(handleOkAction())); + mOkAction = + new HbAction(QString(hbTrId("txt_common_button_ok")), + mTimePickerDialog); - mCancelAction = - new HbAction(QString(hbTrId("txt_common_button_cancel")), - mTimePickerDialog); - mTimePickerDialog->setSecondaryAction( mCancelAction ); - connect( - mCancelAction, SIGNAL(triggered()), - this, SLOT(handleCancelAction())); + mCancelAction = + new HbAction(QString(hbTrId("txt_common_button_cancel")), + mTimePickerDialog); - mTimePickerDialog->exec(); + mTimePickerDialog->addAction(mOkAction); + mTimePickerDialog->addAction(mCancelAction); - + mTimePickerDialog->open(this, SLOT(selectedAction(HbAction*))); } /*! Handles the alarm sound change. */ -void ClockAlarmEditor::handleAlarmSoundChanged() +void ClockAlarmEditor::handleAlarmSoundChanged(int checkedState) { + Q_UNUSED(checkedState) if (AlarmVolumeOff == mAlarmInfo.volumeStatus) { mAlarmInfo.volumeStatus = AlarmVolumeOn; } else { @@ -452,6 +441,16 @@ } /*! + Slot to handle the selected action + */ +void ClockAlarmEditor::selectedAction(HbAction *action) +{ + if (action == mOkAction) { + handleOkAction(); + } +} + +/*! Initialises the Model & sets for the AlarmEditorForm. */ void ClockAlarmEditor::initModel() @@ -517,19 +516,18 @@ QString(hbTrId("txt_clk_setlabel_day")), mAlarmEditorModel->invisibleRootItem()); + // Add the alarm days beginning from the start of week. QStringList alarmDays; - alarmDays << hbTrId("txt_clk_setlabel_val_monday") - << hbTrId("txt_clk_setlabel_val_tuesday") - << hbTrId("txt_clk_setlabel_val_wednesday") - << hbTrId("txt_clk_setlabel_val_thursday") - << hbTrId("txt_clk_setlabel_val_friday") - << hbTrId("txt_clk_setlabel_val_saturday") - << hbTrId("txt_clk_setlabel_val_sunday"); + sortAlarmDaysList(alarmDays); + int currentIndex = mAlarmInfo.alarmDateTime.dayOfWeek() - 1; + currentIndex -= mStartOfWeek; + if(0 > currentIndex){ + currentIndex += KDaysInWeek; + } mAlarmDayItem->setContentWidgetData("items", alarmDays); mAlarmDayItem->setContentWidgetData( - "currentIndex", - mAlarmInfo.alarmDateTime.dayOfWeek() - 1); + "currentIndex",currentIndex); mAlarmDayItemInserted = true; }/* else { TODO: check and remove this else block. @@ -543,23 +541,21 @@ // Alarm sound. mAlarmSoundItem = mAlarmEditorModel->appendDataFormItem( - HbDataFormModelItem::ToggleValueItem, - QString(hbTrId("txt_clk_setlabel_alarm_sound")), + HbDataFormModelItem::CheckBoxItem, + QString(hbTrId("")), mAlarmEditorModel->invisibleRootItem()); - QStringList alarmSoundOptions; - alarmSoundOptions << tr("On") - << tr("Off"); + + mAlarmSoundItem->setContentWidgetData( + "text", QString(hbTrId("txt_clk_setlabel_alarm_sound"))); if (AlarmVolumeOn == mAlarmInfo.volumeStatus) { - mAlarmSoundItem->setContentWidgetData("text", alarmSoundOptions[0]); - mAlarmSoundItem->setContentWidgetData( - "additionalText", alarmSoundOptions[1]); - } else { - mAlarmSoundItem->setContentWidgetData("text", alarmSoundOptions[1]); - mAlarmSoundItem->setContentWidgetData( - "additionalText", alarmSoundOptions[0]); + mAlarmSoundItem->setContentWidgetData("checkState",Qt::Checked); } + mAlarmEditorForm->addConnection( + mAlarmSoundItem, SIGNAL(stateChanged(int)), + this,SLOT(handleAlarmSoundChanged(int))); + // Description. mAlarmDescription = mAlarmEditorModel->appendDataFormItem( HbDataFormModelItem::TextItem, @@ -592,36 +588,20 @@ mAlarmInfo.alarmDateTime = mAlarmInfo.alarmDateTime.addDays(1); } - // Set the alarm volume on by default. - mAlarmInfo.volumeStatus = AlarmVolumeOn; + if (!mAlarmId) { + // Set the alarm volume On by default for new alarms.. + mAlarmInfo.volumeStatus = AlarmVolumeOn; + } // If editor state is a reset alarm, then its an already existing alarm // get the alarm details and fill it in mAlarmInfo. - if (mAlarmId && mAlarmClient) { - mAlarmClient->getAlarmInfo(mAlarmId, mAlarmInfo); - mAlarmClient->deleteAlarm(mAlarmId); + if (mAlarmId) { + mAlarmClient.getAlarmInfo(mAlarmId, mAlarmInfo); + mAlarmClient.deleteAlarm(mAlarmId); } } /*! - Creates menu items. - */ -void ClockAlarmEditor::createMenu() -{ - // Set the menu for the alarm editor. - mDeleteAction = menu()->addAction(hbTrId("txt_clock_opt_delete")); - mDiscardAction = menu()->addAction(hbTrId("txt_clock_opt_discard_changes")); - - // Connect the signals for the menu item. - connect( - mDeleteAction, SIGNAL(triggered()), - this, SLOT(handleDeleteAction())); - connect( - mDiscardAction, SIGNAL(triggered()), - this, SLOT(handleDiscardAction())); -} - -/*! Sets the alarm to the alarm server. */ void ClockAlarmEditor::setAlarm( @@ -653,7 +633,7 @@ alarmInfo.volumeStatus = mAlarmInfo.volumeStatus; // Request the listener to set the alarm. - mAlarmClient->setAlarm(alarmInfo); + mAlarmClient.setAlarm(alarmInfo); // Check if DST rule gets applied in 24hrs. // If so we don't display the remaining time. @@ -715,9 +695,8 @@ { // Remove the alarm editor. HbMainWindow *window = hbInstance->allMainWindows().first(); - - window->removeView(this); - window->setCurrentView(mPreviousView); + window->removeView(mAlarmEditorView); + deleteLater(); } /*! @@ -733,7 +712,7 @@ hbTrId("txt_clock_dpopinfo_alarm_will_occur_at_1_after_au"); QString displayText = dstRollOverText.arg(alarmTime); // show the note - HbNotificationDialog::launchDialog(displayText); + launchDialog(displayText); } /*! @@ -797,7 +776,6 @@ break; } if (Enabled == alarmInfo.alarmStatus && !(displayText.isEmpty())) { - //HbNotificationDialog::launchDialog(displayText); showDisplayText = true; } @@ -870,17 +848,16 @@ && !(remainingTimeText.isEmpty())) { if (!(displayText.isEmpty()) ) { - HbNotificationDialog::launchDialog( - displayText, remainingTimeText); + launchDialog(displayText, remainingTimeText); showDisplayText = false; } else { - HbNotificationDialog::launchDialog(remainingTimeText); + launchDialog(remainingTimeText); } } } if (showDisplayText) { - HbNotificationDialog::launchDialog(displayText); + launchDialog(displayText); } } @@ -941,4 +918,35 @@ return remainingSeconds; } +/*! + Launches the soft notification. + */ +void ClockAlarmEditor::launchDialog(QString title, QString text) +{ + HbNotificationDialog *notificationDialog = new HbNotificationDialog(); + notificationDialog->setTitle(title); + + if (!text.isNull()) { + notificationDialog->setText(text); + } + + notificationDialog->setTimeout(HbPopup::ConfirmationNoteTimeout); + notificationDialog->show(); +} + +/*! + Sorts and appends alarm days on the basis of start of week. + */ +void ClockAlarmEditor::sortAlarmDaysList(QStringList& alarmDaysList) + +{ + for(int index=(mStartOfWeek + 1),j=KDaysInWeek;j!=0 ;index++,j--){ + if(index > KDaysInWeek){ + index = index - KDaysInWeek; + } + QString alarmDayText; + getDayText(index, alarmDayText ); + alarmDaysList.append(alarmDayText); + } +} // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockappcontroller/bwins/clockappcontrolleru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockappcontroller/bwins/clockappcontrolleru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,4 @@ +EXPORTS + ??1ClockAppController@@UAE@XZ @ 1 NONAME ; ClockAppController::~ClockAppController(void) + ??0ClockAppController@@QAE@PAVQObject@@@Z @ 2 NONAME ; ClockAppController::ClockAppController(class QObject *) + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockappcontroller/eabi/clockappcontrolleru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockappcontroller/eabi/clockappcontrolleru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,7 @@ +EXPORTS + _ZN18ClockAppControllerC1EP7QObject @ 1 NONAME + _ZN18ClockAppControllerC2EP7QObject @ 2 NONAME + _ZN18ClockAppControllerD0Ev @ 3 NONAME + _ZN18ClockAppControllerD1Ev @ 4 NONAME + _ZN18ClockAppControllerD2Ev @ 5 NONAME + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockappcontroller/src/clockappcontroller.cpp --- a/clock/clockui/clockappcontroller/src/clockappcontroller.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockappcontroller/src/clockappcontroller.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -15,9 +15,6 @@ * */ -// System includes -#include - // User includes #include "clockappcontroller.h" #include "clockappcontrollerifimpl.h" @@ -38,8 +35,6 @@ mViewManager(0), mIfImpl(0) { - qDebug() << "clock: ClockAppController::ClockAppController -->"; - // Construct the interface implementation. mIfImpl = new ClockAppControllerIfImpl(this, this); @@ -48,8 +43,6 @@ Q_ASSERT_X( mViewManager, "clockappcontroller.cpp", "ClockViewManager is 0"); - - qDebug() << "clock: ClockAppController::ClockAppController <--"; } /*! @@ -57,8 +50,6 @@ */ ClockAppController::~ClockAppController() { - qDebug() << "clock: ClockAppController::~ClockAppController -->"; - if (mViewManager) { delete mViewManager; mViewManager = 0; @@ -67,8 +58,6 @@ delete mIfImpl; mIfImpl = 0; } - - qDebug() << "clock: ClockAppController::~ClockAppController <--"; } // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockappcontroller/src/clockappcontrollerifimpl.cpp --- a/clock/clockui/clockappcontroller/src/clockappcontrollerifimpl.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockappcontroller/src/clockappcontrollerifimpl.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -16,9 +16,6 @@ * */ -// System includes -#include - // User includes #include "clockappcontrollerifimpl.h" #include "clockappcontroller.h" @@ -46,16 +43,12 @@ :QObject(parent), mAppController(controller) { - qDebug() << "clock: ClockAppControllerIfImpl::ClockAppControllerIfImpl -->"; - // Construct the timezone client. - mTimeZoneClient = new TimezoneClient(this); + mTimeZoneClient = TimezoneClient::getInstance(); // Construct the settings utility object. mSettingsUtility = new SettingsUtility(this); // Construct the alarm client object. mAlarmClient = new AlarmClient(this); - - qDebug() << "clock: ClockAppControllerIfImpl::ClockAppControllerIfImpl <--"; } /*! @@ -63,11 +56,8 @@ */ ClockAppControllerIfImpl::~ClockAppControllerIfImpl() { - qDebug() << "clock: ClockAppControllerIfImpl::~ClockAppControllerIfImpl -->"; - - if (mTimeZoneClient) { - delete mTimeZoneClient; - mTimeZoneClient = 0; + if (!mTimeZoneClient->isNull()) { + mTimeZoneClient->deleteInstance(); } if (mSettingsUtility) { delete mSettingsUtility; @@ -77,8 +67,6 @@ delete mAlarmClient; mAlarmClient = 0; } - - qDebug() << "clock: ClockAppControllerIfImpl::~ClockAppControllerIfImpl <--"; } @@ -91,10 +79,6 @@ */ TimezoneClient* ClockAppControllerIfImpl::timezoneClient() { - qDebug() << "clock: ClockAppControllerIfImpl::timezoneClient -->"; - - qDebug() << "clock: ClockAppControllerIfImpl::timezoneClient <--"; - return mTimeZoneClient; } @@ -107,10 +91,6 @@ */ SettingsUtility* ClockAppControllerIfImpl::settingsUtility() { - qDebug() << "clock: ClockAppControllerIfImpl::settingsUtility -->"; - - qDebug() << "clock: ClockAppControllerIfImpl::settingsUtility <--"; - return mSettingsUtility; } @@ -123,10 +103,6 @@ */ AlarmClient* ClockAppControllerIfImpl::alarmClient() { - qDebug() << "clock: ClockAppControllerIfImpl::alarmClient -->"; - - qDebug() << "clock: ClockAppControllerIfImpl::alarmClient <--"; - return mAlarmClient; } @@ -139,11 +115,7 @@ */ void ClockAppControllerIfImpl::switchToView(ClockViews viewId) { - qDebug() << "clock: ClockAppControllerIfImpl::switchToView -->"; - mAppController->mViewManager->showView(viewId); - - qDebug() << "clock: ClockAppControllerIfImpl::switchToView <--"; } // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockapplication/clockapplication.pro --- a/clock/clockui/clockapplication/clockapplication.pro Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockapplication/clockapplication.pro Mon Jun 28 15:22:02 2010 +0530 @@ -34,6 +34,8 @@ LIBS += \ -lclockappcontroller + + SKINICON = qtg_large_clock } SOURCES += main.cpp diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockapplication/src/main.cpp --- a/clock/clockui/clockapplication/src/main.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockapplication/src/main.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -18,7 +18,7 @@ // System includes #include #include -#include +#include #include #include @@ -32,8 +32,6 @@ */ int main(int argc, char *argv[]) { - qDebug("clock: main() -->"); - // Initialization HbApplication app(argc, argv); @@ -45,10 +43,9 @@ window.setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate); // Load the translation file. - QTranslator translator; - translator.load("clock", ":/translations"); - app.installTranslator(&translator); - + HbTranslator translator("clock"); + translator.loadCommon(); + // Construct the application controller. QScopedPointer controller(new ClockAppController); Q_UNUSED(controller) @@ -56,8 +53,6 @@ // Show widget window.show(); - qDebug("clock: main() <--"); - // Enter event loop return app.exec(); } diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockcityselectionlist/bwins/clockcityselectionlistu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockcityselectionlist/bwins/clockcityselectionlistu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,20 @@ +EXPORTS + ??_EClockCitySelectionList@@UAE@I@Z @ 1 NONAME ; ClockCitySelectionList::~ClockCitySelectionList(unsigned int) + ??1ClockCitySelectionList@@UAE@XZ @ 2 NONAME ; ClockCitySelectionList::~ClockCitySelectionList(void) + ?d_func@ClockCitySelectionList@@ABEPBVClockCitySelectionListPrivate@@XZ @ 3 NONAME ; class ClockCitySelectionListPrivate const * ClockCitySelectionList::d_func(void) const + ?citySelected@ClockCitySelectionList@@IAEXULocationInfo@@@Z @ 4 NONAME ; void ClockCitySelectionList::citySelected(struct LocationInfo) + ?trUtf8@ClockCitySelectionList@@SA?AVQString@@PBD0@Z @ 5 NONAME ; class QString ClockCitySelectionList::trUtf8(char const *, char const *) + ?qt_metacast@ClockCitySelectionList@@UAEPAXPBD@Z @ 6 NONAME ; void * ClockCitySelectionList::qt_metacast(char const *) + ??0ClockCitySelectionList@@QAE@PAVQObject@@@Z @ 7 NONAME ; ClockCitySelectionList::ClockCitySelectionList(class QObject *) + ?closeCityList@ClockCitySelectionList@@QAEXXZ @ 8 NONAME ; void ClockCitySelectionList::closeCityList(void) + ?trUtf8@ClockCitySelectionList@@SA?AVQString@@PBD0H@Z @ 9 NONAME ; class QString ClockCitySelectionList::trUtf8(char const *, char const *, int) + ?qt_metacall@ClockCitySelectionList@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 10 NONAME ; int ClockCitySelectionList::qt_metacall(enum QMetaObject::Call, int, void * *) + ??0ClockCitySelectionList@@QAE@PAVTimezoneClient@@PAVQObject@@@Z @ 11 NONAME ; ClockCitySelectionList::ClockCitySelectionList(class TimezoneClient *, class QObject *) + ?metaObject@ClockCitySelectionList@@UBEPBUQMetaObject@@XZ @ 12 NONAME ; struct QMetaObject const * ClockCitySelectionList::metaObject(void) const + ?d_func@ClockCitySelectionList@@AAEPAVClockCitySelectionListPrivate@@XZ @ 13 NONAME ; class ClockCitySelectionListPrivate * ClockCitySelectionList::d_func(void) + ?showCityList@ClockCitySelectionList@@QAEXXZ @ 14 NONAME ; void ClockCitySelectionList::showCityList(void) + ?staticMetaObject@ClockCitySelectionList@@2UQMetaObject@@B @ 15 NONAME ; struct QMetaObject const ClockCitySelectionList::staticMetaObject + ?tr@ClockCitySelectionList@@SA?AVQString@@PBD0H@Z @ 16 NONAME ; class QString ClockCitySelectionList::tr(char const *, char const *, int) + ?tr@ClockCitySelectionList@@SA?AVQString@@PBD0@Z @ 17 NONAME ; class QString ClockCitySelectionList::tr(char const *, char const *) + ?getStaticMetaObject@ClockCitySelectionList@@SAABUQMetaObject@@XZ @ 18 NONAME ; struct QMetaObject const & ClockCitySelectionList::getStaticMetaObject(void) + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockcityselectionlist/clockcityselectionlist.pro --- a/clock/clockui/clockcityselectionlist/clockcityselectionlist.pro Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockcityselectionlist/clockcityselectionlist.pro Mon Jun 28 15:22:02 2010 +0530 @@ -43,7 +43,7 @@ clockcityselectionlist.cpp \ clockcityselectionlist_p.cpp \ clockcitylistproxymodel.cpp \ - clockcityselectionlistprototype.cpp + HEADERS += \ clockcityselectionlist.h \ @@ -51,9 +51,10 @@ clockcitylistproxymodel.h \ clockcityselectionlistdefines.h \ clockcityselectionlistcommon.h \ - clockcityselectionlistprototype.h RESOURCES += \ clockcityselectionlist.qrc + +TRANSLATIONS += clockcityselectionlist.ts # End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockcityselectionlist/data/clockcityselectionlist.qrc --- a/clock/clockui/clockcityselectionlist/data/clockcityselectionlist.qrc Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockcityselectionlist/data/clockcityselectionlist.qrc Mon Jun 28 15:22:02 2010 +0530 @@ -2,12 +2,4 @@ xml/clockcityselectionlist.docml - - style/clockcityselectionlistprototype.css - style/clockcityselectionlistprototype.widgetml - - - translations/clockcityselectionlist.qm - - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockcityselectionlist/data/style/clockcityselectionlistprototype.css --- a/clock/clockui/clockcityselectionlist/data/style/clockcityselectionlistprototype.css Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -ClockCitySelectionListPrototype[layoutName="cityselectionlist-default"]{ - layout: cityselectionlist-default; -} - -ClockCitySelectionListPrototype::cityNameItem[layoutName="cityselectionlist-default"]{ - font-variant: secondary; - text-height: var(hb-param-text-height-secondary); - text-line-count-min: 1; - text-line-count-max: 2; - text-align: left; - left: -var(hb-param-margin-gene-left); - top: -var(hb-param-margin-gene-top); - right: var(hb-param-margin-gene-right); - bottom: var(hb-param-margin-gene-bottom); -} diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockcityselectionlist/data/style/clockcityselectionlistprototype.widgetml --- a/clock/clockui/clockcityselectionlist/data/style/clockcityselectionlistprototype.widgetml Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockcityselectionlist/data/translations/clockcityselectionlist.qm Binary file clock/clockui/clockcityselectionlist/data/translations/clockcityselectionlist.qm has changed diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockcityselectionlist/data/translations/clockcityselectionlist.ts --- a/clock/clockui/clockcityselectionlist/data/translations/clockcityselectionlist.ts Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,459 +0,0 @@ - - - - - - 1st label in Regional date & time settings view - Time format - Time format - qtl_dataform_heading_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Title for Date and time settings view - Clock - Clock - - Common - Common - Co - False - - - The time and date information will be displayed in 2nd row - %1, %2 - %1, %2 - qtl_list_sec_large_graphic - CP main view_time & date plugin_P11 - list - CP - False - - - Setting item to clock display type. Tap to toggle values. - Digital - Digital - qtl_dataform_button_sec - Clock_Date & time settings_P04_1 - button - Cl - False - - - This text is displayed in 1st row - Time & date - Time & date - qtl_list_pri_large_graphic - CP main view_time & date plugin_P11 - list - CP - False - - - Note displayed after alarm is set (every week) - Alarm occurs every week on %1 at %2 - Alarm occurs every week on %1 at %2 - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - Title for the time picker tumbler widget - Alarm time - Alarm time - qtl_dialog_pri_heading - Tumbler - title - Tu - False - - - 2nd value in combo box list for Date format label - mm dd yyyy - mm dd yyyy - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_2_val - Cl - False - - - Note displayed after alarm is set (time remaining) (hrs, min) - Time to alarm %1 hours and %2 minute - Time to alarm %1 hours and %2 minute - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - 3rd field in Regional date & time settings view - Date format - Date format - qtl_dataform_heading_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Tapping on this button opens advanced date and time view - Regional date & time settings - Regional date & time settings - qtl_dataform_button_sec - Clock_Date & time settings_P04_1 - button - Cl - False - - - Popup Information which comes after setting the alarm. - Alarm will occur at %1 after automatic daylight saving update - Alarm will occur at %1 after automatic daylight saving update - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - - Time - Time - qtl_dialog_pri_heading - Tumbler - title - Tu - False - - - Sub-title for Regiional date & time settings - Regional date & time settings - Regional date & time settings - qtl_groupbox_simple_sec - Clock_Date & time settings_P04_3 - subhead - Cl - False - - - 5th label for Place in Clock settings view - Place - Place - qtl_dataform_heading_pri - Clock_Date & time settings_P04_1 - formlabel_1 - Cl - False - - - 1st Value in combo box list for Time format label - 24 hour - 24 hour - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_1_val - Cl - False - - - Form label for country in add own city (popup) data entry form - Country - Country - qtl_dataform_heading_pri - Clock_City list_P07 - formlabel_1 - Cl - False - - - - DST - DST - - Common - setlabel_1 - Co - False - - - Note displayed after alarm is set (Everyday Time) - Alarm occurs every day at %1 - Alarm occurs every day at %1 - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - Alarm snooze time details in the list box (5mins, 10mins, 15mins, 30mins) - %Ln minutes - - (s)%Ln minutes - (p)%Ln minutes - - qtl_dataform_combobox_sec - Clock_Date & time settings_P04_1 - set - Cl - False - - - Setting item to clock display type. Tap to toggle values. - Analog - Analog - qtl_dataform_button_sec - Clock_Date & time settings_P04_1 - button - Cl - False - - - 6th field in Regional date & time settings view - Week starts on - Week starts on - qtl_dataform_heading_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Note displayed after alarm is set (time remaining) - Time to alarm %1 hour and %2 minute - Time to alarm %1 hour and %2 minute - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - 3rd value in combo box list for Date format label - yyyy mm dd - yyyy mm dd - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_3_val - Cl - False - - - Note displayed after alarm is set (only once) - Alarm occurs once only on next %1 at %2 - Alarm occurs once only on next %1 at %2 - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - Note displayed after alarm is set (time remaining) (hr, mins) - Time to alarm %1 hour and %2 minutes - Time to alarm %1 hour and %2 minutes - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - Form label for city name in add own city (popup) data entry form - City name - City name - qtl_dataform_heading_pri - Clock_City list_P07 - formlabel_1 - Cl - False - - - Title for the date picker tumbler widget - Alarm date - Alarm date - qtl_dialog_pri_heading - Tumbler - title - Tu - False - - - Form label for timezone in add own city (popup) data entry form - Timezone - Timezone - qtl_dataform_heading_pri - Clock_City list_P07 - formlabel_1 - Cl - False - - - - Date - Date - qtl_dialog_pri_heading - Tumbler - title - Tu - False - - - - GMT - GMT - - Common - Common - Co - False - - - "Add own city" from Options menu in City list - Add own city - Add own city - qtl_menu_pri - Clock_City list_P07 - opt - Cl - False - - - 1st label in Date and time settings view - Use network date & time - Use network date & time - qtl_checkbox_sec - Clock_Date & time settings_P04_1 - setlabel_1 - Cl - False - - - Subtitle for the time seperator drop down list - Time separator - Time separator - qtl_dataform_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Subtitle for the date seperator drop down list - Date separator - Date separator - qtl_dataform_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Label for Workdays in Alarm editor - Workdays - Workdays - qtl_dataform_heading_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Label to the date field (picker) in the settings view - Date - Date - qtl_dataform_pri - Clock_Date & time settings_P04_1 - setlabel_1 - Cl - False - - - Label to the time field (picker) in the settings view - Time - Time - qtl_dataform_pri - Clock_Date & time settings_P04_1 - setlabel_1 - Cl - False - - - 2nd value in combo box list for Time format label - 12 hour - 12 hour - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_2_val - Cl - False - - - Note displayed after alarm is set (time remaining) (hrs, mins) - Time to alarm %1 hours and %2 minutes - Time to alarm %1 hours and %2 minutes - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - Note displayed after alarm is set (workdays) - Alarm occurs workdays at %1 - Alarm occurs workdays at %1 - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - Primary text label for Clock Type - Clock Type - Clock Type - qtl_dataform_pri - Clock_Date & time settings_P04_1 - setlabel_5 - Cl - False - - - Subtitle for City list - City list - City list - qtl_groupbox_simple_sec - Clock_City list_P07 - subhead - Cl - False - - - Sub-title for Date & time settings view - Date & time - Date & time - qtl_groupbox_simple_sec - Clock_Date & time settings_P04_1 - subhead - Cl - False - - - 1st value in combo box list for Date format label - dd mm yyyy - dd mm yyyy - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_1_val - Cl - False - - - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockcityselectionlist/data/xml/clockcityselectionlist.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockcityselectionlist/data/xml/clockcityselectionlist.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockcityselectionlist/eabi/clockcityselectionlistu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockcityselectionlist/eabi/clockcityselectionlistu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,19 @@ +EXPORTS + _ZN22ClockCitySelectionList11qt_metacallEN11QMetaObject4CallEiPPv @ 1 NONAME + _ZN22ClockCitySelectionList11qt_metacastEPKc @ 2 NONAME + _ZN22ClockCitySelectionList12citySelectedE12LocationInfo @ 3 NONAME + _ZN22ClockCitySelectionList12showCityListEv @ 4 NONAME + _ZN22ClockCitySelectionList13closeCityListEv @ 5 NONAME + _ZN22ClockCitySelectionList16staticMetaObjectE @ 6 NONAME DATA 16 + _ZN22ClockCitySelectionList19getStaticMetaObjectEv @ 7 NONAME + _ZN22ClockCitySelectionListC1EP14TimezoneClientP7QObject @ 8 NONAME + _ZN22ClockCitySelectionListC1EP7QObject @ 9 NONAME + _ZN22ClockCitySelectionListC2EP14TimezoneClientP7QObject @ 10 NONAME + _ZN22ClockCitySelectionListC2EP7QObject @ 11 NONAME + _ZN22ClockCitySelectionListD0Ev @ 12 NONAME + _ZN22ClockCitySelectionListD1Ev @ 13 NONAME + _ZN22ClockCitySelectionListD2Ev @ 14 NONAME + _ZNK22ClockCitySelectionList10metaObjectEv @ 15 NONAME + _ZTI22ClockCitySelectionList @ 16 NONAME + _ZTV22ClockCitySelectionList @ 17 NONAME + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockcityselectionlist/inc/clockcityselectionlist.h --- a/clock/clockui/clockcityselectionlist/inc/clockcityselectionlist.h Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockcityselectionlist/inc/clockcityselectionlist.h Mon Jun 28 15:22:02 2010 +0530 @@ -27,10 +27,9 @@ #include "clockdatatypes.h" // Forward declarations +class HbTranslator; class ClockCitySelectionListPrivate; class TimezoneClient; -class QTranslator; - class CLOCKCITYSELECTIONLIST_EXPORT ClockCitySelectionList : public QObject { @@ -52,7 +51,7 @@ ClockCitySelectionListPrivate *d_ptr; Q_DECLARE_PRIVATE_D(d_ptr, ClockCitySelectionList) Q_DISABLE_COPY(ClockCitySelectionList) - QTranslator *mTranslator; + HbTranslator *mTranslator; }; #endif // CLOCKCITYSELECTIONLIST_H diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockcityselectionlist/inc/clockcityselectionlist_p.h --- a/clock/clockui/clockcityselectionlist/inc/clockcityselectionlist_p.h Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockcityselectionlist/inc/clockcityselectionlist_p.h Mon Jun 28 15:22:02 2010 +0530 @@ -58,8 +58,8 @@ void updateSearchCriteria(const QString &criteria); void handleAddOwnCityAction(); void handleOkAction(); - void handleCancelAction(); void handleTimeZoneSelection(int index); + void selectedAction(HbAction *action); private: void showCityList(); @@ -81,6 +81,9 @@ QPointer mTimeZoneComboBox; QPointer mCountryComboBox; + HbAction *mOkAction; + HbAction *mCancelAction; + ClockCitySelectionList *q_ptr; TimezoneClient *mClient; ClockCityListProxyModel *mProxyModel; diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockcityselectionlist/inc/clockcityselectionlistprototype.h --- a/clock/clockui/clockcityselectionlist/inc/clockcityselectionlistprototype.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* The header file for class ClockCitySelectionListPrototype. -* -*/ - -#ifndef CLOCKCITYSELECTIONLISTPROTOTYPE_H -#define CLOCKCITYSELECTIONLISTPROTOTYPE_H - -// System includes -#include - -// Forward declarations -class QGraphicsItem; -class HbAbstractViewItem; -class HbTextItem; - -class ClockCitySelectionListPrototype : public HbListViewItem -{ - Q_OBJECT - -public: - explicit ClockCitySelectionListPrototype(QGraphicsItem *parent = 0); - virtual ~ClockCitySelectionListPrototype(); - -public: - HbAbstractViewItem *createItem(); - void updateChildItems(); - -private: - HbTextItem *mCityNameItem; -}; - -#endif // CLOCKCITYSELECTIONLISTPROTOTYPE_H - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockcityselectionlist/src/clockcityselectionlist.cpp --- a/clock/clockui/clockcityselectionlist/src/clockcityselectionlist.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockcityselectionlist/src/clockcityselectionlist.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -17,8 +17,7 @@ */ //System Include -#include -#include +#include // User includes @@ -55,13 +54,8 @@ d_ptr(new ClockCitySelectionListPrivate(client, this)) { // Load the translation file and install the editor specific translator - mTranslator = new QTranslator; - //QString lang = QLocale::system().name(); - //QString path = "Z:/resource/qt/translations/"; - mTranslator->load("clockcityselectionlist",":/translations"); - // TODO: Load the appropriate .qm file based on locale - //bool loaded = mTranslator->load("caleneditor_" + lang, path); - HbApplication::instance()->installTranslator(mTranslator); + mTranslator = new HbTranslator("clockcityselectionlist"); + mTranslator->loadCommon(); } /*! @@ -74,20 +68,13 @@ d_ptr(new ClockCitySelectionListPrivate(0, this)) { // Load the translation file and install the editor specific translator - mTranslator = new QTranslator; - //QString lang = QLocale::system().name(); - //QString path = "Z:/resource/qt/translations/"; - mTranslator->load("clockcityselectionlist",":/translations"); - // TODO: Load the appropriate .qm file based on locale - //bool loaded = mTranslator->load("caleneditor_" + lang, path); - HbApplication::instance()->installTranslator(mTranslator); - + mTranslator = new HbTranslator("clockcityselectionlist"); + mTranslator->loadCommon(); } ClockCitySelectionList::~ClockCitySelectionList() { // Remove the translator - HbApplication::instance()->removeTranslator(mTranslator); if (mTranslator) { delete mTranslator; mTranslator = 0; diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockcityselectionlist/src/clockcityselectionlist_p.cpp --- a/clock/clockui/clockcityselectionlist/src/clockcityselectionlist_p.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockcityselectionlist/src/clockcityselectionlist_p.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -40,7 +40,7 @@ #include "clockcityselectionlist.h" #include "clockcitylistproxymodel.h" #include "clockcityselectionlistcommon.h" -#include "clockcityselectionlistprototype.h" + #include "timezoneclient.h" #include "clockdatatypes.h" @@ -67,7 +67,7 @@ mClient = client; if (!mClient) { - mClient = new TimezoneClient(this); + mClient = TimezoneClient::getInstance(); mOwnsClient = true; } } @@ -78,7 +78,7 @@ ClockCitySelectionListPrivate::~ClockCitySelectionListPrivate() { if (mOwnsClient) { - delete mClient; + mClient->deleteInstance(); } if (mLoader) { mLoader->reset(); @@ -103,7 +103,7 @@ void ClockCitySelectionListPrivate::populateListModel() { // First get the data from the timezone client. - QList infoList = mClient->getLocations(); + QList &infoList = mClient->getLocations(); // Sanity check. if (!mListModel) { @@ -123,6 +123,7 @@ displayString += info.cityName; displayString += ", "; displayString += info.countryName; + mListModel->setData(index, displayString, Qt::DisplayRole); mListModel->setData(index, displayString, Qt::UserRole + 100); // Now save the timezone and city group ids. @@ -135,6 +136,9 @@ mListModel->setData( index, info.countryName, Qt::UserRole + 104); } + + // Cleanup. + infoList.clear(); } /*! @@ -241,6 +245,7 @@ mAddOwnCityDialog = new HbDialog; mAddOwnCityDialog->setTimeout(HbDialog::NoTimeout); mAddOwnCityDialog->setDismissPolicy(HbDialog::NoDismiss); + mAddOwnCityDialog->setAttribute(Qt::WA_DeleteOnClose, true); // Set the heading text HbLabel *titlelabel = new HbLabel(hbTrId("txt_clk_opt_add_own_city")); @@ -273,20 +278,14 @@ widget->setLayout(layout); // Add actions to the dialog - HbAction *okAction = new HbAction(hbTrId("txt_common_button_ok")); - mAddOwnCityDialog->setPrimaryAction(okAction); - connect( - okAction, SIGNAL(triggered()), - this, SLOT(handleOkAction())); + mOkAction = new HbAction(hbTrId("txt_common_button_ok")); + mCancelAction = new HbAction(hbTrId("txt_common_button_cancel")); - HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_cancel")); - mAddOwnCityDialog->setSecondaryAction(cancelAction); - connect( - cancelAction, SIGNAL(triggered()), - this, SLOT(handleCancelAction())); + mAddOwnCityDialog->addAction(mOkAction); + mAddOwnCityDialog->addAction(mCancelAction); mAddOwnCityDialog->setContentWidget(widget); - mAddOwnCityDialog->exec(); + mAddOwnCityDialog->open(this, SLOT(selectedAction(HbAction*))); } /*! @@ -321,21 +320,6 @@ populateListModel(); } } - - // Close the popup - handleCancelAction(); -} - -/*! - Handles Cancel action of add own city dialog - */ -void ClockCitySelectionListPrivate::handleCancelAction() -{ - // Close the dialog. - if (mAddOwnCityDialog) { - mAddOwnCityDialog->close(); - mAddOwnCityDialog->deleteLater(); - } } /*! @@ -364,6 +348,15 @@ } /*! + Slot to handle the selected action + */ +void ClockCitySelectionListPrivate::selectedAction(HbAction *action) +{ + if (action==mOkAction) { + handleOkAction(); + } +} +/*! Displays the city selection list. */ void ClockCitySelectionListPrivate::showCityList() @@ -399,7 +392,7 @@ connect( mSearchBox, SIGNAL(criteriaChanged(QString)), this, SLOT(updateSearchCriteria(QString))); - + // Construct the source model. if (!mListModel) { mListModel = new QStandardItemModel(0, 1, this); @@ -410,15 +403,6 @@ mProxyModel->setSourceModel(mListModel); mProxyModel->setFilterRole(Qt::UserRole + 100); - // Construct the custom list item prototype. - ClockCitySelectionListPrototype *prototype = - new ClockCitySelectionListPrototype; - - // Loader the custom list view layout. - HbStyleLoader::registerFilePath(":/style/"); - mListView->setLayoutName("cityselectionlist-default"); - mListView->setItemPrototype(prototype); - // Construct the model for the list. QTimer::singleShot(1, this, SLOT(populateListModel())); @@ -441,7 +425,7 @@ // Add the view to the main window and show it. HbMainWindow *window = hbInstance->allMainWindows().at(0); - mBackAction = new HbAction(Hb::BackAction, this); + mBackAction = new HbAction(Hb::BackNaviAction, this); mView->setNavigationAction(mBackAction); connect( mBackAction, SIGNAL(triggered()), diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockcityselectionlist/src/clockcityselectionlistprototype.cpp --- a/clock/clockui/clockcityselectionlist/src/clockcityselectionlistprototype.cpp Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,90 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* The definition file for class ClockCitySelectionListPrototype. -* -*/ - -// System includes -#include -#include - -// User includes -#include "clockcityselectionlistprototype.h" - -/*! - \class ClockCitySelectionListPrototype - - This is the custom prototype class for HbListView. It sub-classes - HbListViewItem and re-implements HbListViewItem::createItem() and - HbListViewItem::updateChildItems(). - - \sa HbListViewItem, HbAbstractViewItem. - */ - -/*! - Default constructor. - - \param parent of type QGraphicsItem. - */ -ClockCitySelectionListPrototype::ClockCitySelectionListPrototype( - QGraphicsItem *parent) -:HbListViewItem(parent), - mCityNameItem(0) -{ - // Nothing yet. -} - -/*! - Destructor. - */ -ClockCitySelectionListPrototype::~ClockCitySelectionListPrototype() -{ - if (mCityNameItem) { - delete mCityNameItem; - mCityNameItem = 0; - } -} - -/*! - From HbListViewItem. - Constructs the custom list view item. - - \sa HbListViewItem, HbAbstractViewItem. - */ -HbAbstractViewItem *ClockCitySelectionListPrototype::createItem() -{ - return new ClockCitySelectionListPrototype(*this); -} - -/*! - From HbListViewItem. - Updates the child items of the cutsom prototype. - - \sa HbListViewItem, HbAbstractViewItem. - */ -void ClockCitySelectionListPrototype::updateChildItems() -{ - HbListViewItem::updateChildItems(); - - if (!mCityNameItem) { - mCityNameItem = new HbTextItem(this); - style()->setItemName(mCityNameItem, "cityNameItem"); - mCityNameItem->setTextWrapping(Hb::TextWordWrap); - } - mCityNameItem->setText( - modelIndex().data(Qt::UserRole + 100).value()); -} - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockplugins/clockplugins.pro --- a/clock/clockui/clockplugins/clockplugins.pro Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockplugins/clockplugins.pro Mon Jun 28 15:22:02 2010 +0530 @@ -17,7 +17,8 @@ TEMPLATE = subdirs SUBDIRS += \ - datetimesettingsplugin + datetimesettingsplugin \ + clocksettingsviewplugin CONFIG += ordered diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockplugins/clocksettingsviewplugin/clocksettingsviewplugin.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockplugins/clocksettingsviewplugin/clocksettingsviewplugin.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,59 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# Project specification file for clocksettingsviewplugin. +# + +TEMPLATE = lib +TARGET = clocksettingsviewplugin +CONFIG += hb plugin + +DEPENDPATH += . \ + ./inc \ + ./src + +INCLUDEPATH += . \ + ../../../inc \ + ../../clocksettingsview/inc \ + ../../../clockmw/clocksettingsutility/inc + +LIBS += \ + -lclocksettingsview + +HEADERS += \ + clocksettingsviewplugin.h \ + ../../../../organizer_plat/clock_settingsview_plugin_api/inc/clocksettingsviewinterface.h + +SOURCES += \ + clocksettingsviewplugin.cpp + +symbian: { + TARGET.CAPABILITY = CAP_GENERAL_DLL + TARGET.EPOCALLOWDLLDATA = 1 + TARGET.UID3 = 0x2003157C + + load(data_caging_paths) + # plugin stub deployment + + plugin.sources = $${TARGET}.dll + plugin.path = $$QT_PLUGINS_BASE_DIR/clock + DEPLOYMENT += plugin + + # for target + BLD_INF_RULES.prj_exports += \ + "./qmakepluginstubs/clocksettingsviewplugin.qtplugin /$$HW_ZDIR$$RESOURCE_FILES_DIR/qt/plugins/clock/clocksettingsviewplugin.qtplugin" +} + + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockplugins/clocksettingsviewplugin/inc/clocksettingsviewplugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockplugins/clocksettingsviewplugin/inc/clocksettingsviewplugin.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,42 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* Header file for ClockSettingsViewPlugin class. +* +*/ + + +#ifndef CLOCKSETTINGSVIEWPLUGIN_H_ +#define CLOCKSETTINGSVIEWPLUGIN_H_ + +// System includes +#include +#include + +class ClockSettingsViewPlugin : public QObject, public ClockSettingsViewInterface +{ + Q_OBJECT + Q_INTERFACES(ClockSettingsViewInterface) + +public: + ClockSettingsViewPlugin(); + ~ClockSettingsViewPlugin(); + + void launchRegionalSettingsView(); + +}; + +#endif /* CLOCKSETTINGSVIEWPLUGIN_H_ */ + +// End of file --Don't remove this diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockplugins/clocksettingsviewplugin/src/clocksettingsviewplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockplugins/clocksettingsviewplugin/src/clocksettingsviewplugin.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,58 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* Definition file for class ClockSettingsViewPlugin. +* +*/ +// System includes +#include + +// User includes +#include "clockregionalsettingsview.h" +#include "clocksettingsviewplugin.h" + +/*! + \class ClockSettingsViewPlugin + + \brief The class ClockSettingsViewPlugin is a plugin to show + clock settings View +*/ + +/*! + Constructor. + */ +ClockSettingsViewPlugin::ClockSettingsViewPlugin() +{ +} + +/*! + Destructor. + */ +ClockSettingsViewPlugin::~ClockSettingsViewPlugin() +{ +} + +/*! + Launch the clock regional settings view. + */ +void ClockSettingsViewPlugin::launchRegionalSettingsView() +{ + //The view is removed from main window and deleted once you select back on view + ClockRegionalSettingsView *view = new ClockRegionalSettingsView(); + view->showView(); +} + +Q_EXPORT_PLUGIN2(clocksettingsviewplugin, ClockSettingsViewPlugin) + +// End of file --Don't remove this diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockplugins/datetimesettingsplugin/datetimesettingsplugin.pro --- a/clock/clockui/clockplugins/datetimesettingsplugin/datetimesettingsplugin.pro Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockplugins/datetimesettingsplugin/datetimesettingsplugin.pro Mon Jun 28 15:22:02 2010 +0530 @@ -17,31 +17,35 @@ TEMPLATE = lib TARGET = datetimesettingsplugin +CONFIG += hb plugin + DEPENDPATH += . \ ./inc \ ./src + INCLUDEPATH += . \ - ../../clocksettingsview/inc - -CONFIG += hb plugin - -LIBS += -lcpframework + ../../../inc \ + ../../../clockmw/clocktimezone/inc \ + ../../clocksettingsview/inc -# Input -HEADERS += datetimesettingsplugin.h \ - datetimesettingsview.h +LIBS += \ + -lcpframework \ + -ltimezoneclient \ + -lclocksettingsview \ + +HEADERS += \ + datetimesettingsplugin.h \ + datetimesettingsview.h -SOURCES += datetimesettingsplugin.cpp \ - datetimesettingsview.cpp +SOURCES += \ + datetimesettingsplugin.cpp \ + datetimesettingsview.cpp symbian: { TARGET.EPOCALLOWDLLDATA = 1 TARGET.UID3 = 0x102818E9 + TARGET.CAPABILITY = CAP_GENERAL_DLL - LIBS += -lclocksettingsview -} - -symbian { deploy.path = C: headers.sources = qmakepluginstubs/datetimesettingsplugin.qtplugin headers.path = /resource/qt/plugins/controlpanel @@ -49,9 +53,9 @@ # This is for new exporting system coming in garden for(header, headers.sources):BLD_INF_RULES.prj_exports += "./$$header $$deploy.path$$headers.path/$$basename(header)" } - -TARGET.CAPABILITY = CAP_GENERAL_DLL plugin.sources = datetimesettingsplugin.dll plugin.path = \resource\qt\plugins\controlpanel -DEPLOYMENT += plugin \ No newline at end of file +DEPLOYMENT += plugin + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockplugins/datetimesettingsplugin/inc/datetimesettingsplugin.h --- a/clock/clockui/clockplugins/datetimesettingsplugin/inc/datetimesettingsplugin.h Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockplugins/datetimesettingsplugin/inc/datetimesettingsplugin.h Mon Jun 28 15:22:02 2010 +0530 @@ -10,29 +10,35 @@ * Nokia Corporation - initial contribution. * * Contributors: - * - * Description: - * +* +* Description: +* Header file for DateTimeSettingsPlugin class. +* */ #ifndef DATETIMESETTINGSPLUGIN_H_ #define DATETIMESETTINGSPLUGIN_H_ -#include -#include +// System includes +#include -class DateTimeSettingsPlugin : public QObject, public CpPluginPlatInterface +// User includes +#include + +class DateTimeSettingsPlugin : public QObject, public CpPluginInterface { Q_OBJECT - Q_INTERFACES(CpPluginPlatInterface) + Q_INTERFACES(CpPluginInterface) public: DateTimeSettingsPlugin(); - virtual ~DateTimeSettingsPlugin(); + virtual ~DateTimeSettingsPlugin(); - virtual int uid() const; - virtual CpSettingFormItemData *createSettingFormItemData(CpItemDataHelper &itemDataHelper) const; + virtual int uid() const; + QList createSettingFormItemData(CpItemDataHelper &itemDataHelper) const; }; #endif /* DATETIMESETTINGSPLUGIN_H_ */ + +// End of file --Don't remove this diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockplugins/datetimesettingsplugin/inc/datetimesettingsview.h --- a/clock/clockui/clockplugins/datetimesettingsplugin/inc/datetimesettingsview.h Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockplugins/datetimesettingsplugin/inc/datetimesettingsview.h Mon Jun 28 15:22:02 2010 +0530 @@ -10,22 +10,46 @@ * Nokia Corporation - initial contribution. * * Contributors: - * - * Description: - * +* +* Description: +* Header file for DateTimeSettingsView class. +* */ #ifndef DATETIMESETTINGSVIEW_H_ #define DATETIMESETTINGSVIEW_H_ -#include +// User includes +#include -class DateTimeSettingsView : public CpBaseSettingView +// Forward declarations +class QTimer; +class TimezoneClient; + +class DateTimeSettingsView : public CpSettingFormEntryItemData { - Q_OBJECT + Q_OBJECT public: - explicit DateTimeSettingsView(QGraphicsItem *parent = 0); - virtual ~DateTimeSettingsView(); + explicit DateTimeSettingsView( + CpItemDataHelper &itemDataHelper, const QString &text = QString(), + const QString &description = QString(), + const HbIcon &icon = HbIcon(), + const HbDataFormModelItem *parent = 0); + virtual ~DateTimeSettingsView(); + +private slots: + void onLaunchView(); + void updateDisplayTime(); + +private: + virtual CpBaseSettingView *createSettingView() const; + +private: + QTimer *mTickTimer; + TimezoneClient *mTimezoneClient; }; -#endif// DATETIMESETTINGSVIEW_H_ + +#endif // DATETIMESETTINGSVIEW_H_ + +// End of file --Don't remove this diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockplugins/datetimesettingsplugin/src/datetimesettingsplugin.cpp --- a/clock/clockui/clockplugins/datetimesettingsplugin/src/datetimesettingsplugin.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockplugins/datetimesettingsplugin/src/datetimesettingsplugin.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -10,40 +10,69 @@ * Nokia Corporation - initial contribution. * * Contributors: - * - * Description: - * +* +* Description: +* Definition file for class DateTimeSettingsPlugin. +* */ - +// System includes +#include #include +#include +// User includes #include "datetimesettingsplugin.h" #include "datetimesettingsview.h" +/*! + Constructor. + */ DateTimeSettingsPlugin::DateTimeSettingsPlugin() { } +/*! + Destructor. + */ DateTimeSettingsPlugin::~DateTimeSettingsPlugin() { } +/*! + Returns the uid of the plugin. + */ int DateTimeSettingsPlugin::uid() const { // UID of the plugin. - return 0x102818E9; + return 0x102818E9; } -CpSettingFormItemData *DateTimeSettingsPlugin:: - createSettingFormItemData( - CpItemDataHelper &itemDataHelper) const +/*! + Creates the object of DateTimeSettingsView class. + */ +QList DateTimeSettingsPlugin:: + createSettingFormItemData( + CpItemDataHelper &itemDataHelper) const { - HbIcon* icon = new HbIcon(); - return new CpSettingFormEntryItemDataImpl( - itemDataHelper, - QString("Clock application"), - QString("Date & Time settings plugin"), - *icon); + HbIcon icon ; + HbExtendedLocale locale = HbExtendedLocale::system(); + QString timeInfo = locale.format( + QTime::currentTime(), r_qtn_time_usual_with_zero); + QString dateinfo = locale.format( + QDate::currentDate(), r_qtn_date_usual_with_zero); + QString displayString; + displayString.append(timeInfo); + displayString.append(" "); + displayString.append(dateinfo); + + QList entryItemList; + CpSettingFormItemData *entryItem = new DateTimeSettingsView( + itemDataHelper,hbTrId("txt_cp_main_view_list_time_date"), + displayString,icon); + entryItemList.append(entryItem); + return entryItemList; } Q_EXPORT_PLUGIN2(DateTimeSettingsPlugin, DateTimeSettingsPlugin) + +// End of file --Don't remove this diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockplugins/datetimesettingsplugin/src/datetimesettingsview.cpp --- a/clock/clockui/clockplugins/datetimesettingsplugin/src/datetimesettingsview.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockplugins/datetimesettingsplugin/src/datetimesettingsview.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -12,28 +12,108 @@ * Contributors: * * Description: -* Definition file for class ClockSettingsView. +* Definition file for class DateTimeSettingsView. * */ +// System includes +#include +#include +#include +#include -#include +// User includes #include "datetimesettingsview.h" #include "clocksettingsview.h" +#include "timezoneclient.h" -DateTimeSettingsView::DateTimeSettingsView(QGraphicsItem *parent) -:CpBaseSettingView(0, parent) -{ - HbDataForm *form = settingForm(); +/*! + \class DateTimeSettingsView + + This class launches the clock settings view from control panel. + */ + +/*! + Constructor. - if (form) { - form->setHeading(tr("Date & Time Settings")); + \param itemDataHelper CpItemDataHelper object. + \param text text to be displayed in first line. + \param description test to be displayed in second line. + \param icon to be displayed. + \param parent Parent of type HbDataFormModelItem + */ +DateTimeSettingsView::DateTimeSettingsView( + CpItemDataHelper &itemDataHelper, const QString &text, + const QString &description, const HbIcon &icon, + const HbDataFormModelItem *parent): + CpSettingFormEntryItemData( + itemDataHelper, text, description, icon, parent) +{ + // Construct the timezone client. + mTimezoneClient = TimezoneClient::getInstance(); + connect( + mTimezoneClient, SIGNAL(timechanged()), + this, SLOT(updateDisplayTime())); - ClockSettingsView *settingsView = new ClockSettingsView(this); - settingsView->loadSettingsView(); - } + // Start a timer. For updating the displayed time. + mTickTimer = new QTimer(this); + // Start the Timer for 1 minute. + mTickTimer->start(60000 - 1000 * QTime::currentTime().second()); + connect( + mTickTimer, SIGNAL(timeout()), + this, SLOT(updateDisplayTime())); } +/*! + Destructor. + */ DateTimeSettingsView::~DateTimeSettingsView() { + if (mTickTimer) { + mTickTimer->stop(); + delete mTickTimer; + mTickTimer = 0; + } + + if (!mTimezoneClient->isNull()) { + mTimezoneClient->deleteInstance(); + } } + +/*! + Launches the clock settings view. + */ +void DateTimeSettingsView::onLaunchView() +{ + ClockSettingsView *settingsView = new ClockSettingsView(this); + settingsView->loadSettingsView(); +} + +/*! + Updates the second line i.e date & time. + */ +void DateTimeSettingsView::updateDisplayTime() +{ + HbExtendedLocale locale = HbExtendedLocale::system(); + QString timeInfo = locale.format( + QTime::currentTime(), r_qtn_time_usual_with_zero); + QString dateinfo = locale.format( + QDate::currentDate(), r_qtn_date_usual_with_zero); + QString displayString; + displayString.append(timeInfo); + displayString.append(" "); + displayString.append(dateinfo); + setDescription(displayString); + // Start the Timer for 1 minute. + mTickTimer->start(60000); +} + +/*! + createSettingView() + */ +CpBaseSettingView *DateTimeSettingsView::createSettingView() const +{ + return 0; +} + +// End of file --Don't remove this diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clocksettingsview/bwins/clocksettingsviewu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clocksettingsview/bwins/clocksettingsviewu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,8 @@ +EXPORTS + ??0ClockSettingsView@@QAE@PAVQObject@@@Z @ 1 NONAME ; ClockSettingsView::ClockSettingsView(class QObject *) + ??1ClockRegionalSettingsView@@UAE@XZ @ 2 NONAME ; ClockRegionalSettingsView::~ClockRegionalSettingsView(void) + ?loadSettingsView@ClockSettingsView@@QAEXXZ @ 3 NONAME ; void ClockSettingsView::loadSettingsView(void) + ??1ClockSettingsView@@UAE@XZ @ 4 NONAME ; ClockSettingsView::~ClockSettingsView(void) + ?showView@ClockRegionalSettingsView@@QAEXXZ @ 5 NONAME ; void ClockRegionalSettingsView::showView(void) + ??0ClockRegionalSettingsView@@QAE@PAVQObject@@@Z @ 6 NONAME ; ClockRegionalSettingsView::ClockRegionalSettingsView(class QObject *) + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clocksettingsview/clocksettingsview.pro --- a/clock/clockui/clocksettingsview/clocksettingsview.pro Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clocksettingsview/clocksettingsview.pro Mon Jun 28 15:22:02 2010 +0530 @@ -23,12 +23,12 @@ INCLUDEPATH += \ ./inc \ - ../clockwidget/inc \ ../../clockmw/clocksettingsutility/inc \ ../../clockmw/clocktimezone/inc \ ../clockcityselectionlist/inc \ ../../inc + DEPENDPATH += \ ./inc \ ./src \ @@ -38,12 +38,13 @@ TARGET.CAPABILITY += ALL -TCB TARGET.EPOCALLOWDLLDATA = 1 TARGET.UID3 = 0x10005906 + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE LIBS += \ -ltimezoneclient \ -lclocksettingsutility \ -lclockcityselectionlist \ - -lclockwidgetproto + -lxqsettingsmanager } SOURCES += \ @@ -61,5 +62,7 @@ RESOURCES += \ clocksettingsview.qrc + +TRANSLATIONS += clocksettingsview.ts # End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clocksettingsview/data/clocksettingsview.qrc --- a/clock/clockui/clocksettingsview/data/clocksettingsview.qrc Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clocksettingsview/data/clocksettingsview.qrc Mon Jun 28 15:22:02 2010 +0530 @@ -3,7 +3,4 @@ xml/clocksettingsview.docml xml/clockregionalsettingsview.docml - - translations/clocksettingsview.qm - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clocksettingsview/data/translations/clocksettingsview.qm Binary file clock/clockui/clocksettingsview/data/translations/clocksettingsview.qm has changed diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clocksettingsview/data/translations/clocksettingsview.ts --- a/clock/clockui/clocksettingsview/data/translations/clocksettingsview.ts Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,349 +0,0 @@ - - - - - - 1st label in Regional date & time settings view - Time format - Time format - qtl_dataform_heading_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Title for Date and time settings view - Clock - Clock - - Common - Common - Co - False - - - The time and date information will be displayed in 2nd row - %1, %2 - %1, %2 - qtl_list_sec_large_graphic - CP main view_time & date plugin_P11 - list - CP - False - - - Setting item to clock display type. Tap to toggle values. - Digital - Digital - qtl_dataform_button_sec - Clock_Date & time settings_P04_1 - button - Cl - False - - - This text is displayed in 1st row - Time & date - Time & date - qtl_list_pri_large_graphic - CP main view_time & date plugin_P11 - list - CP - False - - - 2nd value in combo box list for Date format label - mm dd yyyy - mm dd yyyy - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_2_val - Cl - False - - - 3rd field in Regional date & time settings view - Date format - Date format - qtl_dataform_heading_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Tapping on this button opens advanced date and time view - Regional date & time settings - Regional date & time settings - qtl_dataform_button_sec - Clock_Date & time settings_P04_1 - button - Cl - False - - - Sub-title for Regiional date & time settings - Regional date & time settings - Regional date & time settings - qtl_groupbox_simple_sec - Clock_Date & time settings_P04_3 - subhead - Cl - False - - - 5th label for Place in Clock settings view - Place - Place - qtl_dataform_heading_pri - Clock_Date & time settings_P04_1 - formlabel_1 - Cl - False - - - 1st Value in combo box list for Time format label - 24 hour - 24 hour - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_1_val - Cl - False - - - - DST - DST - - Common - setlabel_1 - Co - False - - - 1st dropdown list value for Day label in Alarm editor view - Monday - Monday - qtl_dataform_group_pri - Clock_Date & time settings_P04_1 - setlabel_1_val - Cl - False - - - 4th dropdown list value for Day label in Alarm editor view - Thursday - Thursday - qtl_dataform_group_pri - Clock_Date & time settings_P04_1 - setlabel_4_val - Cl - False - - - Alarm snooze time details in the list box (5mins, 10mins, 15mins, 30mins) - %Ln minutes - - (s)%Ln minutes - (p)%Ln minutes - - qtl_dataform_combobox_sec - Clock_Date & time settings_P04_1 - set - Cl - False - - - 5th dropdown list value for Day label in Alarm editor view - Friday - Friday - qtl_dataform_group_pri - Clock_Date & time settings_P04_1 - setlabel_5_val - Cl - False - - - Setting item to clock display type. Tap to toggle values. - Analog - Analog - qtl_dataform_button_sec - Clock_Date & time settings_P04_1 - button - Cl - False - - - 6th field in Regional date & time settings view - Week starts on - Week starts on - qtl_dataform_heading_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - 7th dropdown list value for Day label in Alarm editor view - Sunday - Sunday - qtl_dataform_group_pri - Clock_Date & time settings_P04_1 - setlabel_7_val - Cl - False - - - 3rd value in combo box list for Date format label - yyyy mm dd - yyyy mm dd - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_3_val - Cl - False - - - 2nd dropdown list value for Day label in Alarm editor view - Tuesday - Tuesday - qtl_dataform_group_pri - Clock_Date & time settings_P04_1 - setlabel_2_val - Cl - False - - - - GMT - GMT - - Common - Common - Co - False - - - 1st label in Date and time settings view - Use network date & time - Use network date & time - qtl_checkbox_sec - Clock_Date & time settings_P04_1 - setlabel_1 - Cl - False - - - Subtitle for the time seperator drop down list - Time separator - Time separator - qtl_dataform_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Subtitle for the date seperator drop down list - Date separator - Date separator - qtl_dataform_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Label for Workdays in Alarm editor - Workdays - Workdays - qtl_dataform_heading_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Label to the date field (picker) in the settings view - Date - Date - qtl_dataform_pri - Clock_Date & time settings_P04_1 - setlabel_1 - Cl - False - - - Label to the time field (picker) in the settings view - Time - Time - qtl_dataform_pri - Clock_Date & time settings_P04_1 - setlabel_1 - Cl - False - - - 2nd value in combo box list for Time format label - 12 hour - 12 hour - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_2_val - Cl - False - - - Primary text label for Clock Type - Clock Type - Clock Type - qtl_dataform_pri - Clock_Date & time settings_P04_1 - setlabel_5 - Cl - False - - - Sub-title for Date & time settings view - Date & time - Date & time - qtl_groupbox_simple_sec - Clock_Date & time settings_P04_1 - subhead - Cl - False - - - 6th dropdown list value for Day label in Alarm editor view - Saturday - Saturday - qtl_dataform_group_pri - Clock_Date & time settings_P04_1 - setlabel_6_val - Cl - False - - - 3rd dropdown list value for Day label in Alarm editor view - Wednesday - Wednesday - qtl_dataform_group_pri - Clock_Date & time settings_P04_1 - setlabel_3_val - Cl - False - - - 1st value in combo box list for Date format label - dd mm yyyy - dd mm yyyy - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_1_val - Cl - False - - - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clocksettingsview/data/xml/clockregionalsettingsview.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clocksettingsview/data/xml/clockregionalsettingsview.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clocksettingsview/data/xml/clocksettingsview.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clocksettingsview/data/xml/clocksettingsview.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + +
+
+ + + + + + + + + + + +
+ + + + + +
diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clocksettingsview/eabi/clocksettingsviewu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clocksettingsview/eabi/clocksettingsviewu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,14 @@ +EXPORTS + _ZN17ClockSettingsView16loadSettingsViewEv @ 1 NONAME + _ZN17ClockSettingsViewC1EP7QObject @ 2 NONAME + _ZN17ClockSettingsViewC2EP7QObject @ 3 NONAME + _ZN17ClockSettingsViewD0Ev @ 4 NONAME + _ZN17ClockSettingsViewD1Ev @ 5 NONAME + _ZN17ClockSettingsViewD2Ev @ 6 NONAME + _ZN25ClockRegionalSettingsView8showViewEv @ 7 NONAME + _ZN25ClockRegionalSettingsViewC1EP7QObject @ 8 NONAME + _ZN25ClockRegionalSettingsViewC2EP7QObject @ 9 NONAME + _ZN25ClockRegionalSettingsViewD0Ev @ 10 NONAME + _ZN25ClockRegionalSettingsViewD1Ev @ 11 NONAME + _ZN25ClockRegionalSettingsViewD2Ev @ 12 NONAME + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clocksettingsview/inc/clockregionalsettingsview.h --- a/clock/clockui/clocksettingsview/inc/clockregionalsettingsview.h Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clocksettingsview/inc/clockregionalsettingsview.h Mon Jun 28 15:22:02 2010 +0530 @@ -23,9 +23,9 @@ #include #include #include - // User includes #include "settingsutility.h" +#include "clocksettingsdefines.h" // Forward declarations class HbView; @@ -35,21 +35,23 @@ class HbDataFormModelItem; class HbListWidget; class HbComboBox; -class QTranslator; +class HbTranslator; class ClockSettingsDocLoader; class SettingsCustomItem; + class ClockRegionalSettingsView : public QObject { Q_OBJECT public: - ClockRegionalSettingsView(SettingsUtility &utility, QObject *parent = 0); - virtual ~ClockRegionalSettingsView(); + CLOCKSETTINGSVIEW_EXPORT ClockRegionalSettingsView(QObject *parent = 0); + CLOCKSETTINGSVIEW_EXPORT virtual ~ClockRegionalSettingsView(); public: - void showView(); - + CLOCKSETTINGSVIEW_EXPORT void showView(); +public slots: + void updateWeekStartOn(); private slots: void handleBackAction(); void handleItemDisplayed(const QModelIndex &index); @@ -65,6 +67,8 @@ void createModel(); void populateFormModel(); QStringList weekdayList(); + void updateWeekDays(); + private: QStringList mTimeFormatStringList; @@ -73,8 +77,6 @@ QStringList mDateSeparatorStringList; HbView *mView; - HbAction *mBackAction; - QPointer mForm; QPointer mFormModel; @@ -86,9 +88,9 @@ QPointer mWorkdaysItem; ClockSettingsDocLoader *mLoader; - SettingsUtility &mSettingsUtility; + SettingsUtility *mSettingsUtility; SettingsCustomItem *mCustomPrototype; - QTranslator *mTranslator; + HbTranslator *mTranslator; }; #endif // CLOCKREGIONALSETTINGSVIEW_H diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clocksettingsview/inc/clocksettingsview.h --- a/clock/clockui/clocksettingsview/inc/clocksettingsview.h Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clocksettingsview/inc/clocksettingsview.h Mon Jun 28 15:22:02 2010 +0530 @@ -33,14 +33,13 @@ class HbDataFormModel; class HbDataFormModelItem; class HbLabel; - class TimezoneClient; class SettingsUtility; -class SkinnableClock; class ClockSettingsDocLoader; class ClockSettingsView; -class SkinnableClock; -class QTranslator; +class HbTranslator; +class XQSettingsManager; +class XQSettingsKey; class ClockSettingsView : public QObject { @@ -55,13 +54,15 @@ private slots: void handleBackAction(); - void updateDateLabel(); - void updatePlaceInfo(); - void updateClockWidget(); + void updatePlaceItem(); void updateDateItem(); void updateTimeItem(); void handleOrientationChanged(Qt::Orientation orientation); void handleNetworkTimeStateChange(int state); + void handleAutoTimeUpdateChange(int value); + void handleAlarmSnoozeTimeChanged(int index); + void handleClockTypeChanged(); + void eventMonitor(const XQSettingsKey& key, const QVariant& value); private: void setupView(); @@ -78,20 +79,19 @@ QPointer mSettingsModel; - - HbLabel *mDayDateLabel; - HbLabel *mPlaceLabel; - HbDataFormModelItem *mNetworkTimeItem; HbDataFormModelItem *mTimeDataFormItem; HbDataFormModelItem *mDateDataFormItem; HbDataFormModelItem *mPlaceDataFormItem; - + HbDataFormModelItem *mClockTypeItem; + HbDataFormModelItem *mAlarmSnoozeItem; ClockSettingsDocLoader *mDocLoader; SettingsUtility *mSettingsUtility; - TimezoneClient *mTimezoneClient; - SkinnableClock *mClockWidget; - QTranslator *mTranslator; + TimezoneClient *mTimezoneClient; + XQSettingsManager *mSettingsManager; + XQSettingsKey *mAlarmSnoozeTimeKey; + QHash mAlarmSnoozeTimeHash; + HbTranslator *mTranslator; }; #endif // CLOCKSETTINGSVIEW_H diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clocksettingsview/inc/settingscustomitem.h --- a/clock/clockui/clocksettingsview/inc/settingscustomitem.h Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clocksettingsview/inc/settingscustomitem.h Mon Jun 28 15:22:02 2010 +0530 @@ -53,21 +53,13 @@ private slots: void launchTimePicker(); - void handleTimeOkAction(); - void handleTimeCancelAction(); - + void handleOkAction(); void launchDatePicker(); - void handleDateOkAction(); - void handleDateCancelAction(); - void launchCitySelectionList(); void updatePlaceItem(LocationInfo info); + void launchRegSettingsView(); + void selectedAction(HbAction *action); - void launchRegSettingsView(); - -private: - - private: QStringList mWeekdaysList; @@ -77,6 +69,9 @@ QPointer mDateWidget; QPointer mPlaceWidget; + HbAction *mOkAction; + HbAction *mCancelAction; + SettingsUtility *mSettingsUtility; ClockCitySelectionList *mCitySelectionList; TimezoneClient *mTimezoneClient; diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clocksettingsview/src/clockregionalsettingsview.cpp --- a/clock/clockui/clocksettingsview/src/clockregionalsettingsview.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clocksettingsview/src/clockregionalsettingsview.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -21,17 +21,16 @@ #include #include #include +#include #include #include #include #include #include -#include #include #include -#include -#include -#include +#include +#include // User includes #include "clockregionalsettingsview.h" @@ -49,25 +48,21 @@ /*! Default constructor. */ -ClockRegionalSettingsView::ClockRegionalSettingsView( - SettingsUtility &utility, QObject *parent) +ClockRegionalSettingsView::ClockRegionalSettingsView(QObject *parent) :QObject(parent), mView(0), - mBackAction(0), - mLoader(0), - mSettingsUtility(utility) + mLoader(0) { // Construct the document loader. mLoader = new ClockSettingsDocLoader; + // Construct the settignsutility. + mSettingsUtility = new SettingsUtility(); + // Load the translation file and install the editor specific translator - mTranslator = new QTranslator; - //QString lang = QLocale::system().name(); - //QString path = "Z:/resource/qt/translations/"; - mTranslator->load("clocksettingsview",":/translations"); - // TODO: Load the appropriate .qm file based on locale - //bool loaded = mTranslator->load("caleneditor_" + lang, path); - HbApplication::instance()->installTranslator(mTranslator); + mTranslator = new HbTranslator("clocksettingsview"); + mTranslator->loadCommon(); + // Create the custom prototype. mCustomPrototype = new SettingsCustomItem(); } @@ -81,8 +76,15 @@ delete mLoader; mLoader = 0; } + + if (mSettingsUtility) { + delete mSettingsUtility; + mSettingsUtility = 0; + } + if(mFormModel){ + delete mFormModel; + } // Remove the translator - HbApplication::instance()->removeTranslator(mTranslator); if (mTranslator) { delete mTranslator; mTranslator = 0; @@ -134,10 +136,10 @@ window->setCurrentView(mView); // Add the back softkey. - mBackAction = new HbAction(Hb::BackAction); - mView->setNavigationAction(mBackAction); + HbAction *backAction = new HbAction(Hb::BackNaviAction); + mView->setNavigationAction(backAction); connect( - mBackAction, SIGNAL(triggered()), + backAction, SIGNAL(triggered()), this, SLOT(handleBackAction())); } @@ -233,8 +235,8 @@ */ void ClockRegionalSettingsView::handleTimeFormatChange() { -// mSettingsUtility.setTimeFormat(mTimeFormatItem->text()); - mSettingsUtility.setTimeFormat( +// mSettingsUtility->setTimeFormat(mTimeFormatItem->text()); + mSettingsUtility->setTimeFormat( mTimeFormatItem->contentWidgetData("text").toString()); } @@ -244,8 +246,8 @@ */ void ClockRegionalSettingsView::handleTimeSeparatorChange() { -// mSettingsUtility.setTimeSeparator(mTimeSeparatorItem->text()); - mSettingsUtility.setTimeSeparator( +// mSettingsUtility->setTimeSeparator(mTimeSeparatorItem->text()); + mSettingsUtility->setTimeSeparator( mTimeSeparatorItem->contentWidgetData("text").toString()); } @@ -253,7 +255,7 @@ */ void ClockRegionalSettingsView::handleDateFormatChange(QString text) { - mSettingsUtility.setDateFormat(text); + mSettingsUtility->setDateFormat(text); } /*! @@ -262,7 +264,7 @@ */ void ClockRegionalSettingsView::handleDateSeparatorChange(QString text) { - mSettingsUtility.setDateSeparator(text); + mSettingsUtility->setDateSeparator(text); } /*! @@ -271,8 +273,6 @@ void ClockRegionalSettingsView::handleDataChanged( const QModelIndex& topLeft, const QModelIndex& bottomRight) { - qDebug("clock: ClockRegionalSettingsView::handleDataChanged() -->"); - Q_UNUSED(bottomRight) @@ -280,34 +280,13 @@ case 5: { // The Start of week item. - if (mStartOfWeekItem != 0) { + if (mStartOfWeekItem != 0) + { int index = mStartOfWeekItem->currentIndex(); - mSettingsUtility.setStartOfWeek(index); - - QStringList weekdays = weekdayList(); - QString workdays = mCustomPrototype->workdaysSetting(); - QItemSelectionModel *model = 0; - model = mWorkdaysItem->selectionModel(); - - for (int i = 0, index = workdays.size() - 1; - i < mWorkdaysItem->count(); ++i, index--) { - QString str = weekdays[i]; - mWorkdaysItem->item(i)->setText(str); - - QChar ch = workdays.at(index); - if ( ch == QChar('0')) { - // Not a workday. - model->select( - model->model()->index(i,0), - QItemSelectionModel::Deselect); - } else { - // Workday. - model->select( - model->model()->index(i,0), - QItemSelectionModel::Select); - } - } - } + mSettingsUtility->setStartOfWeek(index); + //update the week days + updateWeekDays(); + } } break; @@ -350,13 +329,13 @@ } // Get the locale. - HbExtendedLocale locale = HbExtendedLocale::system(); + HbExtendedLocale locale = HbExtendedLocale::system(); // Time format item. mTimeFormatItem = mFormModel->appendDataFormItem( HbDataFormModelItem::ToggleValueItem, hbTrId("txt_clock_setlabel_time_format")); - int index = mSettingsUtility.timeFormat(mTimeFormatStringList); + int index = mSettingsUtility->timeFormat(mTimeFormatStringList); if (0 == index) { mTimeFormatItem->setContentWidgetData("text", mTimeFormatStringList[0]); mTimeFormatItem->setContentWidgetData("additionalText", mTimeFormatStringList[1]); @@ -372,7 +351,7 @@ mTimeSeparatorItem = mFormModel->appendDataFormItem( HbDataFormModelItem::ToggleValueItem, hbTrId("txt_clock_setlabel_time_separator")); - index = mSettingsUtility.timeSeparator(mTimeSeparatorStringList); + index = mSettingsUtility->timeSeparator(mTimeSeparatorStringList); if (0 == index) { mTimeSeparatorItem->setContentWidgetData("text", mTimeSeparatorStringList[0]); mTimeSeparatorItem->setContentWidgetData( @@ -390,7 +369,7 @@ mDateFormatItem = mFormModel->appendDataFormItem( HbDataFormModelItem::ComboBoxItem, hbTrId("txt_clock_setlabel_date_format")); - index = mSettingsUtility.dateFormat(mDateFormatStringList); + index = mSettingsUtility->dateFormat(mDateFormatStringList); mDateFormatItem->setContentWidgetData("items", mDateFormatStringList); mDateFormatItem->setContentWidgetData("currentIndex",index); @@ -402,7 +381,7 @@ mDateSeparatorItem = mFormModel->appendDataFormItem( HbDataFormModelItem::ComboBoxItem, hbTrId("txt_clock_setlabel_date_separator")); - index = mSettingsUtility.dateSeparator(mDateSeparatorStringList); + index = mSettingsUtility->dateSeparator(mDateSeparatorStringList); mDateSeparatorItem->setContentWidgetData("items", mDateSeparatorStringList); mDateSeparatorItem->setContentWidgetData("currentIndex",index); @@ -471,4 +450,60 @@ return weekDays; } + +/*! + update the start week on . + */ + +void ClockRegionalSettingsView::updateWeekStartOn() +{ +if (mStartOfWeekItem != 0) + { + HbExtendedLocale locale; + HbExtendedLocale::WeekDay weekdDayStart = locale.startOfWeek(); + int currentDay = mStartOfWeekItem->currentIndex(); + if(currentDay == weekdDayStart ) + { + return; + } + else + { + mStartOfWeekItem->setCurrentIndex(weekdDayStart); + updateWeekDays(); + } + } +} + +/*! + update the week days . + */ +void ClockRegionalSettingsView::updateWeekDays() +{ +QStringList weekdays = weekdayList(); +QString workdays = mCustomPrototype->workdaysSetting(); +QItemSelectionModel *model = 0; +model = mWorkdaysItem->selectionModel(); + +for (int i = 0, index = workdays.size() - 1; + i < mWorkdaysItem->count(); ++i, index--) + { + QString str = weekdays[i]; + mWorkdaysItem->item(i)->setText(str); + + QChar ch = workdays.at(index); + if ( ch == QChar('0')) + { + // Not a workday. + model->select( + model->model()->index(i,0), + QItemSelectionModel::Deselect); + } + else + { + // Workday. + model->select( + model->model()->index(i,0), + QItemSelectionModel::Select);} + } +} // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clocksettingsview/src/clocksettingsdocloader.cpp --- a/clock/clockui/clocksettingsview/src/clocksettingsdocloader.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clocksettingsview/src/clocksettingsdocloader.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -16,13 +16,9 @@ * */ -// System includes. -#include - // User includes #include "clocksettingsdocloader.h" #include "clocksettingsdefines.h" -#include "skinnableclock.h" #include "clocksettingsview.h" /*! @@ -39,16 +35,6 @@ */ QObject *ClockSettingsDocLoader::createObject(const QString &type, const QString &name) { - qDebug() << "clock: ClockSettingsDocLoader::createObject -->"; - - if (CLOCK_WIDGET == name) { - QObject *object = new SkinnableClock(); - object->setObjectName(name); - return object; - } - - qDebug() << "clock: ClockSettingsDocLoader::createObject <--"; - return HbDocumentLoader::createObject(type, name); } diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clocksettingsview/src/clocksettingsview.cpp --- a/clock/clockui/clocksettingsview/src/clocksettingsview.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clocksettingsview/src/clocksettingsview.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -17,7 +17,6 @@ */ // System includes -#include #include #include #include @@ -26,8 +25,10 @@ #include #include #include -#include -#include +#include +#include +#include +#include // User includes #include "clocksettingsview.h" @@ -35,7 +36,6 @@ #include "clocksettingsdocloader.h" #include "settingsutility.h" #include "timezoneclient.h" -#include "skinnableclock.h" #include "settingsdatatypes.h" #include "settingscustomitem.h" @@ -54,37 +54,31 @@ ClockSettingsView::ClockSettingsView(QObject *parent) :QObject(parent) { - qDebug("clock: ClockSettingsView::ClockSettingsView() -->"); // Load the translation file and install the editor specific translator - mTranslator = new QTranslator; - //QString lang = QLocale::system().name(); - //QString path = "Z:/resource/qt/translations/"; - mTranslator->load("clocksettingsview",":/translations"); - // TODO: Load the appropriate .qm file based on locale - //bool loaded = mTranslator->load("caleneditor_" + lang, path); - HbApplication::instance()->installTranslator(mTranslator); + mTranslator = new HbTranslator("clocksettingsview"); + mTranslator->loadCommon(); // Construct the settings utility. mSettingsUtility = new SettingsUtility(); // Construct the timezone client. - mTimezoneClient = new TimezoneClient(); + mTimezoneClient = TimezoneClient::getInstance(); connect( mTimezoneClient, SIGNAL(timechanged()), - this, SLOT(updatePlaceInfo())); - connect( - mTimezoneClient, SIGNAL(timechanged()), - this, SLOT(updateDateLabel())); - connect( - mTimezoneClient, SIGNAL(timechanged()), - this, SLOT(updateClockWidget())); + this, SLOT(updatePlaceItem())); connect( mTimezoneClient, SIGNAL(timechanged()), this, SLOT(updateDateItem())); connect( mTimezoneClient, SIGNAL(timechanged()), this, SLOT(updateTimeItem())); + connect( + mTimezoneClient, SIGNAL(autoTimeUpdateChanged(int)), + this, SLOT(handleAutoTimeUpdateChange(int))); + connect( + mTimezoneClient, SIGNAL(cityUpdated()), + this, SLOT(updatePlaceItem())); // Start a timer. For updating the remaining alarm time. mTickTimer = new QTimer(this); @@ -92,7 +86,22 @@ mTickTimer, SIGNAL(timeout()), this, SLOT(updateTimeItem())); - qDebug("clock: ClockSettingsView::ClockSettingsView() <--"); + // Create the settings manager. + mSettingsManager = new XQSettingsManager(this); + + // Create the key for alarm snooze time. + mAlarmSnoozeTimeKey = new XQSettingsKey( + XQSettingsKey::TargetCentralRepository, + KCRUidClockApp, + KClockAppSnoozeTime); + + // Start the monitoring for the alarm snooze time key. + mSettingsManager->startMonitoring(*mAlarmSnoozeTimeKey); + + // Listen to the key value changes. + connect( + mSettingsManager, SIGNAL(valueChanged(XQSettingsKey, QVariant)), + this, SLOT(eventMonitor(XQSettingsKey, QVariant))); } /*! @@ -100,20 +109,24 @@ */ ClockSettingsView::~ClockSettingsView() { - qDebug("clock: ClockSettingsView::~ClockSettingsView() -->"); - if (mDocLoader) { delete mDocLoader; } // Remove the translator - HbApplication::instance()->removeTranslator(mTranslator); if (mTranslator) { delete mTranslator; mTranslator = 0; } + if(mSettingsUtility){ + delete mSettingsUtility; + } + + if(mSettingsModel){ + delete mSettingsModel; + } + - qDebug("clock: ClockSettingsView::~ClockSettingsView() <--"); } /*! @@ -121,8 +134,6 @@ */ void ClockSettingsView::loadSettingsView() { - qDebug() << "clock: ClockViewManager::loadMainView -->"; - bool loadSuccess; // Construct the document loader instance @@ -161,7 +172,6 @@ // Setup the view. setupView(); - qDebug() << "clock: ClockViewManager::loadMainView <--"; } /*! @@ -175,109 +185,21 @@ } /*! - Updates the day and date in the day label. + Updates the zone info in the place item field. */ -void ClockSettingsView::updateDateLabel() +void ClockSettingsView::updatePlaceItem() { - qDebug() << "clock: ClockSettingsView::updateDateLabel -->"; - - // Get the current datetime. - QDateTime dateTime = QDateTime::currentDateTime(); - // Get the day name. - QString dayName = dateTime.toString("dddd"); - // Get the date in correct format. - QString currentDate = mSettingsUtility->date(); - // Construct the day + date string. - QString dayDateString; - dayDateString+= dayName; - dayDateString += " "; - dayDateString += currentDate; - - mDayDateLabel->clear(); - mDayDateLabel->setPlainText(dayDateString); - - qDebug() << "clock: ClockSettingsView::updateDateLabel <--"; -} - -/*! - Updates the zone info in the place label. - */ -void ClockSettingsView::updatePlaceInfo() -{ - qDebug() << "clock: ClockSettingsView::updateClockZoneInfo -->"; - // Get the current zone info. LocationInfo currentZoneInfo = mTimezoneClient->getCurrentZoneInfoL(); - // Construct the GMT +/- X string. - QString gmtOffset; - - int utcOffset = currentZoneInfo.zoneOffset; - int offsetInHours (utcOffset/60); - int offsetInMinutes (utcOffset%60); - - // Check wether the offset is +ve or -ve. - if (0 < utcOffset) { - // We have a positive offset. Append the '+' character. - gmtOffset += tr(" +"); - } else if (0 > utcOffset) { - // We have a negative offset. Append the '-' character. - gmtOffset += tr(" -"); - offsetInHours = -offsetInHours; - } else { - // We dont have an offset. We are at GMT zone. - } - - // Append the hour component. - gmtOffset += QString::number(offsetInHours); - - // Get the time separator from settings and append it. - QStringList timeSeparatorList; - int index = mSettingsUtility->timeSeparator(timeSeparatorList); - gmtOffset += timeSeparatorList.at(index); - - // Append the minute component. - // If minute component is less less than 10, append a '00' - if (0 <= offsetInMinutes && offsetInMinutes < 10) { - gmtOffset += tr("00"); - } else { - gmtOffset += QString::number(offsetInMinutes); - } - - gmtOffset += tr(" GMT "); - - // Append DST info. - if (currentZoneInfo.dstOn) { - gmtOffset += tr(" DST"); - } - - // Update the labels with the correct info. - mPlaceLabel->clear(); if (mTimezoneClient->timeUpdateOn()) { - mPlaceLabel->setPlainText( - currentZoneInfo.countryName + tr(" ") + gmtOffset); mPlaceDataFormItem->setContentWidgetData( "text", currentZoneInfo.countryName); } else { QString placeInfo = currentZoneInfo.cityName + tr(", ") + currentZoneInfo.countryName; - mPlaceLabel->setPlainText(placeInfo + tr(" ") + gmtOffset); mPlaceDataFormItem->setContentWidgetData("text", placeInfo); } - - qDebug() << "clock: ClockSettingsView::updateDayDateInfo <--"; -} - -/*! - Updates the clock widget display. - */ -void ClockSettingsView::updateClockWidget() -{ - qDebug() << "clock: ClockSettingsView::updateClockWidget -->"; - - mClockWidget->updateDisplay(true); - - qDebug() << "clock: ClockSettingsView::updateClockWidget <--"; } /*! @@ -307,8 +229,6 @@ */ void ClockSettingsView::handleOrientationChanged(Qt::Orientation orientation) { - qDebug() << "clock: ClockSettingsView::handleOrientationChanged -->"; - bool success; // If horizontal, load the landscape section. if (Qt::Horizontal == orientation) { @@ -322,9 +242,6 @@ CLOCK_SETTINGS_VIEW_PORTRAIT_SECTION, &success); } - - qDebug() << "clock: ClockSettingsView::handleOrientationChanged <--"; - } void ClockSettingsView::handleNetworkTimeStateChange(int state) @@ -333,36 +250,13 @@ if ((Qt::Checked == state && !cenrepValue) || (Qt::Unchecked == state && cenrepValue)) { if (Qt::Checked == state) { - // Disable the time, date and place item. - if (mTimeDataFormItem) { - mTimeDataFormItem->setEnabled(false); - } - if (mDateDataFormItem) { - mDateDataFormItem->setEnabled(false); - } - if (mPlaceDataFormItem) { - mPlaceDataFormItem->setEnabled(false); - } // Update the cenrep value. mTimezoneClient->setTimeUpdateOn(true); } else if (Qt::Unchecked == state) { - // Enable the time, date and place item. - if (mTimeDataFormItem) { - mTimeDataFormItem->setEnabled(true); - } - if (mDateDataFormItem) { - mDateDataFormItem->setEnabled(true); - } - if (mPlaceDataFormItem) { - mPlaceDataFormItem->setEnabled(true); - } - // Update the cenrep value. mTimezoneClient->setTimeUpdateOn(false); } - - updatePlaceInfo(); } } @@ -374,14 +268,12 @@ */ void ClockSettingsView::setupView() { - qDebug("clock: ClockSettingsView::setupView() -->"); - HbMainWindow *window = hbInstance->allMainWindows().first(); window->addView(mSettingsView); window->setCurrentView(mSettingsView); // Add the back softkey. - mBackAction = new HbAction(Hb::BackAction); + mBackAction = new HbAction(Hb::BackNaviAction); mSettingsView->setNavigationAction(mBackAction); connect( mBackAction, SIGNAL(triggered()), @@ -391,34 +283,17 @@ mSettingsForm = static_cast ( mDocLoader->findWidget(CLOCK_SETTINGS_DATA_FORM)); - // Get the day-date label. - mDayDateLabel = static_cast ( - mDocLoader->findWidget(CLOCK_SETTINGS_DATE_LABEL)); - - // Get the place label. - mPlaceLabel = static_cast ( - mDocLoader->findWidget(CLOCK_SETTINGS_PLACE_LABEL)); - - // Get the clock widget. - mClockWidget = static_cast ( - mDocLoader->findObject(CLOCK_WIDGET)); - // Create the custom prototype. QList prototypes = mSettingsForm->itemPrototypes(); - SettingsCustomItem *customPrototype = new SettingsCustomItem(); + SettingsCustomItem *customPrototype = new SettingsCustomItem(mSettingsForm); prototypes.append(customPrototype); mSettingsForm->setItemPrototypes(prototypes); // Create the model. createModel(); - // Update the relevant info. - updateDateLabel(); - updateClockWidget(); - updatePlaceInfo(); + updatePlaceItem(); mTickTimer->start(60000 - 1000 * QTime::currentTime().second()); - - qDebug("clock: ClockSettingsView::setupView() <--"); } /*! @@ -513,7 +388,147 @@ static_cast (HbDataFormModelItem::CustomItemBase + RegionalSettingsItem); mSettingsModel->appendDataFormItem(regionalSettingsItem); + + // Add the clock type item. + HbDataFormModelItem::DataItemType clockTypeSettingsItem = + static_cast + (HbDataFormModelItem::ToggleValueItem); + mClockTypeItem = mSettingsModel->appendDataFormItem( + clockTypeSettingsItem,hbTrId("txt_clock_setlabel_clock_type")); + QStringList clockTypeList; + int clockType = mSettingsUtility->clockType(clockTypeList); + int zeroIndex(0); + if( zeroIndex == clockType ){ + mClockTypeItem->setContentWidgetData("text", clockTypeList[0]); + mClockTypeItem->setContentWidgetData("additionalText", clockTypeList[1]); + } else { + mClockTypeItem->setContentWidgetData("text", clockTypeList[1]); + mClockTypeItem->setContentWidgetData("additionalText", clockTypeList[0]); + } + mSettingsForm->addConnection( + mClockTypeItem, SIGNAL(clicked()), + this, SLOT(handleClockTypeChanged())); + + // Add the alarm snooze time item. + mAlarmSnoozeItem = mSettingsModel->appendDataFormItem( + HbDataFormModelItem::ComboBoxItem, + hbTrId("txt_clock_setlabel_alarm_snooze_time")); + QStringList alramSnoozeTimes; + alramSnoozeTimes << hbTrId("txt_clock_set_ln_mins", 5) + << hbTrId("txt_clock_set_ln_mins", 10) + << hbTrId("txt_clock_set_ln_mins", 15) + << hbTrId("txt_clock_set_ln_mins", 30); + + // Build the hash map for the reminder. + mAlarmSnoozeTimeHash[0] = 5; + mAlarmSnoozeTimeHash[1] = 10; + mAlarmSnoozeTimeHash[2] = 15; + mAlarmSnoozeTimeHash[3] = 30; + + mAlarmSnoozeItem->setContentWidgetData("items", alramSnoozeTimes); + QVariant value = mSettingsManager->readItemValue(*mAlarmSnoozeTimeKey); + bool success; + int index; + int alarmSnoozeTime = value.toInt(&success); + if (success) { + index = mAlarmSnoozeTimeHash.key(alarmSnoozeTime); + } else { + index = mAlarmSnoozeTimeHash.key(15); + } + mAlarmSnoozeItem->setContentWidgetData("currentIndex", index); + mSettingsForm->addConnection( + mAlarmSnoozeItem, SIGNAL(currentIndexChanged(int)), + this, SLOT(handleAlarmSnoozeTimeChanged(int))); } +/*! + Slot which handles the auto time update value changes in cenrep. + + /param value New value of the auto time update. + */ +void ClockSettingsView::handleAutoTimeUpdateChange(int value) +{ + int state = (mNetworkTimeItem->contentWidgetData("checkState")).toInt(); + + if (value) { + // Disable the time, date and place item. + if (mTimeDataFormItem) { + mTimeDataFormItem->setEnabled(false); + } + if (mDateDataFormItem) { + mDateDataFormItem->setEnabled(false); + } + if (mPlaceDataFormItem) { + mPlaceDataFormItem->setEnabled(false); + } + if (Qt::Unchecked == state) { + mNetworkTimeItem->setContentWidgetData( + "checkState", Qt::Checked); + } + } else { + // Enable the time, date and place item. + if (mTimeDataFormItem) { + mTimeDataFormItem->setEnabled(true); + } + if (mDateDataFormItem) { + mDateDataFormItem->setEnabled(true); + } + if (mPlaceDataFormItem) { + mPlaceDataFormItem->setEnabled(true); + } + if (Qt::Checked == state) { + mNetworkTimeItem->setContentWidgetData( + "checkState", Qt::Unchecked); + } + } + updatePlaceItem(); +} + +/*! + Slot which handles the alarm snooze time changes. + + /param value New index of the alarm snooze time. + */ +void ClockSettingsView::handleAlarmSnoozeTimeChanged(int index) +{ + if (mAlarmSnoozeTimeHash.value(index)) { + mSettingsManager->writeItemValue( + *mAlarmSnoozeTimeKey, mAlarmSnoozeTimeHash.value(index)); + } +} + +/*! + Slot which handles the clock type change.. + */ +void ClockSettingsView::handleClockTypeChanged() +{ + mSettingsUtility->setClockType( + mClockTypeItem->contentWidgetData("text").toString()); +} + +/*! + Slot which is called when the value changes in cenrep. + + \param key The key which got changed in cenrep. + \param value The new value of that key. + */ +void ClockSettingsView::eventMonitor( + const XQSettingsKey& key, const QVariant& value) +{ + if (key.uid() == KCRUidClockApp && key.key() == KClockAppSnoozeTime) { + if (mSettingsManager->error() == XQSettingsManager::NoError) { + + bool success; + int alarmSnoozeTime = value.toInt(&success); + + if (success) { + mAlarmSnoozeItem->setContentWidgetData( + "currentIndex", mAlarmSnoozeTimeHash.key( + alarmSnoozeTime)); + } + } + } +} + // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clocksettingsview/src/settingscustomitem.cpp --- a/clock/clockui/clocksettingsview/src/settingscustomitem.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clocksettingsview/src/settingscustomitem.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -54,6 +54,8 @@ { // Construct the settignsutility. mSettingsUtility = new SettingsUtility(); + // Construct the timezone client. + mTimezoneClient = TimezoneClient::getInstance(); } /*! @@ -61,7 +63,7 @@ */ SettingsCustomItem::~SettingsCustomItem() { - + // Nothing yet. } /*! @@ -74,16 +76,16 @@ } /*! - + \sa */ bool SettingsCustomItem::canSetModelIndex(const QModelIndex &index) const { - HbDataFormModelItem::DataItemType itemType = + HbDataFormModelItem::DataItemType itemType = static_cast( index.data(HbDataFormModelItem::ItemTypeRole).toInt()); - if(itemType >= HbDataFormModelItem::CustomItemBase && + if(itemType >= HbDataFormModelItem::CustomItemBase && itemType <= (HbDataFormModelItem::CustomItemBase + 50)) { return true; } else { @@ -97,21 +99,21 @@ HbDataFormModelItem::DataItemType itemType = static_cast( modelIndex().data(HbDataFormModelItem::ItemTypeRole).toInt()); - + HbDataFormModel* model = static_cast( static_cast(this)->itemView()->model()); - HbDataFormModelItem* modlItem = model->itemFromIndex(modelIndex()); - + HbDataFormModelItem* modlItem = model->itemFromIndex(modelIndex()); + switch (itemType) { case (TimeItemOffset + HbDataFormModelItem::CustomItemBase): mTimeWidget->setProperty("text", modlItem->contentWidgetData("text")); break; - + case (DateItemOffset + HbDataFormModelItem::CustomItemBase): mDateWidget->setProperty("text", modlItem->contentWidgetData("text")); break; - + case (PlaceItemOffset + HbDataFormModelItem::CustomItemBase): mPlaceWidget->setProperty("text", modlItem->contentWidgetData("text")); break; @@ -176,7 +178,7 @@ this, SLOT(launchRegSettingsView())); return regSettingsItem; } - + case (50 + HbDataFormModelItem::CustomItemBase): { HbListWidget *workdaysItem = new HbListWidget(); @@ -186,7 +188,7 @@ for (int index = 0; index < mWeekdaysList.count(); ++index) { workdaysItem->addItem(mWeekdaysList.at(index)); } - + QString workdaysString = workdaysSetting(); for (int i = 0, index = workdaysString.size() - 1; index >= 0; ++i, index--) { @@ -202,7 +204,7 @@ QItemSelectionModel::Select); } } - + return workdaysItem; } @@ -224,6 +226,7 @@ mTimePickerDialog = new HbDialog; mTimePickerDialog->setTimeout(HbDialog::NoTimeout); mTimePickerDialog->setDismissPolicy(HbDialog::NoDismiss); + mTimePickerDialog->setAttribute(Qt::WA_DeleteOnClose, true ); // Set the heading for the dialog. HbLabel * timeLabel = @@ -242,50 +245,53 @@ mTimePickerDialog->setContentWidget(timePicker); timePicker->setTime(QTime::currentTime()); - HbAction *okAction = - new HbAction(QString(hbTrId("txt_common_button_ok")), mTimePickerDialog); - mTimePickerDialog->setPrimaryAction(okAction); - connect( - okAction, SIGNAL(triggered()), - this, SLOT(handleTimeOkAction())); + mOkAction = new HbAction( + QString(hbTrId("txt_common_button_ok")), mTimePickerDialog); + mCancelAction = new HbAction( + QString(hbTrId("txt_common_button_cancel")), mTimePickerDialog); - HbAction *cancelAction = - new HbAction(QString(hbTrId("txt_common_button_cancel")), - mTimePickerDialog); - mTimePickerDialog->setSecondaryAction( cancelAction ); - connect( - cancelAction, SIGNAL(triggered()), - this, SLOT(handleTimeCancelAction())); + mTimePickerDialog->addAction(mOkAction); + mTimePickerDialog->addAction(mCancelAction); - mTimePickerDialog->exec(); + mTimePickerDialog->open(this, SLOT(selectedAction(HbAction*))); } /*! - Handles the ok action of time picker dialog. + Handles the ok action of time/date picker dialog. */ -void SettingsCustomItem::handleTimeOkAction() +void SettingsCustomItem::handleOkAction() { - // Get the time from the time picker. - QTime newTime = static_cast ( - mTimePickerDialog->contentWidget())->time(); + if (mTimePickerDialog) { + // Get the time from the time picker. + QTime newTime = static_cast ( + mTimePickerDialog->contentWidget())->time(); - QString timeFormatString = mSettingsUtility->timeFormatString(); - // Update the display text on form item. - mTimeWidget->setText(newTime.toString(timeFormatString)); - mSettingsUtility->setTime(newTime.toString(timeFormatString)); + QString timeFormatString = mSettingsUtility->timeFormatString(); - // Close the dialog. - handleTimeCancelAction(); -} + // If time returned by the picker is valid, then only update. + if (newTime.isValid()) { + // Update the display text on form item. + mTimeWidget->setText(newTime.toString(timeFormatString)); + // Update the system time. + mTimezoneClient->setDateTime( + QDateTime(QDate::currentDate(), newTime)); + } + } else if(mDatePickerDialog) { + // Get the time from the time picker. + QDate newDate = static_cast ( + mDatePickerDialog->contentWidget())->date(); -/*! - Handles the cancel action of time picker dialog. - */ -void SettingsCustomItem::handleTimeCancelAction() -{ - // Close the dialog. - mTimePickerDialog->close(); - mTimePickerDialog->deleteLater(); + QString dateFormatString = mSettingsUtility->dateFormatString(); + + // If date returned by the picker is valid, then only update. + if (newDate.isValid()) { + // Update the display text on form item. + mDateWidget->setText(newDate.toString(dateFormatString)); + // Update the system date. + mTimezoneClient->setDateTime( + QDateTime(newDate, QTime::currentTime())); + } + } } /*! @@ -301,6 +307,7 @@ mDatePickerDialog = new HbDialog; mDatePickerDialog->setTimeout(HbDialog::NoTimeout); mDatePickerDialog->setDismissPolicy(HbDialog::NoDismiss); + mDatePickerDialog->setAttribute(Qt::WA_DeleteOnClose, true ); // Set the heading for the dialog. HbLabel * timeLabel = @@ -315,50 +322,16 @@ mDatePickerDialog->setContentWidget(datePicker); datePicker->setDate(QDate::currentDate()); - HbAction *okAction = - new HbAction(QString(hbTrId("txt_common_button_ok")), mDatePickerDialog); - mDatePickerDialog->setPrimaryAction(okAction); - connect( - okAction, SIGNAL(triggered()), - this, SLOT(handleDateOkAction())); - - HbAction *cancelAction = - new HbAction(QString(hbTrId("txt_common_button_cancel")), - mDatePickerDialog); - mDatePickerDialog->setSecondaryAction( cancelAction ); - connect( - cancelAction, SIGNAL(triggered()), - this, SLOT(handleDateCancelAction())); - - mDatePickerDialog->exec(); -} + mOkAction = new HbAction( + QString(hbTrId("txt_common_button_ok")), mDatePickerDialog); -/*! - Handles the ok action of date picker dialog. - */ -void SettingsCustomItem::handleDateOkAction() -{ - // Get the time from the time picker. - QDate newDate = static_cast ( - mDatePickerDialog->contentWidget())->date(); + mCancelAction = new HbAction( + QString(hbTrId("txt_common_button_cancel")),mDatePickerDialog); - QString dateFormatString = mSettingsUtility->dateFormatString(); - // Update the display text on form item. - mDateWidget->setText(newDate.toString(dateFormatString)); - mSettingsUtility->setDate(newDate.toString(dateFormatString)); - - // Close the dialog. - handleDateCancelAction(); -} + mDatePickerDialog->addAction(mOkAction); + mDatePickerDialog->addAction(mCancelAction); -/*! - Handles the ok action of date picker dialog. - */ -void SettingsCustomItem::handleDateCancelAction() -{ - // Close the dialog. - mDatePickerDialog->close(); - mDatePickerDialog->deleteLater(); + mDatePickerDialog->open(this, SLOT(selectedAction(HbAction*))); } /*! @@ -382,8 +355,6 @@ void SettingsCustomItem::updatePlaceItem(LocationInfo info) { if (-1 != info.timezoneId) { - // Construct the timezone client. - mTimezoneClient = new TimezoneClient(); mTimezoneClient->setAsCurrentLocationL(info); } } @@ -394,8 +365,21 @@ void SettingsCustomItem::launchRegSettingsView() { ClockRegionalSettingsView *view = - new ClockRegionalSettingsView(*mSettingsUtility); + new ClockRegionalSettingsView(); + connect(mTimezoneClient, SIGNAL(timechanged()), + view, SLOT(updateWeekStartOn())); view->showView(); + +} + +/*! + Slot to handle the selected action. + */ +void SettingsCustomItem::selectedAction(HbAction *action) +{ + if (action==mOkAction) { + handleOkAction(); + } } /*! diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviewmanager/bwins/clockviewmanageru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockviewmanager/bwins/clockviewmanageru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,5 @@ +EXPORTS + ?showView@ClockViewManager@@QAEXW4ClockViews@@@Z @ 1 NONAME ; void ClockViewManager::showView(enum ClockViews) + ??1ClockViewManager@@UAE@XZ @ 2 NONAME ; ClockViewManager::~ClockViewManager(void) + ??0ClockViewManager@@QAE@AAVClockAppControllerIf@@PAVQObject@@@Z @ 3 NONAME ; ClockViewManager::ClockViewManager(class ClockAppControllerIf &, class QObject *) + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviewmanager/clockviewmanager.pro --- a/clock/clockui/clockviewmanager/clockviewmanager.pro Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockviewmanager/clockviewmanager.pro Mon Jun 28 15:22:02 2010 +0530 @@ -29,7 +29,7 @@ ./inc \ ../clockviews/inc \ ../clockappcontroller/inc \ - ../clockwidget/inc \ + ../clockwidget/clockwidgetimpl/inc \ ../../inc symbian: { @@ -39,7 +39,7 @@ LIBS += \ -lclockviews \ - -lclockwidgetproto + -lclockwidget } SOURCES += \ diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviewmanager/eabi/clockviewmanageru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockviewmanager/eabi/clockviewmanageru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,8 @@ +EXPORTS + _ZN16ClockViewManager8showViewE10ClockViews @ 1 NONAME + _ZN16ClockViewManagerC1ER20ClockAppControllerIfP7QObject @ 2 NONAME + _ZN16ClockViewManagerC2ER20ClockAppControllerIfP7QObject @ 3 NONAME + _ZN16ClockViewManagerD0Ev @ 4 NONAME + _ZN16ClockViewManagerD1Ev @ 5 NONAME + _ZN16ClockViewManagerD2Ev @ 6 NONAME + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviewmanager/inc/clockviewmanager.h --- a/clock/clockui/clockviewmanager/inc/clockviewmanager.h Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockviewmanager/inc/clockviewmanager.h Mon Jun 28 15:22:02 2010 +0530 @@ -44,10 +44,12 @@ CLOCKVIEWMANAGER_EXPORT void showView(ClockViews view); private: - void loadViews(); void loadMainView(); void loadWorldClockView(); +private slots: + void loadOtherViews(); + private: ClockAppControllerIf &mAppControllerIf; ClockMainView *mMainView; diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviewmanager/src/clockdocloader.cpp --- a/clock/clockui/clockviewmanager/src/clockdocloader.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockviewmanager/src/clockdocloader.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -15,15 +15,13 @@ * */ -// System includes. -#include - // User includes #include "clockdocloader.h" #include "clockcommon.h" #include "clockmainview.h" -#include "skinnableclock.h" +#include "clockwidget.h" #include "clockworldview.h" +#include "clockhomecityitem.h" /*! \class ClockDocLoader @@ -39,23 +37,23 @@ */ QObject *ClockDocLoader::createObject(const QString &type, const QString &name) { - qDebug() << "clock: ClockDocLoader::createObject -->"; - if (CLOCK_MAIN_VIEW == name) { QObject *object = new ClockMainView(); object->setObjectName(name); return object; } else if (CLOCK_WIDGET == name) { - QObject *object = new SkinnableClock(); + QObject *object = new ClockWidget(); object->setObjectName(name); return object; - } else if (WORLD_CLOCK_VIEW == name) { + } else if (CLOCK_WORLD_VIEW == name) { QObject *object = new ClockWorldView(); object->setObjectName(name); return object; - } - - qDebug() << "clock: ClockDocLoader::createObject <--"; + } else if (CLOCK_WORLD_HOMECITY == name) { + QObject *object = new ClockHomeCityItem(); + object->setObjectName(name); + return object; + } return HbDocumentLoader::createObject(type, name); } diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviewmanager/src/clockviewmanager.cpp --- a/clock/clockui/clockviewmanager/src/clockviewmanager.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockviewmanager/src/clockviewmanager.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -17,9 +17,10 @@ */ // System includes -#include #include #include +#include // hbapplication +#include // hbactivitymanager // User includes #include "clockviewmanager.h" @@ -44,14 +45,47 @@ ClockViewManager::ClockViewManager( ClockAppControllerIf &controllerIf, QObject *parent) :QObject(parent), - mAppControllerIf(controllerIf) + mAppControllerIf(controllerIf), + mWorldClockView(0) { - qDebug("clock: ClockViewManager::ClockViewManager() -->"); + // Activity Reason from Activity Manager + int activityReason = qobject_cast(qApp)->activateReason(); + + if (Hb::ActivationReasonActivity == activityReason) { + // Application is started from an activity + // extract activity data + QVariant data = qobject_cast(qApp)->activateData(); + // restore state from activity data + QByteArray serializedModel = data.toByteArray(); + QDataStream stream(&serializedModel, QIODevice::ReadOnly); + int activityId; + stream >> activityId; + + if (MainView == activityId) { + // Load the main view at the start up. + loadMainView(); + // Delay loading of other views till main view is loaded. + HbMainWindow *window = hbInstance->allMainWindows().first(); + connect( + window, SIGNAL(viewReady()), + this, SLOT(loadOtherViews())); - // Load the document and the views. - loadViews(); + } + else if (WorldClock == activityId) { + //no implentation yet, UI specs are not clear + } - qDebug("clock: ClockViewManager::ClockViewManager() <--"); + } + else { + // Load the main view at the start up. + loadMainView(); + // Delay loading of other views till main view is loaded. + HbMainWindow *window = hbInstance->allMainWindows().first(); + connect( + window, SIGNAL(viewReady()), + this, SLOT(loadOtherViews())); + } + } /*! @@ -73,12 +107,21 @@ switch (view) { case MainView: + // set captured screenshot as invalid as main view + // is the current view + mMainView->captureScreenShot(false); window->removeView(window->currentView()); window->addView(mMainView); window->setCurrentView(mMainView); break; case WorldClock: + if (mMainView) { + // capture main view as the screenshot for future use + // to save the main view as an activity, if application is + // exited/Quit from world view + mMainView->captureScreenShot(true); + } window->removeView(window->currentView()); window->addView(mWorldClockView); window->setCurrentView(mWorldClockView); @@ -90,30 +133,10 @@ } /*! - Loads the views from the docml file. - */ -void ClockViewManager::loadViews() -{ - qDebug() << "clock: ClockViewManager::loadViews -->"; - - // Load the main view. - loadMainView(); - // Load the world clock view. - loadWorldClockView(); - - // Set the main view to the window - hbInstance->allMainWindows().first()->addView(mMainView); - - qDebug() << "clock: ClockViewManager::loadViews <--"; -} - -/*! Loads the clock main view. */ void ClockViewManager::loadMainView() { - qDebug() << "clock: ClockViewManager::loadMainView -->"; - bool loadSuccess; // Construct the document loader instance @@ -121,10 +144,6 @@ // Load the application xml. docLoader->load(CLOCK_MAIN_VIEW_DOCML, &loadSuccess); - Q_ASSERT_X( - loadSuccess, - "viewmanager.cpp", - "Unable to load the main view app xml"); // Find the main view. mMainView = static_cast ( @@ -133,7 +152,8 @@ // Setup the view. mMainView->setupView(mAppControllerIf, docLoader); - qDebug() << "clock: ClockViewManager::loadMainView <--"; + // Set the main view to the window + hbInstance->allMainWindows().first()->addView(mMainView); } /*! @@ -147,20 +167,30 @@ bool loadSuccess; // Construct the world list view from doc loader. - docLoader->load(":/xml/worldclockview.docml", &loadSuccess); + docLoader->load(CLOCK_WORLD_VIEW_DOCML, &loadSuccess); // Get the world list view. - mWorldClockView = - static_cast (docLoader->findWidget("worldClockView")); + mWorldClockView = static_cast ( + docLoader->findWidget(CLOCK_WORLD_VIEW)); mWorldClockView->setupView(mAppControllerIf, docLoader); +} -/* // Get the world list widget. - WorldListWidget *listWidget = - qobject_cast (docLoader->findWidget("worldListWidget")); - Q_ASSERT_X(listWidget, - "viewmanager.cpp", "Unable to load the world list widget"); - listWidget->setupWidget(mWorldListView, docLoader);*/ +/*! + Load other views + */ +void ClockViewManager::loadOtherViews() +{ + mMainView->setupAfterViewReady(); + + // Load world clock view + loadWorldClockView(); + + // Disconnect the signal viewReady as all the views are loaded. + HbMainWindow *window = hbInstance->allMainWindows().first(); + disconnect( + window, SIGNAL(viewReady()), + this, SLOT(loadOtherViews())); } // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/bwins/clockviewsu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockviews/bwins/clockviewsu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,12 @@ +EXPORTS + ??1ClockWorldView@@UAE@XZ @ 1 NONAME ; ClockWorldView::~ClockWorldView(void) + ??1ClockMainView@@UAE@XZ @ 2 NONAME ; ClockMainView::~ClockMainView(void) + ?setupView@ClockWorldView@@QAEXAAVClockAppControllerIf@@PAVClockDocLoader@@@Z @ 3 NONAME ; void ClockWorldView::setupView(class ClockAppControllerIf &, class ClockDocLoader *) + ??0ClockMainView@@QAE@PAVQGraphicsItem@@@Z @ 4 NONAME ; ClockMainView::ClockMainView(class QGraphicsItem *) + ??0ClockWorldView@@QAE@PAVQGraphicsItem@@@Z @ 5 NONAME ; ClockWorldView::ClockWorldView(class QGraphicsItem *) + ?setupView@ClockMainView@@QAEXAAVClockAppControllerIf@@PAVClockDocLoader@@@Z @ 6 NONAME ; void ClockMainView::setupView(class ClockAppControllerIf &, class ClockDocLoader *) + ??0ClockHomeCityItem@@QAE@PAVQGraphicsItem@@@Z @ 7 NONAME ; ClockHomeCityItem::ClockHomeCityItem(class QGraphicsItem *) + ??1ClockHomeCityItem@@UAE@XZ @ 8 NONAME ; ClockHomeCityItem::~ClockHomeCityItem(void) + ?setupAfterViewReady@ClockMainView@@QAEXXZ @ 9 NONAME ; void ClockMainView::setupAfterViewReady(void) + ?captureScreenShot@ClockMainView@@QAEX_N@Z @ 10 NONAME ; void ClockMainView::captureScreenShot(bool) + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/clockviews.pro --- a/clock/clockui/clockviews/clockviews.pro Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockviews/clockviews.pro Mon Jun 28 15:22:02 2010 +0530 @@ -30,7 +30,7 @@ ../../clockmw/clocksettingsutility/inc \ ../clocksettingsview/inc \ ../clockalarmeditor/inc \ - ../clockwidget/inc \ + ../clockwidget/clockwidgetimpl/inc \ ../clockcityselectionlist/inc \ ../inc @@ -51,7 +51,8 @@ -lclocksettingsutility \ -lclocksettingsview \ -lclockcityselectionlist \ - -lclockwidgetproto + -lclockwidget \ + -lclockwidgetplugin } SOURCES += \ @@ -59,14 +60,14 @@ clockalarmlistmodel.cpp \ clockalarmlistitemprototype.cpp \ clockworldview.cpp \ - listitemprototype.cpp + clockhomecityitem.cpp HEADERS += \ clockmainview.h \ clockalarmlistmodel.h \ clockalarmlistitemprototype.h \ clockworldview.h \ - listitemprototype.h + clockhomecityitem.h RESOURCES += \ clockviews.qrc diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/data/clockviews.qrc --- a/clock/clockui/clockviews/data/clockviews.qrc Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockviews/data/clockviews.qrc Mon Jun 28 15:22:02 2010 +0530 @@ -2,11 +2,16 @@ style/clockalarmlistitemprototype.css style/clockalarmlistitemprototype.widgetml - style/listitemprototype.css - style/listitemprototype.widgetml + style/clockalarmlistitemprototype_color.css + style/clockhomecityitem.css + style/clockhomecityitem.widgetml + style/clockhomecityitem_color.css + style/hblistviewitem.css + style/hblistviewitem.widgetml + style/hblistviewitem_color.css xml/clockmainview.docml - xml/worldclockview.docml + xml/clockworldview.docml \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/data/style/clockalarmlistitemprototype.css --- a/clock/clockui/clockviews/data/style/clockalarmlistitemprototype.css Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockviews/data/style/clockalarmlistitemprototype.css Mon Jun 28 15:22:02 2010 +0530 @@ -13,6 +13,7 @@ top: -var(hb-param-margin-gene-top); right: var(hb-param-margin-gene-right); text-height: var(hb-param-text-height-secondary); + font-variant: secondary; fixed-width: 8.2un; text-align: right; text-line-count-min: 2; @@ -22,21 +23,24 @@ top: -var(hb-param-margin-gene-top); right: var(hb-param-margin-gene-right); text-height: var(hb-param-text-height-tiny); + font-variant: secondary; fixed-width: 28.7un; text-align: left; } ClockAlarmListItemPrototype::text-3{ text-height: var(hb-param-text-height-primary); + font-variant: primary; top: -var(hb-param-margin-gene-middle-vertical); right: var(hb-param-margin-gene-right); fixed-width: 28.7un; text-align: left; } ClockAlarmListItemPrototype::text-4{ - text-height: var(hb-param-text-height-primary-small); + text-height: var(hb-param-text-height-tiny); + font-variant: secondary; top: -var(hb-param-margin-gene-middle-vertical); bottom: var(hb-param-margin-gene-bottom); - fixed-width: 28.7un; + fixed-width: 28.7un; text-align: left; } ClockAlarmListItemPrototype::alarmIconItem{ diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/data/style/clockalarmlistitemprototype_color.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockviews/data/style/clockalarmlistitemprototype_color.css Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,47 @@ +ClockAlarmListItemPrototype::text-4{ + color: var(qtc_list_item_content_normal); +} + +ClockAlarmListItemPrototype::text-4[state="pressed"]{ + color: var(qtc_list_item_pressed); +} + +ClockAlarmListItemPrototype::text-4[state="disabled"]{ + color: var(qtc_list_item_disabled); +} + +ClockAlarmListItemPrototype::alarmIconItem{ + color: var(qtc_list_item_content_normal); +} + +ClockAlarmListItemPrototype::alarmIconItem[state="pressed"]{ + color: var(qtc_list_item_pressed); +} + +ClockAlarmListItemPrototype::alarmIconItem[state="disabled"]{ + color: var(qtc_list_item_disabled); +} + +ClockAlarmListItemPrototype::text-3{ + color: var(qtc_list_item_title_normal); +} + +ClockAlarmListItemPrototype::text-3[state="pressed"]{ + color: var(qtc_list_item_pressed); +} + +ClockAlarmListItemPrototype::text-3[state="disabled"]{ + color: var(qtc_list_item_disabled); +} + +ClockAlarmListItemPrototype::text-1{ + color: var(qtc_list_item_content_normal); +} + +ClockAlarmListItemPrototype::text-1[state="pressed"]{ + color: var(qtc_list_item_pressed); +} + +ClockAlarmListItemPrototype::text-1[state="disabled"]{ + color: var(qtc_list_item_disabled); +} \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/data/style/clockhomecityitem.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockviews/data/style/clockhomecityitem.css Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,47 @@ +ClockHomeCityItem{ + layout: homecity-portrait; +} +ClockHomeCityItem:landscape{ + layout: homecity-landscape; +} +ClockHomeCityItem::dayNightIcon{ + top: -var(hb-param-margin-gene-top); + left: -var(hb-param-margin-gene-left); + right: var(hb-param-margin-gene-middle-horizontal); + bottom: var(hb-param-margin-gene-bottom); + + fixed-height: var(hb-param-graphic-size-primary-large); + fixed-width: var(hb-param-graphic-size-primary-large); +} + +ClockHomeCityItem::dateText{ + top: -var(hb-param-margin-gene-top); + right: var(hb-param-margin-gene-middle-horizontal); + text-height: var(hb-param-text-height-tiny); + font-variant: secondary; + text-align: left; +} + +ClockHomeCityItem::cityText{ + top: -var(hb-param-margin-gene-middle-vertical); + right: var(hb-param-margin-gene-middle-horizontal); + text-height: var(hb-param-text-height-primary); + font-variant: primary; + text-align: left; +} + +ClockHomeCityItem::dstIcon{ + top: -var(hb-param-margin-gene-top); + right: var(hb-param-margin-gene-right); + + fixed-height: var(hb-param-graphic-size-secondary); + fixed-width: var(hb-param-graphic-size-secondary); +} + +ClockHomeCityItem::timeText{ + right: var(hb-param-margin-gene-right); + text-height: var(hb-param-text-height-tiny); + font-variant: secondary; + text-align: right; + fixed-width: 16un; +} diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/data/style/clockhomecityitem.widgetml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockviews/data/style/clockhomecityitem.widgetml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/data/style/clockhomecityitem_color.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockviews/data/style/clockhomecityitem_color.css Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,47 @@ +ClockHomeCityItem::dateText{ + color: var(qtc_list_item_content_normal); +} + +ClockHomeCityItem::dateText[state="pressed"]{ + color: var(qtc_list_item_pressed); +} + +ClockHomeCityItem::dateText[state="disabled"]{ + color: var(qtc_list_item_disabled); +} + +ClockHomeCityItem::cityText{ + color: var(qtc_list_item_title_normal); +} + +ClockHomeCityItem::cityText[state="pressed"]{ + color: var(qtc_list_item_pressed); +} + +ClockHomeCityItem::cityText[state="disabled"]{ + color: var(qtc_list_item_disabled); +} + +ClockHomeCityItem::dstIcon{ + color: var(qtc_list_item_title_normal); +} + +ClockHomeCityItem::dstIcon[state="pressed"]{ + color: var(qtc_list_item_pressed); +} + +ClockHomeCityItem::dstIcon[state="disabled"]{ + color: var(qtc_list_item_disabled); +} + +ClockHomeCityItem::timeText{ + color: var(qtc_list_item_content_normal); +} + +ClockHomeCityItem::timeText[state="pressed"]{ + color: var(qtc_list_item_pressed); +} + +ClockHomeCityItem::timeText[state="disabled"]{ + color: var(qtc_list_item_disabled); +} \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/data/style/hblistviewitem.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockviews/data/style/hblistviewitem.css Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,69 @@ + +HbListViewItem:portrait{ + layout: citylist-portrait; +} + +HbListViewItem:landscape{ + layout: citylist-landscape; +} + +HbListViewItem[layoutName="citylist-portrait"]::icon-1{ + top: -var(hb-param-margin-gene-top); + left: -var(hb-param-margin-gene-left); + right: var(hb-param-margin-gene-middle-horizontal); + bottom: var(hb-param-margin-gene-bottom); + + fixed-height: var(hb-param-graphic-size-primary-large); + fixed-width: var(hb-param-graphic-size-primary-large); +} + +HbListViewItem[layoutName="citylist-portrait"]::text-1{ + top: -var(hb-param-margin-gene-top); + right: var(hb-param-margin-gene-middle-horizontal); + text-height: var(hb-param-text-height-tiny); + font-variant: secondary; + text-align: left; +} + +HbListViewItem[layoutName="citylist-portrait"]::text-2{ + top: -var(hb-param-margin-gene-middle-vertical); + right: var(hb-param-margin-gene-middle-horizontal); + text-height: var(hb-param-text-height-primary); + font-variant: primary; + text-align: left; +} + +HbListViewItem[layoutName="citylist-portrait"]::text-3{ + top: -var(hb-param-margin-gene-middle-vertical); + right: var(hb-param-margin-gene-right); + bottom: var(hb-param-margin-gene-bottom); + + text-height: var(hb-param-text-height-tiny); + font-variant: secondary; + text-align: left; +} + +HbListViewItem[layoutName="citylist-landscape"]::text-3{ + right: var(hb-param-margin-gene-right); + + text-height: var(hb-param-text-height-tiny); + font-variant: secondary; + text-align: right; + fixed-width: 24un; +} + +HbListViewItem[layoutName="citylist-portrait"]::icon-2{ + top: -var(hb-param-margin-gene-top); + right: var(hb-param-margin-gene-right); + + fixed-height: var(hb-param-graphic-size-secondary); + fixed-width: var(hb-param-graphic-size-secondary); +} + +HbListViewItem[layoutName="citylist-portrait"]::text-4{ + right: var(hb-param-margin-gene-right); + text-height: var(hb-param-text-height-tiny); + font-variant: secondary; + text-align: right; + fixed-width: 16un; +} diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/data/style/hblistviewitem.widgetml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockviews/data/style/hblistviewitem.widgetml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/data/style/hblistviewitem_color.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockviews/data/style/hblistviewitem_color.css Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,35 @@ +HbListViewItem[layoutName="citylist-portrait"]::text-4{ + color: var(qtc_list_item_content_normal); +} + +HbListViewItem[layoutName="citylist-portrait"]::text-4[state="pressed"]{ + color: var(qtc_list_item_pressed); +} + +HbListViewItem[layoutName="citylist-portrait"]::text-4[state="disabled"]{ + color: var(qtc_list_item_disabled); +} + +HbListViewItem[layoutName="citylist-portrait"]::text-2{ + color: var(qtc_list_item_title_normal); +} + +HbListViewItem[layoutName="citylist-portrait"]::text-2[state="pressed"]{ + color: var(qtc_list_item_pressed); +} + +HbListViewItem[layoutName="citylist-portrait"]::text-2[state="disabled"]{ + color: var(qtc_list_item_disabled); +} + +HbListViewItem[layoutName="citylist-portrait"]::text-1{ + color: var(qtc_list_item_content_normal); +} + +HbListViewItem[layoutName="citylist-portrait"]::text-1[state="pressed"]{ + color: var(qtc_list_item_pressed); +} + +HbListViewItem[layoutName="citylist-portrait"]::text-1[state="disabled"]{ + color: var(qtc_list_item_disabled); +} \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/data/style/listitemprototype.css --- a/clock/clockui/clockviews/data/style/listitemprototype.css Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -ListItemPrototype[layoutName="custom"]{ - layout: custom; -} - -ListItemPrototype::dayNightIcon[layoutName="custom"]{ - top: -var(hb-param-margin-gene-top); - left: -var(hb-param-margin-gene-left); - - fixed-height: var(hb-param-graphic-size-secondary); - fixed-width: var(hb-param-graphic-size-secondary); -} - -ListItemPrototype::dateText[layoutName="custom"]{ - left: -var(hb-param-margin-gene-left); - top: -var(hb-param-margin-gene-top); - right: var(hb-param-margin-gene-right); - bottom: var(hb-param-margin-gene-bottom); - - text-height: var(hb-param-text-height-tiny); - min-width: 29.7un; -} - -ListItemPrototype::cityText[layoutName="custom"]{ - top: -var(hb-param-margin-gene-middle-vertical); - right: var(hb-param-margin-gene-right); - - text-height: var(hb-param-text-height-primary); - font-variant: primary; - fixed-width: 29.7un; -} - -ListItemPrototype::offsetText[layoutName="custom"]{ - top: -var(hb-param-margin-gene-middle-vertical); - right: 11.5un; - bottom: var(hb-param-margin-gene-bottom); - - text-height: var(hb-param-text-height-tiny); - min-width: 29.7un; -} - -ListItemPrototype::dstIcon[layoutName="custom"]{ - top: -var(hb-param-margin-gene-top); - right: 6.4un; - - fixed-height: var(hb-param-graphic-size-secondary); - fixed-width: var(hb-param-graphic-size-secondary); -} - -ListItemPrototype::timText[layoutName="custom"]{ - top: -var(hb-param-margin-gene-middle-vertical); - right: var(hb-param-margin-gene-right); - - text-height: var(hb-param-text-height-tiny); -} \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/data/style/listitemprototype.widgetml --- a/clock/clockui/clockviews/data/style/listitemprototype.widgetml Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/data/xml/clockmainview.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockviews/data/xml/clockmainview.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,190 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/data/xml/clockworldview.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockviews/data/xml/clockworldview.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + +
+ + + + + + + + +
diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/eabi/clockviewsu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockviews/eabi/clockviewsu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,33 @@ +EXPORTS + _ZN13ClockMainView19setupAfterViewReadyEv @ 1 NONAME + _ZN13ClockMainView9setupViewER20ClockAppControllerIfP14ClockDocLoader @ 2 NONAME + _ZN13ClockMainViewC1EP13QGraphicsItem @ 3 NONAME + _ZN13ClockMainViewC2EP13QGraphicsItem @ 4 NONAME + _ZN13ClockMainViewD0Ev @ 5 NONAME + _ZN13ClockMainViewD1Ev @ 6 NONAME + _ZN13ClockMainViewD2Ev @ 7 NONAME + _ZN14ClockWorldView9setupViewER20ClockAppControllerIfP14ClockDocLoader @ 8 NONAME + _ZN14ClockWorldViewC1EP13QGraphicsItem @ 9 NONAME + _ZN14ClockWorldViewC2EP13QGraphicsItem @ 10 NONAME + _ZN14ClockWorldViewD0Ev @ 11 NONAME + _ZN14ClockWorldViewD1Ev @ 12 NONAME + _ZN14ClockWorldViewD2Ev @ 13 NONAME + _ZN17ClockHomeCityItemC1EP13QGraphicsItem @ 14 NONAME + _ZN17ClockHomeCityItemC2EP13QGraphicsItem @ 15 NONAME + _ZN17ClockHomeCityItemD0Ev @ 16 NONAME + _ZN17ClockHomeCityItemD1Ev @ 17 NONAME + _ZN17ClockHomeCityItemD2Ev @ 18 NONAME + _ZThn16_N13ClockMainViewD0Ev @ 19 NONAME + _ZThn16_N13ClockMainViewD1Ev @ 20 NONAME + _ZThn16_N14ClockWorldViewD0Ev @ 21 NONAME + _ZThn16_N14ClockWorldViewD1Ev @ 22 NONAME + _ZThn16_N17ClockHomeCityItemD0Ev @ 23 NONAME + _ZThn16_N17ClockHomeCityItemD1Ev @ 24 NONAME + _ZThn8_N13ClockMainViewD0Ev @ 25 NONAME + _ZThn8_N13ClockMainViewD1Ev @ 26 NONAME + _ZThn8_N14ClockWorldViewD0Ev @ 27 NONAME + _ZThn8_N14ClockWorldViewD1Ev @ 28 NONAME + _ZThn8_N17ClockHomeCityItemD0Ev @ 29 NONAME + _ZThn8_N17ClockHomeCityItemD1Ev @ 30 NONAME + _ZN13ClockMainView17captureScreenShotEb @ 31 NONAME + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/inc/clockalarmlistitemprototype.h --- a/clock/clockui/clockviews/inc/clockalarmlistitemprototype.h Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockviews/inc/clockalarmlistitemprototype.h Mon Jun 28 15:22:02 2010 +0530 @@ -21,7 +21,8 @@ // System includes #include -#include +#include +#include // Forward declarations class QGraphicsItem; @@ -48,7 +49,7 @@ private: QGraphicsItem *mParent; - HbPushButton *malarmIconItem; + QPointer malarmIconItem; }; #endif // CLOCKALARMLISTITEMPROTOTYPE_H diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/inc/clockhomecityitem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockviews/inc/clockhomecityitem.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: Header file for ClockHomeCityItem Itemclass + * + */ + +#ifndef CLOCKHOMECITYITEM_H +#define CLOCKHOMECITYITEM_H + +// System includes +#include +#include + +// User include. +#include "clockviewsdefines.h" + +// Forward declaration +class QGraphicsItem; +class HbTextItem; +class HbIconItem; + +class ClockHomeCityItem : public HbWidget +{ + Q_OBJECT + +public: + enum { + DayNightIndicator, + Date, + City, + Dst, + Time + }; + +public: + CLOCKVIEWS_EXPORT ClockHomeCityItem(QGraphicsItem *parent = 0); + CLOCKVIEWS_EXPORT ~ClockHomeCityItem(); + +public: + void setHomeCityItemData(const QVariantMap & itemData); + +private: + QPointer mDateText; + QPointer mCityText; + QPointer mTimeText; + QPointer mDayNightIcon; + QPointer mDstIcon; + +}; + +#endif // CLOCKHOMECITYITEM_H + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/inc/clockmainview.h --- a/clock/clockui/clockviews/inc/clockmainview.h Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockviews/inc/clockmainview.h Mon Jun 28 15:22:02 2010 +0530 @@ -38,8 +38,8 @@ class AlarmClient; class TimezoneClient; class SettingsUtility; -class SkinnableClock; class ClockAlarmListModel; +class ClockWidget; class ClockMainView : public HbView { @@ -52,11 +52,11 @@ public: CLOCKVIEWS_EXPORT void setupView( ClockAppControllerIf &controllerIf, ClockDocLoader *docLoader); - -public slots: - void handleAlarmStatusChanged(int row); + CLOCKVIEWS_EXPORT void setupAfterViewReady(); + CLOCKVIEWS_EXPORT void captureScreenShot(bool captureScreenShot = false); private slots: + void handleAlarmStatusChanged(int row); void refreshMainView(); void displayWorldClockView(); void addNewAlarm(); @@ -64,15 +64,20 @@ void handleActivated(const QModelIndex &index); void handleLongPress(HbAbstractViewItem *item, const QPointF &coords); void deleteAlarm(); - void updateDateLabel(); - void updatePlaceLabel(); - void updateClockWidget(); + void updateView(); + void updatePlaceLabel(int autoTimeUpdate = -1); void handleAlarmListDisplay(); void checkOrientationAndLoadSection(Qt::Orientation orientation); + void selectedMenuAction(HbAction *action); + void handleMenuClosed(); + void saveActivity(); private: void setmodel(); void hideAlarmList(bool show); + void removeSnoozedAlarm(); + void updateDateLabel(); + void updateClockWidget(); private: QTimer *mTickTimer; @@ -81,10 +86,13 @@ HbAction *mDisplayWorldClockView; HbAction *mAddNewAlarm; HbAction *mSettingsAction; + HbAction *mDeleteAction; HbLabel *mDayLabel; HbLabel *mPlaceLabel; - SkinnableClock *mClockWidget; + HbLabel *mHorizontalDivider; + HbLabel *mVerticalDivider; + ClockWidget *mClockWidget; HbLabel *mNoAlarmLabel; HbListView *mAlarmList; @@ -95,8 +103,11 @@ ClockAppControllerIf *mAppControllerIf; ClockAlarmListModel *mAlarmListModel; - int mSelectedItem; - bool mHideAlarmList; + int mSelectedItem; + bool mHideAlarmList; + bool mIsLongTop; + bool mIsScreenShotCapruted; // check if the screenshot captured is valid + QVariantHash mScreenShot; // screenshot }; #endif // CLOCKMAINVIEW_H diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/inc/clockviewsdefines.h --- a/clock/clockui/clockviews/inc/clockviewsdefines.h Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockviews/inc/clockviewsdefines.h Mon Jun 28 15:22:02 2010 +0530 @@ -28,6 +28,9 @@ # define CLOCKVIEWS_EXPORT Q_DECL_IMPORT #endif +const QString clockMainView = "ClockMainView"; // Activity Id for clock activity to be save +// in Activity Manager DB + #endif // CLOCKVIEWSDEFINES_H // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/inc/clockworldview.h --- a/clock/clockui/clockviews/inc/clockworldview.h Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockviews/inc/clockworldview.h Mon Jun 28 15:22:02 2010 +0530 @@ -32,8 +32,6 @@ class QGraphicsItem; class QStandardItemModel; class QTimer; -class HbLabel; -class HbPushButton; class HbListView; class HbListWidgetItem; class HbAbstractViewItem; @@ -42,6 +40,8 @@ class TimezoneClient; class SettingsUtility; class ClockCitySelectionList; +class HbGroupBox; +class ClockHomeCityItem; class ClockWorldView : public HbView { @@ -57,22 +57,24 @@ private slots: void refreshCityList(); - void updateClockDisplay(); - void updateDayDateInfo(); - void updateCurrentLocationInfo(); + void updateCurrentLocationInfo(int networkTime); void handleItemLongPressed(HbAbstractViewItem *item, const QPointF &coord); void handleAddLocation(); void handleDeleteAction(); void handleSetAsCurrentLocationAction(); void handleCitySelected(LocationInfo info); void showAlarmsView(); - void updateOffsetDifferences(); void refreshWorldView(); - void updateToolbarTexts(Qt::Orientation currentOrientation); + void loadSection(Qt::Orientation orientation); + void updateAllLocationInfo(); + void selectedMenuAction(HbAction *action); private: QModelIndex addCityToList(const LocationInfo& locationInfo); bool isDay(QDateTime dateTime); + QVariantList getCityListDisplayString(const LocationInfo& locationInfo); + QVariantList getCityListDecorationString(const LocationInfo& locationInfo); + void updateCityList(); private: QTimer *mRefreshTimer; @@ -80,14 +82,14 @@ QStandardItemModel *mCityListModel; QPointer mCityListView; - HbLabel *mDayDateLabel; - HbLabel *mPlaceLabel; + ClockHomeCityItem *mHomeCityWidget; HbAction *mAddCityAction; HbAction *mSetCurrentLocationAction; HbAction *mRemoveCityAction; HbAction *mBackAction; HbAction *mShowAlarmsViewAction; HbAction *mDisplayWorldClockView; + HbAction *mAddCityMenuAction; ClockDocLoader *mDocLoader; ClockAppControllerIf *mAppControllerIf; diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/inc/listitemprototype.h --- a/clock/clockui/clockviews/inc/listitemprototype.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,54 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* Header file for class ListItemPrototype. -* -*/ - -#ifndef LISTITEMPROTOTYPE_H -#define LISTITEMPROTOTYPE_H - -// System includes -#include - -// Forward declarations -class QGraphicsItem; -class HbIconItem; -class HbAbstractViewItem; -class HbTextItem; - -class ListItemPrototype : public HbListViewItem -{ - Q_OBJECT - -public: - explicit ListItemPrototype(QGraphicsItem *parent = 0); - virtual ~ListItemPrototype(); - -public: - HbAbstractViewItem* createItem(); - void updateChildItems(); - -private: - HbIconItem *mDayNightIcon; - HbTextItem *mDateText; - HbTextItem *mCityText; - HbTextItem *mOffsetText; - HbIconItem *mDstIcon; - HbTextItem *mTimeText; -}; - -#endif // LISTITEMPROTOTYPE_H - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/src/clockalarmlistitemprototype.cpp --- a/clock/clockui/clockviews/src/clockalarmlistitemprototype.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockviews/src/clockalarmlistitemprototype.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -17,7 +17,6 @@ */ // System includes -#include #include // User includes @@ -37,9 +36,7 @@ \parent of type QGraphicsItem. */ ClockAlarmListItemPrototype::ClockAlarmListItemPrototype(QGraphicsItem *parent) -:HbListViewItem(parent), - mParent(parent), - malarmIconItem(0) +:HbListViewItem(parent) { // Nothing yet. } @@ -68,19 +65,11 @@ QString alarmIconPath = alarmIconRole.toString(); if (!malarmIconItem) { malarmIconItem = new HbPushButton(this); - HbStyle::setItemName(malarmIconItem, - QLatin1String("alarmIconItem")); + HbStyle::setItemName( + malarmIconItem, QLatin1String("alarmIconItem")); connect( malarmIconItem, SIGNAL(clicked()), this, SLOT(handleAlarmStatusChanged())); - if (mParent) { - connect( - this, - SIGNAL(alarmStatusHasChanged(int)), - qobject_cast( - static_cast(mParent)), - SLOT(handleAlarmStatusChanged(int))); - } } malarmIconItem->setIcon(alarmIconPath); } @@ -94,7 +83,7 @@ */ ClockAlarmListItemPrototype *ClockAlarmListItemPrototype::createItem() { - return new ClockAlarmListItemPrototype(mParent); + return new ClockAlarmListItemPrototype(*this); } /*! @@ -103,7 +92,8 @@ void ClockAlarmListItemPrototype::handleAlarmStatusChanged() { int row = modelIndex().row(); - emit alarmStatusHasChanged(row); + emit static_cast( + prototype())->alarmStatusHasChanged(row); } // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/src/clockalarmlistmodel.cpp --- a/clock/clockui/clockviews/src/clockalarmlistmodel.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockviews/src/clockalarmlistmodel.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -17,7 +17,6 @@ */ // System includes -#include #include #include @@ -55,8 +54,6 @@ mSourceModel(0), mAppControllerIf(controllerIf) { - qDebug() << "clock: ClockAlarmListModel::ClockAlarmListModel -->"; - // Construct the source model. mSourceModel = new QStandardItemModel(0, 1, this); @@ -74,8 +71,6 @@ connect( mTickTimer, SIGNAL(timeout()), this, SLOT(updateRemainingTime())); - - qDebug() << "clock: ClockAlarmListModel::ClockAlarmListModel <--"; } /*! @@ -83,14 +78,10 @@ */ ClockAlarmListModel::~ClockAlarmListModel() { - qDebug() << "clock: ClockAlarmListModel::~ClockAlarmListModel -->"; - if (mSourceModel) { delete mSourceModel; mSourceModel = 0; } - - qDebug() << "clock: ClockAlarmListModel::~ClockAlarmListModel <--"; } /*! @@ -109,10 +100,6 @@ */ QAbstractItemModel *ClockAlarmListModel::sourceModel() { - qDebug() << "clock: ClockAlarmListModel::sourceModel -->"; - - qDebug() << "clock: ClockAlarmListModel::sourceModel <--"; - return mSourceModel; } @@ -121,8 +108,6 @@ */ void ClockAlarmListModel::populateSourceModel() { - qDebug() << "clock: ClockAlarmListModel::populateSourceModel -->"; - // Clear the model if it has any data already. mSourceModel->clear(); mSourceModel->setColumnCount(1); @@ -153,7 +138,6 @@ // Start the Timer for 1 minute. mTickTimer->start(60000 - 1000 * QTime::currentTime().second()); } - qDebug() << "clock: ClockAlarmListModel::populateSourceModel <--"; } /*! @@ -163,8 +147,6 @@ */ QString ClockAlarmListModel::calculateRemainingTime(AlarmInfo alarmInfo) { - qDebug() << "clock: ClockAlarmListModel::calculateRemainingTime -->"; - QDateTime currentDateTime = QDateTime::currentDateTime(); QDateTime alarmTime = QDateTime( alarmInfo.alarmDateTime, alarmInfo.nextDueTime); @@ -217,8 +199,6 @@ formatTimeNote = hbTrId("txt_clock_main_view_setlabel_in_1days"); timeNote = formatTimeNote.arg(QString::number(dayleft)); } - qDebug() << "clock: ClockAlarmListModel::calculateRemainingTime <--"; - return timeNote; } @@ -264,8 +244,6 @@ */ void ClockAlarmListModel::updateSourceModel(int alarmId) { - qDebug() << "clock: ClockAlarmListModel::updateSourceModel -->"; - Q_UNUSED(alarmId) int alarmInfoCount; int modelCount; @@ -353,8 +331,6 @@ mTickTimer->stop(); } } - - qDebug() << "clock: ClockAlarmListModel::updateSourceModel <--"; } /*! @@ -401,8 +377,6 @@ QStringList ClockAlarmListModel::getDisplayStringListforAlarmItem( AlarmInfo alarmInfo) { - qDebug() << "clock: ClockAlarmListModel::getDisplayStringforAlarmItem -->"; - QStringList displayStringList; QString timeString; if (Snoozed == alarmInfo.alarmState) { @@ -426,7 +400,8 @@ QString remainingTime = calculateRemainingTime(alarmInfo); displayStringList.append(remainingTime); } else { - displayStringList.append(QString(" ")); + // TODO: localization + displayStringList.append(QString("In-active")); } QString alarmDescription = alarmInfo.alarmDesc; @@ -453,9 +428,6 @@ } } displayStringList.append(repeatTypeString); - - qDebug() << "clock: ClockAlarmListModel::getDisplayStringforAlarmItem <--"; - return displayStringList; } @@ -479,22 +451,21 @@ if (Weekly == alarmInfo.repeatType || Daily == alarmInfo.repeatType || Workday == alarmInfo.repeatType) { - displayiconList.append(HbIcon(":/clock/alarm_repeat")); + displayiconList.append(HbIcon("qtg_mono_repeat")); } else { displayiconList.append(QVariant()); } item->setData(displayiconList, Qt::DecorationRole); - // The status. - if (Enabled == alarmInfo.alarmStatus) { - item->setData(QString(":/clock/alarm_active"), AlarmIcon); + + // Set the icon for active/in-active/snoozed alarm. + if (Disabled == alarmInfo.alarmStatus) { + item->setData(QString("qtg_mono_alarm_inactive"), AlarmIcon); + } else if (Snoozed == alarmInfo.alarmState) { + // Change the alarm icon also to alarm snooze icon + item->setData(QString("qtg_mono_alarm_snooze"), AlarmIcon); } else { - item->setData(QString(":/clock/alarm_inactive"), AlarmIcon); - } - - // If the alarm is snoozed. - if (Snoozed == alarmInfo.alarmState) { - // TODO : Change the alarm icon also to alarm snooze icon + item->setData(QString("qtg_mono_alarm"), AlarmIcon); } // The model for the list item will have: @@ -534,24 +505,23 @@ if (Weekly == alarmInfo.repeatType || Daily == alarmInfo.repeatType || Workday == alarmInfo.repeatType) { - displayiconList.append(HbIcon(":/clock/alarm_repeat")); + displayiconList.append(HbIcon("qtg_mono_repeat")); } else { displayiconList.append(QVariant()); } mSourceModel->setData( modelIndex, displayiconList, Qt::DecorationRole); - // The status. - if (Enabled == alarmInfo.alarmStatus) { - mSourceModel->setData( - modelIndex, QString(":/clock/alarm_active"), AlarmIcon); + + // Set the icon for active/in-active/snoozed alarm. + if (Disabled == alarmInfo.alarmStatus) { + mSourceModel->setData(modelIndex, + QString("qtg_mono_alarm_inactive"), AlarmIcon); + } else if (Snoozed == alarmInfo.alarmState) { + // Change the alarm icon also to alarm snooze icon + mSourceModel->setData(modelIndex, + QString("qtg_mono_alarm_snooze"), AlarmIcon); } else { - mSourceModel->setData( - modelIndex, QString(":/clock/alarm_inactive"), AlarmIcon); - } - - // If the alarm is snoozed. - if (Snoozed == alarmInfo.alarmState) { - // TODO : Change the alarm icon also to alarm snooze icon + mSourceModel->setData(modelIndex, QString("qtg_mono_alarm"), AlarmIcon); } // The model for the list item will have: diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/src/clockhomecityitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockviews/src/clockhomecityitem.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,126 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* Definition file for class ClockHomeCityItem. +* +*/ + +// System Includes. +#include +#include +#include +#include +#include +#include + +// User Includes. +#include "clockhomecityitem.h" + +/*! + \class ClockHomeCityItem + + This class creates all the primitives for ClockHomeCityItem item. + */ + +/*! + Constructor. + + \param parent Pointer to QGraphicsItem. + */ +ClockHomeCityItem::ClockHomeCityItem(QGraphicsItem *parent) : +HbWidget(parent) +{ + // Path for widgetml and css files. + HbStyleLoader::registerFilePath(":/style/clockhomecityitem.css"); + HbStyleLoader::registerFilePath(":/style/clockhomecityitem.widgetml"); + HbStyleLoader::registerFilePath(":/style/clockhomecityitem_color.css"); + + // Set the frame to the homecity widget. + HbFrameItem *frame = new HbFrameItem(this); + frame->frameDrawer().setFrameType(HbFrameDrawer::NinePieces); + frame->frameDrawer().setFrameGraphicsName("qtg_fr_groupbox"); + setBackgroundItem(frame->graphicsItem(), -2); + +} + +/*! + Destructor. + */ +ClockHomeCityItem::~ClockHomeCityItem() +{ + HbStyleLoader::unregisterFilePath(":/style/clockhomecityitem.css"); + HbStyleLoader::unregisterFilePath(":/style/clockhomecityitem.widgetml"); + HbStyleLoader::unregisterFilePath(":/style/clockhomecityitem_color.css"); +} + +/*! + Sets the data for HomeCity items. + To set textitem data use Qt::DisplayRole + To set iconitem data use Qt::DecorationRole + \param itemData contains the data for all the primitives. + */ +void ClockHomeCityItem::setHomeCityItemData(const QVariantMap &itemData) +{ + if (!itemData.isEmpty()) { + QMapIterator iter(itemData); + while (iter.hasNext()) { + iter.next(); + int value = iter.key().toInt(); + switch(value) { + case Date: + if (!mDateText) { + mDateText = new HbTextItem(this); + HbStyle::setItemName(mDateText, "dateText"); + } + mDateText->setText(iter.value().toString()); + break; + case City: + if (!mCityText) { + mCityText = new HbTextItem(this); + HbStyle::setItemName(mCityText, "cityText"); + mCityText->setTextWrapping(Hb::TextNoWrap); + } + mCityText->setText(iter.value().toString()); + break; + case Time: + if (!mTimeText) { + mTimeText = new HbTextItem(this); + HbStyle::setItemName(mTimeText, "timeText"); + mTimeText->setTextWrapping(Hb::TextNoWrap); + } + mTimeText->setText(iter.value().toString()); + break; + case DayNightIndicator: + if (!mDayNightIcon) { + mDayNightIcon = new HbIconItem(this); + HbStyle::setItemName(mDayNightIcon, "dayNightIcon"); + } + mDayNightIcon->setIconName(iter.value().toString()); + break; + case Dst: + if (!mDstIcon) { + mDstIcon = new HbIconItem(this); + HbStyle::setItemName(mDstIcon, "dstIcon"); + } + mDstIcon->setIconName(iter.value().toString()); + break; + default: + break; + } + } + repolish(); + } +} + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/src/clockmainview.cpp --- a/clock/clockui/clockviews/src/clockmainview.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockviews/src/clockmainview.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -18,7 +18,6 @@ // System includes #include -#include #include #include #include @@ -27,6 +26,8 @@ #include #include #include +#include // hbapplication +#include // activity manager // User includes #include "clockmainview.h" @@ -39,8 +40,8 @@ #include "settingsutility.h" #include "timezoneclient.h" #include "clockalarmlistitemprototype.h" -#include "skinnableclock.h" #include "clockalarmlistmodel.h" +#include "clockwidget.h" /*! \class ClockMainView @@ -56,11 +57,11 @@ ClockMainView::ClockMainView(QGraphicsItem *parent) :HbView(parent), mAlarmList(0), - mSelectedItem(-1) + mSelectedItem(-1), + mIsLongTop(false), + mIsScreenShotCapruted(false) { - qDebug("clock: ClockMainView::ClockMainView() -->"); - - qDebug("clock: ClockMainView::ClockMainView() <--"); + // Nothing yet. } /*! @@ -68,8 +69,6 @@ */ ClockMainView::~ClockMainView() { - qDebug("clock: ClockMainView::~ClockMainView() -->"); - if (mDocLoader) { delete mDocLoader; mDocLoader = 0; @@ -78,8 +77,13 @@ delete mAlarmListModel; mAlarmListModel = 0; } + HbStyleLoader::unregisterFilePath( + ":/style/clockalarmlistitemprototype.css"); + HbStyleLoader::unregisterFilePath( + ":/style/clockalarmlistitemprototype.widgetml"); + HbStyleLoader::unregisterFilePath( + ":/style/clockalarmlistitemprototype_color.css"); - qDebug("clock: ClockMainView::~ClockMainView() <--"); } /*! @@ -92,8 +96,6 @@ void ClockMainView::setupView( ClockAppControllerIf &controllerIf, ClockDocLoader *docLoader) { - qDebug("clock: ClockMainView::setupView() -->"); - mDocLoader = docLoader; mAppControllerIf = &controllerIf; @@ -121,21 +123,16 @@ } int alarmCount = displayInfoList.count(); - - connect( - mTimezoneClient, SIGNAL(timechanged()), - this, SLOT(updatePlaceLabel())); - connect( - mTimezoneClient, SIGNAL(timechanged()), - this, SLOT(updateDateLabel())); - connect( - mTimezoneClient, SIGNAL(timechanged()), - this, SLOT(updateClockWidget())); - HbMainWindow *window = hbInstance->allMainWindows().first(); bool loadSuccess = false; Qt::Orientation currentOrienation = window->orientation(); + + // Get the dividers. + mHorizontalDivider = static_cast ( + mDocLoader->findObject("horizontalDivider")); + mVerticalDivider = static_cast ( + mDocLoader->findObject("verticalDivider")); // Get the "No alarm set" label. mNoAlarmLabel = qobject_cast ( @@ -155,7 +152,11 @@ this, SLOT(handleLongPress(HbAbstractViewItem*, const QPointF&))); - HbStyleLoader::registerFilePath(CLOCK_VIEWS_STYLE_PATH); + HbStyleLoader::registerFilePath(":/style/clockalarmlistitemprototype.css"); + HbStyleLoader::registerFilePath( + ":/style/clockalarmlistitemprototype.widgetml"); + HbStyleLoader::registerFilePath( + ":/style/clockalarmlistitemprototype_color.css"); setmodel(); // Load the correct section based on orientation. @@ -164,11 +165,15 @@ CLOCK_MAIN_VIEW_DOCML, CLOCK_MAIN_VIEW_PORTRAIT_SECTION, &loadSuccess); + mHorizontalDivider->setVisible(true); + mVerticalDivider->setVisible(false); } else { mDocLoader->load( CLOCK_MAIN_VIEW_DOCML, CLOCK_MAIN_VIEW_LANDSCAPE_SECTION, &loadSuccess); + mHorizontalDivider->setVisible(false); + mVerticalDivider->setVisible(true); } if (loadSuccess) { if (0 == alarmCount) { @@ -179,6 +184,42 @@ } } + mDayLabel = static_cast (mDocLoader->findObject("dateLabel")); + mPlaceLabel = static_cast (mDocLoader->findObject("placeLabel")); + mClockWidget = static_cast ( + mDocLoader->findObject(CLOCK_WIDGET)); + + // Update the date info. + updateDateLabel(); + // Update the place info. + updatePlaceLabel(mTimezoneClient->timeUpdateOn()); + // Update clock widget display. + updateClockWidget(); + + // Connect to orientation change and load appropriate section. + connect( + window, SIGNAL(orientationChanged(Qt::Orientation)), + this, SLOT(checkOrientationAndLoadSection(Qt::Orientation))); + + // Get a pointer to activity Manager + HbActivityManager* activityManager = qobject_cast(qApp)->activityManager(); + + // clean up any previous versions of this activity from the activity manager. + // ignore return value as the first boot would always return a false + // bool declared on for debugging purpose + bool ok = activityManager->removeActivity(clockMainView); + + // connect for the aboutToQuit events on application Exit as to call saveActivity + connect(qobject_cast(qApp), SIGNAL(aboutToQuit()), this, SLOT(saveActivity())); + +} + +/*! + To defer the connects and initialization. To be done after the view is drawn. + Should be called in the slot of view ready. + */ +void ClockMainView::setupAfterViewReady() +{ // Get the toolbar/menu actions. mRefreshMainView = static_cast ( mDocLoader->findObject("alarmsAction")); @@ -202,48 +243,23 @@ mAddNewAlarm, SIGNAL(triggered()), this, SLOT(addNewAlarm())); - if (Qt::Vertical == currentOrienation) { - // Remove toolbar item's texts as only icons are shown. - // TODO to use text ids from ts file. - mRefreshMainView->setText(tr("")); - mDisplayWorldClockView->setText(tr("")); - mAddNewAlarm->setText(""); - } else if (Qt::Horizontal == currentOrienation) { - // Display toolbar item's texts - // TODO to use text ids from ts file. - mRefreshMainView->setText(tr("Alarms")); - mDisplayWorldClockView->setText(tr("World clock")); - mAddNewAlarm->setText("New alarm"); - } - mSettingsAction = static_cast ( mDocLoader->findObject("settingsAction")); connect( mSettingsAction, SIGNAL(triggered()), this, SLOT(openSettings())); - mDayLabel = static_cast ( - mDocLoader->findObject("dateLabel")); - - mPlaceLabel = static_cast ( - mDocLoader->findObject("placeLabel")); - - mClockWidget = static_cast ( - mDocLoader->findObject("clockWidget")); - - // Update the date info. - updateDateLabel(); - // Update the place info. - updatePlaceLabel(); - // Update clock widget display. - updateClockWidget(); - - // Connect to orientation change and load appropriate section. + // Connect the necessary timezone client call backs. + connect( + mTimezoneClient, SIGNAL(timechanged()), + this, SLOT(updateView())); connect( - window, SIGNAL(orientationChanged(Qt::Orientation)), - this, SLOT(checkOrientationAndLoadSection(Qt::Orientation))); - - qDebug("clock: ClockMainView::setupView() <--"); + mTimezoneClient, SIGNAL(autoTimeUpdateChanged(int)), + this, SLOT(updatePlaceLabel(int))); + connect( + mTimezoneClient, SIGNAL(cityUpdated()), + this, SLOT(updatePlaceLabel())); + } /*! @@ -254,13 +270,15 @@ */ void ClockMainView::handleAlarmStatusChanged(int row) { - qDebug() << "clock: ClockMainView::handleAlarmStatusChanged -->"; + AlarmInfo alarmInfo; // Get the data for the alarm. QList alarmData = mAlarmListModel->sourceModel()->index(row, 0).data( AlarmDetails).toList(); - int alarmStatus = alarmData.at(2).value(); + int alarmId = alarmData.at(0).value(); + + mAlarmClient->getAlarmInfo(alarmId, alarmInfo); mSelectedItem = row; @@ -272,19 +290,27 @@ QString displayNote; // Activate or deactivate the alarm depending on the alarm status. // Display the NotificationDialog with appropriate message. - if (!alarmStatus) { + if (Snoozed == alarmInfo.alarmState && Enabled == alarmInfo.alarmStatus + && Once != alarmInfo.repeatType) { + removeSnoozedAlarm(); + displayNote.append(tr("Snoozed alarm removed")); + }else if (Enabled == alarmInfo.alarmStatus) { mAlarmClient->toggleAlarmStatus(alarmId, Disabled); - displayNote.append(hbTrId("txt_clock_main_view_dpopinfo_alarm_deactivated")); - HbNotificationDialog::launchDialog(displayNote); + displayNote.append( + hbTrId("txt_clock_main_view_dpopinfo_alarm_deactivated")); } else { mAlarmClient->toggleAlarmStatus(alarmId, Enabled); - displayNote.append(hbTrId("txt_clock_main_view_dpopinfo_alarm_activated")); - HbNotificationDialog::launchDialog(displayNote); + displayNote.append( + hbTrId("txt_clock_main_view_dpopinfo_alarm_activated")); } + + HbNotificationDialog *dialog = new HbNotificationDialog(); + dialog->setTitle(displayNote); + dialog->setTimeout(HbPopup::ConfirmationNoteTimeout); + dialog->show(); + mSelectedItem = -1; } - - qDebug() << "clock: ClockMainView::handleAlarmStatusChanged <--"; } /*! @@ -293,10 +319,8 @@ */ void ClockMainView::refreshMainView() { - qDebug() << "clock: ClockMainView::refreshMainView -->"; mRefreshMainView->setChecked(true); - qDebug() << "clock: ClockMainView::refreshMainView <--"; } /*! @@ -305,11 +329,9 @@ */ void ClockMainView::displayWorldClockView() { - qDebug() << "clock: ClockMainView::displayWorldClockView -->"; + mAppControllerIf->switchToView(WorldClock); + // no need to capture the screenshot here as it's done in ClockViewManager::showView - mAppControllerIf->switchToView(WorldClock); - - qDebug() << "clock: ClockMainView::displayWorldClockView <--"; } /*! @@ -318,16 +340,11 @@ */ void ClockMainView::addNewAlarm() { - qDebug() << "clock: ClockMainView::addNewAlarm -->"; - - ClockAlarmEditor *alarmEditor = new ClockAlarmEditor(); + ClockAlarmEditor *alarmEditor = new ClockAlarmEditor(*mAlarmClient); alarmEditor->showAlarmEditor(); - - connect( - alarmEditor, SIGNAL(alarmSet()), - this, SLOT(handleAlarmSet())); - - qDebug() << "clock: ClockMainView::addNewAlarm <--"; + // capture screenshot for future use, if application + // is exited/Quit from alarmEditor + captureScreenShot(true); } /*! @@ -336,13 +353,12 @@ */ void ClockMainView::openSettings() { - qDebug() << "clock: ClockMainView::openSettings -->"; - // Create the settings view. ClockSettingsView *settingsView = new ClockSettingsView(this); settingsView->loadSettingsView(); - - qDebug() << "clock: ClockMainView::openSettings <--"; + // capture screenshot for future use, if application + // is exited/Quit from alarmEditor + captureScreenShot(true); } /*! @@ -352,23 +368,21 @@ */ void ClockMainView::handleActivated(const QModelIndex &index) { - qDebug() << "clock: ClockMainView::handleActivated -->"; - - // Get the data for the alarm. - int row = index.row(); - QList alarmData = - mAlarmListModel->sourceModel()->index(row, 0).data( - AlarmDetails).toList(); - int alarmId = alarmData.at(0).value(); + if(!mIsLongTop) {// Get the data for the alarm. + int row = index.row(); + QList alarmData = + mAlarmListModel->sourceModel()->index(row, 0).data( + AlarmDetails).toList(); + int alarmId = alarmData.at(0).value(); - // Construct the alarm editor. - ClockAlarmEditor *alarmEditor = new ClockAlarmEditor(alarmId); - alarmEditor->showAlarmEditor(); - connect( - alarmEditor, SIGNAL(alarmSet()), - this, SLOT(handleAlarmSet())); - - qDebug() << "clock: ClockMainView::handleActivated <--"; + // Construct the alarm editor. + ClockAlarmEditor *alarmEditor = new ClockAlarmEditor( + *mAlarmClient, alarmId); + alarmEditor->showAlarmEditor(); + // capture screenshot for future use, if application + // is exited/Quit from alarmEditor + captureScreenShot(true); + } } /*! @@ -381,8 +395,7 @@ void ClockMainView::handleLongPress( HbAbstractViewItem *item, const QPointF &coords) { - qDebug() << "clock: ClockMainView::handleLongPress -->"; - + mIsLongTop = true; AlarmInfo alarmInfo; // Save the item row number where the long press was made. @@ -398,16 +411,19 @@ // On long press we display item specific context menu. HbMenu *itemContextMenu = new HbMenu(); + connect( + itemContextMenu,SIGNAL(aboutToClose()), + this, SLOT(handleMenuClosed())); // Add the delete action to the context menu. - HbAction *deleteAction = itemContextMenu->addAction( - hbTrId("txt_clk_main_view_menu_delete_alarm")); - connect(deleteAction, SIGNAL(triggered()), this, SLOT(deleteAlarm())); + mDeleteAction = itemContextMenu->addAction( + hbTrId("txt_clk_main_view_menu_delete_alarm")); // Show the menu. - itemContextMenu->exec(coords); - - qDebug() << "clock: ClockMainView::handleLongPress <--"; + itemContextMenu->open(this, SLOT(selectedMenuAction(HbAction*))); + itemContextMenu->setPreferredPos(coords); + itemContextMenu->setAttribute(Qt::WA_DeleteOnClose, true ); + } /*! @@ -416,8 +432,6 @@ */ void ClockMainView::deleteAlarm() { - qDebug() << "clock: ClockMainView::deleteAlarm -->"; - if (-1 < mSelectedItem) { // Get the data for the alarm. QList alarmData = mAlarmListModel->sourceModel()-> @@ -426,41 +440,44 @@ mAlarmClient->deleteAlarm(alarmId); mSelectedItem = -1; } - - qDebug() << "clock: ClockMainView::deleteAlarm <--"; } /*! - Updates the day and date in the day label. + Deltes the snoozed alarm. */ -void ClockMainView::updateDateLabel() +void ClockMainView::removeSnoozedAlarm() { - qDebug() << "clock: ClockMainView::updateDateLabel -->"; + if (-1 < mSelectedItem) { + // Get the data for the alarm. + QList alarmData = mAlarmListModel->sourceModel()-> + index(mSelectedItem, 0).data(AlarmDetails).toList(); + int alarmId = alarmData.at(0).value(); + mAlarmClient->deleteSnoozedAlarm(alarmId); + mSelectedItem = -1; + } +} - // Get the current datetime. - QDateTime dateTime = QDateTime::currentDateTime(); - // Get the day name. - QString dayName = dateTime.toString("dddd"); - // Get the date in correct format. - QString currentDate = mSettingsUtility->date(); - // Construct the day + date string. - QString dayDateString; - dayDateString+= dayName; - dayDateString += " "; - dayDateString += currentDate; - - mDayLabel->setPlainText(dayDateString); - - qDebug() << "clock: ClockMainView::updateDateLabel <--"; +void ClockMainView::updateView() +{ + // Update the place label. + updatePlaceLabel(mTimezoneClient->timeUpdateOn()); + // Update date label. + updateDateLabel(); + // Update clock widget. + updateClockWidget(); } /*! - Updates the zone info in the place label. + Slot which gets called for value change in auto time update in cenrep. + + \param autoTimeUpdate Value of auto time update. */ -void ClockMainView::updatePlaceLabel() +void ClockMainView::updatePlaceLabel(int autoTimeUpdate) { - qDebug() << "clock: MainViewWidget::updateClockZoneInfo -->"; - + if (-1 == autoTimeUpdate) { + autoTimeUpdate = mTimezoneClient->timeUpdateOn(); + } + // Get the current zone info. LocationInfo currentZoneInfo = mTimezoneClient->getCurrentZoneInfoL(); @@ -498,13 +515,13 @@ } else { gmtOffset += QString::number(offsetInMinutes); } - + // Append space. gmtOffset += tr(" "); - + // Append GMT sting. gmtOffset += hbTrId("txt_common_common_gmt"); - + // Append space. gmtOffset += tr(" "); @@ -515,7 +532,7 @@ // Update the labels with the correct info. mPlaceLabel->clear(); - if (mTimezoneClient->timeUpdateOn()) { + if(autoTimeUpdate) { mPlaceLabel->setPlainText( currentZoneInfo.countryName + tr(" ") + gmtOffset); } else { @@ -523,20 +540,6 @@ currentZoneInfo.cityName + tr(", ") + currentZoneInfo.countryName + tr(" ") + gmtOffset); } - - qDebug() << "clock: MainViewWidget::updateDayDateInfo <--"; -} - -/*! - Updates the clock widget display. - */ -void ClockMainView::updateClockWidget() -{ - qDebug() << "clock: ClockMainView::updateClockWidget -->"; - - mClockWidget->updateDisplay(true); - - qDebug() << "clock: ClockMainView::updateClockWidget <--"; } /*! @@ -544,8 +547,8 @@ */ void ClockMainView::handleAlarmListDisplay() { - qDebug() << "clock: ClockMainView::handleAlarmListDisplay -->"; - + // alarmEditor closed reset the captured screenshot, current view is main view now + captureScreenShot(false); // Get the list of pending clock alarms from server. QList alarmInfoList; QList displayInfoList; @@ -567,48 +570,6 @@ } } - qDebug() << "clock: ClockMainView::handleAlarmListDisplay <--"; -} - -/*! - Sets the model to the alarm list. - */ -void ClockMainView::setmodel() -{ - qDebug() << "clock: ClockMainView::setmodel -->"; - - // Set the model. - if (mAlarmList) { - mAlarmList->setModel(mAlarmListModel->sourceModel()); - ClockAlarmListItemPrototype *listItemPrototype = - new ClockAlarmListItemPrototype(this); - mAlarmList->setItemPrototype(listItemPrototype); - mAlarmList->setLayoutName("layout-alarmlist"); - } - - qDebug() << "clock: ClockMainView::setmodel <--"; -} - -/*! - Hides the alarmlist in the main view. - - \param hide 'true' if alarm list is to be hidden. - */ -void ClockMainView::hideAlarmList(bool hide) -{ - qDebug() << "clock: ClockMainView::hideAlarmList -->"; - - if (hide) { - mNoAlarmLabel->show(); - mAlarmList->hide(); - mHideAlarmList = true; - } else { - mAlarmList->show(); - mNoAlarmLabel->hide(); - mHideAlarmList = false; - } - - qDebug() << "clock: ClockMainView::hideAlarmList <--"; } /*! @@ -619,31 +580,20 @@ void ClockMainView::checkOrientationAndLoadSection( Qt::Orientation orientation) { - qDebug() << "clock: ClockMainView::checkOrientationAndLoadSection -->"; - bool success; // If horizontal, load the landscape section. if (Qt::Horizontal == orientation) { mDocLoader->load( CLOCK_MAIN_VIEW_DOCML, CLOCK_MAIN_VIEW_LANDSCAPE_SECTION, &success); - - // Display toolbar item's texts - // TODO have to use text ids from ts file. - mRefreshMainView->setText(tr("Alarms")); - mDisplayWorldClockView->setText(tr("World clock")); - mAddNewAlarm->setText("New alarm"); - + mHorizontalDivider->setVisible(false); + mVerticalDivider->setVisible(true); } else { mDocLoader->load( CLOCK_MAIN_VIEW_DOCML, CLOCK_MAIN_VIEW_PORTRAIT_SECTION, &success); - - // Remove toolbar item's texts as only icons are shown. - // TODO have to use text ids from ts file. - mRefreshMainView->setText(tr("")); - mDisplayWorldClockView->setText(tr("")); - mAddNewAlarm->setText(""); + mHorizontalDivider->setVisible(true); + mVerticalDivider->setVisible(false); } if(success) { @@ -656,8 +606,151 @@ hideAlarmList(false); } } +} - qDebug() << "clock: ClockMainView::checkOrientationAndLoadSection <--"; +/*! + Slot to handle context menu actions. + */ +void ClockMainView::selectedMenuAction(HbAction *action) +{ + if (action == mDeleteAction) { + deleteAlarm(); + } +} + +/*! + Slot to handle the context menu closed. + */ +void ClockMainView::handleMenuClosed() +{ + mIsLongTop = false; +} +/*! + Sets the model to the alarm list. + */ +void ClockMainView::setmodel() +{ + // Set the model. + if (mAlarmList) { + mAlarmList->setModel(mAlarmListModel->sourceModel()); + ClockAlarmListItemPrototype *listItemPrototype = + new ClockAlarmListItemPrototype(); + connect( + listItemPrototype, SIGNAL(alarmStatusHasChanged(int)), + this, SLOT(handleAlarmStatusChanged(int))); + mAlarmList->setItemPrototype(listItemPrototype); + mAlarmList->setLayoutName("layout-alarmlist"); + } + +} + +/*! + Hides the alarmlist in the main view. + + \param hide 'true' if alarm list is to be hidden. + */ +void ClockMainView::hideAlarmList(bool hide) +{ + if (hide) { + mNoAlarmLabel->show(); + mAlarmList->hide(); + mHideAlarmList = true; + } else { + mAlarmList->show(); + mNoAlarmLabel->hide(); + mHideAlarmList = false; + } } +/*! + Updates the day and date in the day label. + */ +void ClockMainView::updateDateLabel() +{ + // Get the current datetime. + QDateTime dateTime = QDateTime::currentDateTime(); + // Get the day name. + QString dayName = dateTime.toString("ddd"); + // Get the date in correct format. + QString currentDate = mSettingsUtility->date(); + // Construct the day + date string. + QString dayDateString; + dayDateString+= dayName; + dayDateString += " "; + dayDateString += currentDate; + + mDayLabel->setPlainText(dayDateString); +} + +/*! + Updates the zone info in the place label. + */ +/*void ClockMainView::updatePlaceLabel() +{ + updatePlaceLabel(mTimezoneClient->timeUpdateOn()); +}*/ + +/*! + Updates the clock widget display. + */ +void ClockMainView::updateClockWidget() +{ + QStringList clockType; + int index = mSettingsUtility->clockType(clockType); + int zeroIndex(0); + if(zeroIndex == index){ + mClockWidget->setClockType(ClockWidget::ClockTypeDigital); + } else { + mClockWidget->setClockType(ClockWidget::ClockTypeAnalog); + } + + QStringList timeFormat; + + if (zeroIndex == mSettingsUtility->timeFormat(timeFormat)) { + mClockWidget->setTimeFormat(ClockWidget::TimeFormat24Hrs); + } else { + mClockWidget->setTimeFormat(ClockWidget::TimeFormat12Hrs); + } + + mClockWidget->updateTime(); +} + +/*! + CaptureScreenShot captures screen shot + \param captureScreenShot bool to indicate if screenshot needs to be captured +*/ +void ClockMainView::captureScreenShot(bool captureScreenShot) +{ + // check if screen shot needs to be captured + if (captureScreenShot) { + mScreenShot.clear(); + mScreenShot.insert("screenshot", QPixmap::grabWidget(mainWindow(), mainWindow()->rect())); + } + mIsScreenShotCapruted = captureScreenShot; // set mIsScreenShotCapruted set validity of screenshot +} + +/*! + saveActivity saves main view as an activity +*/ +void ClockMainView::saveActivity() +{ + // Get a pointer to activity Manager + HbActivityManager* activityManager = qobject_cast(qApp)->activityManager(); + // check if a valid screenshot is already captured + if (!mIsScreenShotCapruted) { + mScreenShot.clear(); + mScreenShot.insert("screenshot", QPixmap::grabWidget(mainWindow(), mainWindow()->rect())); + } + + // save any data necessary to save the state + QByteArray serializedActivity; + QDataStream stream(&serializedActivity, QIODevice::WriteOnly | QIODevice::Append); + stream << MainView; + + // add the activity to the activity manager + bool ok = activityManager->addActivity(clockMainView, serializedActivity, mScreenShot); + if ( !ok ) { + qFatal("Add failed" ); + } +} // End of file --Don't remove. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/src/clockworldview.cpp --- a/clock/clockui/clockviews/src/clockworldview.cpp Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockviews/src/clockworldview.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -20,10 +20,7 @@ #include #include #include -#include #include -#include -#include #include #include #include @@ -38,7 +35,7 @@ #include "settingsutility.h" #include "timezoneclient.h" #include "clockcityselectionlist.h" -#include "listitemprototype.h" +#include "clockhomecityitem.h" /*! \class ClockWorldView @@ -55,8 +52,6 @@ :HbView(parent), mSelectedItem(-1) { - qDebug("clock: ClockWorldView::ClockWorldView() -->"); - // Timer for updating list data upon time change/update. mRefreshTimer = new QTimer(); connect( @@ -65,8 +60,6 @@ // Create the model. mCityListModel = new QStandardItemModel(); - - qDebug("clock: ClockWorldView::ClockWorldView() <--"); } /*! @@ -74,13 +67,17 @@ */ ClockWorldView::~ClockWorldView() { - qDebug("clock: ClockWorldView::~ClockWorldView() -->"); - if (mDocLoader) { delete mDocLoader; + mDocLoader = 0; } - - qDebug("clock: ClockWorldView::~ClockWorldView() <--"); + if(mCityListModel){ + delete mCityListModel; + } + + HbStyleLoader::unregisterFilePath(":/style/hblistviewitem.css"); + HbStyleLoader::unregisterFilePath(":/style/hblistviewitem.widgetml"); + HbStyleLoader::unregisterFilePath(":/style/hblistviewitem_color.css"); } /*! @@ -94,8 +91,6 @@ ClockAppControllerIf &controllerIf, ClockDocLoader *docLoader) { - qDebug("clock: ClockWorldView::setupView() <--"); - mDocLoader = docLoader; mAppControllerIf = &controllerIf; @@ -105,50 +100,43 @@ // Establish required connections. connect( mTimezoneClient, SIGNAL(timechanged()), - this, SLOT(updateClockDisplay())); - connect( - mTimezoneClient, SIGNAL(timechanged()), - this, SLOT(updateDayDateInfo())); + this, SLOT(updateAllLocationInfo())); connect( - mTimezoneClient, SIGNAL(timechanged()), - this, SLOT(updateCurrentLocationInfo())); + mTimezoneClient, SIGNAL(autoTimeUpdateChanged(int)), + this, SLOT(updateCurrentLocationInfo(int))); connect( - mTimezoneClient, SIGNAL(timechanged()), - this, SLOT(updateCurrentZoneInfo())); + mTimezoneClient, SIGNAL(cityUpdated()), + this, SLOT(updateAllLocationInfo())); mDisplayWorldClockView = static_cast ( - mDocLoader->findObject("worldClockAction")); + mDocLoader->findObject("worldClockAction")); mDisplayWorldClockView->setCheckable(true); mDisplayWorldClockView->setChecked(true); connect( - mDisplayWorldClockView, SIGNAL(changed()), - this, SLOT(refreshWorldView())); + mDisplayWorldClockView, SIGNAL(changed()), + this, SLOT(refreshWorldView())); // Get the currently added locations to the list. mCityInfoList = mTimezoneClient->getSavedLocations(); - // Create the custom prototype. - ListItemPrototype *customPrototype = new ListItemPrototype(); + // Get the homecity widget. + mHomeCityWidget = qobject_cast( + mDocLoader->findWidget(CLOCK_WORLD_HOMECITY)); + + // Get the city list item. mCityListView = qobject_cast ( - mDocLoader->findWidget("worldClockCityListView")); - HbStyleLoader::registerFilePath(":/style/"); + mDocLoader->findWidget(CLOCK_WORLD_CITYLIST)); + HbStyleLoader::registerFilePath(":/style/hblistviewitem.css"); + HbStyleLoader::registerFilePath(":/style/hblistviewitem.widgetml"); + HbStyleLoader::registerFilePath(":/style/hblistviewitem_color.css"); + mCityListView->setLayoutName("citylist-portrait"); mCityListView->setModel(mCityListModel); - mCityListView->setItemPrototype(customPrototype); - mCityListView->setLayoutName("custom"); - - mPlaceLabel = - qobject_cast (mDocLoader->findWidget("placeLabel")); -// mPlaceLabel->setTextWrapping(Hb::TextWordWrap); - - mDayDateLabel = - qobject_cast (mDocLoader->findWidget("dateLabel")); - + // Get the toolbar/menu actions. mAddCityAction = static_cast ( mDocLoader->findObject("addCityAction")); - mAddCityAction->setIcon(HbIcon(":/clock/add_new_city.svg")); connect( mAddCityAction, SIGNAL(triggered()), this, SLOT(handleAddLocation())); @@ -159,13 +147,11 @@ mShowAlarmsViewAction, SIGNAL(triggered()), this, SLOT(showAlarmsView())); - HbMainWindow *window; - window = hbInstance->allMainWindows().first(); - updateToolbarTexts(window->orientation()); + HbMainWindow *window = hbInstance->allMainWindows().first(); connect( window, SIGNAL(orientationChanged(Qt::Orientation)), - this, SLOT(updateToolbarTexts(Qt::Orientation))); + this, SLOT(loadSection(Qt::Orientation))); if (mCityInfoList.count() > 0) { // There is atleast one city. Refresh needed. @@ -175,25 +161,34 @@ mRefreshTimer->start(after * 1000); } - // Update the date and day info. - updateDayDateInfo(); - connect( mCityListView, SIGNAL(longPressed(HbAbstractViewItem *, const QPointF &)), this, SLOT(handleItemLongPressed(HbAbstractViewItem *, const QPointF &))); + // Update current location info. + updateCurrentLocationInfo(mTimezoneClient->timeUpdateOn()); + // Populate the list. - int index = 0; - // Update current location info. - updateCurrentLocationInfo(); - - for (; index < mCityInfoList.count(); index++) { + for (int index = 0; index < mCityInfoList.count(); index++) { addCityToList(mCityInfoList.at(index)); } + + // Adding the "Add city" in options menu. + mAddCityMenuAction = new HbAction( + QString(hbTrId("txt_clock_opt_add_city")),this); + menu()->addAction(mAddCityMenuAction); + mAddCityMenuAction->setVisible(true); + connect( + mAddCityMenuAction, SIGNAL(triggered()), + this, SLOT(handleAddLocation())); - qDebug("clock: ClockWorldView::setupView() <--"); + // Check for disabling of addCityAction in view toolbar. + if ((KMaximumCityListCount-1) == mCityInfoList.count()) { + mAddCityAction->setEnabled(false); + mAddCityMenuAction->setVisible(false); + } } /*! @@ -201,46 +196,19 @@ */ void ClockWorldView::refreshCityList() { + updateCurrentLocationInfo(mTimezoneClient->timeUpdateOn()); int cityInfoCount = mCityInfoList.count(); if (cityInfoCount) { QStandardItem *item = 0; for (int infoIndex = 0; infoIndex < cityInfoCount; infoIndex++) { item = mCityListModel->item(infoIndex); - - QDateTime dateTime = QDateTime::currentDateTime(); - dateTime = dateTime.toUTC(); - dateTime = dateTime.addSecs( - mCityInfoList.at(infoIndex).zoneOffset * 60); - - // Display day/night indicators. - QString dayNightIconPath = ""; - if (isDay(dateTime)) { - dayNightIconPath = ":/clock/day"; - } else { - dayNightIconPath = ":/clock/night"; - } - item->setData(dayNightIconPath, Qt::UserRole + 1000); - - // Update the date info. - QString dateInfo = dateTime.toString( - mSettingsUtility->dateFormatString()); - if (dateTime.date() == QDate::currentDate()) { - dateInfo = tr("Today"); - } - item->setData(dateInfo, Qt::UserRole + 1001); - - // Set the DST icon. - QString dstIconPath = ""; - if (mCityInfoList.at(infoIndex).dstOn) { - dstIconPath = ":/clock/dst_icon"; - } - item->setData(dstIconPath, Qt::UserRole + 1004); - - // Update the time info. - QString timeInfo = dateTime.toString( - mSettingsUtility->timeFormatString()); - item->setData(timeInfo, Qt::UserRole + 1005); + item->setData( + getCityListDisplayString(mCityInfoList.at(infoIndex)), + Qt::DisplayRole); + item->setData( + getCityListDecorationString(mCityInfoList.at(infoIndex)), + Qt::DecorationRole); } // Start the timer again for one minute. @@ -249,101 +217,64 @@ } /*! - Updates the clock display. + Updates the current location info. */ -void ClockWorldView::updateClockDisplay() -{ -// mSkinnableClock->updateDisplay(true); -} - -/*! - Updates the day-date info. - */ -void ClockWorldView::updateDayDateInfo() +void ClockWorldView::updateCurrentLocationInfo(int networkTime) { - // Get the current datetime. - QDateTime dateTime = QDateTime::currentDateTime(); - QString dayName = dateTime.toString("dddd"); + HbMainWindow *window = hbInstance->allMainWindows().first(); + Qt::Orientation currentOrienation = window->orientation(); + loadSection(currentOrienation); + + if (!networkTime) { + // Get the updated home city. + LocationInfo homeCity = mTimezoneClient->getCurrentZoneInfoL(); + + QMap itemList; + QString value; + QDateTime dateTime = QDateTime::currentDateTime(); + + // Show the date. If date is current date then show 'today'. + QString dateInfo = dateTime.toString( + mSettingsUtility->dateFormatString()); + itemList.insert(value.setNum(ClockHomeCityItem::Date), dateInfo); + + // Show the city and country name. + QString placeInfo = + homeCity.cityName + tr(", ") + homeCity.countryName; + itemList.insert(value.setNum(ClockHomeCityItem::City), placeInfo); - QString currentDate = mSettingsUtility->date(); - // Construct the day + date string. - QString dayDateString; - dayDateString+= dayName; - dayDateString += " "; - dayDateString += currentDate; + // Show the time at that location. + QString timeInfo = dateTime.toString( + mSettingsUtility->timeFormatString()); + itemList.insert(value.setNum(ClockHomeCityItem::Time), timeInfo); - mDayDateLabel->clear(); - mDayDateLabel->setPlainText(dayDateString); + //Use the home city specific icons. + // Display day/night indicators. + QString dayNightIconPath = ""; + if (isDay(dateTime)) { + dayNightIconPath = "qtg_large_clock_home"; + } else { + dayNightIconPath = "qtg_large_clock_night_home"; + } + itemList.insert(value.setNum( + ClockHomeCityItem::DayNightIndicator), dayNightIconPath); + + // Show dst icon when needed. + if (homeCity.dstOn) { + QString dstIconPath = "qtg_mono_day_light_saving_time"; + itemList.insert(value.setNum(ClockHomeCityItem::Dst), dstIconPath); + } + mHomeCityWidget->setHomeCityItemData(itemList); + } } /*! - Updates the current location info. - */ -void ClockWorldView::updateCurrentLocationInfo() -{ - // Get the updated home city. - LocationInfo homeCity = mTimezoneClient->getCurrentZoneInfoL(); - - // Construct the GMT +/- X string. - QString gmtOffset; - - int utcOffset = homeCity.zoneOffset; - int offsetInHours (utcOffset/60); - int offsetInMinutes (utcOffset%60); - - // Check wether the offset is +ve or -ve. - if (0 < utcOffset) { - // We have a positive offset. Append the '+' character. - gmtOffset += tr(" +"); - } else if (0 > utcOffset) { - // We have a negative offset. Append the '-' character. - gmtOffset += tr(" -"); - offsetInHours = -offsetInHours; - } else { - // We dont have an offset. We are at GMT zone. - } - - // Append the hour component. - gmtOffset += QString::number(offsetInHours); - - // Get the time separator from settings and append it. - QStringList timeSeparatorList; - int index = mSettingsUtility->timeSeparator(timeSeparatorList); - gmtOffset += timeSeparatorList.at(index); + Handles the long press on each item in the citylist. + Displays a list item specific context menu. - // Append the minute component. - // If minute component is less less than 10, append a '00' - if (0 <= offsetInMinutes && offsetInMinutes < 10) { - gmtOffset += tr("00"); - } else { - gmtOffset += QString::number(offsetInMinutes); - } - - // Append space. - gmtOffset += tr(" "); - - // Append GMT sting. - gmtOffset += hbTrId("txt_common_common_gmt"); - - // Append space. - gmtOffset += tr(" "); - - // Append DST info. - if (homeCity.dstOn) { - gmtOffset += hbTrId("txt_common_setlabel_dst"); - } - - // Set the city and country name . - mPlaceLabel->clear(); - if (mTimezoneClient->timeUpdateOn()) { - mPlaceLabel->setPlainText(homeCity.countryName + tr(" ") + gmtOffset); - } else { - mPlaceLabel->setPlainText( - homeCity.cityName + tr(", ") + homeCity.countryName - + tr(" ") + gmtOffset); - } -} - + \param item The HbAbstractViewItem that was long pressed. + \param coords The position where mouse was pressed. + */ void ClockWorldView::handleItemLongPressed( HbAbstractViewItem *item, const QPointF &coords) { @@ -355,19 +286,14 @@ // Add the actions to the context menu. mSetCurrentLocationAction = itemContextMenu->addAction( - hbTrId("txt_clk_menu_set_as_current_location")); + hbTrId("txt_clk_menu_set_as_current_location")); mRemoveCityAction = itemContextMenu->addAction( - hbTrId("txt_clk_menu_delete")); - - connect( - mSetCurrentLocationAction, SIGNAL(triggered()), - this, SLOT(handleSetAsCurrentLocationAction())); - connect( - mRemoveCityAction, SIGNAL(triggered()), - this, SLOT(handleDeleteAction())); + hbTrId("txt_clk_menu_delete")); // Show the menu. - itemContextMenu->exec(coords); + itemContextMenu->open(this, SLOT(selectedMenuAction(HbAction*))); + itemContextMenu->setPreferredPos(coords); + itemContextMenu->setAttribute( Qt::WA_DeleteOnClose,true); } /*! @@ -393,14 +319,10 @@ void ClockWorldView::handleDeleteAction() { if (-1 != mSelectedItem) { - int temp = mCityListModel->rowCount(); - QStandardItem *item = mCityListModel->takeItem(mSelectedItem); mCityListModel->removeRow(mSelectedItem); delete item; - temp = mCityListModel->rowCount(); - mCityInfoList.removeAt(mSelectedItem); mSelectedItem = -1; @@ -410,6 +332,10 @@ if (mCityInfoList.count() <= 0) { // No need to refresh the list anymore. mRefreshTimer->stop(); + } else if (mCityInfoList.count() < (KMaximumCityListCount-1) && + !mAddCityAction->isEnabled()) { + mAddCityAction->setEnabled(true); + mAddCityMenuAction->setVisible(true); } } } @@ -419,66 +345,37 @@ */ void ClockWorldView::handleSetAsCurrentLocationAction() { + // Get the info of the selected item. + LocationInfo newHomeCity = mCityInfoList[mSelectedItem]; + // Check if time update is set to ON. // If yes, reset it to OFF and change the home location. if (mTimezoneClient->timeUpdateOn()) { mTimezoneClient->setTimeUpdateOn(false); + + QStandardItem *item = mCityListModel->takeItem(mSelectedItem); + mCityListModel->removeRow(mSelectedItem); + delete item; + + mCityInfoList.removeAt(mSelectedItem); } else { // The current location and home city should be swapped. // Store the info of current home city. LocationInfo oldHomeCity = mTimezoneClient->getCurrentZoneInfoL(); - // Get the info of the selected item. - LocationInfo newHomeCity = mCityInfoList[mSelectedItem]; - - QStandardItem *cityItem = mCityListModel->item(mSelectedItem); - QDateTime dateTime = QDateTime::currentDateTime(); - - // Display day/night indicators. - QString dayNightIconPath = ""; - if (isDay(dateTime)) { - dayNightIconPath = ":/clock/day"; - } else { - dayNightIconPath = ":/clock/night"; - } - cityItem->setData(dayNightIconPath, Qt::UserRole + 1000); - - // Date. - QString dateString = dateTime.toString( - mSettingsUtility->dateFormatString()); - if (dateTime.date() == QDate::currentDate()) { - dateString = tr("Today"); - } - cityItem->setData(dateString, Qt::UserRole + 1001); - - // The city/country name. - QString placeInfo = - oldHomeCity.cityName + tr(", ") + oldHomeCity.countryName; - cityItem->setData(placeInfo, Qt::UserRole + 1002); - - // Dst icon. - QString dstIconPath = ""; - if (oldHomeCity.dstOn) { - dstIconPath = ":/clock/dst_icon"; - } - cityItem->setData(dstIconPath, Qt::UserRole + 1004); - - // Time. - QString timeString = dateTime.toString( - mSettingsUtility->timeFormatString()); - cityItem->setData(timeString, Qt::UserRole + 1005); // Update the info list. mCityInfoList.removeAt(mSelectedItem); mCityInfoList.insert(mSelectedItem, oldHomeCity); - // Update the home city with the timezone server. - mTimezoneClient->setAsCurrentLocationL(newHomeCity); + + } + // Update the home city with the timezone server. + mTimezoneClient->setAsCurrentLocationL(newHomeCity); - // Update the current location info. - updateCurrentLocationInfo(); + // Update the current location info. + updateCurrentLocationInfo(mTimezoneClient->timeUpdateOn()); - // Update the offset difference in each list item. - updateOffsetDifferences(); - } + // Update the offset difference in each list item. + refreshCityList(); // Update the data file. mTimezoneClient->saveLocations(mCityInfoList); @@ -499,15 +396,20 @@ // Now we check if the city is already added in the list. bool proceed = true; for (int i = 0; i < mCityInfoList.count(); i++) { - if (info.timezoneId == mCityInfoList.at(i).timezoneId) { + if (info.timezoneId == mCityInfoList.at(i).timezoneId + && (info.cityName == mCityInfoList.at(i).cityName) + && (info.countryName == mCityInfoList.at(i).countryName) ) { proceed = false; break; } } + LocationInfo currentCity = mTimezoneClient->getCurrentZoneInfoL(); // Check if the selected city is not the home city. - if (info.timezoneId - == mTimezoneClient->getCurrentZoneInfoL().timezoneId) { + if ( + (info.timezoneId == currentCity.timezoneId) + && (info.cityName == currentCity.cityName) + && (info.countryName == currentCity.countryName)) { proceed = false; } @@ -528,7 +430,11 @@ } } } - + if ((KMaximumCityListCount-1) == mCityInfoList.count() && + mAddCityAction->isEnabled()) { + mAddCityAction->setEnabled(false); + mAddCityMenuAction->setVisible(false); + } // Cleanup. mCitySelectionList->deleteLater(); } @@ -536,87 +442,82 @@ /*! Navigates to the clock alarms view. */ - void ClockWorldView::showAlarmsView() { - qDebug() << "clock: ClockWorldView::showAlarmsView -->"; + mAppControllerIf->switchToView(MainView); +} - mAppControllerIf->switchToView(MainView); - - qDebug() << "clock: ClockWorldView::showAlarmsView <--"; +/*! + Slot which gets called when `World Clock' action is triggered from the view + toolbar. This is responsible for reloading the content of worldclock view. + */ +void ClockWorldView::refreshWorldView() +{ + mDisplayWorldClockView->setChecked(true); } /*! - Updates the offset difference shown in each item with respect to the home - city. + Loads the appropriate section based on window orientaion. */ -void ClockWorldView::updateOffsetDifferences() +void ClockWorldView::loadSection(Qt::Orientation orientation) { - // Get the home city information. - LocationInfo homeCityInfo = mTimezoneClient->getCurrentZoneInfoL(); - - for (int iter = 0; iter < mCityListModel->rowCount(); iter++) { - QModelIndex index = mCityListModel->index(iter, 0); - LocationInfo cityInfo = mCityInfoList[iter]; - - // Find out if the city being added has an offset greater than or less - // than the homecity offset. - QString offsetDifference; - if (cityInfo.zoneOffset < homeCityInfo.zoneOffset) { - offsetDifference += "-"; - } else if (cityInfo.zoneOffset > homeCityInfo.zoneOffset) { - offsetDifference += "+"; + bool networkTime = mTimezoneClient->timeUpdateOn(); + bool loadSuccess; + if (Qt::Horizontal == orientation) { + if (networkTime) { + // Do not show home city. + mDocLoader->load( + CLOCK_WORLD_VIEW_DOCML, + CLOCK_WORLD_VIEW_LANDSCAPE_NOHOMECITY_SECTION, + &loadSuccess); + mHomeCityWidget->hide(); + } else { + mDocLoader->load( + CLOCK_WORLD_VIEW_DOCML, + CLOCK_WORLD_VIEW_LANDSCAPE_HOMECITY_SECTION, + &loadSuccess); + mHomeCityWidget->show(); } - // Now get the hours and minutes. - int difference = - qAbs(homeCityInfo.zoneOffset - cityInfo.zoneOffset); - int hours = difference / 60; - int minutes = difference % 60; - offsetDifference += QString::number(hours); - offsetDifference += "hrs"; - if (minutes) { - offsetDifference += ", "; - offsetDifference += QString::number(minutes); - offsetDifference += "mins"; + } else if (Qt::Vertical == orientation) { + if (networkTime) { + // Do not show home city. + mDocLoader->load( + CLOCK_WORLD_VIEW_DOCML, + CLOCK_WORLD_VIEW_PORTRAIT_NOHOMECITY_SECTION, + &loadSuccess); + mHomeCityWidget->hide(); + } else { + // Show home city. + mDocLoader->load( + CLOCK_WORLD_VIEW_DOCML, + CLOCK_WORLD_VIEW_PORTRAIT_HOMECITY_SECTION, + &loadSuccess); + mHomeCityWidget->show(); } - // TODO : Need to enable these code once we recieve the localisation. - /*QString displayFormat = tr("%1hrs, %2mins"); - QString offsetString = displayFormat.arg(hours, minutes); - offsetDifference += offsetString;*/ - mCityListModel->setData(index, offsetDifference, Qt::UserRole + 1003); } + mCityListView->update(); } /*! - Slot which gets called when `World Clock' action is triggered from the view - toolbar. This is responsible for reloading the content of the world clock view. + Slot which gets called for timeChanged signal of timezone client. + Refreshes both homecity & city list. */ -void ClockWorldView::refreshWorldView() +void ClockWorldView::updateAllLocationInfo() { - qDebug() << "clock: ClockWorldView::refreshWorldView -->"; - - mDisplayWorldClockView->setChecked(true); - - qDebug() << "clock: ClockWorldView::refreshWorldView <--"; + updateCurrentLocationInfo(mTimezoneClient->timeUpdateOn()); + updateCityList(); + refreshCityList(); } /*! - Slot to handle orientation changes + Slot to handle the selected context menu actions */ -void ClockWorldView::updateToolbarTexts(Qt::Orientation currentOrientation) +void ClockWorldView::selectedMenuAction(HbAction *action) { - if (Qt::Horizontal == currentOrientation) { - // Display toolbar item's texts - // TODO to use text ids from ts file. - mShowAlarmsViewAction->setText(tr("Alarms")); - mDisplayWorldClockView->setText(tr("World clock")); - mAddCityAction->setText(tr("Add city")); - } else if(Qt::Vertical == currentOrientation){ - // Remove toolbar item's texts as only icons are shown. - // TODO to use text ids from ts file. - mShowAlarmsViewAction->setText(tr("")); - mDisplayWorldClockView->setText(tr("")); - mAddCityAction->setText(""); + if (action == mSetCurrentLocationAction) { + handleSetAsCurrentLocationAction(); + } else if (action == mRemoveCityAction) { + handleDeleteAction(); } } @@ -630,95 +531,17 @@ // Here we construct a model item and add it to the list model. QStandardItem *modelItem = new QStandardItem(); - QDateTime dateTime = QDateTime::currentDateTime(); - dateTime = dateTime.toUTC(); - dateTime = dateTime.addSecs(locationInfo.zoneOffset * 60); - - // Display day/night indicators. - QString dayNightIconPath = ""; - if (isDay(dateTime)) { - dayNightIconPath = ":/clock/day"; - } else { - dayNightIconPath = ":/clock/night"; - } - modelItem->setData(dayNightIconPath, Qt::UserRole + 1000); - - // Show the date. If date is current date then show 'today'. - QString dateInfo = dateTime.toString(mSettingsUtility->dateFormatString()); - if (dateTime.date() == QDate::currentDate()) { - dateInfo = tr("Today"); - } - modelItem->setData(dateInfo, Qt::UserRole + 1001); - - // Show the city and country name. - QString placeInfo = - locationInfo.cityName + tr(", ") + locationInfo.countryName; - modelItem->setData(placeInfo, Qt::UserRole + 1002); - - // Get the homecity information. - LocationInfo homeCityInfo = mTimezoneClient->getCurrentZoneInfoL(); - // Find out if the city being added has an offset greater than or less than - // the homecity offset. - QString offsetDifference; - if (locationInfo.zoneOffset < homeCityInfo.zoneOffset) { - offsetDifference += "-"; - } else if (locationInfo.zoneOffset > homeCityInfo.zoneOffset) { - offsetDifference += "+"; - } - // Now get the hours and minutes. - int difference = qAbs(homeCityInfo.zoneOffset - locationInfo.zoneOffset); - int hours = difference / 60; - int minutes = difference % 60; - - if ( hours && minutes ) { - if (hours == 1) { - QString displayFormat = - hbTrId("txt_clock_dblist_daily_val_1_hr_2_mins"); - QString offsetString = displayFormat.arg(hours).arg(minutes); - offsetDifference += offsetString; - } - else { - QString displayFormat = - hbTrId("txt_clock_dblist_daily_val_1_hrs_2_mins"); - QString offsetString = displayFormat.arg(hours).arg(minutes); - offsetDifference += offsetString; - } - } - else if ( hours ){ - if(hours == 1 ) { - QString displayFormat = hbTrId("txt_clock_dblist_val_1_hr"); - QString offsetString = displayFormat.arg(hours); - offsetDifference += offsetString; - } - else { - QString displayFormat = hbTrId("txt_clock_dblist_val_1_hrs"); - QString offsetString = displayFormat.arg(hours); - offsetDifference += offsetString; - } - } - else if (minutes){ - QString displayFormat = hbTrId("txt_clock_dblist_val_1_mins"); - QString offsetString = displayFormat.arg(minutes); - offsetDifference += offsetString; - } - - modelItem->setData(offsetDifference, Qt::UserRole + 1003); - - // Show dst icon when needed. - QString dstIconPath = ""; - if (locationInfo.dstOn) { - dstIconPath = ":/clock/dst_icon"; - } - modelItem->setData(dstIconPath, Qt::UserRole + 1004); - - // Show the time at that location. - QString timeInfo = dateTime.toString(mSettingsUtility->timeFormatString()); - modelItem->setData(timeInfo, Qt::UserRole + 1005); - // Add the item to the model. mCityListModel->appendRow(modelItem); - return(mCityListModel->indexFromItem(modelItem)); + QModelIndex index = mCityListModel->indexFromItem(modelItem); + mCityListModel->setData( + index, getCityListDisplayString(locationInfo), Qt::DisplayRole); + mCityListModel->setData( + index, getCityListDecorationString(locationInfo), + Qt::DecorationRole); + + return index; } /*! @@ -737,4 +560,167 @@ return true; } +/*! + Returns the QVariantList for citylist to be set for DisplayRole. + + /param locationInfo Details of the city to be added to the list. + */ +QVariantList ClockWorldView::getCityListDisplayString( + const LocationInfo& locationInfo) +{ + QVariantList displayString; + QDateTime dateTime = QDateTime::currentDateTime(); + dateTime = dateTime.toUTC(); + dateTime = dateTime.addSecs(locationInfo.zoneOffset * 60); + + // Show the date. If date is current date then show 'today'. + QString dateInfo = dateTime.toString(mSettingsUtility->dateFormatString()); + if (dateTime.date() == QDate::currentDate()) { + dateInfo = hbTrId("txt_clock_main_view_dblist_daily_val_today"); + } + displayString.append(dateInfo); + + // Show the city and country name. + QString placeInfo = + locationInfo.cityName + tr(", ") + locationInfo.countryName; + displayString.append(placeInfo); + + // Get the homecity information. + LocationInfo homeCityInfo = mTimezoneClient->getCurrentZoneInfoL(); + // Find out if the city being added has an offset greater than or less than + // the homecity offset. + QString offsetDifference; + if (locationInfo.zoneOffset < homeCityInfo.zoneOffset) { + offsetDifference += "-"; + } else if (locationInfo.zoneOffset > homeCityInfo.zoneOffset) { + offsetDifference += "+"; + } + // Now get the hours and minutes. + int difference = qAbs(homeCityInfo.zoneOffset - locationInfo.zoneOffset); + int hours = difference / 60; + int minutes = difference % 60; + QString displayFormat(""); + QString offsetString(""); + + if ( hours && minutes ) { + if (hours == 1) { + displayFormat = + hbTrId("txt_clock_dblist_daily_val_1_hr_2_mins"); + offsetString = displayFormat.arg(hours).arg(minutes); + offsetDifference += offsetString; + } + else { + displayFormat = + hbTrId("txt_clock_dblist_daily_val_1_hrs_2_mins"); + offsetString = displayFormat.arg(hours).arg(minutes); + offsetDifference += offsetString; + } + } + else if ( hours ){ + if(hours == 1 ) { + displayFormat = hbTrId("txt_clock_dblist_val_1_hr"); + offsetString = displayFormat.arg(hours); + offsetDifference += offsetString; + } + else { + displayFormat = hbTrId("txt_clock_dblist_val_1_hrs"); + offsetString = displayFormat.arg(hours); + offsetDifference += offsetString; + } + } + else if (minutes){ + displayFormat = hbTrId("txt_clock_dblist_val_1_mins"); + offsetString = displayFormat.arg(minutes); + offsetDifference += offsetString; + } else { + displayFormat = hbTrId("txt_clock_dblist_val_1_hrs"); + offsetString = displayFormat.arg(0); + offsetDifference += offsetString; + } + displayString.append(offsetDifference); + + // Show the time at that location. + QString timeInfo = dateTime.toString(mSettingsUtility->timeFormatString()); + displayString.append(timeInfo); + + return displayString; +} + +/*! + Returns the QVariantList for citylist to be set for DecorationRole. + + /param locationInfo Details of the city to be added to the list. + */ +QVariantList ClockWorldView::getCityListDecorationString( + const LocationInfo& locationInfo) +{ + QVariantList decorationString; + QDateTime dateTime = QDateTime::currentDateTime(); + dateTime = dateTime.toUTC(); + dateTime = dateTime.addSecs(locationInfo.zoneOffset * 60); + + // Display day/night indicators. + // TODO: change the icon name for night when available. + QString dayNightIconPath = ""; + if (isDay(dateTime)) { + dayNightIconPath = "qtg_large_clock"; + } else { + dayNightIconPath = "qtg_large_clock_night"; + } + decorationString.append(HbIcon(dayNightIconPath)); + + // Show dst icon when needed. + if (locationInfo.dstOn) { + QString dstIconPath = "qtg_mono_day_light_saving_time"; + decorationString.append(HbIcon(dstIconPath)); + } + return decorationString; + +} + +/*! + Updates the city list according to the home city. + */ +void ClockWorldView::updateCityList() +{ + int cityInfoCount = mCityInfoList.count(); + + if (cityInfoCount) { + bool deletion = false; + int index; + LocationInfo currentCity = mTimezoneClient->getCurrentZoneInfoL(); + for (index = 0; index < cityInfoCount; index++) { + if (currentCity.timezoneId == mCityInfoList.at(index).timezoneId + && (currentCity.cityName == + mCityInfoList.at(index).cityName) + && (currentCity.countryName == + mCityInfoList.at(index).countryName) ) { + deletion = true; + break; + } + } + if (deletion) { + QStandardItem *item = mCityListModel->takeItem(index); + mCityListModel->removeRow(index); + delete item; + + mCityInfoList.removeAt(index); + index = -1; + + // Update the data file. + mTimezoneClient->saveLocations(mCityInfoList); + + if (mCityInfoList.count() <= 0) { + // No need to refresh the list anymore. + mRefreshTimer->stop(); + } else if (mCityInfoList.count() < (KMaximumCityListCount-1) && + !mAddCityAction->isEnabled()) { + mAddCityAction->setEnabled(true); + mAddCityMenuAction->setVisible(true); + } + + } + } +} + // End of file-- Don't delete. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockviews/src/listitemprototype.cpp --- a/clock/clockui/clockviews/src/listitemprototype.cpp Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,128 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* Definition file for class ListItemPrototype. -* -*/ - -// System includes -#include -#include -#include -#include -#include -#include - -// User includes -#include "listitemprototype.h" - -/*! - \class ListItemPrototype - - Prototype class for the World clock city list. - */ - -/*! - Default constructor. - - \parent of type QGraphicsItem. - */ -ListItemPrototype::ListItemPrototype(QGraphicsItem *parent) -:HbListViewItem(parent), - mDayNightIcon(0), - mDateText(0), - mCityText(0), - mOffsetText(0), - mDstIcon(0), - mTimeText(0) -{ - // Nothing yet. -} - -/*! - Destructor. - */ -ListItemPrototype::~ListItemPrototype() -{ - // Nothing yet. -} - -/*! - From HbListViewItem. - - \sa HbAbstractViewItem, HbListViewItem. - */ -HbAbstractViewItem *ListItemPrototype::createItem() -{ - return new ListItemPrototype(*this); -} - -/*! - Called for every view item in the list. - - \sa HbAbstractViewItem, HbListViewItem. - */ -void ListItemPrototype::updateChildItems() -{ - // First allow the base class to update. - HbListViewItem::updateChildItems(); - - // Create the individual items. - // Create day-night icon. - if (!mDayNightIcon) { - mDayNightIcon = new HbIconItem(this); - style()->setItemName(mDayNightIcon, "dayNightIcon"); - } - mDayNightIcon->setIconName( - modelIndex().data(Qt::UserRole + 1000).value()); - - // Create the date text item. - if (!mDateText) { - mDateText = new HbTextItem(this); - style()->setItemName(mDateText, "dateText"); - } - mDateText->setText(modelIndex().data(Qt::UserRole + 1001).toString()); - - // Create the city, country name text item. - if (!mCityText) { - mCityText = new HbTextItem(this); - mCityText->setTextWrapping(Hb::TextNoWrap); - style()->setItemName(mCityText, "cityText"); - } - mCityText->setText(modelIndex().data(Qt::UserRole + 1002).toString()); - - // Create the offset text item. - if (!mOffsetText) { - mOffsetText = new HbTextItem(this); - style()->setItemName(mOffsetText, "offsetText"); - } - mOffsetText->setText(modelIndex().data(Qt::UserRole + 1003).toString()); - - // Create dst icon. - if (!mDstIcon) { - mDstIcon = new HbIconItem(this); - style()->setItemName(mDstIcon, "dstIcon"); - } - mDstIcon->setIconName( - modelIndex().data(Qt::UserRole + 1004).value()); - - // Create the time text item. - if (!mTimeText) { - mTimeText = new HbTextItem(this); - style()->setItemName(mTimeText, "timeText"); - } - mTimeText->setText(modelIndex().data(Qt::UserRole + 1005).toString()); -} - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidget.pro --- a/clock/clockui/clockwidget/clockwidget.pro Mon May 03 12:30:32 2010 +0300 +++ b/clock/clockui/clockwidget/clockwidget.pro Mon Jun 28 15:22:02 2010 +0530 @@ -1,5 +1,5 @@ # -# Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). # All rights reserved. # This component and the accompanying materials are made available # under the terms of "Eclipse Public License v1.0" @@ -11,40 +11,12 @@ # # Contributors: # -# Description: Project definition file for clockui -# - -TEMPLATE = lib -TARGET = clockwidgetproto -DEFINES += CLOCKWIDGET_LIB -CONFIG += hb - -DEPENDPATH += . \ - ./src \ - ./inc \ - ../../data -INCLUDEPATH += . \ - ../../clockmw/clocktimezone/inc \ - ../../clockmw/clocksettingsutility/inc \ - ../../inc +# Description: +# -symbian: { - TARGET.CAPABILITY = ALL -TCB - TARGET.EPOCALLOWDLLDATA = 1 - TARGET.UID3 = 0x2002E6B4 - - LIBS += -ltimezoneclient \ - -lclocksettingsutility -} - -SOURCES += skinnableclock.cpp \ - analogclock.cpp \ - digitalclock.cpp - -HEADERS += skinnableclock.h \ - analogclock.h \ - digitalclock.h - -RESOURCES += ../../data/clockwidget.qrc - -# End of file --Don't remove this. + + +TEMPLATE = subdirs +SUBDIRS += clockwidgetimpl +SUBDIRS += clockwidgetplugin +CONFIG += ordered \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidgetimpl/bwins/clockwidgetu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockwidget/clockwidgetimpl/bwins/clockwidgetu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,21 @@ +EXPORTS + ?tr@ClockWidget@@SA?AVQString@@PBD0H@Z @ 1 NONAME ; class QString ClockWidget::tr(char const *, char const *, int) + ?staticMetaObject@ClockWidget@@2UQMetaObject@@B @ 2 NONAME ; struct QMetaObject const ClockWidget::staticMetaObject + ??1ClockWidget@@UAE@XZ @ 3 NONAME ; ClockWidget::~ClockWidget(void) + ??0ClockWidget@@QAE@PAVQGraphicsItem@@V?$QFlags@W4WindowType@Qt@@@@@Z @ 4 NONAME ; ClockWidget::ClockWidget(class QGraphicsItem *, class QFlags) + ?qt_metacast@ClockWidget@@UAEPAXPBD@Z @ 5 NONAME ; void * ClockWidget::qt_metacast(char const *) + ?updateTime@ClockWidget@@QAEXXZ @ 6 NONAME ; void ClockWidget::updateTime(void) + ?setClockType@ClockWidget@@QAEXABW4ClockType@1@@Z @ 7 NONAME ; void ClockWidget::setClockType(enum ClockWidget::ClockType const &) + ?metaObject@ClockWidget@@UBEPBUQMetaObject@@XZ @ 8 NONAME ; struct QMetaObject const * ClockWidget::metaObject(void) const + ?loadClockWidget@ClockWidget@@QAEXXZ @ 9 NONAME ; void ClockWidget::loadClockWidget(void) + ?trUtf8@ClockWidget@@SA?AVQString@@PBD0H@Z @ 10 NONAME ; class QString ClockWidget::trUtf8(char const *, char const *, int) + ?tr@ClockWidget@@SA?AVQString@@PBD0@Z @ 11 NONAME ; class QString ClockWidget::tr(char const *, char const *) + ??_EClockWidget@@UAE@I@Z @ 12 NONAME ; ClockWidget::~ClockWidget(unsigned int) + ?trUtf8@ClockWidget@@SA?AVQString@@PBD0@Z @ 13 NONAME ; class QString ClockWidget::trUtf8(char const *, char const *) + ?getStaticMetaObject@ClockWidget@@SAABUQMetaObject@@XZ @ 14 NONAME ; struct QMetaObject const & ClockWidget::getStaticMetaObject(void) + ?qt_metacall@ClockWidget@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 15 NONAME ; int ClockWidget::qt_metacall(enum QMetaObject::Call, int, void * *) + ?clockType@ClockWidget@@QBE?AW4ClockType@1@XZ @ 16 NONAME ; enum ClockWidget::ClockType ClockWidget::clockType(void) const + ?updateClockWidget@ClockWidget@@AAEXXZ @ 17 NONAME ; void ClockWidget::updateClockWidget(void) + ?timeFormat@ClockWidget@@QBE?AW4TimeFormat@1@XZ @ 18 NONAME ; enum ClockWidget::TimeFormat ClockWidget::timeFormat(void) const + ?setTimeFormat@ClockWidget@@QAEXABW4TimeFormat@1@@Z @ 19 NONAME ; void ClockWidget::setTimeFormat(enum ClockWidget::TimeFormat const &) + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidgetimpl/clockwidgetimpl.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockwidget/clockwidgetimpl/clockwidgetimpl.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,61 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# programs, is protected by copyright controlled by Nokia. All +# rights are reserved. Copying, including reproducing, storing, +# adapting or translating, any or all of this material requires the +# prior written consent of Nokia. This material also contains +# confidential information which may not be disclosed to others +# without the prior written consent of Nokia. +# ============================================================================ +# +# Description: +# + +TEMPLATE = lib +TARGET = clockwidget +CONFIG += hb +DEFINES += CLOCKWIDGET_LIB + +win32{ +CONFIG(release, debug|release){ + TARGET = clockwidget + DESTDIR = ../release # for easy plugin loading +}else{ + TARGET = clockwidgetd + DESTDIR = ../debug # for easy plugin loading + } +} + +DEPENDPATH += ./inc \ + ./src + +INCLUDEPATH += ./inc + +SOURCES += \ + clockwidget.cpp \ + analogclockwidget.cpp \ + digitalclockwidget.cpp + +HEADERS += \ + clockwidgetdefines.h \ + clockwidget.h \ + analogclockwidget.h \ + digitalclockwidget.h + +symbian { + TARGET.UID3 = 0x2002E715 + TARGET.EPOCALLOWDLLDATA = 1 + TARGET.CAPABILITY = CAP_GENERAL_DLL + LIBS += -lbafl +} + +RESOURCES = clockwidgetimpl.qrc + +# End of file --Don't remove this diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidgetimpl/clockwidgetimpl.qrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockwidget/clockwidgetimpl/clockwidgetimpl.qrc Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,10 @@ + + + resource/analogclockwidget.widgetml + resource/analogclockwidget.css + resource/digitalclockwidget.widgetml + resource/digitalclockwidget.css + resource/digitalclockwidget_color.css + + + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidgetimpl/eabi/clockwidgetu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockwidget/clockwidgetimpl/eabi/clockwidgetu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,25 @@ +EXPORTS + _ZN11ClockWidget10updateTimeEv @ 1 NONAME + _ZN11ClockWidget11qt_metacallEN11QMetaObject4CallEiPPv @ 2 NONAME + _ZN11ClockWidget11qt_metacastEPKc @ 3 NONAME + _ZN11ClockWidget12setClockTypeERKNS_9ClockTypeE @ 4 NONAME + _ZN11ClockWidget15loadClockWidgetEv @ 5 NONAME + _ZN11ClockWidget16staticMetaObjectE @ 6 NONAME DATA 16 + _ZN11ClockWidget19getStaticMetaObjectEv @ 7 NONAME + _ZN11ClockWidgetC1EP13QGraphicsItem6QFlagsIN2Qt10WindowTypeEE @ 8 NONAME + _ZN11ClockWidgetC2EP13QGraphicsItem6QFlagsIN2Qt10WindowTypeEE @ 9 NONAME + _ZN11ClockWidgetD0Ev @ 10 NONAME + _ZN11ClockWidgetD1Ev @ 11 NONAME + _ZN11ClockWidgetD2Ev @ 12 NONAME + _ZNK11ClockWidget10metaObjectEv @ 13 NONAME + _ZNK11ClockWidget9clockTypeEv @ 14 NONAME + _ZTI11ClockWidget @ 15 NONAME + _ZTV11ClockWidget @ 16 NONAME + _ZThn16_N11ClockWidgetD0Ev @ 17 NONAME + _ZThn16_N11ClockWidgetD1Ev @ 18 NONAME + _ZThn8_N11ClockWidgetD0Ev @ 19 NONAME + _ZThn8_N11ClockWidgetD1Ev @ 20 NONAME + _ZN11ClockWidget13setTimeFormatERKNS_10TimeFormatE @ 21 NONAME + _ZN11ClockWidget17updateClockWidgetEv @ 22 NONAME + _ZNK11ClockWidget10timeFormatEv @ 23 NONAME + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidgetimpl/inc/analogclockwidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockwidget/clockwidgetimpl/inc/analogclockwidget.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,57 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Clock widget +* +*/ + +#ifndef ANALOGCLOCKWIDGET_H +#define ANALOGCLOCKWIDGET_H + +// User includes +#include +#include + +// Forward declarations +class HbIconItem; +class QTimer; + +class AnalogClockWidget : public HbWidget +{ + Q_OBJECT + +public: + AnalogClockWidget(QGraphicsItem *parent = 0); + virtual ~AnalogClockWidget(); + +public slots: + void tick(); + +protected: + void resizeEvent(QGraphicsSceneResizeEvent *event); + void polish(HbStyleParameters& params); + +private: + void updatePrimitives(); + +private: + QPointer mTimer; + QPointer mClockBackground; + QPointer mClockHourHand; + QPointer mClockMinuteHand; + QPointer mClockSecondHand; +}; + +#endif + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidgetimpl/inc/clockwidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockwidget/clockwidgetimpl/inc/clockwidget.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,74 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Clock widget +* +*/ + +#ifndef CLOCKWIDGET_H +#define CLOCKWIDGET_H + +// System includes +#include +#include +// User includes +#include "clockwidgetdefines.h" + +//Forward declarations + +class QGraphicsLinearLayout; +class AnalogClockWidget; +class DigitalClockWidget; + +class CLOCKWIDGET_EXPORT ClockWidget : public HbWidget +{ + Q_OBJECT + Q_PROPERTY(ClockType clockType READ clockType WRITE setClockType) + Q_PROPERTY(TimeFormat timeFormat READ timeFormat WRITE setTimeFormat) + +public: + enum ClockType + { + ClockTypeAnalog, + ClockTypeDigital + }; + enum TimeFormat + { + TimeFormat12Hrs, + TimeFormat24Hrs + }; + + ClockWidget(QGraphicsItem *parent = 0, Qt::WindowFlags flags = 0); + ~ClockWidget(); + ClockType clockType() const; + void setClockType(const ClockType &type); + void loadClockWidget(); + TimeFormat timeFormat() const; + void setTimeFormat(const TimeFormat &timeFormat); + +public slots: + void updateTime(); + +private: + void updateClockWidget(); +private: + ClockType mClockType; + TimeFormat mTimeFormat; + QPointer mAnalogClock; + QPointer mDigitalClock; + QGraphicsLinearLayout *mLayout; +}; + +#endif // CLOCKWIDGET_H + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidgetimpl/inc/clockwidgetdefines.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockwidget/clockwidgetimpl/inc/clockwidgetdefines.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,32 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: The dll header file. +* +*/ + + +#ifndef CLOCKWIDGETDEFINES_H +#define CLOCKWIDGETDEFINES_H + +#include + +#ifdef CLOCKWIDGET_LIB +# define CLOCKWIDGET_EXPORT Q_DECL_EXPORT +#else +# define CLOCKWIDGET_EXPORT Q_DECL_IMPORT +#endif + +#endif // CLOCKWIDGETDEFINES_H + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidgetimpl/inc/digitalclockwidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockwidget/clockwidgetimpl/inc/digitalclockwidget.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,64 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: DigitalClockWidget +* +*/ + +#ifndef DIGITALCLOCKWIDGET_H +#define DIGITALCLOCKWIDGET_H + +// System includes +#include +#include + +// User includes +#include "clockwidgetdefines.h" + +// Forward declarations +class QTimer; +class HbLabel; +class HbTextItem; + +class DigitalClockWidget : public HbWidget +{ + Q_OBJECT + +public: + DigitalClockWidget(bool useAmPm = true, QGraphicsItem *parent = 0); + ~DigitalClockWidget(); + +signals: + void clockTapped(); + +public slots: + void tick(); + void setAmPm(bool useAmPm); + +protected: + void resizeEvent(QGraphicsSceneResizeEvent *event); + +private: + void createPrimitives(); + +public: + void updatePrimitives(); + +private: + QPointer mTimer; + QPointer mClockLabel; + QPointer mAmPmLabel; + bool mUseAmPm; +}; + +#endif // DIGITALCLOCKWIDGET_H diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidgetimpl/resource/analogclockwidget.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockwidget/clockwidgetimpl/resource/analogclockwidget.css Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,23 @@ +AnalogClockWidget { + layout: layout_1; +} + +AnalogClockWidget::clock_background { + size-policy: expanding expanding; + zvalue: 0; +} + +AnalogClockWidget::clock_minute_hand { + size-policy:expanding expanding; + zvalue: 1; +} + +AnalogClockWidget::clock_hour_hand { + size-policy:expanding expanding; + zvalue: 2; +} + +AnalogClockWidget::clock_second_hand { + size-policy:expanding expanding; + zvalue: 3; +} diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidgetimpl/resource/analogclockwidget.widgetml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockwidget/clockwidgetimpl/resource/analogclockwidget.widgetml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidgetimpl/resource/digitalclockwidget.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockwidget/clockwidgetimpl/resource/digitalclockwidget.css Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,25 @@ +DigitalClockWidget { + layout: digital_clock_layout; +} + +DigitalClockWidget::clockLabel { + size-policy: expanding expanding; + text-align: center center; + font-variant:primary; + text-height: 14.7un; +} + +DigitalClockWidget::clockLabel:landscape { + text-height: 9.8un; +} + +DigitalClockWidget::amPmLabel { + size-policy: expanding expanding; + text-align: left; + font-variant:primary; + bottom: -var(hb-param-margin-gene-middle-vertical); + text-height: var(hb-param-text-height-primary); +} +DigitalClockWidget::amPmLabel:landscape { + font-variant:secondary; +} \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidgetimpl/resource/digitalclockwidget.widgetml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockwidget/clockwidgetimpl/resource/digitalclockwidget.widgetml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,11 @@ + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidgetimpl/resource/digitalclockwidget_color.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockwidget/clockwidgetimpl/resource/digitalclockwidget_color.css Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,9 @@ + + +DigitalClockWidget::clockLabel{ + color: var(qtc_list_item_content_normal); +} + +DigitalClockWidget::amPmLabel{ + color: var(qtc_list_item_content_normal); +} \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidgetimpl/src/analogclockwidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockwidget/clockwidgetimpl/src/analogclockwidget.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,135 @@ +/* +* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: AnalogClockWidget +* +*/ + +// System includes +#include +#include +#include +#include + +// User includes +#include "analogclockwidget.h" + +// Constants +const int clockUpdateInterval (1000); // msec + +/*! + \class AnalogClockWidget + + This class implements the analogclock widget which gets displayed + in the clockmainview when the clocktype is set to analog type. +*/ + +/*! + Constructor. + \param parent The parent of type QGraphicsItem. +*/ +AnalogClockWidget::AnalogClockWidget(QGraphicsItem *parent) + : HbWidget(parent) +{ + bool result = HbStyleLoader::registerFilePath(":/resource/analogclockwidget.widgetml"); + result = HbStyleLoader::registerFilePath(":/resource/analogclockwidget.css"); + + updatePrimitives(); + mTimer = new QTimer(this); + connect(mTimer, SIGNAL(timeout()), SLOT(tick())); + mTimer->start(clockUpdateInterval); +} + +/*! + Destructor. + */ +AnalogClockWidget::~AnalogClockWidget() +{ + mTimer->stop(); + HbStyleLoader::unregisterFilePath(":/resource"); +} + +/*! + Handles resize event from HbWidget + */ +void AnalogClockWidget::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + QGraphicsWidget::resizeEvent(event); + updatePrimitives(); +} + +/*! + @copydoc HbWidget::updatePrimitives() + */ +void AnalogClockWidget::updatePrimitives() +{ + if (!mClockBackground) { + mClockBackground = new HbIconItem(QLatin1String("qtg_graf_clock_day_bg"), this); + HbStyle::setItemName(mClockBackground, QLatin1String("clock_background")); + } + + // Calculate angles for clock hands. + QTime time = QTime::currentTime(); + qreal s = 6 * time.second(); + qreal m = 6 * (time.minute() + s/360); + qreal h = 30 * ((time.hour() % 12) + m/360); + + if (!mClockHourHand) { + mClockHourHand = new HbIconItem(QLatin1String("qtg_graf_clock_day_hour"), this); + HbStyle::setItemName(mClockHourHand, QLatin1String("clock_hour_hand")); + } + + int x = mClockHourHand->geometry().width()/2; + int y = mClockHourHand->geometry().height()/2; + mClockHourHand->setTransform(QTransform().translate(x, y).rotate(h).translate(-x, -y)); + + if (!mClockMinuteHand) { + mClockMinuteHand = new HbIconItem(QLatin1String("qtg_graf_clock_day_min"), this); + HbStyle::setItemName(mClockMinuteHand, QLatin1String("clock_minute_hand")); + } + + x = mClockMinuteHand->geometry().width()/2; + y = mClockMinuteHand->geometry().height()/2; + mClockMinuteHand->setTransform(QTransform().translate(x, y).rotate(m).translate(-x, -y)); + + + if (!mClockSecondHand) { + mClockSecondHand = new HbIconItem(QLatin1String("qtg_graf_clock_day_sec"), this); + HbStyle::setItemName(mClockSecondHand, QLatin1String("clock_second_hand")); + } + + x = mClockSecondHand->geometry().width()/2; + y = mClockSecondHand->geometry().height()/2; + mClockSecondHand->setTransform(QTransform().translate(x, y).rotate(s).translate(-x, -y)); + +} + +/*! + Updates clock visualization according to current time + */ +void AnalogClockWidget::tick() +{ + updatePrimitives(); + update(); +} + +/*! + Handles polish event + */ +void AnalogClockWidget::polish( HbStyleParameters& params ) +{ + HbWidget::polish(params); + updatePrimitives(); +} + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidgetimpl/src/clockwidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockwidget/clockwidgetimpl/src/clockwidget.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,146 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Clockwidget +* +*/ + +// System includes +#include + +// User includes +#include "clockwidget.h" +#include "analogclockwidget.h" +#include "digitalclockwidget.h" + +/*! + \class ClockWidget + + This is the generic wrapper for the clockwidget which manages analog and ditial clockwidgets. + */ + +/*! + Constructor. + */ +ClockWidget::ClockWidget(QGraphicsItem *parent, Qt::WindowFlags flags) + : HbWidget(parent, flags), + mClockType(ClockTypeDigital) +{ + loadClockWidget(); +} + +/*! + Destructor. +*/ +ClockWidget::~ClockWidget() +{ + +} + +/*! + Returns the clock type. +*/ +ClockWidget::ClockType ClockWidget::clockType() const +{ + return mClockType; +} + +/*! + Sets the clock type; +*/ +void ClockWidget::setClockType(const ClockType &type) +{ + if (type == ClockTypeAnalog) { + if(type != mClockType){ + mClockType = ClockTypeAnalog; + updateClockWidget(); + } + } else { + if(type != mClockType){ + mClockType = ClockTypeDigital; + updateClockWidget(); + } + } +} + +/*! + Updates the clock time with every second +*/ +void ClockWidget::updateTime() +{ + if (mClockType == ClockTypeAnalog) { + mAnalogClock->tick(); + } else { + mDigitalClock->updatePrimitives(); + } +} + +/*! + Constructs the clockwidget based upon its type. +*/ +void ClockWidget::loadClockWidget() +{ + mLayout = new QGraphicsLinearLayout(Qt::Vertical); + mLayout->setContentsMargins(0,0,0,0); + + if (mClockType == ClockTypeAnalog) { + mAnalogClock = new AnalogClockWidget(this); + mLayout->addItem(mAnalogClock); + } else { + bool useAmPm = false; + mDigitalClock = new DigitalClockWidget(useAmPm, this); + mLayout->addItem(mDigitalClock); + } + setLayout(mLayout); +} + +/*! + Constructs the clockwidget based upon its type. +*/ +void ClockWidget::updateClockWidget() +{ + if (mClockType == ClockTypeAnalog) { + mLayout->removeItem(mDigitalClock); + delete mDigitalClock; + if (!mAnalogClock) { + mAnalogClock = new AnalogClockWidget(this); + } + mLayout->addItem(mAnalogClock); + } else { + mLayout->removeItem(mAnalogClock); + delete mAnalogClock; + if(!mDigitalClock){ + bool useAmPm = false; // find out this fronm the settings utility + mDigitalClock = new DigitalClockWidget(useAmPm, this); + } + mLayout->addItem(mDigitalClock); + } +} + +ClockWidget::TimeFormat ClockWidget::timeFormat() const +{ + return mTimeFormat; +} + +void ClockWidget::setTimeFormat(const TimeFormat &timeFormat) +{ + if(mDigitalClock){ + mTimeFormat = timeFormat; + if (timeFormat == ClockWidget::TimeFormat12Hrs) { + mDigitalClock->setAmPm(true); + } else { + mDigitalClock->setAmPm(false); + } + } +} +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidgetimpl/src/digitalclockwidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockwidget/clockwidgetimpl/src/digitalclockwidget.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,157 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: DigitalClockWidget +* +*/ + +// System includes +#include +#include +#include +#include +#include +#include +#include +#include + +// User includes +#include "digitalclockwidget.h" + +// Constants +const int clockUpdateInterval (60000); // msec + +/*! + \class DigitalClockWidget + + This class implements the digitalclock widget which gets displayed + in the clockmainview when the clocktype is set to digital type. +*/ + +/*! + Constructor. + \param useAmPm bool for setting 12 hour format + \param parent The parent of type QGraphicsItem. +*/ +DigitalClockWidget::DigitalClockWidget(bool useAmPm, QGraphicsItem *parent) + : HbWidget(parent), + mUseAmPm(useAmPm) +{ + bool result = HbStyleLoader::registerFilePath(":/resource/digitalclockwidget.widgetml"); + result = HbStyleLoader::registerFilePath(":/resource/digitalclockwidget.css"); + result = HbStyleLoader::registerFilePath(":/resource/digitalclockwidget_color.css"); + + createPrimitives(); + + mTimer = new QTimer(this); + connect(mTimer, SIGNAL(timeout()), SLOT(tick())); + + QTime time = QTime::currentTime(); + int initialIntervalTime = (clockUpdateInterval - ( time.msec() + (time.second() * 1000))); + mTimer->start(initialIntervalTime); + +} + +/*! + Destructor. +*/ +DigitalClockWidget::~DigitalClockWidget() +{ + mTimer->stop(); + HbStyleLoader::unregisterFilePath(":/resource/digitalclockwidget.widgetml"); + HbStyleLoader::unregisterFilePath(":/resource/digitalclockwidget.css"); + HbStyleLoader::unregisterFilePath(":/resource/digitalclockwidget_color.css"); + +} + +/*! + Updates clock visualization according to current time + */ +void DigitalClockWidget::tick() +{ + mTimer->setInterval(clockUpdateInterval); + updatePrimitives(); + update(); +} + +/*! + Toggles time format + */ +void DigitalClockWidget::setAmPm(bool useAmPm) +{ + + bool old = mUseAmPm; + mUseAmPm = useAmPm; + + if (mUseAmPm != old) { // change am/pm label + QTime time = QTime::currentTime(); + QString timeString; + if (mUseAmPm) { + mAmPmLabel->setText(time.toString("ap")); // set am/pm label + } else { + mAmPmLabel->setText(""); // set am/pm label as null + } + } + +} + +/*! + @copydoc HbWidget::resizeEvent() + */ +void DigitalClockWidget::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + HbWidget::resizeEvent(event); +} + +/*! + Creates all widget primitives. + */ +void DigitalClockWidget::createPrimitives() +{ + mClockLabel = new HbTextItem(this); + mClockLabel->setTextWrapping( Hb::TextNoWrap ); + HbStyle::setItemName(mClockLabel, QLatin1String("clockLabel")); + + mAmPmLabel = new HbTextItem(this); + mClockLabel->setTextWrapping( Hb::TextNoWrap ); + HbStyle::setItemName(mAmPmLabel, QLatin1String("amPmLabel")); +} + +/*! + @copydoc HbWidget::updatePrimitives() + updates all widget primitives + */ +void DigitalClockWidget::updatePrimitives() +{ + + QTime time = QTime::currentTime(); + QString timeString; + + if (mUseAmPm) { + timeString = time.toString("hh:ap"); // covert time in 12 hours format + timeString = timeString.section(":", 0, 0); // it would remove :ap section from timeString + mAmPmLabel->setText(time.toString("ap")); // set am/pm label + } else { + mAmPmLabel->setText(""); // set am/pm label as null + timeString = time.toString("hh"); // append hour part + } + + int index(1); + HbExtendedLocale locale; + QChar timeSeparator(locale.timeSeparator(index)) ; + timeString.append(timeSeparator); // append time separator + timeString.append(time.toString("mm")); //append minute part + + mClockLabel->setText(timeString); + +} diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidgetplugin/clockwidgetplugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockwidget/clockwidgetplugin/clockwidgetplugin.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,38 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Clockwidget custom document loader plugin. +* +*/ + +#ifndef CLOCKWIDGETDPLUGIN_H +#define CLOCKWIDGETDPLUGIN_H + +// System includes +#include +#include + + +class ClockWidgetPlugin : public HbDocumentLoaderPlugin +{ + +private: + virtual QObject *createObject(const QString &type, const QString &name); + virtual QList supportedObjects(); + +}; +Q_EXPORT_PLUGIN(ClockWidgetPlugin) + +#endif // CLOCKWIDGETDPLUGIN_H + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidgetplugin/clockwidgetplugin.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockwidget/clockwidgetplugin/clockwidgetplugin.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,67 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: This is the project specification file for the +# clockwidgetplugin. +# + +TEMPLATE = lib +TARGET = clockwidgetplugin + +win32{ +CONFIG(release, debug|release){ + TARGET = clockwidgetplugin + } else { + TARGET = clockwidgetplugind + } +} + +CONFIG += hb plugin + +win32{ +CONFIG(release, debug|release){ + DESTDIR = ../release # for easy plugin loading + LIBS += -L../release -lclockwidget + } else { + DESTDIR = ../debug # for easy plugin loading + LIBS += -L../debug -lclockwidgetd + } +} + +SOURCES += \ + main.cpp + +INCLUDEPATH += \ + ../clockwidgetimpl \ + ../clockwidgetimpl/inc + +symbian: { + TARGET.UID3 = 0x2002E716 + TARGET.EPOCALLOWDLLDATA=1 + TARGET.CAPABILITY = CAP_GENERAL_DLL + + LIBS += \ + -lclockwidget.dll + + pluginstub.sources = clockwidgetplugin.dll + pluginstub.path = /resource/plugins + DEPLOYMENT += pluginstub + DESTDIR = $$HB_PLUGINS_DIR +} + +!local { + target.path = $$HB_PLUGINS_DIR + INSTALLS += target +} + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/clockwidgetplugin/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockwidget/clockwidgetplugin/main.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,55 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Clock widget +* +*/ + +// User includes +#include "clockwidgetplugin.h" +#include "clockwidget.h" + +/*! + \class ClockWidgetPlugin + + This class is a wrapper plug-in DLL that references the custom widget DLLs that need to be part of the widget package. +*/ + + +/*! + Creates an instance of each of the types of custom widget supported in this plug-in. + The code uses the parameter type to control which type of object must be created. + It also sets the created object's name +*/ +QObject *ClockWidgetPlugin::createObject(const QString &type, const QString &name) +{ + if (type == ClockWidget::staticMetaObject.className()) { + QObject *object = new ClockWidget(); + object->setObjectName(name); + return object; + } + return 0; +} + +/*! + Get a QMetaObject for each custom widget and add it to the list of supported objects. + A QMetaObject pointer must be added for every custom widget that is created by the plug-in. +*/ +QList ClockWidgetPlugin::supportedObjects() +{ + QList list; + list.append( &ClockWidget::staticMetaObject ); + return list; +} + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/inc/analogclock.h --- a/clock/clockui/clockwidget/inc/analogclock.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* -*/ - -// analogclock.h - -#ifndef ANALOGCLOCK_H -#define ANALOGCLOCK_H - -#include - -#include -#include - -class QGraphicsWidget; -class QStyleOptionGraphicsItem; -class QPainter; -class HbIconItem; -class HbStackedLayout; - -class AnalogClock : public HbWidget -{ - Q_OBJECT - -public: - AnalogClock(QGraphicsWidget *parent = 0); - ~AnalogClock(); - -public: - void showNext(); - void showPrev(); - -public slots: - void updateDisplay(); - -protected: - void paint(QPainter *painter, - const QStyleOptionGraphicsItem *option, - QWidget *widget = 0); - -private: - void constructImages(); - -private slots: - void widget_hidden(const HbEffect::EffectStatus &status); - -private: - QString mFaceName; - QString mHourName; - QString mMinuteName; - - HbIconItem *mClockFace; - HbIconItem *mHourHand; - HbIconItem *mMinuteHand; - HbStackedLayout* mParentLayout; - - bool mIsDay; - bool mFirstDraw; - int mCurrentClock; -}; - -#endif // ANALOGCLOCK_P_H - -// End of file diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/inc/clockwidgetdefines.h --- a/clock/clockui/clockwidget/inc/clockwidgetdefines.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). - * All rights reserved. - * This component and the accompanying materials are made available - * under the terms of "Eclipse Public License v1.0" - * which accompanies this distribution, and is available - * at the URL "http://www.eclipse.org/legal/epl-v10.html". - * - * Initial Contributors: - * Nokia Corporation - initial contribution. - * - * Contributors: - * - * Description: - * Common definition file for clockwidget component. - * - */ - -#ifndef CLOCKWIDGETDEFINES_H -#define CLOCKWIDGETDEFINES_H - -// System includes -#include - -#ifdef CLOCKWIDGET_LIB -# define CLOCKWIDGET_EXPORT Q_DECL_EXPORT -#else -# define CLOCKWIDGET_EXPORT Q_DECL_IMPORT -#endif - -#endif // CLOCKWIDGETDEFINES_H - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/inc/digitalclock.h --- a/clock/clockui/clockwidget/inc/digitalclock.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* -*/ - -// digitalclock.h - -#ifndef DIGITALCLOCK_H -#define DIGITALCLOCK_H - -#include - -#include -#include - -class QGraphicsLinearLayout; -class QGraphicsWidget; -class HbIconItem; -class HbLabel; - -class DigitalClock : public HbWidget -{ - Q_OBJECT - -public: - DigitalClock(QGraphicsWidget *parent = 0); - ~DigitalClock(); - -public: - void updateDisplay(); - -public slots: - void fadeBackIn(const HbEffect::EffectStatus &status); - -private: - void constructImages(); - -private: - QGraphicsLinearLayout *mDigitalClockLayout; - QGraphicsLinearLayout *mWidgetLayout; - QGraphicsWidget *mDummyWidget; - - HbIconItem *mPositionOne; - HbIconItem *mPositionTwo; - HbIconItem *mPositionThree; - HbIconItem *mPositionFour; - HbIconItem *mSeperator; - HbLabel *mAmPmLabel; - - bool m24HourFormat; -}; - -#endif // DIGITALCLOCK_H - -// End of file diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/inc/skinnableclock.h --- a/clock/clockui/clockwidget/inc/skinnableclock.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). - * All rights reserved. - * This component and the accompanying materials are made available - * under the terms of "Eclipse Public License v1.0" - * which accompanies this distribution, and is available - * at the URL "http://www.eclipse.org/legal/epl-v10.html". - * - * Initial Contributors: - * Nokia Corporation - initial contribution. - * - * Contributors: - * - * Description: - * - */ - -#ifndef SKINNABLECLOCK_H -#define SKINNABLECLOCK_H - -#include -#include -#include - -#include "clockwidgetdefines.h" - -class QTimer; -class QEvent; -class QGraphicsLinearLayout; -class AnalogClock; -class DigitalClock; -class TimezoneClient; -class SettingsUtility; - -class CLOCKWIDGET_EXPORT SkinnableClock : public HbWidget -{ - Q_OBJECT - -public: - SkinnableClock(QGraphicsItem *parent = 0); - ~SkinnableClock(); - -public: - bool clockTypeAnalog(); - bool clockFormat24(); - -public slots: - void updateDisplay(bool newTimer = true); - void updateClockType(); - void finishChangeType(const HbEffect::EffectStatus &status); - -protected: -// bool sceneEvent(QEvent *event); - void paint(QPainter *painter, - const QStyleOptionGraphicsItem *option, - QWidget *widget = 0); - -private: - void setClockTypeAnalog(bool analog); - void startChangeType(); - -private: - QTimer *mTickTimer; - QGraphicsLinearLayout *mLayout; - - AnalogClock *mAnalogClock; - DigitalClock *mDigitalClock; - TimezoneClient *mClient; - SettingsUtility *mSettingsUtility; - - bool mAnalog; - bool mClockFormat24; - bool mUpdateNeeded; -}; - -#endif // SKINNABLECLOCK_H - -// End of file diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/src/analogclock.cpp --- a/clock/clockui/clockwidget/src/analogclock.cpp Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,241 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* -*/ - -// analogclock.cpp - -#include -#include -#include -#include -#include -#include -#include - -#include "analogclock.h" - -const QString KPrefix(":/clock/"); -const QString KUnderScore("_"); -const QString KFaceDay(":/clock/analog_face_day"); -const QString KHourDay(":/clock/hour_hand_day"); -const QString KMinDay(":/clock/minute_hand_day"); -const QString KFaceNight("analog_face_night"); -const QString KHourNight("hour_hand_night"); -const QString KMinNight("minute_hand_night"); - -AnalogClock::AnalogClock(QGraphicsWidget *parent) -:HbWidget(parent), - mIsDay(true), - mFirstDraw(true), - mCurrentClock(0) -{ - // Add the required effects. - HbEffect::add(this, - QString(":/clock/hide_widget.fxml"), - "hide_widget"); - - // Construct the images here. - constructImages(); - - // A single shot timer after which the hands are updated to show the - // correct time. - // TODO: QTimer::singleShot(500, this, SLOT(updateDisplay())); -} - -AnalogClock::~AnalogClock() -{ - // No implementation yet. -} - -void AnalogClock::showPrev() -{ - mCurrentClock--; - if (mCurrentClock < 0) { - mCurrentClock = 3; - } - // Start the effect. - HbEffect::start(this, "hide_widget", this, "widget_hidden"); -} - -void AnalogClock::showNext() -{ - mCurrentClock++; - mCurrentClock = mCurrentClock % 4; - - // Start the effect. - HbEffect::start(this, "hide_widget", this, "widget_hidden"); -} - -void AnalogClock::updateDisplay() -{ - // Take the current time. - bool changeClock = false; - QTime timeNow = QTime::currentTime(); - int hourNow = timeNow.hour(); - - if (17 < hourNow || 6 > hourNow) { - if (mIsDay) { - // It was previously day. We need to change the clock - changeClock = true; - } - mIsDay = false; - } else { - if (!mIsDay) { - // It was previously night. We need to change the clock - changeClock = true; - } - mIsDay = true; - } - - if (changeClock) { - if (mIsDay) { - mClockFace->setIconName(mFaceName); - mHourHand->setIconName(mHourName); - mMinuteHand->setIconName(mMinuteName); - } else { - mClockFace->setIconName(mFaceName); - mHourHand->setIconName(mHourName); - mMinuteHand->setIconName(mMinuteName); - } - } - - // Calculate the rotation angle for hour hand. - qreal hourAngle = 30.0*((timeNow.hour()+timeNow.minute()/60.0)); - hourAngle += 270; - - // Rotate the hour hand. - mHourHand->setTransform( - QTransform().translate(mHourHand->iconItemSize().width()/2, - mHourHand->iconItemSize().height()/2).rotate(hourAngle) - .translate(-mHourHand->iconItemSize().width()/2, - -mHourHand->iconItemSize().height()/2)); - - // Rotate the minute hand. - mMinuteHand->setTransform( - QTransform().translate(mMinuteHand->iconItemSize().width()/2, - mMinuteHand->iconItemSize().height()/2) - .rotate(6.0*(timeNow.minute()+timeNow.second()/60.0)) - .translate(-mMinuteHand->iconItemSize().width()/2, - -mMinuteHand->iconItemSize().height()/2)); -} - -void AnalogClock::paint(QPainter *painter, - const QStyleOptionGraphicsItem *option, - QWidget *widget) -{ - Q_UNUSED(painter) - Q_UNUSED(option) - Q_UNUSED(widget) - - if (mFirstDraw) { - mFirstDraw = false; - - QTime timeNow = QTime::currentTime(); - int hourNow = timeNow.hour(); - - // Calculate the rotation angle for hour hand. - qreal hourAngle = 30.0 * ((timeNow.hour() + timeNow.minute() / 60.0)); - hourAngle += 270; - - // Rotate the hour hand. - mHourHand->setTransform( - QTransform().translate(mHourHand->iconItemSize().width()/2, - mHourHand->iconItemSize().height()/2).rotate(hourAngle) - .translate(-mHourHand->iconItemSize().width()/2, - -mHourHand->iconItemSize().height()/2)); - - // Rotate the minute hand. - mMinuteHand->setTransform( - QTransform().translate(mMinuteHand->iconItemSize().width()/2, - mMinuteHand->iconItemSize().height()/2) - .rotate(6.0*(timeNow.minute()+timeNow.second()/60.0)) - .translate(-mMinuteHand->iconItemSize().width()/2, - -mMinuteHand->iconItemSize().height()/2)); - - } -} - -void AnalogClock::constructImages() -{ - mFaceName.append(KFaceDay); - mHourName.append(KHourDay); - mMinuteName.append(KMinDay); - - mParentLayout = new HbStackedLayout(this); - - mClockFace = new HbIconItem(mFaceName, this); - mHourHand = new HbIconItem(mHourName, this); - mMinuteHand = new HbIconItem(mMinuteName, this); - - mParentLayout->addItem(mClockFace); - mParentLayout->addItem(mHourHand); - mParentLayout->addItem(mMinuteHand); - - setLayout(mParentLayout); -} - -void AnalogClock::widget_hidden(const HbEffect::EffectStatus &status) -{ - Q_UNUSED(status) - - QString clockNum; - clockNum = clockNum.setNum(mCurrentClock); - - mFaceName.clear(); - mHourName.clear(); - mMinuteName.clear(); - - if (mIsDay) { - mFaceName.append(KPrefix); - mFaceName.append(clockNum); - mFaceName.append(KUnderScore); - mFaceName.append(KFaceDay); - - mHourName.append(KPrefix); - mHourName.append(clockNum); - mHourName.append(KUnderScore); - mHourName.append(KHourDay); - - mMinuteName.append(KPrefix); - mMinuteName.append(clockNum); - mMinuteName.append(KUnderScore); - mMinuteName.append(KMinDay); - } else { - mFaceName.append(KPrefix); - mFaceName.append(clockNum); - mFaceName.append(KUnderScore); - mFaceName.append(KFaceNight); - - mHourName.append(KPrefix); - mHourName.append(clockNum); - mHourName.append(KUnderScore); - mHourName.append(KHourNight); - - mMinuteName.append(KPrefix); - mMinuteName.append(clockNum); - mMinuteName.append(KUnderScore); - mMinuteName.append(KMinNight); - } - - mClockFace->setIconName(mFaceName); - mHourHand->setIconName(mHourName); - mMinuteHand->setIconName(mMinuteName); - - HbEffect::add(this, QString(":/clock/show_widget.fxml"), "show_widget"); - HbEffect::start(this, "show_widget"); -} - -// End of file diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/src/digitalclock.cpp --- a/clock/clockui/clockwidget/src/digitalclock.cpp Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,273 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* -*/ - -// digitalclock.cpp - -#include -#include -#include -#include - -#include -#include -#include - -#include "digitalclock.h" - -DigitalClock::DigitalClock(QGraphicsWidget *parent) -:HbWidget(parent), -m24HourFormat(false) -{ - constructImages(); -} - -DigitalClock::~DigitalClock() -{ - // No implementation yet. -} - -void DigitalClock::updateDisplay() -{ - QTime currentTime = QTime::currentTime(); - int currentHour, currentMin; - if (!m24HourFormat && currentTime.hour() > 12) { - currentHour = currentTime.hour() % 12; - } else { - currentHour = currentTime.hour(); - } - currentMin = currentTime.minute(); - - int numAt1, numAt2, numAt3, numAt4; - numAt1 = currentHour / 10; - numAt2 = currentHour % 10; - numAt3 = currentMin / 10; - numAt4 = currentMin % 10; - - // The first digit. - if (m24HourFormat) { - switch (numAt1) { - case 0: - mPositionOne->setIconName(":/clock/digit_zero"); - break; - case 1: - mPositionOne->setIconName(":/clock/digit_one"); - break; - case 2: - mPositionOne->setIconName(":/clock/digit_two"); - break; - default: - break; - } - } else { - switch (numAt1) { - case 0: - mPositionOne->setIconName(":/clock/digit_zero"); - break; - case 1: - mPositionOne->setIconName(":/clock/digit_one"); - break; - default: - break; - } - } - - // The second digit. - switch(numAt2) { - case 0: - mPositionTwo->setIconName(":/clock/digit_zero"); - break; - case 1: - mPositionTwo->setIconName(":/clock/digit_one"); - break; - case 2: - mPositionTwo->setIconName(":/clock/digit_two"); - break; - case 3: - mPositionTwo->setIconName(":/clock/digit_three"); - break; - case 4: - mPositionTwo->setIconName(":/clock/digit_four"); - break; - case 5: - mPositionTwo->setIconName(":/clock/digit_five"); - break; - case 6: - mPositionTwo->setIconName(":/clock/digit_six"); - break; - case 7: - mPositionTwo->setIconName(":/clock/digit_seven"); - break; - case 8: - mPositionTwo->setIconName(":/clock/digit_eight"); - break; - case 9: - mPositionTwo->setIconName(":/clock/digit_nine"); - break; - default: - break; - } - - // The separator. - mSeperator->setIconName(":/clock/sep_colon"); - // Start the blinking effect. - HbEffect::start(mSeperator, "fade_out", this, "fadeBackIn"); - - // The third digit. - switch (numAt3) { - case 0: - mPositionThree->setIconName(":/clock/digit_zero"); - break; - case 1: - mPositionThree->setIconName(":/clock/digit_one"); - break; - case 2: - mPositionThree->setIconName(":/clock/digit_two"); - break; - case 3: - mPositionThree->setIconName(":/clock/digit_three"); - break; - case 4: - mPositionThree->setIconName(":/clock/digit_four"); - break; - case 5: - mPositionThree->setIconName(":/clock/digit_five"); - break; - case 6: - mPositionThree->setIconName(":/clock/digit_six"); - break; - case 7: - mPositionThree->setIconName(":/clock/digit_seven"); - break; - case 8: - mPositionThree->setIconName(":/clock/digit_eight"); - break; - case 9: - mPositionThree->setIconName(":/clock/digit_nine"); - break; - default: - break; - } - - // The fourth digit. - switch (numAt4) { - case 0: - mPositionFour->setIconName(":/clock/digit_zero"); - break; - case 1: - mPositionFour->setIconName(":/clock/digit_one"); - break; - case 2: - mPositionFour->setIconName(":/clock/digit_two"); - break; - case 3: - mPositionFour->setIconName(":/clock/digit_three"); - break; - case 4: - mPositionFour->setIconName(":/clock/digit_four"); - break; - case 5: - mPositionFour->setIconName(":/clock/digit_five"); - break; - case 6: - mPositionFour->setIconName(":/clock/digit_six"); - break; - case 7: - mPositionFour->setIconName(":/clock/digit_seven"); - break; - case 8: - mPositionFour->setIconName(":/clock/digit_eight"); - break; - case 9: - mPositionFour->setIconName(":/clock/digit_nine"); - break; - default: - break; - } - - if (!m24HourFormat) { - mAmPmLabel->setPlainText(currentTime.toString("ap")); - } else { - mAmPmLabel->setPlainText(("")); - } -} - -void DigitalClock::fadeBackIn(const HbEffect::EffectStatus &status) -{ - Q_UNUSED(status) - - HbEffect::start(mSeperator, "fade_in"); -} - -void DigitalClock::constructImages() -{ - mDummyWidget = new QGraphicsWidget(this); - mWidgetLayout = new QGraphicsLinearLayout(Qt::Vertical); - mDigitalClockLayout = - new QGraphicsLinearLayout(Qt::Horizontal, mDummyWidget); - - // The icon at the first position. - mPositionOne = new HbIconItem(QString(), mDummyWidget); - mPositionOne->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); - mDigitalClockLayout->addItem(mPositionOne); - - // The icon at the second position. - mPositionTwo = new HbIconItem(QString(), mDummyWidget); - mPositionTwo->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); - mDigitalClockLayout->addItem(mPositionTwo); - - // The icon for separator. - mSeperator = new HbIconItem(QString(), mDummyWidget); - mSeperator->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); - mDigitalClockLayout->addItem(mSeperator); - - // The icon at the third position. - mPositionThree = new HbIconItem(QString(), mDummyWidget); - mPositionThree->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); - mDigitalClockLayout->addItem(mPositionThree); - - // The icon at the fourth position. - mPositionFour = new HbIconItem(QString(), mDummyWidget); - mPositionFour->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); - mDigitalClockLayout->addItem(mPositionFour); - - mDummyWidget->setLayout(mDigitalClockLayout); - - mAmPmLabel = new HbLabel((""), this); - //mAmPmLabel->setLogicalFont(Hb::FontPrimarySmall); - mAmPmLabel->setAlignment(Qt::AlignRight); - - mWidgetLayout->addItem(mDummyWidget); - mWidgetLayout->addItem(mAmPmLabel); - - QGraphicsLinearLayout *layout = - new QGraphicsLinearLayout(Qt::Horizontal, this); - layout->addStretch(100); - layout->addItem(mWidgetLayout); - layout->addStretch(100); - - setLayout(layout); - - // Add the blinking effect to the separator. - HbEffect::add(mSeperator, - QString(":/clock/fade_out.fxml"), - "fade_out"); - HbEffect::add(mSeperator, - QString(":/clock/fade_in.fxml"), - "fade_in"); -} - -// End of file diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/clockwidget/src/skinnableclock.cpp --- a/clock/clockui/clockwidget/src/skinnableclock.cpp Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,242 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* -*/ - -// skinnableclock.cpp - -#include -#include -#include -#include - -#include "skinnableclock.h" -#include "analogclock.h" -#include "digitalclock.h" -#include "timezoneclient.h" -#include "settingsutility.h" - -SkinnableClock::SkinnableClock(QGraphicsItem *parent) -:HbWidget(parent), - mAnalogClock(0), - mDigitalClock(0), - mAnalog(true), - mClockFormat24(true), - mUpdateNeeded(true) -{ - // Enable the gestures for the widget and subscribe for "PAN" gestures. -/* QApplication::setAttribute(Qt::AA_EnableGestures); - grabGesture(Qt::PanGesture);*/ - - qDebug("clock: SkinnableClock::SkinnableClock() -->"); - - // Construct the settings utility. - mSettingsUtility = new SettingsUtility(this); - - qDebug("clock: SkinnableClock::SkinnableClock() - constructed settingsutility."); - - // Construct the layout and the widgets. - mLayout = new QGraphicsLinearLayout(Qt::Vertical, this); - mAnalogClock = new AnalogClock(this); - mDigitalClock = new DigitalClock(this); - - // Set the clock type according to the seetings. - // And construct the corresponding widget. - QStringList clockTypeList; - int typeIndex = mSettingsUtility->clockType(clockTypeList); - if (0 == typeIndex) { - setClockTypeAnalog(true); - } else { - setClockTypeAnalog(false); - } - - setLayout(mLayout); - - // Add the required effects. - HbEffect::add(mAnalogClock, - QString(":/clock/disappear.fxml"), - "disappear"); - HbEffect::add(mDigitalClock, - QString(":/clock/disappear.fxml"), - "disappear"); - HbEffect::add(mAnalogClock, - QString(":/clock/appear.fxml"), - "appear"); - HbEffect::add(mDigitalClock, - QString(":/clock/appear.fxml"), - "appear"); - - mClient = new TimezoneClient(this); - qDebug("clock: SkinnableClock::SkinnableClock() - constructed tzclient"); - - connect(mClient, SIGNAL(timechanged()), - this, SLOT(updateDisplay())); - connect(mClient, SIGNAL(timechanged()), - this, SLOT(updateClockType())); - - // Start a timer. - mTickTimer = new QTimer(this); - QObject::connect(mTickTimer, SIGNAL(timeout()), - this, SLOT(updateDisplay())); - // TODO: mTickTimer->start(60000 - 1000 * QTime::currentTime().second()); - mTickTimer->start(1000); - - qDebug("clock: SkinnableClock::SkinnableClock() <--"); -} - -SkinnableClock::~SkinnableClock() -{ - // No implementation yet. -} - - -bool SkinnableClock::clockTypeAnalog() -{ - return mAnalog; -} - -bool SkinnableClock::clockFormat24() -{ - return mClockFormat24; -} - -void SkinnableClock::updateDisplay(bool newTimer) -{ - if (newTimer) { - // Start the timer again for 1 minute. - // TODO: mTickTimer->start(60000 - 1000 * QTime::currentTime().second()); - mTickTimer->start(1000); - } - - if (mAnalog) { - mAnalogClock->updateDisplay(); - } else { - mDigitalClock->updateDisplay(); - } -} - -void SkinnableClock::updateClockType() -{ - // Update the clock type according to the seetings. - QStringList clockTypeList; - int typeIndex = mSettingsUtility->clockType(clockTypeList); - - if ((mAnalog && 1 == typeIndex) || (!mAnalog && 0 == typeIndex)) { - mUpdateNeeded = true; - mAnalog = !mAnalog; - mDigitalClock->hide(); - mAnalogClock->hide(); - } else { - mUpdateNeeded = false; - } -} - -/*bool SkinnableClock::sceneEvent(QEvent *event) -{ - if (event->type() == QEvent::GraphicsSceneGesture) { - QGraphicsSceneGestureEvent *gestureEvent = - static_cast(event); - if (const QGesture *gesture = gestureEvent->gesture(Qt::PanGesture)) { - const QPanningGesture *panningGesture = - static_cast(gesture); - - if (Qt::GestureFinished == gesture->state()) { - if (Qt::LeftDirection == panningGesture->direction()) { - if (mAnalog) { - mAnalogClock->showPrev(); - } - } else if (Qt::RightDirection == panningGesture->direction()) { - if (mAnalog) { - mAnalogClock->showNext(); - } - } else if (Qt::UpDirection == panningGesture->direction() || - Qt::DownDirection == panningGesture->direction()) { - startChangeType(); - } - event->accept(); - return true; - } - event->accept(); - return true; - } - } - return HbWidget::sceneEvent(event); -}*/ - -void SkinnableClock::paint(QPainter *painter, - const QStyleOptionGraphicsItem *option, - QWidget *widget) -{ - Q_UNUSED(painter) - Q_UNUSED(option) - Q_UNUSED(widget) - - if (mUpdateNeeded) { - setClockTypeAnalog(mAnalog); - mUpdateNeeded = !mUpdateNeeded; - } -} - -void SkinnableClock::setClockTypeAnalog(bool analog) -{ - if (analog) { - mDigitalClock->hide(); - mLayout->removeItem(mDigitalClock); - mAnalogClock->show(); - mLayout->addItem(mAnalogClock); - } else { - mAnalogClock->hide(); - mLayout->removeItem(mAnalogClock); - mDigitalClock->show(); - mLayout->addItem(mDigitalClock); - } - - mAnalog = analog; - - // Update the display. - updateDisplay(false); -} - -void SkinnableClock::startChangeType() -{ - if (mAnalog) { - HbEffect::start(mAnalogClock, - "disappear", - this, - "finishChangeType"); - } else { - HbEffect::start(mDigitalClock, - "disappear", - this, - "finishChangeType"); - } -} - -void SkinnableClock::finishChangeType(const HbEffect::EffectStatus &status) -{ - Q_UNUSED(status) - - setClockTypeAnalog(!mAnalog); - - if (mAnalog) { - HbEffect::start(mAnalogClock, - "appear"); - } else { - HbEffect::start(mDigitalClock, - "appear"); - } -} - -// End of file diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/eabi/clockalarmeditoru.def --- a/clock/clockui/eabi/clockalarmeditoru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -EXPORTS - _ZN16ClockAlarmEditor15showAlarmEditorEv @ 1 NONAME - _ZN16ClockAlarmEditorC1EiP15QGraphicsWidget @ 2 NONAME - _ZN16ClockAlarmEditorC2EiP15QGraphicsWidget @ 3 NONAME - _ZN16ClockAlarmEditorD0Ev @ 4 NONAME - _ZN16ClockAlarmEditorD1Ev @ 5 NONAME - _ZN16ClockAlarmEditorD2Ev @ 6 NONAME - _ZThn16_N16ClockAlarmEditorD0Ev @ 7 NONAME - _ZThn16_N16ClockAlarmEditorD1Ev @ 8 NONAME - _ZThn8_N16ClockAlarmEditorD0Ev @ 9 NONAME - _ZThn8_N16ClockAlarmEditorD1Ev @ 10 NONAME - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/eabi/clockappcontrolleru.def --- a/clock/clockui/eabi/clockappcontrolleru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -EXPORTS - _ZN18ClockAppControllerC1EP7QObject @ 1 NONAME - _ZN18ClockAppControllerC2EP7QObject @ 2 NONAME - _ZN18ClockAppControllerD0Ev @ 3 NONAME - _ZN18ClockAppControllerD1Ev @ 4 NONAME - _ZN18ClockAppControllerD2Ev @ 5 NONAME - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/eabi/clockcityselectionlistu.def --- a/clock/clockui/eabi/clockcityselectionlistu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -EXPORTS - _ZN22ClockCitySelectionList11qt_metacallEN11QMetaObject4CallEiPPv @ 1 NONAME - _ZN22ClockCitySelectionList11qt_metacastEPKc @ 2 NONAME - _ZN22ClockCitySelectionList12citySelectedE12LocationInfo @ 3 NONAME - _ZN22ClockCitySelectionList12showCityListEv @ 4 NONAME - _ZN22ClockCitySelectionList13closeCityListEv @ 5 NONAME - _ZN22ClockCitySelectionList16staticMetaObjectE @ 6 NONAME DATA 16 - _ZN22ClockCitySelectionList19getStaticMetaObjectEv @ 7 NONAME - _ZN22ClockCitySelectionListC1EP14TimezoneClientP7QObject @ 8 NONAME - _ZN22ClockCitySelectionListC1EP7QObject @ 9 NONAME - _ZN22ClockCitySelectionListC2EP14TimezoneClientP7QObject @ 10 NONAME - _ZN22ClockCitySelectionListC2EP7QObject @ 11 NONAME - _ZNK22ClockCitySelectionList10metaObjectEv @ 12 NONAME - _ZTI22ClockCitySelectionList @ 13 NONAME - _ZTV22ClockCitySelectionList @ 14 NONAME - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/eabi/clocksettingsviewu.def --- a/clock/clockui/eabi/clocksettingsviewu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -EXPORTS - _ZN17ClockSettingsView16loadSettingsViewEv @ 1 NONAME - _ZN17ClockSettingsViewC1EP7QObject @ 2 NONAME - _ZN17ClockSettingsViewC2EP7QObject @ 3 NONAME - _ZN17ClockSettingsViewD0Ev @ 4 NONAME - _ZN17ClockSettingsViewD1Ev @ 5 NONAME - _ZN17ClockSettingsViewD2Ev @ 6 NONAME - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/eabi/clockviewmanageru.def --- a/clock/clockui/eabi/clockviewmanageru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -EXPORTS - _ZN16ClockViewManager8showViewE10ClockViews @ 1 NONAME - _ZN16ClockViewManagerC1ER20ClockAppControllerIfP7QObject @ 2 NONAME - _ZN16ClockViewManagerC2ER20ClockAppControllerIfP7QObject @ 3 NONAME - _ZN16ClockViewManagerD0Ev @ 4 NONAME - _ZN16ClockViewManagerD1Ev @ 5 NONAME - _ZN16ClockViewManagerD2Ev @ 6 NONAME - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/eabi/clockviewsu.def --- a/clock/clockui/eabi/clockviewsu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ -EXPORTS - _ZN13ClockMainView9setupViewER20ClockAppControllerIfP14ClockDocLoader @ 1 NONAME - _ZN13ClockMainViewC1EP13QGraphicsItem @ 2 NONAME - _ZN13ClockMainViewC2EP13QGraphicsItem @ 3 NONAME - _ZN13ClockMainViewD0Ev @ 4 NONAME - _ZN13ClockMainViewD1Ev @ 5 NONAME - _ZN13ClockMainViewD2Ev @ 6 NONAME - _ZN14ClockWorldView9setupViewER20ClockAppControllerIfP14ClockDocLoader @ 7 NONAME - _ZN14ClockWorldViewC1EP13QGraphicsItem @ 8 NONAME - _ZN14ClockWorldViewC2EP13QGraphicsItem @ 9 NONAME - _ZN14ClockWorldViewD0Ev @ 10 NONAME - _ZN14ClockWorldViewD1Ev @ 11 NONAME - _ZN14ClockWorldViewD2Ev @ 12 NONAME - _ZThn16_N13ClockMainViewD0Ev @ 13 NONAME - _ZThn16_N13ClockMainViewD1Ev @ 14 NONAME - _ZThn16_N14ClockWorldViewD0Ev @ 15 NONAME - _ZThn16_N14ClockWorldViewD1Ev @ 16 NONAME - _ZThn8_N13ClockMainViewD0Ev @ 17 NONAME - _ZThn8_N13ClockMainViewD1Ev @ 18 NONAME - _ZThn8_N14ClockWorldViewD0Ev @ 19 NONAME - _ZThn8_N14ClockWorldViewD1Ev @ 20 NONAME - diff -r fd30d51f876b -r b6db4fd4947b clock/clockui/eabi/clockwidgetprotou.def --- a/clock/clockui/eabi/clockwidgetprotou.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -EXPORTS - _ZN14SkinnableClock11qt_metacallEN11QMetaObject4CallEiPPv @ 1 NONAME - _ZN14SkinnableClock11qt_metacastEPKc @ 2 NONAME - _ZN14SkinnableClock13clockFormat24Ev @ 3 NONAME - _ZN14SkinnableClock13updateDisplayEb @ 4 NONAME - _ZN14SkinnableClock15clockTypeAnalogEv @ 5 NONAME - _ZN14SkinnableClock15startChangeTypeEv @ 6 NONAME - _ZN14SkinnableClock15updateClockTypeEv @ 7 NONAME - _ZN14SkinnableClock16finishChangeTypeERKN8HbEffect12EffectStatusE @ 8 NONAME - _ZN14SkinnableClock16staticMetaObjectE @ 9 NONAME DATA 16 - _ZN14SkinnableClock18setClockTypeAnalogEb @ 10 NONAME - _ZN14SkinnableClock19getStaticMetaObjectEv @ 11 NONAME - _ZN14SkinnableClock5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 12 NONAME - _ZN14SkinnableClockC1EP13QGraphicsItem @ 13 NONAME - _ZN14SkinnableClockC2EP13QGraphicsItem @ 14 NONAME - _ZN14SkinnableClockD0Ev @ 15 NONAME - _ZN14SkinnableClockD1Ev @ 16 NONAME - _ZN14SkinnableClockD2Ev @ 17 NONAME - _ZNK14SkinnableClock10metaObjectEv @ 18 NONAME - _ZTI14SkinnableClock @ 19 NONAME - _ZTV14SkinnableClock @ 20 NONAME - _ZThn16_N14SkinnableClockD0Ev @ 21 NONAME - _ZThn16_N14SkinnableClockD1Ev @ 22 NONAME - _ZThn8_N14SkinnableClock5paintEP8QPainterPK24QStyleOptionGraphicsItemP7QWidget @ 23 NONAME - _ZThn8_N14SkinnableClockD0Ev @ 24 NONAME - _ZThn8_N14SkinnableClockD1Ev @ 25 NONAME - diff -r fd30d51f876b -r b6db4fd4947b clock/conf/CI_clockapp.confml Binary file clock/conf/CI_clockapp.confml has changed diff -r fd30d51f876b -r b6db4fd4947b clock/conf/clockapp.confml Binary file clock/conf/clockapp.confml has changed diff -r fd30d51f876b -r b6db4fd4947b clock/conf/clockapp_101F874D.crml Binary file clock/conf/clockapp_101F874D.crml has changed diff -r fd30d51f876b -r b6db4fd4947b clock/conf/clockapp_101F8876.crml Binary file clock/conf/clockapp_101F8876.crml has changed diff -r fd30d51f876b -r b6db4fd4947b clock/data/alarm/qtg_test_alarm.svg --- a/clock/data/alarm/qtg_test_alarm.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/alarm/qtg_test_noalarm.svg --- a/clock/data/alarm/qtg_test_noalarm.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/alarm/qtg_test_repeat.svg --- a/clock/data/alarm/qtg_test_repeat.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/clock.qrc --- a/clock/data/clock.qrc Mon May 03 12:30:32 2010 +0300 +++ b/clock/data/clock.qrc Mon Jun 28 15:22:02 2010 +0530 @@ -1,36 +1,7 @@ - toolbar/qtg_test_alarm.svg - toolbar/qtg_test_worldclock.svg - toolbar/qtg_test_timer.svg - toolbar/qtg_test_stopwatch.svg - - alarm/qtg_test_repeat.svg - alarm/qtg_test_alarm.svg - alarm/qtg_test_noalarm.svg - toolbar/qtg_test_newalarm.svg - - toolbar/qtg_test_addnewcity.svg worldclock/qtg_test_day.svg worldclock/qtg_test_night.svg - worldclock/qtg_test_homecity.svg - worldclock/qgn_test_city_default.svg - worldclock/qgn_indi_dst_add.svg - worldclock/qgn_indi_find.svg - - toolbar/qtg_test_start.svg - toolbar/qtg_test_stop.svg - toolbar/qtg_test_reset.svg - timer/qtg_graf_timer2_base.svg - timer/knob_arc_indicator_1min.svg - timer/qtg_graf_timer2_button.svg - timer/qtg_graf_timer2_arrow.svg - timer/qtg_graf_timer2_time24.svg - timer/qtg_graf_timer2_time60.svg - - toolbar/qtg_test_lap.svg - toolbar/qtg_test_split.svg - toolbar/qtg_test_analyze.svg effects/hide_widget.fxml effects/show_widget.fxml @@ -40,11 +11,5 @@ effects/fade_out.fxml effects/fade_in.fxml - - effects/timerknob_appear.fxml - effects/timerknob_disappear.fxml - - - translations/clock.qm - + \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b clock/data/timer/knob_arc_indicator_1min.svg --- a/clock/data/timer/knob_arc_indicator_1min.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1016 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/timer/qtg_graf_timer2_arrow.svg --- a/clock/data/timer/qtg_graf_timer2_arrow.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/timer/qtg_graf_timer2_base.svg --- a/clock/data/timer/qtg_graf_timer2_base.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/timer/qtg_graf_timer2_button.svg --- a/clock/data/timer/qtg_graf_timer2_button.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/timer/qtg_graf_timer2_colorindication.svg --- a/clock/data/timer/qtg_graf_timer2_colorindication.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/timer/qtg_graf_timer2_pointer.svg --- a/clock/data/timer/qtg_graf_timer2_pointer.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/timer/qtg_graf_timer2_time24.svg --- a/clock/data/timer/qtg_graf_timer2_time24.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,171 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/timer/qtg_graf_timer2_time60.svg --- a/clock/data/timer/qtg_graf_timer2_time60.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,225 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/timer/qtg_graf_timer_bg.svg --- a/clock/data/timer/qtg_graf_timer_bg.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,157 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/timer/qtg_graf_timer_overlay.svg --- a/clock/data/timer/qtg_graf_timer_overlay.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/timer/qtg_graf_timer_pointer.svg --- a/clock/data/timer/qtg_graf_timer_pointer.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/toolbar/qtg_test_addnewcity.svg --- a/clock/data/toolbar/qtg_test_addnewcity.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/toolbar/qtg_test_alarm.svg --- a/clock/data/toolbar/qtg_test_alarm.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/toolbar/qtg_test_analyze.svg --- a/clock/data/toolbar/qtg_test_analyze.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/toolbar/qtg_test_lap.svg --- a/clock/data/toolbar/qtg_test_lap.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/toolbar/qtg_test_newalarm.svg --- a/clock/data/toolbar/qtg_test_newalarm.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/toolbar/qtg_test_reset.svg --- a/clock/data/toolbar/qtg_test_reset.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/toolbar/qtg_test_split.svg --- a/clock/data/toolbar/qtg_test_split.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/toolbar/qtg_test_start.svg --- a/clock/data/toolbar/qtg_test_start.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/toolbar/qtg_test_stop.svg --- a/clock/data/toolbar/qtg_test_stop.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/toolbar/qtg_test_stopwatch.svg --- a/clock/data/toolbar/qtg_test_stopwatch.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/toolbar/qtg_test_timer.svg --- a/clock/data/toolbar/qtg_test_timer.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/toolbar/qtg_test_worldclock.svg --- a/clock/data/toolbar/qtg_test_worldclock.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/translations/clock.qm Binary file clock/data/translations/clock.qm has changed diff -r fd30d51f876b -r b6db4fd4947b clock/data/translations/clock.ts --- a/clock/data/translations/clock.ts Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,959 +0,0 @@ - - - - - - 1st label in Regional date & time settings view - Time format - Time format - qtl_dataform_heading_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - LayoutID Parent. Custom. When a city is added to the World Clock list view, its relative time offset is displayed with respect to Homecity. (Hour) - %1 hr - %1 hr - txt_clock_dblist_val_l1_hr - Clock_World clock_P05 - dblist_1_val - Cl - False - - - Default value for Description label in Alarm editor view - Alarm - Alarm - qtl_dataform_description_sec - Clock_Alarm editor_P03 - formlabel_1_val - Cl - False - - - Title for the time picker tumbler widget - Alarm time - Alarm time - qtl_dialog_pri_heading - Tumbler - title - Tu - False - - - 2nd value in combo box list for Date format label - mm dd yyyy - mm dd yyyy - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_2_val - Cl - False - - - Secondary text displaying the time remaining for the alarm (hour, min) - In %1hr %2min - In %1hr %2min - txt_clock_main_view_setlabel_in_1hr_2min - Clock main view_P01 - setlabel_1 - Cl - False - - - When user edits an already existed alarm in Alarm editor form, he can "Discard changes" from Options menu and the prevoius values are saved. - Discard changes - Discard changes - qtl_menu_pri - Clock_Alarm editor_P03 - opt - Cl - False - - - Tapping on this button opens advanced date and time view - Regional date & time settings - Regional date & time settings - qtl_dataform_button_sec - Clock_Date & time settings_P04_1 - button - Cl - False - - - Long tap menu on an added city in World Clock view (both portrait and landscape) - Delete - Delete - qtl_menu_pri - Clock_World clock_P05 - menu - Cl - False - - - When user taps on already existed alarm in the alarm list, the alarm editor opens with subtitle "Alarm" - Alarm - Alarm - qtl_groupbox_simple_sec - Clock_Alarm editor_P03 - subhead - Cl - False - - - 2nd dropdown list value for Occurence label in Alarm editor view - Repeat daily - Repeat daily - qtl_dataform_group_pri - Clock_Alarm editor_P03 - setlabel_2_val - Cl - False - - - Secondary text displaying the time remaining for the alarm (hour, mins) - In %1hr %2mins - In %1hr %2mins - txt_clock_main_view_setlabel_in_1hr_2mins - Clock main view_P01 - setlabel_1 - Cl - False - - - - Time - Time - qtl_dialog_pri_heading - Tumbler - title - Tu - False - - - 5th label for Place in Clock settings view - Place - Place - qtl_dataform_heading_pri - Clock_Date & time settings_P04_1 - formlabel_1 - Cl - False - - - Label for Time in Alarm editor view - Time - Time - qtl_dataform_heading_pri - Clock_Alarm editor_P03 - setlabel_1 - Cl - False - - - 1st dropdown list value for Occurence label in Alarm editor view - Once - Once - qtl_dataform_group_pri - Clock_Alarm editor_P03 - setlabel_1_val - Cl - False - - - 5th dropdown list value for Day label in Alarm editor view - Friday - Friday - qtl_dataform_group_pri - Clock_Alarm editor_P03 - setlabel_5_val - Cl - False - - - - World clock - World clock - qtl_toolbar_tiny1_3 - Clock main view_P01 - button - Cl - False - - - 6th field in Regional date & time settings view - Week starts on - Week starts on - qtl_dataform_heading_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - 4th dropdown list value for Occurence label in Alarm editor view - Repeat on workdays - Repeat on workdays - qtl_dataform_group_pri - Clock_Alarm editor_P03 - setlabel_4_val - Cl - False - - - 7th dropdown list value for Day label in Alarm editor view - Sunday - Sunday - qtl_dataform_group_pri - Clock_Alarm editor_P03 - setlabel_7_val - Cl - False - - - Layout ID Parent. Custom Layout. Text to show the alarm occurance. - Daily - Daily - txt_clock_main_view_dblist_daily_val_today - Clock main view_P01 - dblist_1 - Cl - False - - - 3rd value in combo box list for Date format label - yyyy mm dd - yyyy mm dd - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_3_val - Cl - False - - - Note displayed after alarm is set (time remaining) (hr, mins) - Time to alarm %1 hour and %2 minutes - Time to alarm %1 hour and %2 minutes - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - - New alarm - New alarm - qtl_toolbar_tiny1_3 - Clock main view_P01 - button - Cl - False - - - Form label for city name in add own city (popup) data entry form - City name - City name - qtl_dataform_heading_pri - Clock_City list_P07 - formlabel_1 - Cl - False - - - Form label for timezone in add own city (popup) data entry form - Timezone - Timezone - qtl_dataform_heading_pri - Clock_City list_P07 - formlabel_1 - Cl - False - - - Layout ID Parent. Custom. Text to display the GMT info for that city. - GMT %1 - GMT %1 - txt_clock_main_view_label_gmt_1 - Clock main view_P01 - setlabel_1 - Cl - False - - - - GMT - GMT - - Common - Common - Co - False - - - "Add own city" from Options menu in City list - Add own city - Add own city - qtl_menu_pri - Clock_City list_P07 - opt - Cl - False - - - When a city is added to the World Clock list view, its relative time offset is displayed with respect to Homecity. (Hours) - %1 hrs - %1 hrs - txt_clock_dblist_val_l1_hr - Clock_World clock_P05 - dblist_1_val - Cl - False - - - Long tap on an alarm in Alarm list opens the item specific menu displaying text "Delete alarm" - Delete alarm - Delete alarm - qtl_menu_pri - Clock main view_P01 - menu - Cl - False - - - Label to the date field (picker) in the settings view - Date - Date - qtl_dataform_pri - Clock_Date & time settings_P04_1 - setlabel_1 - Cl - False - - - Label for Workdays in Alarm editor - Workdays - Workdays - qtl_dataform_heading_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - 2nd value in combo box list for Time format label - 12 hour - 12 hour - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_2_val - Cl - False - - - Layout ID Parent. Custom. Alarm Occurance detail. - Every %1 - Every %1 - txt_clock_main_view_label_every_1 - Clock main view_P01 - setlabel_1 - Cl - False - - - Note displayed after alarm is set (time remaining) (hrs, mins) - Time to alarm %1 hours and %2 minutes - Time to alarm %1 hours and %2 minutes - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - 3rd dropdown list value for Occurence label in Alarm editor view - Repeat weekly - Repeat weekly - qtl_dataform_group_pri - Clock_Alarm editor_P03 - setlabel_3_val - Cl - False - - - Note displayed after alarm is set (workdays) - Alarm occurs workdays at %1 - Alarm occurs workdays at %1 - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - Clock application in Application library list - Clock - Clock - qtl_list_pri_large_graphic - Clock - list - Cl - False - - - Sub-title for Date & time settings view - Date & time - Date & time - qtl_groupbox_simple_sec - Clock_Date & time settings_P04_1 - subhead - Cl - False - - - Information shown in a popup once the alarm is deactivated - Alarm Deactivated - Alarm Deactivated - qtl_notifdialog_pri2 - Clock main view_P01 - dpopinfo - Cl - False - - - Long tap menu on an added city in the World clock view (both portrait and landscape) - Set as current location - Set as current location - qtl_menu_pri - Clock_World clock_P05 - menu - Cl - False - - - Item in Options menu from Clock main vew - Settings - Settings - qtl_menu_pri - Clock main view_P01 - opt - Cl - False - - - 3rd dropdown list value for Day label in Alarm editor view - Wednesday - Wednesday - qtl_dataform_group_pri - Clock_Alarm editor_P03 - setlabel_3_val - Cl - False - - - Title for Date and time settings view - Clock - Clock - - Common - Common - Co - False - - - The time and date information will be displayed in 2nd row - %1, %2 - %1, %2 - qtl_list_sec_large_graphic - CP main view_time & date plugin_P11 - list - CP - False - - - Setting item to clock display type. Tap to toggle values. - Digital - Digital - qtl_dataform_button_sec - Clock_Date & time settings_P04_1 - button - Cl - False - - - This text is displayed in 1st row - Time & date - Time & date - qtl_list_pri_large_graphic - CP main view_time & date plugin_P11 - list - CP - False - - - Note displayed after alarm is set (every week) - Alarm occurs every week on %1 at %2 - Alarm occurs every week on %1 at %2 - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - When a city is added to the World Clock list view, its relative time offset is displayed with respect to Homecity. (Hour and Mins) - %1 hr %2 mins - %1 hr %2 mins - txt_clock_dblist_val_l1_hr - Clock_World clock_P05 - dblist_1_val - Cl - False - - - Label for Occurence in Alarm editor - Occurence - Occurence - qtl_dataform_heading_pri - Clock_Alarm editor_P03 - setlabel_1 - Cl - False - - - When a city is added to the World Clock list view, its relative time offset is displayed with respect to Homecity. (Mins) - %1 mins - %1 mins - txt_clock_dblist_val_l1_hr - Clock_World clock_P05 - dblist_1_val - Cl - False - - - 3rd field in Regional date & time settings view - Date format - Date format - qtl_dataform_heading_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Note displayed after alarm is set (time remaining) (hrs, min) - Time to alarm %1 hours and %2 minute - Time to alarm %1 hours and %2 minute - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - Long tap menu on an added city in World clock view (both portrait and landscape) - Show on homescreen - Show on homescreen - qtl_menu_pri - Clock_World clock_P05 - menu - Cl - False - - - Popup Information which comes after setting the alarm. - Alarm will occur at %1 after automatic daylight saving update - Alarm will occur at %1 after automatic daylight saving update - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - When user taps on "New alarm" toolbar button in Clock main view, alarm editor opens with the subtitle "New alarm". - New alarm - New alarm - qtl_groupbox_simple_sec - Clock_Alarm editor_P03 - subhead - Cl - False - - - Sub-title for Regiional date & time settings - Regional date & time settings - Regional date & time settings - qtl_groupbox_simple_sec - Clock_Date & time settings_P04_3 - subhead - Cl - False - - - 1st Value in combo box list for Time format label - 24 hour - 24 hour - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_1_val - Cl - False - - - Secondary text displaying the time remaining for the alarm (hours, mins) - In %1hrs %2mins - In %1hrs %2mins - txt_clock_main_view_setlabel_in_1hrs_2mins - Clock main view_P01 - setlabel_1 - Cl - False - - - Form label for country in add own city (popup) data entry form - Country - Country - qtl_dataform_heading_pri - Clock_City list_P07 - formlabel_1 - Cl - False - - - - DST - DST - - Common - setlabel_1 - Co - False - - - Label for Alarm sound in Alarm editor view - Alarm sound - Alarm sound - qtl_checkbox_sec - Clock_Alarm editor_P03 - setlabel_1 - Cl - False - - - 1st dropdown list value for Day label in Alarm editor view - Monday - Monday - qtl_dataform_group_pri - Clock_Alarm editor_P03 - setlabel_1_val - Cl - False - - - - Alarms - Alarms - qtl_toolbar_tiny1_3 - Clock main view_P01 - button - Cl - False - - - Note displayed after alarm is set (Everyday Time) - Alarm occurs every day at %1 - Alarm occurs every day at %1 - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - 4th dropdown list value for Day label in Alarm editor view - Thursday - Thursday - qtl_dataform_group_pri - Clock_Alarm editor_P03 - setlabel_4_val - Cl - False - - - Alarm snooze time details in the list box (5mins, 10mins, 15mins, 30mins) - %Ln minutes - - (s)%Ln minutes - (p)%Ln minutes - - qtl_dataform_combobox_sec - Clock_Date & time settings_P04_1 - set - Cl - False - - - Setting item to clock display type. Tap to toggle values. - Analog - Analog - qtl_dataform_button_sec - Clock_Date & time settings_P04_1 - button - Cl - False - - - Note displayed after alarm is set (time remaining) - Time to alarm %1 hour and %2 minute - Time to alarm %1 hour and %2 minute - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - Layout ID Parent. Custom Layout. Text to show the alarm occurance. - Workdays - Workdays - txt_clock_main_view_dblist_daily_val_today - Clock main view_P01 - dblist_1_val - Cl - False - - - 2nd dropdown list value for Day label in Alarm editor view - Tuesday - Tuesday - qtl_dataform_group_pri - Clock_Alarm editor_P03 - setlabel_2_val - Cl - False - - - Subtitle for World Clock view - World Clock - World Clock - qtl_groupbox_simple_sec - Clock_World clock_P05 - subhead - Cl - False - - - Note displayed after alarm is set (only once) - Alarm occurs once only on next %1 at %2 - Alarm occurs once only on next %1 at %2 - qtl_notifdialog_pri2 - Clock_Alarm editor_P03 - dpopinfo - Cl - False - - - Title for the date picker tumbler widget - Alarm date - Alarm date - qtl_dialog_pri_heading - Tumbler - title - Tu - False - - - - Date - Date - qtl_dialog_pri_heading - Tumbler - title - Tu - False - - - Secondary text displaying the time remaining for the alarm (hours, min) - In %1hrs %2min - In %1hrs %2min - txt_clock_main_view_setlabel_in_1hrs_2min - Clock main view_P01 - setlabel_1 - Cl - False - - - Clock application in Application library grid - Clock - Clock - qtl_grid_applications_sec - Clock - grid - Cl - False - - - Label for Day in Alarm editor view - Day - Day - qtl_dataform_heading_pri - Clock_Alarm editor_P03 - setlabel_1 - Cl - False - - - Layout ID Parent. Custom layout. Days remaining for the alarm - In %1days - In %1days - txt_clock_main_view_setlabel_in_1days - Clock main view_P01 - setlabel_1 - Cl - False - - - 1st label in Date and time settings view - Use network date & time - Use network date & time - qtl_checkbox_sec - Clock_Date & time settings_P04_1 - setlabel_1 - Cl - False - - - Subtitle for the time seperator drop down list - Time separator - Time separator - qtl_dataform_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Subtitle for the date seperator drop down list - Date separator - Date separator - qtl_dataform_pri - Clock_Date & time settings_P04_3 - setlabel_1 - Cl - False - - - Label to the time field (picker) in the settings view - Time - Time - qtl_dataform_pri - Clock_Date & time settings_P04_1 - setlabel_1 - Cl - False - - - Layout ID Parent. Custom Layout. Text to show the alarm occurance. - Today - Today - txt_clock_main_view_dblist_daily_val_today - Clock main view_P01 - dblist_1_val - Cl - False - - - Primary text label for Clock Type - Clock Type - Clock Type - qtl_dataform_pri - Clock_Date & time settings_P04_1 - setlabel_5 - Cl - False - - - Subtitle for City list - City list - City list - qtl_groupbox_simple_sec - Clock_City list_P07 - subhead - Cl - False - - - When user creates a new alarm in Alarm editor form, he can "Delete" this alarm via Options menu. - Delete - Delete - qtl_menu_pri - Clock_Alarm editor_P03 - opt - Cl - False - - - Information shown in a popup once the alarm is activated - Alarm Activated - Alarm Activated - qtl_notifdialog_pri2 - Clock main view_P01 - dpopinfo - Cl - False - - - When there are no alarms set in Clock main view, the text "No alarms set" is displayed in list. - No alarms set - No alarms set - qtl_list_pri - Clock main view_with no alarms set_P02 - list - Cl - False - - - 6th dropdown list value for Day label in Alarm editor view - Saturday - Saturday - qtl_dataform_group_pri - Clock_Alarm editor_P03 - setlabel_6_val - Cl - False - - - Label for Description in Alarm editor view - Description - Description - qtl_dataform_pri - Clock_Alarm editor_P03 - formlabel_1 - Cl - False - - - 1st value in combo box list for Date format label - dd mm yyyy - dd mm yyyy - qtl_dataform_group_pri - Clock_Date & time settings_P04_3 - setlabel_1_val - Cl - False - - - When a city is added to the World Clock list view, its relative time offset is displayed with respect to Homecity. (Hours and Mins) - %1 hrs %2 mins - %1 hrs %2 mins - txt_clock_dblist_val_l1_hr - Clock_World clock_P05 - dblist_1_val - Cl - False - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/worldclock/qgn_clock_time_zone.svg --- a/clock/data/worldclock/qgn_clock_time_zone.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,228 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/worldclock/qgn_indi_dst_add.svg --- a/clock/data/worldclock/qgn_indi_dst_add.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b clock/data/worldclock/qgn_indi_find.svg --- a/clock/data/worldclock/qgn_indi_find.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/data/worldclock/qgn_test_city_default.svg --- a/clock/data/worldclock/qgn_test_city_default.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b clock/data/worldclock/qtg_test_homecity.svg --- a/clock/data/worldclock/qtg_test_homecity.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/ftudatetimewizard/ftudatetimewizard.pro --- a/clock/ftudatetimewizard/ftudatetimewizard.pro Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -# -# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -# All rights reserved. -# This component and the accompanying materials are made available -# under the terms of "Eclipse Public License v1.0" -# which accompanies this distribution, and is available -# at the URL "http://www.eclipse.org/legal/epl-v10.html". -# -# Initial Contributors: -# Nokia Corporation - initial contribution. -# -# Contributors: -# -# Description: FTU datetime wizard project file -# - -TEMPLATE = lib - -CONFIG += plugin hb -TARGET = ftudatetimewizard - -HEADERS += ./inc/*.h -SOURCES += ./src/*.cpp - -RESOURCES += resources/ftudatetimewizard.qrc - -plugin.sources = ftudatetimewizard.dll -plugin.path = \resource\qt\plugins\FTU - -pluginstub.sources = resource/*.manifest -pluginstub.path = /fturesources/plugins/wizardproviders - -DEPLOYMENT += plugin pluginstub - -CONFIG(debug, debug|release) { - DESTDIR = debug - LIBS += -lftuwizardmodel -} else { - DESTDIR = release - LIBS += -lftuwizardmodel -} - -CONFIG += plugin debug_and_release - -QT += xml sql - -DEFINES += FTUDATETIMEWIZARD_LIB - -coverage:DEFINES += COVERAGE_MEASUREMENT - -DEPENDPATH += ./inc \ - ./src - -INCLUDEPATH += ./inc/ \ - ../clockmw/clocksettingsutility/inc \ - ../clockmw/clocktimezone/inc \ - ../clockengines/inc \ - ../clockengines/clockserver/server/inc \ - ../clockui/clockcityselectionlist/inc \ - ../inc -symbian: { - TARGET.UID3 = 0x2002C30C - TARGET.EPOCALLOWDLLDATA=1 - TARGET.CAPABILITY = ALL -TCB - TARGET.CAPABILITY = CAP_GENERAL_DLL - INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE - - LIBS += -leuser \ - -lclocksettingsutility \ - -lclockserverclient \ - -ltimezoneclient \ - -lxqsettingsmanager \ - -lclockcityselectionlist - -} - -# End of file --Don't remove this. \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b clock/ftudatetimewizard/inc/ftudatetimecustomitem.h --- a/clock/ftudatetimewizard/inc/ftudatetimecustomitem.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). - * All rights reserved. - * This component and the accompanying materials are made available - * under the terms of "Eclipse Public License v1.0" - * which accompanies this distribution, and is available - * at the URL "http://www.eclipse.org/legal/epl-v10.html". - * - * Initial Contributors: - * Nokia Corporation - initial contribution. - * - * Contributors: - * - * Description: Definition for the FtuDateTimeCustomItem class - * - */ - -#ifndef FTUDATETIMECUSTOMITEM_H_ -#define FTUDATETIMECUSTOMITEM_H_ - -// System includes -#include -#include - -// Forward declarations -class HbDataFormModel; -class HbPushButton; - -class FtuDateTimeCustomItem : public HbDataFormViewItem -{ - Q_OBJECT - -public: - FtuDateTimeCustomItem(QGraphicsItem *parent); - ~FtuDateTimeCustomItem(); - virtual HbAbstractViewItem* createItem(); - bool canSetModelIndex(const QModelIndex &index) const; - void restore(); - -protected: - virtual HbWidget* createCustomWidget(); - HbPushButton* mPushButton; -}; - -#endif /* FTUDATETIMECUSTOMITEM_H_ */ - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/ftudatetimewizard/inc/ftudatetimeprivatecrkeys.h --- a/clock/ftudatetimewizard/inc/ftudatetimeprivatecrkeys.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). - * All rights reserved. - * This component and the accompanying materials are made available - * under the terms of "Eclipse Public License v1.0" - * which accompanies this distribution, and is available - * at the URL "http://www.eclipse.org/legal/epl-v10.html". - * - * Initial Contributors: - * Nokia Corporation - initial contribution. - * - * Contributors: - * - * Description: The file contains the uid of keys used by cenrep sheet - * - */ - -#ifndef FTUDATETIMEPRIVATECRKEYS_H_ -#define FTUDATETIMEPRIVATECRKEYS_H_ - -/*! - Clock App Settings - Provides access to the plugin completed date. - */ -const long int KCRUidClockApp = { 0x101F874D }; - -/*! - FTU date time plugin edited date - */ -const long int KFtuPluginDate = 0x00000003; - - -/*! - Nitz Settings API - Provides access to the Nitz status. - */ -const long int KCRUidNitz = { 0x101F8876 }; - -/*! - Valid Nitz Info key - */ -const long int KValidNitz = 0x00000004; - -#endif /* FTUDATETIMEPRIVATECRKEYS_H_ */ - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/ftudatetimewizard/inc/ftudatetimeview.h --- a/clock/ftudatetimewizard/inc/ftudatetimeview.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,89 +0,0 @@ -/* - * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). - * All rights reserved. - * This component and the accompanying materials are made available - * under the terms of "Eclipse Public License v1.0" - * which accompanies this distribution, and is available - * at the URL "http://www.eclipse.org/legal/epl-v10.html". - * - * Initial Contributors: - * Nokia Corporation - initial contribution. - * - * Contributors: - * - * Description: The view class for the FTU wizard plugin - * - */ - -#ifndef FTUDATETIMEVIEW_H -#define FTUDATETIMEVIEW_H - -// System includes -#include -#include -#include -#include -#include "clockcityselectionlist.h" - -// Forward declarations. -class HbDataForm; -class HbDataFormModel; -class HbDataFormModelItem; -class HbDateTimePicker; -class HbPushButton; -class SettingsUtility; -class QDate; -class TimezoneClient; - -class FtuDateTimeView : public HbView -{ - Q_OBJECT - -public: - FtuDateTimeView(); - ~FtuDateTimeView(); - void constructView(); - QDate getWizardCompletedDate(); - void setAutomaticTimeUpdateOff(bool value); - -public slots: - void populateDatePicker(); - void populateTimePicker(); - void setAutoTimeupDate(); - void populateCitySelectionList(); - -private slots: - void updateDate(); - void updateTime(); - void HandleLocationChange(LocationInfo); - -private: - void createMainLayout(); - void setItemDisplayed(); - void populateDateTimeGroup(); - void populatePlaceGroup(); - void wizardEditedDate(const QDate &date); - - HbDataForm* mDateTimePlaceForm; - HbDataFormModel* mDateTimePlaceModel; - - HbDataFormModelItem *mDateItem; - HbDataFormModelItem *mTimeItem; - HbDataFormModelItem *mAutoTimeUpdateItem; - HbDataFormModelItem *mPlaceGroup; - HbDataFormModelItem *mCountryItem; - HbDataFormModelItem *mCityItem; - - HbDateTimePicker* mDatePicker; - HbDateTimePicker* mTimePicker; - HbDialog* mDatetimepopup; - SettingsUtility *mSettingsUtility; - - TimezoneClient *mTimeZoneClient; - ClockCitySelectionList* mCitySelectionList; - bool mTimeAutoUpdate; -}; - -#endif // FTUDATETIMEVIEW_H - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/ftudatetimewizard/inc/ftudatetimewizard.h --- a/clock/ftudatetimewizard/inc/ftudatetimewizard.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). - * All rights reserved. - * This component and the accompanying materials are made available - * under the terms of "Eclipse Public License v1.0" - * which accompanies this distribution, and is available - * at the URL "http://www.eclipse.org/legal/epl-v10.html". - * - * Initial Contributors: - * Nokia Corporation - initial contribution. - * - * Contributors: - * - * Description: Implementation of the plugin wizard class FtuDateTimeWizard - * - */ - -#ifndef FTUDATETIMEWIZARD_H -#define FTUDATETIMEWIZARD_H - -// System includes -#include -#include - -// User includes -#include "ftuwizard.h" - -// Forward declarations -class FtuDateTimeView; - -class FtuDateTimeWizard : public FtuWizard -{ - Q_OBJECT - -public: - FtuDateTimeWizard(); - ~FtuDateTimeWizard(); - -protected: - void initializeWizard(qint32 cenrepOwnerId, int wizardIdx); - void activateWizard(); - void deactivateWizard(); - bool shutdownWizard(ShutdownReason reason); - void resizeWizard(const QRectF& geometry); - const FtuWizardSetting& wizardSettings(); - bool handleBackEvent(); - QDate wizardCompletedDate(); - -private: - QPointer mFtuDateTimeView; - FtuWizardSetting mWizardSettings; -}; - -#endif // FTUDATETIMEWIZARD_H - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/ftudatetimewizard/inc/ftudatetimewizardfactory.h --- a/clock/ftudatetimewizard/inc/ftudatetimewizardfactory.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -/* - * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). - * All rights reserved. - * This component and the accompanying materials are made available - * under the terms of "Eclipse Public License v1.0" - * which accompanies this distribution, and is available - * at the URL "http://www.eclipse.org/legal/epl-v10.html". - * - * Initial Contributors: - * Nokia Corporation - initial contribution. - * - * Contributors: - * - * Description: Definition file for FtuDateTimeWizardFactory class - * - */ - -#ifndef FTUDATETIMEWIZARDFACTORY_H -#define FTUDATETIMEWIZARDFACTORY_H - -// System includes -#include - -// User includes -#include "ftuwizardfactory.h" - -class FtuWizard; - -class FtuDateTimeWizardFactory : public QObject, public FtuWizardFactory -{ - Q_OBJECT - Q_INTERFACES(FtuWizardFactory) - -public: - FtuWizard* createWizard() const; -}; - -#endif // FTUDATETIMEWIZARDFACTORY_H - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/ftudatetimewizard/resource/ftudatetimewizard.manifest --- a/clock/ftudatetimewizard/resource/ftudatetimewizard.manifest Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/ftudatetimewizard/resources/ftudatetimewizard.qrc --- a/clock/ftudatetimewizard/resources/ftudatetimewizard.qrc Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ - - - ftudatetimewizard_toc_icon.svg - ftudatetimewizard_menustrip_icon.svg - - diff -r fd30d51f876b -r b6db4fd4947b clock/ftudatetimewizard/resources/ftudatetimewizard_menustrip_icon.svg --- a/clock/ftudatetimewizard/resources/ftudatetimewizard_menustrip_icon.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/ftudatetimewizard/resources/ftudatetimewizard_toc_icon.svg --- a/clock/ftudatetimewizard/resources/ftudatetimewizard_toc_icon.svg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r fd30d51f876b -r b6db4fd4947b clock/ftudatetimewizard/src/ftudatetimecustomitem.cpp --- a/clock/ftudatetimewizard/src/ftudatetimecustomitem.cpp Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,102 +0,0 @@ -/* - * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). - * All rights reserved. - * This component and the accompanying materials are made available - * under the terms of "Eclipse Public License v1.0" - * which accompanies this distribution, and is available - * at the URL "http://www.eclipse.org/legal/epl-v10.html". - * - * Initial Contributors: - * Nokia Corporation - initial contribution. - * - * Contributors: - * - * Description: Implementation for the FtuDateTimeCustomItem class - * - */ - -// System includes -#include -#include -#include -#include -#include -#include - - -// User includes -#include "ftudatetimecustomitem.h" - -/*! - \class FtuDateTimeCustomItem - This object creates the Custom item - */ - -/*! - Constructor. - */ -FtuDateTimeCustomItem::FtuDateTimeCustomItem(QGraphicsItem *parent) : -HbDataFormViewItem(parent) -{ -} - -/*! - Destructor. - */ -FtuDateTimeCustomItem::~FtuDateTimeCustomItem() -{ - // Nothing yet. -} - -/*! - Creates the custom item. - */ -HbAbstractViewItem* FtuDateTimeCustomItem::createItem() -{ - return new FtuDateTimeCustomItem(*this); -} - -/*! - Checks if model index can be set or not - */ -bool FtuDateTimeCustomItem::canSetModelIndex(const QModelIndex &index) const -{ - HbDataFormModelItem::DataItemType itemType = - static_cast( - index.data(HbDataFormModelItem::ItemTypeRole).toInt()); - - if(itemType == (HbDataFormModelItem::CustomItemBase)) { - return true; - } else { - return false; - } - -} - -/*! - - */ -void FtuDateTimeCustomItem::restore() -{ - HbDataFormModelItem::DataItemType itemType = - static_cast( - modelIndex().data(HbDataFormModelItem::ItemTypeRole).toInt()); - if(itemType == (HbDataFormModelItem::CustomItemBase)) { - HbDataFormModel* model = static_cast( - static_cast(this)->itemView()->model()); - HbDataFormModelItem* modlItem = model->itemFromIndex(modelIndex()); - mPushButton->setProperty("text", modlItem->contentWidgetData("text")); - } -} -/*! - Creates and returns the custom item. - */ -HbWidget* FtuDateTimeCustomItem::createCustomWidget() -{ - /*HbPushButton* pushButton = new HbPushButton(this); - return pushButton;*/ - mPushButton = new HbPushButton(this); - return mPushButton; -} - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/ftudatetimewizard/src/ftudatetimeview.cpp --- a/clock/ftudatetimewizard/src/ftudatetimeview.cpp Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,414 +0,0 @@ -/* - * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). - * All rights reserved. - * This component and the accompanying materials are made available - * under the terms of "Eclipse Public License v1.0" - * which accompanies this distribution, and is available - * at the URL "http://www.eclipse.org/legal/epl-v10.html". - * - * Initial Contributors: - * Nokia Corporation - initial contribution. - * - * Contributors: - * - * Description: FTU wizard plugin view implementaion - * - */ - -// System includes -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// User includes -#include "settingsutility.h" -#include "timezoneclient.h" -#include "ftudatetimeview.h" -#include "ftudatetimecustomitem.h" -#include "ftudatetimeprivatecrkeys.h" - -/*! - \class FtuDateTimeView - This is the view class for the FTU plugin - */ -/*! - \enum FtuDateTimeView::dateTimePicker - This enum defines different pickers to be launched(date picker/time picker) - */ -/*! - \var FtuDateTimeView::datePicker - Date picker. - */ -/*! - \var FtuDateTimeView::timePicker - Time picker. - */ - -/*! - Constructor. - */ -FtuDateTimeView::FtuDateTimeView() : -HbView(), -mDatePicker(NULL), -mTimePicker(NULL), -mDatetimepopup(NULL) -{ - //TODO: Localisation has to be done - // set title for wizard - setTitle("Date and Time"); - mDateTimePlaceForm = new HbDataForm(); - - QList prototypes = mDateTimePlaceForm->itemPrototypes(); - FtuDateTimeCustomItem *customItem = - new FtuDateTimeCustomItem(mDateTimePlaceForm); - prototypes.append(customItem); - mDateTimePlaceForm->setItemPrototypes(prototypes); - - // Construct the settings utility. - mSettingsUtility = new SettingsUtility(); - mTimeZoneClient = new TimezoneClient(); - mTimeAutoUpdate = mTimeZoneClient->timeUpdateOn(); -} - -/*! - Destructor. - */ -FtuDateTimeView::~FtuDateTimeView() -{ - delete mDateTimePlaceForm; - delete mDateTimePlaceModel; - delete mSettingsUtility; -} -/*! - Creates the main view. - */ -void FtuDateTimeView::constructView() -{ - createMainLayout(); - setWidget(mDateTimePlaceForm); -} - -/*! - Implemantation to create the main layout using the dataform. - */ -void FtuDateTimeView::createMainLayout() -{ - if (mDateTimePlaceForm->model()) { - delete mDateTimePlaceForm->model(); - mDateTimePlaceForm->setModel(0); - } - - mDateTimePlaceModel = new HbDataFormModel(); - - // Populates the datetime and place groups - populateDateTimeGroup(); - populatePlaceGroup(); - - setItemDisplayed(); - mDateTimePlaceForm->setModel(mDateTimePlaceModel); -} - -/*! - Populates the Date and Time Group. - */ -void FtuDateTimeView::populateDateTimeGroup() -{ - HbDataFormModelItem *dateTimeGroup = - mDateTimePlaceModel->appendDataFormGroup - (QString(tr("Date and Time")), - mDateTimePlaceModel->invisibleRootItem()); - - //Custom Date item - mDateItem = mDateTimePlaceModel->appendDataFormItem( - HbDataFormModelItem::CustomItemBase, - QString(tr("Date")), dateTimeGroup); - // Custom Time item - mTimeItem = mDateTimePlaceModel->appendDataFormItem( - HbDataFormModelItem::CustomItemBase, - QString(tr("Time")), dateTimeGroup); - // Auto TimeUpdate item - mAutoTimeUpdateItem = mDateTimePlaceModel->appendDataFormItem( - HbDataFormModelItem::CustomItemBase, - QString(tr("Time Autoupdate")), dateTimeGroup); - - // Connect the items to the proper slots - mDateTimePlaceForm->addConnection(mDateItem, SIGNAL(clicked()), this, - SLOT(populateDatePicker())); - mDateTimePlaceForm->addConnection(mTimeItem, SIGNAL(clicked()), this, - SLOT(populateTimePicker())); - mDateTimePlaceForm->addConnection(mAutoTimeUpdateItem, SIGNAL(clicked()), - this, SLOT(setAutoTimeupDate())); -} - -/*! - Populates the Place Group. - */ -void FtuDateTimeView::populatePlaceGroup() -{ - mPlaceGroup = mDateTimePlaceModel->appendDataFormGroup(QString(tr("Place")), - mDateTimePlaceModel->invisibleRootItem()); - // Custom country item - mCountryItem = mDateTimePlaceModel->appendDataFormItem( - HbDataFormModelItem::CustomItemBase, - QString(tr("Country")), mPlaceGroup); - // Custom city item - mCityItem = mDateTimePlaceModel->appendDataFormItem( - HbDataFormModelItem::CustomItemBase, - QString(tr("City")), mPlaceGroup); - - // Connect the items to the proper slots - mDateTimePlaceForm->addConnection(mCountryItem, SIGNAL(clicked()), this, - SLOT(populateCitySelectionList())); - mDateTimePlaceForm->addConnection(mCityItem, SIGNAL(clicked()), this, - SLOT(populateCitySelectionList())); - - -} - -/*! - Sets the item index. - */ -void FtuDateTimeView::setItemDisplayed() -{ - // Display the items with proper data - mDateItem->setContentWidgetData("text", mSettingsUtility->date()); - mTimeItem->setContentWidgetData("text", mSettingsUtility->time()); - - if (mTimeAutoUpdate) { - mAutoTimeUpdateItem->setContentWidgetData("text", tr("ON")); - } else { - mAutoTimeUpdateItem->setContentWidgetData("text", tr("OFF")); - } - mCountryItem->setContentWidgetData("text", - mTimeZoneClient->getCurrentZoneInfoL().countryName); - mCityItem->setContentWidgetData("text", - mTimeZoneClient->getCurrentZoneInfoL().cityName); - - // Set the date,time,country and city fields disable - // if auto time update is ON - if (mTimeAutoUpdate) { - mDateItem->setEnabled(false); - mTimeItem->setEnabled(false); - mCountryItem->setEnabled(false); - mCityItem->setEnabled(false); - } -} - -/*! - Populates the Date Picker. - */ -void FtuDateTimeView::populateDatePicker() -{ - if (mDatetimepopup) { - delete mDatetimepopup; - mDatetimepopup = NULL; - } - mDatetimepopup = new HbDialog(); - - mDatetimepopup->setDismissPolicy(HbDialog::NoDismiss); - mDatetimepopup->setTimeout(HbDialog::NoDismiss); - - if(mDatePicker) { - mDatePicker = NULL; - } - mDatePicker = new HbDateTimePicker(QDate::currentDate(), - this); - mDatePicker->setMinimumDate(QDate::fromString("01/01/1900", "dd/MM/yyyy")); - mDatePicker->setMaximumDate(QDate::fromString("31/12/2100", "dd/MM/yyyy")); - mDatePicker->setDisplayFormat(mSettingsUtility->dateFormatString()); - - // Sets the primary action and secondary action - HbAction *primaryAction = new HbAction(tr("OK"), mDatetimepopup); - HbAction *secondaryAction = new HbAction(tr("Cancel"), mDatetimepopup); - - mDatetimepopup->setPrimaryAction(primaryAction); - mDatetimepopup->setSecondaryAction(secondaryAction); - mDatetimepopup->setContentWidget(mDatePicker); - - connect(primaryAction, SIGNAL(triggered()), this, SLOT(updateDate())); - connect(secondaryAction, SIGNAL(triggered()), mDatetimepopup, SLOT(close())); - mDatetimepopup->exec(); -} - -/*! - Populates the Time Picker. - */ -void FtuDateTimeView::populateTimePicker() -{ - if (mDatetimepopup) { - delete mDatetimepopup; - mDatetimepopup = NULL; - } - mDatetimepopup = new HbDialog(); - mDatetimepopup->setDismissPolicy(HbDialog::NoDismiss); - mDatetimepopup->setTimeout(HbDialog::NoDismiss); - - if(mTimePicker) { - mTimePicker = NULL; - } - mTimePicker = new HbDateTimePicker(QTime().currentTime(), - this); - mTimePicker->setDisplayFormat(mSettingsUtility->timeFormatString()); - - // Sets the primary action and secondary action - HbAction *primaryAction = new HbAction(tr("OK"), mDatetimepopup); - HbAction *secondaryAction = new HbAction(tr("Cancel"), mDatetimepopup); - - mDatetimepopup->setPrimaryAction(primaryAction); - mDatetimepopup->setSecondaryAction(secondaryAction); - - mDatetimepopup->setContentWidget(mTimePicker); - - connect(primaryAction, SIGNAL(triggered()), this, SLOT(updateTime())); - connect(secondaryAction, SIGNAL(triggered()), mDatetimepopup, SLOT(close())); - - mDatetimepopup->exec(); -} - -/*! - Sets the Auto Time update. - */ -void FtuDateTimeView::setAutoTimeupDate() -{ - if (mTimeAutoUpdate) { - mAutoTimeUpdateItem->setContentWidgetData("text", "OFF"); - // Set the fields enabled if auto time update is OFF - mDateItem->setEnabled(true); - mTimeItem->setEnabled(true); - mCountryItem->setEnabled(true); - mCityItem->setEnabled(true); - // SetAutomaticTimeUpdate OFF, UnLoad the Plugins - setAutomaticTimeUpdateOff(false); - } else { - mAutoTimeUpdateItem->setContentWidgetData("text", "ON"); - // Set the fields disabled if auto time update is ON - mDateItem->setEnabled(false); - mTimeItem->setEnabled(false); - mCountryItem->setEnabled(false); - mCityItem->setEnabled(false); - // SetAutomaticTimeUpdate ON, Load the Plugins - setAutomaticTimeUpdateOff(true); - } - wizardEditedDate(QDate::currentDate()); -} - -/*! - Populates the City Selection List. - */ -void FtuDateTimeView::populateCitySelectionList() -{ - if(mCitySelectionList) { - mCitySelectionList = NULL; - } - mCitySelectionList = new ClockCitySelectionList(mTimeZoneClient, this); - connect(mCitySelectionList,SIGNAL(citySelected(LocationInfo)), - SLOT(HandleLocationChange(LocationInfo))); - mCitySelectionList->showCityList(); -} - -/*! - Slot to handle the case when a city has been selected from the city. - \param info of type LocationInfo which contains the city selected. - */ -void FtuDateTimeView::HandleLocationChange(LocationInfo location) -{ - // Check if the location is valid. If its not valid the timezoneId will be -1 - if(location.timezoneId != -1) { - // Set the location - mTimeZoneClient->setAsCurrentLocationL(location); - mCountryItem->setContentWidgetData("text", location.countryName); - mCityItem->setContentWidgetData("text", location.cityName); - } - // Cleanup - mCitySelectionList->deleteLater(); -} - -/*! - Sets the device date. - */ -void FtuDateTimeView::updateDate() -{ - QDate date = mDatePicker->date(); - // Set device Date - if (date.isValid()) { - mDateItem->setContentWidgetData("text", - date.toString(mSettingsUtility->dateFormatString())); - mTimeZoneClient->setDateTime(QDateTime(date, QTime::currentTime())); - wizardEditedDate(date); - } -} - -/*! - Sets the device time. - */ -void FtuDateTimeView::updateTime() -{ - QTime time = mTimePicker->time(); - // Set device Time - if (time.isValid()) { - mTimeItem->setContentWidgetData("text", - time.toString(mSettingsUtility->timeFormatString())); - mTimeZoneClient->setDateTime(QDateTime(QDate::currentDate(), time)); - wizardEditedDate(QDate::currentDate()); - } - -} - -/*! - Gets the wizard completed status. - */ -QDate FtuDateTimeView::getWizardCompletedDate() -{ - XQSettingsManager *settingsManager = new XQSettingsManager(); - XQSettingsKey *ftuPluginDateCenrepKey = - new XQSettingsKey(XQSettingsKey::TargetCentralRepository, - KCRUidClockApp, KFtuPluginDate); - // Read the initial values from the cenrep - QString dateString = settingsManager->readItemValue(*ftuPluginDateCenrepKey, - XQSettingsManager::TypeString).toString(); - QDate completedDate = QDate::fromString(dateString, - mSettingsUtility->dateFormatString()); - - // Cleanup. - delete ftuPluginDateCenrepKey; - delete settingsManager; - - return completedDate; -} - -/*! - Gets the wizard Edited date. - */ -void FtuDateTimeView::wizardEditedDate(const QDate &date) -{ - XQSettingsManager *settingsManager = new XQSettingsManager(); - XQSettingsKey *ftuPluginDateCenrepKey = - new XQSettingsKey(XQSettingsKey::TargetCentralRepository, - KCRUidClockApp, KFtuPluginDate); - QString dateString = date.toString(mSettingsUtility->dateFormatString()); - settingsManager->writeItemValue(*ftuPluginDateCenrepKey,dateString); - - // Cleanup. - delete ftuPluginDateCenrepKey; - delete settingsManager; -} - -/*! - To set AutomaticTimeUpdate - */ -void FtuDateTimeView::setAutomaticTimeUpdateOff(bool value) -{ - mTimeZoneClient->setTimeUpdateOn(value); - mTimeAutoUpdate = value; -} -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/ftudatetimewizard/src/ftudatetimewizard.cpp --- a/clock/ftudatetimewizard/src/ftudatetimewizard.cpp Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,169 +0,0 @@ -/* - * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). - * All rights reserved. - * This component and the accompanying materials are made available - * under the terms of "Eclipse Public License v1.0" - * which accompanies this distribution, and is available - * at the URL "http://www.eclipse.org/legal/epl-v10.html". - * - * Initial Contributors: - * Nokia Corporation - initial contribution. - * - * Contributors: - * - * Description: - * - */ - -// System includes -#include -#include -#include -#include -// User includes -#include "ftudatetimewizard.h" -#include "ftudatetimeview.h" -#include "ftudatetimeprivatecrkeys.h" - -static const char* dateTimeTitle = "Date and Time"; -static const char* dateTimeInfoText = "Set your Date Time and Location"; -static const char* dateTimeStripIcon = - ":/images/ftudatetimewizard_menustrip_icon.svg"; -static const char* dateTimeTocIcon = ":/images/ftudatetimewizard_toc_icon.svg"; - -/*! - \class FtuDateTimeWizard - This is the FTU Date time plugin wizard - */ - -/*! - Constructor. - */ -FtuDateTimeWizard::FtuDateTimeWizard() -{ - // Set up wizard settings - mWizardSettings.mMenustripDefaultIcon = QFileInfo(dateTimeStripIcon); - mWizardSettings.mMenustripPressedIcon = QFileInfo(dateTimeStripIcon); - mWizardSettings.mMenustripFocussedIcon = QFileInfo(dateTimeStripIcon); - mWizardSettings.mMenustripLabel = tr(dateTimeTitle); - - mWizardSettings.mTocDefaultIcon = QFileInfo(dateTimeTocIcon); - mWizardSettings.mTocPressedIcon = QFileInfo(dateTimeTocIcon); - mWizardSettings.mTocFocussedIcon = QFileInfo(dateTimeTocIcon); - mWizardSettings.mTocLabel = tr(dateTimeTitle); -} - -/*! - Destructor. - */ -FtuDateTimeWizard::~FtuDateTimeWizard() -{ - //delete mWizardSettings; -} - -/*! - Initialises the wizard.This is called by the FTU framework - */ -void FtuDateTimeWizard::initializeWizard(qint32 cenrepOwnerId, int wizardIdx) -{ - Q_UNUSED(cenrepOwnerId) - Q_UNUSED(wizardIdx) - - //Check if valid Nitz info is received - XQSettingsManager *settingsManager = new XQSettingsManager(); - XQSettingsKey *validNitzCenrepKey = - new XQSettingsKey(XQSettingsKey::TargetCentralRepository, KCRUidNitz, KValidNitz); - // Read the initial values from the cenrep - int validNitz = settingsManager->readItemValue(*validNitzCenrepKey).toInt(); - - //Clean up - delete validNitzCenrepKey; - delete settingsManager; - - // The plugin will be loaded only if valid Nitz info is not received - if(validNitz == 0) { - // Set up view - if (mFtuDateTimeView == NULL) { - mFtuDateTimeView = new FtuDateTimeView(); - mFtuDateTimeView->setAutomaticTimeUpdateOff(false); - } - // If our main view is not created, signal with false. - emit wizardInitialized(this, ((mFtuDateTimeView) ? true: false)); - } - else { - emit wizardInitialized(this, false); - } -} - -/*! - Activates the wizard. - Is called by the FTU framework when wizard becomes the current wizard - */ -void FtuDateTimeWizard::activateWizard() -{ - mFtuDateTimeView->constructView(); - // Signal info text to FTU framework - emit - infoTextUpdated(this, tr(dateTimeInfoText)); - - // Signal view change - emit viewChanged(this, mFtuDateTimeView); -} - -/*! - Deactivates the wizard.Is called by FTU framework when wizard is no longer displayed. - Frees up resources that need not persist between wizard plugin activations. - */ -void FtuDateTimeWizard::deactivateWizard() -{ - // Destroy everything but the initial view and data that takes a long time - // to reacquire when the plugin is later re-activated. -} - -/*! - Notifies the FTU FW how the wizard is been shutdown. - Its called by FTU framework before the wizard plugin destructor is called. - /param reason for the ShutDown - */ -bool FtuDateTimeWizard::shutdownWizard(FtuWizard::ShutdownReason reason) -{ - // Destroy all views - Q_UNUSED(reason); - return true; -} - -/*! - Relayoutes the views for new size. - /param geometry - */ -void FtuDateTimeWizard::resizeWizard(const QRectF& geometry) -{ - Q_UNUSED(geometry) - // Relayout view for new size -} - -/*! - Returns the settings for FTU framework. - */ -const FtuWizardSetting& FtuDateTimeWizard::wizardSettings() -{ - return mWizardSettings; -} - -/*! - Handles the back event. - */ -bool FtuDateTimeWizard::handleBackEvent() -{ - return false; -} - -/*! - Returns the wizard completed date. - */ -QDate FtuDateTimeWizard::wizardCompletedDate() -{ - return (mFtuDateTimeView->getWizardCompletedDate()); -} - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/ftudatetimewizard/src/ftudatetimewizardfactory.cpp --- a/clock/ftudatetimewizard/src/ftudatetimewizardfactory.cpp Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). - * All rights reserved. - * This component and the accompanying materials are made available - * under the terms of "Eclipse Public License v1.0" - * which accompanies this distribution, and is available - * at the URL "http://www.eclipse.org/legal/epl-v10.html". - * - * Initial Contributors: - * Nokia Corporation - initial contribution. - * - * Contributors: - * - * Description: Wizard plugin factory class to instantiate the wizard plugin - * - */ - -// System includes -#include // For Q_EXPORT_PLUGIN2 - -// User includes -#include "ftudatetimewizardfactory.h" -#include "ftudatetimewizard.h" - -/*! - Returns the FTU plugin wizard instance. - */ -FtuWizard* FtuDateTimeWizardFactory::createWizard() const -{ - return new FtuDateTimeWizard(); -} - -Q_EXPORT_PLUGIN2(ftudatetimeplugin, FtuDateTimeWizardFactory) - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/inc/clockcommon.h --- a/clock/inc/clockcommon.h Mon May 03 12:30:32 2010 +0300 +++ b/clock/inc/clockcommon.h Mon Jun 28 15:22:02 2010 +0530 @@ -25,10 +25,7 @@ const QString CITY_INFO_DB ("cityInfo.dat"); const QString CLOCK_DEBUG_FILE("debug.txt"); const QString PATH_TEXT("C:/"); - -const long int KCRUidNitz = { 0x101F8876 }; - -const long int KPreviousAlarmTime = 0x00000002; +const int KMaximumCityListCount(50); // Common definitions for docml. #define CLOCK_MAIN_VIEW_DOCML ":/xml/clockmainview.docml" @@ -38,9 +35,14 @@ #define CLOCK_WIDGET "clockWidget" #define CLOCK_ALARMLIST "alarmListView" #define CLOCK_NOALARMLABEL "noAlarmLabel" -#define WORLD_CLOCK_VIEW_DOCML ":/xml/worldclockview.docml" -#define WORLD_CLOCK_VIEW "worldClockView" -#define CLOCK_VIEWS_STYLE_PATH ":/style" +#define CLOCK_WORLD_VIEW_DOCML ":/xml/clockworldview.docml" +#define CLOCK_WORLD_VIEW "worldClockView" +#define CLOCK_WORLD_CITYLIST "worldClockCityListView" +#define CLOCK_WORLD_HOMECITY "homeCityWidget" +#define CLOCK_WORLD_VIEW_PORTRAIT_NOHOMECITY_SECTION "portrait-nohomecity" +#define CLOCK_WORLD_VIEW_PORTRAIT_HOMECITY_SECTION "portrait-homecity" +#define CLOCK_WORLD_VIEW_LANDSCAPE_NOHOMECITY_SECTION "landscape-nohomecity" +#define CLOCK_WORLD_VIEW_LANDSCAPE_HOMECITY_SECTION "landscape-homecity" #endif // CLOCKCOMMON_H diff -r fd30d51f876b -r b6db4fd4947b clock/inc/clockprivatecrkeys.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/inc/clockprivatecrkeys.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,32 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: The file contains the uid of keys used by application. +* +*/ + +#ifndef CLOCKPRIVATECRKEYS_H +#define CLOCKPRIVATECRKEYS_H + +/** Nitz Settings */ +/** Provides access to the Nitz status.*/ +const long int KCRUidNitz = { 0x101F8876 }; +/** Active Protocol key */ +const long int KActiveProtocol = 0x00000000; +/** Previous alarm time high */ +const long int KPreviousAlarmTime = 0x00000001; + +#endif // CLOCKPRIVATECRKEYS_H + +// End of file --Don't remove this. + diff -r fd30d51f876b -r b6db4fd4947b clock/rom/clock.iby --- a/clock/rom/clock.iby Mon May 03 12:30:32 2010 +0300 +++ b/clock/rom/clock.iby Mon Jun 28 15:22:02 2010 +0530 @@ -41,22 +41,28 @@ data=DATAZ_\resource\mcc\mcc.rsc RESOURCE_FILES_DIR\mcc\mcc.rsc +// Stub sis +data=DATAZ_\system\install\clock_stub.sis \System\Install\clock_stub.sis + // Binaries. file=ABI_DIR\BUILD_DIR\clockalarmclient.dll SHARED_LIB_DIR\clockalarmclient.dll file=ABI_DIR\BUILD_DIR\timezoneclient.dll SHARED_LIB_DIR\timezoneclient.dll -file=ABI_DIR\BUILD_DIR\clockstopwatchengine.dll SHARED_LIB_DIR\clockstopwatchengine.dll file=ABI_DIR\BUILD_DIR\clocksettingsutility.dll SHARED_LIB_DIR\clocksettingsutility.dll file=ABI_DIR\BUILD_DIR\clocksettingsview.dll SHARED_LIB_DIR\clocksettingsview.dll -file=ABI_DIR\BUILD_DIR\clockwidgetproto.dll SHARED_LIB_DIR\clockwidgetproto.dll file=ABI_DIR\BUILD_DIR\clockcityselectionlist.dll SHARED_LIB_DIR\clockcityselectionlist.dll file=ABI_DIR\BUILD_DIR\clockalarmeditor.dll SHARED_LIB_DIR\clockalarmeditor.dll file=ABI_DIR\BUILD_DIR\clockappcontroller.dll SHARED_LIB_DIR\clockappcontroller.dll file=ABI_DIR\BUILD_DIR\clockviewmanager.dll SHARED_LIB_DIR\clockviewmanager.dll file=ABI_DIR\BUILD_DIR\clockviews.dll SHARED_LIB_DIR\clockviews.dll +file=ABI_DIR\BUILD_DIR\clockwidget.dll SHARED_LIB_DIR\clockwidget.dll +file=ABI_DIR\BUILD_DIR\clockwidgetplugin.dll SHARED_LIB_DIR\clockwidgetplugin.dll file=ABI_DIR\BUILD_DIR\datetimesettingsplugin.dll SHARED_LIB_DIR\datetimesettingsplugin.dll data=\epoc32\data\c\resource\qt\plugins\controlpanel\datetimesettingsplugin.qtplugin resource\qt\plugins\controlpanel\datetimesettingsplugin.qtplugin +file=ABI_DIR\BUILD_DIR\clocksettingsviewplugin.dll SHARED_LIB_DIR\clocksettingsviewplugin.dll +data=\epoc32\data\z\resource\qt\plugins\clock\clocksettingsviewplugin.qtplugin resource\qt\plugins\clock\clocksettingsviewplugin.qtplugin + #endif // CLOCK_IBY // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b clock/rom/clockengines.iby --- a/clock/rom/clockengines.iby Mon May 03 12:30:32 2010 +0300 +++ b/clock/rom/clockengines.iby Mon Jun 28 15:22:02 2010 +0530 @@ -34,10 +34,11 @@ // ECOM plugins ECOM_PLUGIN( clocknitzplugin.dll, clocknitzplugin.rsc ) +// TODO : The following will be uncommented once implemented. // Backup registration files -data=DATAZ_\private\10005906\backup_registration.xml private\10005906\backup_registration.xml -data=DATAZ_\private\10005903\backup_registration.xml private\10005903\backup_registration.xml -data=DATAZ_\private\200159A2\backup_registration.xml private\200159A2\backup_registration.xml +// data=DATAZ_\private\10005906\backup_registration.xml private\10005906\backup_registration.xml +// data=DATAZ_\private\10005903\backup_registration.xml private\10005903\backup_registration.xml +// data=DATAZ_\private\200159A2\backup_registration.xml private\200159A2\backup_registration.xml #endif // __CLOCKENGINES_IBY__ diff -r fd30d51f876b -r b6db4fd4947b clock/sis/clock.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/sis/clock.pkg Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,75 @@ +; +; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +; All rights reserved. +; This component and the accompanying materials are made available +; under the terms of "Eclipse Public License v1.0" +; which accompanies this distribution, and is available +; at the URL "http://www.eclipse.org/legal/epl-v10.html". +; +; Initial Contributors: +; Nokia Corporation - initial contribution. +; +; Contributors: +; +; Description: pkg file of Clock Application for IAD. +; + +; Language +&EN + +; standard SIS file header +#{"Clock"}, (0x10005903), 1, 0, 0, TYPE=SA, RU + +; Localised vendor name +%{"Nokia"} + +; Unique vendor name +:"Nokia" + +; Clock engine components +"/epoc32/release/armv5/urel/clockserver.exe" - "!:/sys/bin/clockserver.exe" +"/epoc32/release/armv5/urel/clockserverclient.dll" - "!:/sys/bin/clockserverclient.dll" +"/epoc32/release/armv5/urel/clocktimezoneresolver.dll" - "!:/sys/bin/clocktimezoneresolver.dll" +"/epoc32/release/armv5/urel/clocktimesourceinterface.dll" - "!:/sys/bin/clocktimesourceinterface.dll" +"/epoc32/release/armv5/urel/clockecomlistener.dll" - "!:/sys/bin/clockecomlistener.dll" + +; Clock nitz Ecom plugin +"/epoc32/release/armv5/urel/clocknitzplugin.dll" - "!:/sys/bin/clocknitzplugin.dll" +"/epoc32/data/z/resource/plugins/clocknitzplugin.rsc" - "!:/resource/plugins/clocknitzplugin.rsc" + +; Clock executable and default resource files + +"/epoc32/release/armv5/urel/clock.exe" - "!:/sys/bin/clock.exe" +"/epoc32/data/Z/private/10003a3f/import/apps/clock_reg.rsc" - "!:/private/10003a3f/import/apps/clock_reg.rsc" +"/epoc32/data/z/resource/apps/clock.rsc" - "!:/resource/apps/clock.rsc" +"/epoc32/data/z/resource/qt/translations/clock_en.qm" - "!:/resource/qt/translations/clock_en.qm" + + +"/epoc32/release/armv5/urel/clockalarmclient.dll" - "!:/sys/bin/clockalarmclient.dll" +"/epoc32/release/armv5/urel/timezoneclient.dll" - "!:/sys/bin/timezoneclient.dll" +"/epoc32/release/armv5/urel/clocksettingsutility.dll" - "!:/sys/bin/clocksettingsutility.dll" +"/epoc32/release/armv5/urel/clocksettingsview.dll" - "!:/sys/bin/clocksettingsview.dll" +"/epoc32/release/armv5/urel/clockcityselectionlist.dll" - "!:/sys/bin/clockcityselectionlist.dll" +"/epoc32/release/armv5/urel/clockalarmeditor.dll" - "!:/sys/bin/clockalarmeditor.dll" +"/epoc32/release/armv5/urel/clockappcontroller.dll" - "!:/sys/bin/clockappcontroller.dll" +"/epoc32/release/armv5/urel/clockviewmanager.dll" - "!:/sys/bin/clockviewmanager.dll" +"/epoc32/release/armv5/urel/clockviews.dll" - "!:/sys/bin/clockviews.dll" +"/epoc32/release/armv5/urel/clockwidget.dll" - "!:/sys/bin/clockwidget.dll" +"/epoc32/release/armv5/urel/clockwidgetplugin.dll" - "!:/sys/bin/clockwidgetplugin.dll" + +"/epoc32/data/Z/resource/mcc/mcc.rsc" -"!:/resource/mcc/mcc.rsc" +"/epoc32/data/Z/resource/timezonelocalization/timezones.rsc" -"!:/resource/timezonelocalization/timezones.rsc" +"/epoc32/data/Z/resource/timezonelocalization/timezonegroups.rsc" -"!:/resource/timezonelocalization/timezonegroups.rsc" + +;Qt plugin files to be installed +"/epoc32/release/armv5/urel/datetimesettingsplugin.dll" - "!:/sys/bin/datetimesettingsplugin.dll" +"/epoc32/data/c/resource/qt/plugins/controlpanel/datetimesettingsplugin.qtplugin" - "!:/resource/qt/plugins/controlpanel/datetimesettingsplugin.qtplugin" + +"/epoc32/release/armv5/urel/clocksettingsviewplugin.dll" - "!:/sys/bin/clocksettingsviewplugin.dll" +"/epoc32/data/z/resource/qt/plugins/clock/clocksettingsviewplugin.qtplugin" - "!:/resource/qt/plugins/clock/clocksettingsviewplugin.qtplugin" + +"/epoc32/release/armv5/urel/ftudatetimewizard.dll" - "!:/sys/bin/ftudatetimewizard.dll" +"/epoc32/data/z/resource/qt/plugins/FTU/ftudatetimewizard.qtplugin" - "!:/resource/qt/plugins/FTU/ftudatetimewizard.qtplugin" +"/epoc32/data/z/fturesources/plugins/wizardproviders/ftudatetimewizard.manifest" - "!:/fturesources/plugins/wizardproviders/ftudatetimewizard.manifest" + +;END OF FILE diff -r fd30d51f876b -r b6db4fd4947b clock/sis/createandsign.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/sis/createandsign.bat Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,22 @@ +rem +rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: Bat file to create Clock Application's sisx. +rem + +@echo -------- Create sis packages --------- +makesis clock.pkg + +@echo -------- Sign and rename sis packages ----------- +signsis clock.sis clock.sisx Nokia_RnDCert_02.der Nokia_RnDCert_02.key + diff -r fd30d51f876b -r b6db4fd4947b clock/sis/nokia_rndcert_02.der Binary file clock/sis/nokia_rndcert_02.der has changed diff -r fd30d51f876b -r b6db4fd4947b clock/sis/nokia_rndcert_02.key --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/sis/nokia_rndcert_02.key Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQC/TDP7KKIaf5+uW4OD2iVZuUMC2a+SeQTjf6srlKcOm+CpPNXn +uLNm/8fdEnyOIuRXPRKmqhs1n0JkxEGHynELWMTuKXbQx9SRAGUXzyneGn+IJNnO +vOKHWgKCouX2hfI8rtkdqJpqmO460gGsMgw+lsbeyWyW9lnfLxq+ZC7sqQIDAQAB +AoGBALmUWZE8GBaQ3P4u9WUCSd3DJkkrmXIFSULSZeH/chlwCwDjbbhArHothVzo +REE3hEFFlERvHbplZ+mNouzy7boduvgUzbksGrbGMLJ2qO1GzWWVwV+GzOWKd3ss +/98Gwoy5R8pjnkqUE2wP1iJFw0FjvUTKcYv/z6t3LLJ0CsoBAkEA+c7ixvsviQ3J +s0INytCKU2bf8fqFQJi1VI82ukxNsujGTQ9upVSjuvqPvWyDvvTdrUBHqO+3qPut +sEh01Q8aiQJBAMQKDJPVRu4ud3mwUfEavzL5EjqwG1k9VCNGYsT4FwtrHcxu1oP/ +pk6M3rIZukqomoEEnHWPMwhrK3fhBqi0OSECQQDr40VXege4FnH5OI2Hj4afHMyp +VdQQXGMWFyopnzXblFz0lXb43cTCIiorR9XcMqNFHybLypkWE5o+lRzlt55pAkBQ +P/zeF5Sts//cpL0mgdh7OVKpC6ZmZaCnwAx2rUhhuDu+kDDoYCLoTOps5fNI1LRK +1GRoC3LMo3Jr5IYhUYWBAkBpCpN6k4JU/mszq98EojHerQNxk8sPqvQKUzTutohT +1gLX9yepGayB/TtT2EEJDkWOlnTy/dvN6W3vzbJYz97x +-----END RSA PRIVATE KEY----- diff -r fd30d51f876b -r b6db4fd4947b clock/stubsis/clock_stub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/stubsis/clock_stub.pkg Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,27 @@ +; +; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +; All rights reserved. +; This component and the accompanying materials are made available +; under the terms of "Eclipse Public License v1.0" +; which accompanies this distribution, and is available +; at the URL "http://www.eclipse.org/legal/epl-v10.html". +; +; Initial Contributors: +; Nokia Corporation - initial contribution. +; +; Contributors: +; +; Description: pkg file of Clock Application for IAD. +; + +; Language +&EN + +; Header +#{"Clock"}, (0x10005903), 1, 0, 0, TYPE=SA + +; Localised vendor name +%{"Nokia"} + +; Unique vendor name +:"Nokia" \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b clock/stubsis/clock_stub.sis Binary file clock/stubsis/clock_stub.sis has changed diff -r fd30d51f876b -r b6db4fd4947b clock/tsrc/tsrc.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/tsrc/tsrc.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,20 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# This is the project specification file clock test code +# + +# include test components here + +# End of file --Don't remove this diff -r fd30d51f876b -r b6db4fd4947b notes/data/notes.qrc --- a/notes/data/notes.qrc Mon May 03 12:30:32 2010 +0300 +++ b/notes/data/notes.qrc Mon Jun 28 15:22:02 2010 +0530 @@ -1,1 +1,1 @@ - translations/notes.qm xml/notesmainview.docml xml/notescollectionsview.docml xml/notestodoview.docml xml/notesfavoriteview.docml xml/notesnoteview.docml style/hblistviewitem.css style/hblistviewitem.widgetml \ No newline at end of file + xml/notesmainview.docml xml/notescollectionsview.docml xml/notestodoview.docml xml/notesfavoriteview.docml xml/notesnoteview.docml style/hblistviewitem.css style/hblistviewitem.widgetml \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b notes/data/translations/notes.qm Binary file notes/data/translations/notes.qm has changed diff -r fd30d51f876b -r b6db4fd4947b notes/data/translations/notes.ts --- a/notes/data/translations/notes.ts Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,836 +0,0 @@ - - - - - - Due date for To-do note - %1 - - qtl_list_pri_graphic - Notes_P11 - list - No - False - - - Toolbar button to create new To-do note - New To-do - - qtl_toolbar_tiny_4 - Notes_L7 - button - No - False - - - Default texxt value for Description field in a dataform - Description - - qtl_dataform_editor_sec - Notes_P12 - formlabel_5_val - No - False - - - Default text value for Subject field in a dataform - Subject - - qtl_dataform_editor_sec - Notes_P12 - formlabel_4_val - No - False - - - Item specific menu item . This action launchs the To-Do editor to add due date and remainder for the selected note - Make it as To-do note - - qtl_menu_sec - Notes_P1 - menu - No - False - - - toolbar button text in landscape mode . If user taps on this button, Find functionality is enabled in all notes view - Find - - qtl_toolbar_tiny_4 - Notes_L1 - button - No - False - - - Sub title in To-do Editor - To-do - - qtl_groupbox_simple_sec - Notes_P8 - subhead - No - False - - - Option menu item to create new note - New note - - qtl_menu_pri - Notes_P5 - opt - No - False - - - Secondary text item to mention modification time for a note - Modified at %1 - - qtl_list_sec_graphic - Notes_P1 - dblist_14_val - No - False - - - Priority value in Combo Box used in a dataform - Low - - qtl_dataform_combobox_sec - Notes_P8 - setlabel_4_val - No - False - - - Secondary text item to mention creation date and time for a task - Created on %1 %2 - - qtl_list_sec_graphic - Notes_P1 - dblist_1_val - No - False - - - Message dialog header text . Time picker component embedded - Alarm time - - qtl_dialog_pri_heading - Notes_P9 - title - No - False - - - Label item in Data form - Due date - - qtl_dataform_pri - Notes_P8 - formlabel_1 - No - False - - - Options menu item to remove description from the To-do editor - Remove description - - qtl_menu_pri - Notes_P12 - opt - No - False - - - Message dialog header text . Date picker component embedded - Alarm date - - qtl_dialog_pri_heading - Notes_P9 - title - No - False - - - Item specific menu item to mark a task as not done - Mark as not done - - qtl_menu_sec - Notes_P1 - menu - No - False - - - Soft notification dialog info text. This dialog is displayed once the note is modified and saved - Note saved - - qtl_notifdialog_pri2 - Notes - dpopinfo - No - False - - - toolbar button text in landscape mode . If user taps on this button, Notes editor is launched to add note - New note - - qtl_toolbar_tiny_4 - Notes_L1 - button - No - False - - - Secondary text item to mention creation time for a note - Created at %1 - - qtl_list_sec_graphic - Notes_P1 - dblist_12_val - No - False - - - Sub title for All Notes view - %Ln Notes - - qtl_groupbox_simple_sec - Notes_P1 - subhead - No - False - - - Primary text label in To-do Viewer - Description: - - qtl_list_pri - Notes_P11 - dblist_7 - No - False - - - Primary text label in To-do viewer - Subject: - - qtl_list_pri_graphic_add - Notes_P11 - dblist_5 - No - False - - - Options menu item to add description field in To-do note editor - Add description - - qtl_menu_pri - Notes_P8 - opt - No - False - - - List item to show the number<Count> of items (To-Dos, Recent notes, Favourites) - Right side of the list item - [ %1 ] - - qtl_list_pri - Notes_P2 - list - No - False - - - Date push button in Data Form to set due date for a To-do note. This action opens the date picker component - %1 - - qtl_dataform_button_sec - Notes_P8 - button - No - False - - - Priority value in Combo Box used in a dataform - High - - qtl_dataform_combobox_sec - Notes_P8 - setlabel_4_val - No - False - - - Completed date value (Secondary text ) in To-do viewer - %1 - - qtl_list_sec - Notes_P11 - dblist_6_val - No - False - - - Option menu item to discard the changes done in the notes editor - Discard changes - - qtl_menu_pri - Notes_P5 - opt - No - False - - - Notes application in application library grid view - Notes - - qtl_grid_applications_sec - Notes - list - No - False - - - Delete - Confirmation dialog softkey button - Delete - - qtl_dialog_softkey_2 - Notes_P19 - button - No - False - - - Options menu item to change the completed to-do status to not-completed - Mark as not done - - qtl_menu_pri - Notes_P11 - opt - No - False - - - Primary text label in To-do viewer - Completed date: - - qtl_list_pri - Notes_P11 - dblist_6 - No - False - - - Priority value in Combo Box used in a dataform - Normal - - qtl_dataform_combobox_sec - Notes_P8 - setlabel_4_val - No - False - - - Sub title in Recent notes list view - Plain notes - - qtl_groupbox_simple_sec - Notes_P6 - subhead - No - False - - - Toolbar button item to delete the note - Delete - - qtl_toolbar_tiny_3 - Notes_L4 - button - No - False - - - Collections name in the list widget (Left Side) - Favorites - - qtl_list_pri - Notes_P2 - list - No - False - - - Confirmation dialog text for deleting a note - Delete note? - - qtl_dialog_pri5_large_graphic - Notes_P19 - info - No - False - - - Creation & Modification time and date will be shown in the groupBox. Custom groupBox label . Text shown on the right side of the widget - %1 %2 - - txt_notes_subhead_1_2 - Notes_P5 - subhead - No - False - - - One of the toolbar button text in landscape mode . If user taps on this button, All notes view is displayed - All notes - - qtl_toolbar_tiny_4 - Notes_L1 - button - No - False - - - Confirmation dialog text for deleting a To-do note - Delete To-do note? - - qtl_dialog_pri5_large_graphic - Notes_P19 - info - No - False - - - Item specific menu item to remove the note from favorites - Remove from favorites - - qtl_menu_sec - Notes_P1 - menu - No - False - - - Toolbar button to launch calendar editor and add content in the subject and description field - Add to Calendar - - qtl_toolbar_tiny_3 - Notes_L4 - button - No - False - - - Notes application in application library list view - Notes - - qtl_list_pri_large_graphic - Notes - list - No - False - - - Custom layout ID. No parent . If the view is empty, this text should be displayed in the All notes empy list view. Same text is used in landscape as well - No notes available - - txt_notes_list_no_notes_available - Notes_P1 - list - No - False - - - Tool bar button used to send the note to other user - Send - - qtl_toolbar_tiny_3 - Notes_L4 - button - No - False - - - Collections name in the list widget (Left Side) - Plain notes - - qtl_list_pri - Notes_P2 - list - No - False - - - Alarm time and date for To-do note - %1 %2 - - qtl_list_pri_graphic - Notes_P11 - list - No - False - - - Secondary text item to mention creation date for a note - Created on %1 - - qtl_list_sec_graphic - Notes_P1 - dblist_11_val - No - False - - - Message dialog header text . Date picker component embedded - Due date - - qtl_dialog_pri_heading - Notes_P9 - title - No - False - - - Collections name in the list widget (Left Side) - To-do's - - qtl_list_pri - Notes_P2 - list - No - False - - - Layout ID Parent. Custom GroupBox. Sub title in Notes editor (Left Side) - Note - - txt_notes_subhead_note - Notes_P5 - subhead - No - False - - - Confirmation dialog text for deleting multiple to-do notes - Delete To-do notes? - - qtl_dialog_pri5_large_graphic - Notes_P19 - info - No - False - - - Soft notification dialog info text. This dialog is displayed once the new note is saved - New note saved - - qtl_notifdialog_pri2 - Notes - dpopinfo - No - False - - - Layout ID Parent. Date Push Button in Dataform to set alarm date for a To-do note. This action opens the date picker component - %1 - - txt_notes_button_2 - Notes_P8 - button - No - False - - - Options menu item to convert a note to To-Do item. This action launchs To-Do editor to add due date and reminder - Make it as To-do note - - qtl_menu_pri - Notes_P4 - opt - No - False - - - Options menu item to remove the note from favorites item - Remove from favorites - - qtl_menu_pri - Notes_P5 - opt - No - False - - - Layout ID Parent. Custom GroupBox. Sub title in Notes editor (Creating new note) - Left side text - New note - - txt_notes_subhead_new_note - Notes_P4 - subhead - No - False - - - Sub title in New To-do note editor - New To-do - - qtl_groupbox_simple_sec - Notes_P12 - subhead - No - False - - - Title bar text for Notes application+ - Notes - - qtl_titlebar - Notes_P1 - title - No - False - - - Options menu item to mark the note as favorite item - Mark as favorite - - qtl_menu_pri - Notes_P4 - opt - No - False - - - Sub title for Collections view - Collections - - qtl_groupbox_simple_sec - Notes_P2 - subhead - No - False - - - Label item in Data form - Alarm date and time - - qtl_dataform_pri - Notes_P8 - formlabel_3 - No - False - - - toolbar button text in landscape mode . If user taps on this button, Collections view is displayed - Collections - - qtl_toolbar_tiny_4 - Notes_L1 - button - No - False - - - One of 3 buttons in Toolbar . Toolbar button item to edit the To-do note - Edit - - qtl_toolbar_tiny_3 - Notes_P11 - button - No - False - - - Secondary text item to mention modified date & time for a note - Modified on %1 %2 - - qtl_list_sec_graphic - Notes_P1 - dblist_2_val - No - False - - - Layout ID Parent. Custom Widget . Time Push Button in Dataform to set alarm time for a To-do note. This action opens the time picker component - %1 - - txt_notes_button_1 - Notes_P8 - button - No - False - - - Confirmation dialog text for deleting multiple notes - Delete notes? - - qtl_dialog_pri5_large_graphic - Notes_P19 - info - No - False - - - Sub title in Favorite notes list view - Favorites - - qtl_groupbox_simple_sec - Notes_P3 - subhead - No - False - - - Secondary text item in the list to show due date for a task - Due on %1 - - qtl_list_sec_graphic - Notes_P1 - dblist_3_val - No - False - - - Item specific menu item to mark a note as favorite - Mark as favorite - - qtl_menu_sec - Notes_P1 - menu - No - False - - - Secondary text in the list item. If subject is not mentioned for a note, this text is displayed as secondary text in the All notes list view - Unnamed - - qtl_list_sec_graphic - Notes_P11 - dblist_5_val - No - False - - - Secondary text item in the list to show completed date for To-do note - Completed on %1 - - qtl_list_sec_graphic - Notes_P1 - dblist_4_val - No - False - - - Options menu item to change the non-completed to-do status to completed - Mark as done - - qtl_menu_pri - Notes_P11 - opt - No - False - - - Soft notification dialog info text. This dialog is displayed once the new to-do note is saved - New To-do note saved - - qtl_notifdialog_pri2 - Notes_P10 - dpopinfo - No - False - - - Label item in Data form - Priority - - qtl_dataform_pri - Notes_P8 - setlabel_4 - No - False - - - Soft notification dialog info text. This dialog is displayed once to-do note is modified and saved - To-do note saved - - qtl_notifdialog_pri2 - Notes_P10 - dpopinfo - No - False - - - Sub title in To-do notes list view - To-do's (%Ln Pending ) - - qtl_groupbox_simple_sec - Notes_P7 - subhead - No - False - - - Notes application name in Task Switcher - Notes - - cell_tport_appsw_pane_t1 - Task Switcher - caption - Ta - False - - - Secondary text item to mention modification date for a note - Modified on %1 - - qtl_list_sec_graphic - Notes_P1 - dblist_13_val - No - False - - - Primary text in all notes list view if the subject is not mentioned for a To-do note - Unnamed - - qtl_list_pri_graphic_add - Notes_P1 - dblist_11 - No - False - - - Item specific menu item. This action launches the event editor and adds the notes content to the subject & description field - Add to Calendar - - qtl_menu_sec - Notes_P1 - menu - No - False - - - Item specific menu item to mark a task as completed - Mark as done - - qtl_menu_sec - Notes_P1 - menu - No - False - - - Checkbox label item to enable/disable alarm - Alarm - - qtl_dataform_checkbox_sec - Notes_P8 - formlabel_2 - No - False - - - diff -r fd30d51f876b -r b6db4fd4947b notes/data/xml/notescollectionsview.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/data/xml/notescollectionsview.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b notes/data/xml/notesfavoriteview.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/data/xml/notesfavoriteview.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b notes/data/xml/notesmainview.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/data/xml/notesmainview.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b notes/data/xml/notesnoteview.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/data/xml/notesnoteview.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b notes/data/xml/notestodoview.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/data/xml/notestodoview.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b notes/notes.pro --- a/notes/notes.pro Mon May 03 12:30:32 2010 +0300 +++ b/notes/notes.pro Mon Jun 28 15:22:02 2010 +0530 @@ -21,7 +21,9 @@ symbian: { BLD_INF_RULES.prj_exports += \ "./rom/notes.iby CORE_APP_LAYER_IBY_EXPORT_PATH(notes.iby)" \ - "./rom/notesresources.iby LANGUAGE_APP_LAYER_IBY_EXPORT_PATH(notesresources.iby)" + "./rom/notesresources.iby LANGUAGE_APP_LAYER_IBY_EXPORT_PATH(notesresources.iby)" \ + # stubsis is added to provide IAD + "./stubsis/notes_stub.sis /epoc32/data/z/system/install/notes_stub.sis" } # End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/bwins/notesappcontrolleru.def --- a/notes/notesui/bwins/notesappcontrolleru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -EXPORTS - ??1NotesAppController@@UAE@XZ @ 1 NONAME ; NotesAppController::~NotesAppController(void) - ??_ENotesAppController@@UAE@I@Z @ 2 NONAME ; NotesAppController::~NotesAppController(unsigned int) - ??0NotesAppController@@QAE@PAVQObject@@@Z @ 3 NONAME ; NotesAppController::NotesAppController(class QObject *) - diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/bwins/noteseditoru.def --- a/notes/notesui/bwins/noteseditoru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,24 +0,0 @@ -EXPORTS - ?edit@NotesEditor@@QAEXVAgendaEntry@@@Z @ 1 NONAME ; void NotesEditor::edit(class AgendaEntry) - ?tr@NotesEditor@@SA?AVQString@@PBD0H@Z @ 2 NONAME ; class QString NotesEditor::tr(char const *, char const *, int) - ?edit@NotesEditor@@QAEXK@Z @ 3 NONAME ; void NotesEditor::edit(unsigned long) - ?edit@NotesEditor@@QAEXABVQFile@@@Z @ 4 NONAME ; void NotesEditor::edit(class QFile const &) - ?d_func@NotesEditor@@ABEPBVNotesEditorPrivate@@XZ @ 5 NONAME ; class NotesEditorPrivate const * NotesEditor::d_func(void) const - ?qt_metacast@NotesEditor@@UAEPAXPBD@Z @ 6 NONAME ; void * NotesEditor::qt_metacast(char const *) - ?trUtf8@NotesEditor@@SA?AVQString@@PBD0H@Z @ 7 NONAME ; class QString NotesEditor::trUtf8(char const *, char const *, int) - ??_ENotesEditor@@UAE@I@Z @ 8 NONAME ; NotesEditor::~NotesEditor(unsigned int) - ?edit@NotesEditor@@QAEXABVQString@@@Z @ 9 NONAME ; void NotesEditor::edit(class QString const &) - ?qt_metacall@NotesEditor@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 10 NONAME ; int NotesEditor::qt_metacall(enum QMetaObject::Call, int, void * *) - ?create@NotesEditor@@QAEXW4CreateType@1@@Z @ 11 NONAME ; void NotesEditor::create(enum NotesEditor::CreateType) - ?d_func@NotesEditor@@AAEPAVNotesEditorPrivate@@XZ @ 12 NONAME ; class NotesEditorPrivate * NotesEditor::d_func(void) - ??1NotesEditor@@UAE@XZ @ 13 NONAME ; NotesEditor::~NotesEditor(void) - ??0NotesEditor@@QAE@PAVQObject@@@Z @ 14 NONAME ; NotesEditor::NotesEditor(class QObject *) - ?staticMetaObject@NotesEditor@@2UQMetaObject@@B @ 15 NONAME ; struct QMetaObject const NotesEditor::staticMetaObject - ??0NotesEditor@@QAE@PAVAgendaUtil@@PAVQObject@@@Z @ 16 NONAME ; NotesEditor::NotesEditor(class AgendaUtil *, class QObject *) - ?editingCompleted@NotesEditor@@IAEX_N@Z @ 17 NONAME ; void NotesEditor::editingCompleted(bool) - ?metaObject@NotesEditor@@UBEPBUQMetaObject@@XZ @ 18 NONAME ; struct QMetaObject const * NotesEditor::metaObject(void) const - ?tr@NotesEditor@@SA?AVQString@@PBD0@Z @ 19 NONAME ; class QString NotesEditor::tr(char const *, char const *) - ?trUtf8@NotesEditor@@SA?AVQString@@PBD0@Z @ 20 NONAME ; class QString NotesEditor::trUtf8(char const *, char const *) - ?getStaticMetaObject@NotesEditor@@SAABUQMetaObject@@XZ @ 21 NONAME ; struct QMetaObject const & NotesEditor::getStaticMetaObject(void) - ?close@NotesEditor@@QAEKW4CloseType@1@@Z @ 22 NONAME ; unsigned long NotesEditor::close(enum NotesEditor::CloseType) - diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/bwins/notesmodelhandleru.def --- a/notes/notesui/bwins/notesmodelhandleru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -EXPORTS - ?agendaInterface@NotesModelHandler@@QAEPAVAgendaUtil@@XZ @ 1 NONAME ; class AgendaUtil * NotesModelHandler::agendaInterface(void) - ??_ENotesModelHandler@@UAE@I@Z @ 2 NONAME ; NotesModelHandler::~NotesModelHandler(unsigned int) - ??1NotesModelHandler@@UAE@XZ @ 3 NONAME ; NotesModelHandler::~NotesModelHandler(void) - ??0NotesModelHandler@@QAE@PAVQObject@@@Z @ 4 NONAME ; NotesModelHandler::NotesModelHandler(class QObject *) - ?notesModel@NotesModelHandler@@QAEPAVNotesModel@@XZ @ 5 NONAME ; class NotesModel * NotesModelHandler::notesModel(void) - diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/bwins/notesmodelu.def --- a/notes/notesui/bwins/notesmodelu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -EXPORTS - ?sourceModel@NotesModel@@QAEPAVQAbstractItemModel@@XZ @ 1 NONAME ; class QAbstractItemModel * NotesModel::sourceModel(void) - ?filterAcceptsRow@NotesSortFilterProxyModel@@MBE_NHABVQModelIndex@@@Z @ 2 NONAME ; bool NotesSortFilterProxyModel::filterAcceptsRow(int, class QModelIndex const &) const - ?modifyEntryInModel@NotesModel@@AAEXKH@Z @ 3 NONAME ; void NotesModel::modifyEntryInModel(unsigned long, int) - ?getStaticMetaObject@NotesSortFilterProxyModel@@SAABUQMetaObject@@XZ @ 4 NONAME ; struct QMetaObject const & NotesSortFilterProxyModel::getStaticMetaObject(void) - ?appendCompTodosToModel@NotesModel@@AAEXAAV?$QList@VAgendaEntry@@@@@Z @ 5 NONAME ; void NotesModel::appendCompTodosToModel(class QList &) - ?tr@NotesSortFilterProxyModel@@SA?AVQString@@PBD0H@Z @ 6 NONAME ; class QString NotesSortFilterProxyModel::tr(char const *, char const *, int) - ?rowAdded@NotesModel@@IAEXVQModelIndex@@@Z @ 7 NONAME ; void NotesModel::rowAdded(class QModelIndex) - ?qt_metacast@NotesModel@@UAEPAXPBD@Z @ 8 NONAME ; void * NotesModel::qt_metacast(char const *) - ?trUtf8@NotesSortFilterProxyModel@@SA?AVQString@@PBD0@Z @ 9 NONAME ; class QString NotesSortFilterProxyModel::trUtf8(char const *, char const *) - ?lessThan@NotesSortFilterProxyModel@@MBE_NABVQModelIndex@@0@Z @ 10 NONAME ; bool NotesSortFilterProxyModel::lessThan(class QModelIndex const &, class QModelIndex const &) const - ?metaObject@NotesSortFilterProxyModel@@UBEPBUQMetaObject@@XZ @ 11 NONAME ; struct QMetaObject const * NotesSortFilterProxyModel::metaObject(void) const - ?trUtf8@NotesSortFilterProxyModel@@SA?AVQString@@PBD0H@Z @ 12 NONAME ; class QString NotesSortFilterProxyModel::trUtf8(char const *, char const *, int) - ?metaObject@NotesModel@@UBEPBUQMetaObject@@XZ @ 13 NONAME ; struct QMetaObject const * NotesModel::metaObject(void) const - ?tr@NotesModel@@SA?AVQString@@PBD0H@Z @ 14 NONAME ; class QString NotesModel::tr(char const *, char const *, int) - ?staticMetaObject@NotesModel@@2UQMetaObject@@B @ 15 NONAME ; struct QMetaObject const NotesModel::staticMetaObject - ?staticMetaObject@NotesSortFilterProxyModel@@2UQMetaObject@@B @ 16 NONAME ; struct QMetaObject const NotesSortFilterProxyModel::staticMetaObject - ??0NotesModel@@QAE@PAVAgendaUtil@@PAVQObject@@@Z @ 17 NONAME ; NotesModel::NotesModel(class AgendaUtil *, class QObject *) - ??_ENotesSortFilterProxyModel@@UAE@I@Z @ 18 NONAME ; NotesSortFilterProxyModel::~NotesSortFilterProxyModel(unsigned int) - ??1NotesSortFilterProxyModel@@UAE@XZ @ 19 NONAME ; NotesSortFilterProxyModel::~NotesSortFilterProxyModel(void) - ?qt_metacall@NotesSortFilterProxyModel@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 20 NONAME ; int NotesSortFilterProxyModel::qt_metacall(enum QMetaObject::Call, int, void * *) - ?tr@NotesModel@@SA?AVQString@@PBD0@Z @ 21 NONAME ; class QString NotesModel::tr(char const *, char const *) - ?getStaticMetaObject@NotesModel@@SAABUQMetaObject@@XZ @ 22 NONAME ; struct QMetaObject const & NotesModel::getStaticMetaObject(void) - ?tr@NotesSortFilterProxyModel@@SA?AVQString@@PBD0@Z @ 23 NONAME ; class QString NotesSortFilterProxyModel::tr(char const *, char const *) - ?addEntryToModel@NotesModel@@AAEXK@Z @ 24 NONAME ; void NotesModel::addEntryToModel(unsigned long) - ??1NotesModel@@UAE@XZ @ 25 NONAME ; NotesModel::~NotesModel(void) - ?removeEntryFromModel@NotesModel@@AAEXK@Z @ 26 NONAME ; void NotesModel::removeEntryFromModel(unsigned long) - ?qt_metacast@NotesSortFilterProxyModel@@UAEPAXPBD@Z @ 27 NONAME ; void * NotesSortFilterProxyModel::qt_metacast(char const *) - ?appendInCompTodosToModel@NotesModel@@AAEXAAV?$QList@VAgendaEntry@@@@@Z @ 28 NONAME ; void NotesModel::appendInCompTodosToModel(class QList &) - ?insertNoteToModel@NotesModel@@AAE_NAAVQModelIndex@@K@Z @ 29 NONAME ; bool NotesModel::insertNoteToModel(class QModelIndex &, unsigned long) - ?qt_metacall@NotesModel@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 30 NONAME ; int NotesModel::qt_metacall(enum QMetaObject::Call, int, void * *) - ?populateSourceModel@NotesModel@@AAEXV?$QList@K@@@Z @ 31 NONAME ; void NotesModel::populateSourceModel(class QList) - ?appendNotesToModel@NotesModel@@AAEXAAV?$QList@VAgendaEntry@@@@@Z @ 32 NONAME ; void NotesModel::appendNotesToModel(class QList &) - ?updateSourceModel@NotesModel@@AAEXK@Z @ 33 NONAME ; void NotesModel::updateSourceModel(unsigned long) - ??_ENotesModel@@UAE@I@Z @ 34 NONAME ; NotesModel::~NotesModel(unsigned int) - ?trUtf8@NotesModel@@SA?AVQString@@PBD0H@Z @ 35 NONAME ; class QString NotesModel::trUtf8(char const *, char const *, int) - ?insertInCompTodoToModel@NotesModel@@AAE_NAAVQModelIndex@@K@Z @ 36 NONAME ; bool NotesModel::insertInCompTodoToModel(class QModelIndex &, unsigned long) - ?trUtf8@NotesModel@@SA?AVQString@@PBD0@Z @ 37 NONAME ; class QString NotesModel::trUtf8(char const *, char const *) - ?insertCompTodoToModel@NotesModel@@AAE_NAAVQModelIndex@@K@Z @ 38 NONAME ; bool NotesModel::insertCompTodoToModel(class QModelIndex &, unsigned long) - ??0NotesSortFilterProxyModel@@QAE@AAVAgendaUtil@@PAVQObject@@@Z @ 39 NONAME ; NotesSortFilterProxyModel::NotesSortFilterProxyModel(class AgendaUtil &, class QObject *) - ?populateSourceModel@NotesModel@@AAEXXZ @ 40 NONAME ; void NotesModel::populateSourceModel(void) - ?dateFormatString@NotesModel@@AAE?AVQString@@XZ @ 41 NONAME ; class QString NotesModel::dateFormatString(void) - ?timeFormatString@NotesModel@@AAE?AVQString@@XZ @ 42 NONAME ; class QString NotesModel::timeFormatString(void) - diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/bwins/notesviewmanageru.def --- a/notes/notesui/bwins/notesviewmanageru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,5 +0,0 @@ -EXPORTS - ??1NotesViewManager@@UAE@XZ @ 1 NONAME ; NotesViewManager::~NotesViewManager(void) - ?switchToView@NotesViewManager@@QAEXW4NotesViewIds@NotesNamespace@@@Z @ 2 NONAME ; void NotesViewManager::switchToView(enum NotesNamespace::NotesViewIds) - ??0NotesViewManager@@QAE@AAVNotesAppControllerIf@@PAVQObject@@@Z @ 3 NONAME ; NotesViewManager::NotesViewManager(class NotesAppControllerIf &, class QObject *) - diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/bwins/notesviewsu.def --- a/notes/notesui/bwins/notesviewsu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,17 +0,0 @@ -EXPORTS - ??1NotesCollectionView@@UAE@XZ @ 1 NONAME ; NotesCollectionView::~NotesCollectionView(void) - ?setupView@NotesCollectionView@@QAEXAAVNotesAppControllerIf@@PAVNotesDocLoader@@@Z @ 2 NONAME ; void NotesCollectionView::setupView(class NotesAppControllerIf &, class NotesDocLoader *) - ??1NotesMainView@@UAE@XZ @ 3 NONAME ; NotesMainView::~NotesMainView(void) - ??0NotesFavoriteView@@QAE@PAVQGraphicsWidget@@@Z @ 4 NONAME ; NotesFavoriteView::NotesFavoriteView(class QGraphicsWidget *) - ??1NotesFavoriteView@@UAE@XZ @ 5 NONAME ; NotesFavoriteView::~NotesFavoriteView(void) - ?setupView@NotesMainView@@QAEXAAVNotesAppControllerIf@@PAVNotesDocLoader@@@Z @ 6 NONAME ; void NotesMainView::setupView(class NotesAppControllerIf &, class NotesDocLoader *) - ??0NotesTodoView@@QAE@PAVQGraphicsWidget@@@Z @ 7 NONAME ; NotesTodoView::NotesTodoView(class QGraphicsWidget *) - ??0NotesMainView@@QAE@PAVQGraphicsWidget@@@Z @ 8 NONAME ; NotesMainView::NotesMainView(class QGraphicsWidget *) - ??1NotesTodoView@@UAE@XZ @ 9 NONAME ; NotesTodoView::~NotesTodoView(void) - ?setupView@NotesFavoriteView@@QAEXAAVNotesAppControllerIf@@PAVNotesDocLoader@@@Z @ 10 NONAME ; void NotesFavoriteView::setupView(class NotesAppControllerIf &, class NotesDocLoader *) - ?setupView@NotesTodoView@@QAEXAAVNotesAppControllerIf@@PAVNotesDocLoader@@@Z @ 11 NONAME ; void NotesTodoView::setupView(class NotesAppControllerIf &, class NotesDocLoader *) - ??0NotesCollectionView@@QAE@PAVQGraphicsWidget@@@Z @ 12 NONAME ; NotesCollectionView::NotesCollectionView(class QGraphicsWidget *) - ??0NotesNoteView@@QAE@PAVQGraphicsWidget@@@Z @ 13 NONAME ; NotesNoteView::NotesNoteView(class QGraphicsWidget *) - ??1NotesNoteView@@UAE@XZ @ 14 NONAME ; NotesNoteView::~NotesNoteView(void) - ?setupView@NotesNoteView@@QAEXAAVNotesAppControllerIf@@PAVNotesDocLoader@@@Z @ 15 NONAME ; void NotesNoteView::setupView(class NotesAppControllerIf &, class NotesDocLoader *) - diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/eabi/notesappcontrolleru.def --- a/notes/notesui/eabi/notesappcontrolleru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,9 +0,0 @@ -EXPORTS - _ZN18NotesAppControllerC1EP7QObject @ 1 NONAME - _ZN18NotesAppControllerC2EP7QObject @ 2 NONAME - _ZN18NotesAppControllerD0Ev @ 3 NONAME - _ZN18NotesAppControllerD1Ev @ 4 NONAME - _ZN18NotesAppControllerD2Ev @ 5 NONAME - _ZTI18NotesAppController @ 6 NONAME - _ZTV18NotesAppController @ 7 NONAME - diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/eabi/noteseditoru.def --- a/notes/notesui/eabi/noteseditoru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,23 +0,0 @@ -EXPORTS - _ZN11NotesEditor11qt_metacallEN11QMetaObject4CallEiPPv @ 1 NONAME - _ZN11NotesEditor11qt_metacastEPKc @ 2 NONAME - _ZN11NotesEditor16editingCompletedEb @ 3 NONAME - _ZN11NotesEditor16staticMetaObjectE @ 4 NONAME DATA 16 - _ZN11NotesEditor19getStaticMetaObjectEv @ 5 NONAME - _ZN11NotesEditor4editE11AgendaEntry @ 6 NONAME - _ZN11NotesEditor4editERK5QFile @ 7 NONAME - _ZN11NotesEditor4editERK7QString @ 8 NONAME - _ZN11NotesEditor4editEm @ 9 NONAME - _ZN11NotesEditor6createENS_10CreateTypeE @ 10 NONAME - _ZN11NotesEditorC1EP10AgendaUtilP7QObject @ 11 NONAME - _ZN11NotesEditorC1EP7QObject @ 12 NONAME - _ZN11NotesEditorC2EP10AgendaUtilP7QObject @ 13 NONAME - _ZN11NotesEditorC2EP7QObject @ 14 NONAME - _ZN11NotesEditorD0Ev @ 15 NONAME - _ZN11NotesEditorD1Ev @ 16 NONAME - _ZN11NotesEditorD2Ev @ 17 NONAME - _ZNK11NotesEditor10metaObjectEv @ 18 NONAME - _ZTI11NotesEditor @ 19 NONAME - _ZTV11NotesEditor @ 20 NONAME - _ZN11NotesEditor5closeENS_9CloseTypeE @ 21 NONAME - diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/eabi/notesmodelhandleru.def --- a/notes/notesui/eabi/notesmodelhandleru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -EXPORTS - _ZN17NotesModelHandler10notesModelEv @ 1 NONAME - _ZN17NotesModelHandler15agendaInterfaceEv @ 2 NONAME - _ZN17NotesModelHandlerC1EP7QObject @ 3 NONAME - _ZN17NotesModelHandlerC2EP7QObject @ 4 NONAME - _ZN17NotesModelHandlerD0Ev @ 5 NONAME - _ZN17NotesModelHandlerD1Ev @ 6 NONAME - _ZN17NotesModelHandlerD2Ev @ 7 NONAME - _ZTI17NotesModelHandler @ 8 NONAME - _ZTV17NotesModelHandler @ 9 NONAME - diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/eabi/notesmodelu.def --- a/notes/notesui/eabi/notesmodelu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -EXPORTS - _ZN10NotesModel11qt_metacallEN11QMetaObject4CallEiPPv @ 1 NONAME - _ZN10NotesModel11qt_metacastEPKc @ 2 NONAME - _ZN10NotesModel11sourceModelEv @ 3 NONAME - _ZN10NotesModel15addEntryToModelEm @ 4 NONAME - _ZN10NotesModel16staticMetaObjectE @ 5 NONAME DATA 16 - _ZN10NotesModel17insertNoteToModelER11QModelIndexm @ 6 NONAME - _ZN10NotesModel17updateSourceModelEm @ 7 NONAME - _ZN10NotesModel18appendNotesToModelER5QListI11AgendaEntryE @ 8 NONAME - _ZN10NotesModel18modifyEntryInModelEmi @ 9 NONAME - _ZN10NotesModel19getStaticMetaObjectEv @ 10 NONAME - _ZN10NotesModel19populateSourceModelE5QListImE @ 11 NONAME - _ZN10NotesModel19populateSourceModelEv @ 12 NONAME - _ZN10NotesModel20removeEntryFromModelEm @ 13 NONAME - _ZN10NotesModel21insertCompTodoToModelER11QModelIndexm @ 14 NONAME - _ZN10NotesModel22appendCompTodosToModelER5QListI11AgendaEntryE @ 15 NONAME - _ZN10NotesModel23insertInCompTodoToModelER11QModelIndexm @ 16 NONAME - _ZN10NotesModel24appendInCompTodosToModelER5QListI11AgendaEntryE @ 17 NONAME - _ZN10NotesModel8rowAddedE11QModelIndex @ 18 NONAME - _ZN10NotesModelC1EP10AgendaUtilP7QObject @ 19 NONAME - _ZN10NotesModelC2EP10AgendaUtilP7QObject @ 20 NONAME - _ZN10NotesModelD0Ev @ 21 NONAME - _ZN10NotesModelD1Ev @ 22 NONAME - _ZN10NotesModelD2Ev @ 23 NONAME - _ZN25NotesSortFilterProxyModel11qt_metacallEN11QMetaObject4CallEiPPv @ 24 NONAME - _ZN25NotesSortFilterProxyModel11qt_metacastEPKc @ 25 NONAME - _ZN25NotesSortFilterProxyModel16staticMetaObjectE @ 26 NONAME DATA 16 - _ZN25NotesSortFilterProxyModel19getStaticMetaObjectEv @ 27 NONAME - _ZN25NotesSortFilterProxyModelC1ER10AgendaUtilP7QObject @ 28 NONAME - _ZN25NotesSortFilterProxyModelC2ER10AgendaUtilP7QObject @ 29 NONAME - _ZN25NotesSortFilterProxyModelD0Ev @ 30 NONAME - _ZN25NotesSortFilterProxyModelD1Ev @ 31 NONAME - _ZN25NotesSortFilterProxyModelD2Ev @ 32 NONAME - _ZNK10NotesModel10metaObjectEv @ 33 NONAME - _ZNK25NotesSortFilterProxyModel10metaObjectEv @ 34 NONAME - _ZNK25NotesSortFilterProxyModel16filterAcceptsRowEiRK11QModelIndex @ 35 NONAME - _ZNK25NotesSortFilterProxyModel8lessThanERK11QModelIndexS2_ @ 36 NONAME - _ZTI10NotesModel @ 37 NONAME - _ZTI25NotesSortFilterProxyModel @ 38 NONAME - _ZTV10NotesModel @ 39 NONAME - _ZTV25NotesSortFilterProxyModel @ 40 NONAME - _ZN10NotesModel16dateFormatStringEv @ 41 NONAME - _ZN10NotesModel16timeFormatStringEv @ 42 NONAME - diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/eabi/notesviewmanageru.def --- a/notes/notesui/eabi/notesviewmanageru.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -EXPORTS - _ZN16NotesViewManager12switchToViewEN14NotesNamespace12NotesViewIdsE @ 1 NONAME - _ZN16NotesViewManagerC1ER20NotesAppControllerIfP7QObject @ 2 NONAME - _ZN16NotesViewManagerC2ER20NotesAppControllerIfP7QObject @ 3 NONAME - _ZN16NotesViewManagerD0Ev @ 4 NONAME - _ZN16NotesViewManagerD1Ev @ 5 NONAME - _ZN16NotesViewManagerD2Ev @ 6 NONAME - diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/eabi/notesviewsu.def --- a/notes/notesui/eabi/notesviewsu.def Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -EXPORTS - _ZN13NotesMainView9setupViewER20NotesAppControllerIfP14NotesDocLoader @ 1 NONAME - _ZN13NotesMainViewC1EP15QGraphicsWidget @ 2 NONAME - _ZN13NotesMainViewC2EP15QGraphicsWidget @ 3 NONAME - _ZN13NotesMainViewD0Ev @ 4 NONAME - _ZN13NotesMainViewD1Ev @ 5 NONAME - _ZN13NotesMainViewD2Ev @ 6 NONAME - _ZN13NotesTodoView9setupViewER20NotesAppControllerIfP14NotesDocLoader @ 7 NONAME - _ZN13NotesTodoViewC1EP15QGraphicsWidget @ 8 NONAME - _ZN13NotesTodoViewC2EP15QGraphicsWidget @ 9 NONAME - _ZN13NotesTodoViewD0Ev @ 10 NONAME - _ZN13NotesTodoViewD1Ev @ 11 NONAME - _ZN13NotesTodoViewD2Ev @ 12 NONAME - _ZN17NotesFavoriteView9setupViewER20NotesAppControllerIfP14NotesDocLoader @ 13 NONAME - _ZN17NotesFavoriteViewC1EP15QGraphicsWidget @ 14 NONAME - _ZN17NotesFavoriteViewC2EP15QGraphicsWidget @ 15 NONAME - _ZN17NotesFavoriteViewD0Ev @ 16 NONAME - _ZN17NotesFavoriteViewD1Ev @ 17 NONAME - _ZN17NotesFavoriteViewD2Ev @ 18 NONAME - _ZN19NotesCollectionView9setupViewER20NotesAppControllerIfP14NotesDocLoader @ 19 NONAME - _ZN19NotesCollectionViewC1EP15QGraphicsWidget @ 20 NONAME - _ZN19NotesCollectionViewC2EP15QGraphicsWidget @ 21 NONAME - _ZN19NotesCollectionViewD0Ev @ 22 NONAME - _ZN19NotesCollectionViewD1Ev @ 23 NONAME - _ZN19NotesCollectionViewD2Ev @ 24 NONAME - _ZThn16_N13NotesMainViewD0Ev @ 25 NONAME - _ZThn16_N13NotesMainViewD1Ev @ 26 NONAME - _ZThn16_N13NotesTodoViewD0Ev @ 27 NONAME - _ZThn16_N13NotesTodoViewD1Ev @ 28 NONAME - _ZThn16_N17NotesFavoriteViewD0Ev @ 29 NONAME - _ZThn16_N17NotesFavoriteViewD1Ev @ 30 NONAME - _ZThn16_N19NotesCollectionViewD0Ev @ 31 NONAME - _ZThn16_N19NotesCollectionViewD1Ev @ 32 NONAME - _ZThn8_N13NotesMainViewD0Ev @ 33 NONAME - _ZThn8_N13NotesMainViewD1Ev @ 34 NONAME - _ZThn8_N13NotesTodoViewD0Ev @ 35 NONAME - _ZThn8_N13NotesTodoViewD1Ev @ 36 NONAME - _ZThn8_N17NotesFavoriteViewD0Ev @ 37 NONAME - _ZThn8_N17NotesFavoriteViewD1Ev @ 38 NONAME - _ZThn8_N19NotesCollectionViewD0Ev @ 39 NONAME - _ZThn8_N19NotesCollectionViewD1Ev @ 40 NONAME - _ZN13NotesNoteView9setupViewER20NotesAppControllerIfP14NotesDocLoader @ 41 NONAME - _ZN13NotesNoteViewC1EP15QGraphicsWidget @ 42 NONAME - _ZN13NotesNoteViewC2EP15QGraphicsWidget @ 43 NONAME - _ZN13NotesNoteViewD0Ev @ 44 NONAME - _ZN13NotesNoteViewD1Ev @ 45 NONAME - _ZN13NotesNoteViewD2Ev @ 46 NONAME - _ZThn16_N13NotesNoteViewD0Ev @ 47 NONAME - _ZThn16_N13NotesNoteViewD1Ev @ 48 NONAME - _ZThn8_N13NotesNoteViewD0Ev @ 49 NONAME - _ZThn8_N13NotesNoteViewD1Ev @ 50 NONAME - diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesappcontroller/bwins/notesappcontrolleru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/notesappcontroller/bwins/notesappcontrolleru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,5 @@ +EXPORTS + ??1NotesAppController@@UAE@XZ @ 1 NONAME ; NotesAppController::~NotesAppController(void) + ??_ENotesAppController@@UAE@I@Z @ 2 NONAME ; NotesAppController::~NotesAppController(unsigned int) + ??0NotesAppController@@QAE@PAVQObject@@@Z @ 3 NONAME ; NotesAppController::NotesAppController(class QObject *) + diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesappcontroller/eabi/notesappcontrolleru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/notesappcontroller/eabi/notesappcontrolleru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,9 @@ +EXPORTS + _ZN18NotesAppControllerC1EP7QObject @ 1 NONAME + _ZN18NotesAppControllerC2EP7QObject @ 2 NONAME + _ZN18NotesAppControllerD0Ev @ 3 NONAME + _ZN18NotesAppControllerD1Ev @ 4 NONAME + _ZN18NotesAppControllerD2Ev @ 5 NONAME + _ZTI18NotesAppController @ 6 NONAME + _ZTV18NotesAppController @ 7 NONAME + diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesappcontroller/src/notesappcontroller.cpp --- a/notes/notesui/notesappcontroller/src/notesappcontroller.cpp Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesappcontroller/src/notesappcontroller.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -38,7 +38,7 @@ mIfImpl(0) { // Construct the interface implementation. - mIfImpl = new NotesAppControllerIfImpl(this, this); + mIfImpl = new NotesAppControllerIfImpl(this); // Construct the model handler. mNotesModelHandler = new NotesModelHandler(this); diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesappcontroller/src/notesappcontrollerifimpl.cpp --- a/notes/notesui/notesappcontroller/src/notesappcontrollerifimpl.cpp Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesappcontroller/src/notesappcontrollerifimpl.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -38,7 +38,7 @@ */ NotesAppControllerIfImpl::NotesAppControllerIfImpl( NotesAppController *controller, QObject *parent) -:QObject(parent), +:QObject(controller), mAppController(controller) { // Nothing yet. diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesapplication/notesapplication.pro --- a/notes/notesui/notesapplication/notesapplication.pro Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesapplication/notesapplication.pro Mon Jun 28 15:22:02 2010 +0530 @@ -47,6 +47,8 @@ notes.path = /sys/bin DEPLOYMENT += notes + + SKINICON = qtg_large_notes } SOURCES += main.cpp diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesapplication/rndcert.der Binary file notes/notesui/notesapplication/rndcert.der has changed diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesapplication/rndcert.key --- a/notes/notesui/notesapplication/rndcert.key Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIICXQIBAAKBgQC/TDP7KKIaf5+uW4OD2iVZuUMC2a+SeQTjf6srlKcOm+CpPNXn -uLNm/8fdEnyOIuRXPRKmqhs1n0JkxEGHynELWMTuKXbQx9SRAGUXzyneGn+IJNnO -vOKHWgKCouX2hfI8rtkdqJpqmO460gGsMgw+lsbeyWyW9lnfLxq+ZC7sqQIDAQAB -AoGBALmUWZE8GBaQ3P4u9WUCSd3DJkkrmXIFSULSZeH/chlwCwDjbbhArHothVzo -REE3hEFFlERvHbplZ+mNouzy7boduvgUzbksGrbGMLJ2qO1GzWWVwV+GzOWKd3ss -/98Gwoy5R8pjnkqUE2wP1iJFw0FjvUTKcYv/z6t3LLJ0CsoBAkEA+c7ixvsviQ3J -s0INytCKU2bf8fqFQJi1VI82ukxNsujGTQ9upVSjuvqPvWyDvvTdrUBHqO+3qPut -sEh01Q8aiQJBAMQKDJPVRu4ud3mwUfEavzL5EjqwG1k9VCNGYsT4FwtrHcxu1oP/ -pk6M3rIZukqomoEEnHWPMwhrK3fhBqi0OSECQQDr40VXege4FnH5OI2Hj4afHMyp -VdQQXGMWFyopnzXblFz0lXb43cTCIiorR9XcMqNFHybLypkWE5o+lRzlt55pAkBQ -P/zeF5Sts//cpL0mgdh7OVKpC6ZmZaCnwAx2rUhhuDu+kDDoYCLoTOps5fNI1LRK -1GRoC3LMo3Jr5IYhUYWBAkBpCpN6k4JU/mszq98EojHerQNxk8sPqvQKUzTutohT -1gLX9yepGayB/TtT2EEJDkWOlnTy/dvN6W3vzbJYz97x ------END RSA PRIVATE KEY----- diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesapplication/src/main.cpp --- a/notes/notesui/notesapplication/src/main.cpp Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesapplication/src/main.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -17,10 +17,9 @@ // System includes #include -#include #include #include - +#include // User includes #include "notesappcontroller.h" @@ -42,9 +41,8 @@ window.setViewportUpdateMode(QGraphicsView::MinimalViewportUpdate); // Load the translation file. - QTranslator notesViewsTranslator; - notesViewsTranslator.load("notes",":/translations"); - app.installTranslator(¬esViewsTranslator); + HbTranslator notesViewsTranslator("notes"); + notesViewsTranslator.loadCommon(); // Construct the application controller. QScopedPointer controller(new NotesAppController); diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/noteseditor/bwins/noteseditoru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/noteseditor/bwins/noteseditoru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,24 @@ +EXPORTS + ?edit@NotesEditor@@QAEXVAgendaEntry@@@Z @ 1 NONAME ; void NotesEditor::edit(class AgendaEntry) + ?tr@NotesEditor@@SA?AVQString@@PBD0H@Z @ 2 NONAME ; class QString NotesEditor::tr(char const *, char const *, int) + ?edit@NotesEditor@@QAEXK@Z @ 3 NONAME ; void NotesEditor::edit(unsigned long) + ?edit@NotesEditor@@QAEXABVQFile@@@Z @ 4 NONAME ; void NotesEditor::edit(class QFile const &) + ?d_func@NotesEditor@@ABEPBVNotesEditorPrivate@@XZ @ 5 NONAME ; class NotesEditorPrivate const * NotesEditor::d_func(void) const + ?qt_metacast@NotesEditor@@UAEPAXPBD@Z @ 6 NONAME ; void * NotesEditor::qt_metacast(char const *) + ?trUtf8@NotesEditor@@SA?AVQString@@PBD0H@Z @ 7 NONAME ; class QString NotesEditor::trUtf8(char const *, char const *, int) + ??_ENotesEditor@@UAE@I@Z @ 8 NONAME ; NotesEditor::~NotesEditor(unsigned int) + ?edit@NotesEditor@@QAEXABVQString@@@Z @ 9 NONAME ; void NotesEditor::edit(class QString const &) + ?qt_metacall@NotesEditor@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 10 NONAME ; int NotesEditor::qt_metacall(enum QMetaObject::Call, int, void * *) + ?create@NotesEditor@@QAEXW4CreateType@1@@Z @ 11 NONAME ; void NotesEditor::create(enum NotesEditor::CreateType) + ?d_func@NotesEditor@@AAEPAVNotesEditorPrivate@@XZ @ 12 NONAME ; class NotesEditorPrivate * NotesEditor::d_func(void) + ??1NotesEditor@@UAE@XZ @ 13 NONAME ; NotesEditor::~NotesEditor(void) + ??0NotesEditor@@QAE@PAVQObject@@@Z @ 14 NONAME ; NotesEditor::NotesEditor(class QObject *) + ?staticMetaObject@NotesEditor@@2UQMetaObject@@B @ 15 NONAME ; struct QMetaObject const NotesEditor::staticMetaObject + ??0NotesEditor@@QAE@PAVAgendaUtil@@PAVQObject@@@Z @ 16 NONAME ; NotesEditor::NotesEditor(class AgendaUtil *, class QObject *) + ?close@NotesEditor@@QAEKW4CloseType@1@@Z @ 17 NONAME ; unsigned long NotesEditor::close(enum NotesEditor::CloseType) + ?editingCompleted@NotesEditor@@IAEX_N@Z @ 18 NONAME ; void NotesEditor::editingCompleted(bool) + ?metaObject@NotesEditor@@UBEPBUQMetaObject@@XZ @ 19 NONAME ; struct QMetaObject const * NotesEditor::metaObject(void) const + ?tr@NotesEditor@@SA?AVQString@@PBD0@Z @ 20 NONAME ; class QString NotesEditor::tr(char const *, char const *) + ?trUtf8@NotesEditor@@SA?AVQString@@PBD0@Z @ 21 NONAME ; class QString NotesEditor::trUtf8(char const *, char const *) + ?getStaticMetaObject@NotesEditor@@SAABUQMetaObject@@XZ @ 22 NONAME ; struct QMetaObject const & NotesEditor::getStaticMetaObject(void) + diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/noteseditor/data/noteseditor.qrc --- a/notes/notesui/noteseditor/data/noteseditor.qrc Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/noteseditor/data/noteseditor.qrc Mon Jun 28 15:22:02 2010 +0530 @@ -1,1 +1,1 @@ - translations/notes.qm xml/notesnoteeditor.docml xml/todoeditor.docml \ No newline at end of file + xml/notesnoteeditor.docml xml/todoeditor.docml \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/noteseditor/data/translations/notes.qm Binary file notes/notesui/noteseditor/data/translations/notes.qm has changed diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/noteseditor/data/translations/notes.ts --- a/notes/notesui/noteseditor/data/translations/notes.ts Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,836 +0,0 @@ - - - - - - Due date for To-do note - %1 - - qtl_list_pri_graphic - Notes_P11 - list - No - False - - - Toolbar button to create new To-do note - New To-do - - qtl_toolbar_tiny_4 - Notes_L7 - button - No - False - - - Default texxt value for Description field in a dataform - Description - - qtl_dataform_editor_sec - Notes_P12 - formlabel_5_val - No - False - - - Default text value for Subject field in a dataform - Subject - - qtl_dataform_editor_sec - Notes_P12 - formlabel_4_val - No - False - - - Item specific menu item . This action launchs the To-Do editor to add due date and remainder for the selected note - Make it as To-do note - - qtl_menu_sec - Notes_P1 - menu - No - False - - - toolbar button text in landscape mode . If user taps on this button, Find functionality is enabled in all notes view - Find - - qtl_toolbar_tiny_4 - Notes_L1 - button - No - False - - - Sub title in To-do Editor - To-do - - qtl_groupbox_simple_sec - Notes_P8 - subhead - No - False - - - Option menu item to create new note - New note - - qtl_menu_pri - Notes_P5 - opt - No - False - - - Secondary text item to mention modification time for a note - Modified at %1 - - qtl_list_sec_graphic - Notes_P1 - dblist_14_val - No - False - - - Priority value in Combo Box used in a dataform - Low - - qtl_dataform_combobox_sec - Notes_P8 - setlabel_4_val - No - False - - - Secondary text item to mention creation date and time for a task - Created on %1 %2 - - qtl_list_sec_graphic - Notes_P1 - dblist_1_val - No - False - - - Message dialog header text . Time picker component embedded - Alarm time - - qtl_dialog_pri_heading - Notes_P9 - title - No - False - - - Label item in Data form - Due date - - qtl_dataform_pri - Notes_P8 - formlabel_1 - No - False - - - Options menu item to remove description from the To-do editor - Remove description - - qtl_menu_pri - Notes_P12 - opt - No - False - - - Message dialog header text . Date picker component embedded - Alarm date - - qtl_dialog_pri_heading - Notes_P9 - title - No - False - - - Item specific menu item to mark a task as not done - Mark as not done - - qtl_menu_sec - Notes_P1 - menu - No - False - - - Soft notification dialog info text. This dialog is displayed once the note is modified and saved - Note saved - - qtl_notifdialog_pri2 - Notes - dpopinfo - No - False - - - toolbar button text in landscape mode . If user taps on this button, Notes editor is launched to add note - New note - - qtl_toolbar_tiny_4 - Notes_L1 - button - No - False - - - Secondary text item to mention creation time for a note - Created at %1 - - qtl_list_sec_graphic - Notes_P1 - dblist_12_val - No - False - - - Sub title for All Notes view - %Ln Notes - - qtl_groupbox_simple_sec - Notes_P1 - subhead - No - False - - - Primary text label in To-do Viewer - Description: - - qtl_list_pri - Notes_P11 - dblist_7 - No - False - - - Primary text label in To-do viewer - Subject: - - qtl_list_pri_graphic_add - Notes_P11 - dblist_5 - No - False - - - Options menu item to add description field in To-do note editor - Add description - - qtl_menu_pri - Notes_P8 - opt - No - False - - - List item to show the number<Count> of items (To-Dos, Recent notes, Favourites) - Right side of the list item - [ %1 ] - - qtl_list_pri - Notes_P2 - list - No - False - - - Date push button in Data Form to set due date for a To-do note. This action opens the date picker component - %1 - - qtl_dataform_button_sec - Notes_P8 - button - No - False - - - Priority value in Combo Box used in a dataform - High - - qtl_dataform_combobox_sec - Notes_P8 - setlabel_4_val - No - False - - - Completed date value (Secondary text ) in To-do viewer - %1 - - qtl_list_sec - Notes_P11 - dblist_6_val - No - False - - - Option menu item to discard the changes done in the notes editor - Discard changes - - qtl_menu_pri - Notes_P5 - opt - No - False - - - Notes application in application library grid view - Notes - - qtl_grid_applications_sec - Notes - list - No - False - - - Delete - Confirmation dialog softkey button - Delete - - qtl_dialog_softkey_2 - Notes_P19 - button - No - False - - - Options menu item to change the completed to-do status to not-completed - Mark as not done - - qtl_menu_pri - Notes_P11 - opt - No - False - - - Primary text label in To-do viewer - Completed date: - - qtl_list_pri - Notes_P11 - dblist_6 - No - False - - - Priority value in Combo Box used in a dataform - Normal - - qtl_dataform_combobox_sec - Notes_P8 - setlabel_4_val - No - False - - - Sub title in Recent notes list view - Plain notes - - qtl_groupbox_simple_sec - Notes_P6 - subhead - No - False - - - Toolbar button item to delete the note - Delete - - qtl_toolbar_tiny_3 - Notes_L4 - button - No - False - - - Collections name in the list widget (Left Side) - Favorites - - qtl_list_pri - Notes_P2 - list - No - False - - - Confirmation dialog text for deleting a note - Delete note? - - qtl_dialog_pri5_large_graphic - Notes_P19 - info - No - False - - - Creation & Modification time and date will be shown in the groupBox. Custom groupBox label . Text shown on the right side of the widget - %1 %2 - - txt_notes_subhead_1_2 - Notes_P5 - subhead - No - False - - - One of the toolbar button text in landscape mode . If user taps on this button, All notes view is displayed - All notes - - qtl_toolbar_tiny_4 - Notes_L1 - button - No - False - - - Confirmation dialog text for deleting a To-do note - Delete To-do note? - - qtl_dialog_pri5_large_graphic - Notes_P19 - info - No - False - - - Item specific menu item to remove the note from favorites - Remove from favorites - - qtl_menu_sec - Notes_P1 - menu - No - False - - - Toolbar button to launch calendar editor and add content in the subject and description field - Add to Calendar - - qtl_toolbar_tiny_3 - Notes_L4 - button - No - False - - - Notes application in application library list view - Notes - - qtl_list_pri_large_graphic - Notes - list - No - False - - - Custom layout ID. No parent . If the view is empty, this text should be displayed in the All notes empy list view. Same text is used in landscape as well - No notes available - - txt_notes_list_no_notes_available - Notes_P1 - list - No - False - - - Tool bar button used to send the note to other user - Send - - qtl_toolbar_tiny_3 - Notes_L4 - button - No - False - - - Collections name in the list widget (Left Side) - Plain notes - - qtl_list_pri - Notes_P2 - list - No - False - - - Alarm time and date for To-do note - %1 %2 - - qtl_list_pri_graphic - Notes_P11 - list - No - False - - - Secondary text item to mention creation date for a note - Created on %1 - - qtl_list_sec_graphic - Notes_P1 - dblist_11_val - No - False - - - Message dialog header text . Date picker component embedded - Due date - - qtl_dialog_pri_heading - Notes_P9 - title - No - False - - - Collections name in the list widget (Left Side) - To-do's - - qtl_list_pri - Notes_P2 - list - No - False - - - Layout ID Parent. Custom GroupBox. Sub title in Notes editor (Left Side) - Note - - txt_notes_subhead_note - Notes_P5 - subhead - No - False - - - Confirmation dialog text for deleting multiple to-do notes - Delete To-do notes? - - qtl_dialog_pri5_large_graphic - Notes_P19 - info - No - False - - - Soft notification dialog info text. This dialog is displayed once the new note is saved - New note saved - - qtl_notifdialog_pri2 - Notes - dpopinfo - No - False - - - Layout ID Parent. Date Push Button in Dataform to set alarm date for a To-do note. This action opens the date picker component - %1 - - txt_notes_button_2 - Notes_P8 - button - No - False - - - Options menu item to convert a note to To-Do item. This action launchs To-Do editor to add due date and reminder - Make it as To-do note - - qtl_menu_pri - Notes_P4 - opt - No - False - - - Options menu item to remove the note from favorites item - Remove from favorites - - qtl_menu_pri - Notes_P5 - opt - No - False - - - Layout ID Parent. Custom GroupBox. Sub title in Notes editor (Creating new note) - Left side text - New note - - txt_notes_subhead_new_note - Notes_P4 - subhead - No - False - - - Sub title in New To-do note editor - New To-do - - qtl_groupbox_simple_sec - Notes_P12 - subhead - No - False - - - Title bar text for Notes application+ - Notes - - qtl_titlebar - Notes_P1 - title - No - False - - - Options menu item to mark the note as favorite item - Mark as favorite - - qtl_menu_pri - Notes_P4 - opt - No - False - - - Sub title for Collections view - Collections - - qtl_groupbox_simple_sec - Notes_P2 - subhead - No - False - - - Label item in Data form - Alarm date and time - - qtl_dataform_pri - Notes_P8 - formlabel_3 - No - False - - - toolbar button text in landscape mode . If user taps on this button, Collections view is displayed - Collections - - qtl_toolbar_tiny_4 - Notes_L1 - button - No - False - - - One of 3 buttons in Toolbar . Toolbar button item to edit the To-do note - Edit - - qtl_toolbar_tiny_3 - Notes_P11 - button - No - False - - - Secondary text item to mention modified date & time for a note - Modified on %1 %2 - - qtl_list_sec_graphic - Notes_P1 - dblist_2_val - No - False - - - Layout ID Parent. Custom Widget . Time Push Button in Dataform to set alarm time for a To-do note. This action opens the time picker component - %1 - - txt_notes_button_1 - Notes_P8 - button - No - False - - - Confirmation dialog text for deleting multiple notes - Delete notes? - - qtl_dialog_pri5_large_graphic - Notes_P19 - info - No - False - - - Sub title in Favorite notes list view - Favorites - - qtl_groupbox_simple_sec - Notes_P3 - subhead - No - False - - - Secondary text item in the list to show due date for a task - Due on %1 - - qtl_list_sec_graphic - Notes_P1 - dblist_3_val - No - False - - - Item specific menu item to mark a note as favorite - Mark as favorite - - qtl_menu_sec - Notes_P1 - menu - No - False - - - Secondary text in the list item. If subject is not mentioned for a note, this text is displayed as secondary text in the All notes list view - Unnamed - - qtl_list_sec_graphic - Notes_P11 - dblist_5_val - No - False - - - Secondary text item in the list to show completed date for To-do note - Completed on %1 - - qtl_list_sec_graphic - Notes_P1 - dblist_4_val - No - False - - - Options menu item to change the non-completed to-do status to completed - Mark as done - - qtl_menu_pri - Notes_P11 - opt - No - False - - - Soft notification dialog info text. This dialog is displayed once the new to-do note is saved - New To-do note saved - - qtl_notifdialog_pri2 - Notes_P10 - dpopinfo - No - False - - - Label item in Data form - Priority - - qtl_dataform_pri - Notes_P8 - setlabel_4 - No - False - - - Soft notification dialog info text. This dialog is displayed once to-do note is modified and saved - To-do note saved - - qtl_notifdialog_pri2 - Notes_P10 - dpopinfo - No - False - - - Sub title in To-do notes list view - To-do's (%Ln Pending ) - - qtl_groupbox_simple_sec - Notes_P7 - subhead - No - False - - - Notes application name in Task Switcher - Notes - - cell_tport_appsw_pane_t1 - Task Switcher - caption - Ta - False - - - Secondary text item to mention modification date for a note - Modified on %1 - - qtl_list_sec_graphic - Notes_P1 - dblist_13_val - No - False - - - Primary text in all notes list view if the subject is not mentioned for a To-do note - Unnamed - - qtl_list_pri_graphic_add - Notes_P1 - dblist_11 - No - False - - - Item specific menu item. This action launches the event editor and adds the notes content to the subject & description field - Add to Calendar - - qtl_menu_sec - Notes_P1 - menu - No - False - - - Item specific menu item to mark a task as completed - Mark as done - - qtl_menu_sec - Notes_P1 - menu - No - False - - - Checkbox label item to enable/disable alarm - Alarm - - qtl_dataform_checkbox_sec - Notes_P8 - formlabel_2 - No - False - - - diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/noteseditor/data/xml/notesnoteeditor.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/noteseditor/data/xml/notesnoteeditor.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/noteseditor/data/xml/todoeditor.docml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/noteseditor/data/xml/todoeditor.docml Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/noteseditor/eabi/noteseditoru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/noteseditor/eabi/noteseditoru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,23 @@ +EXPORTS + _ZN11NotesEditor11qt_metacallEN11QMetaObject4CallEiPPv @ 1 NONAME + _ZN11NotesEditor11qt_metacastEPKc @ 2 NONAME + _ZN11NotesEditor16editingCompletedEb @ 3 NONAME + _ZN11NotesEditor16staticMetaObjectE @ 4 NONAME DATA 16 + _ZN11NotesEditor19getStaticMetaObjectEv @ 5 NONAME + _ZN11NotesEditor4editE11AgendaEntry @ 6 NONAME + _ZN11NotesEditor4editERK5QFile @ 7 NONAME + _ZN11NotesEditor4editERK7QString @ 8 NONAME + _ZN11NotesEditor4editEm @ 9 NONAME + _ZN11NotesEditor5closeENS_9CloseTypeE @ 10 NONAME + _ZN11NotesEditor6createENS_10CreateTypeE @ 11 NONAME + _ZN11NotesEditorC1EP10AgendaUtilP7QObject @ 12 NONAME + _ZN11NotesEditorC1EP7QObject @ 13 NONAME + _ZN11NotesEditorC2EP10AgendaUtilP7QObject @ 14 NONAME + _ZN11NotesEditorC2EP7QObject @ 15 NONAME + _ZN11NotesEditorD0Ev @ 16 NONAME + _ZN11NotesEditorD1Ev @ 17 NONAME + _ZN11NotesEditorD2Ev @ 18 NONAME + _ZNK11NotesEditor10metaObjectEv @ 19 NONAME + _ZTI11NotesEditor @ 20 NONAME + _ZTV11NotesEditor @ 21 NONAME + diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/noteseditor/inc/noteseditor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/noteseditor/inc/noteseditor.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,75 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* The header file for NotesEditor class. +* +*/ + +#ifndef NOTESEDITOR_H +#define NOTESEDITOR_H + +// System includes +#include +#include + +// User includes +#include "noteseditordefines.h" + +// Forward declarations +class QFile; +class QString; +class AgendaUtil; +class AgendaEntry; +class NotesEditorPrivate; + +class NOTESEDITOR_EXPORT NotesEditor : public QObject +{ + Q_OBJECT + +public: + enum CreateType{ + CreateNote = 0, + CreateTodo, + CreateTypeUnKnown = -1 + }; + enum CloseType{ + CloseWithSave = 0, + CloseWithoutSave, + CloseTypeUnKnown = -1 + }; + + explicit NotesEditor(QObject *parent = 0); + explicit NotesEditor(AgendaUtil *agendaUtil, QObject *parent = 0); + virtual ~NotesEditor(); + +public: + void edit(const QString &string); + void edit(const QFile &handle); + void edit(AgendaEntry entry); + void edit(ulong id); + void create(CreateType type); + ulong close(CloseType type); + +signals: + void editingCompleted(bool status = true); + +private: + NotesEditorPrivate *d_ptr; + Q_DECLARE_PRIVATE_D(d_ptr, NotesEditor) + Q_DISABLE_COPY(NotesEditor) +}; + +#endif // NOTESEDITOR_H + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/noteseditor/inc/noteseditor_p.h --- a/notes/notesui/noteseditor/inc/noteseditor_p.h Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/noteseditor/inc/noteseditor_p.h Mon Jun 28 15:22:02 2010 +0530 @@ -31,7 +31,7 @@ // Forward declarations class QFile; class QString; -class QTranslator; +class HbTranslator; class HbView; class AgendaUtil; class NotesEditor; @@ -85,7 +85,7 @@ bool mOwnsAgendaUtil; bool mSaveEntry; - QPointer mTranslator; + HbTranslator *mTranslator; ulong mNoteId; private: diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/noteseditor/inc/noteseditordefines.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/noteseditor/inc/noteseditordefines.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,33 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* This is the common definition file for the notes editor. +* +*/ + +#ifndef NOTESEDITORDEFINES_H +#define NOTESEDITORDEFINES_H + +// System includes +#include + +#ifdef NOTESEDITOR_LIB +# define NOTESEDITOR_EXPORT Q_DECL_EXPORT +#else +# define NOTESEDITOR_EXPORT Q_DECL_IMPORT +#endif + +#endif // NOTESEDITORDEFINES_H + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/noteseditor/inc/notesnoteeditor.h --- a/notes/notesui/noteseditor/inc/notesnoteeditor.h Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/noteseditor/inc/notesnoteeditor.h Mon Jun 28 15:22:02 2010 +0530 @@ -48,7 +48,6 @@ private: void execute(AgendaEntry entry); QString getDescription(); - bool showDeleteConfirmationQuery(); private slots: void markNoteAsTodo(); @@ -63,6 +62,7 @@ void handleEntrySaveFromCalendar(); void handleCalendarEditorClosed(); void handleNewNoteAction(); + void selectedAction(HbAction *action); private: HbView *mEditor; @@ -77,6 +77,9 @@ QPointer mMarkFavouriteAction; QPointer mDiscardChangesAction; QPointer mNewNoteAction; + HbAction *mDeleteNoteAction; + HbAction *mCancelDeleteAction; + ulong mEntryId; NotesEditorDocLoader *mDocLoader; NotesEditorPrivate* mOwner; diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/noteseditor/inc/notestodoeditor.h --- a/notes/notesui/noteseditor/inc/notestodoeditor.h Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/noteseditor/inc/notestodoeditor.h Mon Jun 28 15:22:02 2010 +0530 @@ -71,7 +71,6 @@ void addMenu(); bool validAlarmSet(); void addDiscardChangesAction(); - bool showDeleteConfirmationQuery(); private slots: void saveTodo(); @@ -80,6 +79,7 @@ void handleRemoveDescriptionAction(); void handleDeleteAction(); void handleDiscardChangesAction(); + void selectedAction(HbAction *action); private: NotesEditorPrivate* mOwner; @@ -99,7 +99,8 @@ HbAction *mDoneAction; HbAction *mDiscardAction; QPointer mDescriptionAction; - + HbAction *mDeleteTodoAction; + HbAction *mCancelDeleteAction; HbGroupBox *mSubHeading; NotesEditorDocLoader *mDocLoader; diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/noteseditor/inc/notestodoeditorcustomitem.h --- a/notes/notesui/noteseditor/inc/notestodoeditorcustomitem.h Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/noteseditor/inc/notestodoeditorcustomitem.h Mon Jun 28 15:22:02 2010 +0530 @@ -45,9 +45,11 @@ private slots: void launchTimePicker(); void launchDatePicker(); + void selectDueDate(); + void selectedAction(HbAction *action); + +private: void handleOkAction(); - void handleCancelAction(); - void selectDueDate(); private: QPointer mTimePickerDialog; @@ -55,6 +57,10 @@ QPointer mTimeWidget; QPointer mDateWidget; QPointer mDueDateItem; + + HbAction *mOkAction; + HbAction *mCancelAction; + NotesEditorPrivate* mNotesTodoeditorPvt; bool mDueDatePickerIsActive; diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/noteseditor/noteseditor.pro --- a/notes/notesui/noteseditor/noteseditor.pro Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/noteseditor/noteseditor.pro Mon Jun 28 15:22:02 2010 +0530 @@ -42,6 +42,10 @@ LIBS += -lagendainterface \ -lcaleneditor + + BLD_INF_RULES.prj_exports += \ + "./inc/noteseditor.h |../../inc/noteseditor.h" \ + "./inc/noteseditordefines.h |../../inc/noteseditordefines.h } SOURCES += \ @@ -53,8 +57,8 @@ notestodoeditorcustomitem.cpp HEADERS += \ - ../../../inc/noteseditor.h \ - ../../../inc/noteseditordefines.h \ + noteseditor.h \ + noteseditordefines.h \ noteseditor_p.h \ noteseditordocloader.h \ noteseditorcommon.h \ @@ -64,5 +68,7 @@ RESOURCES += \ noteseditor.qrc +# TODO :need to use noteseditor.ts once it is released to platform +TRANSLATIONS += notes.ts # End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/noteseditor/src/noteseditor.cpp --- a/notes/notesui/noteseditor/src/noteseditor.cpp Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/noteseditor/src/noteseditor.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -44,7 +44,7 @@ \param parent QObject pointer. */ NotesEditor::NotesEditor(QObject *parent) -:QObject(parent),d_ptr(new NotesEditorPrivate(0, parent)) +:QObject(parent),d_ptr(new NotesEditorPrivate(0, this)) { // Nothing yet. } @@ -57,7 +57,7 @@ \param parent QObject pointer. */ NotesEditor::NotesEditor(AgendaUtil *agendaUtil, QObject *parent) -:QObject(parent), d_ptr(new NotesEditorPrivate(agendaUtil, parent)) +:QObject(parent), d_ptr(new NotesEditorPrivate(agendaUtil, this)) { // Nothing yet. } diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/noteseditor/src/noteseditor_p.cpp --- a/notes/notesui/noteseditor/src/noteseditor_p.cpp Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/noteseditor/src/noteseditor_p.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -18,13 +18,12 @@ // System includes #include -#include -#include #include #include #include #include #include +#include // User includes #include "noteseditor.h" @@ -49,10 +48,14 @@ NotesEditorPrivate::NotesEditorPrivate(AgendaUtil *agendaUtil, QObject *parent) :QObject(parent), mSaveEntry(true), + mTranslator(0), mNoteId(0) { // First get the q-pointer. q_ptr = static_cast (parent); + + mTranslator = new HbTranslator("notes"); + mTranslator->loadCommon(); // Here we check if the agendautil passed by the client is 0. If so, then we // construct our own. @@ -69,11 +72,6 @@ mAgendaUtil, SIGNAL(entriesChanged(QList )), this, SLOT(handleEntriesChanged(QList ))); - - mTranslator = new QTranslator; - int success=mTranslator->load("notes",":/translations"); - - HbApplication::instance()->installTranslator(mTranslator); } /*! @@ -86,7 +84,6 @@ mAgendaUtil = 0; } - HbApplication::instance()->removeTranslator(mTranslator); if (mTranslator) { delete mTranslator; mTranslator = 0; @@ -565,12 +562,12 @@ if (isTodoEdited()) { status = mAgendaUtil->updateEntry(mModifiedNote); mNoteId = mModifiedNote.id(); - if (status) { - showNotification( - hbTrId("txt_notes_dpopinfo_todo_note_saved")); - } } } + if (status) { + showNotification( + hbTrId("txt_notes_dpopinfo_todo_note_saved")); + } } return status; diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/noteseditor/src/notesnoteeditor.cpp --- a/notes/notesui/noteseditor/src/notesnoteeditor.cpp Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/noteseditor/src/notesnoteeditor.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -230,7 +230,7 @@ // Set our view as the current view. HbMainWindow *window = hbInstance->allMainWindows().first(); - HbAction *action = new HbAction(Hb::BackAction); + HbAction *action = new HbAction(Hb::BackNaviAction); mEditor->setNavigationAction(action); connect( action, SIGNAL(triggered()), @@ -295,19 +295,33 @@ */ void NotesNoteEditor::deleteNote() { - if (showDeleteConfirmationQuery()) { - mOwner->deleteNote(); + HbMessageBox *confirmationQuery = new HbMessageBox( + HbMessageBox::MessageTypeQuestion); + confirmationQuery->setDismissPolicy(HbDialog::NoDismiss); + confirmationQuery->setTimeout(HbDialog::NoTimeout); + confirmationQuery->setIconVisible(true); - HbMainWindow *window = hbInstance->allMainWindows().first(); - bool status = false; + QString displayText; + displayText = displayText.append(hbTrId("txt_notes_info_delete_note")); + + confirmationQuery->setText(displayText); - // Now close the editor. - window->removeView(mEditor); + // Remove the default actions. + QList defaultActions = confirmationQuery->actions(); + for (int index=0;indexremoveAction(defaultActions[index]); + } + defaultActions.clear(); - mOwner->editingCompleted(status); + // Add delete and cancel actions. + mDeleteNoteAction = new HbAction( + hbTrId("txt_notes_button_dialog_delete")); + mCancelDeleteAction = new HbAction( + hbTrId("txt_common_button_cancel")); + confirmationQuery->addAction(mDeleteNoteAction); + confirmationQuery->addAction(mCancelDeleteAction); - } - + confirmationQuery->open(this, SLOT(selectedAction(HbAction*))); } /*! @@ -526,32 +540,21 @@ } /* ! - Show the delete confirmation query. + Slot to handle the selected action from delete message box. */ -bool NotesNoteEditor::showDeleteConfirmationQuery() +void NotesNoteEditor::selectedAction(HbAction *action) { - bool retValue(false); - - HbMessageBox confirmationQuery(HbMessageBox::MessageTypeQuestion); - confirmationQuery.setDismissPolicy(HbDialog::NoDismiss); - confirmationQuery.setTimeout(HbDialog::NoTimeout); - confirmationQuery.setIconVisible(true); + if (action == mDeleteNoteAction) { + mOwner->deleteNote(); - QString displayText; - displayText = displayText.append(hbTrId("txt_notes_info_delete_note")); - - confirmationQuery.setText(displayText); + HbMainWindow *window = hbInstance->allMainWindows().first(); + bool status = false; - confirmationQuery.setPrimaryAction(new HbAction( - hbTrId("txt_notes_button_dialog_delete"), &confirmationQuery)); - confirmationQuery.setSecondaryAction(new HbAction( - hbTrId("txt_common_button_cancel"), &confirmationQuery)); - HbAction *selected = confirmationQuery.exec(); - if (selected == confirmationQuery.primaryAction()) { - retValue = true; + // Now close the editor. + window->removeView(mEditor); + + mOwner->editingCompleted(status); } - - return retValue; } // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/noteseditor/src/notestodoeditor.cpp --- a/notes/notesui/noteseditor/src/notestodoeditor.cpp Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/noteseditor/src/notestodoeditor.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -32,10 +32,9 @@ #include #include #include -#include #include #include -#include +#include #include #include #include @@ -296,7 +295,7 @@ // Store the current view and set our view as the current view. HbMainWindow *window = hbInstance->allMainWindows().first(); - HbAction *action = new HbAction(Hb::BackAction); + HbAction *action = new HbAction(Hb::BackNaviAction); mEditor->setNavigationAction(action); connect( action, SIGNAL(triggered()), @@ -636,14 +635,33 @@ */ void NotesTodoEditor::handleDeleteAction() { - if (showDeleteConfirmationQuery()) { - // Delete the to-do entry. - mOwner->deleteNote(); + HbMessageBox *confirmationQuery = new HbMessageBox( + HbMessageBox::MessageTypeQuestion); + confirmationQuery->setDismissPolicy(HbDialog::NoDismiss); + confirmationQuery->setTimeout(HbDialog::NoTimeout); + confirmationQuery->setIconVisible(true); + + QString displayText; + displayText = displayText.append(hbTrId("txt_notes_info_delete_todo_note")); + + confirmationQuery->setText(displayText); - // Close the to-do editor. - close(); + // Remove the default actions. + QList defaultActions = confirmationQuery->actions(); + for (int index=0;indexremoveAction(defaultActions[index]); } + defaultActions.clear(); + // Add delete and cancel actions. + mDeleteTodoAction = new HbAction( + hbTrId("txt_notes_button_dialog_delete")); + mCancelDeleteAction = new HbAction( + hbTrId("txt_common_button_cancel")); + confirmationQuery->addAction(mDeleteTodoAction); + confirmationQuery->addAction((mCancelDeleteAction)); + + confirmationQuery->open(this, SLOT(selectedAction(HbAction*))); } /*! @@ -653,35 +671,20 @@ { // Close the to-do editor close(); - } -/* ! - Show the delete confirmation query. +/*! + Slot to handle selected action in delete confirmation note. */ -bool NotesTodoEditor::showDeleteConfirmationQuery() +void NotesTodoEditor::selectedAction(HbAction *action) { - bool retValue(false); - - HbMessageBox confirmationQuery(HbMessageBox::MessageTypeQuestion); - confirmationQuery.setDismissPolicy(HbDialog::NoDismiss); - confirmationQuery.setTimeout(HbDialog::NoTimeout); - confirmationQuery.setIconVisible(true); - - QString displayText; - displayText = displayText.append(hbTrId("txt_notes_info_delete_todo_note")); + if (action==mDeleteTodoAction) { + // Delete the to-do entry. + mOwner->deleteNote(); - confirmationQuery.setText(displayText); + // Close the to-do editor. + close(); + } +} - confirmationQuery.setPrimaryAction(new HbAction( - hbTrId("txt_notes_button_dialog_delete"), &confirmationQuery)); - confirmationQuery.setSecondaryAction(new HbAction( - hbTrId("txt_common_button_cancel"), &confirmationQuery)); - HbAction *selected = confirmationQuery.exec(); - if (selected == confirmationQuery.primaryAction()) { - retValue = true; - } - - return retValue; -} // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/noteseditor/src/notestodoeditorcustomitem.cpp --- a/notes/notesui/noteseditor/src/notestodoeditorcustomitem.cpp Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/noteseditor/src/notestodoeditorcustomitem.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -181,13 +181,14 @@ mTimePickerDialog = new HbDialog; mTimePickerDialog->setTimeout(HbDialog::NoTimeout); mTimePickerDialog->setDismissPolicy(HbDialog::NoDismiss); + mTimePickerDialog->setAttribute(Qt::WA_DeleteOnClose, true); // Set the heading for the dialog. HbLabel * timeLabel = new HbLabel("Time", mTimePickerDialog); mTimePickerDialog->setHeadingWidget(timeLabel); // Create the tumbler. HbDateTimePicker *timePicker = new HbDateTimePicker(mTimePickerDialog); - + // Set the format for time picker. timePicker->setDisplayFormat(mNotesTodoeditorPvt->timeFormatString()); // Set the time needs to be displayed in time picker. @@ -197,21 +198,15 @@ // Set the tumbler as the content widget. mTimePickerDialog->setContentWidget(timePicker); - - HbAction *okAction = new HbAction(QString("Ok"), mTimePickerDialog); - mTimePickerDialog->setPrimaryAction(okAction); - connect( - okAction, SIGNAL(triggered()), - this, SLOT(handleOkAction())); + mOkAction = new HbAction( + hbTrId("txt_common_button_ok"), mTimePickerDialog); + mTimePickerDialog->addAction(mOkAction); - HbAction *cancelAction = new HbAction(QString("Cancel"), mTimePickerDialog); - mTimePickerDialog->setSecondaryAction(cancelAction); + mCancelAction = new HbAction( + hbTrId("txt_common_button_cancel"), mTimePickerDialog); + mTimePickerDialog->addAction(mCancelAction); - connect( - cancelAction, SIGNAL(triggered()), - this, SLOT(handleCancelAction())); - - mTimePickerDialog->exec(); + mTimePickerDialog->open(this, SLOT(selectedAction(HbAction *))); } /*! @@ -227,7 +222,8 @@ mDatePickerDialog = new HbDialog; mDatePickerDialog->setTimeout(HbDialog::NoTimeout); mDatePickerDialog->setDismissPolicy(HbDialog::NoDismiss); - + mDatePickerDialog->setAttribute(Qt::WA_DeleteOnClose, true); + // Set the heading for the dialog. HbLabel * timeLabel = new HbLabel("Date", mDatePickerDialog); mDatePickerDialog->setHeadingWidget(timeLabel); @@ -238,32 +234,91 @@ datePicker->setDateRange(QDate::fromString("01/01/1900", mNotesTodoeditorPvt->dateFormatString()), QDate::fromString("31/12/2100", mNotesTodoeditorPvt->dateFormatString())); - + // Set the date format in date picker. datePicker->setDisplayFormat(mNotesTodoeditorPvt->dateFormatString()); // Set the date needs to be in focus in date picker. datePicker->setDate(QDate::fromString(mDateWidget->text(), mNotesTodoeditorPvt->dateFormatString())); - + // Set the tumbler as the content widget. mDatePickerDialog->setContentWidget(datePicker); + mOkAction = new HbAction( + hbTrId("txt_common_button_ok"), mDatePickerDialog); + mDatePickerDialog->addAction(mOkAction); - HbAction *okAction = new HbAction(QString("Ok"), mDatePickerDialog); - mDatePickerDialog->setPrimaryAction(okAction); - connect( - okAction, SIGNAL(triggered()), - this, SLOT(handleOkAction())); + mCancelAction = new HbAction( + hbTrId("txt_common_button_cancel"), mDatePickerDialog); + mDatePickerDialog->addAction(mCancelAction); + + mDatePickerDialog->open(this, SLOT(selectedAction(HbAction *))); +} + +/* + Launches date picker for selecting the due date + */ +void NotesTodoEditorCustomItem::selectDueDate() +{ + if( mDueDateItem->isDown()) { + mDueDateItem->setDown(false); + return; + } + + mDueDatePickerIsActive = true; + + if (mDatePickerDialog) { + delete mDatePickerDialog; + } - HbAction *cancelAction = new HbAction(QString("Cancel"), mDatePickerDialog); - mDatePickerDialog->setSecondaryAction(cancelAction); - connect( - cancelAction, SIGNAL(triggered()), - this, SLOT(handleCancelAction())); + // Create the dialog. + mDatePickerDialog = new HbDialog; + mDatePickerDialog->setTimeout(HbDialog::NoTimeout); + mDatePickerDialog->setDismissPolicy(HbDialog::NoDismiss); + mDatePickerDialog->setAttribute(Qt::WA_DeleteOnClose, true); + + // Create date picker + HbDateTimePicker *datePicker = new HbDateTimePicker(mDatePickerDialog); + // Set the min/max date for the editor. + datePicker->setDateRange(QDate::fromString("01/01/1900", + mNotesTodoeditorPvt->dateFormatString()), QDate::fromString("31/12/2100", + mNotesTodoeditorPvt->dateFormatString())); + + // Set the format of date picker. + datePicker->setDisplayFormat(mNotesTodoeditorPvt->dateFormatString()); + // Set the date needs to be displayed in datepicker. + datePicker->setDate(QDate::fromString(mDueDateItem->text(), + mNotesTodoeditorPvt->dateFormatString())); + + // Set the heading text + HbLabel *label = new HbLabel(hbTrId("txt_notes_formlabel_due_date")); + mDatePickerDialog->setHeadingWidget(label); - mDatePickerDialog->exec(); + // Set the tumbler as the content widget. + mDatePickerDialog->setContentWidget(datePicker); + + mOkAction = new HbAction( + hbTrId("txt_common_button_ok"), mDatePickerDialog); + mDatePickerDialog->addAction(mOkAction); + + mCancelAction = new HbAction( + hbTrId("txt_common_button_cancel"), mDatePickerDialog); + mDatePickerDialog->addAction(mCancelAction); + + mDatePickerDialog->open(this, SLOT(selectedAction(HbAction *))); } + +/*! + Slot to handle the selected action. + */ +void NotesTodoEditorCustomItem::selectedAction(HbAction *action) +{ + if (action == mOkAction) { + handleOkAction(); + } +} + /*! Handles the ok action of date/time picker dialog. */ @@ -339,77 +394,6 @@ alarmDateItem->setContentWidgetData("alarmDate",dueDateText); } } - - handleCancelAction(); -} -/*! - Handles the ok action of date/time picker dialog. - */ -void NotesTodoEditorCustomItem::handleCancelAction() -{ - // Close the dialog. - if (mDatePickerDialog) { - mDatePickerDialog->close(); - mDatePickerDialog->deleteLater(); - }else { - mTimePickerDialog->close(); - mTimePickerDialog->deleteLater(); - } -} - -/* - Launches date picker for selecting the due date - */ -void NotesTodoEditorCustomItem::selectDueDate() -{ - if( mDueDateItem->isDown()) { - mDueDateItem->setDown(false); - return; - } - - mDueDatePickerIsActive = true; - - if (mDatePickerDialog) { - delete mDatePickerDialog; - } - - // Create the dialog. - mDatePickerDialog = new HbDialog; - mDatePickerDialog->setTimeout(HbDialog::NoTimeout); - mDatePickerDialog->setDismissPolicy(HbDialog::NoDismiss); - - // Create date picker - HbDateTimePicker *datePicker = new HbDateTimePicker(mDatePickerDialog); - // Set the min/max date for the editor. - datePicker->setDateRange(QDate::fromString("01/01/1900", - mNotesTodoeditorPvt->dateFormatString()), QDate::fromString("31/12/2100", - mNotesTodoeditorPvt->dateFormatString())); - - // Set the format of date picker. - datePicker->setDisplayFormat(mNotesTodoeditorPvt->dateFormatString()); - // Set the date needs to be displayed in datepicker. - datePicker->setDate(QDate::fromString(mDueDateItem->text(), - mNotesTodoeditorPvt->dateFormatString())); - - // Set the heading text - HbLabel *label = new HbLabel(hbTrId("txt_notes_formlabel_due_date")); - mDatePickerDialog->setHeadingWidget(label); - - // Add actions to date picker - HbAction *okAction = new HbAction(tr("Ok")); - mDatePickerDialog->setPrimaryAction(okAction); - connect( - okAction, SIGNAL(triggered()), - this, SLOT(handleOkAction())); - - HbAction *cancelAction = new HbAction(tr("Cancel")); - mDatePickerDialog->setSecondaryAction(cancelAction); - connect( - cancelAction, SIGNAL(triggered()), - this, SLOT(handleCancelAction())); - - mDatePickerDialog->setContentWidget(datePicker); - mDatePickerDialog->exec(); } // End of file --Don't delete. diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesmodel/bwins/notesmodelu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/notesmodel/bwins/notesmodelu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,45 @@ +EXPORTS + ?sourceModel@NotesModel@@QAEPAVQAbstractItemModel@@XZ @ 1 NONAME ; class QAbstractItemModel * NotesModel::sourceModel(void) + ?filterAcceptsRow@NotesSortFilterProxyModel@@MBE_NHABVQModelIndex@@@Z @ 2 NONAME ; bool NotesSortFilterProxyModel::filterAcceptsRow(int, class QModelIndex const &) const + ?modifyEntryInModel@NotesModel@@AAEXKH@Z @ 3 NONAME ; void NotesModel::modifyEntryInModel(unsigned long, int) + ?getStaticMetaObject@NotesSortFilterProxyModel@@SAABUQMetaObject@@XZ @ 4 NONAME ; struct QMetaObject const & NotesSortFilterProxyModel::getStaticMetaObject(void) + ?appendCompTodosToModel@NotesModel@@AAEXAAV?$QList@VAgendaEntry@@@@@Z @ 5 NONAME ; void NotesModel::appendCompTodosToModel(class QList &) + ?tr@NotesSortFilterProxyModel@@SA?AVQString@@PBD0H@Z @ 6 NONAME ; class QString NotesSortFilterProxyModel::tr(char const *, char const *, int) + ?rowAdded@NotesModel@@IAEXVQModelIndex@@@Z @ 7 NONAME ; void NotesModel::rowAdded(class QModelIndex) + ?qt_metacast@NotesModel@@UAEPAXPBD@Z @ 8 NONAME ; void * NotesModel::qt_metacast(char const *) + ?trUtf8@NotesSortFilterProxyModel@@SA?AVQString@@PBD0@Z @ 9 NONAME ; class QString NotesSortFilterProxyModel::trUtf8(char const *, char const *) + ?lessThan@NotesSortFilterProxyModel@@MBE_NABVQModelIndex@@0@Z @ 10 NONAME ; bool NotesSortFilterProxyModel::lessThan(class QModelIndex const &, class QModelIndex const &) const + ?metaObject@NotesSortFilterProxyModel@@UBEPBUQMetaObject@@XZ @ 11 NONAME ; struct QMetaObject const * NotesSortFilterProxyModel::metaObject(void) const + ?dateFormatString@NotesModel@@AAE?AVQString@@XZ @ 12 NONAME ; class QString NotesModel::dateFormatString(void) + ?trUtf8@NotesSortFilterProxyModel@@SA?AVQString@@PBD0H@Z @ 13 NONAME ; class QString NotesSortFilterProxyModel::trUtf8(char const *, char const *, int) + ?metaObject@NotesModel@@UBEPBUQMetaObject@@XZ @ 14 NONAME ; struct QMetaObject const * NotesModel::metaObject(void) const + ?tr@NotesModel@@SA?AVQString@@PBD0H@Z @ 15 NONAME ; class QString NotesModel::tr(char const *, char const *, int) + ?staticMetaObject@NotesModel@@2UQMetaObject@@B @ 16 NONAME ; struct QMetaObject const NotesModel::staticMetaObject + ?staticMetaObject@NotesSortFilterProxyModel@@2UQMetaObject@@B @ 17 NONAME ; struct QMetaObject const NotesSortFilterProxyModel::staticMetaObject + ??0NotesModel@@QAE@PAVAgendaUtil@@PAVQObject@@@Z @ 18 NONAME ; NotesModel::NotesModel(class AgendaUtil *, class QObject *) + ??_ENotesSortFilterProxyModel@@UAE@I@Z @ 19 NONAME ; NotesSortFilterProxyModel::~NotesSortFilterProxyModel(unsigned int) + ??1NotesSortFilterProxyModel@@UAE@XZ @ 20 NONAME ; NotesSortFilterProxyModel::~NotesSortFilterProxyModel(void) + ?qt_metacall@NotesSortFilterProxyModel@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 21 NONAME ; int NotesSortFilterProxyModel::qt_metacall(enum QMetaObject::Call, int, void * *) + ?timeFormatString@NotesModel@@AAE?AVQString@@XZ @ 22 NONAME ; class QString NotesModel::timeFormatString(void) + ?tr@NotesModel@@SA?AVQString@@PBD0@Z @ 23 NONAME ; class QString NotesModel::tr(char const *, char const *) + ?getStaticMetaObject@NotesModel@@SAABUQMetaObject@@XZ @ 24 NONAME ; struct QMetaObject const & NotesModel::getStaticMetaObject(void) + ?tr@NotesSortFilterProxyModel@@SA?AVQString@@PBD0@Z @ 25 NONAME ; class QString NotesSortFilterProxyModel::tr(char const *, char const *) + ?addEntryToModel@NotesModel@@AAEXK@Z @ 26 NONAME ; void NotesModel::addEntryToModel(unsigned long) + ??1NotesModel@@UAE@XZ @ 27 NONAME ; NotesModel::~NotesModel(void) + ?handleInstanceViewCreationCompleted@NotesModel@@AAEXH@Z @ 28 NONAME ; void NotesModel::handleInstanceViewCreationCompleted(int) + ?removeEntryFromModel@NotesModel@@AAEXK@Z @ 29 NONAME ; void NotesModel::removeEntryFromModel(unsigned long) + ?qt_metacast@NotesSortFilterProxyModel@@UAEPAXPBD@Z @ 30 NONAME ; void * NotesSortFilterProxyModel::qt_metacast(char const *) + ?appendInCompTodosToModel@NotesModel@@AAEXAAV?$QList@VAgendaEntry@@@@@Z @ 31 NONAME ; void NotesModel::appendInCompTodosToModel(class QList &) + ?insertNoteToModel@NotesModel@@AAE_NAAVQModelIndex@@K@Z @ 32 NONAME ; bool NotesModel::insertNoteToModel(class QModelIndex &, unsigned long) + ?qt_metacall@NotesModel@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 33 NONAME ; int NotesModel::qt_metacall(enum QMetaObject::Call, int, void * *) + ?populateSourceModel@NotesModel@@AAEXV?$QList@K@@@Z @ 34 NONAME ; void NotesModel::populateSourceModel(class QList) + ?appendNotesToModel@NotesModel@@AAEXAAV?$QList@VAgendaEntry@@@@@Z @ 35 NONAME ; void NotesModel::appendNotesToModel(class QList &) + ?updateSourceModel@NotesModel@@AAEXK@Z @ 36 NONAME ; void NotesModel::updateSourceModel(unsigned long) + ??_ENotesModel@@UAE@I@Z @ 37 NONAME ; NotesModel::~NotesModel(unsigned int) + ?trUtf8@NotesModel@@SA?AVQString@@PBD0H@Z @ 38 NONAME ; class QString NotesModel::trUtf8(char const *, char const *, int) + ?insertInCompTodoToModel@NotesModel@@AAE_NAAVQModelIndex@@K@Z @ 39 NONAME ; bool NotesModel::insertInCompTodoToModel(class QModelIndex &, unsigned long) + ?trUtf8@NotesModel@@SA?AVQString@@PBD0@Z @ 40 NONAME ; class QString NotesModel::trUtf8(char const *, char const *) + ?insertCompTodoToModel@NotesModel@@AAE_NAAVQModelIndex@@K@Z @ 41 NONAME ; bool NotesModel::insertCompTodoToModel(class QModelIndex &, unsigned long) + ??0NotesSortFilterProxyModel@@QAE@AAVAgendaUtil@@PAVQObject@@@Z @ 42 NONAME ; NotesSortFilterProxyModel::NotesSortFilterProxyModel(class AgendaUtil &, class QObject *) + ?populateSourceModel@NotesModel@@AAEXXZ @ 43 NONAME ; void NotesModel::populateSourceModel(void) + diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesmodel/eabi/notesmodelu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/notesmodel/eabi/notesmodelu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,45 @@ +EXPORTS + _ZN10NotesModel11qt_metacallEN11QMetaObject4CallEiPPv @ 1 NONAME + _ZN10NotesModel11qt_metacastEPKc @ 2 NONAME + _ZN10NotesModel11sourceModelEv @ 3 NONAME + _ZN10NotesModel15addEntryToModelEm @ 4 NONAME + _ZN10NotesModel16dateFormatStringEv @ 5 NONAME + _ZN10NotesModel16staticMetaObjectE @ 6 NONAME DATA 16 + _ZN10NotesModel16timeFormatStringEv @ 7 NONAME + _ZN10NotesModel17insertNoteToModelER11QModelIndexm @ 8 NONAME + _ZN10NotesModel17updateSourceModelEm @ 9 NONAME + _ZN10NotesModel18appendNotesToModelER5QListI11AgendaEntryE @ 10 NONAME + _ZN10NotesModel18modifyEntryInModelEmi @ 11 NONAME + _ZN10NotesModel19getStaticMetaObjectEv @ 12 NONAME + _ZN10NotesModel19populateSourceModelE5QListImE @ 13 NONAME + _ZN10NotesModel19populateSourceModelEv @ 14 NONAME + _ZN10NotesModel20removeEntryFromModelEm @ 15 NONAME + _ZN10NotesModel21insertCompTodoToModelER11QModelIndexm @ 16 NONAME + _ZN10NotesModel22appendCompTodosToModelER5QListI11AgendaEntryE @ 17 NONAME + _ZN10NotesModel23insertInCompTodoToModelER11QModelIndexm @ 18 NONAME + _ZN10NotesModel24appendInCompTodosToModelER5QListI11AgendaEntryE @ 19 NONAME + _ZN10NotesModel35handleInstanceViewCreationCompletedEi @ 20 NONAME + _ZN10NotesModel8rowAddedE11QModelIndex @ 21 NONAME + _ZN10NotesModelC1EP10AgendaUtilP7QObject @ 22 NONAME + _ZN10NotesModelC2EP10AgendaUtilP7QObject @ 23 NONAME + _ZN10NotesModelD0Ev @ 24 NONAME + _ZN10NotesModelD1Ev @ 25 NONAME + _ZN10NotesModelD2Ev @ 26 NONAME + _ZN25NotesSortFilterProxyModel11qt_metacallEN11QMetaObject4CallEiPPv @ 27 NONAME + _ZN25NotesSortFilterProxyModel11qt_metacastEPKc @ 28 NONAME + _ZN25NotesSortFilterProxyModel16staticMetaObjectE @ 29 NONAME DATA 16 + _ZN25NotesSortFilterProxyModel19getStaticMetaObjectEv @ 30 NONAME + _ZN25NotesSortFilterProxyModelC1ER10AgendaUtilP7QObject @ 31 NONAME + _ZN25NotesSortFilterProxyModelC2ER10AgendaUtilP7QObject @ 32 NONAME + _ZN25NotesSortFilterProxyModelD0Ev @ 33 NONAME + _ZN25NotesSortFilterProxyModelD1Ev @ 34 NONAME + _ZN25NotesSortFilterProxyModelD2Ev @ 35 NONAME + _ZNK10NotesModel10metaObjectEv @ 36 NONAME + _ZNK25NotesSortFilterProxyModel10metaObjectEv @ 37 NONAME + _ZNK25NotesSortFilterProxyModel16filterAcceptsRowEiRK11QModelIndex @ 38 NONAME + _ZNK25NotesSortFilterProxyModel8lessThanERK11QModelIndexS2_ @ 39 NONAME + _ZTI10NotesModel @ 40 NONAME + _ZTI25NotesSortFilterProxyModel @ 41 NONAME + _ZTV10NotesModel @ 42 NONAME + _ZTV25NotesSortFilterProxyModel @ 43 NONAME + diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesmodel/inc/notesmodel.h --- a/notes/notesui/notesmodel/inc/notesmodel.h Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesmodel/inc/notesmodel.h Mon Jun 28 15:22:02 2010 +0530 @@ -55,6 +55,7 @@ void populateSourceModel(QList ids); void addEntryToModel(ulong id); void removeEntryFromModel(ulong id); + void handleInstanceViewCreationCompleted(int status); private: void modifyEntryInModel(ulong id, int row); diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesmodel/src/notesmodel.cpp --- a/notes/notesui/notesmodel/src/notesmodel.cpp Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesmodel/src/notesmodel.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -68,8 +68,10 @@ mAgendaUtil, SIGNAL(entryUpdated(ulong)), this, SLOT(updateSourceModel(ulong))); - // Populate the model in a different thread. - QTimer::singleShot(1, this, SLOT(populateSourceModel())); + // Connect for instance view creation completed signal + connect( + mAgendaUtil, SIGNAL(instanceViewCreationCompleted(int)), + this,SLOT(handleInstanceViewCreationCompleted(int))); } /*! @@ -325,6 +327,15 @@ } /*! + Populate the model after instance view creation. + */ +void NotesModel::handleInstanceViewCreationCompleted(int status) +{ + Q_UNUSED(status); + populateSourceModel(); +} + +/*! Modifies the content of a given `row' with the data of the entry given by `id'. diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesmodelhandler/bwins/notesmodelhandleru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/notesmodelhandler/bwins/notesmodelhandleru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,7 @@ +EXPORTS + ?agendaInterface@NotesModelHandler@@QAEPAVAgendaUtil@@XZ @ 1 NONAME ; class AgendaUtil * NotesModelHandler::agendaInterface(void) + ??_ENotesModelHandler@@UAE@I@Z @ 2 NONAME ; NotesModelHandler::~NotesModelHandler(unsigned int) + ??1NotesModelHandler@@UAE@XZ @ 3 NONAME ; NotesModelHandler::~NotesModelHandler(void) + ??0NotesModelHandler@@QAE@PAVQObject@@@Z @ 4 NONAME ; NotesModelHandler::NotesModelHandler(class QObject *) + ?notesModel@NotesModelHandler@@QAEPAVNotesModel@@XZ @ 5 NONAME ; class NotesModel * NotesModelHandler::notesModel(void) + diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesmodelhandler/eabi/notesmodelhandleru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/notesmodelhandler/eabi/notesmodelhandleru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,11 @@ +EXPORTS + _ZN17NotesModelHandler10notesModelEv @ 1 NONAME + _ZN17NotesModelHandler15agendaInterfaceEv @ 2 NONAME + _ZN17NotesModelHandlerC1EP7QObject @ 3 NONAME + _ZN17NotesModelHandlerC2EP7QObject @ 4 NONAME + _ZN17NotesModelHandlerD0Ev @ 5 NONAME + _ZN17NotesModelHandlerD1Ev @ 6 NONAME + _ZN17NotesModelHandlerD2Ev @ 7 NONAME + _ZTI17NotesModelHandler @ 8 NONAME + _ZTV17NotesModelHandler @ 9 NONAME + diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesplugins/noteseditorplugin/inc/noteseditorplugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/notesplugins/noteseditorplugin/inc/noteseditorplugin.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,64 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* The header file for NotesEditorPlugin class. +* +*/ + +#ifndef NOTESEDITORPLUGIN_H +#define NOTESEDITORPLUGIN_H + +// System includes +#include +#include +#include + +#include "noteseditor.h" + +// Forward declarations +class QFile; +class QString; +class AgendaUtil; +class AgendaEntry; + +class NotesEditorPlugin: public NotesEditorInterface +{ + Q_OBJECT + Q_INTERFACES(NotesEditorInterface) + +public: + NotesEditorPlugin(QObject *parent = 0); + ~NotesEditorPlugin(); + +public: + void edit(const QString &string, AgendaUtil *agendaUtil=0); + void edit(const QFile &handle, AgendaUtil *agendaUtil=0); + void edit(AgendaEntry entry, AgendaUtil *agendaUtil=0); + void edit(ulong id, AgendaUtil *agendaUtil=0); + void create(CreateType type, AgendaUtil *agendaUtil=0); + ulong close(CloseType type, AgendaUtil *agendaUtil=0); + +private: + void createNotesEditor(AgendaUtil *agendaUtil); + +private slots: + void handleEditingCompleted(bool status); + +private: + QPointer mNotesEditor; +}; + +#endif //NOTESEDITORPLUGIN_H + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesplugins/noteseditorplugin/noteseditorplugin.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/notesplugins/noteseditorplugin/noteseditorplugin.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,60 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# This is the project specification file for the notes editor plugin. +# + +TEMPLATE = lib +CONFIG += hb plugin +TARGET = noteseditorplugin + +INCLUDEPATH += \ + . \ + ./src \ + ./inc \ + ../../../inc + +DEPENDPATH += \ + . \ + ./src \ + ./inc + +symbian: { + TARGET.CAPABILITY = ALL -TCB + TARGET.EPOCALLOWDLLDATA = 1 + TARGET.UID3 = 0x2002FF88 + + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + LIBS += \ + -lagendainterface \ + -lnoteseditor + +load(data_caging_paths) + +plugin.sources = $${TARGET}.dll +plugin.path = $$QT_PLUGINS_BASE_DIR/notes +DEPLOYMENT += plugin + +BLD_INF_RULES.prj_exports += \ +"./qmakepluginstubs/noteseditorplugin.qtplugin /$$HW_ZDIR$$RESOURCE_FILES_DIR/qt/plugins/notes/noteseditorplugin.qtplugin" +} + +HEADERS += \ + ../../../../organizer_plat/notes_editor_api/inc/noteseditorinterface.h \ + noteseditorplugin.h + +SOURCES += noteseditorplugin.cpp + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesplugins/noteseditorplugin/src/noteseditorplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/notesplugins/noteseditorplugin/src/noteseditorplugin.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,188 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* Definition of NotesEditorPlugin class. +* +*/ + +// System includes. +#include +#include +#include + +// User includes. +#include "noteseditorplugin.h" +#include "noteseditor.h" + +/*! + \class NotesEditorPlugin + + NotesEditorPlugin provides QT plugin implementation of NotesEditorInterface. + */ + +/*! + \fn void NotesEditorPlugin::editingCompleted(bool status = true) + + This signal is emitted when editing/creation of a note/to-do is completed. + + \param status This indicates whether the note/to-do was saved or not. + This will be `true' if the note was saved by the user. + false' otherwise. + */ + + +/*! + Constructor. + + \param parent QObject pointer. + */ +NotesEditorPlugin::NotesEditorPlugin(QObject *parent) +{ + Q_UNUSED(parent) +} + +/*! + Destructor. + */ +NotesEditorPlugin::~NotesEditorPlugin() +{ +} + + +/*! + Shows the noteseditor. The argument acts as the description for the note. + + \param string reference to file string/buffer. + */ +void NotesEditorPlugin::edit(const QString &string, AgendaUtil *agendaUtil) +{ + if (!mNotesEditor) { + createNotesEditor(agendaUtil); + } + + mNotesEditor->edit(string); +} + +/*! + Shows the noteseditor by parsing a .vcs which could be of a To-do or a plain + .txt file which will be edited as a note. + + \param handle reference to QFile handle. + */ +void NotesEditorPlugin::edit(const QFile &handle, AgendaUtil *agendaUtil) +{ + if (!mNotesEditor) { + createNotesEditor(agendaUtil); + } + + mNotesEditor->edit(handle); +} + +/*! + Shows the noteseditor, by parsing an AgendaEntry. + + \param entry An object of AgendaEntry. + */ +void NotesEditorPlugin::edit(AgendaEntry entry, AgendaUtil *agendaUtil) +{ + if (!mNotesEditor) { + createNotesEditor(agendaUtil); + } + + mNotesEditor->edit(entry); +} + +/*! + Shows the noteseditor, by fetching the note using the entry id provided. + + \param id entry id of the note. + */ +void NotesEditorPlugin::edit(ulong id, AgendaUtil *agendaUtil) +{ + if (!mNotesEditor) { + createNotesEditor(agendaUtil); + } + + mNotesEditor->edit(id); +} + +/*! + Creates a new note or to-do based on the create type.It lanuches the + respective editors for editing + + \type type of the editor to be shown for creating new note and new to-do + */ +void NotesEditorPlugin::create( NotesEditorInterface::CreateType type, + AgendaUtil *agendaUtil) +{ + if (!mNotesEditor) { + createNotesEditor(agendaUtil); + } + + mNotesEditor->create(static_cast(type)); +} + +/*! + Closes the notes editor + + \param type Type of the close required. + */ +ulong NotesEditorPlugin::close( NotesEditorInterface::CloseType type, + AgendaUtil *agendaUtil) +{ + if (!mNotesEditor) { + createNotesEditor(agendaUtil); + } + + return mNotesEditor->close(static_cast(type)); +} + +/*! + Creates notes Editor. + */ +void NotesEditorPlugin::createNotesEditor(AgendaUtil *agendaUtil) +{ + if (agendaUtil) { + mNotesEditor = new NotesEditor(agendaUtil, this); + } else { + mNotesEditor = new NotesEditor(this); + } + + if (mNotesEditor) { + connect( + mNotesEditor, SIGNAL(editingCompleted(bool)), + this, SLOT(handleEditingCompleted(bool))); + } +} + +/*! + Slot to handle editing completed + */ +void NotesEditorPlugin::handleEditingCompleted(bool status) +{ + // Emits the signal. + emit editingCompleted(status); + + // Cleanup. + if (mNotesEditor) { + mNotesEditor->deleteLater(); + } +} + +// Exports plugin class NotesEditorPlugin for the target +// plugin noteseditorplugin. +Q_EXPORT_PLUGIN2(noteseditorplugin, NotesEditorPlugin) + +// End of file --Don't remove this. + diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesplugins/notesplugins.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/notesplugins/notesplugins.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,23 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: pro file for notes plugins. +# + + +TEMPLATE = subdirs + +SUBDIRS += noteseditorplugin +CONFIG += ordered + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesui.pro --- a/notes/notesui/notesui.pro Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesui.pro Mon Jun 28 15:22:02 2010 +0530 @@ -18,6 +18,8 @@ SUBDIRS += \ notesmodel \ + noteseditor \ + notesplugins \ notesviews \ notesviewmanager \ notesmodelhandler \ diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesviewmanager/bwins/notesviewmanageru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/notesviewmanager/bwins/notesviewmanageru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,5 @@ +EXPORTS + ??1NotesViewManager@@UAE@XZ @ 1 NONAME ; NotesViewManager::~NotesViewManager(void) + ?switchToView@NotesViewManager@@QAEXW4NotesViewIds@NotesNamespace@@@Z @ 2 NONAME ; void NotesViewManager::switchToView(enum NotesNamespace::NotesViewIds) + ??0NotesViewManager@@QAE@AAVNotesAppControllerIf@@PAVQObject@@@Z @ 3 NONAME ; NotesViewManager::NotesViewManager(class NotesAppControllerIf &, class QObject *) + diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesviewmanager/eabi/notesviewmanageru.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/notesviewmanager/eabi/notesviewmanageru.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,8 @@ +EXPORTS + _ZN16NotesViewManager12switchToViewEN14NotesNamespace12NotesViewIdsE @ 1 NONAME + _ZN16NotesViewManagerC1ER20NotesAppControllerIfP7QObject @ 2 NONAME + _ZN16NotesViewManagerC2ER20NotesAppControllerIfP7QObject @ 3 NONAME + _ZN16NotesViewManagerD0Ev @ 4 NONAME + _ZN16NotesViewManagerD1Ev @ 5 NONAME + _ZN16NotesViewManagerD2Ev @ 6 NONAME + diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesviewmanager/inc/notesviewmanager.h --- a/notes/notesui/notesviewmanager/inc/notesviewmanager.h Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesviewmanager/inc/notesviewmanager.h Mon Jun 28 15:22:02 2010 +0530 @@ -27,6 +27,7 @@ // Forward declarations class HbMainWindow; +class HbAction; class NotesMainView; class NotesModel; class AgendaUtil; @@ -54,11 +55,12 @@ void loadTodoView(); void loadFavoritesView(); void loadNoteView(); - bool showDeleteConfirmationQuery(ulong entryId); private slots: void loadOtherViews(); void deleteEntryFromView(ulong entryId); + void selectedAction(HbAction *action); + void handleInstanceViewCreationCompleted(int status); private: NotesAppControllerIf &mAppControllerIf; @@ -70,6 +72,10 @@ NotesFavoriteView *mFavoriteView; NotesNoteView *mNoteView; + HbAction *mDeleteAction; + HbAction *mCancelAction; + ulong mEntryId; + private: Q_DISABLE_COPY(NotesViewManager) }; diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesviewmanager/src/notesviewmanager.cpp --- a/notes/notesui/notesviewmanager/src/notesviewmanager.cpp Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesviewmanager/src/notesviewmanager.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -24,6 +24,8 @@ #include #include #include +#include // hbapplication +#include // hbactivitymanager // User includes #include "notesviewmanager.h" @@ -59,8 +61,40 @@ mAgendaUtil = mAppControllerIf.agendaUtil(); - // Load the main view at the start up. - loadNotesMainView(); + // Check the Application Startup reason from Activity Manager + int activityReason = qobject_cast(qApp)->activateReason(); + + if (Hb::ActivationReasonActivity == activityReason) // Check if application is started + // from an application + { + // Application is started from an activity + // extract activity data + QVariant data = qobject_cast(qApp)->activateData(); + // Restore state from activity data + QByteArray serializedModel = data.toByteArray(); + QDataStream stream(&serializedModel, QIODevice::ReadOnly); + int viewId; + stream >> viewId; // read stream into an int + + if (NotesNamespace::NotesMainViewId == viewId) // Check if viewId is main view + { + // Load MainView + loadNotesMainView(); + } + else if (NotesNamespace::NotesCollectionViewId == viewId) // Check if the viewId is collective view + { + //no implementation yet, UI Specs not available + } + } + else // application started by either service framework or normally + { + // Load the main view at the start up. + loadNotesMainView(); + } + + connect( + mAgendaUtil, SIGNAL(instanceViewCreationCompleted(int)), + this,SLOT(handleInstanceViewCreationCompleted(int))); // Delay loading of other views till main view is loaded. connect( @@ -90,27 +124,59 @@ window->removeView(window->currentView()); window->addView(mMainView); window->setCurrentView(mMainView); + mMainView->captureScreenShot(false); break; case NotesNamespace::NotesCollectionViewId: + if (mMainView) + { + if (mMainView == window->currentView()) + { + mMainView->captureScreenShot(true); + } + } window->removeView(window->currentView()); window->addView(mCollectionView); window->setCurrentView(mCollectionView); break; case NotesNamespace::NotesTodoViewId: + if (mMainView) + { + if (mMainView == window->currentView()) + { + mMainView->captureScreenShot(true); + } + } + window->removeView(window->currentView()); window->addView(mTodoView); window->setCurrentView(mTodoView); break; case NotesNamespace::NotesFavoritesViewId: + if (mMainView) + { + if (mMainView == window->currentView()) + { + mMainView->captureScreenShot(true); + } + } + window->removeView(window->currentView()); window->addView(mFavoriteView); window->setCurrentView(mFavoriteView); break; case NotesNamespace::NotesNoteViewId: + if (mMainView) + { + if (mMainView == window->currentView()) + { + mMainView->captureScreenShot(true); + } + } + window->removeView(window->currentView()); window->addView(mNoteView); window->setCurrentView(mNoteView); @@ -249,21 +315,12 @@ } /*! - Delete the entry. - */ -void NotesViewManager::deleteEntryFromView(ulong entryId) -{ - if (showDeleteConfirmationQuery(entryId)) { - // Delete the given note. - mAgendaUtil->deleteEntry(entryId); - } -} - -/*! Loads other views from the docml file. */ void NotesViewManager::loadOtherViews() { + mMainView->setupAfterViewReady(); + // Load the collection view. loadNotesCollectionView(); // Load the to-do view. @@ -280,38 +337,77 @@ this, SLOT(loadOtherViews())); } -/* ! - Show the delete confirmation query. +/*! + Delete the entry. */ -bool NotesViewManager::showDeleteConfirmationQuery(ulong noteId) +void NotesViewManager::deleteEntryFromView(ulong entryId) { - bool retValue(false); - - HbMessageBox confirmationQuery(HbMessageBox::MessageTypeQuestion); - confirmationQuery.setDismissPolicy(HbDialog::NoDismiss); - confirmationQuery.setTimeout(HbDialog::NoTimeout); - confirmationQuery.setIconVisible(true); + mEntryId = entryId; + HbMessageBox *confirmationQuery = new HbMessageBox( + HbMessageBox::MessageTypeQuestion); + confirmationQuery->setDismissPolicy(HbDialog::NoDismiss); + confirmationQuery->setTimeout(HbDialog::NoTimeout); + confirmationQuery->setIconVisible(true); QString displayText; QString x; - AgendaEntry entry = mAgendaUtil->fetchById(noteId); + AgendaEntry entry = mAgendaUtil->fetchById(entryId); if (AgendaEntry::TypeTodo == entry.type()) { displayText += hbTrId("txt_notes_info_delete_todo_note"); } else { displayText += hbTrId("txt_notes_info_delete_note"); } - confirmationQuery.setText(displayText); + confirmationQuery->setText(displayText); + + // Remove the default actions. + QList defaultActions = confirmationQuery->actions(); + for (int index=0;indexremoveAction(defaultActions[index]); + } + defaultActions.clear(); + + // Add delete and cancel actions + mDeleteAction = new HbAction(hbTrId("txt_notes_button_dialog_delete")); + mCancelAction = new HbAction(hbTrId("txt_common_button_cancel")); + + confirmationQuery->addAction(mDeleteAction); + confirmationQuery->addAction(mCancelAction); + + confirmationQuery->open(this, SLOT(selectedAction(HbAction*))); +} - confirmationQuery.setPrimaryAction(new HbAction( - hbTrId("txt_notes_button_dialog_delete"), &confirmationQuery)); - confirmationQuery.setSecondaryAction(new HbAction( - hbTrId("txt_common_button_cancel"), &confirmationQuery)); - HbAction *selected = confirmationQuery.exec(); - if (selected == confirmationQuery.primaryAction()) { - retValue = true; +/*! + Slot to handle the delete action + */ +void NotesViewManager::selectedAction(HbAction *action) +{ + if (action == mDeleteAction) { + // Delete the given note. + mAgendaUtil->deleteEntry(mEntryId); } +} - return retValue; +/*! + Slot to handle instance view creation complete. + */ +void NotesViewManager::handleInstanceViewCreationCompleted(int status) +{ + Q_UNUSED(status) + + // Update the title for main view. + mMainView->updateTitle(); + + // Populate collections view. + mCollectionView->populateListView(); + + // Update the title for to-do view. + mTodoView->updateTitle(); + + // Update the plain notes view. + mNoteView->updateNoteView(); + + // Update the favorites view. + mFavoriteView->updateFavoriteView(); } // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesviews/bwins/notesviewsu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/notesviews/bwins/notesviewsu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,24 @@ +EXPORTS + ??1NotesFavoriteView@@UAE@XZ @ 1 NONAME ; NotesFavoriteView::~NotesFavoriteView(void) + ??0NotesNoteView@@QAE@PAVQGraphicsWidget@@@Z @ 2 NONAME ; NotesNoteView::NotesNoteView(class QGraphicsWidget *) + ??0NotesTodoView@@QAE@PAVQGraphicsWidget@@@Z @ 3 NONAME ; NotesTodoView::NotesTodoView(class QGraphicsWidget *) + ?updateTitle@NotesMainView@@QAEXXZ @ 4 NONAME ; void NotesMainView::updateTitle(void) + ??0NotesMainView@@QAE@PAVQGraphicsWidget@@@Z @ 5 NONAME ; NotesMainView::NotesMainView(class QGraphicsWidget *) + ?setupAfterViewReady@NotesMainView@@QAEXXZ @ 6 NONAME ; void NotesMainView::setupAfterViewReady(void) + ?setupView@NotesNoteView@@QAEXAAVNotesAppControllerIf@@PAVNotesDocLoader@@@Z @ 7 NONAME ; void NotesNoteView::setupView(class NotesAppControllerIf &, class NotesDocLoader *) + ?setupView@NotesTodoView@@QAEXAAVNotesAppControllerIf@@PAVNotesDocLoader@@@Z @ 8 NONAME ; void NotesTodoView::setupView(class NotesAppControllerIf &, class NotesDocLoader *) + ??0NotesCollectionView@@QAE@PAVQGraphicsWidget@@@Z @ 9 NONAME ; NotesCollectionView::NotesCollectionView(class QGraphicsWidget *) + ?populateListView@NotesCollectionView@@QAEXXZ @ 10 NONAME ; void NotesCollectionView::populateListView(void) + ??1NotesCollectionView@@UAE@XZ @ 11 NONAME ; NotesCollectionView::~NotesCollectionView(void) + ?updateTitle@NotesTodoView@@QAEXXZ @ 12 NONAME ; void NotesTodoView::updateTitle(void) + ?setupView@NotesCollectionView@@QAEXAAVNotesAppControllerIf@@PAVNotesDocLoader@@@Z @ 13 NONAME ; void NotesCollectionView::setupView(class NotesAppControllerIf &, class NotesDocLoader *) + ??0NotesFavoriteView@@QAE@PAVQGraphicsWidget@@@Z @ 14 NONAME ; NotesFavoriteView::NotesFavoriteView(class QGraphicsWidget *) + ??1NotesMainView@@UAE@XZ @ 15 NONAME ; NotesMainView::~NotesMainView(void) + ?setupView@NotesMainView@@QAEXAAVNotesAppControllerIf@@PAVNotesDocLoader@@@Z @ 16 NONAME ; void NotesMainView::setupView(class NotesAppControllerIf &, class NotesDocLoader *) + ??1NotesNoteView@@UAE@XZ @ 17 NONAME ; NotesNoteView::~NotesNoteView(void) + ??1NotesTodoView@@UAE@XZ @ 18 NONAME ; NotesTodoView::~NotesTodoView(void) + ?setupView@NotesFavoriteView@@QAEXAAVNotesAppControllerIf@@PAVNotesDocLoader@@@Z @ 19 NONAME ; void NotesFavoriteView::setupView(class NotesAppControllerIf &, class NotesDocLoader *) + ?captureScreenShot@NotesMainView@@QAEX_N@Z @ 20 NONAME ; void NotesMainView::captureScreenShot(bool) + ?updateFavoriteView@NotesFavoriteView@@QAEXXZ @ 21 NONAME ; void NotesFavoriteView::updateFavoriteView(void) + ?updateNoteView@NotesNoteView@@QAEXXZ @ 22 NONAME ; void NotesNoteView::updateNoteView(void) + diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesviews/eabi/notesviewsu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/notesviews/eabi/notesviewsu.def Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,59 @@ +EXPORTS + _ZN13NotesMainView11updateTitleEv @ 1 NONAME + _ZN13NotesMainView19setupAfterViewReadyEv @ 2 NONAME + _ZN13NotesMainView9setupViewER20NotesAppControllerIfP14NotesDocLoader @ 3 NONAME + _ZN13NotesMainViewC1EP15QGraphicsWidget @ 4 NONAME + _ZN13NotesMainViewC2EP15QGraphicsWidget @ 5 NONAME + _ZN13NotesMainViewD0Ev @ 6 NONAME + _ZN13NotesMainViewD1Ev @ 7 NONAME + _ZN13NotesMainViewD2Ev @ 8 NONAME + _ZN13NotesNoteView9setupViewER20NotesAppControllerIfP14NotesDocLoader @ 9 NONAME + _ZN13NotesNoteViewC1EP15QGraphicsWidget @ 10 NONAME + _ZN13NotesNoteViewC2EP15QGraphicsWidget @ 11 NONAME + _ZN13NotesNoteViewD0Ev @ 12 NONAME + _ZN13NotesNoteViewD1Ev @ 13 NONAME + _ZN13NotesNoteViewD2Ev @ 14 NONAME + _ZN13NotesTodoView11updateTitleEv @ 15 NONAME + _ZN13NotesTodoView9setupViewER20NotesAppControllerIfP14NotesDocLoader @ 16 NONAME + _ZN13NotesTodoViewC1EP15QGraphicsWidget @ 17 NONAME + _ZN13NotesTodoViewC2EP15QGraphicsWidget @ 18 NONAME + _ZN13NotesTodoViewD0Ev @ 19 NONAME + _ZN13NotesTodoViewD1Ev @ 20 NONAME + _ZN13NotesTodoViewD2Ev @ 21 NONAME + _ZN17NotesFavoriteView9setupViewER20NotesAppControllerIfP14NotesDocLoader @ 22 NONAME + _ZN17NotesFavoriteViewC1EP15QGraphicsWidget @ 23 NONAME + _ZN17NotesFavoriteViewC2EP15QGraphicsWidget @ 24 NONAME + _ZN17NotesFavoriteViewD0Ev @ 25 NONAME + _ZN17NotesFavoriteViewD1Ev @ 26 NONAME + _ZN17NotesFavoriteViewD2Ev @ 27 NONAME + _ZN19NotesCollectionView16populateListViewEv @ 28 NONAME + _ZN19NotesCollectionView9setupViewER20NotesAppControllerIfP14NotesDocLoader @ 29 NONAME + _ZN19NotesCollectionViewC1EP15QGraphicsWidget @ 30 NONAME + _ZN19NotesCollectionViewC2EP15QGraphicsWidget @ 31 NONAME + _ZN19NotesCollectionViewD0Ev @ 32 NONAME + _ZN19NotesCollectionViewD1Ev @ 33 NONAME + _ZN19NotesCollectionViewD2Ev @ 34 NONAME + _ZThn16_N13NotesMainViewD0Ev @ 35 NONAME + _ZThn16_N13NotesMainViewD1Ev @ 36 NONAME + _ZThn16_N13NotesNoteViewD0Ev @ 37 NONAME + _ZThn16_N13NotesNoteViewD1Ev @ 38 NONAME + _ZThn16_N13NotesTodoViewD0Ev @ 39 NONAME + _ZThn16_N13NotesTodoViewD1Ev @ 40 NONAME + _ZThn16_N17NotesFavoriteViewD0Ev @ 41 NONAME + _ZThn16_N17NotesFavoriteViewD1Ev @ 42 NONAME + _ZThn16_N19NotesCollectionViewD0Ev @ 43 NONAME + _ZThn16_N19NotesCollectionViewD1Ev @ 44 NONAME + _ZThn8_N13NotesMainViewD0Ev @ 45 NONAME + _ZThn8_N13NotesMainViewD1Ev @ 46 NONAME + _ZThn8_N13NotesNoteViewD0Ev @ 47 NONAME + _ZThn8_N13NotesNoteViewD1Ev @ 48 NONAME + _ZThn8_N13NotesTodoViewD0Ev @ 49 NONAME + _ZThn8_N13NotesTodoViewD1Ev @ 50 NONAME + _ZThn8_N17NotesFavoriteViewD0Ev @ 51 NONAME + _ZThn8_N17NotesFavoriteViewD1Ev @ 52 NONAME + _ZThn8_N19NotesCollectionViewD0Ev @ 53 NONAME + _ZThn8_N19NotesCollectionViewD1Ev @ 54 NONAME + _ZN13NotesMainView17captureScreenShotEb @ 55 NONAME + _ZN13NotesNoteView14updateNoteViewEv @ 56 NONAME + _ZN17NotesFavoriteView18updateFavoriteViewEv @ 57 NONAME + diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesviews/inc/notescollectionview.h --- a/notes/notesui/notesviews/inc/notescollectionview.h Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesviews/inc/notescollectionview.h Mon Jun 28 15:22:02 2010 +0530 @@ -47,6 +47,7 @@ public: NOTESVIEWS_EXPORT void setupView( NotesAppControllerIf &controllerIf, NotesDocLoader *docLoader); + NOTESVIEWS_EXPORT void populateListView(); private slots: void displayAllNotesView(); @@ -60,7 +61,7 @@ void handleActionStateChanged(); private: - void populateListView(); + int todosCount(); int recentNotesCount(); diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesviews/inc/notesfavoriteview.h --- a/notes/notesui/notesviews/inc/notesfavoriteview.h Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesviews/inc/notesfavoriteview.h Mon Jun 28 15:22:02 2010 +0530 @@ -32,6 +32,7 @@ class HbListView; class HbAction; class HbAbstractViewItem; +class HbLabel; class NotesModel; class NotesDocLoader; class AgendaUtil; @@ -49,6 +50,7 @@ public: NOTESVIEWS_EXPORT void setupView( NotesAppControllerIf &controllerIf, NotesDocLoader *docLoader); + NOTESVIEWS_EXPORT void updateFavoriteView(); signals: void deleteEntry(ulong entryId); @@ -67,7 +69,10 @@ void handleActionStateChanged(); void handleOrientationChanged(Qt::Orientation); void openNote(); - + void selectedMenuAction(HbAction *action); + void handleMenuClosed(); + void updateView(ulong id=0); + private: HbListView *mListView; HbAbstractViewItem *mSelectedItem; @@ -79,7 +84,9 @@ HbAction *mRemoveFavoriteAction; HbAction *mMarkTodoAction; HbAction *mOpenAction; - + + HbLabel *mEmptyListLabel; + AgendaUtil *mAgendaUtil; NotesAppControllerIf *mAppControllerIf; @@ -87,6 +94,7 @@ NotesModel *mNotesModel; NotesSortFilterProxyModel *mProxyModel; NotesEditor *mNotesEditor; + bool mIsLongTop; }; #endif // NOTESFAVORITEVIEW_H diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesviews/inc/notesmainview.h --- a/notes/notesui/notesviews/inc/notesmainview.h Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesviews/inc/notesmainview.h Mon Jun 28 15:22:02 2010 +0530 @@ -53,6 +53,10 @@ public: NOTESVIEWS_EXPORT void setupView( NotesAppControllerIf &controllerIf, NotesDocLoader *docLoader); + NOTESVIEWS_EXPORT void setupAfterViewReady(); + NOTESVIEWS_EXPORT void updateTitle(); + NOTESVIEWS_EXPORT void captureScreenShot(bool captureScreenShot = false); + signals: void deleteEntry(ulong entryId); @@ -74,7 +78,10 @@ void updateSubTitle(ulong id=0); void markNoteAsTodo(); void openNote(); - + void selectedMenuAction(HbAction *action); + void handleMenuClosed(); + void saveActivity(); + private: HbListView *mListView; HbAbstractViewItem *mSelectedItem; @@ -93,6 +100,7 @@ HbAction *mOpenAction; HbGroupBox *mSubTitle; + HbLabel *mEmptyListLabel; AgendaUtil *mAgendaUtil; @@ -102,6 +110,9 @@ NotesSortFilterProxyModel *mProxyModel; NotesEditor *mNotesEditor; AgendaEventViewer *mAgendaEventViewer; + bool mIsLongTop; + bool mIsScreenShotCapruted; // check if the screenshot captured is valid + QVariantHash mScreenShot; // screenshot }; #endif // NOTESMAINVIEW_H diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesviews/inc/notesnoteview.h --- a/notes/notesui/notesviews/inc/notesnoteview.h Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesviews/inc/notesnoteview.h Mon Jun 28 15:22:02 2010 +0530 @@ -32,6 +32,7 @@ class HbListView; class HbAction; class HbAbstractViewItem; +class HbLabel; class NotesModel; class NotesDocLoader; class AgendaUtil; @@ -49,7 +50,9 @@ public: NOTESVIEWS_EXPORT void setupView( NotesAppControllerIf &controllerIf, NotesDocLoader *docLoader); - + NOTESVIEWS_EXPORT void updateNoteView(); + + signals: void deleteEntry(ulong entryId); @@ -67,6 +70,9 @@ void handleActionStateChanged(); void handleOrientationChanged(Qt::Orientation); void openNote(); + void selectedMenuAction(HbAction *action); + void handleMenuClosed(); + void updateView(ulong id=0); private: HbListView *mListView; @@ -81,6 +87,8 @@ HbAction *mMarkTodoAction; HbAction *mOpenAction; + HbLabel *mEmptyListLabel; + AgendaUtil *mAgendaUtil; NotesAppControllerIf *mAppControllerIf; @@ -88,6 +96,7 @@ NotesModel *mNotesModel; NotesSortFilterProxyModel *mProxyModel; NotesEditor *mNotesEditor; + bool mIsLongTop; }; #endif // NOTESNOTEVIEW_H diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesviews/inc/notestodoview.h --- a/notes/notesui/notesviews/inc/notestodoview.h Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesviews/inc/notestodoview.h Mon Jun 28 15:22:02 2010 +0530 @@ -32,6 +32,7 @@ class HbAction; class HbAbstractViewItem; class HbGroupBox; +class HbLabel; class NotesModel; class NotesDocLoader; class AgendaUtil; @@ -50,7 +51,8 @@ public: NOTESVIEWS_EXPORT void setupView( NotesAppControllerIf &controllerIf, NotesDocLoader *docLoader); - + NOTESVIEWS_EXPORT void updateTitle(); + signals: void deleteEntry(ulong entryId); @@ -71,6 +73,8 @@ void handleOrientationChanged(Qt::Orientation); void updateSubTitle(ulong id=0); void openTodo(); + void selectedMenuAction(HbAction *action); + void handleMenuClosed(); private: HbListView *mListView; @@ -85,7 +89,8 @@ HbAction *mOpenAction; HbGroupBox *mSubTitle; - + HbLabel *mEmptyListLabel; + AgendaUtil *mAgendaUtil; NotesAppControllerIf *mAppControllerIf; @@ -94,6 +99,7 @@ NotesSortFilterProxyModel *mProxyModel; NotesEditor *mNotesEditor; AgendaEventViewer *mAgendaEventViewer; + bool mIsLongTop; }; #endif // NOTESTODOVIEW_H diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesviews/inc/notesviewsdefines.h --- a/notes/notesui/notesviews/inc/notesviewsdefines.h Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesviews/inc/notesviewsdefines.h Mon Jun 28 15:22:02 2010 +0530 @@ -27,6 +27,7 @@ # define NOTESVIEWS_EXPORT Q_DECL_IMPORT #endif +const QString notes = "NotesAllList"; // Activity Id to be stored in Activity Manager DB #endif // NOTESVIEWSDEFINES_H // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesviews/src/notescollectionview.cpp --- a/notes/notesui/notesviews/src/notescollectionview.cpp Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesviews/src/notescollectionview.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -117,9 +117,6 @@ mListView, SIGNAL(activated(const QModelIndex &)), this, SLOT(handleActivated(const QModelIndex &))); - // Populate the content of the view. - populateListView(); - // Get the toolbar/menu actions. mAllNotesAction = static_cast ( mDocLoader->findObject("allNotesAction")); @@ -158,6 +155,46 @@ } /*! + Populate the content of the view. + */ +void NotesCollectionView::populateListView() +{ + QStandardItemModel *model = new QStandardItemModel(this); + model->setColumnCount(1); + + QString countString(hbTrId("txt_notes_list_note_count")); + + // Add To-do's item. + QStandardItem *item = new QStandardItem(); + QStringList todoStringList; + todoStringList.append(hbTrId("txt_notes_list_todos")); + todoStringList.append(countString.arg(QString::number(todosCount()))); + item->setData(todoStringList, Qt::DisplayRole); + model->appendRow(item); + + // Add Favorites item. + item = new QStandardItem(); + QStringList favStringList; + favStringList.append(hbTrId("txt_notes_list_favorites")); + favStringList.append(countString.arg(mFavouriteModel->rowCount())); + item->setData(favStringList, Qt::DisplayRole); + model->appendRow(item); + + // Add Recent notes item. + item = new QStandardItem(); + QStringList notesStringList; + notesStringList.append(hbTrId("txt_notes_list_plain_notes")); + notesStringList.append( + countString.arg(QString::number(recentNotesCount()))); + item->setData(notesStringList, Qt::DisplayRole); + model->appendRow(item); + + HbStyleLoader::registerFilePath(":/style"); + mListView->setLayoutName("custom"); + mListView->setModel(model); +} + +/*! Displays all notes view. */ void NotesCollectionView::displayAllNotesView() @@ -215,6 +252,8 @@ // Cleanup. mNotesEditor->deleteLater(); + + mAppControllerIf->switchToView(NotesNamespace::NotesMainViewId); } /*! @@ -297,14 +336,18 @@ Q_UNUSED(index) Q_UNUSED(start) Q_UNUSED(end) - - // Update the count of notes in the view. - QString countString(hbTrId("txt_notes_list_note_count")); - QModelIndex mdlIndex = mListView->model()->index(1, 0); - QStringList favStringList; - favStringList.append(hbTrId("txt_notes_list_favorites")); - favStringList.append(countString.arg(mFavouriteModel->rowCount())); - mListView->model()->setData(mdlIndex, favStringList, Qt::DisplayRole); + + // Check model is set for mListView before update + if( mListView->model()) + { + // Update the count of notes in the view. + QString countString(hbTrId("txt_notes_list_note_count")); + QModelIndex mdlIndex = mListView->model()->index(1, 0); + QStringList favStringList; + favStringList.append(hbTrId("txt_notes_list_favorites")); + favStringList.append(countString.arg(mFavouriteModel->rowCount())); + mListView->model()->setData(mdlIndex, favStringList, Qt::DisplayRole); + } } /*! @@ -315,46 +358,6 @@ mViewCollectionAction->setChecked(true); } -/*! - Populate the content of the view. - */ -void NotesCollectionView::populateListView() -{ - QStandardItemModel *model = new QStandardItemModel(this); - model->setColumnCount(1); - - QString countString(hbTrId("txt_notes_list_note_count")); - - // Add To-do's item. - QStandardItem *item = new QStandardItem(); - QStringList todoStringList; - todoStringList.append(hbTrId("txt_notes_list_todos")); - todoStringList.append(countString.arg(QString::number(todosCount()))); - item->setData(todoStringList, Qt::DisplayRole); - model->appendRow(item); - - // Add Favorites item. - item = new QStandardItem(); - QStringList favStringList; - favStringList.append(hbTrId("txt_notes_list_favorites")); - favStringList.append(countString.arg(mFavouriteModel->rowCount())); - item->setData(favStringList, Qt::DisplayRole); - model->appendRow(item); - - // Add Recent notes item. - item = new QStandardItem(); - QStringList notesStringList; - notesStringList.append(hbTrId("txt_notes_list_plain_notes")); - notesStringList.append( - countString.arg(QString::number(recentNotesCount()))); - item->setData(notesStringList, Qt::DisplayRole); - model->appendRow(item); - - HbStyleLoader::registerFilePath(":/style"); - mListView->setLayoutName("custom"); - mListView->setModel(model); -} - /*! Returns the todos count diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesviews/src/notesfavoriteview.cpp --- a/notes/notesui/notesviews/src/notesfavoriteview.cpp Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesviews/src/notesfavoriteview.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -30,6 +30,7 @@ #include #include #include +#include // User includes #include "notesfavoriteview.h" @@ -56,7 +57,8 @@ NotesFavoriteView::NotesFavoriteView(QGraphicsWidget *parent) :HbView(parent), mSelectedItem(0), - mDeleteAction(0) + mDeleteAction(0), + mIsLongTop(false) { // Nothing yet. } @@ -116,6 +118,10 @@ this, SLOT(handleItemLongPressed(HbAbstractViewItem *, const QPointF &))); + // Get the empty list label. + mEmptyListLabel = static_cast ( + mDocLoader->findWidget("emptyListLabel")); + // Get the toolbar/menu actions. mAddNoteAction = static_cast ( mDocLoader->findObject("newNoteAction")); @@ -131,8 +137,7 @@ mViewCollectionAction = static_cast ( mDocLoader->findObject("displayCollectionsAction")); - mViewCollectionAction->setCheckable(true); - mViewCollectionAction->setChecked(true); + connect( mViewCollectionAction, SIGNAL(changed()), this, SLOT(handleActionStateChanged())); @@ -147,11 +152,29 @@ window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(handleOrientationChanged(Qt::Orientation))); + connect( + mAgendaUtil, SIGNAL(entryAdded(ulong)), + this,SLOT(updateView(ulong))); + connect( + mAgendaUtil, SIGNAL(entryDeleted(ulong)), + this,SLOT(updateView(ulong))); + connect( + mAgendaUtil, SIGNAL(entryUpdated(ulong)), + this, SLOT(updateView(ulong))); + // Set the graphics size for the icons. HbListViewItem *prototype = mListView->listItemPrototype(); prototype->setGraphicsSize(HbListViewItem::SmallIcon); } +/* + Updates the favorite view either to show notes or emptyListLabel. + */ +void NotesFavoriteView::updateFavoriteView() +{ + updateView(); +} + /*! Slot which gets called when `+ New note' action is triggered from the view toolbar. This is responsible for launching the editor to create a new note. @@ -176,35 +199,37 @@ */ void NotesFavoriteView::handleItemReleased(const QModelIndex &index) { - // Sanity check. - if (!index.isValid()) { - return; - } + if (!mIsLongTop) { + // Sanity check. + if (!index.isValid()) { + return; + } - // First get the id of the note and get the corresponding information from - // agendautil. - ulong noteId = index.data(NotesNamespace::IdRole).value(); + // First get the id of the note and get the corresponding information from + // agendautil. + ulong noteId = index.data(NotesNamespace::IdRole).value(); - if (0 >= noteId) { - // Something wrong. - return; - } + if (0 >= noteId) { + // Something wrong. + return; + } - // Get the entry details. - AgendaEntry entry = mAgendaUtil->fetchById(noteId); + // Get the entry details. + AgendaEntry entry = mAgendaUtil->fetchById(noteId); + + if (entry.isNull()) { - if (entry.isNull()) { + // Entry invalid. + return; + } - // Entry invalid. - return; + // Now launch the editor with the obtained info. + mNotesEditor = new NotesEditor(mAgendaUtil, this); + connect( + mNotesEditor, SIGNAL(editingCompleted(bool)), + this, SLOT(handleEditingCompleted(bool))); + mNotesEditor->edit(entry); } - - // Now launch the editor with the obtained info. - mNotesEditor = new NotesEditor(mAgendaUtil, this); - connect( - mNotesEditor, SIGNAL(editingCompleted(bool)), - this, SLOT(handleEditingCompleted(bool))); - mNotesEditor->edit(entry); } /*! @@ -219,6 +244,7 @@ HbAbstractViewItem *item, const QPointF &coords) { mSelectedItem = item; + mIsLongTop = true; // Get the entry of the selected item. ulong noteId = item->modelIndex().data( @@ -227,37 +253,28 @@ // Display a context specific menu. HbMenu *contextMenu = new HbMenu(); + connect( + contextMenu,SIGNAL(aboutToClose()), + this, SLOT(handleMenuClosed())); // Add actions to the context menu. mOpenAction = contextMenu->addAction(hbTrId("txt_common_menu_open")); - connect( - mOpenAction, SIGNAL(triggered()), - this, SLOT(openNote())); mDeleteAction = contextMenu->addAction(hbTrId("txt_common_menu_delete")); - connect( - mDeleteAction, SIGNAL(triggered()), - this, SLOT(deleteNote())); mRemoveFavoriteAction = contextMenu->addAction( hbTrId("txt_notes_menu_remove_from_favorites")); - connect( - mRemoveFavoriteAction, SIGNAL(triggered()), - this, SLOT(markNoteAsNotFavourite())); - mMarkTodoAction = contextMenu->addAction( hbTrId("txt_notes_menu_make_it_as_todo_note")); - connect( - mMarkTodoAction, SIGNAL(triggered()), - this, SLOT(markNoteAsTodo())); // Show the menu. - contextMenu->exec(coords); + contextMenu->open(this, SLOT(selectedMenuAction(HbAction*))); + contextMenu->setPreferredPos(coords); } /*! @@ -352,6 +369,14 @@ // Delete the old entry. mAgendaUtil->deleteEntry(entry.id()); + + // Show the soft notification. + HbNotificationDialog *notificationDialog = new HbNotificationDialog(); + notificationDialog->setTimeout( + HbNotificationDialog::ConfirmationNoteTimeout); + notificationDialog->setTitle( + hbTrId("txt_notes_dpopinfo_note_moved_to_todos")); + notificationDialog->show(); } /*! @@ -430,5 +455,47 @@ // Launch the notes editor with the obtained info. mNotesEditor->edit(entry); } + +/* + Slot to handle the context menu actions. + */ +void NotesFavoriteView::selectedMenuAction(HbAction *action) +{ + if(action == mOpenAction) { + openNote(); + } else if (action == mDeleteAction) { + deleteNote(); + } else if (action ==mRemoveFavoriteAction){ + markNoteAsNotFavourite(); + } else if (action == mMarkTodoAction) { + markNoteAsTodo(); + } +} + +/*! + Slot to handle the context menu closed. + */ +void NotesFavoriteView::handleMenuClosed() +{ + mIsLongTop = false; +} + +/*! + Handles the visibility of empty list label. + */ +void NotesFavoriteView::updateView(ulong id) +{ + Q_UNUSED(id) + + // Get the numbers of favorite notes. + if (0 >= mListView->model()->rowCount()) { + mEmptyListLabel->show(); + mListView->hide(); + } else { + mEmptyListLabel->hide(); + mListView->show(); + } +} + // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesviews/src/notesmainview.cpp --- a/notes/notesui/notesviews/src/notesmainview.cpp Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesviews/src/notesmainview.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -30,6 +30,8 @@ #include #include #include +#include // hbapplication +#include // hbactivitymanager // User includes #include "agendaeventviewer.h" @@ -40,6 +42,7 @@ #include "notesmodel.h" #include "notessortfilterproxymodel.h" #include "noteseditor.h" +#include "notescommon.h" // NotesNamespace /*! \class NotesMainView @@ -57,7 +60,9 @@ NotesMainView::NotesMainView(QGraphicsWidget *parent) :HbView(parent), mSelectedItem(0), - mDeleteAction(0) + mDeleteAction(0), + mIsLongTop(false), + mIsScreenShotCapruted(false) { // Nothing yet. } @@ -121,10 +126,41 @@ mNotesModel, SIGNAL(rowAdded(QModelIndex)), this, SLOT(scrollTo(QModelIndex))); + // Get the empty list label. + mEmptyListLabel = static_cast ( + mDocLoader->findWidget("emptyListLabel")); + mEmptyListLabel->hide(); + // Get the view heading label - mViewHeading = static_cast ( + mSubTitle = static_cast( mDocLoader->findWidget("viewHeading")); + // Handles the orientation change for list items + HbMainWindow *window = hbInstance->allMainWindows().first(); + handleOrientationChanged(window->orientation()); + connect( + window, SIGNAL(orientationChanged(Qt::Orientation)), + this, SLOT(handleOrientationChanged(Qt::Orientation))); + + // Set the graphics size for the icons. + HbListViewItem *prototype = mListView->listItemPrototype(); + prototype->setGraphicsSize(HbListViewItem::SmallIcon); + + // Get a pointer to activity Manager + HbActivityManager* activityManager = qobject_cast(qApp)->activityManager(); + + // clean up any previous versions of this activity from the activity manager. + // ignore return value as the first boot would always return a false + // bool declared on for debugging purpose + bool ok = activityManager->removeActivity(notes); + + // connect main view for the first time to recieve aboutToQuit signal + connect(qobject_cast(qApp), SIGNAL(aboutToQuit()), this, SLOT(saveActivity())); + + } + +void NotesMainView::setupAfterViewReady() +{ // Get the toolbar/menu actions. mAddNoteAction = static_cast ( mDocLoader->findObject("newNoteAction")); @@ -159,19 +195,6 @@ mViewCollectionAction, SIGNAL(triggered()), this, SLOT(displayCollectionView())); - mSubTitle = static_cast( - mDocLoader->findWidget("viewHeading")); - - // Handles the orientation change for list items - HbMainWindow *window = hbInstance->allMainWindows().first(); - handleOrientationChanged(window->orientation()); - connect( - window, SIGNAL(orientationChanged(Qt::Orientation)), - this, SLOT(handleOrientationChanged(Qt::Orientation))); - - // Update sub heading text for main view. - updateSubTitle(); - connect( mAgendaUtil, SIGNAL(entryAdded(ulong)), this,SLOT(updateSubTitle(ulong))); @@ -181,10 +204,14 @@ connect( mAgendaUtil, SIGNAL(entryUpdated(ulong)), this, SLOT(updateSubTitle(ulong))); +} - // Set the graphics size for the icons. - HbListViewItem *prototype = mListView->listItemPrototype(); - prototype->setGraphicsSize(HbListViewItem::SmallIcon); +/* + Updates the title text for the first launch + */ +void NotesMainView::updateTitle() +{ + updateSubTitle(); } /*! @@ -200,6 +227,9 @@ mNotesEditor, SIGNAL(editingCompleted(bool)), this, SLOT(handleEditingCompleted(bool))); mNotesEditor->create(NotesEditor::CreateNote); + // capture screenshot for future use, if application + // is exited/Quit from notesEditor + captureScreenShot(true); } /*! @@ -212,46 +242,51 @@ */ void NotesMainView::handleItemReleased(const QModelIndex &index) { - // Sanity check. - if (!index.isValid()) { - return; - } + if(!mIsLongTop) { + // Sanity check. + if (!index.isValid()) { + return; + } + + // First get the id of the note and get the corresponding information from + // agendautil. + ulong noteId = index.data(NotesNamespace::IdRole).value(); - // First get the id of the note and get the corresponding information from - // agendautil. - ulong noteId = index.data(NotesNamespace::IdRole).value(); + if (0 >= noteId) { + // Something wrong. + return; + } - if (0 >= noteId) { - // Something wrong. - return; - } + // Get the entry details. + AgendaEntry entry = mAgendaUtil->fetchById(noteId); + if (entry.isNull()) { + // Entry invalid. + return; + } - // Get the entry details. - AgendaEntry entry = mAgendaUtil->fetchById(noteId); - if (entry.isNull()) { - // Entry invalid. - return; - } - - if(AgendaEntry::TypeTodo == entry.type()) { - // Construct agenda event viewer. - mAgendaEventViewer = new AgendaEventViewer(mAgendaUtil, this); + if(AgendaEntry::TypeTodo == entry.type()) { + // Construct agenda event viewer. + mAgendaEventViewer = new AgendaEventViewer(mAgendaUtil, this); - connect( - mAgendaEventViewer, SIGNAL(viewingCompleted(const QDate)), - this, SLOT(handleViewingCompleted())); - // Launch agenda event viewer - mAgendaEventViewer->view( - entry, AgendaEventViewer::ActionEditDelete); - }else if(AgendaEntry::TypeNote == entry.type()) { - // Construct notes editor. - mNotesEditor = new NotesEditor(mAgendaUtil, this); - connect( - mNotesEditor, SIGNAL(editingCompleted(bool)), - this, SLOT(handleEditingCompleted(bool))); + connect( + mAgendaEventViewer, SIGNAL(viewingCompleted(const QDate)), + this, SLOT(handleViewingCompleted())); + // Launch agenda event viewer + mAgendaEventViewer->view( + entry, AgendaEventViewer::ActionEditDelete); + }else if(AgendaEntry::TypeNote == entry.type()) { + // Construct notes editor. + mNotesEditor = new NotesEditor(mAgendaUtil, this); + connect( + mNotesEditor, SIGNAL(editingCompleted(bool)), + this, SLOT(handleEditingCompleted(bool))); - // Launch the notes editor with the obtained info. - mNotesEditor->edit(entry); + // Launch the notes editor with the obtained info. + mNotesEditor->edit(entry); + } + // capture screenshot for future use, if application + // is exited/Quit from eventViewer/notesEditor + captureScreenShot(true); } } @@ -266,6 +301,7 @@ void NotesMainView::handleItemLongPressed( HbAbstractViewItem *item, const QPointF &coords) { + mIsLongTop = true; mSelectedItem = item; ulong noteId = item->modelIndex().data( @@ -274,74 +310,48 @@ // Display a context specific menu. HbMenu *contextMenu = new HbMenu(); + connect( + contextMenu,SIGNAL(aboutToClose()), + this, SLOT(handleMenuClosed())); + mOpenAction = contextMenu->addAction(hbTrId("txt_common_menu_open")); - connect( - mOpenAction, SIGNAL(triggered()), - this, SLOT(openNote())); // Add actions to the context menu. if (AgendaEntry::TypeTodo == entry.type()) { mEditTodoAction = contextMenu->addAction(hbTrId("txt_common_menu_edit")); - connect( - mEditTodoAction, SIGNAL(triggered()), - this, SLOT(editTodo())); } mDeleteAction = contextMenu->addAction(hbTrId("txt_common_menu_delete")); - connect( - mDeleteAction, SIGNAL(triggered()), - this, SLOT(deleteNote())); if (AgendaEntry::TypeNote == entry.type()) { if (entry.favourite()) { mMakeFavouriteAction = contextMenu->addAction( hbTrId("txt_notes_menu_remove_from_favorites")); - - connect( - mMakeFavouriteAction, SIGNAL(triggered()), - this, SLOT(markNoteAsFavourite())); - } else { mMakeFavouriteAction = contextMenu->addAction( hbTrId("txt_notes_menu_mark_as_favorite")); - - connect( - mMakeFavouriteAction, SIGNAL(triggered()), - this, SLOT(markNoteAsFavourite())); } mMarkTodoAction = contextMenu->addAction( hbTrId("txt_notes_menu_make_it_as_todo_note")); - connect( - mMarkTodoAction, SIGNAL(triggered()), - this, SLOT(markNoteAsTodo())); } else if (AgendaEntry::TypeTodo == entry.type()) { if (AgendaEntry::TodoNeedsAction == entry.status()) { mTodoStatusAction = contextMenu->addAction( hbTrId("txt_notes_menu_mark_as_done")); - - connect( - mTodoStatusAction , SIGNAL(triggered()), - this, SLOT(markTodoStatus())); - } else if (AgendaEntry::TodoCompleted == entry.status()) { mTodoStatusAction = contextMenu->addAction( hbTrId("txt_notes_menu_mark_as_not_done")); - - connect( - mTodoStatusAction , SIGNAL(triggered()), - this, SLOT(markTodoStatus())); } } // Show the menu. - contextMenu->exec(coords); - + contextMenu->open(this, SLOT(selectedMenuAction(HbAction*))); + contextMenu->setPreferredPos(coords); } /*! @@ -422,7 +432,9 @@ // Cleanup. mNotesEditor->deleteLater(); - + // set captured screenshot as invalid as the control is returned back + // to the main view + captureScreenShot(false); } /*! @@ -430,7 +442,8 @@ */ void NotesMainView::displayCollectionView() { - + // no need to capture the screen shot for future use as + // NotesViewManager::switchToView takes care of it // Switch to collections view. mAppControllerIf->switchToView(NotesNamespace::NotesCollectionViewId); @@ -453,10 +466,10 @@ */ void NotesMainView::handleViewingCompleted() { - - mAgendaEventViewer->deleteLater(); - + // set captured screenshot as invalid as the control is returned back + // to the main view + captureScreenShot(false); } /*! @@ -473,7 +486,6 @@ void NotesMainView::editTodo() { - // Get the selected list item index QModelIndex index = mSelectedItem->modelIndex(); if (!index.isValid()) { @@ -494,6 +506,9 @@ // Launch the to-do editor with the obtained info. mNotesEditor->edit(todoId); + // capture screenshot for future use, if application + // is exited/Quit from notesEditor + captureScreenShot(true); } @@ -527,7 +542,15 @@ (AgendaUtil::IncludeNotes | AgendaUtil::IncludeCompletedTodos | AgendaUtil::IncludeIncompletedTodos)); - int c= entries.count(); + + if (0 >= entries.count()) { + mEmptyListLabel->show(); + mListView->hide(); + } else { + mEmptyListLabel->hide(); + mListView->show(); + } + mSubTitle->setHeading( hbTrId("txt_notes_subhead_ln_notes",entries.count())); } @@ -618,5 +641,77 @@ mAgendaEventViewer->view( entry, AgendaEventViewer::ActionEditDelete); } + // capture screenshot for future use, if application + // is exited/Quit from notesEditor/eventViewer + captureScreenShot(true); } + +/*! + Slot to handle the selected context menu actions + */ +void NotesMainView::selectedMenuAction(HbAction *action) +{ + if (action == mOpenAction) { + openNote(); + } else if (action == mEditTodoAction) { + editTodo(); + } else if (action == mDeleteAction) { + deleteNote(); + } else if (action == mMakeFavouriteAction) { + markNoteAsFavourite(); + } else if (action == mMarkTodoAction) { + markNoteAsTodo(); + } else if (action == mTodoStatusAction) { + markTodoStatus(); + } +} + +/*! + Slot to handle the context menu closed. + */ +void NotesMainView::handleMenuClosed() +{ + mIsLongTop = false; +} + +/*! + CaptureScreenShot captures screen shot + \param captureScreenShot bool to indicate if screenshot needs to be captured +*/ +void NotesMainView::captureScreenShot(bool captureScreenShot) + { + if (captureScreenShot) // check if screen shot needs to be captured + { + mScreenShot.clear(); + mScreenShot.insert("screenshot", QPixmap::grabWidget(mainWindow(), mainWindow()->rect())); + } + mIsScreenShotCapruted = captureScreenShot; // set mIsScreenShotCapruted set validity of screenshot + } + +/*! + saveActivity saves main view as an activity +*/ +void NotesMainView::saveActivity() + { + // Get a pointer to activity Manager + HbActivityManager* activityManager = qobject_cast(qApp)->activityManager(); + + if (!mIsScreenShotCapruted) // check if a valid screenshot is already captured + { + mScreenShot.clear(); + mScreenShot.insert("screenshot", QPixmap::grabWidget(mainWindow(), mainWindow()->rect())); + } + + // save any data necessary to save the state + QByteArray serializedActivity; + QDataStream stream(&serializedActivity, QIODevice::WriteOnly | QIODevice::Append); + stream << NotesNamespace::NotesMainViewId; + + // add the activity to the activity manager + bool ok = activityManager->addActivity(notes, serializedActivity, mScreenShot); + if ( !ok ) + { + qFatal("Add failed" ); + } + } // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesviews/src/notesnoteview.cpp --- a/notes/notesui/notesviews/src/notesnoteview.cpp Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesviews/src/notesnoteview.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -26,6 +26,8 @@ #include #include #include +#include +#include // User includes #include "notesnoteview.h" @@ -53,7 +55,8 @@ NotesNoteView::NotesNoteView(QGraphicsWidget *parent) :HbView(parent), mSelectedItem(0), - mDeleteAction(0) + mDeleteAction(0), + mIsLongTop(false) { // Nothing yet. } @@ -97,8 +100,9 @@ subModel->setSourceModel(mProxyModel); // Get the list object from the document and update the model. - mListView = static_cast - (mDocLoader->findWidget("noteListView")); + mListView = static_cast ( + mDocLoader->findWidget("noteListView")); + // Update the list view model. mListView->setModel(subModel); // Setup the operations that can be done with a list view. @@ -111,6 +115,10 @@ this, SLOT(handleItemLongPressed(HbAbstractViewItem *, const QPointF &))); + // Get the empty list label. + mEmptyListLabel = static_cast ( + mDocLoader->findWidget("emptyListLabel")); + // Get the toolbar/menu actions. mAddNoteAction = static_cast ( mDocLoader->findObject("newNoteAction")); @@ -126,8 +134,7 @@ mViewCollectionAction = static_cast ( mDocLoader->findObject("displayCollectionsAction")); - mViewCollectionAction->setCheckable(true); - mViewCollectionAction->setChecked(true); + connect( mViewCollectionAction, SIGNAL(changed()), this, SLOT(handleActionStateChanged())); @@ -142,11 +149,31 @@ window, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(handleOrientationChanged(Qt::Orientation))); + + connect( + mAgendaUtil, SIGNAL(entryAdded(ulong)), + this,SLOT(updateView(ulong))); + connect( + mAgendaUtil, SIGNAL(entryDeleted(ulong)), + this,SLOT(updateView(ulong))); + connect( + mAgendaUtil, SIGNAL(entryUpdated(ulong)), + this, SLOT(updateView(ulong))); + + // Set the graphics size for the icons. HbListViewItem *prototype = mListView->listItemPrototype(); prototype->setGraphicsSize(HbListViewItem::SmallIcon); } +/* + Updates the note view either to show notes or emptyListLabel. + */ +void NotesNoteView::updateNoteView() +{ + updateView(); +} + /*! Opens the note editor to create a new note. */ @@ -170,34 +197,36 @@ */ void NotesNoteView::handleItemReleased(const QModelIndex &index) { - // Sanity check. - if (!index.isValid()) { - return; - } + if(!mIsLongTop) { + // Sanity check. + if (!index.isValid()) { + return; + } - // First get the id of the note and get the corresponding information from - // agendautil. - ulong noteId = index.data(NotesNamespace::IdRole).value(); + // First get the id of the note and get the corresponding information from + // agendautil. + ulong noteId = index.data(NotesNamespace::IdRole).value(); - if (0 >= noteId) { - // Something wrong. - return; - } + if (0 >= noteId) { + // Something wrong. + return; + } - // Get the entry details. - AgendaEntry entry = mAgendaUtil->fetchById(noteId); + // Get the entry details. + AgendaEntry entry = mAgendaUtil->fetchById(noteId); - if (entry.isNull()) { - // Entry invalid. - return; + if (entry.isNull()) { + // Entry invalid. + return; + } + + // Now launch the editor with the obtained info. + mNotesEditor = new NotesEditor(mAgendaUtil, this); + connect( + mNotesEditor, SIGNAL(editingCompleted(bool)), + this, SLOT(handleEditingCompleted(bool))); + mNotesEditor->edit(entry); } - - // Now launch the editor with the obtained info. - mNotesEditor = new NotesEditor(mAgendaUtil, this); - connect( - mNotesEditor, SIGNAL(editingCompleted(bool)), - this, SLOT(handleEditingCompleted(bool))); - mNotesEditor->edit(entry); } /*! @@ -212,6 +241,7 @@ HbAbstractViewItem *item, const QPointF &coords) { mSelectedItem = item; + mIsLongTop = true; ulong noteId = item->modelIndex().data( NotesNamespace::IdRole).value(); @@ -219,48 +249,32 @@ // Display a context specific menu. HbMenu *contextMenu = new HbMenu(); + connect( + contextMenu,SIGNAL(aboutToClose()), + this, SLOT(handleMenuClosed())); // Add actions to the context menu. mOpenAction = contextMenu->addAction(hbTrId("txt_common_menu_open")); - connect( - mOpenAction, SIGNAL(triggered()), - this, SLOT(openNote())); mDeleteAction = contextMenu->addAction(hbTrId("txt_common_menu_delete")); - connect( - mDeleteAction, SIGNAL(triggered()), - this, SLOT(deleteNote())); if (AgendaEntry::TypeNote == entry.type()) { if (entry.favourite()) { - mMakeFavouriteAction = - contextMenu->addAction( + mMakeFavouriteAction = contextMenu->addAction( hbTrId("txt_notes_menu_remove_from_favorites")); - - connect( - mMakeFavouriteAction, SIGNAL(triggered()), - this, SLOT(markNoteAsFavourite())); - } else { - mMakeFavouriteAction = - contextMenu->addAction( + mMakeFavouriteAction = contextMenu->addAction( hbTrId("txt_notes_menu_mark_as_favorite")); - - connect( - mMakeFavouriteAction, SIGNAL(triggered()), - this, SLOT(markNoteAsFavourite())); } mMarkTodoAction = contextMenu->addAction( hbTrId("txt_notes_menu_make_it_as_todo_note")); - connect( - mMarkTodoAction, SIGNAL(triggered()), - this, SLOT(markNoteAsTodo())); } // Show the menu. - contextMenu->exec(coords); + contextMenu->open(this, SLOT(selectedMenuAction(HbAction*))); + contextMenu->setPreferredPos(coords); } /*! @@ -357,6 +371,13 @@ // Delete the old entry. mAgendaUtil->deleteEntry(entry.id()); + // Show the soft notification. + HbNotificationDialog *notificationDialog = new HbNotificationDialog(); + notificationDialog->setTimeout( + HbNotificationDialog::ConfirmationNoteTimeout); + notificationDialog->setTitle( + hbTrId("txt_notes_dpopinfo_note_moved_to_todos")); + notificationDialog->show(); } /*! @@ -437,5 +458,47 @@ // Launch the notes editor with the obtained info. mNotesEditor->edit(entry); } + +/*! + Slot to handle context menu actions. + */ +void NotesNoteView::selectedMenuAction(HbAction *action) +{ + if (action == mOpenAction) { + openNote(); + } else if (action == mDeleteAction) { + deleteNote(); + } else if (action == mMakeFavouriteAction) { + markNoteAsFavourite(); + } else if (action == mMarkTodoAction) { + markNoteAsTodo(); + } +} + +/*! + Slot to handle the context menu closed. + */ +void NotesNoteView::handleMenuClosed() +{ + mIsLongTop = false; +} + +/*! + Handles the visibility of empty list label. + */ +void NotesNoteView::updateView(ulong id) +{ + Q_UNUSED(id) + + // Get the numbers of notes. + if (0 >= mListView->model()->rowCount()) { + mEmptyListLabel->show(); + mListView->hide(); + } else { + mEmptyListLabel->hide(); + mListView->show(); + } +} + // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/notesui/notesviews/src/notestodoview.cpp --- a/notes/notesui/notesviews/src/notestodoview.cpp Mon May 03 12:30:32 2010 +0300 +++ b/notes/notesui/notesviews/src/notestodoview.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -57,7 +57,8 @@ NotesTodoView::NotesTodoView(QGraphicsWidget *parent) :HbView(parent), mSelectedItem(0), - mDeleteAction(0) + mDeleteAction(0), + mIsLongTop(false) { // Nothing yet. } @@ -114,7 +115,11 @@ SIGNAL(longPressed(HbAbstractViewItem *, const QPointF &)), this, SLOT(handleItemLongPressed(HbAbstractViewItem *, const QPointF &))); - + + // Get the empty list string. + mEmptyListLabel = static_cast ( + mDocLoader->findWidget("emptyListLabel")); + // Get the toolbar/menu actions. mAddTodoAction = static_cast ( mDocLoader->findObject("newTodoAction")); @@ -130,8 +135,7 @@ mViewCollectionAction = static_cast ( mDocLoader->findObject("displayCollectionsAction")); - mViewCollectionAction->setCheckable(true); - mViewCollectionAction->setChecked(true); + connect( mViewCollectionAction, SIGNAL(changed()), this, SLOT(handleActionStateChanged())); @@ -149,9 +153,6 @@ mSubTitle = static_cast( mDocLoader->findWidget("subtitleGroupBox")); - // Update sub heading text for to-do collections view. - updateSubTitle(); - connect( mAgendaUtil, SIGNAL(entryAdded(ulong)), this,SLOT(updateSubTitle(ulong))); @@ -167,6 +168,14 @@ prototype->setGraphicsSize(HbListViewItem::SmallIcon); } +/* + Updates the title text for the first launch + */ +void NotesTodoView::updateTitle() +{ + updateSubTitle(); +} + /*! Opens the to-do editor to create a new to-do. */ @@ -190,28 +199,30 @@ */ void NotesTodoView::handleItemReleased(const QModelIndex &index) { - // Sanity check. - if (!index.isValid()) { - return; - } + if(!mIsLongTop) { + // Sanity check. + if (!index.isValid()) { + return; + } - // First get the id of the to-do and get the corresponding information from - // agendautil. - ulong toDoId = index.data(NotesNamespace::IdRole).value(); + // First get the id of the to-do and get the corresponding information from + // agendautil. + ulong toDoId = index.data(NotesNamespace::IdRole).value(); - if (0 >= toDoId) { - // Something wrong. - return; - } + if (0 >= toDoId) { + // Something wrong. + return; + } - // Construct agenda event viewer. - mAgendaEventViewer = new AgendaEventViewer(mAgendaUtil, this); + // Construct agenda event viewer. + mAgendaEventViewer = new AgendaEventViewer(mAgendaUtil, this); - connect( - mAgendaEventViewer, SIGNAL(viewingCompleted(const QDate)), - this, SLOT(handleViewingCompleted())); - // Launch agenda event viewer - mAgendaEventViewer->view(toDoId, AgendaEventViewer::ActionEditDelete); + connect( + mAgendaEventViewer, SIGNAL(viewingCompleted(const QDate)), + this, SLOT(handleViewingCompleted())); + // Launch agenda event viewer + mAgendaEventViewer->view(toDoId, AgendaEventViewer::ActionEditDelete); + } } /*! @@ -226,6 +237,7 @@ HbAbstractViewItem *item, const QPointF &coords) { mSelectedItem = item; + mIsLongTop = true; // Get the entry of the selected item. ulong noteId = item->modelIndex().data( @@ -234,46 +246,34 @@ // Display a context specific menu. HbMenu *contextMenu = new HbMenu(); + connect( + contextMenu,SIGNAL(aboutToClose()), + this, SLOT(handleMenuClosed())); // Add actions to the context menu. mOpenAction = contextMenu->addAction(hbTrId("txt_common_menu_open")); - connect( - mOpenAction, SIGNAL(triggered()), - this, SLOT(openTodo())); mEditAction = contextMenu->addAction( hbTrId("txt_common_menu_edit")); - connect( - mEditAction, SIGNAL(triggered()), - this, SLOT(editTodo())); mDeleteAction = contextMenu->addAction( hbTrId("txt_common_menu_delete")); - connect( - mDeleteAction, SIGNAL(triggered()), - this, SLOT(deleteTodo())); if (AgendaEntry::TypeTodo == entry.type()) { if (AgendaEntry::TodoNeedsAction == entry.status()) { mTodoStatusAction = contextMenu->addAction( hbTrId("txt_notes_menu_mark_as_done")); - connect( - mTodoStatusAction , SIGNAL(triggered()), - this, SLOT(markTodoStatus())); - } else if (AgendaEntry::TodoCompleted == entry.status()) { mTodoStatusAction = contextMenu->addAction( hbTrId("txt_notes_menu_mark_as_not_done")); - connect( - mTodoStatusAction , SIGNAL(triggered()), - this, SLOT(markTodoStatus())); } } // Show the menu. - contextMenu->exec(coords); + contextMenu->open(this, SLOT(selectedMenuAction(HbAction*))); + contextMenu->setPreferredPos(coords); } /*! @@ -442,6 +442,14 @@ AgendaUtil::IncludeIncompletedTodos); mSubTitle->setHeading( hbTrId("txt_notes_subhead_todos_ln_pending",entries.count())); + + if (0 >= entries.count()) { + mEmptyListLabel->show(); + mListView->hide(); + } else { + mEmptyListLabel->hide(); + mListView->show(); + } } /* @@ -465,4 +473,28 @@ entry, AgendaEventViewer::ActionEditDelete); } +/* + Slot to handle the context menu actions. + */ +void NotesTodoView::selectedMenuAction(HbAction *action) +{ + if (action == mOpenAction) { + openTodo(); + } else if (action == mEditAction) { + editTodo(); + } else if (action == mDeleteAction) { + deleteTodo(); + } else if (action == mTodoStatusAction) { + markTodoStatus(); + } +} + + +/*! + Slot to handle the context menu closed. + */ +void NotesTodoView::handleMenuClosed() +{ + mIsLongTop = false; +} // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/rom/notes.iby --- a/notes/rom/notes.iby Mon May 03 12:30:32 2010 +0300 +++ b/notes/rom/notes.iby Mon Jun 28 15:22:02 2010 +0530 @@ -12,7 +12,7 @@ * Contributors: * * Description: - * The iby file for agendainterface component + * The iby file for Notes component * */ @@ -22,6 +22,10 @@ S60_APP_EXE(notes) data=DATAZ_\private\10003a3f\import\apps\notes_reg.rsc \private\10003a3f\import\apps\notes_reg.rsc +data=\epoc32\data\z\resource\qt\plugins\notes\noteseditorplugin.qtplugin resource\qt\plugins\notes\noteseditorplugin.qtplugin + +// Stub sis +data=DATAZ_\system\install\notes_stub.sis \System\Install\notes_stub.sis file=ABI_DIR\BUILD_DIR\notesmodel.dll SHARED_LIB_DIR\notesmodel.dll file=ABI_DIR\BUILD_DIR\noteseditor.dll SHARED_LIB_DIR\noteseditor.dll @@ -29,6 +33,7 @@ file=ABI_DIR\BUILD_DIR\notesviewmanager.dll SHARED_LIB_DIR\notesviewmanager.dll file=ABI_DIR\BUILD_DIR\notesappcontroller.dll SHARED_LIB_DIR\notesappcontroller.dll file=ABI_DIR\BUILD_DIR\notesmodelhandler.dll SHARED_LIB_DIR\notesmodelhandler.dll +file=ABI_DIR\BUILD_DIR\noteseditorplugin.dll SHARED_LIB_DIR\noteseditorplugin.dll #endif // NOTES_IBY diff -r fd30d51f876b -r b6db4fd4947b notes/sis/createandsign.bat --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/sis/createandsign.bat Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,22 @@ +rem +rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +rem All rights reserved. +rem This component and the accompanying materials are made available +rem under the terms of "Eclipse Public License v1.0" +rem which accompanies this distribution, and is available +rem at the URL "http://www.eclipse.org/legal/epl-v10.html". +rem +rem Initial Contributors: +rem Nokia Corporation - initial contribution. +rem +rem Contributors: +rem +rem Description: Bat file to create Notes Application's sisx. +rem + +@echo -------- Create sis packages --------- +makesis notes.pkg + +@echo -------- Sign and rename sis packages ----------- +signsis notes.sis notes.sisx Nokia_RnDCert_02.der Nokia_RnDCert_02.key + diff -r fd30d51f876b -r b6db4fd4947b notes/sis/nokia_rndcert_02.der Binary file notes/sis/nokia_rndcert_02.der has changed diff -r fd30d51f876b -r b6db4fd4947b notes/sis/nokia_rndcert_02.key --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/sis/nokia_rndcert_02.key Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICXQIBAAKBgQC/TDP7KKIaf5+uW4OD2iVZuUMC2a+SeQTjf6srlKcOm+CpPNXn +uLNm/8fdEnyOIuRXPRKmqhs1n0JkxEGHynELWMTuKXbQx9SRAGUXzyneGn+IJNnO +vOKHWgKCouX2hfI8rtkdqJpqmO460gGsMgw+lsbeyWyW9lnfLxq+ZC7sqQIDAQAB +AoGBALmUWZE8GBaQ3P4u9WUCSd3DJkkrmXIFSULSZeH/chlwCwDjbbhArHothVzo +REE3hEFFlERvHbplZ+mNouzy7boduvgUzbksGrbGMLJ2qO1GzWWVwV+GzOWKd3ss +/98Gwoy5R8pjnkqUE2wP1iJFw0FjvUTKcYv/z6t3LLJ0CsoBAkEA+c7ixvsviQ3J +s0INytCKU2bf8fqFQJi1VI82ukxNsujGTQ9upVSjuvqPvWyDvvTdrUBHqO+3qPut +sEh01Q8aiQJBAMQKDJPVRu4ud3mwUfEavzL5EjqwG1k9VCNGYsT4FwtrHcxu1oP/ +pk6M3rIZukqomoEEnHWPMwhrK3fhBqi0OSECQQDr40VXege4FnH5OI2Hj4afHMyp +VdQQXGMWFyopnzXblFz0lXb43cTCIiorR9XcMqNFHybLypkWE5o+lRzlt55pAkBQ +P/zeF5Sts//cpL0mgdh7OVKpC6ZmZaCnwAx2rUhhuDu+kDDoYCLoTOps5fNI1LRK +1GRoC3LMo3Jr5IYhUYWBAkBpCpN6k4JU/mszq98EojHerQNxk8sPqvQKUzTutohT +1gLX9yepGayB/TtT2EEJDkWOlnTy/dvN6W3vzbJYz97x +-----END RSA PRIVATE KEY----- diff -r fd30d51f876b -r b6db4fd4947b notes/sis/notes.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/sis/notes.pkg Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,49 @@ +; +; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +; All rights reserved. +; This component and the accompanying materials are made available +; under the terms of "Eclipse Public License v1.0" +; which accompanies this distribution, and is available +; at the URL "http://www.eclipse.org/legal/epl-v10.html". +; +; Initial Contributors: +; Nokia Corporation - initial contribution. +; +; Contributors: +; +; Description: pkg file of Notes Application for IAD. +; + +; Language +&EN + +; standard SIS file header +#{"Notes"}, (0x20029F80), 1, 0, 0, TYPE=SA, RU + +; Localised vendor name +%{"Nokia"} + +; Unique vendor name +:"Nokia" + + +; Notes executable and default resource files + +"/epoc32/release/armv5/urel/notes.exe" - "!:/sys/bin/notes.exe" +"/epoc32/data/Z/private/10003a3f/import/apps/notes_reg.rsc" - "!:/private/10003a3f/import/apps/notes_reg.rsc" +"/epoc32/data/z/resource/apps/notes.rsc" - "!:/resource/apps/notes.rsc" +"/epoc32/data/z/resource/qt/translations/notes_en.qm" - "!:/resource/qt/translations/notes_en.qm" + + +"/epoc32/release/armv5/urel/notesmodel.dll" - "!:/sys/bin/notesmodel.dll" +"/epoc32/release/armv5/urel/noteseditor.dll" - "!:/sys/bin/noteseditor.dll" +"/epoc32/release/armv5/urel/notesviews.dll" - "!:/sys/bin/notesviews.dll" +"/epoc32/release/armv5/urel/notesviewmanager.dll" - "!:/sys/bin/notesviewmanager.dll" +"/epoc32/release/armv5/urel/notesappcontroller.dll" - "!:/sys/bin/notesappcontroller.dll" +"/epoc32/release/armv5/urel/notesmodelhandler.dll" - "!:/sys/bin/notesmodelhandler.dll" + +;Qt plugin files to be installed +"/epoc32/release/armv5/urel/noteseditorplugin.dll" - "!:/sys/bin/noteseditorplugin.dll" +"/epoc32/data/z/resource/qt/plugins/notes/noteseditorplugin.qtplugin" - "!:/resource/qt/plugins/notes/noteseditorplugin.qtplugin" + +;END OF FILE diff -r fd30d51f876b -r b6db4fd4947b notes/siscreate.bat --- a/notes/siscreate.bat Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -@rem -@rem Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). -@rem All rights reserved. -@rem This component and the accompanying materials are made available -@rem under the terms of "Eclipse Public License v1.0" -@rem which accompanies this distribution, and is available -@rem at the URL "http://www.eclipse.org/legal/epl-v10.html". -@rem -@rem Initial Contributors: -@rem Nokia Corporation - initial contribution. -@rem -@rem Contributors: -@rem -@rem Description: -@rem - -cd notesui\notesapplication -call makesis notesapplication_armv5_urel.pkg -call signsis notesapplication_armv5_urel.sis notes.sisx rndcert.der rndcert.key -cd ..\.. diff -r fd30d51f876b -r b6db4fd4947b notes/stubsis/notes_stub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/stubsis/notes_stub.pkg Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,27 @@ +; +; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +; All rights reserved. +; This component and the accompanying materials are made available +; under the terms of "Eclipse Public License v1.0" +; which accompanies this distribution, and is available +; at the URL "http://www.eclipse.org/legal/epl-v10.html". +; +; Initial Contributors: +; Nokia Corporation - initial contribution. +; +; Contributors: +; +; Description: pkg file of Notes Application for IAD. +; + +; Language +&EN + +; Header +#{"Notes"}, (0x20029F80), 1, 0, 0, TYPE=SA + +; Localised vendor name +%{"Nokia"} + +; Unique vendor name +:"Nokia" \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b notes/stubsis/notes_stub.sis Binary file notes/stubsis/notes_stub.sis has changed diff -r fd30d51f876b -r b6db4fd4947b notes/tsrc/rom/unit_notes.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/tsrc/rom/unit_notes.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,28 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Symbian Foundation License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* The iby file for notes application unit tests. +* +*/ + +#ifndef UNIT_NOTES_IBY +#define UNIT_NOTES_IBY + +S60_APP_EXE(utnotesmodel) +S60_APP_RESOURCE(utnotesmodel) +data=DATAZ_\private\10003a3f\import\apps\utnotesmodel_reg.rsc \private\10003a3f\import\apps\utnotesmodel_reg.rsc + +#endif // UNIT_NOTES_IBY + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/tsrc/rom/unit_noteseditor.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/tsrc/rom/unit_noteseditor.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,29 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* The iby file for noteseditor unit tests. +* +*/ + +#ifndef UNIT_NOTESEDITOR_IBY +#define UNIT_NOTESEDITOR_IBY + +S60_APP_EXE(utnoteseditor) +S60_APP_RESOURCE(utnoteseditor) + +data=DATAZ_\private\10003a3f\import\apps\utnoteseditor_reg.rsc \private\10003a3f\import\apps\utnoteseditor_reg.rsc + +#endif // UNIT_NOTESEDITOR_IBY + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/tsrc/tsrc.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/tsrc/tsrc.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,32 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Symbian Foundation License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# This is the project specification file notes test code +# + +TEMPLATE = subdirs +SUBDIRS += \ + unittest_notesmodel \ + unittest_noteseditor +CONFIG += qtestlib +CONFIG += symbian_test +CONFIG += ordered + +symbian: { + BLD_INF_RULES.prj_testexports += \ + "./rom/unit_notes.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unit_notes.iby)" \ + "./rom/unit_noteseditor.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unit_noteseditor.iby)" +} + +# End of file --Don't remove this diff -r fd30d51f876b -r b6db4fd4947b notes/tsrc/unittest_noteseditor/inc/unittest_noteseditor.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/tsrc/unittest_noteseditor/inc/unittest_noteseditor.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,64 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +#ifndef UNITTEST_NOTESEDITOR_H +#define UNITTEST_NOTESEDITOR_H + +// System includes +#include + +// Forward declarations. +class NotesEditor; + +class TestNotesEditor : public QObject +{ + Q_OBJECT + +public: + TestNotesEditor(); + virtual ~TestNotesEditor(); + +private slots: + // Test case setup. + void init(); + void cleanup(); + + // Test cases go here. + void testConstructionWithoutAgendaUtil(); + void testConstructionWithAgendaUtil(); + void testDestruction(); + void testEditingNoteWithText(); + void testEditingNoteWithFileHandle(); + void testEditingNoteWithAgendaEntry(); + void testEditingNoteWithId(); + void testEditingTodoWithFileHandle(); + void testEditingTodoWithAgendaEntry(); + void testEditingTodoWithId(); + void testCreationOfNote(); + void testCreationofTodo(); + void testClosingOfNotesEditorWithSave(); + void testClosingOfNotesEditorWithoutSave(); + void testClosingOfTodoEditorWithSave(); + void testClosingOfTodoEditorWithoutSave(); + +private: + NotesEditor *mEditor; +}; + +#endif // UNITTEST_NOTESEDITOR_H + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/tsrc/unittest_noteseditor/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/tsrc/unittest_noteseditor/src/main.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,38 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +// System includes +#include +#include + +// User includes +#include "unittest_noteseditor.h" + +int main(int argc, char *argv[]) +{ + HbApplication app(argc, argv); + TestNotesEditor tc; + int ret = QTest::qExec(&tc, argc, argv); + // Core dump if HbIconLoader instance is not destroyed before the + // application instance. HbIconLoader uses QCoreApplication::aboutToQuit() + // signal to destroy itself. app.exec() where the signal is normally emitted + // is not called here. So, invoking the signal explicitly. + QMetaObject::invokeMethod(&app, "aboutToQuit", Qt::DirectConnection); + return ret; +} + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/tsrc/unittest_noteseditor/src/unittest_noteseditor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/tsrc/unittest_noteseditor/src/unittest_noteseditor.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,511 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +// System include +#include +#include +#include +#include +#include + +// User includes +#include "unittest_noteseditor.h" + + +/*! + \class TestNotesEditor + + Unit test clas for Notes Editor apis + */ + + +/*! + Constructor + */ + +TestNotesEditor::TestNotesEditor() +{ + +} + +/*! + Destructor + */ +TestNotesEditor::~TestNotesEditor() +{ +} + +/*! + Initialise before calling the test case + */ +void TestNotesEditor::init() +{ +} + +/*! + Do cleanup after each test case + */ +void TestNotesEditor::cleanup() +{ +} + +/*! + Test the api NotesEditor::NotesEditor() + */ + +void TestNotesEditor::testConstructionWithoutAgendaUtil() +{ + // Create NotesEditor object + NotesEditor *notesEditor = new NotesEditor(this); + QVERIFY(notesEditor!=0); + + // Cleanup + delete notesEditor; +} + +/*! + Test the api NotesEditor::NotesEditor() + */ +void TestNotesEditor::testConstructionWithAgendaUtil() +{ + // Create AgendaUtil object. + AgendaUtil *agendaUtil = new AgendaUtil(); + QVERIFY(agendaUtil); + + // Create NotesEditor object. + NotesEditor *notesEditor = new NotesEditor(agendaUtil); + + QVERIFY(notesEditor!=0); + + // Cleanup. + delete notesEditor; + delete agendaUtil; +} + +/*! + Test the api NotesEditor::~NotesEditor + */ +void TestNotesEditor::testDestruction() +{ + // Create NotesEditor object. + QPointer notesEditor = new NotesEditor(); + delete notesEditor; + + QVERIFY(!notesEditor); + + // Create AgendaUtil object. + QPointer agendaUtil = new AgendaUtil(); + QPointer notesEditorWithAgendaUtil = + new NotesEditor(agendaUtil); + + delete notesEditorWithAgendaUtil; + delete agendaUtil; + + QVERIFY(!notesEditorWithAgendaUtil); +} + +/*! + Test the api NotesEditor::edit(const QString &string) + */ +void TestNotesEditor::testEditingNoteWithText() +{ + HbMainWindow window; + window.show(); + // Create NotesEditor object. + NotesEditor *notesEditor = new NotesEditor(this); + QVERIFY(notesEditor); + + QString noteText("This is test note"); + // Call edit using the text. + notesEditor->edit(QString("This is test note")); + + QTest::qWait(1000); + + // Call close on editor by saving the note + ulong id = notesEditor->close(NotesEditor::CloseWithSave); + QVERIFY(id); + + // Create agenda Utility. + AgendaUtil *agendaUtil = new AgendaUtil(); + QVERIFY(agendaUtil); + + // Fetch the entry using the id + AgendaEntry entry = agendaUtil->fetchById(id); + + int compareResult = noteText.compare(entry.description()); + QVERIFY(!compareResult); + + delete agendaUtil; + delete notesEditor; +} + +/*! + Test the api NotesEditor::edit(const QFile &handle) + */ +void TestNotesEditor::testEditingNoteWithFileHandle() +{ + // Nothing yet +} + +/*! + Test the api NotesEditor::edit(AgendaEntry entry) + */ +void TestNotesEditor::testEditingNoteWithAgendaEntry() +{ + HbMainWindow window; + window.show(); + + NotesEditor *notesEditor = new NotesEditor(); + QVERIFY(notesEditor); + + AgendaEntry entry; + entry.setType(AgendaEntry::TypeNote); + entry.setDescription(QString("A simple note")); + + // Call edit on agenda entry + notesEditor->edit(entry); + + QTest::qWait(1000); + + ulong id = notesEditor->close(NotesEditor::CloseWithSave); + + AgendaUtil *agendaUtil = new AgendaUtil(); + QVERIFY(agendaUtil); + + AgendaEntry afterSave = agendaUtil->fetchById(id); + QCOMPARE(afterSave.description(), entry.description()); + + delete agendaUtil; + delete notesEditor; +} + +/*! + Test the api NotesEditor::edit(ulong id) + */ +void TestNotesEditor::testEditingNoteWithId() +{ + HbMainWindow window; + window.show(); + + NotesEditor *notesEditor = new NotesEditor(); + QVERIFY(notesEditor); + + AgendaUtil *agendaUtil = new AgendaUtil(); + QVERIFY(agendaUtil); + + AgendaEntry entry; + entry.setType(AgendaEntry::TypeNote); + entry.setDescription("A simple note"); + + ulong id = agendaUtil->addEntry(entry); + + notesEditor->edit(id); + + QTest::qWait(1000); + + ulong savedId = notesEditor->close(NotesEditor::CloseWithSave); + + AgendaEntry afterSave = agendaUtil->fetchById(id); + QCOMPARE(afterSave.description(), entry.description()); + + delete agendaUtil; + delete notesEditor; + +} + + +/*! + Test the api NotesEditor::edit(const QFile &handle) + */ +void TestNotesEditor::testEditingTodoWithFileHandle() +{ + // Nothing yet. +} + +/*! + Test the api NotesEditor::edit(AgendaEntry entry) + */ +void TestNotesEditor::testEditingTodoWithAgendaEntry() +{ + HbMainWindow window; + window.show(); + + NotesEditor *notesEditor = new NotesEditor(); + QVERIFY(notesEditor); + + AgendaUtil *agendaUtil = new AgendaUtil(); + QVERIFY(agendaUtil); + + // Create a agenda entry with type to-do + AgendaEntry entry; + entry.setType(AgendaEntry::TypeTodo); + entry.setSummary(QString("Buy Books")); + entry.setDescription(QString("@Landmarks")); + entry.setStartAndEndTime( + QDateTime::currentDateTime(),QDateTime::currentDateTime()); + entry.setStatus(AgendaEntry::TodoNeedsAction); + entry.setPriority(2); + + ulong id = agendaUtil->addEntry(entry); + + // Call edit on agenda entry + notesEditor->edit(entry); + + QTest::qWait(3000); + + ulong afterSaveId = notesEditor->close(NotesEditor::CloseWithSave); + + AgendaEntry afterSave = agendaUtil->fetchById(id); + QCOMPARE(afterSave.id(),id); + QCOMPARE(afterSave.type(),entry.type()); + QCOMPARE(afterSave.summary(), entry.summary()); + QCOMPARE(afterSave.description(), entry.description()); + + delete agendaUtil; + delete notesEditor; +} + +/*! + Test the api NotesEditor::edit(ulong id) + */ +void TestNotesEditor::testEditingTodoWithId() +{ + HbMainWindow window; + window.show(); + + NotesEditor *notesEditor = new NotesEditor(); + QVERIFY(notesEditor); + + AgendaUtil *agendaUtil = new AgendaUtil(); + QVERIFY(agendaUtil); + + // Create a agenda entry with type to-do + AgendaEntry entry; + entry.setType(AgendaEntry::TypeTodo); + entry.setSummary(QString("Buy Books")); + entry.setDescription(QString("@Landmarks")); + entry.setStartAndEndTime( + QDateTime::currentDateTime(),QDateTime::currentDateTime()); + entry.setStatus(AgendaEntry::TodoNeedsAction); + entry.setPriority(2); + + ulong id = agendaUtil->addEntry(entry); + + // Call edit using the id + notesEditor->edit(id); + + QTest::qWait(3000); + + ulong afterSaveId = notesEditor->close(NotesEditor::CloseWithSave); + + AgendaEntry afterSave = agendaUtil->fetchById(id); + QCOMPARE(afterSave.id(),id); + QCOMPARE(afterSave.type(),entry.type()); + QCOMPARE(afterSave.summary(), entry.summary()); + QCOMPARE(afterSave.description(), entry.description()); + + delete agendaUtil; + delete notesEditor; + +} + +/*! + Test the api NotesEditor::create(CreateType type) + */ +void TestNotesEditor::testCreationOfNote() +{ + HbMainWindow window; + window.show(); + + NotesEditor *notesEditor = new NotesEditor(); + QVERIFY(notesEditor); + + notesEditor->create(NotesEditor::CreateNote); + + QTest::qWait(3000); + + ulong afterSaveId = notesEditor->close(NotesEditor::CloseWithSave); + + // Note is not saved since description is empty + // TODO use key press events here + + QVERIFY(!afterSaveId); + + delete notesEditor; +} + +/*! + Test the api NotesEditor::create(CreateType type) + */ +void TestNotesEditor::testCreationofTodo() +{ + HbMainWindow window; + window.show(); + + NotesEditor *notesEditor = new NotesEditor(); + QVERIFY(notesEditor); + + notesEditor->create(NotesEditor::CreateTodo); + + // TODO + // Needs key interaction to edit the fields in to-do editor. + + QTest::qWait(3000); + + delete notesEditor; +} + +/*! + Test the api NotesEditor::close(CloseType type); + */ + +void TestNotesEditor::testClosingOfNotesEditorWithSave() +{ + HbMainWindow window; + window.show(); + // Create NotesEditor object. + NotesEditor *notesEditor = new NotesEditor(this); + QVERIFY(notesEditor); + + QString noteText("This is test note"); + // Call edit using the text. + notesEditor->edit(QString("This is test note")); + + QTest::qWait(1000); + + // Call close on editor by saving the note + ulong id = notesEditor->close(NotesEditor::CloseWithSave); + QVERIFY(id); + + // Create agenda Utility. + AgendaUtil *agendaUtil = new AgendaUtil(); + QVERIFY(agendaUtil); + + // Fetch the entry using the id + AgendaEntry entry = agendaUtil->fetchById(id); + + QCOMPARE(noteText,entry.description()); + + delete agendaUtil; + delete notesEditor; +} + +/*! + Test the api NotesEditor::close(CloseType type); + */ +void TestNotesEditor::testClosingOfNotesEditorWithoutSave() +{ + HbMainWindow window; + window.show(); + // Create NotesEditor object. + NotesEditor *notesEditor = new NotesEditor(this); + QVERIFY(notesEditor); + + QString noteText("This is test note"); + // Call edit using the text. + notesEditor->edit(QString("This is test note")); + + QTest::qWait(1000); + + // Call close on editor by saving the note + ulong id = notesEditor->close(NotesEditor::CloseWithoutSave); + QVERIFY(!id); + + delete notesEditor; +} + +/*! + Test the api NotesEditor::close(CloseType type); + */ +void TestNotesEditor::testClosingOfTodoEditorWithSave() +{ + HbMainWindow window; + window.show(); + + NotesEditor *notesEditor = new NotesEditor(); + QVERIFY(notesEditor); + + AgendaUtil *agendaUtil = new AgendaUtil(); + QVERIFY(agendaUtil); + + // Create a agenda entry with type to-do + AgendaEntry entry; + entry.setType(AgendaEntry::TypeTodo); + entry.setSummary(QString("Buy Books")); + entry.setDescription(QString("@Landmarks")); + entry.setStartAndEndTime( + QDateTime::currentDateTime(),QDateTime::currentDateTime()); + entry.setStatus(AgendaEntry::TodoNeedsAction); + entry.setPriority(2); + + ulong id = agendaUtil->addEntry(entry); + + // Call edit on agenda entry + notesEditor->edit(entry); + + QTest::qWait(3000); + + ulong afterSaveId = notesEditor->close(NotesEditor::CloseWithSave); + + AgendaEntry afterSave = agendaUtil->fetchById(id); + QCOMPARE(afterSave.id(),id); + QCOMPARE(afterSave.type(),entry.type()); + QCOMPARE(afterSave.summary(), entry.summary()); + QCOMPARE(afterSave.description(), entry.description()); + + delete agendaUtil; + delete notesEditor; +} + +/*! + Test the api NotesEditor::close(CloseType type); + */ +void TestNotesEditor::testClosingOfTodoEditorWithoutSave() +{ + HbMainWindow window; + window.show(); + + NotesEditor *notesEditor = new NotesEditor(); + QVERIFY(notesEditor); + + AgendaUtil *agendaUtil = new AgendaUtil(); + QVERIFY(agendaUtil); + + // Create a agenda entry with type to-do + AgendaEntry entry; + entry.setType(AgendaEntry::TypeTodo); + entry.setSummary(QString("Buy Books")); + entry.setDescription(QString("@Landmarks")); + entry.setStartAndEndTime( + QDateTime::currentDateTime(),QDateTime::currentDateTime()); + entry.setStatus(AgendaEntry::TodoNeedsAction); + entry.setPriority(2); + + ulong id = agendaUtil->addEntry(entry); + + // Call edit on agenda entry + notesEditor->edit(entry); + + QTest::qWait(3000); + + ulong afterSaveId = notesEditor->close(NotesEditor::CloseWithoutSave); + QVERIFY(!afterSaveId); + + delete agendaUtil; + delete notesEditor; +} +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/tsrc/unittest_noteseditor/unittest_noteseditor.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/tsrc/unittest_noteseditor/unittest_noteseditor.pkg Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,35 @@ +; +; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +; All rights reserved. +; This component and the accompanying materials are made available +; under the terms of "Eclipse Public License v1.0" +; which accompanies this distribution, and is available +; at the URL "http://www.eclipse.org/legal/epl-v10.html". +; +; Initial Contributors: +; Nokia Corporation - initial contribution. +; +; Contributors: +; +; Description: Pkg file for the unitest_noteseditor component. +; + + +; Language +&EN + +; SIS header: name, uid, version +#{"utnoteseditor"}, (0xEc226a1e), 1, 0, 0 + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +; Executable and default resource files +"/epoc32/release/armv5/urel/utnoteseditor.exe" - "!:\sys\bin\utnoteseditor.exe" +"/epoc32/data/z/resource/apps/utnoteseditor.rsc" - "!:\resource\apps\utnoteseditor.rsc" +"/epoc32/data/z/private/10003a3f/import/apps/utnoteseditor_reg.rsc" - "!:\private\10003a3f\import\apps\utnoteseditor_reg.rsc" + +; End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/tsrc/unittest_noteseditor/unittest_noteseditor.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/tsrc/unittest_noteseditor/unittest_noteseditor.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,49 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# Project specification file for noteseditor unit test. +# + +TEMPLATE = app +TARGET = utnoteseditor +CONFIG += \ + qtestlib \ + symbian_test \ + hb + +DEPENDPATH += \ + . \ + ./src + +INCLUDEPATH += . + + +symbian: { + TARGET.CAPABILITY = ALL -TCB + TARGET.EPOCALLOWDLLDATA = 1 + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + LIBS += \ + -lnoteseditor \ + -lagendainterface +} + +SOURCES += \ + unittest_noteseditor.cpp \ + main.cpp + +HEADERS += \ + ./inc/unittest_noteseditor.h + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/tsrc/unittest_notesmodel/src/unittest_notesmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/tsrc/unittest_notesmodel/src/unittest_notesmodel.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,272 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* NotesModel unit-test class. +* +*/ + +// System includes +#include +#include +#include +#include + +// User includes +#include "notesmodel.h" +#include "agendautil.h" + +class TestNotesModel : public QObject +{ + Q_OBJECT + +public slots: + void handleEntriesDeletion(int var); + +private slots: + // Test case setup. + void initTestCase(); + void cleanupTestCase(); + + // Test cases. + void test_construction(); + void test_sourceModelAddNote(); + void test_sourceModelDeleteNote(); + void test_sourceModelUpdateNote(); + +private: + QPointer mNotesModel; + QPointer mAgendaUtil; + + QDateTime mStart; + QDateTime mEnd; + + CActiveSchedulerWait *mWait; +}; + +/*! + \class TestNotesModel + + This is unittest class for NotesModel apis. + */ + +/*! + Slot called when all the entries have been deleted. + */ +void TestNotesModel::handleEntriesDeletion(int var) +{ + Q_UNUSED(var) + + if (mWait && mWait->IsStarted()) { + mWait->AsyncStop(); + } +} + +/*! + This function is called to init the testcase. + Called for every test case execution. + */ +void TestNotesModel::initTestCase() +{ + QT_TRAP_THROWING(mAgendaUtil = new AgendaUtil(this);); + QVERIFY(mAgendaUtil != 0); + + // Connect to the required signals + connect( + mAgendaUtil, SIGNAL(entriesDeleted(int)), + this, SLOT(handleEntriesDeletion(int))); + + mWait = 0; + + mStart.setDate(QDate(1900, 1, 1)); + mStart.setTime(QTime(0, 0, 0)); + mEnd.setDate(QDate(2100, 30, 12)); + mEnd.setTime(QTime(23, 59, 0)); +} + +/*! + This function is called when the testcase execution is + completed, for cleaning up. + */ +void TestNotesModel::cleanupTestCase() +{ + if (mAgendaUtil) { + delete mAgendaUtil; + } + if (mNotesModel) { + delete mNotesModel; + } + if (mWait && mWait->IsStarted()) { + mWait->AsyncStop(); + } + if (mWait) { + delete mWait; + } +} + +/*! + This test functions tests the construction of NotesModel object. + */ +void TestNotesModel::test_construction() +{ + mNotesModel = new NotesModel(mAgendaUtil, this); + QVERIFY(mNotesModel); + + if (mNotesModel) { + delete mNotesModel; + QVERIFY(!mNotesModel); + } +} + +/*! + This test function tests if the source model is updated when a note is + added. + */ +void TestNotesModel::test_sourceModelAddNote() +{ + mAgendaUtil->deleteEntries(mStart, mEnd, AgendaUtil::IncludeAll); + if (!mWait) { + mWait = new CActiveSchedulerWait; + } + if (!mWait->IsStarted()) { + mWait->Start(); + } + mNotesModel = new NotesModel(mAgendaUtil, this); + QVERIFY(mNotesModel); + + QAbstractItemModel *model = 0; + model = mNotesModel->sourceModel(); + QVERIFY(model); + QVERIFY(!model->rowCount()); + + // Now save a note. + AgendaEntry entry; + entry.setType(AgendaEntry::TypeNote); + entry.setDescription("Hello"); + entry.setLastModifiedDateTime( + QDateTime(QDate::currentDate(), QTime::currentTime())); + QVERIFY(mAgendaUtil->addEntry(entry)); + + // Now check the count in the model. + startTimer(1000); + QVERIFY(model->rowCount()); + QVERIFY(model->rowCount() == 1); +} + +/*! + This test function tests if the source model is updated when a note is + deleted. + */ +void TestNotesModel::test_sourceModelDeleteNote() +{ + mAgendaUtil->deleteEntries(mStart, mEnd, AgendaUtil::IncludeAll); + if (!mWait) { + mWait = new CActiveSchedulerWait; + } + if (!mWait->IsStarted()) { + mWait->Start(); + } + mNotesModel = new NotesModel(mAgendaUtil, this); + QVERIFY(mNotesModel); + + QAbstractItemModel *model = 0; + model = mNotesModel->sourceModel(); + QVERIFY(model); + QVERIFY(!model->rowCount()); + + // Now save a note. + AgendaEntry entry; + entry.setType(AgendaEntry::TypeNote); + entry.setDescription("Hello"); + entry.setLastModifiedDateTime( + QDateTime(QDate::currentDate(), QTime::currentTime())); + ulong id; + QVERIFY(id = mAgendaUtil->addEntry(entry)); + + // Now check the count in the model. + startTimer(1000); + QVERIFY(model->rowCount()); + QVERIFY(model->rowCount() == 1); + + // Verify if the model has the updated content. + startTimer(1000); + QModelIndex index = model->index(0, 0); + QVERIFY(index.isValid()); + QStringList list = index.data(Qt::DisplayRole).value(); + QCOMPARE(entry.description(), list.at(0)); + + // Delete the note saved above. + QVERIFY(mAgendaUtil->deleteEntry(id)); + // Now check the count in the model. + startTimer(1000); + QVERIFY(!model->rowCount()); +} + +/*! + This test function tests if the source model is updated when a note is + modified. + */ +void TestNotesModel::test_sourceModelUpdateNote() +{ + mAgendaUtil->deleteEntries(mStart, mEnd, AgendaUtil::IncludeAll); + if (!mWait) { + mWait = new CActiveSchedulerWait; + } + if (!mWait->IsStarted()) { + mWait->Start(); + } + mNotesModel = new NotesModel(mAgendaUtil, this); + QVERIFY(mNotesModel); + + QAbstractItemModel *model = 0; + model = mNotesModel->sourceModel(); + QVERIFY(model); + QVERIFY(!model->rowCount()); + + // Now save a note. + AgendaEntry entry; + entry.setType(AgendaEntry::TypeNote); + entry.setDescription("Hello"); + entry.setLastModifiedDateTime( + QDateTime(QDate::currentDate(), QTime::currentTime())); + ulong id; + QVERIFY(id = mAgendaUtil->addEntry(entry)); + // Now check the count in the model. + startTimer(1000); + QVERIFY(model->rowCount()); + QVERIFY(model->rowCount() == 1); + + // Now update the content on of the note created above. + entry = mAgendaUtil->fetchById(id); + QVERIFY(!entry.isNull()); + entry.setDescription("Hello world"); + QVERIFY(mAgendaUtil->updateEntry(entry)); + + // Verify if the model has the updated content. + startTimer(1000); + QModelIndex index = model->index(0, 0); + QVERIFY(index.isValid()); + QStringList list = index.data(Qt::DisplayRole).value(); + QCOMPARE(entry.description(), list.at(0)); + + // Delete the note saved above. + QVERIFY(mAgendaUtil->deleteEntry(id)); + // Now check the count in the model. + startTimer(1000); + QVERIFY(!model->rowCount()); +} + +QTEST_MAIN(TestNotesModel) +#include "unittest_notesmodel.moc" + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/tsrc/unittest_notesmodel/unittest_notesmodel.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/tsrc/unittest_notesmodel/unittest_notesmodel.pkg Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,35 @@ +; +; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +; All rights reserved. +; This component and the accompanying materials are made available +; under the terms of the License "Symbian Foundation License v1.0" +; which accompanies this distribution, and is available +; at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +; +; Initial Contributors: +; Nokia Corporation - initial contribution. +; +; Contributors: +; +; Description: +; Pkg file for the unittest_notesmodel component. +; + +; Language +&EN + +; SIS header: name, uid, version +#{"utnotesmodel"}, (0xEADA6E32), 1, 0, 0 + +; Localised Vendor name +%{"Nokia"} + +; Unique Vendor name +:"Nokia" + +; Executable and default resource files +"/epoc32/release/armv5/urel/utnotesmodel.exe" - "!:\sys\bin\utnotesmodel.exe" +"/epoc32/data/z/resource/apps/utnotesmodel.rsc" - "!:\resource\apps\utnotesmodel.rsc" +"/epoc32/data/z/private/10003a3f/import/apps/utnotesmodel_reg.rsc" - "!:\private\10003a3f\import\apps\utnotesmodel_reg.rsc" + +; End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b notes/tsrc/unittest_notesmodel/unittest_notesmodel.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/tsrc/unittest_notesmodel/unittest_notesmodel.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,45 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of the License "Symbian Foundation License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.symbianfoundation.org/legal/sfl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# This is the project specification file for unittest_notesmodel. +# + +TEMPLATE = app +TARGET = utnotesmodel +CONFIG += qtestlib +CONFIG += symbian_test +DEPENDPATH += \ + . \ + ./src +INCLUDEPATH += \ + . \ + ../../notesui/notesmodel/inc \ + ../../../agendainterface/agendautil/inc \ + ../../inc + +symbian: { + TARGET.CAPABILITY = ALL -TCB + TARGET.EPOCALLOWDLLDATA = 1 + TARGET.UID3 = 0xEADA6E32 + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + LIBS += \ + -lnotesmodel \ + -lagendainterface +} + +SOURCES += \ + unittest_notesmodel.cpp + +# End of file --Don't remove this diff -r fd30d51f876b -r b6db4fd4947b organizer.pro --- a/organizer.pro Mon May 03 12:30:32 2010 +0300 +++ b/organizer.pro Mon Jun 28 15:22:02 2010 +0530 @@ -17,12 +17,8 @@ TEMPLATE = subdirs CONFIG += ordered SUBDIRS += organizer_pub \ - organizer_plat \ + organizer_plat \ agendainterface \ - calendarui/commonutils \ - calendarui/calenlauncher \ - calendarui/caleneditor \ - notes/notesui/noteseditor \ calendarui \ clock \ notes \ diff -r fd30d51f876b -r b6db4fd4947b organizer_info/organizer_metadata/organizer_metadata.mrp --- a/organizer_info/organizer_metadata/organizer_metadata.mrp Mon May 03 12:30:32 2010 +0300 +++ b/organizer_info/organizer_metadata/organizer_metadata.mrp Mon Jun 28 15:22:02 2010 +0530 @@ -1,19 +1,3 @@ -# -# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -# All rights reserved. -# This component and the accompanying materials are made available -# under the terms of "Eclipse Public License v1.0" -# which accompanies this distribution, and is available -# at the URL "http://www.eclipse.org/legal/epl-v10.html". -# -# Initial Contributors: -# Nokia Corporation - initial contribution. -# -# Contributors: -# -# Description: -# - component organizer_metadata source \sf\app\organizer\organizer_info\organizer_metadata source \sf\app\organizer\package_definition.xml diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/agenda_interface_api/inc/agendaentry.h --- a/organizer_plat/agenda_interface_api/inc/agendaentry.h Mon May 03 12:30:32 2010 +0300 +++ b/organizer_plat/agenda_interface_api/inc/agendaentry.h Mon Jun 28 15:22:02 2010 +0530 @@ -238,7 +238,7 @@ void setUntil(const QDateTime& date); QDateTime until() const; - void setRepeatRuleStart(const QDateTime& date); + void setRepeatRuleStart(const QDateTime& dateTime); QDateTime repeatRuleStart() const; void setWeekStart(Day day); @@ -380,6 +380,7 @@ void setGeoValue(const AgendaGeoValue& geoValue); AgendaGeoValue geoValue() const; + void clearGeoValue() const; int durationInSecs() const; AgendaEntry& operator=(const AgendaEntry& other); diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/agenda_interface_api/inc/agendautil.h --- a/organizer_plat/agenda_interface_api/inc/agendautil.h Mon May 03 12:30:32 2010 +0300 +++ b/organizer_plat/agenda_interface_api/inc/agendautil.h Mon Jun 28 15:22:02 2010 +0530 @@ -79,7 +79,7 @@ AgendaEntry& entry, AgendaUtil::RecurrenceRange range); bool updateEntry(const AgendaEntry& entry, bool isChild = false); bool storeRepeatingEntry(const AgendaEntry& entry, bool copyToChildren); - bool createException(const AgendaEntry& entry); + bool createException(const AgendaEntry& entry,QDateTime instanceOriginalDateTime); QList entryIds( AgendaUtil::FilterFlags filter = AgendaUtil::IncludeAll); QList fetchAllEntries( @@ -120,6 +120,8 @@ void entryDeleted(ulong id); void entryUpdated(ulong id); void entriesDeleted(int status); + void entryViewCreationCompleted(int status); + void instanceViewCreationCompleted(int status); private: friend class AgendaUtilPrivate; diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/agenda_interface_api/tsrc/tsrc.pro --- a/organizer_plat/agenda_interface_api/tsrc/tsrc.pro Mon May 03 12:30:32 2010 +0300 +++ b/organizer_plat/agenda_interface_api/tsrc/tsrc.pro Mon Jun 28 15:22:02 2010 +0530 @@ -17,11 +17,7 @@ TEMPLATE = subdirs SUBDIRS += unittest_agendautil + CONFIG += ordered -symbian: { - BLD_INF_RULES.prj_exports += \ - "./rom/unit_agendainterface.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unit_agendainterface.iby)" -} - # End of file --Don't remove this diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/agenda_interface_api/tsrc/unittest_agendautil/src/unittest_agendautil.cpp --- a/organizer_plat/agenda_interface_api/tsrc/unittest_agendautil/src/unittest_agendautil.cpp Mon May 03 12:30:32 2010 +0300 +++ b/organizer_plat/agenda_interface_api/tsrc/unittest_agendautil/src/unittest_agendautil.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). + * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" @@ -9,7 +9,7 @@ * Initial Contributors: * Nokia Corporation - initial contribution. * - * Contributors: + * Contributors: * * Description: AgendaUtil unit test class. * @@ -26,20 +26,18 @@ class TestAgendaUtil : public QObject { Q_OBJECT - + public slots: void handleEntriesDeletion(int error); + void handleEntryViewCreationCompleted(int status); -private: - int createMultipleEntries(); - private slots: // Test case setup. void init(); void cleanup(); void initTestCase(); void cleanupTestCase(); - + // Test cases. void test_addEntry(); void test_deleteEntry(); @@ -51,6 +49,19 @@ void test_fetchAllEntries(); void test_deleteEntries(); void test_fetchEntriesInRange(); + void test_cloneEntry(); + void test_todoCompleted(); + +private: + int createMultipleEntries(); + void cloneNoteToTodo(); + void cloneNoteToMeeting(); + void cloneTodoToNote(); + void cloneTodoToMeeting(); + void cloneMeetingToNote(); + void cloneMeetingToTodo(); + void completeTodo(); + void unCompletedTodo(); private: AgendaUtil *mAgendaUtil; @@ -59,7 +70,7 @@ /*! \class TestAgendaUtil - + This is unittest class for AgendaUtil apis. */ @@ -71,7 +82,7 @@ /*QT_TRAP_THROWING(mAgendaUtil = new AgendaUtil); Q_ASSERT_X(mAgendaUtil, "TestAgendaUtil::test_addEntry", "No agendautil"); - + // Connect to the required signals connect( mAgendaUtil, SIGNAL(entriesDeleted(int)), this, @@ -85,7 +96,7 @@ */ void TestAgendaUtil::cleanup() { - + //User::Exit(0); if (mWait && mWait->IsStarted()) { mWait->AsyncStop(); @@ -99,24 +110,34 @@ void TestAgendaUtil::initTestCase() { QT_TRAP_THROWING(mAgendaUtil = new AgendaUtil); - + + connect( + mAgendaUtil, SIGNAL(entryViewCreationCompleted(int)), + this, SLOT(handleEntryViewCreationCompleted(int))); + + // Start the timer as the instanceview/entryview creation + // operation is asynchronous + QT_TRAP_THROWING(mWait = new (ELeave) CActiveSchedulerWait;); + if (!mWait->IsStarted()) { + mWait->Start(); + } + Q_ASSERT_X(mAgendaUtil, "TestAgendaUtil::test_addEntry", "No agendautil"); - + // Connect to the required signals connect( mAgendaUtil, SIGNAL(entriesDeleted(int)), this, SLOT(handleEntriesDeletion(int))); - + mWait = NULL; } void TestAgendaUtil::cleanupTestCase() { - //User::Exit(0); - QCoreApplication::processEvents(); - if (mAgendaUtil) { - delete mAgendaUtil; - } + QCoreApplication::processEvents(); + if (mAgendaUtil) { + delete mAgendaUtil; + } } /* Tests the AgendaUtil::addEntry. @@ -131,10 +152,10 @@ entry.setType(AgendaEntry::TypeEvent); entry.setSummary("Test case"); entry.setStartAndEndTime(dateTimeSet, dateTimeSet); - + // Run the case. ulong id = mAgendaUtil->addEntry(entry); - + // Verify. AgendaEntry newEntry = mAgendaUtil->fetchById(id); QDateTime dateTimeRetrieved = newEntry.startTime(); @@ -157,13 +178,13 @@ entry.setType(AgendaEntry::TypeEvent); entry.setSummary("Test case"); entry.setStartAndEndTime( - QDateTime::currentDateTime(), + QDateTime::currentDateTime(), QDateTime::currentDateTime()); ulong id = mAgendaUtil->addEntry(entry); - + // Run the case. QVERIFY(mAgendaUtil->deleteEntry(id)); - + // Verify. QVERIFY(mAgendaUtil->fetchById(id).isNull()); } @@ -178,7 +199,7 @@ entry.setType(AgendaEntry::TypeAppoinment); entry.setSummary("Test case"); entry.setStartAndEndTime( - QDateTime::currentDateTime(), + QDateTime::currentDateTime(), QDateTime::currentDateTime()); AgendaRepeatRule repeatRule; repeatRule.setType(AgendaRepeatRule::DailyRule); @@ -188,15 +209,15 @@ repeatRule.setUntil(until); repeatRule.setInterval(1); entry.setRepeatRule(repeatRule); - + ulong id = mAgendaUtil->addEntry(entry); AgendaEntry savedEntry = mAgendaUtil->fetchById(id); QVERIFY(!savedEntry.isNull()); QVERIFY(savedEntry.isRepeating()); - + // Run the case. mAgendaUtil->deleteRepeatedEntry(savedEntry, AgendaUtil::ThisAndAll); - + // Verify. QVERIFY(mAgendaUtil->fetchById(id).isNull()); } @@ -220,7 +241,7 @@ // Verify. AgendaEntry retrievedEntry = mAgendaUtil->fetchById(id); - + // Check if the fetched entry is same st the added entry QDateTime dateTimeRetrieved = retrievedEntry.startTime(); QDate dateRetrieved = dateTimeRetrieved.date(); @@ -229,7 +250,7 @@ QVERIFY(entry.type() == retrievedEntry.type()); QVERIFY(entry.summary() == retrievedEntry.summary()); mAgendaUtil->deleteEntry(id); - + // Fetch the same again and check if its null. AgendaEntry checkEntryIsNull = mAgendaUtil->fetchById(id); QVERIFY(checkEntryIsNull.isNull()); @@ -247,19 +268,19 @@ entry.setDescription("Entry to test the updateEntry API"); entry.setLocation("Nokia"); entry.setStartAndEndTime( - QDateTime::currentDateTime(), + QDateTime::currentDateTime(), QDateTime::currentDateTime()); // Save the entry ulong id = mAgendaUtil->addEntry(entry); - // Fetch the same entry + // Fetch the same entry AgendaEntry savedEntry = mAgendaUtil->fetchById(id); QVERIFY(!savedEntry.isNull()); savedEntry.setSummary("Fetced Entry"); savedEntry.setLocation("India"); savedEntry.setStartAndEndTime( - QDateTime::currentDateTime().addDays(1), + QDateTime::currentDateTime().addDays(1), QDateTime::currentDateTime().addDays(1)); // Update the entry @@ -267,7 +288,7 @@ QVERIFY(success); // Fetch the updated entry again - AgendaEntry updatedEntry = mAgendaUtil->fetchById(id); + AgendaEntry updatedEntry = mAgendaUtil->fetchById(id); // Verify QVERIFY(savedEntry.summary() == updatedEntry.summary()); @@ -286,7 +307,7 @@ QDateTime startRange(QDate(1900, 01, 1), QTime(0, 0, 0, 0)); QDateTime endRange(QDate(2100, 01, 01), QTime(23, 59, 59, 0)); mAgendaUtil->deleteEntries(startRange, endRange); - // Start the timer as the above operation is asynchronous + // Start the timer as the above operation is asynchronous if (!mWait) { QT_TRAP_THROWING(mWait = new (ELeave) CActiveSchedulerWait;); if (!mWait->IsStarted()) { @@ -328,7 +349,7 @@ qDebug("Request for deletion made."); - // Start the timer as the above operation is asynchronous + // Start the timer as the above operation is asynchronous if (!mWait) { QT_TRAP_THROWING(mWait = new (ELeave) CActiveSchedulerWait;); if (!mWait->IsStarted()) { @@ -392,7 +413,7 @@ qDebug("Request for deletion made."); - // Start the timer as the above operation is asynchronous + // Start the timer as the above operation is asynchronous if (!mWait) { QT_TRAP_THROWING(mWait = new (ELeave) CActiveSchedulerWait;); if (!mWait->IsStarted()) { @@ -413,7 +434,7 @@ qDebug("Request for deletion made."); - // Start the timer as the above operation is asynchronous + // Start the timer as the above operation is asynchronous if (!mWait) { QT_TRAP_THROWING(mWait = new (ELeave) CActiveSchedulerWait;); if (!mWait->IsStarted()) { @@ -453,7 +474,7 @@ // Verfiy numOfEntriesRetrieved = entries.count(); - QVERIFY(numOfEntries == numOfEntriesRetrieved); + QCOMPARE(numOfEntries,numOfEntriesRetrieved); } /*! @@ -471,32 +492,32 @@ int numOfEntriesRetrieved = entriesRetrieved.count(); QList checkList = mAgendaUtil->entryIds(); int checkNum = checkList.count(); - + // Create the required entries. int numOfEntries = createMultipleEntries(); - + entriesRetrieved = mAgendaUtil->fetchEntriesInRange(startRange, endRange); numOfEntriesRetrieved = entriesRetrieved.count(); checkList = mAgendaUtil->entryIds(); checkNum = checkList.count(); Q_ASSERT(numOfEntries); - + qDebug("Entries have been created"); // Execute the case. mAgendaUtil->deleteEntries(startRange, endRange); - + qDebug("Request for deletion made."); - // Start the timer as the above operation is asynchronous + // Start the timer as the above operation is asynchronous if (!mWait) { QT_TRAP_THROWING(mWait = new (ELeave) CActiveSchedulerWait;); if (!mWait->IsStarted()) { mWait->Start(); } } - + qDebug("Waiting for confirmation."); entriesRetrieved = mAgendaUtil->fetchEntriesInRange(startRange, endRange); numOfEntriesRetrieved = entriesRetrieved.count(); @@ -514,10 +535,10 @@ QDateTime startRange(QDate(1900, 01, 1), QTime(0, 0, 0, 0)); QDateTime endRange(QDate(2100, 12, 30), QTime(23, 59, 59, 0)); mAgendaUtil->deleteEntries(startRange,endRange); - + //qDebug("Request for deletion made."); - // Start the timer as the above operation is asynchronous + // Start the timer as the above operation is asynchronous if (!mWait) { QT_TRAP_THROWING(mWait = new (ELeave) CActiveSchedulerWait;); if (!mWait->IsStarted()) { @@ -526,13 +547,13 @@ } //qDebug("Waiting for confirmation."); - + QList entriesRetrieved = mAgendaUtil->fetchEntriesInRange(startRange, endRange); int numOfEntriesRetrieved = entriesRetrieved.count(); QList checkList = mAgendaUtil->entryIds(); int checkNum = checkList.count(); - + // Appointment. AgendaEntry firstEntry; firstEntry.setType(AgendaEntry::TypeAppoinment); @@ -543,7 +564,7 @@ QDate(2020, 05, 01), QTime(10, 0, 0, 0)); firstEntry.setStartAndEndTime(firstEntryStart, firstEntryEnd); ulong id = mAgendaUtil->addEntry(firstEntry); - + // Create the range for which entries are needed QDateTime fromRange( QDate(2020, 01, 01), QTime(0, 0, 0, 0)); @@ -554,15 +575,37 @@ fromRange, toRange); // Verify - int num = entries.count(); + int num = entries.count(); QVERIFY( 1 == entries.count()); - + //cleanup(); - + //User::Exit(0); } /*! + Test the api AgendaUtil::cloneEntry + */ +void TestAgendaUtil::test_cloneEntry() +{ + cloneNoteToTodo(); + cloneNoteToMeeting(); + cloneTodoToNote(); + cloneTodoToMeeting(); + cloneMeetingToNote(); + cloneMeetingToTodo(); +} + +/* + Test the api AgendaUtil::setCompleted + */ +void TestAgendaUtil::test_todoCompleted() +{ + completeTodo(); + unCompletedTodo(); +} + +/*! Slot to listen for the completion of deleting the entries asynchronously. */ void TestAgendaUtil::handleEntriesDeletion(int error) @@ -575,6 +618,18 @@ } /*! + Slot to handle the entry view creation. + */ +void TestAgendaUtil::handleEntryViewCreationCompleted(int status) +{ + // Stop the wait timer. + if (mWait && mWait->IsStarted()) { + mWait->AsyncStop(); + } + QVERIFY(!status); +} + +/*! Private function to create entries needed for some of the test cases. */ int TestAgendaUtil::createMultipleEntries() @@ -621,7 +676,248 @@ return numOfEntries; } -QTEST_MAIN(TestAgendaUtil) +/*! + Test Cloning of Note to To-do + */ +void TestAgendaUtil::cloneNoteToTodo() +{ + // Create an agenda entry(TypeNote) and save it. + AgendaEntry noteEntry(AgendaEntry::TypeNote); + noteEntry.setDescription(QString("test cloning of note to todo")); + + // Clone the entry type TypeNote to TypeTodo + long notSavedEntryId = mAgendaUtil->cloneEntry( + noteEntry, AgendaEntry::TypeTodo); + // Shouldn't clone the entry as AgendaEntry is not yet saved. + QVERIFY(!notSavedEntryId); + + long noteId = mAgendaUtil->addEntry(noteEntry); + QVERIFY(noteId); + + // Fetch the saved note entry for cloning + AgendaEntry fetchedNoteEntry = mAgendaUtil->fetchById(noteId); + + // Clone the entry type ENote to ETodo + long clonedTodoEntryId = mAgendaUtil->cloneEntry( + fetchedNoteEntry, AgendaEntry::TypeTodo); + QVERIFY(clonedTodoEntryId); + + AgendaEntry clonedTodoEntry = mAgendaUtil->fetchById(clonedTodoEntryId); + // Compare the attributes. + QCOMPARE(AgendaEntry::TypeTodo,clonedTodoEntry.type()); + QCOMPARE(fetchedNoteEntry.description(),clonedTodoEntry.description()); +} + +/*! + Test Cloning of Note to Meeting + */ + +void TestAgendaUtil::cloneNoteToMeeting() +{ + // Create an agenda entry(TypeNote) and save it. + AgendaEntry noteEntry(AgendaEntry::TypeNote); + noteEntry.setDescription(QString("test cloning of note to meeting")); + + long noteId = mAgendaUtil->addEntry(noteEntry); + QVERIFY(noteId); + + // Fetch the saved note entry for cloning + AgendaEntry fetchedNoteEntry = mAgendaUtil->fetchById(noteId); + + // Clone the entry type TypeNote to TypeTodo + long clonedMeetingEntryId = mAgendaUtil->cloneEntry( + fetchedNoteEntry, AgendaEntry::TypeAppoinment); + QVERIFY(clonedMeetingEntryId); + + AgendaEntry clonedMeetingEntry = mAgendaUtil->fetchById(clonedMeetingEntryId); + // Compare the attributes. + QCOMPARE(AgendaEntry::TypeAppoinment,clonedMeetingEntry.type()); + QCOMPARE(fetchedNoteEntry.description(),clonedMeetingEntry.description()); +} + +/*! + Test Cloning of To-do to Note + */ +void TestAgendaUtil::cloneTodoToNote() +{ + // Create an agenda entry(TypeTodo) and save it. + AgendaEntry todoEntry(AgendaEntry::TypeTodo); + todoEntry.setDescription(QString("test cloning of todo to note")); + QDateTime dueDate(QDate(2011, 06, 01), QTime(10, 0, 0, 0)); + todoEntry.setStartAndEndTime(dueDate, dueDate); + long todoId = mAgendaUtil->addEntry(todoEntry); + QVERIFY(todoId); + + // Fetch the saved note entry for cloning + AgendaEntry fetchedTodoEntry = mAgendaUtil->fetchById(todoId); + + // Clone the entry type ETodo to EANote + ulong clonedNoteId = mAgendaUtil->cloneEntry( + fetchedTodoEntry, AgendaEntry::TypeNote); + QVERIFY(clonedNoteId); + AgendaEntry clonedNoteEntry = + mAgendaUtil->fetchById(clonedNoteId); + + // Compare the attributes. + QCOMPARE(AgendaEntry::TypeNote,clonedNoteEntry.type()); + QCOMPARE(fetchedTodoEntry.description(),clonedNoteEntry.description()); + QCOMPARE(fetchedTodoEntry.favourite(),clonedNoteEntry.favourite()); +} + +/*! + Test Cloning of To-do to Meeting + */ +void TestAgendaUtil::cloneTodoToMeeting() +{ + // Create an agenda entry(TypeTodo) and save it. + AgendaEntry todoEntry(AgendaEntry::TypeTodo); + todoEntry.setSummary(QString("test cloning of todo to meeting")); + QDateTime dueDate(QDate(2011, 06, 01), QTime(10, 0, 0, 0)); + todoEntry.setStartAndEndTime(dueDate, dueDate); + long todoId = mAgendaUtil->addEntry(todoEntry); + QVERIFY(todoId); + + // Fetch the saved note entry for cloning + AgendaEntry fetchedTodoEntry = mAgendaUtil->fetchById(todoId); + + // Clone the entry type TypeTodo to TypeAppointment + ulong clonedAppointmentId = mAgendaUtil->cloneEntry( + fetchedTodoEntry, AgendaEntry::TypeAppoinment); + QVERIFY(clonedAppointmentId); + AgendaEntry clonedAppointmentEntry = + mAgendaUtil->fetchById(clonedAppointmentId); + + // Compare the attributes. + QCOMPARE(AgendaEntry::TypeAppoinment,clonedAppointmentEntry.type()); + QCOMPARE(fetchedTodoEntry.summary(),clonedAppointmentEntry.summary()); + QCOMPARE(fetchedTodoEntry.startTime(),clonedAppointmentEntry.startTime()); + QCOMPARE(fetchedTodoEntry.endTime(),clonedAppointmentEntry.endTime()); +} + +/*! + Test Cloning of Meeting to Note + */ +void TestAgendaUtil::cloneMeetingToNote() +{ + // Create an agenda entry(TypeAppointment) and save it. + AgendaEntry appointment(AgendaEntry::TypeAppoinment); + appointment.setSummary(QString("test cloning of meeting to note")); + QDateTime startDate(QDate(2011, 06, 01), QTime(10, 0, 0, 0)); + QDateTime endDate(QDate(2011, 06, 01), QTime(12, 0, 0, 0)); + appointment.setStartAndEndTime(startDate, endDate); + long appointmentId = mAgendaUtil->addEntry(appointment); + QVERIFY(appointmentId); + + // Fetch the saved note entry for cloning + AgendaEntry fetchedAppointment = mAgendaUtil->fetchById(appointmentId); + + // Clone the entry type TypeAppointment to TypeNote + ulong clonedNoteId = mAgendaUtil->cloneEntry( + fetchedAppointment, AgendaEntry::TypeNote); + QVERIFY(clonedNoteId); + + AgendaEntry clonedNote = mAgendaUtil->fetchById(clonedNoteId); + // Compare the attributes. + QCOMPARE(AgendaEntry::TypeNote,clonedNote.type()); + QCOMPARE(fetchedAppointment.description(),clonedNote.description()); + QCOMPARE(fetchedAppointment.favourite(),clonedNote.favourite()); +} + +/*! + Test Cloning of Meeting to To-do + */ +void TestAgendaUtil::cloneMeetingToTodo() +{ + // Create an agenda entry(TypeAppointment) and save it. + AgendaEntry appointment(AgendaEntry::TypeAppoinment); + appointment.setSummary(QString("test cloning of meeting to todo")); + QDateTime startDate(QDate(2011, 06, 01), QTime(10, 0, 0, 0)); + QDateTime endDate(QDate(2011, 06, 01), QTime(12, 0, 0, 0)); + appointment.setStartAndEndTime(startDate, endDate); + long appointmentId = mAgendaUtil->addEntry(appointment); + QVERIFY(appointmentId); + + // Fetch the saved note entry for cloning + AgendaEntry fetchedAppointment = mAgendaUtil->fetchById(appointmentId); + + // Clone the entry type EAppointment to TypeNote + ulong clonedTodoId = mAgendaUtil->cloneEntry( + fetchedAppointment, AgendaEntry::TypeTodo); + QVERIFY(clonedTodoId); + + AgendaEntry clonedTodo = mAgendaUtil->fetchById(clonedTodoId); + // Compare the attributes. + QCOMPARE(AgendaEntry::TypeTodo,clonedTodo.type()); + QCOMPARE(fetchedAppointment.summary(),clonedTodo.summary()); + QCOMPARE(fetchedAppointment.startTime(),clonedTodo.startTime()); + QCOMPARE(fetchedAppointment.endTime(),clonedTodo.endTime()); +} + +/*! + test making To-do as completed + */ +void TestAgendaUtil::completeTodo() +{ + // Create and Save a To-do event. + AgendaEntry todoEntry(AgendaEntry::TypeTodo); + todoEntry.setSummary(QString("Test making To-do event as Completed")); + QDateTime dueDate(QDate(2011, 06, 01), QTime(0, 0, 0, 0)); + todoEntry.setStartAndEndTime(dueDate, dueDate); + + ulong todoId = mAgendaUtil->addEntry(todoEntry); + QVERIFY(todoId); + + // Complete the to-do. + AgendaEntry fetchedTodoEntry = mAgendaUtil->fetchById(todoId); + QDateTime completedTime(QDate(2011, 07, 01),QTime(0, 0, 0, 0)); + mAgendaUtil->setCompleted(fetchedTodoEntry, true, completedTime); + + // Compare the completed time. + AgendaEntry completedTodo = mAgendaUtil->fetchById(todoId); + QCOMPARE(completedTime,completedTodo.completedDateTime()); +} + +/*! + test making To-do as uncompleted + */ +void TestAgendaUtil::unCompletedTodo() +{ + // Create and Save a To-do event. + AgendaEntry todoEntry(AgendaEntry::TypeTodo); + todoEntry.setSummary(QString("Test making To-do event as Completed")); + QDateTime dueDate(QDate(2011, 06, 01), QTime(0, 0, 0, 0)); + todoEntry.setStartAndEndTime(dueDate, dueDate); + + ulong todoId = mAgendaUtil->addEntry(todoEntry); + QVERIFY(todoId); + + // Complete the to-do. + AgendaEntry fetchedTodoEntry = mAgendaUtil->fetchById(todoId); + QDateTime completedTime(QDate(2011, 07, 01),QTime(0, 0, 0, 0)); + mAgendaUtil->setCompleted(fetchedTodoEntry, true, completedTime); + + // Compare the completed time. + AgendaEntry unCompletedTodo = mAgendaUtil->fetchById(todoId); + // make to-do as uncompleted. + mAgendaUtil->setCompleted(fetchedTodoEntry, false, completedTime); + + QCOMPARE(completedTime, unCompletedTodo.completedDateTime()); +} + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + TestAgendaUtil tc; + + char *pass[3]; + pass[0] = argv[0]; + pass[1] = "-o"; + pass[2] = "c:\\data\\TestAgendaUtil.txt"; + + int res = QTest::qExec(&tc, 3, pass); + return res; +} + #include "unittest_agendautil.moc" // End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/agenda_interface_api/tsrc/unittest_agendautil/unittest_agendautil.pro --- a/organizer_plat/agenda_interface_api/tsrc/unittest_agendautil/unittest_agendautil.pro Mon May 03 12:30:32 2010 +0300 +++ b/organizer_plat/agenda_interface_api/tsrc/unittest_agendautil/unittest_agendautil.pro Mon Jun 28 15:22:02 2010 +0530 @@ -21,14 +21,19 @@ DEPENDPATH += . \ ./src INCLUDEPATH += . -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + symbian: { TARGET.CAPABILITY = ALL -TCB TARGET.EPOCALLOWDLLDATA = 1 + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE LIBS += -lagendainterface -} + + BLD_INF_RULES.prj_testexports += \ + "../rom/unit_agendainterface.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unit_agendainterface.iby)" + } + SOURCES += unittest_agendautil.cpp diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/agenda_versit_2_api/tsrc/group/testagnversit2.mmp --- a/organizer_plat/agenda_versit_2_api/tsrc/group/testagnversit2.mmp Mon May 03 12:30:32 2010 +0300 +++ b/organizer_plat/agenda_versit_2_api/tsrc/group/testagnversit2.mmp Mon Jun 28 15:22:02 2010 +0530 @@ -37,10 +37,13 @@ APP_LAYER_SYSTEMINCLUDE SYSTEMINCLUDE ../../../../inc SYSTEMINCLUDE ../../../../calendarui/inc -SYSTEMINCLUDE ../../../../calendarengines/inc -SYSTEMINCLUDE /epoc32/include/Digia/EUnit +SYSTEMINCLUDE ../../../../calendarengines/inc +SYSTEMINCLUDE /epoc32/include/platform/Digia/EUnit SYSTEMINCLUDE /epoc32/include/ecom SYSTEMINCLUDE /epoc32/include/test +SYSTEMINCLUDE /epoc32/include/mw/Qt +SYSTEMINCLUDE /epoc32/include/stdapis +SYSTEMINCLUDE /epoc32/include/stdapis/sys LIBRARY agnmodel.lib LIBRARY CalInterimApi.lib @@ -54,9 +57,9 @@ LIBRARY CalenGlobalData.lib LIBRARY eikcore.lib LIBRARY cone.lib -LIBRARY bafl.lib -LIBRARY tzclient.lib -LIBRARY timezonelocalization.lib -LIBRARY swinstcli.lib +LIBRARY bafl.lib +LIBRARY tzclient.lib +LIBRARY timezonelocalization.lib +LIBRARY swinstcli.lib // End of file diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/agenda_versit_2_api/tsrc/src/testagnversit2.cpp --- a/organizer_plat/agenda_versit_2_api/tsrc/src/testagnversit2.cpp Mon May 03 12:30:32 2010 +0300 +++ b/organizer_plat/agenda_versit_2_api/tsrc/src/testagnversit2.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -861,15 +861,14 @@ } // 13. Clean DB totally. This is a MUST for the next test - TBool databaseHasEntries; + TBool databaseHasEntries(EFalse); TRAP(err, databaseHasEntries = CleanDatabaseL() ); - /* if(err) || databaseHasEntries) + if(err || databaseHasEntries) { EUNIT_PRINT(_L( "13. Clean DB totally fails" ) ); EUNIT_ASSERT( EFalse ); } - */ - + // test passed.. } diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/calendar_editor_api/tsrc/unittest_caleneditor/unittest_caleneditor.pro --- a/organizer_plat/calendar_editor_api/tsrc/unittest_caleneditor/unittest_caleneditor.pro Mon May 03 12:30:32 2010 +0300 +++ b/organizer_plat/calendar_editor_api/tsrc/unittest_caleneditor/unittest_caleneditor.pro Mon Jun 28 15:22:02 2010 +0530 @@ -20,6 +20,7 @@ TARGET = ut_caleneditor CONFIG += qtestlib \ hb +CONFIG += symbian_test DEPENDPATH += . \ ./src/ \ ../../../../calendarui/caleneditor/inc \ @@ -46,7 +47,10 @@ TARGET.EPOCHEAPSIZE = 0x200000 0x4000000 TARGET.CAPABILITY = CAP_GENERAL_DLL - INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + BLD_INF_RULES.prj_testexports += \ + "../rom/unit_caleneditor.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unit_caleneditor.iby)" } SOURCES += unittest_caleneditor.cpp \ diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/calendar_exporter_api/inc/CalenExporter.h --- a/organizer_plat/calendar_exporter_api/inc/CalenExporter.h Mon May 03 12:30:32 2010 +0300 +++ b/organizer_plat/calendar_exporter_api/inc/CalenExporter.h Mon Jun 28 15:22:02 2010 +0530 @@ -25,7 +25,7 @@ #include #include // for TParse #include -#include +#include // FORWARD DECLARATIONS diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/calendar_importer_api/inc/CalenImporter.h --- a/organizer_plat/calendar_importer_api/inc/CalenImporter.h Mon May 03 12:30:32 2010 +0300 +++ b/organizer_plat/calendar_importer_api/inc/CalenImporter.h Mon Jun 28 15:22:02 2010 +0530 @@ -23,7 +23,7 @@ // INCLUDES #include #include -#include +#include diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/calendar_importer_api/tsrc/src/calenimportertestblocks.cpp --- a/organizer_plat/calendar_importer_api/tsrc/src/calenimportertestblocks.cpp Mon May 03 12:30:32 2010 +0300 +++ b/organizer_plat/calendar_importer_api/tsrc/src/calenimportertestblocks.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -64,7 +64,7 @@ { int error = iFs.Connect(); - TRAPD(error, iCalSession = CCalSession::NewL();); + iCalSession = CCalSession::NewL(); iCalSession->OpenL( iCalSession->DefaultFileNameL() ); iCalenImporter = CCalenImporter::NewL( *iCalSession ); diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/calendar_launcher_api/inc/CalenLauncher.h --- a/organizer_plat/calendar_launcher_api/inc/CalenLauncher.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -/* -* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Calendar Launcher -* -*/ -#include -#include - -#ifdef CALENLAUNCHER_LIB -# define CALENLAUNCHER_EXPORT Q_DECL_EXPORT -#else -# define CALENLAUNCHER_EXPORT Q_DECL_IMPORT -#endif -class CALENLAUNCHER_EXPORT CalenLauncher : public QObject -{ -Q_OBJECT - -public: - enum CalenView{ - MonthView = 0, - DayView - }; - CalenLauncher(QObject* parent = 0); - ~CalenLauncher(); - - void launchCalendarApp(CalenView view, QDateTime& dateTime, - bool synchronousLaunch = true); - -signals: - void calendarLaunchFailed(int error); - -public slots: - void handleError(int error); -}; - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/calendar_launcher_api/inc/calenlauncher.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/calendar_launcher_api/inc/calenlauncher.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,47 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Calendar Launcher +* +*/ +#include +#include + +#ifdef CALENLAUNCHER_LIB +# define CALENLAUNCHER_EXPORT Q_DECL_EXPORT +#else +# define CALENLAUNCHER_EXPORT Q_DECL_IMPORT +#endif +class CALENLAUNCHER_EXPORT CalenLauncher : public QObject +{ +Q_OBJECT + +public: + enum CalenView{ + MonthView = 0, + DayView + }; + CalenLauncher(QObject* parent = 0); + ~CalenLauncher(); + + void launchCalendarApp(CalenView view, QDateTime& dateTime, + bool synchronousLaunch = true); + +signals: + void calendarLaunchFailed(int error); + +public slots: + void handleError(int error); +}; + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/calendar_launcher_api/tsrc/tsrc.pro --- a/organizer_plat/calendar_launcher_api/tsrc/tsrc.pro Mon May 03 12:30:32 2010 +0300 +++ b/organizer_plat/calendar_launcher_api/tsrc/tsrc.pro Mon Jun 28 15:22:02 2010 +0530 @@ -19,9 +19,4 @@ SUBDIRS += unittest_calenlauncher CONFIG += ordered -symbian: { - BLD_INF_RULES.prj_exports += \ - "./rom/unit_calenlauncher.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unit_calenlauncher.iby)" -} - # End of file --Don't remove this diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/calendar_launcher_api/tsrc/unittest_calenlauncher/src/unittest_calenlauncher.cpp --- a/organizer_plat/calendar_launcher_api/tsrc/unittest_calenlauncher/src/unittest_calenlauncher.cpp Mon May 03 12:30:32 2010 +0300 +++ b/organizer_plat/calendar_launcher_api/tsrc/unittest_calenlauncher/src/unittest_calenlauncher.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -83,7 +83,8 @@ This slot is called on failure of calendar launch. */ void TestCalenLauncher::launcherFailed(int error) -{ +{ + Q_UNUSED(error) // Indicate launching failed. QVERIFY(true == false); } diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/calendar_launcher_api/tsrc/unittest_calenlauncher/unittest_calenlauncher.pro --- a/organizer_plat/calendar_launcher_api/tsrc/unittest_calenlauncher/unittest_calenlauncher.pro Mon May 03 12:30:32 2010 +0300 +++ b/organizer_plat/calendar_launcher_api/tsrc/unittest_calenlauncher/unittest_calenlauncher.pro Mon Jun 28 15:22:02 2010 +0530 @@ -24,13 +24,17 @@ ../../../../calendarui/calenlauncher/src \ ../../../../calendarui/calenlauncher/inc INCLUDEPATH += . -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + symbian: { TARGET.CAPABILITY = ALL -TCB TARGET.EPOCALLOWDLLDATA = 1 + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE LIBS += -lcalenlauncher + + BLD_INF_RULES.prj_testexports += \ + "../rom/unit_calenlauncher.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unit_calenlauncher.iby)" } SOURCES += unittest_calenlauncher.cpp diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/calendar_settings_keys_api/calendar_settings_keys_api.pri --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/calendar_settings_keys_api/calendar_settings_keys_api.pri Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,16 @@ +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: Project specification file for clock_settings_keys_api +# + +PUBLIC_HEADERS += calendar_settings_keys_api/inc/calendardomaincrkeys.h diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/calendar_settings_keys_api/inc/calendardomaincrkeys.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/calendar_settings_keys_api/inc/calendardomaincrkeys.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,1 @@ +/* * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" * which accompanies this distribution, and is available * at the URL "http://www.eclipse.org/legal/epl-v10.html". * * Initial Contributors: * Nokia Corporation - initial contribution. * * Contributors: * * Description: The file contains the uid of domain keys. * */ #ifndef CALENDARDOMAINCRKEYS_H #define CALENDARDOMAINCRKEYS_H /** Calendar UI Settings keys*/ /** Provides access to the Calendar application's settings keys */ const long int KCRUidCalendar = { 0x101F874B }; /** * Defines the time between alarm snoozes, in minutes. * Default value: 5 **/ const long int KCalendarSnoozeTime = 0x00000001; /** * Default Calendar alarm sound file. * Default value : "z:\data\sounds\digital\alarm.aac" **/ const long int KCalendarDefaultSoundFile = 0x00000003; #endif // CALENDARDOMAINCRKEYS_H // End of file --Don't remove this. \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/clock_settings_keys_api/clock_settings_keys_api.pri --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/clock_settings_keys_api/clock_settings_keys_api.pri Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,16 @@ +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: Project specification file for clock_settings_keys_api +# + +PUBLIC_HEADERS += clock_settings_keys_api/inc/clockdomaincrkeys.h diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/clock_settings_keys_api/inc/clockdomaincrkeys.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/clock_settings_keys_api/inc/clockdomaincrkeys.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,1 @@ +/* * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of "Eclipse Public License v1.0" * which accompanies this distribution, and is available * at the URL "http://www.eclipse.org/legal/epl-v10.html". * * Initial Contributors: * Nokia Corporation - initial contribution. * * Contributors: * * Description: The file contains the uid of domain keys. * */ #ifndef CLOCKDOMAINCRKEYS_H #define CLOCKDOMAINCRKEYS_H /**Clock Settings keys*/ /**Provides access to the ClockSettings keys*/ const long int KCRUidClockApp = { 0x101F874D }; /**Default clock alarm sound file*/ const long int KClockAppDefaultSoundFile = 0x00000000; /** Alarm snooze time key */ const long int KClockAppSnoozeTime = 0x00000001; #endif // CLOCKDOMAINCRKEYS_H // End of file --Don't remove this. \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/clock_settingsview_plugin_api/clock_settingsview_plugin_api.pri --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/clock_settingsview_plugin_api/clock_settingsview_plugin_api.pri Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,17 @@ +# Copyright (c) 2005-2010 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: Project specification file for clock_settingsview_plugin_api +# + +PUBLIC_HEADERS += clock_settingsview_plugin_api/inc/clocksettingsviewinterface.h +PUBLIC_HEADERS += clock_settingsview_plugin_api/inc/ClockSettingsViewInterface \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/clock_settingsview_plugin_api/inc/ClockSettingsViewInterface --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/clock_settingsview_plugin_api/inc/ClockSettingsViewInterface Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,1 @@ +#include \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/clock_settingsview_plugin_api/inc/clocksettingsviewinterface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/clock_settingsview_plugin_api/inc/clocksettingsviewinterface.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,56 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Header file for clock settings view Interface +* +*/ + +#ifndef CLOCKSETTINGSVIEWINTERFACE_H +#define CLOCKSETTINGSVIEWINTERFACE_H + +// System includes +#include + +/*! + \class ClockSettingsViewInterface + + \brief The class ClockSettingsViewInterface is an interface for the plugin to show clock settings view + */ + + +#define CLOCK_SETTINGSVIEW_PLUGIN_PATH QString("z:/resource/qt/plugins/clock") +#define CLOCK_SETTINGSVIEW_PLUGIN_NAME QString("clocksettingsviewplugin.qtplugin") + +class ClockSettingsViewInterface +{ + +public: + + /*! + Destructor + */ + virtual ~ClockSettingsViewInterface() {} + + /*! + To launch the Clock Regional Settings View + */ + virtual void launchRegionalSettingsView() = 0; + +}; + +Q_DECLARE_INTERFACE(ClockSettingsViewInterface, + "org.nokia.clock.ClockSettingsViewInterface/1.0") + +#endif // CLOCKSETTINGSVIEWINTERFACE_H + +// End of file diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/clock_settingsview_plugin_api/tsrc/rom/unit_clocksettingsviewplugin.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/clock_settingsview_plugin_api/tsrc/rom/unit_clocksettingsviewplugin.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,29 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* The iby file for clock settingsview plugin unit tests. +* +*/ + +#ifndef UNIT_CLOCKSETTINGSVIEWPLUGIN_IBY +#define UNIT_CLOCKSETTINGSVIEWPLUGIN_IBY + +S60_APP_EXE(utclocksettingsviewplugin) +S60_APP_RESOURCE(utclocksettingsviewplugin) + +data=DATAZ_\private\10003a3f\import\apps\utclocksettingsviewplugin_reg.rsc \private\10003a3f\import\apps\utclocksettingsviewplugin_reg.rsc + +#endif // UNIT_CLOCKSETTINGSVIEWPLUGIN_IBY + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/clock_settingsview_plugin_api/tsrc/unittest_clocksettingsviewplugin/inc/unittest_clocksettingsviewplugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/clock_settingsview_plugin_api/tsrc/unittest_clocksettingsviewplugin/inc/unittest_clocksettingsviewplugin.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,43 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Declaration of the class TestClockSettingsViewPlugin. +* +*/ + +#ifndef UNITTEST_CLOCKSETTINGSVIEWPLUGIN_H +#define UNITTEST_CLOCKSETTINGSVIEWPLUGIN_H + +// System includes +#include + +class TestClockSettingsViewPlugin : public QObject +{ + Q_OBJECT + +public: + TestClockSettingsViewPlugin(); + virtual ~TestClockSettingsViewPlugin(); + +private slots: + // Test case setup. + void init(); + void cleanup(); + + // Test cases go here. + void testPluginLoadUnLoad(); +}; + +#endif // UNITTEST_CLOCKSETTINGSVIEWPLUGIN_H + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/clock_settingsview_plugin_api/tsrc/unittest_clocksettingsviewplugin/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/clock_settingsview_plugin_api/tsrc/unittest_clocksettingsviewplugin/src/main.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,44 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +// System includes +#include +#include + +// User includes +#include "unittest_clocksettingsviewplugin.h" + +int main(int argc, char *argv[]) +{ + HbApplication app(argc, argv); + TestClockSettingsViewPlugin tc; + + char *inParam[3]; + inParam[0] = argv[0]; + inParam[1] = "-o"; + inParam[2] = "c:\\data\\TestClockSettingsViewPlugin.txt"; + + int ret = QTest::qExec(&tc, 3, inParam); + // Core dump if HbIconLoader instance is not destroyed before the + // application instance. HbIconLoader uses QCoreApplication::aboutToQuit() + // signal to destroy itself. app.exec() where the signal is normally emitted + // is not called here. So, invoking the signal explicitly. + QMetaObject::invokeMethod(&app, "aboutToQuit", Qt::DirectConnection); + return ret; +} + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/clock_settingsview_plugin_api/tsrc/unittest_clocksettingsviewplugin/src/unittest_clocksettingsviewplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/clock_settingsview_plugin_api/tsrc/unittest_clocksettingsviewplugin/src/unittest_clocksettingsviewplugin.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,89 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Definition file for class TestClockSettingsViewPlugin. +* +*/ + +// System include +#include +#include + +// User includes +#include "unittest_clocksettingsviewplugin.h" + + +/*! + \class TestClockSettingsViewPlugin + + Unit test class for Clock settings view Plugin apis + */ + + +/*! + Constructor + */ + +TestClockSettingsViewPlugin::TestClockSettingsViewPlugin() +{ +} + +/*! + Destructor + */ +TestClockSettingsViewPlugin::~TestClockSettingsViewPlugin() +{ +} + +/*! + Initialise before calling the test case + */ +void TestClockSettingsViewPlugin::init() +{ +} + +/*! + Do cleanup after each test case + */ +void TestClockSettingsViewPlugin::cleanup() +{ +} + +/*! + Test the api of clock setting plugin + */ + +void TestClockSettingsViewPlugin::testPluginLoadUnLoad() +{ + QDir dir(CLOCK_SETTINGSVIEW_PLUGIN_PATH); + QString pluginName = dir.absoluteFilePath(CLOCK_SETTINGSVIEW_PLUGIN_NAME); + + // Create Clock setting view object + QPluginLoader *pluginLoader = new QPluginLoader(pluginName); + + // Load the plugin + QVERIFY(pluginLoader->load()); + + QObject *plugin = qobject_cast (pluginLoader->instance()); + + ClockSettingsViewInterface* interface = + qobject_cast(plugin); + + QVERIFY(interface); + + // Unload the plugin + QVERIFY(pluginLoader->unload()); + delete pluginLoader; +} + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/clock_settingsview_plugin_api/tsrc/unittest_clocksettingsviewplugin/unittest_clocksettingsviewplugin.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/clock_settingsview_plugin_api/tsrc/unittest_clocksettingsviewplugin/unittest_clocksettingsviewplugin.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,52 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# Project specification file for clocksettings view plugin unit test. +# + +TEMPLATE = app +TARGET = utclocksettingsviewplugin +CONFIG += \ + qtestlib \ + symbian_test \ + hb + +DEPENDPATH += \ + . \ + ./inc \ + ./src + +INCLUDEPATH += . + + +symbian: { + TARGET.CAPABILITY = ALL -TCB + TARGET.EPOCALLOWDLLDATA = 1 + TARGET.UID3 = 0x2003157D + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + BLD_INF_RULES.prj_testexports += \ + "../rom/unit_clocksettingsviewplugin.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unit_clocksettingsviewplugin.iby)" +} + + + +SOURCES += \ + unittest_clocksettingsviewplugin.cpp \ + main.cpp + +HEADERS += \ + unittest_clocksettingsviewplugin.h + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/notes_editor_api/inc/NotesEditor --- a/organizer_plat/notes_editor_api/inc/NotesEditor Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -#include \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/notes_editor_api/inc/NotesEditorInterface --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/notes_editor_api/inc/NotesEditorInterface Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,1 @@ +#include \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/notes_editor_api/inc/noteseditor.h --- a/organizer_plat/notes_editor_api/inc/noteseditor.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* The header file for NotesEditor class. -* -*/ - -#ifndef NOTESEDITOR_H -#define NOTESEDITOR_H - -// System includes -#include -#include - -// Forward declarations -class QFile; -class QString; -class AgendaUtil; -class AgendaEntry; -class NotesEditorPrivate; - -#ifdef NOTESEDITOR_LIB -# define NOTESEDITOR_EXPORT Q_DECL_EXPORT -#else -# define NOTESEDITOR_EXPORT Q_DECL_IMPORT -#endif - -class NOTESEDITOR_EXPORT NotesEditor : public QObject -{ - Q_OBJECT - -public: - enum CreateType{ - CreateNote = 0, - CreateTodo, - CreateTypeUnKnown = -1 - }; - enum CloseType{ - CloseWithSave = 0, - CloseWithoutSave, - CloseTypeUnKnown = -1 - }; - - explicit NotesEditor(QObject *parent = 0); - explicit NotesEditor(AgendaUtil *agendaUtil, QObject *parent = 0); - virtual ~NotesEditor(); - -public: - void edit(const QString &string); - void edit(const QFile &handle); - void edit(AgendaEntry entry); - void edit(ulong id); - void create(CreateType type); - ulong close(CloseType type); - -signals: - void editingCompleted(bool status = true); - -private: - NotesEditorPrivate *d_ptr; - Q_DECLARE_PRIVATE_D(d_ptr, NotesEditor) - Q_DISABLE_COPY(NotesEditor) -}; - -#endif // NOTESEDITOR_H - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/notes_editor_api/inc/noteseditorinterface.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/notes_editor_api/inc/noteseditorinterface.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,71 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* The header file for Notes Editor Plugin Interface. +* +*/ + +#ifndef NOTESEDITORINTERFACE_H +#define NOTESEDITORINTERFACE_H + +// System includes +#include +#include +#include + +// Forward declarations +class QFile; +class QString; +class AgendaUtil; +class AgendaEntry; + +#define NOTES_EDITOR_PLUGIN_PATH QString("z:/resource/qt/plugins/notes") +#define NOTES_EDITOR_PLUGIN_NAME QString("noteseditorplugin.qtplugin") + +class NotesEditorInterface : public QObject +{ + Q_OBJECT + +public: + enum CreateType{ + CreateNote = 0, + CreateTodo, + CreateTypeUnKnown = -1 + }; + enum CloseType{ + CloseWithSave = 0, + CloseWithoutSave, + CloseTypeUnKnown = -1 + }; + + virtual ~NotesEditorInterface(){} + +public: + virtual void edit(const QString &string, AgendaUtil *agendaUtil=0) = 0; + virtual void edit(const QFile &handle, AgendaUtil *agendaUtil=0) = 0; + virtual void edit(AgendaEntry entry, AgendaUtil *agendaUtil=0) = 0; + virtual void edit(ulong id, AgendaUtil *agendaUtil=0) = 0; + virtual void create(CreateType type, AgendaUtil *agendaUtil=0) = 0; + virtual ulong close(CloseType type, AgendaUtil *agendaUtil=0) = 0; + +signals: + void editingCompleted(bool status = true); +}; + +Q_DECLARE_INTERFACE(NotesEditorInterface, + "org.nokia.notes.NotesEditorInterface/1.0") + +#endif // NOTESEDITORINTERFACE_H + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/notes_editor_api/notes_editor_api.pri --- a/organizer_plat/notes_editor_api/notes_editor_api.pri Mon May 03 12:30:32 2010 +0300 +++ b/organizer_plat/notes_editor_api/notes_editor_api.pri Mon Jun 28 15:22:02 2010 +0530 @@ -13,5 +13,5 @@ # Description: Project specification file for notes_editor_api # -PUBLIC_HEADERS += notes_editor_api/inc/noteseditor.h -PUBLIC_HEADERS += notes_editor_api/inc/NotesEditor \ No newline at end of file +PUBLIC_HEADERS += notes_editor_api/inc/noteseditorinterface.h +PUBLIC_HEADERS += notes_editor_api/inc/NotesEditorInterface \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/notes_editor_api/tsrc/rom/unit_noteseditor.iby --- a/organizer_plat/notes_editor_api/tsrc/rom/unit_noteseditor.iby Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* The iby file for noteseditor unit tests. -* -*/ - -#ifndef UNIT_NOTESEDITOR_IBY -#define UNIT_NOTESEDITOR_IBY - -S60_APP_EXE(utnoteseditor) -S60_APP_RESOURCE(utnoteseditor) - -data=DATAZ_\private\10003a3f\import\apps\utnoteseditor_reg.rsc \private\10003a3f\import\apps\utnoteseditor_reg.rsc - -#endif // UNIT_NOTESEDITOR_IBY - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/notes_editor_api/tsrc/rom/unit_noteseditorplugin.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/notes_editor_api/tsrc/rom/unit_noteseditorplugin.iby Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,29 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* The iby file for noteseditor plugin unit tests. +* +*/ + +#ifndef UNIT_NOTESEDITORPLUGIN_IBY +#define UNIT_NOTESEDITORPLUGIN_IBY + +S60_APP_EXE(utnoteseditorplugin) +S60_APP_RESOURCE(utnoteseditorplugin) + +data=DATAZ_\private\10003a3f\import\apps\utnoteseditorplugin_reg.rsc \private\10003a3f\import\apps\utnoteseditorplugin_reg.rsc + +#endif // UNIT_NOTESEDITORPLUGIN_IBY + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/notes_editor_api/tsrc/unittest_noteseditor/inc/unittest_noteseditor.h --- a/organizer_plat/notes_editor_api/tsrc/unittest_noteseditor/inc/unittest_noteseditor.h Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* -*/ - -#ifndef UNITTEST_NOTESEDITOR_H -#define UNITTEST_NOTESEDITOR_H - -// System includes -#include - -// Forward declarations. -class NotesEditor; - -class TestNotesEditor : public QObject -{ - Q_OBJECT - -public: - TestNotesEditor(); - virtual ~TestNotesEditor(); - -private slots: - // Test case setup. - void init(); - void cleanup(); - - // Test cases go here. - void testConstructionWithoutAgendaUtil(); - void testConstructionWithAgendaUtil(); - void testDestruction(); - void testEditingNoteWithText(); - void testEditingNoteWithFileHandle(); - void testEditingNoteWithAgendaEntry(); - void testEditingNoteWithId(); - void testEditingTodoWithFileHandle(); - void testEditingTodoWithAgendaEntry(); - void testEditingTodoWithId(); - void testCreationOfNote(); - void testCreationofTodo(); - void testClosingOfNotesEditorWithSave(); - void testClosingOfNotesEditorWithoutSave(); - void testClosingOfTodoEditorWithSave(); - void testClosingOfTodoEditorWithoutSave(); - -private: - NotesEditor *mEditor; -}; - -#endif // UNITTEST_NOTESEDITOR_H - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/notes_editor_api/tsrc/unittest_noteseditor/src/main.cpp --- a/organizer_plat/notes_editor_api/tsrc/unittest_noteseditor/src/main.cpp Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,38 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* -*/ - -// System includes -#include -#include - -// User includes -#include "unittest_noteseditor.h" - -int main(int argc, char *argv[]) -{ - HbApplication app(argc, argv); - TestNotesEditor tc; - int ret = QTest::qExec(&tc, argc, argv); - // Core dump if HbIconLoader instance is not destroyed before the - // application instance. HbIconLoader uses QCoreApplication::aboutToQuit() - // signal to destroy itself. app.exec() where the signal is normally emitted - // is not called here. So, invoking the signal explicitly. - QMetaObject::invokeMethod(&app, "aboutToQuit", Qt::DirectConnection); - return ret; -} - -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/notes_editor_api/tsrc/unittest_noteseditor/src/unittest_noteseditor.cpp --- a/organizer_plat/notes_editor_api/tsrc/unittest_noteseditor/src/unittest_noteseditor.cpp Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,511 +0,0 @@ -/* -* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: -* -*/ - -// System include -#include -#include -#include -#include -#include - -// User includes -#include "unittest_noteseditor.h" - - -/*! - \class TestNotesEditor - - Unit test clas for Notes Editor apis - */ - - -/*! - Constructor - */ - -TestNotesEditor::TestNotesEditor() -{ - -} - -/*! - Destructor - */ -TestNotesEditor::~TestNotesEditor() -{ -} - -/*! - Initialise before calling the test case - */ -void TestNotesEditor::init() -{ -} - -/*! - Do cleanup after each test case - */ -void TestNotesEditor::cleanup() -{ -} - -/*! - Test the api NotesEditor::NotesEditor() - */ - -void TestNotesEditor::testConstructionWithoutAgendaUtil() -{ - // Create NotesEditor object - NotesEditor *notesEditor = new NotesEditor(this); - QVERIFY(notesEditor!=0); - - // Cleanup - delete notesEditor; -} - -/*! - Test the api NotesEditor::NotesEditor() - */ -void TestNotesEditor::testConstructionWithAgendaUtil() -{ - // Create AgendaUtil object. - AgendaUtil *agendaUtil = new AgendaUtil(); - QVERIFY(agendaUtil); - - // Create NotesEditor object. - NotesEditor *notesEditor = new NotesEditor(agendaUtil); - - QVERIFY(notesEditor!=0); - - // Cleanup. - delete notesEditor; - delete agendaUtil; -} - -/*! - Test the api NotesEditor::~NotesEditor - */ -void TestNotesEditor::testDestruction() -{ - // Create NotesEditor object. - QPointer notesEditor = new NotesEditor(); - delete notesEditor; - - QVERIFY(!notesEditor); - - // Create AgendaUtil object. - QPointer agendaUtil = new AgendaUtil(); - QPointer notesEditorWithAgendaUtil = - new NotesEditor(agendaUtil); - - delete notesEditorWithAgendaUtil; - delete agendaUtil; - - QVERIFY(!notesEditorWithAgendaUtil); -} - -/*! - Test the api NotesEditor::edit(const QString &string) - */ -void TestNotesEditor::testEditingNoteWithText() -{ - HbMainWindow window; - window.show(); - // Create NotesEditor object. - NotesEditor *notesEditor = new NotesEditor(this); - QVERIFY(notesEditor); - - QString noteText("This is test note"); - // Call edit using the text. - notesEditor->edit(QString("This is test note")); - - QTest::qWait(1000); - - // Call close on editor by saving the note - ulong id = notesEditor->close(NotesEditor::CloseWithSave); - QVERIFY(id); - - // Create agenda Utility. - AgendaUtil *agendaUtil = new AgendaUtil(); - QVERIFY(agendaUtil); - - // Fetch the entry using the id - AgendaEntry entry = agendaUtil->fetchById(id); - - int compareResult = noteText.compare(entry.description()); - QVERIFY(!compareResult); - - delete agendaUtil; - delete notesEditor; -} - -/*! - Test the api NotesEditor::edit(const QFile &handle) - */ -void TestNotesEditor::testEditingNoteWithFileHandle() -{ - // Nothing yet -} - -/*! - Test the api NotesEditor::edit(AgendaEntry entry) - */ -void TestNotesEditor::testEditingNoteWithAgendaEntry() -{ - HbMainWindow window; - window.show(); - - NotesEditor *notesEditor = new NotesEditor(); - QVERIFY(notesEditor); - - AgendaEntry entry; - entry.setType(AgendaEntry::TypeNote); - entry.setDescription(QString("A simple note")); - - // Call edit on agenda entry - notesEditor->edit(entry); - - QTest::qWait(1000); - - ulong id = notesEditor->close(NotesEditor::CloseWithSave); - - AgendaUtil *agendaUtil = new AgendaUtil(); - QVERIFY(agendaUtil); - - AgendaEntry afterSave = agendaUtil->fetchById(id); - QCOMPARE(afterSave.description(), entry.description()); - - delete agendaUtil; - delete notesEditor; -} - -/*! - Test the api NotesEditor::edit(ulong id) - */ -void TestNotesEditor::testEditingNoteWithId() -{ - HbMainWindow window; - window.show(); - - NotesEditor *notesEditor = new NotesEditor(); - QVERIFY(notesEditor); - - AgendaUtil *agendaUtil = new AgendaUtil(); - QVERIFY(agendaUtil); - - AgendaEntry entry; - entry.setType(AgendaEntry::TypeNote); - entry.setDescription("A simple note"); - - ulong id = agendaUtil->addEntry(entry); - - notesEditor->edit(id); - - QTest::qWait(1000); - - ulong savedId = notesEditor->close(NotesEditor::CloseWithSave); - - AgendaEntry afterSave = agendaUtil->fetchById(id); - QCOMPARE(afterSave.description(), entry.description()); - - delete agendaUtil; - delete notesEditor; - -} - - -/*! - Test the api NotesEditor::edit(const QFile &handle) - */ -void TestNotesEditor::testEditingTodoWithFileHandle() -{ - // Nothing yet. -} - -/*! - Test the api NotesEditor::edit(AgendaEntry entry) - */ -void TestNotesEditor::testEditingTodoWithAgendaEntry() -{ - HbMainWindow window; - window.show(); - - NotesEditor *notesEditor = new NotesEditor(); - QVERIFY(notesEditor); - - AgendaUtil *agendaUtil = new AgendaUtil(); - QVERIFY(agendaUtil); - - // Create a agenda entry with type to-do - AgendaEntry entry; - entry.setType(AgendaEntry::TypeTodo); - entry.setSummary(QString("Buy Books")); - entry.setDescription(QString("@Landmarks")); - entry.setStartAndEndTime( - QDateTime::currentDateTime(),QDateTime::currentDateTime()); - entry.setStatus(AgendaEntry::TodoNeedsAction); - entry.setPriority(2); - - ulong id = agendaUtil->addEntry(entry); - - // Call edit on agenda entry - notesEditor->edit(entry); - - QTest::qWait(3000); - - ulong afterSaveId = notesEditor->close(NotesEditor::CloseWithSave); - - AgendaEntry afterSave = agendaUtil->fetchById(id); - QCOMPARE(afterSave.id(),id); - QCOMPARE(afterSave.type(),entry.type()); - QCOMPARE(afterSave.summary(), entry.summary()); - QCOMPARE(afterSave.description(), entry.description()); - - delete agendaUtil; - delete notesEditor; -} - -/*! - Test the api NotesEditor::edit(ulong id) - */ -void TestNotesEditor::testEditingTodoWithId() -{ - HbMainWindow window; - window.show(); - - NotesEditor *notesEditor = new NotesEditor(); - QVERIFY(notesEditor); - - AgendaUtil *agendaUtil = new AgendaUtil(); - QVERIFY(agendaUtil); - - // Create a agenda entry with type to-do - AgendaEntry entry; - entry.setType(AgendaEntry::TypeTodo); - entry.setSummary(QString("Buy Books")); - entry.setDescription(QString("@Landmarks")); - entry.setStartAndEndTime( - QDateTime::currentDateTime(),QDateTime::currentDateTime()); - entry.setStatus(AgendaEntry::TodoNeedsAction); - entry.setPriority(2); - - ulong id = agendaUtil->addEntry(entry); - - // Call edit using the id - notesEditor->edit(id); - - QTest::qWait(3000); - - ulong afterSaveId = notesEditor->close(NotesEditor::CloseWithSave); - - AgendaEntry afterSave = agendaUtil->fetchById(id); - QCOMPARE(afterSave.id(),id); - QCOMPARE(afterSave.type(),entry.type()); - QCOMPARE(afterSave.summary(), entry.summary()); - QCOMPARE(afterSave.description(), entry.description()); - - delete agendaUtil; - delete notesEditor; - -} - -/*! - Test the api NotesEditor::create(CreateType type) - */ -void TestNotesEditor::testCreationOfNote() -{ - HbMainWindow window; - window.show(); - - NotesEditor *notesEditor = new NotesEditor(); - QVERIFY(notesEditor); - - notesEditor->create(NotesEditor::CreateNote); - - QTest::qWait(3000); - - ulong afterSaveId = notesEditor->close(NotesEditor::CloseWithSave); - - // Note is not saved since description is empty - // TODO use key press events here - - QVERIFY(!afterSaveId); - - delete notesEditor; -} - -/*! - Test the api NotesEditor::create(CreateType type) - */ -void TestNotesEditor::testCreationofTodo() -{ - HbMainWindow window; - window.show(); - - NotesEditor *notesEditor = new NotesEditor(); - QVERIFY(notesEditor); - - notesEditor->create(NotesEditor::CreateTodo); - - // TODO - // Needs key interaction to edit the fields in to-do editor. - - QTest::qWait(3000); - - delete notesEditor; -} - -/*! - Test the api NotesEditor::close(CloseType type); - */ - -void TestNotesEditor::testClosingOfNotesEditorWithSave() -{ - HbMainWindow window; - window.show(); - // Create NotesEditor object. - NotesEditor *notesEditor = new NotesEditor(this); - QVERIFY(notesEditor); - - QString noteText("This is test note"); - // Call edit using the text. - notesEditor->edit(QString("This is test note")); - - QTest::qWait(1000); - - // Call close on editor by saving the note - ulong id = notesEditor->close(NotesEditor::CloseWithSave); - QVERIFY(id); - - // Create agenda Utility. - AgendaUtil *agendaUtil = new AgendaUtil(); - QVERIFY(agendaUtil); - - // Fetch the entry using the id - AgendaEntry entry = agendaUtil->fetchById(id); - - QCOMPARE(noteText,entry.description()); - - delete agendaUtil; - delete notesEditor; -} - -/*! - Test the api NotesEditor::close(CloseType type); - */ -void TestNotesEditor::testClosingOfNotesEditorWithoutSave() -{ - HbMainWindow window; - window.show(); - // Create NotesEditor object. - NotesEditor *notesEditor = new NotesEditor(this); - QVERIFY(notesEditor); - - QString noteText("This is test note"); - // Call edit using the text. - notesEditor->edit(QString("This is test note")); - - QTest::qWait(1000); - - // Call close on editor by saving the note - ulong id = notesEditor->close(NotesEditor::CloseWithoutSave); - QVERIFY(!id); - - delete notesEditor; -} - -/*! - Test the api NotesEditor::close(CloseType type); - */ -void TestNotesEditor::testClosingOfTodoEditorWithSave() -{ - HbMainWindow window; - window.show(); - - NotesEditor *notesEditor = new NotesEditor(); - QVERIFY(notesEditor); - - AgendaUtil *agendaUtil = new AgendaUtil(); - QVERIFY(agendaUtil); - - // Create a agenda entry with type to-do - AgendaEntry entry; - entry.setType(AgendaEntry::TypeTodo); - entry.setSummary(QString("Buy Books")); - entry.setDescription(QString("@Landmarks")); - entry.setStartAndEndTime( - QDateTime::currentDateTime(),QDateTime::currentDateTime()); - entry.setStatus(AgendaEntry::TodoNeedsAction); - entry.setPriority(2); - - ulong id = agendaUtil->addEntry(entry); - - // Call edit on agenda entry - notesEditor->edit(entry); - - QTest::qWait(3000); - - ulong afterSaveId = notesEditor->close(NotesEditor::CloseWithSave); - - AgendaEntry afterSave = agendaUtil->fetchById(id); - QCOMPARE(afterSave.id(),id); - QCOMPARE(afterSave.type(),entry.type()); - QCOMPARE(afterSave.summary(), entry.summary()); - QCOMPARE(afterSave.description(), entry.description()); - - delete agendaUtil; - delete notesEditor; -} - -/*! - Test the api NotesEditor::close(CloseType type); - */ -void TestNotesEditor::testClosingOfTodoEditorWithoutSave() -{ - HbMainWindow window; - window.show(); - - NotesEditor *notesEditor = new NotesEditor(); - QVERIFY(notesEditor); - - AgendaUtil *agendaUtil = new AgendaUtil(); - QVERIFY(agendaUtil); - - // Create a agenda entry with type to-do - AgendaEntry entry; - entry.setType(AgendaEntry::TypeTodo); - entry.setSummary(QString("Buy Books")); - entry.setDescription(QString("@Landmarks")); - entry.setStartAndEndTime( - QDateTime::currentDateTime(),QDateTime::currentDateTime()); - entry.setStatus(AgendaEntry::TodoNeedsAction); - entry.setPriority(2); - - ulong id = agendaUtil->addEntry(entry); - - // Call edit on agenda entry - notesEditor->edit(entry); - - QTest::qWait(3000); - - ulong afterSaveId = notesEditor->close(NotesEditor::CloseWithoutSave); - QVERIFY(!afterSaveId); - - delete agendaUtil; - delete notesEditor; -} -// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/notes_editor_api/tsrc/unittest_noteseditor/unittest_noteseditor.pkg --- a/organizer_plat/notes_editor_api/tsrc/unittest_noteseditor/unittest_noteseditor.pkg Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -; -; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -; All rights reserved. -; This component and the accompanying materials are made available -; under the terms of "Eclipse Public License v1.0" -; which accompanies this distribution, and is available -; at the URL "http://www.eclipse.org/legal/epl-v10.html". -; -; Initial Contributors: -; Nokia Corporation - initial contribution. -; -; Contributors: -; -; Description: Pkg file for the unitest_noteseditor component. -; - - -; Language -&EN - -; SIS header: name, uid, version -#{"utnoteseditor"}, (0xEc226a1e), 1, 0, 0 - -; Localised Vendor name -%{"Nokia"} - -; Unique Vendor name -:"Nokia" - -; Executable and default resource files -"/epoc32/release/armv5/urel/utnoteseditor.exe" - "!:\sys\bin\utnoteseditor.exe" -"/epoc32/data/z/resource/apps/utnoteseditor.rsc" - "!:\resource\apps\utnoteseditor.rsc" -"/epoc32/data/z/private/10003a3f/import/apps/utnoteseditor_reg.rsc" - "!:\private\10003a3f\import\apps\utnoteseditor_reg.rsc" - -; End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/notes_editor_api/tsrc/unittest_noteseditor/unittest_noteseditor.pro --- a/organizer_plat/notes_editor_api/tsrc/unittest_noteseditor/unittest_noteseditor.pro Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,48 +0,0 @@ -# -# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -# All rights reserved. -# This component and the accompanying materials are made available -# under the terms of "Eclipse Public License v1.0" -# which accompanies this distribution, and is available -# at the URL "http://www.eclipse.org/legal/epl-v10.html". -# -# Initial Contributors: -# Nokia Corporation - initial contribution. -# -# Contributors: -# -# Description: -# Project specification file for noteseditor unit test. -# - -TEMPLATE = app -TARGET = utnoteseditor -CONFIG += \ - qtestlib \ - symbian_test \ - hb - -DEPENDPATH += \ - . \ - ./src - -INCLUDEPATH += . -INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE - -symbian: { - TARGET.CAPABILITY = ALL -TCB - TARGET.EPOCALLOWDLLDATA = 1 - - LIBS += \ - -lnoteseditor \ - -lagendainterface -} - -SOURCES += \ - unittest_noteseditor.cpp \ - main.cpp - -HEADERS += \ - ./inc/unittest_noteseditor.h - -# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/notes_editor_api/tsrc/unittest_noteseditorplugin/inc/unittest_noteseditorplugin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/notes_editor_api/tsrc/unittest_noteseditorplugin/inc/unittest_noteseditorplugin.h Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,58 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Declaration of the class TestNotesEditorPlugin. +* +*/ + +#ifndef UNITTEST_NOTESEDITORPLUGIN_H +#define UNITTEST_NOTESEDITORPLUGIN_H + +// System includes +#include + +class TestNotesEditorPlugin : public QObject +{ + Q_OBJECT + +public: + TestNotesEditorPlugin(); + virtual ~TestNotesEditorPlugin(); + +private slots: + // Test case setup. + void init(); + void cleanup(); + + // Test cases go here. + void testPluginLoadUnLoad(); + void testEditingNoteWithText(); + void testEditingNoteWithFileHandle(); + void testEditingNoteWithAgendaEntry(); + void testEditingNoteWithId(); + void testEditingTodoWithFileHandle(); + void testEditingTodoWithAgendaEntry(); + void testEditingTodoWithId(); + void testCreationOfNote(); + void testCreationofTodo(); + void testClosingOfNotesEditorWithSave(); + void testClosingOfNotesEditorWithoutSave(); + void testClosingOfTodoEditorWithSave(); + void testClosingOfTodoEditorWithoutSave(); + void testAgendaUtilEditingNoteWithText(); + void testAgendaUtilEditingTodoWithId(); +}; + +#endif // UNITTEST_NOTESEDITORPLUGIN_H + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/notes_editor_api/tsrc/unittest_noteseditorplugin/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/notes_editor_api/tsrc/unittest_noteseditorplugin/src/main.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,38 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +// System includes +#include +#include + +// User includes +#include "unittest_noteseditorplugin.h" + +int main(int argc, char *argv[]) +{ + HbApplication app(argc, argv); + TestNotesEditorPlugin tc; + int ret = QTest::qExec(&tc, argc, argv); + // Core dump if HbIconLoader instance is not destroyed before the + // application instance. HbIconLoader uses QCoreApplication::aboutToQuit() + // signal to destroy itself. app.exec() where the signal is normally emitted + // is not called here. So, invoking the signal explicitly. + QMetaObject::invokeMethod(&app, "aboutToQuit", Qt::DirectConnection); + return ret; +} + +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/notes_editor_api/tsrc/unittest_noteseditorplugin/src/unittest_noteseditorplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/notes_editor_api/tsrc/unittest_noteseditorplugin/src/unittest_noteseditorplugin.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,782 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + +// System include +#include +#include +#include +#include +#include + +// User includes +#include "unittest_noteseditorplugin.h" + + +/*! + \class TestNotesEditorPlugin + + Unit test clas for Notes Editor Plugin apis + */ + + +/*! + Constructor + */ + +TestNotesEditorPlugin::TestNotesEditorPlugin() +{ +} + +/*! + Destructor + */ +TestNotesEditorPlugin::~TestNotesEditorPlugin() +{ +} + +/*! + Initialise before calling the test case + */ +void TestNotesEditorPlugin::init() +{ +} + +/*! + Do cleanup after each test case + */ +void TestNotesEditorPlugin::cleanup() +{ +} + +/*! + Test the api NotesEditor::NotesEditor() + */ + +void TestNotesEditorPlugin::testPluginLoadUnLoad() +{ + QDir dir(NOTES_EDITOR_PLUGIN_PATH); + QString pluginName = dir.absoluteFilePath(NOTES_EDITOR_PLUGIN_NAME); + + // Create NotesEditor object + QPluginLoader *pluginLoader = new QPluginLoader(pluginName); + + // Load the plugin + QVERIFY(pluginLoader->load()); + + QObject *plugin = qobject_cast (pluginLoader->instance()); + + NotesEditorInterface* interface = + qobject_cast(plugin); + + QVERIFY(interface); + + // Unload the plugin + QVERIFY(pluginLoader->unload()); + delete pluginLoader; +} + +/*! + Test the api NotesEditorInterface::edit(const QString &string) + */ +void TestNotesEditorPlugin::testEditingNoteWithText() +{ + HbMainWindow window; + window.show(); + + QDir dir(NOTES_EDITOR_PLUGIN_PATH); + QString pluginName = dir.absoluteFilePath(NOTES_EDITOR_PLUGIN_NAME); + + // Create plugin loader. + QPluginLoader *pluginLoader = new QPluginLoader(pluginName); + + // Load the plugin. + QVERIFY(pluginLoader->load()); + + QObject *plugin = qobject_cast (pluginLoader->instance()); + NotesEditorInterface* interface = + qobject_cast(plugin); + + QString noteText("Test editing of Note by providing text(QString)"); + // Call edit using the text. + interface->edit(noteText); + + // Wait for Editor to launch. + QTest::qWait(2000); + + // Call close on editor by saving the note + ulong id = interface->close(NotesEditorInterface::CloseWithSave); + QVERIFY(id); + + // Create agenda Utility. + AgendaUtil *agendaUtil = new AgendaUtil(); + // Wait for completion of instance view/entryview creation. + QTest::qWait(1); + QVERIFY(agendaUtil); + + // Fetch the entry using the id. + AgendaEntry entry = agendaUtil->fetchById(id); + + QString entryDescription = entry.description(); + int compareResult = noteText.compare(entryDescription); + + QVERIFY(!compareResult); + + // cleanup + delete agendaUtil; + + // Unload the plugin. + QVERIFY(pluginLoader->unload()); + delete pluginLoader; +} + +/*! + Test the api NotesEditor::edit(const QFile &handle) + */ +void TestNotesEditorPlugin::testEditingNoteWithFileHandle() +{ + // Nothing yet +} + +/*! + Test the api NotesEditor::edit(AgendaEntry entry) + */ +void TestNotesEditorPlugin::testEditingNoteWithAgendaEntry() +{ + HbMainWindow window; + window.show(); + + QDir dir(NOTES_EDITOR_PLUGIN_PATH); + QString pluginName = dir.absoluteFilePath(NOTES_EDITOR_PLUGIN_NAME); + + // Create plugin loader. + QPluginLoader *pluginLoader = new QPluginLoader(pluginName); + + // Load the plugin. + QVERIFY(pluginLoader->load()); + + QObject *plugin = qobject_cast (pluginLoader->instance()); + NotesEditorInterface* interface = + qobject_cast(plugin); + + AgendaEntry entry; + entry.setType(AgendaEntry::TypeNote); + entry.setDescription(QString("Test Editing Note by providing Agenda Entry")); + + // Call edit on agenda entry + interface->edit(entry); + + // Wait for Editor to launch. + QTest::qWait(2000); + + ulong id = interface->close(NotesEditorInterface::CloseWithSave); + + AgendaUtil *agendaUtil = new AgendaUtil(); + // Wait for completion of instance view/entryview creation. + QTest::qWait(1); + QVERIFY(agendaUtil); + + // Compare the description after saving. + AgendaEntry afterSave = agendaUtil->fetchById(id); + QCOMPARE(afterSave.description(), entry.description()); + + // cleanup. + delete agendaUtil; + + // Unload the plugin. + QVERIFY(pluginLoader->unload()); + delete pluginLoader; +} + +/*! + Test the api NotesEditor::edit(ulong id) + */ +void TestNotesEditorPlugin::testEditingNoteWithId() +{ + HbMainWindow window; + window.show(); + + QDir dir(NOTES_EDITOR_PLUGIN_PATH); + QString pluginName = dir.absoluteFilePath(NOTES_EDITOR_PLUGIN_NAME); + + // Create plugin loader. + QPluginLoader *pluginLoader = new QPluginLoader(pluginName); + + // Load the plugin. + QVERIFY(pluginLoader->load()); + + QObject *plugin = qobject_cast (pluginLoader->instance()); + NotesEditorInterface* interface = + qobject_cast(plugin); + + AgendaUtil *agendaUtil = new AgendaUtil(); + // Wait for completion of instance view/entryview creation. + QTest::qWait(1); + + QVERIFY(agendaUtil); + + AgendaEntry entry; + entry.setType(AgendaEntry::TypeNote); + entry.setDescription( + QString("Test Editing of Note by providing entry local Id")); + + ulong id = agendaUtil->addEntry(entry); + + interface->edit(id); + + // Wait for Editor to launch. + QTest::qWait(1000); + + ulong savedId = interface->close(NotesEditorInterface::CloseWithSave); + + // Compare the entry after saving. Using the old entry id since + // text is not modified in the editor. Wait can be increased to allow user + // to modify the text. + AgendaEntry afterSave = agendaUtil->fetchById(id); + QCOMPARE(afterSave.description(), entry.description()); + + // cleanup. + delete agendaUtil; + + // Unload the plugin. + QVERIFY(pluginLoader->unload()); + delete pluginLoader; +} + + +/*! + Test the api NotesEditor::edit(const QFile &handle) + */ +void TestNotesEditorPlugin::testEditingTodoWithFileHandle() +{ + // Nothing yet. +} + +/*! + Test the api NotesEditor::edit(AgendaEntry entry) + */ +void TestNotesEditorPlugin::testEditingTodoWithAgendaEntry() +{ + HbMainWindow mainWindow; + mainWindow.show(); + + QDir dir(NOTES_EDITOR_PLUGIN_PATH); + QString pluginName = dir.absoluteFilePath(NOTES_EDITOR_PLUGIN_NAME); + + // Create plugin loader. + QPluginLoader *pluginLoader = new QPluginLoader(pluginName); + + // Load the plugin. + QVERIFY(pluginLoader->load()); + + QObject *plugin = qobject_cast (pluginLoader->instance()); + NotesEditorInterface* interface = + qobject_cast(plugin); + + AgendaUtil *agendaUtil = new AgendaUtil(); + // Wait for completion of instance view/entryview creation. + QTest::qWait(1); + QVERIFY(agendaUtil); + + // Create a agenda entry with type to-do + AgendaEntry entry; + entry.setType(AgendaEntry::TypeTodo); + entry.setSummary(QString("Test Editing of Todo by providing AgendaEntry")); + entry.setDescription(QString("@QTest Framework.")); + entry.setStartAndEndTime( + QDateTime::currentDateTime(),QDateTime::currentDateTime()); + entry.setStatus(AgendaEntry::TodoNeedsAction); + entry.setPriority(2); + + ulong id = agendaUtil->addEntry(entry); + + AgendaEntry storedEntry = agendaUtil->fetchById(id); + + // Call edit on agenda entry + interface->edit(storedEntry); + + // Wait for Editor to launch. + QTest::qWait(3000); + + ulong afterSaveId = interface->close(NotesEditorInterface::CloseWithSave); + + // Compare the entry after saving. + AgendaEntry afterSave = agendaUtil->fetchById(id); + QCOMPARE(afterSave.id(),id); + QCOMPARE(afterSave.type(),entry.type()); + QCOMPARE(afterSave.summary(), entry.summary()); + QCOMPARE(afterSave.description(), entry.description()); + + // cleanup. + delete agendaUtil; + + // Unload the plugin. + QVERIFY(pluginLoader->unload()); + delete pluginLoader; +} + +/*! + Test the api NotesEditor::edit(ulong id) + */ +void TestNotesEditorPlugin::testEditingTodoWithId() +{ + HbMainWindow window; + window.show(); + + QDir dir(NOTES_EDITOR_PLUGIN_PATH); + QString pluginName = dir.absoluteFilePath(NOTES_EDITOR_PLUGIN_NAME); + + // Create plugin loader. + QPluginLoader *pluginLoader = new QPluginLoader(pluginName); + + // Load the plugin. + QVERIFY(pluginLoader->load()); + + QObject *plugin = qobject_cast (pluginLoader->instance()); + NotesEditorInterface* interface = + qobject_cast(plugin); + + AgendaUtil *agendaUtil = new AgendaUtil(); + // Wait for completion of instance view/entryview creation. + QTest::qWait(1); + QVERIFY(agendaUtil); + + // Create a agenda entry with type to-do + AgendaEntry entry; + entry.setType(AgendaEntry::TypeTodo); + entry.setSummary( + QString("Test Editing of Todo by providing entry local Id")); + entry.setDescription(QString("@QTest Framework")); + entry.setStartAndEndTime( + QDateTime::currentDateTime(),QDateTime::currentDateTime()); + entry.setStatus(AgendaEntry::TodoNeedsAction); + entry.setPriority(2); + + ulong id = agendaUtil->addEntry(entry); + AgendaEntry storedEntry = agendaUtil->fetchById(id); + + // Call edit on agenda entry + interface->edit(storedEntry); + + // Wait for Editor to launch. + QTest::qWait(3000); + + ulong afterSaveId = interface->close(NotesEditorInterface::CloseWithSave); + + // Compare the entry after saving. + AgendaEntry afterSave = agendaUtil->fetchById(id); + QCOMPARE(afterSave.id(),id); + QCOMPARE(afterSave.type(),entry.type()); + QCOMPARE(afterSave.summary(), entry.summary()); + QCOMPARE(afterSave.description(), entry.description()); + + // cleanup. + delete agendaUtil; + + // Unload the plugin. + QVERIFY(pluginLoader->unload()); + delete pluginLoader; +} + +/*! + Test the api NotesEditor::create(CreateType type) + */ +void TestNotesEditorPlugin::testCreationOfNote() +{ + HbMainWindow window; + window.show(); + + QDir dir(NOTES_EDITOR_PLUGIN_PATH); + QString pluginName = dir.absoluteFilePath(NOTES_EDITOR_PLUGIN_NAME); + + // Create plugin loader. + QPluginLoader *pluginLoader = new QPluginLoader(pluginName); + + // Load the plugin. + QVERIFY(pluginLoader->load()); + + QObject *plugin = qobject_cast (pluginLoader->instance()); + NotesEditorInterface* interface = + qobject_cast(plugin); + + interface->create(NotesEditorInterface::CreateNote); + + // Wait for Editor to launch. + QTest::qWait(3000); + + ulong afterSaveId = interface->close(NotesEditorInterface::CloseWithSave); + + // Note is not saved since description is empty + // TODO use key press events here + + QVERIFY(!afterSaveId); + + // Unload the plugin. + QVERIFY(pluginLoader->unload()); + delete pluginLoader; +} + +/*! + Test the api NotesEditor::create(CreateType type) + */ +void TestNotesEditorPlugin::testCreationofTodo() +{ + HbMainWindow window; + window.show(); + + QDir dir(NOTES_EDITOR_PLUGIN_PATH); + QString pluginName = dir.absoluteFilePath(NOTES_EDITOR_PLUGIN_NAME); + + // Create plugin loader. + QPluginLoader *pluginLoader = new QPluginLoader(pluginName); + + // Load the plugin. + QVERIFY(pluginLoader->load()); + + QObject *plugin = qobject_cast (pluginLoader->instance()); + NotesEditorInterface* interface = + qobject_cast(plugin); + + interface->create(NotesEditorInterface::CreateTodo); + + // TODO + // Needs key interaction to edit the fields in to-do editor. + + // Wait for Editor to launch. + QTest::qWait(3000); + + // Unload the plugin. + QVERIFY(pluginLoader->unload()); + delete pluginLoader; +} + +/*! + Test the api NotesEditor::close(CloseType type); + */ + +void TestNotesEditorPlugin::testClosingOfNotesEditorWithSave() +{ + HbMainWindow window; + window.show(); + + QDir dir(NOTES_EDITOR_PLUGIN_PATH); + QString pluginName = dir.absoluteFilePath(NOTES_EDITOR_PLUGIN_NAME); + + // Create plugin loader. + QPluginLoader *pluginLoader = new QPluginLoader(pluginName); + + // Load the plugin. + QVERIFY(pluginLoader->load()); + + QObject *plugin = qobject_cast (pluginLoader->instance()); + NotesEditorInterface* interface = + qobject_cast(plugin); + + QString noteText("Test Closing Of NotesEditor With Save"); + // Call edit using the text. + interface->edit(noteText); + + // Wait for Editor to launch. + QTest::qWait(1000); + + // Call close on editor by saving the note + ulong id = interface->close(NotesEditorInterface::CloseWithSave); + QVERIFY(id); + + // Create agenda Utility. + AgendaUtil *agendaUtil = new AgendaUtil(); + // Wait for completion of instance view/entryview creation. + QTest::qWait(1); + QVERIFY(agendaUtil); + + // Fetch the entry using the id + AgendaEntry entry = agendaUtil->fetchById(id); + + QCOMPARE(noteText,entry.description()); + + // cleanup. + delete agendaUtil; + + // Unload the plugin. + QVERIFY(pluginLoader->unload()); + delete pluginLoader; +} + +/*! + Test the api NotesEditor::close(CloseType type); + */ +void TestNotesEditorPlugin::testClosingOfNotesEditorWithoutSave() +{ + HbMainWindow window; + window.show(); + + QDir dir(NOTES_EDITOR_PLUGIN_PATH); + QString pluginName = dir.absoluteFilePath(NOTES_EDITOR_PLUGIN_NAME); + + // Create plugin loader. + QPluginLoader *pluginLoader = new QPluginLoader(pluginName); + + // Load the plugin. + QVERIFY(pluginLoader->load()); + + QObject *plugin = qobject_cast (pluginLoader->instance()); + NotesEditorInterface* interface = + qobject_cast(plugin); + + QString noteText("Test Closing Of Notes Editor Without Save"); + // Call edit using the text. + interface->edit(noteText); + + // Wait for Editor to launch. + QTest::qWait(1000); + + // Call close on editor by saving the note + ulong id = interface->close(NotesEditorInterface::CloseWithoutSave); + QVERIFY(!id); + + // Unload the plugin. + QVERIFY(pluginLoader->unload()); + delete pluginLoader; +} + +/*! + Test the api NotesEditor::close(CloseType type); + */ +void TestNotesEditorPlugin::testClosingOfTodoEditorWithSave() +{ + HbMainWindow window; + window.show(); + + QDir dir(NOTES_EDITOR_PLUGIN_PATH); + QString pluginName = dir.absoluteFilePath(NOTES_EDITOR_PLUGIN_NAME); + + // Create plugin loader. + QPluginLoader *pluginLoader = new QPluginLoader(pluginName); + + // Load the plugin. + QVERIFY(pluginLoader->load()); + + QObject *plugin = qobject_cast (pluginLoader->instance()); + NotesEditorInterface* interface = + qobject_cast(plugin); + + AgendaUtil *agendaUtil = new AgendaUtil(); + // Wait for completion of instance view/entryview creation. + QTest::qWait(1); + QVERIFY(agendaUtil); + + // Create a agenda entry with type to-do + AgendaEntry entry; + entry.setType(AgendaEntry::TypeTodo); + entry.setSummary( + QString("Test Closing Of Todo Editor With Save")); + entry.setDescription(QString("@QTest Framework")); + entry.setStartAndEndTime( + QDateTime::currentDateTime(),QDateTime::currentDateTime()); + entry.setStatus(AgendaEntry::TodoNeedsAction); + entry.setPriority(2); + + ulong id = agendaUtil->addEntry(entry); + + AgendaEntry storedEntry = agendaUtil->fetchById(id); + // Call edit on agenda entry + interface->edit(storedEntry); + + // Wait for Editor to launch. + QTest::qWait(1000); + + ulong afterSaveId = interface->close(NotesEditorInterface::CloseWithSave); + + AgendaEntry afterSave = agendaUtil->fetchById(id); + QCOMPARE(afterSave.id(),id); + QCOMPARE(afterSave.type(),entry.type()); + QCOMPARE(afterSave.summary(), entry.summary()); + QCOMPARE(afterSave.description(), entry.description()); + + // cleanup. + delete agendaUtil; + + // Unload the plugin. + QVERIFY(pluginLoader->unload()); + delete pluginLoader; +} + +/*! + Test the api NotesEditor::close(CloseType type); + */ +void TestNotesEditorPlugin::testClosingOfTodoEditorWithoutSave() +{ + HbMainWindow window; + window.show(); + + QDir dir(NOTES_EDITOR_PLUGIN_PATH); + QString pluginName = dir.absoluteFilePath(NOTES_EDITOR_PLUGIN_NAME); + + // Create plugin loader. + QPluginLoader *pluginLoader = new QPluginLoader(pluginName); + + // Load the plugin. + QVERIFY(pluginLoader->load()); + + QObject *plugin = qobject_cast (pluginLoader->instance()); + NotesEditorInterface* interface = + qobject_cast(plugin); + + AgendaUtil *agendaUtil = new AgendaUtil(); + // Wait for completion of instance view/entryview creation. + QTest::qWait(1); + QVERIFY(agendaUtil); + + // Create a agenda entry with type to-do + AgendaEntry entry; + entry.setType(AgendaEntry::TypeTodo); + entry.setSummary( + QString("Test Closing Of Todo Editor Without Save")); + entry.setDescription(QString("@QTest framework")); + entry.setStartAndEndTime( + QDateTime::currentDateTime(),QDateTime::currentDateTime()); + entry.setStatus(AgendaEntry::TodoNeedsAction); + entry.setPriority(2); + + ulong id = agendaUtil->addEntry(entry); + + AgendaEntry storedEntry = agendaUtil->fetchById(id); + // Call edit on agenda entry + interface->edit(storedEntry); + + // Wait for Editor to launch. + QTest::qWait(3000); + + ulong afterSaveId = interface->close( + NotesEditorInterface::CloseWithoutSave); + QVERIFY(!afterSaveId); + + // cleanup. + delete agendaUtil; + + // Unload the plugin. + QVERIFY(pluginLoader->unload()); + delete pluginLoader; +} + +/*! + Test editing of note by owning agenda util. + */ +void TestNotesEditorPlugin::testAgendaUtilEditingNoteWithText() +{ + HbMainWindow window; + window.show(); + + QDir dir(NOTES_EDITOR_PLUGIN_PATH); + QString pluginName = dir.absoluteFilePath(NOTES_EDITOR_PLUGIN_NAME); + + // Create plugin loader. + QPluginLoader *pluginLoader = new QPluginLoader(pluginName); + + // Load the plugin. + QVERIFY(pluginLoader->load()); + + QObject *plugin = qobject_cast (pluginLoader->instance()); + NotesEditorInterface* interface = + qobject_cast(plugin); + + // Create agenda Utility. + AgendaUtil *agendaUtil = new AgendaUtil(); + // Wait for completion of instance view/entryview creation. + QTest::qWait(1); + QVERIFY(agendaUtil); + + QString noteText("Test Editing of Note With Text by passing created " + "agenda util to notes editor plugin"); + // Call edit using the text. + interface->edit(noteText, agendaUtil); + + // Call close on editor by saving the note + ulong id = interface->close(NotesEditorInterface::CloseWithSave); + QVERIFY(id); + + // Fetch the entry using the id + AgendaEntry entry = agendaUtil->fetchById(id); + + QString entryDescription = entry.description(); + int compareResult = noteText.compare(entryDescription); + + QVERIFY(!compareResult); + + // cleanup. + delete agendaUtil; + + // Unload the plugin. + QVERIFY(pluginLoader->unload()); + delete pluginLoader; +} + +/*! + Test editing to-do entry by owning agenda util. + */ +void TestNotesEditorPlugin::testAgendaUtilEditingTodoWithId() +{ + HbMainWindow window; + window.show(); + + QDir dir(NOTES_EDITOR_PLUGIN_PATH); + QString pluginName = dir.absoluteFilePath(NOTES_EDITOR_PLUGIN_NAME); + + // Create plugin loader. + QPluginLoader *pluginLoader = new QPluginLoader(pluginName); + + // Load the plugin. + QVERIFY(pluginLoader->load()); + + QObject *plugin = qobject_cast (pluginLoader->instance()); + NotesEditorInterface* interface = + qobject_cast(plugin); + + AgendaUtil *agendaUtil = new AgendaUtil(); + // Wait for completion of instance view/entryview creation. + QTest::qWait(1); + + QVERIFY(agendaUtil); + + AgendaEntry entry; + entry.setType(AgendaEntry::TypeNote); + entry.setDescription( + QString("Test Editing of Note by providing entry local Id")); + + ulong id = agendaUtil->addEntry(entry); + + // Edits to-do entry by providing entry id and agendautil. + interface->edit(id, agendaUtil); + + // Wait for Editor to launch. + QTest::qWait(1000); + + ulong savedId = interface->close(NotesEditorInterface::CloseWithSave); + + // Compare the entry after saving. Using the old entry id since + // text is not modified in the editor. Wait can be increased to allow user + // to modify the text. + AgendaEntry afterSave = agendaUtil->fetchById(id); + QCOMPARE(afterSave.description(), entry.description()); + + // cleanup. + delete agendaUtil; + + // Unload the plugin. + QVERIFY(pluginLoader->unload()); + delete pluginLoader; +} +// End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/notes_editor_api/tsrc/unittest_noteseditorplugin/unittest_noteseditorplugin.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/notes_editor_api/tsrc/unittest_noteseditorplugin/unittest_noteseditorplugin.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,51 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# Project specification file for noteseditor unit test. +# + +TEMPLATE = app +TARGET = utnoteseditorplugin +CONFIG += \ + qtestlib \ + symbian_test \ + hb + +DEPENDPATH += \ + . \ + ./src + +INCLUDEPATH += . + +symbian: { + TARGET.CAPABILITY = ALL -TCB + TARGET.EPOCALLOWDLLDATA = 1 + TARGET.UID3 = 0xE3883256 + INCLUDEPATH += $$APP_LAYER_SYSTEMINCLUDE + + LIBS += \ + -lagendainterface + + BLD_INF_RULES.prj_testexports += \ + "../rom/unit_noteseditorplugin.iby CORE_APP_LAYER_IBY_EXPORT_PATH(unit_noteseditorplugin.iby)" +} + +SOURCES += \ + unittest_noteseditorplugin.cpp \ + main.cpp + +HEADERS += \ + ./inc/unittest_noteseditorplugin.h + +# End of file --Don't remove this. diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/organizer_plat.pro --- a/organizer_plat/organizer_plat.pro Mon May 03 12:30:32 2010 +0300 +++ b/organizer_plat/organizer_plat.pro Mon Jun 28 15:22:02 2010 +0530 @@ -24,6 +24,9 @@ include(calendar_editor_api/calendar_editor_api.pri) include(notes_editor_api/notes_editor_api.pri) include(eventviewer_plugin_api/eventviewer_plugin_api.pri) +include(clock_settings_keys_api/clock_settings_keys_api.pri) +include(calendar_settings_keys_api/calendar_settings_keys_api.pri) +include(clock_settingsview_plugin_api/clock_settingsview_plugin_api.pri) symbian { headers.sources = $$PUBLIC_HEADERS diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/tsrc/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/tsrc/group/bld.inf Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,23 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Includes organizer_plat test code +* +*/ + + +#include "../../agenda_versit_2_api/tsrc/group/bld.inf" +#include "../../calendar_exporter_api/tsrc/group/bld.inf" +#include "../../calendar_importer_api/tsrc/group/bld.inf" + + diff -r fd30d51f876b -r b6db4fd4947b organizer_plat/tsrc/tsrc.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_plat/tsrc/tsrc.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,27 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# This is the project specification file for test code under organizer_plat. +# + +TEMPLATE = subdirs +SUBDIRS += ../agenda_interface_api/tsrc \ + #../calendar_editor_api/tsrc \ TODO : uncomment after fixing build issues + ../calendar_launcher_api/tsrc \ + ../notes_editor_api/tsrc \ + ../clock_settingsview_plugin_api/tsrc + +CONFIG += ordered + +# End of file --Don't remove this diff -r fd30d51f876b -r b6db4fd4947b organizer_pub/calendar_interim_utils2_api/tsrc/bc/calendar/group/BCTestCalendar2.mmp --- a/organizer_pub/calendar_interim_utils2_api/tsrc/bc/calendar/group/BCTestCalendar2.mmp Mon May 03 12:30:32 2010 +0300 +++ b/organizer_pub/calendar_interim_utils2_api/tsrc/bc/calendar/group/BCTestCalendar2.mmp Mon Jun 28 15:22:02 2010 +0530 @@ -43,8 +43,7 @@ #if defined(__S60_) OS_LAYER_SYSTEMINCLUDE #else // __S60_ not defined - SYSTEMINCLUDE /epoc32/include - SYSTEMINCLUDE /epoc32/include/internal + SYSTEMINCLUDE /epoc32/include #endif // __S60_ SOURCEPATH ../src @@ -54,20 +53,19 @@ #if defined(__S60_) OS_LAYER_SYSTEMINCLUDE #else // __S60_ not defined - SYSTEMINCLUDE /epoc32/include - SYSTEMINCLUDE /epoc32/include/internal + SYSTEMINCLUDE /epoc32/include #endif // __S60_ SOURCEPATH ../src #endif // SBSV2 +APP_LAYER_SYSTEMINCLUDE SYSTEMINCLUDE /epoc32/include SYSTEMINCLUDE /epoc32/include/middleware SYSTEMINCLUDE /epoc32/include/domain/middleware SYSTEMINCLUDE /epoc32/include/osextensions SYSTEMINCLUDE /epoc32/include/domain/osextensions SYSTEMINCLUDE /epoc32/include/applications -SYSTEMINCLUDE /epoc32/include/internal SOURCE BCTestCalendar2.cpp SOURCE BCTestCalendar2Blocks.cpp diff -r fd30d51f876b -r b6db4fd4947b organizer_pub/tsrc/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_pub/tsrc/group/bld.inf Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,20 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Includes organizer_pub test code +* +*/ + +#include "../../calendar_interim_utils2_api/tsrc/stiff/group/bld.inf" + +// End of File diff -r fd30d51f876b -r b6db4fd4947b organizer_pub/tsrc/tsrc.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/organizer_pub/tsrc/tsrc.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,18 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# This is the project specification file for organizer_pub test code. +# + +# End of file --Don't remove this diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/bwins/caltestlibu.def --- a/pimappservices/calendar/bwins/caltestlibu.def Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/bwins/caltestlibu.def Mon Jun 28 15:22:02 2010 +0530 @@ -45,4 +45,5 @@ ?RegisterCalFileL@CCalTestLibrary@@QAEXABVTDesC16@@@Z @ 44 NONAME ; void CCalTestLibrary::RegisterCalFileL(class TDesC16 const &) ?WaitForAgendaServerClose@CCalTestLibrary@@SAXXZ @ 45 NONAME ; void CCalTestLibrary::WaitForAgendaServerClose(void) ?WaitForAlarmEvent@CCalTestLibrary@@QAEHHW4TAlarmChangeEvent@@W4TAlarmState@@H@Z @ 46 NONAME ; int CCalTestLibrary::WaitForAlarmEvent(int, enum TAlarmChangeEvent, enum TAlarmState, int) + ?CreateCalSubSessionL@CCalTestLibrary@@QAEAAV?$RPointerArray@VCCalSession@@@@ABVTDesC16@@@Z @ 47 NONAME ; class RPointerArray & CCalTestLibrary::CreateCalSubSessionL(class TDesC16 const &) diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/client/src/calattachment.cpp --- a/pimappservices/calendar/client/src/calattachment.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/client/src/calattachment.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -554,12 +554,23 @@ */ EXPORT_C void CCalAttachmentFile::FetchFileHandleL(RFile& aFileHandle) const { - if (iAttachmentImpl->IsFileHandleSet() || ! iCalSessionImpl) - { - User::Leave(KErrArgument); - } - - iCalSessionImpl->Server().FetchFileHandleL(aFileHandle, iAttachmentImpl->Uid(), iCalSessionImpl->FileId()); + if ( iAttachmentImpl->IsFileHandleSet() ) + { + aFileHandle.Close(); + User::LeaveIfError( + aFileHandle.Duplicate( iAttachmentImpl->FileHandle() ) ); + } + else if ( iCalSessionImpl ) + { + iCalSessionImpl->Server().FetchFileHandleL( + aFileHandle, + iAttachmentImpl->Uid(), + iCalSessionImpl->FileId() ); + } + else + { + User::Leave( KErrArgument ); + } } /** Load the binary data into the attachment object to be accessed through the CCalAttachment::Value function. diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/client/src/calcalendarinfoimpl.cpp --- a/pimappservices/calendar/client/src/calcalendarinfoimpl.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/client/src/calcalendarinfoimpl.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -69,9 +69,9 @@ { if (iProperties[position]->Value().Compare(KNullDesC8) == 0) { - __ASSERT_DEBUG(iProperties[position]->StreamId() != KNullStreamId, CalUtils::Panic(ECalendarInfoNullStreamId)); + __ASSERT_DEBUG(iFileName && iProperties[position]->StreamId() != KNullStreamId, CalUtils::Panic(ECalendarInfoNullStreamId)); // Get the property - HBufC8* value = iSessionImpl->Server().GetPropertyValueL(iSessionImpl->FileName(), iProperties[position]->StreamId()); + HBufC8* value = iSessionImpl->Server().GetPropertyValueL(iFileName->Des(), iProperties[position]->StreamId()); iProperties[position]->SetValue(value); } else if (iProperties[position]->State() == CAgnCalendarInfoProperty::EDeleted) diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/client/src/calclient.cpp --- a/pimappservices/calendar/client/src/calclient.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/client/src/calclient.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -35,8 +35,6 @@ #include "calcalendarinfoimpl.h" #include "agmfilechangenotification.h" -const TUint KDefaultMessageSlots = 3; - _LIT(KAgendaMutex, "AgnMutex"); // @@ -205,7 +203,7 @@ TInt RAgendaServ::DoConnect() { - return CreateSession(KAgendaServerName,Version(), KDefaultMessageSlots); + return CreateSession(KAgendaServerName,Version()); } @@ -1808,11 +1806,18 @@ { if (type == CCalEntry::ETodo) { - changeItem.iEntryType = MCalChangeCallBack2::EChangeEntryTodo; + changeItem.iEntryType = + MCalChangeCallBack2::EChangeEntryTodo; + } + else if (type == CCalEntry::ENote) + { + changeItem.iEntryType = + MCalChangeCallBack2::EChangeEntryNote; } else { - changeItem.iEntryType = MCalChangeCallBack2::EChangeEntryEvent; + changeItem.iEntryType = + MCalChangeCallBack2::EChangeEntryEvent; } } aChangeItems.AppendL(changeItem); diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/client/src/calentryimpl.cpp --- a/pimappservices/calendar/client/src/calentryimpl.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/client/src/calentryimpl.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -636,11 +636,11 @@ const TAgnRpt* KRpt = KRptDef->RRule(); // get the DTSTART property - if (SimpleEntry()->Type() == CCalEntry::ETodo) - { - aRule.SetDtStart(EndTimeL()); - } - else +// if (SimpleEntry()->Type() == CCalEntry::ETodo) +// { +// aRule.SetDtStart(EndTimeL()); +// } +// else { aRule.SetDtStart(StartTimeL()); } @@ -1510,8 +1510,6 @@ void CCalEntryImpl::SetDTStampL(const TCalTime& aDTStampTime) { - __ASSERT_ALWAYS( EntryTypeL() != CCalEntry::ENote, - User::Leave(KErrNotSupported)); LoadFullEntryL(); iFullEntry->SetDTStampUtcL(aDTStampTime.TimeUtcL()); } diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/eabi/caltestlibu.def --- a/pimappservices/calendar/eabi/caltestlibu.def Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/eabi/caltestlibu.def Mon Jun 28 15:22:02 2010 +0530 @@ -52,4 +52,5 @@ _ZTV15CCalTestLibrary @ 51 NONAME _ZN15CCalTestLibrary24WaitForAgendaServerCloseEv @ 52 NONAME _ZN15CCalTestLibrary17WaitForAlarmEventEi17TAlarmChangeEvent11TAlarmStatei @ 53 NONAME + _ZN15CCalTestLibrary20CreateCalSubSessionLERK7TDesC16 @ 54 NONAME diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/inc/calchangecallback.h --- a/pimappservices/calendar/inc/calchangecallback.h Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/inc/calchangecallback.h Mon Jun 28 15:22:02 2010 +0530 @@ -145,7 +145,9 @@ /** Entry type is event. */ EChangeEntryEvent, /** All entry types. */ - EChangeEntryAll + EChangeEntryAll, + /** Entry type is note */ + EChangeEntryNote }; /** diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/server/inc/agsentrymodel.h --- a/pimappservices/calendar/server/inc/agsentrymodel.h Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/server/inc/agsentrymodel.h Mon Jun 28 15:22:02 2010 +0530 @@ -212,6 +212,7 @@ TTime TzRulesLastModifiedDateL(); void CheckTzDbModificationL(); void HandleTzRulesChangeL(const TTime& aTime); + TBool IsIndexFileAvailableL(); // Calendar file conversion operations void LoadNewStreamStoreL(CStreamStore& aStore, const TStreamId& aModelStreamId, CAgnEntryManager& aEntryManager, CAgnTzRuleIndex& aTzRuleIndex); @@ -229,7 +230,7 @@ TBool GenerateIndexFileName(TFileName& aFileName); TCalCollectionId CollectionId() const; const CAgnServFile& AgnServFile(); - + void ResetDeleteRollbackArray(); private: void ConstructL(CAgnServFile* aAgnServerFile); diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/server/src/agsalarm.cpp --- a/pimappservices/calendar/server/src/agsalarm.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/server/src/agsalarm.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -680,8 +680,15 @@ else { aAlarmInfo.iRecurrenceId = entry->RecurrenceId().UtcL(); - } - aAlarmInfo.iGlobalIdentifier = iModel->GetEntryGuidL(*entry); + } + + // Check the length of the Uid from the entry if it is less than the + // the supported length assign it to the aAlarmInfo. + // as per the RFC we are supporting 256 chars most of app UID is within this range + // in future if anyone supports more than this length we need to handle this here . + if (iModel->GetEntryGuidL(*entry).Length() <= KAgnEntryMaxGuidLength) + aAlarmInfo.iGlobalIdentifier = iModel->GetEntryGuidL(*entry); + CleanupStack::PopAndDestroy(entry); } diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/server/src/agsasyncdelete.cpp --- a/pimappservices/calendar/server/src/agsasyncdelete.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/server/src/agsasyncdelete.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -246,7 +246,7 @@ CleanupStack::PopAndDestroy(entry); } } - + iModel.ResetDeleteRollbackArray(); iTidyDeleteArray->Reset(); iModel.FlushL(); } @@ -288,7 +288,11 @@ for (TInt i = 0; i < KCount && todelete; ++i) { const CAgnSimpleEntry* KChildEntry = iModel.GetSimpleEntryFromIndexes(KChildIds[i].ChildId()); - todelete = FallInTimeRangeL(*KChildEntry); + if(KChildEntry != NULL) + { + todelete = FallInTimeRangeL(*KChildEntry); + } + } } diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/server/src/agsattachmentindex.cpp --- a/pimappservices/calendar/server/src/agsattachmentindex.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/server/src/agsattachmentindex.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -281,7 +281,8 @@ { // check every attachment const CAgnAttachmentIndexItem* KAttachmentItem = iIndex[i]; - for (TInt j = 0; j < KAttachmentItem->Entries().Count(); ++j) + const TInt entryCount = KAttachmentItem->Entries().Count(); + for (TInt j = 0; j < entryCount; ++j) { // check every entry associated with each attachment if (KEntryLocalUid == (KAttachmentItem->Entries())[j]) diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/server/src/agsentrymanager.cpp --- a/pimappservices/calendar/server/src/agsentrymanager.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/server/src/agsentrymanager.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -574,7 +574,7 @@ } CleanupStack::PopAndDestroy(); iLastRestored = type; - return (count); + return (buffer->Count()); } CAgnEntry* CAgnEntryManager::SearchBuffers(const TAgnEntryId& aEntryId, TInt& aPos) diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/server/src/agsentrymodel.cpp --- a/pimappservices/calendar/server/src/agsentrymodel.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/server/src/agsentrymodel.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -85,6 +85,10 @@ iAttachmentIndex = new (ELeave) CAgnAttachmentIndex; CreateAlarmForServerL(); } + + User::LeaveIfError(iFs.Connect()); + User::LeaveIfError( iFs.ShareProtected() ); + iIndexFileIsDirty = ETrue; // for safety assume that the index // file is out of date. We can correct this // when we read the file @@ -113,6 +117,7 @@ delete iModelStreamIdSet; delete iEntryManager; delete iCalConverter; + iFs.Close(); } const CAgnServFile& CAgnEntryModel::AgnServFile() @@ -120,6 +125,14 @@ return *iAgnServerFile; } +/** + * Resets delete rollback array before the callback + */ +void CAgnEntryModel::ResetDeleteRollbackArray() + { + iDeleteRollbackArray.ResetAndDestroy(); + } + /** Load up the stream network */ void CAgnEntryModel::DoOpenL(const TStreamId& aModelStreamId) @@ -503,9 +516,11 @@ _DBGLOG_VERBOSE(AgmDebug::DebugLog("StoreL: Existing entry types is different to incoming entry's type");) _DBGLOG_VERBOSE(AgmDebug::DebugLog("StoreL: Delete the existing entry and add the incoming entry as a new one");) - // if the entry is a different type, delete the old entry and add the new one + // if the entry is a different type, add the new one first and delete only later + // This change is needed if the entry having attachments, it will be shared by two + //entries, so that attachments will not be deleted, while deleting it later. + returnId = AddEntryL(aEntry); DeleteEntryL(*existingEntryToReplace, ETrue, iChangeFilter); - returnId = AddEntryL(aEntry); } CleanupStack::PopAndDestroy(existingEntryToReplace); @@ -1398,22 +1413,16 @@ // file needs to be rebuilt and to no try to delete the file more than once. void CAgnEntryModel::MarkIndexFileAsDirtyL() { - if (iIndexFileIsDirty) - { - return; // the file is already marked as dirty - } - - TFileName idxfilename; - if (!GenerateIndexFileName(idxfilename)) - { - User::Leave(KErrBadName); - } - - TInt connectErr = iFs.Connect(); - User::LeaveIfError(connectErr); - - iFs.Delete(idxfilename); // ignore return as there is nothing we can do with it - + + if(IsIndexFileAvailableL()) + { + TFileName idxfilename; + if (!GenerateIndexFileName(idxfilename)) + { + User::Leave(KErrBadName); + } + iFs.Delete(idxfilename); // ignore return as there is nothing we can do with it + } iIndexFileIsDirty = ETrue; } @@ -1447,9 +1456,6 @@ User::Leave(KErrBadName); } - TInt connectErr = iFs.Connect(); - User::LeaveIfError(connectErr); - RFile idxFile; TInt errReadIdx = idxFile.Open(iFs, idxfilename, EFileRead); CleanupClosePushL(idxFile); @@ -1512,6 +1518,29 @@ return EFalse; } +// This method check the index file is exist. +// It returns: +// ETrue - File is already exist +// EFalse - File is not available +TBool CAgnEntryModel::IsIndexFileAvailableL() + { + TFileName idxfilename; + if (!GenerateIndexFileName(idxfilename)) + { + User::Leave(KErrBadName); + } + + RFile idxFile; + TInt errReadIdx = idxFile.Open(iFs, idxfilename, EFileRead); + CleanupClosePushL(idxFile); + if((errReadIdx == KErrNotFound)) + { + CleanupStack::PopAndDestroy(); + return EFalse; + } + CleanupStack::PopAndDestroy(&idxFile); + return ETrue; +} // This method attempts to save all indices to the index file. // If any errors are encountered it will Leave. @@ -1524,9 +1553,7 @@ { User::Leave(KErrBadName); } - TInt connectErr = iFs.Connect(); - User::LeaveIfError(connectErr); - + RFile idxFile; TInt errWriteIdx = idxFile.Replace(iFs, idxfilename, EFileWrite); User::LeaveIfError(errWriteIdx); @@ -2678,6 +2705,15 @@ NotifyingL(MCalChangeCallBack2::EChangeModify, aEntry, instanceInfoBefore); + if(iChangeFilter && iTzRuleIndex) + { + //Remove the tz rule from tz rule index + //we have to do it after CAgnEntryModel::NotifyingL that is indirectly using the + //tz rule in oldEntry. + iTzRuleIndex->RemoveTzRuleL(*oldEntry); + } + + CleanupStack::PopAndDestroy(instanceInfoBefore); CleanupStack::PopAndDestroy(oldEntry); diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/server/src/agsfilemanager.cpp --- a/pimappservices/calendar/server/src/agsfilemanager.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/server/src/agsfilemanager.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -1243,7 +1243,7 @@ } else { - iAgnServer.AlarmServer().SetAlarmStatusForCalendarFile(fileName, EAlarmStatusEnabled); + QueueAlarmsImmediately(); } User::LeaveIfError(iStore->Commit()); diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/server/src/agsmain.cpp --- a/pimappservices/calendar/server/src/agsmain.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/server/src/agsmain.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -260,6 +260,7 @@ iProxy = CAgnTlsProxy::CreateL(CAgnTlsProxy::TAgnTlsTzRulesType_Server); User::LeaveIfError(iFs.Connect()); + User::LeaveIfError( iFs.ShareProtected() ); User::LeaveIfError(iAlarmServer.Connect()); iFileMgr = CAgnServFileMgr::NewL(iFs, *this); iFileMgr->CreatePermanentDataL(); diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/server/src/agssess.cpp --- a/pimappservices/calendar/server/src/agssess.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/server/src/agssess.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -142,7 +142,24 @@ { return EFalse; } - + + // Check for the requested entry type and the change type. + // Don't notify clients which are listening for event and + // to-do notifictaions when note event is modified. + if ( ((iEntryType == MCalChangeCallBack2::EChangeEntryEvent) || + (iEntryType == MCalChangeCallBack2::EChangeEntryTodo)) && + (aChange.iEntryType == CCalEntry::ENote)) + { + return EFalse; + } + + // Notify clients which are listening for event type note modifications. + if (iEntryType == MCalChangeCallBack2::EChangeEntryNote && + aChange.iEntryType == CCalEntry::ENote) + { + return ETrue; + } + // Check the entry is within the time range specified by the filter // aChange.iRepeatRule gives the repeat data for the newly stored entry. If this operation is an update, // then aChange.iOriginalRepeatRule gives the repeat data for the old entry. diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/server/src/agstzruleindex.cpp --- a/pimappservices/calendar/server/src/agstzruleindex.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/server/src/agstzruleindex.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -592,7 +592,7 @@ @param aOldEntry reference to the original entry to be updated. @param aNewEntry reference to the entry containing updated content. */ -void CAgnTzRuleIndex::UpdateTzRuleL(CAgnEntry& aOldEntry, CAgnEntry& aNewEntry) +void CAgnTzRuleIndex::UpdateTzRuleL(CAgnEntry& /*aOldEntry*/, CAgnEntry& aNewEntry) { CAgnTzRules* newTzZone = GetTzRulesFromEntry(aNewEntry); if (newTzZone != NULL && newTzZone->HasValidTzZoneStreamId()) @@ -620,7 +620,6 @@ AddTzRuleL(aNewEntry); } - RemoveTzRuleL(aOldEntry); } void CAgnTzRuleIndex::UpdateItemsInStoreL( diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/shared/src/agmcalendarinfo.cpp --- a/pimappservices/calendar/shared/src/agmcalendarinfo.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/shared/src/agmcalendarinfo.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -121,8 +121,9 @@ EXPORT_C CDesC8Array* CAgnCalendarInfo::PropertyKeysL() const { const TInt KPropertyCount(iProperties.Count()); + const TInt propertyCount = KPropertyCount==0 ? 1 : KPropertyCount; - CDesC8Array* propertyKeys = new(ELeave) CDesC8ArrayFlat(KPropertyCount); + CDesC8Array* propertyKeys = new(ELeave) CDesC8ArrayFlat(propertyCount); CleanupStack::PushL(propertyKeys); for (TInt i(0) ; i < KPropertyCount ; ++i) diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/shared/src/agmcalendartime.cpp --- a/pimappservices/calendar/shared/src/agmcalendartime.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/shared/src/agmcalendartime.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -101,6 +101,14 @@ iTime = AgnDateTime::MaxDate(); } iLocalOffsetInMinutes = KOffsetUnspecified; + if ( ! aFloating) + { + SetFloatingFlag(EFalse); + } + else + { + SetFloatingFlag(ETrue); + } } else { diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/shared/src/agmrptdef.cpp --- a/pimappservices/calendar/shared/src/agmrptdef.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/shared/src/agmrptdef.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -2700,8 +2700,16 @@ @internalComponent */ { - delete iRRule; - delete iTimeZone; + if (iRRule) + { + delete iRRule; + iRRule = NULL; + } + if (iTimeZone) + { + delete iTimeZone; + iTimeZone = NULL; + } ClearTimeArray(iSporadicDates); ClearTimeArray(iExceptions); @@ -3885,7 +3893,14 @@ @return The start date expressed as Current System Local Time. */ { - return iOwningEntry.EntryTime(); + if (iOwningEntry.Type() == CCalEntry::ETodo) + { + return iOwningEntry.StartTime(); + } + else + { + return iOwningEntry.EntryTime(); + } } EXPORT_C void CAgnRptDef::SetUntilTime(const TAgnCalendarTime& aUntilTime) diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/shared/src/agmsimpleentry.cpp --- a/pimappservices/calendar/shared/src/agmsimpleentry.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/shared/src/agmsimpleentry.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -67,7 +67,11 @@ @internalComponent */ { - delete iRptDef; + if (iRptDef) + { + delete iRptDef; + iRptDef = NULL; + } } @@ -394,8 +398,15 @@ // Ensure that the start date actually falls on a repeating instance. For example, // if the repeat rule is every Wednesday, and the DtStart is a Monday, it should be // nudged forwards to the Wednesday of that week. - - TTime startTimeUtc = EntryTime().UtcL(); + TTime startTimeUtc; + if (Type() == CCalEntry::ETodo) + { + startTimeUtc = StartTime().UtcL(); + } + else + { + startTimeUtc = EntryTime().UtcL(); + } startTimeUtc -= TTimeIntervalMicroSeconds(1); TTime firstInstanceUtc; @@ -428,7 +439,7 @@ TTime startTime = aNewEntryTimeLocal; if (Type() == CCalEntry::ETodo) { - startTime = DurationMinusL(startTime); + //startTime = DurationMinusL(startTime); } TAgnCalendarTime startAgnTime; TAgnCalendarTime endAgnTime; diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/tsrc/Integration/TestCalApiPolicing/generated/BLD.INF --- a/pimappservices/calendar/tsrc/Integration/TestCalApiPolicing/generated/BLD.INF Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ -// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// - -PRJ_TESTMMPFILES - -TestCalApiPolicing.mmp - - - -PRJ_TESTEXPORTS - -TestCalApiPolicing.bat \epoc32\tools\TestCalApiPolicing.bat -Cap_80000004_TestCalApiPolicingSub.script C:\testdata\scripts\Cap_80000004_TestCalApiPolicingSub.script -Cap_00010004_TestCalApiPolicingSub.script C:\testdata\scripts\Cap_00010004_TestCalApiPolicingSub.script -Cap_00008004_TestCalApiPolicingSub.script C:\testdata\scripts\Cap_00008004_TestCalApiPolicingSub.script -Cap_00000004_TestCalApiPolicingSub.script C:\testdata\scripts\Cap_00000004_TestCalApiPolicingSub.script -TestCalApiPolicing.IBY \epoc32\rom\include\TestCalApiPolicing.IBY -TestCalApiPolicing.script C:\testdata\scripts\TestCalApiPolicing.script - diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/tsrc/Integration/TestCalApiPolicing/generated/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pimappservices/calendar/tsrc/Integration/TestCalApiPolicing/generated/bld.inf Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,31 @@ +// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// + +PRJ_TESTMMPFILES + +TestCalApiPolicing.mmp + + + +PRJ_TESTEXPORTS + +TestCalApiPolicing.bat \epoc32\tools\TestCalApiPolicing.bat +Cap_80000004_TestCalApiPolicingSub.script C:\testdata\scripts\Cap_80000004_TestCalApiPolicingSub.script +Cap_00010004_TestCalApiPolicingSub.script C:\testdata\scripts\Cap_00010004_TestCalApiPolicingSub.script +Cap_00008004_TestCalApiPolicingSub.script C:\testdata\scripts\Cap_00008004_TestCalApiPolicingSub.script +Cap_00000004_TestCalApiPolicingSub.script C:\testdata\scripts\Cap_00000004_TestCalApiPolicingSub.script +TestCalApiPolicing.IBY \epoc32\rom\include\TestCalApiPolicing.IBY +TestCalApiPolicing.script C:\testdata\scripts\TestCalApiPolicing.script + diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/tsrc/caltestlib.cpp --- a/pimappservices/calendar/tsrc/caltestlib.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/tsrc/caltestlib.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -120,6 +121,7 @@ void CCalTestLibrary::CloseCalendarSession(TBool aWaitForAgendaToClose) { iChunkMutex.Wait(); + iSubCalSessions.ResetAndDestroy(); delete iSession; iSession = NULL; if (iRefCount && (--*iRefCount <= 0) && aWaitForAgendaToClose) @@ -399,6 +401,16 @@ if (aIsCalFile) { + + for(TInt i = 0; i < iSubCalSessions.Count();i++) + { + CCalCalendarInfo* info = iSubCalSessions[i]->CalendarInfoL(); + HBufC* fileName = info->FileNameL().AllocLC(); + delete info; + iSubCalSessions[i]->DeleteCalFileL(*fileName); + CleanupStack::PopAndDestroy(fileName); + } + iSession->DeleteCalFileL(aFileName); TInt indx=-1; if(iDelFileFlag) @@ -948,4 +960,24 @@ return tickPeriod * durationInTicks; } +EXPORT_C RPointerArray& CCalTestLibrary::CreateCalSubSessionL(const TDesC& aFileName) + { + CCalSession* session = CCalSession::NewL(*iSession); + CCalCalendarInfo* calendarInfo = CCalCalendarInfo::NewL(); + calendarInfo->SetColor(KRgbRed); + calendarInfo->SetNameL(_L("test")); + calendarInfo->SetEnabled(ETrue); + + TRAPD(err,session->CreateCalFileL(aFileName,*calendarInfo)); + if(err == KErrAlreadyExists) + { + session->DeleteCalFileL(aFileName); + session->CreateCalFileL(aFileName,*calendarInfo); + } + session->OpenL(aFileName); + iSubCalSessions.Append(session); + + delete calendarInfo; + return iSubCalSessions; + } diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/tsrc/caltestlib.h --- a/pimappservices/calendar/tsrc/caltestlib.h Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/tsrc/caltestlib.h Mon Jun 28 15:22:02 2010 +0530 @@ -105,6 +105,9 @@ // Used to append the file to the delete list IMPORT_C void RegisterCalFileL(const TDesC& aFileName); + + // Create a calendar file. It leaves if the file exists. + IMPORT_C RPointerArray& CreateCalSubSessionL(const TDesC& aFileName); // Session and Views handling @@ -220,6 +223,7 @@ TBool iDelFileFlag; RMutex iChunkMutex; RASCliSession iAlarmServer; + RPointerArray iSubCalSessions; }; diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/tsrc/instance_iterator/tcal_fetchinstance.cpp --- a/pimappservices/calendar/tsrc/instance_iterator/tcal_fetchinstance.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/tsrc/instance_iterator/tcal_fetchinstance.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -435,8 +435,24 @@ test.Printf(_L("test the instance time")); test(repeatingTodoInstance1->Time().TimeLocalL() == instanceTime1.TimeLocalL()); test.Printf(_L("test the entry start and end times")); - test(repeatingTodoInstance1->Entry().StartTimeL().TimeLocalL() == startTime.TimeLocalL()); - test(repeatingTodoInstance1->Entry().EndTimeL().TimeLocalL() == endTime.TimeLocalL()); + + // Modified Start-> if DtStart date is equal to end date then align start date with DtStart date and + // end date = end date + duration of the entry. + // Thus moving the time window based on DtStart date + test(repeatingTodoInstance1->Entry().StartTimeL().TimeLocalL() == endTime.TimeLocalL()); + + TTime newEndTime(endTime.TimeLocalL()); + TTimeIntervalMinutes deltaMinutes; + endTime.TimeLocalL().MinutesFrom(startTime.TimeLocalL(), deltaMinutes); + newEndTime += deltaMinutes; + + TTimeIntervalMicroSeconds deltaMicroSeconds = + endTime.TimeLocalL().MicroSecondsFrom(startTime.TimeLocalL() + deltaMinutes); + newEndTime += deltaMicroSeconds; + + test(repeatingTodoInstance1->Entry().EndTimeL().TimeLocalL() == newEndTime); + //Modified End<- + test.Printf(_L("fetch the description")); test(repeatingTodoInstance1->Entry().DescriptionL().Compare(KEntryDescription) == 0); CleanupStack::PopAndDestroy(repeatingTodoInstance1); @@ -448,8 +464,24 @@ test.Printf(_L("test the instance time")); test(repeatingTodoInstance2->Time().TimeLocalL() == instanceTime2.TimeLocalL()); test.Printf(_L("test the entry start and end times")); - test(repeatingTodoInstance2->Entry().StartTimeL().TimeLocalL() == startTime.TimeLocalL()); - test(repeatingTodoInstance2->Entry().EndTimeL().TimeLocalL() == endTime.TimeLocalL()); + + // Modified Start-> if DtStart date is equal to end date then align start date with DtStart date and + // end date = end date + duration of the entry. + // Thus moving the time window based on DtStart date + test(repeatingTodoInstance2->Entry().StartTimeL().TimeLocalL() == endTime.TimeLocalL()); + + newEndTime = endTime.TimeLocalL(); + + endTime.TimeLocalL().MinutesFrom(startTime.TimeLocalL(), deltaMinutes); + newEndTime += deltaMinutes; + + deltaMicroSeconds = + endTime.TimeLocalL().MicroSecondsFrom(startTime.TimeLocalL() + deltaMinutes); + newEndTime += deltaMicroSeconds; + + test(repeatingTodoInstance2->Entry().EndTimeL().TimeLocalL() == newEndTime); + //Modified End<- + test.Printf(_L("fetch the description")); test(repeatingTodoInstance2->Entry().DescriptionL().Compare(KEntryDescription) == 0); CleanupStack::PopAndDestroy(repeatingTodoInstance2); @@ -461,8 +493,24 @@ test.Printf(_L("test the instance time")); test(repeatingTodoInstance3->Time().TimeLocalL() == instanceTime3.TimeLocalL()); test.Printf(_L("test the entry start and end times")); - test(repeatingTodoInstance3->Entry().StartTimeL().TimeLocalL() == startTime.TimeLocalL()); - test(repeatingTodoInstance3->Entry().EndTimeL().TimeLocalL() == endTime.TimeLocalL()); + + // Modified Start-> if DtStart date is equal to end date then align start date with DtStart date and + // end date = end date + duration of the entry. + // Thus moving the time window based on DtStart date + test(repeatingTodoInstance3->Entry().StartTimeL().TimeLocalL() == endTime.TimeLocalL()); + + newEndTime = endTime.TimeLocalL(); + + endTime.TimeLocalL().MinutesFrom(startTime.TimeLocalL(), deltaMinutes); + newEndTime += deltaMinutes; + + deltaMicroSeconds = + endTime.TimeLocalL().MicroSecondsFrom(startTime.TimeLocalL() + deltaMinutes); + newEndTime += deltaMicroSeconds; + + test(repeatingTodoInstance3->Entry().EndTimeL().TimeLocalL() == newEndTime); + //Modified End<- + test.Printf(_L("fetch the description")); test(repeatingTodoInstance3->Entry().DescriptionL().Compare(KEntryDescription) == 0); CleanupStack::PopAndDestroy(repeatingTodoInstance3); @@ -474,8 +522,24 @@ test.Printf(_L("test the instance time")); test(repeatingTodoInstance4->Time().TimeLocalL() == instanceTime4.TimeLocalL()); test.Printf(_L("test the entry start and end times")); - test(repeatingTodoInstance4->Entry().StartTimeL().TimeLocalL() == startTime.TimeLocalL()); - test(repeatingTodoInstance4->Entry().EndTimeL().TimeLocalL() == endTime.TimeLocalL()); + + // Modified Start-> if DtStart date is equal to end date then align start date with DtStart date and + // end date = end date + duration of the entry. + // Thus moving the time window based on DtStart date + test(repeatingTodoInstance4->Entry().StartTimeL().TimeLocalL() == endTime.TimeLocalL()); + + newEndTime = endTime.TimeLocalL(); + + endTime.TimeLocalL().MinutesFrom(startTime.TimeLocalL(), deltaMinutes); + newEndTime += deltaMinutes; + + deltaMicroSeconds = + endTime.TimeLocalL().MicroSecondsFrom(startTime.TimeLocalL() + deltaMinutes); + newEndTime += deltaMicroSeconds; + + test(repeatingTodoInstance4->Entry().EndTimeL().TimeLocalL() == newEndTime); + //Modified End<- + test.Printf(_L("fetch the description")); test(repeatingTodoInstance4->Entry().DescriptionL().Compare(KEntryDescription) == 0); CleanupStack::PopAndDestroy(repeatingTodoInstance4); @@ -486,8 +550,24 @@ test.Printf(_L("test the instance time")); test(rDateInstance->Time().TimeLocalL() == rDateTime.TimeLocalL()); test.Printf(_L("test the entry start and end times")); - test(rDateInstance->Entry().StartTimeL().TimeLocalL() == startTime.TimeLocalL()); - test(rDateInstance->Entry().EndTimeL().TimeLocalL() == endTime.TimeLocalL()); + + // Modified Start-> if DtStart date is equal to end date then align start date with DtStart date and + // end date = end date + duration of the entry. + // Thus moving the time window based on DtStart date + test(rDateInstance->Entry().StartTimeL().TimeLocalL() == endTime.TimeLocalL()); + + newEndTime = endTime.TimeLocalL(); + + endTime.TimeLocalL().MinutesFrom(startTime.TimeLocalL(), deltaMinutes); + newEndTime += deltaMinutes; + + deltaMicroSeconds = + endTime.TimeLocalL().MicroSecondsFrom(startTime.TimeLocalL() + deltaMinutes); + newEndTime += deltaMicroSeconds; + + test(rDateInstance->Entry().EndTimeL().TimeLocalL() == newEndTime); + //Modified End<- + test.Printf(_L("fetch the description")); test(rDateInstance->Entry().DescriptionL().Compare(KEntryDescription) == 0); CleanupStack::PopAndDestroy(rDateInstance); diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendar/tsrc/tcal_dataexchange.mmp --- a/pimappservices/calendar/tsrc/tcal_dataexchange.mmp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendar/tsrc/tcal_dataexchange.mmp Mon Jun 28 15:22:02 2010 +0530 @@ -22,8 +22,10 @@ SOURCE tcal_dataexchange.cpp USERINCLUDE . +APP_LAYER_SYSTEMINCLUDE SYSTEMINCLUDE /epoc32/include + LIBRARY calinterimapi.lib LIBRARY euser.lib estor.lib efsrv.lib caltestlib.lib LIBRARY pimtestclient.lib diff -r fd30d51f876b -r b6db4fd4947b pimappservices/calendarvcalplugin/src/agmvcalx.cpp --- a/pimappservices/calendarvcalplugin/src/agmvcalx.cpp Mon May 03 12:30:32 2010 +0300 +++ b/pimappservices/calendarvcalplugin/src/agmvcalx.cpp Mon Jun 28 15:22:02 2010 +0530 @@ -437,9 +437,10 @@ // DTSTAMP TCalTime dTStamp = aEntry->DTStampL(); - - if ( dTStamp.TimeUtcL() != Time::NullTTime() ) - { + + if ( dTStamp.TimeUtcL() != Time::NullTTime() && + CCalEntry::ENote != aEntry->EntryTypeL() ) + { AddDateTimePropertyL(aParser, KVersitTokenXDTSTAMP, dTStamp.TimeUtcL(), TVersitDateTime::EIsUTC, iTimeFlag); } diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/chinesecalendaralg/test/group/calcontable.mmp --- a/pimappsupport/chinesecalendaralg/test/group/calcontable.mmp Mon May 03 12:30:32 2010 +0300 +++ b/pimappsupport/chinesecalendaralg/test/group/calcontable.mmp Mon Jun 28 15:22:02 2010 +0530 @@ -22,6 +22,8 @@ SOURCE calcontable.cpp USERINCLUDE ../../calcontablesrc USERINCLUDE ../../originalinc + +APP_LAYER_SYSTEMINCLUDE SYSTEMINCLUDE /epoc32/include LIBRARY euser.lib efsrv.lib cconoriginal.lib charconv.lib diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/chinesecalendarconverter/group/BLD.INF --- a/pimappsupport/chinesecalendarconverter/group/BLD.INF Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,27 +0,0 @@ -// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// Calcon BLD.INF -// Calendar conversion utilities -// -// - -PRJ_PLATFORMS -PRJ_EXPORTS -../inc/CalendarConverter.h SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(calendarconverter.h) -../inc/calendarconverterplugin.h SYMBIAN_APP_LAYER_PLATFORM_EXPORT_PATH(calendarconverterplugin.h) -../group/calcon.iby /epoc32/rom/include/calcon.iby - -PRJ_MMPFILES -../group/CCon.mmp - diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/chinesecalendarconverter/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pimappsupport/chinesecalendarconverter/group/bld.inf Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,27 @@ +// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// Calcon BLD.INF +// Calendar conversion utilities +// +// + +PRJ_PLATFORMS +PRJ_EXPORTS +../inc/CalendarConverter.h SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(calendarconverter.h) +../inc/calendarconverterplugin.h SYMBIAN_APP_LAYER_PLATFORM_EXPORT_PATH(calendarconverterplugin.h) +../group/calcon.iby /epoc32/rom/include/calcon.iby + +PRJ_MMPFILES +../group/CCon.mmp + diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/vcardandvcal/TPerformance/iLine_long.vcf --- a/pimappsupport/vcardandvcal/TPerformance/iLine_long.vcf Mon May 03 12:30:32 2010 +0300 +++ b/pimappsupport/vcardandvcal/TPerformance/iLine_long.vcf Mon Jun 28 15:22:02 2010 +0530 @@ -1,4 +1,4 @@ -BEGIN:VCARD -ADR;CHARSET=ISO-8859-1;POSTAL;WORK:;;Example City 1;Example Ø;;ZZ99 EXP -VERSION:2.1 -END:VCARD +BEGIN:VCARD +ADR;CHARSET=ISO-8859-1;POSTAL;WORK:;;Example City 1;Example Ø;;ZZ99 EXP +VERSION:2.1 +END:VCARD diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/vcardandvcal/TPerformance/iLine_short.vcf --- a/pimappsupport/vcardandvcal/TPerformance/iLine_short.vcf Mon May 03 12:30:32 2010 +0300 +++ b/pimappsupport/vcardandvcal/TPerformance/iLine_short.vcf Mon Jun 28 15:22:02 2010 +0530 @@ -1,4 +1,4 @@ -BEGIN:VCARD -FN:A N Example -VERSION:2.1 -END:VCARD +BEGIN:VCARD +FN:A N Example +VERSION:2.1 +END:VCARD diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/vcardandvcal/TestFiles/NoEnd.VCF --- a/pimappsupport/vcardandvcal/TestFiles/NoEnd.VCF Mon May 03 12:30:32 2010 +0300 +++ b/pimappsupport/vcardandvcal/TestFiles/NoEnd.VCF Mon Jun 28 15:22:02 2010 +0530 @@ -1,6 +1,6 @@ -begin:vcard -n:;Example -adr:;;;;;; -version:2.1 -fn:A N Example +begin:vcard +n:;Example +adr:;;;;;; +version:2.1 +fn:A N Example e „‘ `Ü" \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/vcardandvcal/TestFiles/nolf.vcs --- a/pimappsupport/vcardandvcal/TestFiles/nolf.vcs Mon May 03 12:30:32 2010 +0300 +++ b/pimappsupport/vcardandvcal/TestFiles/nolf.vcs Mon Jun 28 15:22:02 2010 +0530 @@ -14,3 +14,4 @@ + \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/vcardandvcal/TestvCals/Various/6.vcs --- a/pimappsupport/vcardandvcal/TestvCals/Various/6.vcs Mon May 03 12:30:32 2010 +0300 +++ b/pimappsupport/vcardandvcal/TestvCals/Various/6.vcs Mon Jun 28 15:22:02 2010 +0530 @@ -1,13 +1,13 @@ -BEGIN:VCALENDAR -BEGIN:VEVENT -VERSION:1.0 -UID:60000001 -LAST-MODIFIED:20021212T084746Z -SUMMARY:PAYE -CLASS:PUBLIC -DTSTART:20021231T090000Z -DTEND:20021231T090000Z -RRULE:MP1 5+ MO TU WE T090000Z -X-EPOCAGENDAENTRYTYPE:REMINDER -END:VEVENT +BEGIN:VCALENDAR +BEGIN:VEVENT +VERSION:1.0 +UID:60000001 +LAST-MODIFIED:20021212T084746Z +SUMMARY:PAYE +CLASS:PUBLIC +DTSTART:20021231T090000Z +DTEND:20021231T090000Z +RRULE:MP1 5+ MO TU WE T090000Z +X-EPOCAGENDAENTRYTYPE:REMINDER +END:VEVENT END:VCALENDAR \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/vcardandvcal/TestvCards/Encoded/1.vcf --- a/pimappsupport/vcardandvcal/TestvCards/Encoded/1.vcf Mon May 03 12:30:32 2010 +0300 +++ b/pimappsupport/vcardandvcal/TestvCards/Encoded/1.vcf Mon Jun 28 15:22:02 2010 +0530 @@ -1,8 +1,8 @@ -BEGIN:VCARD -FN;CHARSET=ISO-8859-1:A N Example -N;CHARSET=ISO-8859-1:Example;A;N -ADR;CHARSET=ISO-8859-1;POSTAL;WORK:;;Example Road 1;Example Town Ø;;ZZ99 EXP -EMAIL;CHARSET=ISO-8859-1;INTERNET:symbian.foundation@exp.example.test -ORG;CHARSET=ISO-8859-1:Symbian Foundation -VERSION:2.1 -END:VCARD +BEGIN:VCARD +FN;CHARSET=ISO-8859-1:A N Example +N;CHARSET=ISO-8859-1:Example;A;N +ADR;CHARSET=ISO-8859-1;POSTAL;WORK:;;Example Road 1;Example Town Ø;;ZZ99 EXP +EMAIL;CHARSET=ISO-8859-1;INTERNET:symbian.foundation@exp.example.test +ORG;CHARSET=ISO-8859-1:Symbian Foundation +VERSION:2.1 +END:VCARD diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/vcardandvcal/TestvCards/Encoded/7.vcf --- a/pimappsupport/vcardandvcal/TestvCards/Encoded/7.vcf Mon May 03 12:30:32 2010 +0300 +++ b/pimappsupport/vcardandvcal/TestvCards/Encoded/7.vcf Mon Jun 28 15:22:02 2010 +0530 @@ -141,7 +141,7 @@ 4fuPNlmm LZxgCt9Z1PfoKsVBvl1JYYwmMDLevpT7qJkgDKSDnnFcx2WsjJYfZrpLlWPyt83PUd66 WHD - IGHIPOapkUtJPUrXWmPLqNteW7rHJGcMSOq9xWhdW5+yFl4K88Ur6amij7zOY1G0UjzohtmQ7 + IGHIPOapkUtJPUrXWmPLqNteW7rHJGcMSOq9xWhdW5+yFl4K88Ur6amij7zOY1G0UjzohtmQ7 lYetdFYaimoaRHcJgS9HHfI603exlBqNS3cqXkksRIZCDjIrLtNbW01hIpCQJPl54FNCqTUX dnYq @@ -294,7 +294,7 @@ /Nu2j2rn nkZpQGOcmoS1LqNqJ0+nW0VvCDGvJGST1q5bsXgVj1NJbGkUkiSVQ0LqRwQa4qdQGI96 qJF - XYpPK0LrKhwyEMK39S1G4NshVgpfrtFEmZ0+pjHJ5J5NdNpVpDBbrIq5duSTS6GiWtzQAzTgO + XYpPK0LrKhwyEMK39S1G4NshVgpfrtFEmZ0+pjHJ5J5NdNpVpDBbrIq5duSTS6GiWtzQAzTgO aDRbXHqM0Ec/hQgWpE/FRE8E+lV0BGNrV5NBCRG23PeuXLM5LMSTzUt6GNTexESRgZ9KqTsW bbnH diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/vcardandvcal/TestvCards/Invalid/1.vcf --- a/pimappsupport/vcardandvcal/TestvCards/Invalid/1.vcf Mon May 03 12:30:32 2010 +0300 +++ b/pimappsupport/vcardandvcal/TestvCards/Invalid/1.vcf Mon Jun 28 15:22:02 2010 +0530 @@ -1,14 +1,14 @@ BEGIN:VCARD -FN:A N Example -N:Example;A;N;; -ADR;TYPE=pref,work:;;Example Town;Greater Example;ZZ99 EXP;United Kingdom;Gubbins,More Gubbins,Huge heaps of Gubbins,Mountain of Gubbins, higher than is possibly feasible., -NOTE:634 Example Road,Example Town,Greater Example,ZZ99 EXP,United Kingdom,Gubbins,More Gubbins,Huge heaps of Gubbins,Mountain of Gubbins, higher than is possibly feasible., -TEL;TYPE=pref,voice,work:0163 296 0000 -TEL;TYPE=voice:(home) 0163 296 0001 -TEL;TYPE=fax:0163 296 0002 -EMAIL;TYPE=internet,pref,work:symbian.foundation@exp.example.test -TITLE:Software Engineer -ORG:Symbian Foundation. +FN:A N Example +N:Example;A;N ;; +ADR;TYPE=pref,work:;;Example Town ;Greater Example ;ZZ99 EXP ;United Kingdom ;Gubbins ,More Gubbins ,Huge heaps of Gubbins ,Mountain of Gubbins, higher than is possibly feasible. , +NOTE:634 Example Road ,Example Town,Greater Example ,ZZ99 EXP ,United Kingdom ,Gubbins ,More Gubbins ,Huge heaps of Gubbins ,Mountain of Gubbins, higher than is possibly feasible. , +TEL;TYPE=pref,voice,work:0163 296 0000 +TEL;TYPE=voice:(home) 0163 296 0001 +TEL;TYPE=fax:0163 296 0002 +EMAIL;TYPE=internet,pref,work:symbian.foundation@exp.example.test +TITLE:Software Engineer +ORG:Symbian Foundation. VERSION:3.0 CLASS:PUBLIC END:VCARD diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/vcardandvcal/TestvCards/Invalid/2.vcf --- a/pimappsupport/vcardandvcal/TestvCards/Invalid/2.vcf Mon May 03 12:30:32 2010 +0300 +++ b/pimappsupport/vcardandvcal/TestvCards/Invalid/2.vcf Mon Jun 28 15:22:02 2010 +0530 @@ -1,18 +1,18 @@ -BEGIN:VCARD -VERSION:2.1 -ICQ:31060745 -FN:Example A -N:Example;A -EMAIL;PREF;INTERNET:symbian.foundation@exp.example.test -EMAIL;INTERNET:symbian.foundation@exp.example.test -EMAIL;INTERNET:symbian.foundation@exp.example.test -ORG:Symbian Foundation -TITLE:The director -ADR;WORK:;;;;;;Example Islands -LABEL;WORK;ENCODING=QUOTED-PRINTABLE:=0D=0A=0D=0AExample Islands -ADR;HOME:;;Example City;Earth;;;Example Town -LABEL;HOME;ENCODING=QUOTED-PRINTABLE:Example City=0D=0AEarth=0D=0AExample Town -URL:Coming soon! -TEL;HOME;VOICE:+44 (2???) ???? -TEL;CELL;VOICE:+44 9??????? -END:VCARD +BEGIN:VCARD +VERSION:2.1 +ICQ:31060745 +FN:Example A +N:Example;A +EMAIL;PREF;INTERNET:symbian.foundation@exp.example.test +EMAIL;INTERNET:symbian.foundation@exp.example.test +EMAIL;INTERNET:symbian.foundation@exp.example.test +ORG:Symbian Foundation +TITLE:The director +ADR;WORK:;;;;;;Example Islands +LABEL;WORK;ENCODING=QUOTED-PRINTABLE:=0D=0A=0D=0AExample Islands +ADR;HOME:;;Example City;Earth;;;Example Town +LABEL;HOME;ENCODING=QUOTED-PRINTABLE:Example City=0D=0AEarth=0D=0AExample Town +URL:Coming soon! +TEL;HOME;VOICE:+44 (2???) ???? +TEL;CELL;VOICE:+44 9??????? +END:VCARD diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/vcardandvcal/TestvCards/Invalid/3.vcf --- a/pimappsupport/vcardandvcal/TestvCards/Invalid/3.vcf Mon May 03 12:30:32 2010 +0300 +++ b/pimappsupport/vcardandvcal/TestvCards/Invalid/3.vcf Mon Jun 28 15:22:02 2010 +0530 @@ -1,1 +1,1 @@ -BEGIN:VCARDVERSION:2.1FN;QUOTED-PRINTABLE;CHARSET=ISO-8859-1:Example Ex=E4mp=E4leN;QUOTED-PRINTABLE;CHARSET=ISO-8859-1:Example Ex=E4mp=E4leORG:Symbian FoundationTITLE:Senior Design EngineerA.TEL;VOICE:+441632960000A.NOTE:GSMB.TEL;TYPE=FAX:+441632960001B.NOTE:GSMEMAIL:symbian.foundation@exp.example.testEND:VCARD \ No newline at end of file +BEGIN:VCARD VERSION:2.1 FN;QUOTED-PRINTABLE;CHARSET=ISO-8859-1:Example Ex=E4mp=E4le N;QUOTED-PRINTABLE;CHARSET=ISO-8859-1:Example Ex=E4mp=E4le ORG:Symbian FoundationTITLE:Senior Design Engineer A.TEL;VOICE:+441632960000 A.NOTE:GSM B.TEL;TYPE=FAX:+441632960001 B.NOTE:GSM EMAIL:symbian.foundation@exp.example.test END:VCARD \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/vcardandvcal/Ticket/VTicket.MMP --- a/pimappsupport/vcardandvcal/Ticket/VTicket.MMP Mon May 03 12:30:32 2010 +0300 +++ b/pimappsupport/vcardandvcal/Ticket/VTicket.MMP Mon Jun 28 15:22:02 2010 +0530 @@ -22,6 +22,7 @@ SOURCEPATH ../Ticket userinclude ../inc +APP_LAYER_SYSTEMINCLUDE systeminclude /epoc32/include source VTicketMaster.CPP diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/vcardandvcal/design/DESIGN.MDL --- a/pimappsupport/vcardandvcal/design/DESIGN.MDL Mon May 03 12:30:32 2010 +0300 +++ b/pimappsupport/vcardandvcal/design/DESIGN.MDL Mon Jun 28 15:22:02 2010 +0530 @@ -1,3335 +1,3335 @@ - -(object Petal - version 42 - _written "Rose 4.5.8054.1" - charSet 0) - -(object Design "Logical View" - is_unit TRUE - is_loaded TRUE - defaults (object defaults - rightMargin 0.250000 - leftMargin 0.250000 - topMargin 0.250000 - bottomMargin 0.500000 - pageOverlap 0.250000 - clipIconLabels TRUE - autoResize TRUE - snapToGrid TRUE - gridX 16 - gridY 16 - defaultFont (object Font - size 9 - face "helvetica" - bold FALSE - italics FALSE - underline FALSE - strike FALSE - color 0 - default_color TRUE) - showMessageNum 1 - showClassOfObject TRUE - notation "Booch") - root_usecase_package (object Class_Category "Use Case View" - quid "355326EE003D" - exportControl "Public" - global TRUE - logical_models (list unit_reference_list) - logical_presentations (list unit_reference_list - (object UseCaseDiagram "Main" - quid "355326F5025B" - title "Main" - zoom 100 - max_height 28350 - max_width 21600 - origin_x 0 - origin_y 0 - items (list diagram_item_list)))) - root_category (object Class_Category "Logical View" - quid "355326EE002A" - exportControl "Public" - global TRUE - subsystem "Component View" - quidu "355326EE003E" - logical_models (list unit_reference_list - (object Class "CVersitParser" - quid "3553270E02EC" - documentation "The base Versit parser class, providing functions to aid parsing a stream into a Versit object, as well as the facility to add properties and sub-entities to an existing object. The key methods are Internalize and Externalize, used to convert to and from stream form." - fields (list has_relationship_list - (object Has_Relationship - quid "3553302402E7" - supplier "Logical View::CParserPropertyHBufC" - quidu "35532EC801C4" - supplier_cardinality (value cardinality "0..n")) - (object Has_Relationship - quid "356EAC060148" - label "0..n" - supplier "Logical View::CParserProperty" - quidu "35532FAE025B")) - operations (list Operations - (object Operation "InternalizeL" - quid "3553356B03C6" - concurrency "Sequential" - opExportControl "Public" - uid 0) - (object Operation "ExternalizeL" - quid "355335B802EA" - concurrency "Sequential" - opExportControl "Public" - uid 0) - (object Operation "AddEntityL" - quid "356E92480020" - concurrency "Sequential" - opExportControl "Public" - uid 0) - (object Operation "AddPropertyL" - quid "356E925602FB" - concurrency "Sequential" - opExportControl "Public" - uid 0) - (object Operation "EntityL" - quid "356E9265031B" - result "CArrayPtrFlat" - concurrency "Sequential" - opExportControl "Public" - uid 0) - (object Operation "PropertyL" - quid "356E9273039D" - result "CArrayPtrFlat" - concurrency "Sequential" - opExportControl "Public" - uid 0) - (object Operation "GroupOfPropertiesL" - quid "356E92C403A4" - result "CArrayPtrFlat" - concurrency "Sequential" - opExportControl "Public" - uid 0)) - language "C++") - (object Class "CParserVCard" - quid "355327CA0301" - superclasses (list inheritance_relationship_list - (object Inheritance_Relationship - quid "35532D7202F9" - supplier "Logical View::CVersitParser" - quidu "3553270E02EC")) - language "C++") - (object Class "CParserVCal" - quid "35532CB10020" - fields (list has_relationship_list - (object Has_Relationship - quid "355331AE009F" - supplier "Logical View::VCalToDoParse" - quidu "35532D9A0057" - supplier_cardinality (value cardinality "0..n")) - (object Has_Relationship - quid "355331D301B0" - supplier "Logical View::CParserVCalEntity" - quidu "35532DAE02CD" - supplier_cardinality (value cardinality "0..n"))) - superclasses (list inheritance_relationship_list - (object Inheritance_Relationship - quid "35532D6A01AD" - supplier "Logical View::CVersitParser" - quidu "3553270E02EC")) - language "C++") - (object Class "VCalToDoParse" - quid "35532D9A0057" - superclasses (list inheritance_relationship_list - (object Inheritance_Relationship - quid "35532DCF019E" - supplier "Logical View::CVersitParser" - quidu "3553270E02EC")) - language "C++") - (object Class "CParserVCalEntity" - quid "35532DAE02CD" - documentation "This class represents a Todo or Event sub-entity within the VCal object" - superclasses (list inheritance_relationship_list - (object Inheritance_Relationship - quid "35532DD8029B" - supplier "Logical View::CVersitParser" - quidu "3553270E02EC")) - language "C++") - (object Class "CParserParam" - quid "35532EA700F4" - documentation "A generic property parameter class, consisting of a Name and optionally a value, both in descriptor form." - operations (list Operations - (object Operation "Name" - quid "356E942C00F8" - concurrency "Sequential" - opExportControl "Public" - uid 0) - (object Operation "Value" - quid "356E943102AE" - concurrency "Sequential" - opExportControl "Public" - uid 0) - (object Operation "WriteValueToStream" - quid "356E944D02F4" - concurrency "Sequential" - opExportControl "Public" - uid 0)) - language "C++") - (object Class "CParserPropertyHBufC" - quid "35532EC801C4" - superclasses (list inheritance_relationship_list - (object Inheritance_Relationship - quid "3553301D0016" - supplier "Logical View::CParserProperty" - quidu "35532FAE025B")) - language "C++") - (object Class "CVTimeParam" - quid "35532F2602EC" - superclasses (list inheritance_relationship_list - (object Inheritance_Relationship - quid "35532F4100CE" - supplier "Logical View::CParserParam" - quidu "35532EA700F4")) - language "C++") - (object Class "CParserProperty" - quid "35532FAE025B" - documentation "The Base property class, corresponding to a property, and storing its name and associated groups and parameters. Subclasses are identified by Uid." - operations (list Operations - (object Operation "ExternalizeL" - quid "356EAE71035B" - concurrency "Sequential" - opExportControl "Public" - uid 0) - (object Operation "Param" - quid "356EAE8300E0" - concurrency "Sequential" - opExportControl "Public" - uid 0) - (object Operation "AddParamL" - quid "356EAE8B0019" - concurrency "Sequential" - opExportControl "Public" - uid 0) - (object Operation "Group" - quid "356EAE92013C" - concurrency "Sequential" - opExportControl "Public" - uid 0) - (object Operation "Uid" - quid "356EAE950190" - concurrency "Sequential" - opExportControl "Public" - uid 0) - (object Operation "Name" - quid "356EAE9C000A" - concurrency "Sequential" - opExportControl "Public" - uid 0) - (object Operation "SetName" - quid "356EAEA1007F" - concurrency "Sequential" - opExportControl "Public" - uid 0) - (object Operation "WriteValueToStream" - quid "356EAEAB028C" - concurrency "Sequential" - opExportControl "Public" - uid 0)) - language "C++") - (object Class "CPropertyProperty" - quid "35532FED0021" - superclasses (list inheritance_relationship_list - (object Inheritance_Relationship - quid "3553302001B5" - supplier "Logical View::CParserPropertyHBufC" - quidu "35532EC801C4")) - language "C++") - (object Class "AgendaModelVCalWriter/Reader" - quid "3556CADC02A2" - used_nodes (list uses_relationship_list - (object Uses_Relationship - quid "3556CB2A03B3" - supplier "Logical View::CParserPropertyHBufC" - quidu "35532EC801C4") - (object Uses_Relationship - quid "3556CB4E0382" - supplier "Logical View::CParserVCal" - quidu "35532CB10020")) - language "C++") - (object Class "CVAgendaModelVCalReader" - quid "3556CB0A008B" - language "C++") - (object Class "CParserPropertyDateTime" - quid "356EAC6F029E" - superclasses (list inheritance_relationship_list - (object Inheritance_Relationship - quid "356EAC84026C" - supplier "Logical View::CParserProperty" - quidu "35532FAE025B")) - language "C++") - (object Class "CParserPropertyCDesCArray" - quid "356EAC720049" - superclasses (list inheritance_relationship_list - (object Inheritance_Relationship - quid "356EAC7E029F" - supplier "Logical View::CParserProperty" - quidu "35532FAE025B")) - language "C++") - (object Class "CParserPropertyMultiDateTime" - quid "356EAC790361" - superclasses (list inheritance_relationship_list - (object Inheritance_Relationship - quid "356EAC87007C" - supplier "Logical View::CParserProperty" - quidu "35532FAE025B")) - language "C++") - (object Class "CParserPropertyInt" - quid "356EAE41015D" - superclasses (list inheritance_relationship_list - (object Inheritance_Relationship - quid "356EAE460024" - supplier "Logical View::CParserProperty" - quidu "35532FAE025B")) - language "C++") - (object Class "CParserPropertyAlarm" - quid "356EAE5B001A" - superclasses (list inheritance_relationship_list - (object Inheritance_Relationship - quid "356EAE660111" - supplier "Logical View::CParserProperty" - quidu "35532FAE025B")) - language "C++") - (object Class "ContactsApp" - quid "356EAF280282" - used_nodes (list uses_relationship_list - (object Uses_Relationship - quid "356EAF3802B7" - supplier "Logical View::CParserVCard" - quidu "355327CA0301")) - language "C++")) - logical_presentations (list unit_reference_list - (object ClassDiagram "Main" - quid "355326F5020A" - title "Main" - zoom 69 - max_height 28350 - max_width 21600 - origin_x 37 - origin_y 0 - items (list diagram_item_list - (object ClassView "Class" "Logical View::CVersitParser" @1 - IncludeAttribute TRUE - IncludeOperation TRUE - location (1728, 480) - label (object ItemLabel - Parent_View @1 - location (1528, 266) - nlines 2 - max_width 477 - justify 0 - label "CVersitParser") - icon_style "Icon" - quidu "3553270E02EC" - compartment (object Compartment - Parent_View @1 - location (1528, 329) - icon_style "Icon" - anchor 2 - nlines 9 - max_width 382 - justify 0) - width 692 - height 624 - annotation 8 - autoResize TRUE) - (object ClassView "Class" "Logical View::CParserVCal" @2 - IncludeAttribute TRUE - IncludeOperation TRUE - location (2112, 1312) - label (object ItemLabel - Parent_View @2 - location (1944, 1228) - nlines 2 - max_width 396 - justify 0 - label "CParserVCal") - icon_style "Icon" - quidu "35532CB10020" - compartment (object Compartment - Parent_View @2 - location (1944, 1291) - icon_style "Icon" - anchor 2 - nlines 2 - max_width 312 - justify 0) - width 574 - annotation 8 - autoResize TRUE) - (object ClassView "Class" "Logical View::CParserVCard" @3 - IncludeAttribute TRUE - IncludeOperation TRUE - location (3088, 832) - label (object ItemLabel - Parent_View @3 - location (2984, 748) - nlines 2 - max_width 240 - justify 0 - label "CParserVCard") - icon_style "Icon" - quidu "355327CA0301" - annotation 8 - autoResize TRUE) - (object InheritView "" @4 - stereotype TRUE - quidu "35532D6A01AD" - client @2 - supplier @1 - line_style 0) - (object InheritView "" @5 - stereotype TRUE - quidu "35532D7202F9" - client @3 - supplier @1 - line_style 0) - (object ClassView "Class" "Logical View::CParserVCalEntity" @6 - IncludeAttribute TRUE - IncludeOperation TRUE - location (2976, 1472) - label (object ItemLabel - Parent_View @6 - location (2872, 1388) - nlines 2 - max_width 240 - justify 0 - label "CParserVCalEntity") - icon_style "Icon" - quidu "35532DAE02CD" - annotation 8 - autoResize TRUE) - (object InheritView "" @7 - stereotype TRUE - quidu "35532DD8029B" - client @6 - supplier @1 - line_style 0) - (object ClassView "Class" "Logical View::CParserParam" @8 - IncludeAttribute TRUE - IncludeOperation TRUE - location (416, 208) - label (object ItemLabel - Parent_View @8 - location (239, 112) - nlines 2 - max_width 418 - justify 0 - label "CParserParam") - icon_style "Icon" - quidu "35532EA700F4" - compartment (object Compartment - Parent_View @8 - location (239, 175) - icon_style "Icon" - anchor 2 - nlines 3 - max_width 344 - justify 0) - width 606 - height 286 - annotation 8 - autoResize TRUE) - (object HasView "" @9 - stereotype TRUE - quidu "355331D301B0" - client @2 - supplier @6 - line_style 0) - (object ClassView "Class" "Logical View::AgendaModelVCalWriter/Reader" @10 - IncludeAttribute TRUE - IncludeOperation TRUE - location (1776, 1776) - label (object ItemLabel - Parent_View @10 - location (1644, 1692) - nlines 2 - max_width 310 - justify 0 - label "AgendaModelVCalWriter/Reader") - icon_style "Icon" - quidu "3556CADC02A2" - width 450 - annotation 8 - autoResize TRUE) - (object UsesView "" @11 - stereotype TRUE - quidu "3556CB4E0382" - client @10 - supplier @2 - line_style 0) - (object ClassView "Class" "Logical View::CParserProperty" @12 - IncludeAttribute TRUE - IncludeOperation TRUE - location (736, 896) - label (object ItemLabel - Parent_View @12 - location (555, 701) - nlines 2 - max_width 430 - justify 0 - label "CParserProperty") - icon_style "Icon" - quidu "35532FAE025B" - compartment (object Compartment - Parent_View @12 - location (555, 764) - icon_style "Icon" - anchor 2 - nlines 8 - max_width 344 - justify 0) - width 624 - height 570 - annotation 8 - autoResize TRUE) - (object HasView "0..n" @13 - label (object ItemLabel - Parent_View @13 - location (1282, 660) - anchor_loc 1 - nlines 1 - max_width 450 - justify 0 - label "0..n") - stereotype TRUE - quidu "356EAC060148" - client @1 - supplier @12 - line_style 0) - (object ClassView "Class" "Logical View::CParserPropertyHBufC" @14 - IncludeAttribute TRUE - IncludeOperation TRUE - location (1296, 1552) - label (object ItemLabel - Parent_View @14 - location (1186, 1468) - nlines 2 - max_width 256 - justify 0 - label "CParserPropertyHBufC") - icon_style "Icon" - quidu "35532EC801C4" - width 372 - annotation 8 - autoResize TRUE) - (object InheritView "" @15 - stereotype TRUE - quidu "3553301D0016" - client @14 - supplier @12 - line_style 0) - (object ClassView "Class" "Logical View::CParserPropertyDateTime" @16 - IncludeAttribute TRUE - IncludeOperation TRUE - location (704, 1712) - label (object ItemLabel - Parent_View @16 - location (585, 1628) - nlines 2 - max_width 278 - justify 0 - label "CParserPropertyDateTime") - icon_style "Icon" - quidu "356EAC6F029E" - width 404 - annotation 8 - autoResize TRUE) - (object ClassView "Class" "Logical View::CParserPropertyCDesCArray" @17 - IncludeAttribute TRUE - IncludeOperation TRUE - location (240, 1408) - label (object ItemLabel - Parent_View @17 - location (122, 1324) - nlines 2 - max_width 274 - justify 0 - label "CParserPropertyCDesCArray") - icon_style "Icon" - quidu "356EAC720049" - width 398 - annotation 8 - autoResize TRUE) - (object ClassView "Class" "Logical View::CParserPropertyMultiDateTime" @18 - IncludeAttribute TRUE - IncludeOperation TRUE - location (336, 2000) - label (object ItemLabel - Parent_View @18 - location (220, 1916) - nlines 2 - max_width 270 - justify 0 - label "CParserPropertyMultiDateTime") - icon_style "Icon" - quidu "356EAC790361" - width 392 - annotation 8 - autoResize TRUE) - (object InheritView "" @19 - stereotype TRUE - quidu "356EAC7E029F" - client @17 - supplier @12 - line_style 0) - (object InheritView "" @20 - stereotype TRUE - quidu "356EAC84026C" - client @16 - supplier @12 - line_style 0) - (object InheritView "" @21 - stereotype TRUE - quidu "356EAC87007C" - client @18 - supplier @12 - line_style 0) - (object ClassView "Class" "Logical View::CParserPropertyInt" @22 - IncludeAttribute TRUE - IncludeOperation TRUE - location (1280, 1952) - label (object ItemLabel - Parent_View @22 - location (1176, 1868) - nlines 2 - max_width 240 - justify 0 - label "CParserPropertyInt") - icon_style "Icon" - quidu "356EAE41015D" - annotation 8 - autoResize TRUE) - (object InheritView "" @23 - stereotype TRUE - quidu "356EAE460024" - client @22 - supplier @12 - line_style 0) - (object ClassView "Class" "Logical View::CParserPropertyAlarm" @24 - IncludeAttribute TRUE - IncludeOperation TRUE - location (1136, 2288) - label (object ItemLabel - Parent_View @24 - location (1032, 2204) - nlines 2 - max_width 242 - justify 0 - label "CParserPropertyAlarm") - icon_style "Icon" - quidu "356EAE5B001A" - width 352 - annotation 8 - autoResize TRUE) - (object InheritView "" @25 - stereotype TRUE - quidu "356EAE660111" - client @24 - supplier @12 - line_style 0) - (object ClassView "Class" "Logical View::ContactsApp" @26 - IncludeAttribute TRUE - IncludeOperation TRUE - location (3392, 1216) - label (object ItemLabel - Parent_View @26 - location (3288, 1132) - nlines 2 - max_width 240 - justify 0 - label "ContactsApp") - icon_style "Icon" - quidu "356EAF280282" - annotation 8 - autoResize TRUE) - (object UsesView "" @27 - stereotype TRUE - quidu "356EAF3802B7" - client @26 - supplier @3 - line_style 0))))) - root_subsystem (object SubSystem "Component View" - quid "355326EE003E" - physical_models (list unit_reference_list) - physical_presentations (list unit_reference_list - (object Module_Diagram "Main" - quid "355326F5025A" - title "Main" - zoom 100 - max_height 28350 - max_width 21600 - origin_x 0 - origin_y 0 - items (list diagram_item_list)))) - process_structure (object Processes - quid "355326EE003F" - ProcsNDevs (list - (object Process_Diagram "Deployment View" - quid "355326F5019C" - title "Deployment View" - zoom 100 - max_height 28350 - max_width 21600 - origin_x 0 - origin_y 0 - items (list diagram_item_list)))) - properties (object Properties - attributes (list Attribute_Set - (object Attribute - tool "DDL" - name "propertyId" - value "809135966") - (object Attribute - tool "DDL" - name "default__Project" - value (list Attribute_Set - (object Attribute - tool "DDL" - name "DataBase" - value ("DataBaseSet" 800)) - (object Attribute - tool "DDL" - name "DataBaseSet" - value (list Attribute_Set - (object Attribute - tool "DDL" - name "ANSI" - value 800) - (object Attribute - tool "DDL" - name "Oracle" - value 801) - (object Attribute - tool "DDL" - name "SQLServer" - value 802) - (object Attribute - tool "DDL" - name "Sybase" - value 803) - (object Attribute - tool "DDL" - name "Watcom" - value 804))) - (object Attribute - tool "DDL" - name "PrimaryKeyColumnName" - value "Id") - (object Attribute - tool "DDL" - name "PrimaryKeyColumnType" - value "NUMBER(5)") - (object Attribute - tool "DDL" - name "ViewName" - value "V_") - (object Attribute - tool "DDL" - name "TableName" - value "T_") - (object Attribute - tool "DDL" - name "InheritSuffix" - value "_V") - (object Attribute - tool "DDL" - name "DropClause" - value FALSE) - (object Attribute - tool "DDL" - name "BaseViews" - value FALSE) - (object Attribute - tool "DDL" - name "DDLScriptFilename" - value "DDL1.SQL"))) - (object Attribute - tool "DDL" - name "default__Attribute" - value (list Attribute_Set - (object Attribute - tool "DDL" - name "ColumnType" - value "VARCHAR") - (object Attribute - tool "DDL" - name "Length" - value "") - (object Attribute - tool "DDL" - name "NullsOK" - value TRUE) - (object Attribute - tool "DDL" - name "PrimaryKey" - value FALSE) - (object Attribute - tool "DDL" - name "Unique" - value FALSE) - (object Attribute - tool "DDL" - name "CompositeUnique" - value FALSE) - (object Attribute - tool "DDL" - name "CheckConstraint" - value ""))) - (object Attribute - tool "DDL" - name "HiddenTool" - value FALSE) - (object Attribute - tool "IDL" - name "propertyId" - value "809135966") - (object Attribute - tool "IDL" - name "default__Project" - value (list Attribute_Set - (object Attribute - tool "IDL" - name "CreateMissingDirectories" - value TRUE) - (object Attribute - tool "IDL" - name "StopOnError" - value TRUE) - (object Attribute - tool "IDL" - name "Directory" - value "AUTO GENERATE") - (object Attribute - tool "IDL" - name "GeneratePreserveRegions" - value TRUE))) - (object Attribute - tool "IDL" - name "default__Class" - value (list Attribute_Set - (object Attribute - tool "IDL" - name "ImplementationType" - value "") - (object Attribute - tool "IDL" - name "ConstValue" - value "") - (object Attribute - tool "IDL" - name "GenerateDefaultSpecifier" - value FALSE) - (object Attribute - tool "IDL" - name "DefaultSpecifier" - value "") - (object Attribute - tool "IDL" - name "IDLElement" - value TRUE) - (object Attribute - tool "IDL" - name "IDLSpecificationType" - value ("IDLSpecSet" 22)) - (object Attribute - tool "IDL" - name "IDLSpecSet" - value (list Attribute_Set - (object Attribute - tool "IDL" - name "Interface" - value 22) - (object Attribute - tool "IDL" - name "Typedef" - value 54) - (object Attribute - tool "IDL" - name "Enumeration" - value 8) - (object Attribute - tool "IDL" - name "Const" - value 71) - (object Attribute - tool "IDL" - name "Exception" - value 61) - (object Attribute - tool "IDL" - name "Struct" - value 51) - (object Attribute - tool "IDL" - name "Union" - value 81))))) - (object Attribute - tool "IDL" - name "default__Module-Spec" - value (list Attribute_Set - (object Attribute - tool "IDL" - name "Generate" - value TRUE) - (object Attribute - tool "IDL" - name "CmIdentification" - value (value Text " %X% %Q% %Z% %W%")) - (object Attribute - tool "IDL" - name "CopyrightNotice" - value (value Text "")) - (object Attribute - tool "IDL" - name "FileName" - value "AUTO GENERATE") - (object Attribute - tool "IDL" - name "GenerateIDLModule" - value FALSE) - (object Attribute - tool "IDL" - name "InclusionProtectionSymbol" - value "AUTO GENERATE") - (object Attribute - tool "IDL" - name "AdditionalIncludes" - value (value Text "")) - (object Attribute - tool "IDL" - name "IncludeBySimpleName" - value FALSE))) - (object Attribute - tool "IDL" - name "default__Module-Body" - value (list Attribute_Set - (object Attribute - tool "IDL" - name "CmIdentification" - value (value Text " %X% %Q% %Z% %W%")) - (object Attribute - tool "IDL" - name "CopyrightNotice" - value (value Text "")) - (object Attribute - tool "IDL" - name "FileName" - value "AUTO GENERATE") - (object Attribute - tool "IDL" - name "AdditionalIncludes" - value (value Text "")) - (object Attribute - tool "IDL" - name "IncludeBySimpleName" - value FALSE))) - (object Attribute - tool "IDL" - name "default__Operation" - value (list Attribute_Set - (object Attribute - tool "IDL" - name "OperationIsOneWay" - value FALSE) - (object Attribute - tool "IDL" - name "Context" - value "") - (object Attribute - tool "IDL" - name "Raises" - value ""))) - (object Attribute - tool "IDL" - name "default__Attribute" - value (list Attribute_Set - (object Attribute - tool "IDL" - name "CaseSpecifier" - value "") - (object Attribute - tool "IDL" - name "GenerateDataMember" - value TRUE) - (object Attribute - tool "IDL" - name "DataMemberName" - value "$relationship") - (object Attribute - tool "IDL" - name "IsReadOnly" - value FALSE) - (object Attribute - tool "IDL" - name "IsConst" - value FALSE) - (object Attribute - tool "IDL" - name "ConstValue" - value ""))) - (object Attribute - tool "IDL" - name "default__Has" - value (list Attribute_Set - (object Attribute - tool "IDL" - name "NameIfUnlabeled" - value "the_$supplier") - (object Attribute - tool "IDL" - name "GenerateDataMember" - value TRUE) - (object Attribute - tool "IDL" - name "DataMemberName" - value "$relationship") - (object Attribute - tool "IDL" - name "GenerateForwardReference" - value FALSE) - (object Attribute - tool "IDL" - name "IsReadOnly" - value FALSE) - (object Attribute - tool "IDL" - name "BoundedHasRelType" - value ("HasRelTypeSet" 47)) - (object Attribute - tool "IDL" - name "HasRelTypeSet" - value (list Attribute_Set - (object Attribute - tool "IDL" - name "Array" - value 24) - (object Attribute - tool "IDL" - name "Sequence" - value 47))))) - (object Attribute - tool "IDL" - name "default__Role" - value (list Attribute_Set - (object Attribute - tool "IDL" - name "NameIfUnlabeled" - value "the_$supplier") - (object Attribute - tool "IDL" - name "GenerateDataMember" - value TRUE) - (object Attribute - tool "IDL" - name "DataMemberName" - value "$relationship") - (object Attribute - tool "IDL" - name "GenerateForwardReference" - value FALSE) - (object Attribute - tool "IDL" - name "IsReadOnly" - value FALSE) - (object Attribute - tool "IDL" - name "BoundedRoleType" - value ("AssocTypeSet" 47)) - (object Attribute - tool "IDL" - name "AssocTypeSet" - value (list Attribute_Set - (object Attribute - tool "IDL" - name "Array" - value 24) - (object Attribute - tool "IDL" - name "Sequence" - value 47))))) - (object Attribute - tool "IDL" - name "default__Uses" - value (list Attribute_Set - (object Attribute - tool "IDL" - name "GenerateForwardReference" - value FALSE))) - (object Attribute - tool "IDL" - name "default__Subsystem" - value (list Attribute_Set - (object Attribute - tool "IDL" - name "Directory" - value "AUTO GENERATE"))) - (object Attribute - tool "IDL" - name "HiddenTool" - value FALSE) - (object Attribute - tool "cg" - name "propertyId" - value "809135966") - (object Attribute - tool "cg" - name "default__Project" - value (list Attribute_Set - (object Attribute - tool "cg" - name "UseMSVC" - value FALSE) - (object Attribute - tool "cg" - name "HeaderFileExtension" - value "h") - (object Attribute - tool "cg" - name "HeaderFileBackupExtension" - value "h~") - (object Attribute - tool "cg" - name "HeaderFileTemporaryExtension" - value "h#") - (object Attribute - tool "cg" - name "CodeFileExtension" - value "cpp") - (object Attribute - tool "cg" - name "CodeFileBackupExtension" - value "cp~") - (object Attribute - tool "cg" - name "CodeFileTemporaryExtension" - value "cp#") - (object Attribute - tool "cg" - name "CreateMissingDirectories" - value TRUE) - (object Attribute - tool "cg" - name "StopOnError" - value FALSE) - (object Attribute - tool "cg" - name "ErrorLimit" - value 30) - (object Attribute - tool "cg" - name "Directory" - value "$ROSECPP_SOURCE") - (object Attribute - tool "cg" - name "PathSeparator" - value "") - (object Attribute - tool "cg" - name "FileNameFormat" - value "128vx_b") - (object Attribute - tool "cg" - name "BooleanType" - value "int") - (object Attribute - tool "cg" - name "AllowTemplates" - value TRUE) - (object Attribute - tool "cg" - name "AllowProtectedInheritance" - value TRUE) - (object Attribute - tool "cg" - name "CommentWidth" - value 60) - (object Attribute - tool "cg" - name "OneByValueContainer" - value "$targetClass") - (object Attribute - tool "cg" - name "OneByReferenceContainer" - value "$targetClass *") - (object Attribute - tool "cg" - name "OptionalByValueContainer" - value "OptionalByValue<$targetClass>") - (object Attribute - tool "cg" - name "OptionalByReferenceContainer" - value "$targetClass *") - (object Attribute - tool "cg" - name "FixedByValueContainer" - value "$targetClass[$limit]") - (object Attribute - tool "cg" - name "UnorderedFixedByValueContainer" - value "$targetClass[$limit]") - (object Attribute - tool "cg" - name "FixedByReferenceContainer" - value "$targetClass *[$limit]") - (object Attribute - tool "cg" - name "UnorderedFixedByReferenceContainer" - value "$targetClass *[$limit]") - (object Attribute - tool "cg" - name "BoundedByValueContainer" - value "BoundedListByValue<$targetClass,$limit>") - (object Attribute - tool "cg" - name "UnorderedBoundedByValueContainer" - value "BoundedSetByValue<$targetClass,$limit>") - (object Attribute - tool "cg" - name "BoundedByReferenceContainer" - value "BoundedListByReference<$targetClass,$limit>") - (object Attribute - tool "cg" - name "UnorderedBoundedByReferenceContainer" - value "BoundedSetByReference<$targetClass,$limit>") - (object Attribute - tool "cg" - name "UnboundedByValueContainer" - value "UnboundedListByValue<$targetClass>") - (object Attribute - tool "cg" - name "UnorderedUnboundedByValueContainer" - value "UnboundedSetByValue<$targetClass>") - (object Attribute - tool "cg" - name "UnboundedByReferenceContainer" - value "UnboundedListByReference<$targetClass>") - (object Attribute - tool "cg" - name "UnorderedUnboundedByReferenceContainer" - value "UnboundedSetByReference<$targetClass>") - (object Attribute - tool "cg" - name "QualifiedByValueContainer" - value "AssociationByValue<$qualtype, $qualcont>") - (object Attribute - tool "cg" - name "UnorderedQualifiedByValueContainer" - value "DictionaryByValue<$qualtype, $qualcont>") - (object Attribute - tool "cg" - name "QualifiedByReferenceContainer" - value "AssociationByReference<$qualtype, $qualcont>") - (object Attribute - tool "cg" - name "UnorderedQualifiedByReferenceContainer" - value "DictionaryByReference<$qualtype, $qualcont>") - (object Attribute - tool "cg" - name "GeneratePreserveRegions" - value TRUE))) - (object Attribute - tool "cg" - name "default__Class" - value (list Attribute_Set - (object Attribute - tool "cg" - name "CodeName" - value "") - (object Attribute - tool "cg" - name "ImplementationType" - value "") - (object Attribute - tool "cg" - name "ClassKey" - value "class") - (object Attribute - tool "cg" - name "GenerateEmptyRegions" - value ("GenerateEmptyRegionSet" 3)) - (object Attribute - tool "cg" - name "GenerateEmptyRegionSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "None" - value 0) - (object Attribute - tool "cg" - name "Preserved" - value 1) - (object Attribute - tool "cg" - name "Unpreserved" - value 2) - (object Attribute - tool "cg" - name "All" - value 3))) - (object Attribute - tool "cg" - name "PutBodiesInSpec" - value FALSE) - (object Attribute - tool "cg" - name "GenerateDefaultConstructor" - value ("GenerateSet" 199)) - (object Attribute - tool "cg" - name "DefaultConstructorVisibility" - value ("VisibilitySet" 45)) - (object Attribute - tool "cg" - name "InlineDefaultConstructor" - value FALSE) - (object Attribute - tool "cg" - name "ExplicitDefaultConstructor" - value FALSE) - (object Attribute - tool "cg" - name "GenerateCopyConstructor" - value ("GenerateSet" 199)) - (object Attribute - tool "cg" - name "CopyConstructorVisibility" - value ("VisibilitySet" 45)) - (object Attribute - tool "cg" - name "InlineCopyConstructor" - value FALSE) - (object Attribute - tool "cg" - name "ExplicitCopyConstructor" - value FALSE) - (object Attribute - tool "cg" - name "GenerateDestructor" - value TRUE) - (object Attribute - tool "cg" - name "DestructorVisibility" - value ("VisibilitySet" 45)) - (object Attribute - tool "cg" - name "DestructorKind" - value ("ThreeKindSet" 200)) - (object Attribute - tool "cg" - name "InlineDestructor" - value FALSE) - (object Attribute - tool "cg" - name "GenerateAssignmentOperation" - value ("GenerateSet" 199)) - (object Attribute - tool "cg" - name "AssignmentVisibility" - value ("VisibilitySet" 45)) - (object Attribute - tool "cg" - name "AssignmentKind" - value ("ThreeKindSet" 200)) - (object Attribute - tool "cg" - name "InlineAssignmentOperation" - value FALSE) - (object Attribute - tool "cg" - name "GenerateEqualityOperations" - value ("GenerateSet" 199)) - (object Attribute - tool "cg" - name "EqualityVisibility" - value ("VisibilitySet" 45)) - (object Attribute - tool "cg" - name "EqualityKind" - value ("FriendKindSet" 200)) - (object Attribute - tool "cg" - name "InlineEqualityOperations" - value FALSE) - (object Attribute - tool "cg" - name "GenerateRelationalOperations" - value FALSE) - (object Attribute - tool "cg" - name "RelationalVisibility" - value ("VisibilitySet" 45)) - (object Attribute - tool "cg" - name "RelationalKind" - value ("FriendKindSet" 200)) - (object Attribute - tool "cg" - name "InlineRelationalOperations" - value FALSE) - (object Attribute - tool "cg" - name "GenerateStorageMgmtOperations" - value FALSE) - (object Attribute - tool "cg" - name "StorageMgmtVisibility" - value ("VisibilitySet" 45)) - (object Attribute - tool "cg" - name "InlineStorageMgmtOperations" - value FALSE) - (object Attribute - tool "cg" - name "GenerateSubscriptOperation" - value FALSE) - (object Attribute - tool "cg" - name "SubscriptVisibility" - value ("VisibilitySet" 45)) - (object Attribute - tool "cg" - name "SubscriptKind" - value ("ThreeKindSet" 200)) - (object Attribute - tool "cg" - name "SubscriptResultType" - value "") - (object Attribute - tool "cg" - name "InlineSubscriptOperation" - value FALSE) - (object Attribute - tool "cg" - name "GenerateDereferenceOperation" - value FALSE) - (object Attribute - tool "cg" - name "DereferenceVisibility" - value ("VisibilitySet" 45)) - (object Attribute - tool "cg" - name "DereferenceKind" - value ("ThreeKindSet" 200)) - (object Attribute - tool "cg" - name "DereferenceResultType" - value "") - (object Attribute - tool "cg" - name "InlineDereferenceOperation" - value FALSE) - (object Attribute - tool "cg" - name "GenerateIndirectionOperation" - value FALSE) - (object Attribute - tool "cg" - name "IndirectionVisibility" - value ("VisibilitySet" 45)) - (object Attribute - tool "cg" - name "IndirectionKind" - value ("ThreeKindSet" 200)) - (object Attribute - tool "cg" - name "IndirectionResultType" - value "") - (object Attribute - tool "cg" - name "InlineIndirectionOperation" - value FALSE) - (object Attribute - tool "cg" - name "GenerateStreamOperations" - value FALSE) - (object Attribute - tool "cg" - name "StreamVisibility" - value ("VisibilitySet" 45)) - (object Attribute - tool "cg" - name "InlineStreamOperations" - value FALSE) - (object Attribute - tool "cg" - name "ThreeKindSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Common" - value 200) - (object Attribute - tool "cg" - name "Virtual" - value 201) - (object Attribute - tool "cg" - name "Abstract" - value 202))) - (object Attribute - tool "cg" - name "KindSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Common" - value 200) - (object Attribute - tool "cg" - name "Virtual" - value 201) - (object Attribute - tool "cg" - name "Abstract" - value 202) - (object Attribute - tool "cg" - name "Static" - value 203))) - (object Attribute - tool "cg" - name "FriendKindSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Common" - value 200) - (object Attribute - tool "cg" - name "Virtual" - value 201) - (object Attribute - tool "cg" - name "Abstract" - value 202) - (object Attribute - tool "cg" - name "Friend" - value 204))) - (object Attribute - tool "cg" - name "GenerateSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "DeclareAndDefine" - value 199) - (object Attribute - tool "cg" - name "DeclareOnly" - value 205) - (object Attribute - tool "cg" - name "DoNotDeclare" - value 206))) - (object Attribute - tool "cg" - name "VisibilitySet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Public" - value 45) - (object Attribute - tool "cg" - name "Protected" - value 44) - (object Attribute - tool "cg" - name "Private" - value 43) - (object Attribute - tool "cg" - name "Implementation" - value 14))) - (object Attribute - tool "cg" - name "ConstValue" - value "") - (object Attribute - tool "cg" - name "GenerateDefaultSpecifier" - value FALSE) - (object Attribute - tool "cg" - name "DefaultSpecifier" - value ""))) - (object Attribute - tool "cg" - name "default__Module-Spec" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Generate" - value TRUE) - (object Attribute - tool "cg" - name "GenerateEmptyRegions" - value ("GenerateEmptyRegionSet" 3)) - (object Attribute - tool "cg" - name "GenerateEmptyRegionSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "None" - value 0) - (object Attribute - tool "cg" - name "Preserved" - value 1) - (object Attribute - tool "cg" - name "Unpreserved" - value 2) - (object Attribute - tool "cg" - name "All" - value 3))) - (object Attribute - tool "cg" - name "CmIdentification" - value (value Text " %X% %Q% %Z% %W%")) - (object Attribute - tool "cg" - name "CopyrightNotice" - value (value Text "")) - (object Attribute - tool "cg" - name "FileName" - value "AUTO GENERATE") - (object Attribute - tool "cg" - name "AllowExtensionlessFileName" - value FALSE) - (object Attribute - tool "cg" - name "InclusionProtectionSymbol" - value "AUTO GENERATE") - (object Attribute - tool "cg" - name "IncludeFormat" - value (value Text -|// $package -|#include "$file" -| - )) - (object Attribute - tool "cg" - name "IncludeBySimpleName" - value FALSE) - (object Attribute - tool "cg" - name "IncludePrecompiledHeader" - value FALSE) - (object Attribute - tool "cg" - name "IncludeOrder" - value "AMIR") - (object Attribute - tool "cg" - name "AdditionalIncludes" - value (value Text "")) - (object Attribute - tool "cg" - name "InliningStyle" - value ("InliningStyleSet" 207)) - (object Attribute - tool "cg" - name "InliningStyleSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "InClassDeclaration" - value 208) - (object Attribute - tool "cg" - name "FollowingClassDeclaration" - value 207))) - (object Attribute - tool "cg" - name "TypesDefined" - value (value Text "")) - (object Attribute - tool "cg" - name "IncludeClosure" - value (value Text "")))) - (object Attribute - tool "cg" - name "default__Module-Body" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Generate" - value TRUE) - (object Attribute - tool "cg" - name "GenerateEmptyRegions" - value ("GenerateEmptyRegionSet" 3)) - (object Attribute - tool "cg" - name "GenerateEmptyRegionSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "None" - value 0) - (object Attribute - tool "cg" - name "Preserved" - value 1) - (object Attribute - tool "cg" - name "Unpreserved" - value 2) - (object Attribute - tool "cg" - name "All" - value 3))) - (object Attribute - tool "cg" - name "CmIdentification" - value (value Text " %X% %Q% %Z% %W%")) - (object Attribute - tool "cg" - name "CopyrightNotice" - value (value Text "")) - (object Attribute - tool "cg" - name "FileName" - value "AUTO GENERATE") - (object Attribute - tool "cg" - name "AllowExtensionlessFileName" - value FALSE) - (object Attribute - tool "cg" - name "IncludeFormat" - value (value Text -|// $package -|#include "$file" -| - )) - (object Attribute - tool "cg" - name "IncludeBySimpleName" - value FALSE) - (object Attribute - tool "cg" - name "IncludePrecompiledHeader" - value TRUE) - (object Attribute - tool "cg" - name "IncludeOrder" - value "AMIR") - (object Attribute - tool "cg" - name "AdditionalIncludes" - value (value Text "")) - (object Attribute - tool "cg" - name "InliningStyle" - value ("InliningStyleSet" 207)) - (object Attribute - tool "cg" - name "InliningStyleSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "InClassDeclaration" - value 208) - (object Attribute - tool "cg" - name "FollowingClassDeclaration" - value 207))) - (object Attribute - tool "cg" - name "TypesDefined" - value (value Text "")) - (object Attribute - tool "cg" - name "IncludeClosure" - value (value Text "")))) - (object Attribute - tool "cg" - name "default__Operation" - value (list Attribute_Set - (object Attribute - tool "cg" - name "CodeName" - value "") - (object Attribute - tool "cg" - name "OperationKind" - value ("OperationKindSet" 200)) - (object Attribute - tool "cg" - name "OperationKindSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Common" - value 200) - (object Attribute - tool "cg" - name "Virtual" - value 201) - (object Attribute - tool "cg" - name "Abstract" - value 202) - (object Attribute - tool "cg" - name "Static" - value 203) - (object Attribute - tool "cg" - name "Friend" - value 204))) - (object Attribute - tool "cg" - name "OperationIsConst" - value FALSE) - (object Attribute - tool "cg" - name "OperationIsExplicit" - value FALSE) - (object Attribute - tool "cg" - name "Inline" - value FALSE) - (object Attribute - tool "cg" - name "EntryCode" - value (value Text "")) - (object Attribute - tool "cg" - name "ExitCode" - value (value Text "")) - (object Attribute - tool "cg" - name "GenerateEmptyRegions" - value ("GenerateEmptyRegionSet" 3)) - (object Attribute - tool "cg" - name "GenerateEmptyRegionSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "None" - value 0) - (object Attribute - tool "cg" - name "Preserved" - value 1) - (object Attribute - tool "cg" - name "Unpreserved" - value 2) - (object Attribute - tool "cg" - name "All" - value 3))) - (object Attribute - tool "cg" - name "BodyAnnotations" - value "") - (object Attribute - tool "cg" - name "OperationIsOneWay" - value FALSE) - (object Attribute - tool "cg" - name "Context" - value "") - (object Attribute - tool "cg" - name "Raises" - value ""))) - (object Attribute - tool "cg" - name "default__Has" - value (list Attribute_Set - (object Attribute - tool "cg" - name "CodeName" - value "") - (object Attribute - tool "cg" - name "Ordered" - value TRUE) - (object Attribute - tool "cg" - name "NameIfUnlabeled" - value "the_$supplier") - (object Attribute - tool "cg" - name "GenerateDataMember" - value TRUE) - (object Attribute - tool "cg" - name "DataMemberName" - value "$relationship") - (object Attribute - tool "cg" - name "DataMemberVisibility" - value ("DataMemberVisibilitySet" 14)) - (object Attribute - tool "cg" - name "DataMemberVisibilitySet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Public" - value 45) - (object Attribute - tool "cg" - name "Protected" - value 44) - (object Attribute - tool "cg" - name "Private" - value 43) - (object Attribute - tool "cg" - name "Implementation" - value 14) - (object Attribute - tool "cg" - name "AtRelationshipVisibility" - value 210))) - (object Attribute - tool "cg" - name "DataMemberMutability" - value ("DataMemberMutabilitySet" 0)) - (object Attribute - tool "cg" - name "DataMemberMutabilitySet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Unrestricted" - value 0) - (object Attribute - tool "cg" - name "Mutable" - value 1) - (object Attribute - tool "cg" - name "Const" - value 2))) - (object Attribute - tool "cg" - name "DataMemberIsVolatile" - value FALSE) - (object Attribute - tool "cg" - name "DataMemberFieldSize" - value "") - (object Attribute - tool "cg" - name "InitialValue" - value (value Text "")) - (object Attribute - tool "cg" - name "GenerateGetOperation" - value TRUE) - (object Attribute - tool "cg" - name "GenerateSetOperation" - value TRUE) - (object Attribute - tool "cg" - name "GetName" - value "get_$relationship") - (object Attribute - tool "cg" - name "SetName" - value "set_$relationship") - (object Attribute - tool "cg" - name "GetSetKinds" - value ("GetSetKindsSet" 200)) - (object Attribute - tool "cg" - name "GetSetKindsSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Common" - value 200) - (object Attribute - tool "cg" - name "Virtual" - value 201) - (object Attribute - tool "cg" - name "Abstract" - value 202) - (object Attribute - tool "cg" - name "Static" - value 203) - (object Attribute - tool "cg" - name "Friend" - value 204))) - (object Attribute - tool "cg" - name "ContainerClass" - value "") - (object Attribute - tool "cg" - name "SelectorName" - value "") - (object Attribute - tool "cg" - name "SelectorType" - value "") - (object Attribute - tool "cg" - name "GetIsConst" - value TRUE) - (object Attribute - tool "cg" - name "GetResultIsConst" - value ("GetResultIsConstSet" 2)) - (object Attribute - tool "cg" - name "GetResultIsConstSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "False" - value 0) - (object Attribute - tool "cg" - name "True" - value 1) - (object Attribute - tool "cg" - name "Same_As_Function" - value 2))) - (object Attribute - tool "cg" - name "GetSetByReference" - value FALSE) - (object Attribute - tool "cg" - name "InlineGet" - value TRUE) - (object Attribute - tool "cg" - name "SetReturnsValue" - value FALSE) - (object Attribute - tool "cg" - name "InlineSet" - value TRUE) - (object Attribute - tool "cg" - name "ForwardReferenceOnly" - value FALSE) - (object Attribute - tool "cg" - name "GenerateForwardReference" - value FALSE) - (object Attribute - tool "cg" - name "IsReadOnly" - value FALSE) - (object Attribute - tool "cg" - name "BoundedHasRelType" - value ("HasRelTypeSet" 47)) - (object Attribute - tool "cg" - name "HasRelTypeSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Array" - value 24) - (object Attribute - tool "cg" - name "Sequence" - value 47))))) - (object Attribute - tool "cg" - name "default__Association" - value (list Attribute_Set - (object Attribute - tool "cg" - name "NameIfUnlabeled" - value "the_$targetClass"))) - (object Attribute - tool "cg" - name "default__Inherit" - value (list Attribute_Set - (object Attribute - tool "cg" - name "InstanceArguments" - value ""))) - (object Attribute - tool "cg" - name "default__Role" - value (list Attribute_Set - (object Attribute - tool "cg" - name "CodeName" - value "") - (object Attribute - tool "cg" - name "ForwardReferenceOnly" - value FALSE) - (object Attribute - tool "cg" - name "NameIfUnlabeled" - value "the_$targetClass") - (object Attribute - tool "cg" - name "GenerateDataMember" - value TRUE) - (object Attribute - tool "cg" - name "DataMemberName" - value "$target") - (object Attribute - tool "cg" - name "DataMemberVisibility" - value ("DataMemberVisibilitySet" 14)) - (object Attribute - tool "cg" - name "DataMemberVisibilitySet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Public" - value 45) - (object Attribute - tool "cg" - name "Protected" - value 44) - (object Attribute - tool "cg" - name "Private" - value 43) - (object Attribute - tool "cg" - name "Implementation" - value 14) - (object Attribute - tool "cg" - name "AtRelationshipVisibility" - value 210))) - (object Attribute - tool "cg" - name "DataMemberMutability" - value ("DataMemberMutabilitySet" 0)) - (object Attribute - tool "cg" - name "DataMemberMutabilitySet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Unrestricted" - value 0) - (object Attribute - tool "cg" - name "Mutable" - value 1) - (object Attribute - tool "cg" - name "Const" - value 2))) - (object Attribute - tool "cg" - name "DataMemberIsVolatile" - value FALSE) - (object Attribute - tool "cg" - name "DataMemberFieldSize" - value "") - (object Attribute - tool "cg" - name "InitialValue" - value (value Text "")) - (object Attribute - tool "cg" - name "ContainerClass" - value "") - (object Attribute - tool "cg" - name "ContainerGet" - value "$data.get($keys)") - (object Attribute - tool "cg" - name "ContainerSet" - value "$data.set($keys,$value)") - (object Attribute - tool "cg" - name "QualifiedContainer" - value "") - (object Attribute - tool "cg" - name "AssocClassContainer" - value "$supplier *") - (object Attribute - tool "cg" - name "AssocClassInitialValue" - value (value Text "")) - (object Attribute - tool "cg" - name "GetSetKinds" - value ("GetSetKindsSet" 200)) - (object Attribute - tool "cg" - name "GetSetKindsSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Common" - value 200) - (object Attribute - tool "cg" - name "Virtual" - value 201) - (object Attribute - tool "cg" - name "Abstract" - value 202) - (object Attribute - tool "cg" - name "Static" - value 203) - (object Attribute - tool "cg" - name "Friend" - value 204))) - (object Attribute - tool "cg" - name "GetSetByReference" - value FALSE) - (object Attribute - tool "cg" - name "GenerateGetOperation" - value TRUE) - (object Attribute - tool "cg" - name "GetName" - value "get_$target") - (object Attribute - tool "cg" - name "GetIsConst" - value TRUE) - (object Attribute - tool "cg" - name "GetResultIsConst" - value ("GetResultIsConstSet" 2)) - (object Attribute - tool "cg" - name "GetResultIsConstSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "False" - value 0) - (object Attribute - tool "cg" - name "True" - value 1) - (object Attribute - tool "cg" - name "Same_As_Function" - value 2))) - (object Attribute - tool "cg" - name "InlineGet" - value TRUE) - (object Attribute - tool "cg" - name "GenerateSetOperation" - value TRUE) - (object Attribute - tool "cg" - name "SetName" - value "set_$target") - (object Attribute - tool "cg" - name "SetReturnsValue" - value FALSE) - (object Attribute - tool "cg" - name "InlineSet" - value TRUE) - (object Attribute - tool "cg" - name "QualifiedGetSetByReference" - value ("QualifiedGetSetByReferenceSet" 2)) - (object Attribute - tool "cg" - name "QualifiedGetSetByReferenceSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "False" - value 0) - (object Attribute - tool "cg" - name "True" - value 1) - (object Attribute - tool "cg" - name "Same_As_GetSetByReference" - value 2))) - (object Attribute - tool "cg" - name "GenerateQualifiedGetOperation" - value TRUE) - (object Attribute - tool "cg" - name "QualifiedGetName" - value "get_$target") - (object Attribute - tool "cg" - name "QualifiedGetIsConst" - value TRUE) - (object Attribute - tool "cg" - name "QualifiedGetResultIsConst" - value ("GetResultIsConstSet" 2)) - (object Attribute - tool "cg" - name "InlineQualifiedGet" - value TRUE) - (object Attribute - tool "cg" - name "GenerateQualifiedSetOperation" - value TRUE) - (object Attribute - tool "cg" - name "QualifiedSetName" - value "set_$target") - (object Attribute - tool "cg" - name "QualifiedSetReturnsValue" - value FALSE) - (object Attribute - tool "cg" - name "InlineQualifiedSet" - value TRUE) - (object Attribute - tool "cg" - name "GenerateAssocClassDataMember" - value TRUE) - (object Attribute - tool "cg" - name "AssocClassDataMemberName" - value "$target") - (object Attribute - tool "cg" - name "AssocClassDataMemberVisibility" - value ("DataMemberVisibilitySet" 14)) - (object Attribute - tool "cg" - name "DataMemberVisibilitySet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Public" - value 45) - (object Attribute - tool "cg" - name "Protected" - value 44) - (object Attribute - tool "cg" - name "Private" - value 43) - (object Attribute - tool "cg" - name "Implementation" - value 14) - (object Attribute - tool "cg" - name "AtRelationshipVisibility" - value 210))) - (object Attribute - tool "cg" - name "AssocClassDataMemberMutability" - value ("DataMemberMutabilitySet" 0)) - (object Attribute - tool "cg" - name "DataMemberMutabilitySet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Unrestricted" - value 0) - (object Attribute - tool "cg" - name "Mutable" - value 1) - (object Attribute - tool "cg" - name "Const" - value 2))) - (object Attribute - tool "cg" - name "AssocClassDataMemberIsVolatile" - value FALSE) - (object Attribute - tool "cg" - name "AssocClassGetSetKinds" - value ("GetSetKindsSet" 200)) - (object Attribute - tool "cg" - name "GenerateAssocClassGetOperation" - value TRUE) - (object Attribute - tool "cg" - name "AssocClassGetName" - value "get_$target") - (object Attribute - tool "cg" - name "AssocClassGetIsConst" - value TRUE) - (object Attribute - tool "cg" - name "AssocClassGetResultIsConst" - value ("GetResultIsConstSet" 2)) - (object Attribute - tool "cg" - name "InlineAssocClassGet" - value TRUE) - (object Attribute - tool "cg" - name "GenerateAssocClassSetOperation" - value TRUE) - (object Attribute - tool "cg" - name "AssocClassSetName" - value "set_$target") - (object Attribute - tool "cg" - name "AssocClassSetReturnsValue" - value FALSE) - (object Attribute - tool "cg" - name "InlineAssocClassSet" - value TRUE) - (object Attribute - tool "cg" - name "AssocClassForwardReferenceOnly" - value TRUE) - (object Attribute - tool "cg" - name "GenerateForwardReference" - value FALSE) - (object Attribute - tool "cg" - name "IsReadOnly" - value FALSE) - (object Attribute - tool "cg" - name "BoundedRoleType" - value ("AssocTypeSet" 47)) - (object Attribute - tool "cg" - name "AssocTypeSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Array" - value 24) - (object Attribute - tool "cg" - name "Sequence" - value 47))))) - (object Attribute - tool "cg" - name "default__Attribute" - value (list Attribute_Set - (object Attribute - tool "cg" - name "CodeName" - value "") - (object Attribute - tool "cg" - name "GenerateDataMember" - value TRUE) - (object Attribute - tool "cg" - name "DataMemberName" - value "$attribute") - (object Attribute - tool "cg" - name "DataMemberVisibility" - value ("DataMemberVisibilitySet" 14)) - (object Attribute - tool "cg" - name "DataMemberVisibilitySet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Public" - value 45) - (object Attribute - tool "cg" - name "Protected" - value 44) - (object Attribute - tool "cg" - name "Private" - value 43) - (object Attribute - tool "cg" - name "Implementation" - value 14) - (object Attribute - tool "cg" - name "AtAttributeVisibility" - value 211))) - (object Attribute - tool "cg" - name "DataMemberMutability" - value ("DataMemberMutabilitySet" 0)) - (object Attribute - tool "cg" - name "DataMemberMutabilitySet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Unrestricted" - value 0) - (object Attribute - tool "cg" - name "Mutable" - value 1) - (object Attribute - tool "cg" - name "Const" - value 2))) - (object Attribute - tool "cg" - name "DataMemberIsVolatile" - value FALSE) - (object Attribute - tool "cg" - name "DataMemberFieldSize" - value "") - (object Attribute - tool "cg" - name "GenerateGetOperation" - value TRUE) - (object Attribute - tool "cg" - name "GenerateSetOperation" - value TRUE) - (object Attribute - tool "cg" - name "GetName" - value "get_$attribute") - (object Attribute - tool "cg" - name "SetName" - value "set_$attribute") - (object Attribute - tool "cg" - name "GetSetKinds" - value ("GetSetKindsSet" 200)) - (object Attribute - tool "cg" - name "GetSetKindsSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Common" - value 200) - (object Attribute - tool "cg" - name "Virtual" - value 201) - (object Attribute - tool "cg" - name "Abstract" - value 202) - (object Attribute - tool "cg" - name "Static" - value 203) - (object Attribute - tool "cg" - name "Friend" - value 204))) - (object Attribute - tool "cg" - name "GetIsConst" - value TRUE) - (object Attribute - tool "cg" - name "GetResultIsConst" - value ("GetResultIsConstSet" 2)) - (object Attribute - tool "cg" - name "GetResultIsConstSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "False" - value 0) - (object Attribute - tool "cg" - name "True" - value 1) - (object Attribute - tool "cg" - name "Same_As_Function" - value 2))) - (object Attribute - tool "cg" - name "GetSetByReference" - value FALSE) - (object Attribute - tool "cg" - name "InlineGet" - value TRUE) - (object Attribute - tool "cg" - name "SetReturnsValue" - value FALSE) - (object Attribute - tool "cg" - name "InlineSet" - value TRUE) - (object Attribute - tool "cg" - name "CaseSpecifier" - value "") - (object Attribute - tool "cg" - name "IsReadOnly" - value FALSE))) - (object Attribute - tool "cg" - name "default__Uses" - value (list Attribute_Set - (object Attribute - tool "cg" - name "ForwardReferenceOnly" - value FALSE) - (object Attribute - tool "cg" - name "BodyReferenceOnly" - value FALSE) - (object Attribute - tool "cg" - name "GenerateForwardReference" - value FALSE))) - (object Attribute - tool "cg" - name "default__Subsystem" - value (list Attribute_Set - (object Attribute - tool "cg" - name "Directory" - value "AUTO GENERATE") - (object Attribute - tool "cg" - name "DirectoryIsOnSearchList" - value FALSE) - (object Attribute - tool "cg" - name "PrecompiledHeader" - value ""))) - (object Attribute - tool "cg" - name "default__Category" - value (list Attribute_Set - (object Attribute - tool "cg" - name "IsNamespace" - value FALSE) - (object Attribute - tool "cg" - name "Indent" - value 2) - (object Attribute - tool "cg" - name "CodeName" - value "") - (object Attribute - tool "cg" - name "GenerateEmptyRegions" - value ("GenerateEmptyRegionSet" 3)) - (object Attribute - tool "cg" - name "GenerateEmptyRegionSet" - value (list Attribute_Set - (object Attribute - tool "cg" - name "None" - value 0) - (object Attribute - tool "cg" - name "Preserved" - value 1) - (object Attribute - tool "cg" - name "Unpreserved" - value 2) - (object Attribute - tool "cg" - name "All" - value 3))))) - (object Attribute - tool "MSVC" - name "propertyId" - value "809135966") - (object Attribute - tool "MSVC" - name "default__Project" - value (list Attribute_Set - (object Attribute - tool "MSVC" - name "Version" - value "5.0"))) - (object Attribute - tool "MSVC" - name "default__Class" - value (list Attribute_Set - (object Attribute - tool "MSVC" - name "Type" - value ("MSVCClassTypeSet" 0)) - (object Attribute - tool "MSVC" - name "MSVCClassTypeSet" - value (list Attribute_Set - (object Attribute - tool "MSVC" - name "Normal" - value 0) - (object Attribute - tool "MSVC" - name "Interface_Part" - value 1) - (object Attribute - tool "MSVC" - name "Connection_Part" - value 2) - (object Attribute - tool "MSVC" - name "Class_Factory" - value 3))) - (object Attribute - tool "MSVC" - name "CObjectFunctionality" - value ("CObjectFunctionalitySet" 0)) - (object Attribute - tool "MSVC" - name "CObjectFunctionalitySet" - value (list Attribute_Set - (object Attribute - tool "MSVC" - name "None" - value 0) - (object Attribute - tool "MSVC" - name "Dynamic" - value 1) - (object Attribute - tool "MSVC" - name "Dyncreate" - value 2) - (object Attribute - tool "MSVC" - name "Serial" - value 3))) - (object Attribute - tool "MSVC" - name "GenerateOverrideGroup" - value FALSE) - (object Attribute - tool "MSVC" - name "GenerateDataGroup" - value FALSE) - (object Attribute - tool "MSVC" - name "AFX_DATA_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "GenerateFieldGroup" - value FALSE) - (object Attribute - tool "MSVC" - name "AFX_FIELD_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "GenerateMessageGroup" - value FALSE) - (object Attribute - tool "MSVC" - name "GenerateMessageMap" - value FALSE) - (object Attribute - tool "MSVC" - name "AFX_MSG_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "MESSAGE_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "OLEFactory" - value ("OLEFactorySet" 0)) - (object Attribute - tool "MSVC" - name "OLEFactorySet" - value (list Attribute_Set - (object Attribute - tool "MSVC" - name "None" - value 0) - (object Attribute - tool "MSVC" - name "Built_in" - value 1) - (object Attribute - tool "MSVC" - name "Simple" - value 2) - (object Attribute - tool "MSVC" - name "Licensed" - value 3))) - (object Attribute - tool "MSVC" - name "OLEName" - value "") - (object Attribute - tool "MSVC" - name "OLEClassID" - value "") - (object Attribute - tool "MSVC" - name "GenerateOLECtlType" - value FALSE) - (object Attribute - tool "MSVC" - name "OLECtlType" - value "") - (object Attribute - tool "MSVC" - name "GenerateOLETypeLib" - value FALSE) - (object Attribute - tool "MSVC" - name "OLETypeLibID" - value "") - (object Attribute - tool "MSVC" - name "OLETypeLibMajor" - value "") - (object Attribute - tool "MSVC" - name "OLETypeLibMinor" - value "") - (object Attribute - tool "MSVC" - name "GeneratePropPageIDs" - value FALSE) - (object Attribute - tool "MSVC" - name "OLEPropPageIDs" - value (value Text "")) - (object Attribute - tool "MSVC" - name "GenerateDispatchMap" - value FALSE) - (object Attribute - tool "MSVC" - name "AFX_DISPATCH_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "AFX_DISPATCH_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "DISPATCH_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "StockProperties" - value (value Text "")) - (object Attribute - tool "MSVC" - name "StockFunctions" - value (value Text "")) - (object Attribute - tool "MSVC" - name "DispatchDefValue" - value "") - (object Attribute - tool "MSVC" - name "GenerateDispIdEnum" - value FALSE) - (object Attribute - tool "MSVC" - name "AFX_DISP_ID_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "GenerateInterfaceMap" - value FALSE) - (object Attribute - tool "MSVC" - name "INTERFACE_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "InitInterface" - value "") - (object Attribute - tool "MSVC" - name "GenerateEventMap" - value FALSE) - (object Attribute - tool "MSVC" - name "AFX_EVENT_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "AFX_EVENT_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "EVENT_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "StockEvents" - value (value Text "")) - (object Attribute - tool "MSVC" - name "GenerateEventSinkMap" - value FALSE) - (object Attribute - tool "MSVC" - name "AFX_EVENTSINK_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "AFX_EVENTSINK_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "EVENTSINK_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "PropNotifySinks" - value (value Text "")) - (object Attribute - tool "MSVC" - name "GenerateConnectionMap" - value FALSE) - (object Attribute - tool "MSVC" - name "CONNECTION_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "ConnectionPointIID" - value "") - (object Attribute - tool "MSVC" - name "InheritanceType" - value "") - (object Attribute - tool "MSVC" - name "DeclSpec" - value "") - (object Attribute - tool "MSVC" - name "OLECommands" - value (value Text "")) - (object Attribute - tool "MSVC" - name "MFCDeclares" - value (value Text "")) - (object Attribute - tool "MSVC" - name "MFCImplements" - value (value Text "")) - (object Attribute - tool "MSVC" - name "ATL_Declares" - value (value Text "")) - (object Attribute - tool "MSVC" - name "GenerateCOMMap" - value FALSE) - (object Attribute - tool "MSVC" - name "COM_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "GenerateConnectionPointMap" - value FALSE) - (object Attribute - tool "MSVC" - name "CONNECTION_POINT_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "GenerateMsgMap" - value FALSE) - (object Attribute - tool "MSVC" - name "MSG_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "GeneratePropertyMap" - value FALSE) - (object Attribute - tool "MSVC" - name "PROPERTY_MAP_Entries" - value (value Text "")))) - (object Attribute - tool "MSVC" - name "default__Operation" - value (list Attribute_Set - (object Attribute - tool "MSVC" - name "Type" - value ("MSVCOperationTypeSet" 0)) - (object Attribute - tool "MSVC" - name "MSVCOperationTypeSet" - value (list Attribute_Set - (object Attribute - tool "MSVC" - name "Normal" - value 0) - (object Attribute - tool "MSVC" - name "Virtual_Override" - value 1) - (object Attribute - tool "MSVC" - name "Message_Handler" - value 2) - (object Attribute - tool "MSVC" - name "Dispatch_Handler" - value 3) - (object Attribute - tool "MSVC" - name "Event_Firing_Function" - value 4) - (object Attribute - tool "MSVC" - name "Event_Sink_Handler" - value 5) - (object Attribute - tool "MSVC" - name "Std_OLE_Method" - value 6) - (object Attribute - tool "MSVC" - name "Command_Parser" - value 7) - (object Attribute - tool "MSVC" - name "Property_Get_Function" - value 8) - (object Attribute - tool "MSVC" - name "Property_Set_Function" - value 9) - (object Attribute - tool "MSVC" - name "Property_Notify_Function" - value 10) - (object Attribute - tool "MSVC" - name "Macro_Generated_Function" - value 11))) - (object Attribute - tool "MSVC" - name "AFX_MSG_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "MESSAGE_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "AFX_DISPATCH_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "DISPATCH_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "AFX_EVENT_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "EVENT_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "AFX_EVENTSINK_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "EVENTSINK_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "CallType" - value "") - (object Attribute - tool "MSVC" - name "DeclSpec" - value "") - (object Attribute - tool "MSVC" - name "BodyImage" - value (value Text "")))) - (object Attribute - tool "MSVC" - name "default__Role" - value (list Attribute_Set - (object Attribute - tool "MSVC" - name "Type" - value ("MSVCAttributeTypeSet" 0)) - (object Attribute - tool "MSVC" - name "MSVCAttributeTypeSet" - value (list Attribute_Set - (object Attribute - tool "MSVC" - name "Normal" - value 0) - (object Attribute - tool "MSVC" - name "Member_Property" - value 1) - (object Attribute - tool "MSVC" - name "Get_Set_Property" - value 2) - (object Attribute - tool "MSVC" - name "Dialog_Data" - value 3) - (object Attribute - tool "MSVC" - name "Field_Data" - value 4) - (object Attribute - tool "MSVC" - name "Stock_Property" - value 5))) - (object Attribute - tool "MSVC" - name "AFX_DISPATCH_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "DISPATCH_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "DeclSpec" - value "") - (object Attribute - tool "MSVC" - name "PointerBase" - value "") - (object Attribute - tool "MSVC" - name "CallType" - value "") - (object Attribute - tool "MSVC" - name "StockPropertyImplementation" - value ""))) - (object Attribute - tool "MSVC" - name "default__Has" - value (list Attribute_Set - (object Attribute - tool "MSVC" - name "Type" - value ("MSVCAttributeTypeSet" 0)) - (object Attribute - tool "MSVC" - name "MSVCAttributeTypeSet" - value (list Attribute_Set - (object Attribute - tool "MSVC" - name "Normal" - value 0) - (object Attribute - tool "MSVC" - name "Member_Property" - value 1) - (object Attribute - tool "MSVC" - name "Get_Set_Property" - value 2) - (object Attribute - tool "MSVC" - name "Dialog_Data" - value 3) - (object Attribute - tool "MSVC" - name "Field_Data" - value 4) - (object Attribute - tool "MSVC" - name "Stock_Property" - value 5))) - (object Attribute - tool "MSVC" - name "AFX_DISPATCH_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "DISPATCH_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "DeclSpec" - value "") - (object Attribute - tool "MSVC" - name "PointerBase" - value "") - (object Attribute - tool "MSVC" - name "CallType" - value "") - (object Attribute - tool "MSVC" - name "StockPropertyImplementation" - value ""))) - (object Attribute - tool "MSVC" - name "default__Attribute" - value (list Attribute_Set - (object Attribute - tool "MSVC" - name "Type" - value ("MSVCAttributeTypeSet" 0)) - (object Attribute - tool "MSVC" - name "MSVCAttributeTypeSet" - value (list Attribute_Set - (object Attribute - tool "MSVC" - name "Normal" - value 0) - (object Attribute - tool "MSVC" - name "Member_Property" - value 1) - (object Attribute - tool "MSVC" - name "Get_Set_Property" - value 2) - (object Attribute - tool "MSVC" - name "Dialog_Data" - value 3) - (object Attribute - tool "MSVC" - name "Field_Data" - value 4) - (object Attribute - tool "MSVC" - name "Stock_Property" - value 5))) - (object Attribute - tool "MSVC" - name "AFX_DISPATCH_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "DISPATCH_MAP_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "DeclSpec" - value "") - (object Attribute - tool "MSVC" - name "PointerBase" - value "") - (object Attribute - tool "MSVC" - name "CallType" - value "") - (object Attribute - tool "MSVC" - name "StockPropertyImplementation" - value ""))) - (object Attribute - tool "MSVC" - name "default__Module-Spec" - value (list Attribute_Set - (object Attribute - tool "MSVC" - name "GenerateIncludesGroup" - value FALSE) - (object Attribute - tool "MSVC" - name "AFX_INCLUDES_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "GenerateInsertLocation" - value FALSE))) - (object Attribute - tool "MSVC" - name "default__Module-Body" - value (list Attribute_Set - (object Attribute - tool "MSVC" - name "GenerateIncludesGroup" - value FALSE) - (object Attribute - tool "MSVC" - name "AFX_INCLUDES_Entries" - value (value Text "")) - (object Attribute - tool "MSVC" - name "GenerateInsertLocation" - value FALSE))) - (object Attribute - tool "cg" - name "HiddenTool" - value FALSE) - (object Attribute - tool "SCC" - name "HiddenTool" - value FALSE)) - quid "355326EE0040")) + +(object Petal + version 42 + _written "Rose 4.5.8054.1" + charSet 0) + +(object Design "Logical View" + is_unit TRUE + is_loaded TRUE + defaults (object defaults + rightMargin 0.250000 + leftMargin 0.250000 + topMargin 0.250000 + bottomMargin 0.500000 + pageOverlap 0.250000 + clipIconLabels TRUE + autoResize TRUE + snapToGrid TRUE + gridX 16 + gridY 16 + defaultFont (object Font + size 9 + face "helvetica" + bold FALSE + italics FALSE + underline FALSE + strike FALSE + color 0 + default_color TRUE) + showMessageNum 1 + showClassOfObject TRUE + notation "Booch") + root_usecase_package (object Class_Category "Use Case View" + quid "355326EE003D" + exportControl "Public" + global TRUE + logical_models (list unit_reference_list) + logical_presentations (list unit_reference_list + (object UseCaseDiagram "Main" + quid "355326F5025B" + title "Main" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 0 + items (list diagram_item_list)))) + root_category (object Class_Category "Logical View" + quid "355326EE002A" + exportControl "Public" + global TRUE + subsystem "Component View" + quidu "355326EE003E" + logical_models (list unit_reference_list + (object Class "CVersitParser" + quid "3553270E02EC" + documentation "The base Versit parser class, providing functions to aid parsing a stream into a Versit object, as well as the facility to add properties and sub-entities to an existing object. The key methods are Internalize and Externalize, used to convert to and from stream form." + fields (list has_relationship_list + (object Has_Relationship + quid "3553302402E7" + supplier "Logical View::CParserPropertyHBufC" + quidu "35532EC801C4" + supplier_cardinality (value cardinality "0..n")) + (object Has_Relationship + quid "356EAC060148" + label "0..n" + supplier "Logical View::CParserProperty" + quidu "35532FAE025B")) + operations (list Operations + (object Operation "InternalizeL" + quid "3553356B03C6" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "ExternalizeL" + quid "355335B802EA" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "AddEntityL" + quid "356E92480020" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "AddPropertyL" + quid "356E925602FB" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "EntityL" + quid "356E9265031B" + result "CArrayPtrFlat" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "PropertyL" + quid "356E9273039D" + result "CArrayPtrFlat" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "GroupOfPropertiesL" + quid "356E92C403A4" + result "CArrayPtrFlat" + concurrency "Sequential" + opExportControl "Public" + uid 0)) + language "C++") + (object Class "CParserVCard" + quid "355327CA0301" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "35532D7202F9" + supplier "Logical View::CVersitParser" + quidu "3553270E02EC")) + language "C++") + (object Class "CParserVCal" + quid "35532CB10020" + fields (list has_relationship_list + (object Has_Relationship + quid "355331AE009F" + supplier "Logical View::VCalToDoParse" + quidu "35532D9A0057" + supplier_cardinality (value cardinality "0..n")) + (object Has_Relationship + quid "355331D301B0" + supplier "Logical View::CParserVCalEntity" + quidu "35532DAE02CD" + supplier_cardinality (value cardinality "0..n"))) + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "35532D6A01AD" + supplier "Logical View::CVersitParser" + quidu "3553270E02EC")) + language "C++") + (object Class "VCalToDoParse" + quid "35532D9A0057" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "35532DCF019E" + supplier "Logical View::CVersitParser" + quidu "3553270E02EC")) + language "C++") + (object Class "CParserVCalEntity" + quid "35532DAE02CD" + documentation "This class represents a Todo or Event sub-entity within the VCal object" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "35532DD8029B" + supplier "Logical View::CVersitParser" + quidu "3553270E02EC")) + language "C++") + (object Class "CParserParam" + quid "35532EA700F4" + documentation "A generic property parameter class, consisting of a Name and optionally a value, both in descriptor form." + operations (list Operations + (object Operation "Name" + quid "356E942C00F8" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "Value" + quid "356E943102AE" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "WriteValueToStream" + quid "356E944D02F4" + concurrency "Sequential" + opExportControl "Public" + uid 0)) + language "C++") + (object Class "CParserPropertyHBufC" + quid "35532EC801C4" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3553301D0016" + supplier "Logical View::CParserProperty" + quidu "35532FAE025B")) + language "C++") + (object Class "CVTimeParam" + quid "35532F2602EC" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "35532F4100CE" + supplier "Logical View::CParserParam" + quidu "35532EA700F4")) + language "C++") + (object Class "CParserProperty" + quid "35532FAE025B" + documentation "The Base property class, corresponding to a property, and storing its name and associated groups and parameters. Subclasses are identified by Uid." + operations (list Operations + (object Operation "ExternalizeL" + quid "356EAE71035B" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "Param" + quid "356EAE8300E0" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "AddParamL" + quid "356EAE8B0019" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "Group" + quid "356EAE92013C" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "Uid" + quid "356EAE950190" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "Name" + quid "356EAE9C000A" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "SetName" + quid "356EAEA1007F" + concurrency "Sequential" + opExportControl "Public" + uid 0) + (object Operation "WriteValueToStream" + quid "356EAEAB028C" + concurrency "Sequential" + opExportControl "Public" + uid 0)) + language "C++") + (object Class "CPropertyProperty" + quid "35532FED0021" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "3553302001B5" + supplier "Logical View::CParserPropertyHBufC" + quidu "35532EC801C4")) + language "C++") + (object Class "AgendaModelVCalWriter/Reader" + quid "3556CADC02A2" + used_nodes (list uses_relationship_list + (object Uses_Relationship + quid "3556CB2A03B3" + supplier "Logical View::CParserPropertyHBufC" + quidu "35532EC801C4") + (object Uses_Relationship + quid "3556CB4E0382" + supplier "Logical View::CParserVCal" + quidu "35532CB10020")) + language "C++") + (object Class "CVAgendaModelVCalReader" + quid "3556CB0A008B" + language "C++") + (object Class "CParserPropertyDateTime" + quid "356EAC6F029E" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "356EAC84026C" + supplier "Logical View::CParserProperty" + quidu "35532FAE025B")) + language "C++") + (object Class "CParserPropertyCDesCArray" + quid "356EAC720049" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "356EAC7E029F" + supplier "Logical View::CParserProperty" + quidu "35532FAE025B")) + language "C++") + (object Class "CParserPropertyMultiDateTime" + quid "356EAC790361" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "356EAC87007C" + supplier "Logical View::CParserProperty" + quidu "35532FAE025B")) + language "C++") + (object Class "CParserPropertyInt" + quid "356EAE41015D" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "356EAE460024" + supplier "Logical View::CParserProperty" + quidu "35532FAE025B")) + language "C++") + (object Class "CParserPropertyAlarm" + quid "356EAE5B001A" + superclasses (list inheritance_relationship_list + (object Inheritance_Relationship + quid "356EAE660111" + supplier "Logical View::CParserProperty" + quidu "35532FAE025B")) + language "C++") + (object Class "ContactsApp" + quid "356EAF280282" + used_nodes (list uses_relationship_list + (object Uses_Relationship + quid "356EAF3802B7" + supplier "Logical View::CParserVCard" + quidu "355327CA0301")) + language "C++")) + logical_presentations (list unit_reference_list + (object ClassDiagram "Main" + quid "355326F5020A" + title "Main" + zoom 69 + max_height 28350 + max_width 21600 + origin_x 37 + origin_y 0 + items (list diagram_item_list + (object ClassView "Class" "Logical View::CVersitParser" @1 + IncludeAttribute TRUE + IncludeOperation TRUE + location (1728, 480) + label (object ItemLabel + Parent_View @1 + location (1528, 266) + nlines 2 + max_width 477 + justify 0 + label "CVersitParser") + icon_style "Icon" + quidu "3553270E02EC" + compartment (object Compartment + Parent_View @1 + location (1528, 329) + icon_style "Icon" + anchor 2 + nlines 9 + max_width 382 + justify 0) + width 692 + height 624 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::CParserVCal" @2 + IncludeAttribute TRUE + IncludeOperation TRUE + location (2112, 1312) + label (object ItemLabel + Parent_View @2 + location (1944, 1228) + nlines 2 + max_width 396 + justify 0 + label "CParserVCal") + icon_style "Icon" + quidu "35532CB10020" + compartment (object Compartment + Parent_View @2 + location (1944, 1291) + icon_style "Icon" + anchor 2 + nlines 2 + max_width 312 + justify 0) + width 574 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::CParserVCard" @3 + IncludeAttribute TRUE + IncludeOperation TRUE + location (3088, 832) + label (object ItemLabel + Parent_View @3 + location (2984, 748) + nlines 2 + max_width 240 + justify 0 + label "CParserVCard") + icon_style "Icon" + quidu "355327CA0301" + annotation 8 + autoResize TRUE) + (object InheritView "" @4 + stereotype TRUE + quidu "35532D6A01AD" + client @2 + supplier @1 + line_style 0) + (object InheritView "" @5 + stereotype TRUE + quidu "35532D7202F9" + client @3 + supplier @1 + line_style 0) + (object ClassView "Class" "Logical View::CParserVCalEntity" @6 + IncludeAttribute TRUE + IncludeOperation TRUE + location (2976, 1472) + label (object ItemLabel + Parent_View @6 + location (2872, 1388) + nlines 2 + max_width 240 + justify 0 + label "CParserVCalEntity") + icon_style "Icon" + quidu "35532DAE02CD" + annotation 8 + autoResize TRUE) + (object InheritView "" @7 + stereotype TRUE + quidu "35532DD8029B" + client @6 + supplier @1 + line_style 0) + (object ClassView "Class" "Logical View::CParserParam" @8 + IncludeAttribute TRUE + IncludeOperation TRUE + location (416, 208) + label (object ItemLabel + Parent_View @8 + location (239, 112) + nlines 2 + max_width 418 + justify 0 + label "CParserParam") + icon_style "Icon" + quidu "35532EA700F4" + compartment (object Compartment + Parent_View @8 + location (239, 175) + icon_style "Icon" + anchor 2 + nlines 3 + max_width 344 + justify 0) + width 606 + height 286 + annotation 8 + autoResize TRUE) + (object HasView "" @9 + stereotype TRUE + quidu "355331D301B0" + client @2 + supplier @6 + line_style 0) + (object ClassView "Class" "Logical View::AgendaModelVCalWriter/Reader" @10 + IncludeAttribute TRUE + IncludeOperation TRUE + location (1776, 1776) + label (object ItemLabel + Parent_View @10 + location (1644, 1692) + nlines 2 + max_width 310 + justify 0 + label "AgendaModelVCalWriter/Reader") + icon_style "Icon" + quidu "3556CADC02A2" + width 450 + annotation 8 + autoResize TRUE) + (object UsesView "" @11 + stereotype TRUE + quidu "3556CB4E0382" + client @10 + supplier @2 + line_style 0) + (object ClassView "Class" "Logical View::CParserProperty" @12 + IncludeAttribute TRUE + IncludeOperation TRUE + location (736, 896) + label (object ItemLabel + Parent_View @12 + location (555, 701) + nlines 2 + max_width 430 + justify 0 + label "CParserProperty") + icon_style "Icon" + quidu "35532FAE025B" + compartment (object Compartment + Parent_View @12 + location (555, 764) + icon_style "Icon" + anchor 2 + nlines 8 + max_width 344 + justify 0) + width 624 + height 570 + annotation 8 + autoResize TRUE) + (object HasView "0..n" @13 + label (object ItemLabel + Parent_View @13 + location (1282, 660) + anchor_loc 1 + nlines 1 + max_width 450 + justify 0 + label "0..n") + stereotype TRUE + quidu "356EAC060148" + client @1 + supplier @12 + line_style 0) + (object ClassView "Class" "Logical View::CParserPropertyHBufC" @14 + IncludeAttribute TRUE + IncludeOperation TRUE + location (1296, 1552) + label (object ItemLabel + Parent_View @14 + location (1186, 1468) + nlines 2 + max_width 256 + justify 0 + label "CParserPropertyHBufC") + icon_style "Icon" + quidu "35532EC801C4" + width 372 + annotation 8 + autoResize TRUE) + (object InheritView "" @15 + stereotype TRUE + quidu "3553301D0016" + client @14 + supplier @12 + line_style 0) + (object ClassView "Class" "Logical View::CParserPropertyDateTime" @16 + IncludeAttribute TRUE + IncludeOperation TRUE + location (704, 1712) + label (object ItemLabel + Parent_View @16 + location (585, 1628) + nlines 2 + max_width 278 + justify 0 + label "CParserPropertyDateTime") + icon_style "Icon" + quidu "356EAC6F029E" + width 404 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::CParserPropertyCDesCArray" @17 + IncludeAttribute TRUE + IncludeOperation TRUE + location (240, 1408) + label (object ItemLabel + Parent_View @17 + location (122, 1324) + nlines 2 + max_width 274 + justify 0 + label "CParserPropertyCDesCArray") + icon_style "Icon" + quidu "356EAC720049" + width 398 + annotation 8 + autoResize TRUE) + (object ClassView "Class" "Logical View::CParserPropertyMultiDateTime" @18 + IncludeAttribute TRUE + IncludeOperation TRUE + location (336, 2000) + label (object ItemLabel + Parent_View @18 + location (220, 1916) + nlines 2 + max_width 270 + justify 0 + label "CParserPropertyMultiDateTime") + icon_style "Icon" + quidu "356EAC790361" + width 392 + annotation 8 + autoResize TRUE) + (object InheritView "" @19 + stereotype TRUE + quidu "356EAC7E029F" + client @17 + supplier @12 + line_style 0) + (object InheritView "" @20 + stereotype TRUE + quidu "356EAC84026C" + client @16 + supplier @12 + line_style 0) + (object InheritView "" @21 + stereotype TRUE + quidu "356EAC87007C" + client @18 + supplier @12 + line_style 0) + (object ClassView "Class" "Logical View::CParserPropertyInt" @22 + IncludeAttribute TRUE + IncludeOperation TRUE + location (1280, 1952) + label (object ItemLabel + Parent_View @22 + location (1176, 1868) + nlines 2 + max_width 240 + justify 0 + label "CParserPropertyInt") + icon_style "Icon" + quidu "356EAE41015D" + annotation 8 + autoResize TRUE) + (object InheritView "" @23 + stereotype TRUE + quidu "356EAE460024" + client @22 + supplier @12 + line_style 0) + (object ClassView "Class" "Logical View::CParserPropertyAlarm" @24 + IncludeAttribute TRUE + IncludeOperation TRUE + location (1136, 2288) + label (object ItemLabel + Parent_View @24 + location (1032, 2204) + nlines 2 + max_width 242 + justify 0 + label "CParserPropertyAlarm") + icon_style "Icon" + quidu "356EAE5B001A" + width 352 + annotation 8 + autoResize TRUE) + (object InheritView "" @25 + stereotype TRUE + quidu "356EAE660111" + client @24 + supplier @12 + line_style 0) + (object ClassView "Class" "Logical View::ContactsApp" @26 + IncludeAttribute TRUE + IncludeOperation TRUE + location (3392, 1216) + label (object ItemLabel + Parent_View @26 + location (3288, 1132) + nlines 2 + max_width 240 + justify 0 + label "ContactsApp") + icon_style "Icon" + quidu "356EAF280282" + annotation 8 + autoResize TRUE) + (object UsesView "" @27 + stereotype TRUE + quidu "356EAF3802B7" + client @26 + supplier @3 + line_style 0))))) + root_subsystem (object SubSystem "Component View" + quid "355326EE003E" + physical_models (list unit_reference_list) + physical_presentations (list unit_reference_list + (object Module_Diagram "Main" + quid "355326F5025A" + title "Main" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 0 + items (list diagram_item_list)))) + process_structure (object Processes + quid "355326EE003F" + ProcsNDevs (list + (object Process_Diagram "Deployment View" + quid "355326F5019C" + title "Deployment View" + zoom 100 + max_height 28350 + max_width 21600 + origin_x 0 + origin_y 0 + items (list diagram_item_list)))) + properties (object Properties + attributes (list Attribute_Set + (object Attribute + tool "DDL" + name "propertyId" + value "809135966") + (object Attribute + tool "DDL" + name "default__Project" + value (list Attribute_Set + (object Attribute + tool "DDL" + name "DataBase" + value ("DataBaseSet" 800)) + (object Attribute + tool "DDL" + name "DataBaseSet" + value (list Attribute_Set + (object Attribute + tool "DDL" + name "ANSI" + value 800) + (object Attribute + tool "DDL" + name "Oracle" + value 801) + (object Attribute + tool "DDL" + name "SQLServer" + value 802) + (object Attribute + tool "DDL" + name "Sybase" + value 803) + (object Attribute + tool "DDL" + name "Watcom" + value 804))) + (object Attribute + tool "DDL" + name "PrimaryKeyColumnName" + value "Id") + (object Attribute + tool "DDL" + name "PrimaryKeyColumnType" + value "NUMBER(5)") + (object Attribute + tool "DDL" + name "ViewName" + value "V_") + (object Attribute + tool "DDL" + name "TableName" + value "T_") + (object Attribute + tool "DDL" + name "InheritSuffix" + value "_V") + (object Attribute + tool "DDL" + name "DropClause" + value FALSE) + (object Attribute + tool "DDL" + name "BaseViews" + value FALSE) + (object Attribute + tool "DDL" + name "DDLScriptFilename" + value "DDL1.SQL"))) + (object Attribute + tool "DDL" + name "default__Attribute" + value (list Attribute_Set + (object Attribute + tool "DDL" + name "ColumnType" + value "VARCHAR") + (object Attribute + tool "DDL" + name "Length" + value "") + (object Attribute + tool "DDL" + name "NullsOK" + value TRUE) + (object Attribute + tool "DDL" + name "PrimaryKey" + value FALSE) + (object Attribute + tool "DDL" + name "Unique" + value FALSE) + (object Attribute + tool "DDL" + name "CompositeUnique" + value FALSE) + (object Attribute + tool "DDL" + name "CheckConstraint" + value ""))) + (object Attribute + tool "DDL" + name "HiddenTool" + value FALSE) + (object Attribute + tool "IDL" + name "propertyId" + value "809135966") + (object Attribute + tool "IDL" + name "default__Project" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "CreateMissingDirectories" + value TRUE) + (object Attribute + tool "IDL" + name "StopOnError" + value TRUE) + (object Attribute + tool "IDL" + name "Directory" + value "AUTO GENERATE") + (object Attribute + tool "IDL" + name "GeneratePreserveRegions" + value TRUE))) + (object Attribute + tool "IDL" + name "default__Class" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "ImplementationType" + value "") + (object Attribute + tool "IDL" + name "ConstValue" + value "") + (object Attribute + tool "IDL" + name "GenerateDefaultSpecifier" + value FALSE) + (object Attribute + tool "IDL" + name "DefaultSpecifier" + value "") + (object Attribute + tool "IDL" + name "IDLElement" + value TRUE) + (object Attribute + tool "IDL" + name "IDLSpecificationType" + value ("IDLSpecSet" 22)) + (object Attribute + tool "IDL" + name "IDLSpecSet" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "Interface" + value 22) + (object Attribute + tool "IDL" + name "Typedef" + value 54) + (object Attribute + tool "IDL" + name "Enumeration" + value 8) + (object Attribute + tool "IDL" + name "Const" + value 71) + (object Attribute + tool "IDL" + name "Exception" + value 61) + (object Attribute + tool "IDL" + name "Struct" + value 51) + (object Attribute + tool "IDL" + name "Union" + value 81))))) + (object Attribute + tool "IDL" + name "default__Module-Spec" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "Generate" + value TRUE) + (object Attribute + tool "IDL" + name "CmIdentification" + value (value Text " %X% %Q% %Z% %W%")) + (object Attribute + tool "IDL" + name "CopyrightNotice" + value (value Text "")) + (object Attribute + tool "IDL" + name "FileName" + value "AUTO GENERATE") + (object Attribute + tool "IDL" + name "GenerateIDLModule" + value FALSE) + (object Attribute + tool "IDL" + name "InclusionProtectionSymbol" + value "AUTO GENERATE") + (object Attribute + tool "IDL" + name "AdditionalIncludes" + value (value Text "")) + (object Attribute + tool "IDL" + name "IncludeBySimpleName" + value FALSE))) + (object Attribute + tool "IDL" + name "default__Module-Body" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "CmIdentification" + value (value Text " %X% %Q% %Z% %W%")) + (object Attribute + tool "IDL" + name "CopyrightNotice" + value (value Text "")) + (object Attribute + tool "IDL" + name "FileName" + value "AUTO GENERATE") + (object Attribute + tool "IDL" + name "AdditionalIncludes" + value (value Text "")) + (object Attribute + tool "IDL" + name "IncludeBySimpleName" + value FALSE))) + (object Attribute + tool "IDL" + name "default__Operation" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "OperationIsOneWay" + value FALSE) + (object Attribute + tool "IDL" + name "Context" + value "") + (object Attribute + tool "IDL" + name "Raises" + value ""))) + (object Attribute + tool "IDL" + name "default__Attribute" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "CaseSpecifier" + value "") + (object Attribute + tool "IDL" + name "GenerateDataMember" + value TRUE) + (object Attribute + tool "IDL" + name "DataMemberName" + value "$relationship") + (object Attribute + tool "IDL" + name "IsReadOnly" + value FALSE) + (object Attribute + tool "IDL" + name "IsConst" + value FALSE) + (object Attribute + tool "IDL" + name "ConstValue" + value ""))) + (object Attribute + tool "IDL" + name "default__Has" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "NameIfUnlabeled" + value "the_$supplier") + (object Attribute + tool "IDL" + name "GenerateDataMember" + value TRUE) + (object Attribute + tool "IDL" + name "DataMemberName" + value "$relationship") + (object Attribute + tool "IDL" + name "GenerateForwardReference" + value FALSE) + (object Attribute + tool "IDL" + name "IsReadOnly" + value FALSE) + (object Attribute + tool "IDL" + name "BoundedHasRelType" + value ("HasRelTypeSet" 47)) + (object Attribute + tool "IDL" + name "HasRelTypeSet" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "Array" + value 24) + (object Attribute + tool "IDL" + name "Sequence" + value 47))))) + (object Attribute + tool "IDL" + name "default__Role" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "NameIfUnlabeled" + value "the_$supplier") + (object Attribute + tool "IDL" + name "GenerateDataMember" + value TRUE) + (object Attribute + tool "IDL" + name "DataMemberName" + value "$relationship") + (object Attribute + tool "IDL" + name "GenerateForwardReference" + value FALSE) + (object Attribute + tool "IDL" + name "IsReadOnly" + value FALSE) + (object Attribute + tool "IDL" + name "BoundedRoleType" + value ("AssocTypeSet" 47)) + (object Attribute + tool "IDL" + name "AssocTypeSet" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "Array" + value 24) + (object Attribute + tool "IDL" + name "Sequence" + value 47))))) + (object Attribute + tool "IDL" + name "default__Uses" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "GenerateForwardReference" + value FALSE))) + (object Attribute + tool "IDL" + name "default__Subsystem" + value (list Attribute_Set + (object Attribute + tool "IDL" + name "Directory" + value "AUTO GENERATE"))) + (object Attribute + tool "IDL" + name "HiddenTool" + value FALSE) + (object Attribute + tool "cg" + name "propertyId" + value "809135966") + (object Attribute + tool "cg" + name "default__Project" + value (list Attribute_Set + (object Attribute + tool "cg" + name "UseMSVC" + value FALSE) + (object Attribute + tool "cg" + name "HeaderFileExtension" + value "h") + (object Attribute + tool "cg" + name "HeaderFileBackupExtension" + value "h~") + (object Attribute + tool "cg" + name "HeaderFileTemporaryExtension" + value "h#") + (object Attribute + tool "cg" + name "CodeFileExtension" + value "cpp") + (object Attribute + tool "cg" + name "CodeFileBackupExtension" + value "cp~") + (object Attribute + tool "cg" + name "CodeFileTemporaryExtension" + value "cp#") + (object Attribute + tool "cg" + name "CreateMissingDirectories" + value TRUE) + (object Attribute + tool "cg" + name "StopOnError" + value FALSE) + (object Attribute + tool "cg" + name "ErrorLimit" + value 30) + (object Attribute + tool "cg" + name "Directory" + value "$ROSECPP_SOURCE") + (object Attribute + tool "cg" + name "PathSeparator" + value "") + (object Attribute + tool "cg" + name "FileNameFormat" + value "128vx_b") + (object Attribute + tool "cg" + name "BooleanType" + value "int") + (object Attribute + tool "cg" + name "AllowTemplates" + value TRUE) + (object Attribute + tool "cg" + name "AllowProtectedInheritance" + value TRUE) + (object Attribute + tool "cg" + name "CommentWidth" + value 60) + (object Attribute + tool "cg" + name "OneByValueContainer" + value "$targetClass") + (object Attribute + tool "cg" + name "OneByReferenceContainer" + value "$targetClass *") + (object Attribute + tool "cg" + name "OptionalByValueContainer" + value "OptionalByValue<$targetClass>") + (object Attribute + tool "cg" + name "OptionalByReferenceContainer" + value "$targetClass *") + (object Attribute + tool "cg" + name "FixedByValueContainer" + value "$targetClass[$limit]") + (object Attribute + tool "cg" + name "UnorderedFixedByValueContainer" + value "$targetClass[$limit]") + (object Attribute + tool "cg" + name "FixedByReferenceContainer" + value "$targetClass *[$limit]") + (object Attribute + tool "cg" + name "UnorderedFixedByReferenceContainer" + value "$targetClass *[$limit]") + (object Attribute + tool "cg" + name "BoundedByValueContainer" + value "BoundedListByValue<$targetClass,$limit>") + (object Attribute + tool "cg" + name "UnorderedBoundedByValueContainer" + value "BoundedSetByValue<$targetClass,$limit>") + (object Attribute + tool "cg" + name "BoundedByReferenceContainer" + value "BoundedListByReference<$targetClass,$limit>") + (object Attribute + tool "cg" + name "UnorderedBoundedByReferenceContainer" + value "BoundedSetByReference<$targetClass,$limit>") + (object Attribute + tool "cg" + name "UnboundedByValueContainer" + value "UnboundedListByValue<$targetClass>") + (object Attribute + tool "cg" + name "UnorderedUnboundedByValueContainer" + value "UnboundedSetByValue<$targetClass>") + (object Attribute + tool "cg" + name "UnboundedByReferenceContainer" + value "UnboundedListByReference<$targetClass>") + (object Attribute + tool "cg" + name "UnorderedUnboundedByReferenceContainer" + value "UnboundedSetByReference<$targetClass>") + (object Attribute + tool "cg" + name "QualifiedByValueContainer" + value "AssociationByValue<$qualtype, $qualcont>") + (object Attribute + tool "cg" + name "UnorderedQualifiedByValueContainer" + value "DictionaryByValue<$qualtype, $qualcont>") + (object Attribute + tool "cg" + name "QualifiedByReferenceContainer" + value "AssociationByReference<$qualtype, $qualcont>") + (object Attribute + tool "cg" + name "UnorderedQualifiedByReferenceContainer" + value "DictionaryByReference<$qualtype, $qualcont>") + (object Attribute + tool "cg" + name "GeneratePreserveRegions" + value TRUE))) + (object Attribute + tool "cg" + name "default__Class" + value (list Attribute_Set + (object Attribute + tool "cg" + name "CodeName" + value "") + (object Attribute + tool "cg" + name "ImplementationType" + value "") + (object Attribute + tool "cg" + name "ClassKey" + value "class") + (object Attribute + tool "cg" + name "GenerateEmptyRegions" + value ("GenerateEmptyRegionSet" 3)) + (object Attribute + tool "cg" + name "GenerateEmptyRegionSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "None" + value 0) + (object Attribute + tool "cg" + name "Preserved" + value 1) + (object Attribute + tool "cg" + name "Unpreserved" + value 2) + (object Attribute + tool "cg" + name "All" + value 3))) + (object Attribute + tool "cg" + name "PutBodiesInSpec" + value FALSE) + (object Attribute + tool "cg" + name "GenerateDefaultConstructor" + value ("GenerateSet" 199)) + (object Attribute + tool "cg" + name "DefaultConstructorVisibility" + value ("VisibilitySet" 45)) + (object Attribute + tool "cg" + name "InlineDefaultConstructor" + value FALSE) + (object Attribute + tool "cg" + name "ExplicitDefaultConstructor" + value FALSE) + (object Attribute + tool "cg" + name "GenerateCopyConstructor" + value ("GenerateSet" 199)) + (object Attribute + tool "cg" + name "CopyConstructorVisibility" + value ("VisibilitySet" 45)) + (object Attribute + tool "cg" + name "InlineCopyConstructor" + value FALSE) + (object Attribute + tool "cg" + name "ExplicitCopyConstructor" + value FALSE) + (object Attribute + tool "cg" + name "GenerateDestructor" + value TRUE) + (object Attribute + tool "cg" + name "DestructorVisibility" + value ("VisibilitySet" 45)) + (object Attribute + tool "cg" + name "DestructorKind" + value ("ThreeKindSet" 200)) + (object Attribute + tool "cg" + name "InlineDestructor" + value FALSE) + (object Attribute + tool "cg" + name "GenerateAssignmentOperation" + value ("GenerateSet" 199)) + (object Attribute + tool "cg" + name "AssignmentVisibility" + value ("VisibilitySet" 45)) + (object Attribute + tool "cg" + name "AssignmentKind" + value ("ThreeKindSet" 200)) + (object Attribute + tool "cg" + name "InlineAssignmentOperation" + value FALSE) + (object Attribute + tool "cg" + name "GenerateEqualityOperations" + value ("GenerateSet" 199)) + (object Attribute + tool "cg" + name "EqualityVisibility" + value ("VisibilitySet" 45)) + (object Attribute + tool "cg" + name "EqualityKind" + value ("FriendKindSet" 200)) + (object Attribute + tool "cg" + name "InlineEqualityOperations" + value FALSE) + (object Attribute + tool "cg" + name "GenerateRelationalOperations" + value FALSE) + (object Attribute + tool "cg" + name "RelationalVisibility" + value ("VisibilitySet" 45)) + (object Attribute + tool "cg" + name "RelationalKind" + value ("FriendKindSet" 200)) + (object Attribute + tool "cg" + name "InlineRelationalOperations" + value FALSE) + (object Attribute + tool "cg" + name "GenerateStorageMgmtOperations" + value FALSE) + (object Attribute + tool "cg" + name "StorageMgmtVisibility" + value ("VisibilitySet" 45)) + (object Attribute + tool "cg" + name "InlineStorageMgmtOperations" + value FALSE) + (object Attribute + tool "cg" + name "GenerateSubscriptOperation" + value FALSE) + (object Attribute + tool "cg" + name "SubscriptVisibility" + value ("VisibilitySet" 45)) + (object Attribute + tool "cg" + name "SubscriptKind" + value ("ThreeKindSet" 200)) + (object Attribute + tool "cg" + name "SubscriptResultType" + value "") + (object Attribute + tool "cg" + name "InlineSubscriptOperation" + value FALSE) + (object Attribute + tool "cg" + name "GenerateDereferenceOperation" + value FALSE) + (object Attribute + tool "cg" + name "DereferenceVisibility" + value ("VisibilitySet" 45)) + (object Attribute + tool "cg" + name "DereferenceKind" + value ("ThreeKindSet" 200)) + (object Attribute + tool "cg" + name "DereferenceResultType" + value "") + (object Attribute + tool "cg" + name "InlineDereferenceOperation" + value FALSE) + (object Attribute + tool "cg" + name "GenerateIndirectionOperation" + value FALSE) + (object Attribute + tool "cg" + name "IndirectionVisibility" + value ("VisibilitySet" 45)) + (object Attribute + tool "cg" + name "IndirectionKind" + value ("ThreeKindSet" 200)) + (object Attribute + tool "cg" + name "IndirectionResultType" + value "") + (object Attribute + tool "cg" + name "InlineIndirectionOperation" + value FALSE) + (object Attribute + tool "cg" + name "GenerateStreamOperations" + value FALSE) + (object Attribute + tool "cg" + name "StreamVisibility" + value ("VisibilitySet" 45)) + (object Attribute + tool "cg" + name "InlineStreamOperations" + value FALSE) + (object Attribute + tool "cg" + name "ThreeKindSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Common" + value 200) + (object Attribute + tool "cg" + name "Virtual" + value 201) + (object Attribute + tool "cg" + name "Abstract" + value 202))) + (object Attribute + tool "cg" + name "KindSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Common" + value 200) + (object Attribute + tool "cg" + name "Virtual" + value 201) + (object Attribute + tool "cg" + name "Abstract" + value 202) + (object Attribute + tool "cg" + name "Static" + value 203))) + (object Attribute + tool "cg" + name "FriendKindSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Common" + value 200) + (object Attribute + tool "cg" + name "Virtual" + value 201) + (object Attribute + tool "cg" + name "Abstract" + value 202) + (object Attribute + tool "cg" + name "Friend" + value 204))) + (object Attribute + tool "cg" + name "GenerateSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "DeclareAndDefine" + value 199) + (object Attribute + tool "cg" + name "DeclareOnly" + value 205) + (object Attribute + tool "cg" + name "DoNotDeclare" + value 206))) + (object Attribute + tool "cg" + name "VisibilitySet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Public" + value 45) + (object Attribute + tool "cg" + name "Protected" + value 44) + (object Attribute + tool "cg" + name "Private" + value 43) + (object Attribute + tool "cg" + name "Implementation" + value 14))) + (object Attribute + tool "cg" + name "ConstValue" + value "") + (object Attribute + tool "cg" + name "GenerateDefaultSpecifier" + value FALSE) + (object Attribute + tool "cg" + name "DefaultSpecifier" + value ""))) + (object Attribute + tool "cg" + name "default__Module-Spec" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Generate" + value TRUE) + (object Attribute + tool "cg" + name "GenerateEmptyRegions" + value ("GenerateEmptyRegionSet" 3)) + (object Attribute + tool "cg" + name "GenerateEmptyRegionSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "None" + value 0) + (object Attribute + tool "cg" + name "Preserved" + value 1) + (object Attribute + tool "cg" + name "Unpreserved" + value 2) + (object Attribute + tool "cg" + name "All" + value 3))) + (object Attribute + tool "cg" + name "CmIdentification" + value (value Text " %X% %Q% %Z% %W%")) + (object Attribute + tool "cg" + name "CopyrightNotice" + value (value Text "")) + (object Attribute + tool "cg" + name "FileName" + value "AUTO GENERATE") + (object Attribute + tool "cg" + name "AllowExtensionlessFileName" + value FALSE) + (object Attribute + tool "cg" + name "InclusionProtectionSymbol" + value "AUTO GENERATE") + (object Attribute + tool "cg" + name "IncludeFormat" + value (value Text +|// $package +|#include "$file" +| + )) + (object Attribute + tool "cg" + name "IncludeBySimpleName" + value FALSE) + (object Attribute + tool "cg" + name "IncludePrecompiledHeader" + value FALSE) + (object Attribute + tool "cg" + name "IncludeOrder" + value "AMIR") + (object Attribute + tool "cg" + name "AdditionalIncludes" + value (value Text "")) + (object Attribute + tool "cg" + name "InliningStyle" + value ("InliningStyleSet" 207)) + (object Attribute + tool "cg" + name "InliningStyleSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "InClassDeclaration" + value 208) + (object Attribute + tool "cg" + name "FollowingClassDeclaration" + value 207))) + (object Attribute + tool "cg" + name "TypesDefined" + value (value Text "")) + (object Attribute + tool "cg" + name "IncludeClosure" + value (value Text "")))) + (object Attribute + tool "cg" + name "default__Module-Body" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Generate" + value TRUE) + (object Attribute + tool "cg" + name "GenerateEmptyRegions" + value ("GenerateEmptyRegionSet" 3)) + (object Attribute + tool "cg" + name "GenerateEmptyRegionSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "None" + value 0) + (object Attribute + tool "cg" + name "Preserved" + value 1) + (object Attribute + tool "cg" + name "Unpreserved" + value 2) + (object Attribute + tool "cg" + name "All" + value 3))) + (object Attribute + tool "cg" + name "CmIdentification" + value (value Text " %X% %Q% %Z% %W%")) + (object Attribute + tool "cg" + name "CopyrightNotice" + value (value Text "")) + (object Attribute + tool "cg" + name "FileName" + value "AUTO GENERATE") + (object Attribute + tool "cg" + name "AllowExtensionlessFileName" + value FALSE) + (object Attribute + tool "cg" + name "IncludeFormat" + value (value Text +|// $package +|#include "$file" +| + )) + (object Attribute + tool "cg" + name "IncludeBySimpleName" + value FALSE) + (object Attribute + tool "cg" + name "IncludePrecompiledHeader" + value TRUE) + (object Attribute + tool "cg" + name "IncludeOrder" + value "AMIR") + (object Attribute + tool "cg" + name "AdditionalIncludes" + value (value Text "")) + (object Attribute + tool "cg" + name "InliningStyle" + value ("InliningStyleSet" 207)) + (object Attribute + tool "cg" + name "InliningStyleSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "InClassDeclaration" + value 208) + (object Attribute + tool "cg" + name "FollowingClassDeclaration" + value 207))) + (object Attribute + tool "cg" + name "TypesDefined" + value (value Text "")) + (object Attribute + tool "cg" + name "IncludeClosure" + value (value Text "")))) + (object Attribute + tool "cg" + name "default__Operation" + value (list Attribute_Set + (object Attribute + tool "cg" + name "CodeName" + value "") + (object Attribute + tool "cg" + name "OperationKind" + value ("OperationKindSet" 200)) + (object Attribute + tool "cg" + name "OperationKindSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Common" + value 200) + (object Attribute + tool "cg" + name "Virtual" + value 201) + (object Attribute + tool "cg" + name "Abstract" + value 202) + (object Attribute + tool "cg" + name "Static" + value 203) + (object Attribute + tool "cg" + name "Friend" + value 204))) + (object Attribute + tool "cg" + name "OperationIsConst" + value FALSE) + (object Attribute + tool "cg" + name "OperationIsExplicit" + value FALSE) + (object Attribute + tool "cg" + name "Inline" + value FALSE) + (object Attribute + tool "cg" + name "EntryCode" + value (value Text "")) + (object Attribute + tool "cg" + name "ExitCode" + value (value Text "")) + (object Attribute + tool "cg" + name "GenerateEmptyRegions" + value ("GenerateEmptyRegionSet" 3)) + (object Attribute + tool "cg" + name "GenerateEmptyRegionSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "None" + value 0) + (object Attribute + tool "cg" + name "Preserved" + value 1) + (object Attribute + tool "cg" + name "Unpreserved" + value 2) + (object Attribute + tool "cg" + name "All" + value 3))) + (object Attribute + tool "cg" + name "BodyAnnotations" + value "") + (object Attribute + tool "cg" + name "OperationIsOneWay" + value FALSE) + (object Attribute + tool "cg" + name "Context" + value "") + (object Attribute + tool "cg" + name "Raises" + value ""))) + (object Attribute + tool "cg" + name "default__Has" + value (list Attribute_Set + (object Attribute + tool "cg" + name "CodeName" + value "") + (object Attribute + tool "cg" + name "Ordered" + value TRUE) + (object Attribute + tool "cg" + name "NameIfUnlabeled" + value "the_$supplier") + (object Attribute + tool "cg" + name "GenerateDataMember" + value TRUE) + (object Attribute + tool "cg" + name "DataMemberName" + value "$relationship") + (object Attribute + tool "cg" + name "DataMemberVisibility" + value ("DataMemberVisibilitySet" 14)) + (object Attribute + tool "cg" + name "DataMemberVisibilitySet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Public" + value 45) + (object Attribute + tool "cg" + name "Protected" + value 44) + (object Attribute + tool "cg" + name "Private" + value 43) + (object Attribute + tool "cg" + name "Implementation" + value 14) + (object Attribute + tool "cg" + name "AtRelationshipVisibility" + value 210))) + (object Attribute + tool "cg" + name "DataMemberMutability" + value ("DataMemberMutabilitySet" 0)) + (object Attribute + tool "cg" + name "DataMemberMutabilitySet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Unrestricted" + value 0) + (object Attribute + tool "cg" + name "Mutable" + value 1) + (object Attribute + tool "cg" + name "Const" + value 2))) + (object Attribute + tool "cg" + name "DataMemberIsVolatile" + value FALSE) + (object Attribute + tool "cg" + name "DataMemberFieldSize" + value "") + (object Attribute + tool "cg" + name "InitialValue" + value (value Text "")) + (object Attribute + tool "cg" + name "GenerateGetOperation" + value TRUE) + (object Attribute + tool "cg" + name "GenerateSetOperation" + value TRUE) + (object Attribute + tool "cg" + name "GetName" + value "get_$relationship") + (object Attribute + tool "cg" + name "SetName" + value "set_$relationship") + (object Attribute + tool "cg" + name "GetSetKinds" + value ("GetSetKindsSet" 200)) + (object Attribute + tool "cg" + name "GetSetKindsSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Common" + value 200) + (object Attribute + tool "cg" + name "Virtual" + value 201) + (object Attribute + tool "cg" + name "Abstract" + value 202) + (object Attribute + tool "cg" + name "Static" + value 203) + (object Attribute + tool "cg" + name "Friend" + value 204))) + (object Attribute + tool "cg" + name "ContainerClass" + value "") + (object Attribute + tool "cg" + name "SelectorName" + value "") + (object Attribute + tool "cg" + name "SelectorType" + value "") + (object Attribute + tool "cg" + name "GetIsConst" + value TRUE) + (object Attribute + tool "cg" + name "GetResultIsConst" + value ("GetResultIsConstSet" 2)) + (object Attribute + tool "cg" + name "GetResultIsConstSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "False" + value 0) + (object Attribute + tool "cg" + name "True" + value 1) + (object Attribute + tool "cg" + name "Same_As_Function" + value 2))) + (object Attribute + tool "cg" + name "GetSetByReference" + value FALSE) + (object Attribute + tool "cg" + name "InlineGet" + value TRUE) + (object Attribute + tool "cg" + name "SetReturnsValue" + value FALSE) + (object Attribute + tool "cg" + name "InlineSet" + value TRUE) + (object Attribute + tool "cg" + name "ForwardReferenceOnly" + value FALSE) + (object Attribute + tool "cg" + name "GenerateForwardReference" + value FALSE) + (object Attribute + tool "cg" + name "IsReadOnly" + value FALSE) + (object Attribute + tool "cg" + name "BoundedHasRelType" + value ("HasRelTypeSet" 47)) + (object Attribute + tool "cg" + name "HasRelTypeSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Array" + value 24) + (object Attribute + tool "cg" + name "Sequence" + value 47))))) + (object Attribute + tool "cg" + name "default__Association" + value (list Attribute_Set + (object Attribute + tool "cg" + name "NameIfUnlabeled" + value "the_$targetClass"))) + (object Attribute + tool "cg" + name "default__Inherit" + value (list Attribute_Set + (object Attribute + tool "cg" + name "InstanceArguments" + value ""))) + (object Attribute + tool "cg" + name "default__Role" + value (list Attribute_Set + (object Attribute + tool "cg" + name "CodeName" + value "") + (object Attribute + tool "cg" + name "ForwardReferenceOnly" + value FALSE) + (object Attribute + tool "cg" + name "NameIfUnlabeled" + value "the_$targetClass") + (object Attribute + tool "cg" + name "GenerateDataMember" + value TRUE) + (object Attribute + tool "cg" + name "DataMemberName" + value "$target") + (object Attribute + tool "cg" + name "DataMemberVisibility" + value ("DataMemberVisibilitySet" 14)) + (object Attribute + tool "cg" + name "DataMemberVisibilitySet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Public" + value 45) + (object Attribute + tool "cg" + name "Protected" + value 44) + (object Attribute + tool "cg" + name "Private" + value 43) + (object Attribute + tool "cg" + name "Implementation" + value 14) + (object Attribute + tool "cg" + name "AtRelationshipVisibility" + value 210))) + (object Attribute + tool "cg" + name "DataMemberMutability" + value ("DataMemberMutabilitySet" 0)) + (object Attribute + tool "cg" + name "DataMemberMutabilitySet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Unrestricted" + value 0) + (object Attribute + tool "cg" + name "Mutable" + value 1) + (object Attribute + tool "cg" + name "Const" + value 2))) + (object Attribute + tool "cg" + name "DataMemberIsVolatile" + value FALSE) + (object Attribute + tool "cg" + name "DataMemberFieldSize" + value "") + (object Attribute + tool "cg" + name "InitialValue" + value (value Text "")) + (object Attribute + tool "cg" + name "ContainerClass" + value "") + (object Attribute + tool "cg" + name "ContainerGet" + value "$data.get($keys)") + (object Attribute + tool "cg" + name "ContainerSet" + value "$data.set($keys,$value)") + (object Attribute + tool "cg" + name "QualifiedContainer" + value "") + (object Attribute + tool "cg" + name "AssocClassContainer" + value "$supplier *") + (object Attribute + tool "cg" + name "AssocClassInitialValue" + value (value Text "")) + (object Attribute + tool "cg" + name "GetSetKinds" + value ("GetSetKindsSet" 200)) + (object Attribute + tool "cg" + name "GetSetKindsSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Common" + value 200) + (object Attribute + tool "cg" + name "Virtual" + value 201) + (object Attribute + tool "cg" + name "Abstract" + value 202) + (object Attribute + tool "cg" + name "Static" + value 203) + (object Attribute + tool "cg" + name "Friend" + value 204))) + (object Attribute + tool "cg" + name "GetSetByReference" + value FALSE) + (object Attribute + tool "cg" + name "GenerateGetOperation" + value TRUE) + (object Attribute + tool "cg" + name "GetName" + value "get_$target") + (object Attribute + tool "cg" + name "GetIsConst" + value TRUE) + (object Attribute + tool "cg" + name "GetResultIsConst" + value ("GetResultIsConstSet" 2)) + (object Attribute + tool "cg" + name "GetResultIsConstSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "False" + value 0) + (object Attribute + tool "cg" + name "True" + value 1) + (object Attribute + tool "cg" + name "Same_As_Function" + value 2))) + (object Attribute + tool "cg" + name "InlineGet" + value TRUE) + (object Attribute + tool "cg" + name "GenerateSetOperation" + value TRUE) + (object Attribute + tool "cg" + name "SetName" + value "set_$target") + (object Attribute + tool "cg" + name "SetReturnsValue" + value FALSE) + (object Attribute + tool "cg" + name "InlineSet" + value TRUE) + (object Attribute + tool "cg" + name "QualifiedGetSetByReference" + value ("QualifiedGetSetByReferenceSet" 2)) + (object Attribute + tool "cg" + name "QualifiedGetSetByReferenceSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "False" + value 0) + (object Attribute + tool "cg" + name "True" + value 1) + (object Attribute + tool "cg" + name "Same_As_GetSetByReference" + value 2))) + (object Attribute + tool "cg" + name "GenerateQualifiedGetOperation" + value TRUE) + (object Attribute + tool "cg" + name "QualifiedGetName" + value "get_$target") + (object Attribute + tool "cg" + name "QualifiedGetIsConst" + value TRUE) + (object Attribute + tool "cg" + name "QualifiedGetResultIsConst" + value ("GetResultIsConstSet" 2)) + (object Attribute + tool "cg" + name "InlineQualifiedGet" + value TRUE) + (object Attribute + tool "cg" + name "GenerateQualifiedSetOperation" + value TRUE) + (object Attribute + tool "cg" + name "QualifiedSetName" + value "set_$target") + (object Attribute + tool "cg" + name "QualifiedSetReturnsValue" + value FALSE) + (object Attribute + tool "cg" + name "InlineQualifiedSet" + value TRUE) + (object Attribute + tool "cg" + name "GenerateAssocClassDataMember" + value TRUE) + (object Attribute + tool "cg" + name "AssocClassDataMemberName" + value "$target") + (object Attribute + tool "cg" + name "AssocClassDataMemberVisibility" + value ("DataMemberVisibilitySet" 14)) + (object Attribute + tool "cg" + name "DataMemberVisibilitySet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Public" + value 45) + (object Attribute + tool "cg" + name "Protected" + value 44) + (object Attribute + tool "cg" + name "Private" + value 43) + (object Attribute + tool "cg" + name "Implementation" + value 14) + (object Attribute + tool "cg" + name "AtRelationshipVisibility" + value 210))) + (object Attribute + tool "cg" + name "AssocClassDataMemberMutability" + value ("DataMemberMutabilitySet" 0)) + (object Attribute + tool "cg" + name "DataMemberMutabilitySet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Unrestricted" + value 0) + (object Attribute + tool "cg" + name "Mutable" + value 1) + (object Attribute + tool "cg" + name "Const" + value 2))) + (object Attribute + tool "cg" + name "AssocClassDataMemberIsVolatile" + value FALSE) + (object Attribute + tool "cg" + name "AssocClassGetSetKinds" + value ("GetSetKindsSet" 200)) + (object Attribute + tool "cg" + name "GenerateAssocClassGetOperation" + value TRUE) + (object Attribute + tool "cg" + name "AssocClassGetName" + value "get_$target") + (object Attribute + tool "cg" + name "AssocClassGetIsConst" + value TRUE) + (object Attribute + tool "cg" + name "AssocClassGetResultIsConst" + value ("GetResultIsConstSet" 2)) + (object Attribute + tool "cg" + name "InlineAssocClassGet" + value TRUE) + (object Attribute + tool "cg" + name "GenerateAssocClassSetOperation" + value TRUE) + (object Attribute + tool "cg" + name "AssocClassSetName" + value "set_$target") + (object Attribute + tool "cg" + name "AssocClassSetReturnsValue" + value FALSE) + (object Attribute + tool "cg" + name "InlineAssocClassSet" + value TRUE) + (object Attribute + tool "cg" + name "AssocClassForwardReferenceOnly" + value TRUE) + (object Attribute + tool "cg" + name "GenerateForwardReference" + value FALSE) + (object Attribute + tool "cg" + name "IsReadOnly" + value FALSE) + (object Attribute + tool "cg" + name "BoundedRoleType" + value ("AssocTypeSet" 47)) + (object Attribute + tool "cg" + name "AssocTypeSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Array" + value 24) + (object Attribute + tool "cg" + name "Sequence" + value 47))))) + (object Attribute + tool "cg" + name "default__Attribute" + value (list Attribute_Set + (object Attribute + tool "cg" + name "CodeName" + value "") + (object Attribute + tool "cg" + name "GenerateDataMember" + value TRUE) + (object Attribute + tool "cg" + name "DataMemberName" + value "$attribute") + (object Attribute + tool "cg" + name "DataMemberVisibility" + value ("DataMemberVisibilitySet" 14)) + (object Attribute + tool "cg" + name "DataMemberVisibilitySet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Public" + value 45) + (object Attribute + tool "cg" + name "Protected" + value 44) + (object Attribute + tool "cg" + name "Private" + value 43) + (object Attribute + tool "cg" + name "Implementation" + value 14) + (object Attribute + tool "cg" + name "AtAttributeVisibility" + value 211))) + (object Attribute + tool "cg" + name "DataMemberMutability" + value ("DataMemberMutabilitySet" 0)) + (object Attribute + tool "cg" + name "DataMemberMutabilitySet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Unrestricted" + value 0) + (object Attribute + tool "cg" + name "Mutable" + value 1) + (object Attribute + tool "cg" + name "Const" + value 2))) + (object Attribute + tool "cg" + name "DataMemberIsVolatile" + value FALSE) + (object Attribute + tool "cg" + name "DataMemberFieldSize" + value "") + (object Attribute + tool "cg" + name "GenerateGetOperation" + value TRUE) + (object Attribute + tool "cg" + name "GenerateSetOperation" + value TRUE) + (object Attribute + tool "cg" + name "GetName" + value "get_$attribute") + (object Attribute + tool "cg" + name "SetName" + value "set_$attribute") + (object Attribute + tool "cg" + name "GetSetKinds" + value ("GetSetKindsSet" 200)) + (object Attribute + tool "cg" + name "GetSetKindsSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Common" + value 200) + (object Attribute + tool "cg" + name "Virtual" + value 201) + (object Attribute + tool "cg" + name "Abstract" + value 202) + (object Attribute + tool "cg" + name "Static" + value 203) + (object Attribute + tool "cg" + name "Friend" + value 204))) + (object Attribute + tool "cg" + name "GetIsConst" + value TRUE) + (object Attribute + tool "cg" + name "GetResultIsConst" + value ("GetResultIsConstSet" 2)) + (object Attribute + tool "cg" + name "GetResultIsConstSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "False" + value 0) + (object Attribute + tool "cg" + name "True" + value 1) + (object Attribute + tool "cg" + name "Same_As_Function" + value 2))) + (object Attribute + tool "cg" + name "GetSetByReference" + value FALSE) + (object Attribute + tool "cg" + name "InlineGet" + value TRUE) + (object Attribute + tool "cg" + name "SetReturnsValue" + value FALSE) + (object Attribute + tool "cg" + name "InlineSet" + value TRUE) + (object Attribute + tool "cg" + name "CaseSpecifier" + value "") + (object Attribute + tool "cg" + name "IsReadOnly" + value FALSE))) + (object Attribute + tool "cg" + name "default__Uses" + value (list Attribute_Set + (object Attribute + tool "cg" + name "ForwardReferenceOnly" + value FALSE) + (object Attribute + tool "cg" + name "BodyReferenceOnly" + value FALSE) + (object Attribute + tool "cg" + name "GenerateForwardReference" + value FALSE))) + (object Attribute + tool "cg" + name "default__Subsystem" + value (list Attribute_Set + (object Attribute + tool "cg" + name "Directory" + value "AUTO GENERATE") + (object Attribute + tool "cg" + name "DirectoryIsOnSearchList" + value FALSE) + (object Attribute + tool "cg" + name "PrecompiledHeader" + value ""))) + (object Attribute + tool "cg" + name "default__Category" + value (list Attribute_Set + (object Attribute + tool "cg" + name "IsNamespace" + value FALSE) + (object Attribute + tool "cg" + name "Indent" + value 2) + (object Attribute + tool "cg" + name "CodeName" + value "") + (object Attribute + tool "cg" + name "GenerateEmptyRegions" + value ("GenerateEmptyRegionSet" 3)) + (object Attribute + tool "cg" + name "GenerateEmptyRegionSet" + value (list Attribute_Set + (object Attribute + tool "cg" + name "None" + value 0) + (object Attribute + tool "cg" + name "Preserved" + value 1) + (object Attribute + tool "cg" + name "Unpreserved" + value 2) + (object Attribute + tool "cg" + name "All" + value 3))))) + (object Attribute + tool "MSVC" + name "propertyId" + value "809135966") + (object Attribute + tool "MSVC" + name "default__Project" + value (list Attribute_Set + (object Attribute + tool "MSVC" + name "Version" + value "5.0"))) + (object Attribute + tool "MSVC" + name "default__Class" + value (list Attribute_Set + (object Attribute + tool "MSVC" + name "Type" + value ("MSVCClassTypeSet" 0)) + (object Attribute + tool "MSVC" + name "MSVCClassTypeSet" + value (list Attribute_Set + (object Attribute + tool "MSVC" + name "Normal" + value 0) + (object Attribute + tool "MSVC" + name "Interface_Part" + value 1) + (object Attribute + tool "MSVC" + name "Connection_Part" + value 2) + (object Attribute + tool "MSVC" + name "Class_Factory" + value 3))) + (object Attribute + tool "MSVC" + name "CObjectFunctionality" + value ("CObjectFunctionalitySet" 0)) + (object Attribute + tool "MSVC" + name "CObjectFunctionalitySet" + value (list Attribute_Set + (object Attribute + tool "MSVC" + name "None" + value 0) + (object Attribute + tool "MSVC" + name "Dynamic" + value 1) + (object Attribute + tool "MSVC" + name "Dyncreate" + value 2) + (object Attribute + tool "MSVC" + name "Serial" + value 3))) + (object Attribute + tool "MSVC" + name "GenerateOverrideGroup" + value FALSE) + (object Attribute + tool "MSVC" + name "GenerateDataGroup" + value FALSE) + (object Attribute + tool "MSVC" + name "AFX_DATA_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "GenerateFieldGroup" + value FALSE) + (object Attribute + tool "MSVC" + name "AFX_FIELD_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "GenerateMessageGroup" + value FALSE) + (object Attribute + tool "MSVC" + name "GenerateMessageMap" + value FALSE) + (object Attribute + tool "MSVC" + name "AFX_MSG_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "MESSAGE_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "OLEFactory" + value ("OLEFactorySet" 0)) + (object Attribute + tool "MSVC" + name "OLEFactorySet" + value (list Attribute_Set + (object Attribute + tool "MSVC" + name "None" + value 0) + (object Attribute + tool "MSVC" + name "Built_in" + value 1) + (object Attribute + tool "MSVC" + name "Simple" + value 2) + (object Attribute + tool "MSVC" + name "Licensed" + value 3))) + (object Attribute + tool "MSVC" + name "OLEName" + value "") + (object Attribute + tool "MSVC" + name "OLEClassID" + value "") + (object Attribute + tool "MSVC" + name "GenerateOLECtlType" + value FALSE) + (object Attribute + tool "MSVC" + name "OLECtlType" + value "") + (object Attribute + tool "MSVC" + name "GenerateOLETypeLib" + value FALSE) + (object Attribute + tool "MSVC" + name "OLETypeLibID" + value "") + (object Attribute + tool "MSVC" + name "OLETypeLibMajor" + value "") + (object Attribute + tool "MSVC" + name "OLETypeLibMinor" + value "") + (object Attribute + tool "MSVC" + name "GeneratePropPageIDs" + value FALSE) + (object Attribute + tool "MSVC" + name "OLEPropPageIDs" + value (value Text "")) + (object Attribute + tool "MSVC" + name "GenerateDispatchMap" + value FALSE) + (object Attribute + tool "MSVC" + name "AFX_DISPATCH_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "AFX_DISPATCH_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "DISPATCH_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "StockProperties" + value (value Text "")) + (object Attribute + tool "MSVC" + name "StockFunctions" + value (value Text "")) + (object Attribute + tool "MSVC" + name "DispatchDefValue" + value "") + (object Attribute + tool "MSVC" + name "GenerateDispIdEnum" + value FALSE) + (object Attribute + tool "MSVC" + name "AFX_DISP_ID_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "GenerateInterfaceMap" + value FALSE) + (object Attribute + tool "MSVC" + name "INTERFACE_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "InitInterface" + value "") + (object Attribute + tool "MSVC" + name "GenerateEventMap" + value FALSE) + (object Attribute + tool "MSVC" + name "AFX_EVENT_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "AFX_EVENT_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "EVENT_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "StockEvents" + value (value Text "")) + (object Attribute + tool "MSVC" + name "GenerateEventSinkMap" + value FALSE) + (object Attribute + tool "MSVC" + name "AFX_EVENTSINK_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "AFX_EVENTSINK_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "EVENTSINK_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "PropNotifySinks" + value (value Text "")) + (object Attribute + tool "MSVC" + name "GenerateConnectionMap" + value FALSE) + (object Attribute + tool "MSVC" + name "CONNECTION_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "ConnectionPointIID" + value "") + (object Attribute + tool "MSVC" + name "InheritanceType" + value "") + (object Attribute + tool "MSVC" + name "DeclSpec" + value "") + (object Attribute + tool "MSVC" + name "OLECommands" + value (value Text "")) + (object Attribute + tool "MSVC" + name "MFCDeclares" + value (value Text "")) + (object Attribute + tool "MSVC" + name "MFCImplements" + value (value Text "")) + (object Attribute + tool "MSVC" + name "ATL_Declares" + value (value Text "")) + (object Attribute + tool "MSVC" + name "GenerateCOMMap" + value FALSE) + (object Attribute + tool "MSVC" + name "COM_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "GenerateConnectionPointMap" + value FALSE) + (object Attribute + tool "MSVC" + name "CONNECTION_POINT_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "GenerateMsgMap" + value FALSE) + (object Attribute + tool "MSVC" + name "MSG_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "GeneratePropertyMap" + value FALSE) + (object Attribute + tool "MSVC" + name "PROPERTY_MAP_Entries" + value (value Text "")))) + (object Attribute + tool "MSVC" + name "default__Operation" + value (list Attribute_Set + (object Attribute + tool "MSVC" + name "Type" + value ("MSVCOperationTypeSet" 0)) + (object Attribute + tool "MSVC" + name "MSVCOperationTypeSet" + value (list Attribute_Set + (object Attribute + tool "MSVC" + name "Normal" + value 0) + (object Attribute + tool "MSVC" + name "Virtual_Override" + value 1) + (object Attribute + tool "MSVC" + name "Message_Handler" + value 2) + (object Attribute + tool "MSVC" + name "Dispatch_Handler" + value 3) + (object Attribute + tool "MSVC" + name "Event_Firing_Function" + value 4) + (object Attribute + tool "MSVC" + name "Event_Sink_Handler" + value 5) + (object Attribute + tool "MSVC" + name "Std_OLE_Method" + value 6) + (object Attribute + tool "MSVC" + name "Command_Parser" + value 7) + (object Attribute + tool "MSVC" + name "Property_Get_Function" + value 8) + (object Attribute + tool "MSVC" + name "Property_Set_Function" + value 9) + (object Attribute + tool "MSVC" + name "Property_Notify_Function" + value 10) + (object Attribute + tool "MSVC" + name "Macro_Generated_Function" + value 11))) + (object Attribute + tool "MSVC" + name "AFX_MSG_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "MESSAGE_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "AFX_DISPATCH_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "DISPATCH_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "AFX_EVENT_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "EVENT_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "AFX_EVENTSINK_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "EVENTSINK_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "CallType" + value "") + (object Attribute + tool "MSVC" + name "DeclSpec" + value "") + (object Attribute + tool "MSVC" + name "BodyImage" + value (value Text "")))) + (object Attribute + tool "MSVC" + name "default__Role" + value (list Attribute_Set + (object Attribute + tool "MSVC" + name "Type" + value ("MSVCAttributeTypeSet" 0)) + (object Attribute + tool "MSVC" + name "MSVCAttributeTypeSet" + value (list Attribute_Set + (object Attribute + tool "MSVC" + name "Normal" + value 0) + (object Attribute + tool "MSVC" + name "Member_Property" + value 1) + (object Attribute + tool "MSVC" + name "Get_Set_Property" + value 2) + (object Attribute + tool "MSVC" + name "Dialog_Data" + value 3) + (object Attribute + tool "MSVC" + name "Field_Data" + value 4) + (object Attribute + tool "MSVC" + name "Stock_Property" + value 5))) + (object Attribute + tool "MSVC" + name "AFX_DISPATCH_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "DISPATCH_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "DeclSpec" + value "") + (object Attribute + tool "MSVC" + name "PointerBase" + value "") + (object Attribute + tool "MSVC" + name "CallType" + value "") + (object Attribute + tool "MSVC" + name "StockPropertyImplementation" + value ""))) + (object Attribute + tool "MSVC" + name "default__Has" + value (list Attribute_Set + (object Attribute + tool "MSVC" + name "Type" + value ("MSVCAttributeTypeSet" 0)) + (object Attribute + tool "MSVC" + name "MSVCAttributeTypeSet" + value (list Attribute_Set + (object Attribute + tool "MSVC" + name "Normal" + value 0) + (object Attribute + tool "MSVC" + name "Member_Property" + value 1) + (object Attribute + tool "MSVC" + name "Get_Set_Property" + value 2) + (object Attribute + tool "MSVC" + name "Dialog_Data" + value 3) + (object Attribute + tool "MSVC" + name "Field_Data" + value 4) + (object Attribute + tool "MSVC" + name "Stock_Property" + value 5))) + (object Attribute + tool "MSVC" + name "AFX_DISPATCH_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "DISPATCH_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "DeclSpec" + value "") + (object Attribute + tool "MSVC" + name "PointerBase" + value "") + (object Attribute + tool "MSVC" + name "CallType" + value "") + (object Attribute + tool "MSVC" + name "StockPropertyImplementation" + value ""))) + (object Attribute + tool "MSVC" + name "default__Attribute" + value (list Attribute_Set + (object Attribute + tool "MSVC" + name "Type" + value ("MSVCAttributeTypeSet" 0)) + (object Attribute + tool "MSVC" + name "MSVCAttributeTypeSet" + value (list Attribute_Set + (object Attribute + tool "MSVC" + name "Normal" + value 0) + (object Attribute + tool "MSVC" + name "Member_Property" + value 1) + (object Attribute + tool "MSVC" + name "Get_Set_Property" + value 2) + (object Attribute + tool "MSVC" + name "Dialog_Data" + value 3) + (object Attribute + tool "MSVC" + name "Field_Data" + value 4) + (object Attribute + tool "MSVC" + name "Stock_Property" + value 5))) + (object Attribute + tool "MSVC" + name "AFX_DISPATCH_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "DISPATCH_MAP_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "DeclSpec" + value "") + (object Attribute + tool "MSVC" + name "PointerBase" + value "") + (object Attribute + tool "MSVC" + name "CallType" + value "") + (object Attribute + tool "MSVC" + name "StockPropertyImplementation" + value ""))) + (object Attribute + tool "MSVC" + name "default__Module-Spec" + value (list Attribute_Set + (object Attribute + tool "MSVC" + name "GenerateIncludesGroup" + value FALSE) + (object Attribute + tool "MSVC" + name "AFX_INCLUDES_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "GenerateInsertLocation" + value FALSE))) + (object Attribute + tool "MSVC" + name "default__Module-Body" + value (list Attribute_Set + (object Attribute + tool "MSVC" + name "GenerateIncludesGroup" + value FALSE) + (object Attribute + tool "MSVC" + name "AFX_INCLUDES_Entries" + value (value Text "")) + (object Attribute + tool "MSVC" + name "GenerateInsertLocation" + value FALSE))) + (object Attribute + tool "cg" + name "HiddenTool" + value FALSE) + (object Attribute + tool "SCC" + name "HiddenTool" + value FALSE)) + quid "355326EE0040")) diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/vcardandvcal/group/BLD.INF --- a/pimappsupport/vcardandvcal/group/BLD.INF Mon May 03 12:30:32 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,338 +0,0 @@ -// Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// VCard/vCal converters -// -// - -#include - -PRJ_PLATFORMS -DEFAULT WINC - -PRJ_EXPORTS -// specify the source file followed by its destination here -// copy will be used to copy the source file to its destination -// If there's no destination then the source file will be copied -// to the same name in \epoc32\include - -../inc/VCAL.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vcal.h) -../inc/VCAL.INL SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vcal.inl) -../inc/VCARD.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vcard.h) -../inc/VCARD.INL SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vcard.inl) -../inc/VERSIT.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(versit.h) -../inc/VERSIT.INL SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(versit.inl) -../inc/VPROP.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vprop.h) -../inc/VPROP.INL SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vprop.inl) -../inc/VTOKEN.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vtoken.h) -../inc/VUID.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vuid.h) -../inc/VRECUR.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vrecur.h) -../inc/VRECUR.INL SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vrecur.inl) -../inc/vstaticutils.h SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vstaticutils.h) -../inc/VUTIL.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vutil.h) -../inc/VersitTls.h SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(versittls.h) -../inc/VObserv.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vobserv.h) -#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS -../inc/versitlinereaderext.h SYMBIAN_APP_LAYER_PLATFORM_EXPORT_PATH(versitlinereaderext.h) -../inc/vpropbinaryfile.h SYMBIAN_APP_LAYER_PLATFORM_EXPORT_PATH(vpropbinaryfile.h) -../inc/vcard3.h SYMBIAN_APP_LAYER_PLATFORM_EXPORT_PATH(vcard3.h) -#endif - -./versit.iby /epoc32/rom/include/versit.iby -./versitrecognizer.iby /epoc32/rom/include/versitrecognizer.iby -./versitrecognizer.iby CORE_APP_LAYER_IBY_EXPORT_PATH(versitrecognizer.iby) - -PRJ_MMPFILES - -./VERSIT.MMP -./VCal.MMP -./VCard.MMP -#ifndef WINC -../rec/VersitRecog.mmp -#endif - -PRJ_TESTMMPFILES -// specify the .mmp files required for building any test programs here -// -// you can specify "manual" to denote that a test should be listed in a generated -// batch file for running a group of tests which require user input during testing. -// you can specify "support" to denote that a file is a test support file and shouldn't -// be listed in a batch file for running a group of tests -// By default, each test will be listed in a batch file for running a group of tests -// which can be left to run without requiring watching over by the person running the tests, -// i.e. tests where no user input is required. The default will apply if neither "manual" -// or "support" is specified. -../tsrc/TVERSIT.MMP -../tsrc/tvgen.mmp -../tsrc/TCharsetvCard.mmp -../tsrc/TBugFix.MMP -../tsrc/toom.mmp -../tsrc/tPerformance.mmp -../tsrc/TDefaultCharset.mmp -../tsrc/Test_saveloadbin.mmp -../tsrc/Test_saveloadbinoom.mmp -../Ticket/VTicket.MMP support -../tsrc/TJapaneseSoundProperty.mmp -../tsrc/Test_recognizer.mmp - -// PREQ1375 Unit tests for PBAPSupport -../tsrc/UnitTest_PBAPSupport/group/TestExternalize.mmp - - -PRJ_TESTEXPORTS - -../group/VersitTest.iby /epoc32/rom/include/versittest.iby - -// WINSCW UDEB Z - -../TestvCards/Encoded/1.vcf z:/testvcards/encoded/1.vcf -../TestvCards/Encoded/2.vcf z:/testvcards/encoded/2.vcf -../TestvCards/Encoded/3.vcf z:/testvcards/encoded/3.vcf -../TestvCards/Encoded/4.vcf z:/testvcards/encoded/4.vcf -../TestvCards/Encoded/5.vcf z:/testvcards/encoded/5.vcf -../TestvCards/Encoded/6.vcf z:/testvcards/encoded/6.vcf -../TestvCards/Encoded/7.vcf z:/testvcards/encoded/7.vcf - -../TestvCards/Epoc/1.vcf z:/testvcards/epoc/1.vcf -../TestvCards/Epoc/2.vcf z:/testvcards/epoc/2.vcf -../TestvCards/Epoc/3.vcf z:/testvcards/epoc/3.vcf -../TestvCards/Epoc/4.vcf z:/testvcards/epoc/4.vcf -../TestvCards/Epoc/5.vcf z:/testvcards/epoc/5.vcf -../TestvCards/Epoc/6.vcf z:/testvcards/epoc/6.vcf -../TestvCards/Epoc/7.vcf z:/testvcards/epoc/7.vcf -../TestvCards/Epoc/8.vcf z:/testvcards/epoc/8.vcf - -../TestvCards/ER5Regression/1.vcf z:/testvcards/er5regression/1.vcf -../TestvCards/ER5Regression/2.vcf z:/testvcards/er5regression/2.vcf -../TestvCards/ER5Regression/3.vcf z:/testvcards/er5regression/3.vcf -../TestvCards/ER5Regression/4.vcf z:/testvcards/er5regression/4.vcf -../TestvCards/ER5Regression/5.vcf z:/testvcards/er5regression/5.vcf - -../TestvCards/Invalid/1.vcf z:/testvcards/invalid/1.vcf -../TestvCards/Invalid/2.vcf z:/testvcards/invalid/2.vcf -../TestvCards/Invalid/3.vcf z:/testvcards/invalid/3.vcf -../TestvCards/Invalid/4.vcf z:/testvcards/invalid/4.vcf -../TestvCards/Invalid/5.vcf z:/testvcards/invalid/5.vcf -../TestvCards/Invalid/6.vcf z:/testvcards/invalid/6.vcf -../TestvCards/Invalid/7.vcf z:/testvcards/invalid/7.vcf -../TestvCards/Invalid/8.vcf z:/testvcards/invalid/8.vcf - -../TestvCards/Various/1.vcf z:/testvcards/various/1.vcf -../TestvCards/Various/2.vcf z:/testvcards/various/2.vcf -../TestvCards/Various/3.vcf z:/testvcards/various/3.vcf -../TestvCards/Various/4.vcf z:/testvcards/various/4.vcf -../TestvCards/Various/5.vcf z:/testvcards/various/5.vcf -../TestvCards/Various/6.vcf z:/testvcards/various/6.vcf -../TestvCards/Various/7.vcf z:/testvcards/various/7.vcf -../TestvCards/Various/8.vcf z:/testvcards/various/8.vcf -../TestvCards/Various/9.vcf z:/testvcards/various/9.vcf -../TestvCards/Various/10.vcf z:/testvcards/various/10.vcf -../TestvCards/Various/11.vcf z:/testvcards/various/11.vcf -../TestvCards/Various/12.vcf z:/testvcards/various/12.vcf -../TestvCards/Various/nulldate.vcf z:/testvcards/various/nulldate.vcf -../TestvCards/Various/HugeVCard.vcf z:/testvcards/various/HugeVCard.vcf - -// TBugfix the number of files=82 -../TestvCals/Various/6.vcs z:/testvcards/various/6.vcs -../TestFiles/CShJisEs.VCF z:/testfiles/cshjises.vcf -../TestFiles/CTabs.VCS z:/testfiles/ctabs.vcs -../TestFiles/IShJisEs.VCF z:/testfiles/ishjises.vcf -../TestFiles/ITabs.VCS z:/testfiles/itabs.vcs -../TestFiles/ITimePer.VCS z:/testfiles/itimeper.vcs -../TestFiles/iDalarm.vcs z:/testfiles/idalarm.vcs -../TestFiles/cDalarm.vcs z:/testfiles/cdalarm.vcs -../TestFiles/IAgent.VCF z:/testfiles/iagent.vcf -../TestFiles/IBase64.VCF z:/testfiles/ibase64.vcf -../TestFiles/IBase64ws.vcf z:/testfiles/ibase64ws.vcf -../TestFiles/IDalarm2.VCS z:/testfiles/idalarm2.vcs -../TestFiles/IWrap.VCS z:/testfiles/iwrap.vcs -../TestFiles/CAgent.VCF z:/testfiles/cagent.vcf -../TestFiles/CBase64.VCF z:/testfiles/cbase64.vcf -../TestFiles/CBase64ws.vcf z:/testfiles/cbase64ws.vcf -../TestFiles/CDalarm2.VCS z:/testfiles/cdalarm2.vcs -../TestFiles/CWrap.VCS z:/testfiles/cwrap.vcs -../TestFiles/Test5_ASCII_Input.vcf z:/testfiles/test5_ascii_input.vcf -../TestFiles/iAsciiLineFolding.vcf z:/testfiles/iasciilinefolding.vcf -../TestFiles/cAsciiLineFolding.vcf z:/testfiles/casciilinefolding.vcf -../TestFiles/iBase64LineFolding.vcf z:/testfiles/ibase64linefolding.vcf -../TestFiles/cBase64LineFolding.VCF z:/testfiles/cbase64linefolding.vcf -../TestFiles/cBase64NoSpaceLineFolding.vcf z:/testfiles/cbase64nospacelinefolding.vcf -../TestFiles/iQPLineFolding.vcf z:/testfiles/iqplinefolding.vcf -../TestFiles/cQPLineFolding.VCF z:/testfiles/cqplinefolding.vcf -../TestFiles/iTest7.vcf z:/testfiles/itest7.vcf -../TestFiles/iTestVcard.vcf z:/testfiles/itestvcard.vcf -../TestFiles/iTestVcal.vcs z:/testfiles/itestvcal.vcs -../TestFiles/cTestVCard.vcf z:/testfiles/ctestvcard.vcf -../TestFiles/cTestVCal.vcs z:/testfiles/ctestvcal.vcs -../TestFiles/iGroupedProperty.vcf z:/testfiles/igroupedproperty.vcf -../TestFiles/iTimeZoneN.vcs z:/testfiles/itimezonen.vcs -../TestFiles/cTimeZoneN.VCS z:/testfiles/ctimezonen.vcs -../TestFiles/iTimeZoneP.vcs z:/testfiles/itimezonep.vcs -../TestFiles/cTimeZoneP.VCS z:/testfiles/ctimezonep.vcs -../TestFiles/IGBK.VCF z:/testfiles/igbk.vcf -../TestFiles/IShiftJis.VCS z:/testfiles/ishiftjis.vcs -../TestFiles/CShiftJis.VCS z:/testfiles/cshiftjis.vcs -../TestFiles/IvCard.VCF z:/testfiles/ivcard.vcf -../TestFiles/CvCard.VCF z:/testfiles/cvcard.vcf -../TestFiles/IvCal.VCS z:/testfiles/ivcal.vcs -../TestFiles/IRDailyVCal.VCS z:/testfiles/irdailyvcal.vcs -../TestFiles/CvCal.VCS z:/testfiles/cvcal.vcs -../TestFiles/NoEnd.VCF z:/testfiles/noend.vcf -../TestFiles/HalfLine.VCF z:/testfiles/halfline.vcf -../TestFiles/Feb29.VCS z:/testfiles/feb29.vcs -../TestFiles/EnName1.VCS z:/testfiles/enname1.vcs -../TestFiles/EnName2.VCS z:/testfiles/enname2.vcs -../TestFiles/EnName3.VCF z:/testfiles/enname3.vcf -../TestFiles/EnName4.VCF z:/testfiles/enname4.vcf -../TestFiles/Begin2.VCF z:/testfiles/begin2.vcf -../TestFiles/Begin3.VCS z:/testfiles/begin3.vcs -../TestFiles/End2.VCF z:/testfiles/end2.vcf -../TestFiles/IEndBa64.VCS z:/testfiles/iendba64.vcs -../TestFiles/CEndBa64.VCS z:/testfiles/cendba64.vcs -../TestFiles/CNullPar.VCS z:/testfiles/cnullpar.vcs -../TestFiles/CTZone.VCS z:/testfiles/ctzone.vcs -../TestFiles/CTZone2.VCS z:/testfiles/ctzone2.vcs -../TestFiles/CWrap2.VCS z:/testfiles/cwrap2.vcs -../TestFiles/IESlash.VCF z:/testfiles/ieslash.vcf -../TestFiles/CESlash.VCF z:/testfiles/ceslash.vcf -../TestFiles/INullPar.VCS z:/testfiles/inullpar.vcs -../TestFiles/ITZone.VCS z:/testfiles/itzone.vcs -../TestFiles/ITZone2.VCS z:/testfiles/itzone2.vcs -../TestFiles/IWrap2.VCS z:/testfiles/iwrap2.vcs -../TestFiles/Base64.VCF z:/testfiles/base64.vcf -../TestFiles/vCard.VCF z:/testfiles/vcard.vcf -../TestFiles/IAutoD.VCF z:/testfiles/iautod.vcf -../TestFiles/IAutoD2.VCS z:/testfiles/iautod2.vcs -../TestFiles/CAutoD.VCF z:/testfiles/cautod.vcf -../TestFiles/CAutoD2.VCS z:/testfiles/cautod2.vcs -../TestFiles/IYenEsc1.VCF z:/testfiles/iyenesc1.vcf -../TestFiles/IYenEsc2.VCF z:/testfiles/iyenesc2.vcf -../TestFiles/IParamE.VCF z:/testfiles/iparame.vcf -../TestFiles/CYenEsc1.VCF z:/testfiles/cyenesc1.vcf -../TestFiles/CYenEsc2.VCF z:/testfiles/cyenesc2.vcf -../TestFiles/CParamE.VCF z:/testfiles/cparame.vcf -../TestFiles/IUK.VCS z:/testfiles/iuk.vcs -../TestFiles/INewYork.VCS z:/testfiles/inewyork.vcs -../TestFiles/IJapan.VCS z:/testfiles/ijapan.vcs -../TestFiles/CUK.VCS z:/testfiles/cuk.vcs -../TestFiles/CNewYork.VCS z:/testfiles/cnewyork.vcs -../TestFiles/CJapan.VCS z:/testfiles/cjapan.vcs -../TestFiles/IFred.VCF z:/testfiles/ifred.vcf -../TestFiles/iNonStandardAgent.vcf z:/testfiles/inonstandardagent.vcf -../TestFiles/cNonStandardAgent.vcf z:/testfiles/cnonstandardagent.vcf -../TestFiles/iRRule.vcs z:/testfiles/irrule.vcs -../TestFiles/iBlankLines.vcf z:/testfiles/iblanklines.vcf -../TestFiles/cBlankLines.VCF z:/testfiles/cblanklines.vcf -../TestFiles/iLineFeed.vcs z:/testfiles/ilinefeed.vcs -../TestFiles/cLineFeed.VCS z:/testfiles/clinefeed.vcs -../TestFiles/IJunkLine.VCS z:/testfiles/ijunkline.vcs -../TestFiles/CJunkLine.VCS z:/testfiles/cjunkline.vcs -../TestFiles/iattachment.vcs z:/testfiles/iattachment.vcs -../TestFiles/cattachment.vcs z:/testfiles/cattachment.vcs -../TestFiles/iAlarmRepeatCount.vcs z:/testfiles/ialarmrepeatcount.vcs -../TestFiles/DefaultCharSetInput.vcf z:/testfiles/defaultcharsetinput.vcf -../TestFiles/inewbase64.vcf z:/testfiles/inewbase64.vcf -../TestFiles/inewbase64.vcs z:/testfiles/inewbase64.vcs -../TestFiles/ivtrigger.vcf z:/testfiles/ivtrigger.vcf -../TestFiles/cnewbase64.VCF z:/testfiles/cnewbase64.vcf -../TestFiles/cnewbase64.VCS z:/testfiles/cnewbase64.vcs -../TestFiles/cvtrigger.VCF z:/testfiles/cvtrigger.vcf -../TestFiles/nolf.vcs z:/testfiles/nolf.vcs -../TestFiles/nestedagent.vcf z:/testfiles/nestedagent.vcf - -// TPerformance muber of files=21 -../TPerformance/iLine_short.vcf z:/tperformance/inputfile/line_short.vcf -../TPerformance/iLine_photo.vcf z:/tperformance/inputfile/line_photo.vcf -../TPerformance/iLine_long.vcf z:/tperformance/inputfile/line_long.vcf -../TPerformance/iLine_alarm.vcs z:/tperformance/inputfile/line_alarm.vcs -../TPerformance/iFileUTF8_QP.vcf z:/tperformance/inputfile/fileutf8_qp.vcf -../TPerformance/iFileUTF8_Base64.vcf z:/tperformance/inputfile/fileutf8_base64.vcf -../TPerformance/iFileShiftJIS_QP.vcf z:/tperformance/inputfile/fileshiftjis_qp.vcf -../TPerformance/iFileShiftJIS_Base64.vcf z:/tperformance/inputfile/fileshiftjis_base64.vcf -../TPerformance/iFileGBK_QP.vcf z:/tperformance/inputfile/filegbk_qp.vcf -../TPerformance/iFileGBK_Base64.vcf z:/tperformance/inputfile/filegbk_base64.vcf -../TPerformance/iFileASCII_QP.vcf z:/tperformance/inputfile/fileascii_qp.vcf -../TPerformance/iFileASCII_None.vcf z:/tperformance/inputfile/fileascii_none.vcf -../TPerformance/iFileASCII_Base64.vcf z:/tperformance/inputfile/fileascii_base64.vcf -../TPerformance/iFile05entity.vcs z:/tperformance/inputfile/file05entity.vcs -../TPerformance/iFile10entity.vcs z:/tperformance/inputfile/file10entity.vcs -../TPerformance/iFile15entity.vcs z:/tperformance/inputfile/file15entity.vcs -../TPerformance/iFile20entity.vcs z:/tperformance/inputfile/file20entity.vcs -../TPerformance/iFile25entity.vcs z:/tperformance/inputfile/file25entity.vcs -../TPerformance/iFile30entity.vcs z:/tperformance/inputfile/file30entity.vcs -../TPerformance/iFile35entity.vcs z:/tperformance/inputfile/file35entity.vcs -../TPerformance/iFile40entity.vcs z:/tperformance/inputfile/file40entity.vcs - -// Shift-JIS and other data files=34 -../TestFiles/K3Data/ITest01.VCF z:/k3data/itest01.vcf -../TestFiles/K3Data/ITest02.VCF z:/k3data/itest02.vcf -../TestFiles/K3Data/ITest03.VCS z:/k3data/itest03.vcs -../TestFiles/K3Data/ITest04.VCF z:/k3data/itest04.vcf -../TestFiles/K3Data/ITest05.VCF z:/k3data/itest05.vcf -../TestFiles/K3Data/ITest06.VCF z:/k3data/itest06.vcf -../TestFiles/K3Data/ITest07.VCF z:/k3data/itest07.vcf -../TestFiles/K3Data/ITest08.VCF z:/k3data/itest08.vcf -../TestFiles/K3Data/ITest09.VCF z:/k3data/itest09.vcf -../TestFiles/K3Data/ITest10.VCF z:/k3data/itest10.vcf -../TestFiles/K3Data/ITest11.VCF z:/k3data/itest11.vcf -../TestFiles/K3Data/STest01.VCF z:/k3data/stest01.vcf -../TestFiles/K3Data/STest02.VCF z:/k3data/stest02.vcf -../TestFiles/K3Data/STest03.VCS z:/k3data/stest03.vcs -../TestFiles/K3Data/STest04.VCF z:/k3data/stest04.vcf -../TestFiles/K3Data/STest05.VCF z:/k3data/stest05.vcf -../TestFiles/K3Data/STest06.VCF z:/k3data/stest06.vcf -../TestFiles/K3Data/STest07.VCF z:/k3data/stest07.vcf -../TestFiles/K3Data/STest08.VCF z:/k3data/stest08.vcf -../TestFiles/K3Data/STest09.VCF z:/k3data/stest09.vcf -../TestFiles/K3Data/STest10.VCF z:/k3data/stest10.vcf -../TestFiles/K3Data/STest11.VCF z:/k3data/stest11.vcf - -// Japanese SOUND vCard test files (WINSCW UDEB) -../TestvCards/VersitJapaneseVCards/amano.vcf z:/versitjapanesevcards/amano.vcf -../TestvCards/VersitJapaneseVCards/aoki.vcf z:/versitjapanesevcards/aoki.vcf -../TestvCards/VersitJapaneseVCards/barbara.vcf z:/versitjapanesevcards/barbara.vcf -../TestvCards/VersitJapaneseVCards/Digit1.vcf z:/versitjapanesevcards/digit1.vcf -../TestvCards/VersitJapaneseVCards/Digit2.vcf z:/versitjapanesevcards/digit2.vcf -../TestvCards/VersitJapaneseVCards/haga.vcf z:/versitjapanesevcards/haga.vcf -../TestvCards/VersitJapaneseVCards/kasai.vcf z:/versitjapanesevcards/kasai.vcf -../TestvCards/VersitJapaneseVCards/kitajima.vcf z:/versitjapanesevcards/kitajima.vcf -../TestvCards/VersitJapaneseVCards/Longest.vcf z:/versitjapanesevcards/longest.vcf -../TestvCards/VersitJapaneseVCards/matsui.vcf z:/versitjapanesevcards/matsui.vcf -../TestvCards/VersitJapaneseVCards/miyazaki.vcf z:/versitjapanesevcards/miyazaki.vcf -../TestvCards/VersitJapaneseVCards/nakai.vcf z:/versitjapanesevcards/nakai.vcf -../TestvCards/VersitJapaneseVCards/powell.vcf z:/versitjapanesevcards/powell.vcf -../TestvCards/VersitJapaneseVCards/prolongedsound.vcf z:/versitjapanesevcards/prolongedsound.vcf -../TestvCards/VersitJapaneseVCards/SpecialCharacter1.vcf z:/versitjapanesevcards/specialcharacter1.vcf -../TestvCards/VersitJapaneseVCards/SpecialCharacter2.vcf z:/versitjapanesevcards/specialcharacter2.vcf -../TestvCards/VersitJapaneseVCards/takashiro.vcf z:/versitjapanesevcards/takashiro.vcf -../TestvCards/VersitJapaneseVCards/escaped.vcf z:/versitjapanesevcards/escaped.vcf -../TestvCards/VersitJapaneseVCards/Multiplesounds.vcf z:/versitjapanesevcards/multiplesounds.vcf - -// PREQ1375 Unit testdata for PBAPSupport -../tsrc/UnitTest_PBAPSupport/testdata/CBase64LineFolding.vcf z:/pbapsupport/cbase64linefolding.vcf -../tsrc/UnitTest_PBAPSupport/testdata/CBinaryEncoding.vcf z:/pbapsupport/cbinaryencoding.vcf -../tsrc/UnitTest_PBAPSupport/testdata/CDisableCharset.vcf z:/pbapsupport/cdisablecharset.vcf -../tsrc/UnitTest_PBAPSupport/testdata/CEscapeBackslash.vcf z:/pbapsupport/cescapebackslash.vcf -../tsrc/UnitTest_PBAPSupport/testdata/CEscapeComma.vcf z:/pbapsupport/cescapecomma.vcf -../tsrc/UnitTest_PBAPSupport/testdata/CEscapeSemicolon.vcf z:/pbapsupport/cescapesemicolon.vcf -../tsrc/UnitTest_PBAPSupport/testdata/CLongPropertyName.vcf z:/pbapsupport/clongpropertyname.vcf -../tsrc/UnitTest_PBAPSupport/testdata/CLongPropertyParam.vcf z:/pbapsupport/clongpropertyparam.vcf -../tsrc/UnitTest_PBAPSupport/testdata/CLongPropertyValue.vcf z:/pbapsupport/clongpropertyvalue.vcf -../tsrc/UnitTest_PBAPSupport/testdata/CQPEncodingTest1.vcf z:/pbapsupport/cqpencodingtest1.vcf -../tsrc/UnitTest_PBAPSupport/testdata/CQPEncodingTest2.vcf z:/pbapsupport/cqpencodingtest2.vcf -../tsrc/UnitTest_PBAPSupport/testdata/CShortAsciiLine.vcf z:/pbapsupport/cshortasciiline.vcf -../tsrc/UnitTest_PBAPSupport/testdata/CUseUTF8.vcf z:/pbapsupport/cuseutf8.vcf -../tsrc/UnitTest_PBAPSupport/testdata/IBase64LineFolding.vcf z:/pbapsupport/ibase64linefolding.vcf - - - diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/vcardandvcal/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pimappsupport/vcardandvcal/group/bld.inf Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,338 @@ +// Copyright (c) 1999-2009 Nokia Corporation and/or its subsidiary(-ies). +// All rights reserved. +// This component and the accompanying materials are made available +// under the terms of "Eclipse Public License v1.0" +// which accompanies this distribution, and is available +// at the URL "http://www.eclipse.org/legal/epl-v10.html". +// +// Initial Contributors: +// Nokia Corporation - initial contribution. +// +// Contributors: +// +// Description: +// VCard/vCal converters +// +// + +#include + +PRJ_PLATFORMS +DEFAULT WINC + +PRJ_EXPORTS +// specify the source file followed by its destination here +// copy will be used to copy the source file to its destination +// If there's no destination then the source file will be copied +// to the same name in \epoc32\include + +../inc/VCAL.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vcal.h) +../inc/VCAL.INL SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vcal.inl) +../inc/VCARD.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vcard.h) +../inc/VCARD.INL SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vcard.inl) +../inc/VERSIT.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(versit.h) +../inc/VERSIT.INL SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(versit.inl) +../inc/VPROP.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vprop.h) +../inc/VPROP.INL SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vprop.inl) +../inc/VTOKEN.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vtoken.h) +../inc/VUID.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vuid.h) +../inc/VRECUR.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vrecur.h) +../inc/VRECUR.INL SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vrecur.inl) +../inc/vstaticutils.h SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vstaticutils.h) +../inc/VUTIL.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vutil.h) +../inc/VersitTls.h SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(versittls.h) +../inc/VObserv.H SYMBIAN_APP_LAYER_PUBLIC_EXPORT_PATH(vobserv.h) +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +../inc/versitlinereaderext.h SYMBIAN_APP_LAYER_PLATFORM_EXPORT_PATH(versitlinereaderext.h) +../inc/vpropbinaryfile.h SYMBIAN_APP_LAYER_PLATFORM_EXPORT_PATH(vpropbinaryfile.h) +../inc/vcard3.h SYMBIAN_APP_LAYER_PLATFORM_EXPORT_PATH(vcard3.h) +#endif + +./versit.iby /epoc32/rom/include/versit.iby +./versitrecognizer.iby /epoc32/rom/include/versitrecognizer.iby +./versitrecognizer.iby CORE_APP_LAYER_IBY_EXPORT_PATH(versitrecognizer.iby) + +PRJ_MMPFILES + +./VERSIT.MMP +./VCal.MMP +./VCard.MMP +#ifndef WINC +../rec/VersitRecog.mmp +#endif + +PRJ_TESTMMPFILES +// specify the .mmp files required for building any test programs here +// +// you can specify "manual" to denote that a test should be listed in a generated +// batch file for running a group of tests which require user input during testing. +// you can specify "support" to denote that a file is a test support file and shouldn't +// be listed in a batch file for running a group of tests +// By default, each test will be listed in a batch file for running a group of tests +// which can be left to run without requiring watching over by the person running the tests, +// i.e. tests where no user input is required. The default will apply if neither "manual" +// or "support" is specified. +../tsrc/TVERSIT.MMP +../tsrc/tvgen.mmp +../tsrc/TCharsetvCard.mmp +../tsrc/TBugFix.MMP +../tsrc/toom.mmp +../tsrc/tPerformance.mmp +../tsrc/TDefaultCharset.mmp +../tsrc/Test_saveloadbin.mmp +../tsrc/Test_saveloadbinoom.mmp +../Ticket/VTicket.MMP support +../tsrc/TJapaneseSoundProperty.mmp +../tsrc/Test_recognizer.mmp + +// PREQ1375 Unit tests for PBAPSupport +../tsrc/UnitTest_PBAPSupport/group/TestExternalize.mmp + + +PRJ_TESTEXPORTS + +../group/VersitTest.iby /epoc32/rom/include/versittest.iby + +// WINSCW UDEB Z + +../TestvCards/Encoded/1.vcf z:/testvcards/encoded/1.vcf +../TestvCards/Encoded/2.vcf z:/testvcards/encoded/2.vcf +../TestvCards/Encoded/3.vcf z:/testvcards/encoded/3.vcf +../TestvCards/Encoded/4.vcf z:/testvcards/encoded/4.vcf +../TestvCards/Encoded/5.vcf z:/testvcards/encoded/5.vcf +../TestvCards/Encoded/6.vcf z:/testvcards/encoded/6.vcf +../TestvCards/Encoded/7.vcf z:/testvcards/encoded/7.vcf + +../TestvCards/Epoc/1.vcf z:/testvcards/epoc/1.vcf +../TestvCards/Epoc/2.vcf z:/testvcards/epoc/2.vcf +../TestvCards/Epoc/3.vcf z:/testvcards/epoc/3.vcf +../TestvCards/Epoc/4.vcf z:/testvcards/epoc/4.vcf +../TestvCards/Epoc/5.vcf z:/testvcards/epoc/5.vcf +../TestvCards/Epoc/6.vcf z:/testvcards/epoc/6.vcf +../TestvCards/Epoc/7.vcf z:/testvcards/epoc/7.vcf +../TestvCards/Epoc/8.vcf z:/testvcards/epoc/8.vcf + +../TestvCards/ER5Regression/1.vcf z:/testvcards/er5regression/1.vcf +../TestvCards/ER5Regression/2.vcf z:/testvcards/er5regression/2.vcf +../TestvCards/ER5Regression/3.vcf z:/testvcards/er5regression/3.vcf +../TestvCards/ER5Regression/4.vcf z:/testvcards/er5regression/4.vcf +../TestvCards/ER5Regression/5.vcf z:/testvcards/er5regression/5.vcf + +../TestvCards/Invalid/1.vcf z:/testvcards/invalid/1.vcf +../TestvCards/Invalid/2.vcf z:/testvcards/invalid/2.vcf +../TestvCards/Invalid/3.vcf z:/testvcards/invalid/3.vcf +../TestvCards/Invalid/4.vcf z:/testvcards/invalid/4.vcf +../TestvCards/Invalid/5.vcf z:/testvcards/invalid/5.vcf +../TestvCards/Invalid/6.vcf z:/testvcards/invalid/6.vcf +../TestvCards/Invalid/7.vcf z:/testvcards/invalid/7.vcf +../TestvCards/Invalid/8.vcf z:/testvcards/invalid/8.vcf + +../TestvCards/Various/1.vcf z:/testvcards/various/1.vcf +../TestvCards/Various/2.vcf z:/testvcards/various/2.vcf +../TestvCards/Various/3.vcf z:/testvcards/various/3.vcf +../TestvCards/Various/4.vcf z:/testvcards/various/4.vcf +../TestvCards/Various/5.vcf z:/testvcards/various/5.vcf +../TestvCards/Various/6.vcf z:/testvcards/various/6.vcf +../TestvCards/Various/7.vcf z:/testvcards/various/7.vcf +../TestvCards/Various/8.vcf z:/testvcards/various/8.vcf +../TestvCards/Various/9.vcf z:/testvcards/various/9.vcf +../TestvCards/Various/10.vcf z:/testvcards/various/10.vcf +../TestvCards/Various/11.vcf z:/testvcards/various/11.vcf +../TestvCards/Various/12.vcf z:/testvcards/various/12.vcf +../TestvCards/Various/nulldate.vcf z:/testvcards/various/nulldate.vcf +../TestvCards/Various/HugeVCard.vcf z:/testvcards/various/HugeVCard.vcf + +// TBugfix the number of files=82 +../TestvCals/Various/6.vcs z:/testvcards/various/6.vcs +../TestFiles/CShJisEs.VCF z:/testfiles/cshjises.vcf +../TestFiles/CTabs.VCS z:/testfiles/ctabs.vcs +../TestFiles/IShJisEs.VCF z:/testfiles/ishjises.vcf +../TestFiles/ITabs.VCS z:/testfiles/itabs.vcs +../TestFiles/ITimePer.VCS z:/testfiles/itimeper.vcs +../TestFiles/iDalarm.vcs z:/testfiles/idalarm.vcs +../TestFiles/cDalarm.vcs z:/testfiles/cdalarm.vcs +../TestFiles/IAgent.VCF z:/testfiles/iagent.vcf +../TestFiles/IBase64.VCF z:/testfiles/ibase64.vcf +../TestFiles/IBase64ws.vcf z:/testfiles/ibase64ws.vcf +../TestFiles/IDalarm2.VCS z:/testfiles/idalarm2.vcs +../TestFiles/IWrap.VCS z:/testfiles/iwrap.vcs +../TestFiles/CAgent.VCF z:/testfiles/cagent.vcf +../TestFiles/CBase64.VCF z:/testfiles/cbase64.vcf +../TestFiles/CBase64ws.vcf z:/testfiles/cbase64ws.vcf +../TestFiles/CDalarm2.VCS z:/testfiles/cdalarm2.vcs +../TestFiles/CWrap.VCS z:/testfiles/cwrap.vcs +../TestFiles/Test5_ASCII_Input.vcf z:/testfiles/test5_ascii_input.vcf +../TestFiles/iAsciiLineFolding.vcf z:/testfiles/iasciilinefolding.vcf +../TestFiles/cAsciiLineFolding.vcf z:/testfiles/casciilinefolding.vcf +../TestFiles/iBase64LineFolding.vcf z:/testfiles/ibase64linefolding.vcf +../TestFiles/cBase64LineFolding.VCF z:/testfiles/cbase64linefolding.vcf +../TestFiles/cBase64NoSpaceLineFolding.vcf z:/testfiles/cbase64nospacelinefolding.vcf +../TestFiles/iQPLineFolding.vcf z:/testfiles/iqplinefolding.vcf +../TestFiles/cQPLineFolding.VCF z:/testfiles/cqplinefolding.vcf +../TestFiles/iTest7.vcf z:/testfiles/itest7.vcf +../TestFiles/iTestVcard.vcf z:/testfiles/itestvcard.vcf +../TestFiles/iTestVcal.vcs z:/testfiles/itestvcal.vcs +../TestFiles/cTestVCard.vcf z:/testfiles/ctestvcard.vcf +../TestFiles/cTestVCal.vcs z:/testfiles/ctestvcal.vcs +../TestFiles/iGroupedProperty.vcf z:/testfiles/igroupedproperty.vcf +../TestFiles/iTimeZoneN.vcs z:/testfiles/itimezonen.vcs +../TestFiles/cTimeZoneN.VCS z:/testfiles/ctimezonen.vcs +../TestFiles/iTimeZoneP.vcs z:/testfiles/itimezonep.vcs +../TestFiles/cTimeZoneP.VCS z:/testfiles/ctimezonep.vcs +../TestFiles/IGBK.VCF z:/testfiles/igbk.vcf +../TestFiles/IShiftJis.VCS z:/testfiles/ishiftjis.vcs +../TestFiles/CShiftJis.VCS z:/testfiles/cshiftjis.vcs +../TestFiles/IvCard.VCF z:/testfiles/ivcard.vcf +../TestFiles/CvCard.VCF z:/testfiles/cvcard.vcf +../TestFiles/IvCal.VCS z:/testfiles/ivcal.vcs +../TestFiles/IRDailyVCal.VCS z:/testfiles/irdailyvcal.vcs +../TestFiles/CvCal.VCS z:/testfiles/cvcal.vcs +../TestFiles/NoEnd.VCF z:/testfiles/noend.vcf +../TestFiles/HalfLine.VCF z:/testfiles/halfline.vcf +../TestFiles/Feb29.VCS z:/testfiles/feb29.vcs +../TestFiles/EnName1.VCS z:/testfiles/enname1.vcs +../TestFiles/EnName2.VCS z:/testfiles/enname2.vcs +../TestFiles/EnName3.VCF z:/testfiles/enname3.vcf +../TestFiles/EnName4.VCF z:/testfiles/enname4.vcf +../TestFiles/Begin2.VCF z:/testfiles/begin2.vcf +../TestFiles/Begin3.VCS z:/testfiles/begin3.vcs +../TestFiles/End2.VCF z:/testfiles/end2.vcf +../TestFiles/IEndBa64.VCS z:/testfiles/iendba64.vcs +../TestFiles/CEndBa64.VCS z:/testfiles/cendba64.vcs +../TestFiles/CNullPar.VCS z:/testfiles/cnullpar.vcs +../TestFiles/CTZone.VCS z:/testfiles/ctzone.vcs +../TestFiles/CTZone2.VCS z:/testfiles/ctzone2.vcs +../TestFiles/CWrap2.VCS z:/testfiles/cwrap2.vcs +../TestFiles/IESlash.VCF z:/testfiles/ieslash.vcf +../TestFiles/CESlash.VCF z:/testfiles/ceslash.vcf +../TestFiles/INullPar.VCS z:/testfiles/inullpar.vcs +../TestFiles/ITZone.VCS z:/testfiles/itzone.vcs +../TestFiles/ITZone2.VCS z:/testfiles/itzone2.vcs +../TestFiles/IWrap2.VCS z:/testfiles/iwrap2.vcs +../TestFiles/Base64.VCF z:/testfiles/base64.vcf +../TestFiles/vCard.VCF z:/testfiles/vcard.vcf +../TestFiles/IAutoD.VCF z:/testfiles/iautod.vcf +../TestFiles/IAutoD2.VCS z:/testfiles/iautod2.vcs +../TestFiles/CAutoD.VCF z:/testfiles/cautod.vcf +../TestFiles/CAutoD2.VCS z:/testfiles/cautod2.vcs +../TestFiles/IYenEsc1.VCF z:/testfiles/iyenesc1.vcf +../TestFiles/IYenEsc2.VCF z:/testfiles/iyenesc2.vcf +../TestFiles/IParamE.VCF z:/testfiles/iparame.vcf +../TestFiles/CYenEsc1.VCF z:/testfiles/cyenesc1.vcf +../TestFiles/CYenEsc2.VCF z:/testfiles/cyenesc2.vcf +../TestFiles/CParamE.VCF z:/testfiles/cparame.vcf +../TestFiles/IUK.VCS z:/testfiles/iuk.vcs +../TestFiles/INewYork.VCS z:/testfiles/inewyork.vcs +../TestFiles/IJapan.VCS z:/testfiles/ijapan.vcs +../TestFiles/CUK.VCS z:/testfiles/cuk.vcs +../TestFiles/CNewYork.VCS z:/testfiles/cnewyork.vcs +../TestFiles/CJapan.VCS z:/testfiles/cjapan.vcs +../TestFiles/IFred.VCF z:/testfiles/ifred.vcf +../TestFiles/iNonStandardAgent.vcf z:/testfiles/inonstandardagent.vcf +../TestFiles/cNonStandardAgent.vcf z:/testfiles/cnonstandardagent.vcf +../TestFiles/iRRule.vcs z:/testfiles/irrule.vcs +../TestFiles/iBlankLines.vcf z:/testfiles/iblanklines.vcf +../TestFiles/cBlankLines.VCF z:/testfiles/cblanklines.vcf +../TestFiles/iLineFeed.vcs z:/testfiles/ilinefeed.vcs +../TestFiles/cLineFeed.VCS z:/testfiles/clinefeed.vcs +../TestFiles/IJunkLine.VCS z:/testfiles/ijunkline.vcs +../TestFiles/CJunkLine.VCS z:/testfiles/cjunkline.vcs +../TestFiles/iattachment.vcs z:/testfiles/iattachment.vcs +../TestFiles/cattachment.vcs z:/testfiles/cattachment.vcs +../TestFiles/iAlarmRepeatCount.vcs z:/testfiles/ialarmrepeatcount.vcs +../TestFiles/DefaultCharSetInput.vcf z:/testfiles/defaultcharsetinput.vcf +../TestFiles/inewbase64.vcf z:/testfiles/inewbase64.vcf +../TestFiles/inewbase64.vcs z:/testfiles/inewbase64.vcs +../TestFiles/ivtrigger.vcf z:/testfiles/ivtrigger.vcf +../TestFiles/cnewbase64.VCF z:/testfiles/cnewbase64.vcf +../TestFiles/cnewbase64.VCS z:/testfiles/cnewbase64.vcs +../TestFiles/cvtrigger.VCF z:/testfiles/cvtrigger.vcf +../TestFiles/nolf.vcs z:/testfiles/nolf.vcs +../TestFiles/nestedagent.vcf z:/testfiles/nestedagent.vcf + +// TPerformance muber of files=21 +../TPerformance/iLine_short.vcf z:/tperformance/inputfile/line_short.vcf +../TPerformance/iLine_photo.vcf z:/tperformance/inputfile/line_photo.vcf +../TPerformance/iLine_long.vcf z:/tperformance/inputfile/line_long.vcf +../TPerformance/iLine_alarm.vcs z:/tperformance/inputfile/line_alarm.vcs +../TPerformance/iFileUTF8_QP.vcf z:/tperformance/inputfile/fileutf8_qp.vcf +../TPerformance/iFileUTF8_Base64.vcf z:/tperformance/inputfile/fileutf8_base64.vcf +../TPerformance/iFileShiftJIS_QP.vcf z:/tperformance/inputfile/fileshiftjis_qp.vcf +../TPerformance/iFileShiftJIS_Base64.vcf z:/tperformance/inputfile/fileshiftjis_base64.vcf +../TPerformance/iFileGBK_QP.vcf z:/tperformance/inputfile/filegbk_qp.vcf +../TPerformance/iFileGBK_Base64.vcf z:/tperformance/inputfile/filegbk_base64.vcf +../TPerformance/iFileASCII_QP.vcf z:/tperformance/inputfile/fileascii_qp.vcf +../TPerformance/iFileASCII_None.vcf z:/tperformance/inputfile/fileascii_none.vcf +../TPerformance/iFileASCII_Base64.vcf z:/tperformance/inputfile/fileascii_base64.vcf +../TPerformance/iFile05entity.vcs z:/tperformance/inputfile/file05entity.vcs +../TPerformance/iFile10entity.vcs z:/tperformance/inputfile/file10entity.vcs +../TPerformance/iFile15entity.vcs z:/tperformance/inputfile/file15entity.vcs +../TPerformance/iFile20entity.vcs z:/tperformance/inputfile/file20entity.vcs +../TPerformance/iFile25entity.vcs z:/tperformance/inputfile/file25entity.vcs +../TPerformance/iFile30entity.vcs z:/tperformance/inputfile/file30entity.vcs +../TPerformance/iFile35entity.vcs z:/tperformance/inputfile/file35entity.vcs +../TPerformance/iFile40entity.vcs z:/tperformance/inputfile/file40entity.vcs + +// Shift-JIS and other data files=34 +../TestFiles/K3Data/ITest01.VCF z:/k3data/itest01.vcf +../TestFiles/K3Data/ITest02.VCF z:/k3data/itest02.vcf +../TestFiles/K3Data/ITest03.VCS z:/k3data/itest03.vcs +../TestFiles/K3Data/ITest04.VCF z:/k3data/itest04.vcf +../TestFiles/K3Data/ITest05.VCF z:/k3data/itest05.vcf +../TestFiles/K3Data/ITest06.VCF z:/k3data/itest06.vcf +../TestFiles/K3Data/ITest07.VCF z:/k3data/itest07.vcf +../TestFiles/K3Data/ITest08.VCF z:/k3data/itest08.vcf +../TestFiles/K3Data/ITest09.VCF z:/k3data/itest09.vcf +../TestFiles/K3Data/ITest10.VCF z:/k3data/itest10.vcf +../TestFiles/K3Data/ITest11.VCF z:/k3data/itest11.vcf +../TestFiles/K3Data/STest01.VCF z:/k3data/stest01.vcf +../TestFiles/K3Data/STest02.VCF z:/k3data/stest02.vcf +../TestFiles/K3Data/STest03.VCS z:/k3data/stest03.vcs +../TestFiles/K3Data/STest04.VCF z:/k3data/stest04.vcf +../TestFiles/K3Data/STest05.VCF z:/k3data/stest05.vcf +../TestFiles/K3Data/STest06.VCF z:/k3data/stest06.vcf +../TestFiles/K3Data/STest07.VCF z:/k3data/stest07.vcf +../TestFiles/K3Data/STest08.VCF z:/k3data/stest08.vcf +../TestFiles/K3Data/STest09.VCF z:/k3data/stest09.vcf +../TestFiles/K3Data/STest10.VCF z:/k3data/stest10.vcf +../TestFiles/K3Data/STest11.VCF z:/k3data/stest11.vcf + +// Japanese SOUND vCard test files (WINSCW UDEB) +../TestvCards/VersitJapaneseVCards/amano.vcf z:/versitjapanesevcards/amano.vcf +../TestvCards/VersitJapaneseVCards/aoki.vcf z:/versitjapanesevcards/aoki.vcf +../TestvCards/VersitJapaneseVCards/barbara.vcf z:/versitjapanesevcards/barbara.vcf +../TestvCards/VersitJapaneseVCards/Digit1.vcf z:/versitjapanesevcards/digit1.vcf +../TestvCards/VersitJapaneseVCards/Digit2.vcf z:/versitjapanesevcards/digit2.vcf +../TestvCards/VersitJapaneseVCards/haga.vcf z:/versitjapanesevcards/haga.vcf +../TestvCards/VersitJapaneseVCards/kasai.vcf z:/versitjapanesevcards/kasai.vcf +../TestvCards/VersitJapaneseVCards/kitajima.vcf z:/versitjapanesevcards/kitajima.vcf +../TestvCards/VersitJapaneseVCards/Longest.vcf z:/versitjapanesevcards/longest.vcf +../TestvCards/VersitJapaneseVCards/matsui.vcf z:/versitjapanesevcards/matsui.vcf +../TestvCards/VersitJapaneseVCards/miyazaki.vcf z:/versitjapanesevcards/miyazaki.vcf +../TestvCards/VersitJapaneseVCards/nakai.vcf z:/versitjapanesevcards/nakai.vcf +../TestvCards/VersitJapaneseVCards/powell.vcf z:/versitjapanesevcards/powell.vcf +../TestvCards/VersitJapaneseVCards/prolongedsound.vcf z:/versitjapanesevcards/prolongedsound.vcf +../TestvCards/VersitJapaneseVCards/SpecialCharacter1.vcf z:/versitjapanesevcards/specialcharacter1.vcf +../TestvCards/VersitJapaneseVCards/SpecialCharacter2.vcf z:/versitjapanesevcards/specialcharacter2.vcf +../TestvCards/VersitJapaneseVCards/takashiro.vcf z:/versitjapanesevcards/takashiro.vcf +../TestvCards/VersitJapaneseVCards/escaped.vcf z:/versitjapanesevcards/escaped.vcf +../TestvCards/VersitJapaneseVCards/Multiplesounds.vcf z:/versitjapanesevcards/multiplesounds.vcf + +// PREQ1375 Unit testdata for PBAPSupport +../tsrc/UnitTest_PBAPSupport/testdata/CBase64LineFolding.vcf z:/pbapsupport/cbase64linefolding.vcf +../tsrc/UnitTest_PBAPSupport/testdata/CBinaryEncoding.vcf z:/pbapsupport/cbinaryencoding.vcf +../tsrc/UnitTest_PBAPSupport/testdata/CDisableCharset.vcf z:/pbapsupport/cdisablecharset.vcf +../tsrc/UnitTest_PBAPSupport/testdata/CEscapeBackslash.vcf z:/pbapsupport/cescapebackslash.vcf +../tsrc/UnitTest_PBAPSupport/testdata/CEscapeComma.vcf z:/pbapsupport/cescapecomma.vcf +../tsrc/UnitTest_PBAPSupport/testdata/CEscapeSemicolon.vcf z:/pbapsupport/cescapesemicolon.vcf +../tsrc/UnitTest_PBAPSupport/testdata/CLongPropertyName.vcf z:/pbapsupport/clongpropertyname.vcf +../tsrc/UnitTest_PBAPSupport/testdata/CLongPropertyParam.vcf z:/pbapsupport/clongpropertyparam.vcf +../tsrc/UnitTest_PBAPSupport/testdata/CLongPropertyValue.vcf z:/pbapsupport/clongpropertyvalue.vcf +../tsrc/UnitTest_PBAPSupport/testdata/CQPEncodingTest1.vcf z:/pbapsupport/cqpencodingtest1.vcf +../tsrc/UnitTest_PBAPSupport/testdata/CQPEncodingTest2.vcf z:/pbapsupport/cqpencodingtest2.vcf +../tsrc/UnitTest_PBAPSupport/testdata/CShortAsciiLine.vcf z:/pbapsupport/cshortasciiline.vcf +../tsrc/UnitTest_PBAPSupport/testdata/CUseUTF8.vcf z:/pbapsupport/cuseutf8.vcf +../tsrc/UnitTest_PBAPSupport/testdata/IBase64LineFolding.vcf z:/pbapsupport/ibase64linefolding.vcf + + + diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/vcardandvcal/tsrc/TJapaneseSoundProperty.mmp --- a/pimappsupport/vcardandvcal/tsrc/TJapaneseSoundProperty.mmp Mon May 03 12:30:32 2010 +0300 +++ b/pimappsupport/vcardandvcal/tsrc/TJapaneseSoundProperty.mmp Mon Jun 28 15:22:02 2010 +0530 @@ -21,7 +21,9 @@ sourcepath . userinclude . -userinclude ../inc +userinclude ../inc + +APP_LAYER_SYSTEMINCLUDE systeminclude /epoc32/include source TJapaneseSoundProperty.cpp diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/vcardandvcal/tsrc/Test_saveloadbinoom.mmp --- a/pimappsupport/vcardandvcal/tsrc/Test_saveloadbinoom.mmp Mon May 03 12:30:32 2010 +0300 +++ b/pimappsupport/vcardandvcal/tsrc/Test_saveloadbinoom.mmp Mon Jun 28 15:22:02 2010 +0530 @@ -23,6 +23,7 @@ userinclude ../tsrc userinclude ../inc +APP_LAYER_SYSTEMINCLUDE systeminclude /epoc32/include source Test_saveloadbinoom.cpp library euser.lib estor.lib efsrv.lib diff -r fd30d51f876b -r b6db4fd4947b pimappsupport/vcardandvcal/tsrc/UnitTest_PBAPSupport/group/TestExternalize.mmp --- a/pimappsupport/vcardandvcal/tsrc/UnitTest_PBAPSupport/group/TestExternalize.mmp Mon May 03 12:30:32 2010 +0300 +++ b/pimappsupport/vcardandvcal/tsrc/UnitTest_PBAPSupport/group/TestExternalize.mmp Mon Jun 28 15:22:02 2010 +0530 @@ -21,6 +21,8 @@ SOURCEPATH ../src USERINCLUDE ../inc USERINCLUDE ../../../inc + +APP_LAYER_SYSTEMINCLUDE SYSTEMINCLUDE /epoc32/include SOURCE TestExternalize.cpp diff -r fd30d51f876b -r b6db4fd4947b tsrc/group/bld.inf --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/group/bld.inf Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,21 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Includes organizer test code +* +*/ + +#include "../../organizer_plat/tsrc/group/bld.inf" +#include "../../organizer_pub/tsrc/group/bld.inf" + +// End of File. \ No newline at end of file diff -r fd30d51f876b -r b6db4fd4947b tsrc/tsrc.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tsrc/tsrc.pro Mon Jun 28 15:22:02 2010 +0530 @@ -0,0 +1,30 @@ +# +# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. +# This component and the accompanying materials are made available +# under the terms of "Eclipse Public License v1.0" +# which accompanies this distribution, and is available +# at the URL "http://www.eclipse.org/legal/epl-v10.html". +# +# Initial Contributors: +# Nokia Corporation - initial contribution. +# +# Contributors: +# +# Description: +# This is the project specification file for organizer test code. +# + +TEMPLATE = subdirs +SUBDIRS += ../agendainterface/tsrc \ + ../alarmui/tsrc \ + ../calendarui/tsrc \ + ../clock/tsrc \ + ../notes/tsrc \ + ../organizer_plat/tsrc \ + ../organizer_pub/tsrc \ + ../pimappsupport/tsrc + +CONFIG += ordered + +# End of file --Don't remove this