summaryrefslogtreecommitdiff
authorzecke <zecke>2003-02-21 11:35:52 (UTC)
committer zecke <zecke>2003-02-21 11:35:52 (UTC)
commit6917879c47d406b6f4ee234f84b89e17265dd0a5 (patch) (side-by-side diff)
tree8d30ebd64d302cf3e7237154dff7939f2f2aa425
parent2d77abb5ff37abf61e04657431d7e0e1f5138d94 (diff)
downloadopie-6917879c47d406b6f4ee234f84b89e17265dd0a5.zip
opie-6917879c47d406b6f4ee234f84b89e17265dd0a5.tar.gz
opie-6917879c47d406b6f4ee234f84b89e17265dd0a5.tar.bz2
make allday events all bit less fscked up...
Basicly an AllDay Event should be pinned to a day but Qtopia suffers from a problem when changing timezones an AllDay event can span two days... This patch make it at least not span two days..
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/backend/event.cpp9
1 files changed, 3 insertions, 6 deletions
diff --git a/library/backend/event.cpp b/library/backend/event.cpp
index 0003fe9..d906f19 100644
--- a/library/backend/event.cpp
+++ b/library/backend/event.cpp
@@ -233,776 +233,773 @@ Qtopia::UidGen Event::sUidGen( Qtopia::UidGen::Qtopia );
*/
/*!
\fn bool Event::repeatForever() const
Returns FALSE if there is a date set for the event to continue until.
Otherwise returns TRUE.
*/
/*!
\fn bool Event::doRepeat() const
\internal
*/
/*!
\fn bool Event::repeatOnWeekDay(int day) const
Returns TRUE if the event has a RepeatType of Weekly and is set to occur on
\a day each week. Otherwise returns FALSE.
\sa QDate::dayName()
*/
/*!
\fn void Event::setRepeatOnWeekDay(int day, bool enable)
If \a enable is TRUE then sets the event to occur on \a day each week.
Otherwise sets the event not to occur on \a day.
\warning this function is only relavent for a event with RepeatType of
Weekly.
\sa QDate::dayName()
*/
/*!
\fn int Event::frequency() const
Returns how often the event repeats.
\sa repeatType()
*/
/*!
\fn void Event::setRepeatType(RepeatType t)
Sets the repeat pattern type of the event to \a t.
\sa setFrequency()
*/
/*!
\fn void Event::setFrequency(int n)
Sets how often the event occurs with in its repeat pattern.
\sa setRepeatType()
*/
/*!
\fn void Event::setRepeatTill(const QDate &d)
Sets the event to repeat until \a d.
*/
/*!
\fn void Event::setRepeatForever(bool enable)
If \a enable is TRUE, sets the event to repeat forever. Otherwise
sets the event to stop repeating at some date.
\warning This function may affect the specific date the event will repeat
till.
*/
/*!
\fn bool Event::match(const QRegExp &r) const
Returns TRUE if the event matches the regular expression \a r.
Otherwise returns FALSE.
*/
/*!
\fn char Event::day(int)
\internal
*/
/*!
Creates a new, empty event.
*/
Event::Event() : Record()
{
startUTC = endUTC = time( 0 );
typ = Normal;
hAlarm = FALSE;
hRepeat = FALSE;
aMinutes = 0;
aSound = Silent;
pattern.type = NoRepeat;
pattern.frequency = -1;
}
/*!
\internal
*/
Event::Event( const QMap<int, QString> &map )
{
setDescription( map[DatebookDescription] );
setLocation( map[Location] );
setCategories( idsFromString( map[DatebookCategory] ) );
setTimeZone( map[TimeZone] );
setNotes( map[Note] );
setStart( TimeConversion::fromUTC( map[StartDateTime].toUInt() ) );
setEnd( TimeConversion::fromUTC( map[EndDateTime].toUInt() ) );
setType( (Event::Type) map[DatebookType].toInt() );
setAlarm( ( map[HasAlarm] == "1" ? TRUE : FALSE ), map[AlarmTime].toInt(), (Event::SoundTypeChoice)map[SoundType].toInt() );
Event::RepeatPattern p;
p.type = (Event::RepeatType) map[ RepeatPatternType ].toInt();
p.frequency = map[ RepeatPatternFrequency ].toInt();
p.position = map[ RepeatPatternPosition ].toInt();
p.days = map[ RepeatPatternDays ].toInt();
p.hasEndDate = map[ RepeatPatternHasEndDate ].toInt();
p.endDateUTC = map[ RepeatPatternEndDate ].toUInt();
setRepeat( p );
setUid( map[ DatebookUid ].toInt() );
}
/*!
Destroys an event.
*/
Event::~Event()
{
}
/*!
\internal
*/
int Event::week( const QDate& date )
{
// Calculates the week this date is in within that
// month. Equals the "row" is is in in the month view
int week = 1;
QDate tmp( date.year(), date.month(), 1 );
if ( date.dayOfWeek() < tmp.dayOfWeek() )
++week;
week += ( date.day() - 1 ) / 7;
return week;
}
/*!
\internal
*/
int Event::occurrence( const QDate& date )
{
// calculates the number of occurrances of this day of the
// week till the given date (e.g 3rd Wednesday of the month)
return ( date.day() - 1 ) / 7 + 1;
}
/*!
\internal
*/
int Event::dayOfWeek( char day )
{
int dayOfWeek = 1;
char i = Event::MON;
while ( !( i & day ) && i <= Event::SUN ) {
i <<= 1;
++dayOfWeek;
}
return dayOfWeek;
}
/*!
\internal
*/
int Event::monthDiff( const QDate& first, const QDate& second )
{
return ( second.year() - first.year() ) * 12 +
second.month() - first.month();
}
/*!
\internal
*/
QMap<int, QString> Event::toMap() const
{
QMap<int, QString> m;
if ( !description().isEmpty() )
m.insert( DatebookDescription, description() );
if ( !location().isEmpty() )
m.insert ( Location, location() );
if ( categories().count() )
m.insert ( DatebookCategory, idsToString( categories() ) );
if ( !timeZone().isEmpty() )
m.insert ( TimeZone, timeZone() );
if ( !notes().isEmpty() )
m.insert ( Note, notes() );
m.insert ( StartDateTime, QString::number( TimeConversion::toUTC( start() ) ) );
m.insert ( EndDateTime, QString::number( TimeConversion::toUTC( end() ) ) );
m.insert ( DatebookType, QString::number( (int)type() ) );
m.insert ( HasAlarm, ( hasAlarm() ? "1" : "0" ) );
m.insert ( SoundType, QString::number( (int)alarmSound() ) );
m.insert ( AlarmTime, QString::number( alarmTime() ) );
m.insert ( RepeatPatternType, QString::number( static_cast<int>( repeatPattern().type ) ) );
m.insert ( RepeatPatternFrequency, QString::number( repeatPattern().frequency ) );
m.insert ( RepeatPatternPosition, QString::number( repeatPattern().position ) );
m.insert ( RepeatPatternDays, QString::number( repeatPattern().days ) );
m.insert ( RepeatPatternHasEndDate, QString::number( static_cast<int>( repeatPattern().hasEndDate ) ) );
m.insert ( RepeatPatternEndDate, QString::number( repeatPattern().endDateUTC ) );
m.insert( DatebookUid, QString::number( uid()) );
return m;
}
/*!
\internal
*/
void Event::setRepeat( const RepeatPattern &p )
{
setRepeat( p.type != NoRepeat, p );
}
/*!
Sets the description of the event to \a s.
*/
void Event::setDescription( const QString &s )
{
descript = s;
}
/*!
Sets the location of the event to \a s.
*/
void Event::setLocation( const QString &s )
{
locat = s;
}
// void Event::setCategory( const QString &s )
// {
// categ = s;
// }
/*!
\internal
*/
void Event::setType( Type t )
{
typ = t;
}
/*!
Sets the start date and time of the first or only occurance of this event
to the date and time \a d. \a d should be in local time.
*/
void Event::setStart( const QDateTime &d )
{
startUTC = TimeConversion::toUTC( d );
}
/*!
\internal
*/
void Event::setStart( time_t time )
{
startUTC = time;
}
/*!
Sets the end date and time of the first or only occurance of this event
to the date and time \a d. \a d should be in local time.
*/
void Event::setEnd( const QDateTime &d )
{
endUTC = TimeConversion::toUTC( d );
}
/*!
\internal
*/
void Event::setEnd( time_t time )
{
endUTC = time;
}
/*!
\internal
*/
void Event::setTimeZone( const QString &z )
{
tz = z;
}
/*!
\internal
*/
void Event::setAlarm( bool b, int minutes, SoundTypeChoice s )
{
hAlarm = b;
aMinutes = minutes;
aSound = s;
}
/*!
\internal
*/
void Event::setRepeat( bool b, const RepeatPattern &p )
{
hRepeat = b;
pattern = p;
}
/*!
Sets the notes for the event to \a n.
*/
void Event::setNotes( const QString &n )
{
note = n;
}
/*!
Returns the description of the event.
*/
const QString &Event::description() const
{
return descript;
}
/*!
Returns the location of the event.
*/
const QString &Event::location() const
{
return locat;
}
// QString Event::category() const
// {
// return categ;
// }
/*!
\internal
*/
Event::Type Event::type() const
{
return typ;
}
/*
QDateTime Event::start() const {
return start( TRUE );
}
*/
/*!
\internal
*/
QDateTime Event::start( bool actual ) const
{
QDateTime dt = TimeConversion::fromUTC( startUTC );
if ( actual && typ == AllDay ) {
QTime t = dt.time();
t.setHMS( 0, 0, 0 );
dt.setTime( t );
}
return dt;
}
/*
QDateTime Event::end() const {
return end( TRUE );
}
*/
/*!
\internal
*/
QDateTime Event::end( bool actual ) const
{
- QDateTime dt = TimeConversion::fromUTC( endUTC );
-
+ /* small work around... */
if ( actual && typ == AllDay ) {
- QTime t = dt.time();
- t.setHMS( 23, 59, 59 );
- dt.setTime( t );
+ return QDateTime( TimeConversion::fromUTC( startUTC ).date(), QTime(23, 59, 59 ) );
}
- return dt;
+ return TimeConversion::fromUTC( endUTC );
}
/*!
\internal
*/
const QString &Event::timeZone() const
{
return tz;
}
/*!
\internal
*/
bool Event::hasAlarm() const
{
return hAlarm;
}
/*!
\internal
*/
int Event::alarmTime() const
{
return aMinutes;
}
/*!
Returns the sound type for the alarm of this event.
*/
Event::SoundTypeChoice Event::alarmSound() const
{
return aSound;
}
/*!
\internal
*/
bool Event::hasRepeat() const
{
return doRepeat();
}
/*!
\internal
*/
const Event::RepeatPattern &Event::repeatPattern() const
{
return pattern;
}
/*!
\internal
*/
Event::RepeatPattern &Event::repeatPattern()
{
return pattern;
}
/*!
Returns the notes for the event.
*/
const QString &Event::notes() const
{
return note;
}
/*!
\internal
*/
bool Event::operator==( const Event &e ) const
{
if ( uid() && e.uid() == uid() )
return TRUE;
return ( e.descript == descript &&
e.locat == locat &&
e.categ == categ &&
e.typ == typ &&
e.startUTC == startUTC &&
e.endUTC == endUTC &&
e.tz == tz &&
e.hAlarm == hAlarm &&
e.aMinutes == aMinutes &&
e.aSound == aSound &&
e.hRepeat == hRepeat &&
e.pattern == pattern &&
e.note == note );
}
/*!
\internal
Appends the contact information to \a buf.
*/
void Event::save( QString& buf )
{
buf += " description=\"" + Qtopia::escapeString(descript) + "\"";
if ( !locat.isEmpty() )
buf += " location=\"" + Qtopia::escapeString(locat) + "\"";
// save the categoies differently....
QString strCats = idsToString( categories() );
buf += " categories=\"" + Qtopia::escapeString(strCats) + "\"";
buf += " uid=\"" + QString::number( uid() ) + "\"";
if ( (Type)typ != Normal )
buf += " type=\"AllDay\"";
if ( hAlarm ) {
buf += " alarm=\"" + QString::number( aMinutes ) + "\" sound=\"";
if ( aSound == Event::Loud )
buf += "loud";
else
buf += "silent";
buf += "\"";
}
if ( hRepeat )
write( buf, pattern );
buf += " start=\""
+ QString::number( startUTC )
+ "\"";
buf += " end=\""
+ QString::number( endUTC )
+ "\"";
if ( !note.isEmpty() )
buf += " note=\"" + Qtopia::escapeString( note ) + "\"";
buf += customToXml();
}
/*!
\internal
*/
bool Event::RepeatPattern::operator==( const Event::RepeatPattern &right ) const
{
// *sigh*
return ( type == right.type
&& frequency == right.frequency
&& position == right.position
&& days == right.days
&& hasEndDate == right.hasEndDate
&& endDateUTC == right.endDateUTC
&& createTime == right.createTime );
}
/*!
\class EffectiveEvent
\brief The EffectiveEvent class the data for a single occurance of an event.
This class describes the event for a single occurance of it. For example if
an Event occurs every week, the effective event might represent the third
occurance of this Event.
\ingroup qtopiaemb
\ingroup qtopiadesktop
\warning This class will be phased out in Qtopia 3.x
*/
/*!
\enum EffectiveEvent::Position
\internal
*/
/*!
\fn EffectiveEvent &EffectiveEvent::operator=(const EffectiveEvent &)
\internal
*/
class EffectiveEventPrivate
{
public:
//currently the existence of the d pointer means multi-day repeating,
//msut be changed if we use the d pointer for anything else.
QDate startDate;
QDate endDate;
};
/*!
\internal
*/
EffectiveEvent::EffectiveEvent()
{
mDate = QDate::currentDate();
mStart = mEnd = QTime::currentTime();
d = 0;
}
/*!
\internal
*/
EffectiveEvent::EffectiveEvent( const Event &e, const QDate &date, Position pos )
{
mEvent = e;
mDate = date;
if ( pos & Start )
mStart = e.start( TRUE ).time();
else
mStart = QTime( 0, 0, 0 );
if ( pos & End )
mEnd = e.end( TRUE ).time();
else
mEnd = QTime( 23, 59, 59 );
d = 0;
}
/*!
\internal
*/
EffectiveEvent::~EffectiveEvent()
{
delete d;
}
/*!
\internal
*/
EffectiveEvent::EffectiveEvent( const EffectiveEvent &e )
{
d = 0;
*this = e;
}
EffectiveEvent& EffectiveEvent::operator=( const EffectiveEvent & e )
{
if ( &e == this )
return *this;
delete d;
if ( e.d ) {
d = new EffectiveEventPrivate;
d->startDate = e.d->startDate;
d->endDate = e.d->endDate;
} else {
d = 0;
}
mEvent = e.mEvent;
mDate = e.mDate;
mStart = e.mStart;
mEnd = e.mEnd;
return *this;
}
// QString EffectiveEvent::category() const
// {
// return mEvent.category();
// }
/*!
Returns the description of the event for this effective event.
*/
const QString &EffectiveEvent::description( ) const
{
return mEvent.description();
}
/*!
\internal
*/
const QString &EffectiveEvent::location( ) const
{
return mEvent.location();
}
/*!
\internal
*/
const QString &EffectiveEvent::notes() const
{
return mEvent.notes();
}
/*!
Returns the event associated with this effective event.
*/
const Event &EffectiveEvent::event() const
{
return mEvent;
}
/*!
\internal
*/
const QTime &EffectiveEvent::end() const
{
return mEnd;
}
/*!
\internal
*/
const QTime &EffectiveEvent::start() const
{
return mStart;
}
/*!
Returns the date the effective event occurs on.
*/
const QDate &EffectiveEvent::date() const
{
return mDate;
}
/*!
\internal
*/
int EffectiveEvent::length() const
{
return (mEnd.hour() * 60 - mStart.hour() * 60)
+ QABS(mStart.minute() - mEnd.minute() );
}
/*!
\internal
*/
void EffectiveEvent::setDate( const QDate &dt )
{
mDate = dt;
}
/*!
\internal
*/
void EffectiveEvent::setStart( const QTime &start )
{
mStart = start;
}
/*!
\internal
*/
void EffectiveEvent::setEnd( const QTime &end )
{
mEnd = end;
}
/*!
\internal
*/
void EffectiveEvent::setEvent( Event e )
{
mEvent = e;
}
/*!
\internal
*/
bool EffectiveEvent::operator<( const EffectiveEvent &e ) const
{
if ( mDate < e.date() )
return TRUE;
if ( mDate == e.date() )
return ( mStart < e.start() );
else
return FALSE;
}
/*!
\internal
*/
bool EffectiveEvent::operator<=( const EffectiveEvent &e ) const
{
return (mDate <= e.date() );
}
/*!
\internal
*/
bool EffectiveEvent::operator==( const EffectiveEvent &e ) const
{
return ( mDate == e.date()
&& mStart == e.start()
&& mEnd == e.end()
&& mEvent == e.event() );
}
/*!
\internal
*/
bool EffectiveEvent::operator!=( const EffectiveEvent &e ) const
{
return !(*this == e);
}
/*!