root/tags/dabo-0.3.1/dEvents.py

Revision 795, 10.5 kB (checked in by paul, 4 years ago)

Fixed bug in Log Events

  • Property svn:eol-style set to native
Line 
1 import time
2 import dabo
3 from dabo.common import dObject
4 import dabo.ui as ui
5 import dabo.biz.dBizobj as dBizobj
6
7 class Event(dObject):
8     """ Base class for Dabo events.
9     
10     Event objects are instantiated in self.raiseEvent(), and passed to all
11     callbacks registered with self.bindEvent().
12     
13     User code can define custom events by simply subclassing Event and then
14     using self.bindEvent() and self.raiseEvent() in your objects.
15     """     
16     def __init__(self, eventObject, uiEvent=None, *args, **kwargs):
17         # Event objects get instantiated with every single event, so try
18         # to keep code to a minimum here.
19        
20         # There isn't any superclass init code, so don't run it
21         #super(Event, self).__init__()
22        
23         self._eventObject = eventObject
24         self._uiEvent = uiEvent
25         self._args = args
26         self._kwargs = kwargs
27         self._continue = True
28        
29         self._baseClass = Event
30        
31         self._insertEventData()
32        
33         if dabo.eventLogging:
34             self._logEvent()
35        
36    
37     def appliesToClass(eventClass, objectClass):
38         """ Returns True if this event can be raised by the passed class.
39         
40         Stub: subclass events need to override with appropriate logic.
41         """
42         return False
43     appliesToClass = classmethod(appliesToClass)
44            
45        
46     def stop(self):
47         """Stop the event from being handled by other handlers.
48         
49         This is an alternative to setting the Continue property to False.
50         """
51         self.Continue = False
52        
53        
54     def _insertEventData(self):
55         """ Place ui-specific stuff into the ui-agnostic EventData dictionary.
56         """
57         eventData = {}     
58         nativeEvent = self._uiEvent
59         kwargs = self._kwargs
60        
61         eventData["timestamp"] = time.localtime()
62
63         # Add any keyword args passed:
64         for key in kwargs.keys():
65             eventData[key] = kwargs[key]
66
67         # Add native event data:
68         if nativeEvent is not None:
69             # Each UI lib should implement getEventData()
70             uiEventData = dabo.ui.getEventData(nativeEvent)
71            
72             for key in uiEventData.keys():
73                 eventData[key] = uiEventData[key]
74                
75         self._eventData = eventData             
76                
77            
78     def _logEvent(self):
79         """ Log the event if the event object's LogEvents property is set.
80         """
81         eventName = self.__class__.__name__
82        
83         try:
84             logEvents = self._eventObject._getLogEvents()
85         except AttributeError:
86             logEvents = []
87         noLogEvents = []
88        
89         if len(logEvents) > 0 and logEvents[0].lower() == "all":
90             # If there are any events listed explicitly, those must not be
91             # logged.
92             noLogEvents = logEvents[1:]
93
94         if eventName not in noLogEvents:       
95             for logEventName in logEvents:
96                 if logEventName.lower() == "all" or logEventName == eventName:
97                     dabo.infoLog.write("dEvent Fired: %s %s" % (self._eventObject.getAbsoluteName(),
98                         self.__class__.__name__,))
99                     break
100
101     def __getattr__(self, att):
102         return getattr(self._uiEvent, att)
103
104     def _getContinue(self):
105         return self._continue
106        
107     def _setContinue(self, val):
108         self._continue = bool(val)
109        
110     def _getEventObject(self):
111         return self._eventObject
112        
113     def _setEventObject(self, obj):
114         self._eventObject = obj
115    
116     def _getEventData(self):
117         return self._eventData
118        
119     def _setEventData(self, dict):
120         self._eventData = dict
121    
122     Continue = property(_getContinue, _setContinue, None,
123         "Specifies whether the event is allowed to continue on to the next handler.")
124        
125     EventObject = property(_getEventObject, _setEventObject, None,
126         "References the object that emitted the event.")
127        
128     EventData = property(_getEventData, _setEventData, None,
129         "Dictionary of data name/value pairs associated with the event.")
130        
131
132 class DataEvent(Event):
133     def appliesToClass(eventClass, objectClass):
134         return issubclass(objectClass, dabo.biz.dBizobj)
135     appliesToClass = classmethod(appliesToClass)
136            
137 class KeyEvent(Event):
138     def appliesToClass(eventClass, objectClass):
139         return issubclass(objectClass, dabo.ui.dPemMixin)
140     appliesToClass = classmethod(appliesToClass)
141    
142 class MenuEvent(Event):
143     def appliesToClass(eventClass, objectClass):
144         return issubclass(objectClass, (dabo.ui.dMenu, dabo.ui.dMenuItem,
145                                         dabo.ui.dMenuBar))
146     appliesToClass = classmethod(appliesToClass)
147    
148 class MouseEvent(Event):
149     def appliesToClass(eventClass, objectClass):
150         return issubclass(objectClass, dabo.ui.dPemMixin)
151     appliesToClass = classmethod(appliesToClass)
152    
153 class SashEvent(Event):
154     def appliesToClass(eventClass, objectClass):
155         return issubclass(objectClass, dabo.ui.dSplitter)
156     appliesToClass = classmethod(appliesToClass)
157
158    
159 class Activate(Event):
160     """Occurs when the form or application becomes active."""
161     def appliesToClass(eventClass, objectClass):
162         return issubclass(objectClass, (dabo.dApp, dabo.ui.dForm, dabo.ui.dFormMain, dabo.ui.dDialog))
163     appliesToClass = classmethod(appliesToClass)
164    
165 class Close(Event):
166     """Occurs when the user closes the form."""
167     def appliesToClass(eventClass, objectClass):
168         return issubclass(objectClass, (dabo.ui.dForm, dabo.ui.dFormMain, dabo.ui.dDialog))
169     appliesToClass = classmethod(appliesToClass)
170    
171 class Create(Event):
172     """Occurs after the control or form is created."""
173     def appliesToClass(eventClass, objectClass):
174         return issubclass(objectClass, dabo.ui.dPemMixin)
175     appliesToClass = classmethod(appliesToClass)
176    
177 class Deactivate(Event):
178     """Occurs when another form becomes active."""
179     def appliesToClass(eventClass, objectClass):
180         return issubclass(objectClass, (dabo.dApp, dabo.ui.dForm, dabo.ui.dFormMain, dabo.ui.dDialog))
181     appliesToClass = classmethod(appliesToClass)
182    
183 class Destroy(Event):
184     """Occurs when the control or form is destroyed."""
185     def appliesToClass(eventClass, objectClass):
186         return issubclass(objectClass, dabo.ui.dPemMixin)
187     appliesToClass = classmethod(appliesToClass)
188    
189 class Hit(Event):
190     """Occurs with the control's default event (button click, listbox pick, checkbox, etc.)"""
191     def appliesToClass(eventClass, objectClass):
192         return issubclass(objectClass, (ui.dBitmapButton, ui.dButton, ui.dCheckBox,
193             ui.dDropdownList, ui.dEditBox, ui.dListBox,
194             ui.dRadioGroup, ui.dSlider, ui.dSpinner, ui.dTextBox,
195             ui.dTimer, ui.dToggleButton, ui.dMenuItem))
196     appliesToClass = classmethod(appliesToClass)
197    
198 class Idle(Event):
199     """Occurs when the event loop has no active events to process.
200     
201     This is a good place to put redraw or other such UI-intensive code, so that it
202     will only run when the application is otherwise not busy doing other (more
203     important) things.
204     """
205     def appliesToClass(eventClass, objectClass):
206         return issubclass(objectClass, dabo.ui.dPemMixin)
207     appliesToClass = classmethod(appliesToClass)
208    
209 class ItemPicked(Event):
210     """Occurs when an item was picked from a picklist."""
211     def appliesToClass(eventClass, objectClass):
212         return issubclass(objectClass, (dabo.ui.dDataNavForm, dabo.ui.dFormDataNav))
213     appliesToClass = classmethod(appliesToClass)
214    
215 class GotFocus(Event):
216     """Occurs when the control gets the focus."""
217     def appliesToClass(eventClass, objectClass):
218         return issubclass(objectClass, dabo.ui.dPemMixin)
219     appliesToClass = classmethod(appliesToClass)
220
221    
222 class KeyChar(KeyEvent):
223     """Occurs when a key is depressed and released on the focused control or form."""
224     pass
225    
226 class KeyDown(KeyEvent):
227     """Occurs when any key is depressed on the focused control or form."""
228     pass
229    
230 class KeyUp(KeyEvent):
231     """Occurs when any key is released on the focused control or form."""
232     pass
233
234    
235 class LostFocus(Event):
236     """Occurs when the control loses the focus."""
237     def appliesToClass(eventClass, objectClass):
238         return issubclass(objectClass, dabo.ui.dPemMixin)
239     appliesToClass = classmethod(appliesToClass)
240
241
242 class LostFocus(Event):
243     """Occurs when the control loses the focus."""
244     def appliesToClass(eventClass, objectClass):
245         return issubclass(objectClass, dabo.ui.dPemMixin)
246     appliesToClass = classmethod(appliesToClass)
247
248
249 class MenuHighlight(MenuEvent):
250     """Occurs when a menu item is highlighted."""
251     pass
252
253
254 class Move(Event):
255     """Occurs when the control's position changes."""
256     def appliesToClass(eventClass, objectClass):
257         return issubclass(objectClass, dabo.ui.dPemMixin)
258     appliesToClass = classmethod(appliesToClass)
259    
260        
261 class MouseEnter(MouseEvent):
262     """Occurs when the mouse pointer enters the form or control."""
263     pass
264    
265 class MouseLeave(MouseEvent):
266     """Occurs when the mouse pointer leaves the form or control."""
267     pass
268    
269 class MouseLeftClick(MouseEvent):
270     """Occurs when the mouse's left button is depressed and released on the control."""
271     pass
272    
273 class MouseLeftDoubleClick(MouseEvent):
274     """Occurs when the mouse's left button is double-clicked on the control."""
275     pass
276    
277 class MouseMove(MouseEvent):
278     """Occurs when the mouse moves in the control."""
279    
280 class MouseRightClick(MouseEvent):
281     """Occurs when the mouse mouse's right button is depressed and released on the control."""
282     pass
283    
284 class MouseLeftDown(MouseEvent):
285     """Occurs when the mouse's left button is depressed on the control."""
286     pass
287    
288 class MouseLeftUp(MouseEvent):
289     """Occurs when the mouse's left button is released on the control."""
290     pass
291    
292 class MouseRightDown(MouseEvent):
293     """Occurs when the mouse's right button is depressed on the control."""
294     pass
295    
296 class MouseRightUp(MouseEvent):
297     """Occurs when the mouse's right button is released on the control."""
298     pass
299
300    
301 class Paint(Event):
302     """Occurs when it is time to paint the control."""
303     def appliesToClass(eventClass, objectClass):
304         return issubclass(objectClass, dabo.ui.dPemMixin)
305     appliesToClass = classmethod(appliesToClass)
306    
307 class PageEnter(Event):
308     """Occurs when the page becomes the active page."""
309     def appliesToClass(eventClass, objectClass):
310         return issubclass(objectClass, dabo.ui.dPage)
311     appliesToClass = classmethod(appliesToClass)
312    
313 class PageLeave(Event):
314     """Occurs when a different page becomes active."""
315     def appliesToClass(eventClass, objectClass):
316         return issubclass(objectClass, dabo.ui.dPage)
317     appliesToClass = classmethod(appliesToClass)
318
319
320 class Resize(Event):
321     """Occurs when the control or form is resized."""
322     def appliesToClass(eventClass, objectClass):
323         return issubclass(objectClass, dabo.ui.dPemMixin)
324     appliesToClass = classmethod(appliesToClass)
325    
326        
327 class RowNumChanged(DataEvent):
328     """Occurs when the cursor's row number has changed."""
329     pass
330
331    
332 class SashDoubleClick(SashEvent):
333     """Occurs when a user double-clicks on the sash of a splitter window."""
334     pass
335
336    
337 class ValueChanged(Event):
338     """Occurs when the control's value has changed, whether programmatically or interactively."""
339     def appliesToClass(eventClass, objectClass):
340         return issubclass(objectClass, dabo.ui.dDataControlMixin.dDataControlMixin)
341     appliesToClass = classmethod(appliesToClass)
342    
343 class ValueRefresh(Event):
344     """Occurs when the form wants the controls to refresh their values."""
345     def appliesToClass(eventClass, objectClass):
346         return issubclass(objectClass, dabo.ui.dForm)
347     appliesToClass = classmethod(appliesToClass)
Note: See TracBrowser for help on using the browser.