def testUnstampEvent_ALL(self): self.event.rruleset = self.rruleset third = self.event.getFirstOccurrence().getNextOccurrence().getNextOccurrence() pim.CHANGE_ALL(third).remove() self.failUnless(pim.isDead(third.itsItem)) self.failIf(pim.isDead(self.event.itsItem)) self.failIf(pim.has_stamp(self.event, pim.EventStamp))
def testChangeRecurrence_ALL(self): self.event.rruleset = self.rruleset third = self.event.getFirstOccurrence().getNextOccurrence().getNextOccurrence() pim.CHANGE_ALL(third).rruleset = self.makeRuleset('weekly') self.failUnless(pim.isDead(third.itsItem)) self.failIf(pim.isDead(self.event.itsItem)) self.failUnlessEqual(self.event.rruleset.rrules.first().freq, 'weekly')
def testUnstampEvent_ALL(self): self.event.rruleset = self.rruleset third = self.event.getFirstOccurrence().getNextOccurrence( ).getNextOccurrence() pim.CHANGE_ALL(third).remove() self.failUnless(pim.isDead(third.itsItem)) self.failIf(pim.isDead(self.event.itsItem)) self.failIf(pim.has_stamp(self.event, pim.EventStamp))
def testChangeRecurrence_ALL(self): self.event.rruleset = self.rruleset third = self.event.getFirstOccurrence().getNextOccurrence( ).getNextOccurrence() pim.CHANGE_ALL(third).rruleset = self.makeRuleset('weekly') self.failUnless(pim.isDead(third.itsItem)) self.failIf(pim.isDead(self.event.itsItem)) self.failUnlessEqual(self.event.rruleset.rrules.first().freq, 'weekly')
def testDeleteRecurrence_ALL(self): self.event.rruleset = self.rruleset first = self.event.getFirstOccurrence() third = first.getNextOccurrence().getNextOccurrence() del pim.CHANGE_ALL(third).rruleset self.failUnless(pim.isDead(first.itsItem)) self.failUnless(pim.isDead(third.itsItem)) self.failIf(pim.isDead(self.event.itsItem)) self.failUnless(self.event.rruleset is None)
def testChangeRecurrence_FUTURE(self): self.event.rruleset = self.rruleset third = self.event.getFirstOccurrence().getNextOccurrence().getNextOccurrence() pim.CHANGE_FUTURE(third).rruleset = self.makeRuleset('weekly') self.failIfEqual(third.getMaster(), self.event.getMaster()) self.failIf(pim.isDead(self.event.itsItem)) self.failIf(pim.isDead(third.itsItem)) self.failUnlessEqual(third, third.getMaster().getFirstOccurrence()) self.failUnlessEqual(self.event.rruleset.rrules.first().freq, 'daily') self.failUnlessEqual(third.rruleset.rrules.first().freq, 'weekly')
def getListItems(self, selectedOnly): """ Provide iteration over ListCtrl items """ listCtrl = self.reminderControls['list'] # Note: because our caller may be updating the list, we don't act # like a generator; return the whole list at once. results = [] for index in range(listCtrl.GetItemCount()): if not selectedOnly or listCtrl.GetItemState(index, wx.LIST_STATE_SELECTED): entryTuple = self.remindersInList[index] if (not pim.isDead(entryTuple[1]) and not pim.isDead(entryTuple[2])): results.append(entryTuple) return results
def testChangeRecurrence_FUTURE(self): self.event.rruleset = self.rruleset third = self.event.getFirstOccurrence().getNextOccurrence( ).getNextOccurrence() pim.CHANGE_FUTURE(third).rruleset = self.makeRuleset('weekly') self.failIfEqual(third.getMaster(), self.event.getMaster()) self.failIf(pim.isDead(self.event.itsItem)) self.failIf(pim.isDead(third.itsItem)) self.failUnlessEqual(third, third.getMaster().getFirstOccurrence()) self.failUnlessEqual(self.event.rruleset.rrules.first().freq, 'daily') self.failUnlessEqual(third.rruleset.rrules.first().freq, 'weekly')
def getListItems(self, selectedOnly): """ Provide iteration over ListCtrl items """ listCtrl = self.reminderControls['list'] # Note: because our caller may be updating the list, we don't act # like a generator; return the whole list at once. results = [] for index in range(listCtrl.GetItemCount()): if not selectedOnly or listCtrl.GetItemState( index, wx.LIST_STATE_SELECTED): entryTuple = self.remindersInList[index] if (not pim.isDead(entryTuple[1]) and not pim.isDead(entryTuple[2])): results.append(entryTuple) return results
def setFreeBusy(self): if self._recalcCount == 0: zerotime = time(tzinfo=self.blockItem.itsView.tzinfo.default) start = self.GetStartDate() start = datetime.combine(start, zerotime) # ugh, why can't timedelta just support months? end = minical.MonthDelta(start, 3) end = datetime.combine(end, zerotime) if self.HasPendingEventChanges(): addedItems, removedItems, changedItems = \ self.GetPendingChanges(False) if len(removedItems) + len(changedItems) > 0: self._recalcCount += 1 self._eventsToAdd.clear() else: for item in addedItems: if not isDead(item): if (not has_stamp(item, EventStamp)): continue event = Calendar.EventStamp(item) if event.rruleset is not None: # new recurring events should self._recalcCount += 1 self._eventsToAdd.clear() break elif (event.isBetween(start, end) and event.transparency == 'confirmed'): self._eventsToAdd.add(event) else: self._eventsToAdd.clear() if self._eventsToAdd: self._recalcCount += 1 if self._recalcCount or self._eventsToAdd: self.Refresh()
def setFreeBusy(self): if self._recalcCount == 0: zerotime = time(tzinfo=self.blockItem.itsView.tzinfo.default) start = self.GetStartDate() start = datetime.combine(start, zerotime) # ugh, why can't timedelta just support months? end = minical.MonthDelta(start, 3) end = datetime.combine(end, zerotime) if self.HasPendingEventChanges(): addedItems, removedItems, changedItems = self.GetPendingChanges(False) if len(removedItems) + len(changedItems) > 0: self._recalcCount += 1 self._eventsToAdd.clear() else: for item in addedItems: if not isDead(item): if not has_stamp(item, EventStamp): continue event = Calendar.EventStamp(item) if event.rruleset is not None: # new recurring events should self._recalcCount += 1 self._eventsToAdd.clear() break elif event.isBetween(start, end) and event.transparency == "confirmed": self._eventsToAdd.add(event) else: self._eventsToAdd.clear() if self._eventsToAdd: self._recalcCount += 1 if self._recalcCount or self._eventsToAdd: self.Refresh()
def bad(stamp_or_item): # reject items if they're dead OR if they've lost their EventStamp item = getattr(stamp_or_item, "itsItem", stamp_or_item) return isDead(item) or not has_stamp(item, EventStamp)
def Draw(self, dc): """ Draw all the items, based on what's in self.visibleEvents @return the height of all the text drawn """ view = self.blockItem.itsView # Set up drawing & clipping unselectedColor = styles.cfg.get("preview", "UnSelectedText") unselectedBackground = styles.cfg.get("preview", "UnSelectedTextBackground") dc.Clear() brush = wx.Brush(unselectedBackground, wx.SOLID) dc.SetBackground(brush) dc.SetBrush(brush) dc.SetPen(wx.Pen(unselectedBackground)) dc.DrawRectangle(*iter(self.GetRect())) dc.SetTextBackground(unselectedBackground) dc.SetTextForeground(unselectedColor) r = self.GetRect() dc.SetClippingRegion(self.hMargin, self.vMargin, r.width - (2 * self.hMargin), r.height - (2 * self.vMargin)) if self.labelPosition == -1: # First time - do a little measuring # Each line is going to be: # (hMargin)(12:00 AM)(midMargin)(Event name) # and we'll draw the time aligned with the colon. # If the locale doesn't use AM/PM, it won't show; so, format a # generic time and see how it looks: genericTime = pim.shortTimeFormat.format(view, datetime(2005, 1, 1, 12, 00)) self.genericTime = genericTime self.timeSeparator = ":" for c in genericTime: # @@@ This might need work # [i18n]: The list of time separators may need to # be expanded as more localizations of # Chandler are performed. if c in (u":."): # Which time separator actually got used? self.timeSeparator = c break self.preSep = genericTime[: genericTime.find(self.timeSeparator)] dc.SetFont(self.timeFont) self.colonPosition = dc.GetTextExtent(self.preSep)[0] + self.hMargin self.labelPosition = dc.GetTextExtent(self.genericTime)[0] + self.hMargin + self.midMargin self.timeFontHeight = Styles.getMeasurements(self.timeFont).height self.eventFontHeight = Styles.getMeasurements(self.eventFont).height self.lineHeight = max(self.timeFontHeight, self.eventFontHeight) self.timeFontOffset = self.lineHeight - self.timeFontHeight self.eventFontOffset = self.lineHeight - self.eventFontHeight y = self.vMargin # Draw title if appropriate times = [] timesCoords = [] if self.useToday and self.visibleEvents: times.append(_(u"Today's events")) timesCoords.append((self.hMargin, y)) y += self.lineHeight # Draw each event previewPrefs = schema.ns("osaf.framework.blocks.calendar", view).previewPrefs events = [] eventsCoords = [] for i, event in enumerate(self.visibleEvents): if isDead(event.itsItem): # This is to fix bug 4322, after removing recurrence, # OnPaint gets called before wxSynchronizeWidget, so # self.visibleEvents has deleted items in it. continue if not self.maximized and i == previewPrefs.maximumEventsDisplayed - 1 and len(self.visibleEvents) - i > 1: break if not (event.allDay or event.anyTime): # Draw the time formattedTime = pim.shortTimeFormat.format(view, event.startTime) preSep = formattedTime[: formattedTime.find(self.timeSeparator)] prePos = self.colonPosition - dc.GetTextExtent(preSep)[0] times.append(formattedTime) timesCoords.append((prePos, y + self.timeFontOffset)) # Draw the event text to the right of the time. x = self.labelPosition else: # Draw allDay/anyTime events at the left margin x = self.hMargin # Draw the event text. It'll be clipped automatically because we # set a clipregion above. events.append(event.summary) eventsCoords.append((x, y + self.eventFontOffset)) y += self.lineHeight # bug 9021, hard-coded max preview items to avoid taking over # the whole sidebar if i >= MAX_PREVIEW_ITEMS: break # Actual drawing here... if times: dc.SetFont(self.timeFont) dc.DrawTextList(times, timesCoords) if events: dc.SetFont(self.eventFont) dc.DrawTextList(events, eventsCoords) if len(self.visibleEvents) > previewPrefs.maximumEventsDisplayed: if self.maximized: expandText = _(u"- minimize") else: # this is the number of events that are not displayed # in the preview pane because there wasn't enough room numEventsLeft = len(self.visibleEvents) - (previewPrefs.maximumEventsDisplayed - 1) expandText = _(u"+ %(numberOfEvents)d more...") % {"numberOfEvents": numEventsLeft} dc.SetFont(self.linkFont) dc.DrawText(expandText, self.hMargin, y + self.eventFontOffset) y += self.lineHeight dc.DestroyClippingRegion() return y - self.vMargin
def bad(stamp_or_item): # reject items if they're dead OR if they've lost their EventStamp item = getattr(stamp_or_item, 'itsItem', stamp_or_item) return isDead(item) or not has_stamp(item, EventStamp)
def Draw(self, dc): """ Draw all the items, based on what's in self.visibleEvents @return the height of all the text drawn """ view = self.blockItem.itsView # Set up drawing & clipping unselectedColor = styles.cfg.get('preview', 'UnSelectedText') unselectedBackground = styles.cfg.get('preview', 'UnSelectedTextBackground') dc.Clear() brush = wx.Brush(unselectedBackground, wx.SOLID) dc.SetBackground(brush) dc.SetBrush(brush) dc.SetPen(wx.Pen(unselectedBackground)) dc.DrawRectangle(*iter(self.GetRect())) dc.SetTextBackground(unselectedBackground) dc.SetTextForeground(unselectedColor) r = self.GetRect() dc.SetClippingRegion(self.hMargin, self.vMargin, r.width - (2 * self.hMargin), r.height - (2 * self.vMargin)) if self.labelPosition == -1: # First time - do a little measuring # Each line is going to be: # (hMargin)(12:00 AM)(midMargin)(Event name) # and we'll draw the time aligned with the colon. # If the locale doesn't use AM/PM, it won't show; so, format a # generic time and see how it looks: genericTime = pim.shortTimeFormat.format( view, datetime(2005, 1, 1, 12, 00)) self.genericTime = genericTime self.timeSeparator = ':' for c in genericTime: # @@@ This might need work # [i18n]: The list of time separators may need to # be expanded as more localizations of # Chandler are performed. if c in (u':.'): # Which time separator actually got used? self.timeSeparator = c break self.preSep = genericTime[:genericTime.find(self.timeSeparator)] dc.SetFont(self.timeFont) self.colonPosition = dc.GetTextExtent(self.preSep)[0] + self.hMargin self.labelPosition = dc.GetTextExtent(self.genericTime)[0] \ + self.hMargin + self.midMargin self.timeFontHeight = Styles.getMeasurements(self.timeFont).height self.eventFontHeight = Styles.getMeasurements(self.eventFont).height self.lineHeight = max(self.timeFontHeight, self.eventFontHeight) self.timeFontOffset = (self.lineHeight - self.timeFontHeight) self.eventFontOffset = (self.lineHeight - self.eventFontHeight) y = self.vMargin # Draw title if appropriate times = [] timesCoords = [] if self.useToday and self.visibleEvents: times.append(_(u"Today's events")) timesCoords.append((self.hMargin, y)) y += self.lineHeight # Draw each event previewPrefs = schema.ns("osaf.framework.blocks.calendar", view).previewPrefs events = [] eventsCoords = [] for i, event in enumerate(self.visibleEvents): if isDead(event.itsItem): # This is to fix bug 4322, after removing recurrence, # OnPaint gets called before wxSynchronizeWidget, so # self.visibleEvents has deleted items in it. continue if (not self.maximized and i == previewPrefs.maximumEventsDisplayed - 1 and len(self.visibleEvents) - i > 1): break if not (event.allDay or event.anyTime): # Draw the time formattedTime = pim.shortTimeFormat.format( view, event.startTime) preSep = formattedTime[:formattedTime.find(self.timeSeparator)] prePos = self.colonPosition - dc.GetTextExtent(preSep)[0] times.append(formattedTime) timesCoords.append((prePos, y + self.timeFontOffset)) # Draw the event text to the right of the time. x = self.labelPosition else: # Draw allDay/anyTime events at the left margin x = self.hMargin # Draw the event text. It'll be clipped automatically because we # set a clipregion above. events.append(event.summary) eventsCoords.append((x, y + self.eventFontOffset)) y += self.lineHeight # bug 9021, hard-coded max preview items to avoid taking over # the whole sidebar if i >= MAX_PREVIEW_ITEMS: break # Actual drawing here... if times: dc.SetFont(self.timeFont) dc.DrawTextList(times, timesCoords) if events: dc.SetFont(self.eventFont) dc.DrawTextList(events, eventsCoords) if len(self.visibleEvents) > previewPrefs.maximumEventsDisplayed: if self.maximized: expandText = _(u"- minimize") else: # this is the number of events that are not displayed # in the preview pane because there wasn't enough room numEventsLeft = (len(self.visibleEvents) - (previewPrefs.maximumEventsDisplayed - 1)) expandText = _(u"+ %(numberOfEvents)d more...") % \ {'numberOfEvents': numEventsLeft} dc.SetFont(self.linkFont) dc.DrawText(expandText, self.hMargin, y + self.eventFontOffset) y += self.lineHeight dc.DestroyClippingRegion() return y - self.vMargin