📄 eventxmlio.cpp
字号:
}Occurrence EventXmlIO::getNextOccurrenceInCurrentTZ( const QDateTime& from, bool * ok ) const{ if( ok ) *ok = false; bool closestOccurValid = false; Occurrence closestOccur; for( QListIterator<PrEvent> iter = m_PrEvents; iter.current(); ++iter ) { PrEvent e(*(iter.current())); bool ocok = false; QDate date = e.nextOccurrence( from.date(), &ocok ); if( ocok ) { Occurrence o(date, e); if( o.startInCurrentTZ() >= from ) { if( false == closestOccurValid || o.startInCurrentTZ() < closestOccur.startInCurrentTZ() || (o.startInCurrentTZ() == closestOccur.startInCurrentTZ() && o.event().uid().toString() < closestOccur.event().uid().toString()) ) { closestOccur = o; closestOccurValid = true; } } } } if( ok ) *ok = closestOccurValid; return closestOccur;}Occurrence EventXmlIO::getNextOccurrenceInCurrentTZ( const Occurrence& from, bool * ok ) const{ if( ok ) *ok = false; bool closestOccurValid = false; Occurrence closestOccur; for( QListIterator<PrEvent> iter = m_PrEvents; iter.current(); ++iter ) { PrEvent e(*(iter.current())); bool ocok = false; QDate date = e.nextOccurrence( from.date(), &ocok ); if( ocok ) { Occurrence o(date, e); if( o.startInCurrentTZ() == from.startInCurrentTZ() && o.event().uid().toString() <= from.event().uid().toString() ) continue; if( o.startInCurrentTZ() >= from.startInCurrentTZ() && (false == closestOccurValid || o.startInCurrentTZ() < closestOccur.startInCurrentTZ()) ) { closestOccur = o; closestOccurValid = true; } } } if( ok ) *ok = closestOccurValid; return closestOccur;}QUuid EventXmlIO::addEvent(const PimEvent &event, bool assignUid ){ QUuid u; if (accessMode() == ReadOnly) return u; // Don't add events that will never occur. if (!event.isValid()) return u; ensureDataCurrent(); PrEvent *ev = new PrEvent((const PrEvent &)event); if ( assignUid || ev->uid().isNull() ) assignNewUid(ev); u = ev->uid(); if (internalAddRecord(ev)) { needsSave = TRUE; if (ev->hasAlarm()) addEventAlarm(*ev); updateJournal(*ev, ACTION_ADD); {#ifndef QT_NO_COP QCopEnvelope e("QPE/PIM", "addedEvent(int,PimEvent)"); e << getpid(); e << *ev;#endif } } return u;}void EventXmlIO::addException(const QDate &d, const PimEvent &p){ if (accessMode() == ReadOnly) return; ensureDataCurrent(); PrEvent parent((const PrEvent &)p); parent.addException(d); // don't add empty uid to parent. parent.addChildUid(QUuid()); if (!parent.isValid()) { // apperently this is really a delete of the event. removeEvent(p); return; } if (internalUpdateRecord(new PrEvent(parent))) { needsSave = TRUE; updateJournal(parent, ACTION_REPLACE);#ifndef QT_NO_COP { QCopEnvelope e("QPE/PIM", "updatedEvent(int,PimEvent)"); e << getpid(); e << parent; }#endif }}QUuid EventXmlIO::addException(const QDate &d, const PimEvent &p, const PimEvent& event){ QUuid u; if (accessMode() == ReadOnly) return u; ensureDataCurrent(); // don't need to check is valid as can't disapear by adding an exception. PrEvent parent((const PrEvent &)p); PrEvent *ev = new PrEvent((const PrEvent &)event); assignNewUid(ev); u = ev->uid(); ev->setParentUid(parent.uid()); parent.addException(d); parent.addChildUid(ev->uid()); if (internalAddRecord(ev) && internalUpdateRecord(new PrEvent(parent))) { needsSave = TRUE; if (ev->hasAlarm()) addEventAlarm(*ev); updateJournal(*ev, ACTION_ADD); updateJournal(parent, ACTION_REPLACE);#ifndef QT_NO_COP { QCopEnvelope e("QPE/PIM", "addedEvent(int,PimEvent)"); e << getpid(); e << *ev; } { QCopEnvelope e("QPE/PIM", "updatedEvent(int,PimEvent)"); e << getpid(); e << parent; }#endif } return u;}void EventXmlIO::removeEvent(const PimEvent &event){ if (accessMode() == ReadOnly) return; ensureDataCurrent(); // in case parent becomes invalid. PimEvent parent; PrEvent *ev = new PrEvent((const PrEvent &)event); if (event.isException()) { for (m_PrEvents.first(); m_PrEvents.current(); m_PrEvents.next()) { if (m_PrEvents.current()->uid() == ev->seriesUid()) { QValueList<QDate>::ConstIterator eit = m_PrEvents.current()->exceptions().begin(); QValueList<QUuid>::ConstIterator cit = m_PrEvents.current()->childUids().begin(); QDate tdate; for(; eit != m_PrEvents.current()->exceptions().end() && cit != m_PrEvents.current()->childUids().end(); ++eit, ++cit) { if (*cit == ev->uid()) { tdate = *eit; } } m_PrEvents.current()->removeException(ev->uid()); m_PrEvents.current()->PimEvent::addException(tdate, QUuid()); if (!m_PrEvents.current()->isValid()) { parent = *(m_PrEvents.current()); } } } } for (m_PrEvents.first(); m_PrEvents.current(); m_PrEvents.next()) { if (m_PrEvents.current()->uid() == ev->uid()) { if (m_PrEvents.current()->hasAlarm()) delEventAlarm(*(m_PrEvents.current())); } } if (internalRemoveRecord(ev)) { needsSave = TRUE; updateJournal(event, ACTION_REMOVE); {#ifndef QT_NO_COP QCopEnvelope e("QPE/PIM", "removedEvent(int,PimEvent)"); e << getpid(); e << event;#endif } } if (!parent.uid().isNull()) { // parent is invalid, removeEvent(parent); }}void EventXmlIO::updateEvent(const PimEvent &event){ if (accessMode() == ReadOnly) return; ensureDataCurrent(); if (!event.isValid()) { // really a remove. removeEvent(event); return; } PrEvent *ev = new PrEvent((const PrEvent&)event); for (m_PrEvents.first(); m_PrEvents.current(); m_PrEvents.next()) { if (m_PrEvents.current()->uid() == ev->uid()) { if (m_PrEvents.current()->hasAlarm()) delEventAlarm(*(m_PrEvents.current())); } } if (internalUpdateRecord(ev)) { needsSave = TRUE; if (event.hasAlarm()) addEventAlarm((const PrEvent &)event); updateJournal(event, ACTION_REPLACE); {#ifndef QT_NO_COP QCopEnvelope e("QPE/PIM", "updatedEvent(int,PimEvent)"); e << getpid(); e << event;#endif } }}void EventXmlIO::ensureDataCurrent(bool forceReload){ if (accessMode() == WriteOnly || ( isDataCurrent() && !forceReload) ) return; // get rid of all events first QListIterator<PrEvent> it(m_PrEvents); for ( ; it.current(); ++it ) { if ( it.current()->hasAlarm() ) delEventAlarm( *(it.current()) ); } m_PrEvents.clear(); loadData();}bool EventXmlIO::nextAlarm( const PrEvent &ev, QDateTime& when, int& warn){ QDateTime now = QDateTime::currentDateTime(); bool ok; warn = ev.alarmDelay(); // -1 days to make room for timezone shift. QDate next = ev.nextOccurrence(now.date().addDays(-1), &ok); while (ok) { Occurrence o(next, ev); // only need to check in TZ... want to shift in orig time if (now <= o.startInCurrentTZ().addSecs(-60*ev.alarmDelay())) { when = o.startInCurrentTZ().addSecs(-60*ev.alarmDelay()); return TRUE; } next = ev.nextOccurrence( next.addDays(ev.start().daysTo(ev.end()) + 1), &ok); } return FALSE;}void EventXmlIO::addEventAlarm(const PrEvent &ev){#ifdef Q_WS_QWS QDateTime when; int warn; if (nextAlarm(ev, when, warn)) { AlarmServer::addAlarm(when, "QPE/Application/datebook", "alarm(QDateTime,int)", warn); }#else Q_UNUSED( ev );#endif}void EventXmlIO::delEventAlarm(const PrEvent &ev){#ifdef Q_WS_QWS QDateTime when; int warn; if ( nextAlarm(ev,when,warn) ) { AlarmServer::deleteAlarm( when, "QPE/Application/datebook", "alarm(QDateTime,int)", warn); }#else Q_UNUSED( ev );#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -