Beispiel #1
0
    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))
Beispiel #2
0
    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')
Beispiel #5
0
    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 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)
Beispiel #7
0
    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')
Beispiel #8
0
 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()
Beispiel #12
0
    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()
Beispiel #13
0
 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)
Beispiel #14
0
    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