1from Cocoa import *
2
3NOT_DONE=0
4DONE=1
5DEFERRED=2
6
7class ToDoCell (NSButtonCell):
8
9    __slots__ = ('_triState', '_doneImage', '_deferredImage', '_timeDue' )
10
11    def init(self):
12        self._triState = NOT_DONE
13        self._timeDue = None
14        self._doneImage = None
15        self._deferredImage = None
16
17        NSButtonCell.initTextCell_(self, "")
18
19        self.setType_(NSToggleButton)
20        self.setImagePosition_(NSImageLeft)
21        self.setBezelStyle_(NSShadowlessSquareBezelStyle)
22        self.setFont_(NSFont.userFontOfSize_(10))
23        self.setAlignment_(NSRightTextAlignment)
24
25        self._doneImage = NSImage.imageNamed_("DoneMark")
26        self._deferredImage = NSImage.imageNamed_("DeferredMark")
27        return self
28
29    @objc.typedAccessor('i')
30    def setTriState_(self, newState):
31        if newState > DEFERRED:
32            self._triState = NOT_DONE
33        else:
34            self._triState = newState
35
36        self.updateImage()
37
38    @objc.typedAccessor('i')
39    def triState(self):
40        return self._triState
41
42
43    def setState_(self, val):
44        pass
45
46    def state(self):
47        if self._triState == DEFERRED:
48            return DONE
49        else:
50            return self._triState
51
52    def updateImage(self):
53
54        if self._triState == NOT_DONE:
55            #print "NO IMAGE"
56            self.setImage_(None)
57        elif self._triState == DONE:
58            #print "DONE IMAGE"
59            self.setImage_(self._doneImage)
60        elif self._triState == DEFERRED:
61            #print "DEFERRED IMAGE"
62            self.setImage_(self._deferredImage)
63
64        self.controlView().updateCell_(self)
65
66    def startTrackingAt_inView_(self, startPoint, controlView):
67        #print "startTracking:", startPoint, controlView
68        return 1
69
70    def stopTracking_at_inView_mouseIsUp_(self, lastPoint, stopPoint, controlView, flag):
71        #print "stopTracking:", lastPoint, stopPoint, controlView, flag, self.triState()
72        if flag:
73            self.setTriState_(self.triState() + 1)
74
75    def setTimeDue_(self, newTime):
76        if newTime:
77            self._timeDue = newTime
78            self.setTitle_(self._timeDue.descriptionWithCalendarFormat_timeZone_locale_("%I:%M %p", NSTimeZone.localTimeZone(), None))
79        else:
80            self._timeDue = None
81            self.setTitle_("-->")
82
83    def timeDue(self):
84        return self._timeDue
85