1from Foundation import *
2
3# enum ToDoItemStatus
4INCOMPLETE=0
5COMPLETE=1
6DEFER_TO_NEXT_DAY=2
7
8SECS_IN_MINUTE=60
9SECS_IN_HOUR=SECS_IN_MINUTE*60
10SECS_IN_DAY=SECS_IN_HOUR*24
11SECS_IN_WEEK=SECS_IN_DAY*7
12
13class ToDoItem (NSObject):
14    __slots__ = (
15        '_day',
16        '_itemName',
17        '_notes',
18        '_timer',
19        '_secsUntilDue',
20        '_secsUntilNotify',
21        '_status',
22    )
23
24    def init(self):
25        self = NSObject.init(self)
26        if not self:
27            return None
28
29        self._day = None
30        self._itemName = None
31        self._notes = None
32        self._secsUntilDue = 0
33        self._secsUntilNotify = 0
34        self._status = None
35        self._timer = None
36
37    def description(self):
38        descr = """%s
39\tName: %s
40\tNotes: %s
41\tCompleted: %s
42\tSecs Until Due: %d
43\tSecs Until Notify: %d
44"""%(
45            super.description(),
46            self.itemName(),
47            self._day,
48            self._notes,
49            ['No', 'YES'][self.status() == COMPLETE],
50            self._secsUntilDue,
51            self._secsUntilNotify)
52        return descr
53
54    def initWithName_andDate_(self, aName, aDate):
55        self = NSObject.init(self)
56        if not self:
57            return None
58
59        self._day = None
60        self._itemName = None
61        self._notes = None
62        self._secsUntilDue = 0
63        self._secsUntilNotify = 0
64        self._status = None
65        self._timer = None
66
67        if not aName:
68            return None
69
70        self.setItemName_(aName)
71
72        if aDate:
73            self.setDay_(aDate)
74        else:
75            now = NSCalendarDate.date()
76
77            self.setDay_(
78                NSCalendarDate.dateWithYear_month_day_hour_minute_second_timeZone_(
79                now.yearOfCommonEra(), now.monthOfYear(), now.dayOfMonth(), 0, 0, 0,
80                NSTimeZone.localTimeZone()))
81        self.setStatus_(INCOMPLETE)
82        self.setNotes_("")
83        return self
84
85    def encodeWithCoder_(self, coder):
86
87        coder.encodeObject_(self._day)
88        coder.encodeObject_(self._itemName)
89        coder.encodeObject_(self._notes)
90
91        tempTime = self._secsUntilDue
92        coder.encodeValueOfObjCType_at_(objc._C_LNG, tempTime)
93
94        tempTime = self._secsUntilNotify
95        coder.encodeValueOfObjCType_at_(objc._C_LNG, tempTime)
96
97        tempStatus = self._status
98        coder.encodeValueOfObjCType_at_(objc._C_INT, tempStatus)
99
100    def initWithCoder_(self, coder):
101
102        self.setDay_(coder.decodeObject())
103        self.setItemName_(coder.decodeObject())
104        self.setNotes_(coder.decodeObject())
105
106        tempTime = coder.decodeObjectOfObjCType_at_(objc._C_LNG)
107        self.setSecsUntilDue_(tempTime)
108
109        tempTime = coder.decodeObjectOfObjCType_at_(objc._C_LNG)
110        self.setSecsUntilNotify_(tempTime)
111
112        tempStatus = coder.decodeObjectOfObjCType_at_(objc._C_INT)
113        self.setSecsUntilNotify_(tempStatus)
114
115        return self
116
117    def __del__(self): # dealloc
118        if self._notes:
119            self._timer.invalidate()
120
121    def setDay_(self, newDay):
122        self._day = newDay
123
124    def day(self):
125        return self._day
126
127    def setItemName_(self, newName):
128        self._itemName = newName
129
130    def itemName(self):
131        return self._itemName
132
133    def setNotes_(self, newNotes):
134        self._notes = newNotes
135
136    def notes(self):
137        return self._notes
138
139    def setTimer_(self, newTimer):
140        if self._timer:
141            self._timer.invalidate()
142
143        if newTimer:
144            self._timer = newTimer
145        else:
146            self._timer = None
147
148    def timer(self):
149        return self._timer
150
151    def setStatus_(self, newStatus):
152        self._status = newStatus
153
154    def status(self):
155        return self._status
156
157    def setSecsUntilDue_(self, secs):
158        self._secsUntilDue = secs
159
160    def secsUntilDue(self):
161        return self._secsUntilDue
162
163
164    def setSecsUntilNotify_(self, secs):
165        self._secsUntilNotify = secs
166
167    def secsUntilNotify(self):
168        return self._secsUntilNotify
169
170
171def ConvertTimeToSeconds(hour, minute, pm):
172    if hour == 12:
173        hour = 0
174
175    if pm:
176        hour += 12
177
178    return (hour * SECS_IN_HOUR) + (minute * SECS_IN_MINUTE)
179
180def ConvertSecondsToTime(secs):
181    pm = 0
182
183    hour = secs / SECS_IN_HOUR
184    if hour > 11:
185        hour -= 12
186        pm = 1
187
188    if hour == 0:
189        hour = 12
190
191    minute = (secs % SECS_IN_HOUR) / SECS_IN_MINUTE
192
193    return (hour, minute, pm)
194