...
[iramuteq] / tree.py
1 #!/bin/env python
2 # -*- coding: utf-8 -*-
3 #Author: Pierre Ratinaud
4 #Copyright (c) 2012, Pierre Ratinaud
5 #Lisense: GNU GPL
6
7 import wx
8 import wx.lib.agw.customtreectrl as CT
9 import logging
10 from openanalyse import OpenAnalyse
11 from corpusNG import Corpus, copycorpus
12 from functions import DoConf
13
14
15 log = logging.getLogger('iramuteq.tree')
16 #from agw import customtreectrl as CT
17
18 class LeftTree(CT.CustomTreeCtrl):
19
20     def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition,
21                  size=wx.DefaultSize,
22                  style=wx.SUNKEN_BORDER|wx.WANTS_CHARS,
23                  agwStyle=CT.TR_HAS_BUTTONS|CT.TR_HAS_VARIABLE_ROW_HEIGHT):
24
25         CT.CustomTreeCtrl.__init__(self, parent, id, pos, size, style, agwStyle)
26         self.log = log
27         alldata = dir(CT)
28         treestyles = []
29         events = []
30         for data in alldata:
31             if data.startswith("TR_"):
32                 treestyles.append(data)
33             elif data.startswith("EVT_"):
34                 events.append(data)
35         self.parent = parent
36         self.events = events
37         self.styles = treestyles
38         self.item = None
39         
40         il = wx.ImageList(16, 16)
41
42 #        for items in ArtIDs[1:-1]:
43 #            bmp = wx.ArtProvider_GetBitmap(eval(items), wx.ART_TOOLBAR, (16, 16))
44 #            il.Add(bmp)
45
46 #        smileidx = il.Add(images.Smiles.GetBitmap())
47 #        numicons = il.GetImageCount()
48
49         self.AssignImageList(il)
50         self.count = 0
51         self.log = log
52
53         self.history = parent.history
54         self.h = self.history.history
55         self.root = self.AddRoot("Iramuteq")
56
57         if not(self.GetAGWWindowStyleFlag() & CT.TR_HIDE_ROOT):
58             self.SetPyData(self.root, None)
59             self.SetItemImage(self.root, 24, CT.TreeItemIcon_Normal)
60             self.SetItemImage(self.root, 13, CT.TreeItemIcon_Expanded)
61
62         #textctrl = wx.TextCtrl(self, -1, "I Am A Simple\nMultiline wx.TexCtrl", style=wx.TE_MULTILINE)
63         #self.gauge = wx.Gauge(self, -1, 50, style=wx.GA_HORIZONTAL|wx.GA_SMOOTH)
64         #self.gauge.SetValue(0)
65         #combobox = wx.ComboBox(self, -1, choices=["That", "Was", "A", "Nice", "Holyday!"], style=wx.CB_READONLY|wx.CB_DROPDOWN)
66
67         #textctrl.Bind(wx.EVT_CHAR, self.OnTextCtrl)
68         #combobox.Bind(wx.EVT_COMBOBOX, self.OnComboBox)
69         #lenArtIds = len(ArtIDs) - 2
70         for x in range(len(self.h)) :
71             if 'corpus_name' in self.h[self.history.order[x]] :
72                 key = 'corpus_name'
73             else :
74                 key = 'name'
75             child = self.AppendItem(self.root, self.h[self.history.order[x]][key])
76             #if x == 1:
77             #    child = self.AppendItem(self.root, "Item %d" % x + "\nHello World\nHappy wxPython-ing!")
78             #    self.SetItemBold(child, True)
79             #else:
80             #    child = self.AppendItem(self.root, "Item %d" % x)
81             self.SetPyData(child, self.h[self.history.order[x]])
82             self.SetItemImage(child, 24, CT.TreeItemIcon_Normal)
83             self.SetItemImage(child, 13, CT.TreeItemIcon_Expanded)
84
85             #if random.randint(0, 3) == 0:
86             #    self.SetItemLeftImage(child, random.randint(0, lenArtIds))
87
88             #for y in range(5):
89             #    if y == 0 and x == 1:
90             #        last = self.AppendItem(child, "item %d-%s" % (x, chr(ord("a")+y)), ct_type=2, wnd=self.gauge)
91             #    elif y == 1 and x == 2:
92             #        last = self.AppendItem(child, "Item %d-%s" % (x, chr(ord("a")+y)), ct_type=1, wnd=textctrl)
93             #        if random.randint(0, 3) == 1:
94             #            self.SetItem3State(last, True)
95             #            
96             #    elif 2 < y < 4:
97             #        last = self.AppendItem(child, "item %d-%s" % (x, chr(ord("a")+y)))
98             #    elif y == 4 and x == 1:
99             #        last = self.AppendItem(child, "item %d-%s" % (x, chr(ord("a")+y)), wnd=combobox)
100             #    else:
101             if 'corpus_name' in self.h[self.history.order[x]] :
102                 if 'analyses' in self.h[self.history.order[x]] :
103                     for y in self.h[self.history.order[x]]['analyses'] :
104                         last = self.AppendItem(child, y['name'], ct_type=0)
105                             
106                         self.SetPyData(last, y)
107                         self.SetItemImage(last, 24, CT.TreeItemIcon_Normal)
108                         self.SetItemImage(last, 13, CT.TreeItemIcon_Expanded)
109     
110             #    if random.randint(0, 3) == 0:
111             #        self.SetItemLeftImage(last, random.randint(0, lenArtIds))
112                     
113             #for z in range(len(self.history[x]) - 1):
114
115 #                if z > 2:
116 #                    item = self.AppendItem(last,  "item %d-%s-%d" % (x, chr(ord("a")+y), z), ct_type=0)
117 #                    #if random.randint(0, 3) == 1:
118 #                    #    self.SetItem3State(item, True)
119 #                elif 0 < z <= 2:
120 #                    item = self.AppendItem(last,  "item %d-%s-%d" % (x, chr(ord("a")+y), z), ct_type=0)
121 #                elif z == 0:
122 #                    item = self.AppendItem(last,  "item %d-%s-%d" % (x, chr(ord("a")+y), z))
123 #                    #self.SetItemHyperText(item, True)
124 #                self.SetPyData(item, None)
125 #                self.SetItemImage(item, 28, CT.TreeItemIcon_Normal)
126 #                self.SetItemImage(item, 28, CT.TreeItemIcon_Selected)
127
128              #       if random.randint(0, 3) == 0:
129              #           self.SetItemLeftImage(item, random.randint(0, lenArtIds))
130
131         self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDClick)
132         #self.Bind(wx.EVT_IDLE, self.OnIdle)
133
134         self.eventdict = {'EVT_TREE_BEGIN_DRAG': self.OnBeginDrag, 'EVT_TREE_BEGIN_LABEL_EDIT': self.OnBeginEdit,
135                           'EVT_TREE_BEGIN_RDRAG': self.OnBeginRDrag, 'EVT_TREE_DELETE_ITEM': self.OnDeleteItem,
136                           'EVT_TREE_END_DRAG': self.OnEndDrag, 'EVT_TREE_END_LABEL_EDIT': self.OnEndEdit,
137                           'EVT_TREE_ITEM_ACTIVATED': self.OnActivate, 'EVT_TREE_ITEM_CHECKED': self.OnItemCheck,
138                           'EVT_TREE_ITEM_CHECKING': self.OnItemChecking, 'EVT_TREE_ITEM_COLLAPSED': self.OnItemCollapsed,
139                           'EVT_TREE_ITEM_COLLAPSING': self.OnItemCollapsing, 'EVT_TREE_ITEM_EXPANDED': self.OnItemExpanded,
140                           'EVT_TREE_ITEM_EXPANDING': self.OnItemExpanding, 'EVT_TREE_ITEM_GETTOOLTIP': self.OnToolTip,
141                           'EVT_TREE_ITEM_MENU': self.OnItemMenu, 'EVT_TREE_ITEM_RIGHT_CLICK': self.OnRightDown,
142                           'EVT_TREE_KEY_DOWN': self.OnKey, 'EVT_TREE_SEL_CHANGED': self.OnSelChanged,
143                           'EVT_TREE_SEL_CHANGING': self.OnSelChanging, "EVT_TREE_ITEM_HYPERLINK": self.OnHyperLink}
144
145         mainframe = wx.GetTopLevelParent(self)
146         
147         if not hasattr(mainframe, "leftpanel"):
148             self.Bind(CT.EVT_TREE_ITEM_EXPANDED, self.OnItemExpanded)
149             self.Bind(CT.EVT_TREE_ITEM_COLLAPSED, self.OnItemCollapsed)
150             self.Bind(CT.EVT_TREE_SEL_CHANGED, self.OnSelChanged)
151             self.Bind(CT.EVT_TREE_SEL_CHANGING, self.OnSelChanging)
152             self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
153             self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp)
154         else:
155             for combos in mainframe.treeevents:
156                 self.BindEvents(combos)
157
158         if hasattr(mainframe, "leftpanel"):
159             self.ChangeStyle(mainframe.treestyles)
160
161         if not(self.GetAGWWindowStyleFlag() & CT.TR_HIDE_ROOT):
162             self.SelectItem(self.root)
163             self.Expand(self.root)
164
165
166     def BindEvents(self, choice, recreate=False):
167
168         value = choice.GetValue()
169         text = choice.GetLabel()
170         
171         evt = "CT." + text
172         binder = self.eventdict[text]
173
174         if value == 1:
175             if evt == "CT.EVT_TREE_BEGIN_RDRAG":
176                 self.Bind(wx.EVT_RIGHT_DOWN, None)
177                 self.Bind(wx.EVT_RIGHT_UP, None)
178             self.Bind(eval(evt), binder)
179         else:
180             self.Bind(eval(evt), None)
181             if evt == "CT.EVT_TREE_BEGIN_RDRAG":
182                 self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
183                 self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp)
184
185
186     def ChangeStyle(self, combos):
187
188         style = 0
189         for combo in combos:
190             if combo.GetValue() == 1:
191                 style = style | eval("CT." + combo.GetLabel())
192
193         if self.GetAGWWindowStyleFlag() != style:
194             self.SetAGWWindowStyleFlag(style)
195             
196
197     def OnCompareItems(self, item1, item2):
198         
199         t1 = self.GetItemText(item1)
200         t2 = self.GetItemText(item2)
201         
202
203         if t1 < t2:
204             return -1
205         if t1 == t2:
206             return 0
207
208         return 1
209
210     
211     def OnIdle(self, event):
212
213     #    if self.gauge:
214     #        try:
215     #            if self.gauge.IsEnabled() and self.gauge.IsShown():
216     #                self.count = self.count + 1
217
218     #                if self.count >= 50:
219     #                    self.count = 0
220
221     #                self.gauge.SetValue(self.count)
222
223     #        except:
224     #            self.gauge = None
225
226         event.Skip()
227
228
229     def CloseItem(self, itemParent = None, uuid = None) :
230         if itemParent is None :
231             itemParent = self.root
232         child, cookie = self.GetFirstChild(itemParent)
233         while child :
234             pydata = self.GetPyData(child)
235             if pydata['uuid'] == uuid :
236                 self.SetItemBold(child, False)
237                 break
238             self.CloseItem(child, uuid)
239             child, cookie = self.GetNextChild(itemParent, cookie)
240
241     def GiveFocus(self, itemParent = None, uuid = None) :
242         if itemParent is None :
243             itemParent = self.root
244         child, cookie = self.GetFirstChild(itemParent)
245         while child :
246             pydata = self.GetPyData(child)
247             if pydata['uuid'] == uuid :
248                 self.SelectItem(child)
249                 break
250             self.GiveFocus(child, uuid)
251             child, cookie = self.GetNextChild(itemParent, cookie)
252
253     def OnRightDown(self, event):
254         
255         pt = event.GetPosition()
256         item, flags = self.HitTest(pt)
257
258         if item:
259             self.item = item
260             #self.log.info("OnRightClick: %s, %s, %s" % (self.GetItemText(item), type(item), item.__class__) + "\n")
261             self.SelectItem(item)
262
263
264     def OnRightUp(self, event):
265
266         item = self.item
267         
268         if not item:
269             event.Skip()
270             return
271
272         if not self.IsItemEnabled(item):
273             event.Skip()
274             return
275
276         # Item Text Appearance
277         ishtml = self.IsItemHyperText(item)
278         back = self.GetItemBackgroundColour(item)
279         fore = self.GetItemTextColour(item)
280         isbold = self.IsBold(item)
281         font = self.GetItemFont(item)
282
283         # Icons On Item
284         normal = self.GetItemImage(item, CT.TreeItemIcon_Normal)
285         selected = self.GetItemImage(item, CT.TreeItemIcon_Selected)
286         expanded = self.GetItemImage(item, CT.TreeItemIcon_Expanded)
287         selexp = self.GetItemImage(item, CT.TreeItemIcon_SelectedExpanded)
288
289         # Enabling/Disabling Windows Associated To An Item
290         haswin = self.GetItemWindow(item)
291
292         # Enabling/Disabling Items
293         enabled = self.IsItemEnabled(item)
294
295         # Generic Item's Info
296         children = self.GetChildrenCount(item)
297         itemtype = self.GetItemType(item)
298         text = self.GetItemText(item)
299         pydata = self.GetPyData(item)
300         
301         self.current = item
302         self.itemdict = {"ishtml": ishtml, "back": back, "fore": fore, "isbold": isbold,
303                          "font": font, "normal": normal, "selected": selected, "expanded": expanded,
304                          "selexp": selexp, "haswin": haswin, "children": children,
305                          "itemtype": itemtype, "text": text, "pydata": pydata, "enabled": enabled}
306         
307         menu = wx.Menu()
308         info = menu.Append(wx.ID_ANY, "Informations")
309         menu.AppendSeparator()
310
311         if 'corpus_name' in pydata :
312             stat = menu.Append(wx.ID_ANY, u"Statistiques")
313             spec = menu.Append(wx.ID_ANY, u"Spécificté et AFC")
314             classification = wx.Menu()
315             alceste = classification.Append(wx.ID_ANY, u"Méthode ALCESTE")
316             pam = classification.Append(wx.ID_ANY, u"Par matrice des distances")
317             menu.AppendMenu(-1, u"Classification", classification)
318             simi = menu.Append(wx.ID_ANY, u"Analyse de similitude")
319             menu.AppendSeparator()
320             self.Bind(wx.EVT_MENU, self.OnAlceste, alceste)
321             self.Bind(wx.EVT_MENU, self.OnPam, pam)
322             self.Bind(wx.EVT_MENU, self.OnStat, stat)
323             self.Bind(wx.EVT_MENU, self.OnSpec, spec)
324             self.Bind(wx.EVT_MENU, self.OnSimiTxt, simi)
325
326         itemdelete = menu.Append(wx.ID_ANY, "Supprimer de l'historique")
327         if item == self.GetRootItem():
328             itemdelete.Enable(False)
329         #item11 = menu.Append(wx.ID_ANY, "Prepend An Item")
330         #item12 = menu.Append(wx.ID_ANY, "Append An Item")
331
332         #self.Bind(wx.EVT_MENU, self.OnItemBackground, item1)
333         #self.Bind(wx.EVT_MENU, self.OnItemForeground, item2)
334         #self.Bind(wx.EVT_MENU, self.OnItemBold, item3)
335         #self.Bind(wx.EVT_MENU, self.OnItemFont, item4)
336         #self.Bind(wx.EVT_MENU, self.OnItemHyperText, item5)
337         #self.Bind(wx.EVT_MENU, self.OnEnableWindow, item6)
338         #self.Bind(wx.EVT_MENU, self.OnDisableItem, item7)
339         #self.Bind(wx.EVT_MENU, self.OnItemIcons, item8)
340         self.Bind(wx.EVT_MENU, self.OnItemInfo, info)
341         self.Bind(wx.EVT_MENU, self.OnItemDelete, itemdelete)
342         #self.Bind(wx.EVT_MENU, self.OnItemPrepend, item11)
343         #self.Bind(wx.EVT_MENU, self.OnItemAppend, item12)
344         
345         self.PopupMenu(menu)
346         menu.Destroy()
347
348     def getcorpus(self, itemdict):
349         if itemdict['pydata']['uuid'] in self.parent.history.openedcorpus :
350             return copycorpus(self.parent.history.openedcorpus[itemdict['pydata']['uuid']])
351         else :
352             return Corpus(self.parent, parametres = DoConf(itemdict['pydata']['ira']).getoptions('corpus'), read = True)
353
354     def OnSpec(self, evt) :
355         self.parent.OnTextSpec(evt, self.getcorpus(self.itemdict))
356
357     def OnStat(self, evt) :
358         self.parent.OnTextStat(evt, self.getcorpus(self.itemdict))
359         
360     def OnAlceste(self, evt) :
361         self.parent.OnTextAlceste(evt, self.getcorpus(self.itemdict))
362
363     def OnPam(self, evt) :
364         print 'rien'
365
366     def OnSimiTxt(self, evt) :
367         self.parent.OnSimiTxt(evt, self.getcorpus(self.itemdict))
368
369     def OnItemBackground(self, event):
370
371         colourdata = wx.ColourData()
372         colourdata.SetColour(self.itemdict["back"])
373         dlg = wx.ColourDialog(self, colourdata)
374         
375         dlg.GetColourData().SetChooseFull(True)
376
377         if dlg.ShowModal() == wx.ID_OK:
378             data = dlg.GetColourData()
379             col1 = data.GetColour().Get()
380             self.SetItemBackgroundColour(self.current, col1)
381         dlg.Destroy()
382
383
384     def OnItemForeground(self, event):
385
386         colourdata = wx.ColourData()
387         colourdata.SetColour(self.itemdict["fore"])
388         dlg = wx.ColourDialog(self, colourdata)
389         
390         dlg.GetColourData().SetChooseFull(True)
391
392         if dlg.ShowModal() == wx.ID_OK:
393             data = dlg.GetColourData()
394             col1 = data.GetColour().Get()
395             self.SetItemTextColour(self.current, col1)
396         dlg.Destroy()
397
398
399     def OnItemBold(self, event):
400
401         self.SetItemBold(self.current, not self.itemdict["isbold"])
402
403
404     def OnItemFont(self, event):
405
406         data = wx.FontData()
407         font = self.itemdict["font"]
408         
409         if font is None:
410             font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
411             
412         data.SetInitialFont(font)
413
414         dlg = wx.FontDialog(self, data)
415         
416         if dlg.ShowModal() == wx.ID_OK:
417             data = dlg.GetFontData()
418             font = data.GetChosenFont()
419             self.SetItemFont(self.current, font)
420
421         dlg.Destroy()
422         
423
424     def OnItemHyperText(self, event):
425
426         self.SetItemHyperText(self.current, not self.itemdict["ishtml"])
427
428
429     def OnEnableWindow(self, event):
430
431         enable = self.GetItemWindowEnabled(self.current)
432         self.SetItemWindowEnabled(self.current, not enable)
433
434
435     def OnDisableItem(self, event):
436
437         self.EnableItem(self.current, False)
438         
439
440     def OnItemIcons(self, event):
441
442         bitmaps = [self.itemdict["normal"], self.itemdict["selected"],
443                    self.itemdict["expanded"], self.itemdict["selexp"]]
444
445         wx.BeginBusyCursor()        
446         dlg = TreeIcons(self, -1, bitmaps=bitmaps)
447         wx.EndBusyCursor()
448         dlg.ShowModal()
449
450
451     def SetNewIcons(self, bitmaps):
452
453         self.SetItemImage(self.current, bitmaps[0], CT.TreeItemIcon_Normal)
454         self.SetItemImage(self.current, bitmaps[1], CT.TreeItemIcon_Selected)
455         self.SetItemImage(self.current, bitmaps[2], CT.TreeItemIcon_Expanded)
456         self.SetItemImage(self.current, bitmaps[3], CT.TreeItemIcon_SelectedExpanded)
457
458
459     def OnItemInfo(self, event):
460
461         itemtext = self.itemdict["text"]
462         numchildren = str(self.itemdict["children"])
463         itemtype = self.itemdict["itemtype"]
464         pydata = self.itemdict['pydata']
465         if 'analyses' in pydata :
466             toshow = dict([[val, pydata[val]] for val in pydata if val not in['analyses', 'isload']])
467         else :
468             toshow = pydata
469         pydata = DoConf().totext(toshow)
470
471         if itemtype == 0:
472             itemtype = "Normal"
473         elif itemtype == 1:
474             itemtype = "CheckBox"
475         else:
476             itemtype = "RadioButton"
477
478         strs = "Information On Selected Item:\n\n" + "Text: " + itemtext + "\n" \
479                "Number Of Children: " + numchildren + "\n" \
480                "Item Type: " + itemtype + "\n" \
481                "Item Data Type: " + pydata + "\n"
482
483         dlg = wx.MessageDialog(self, strs, "CustomTreeCtrlDemo Info", wx.OK | wx.ICON_INFORMATION)
484         dlg.ShowModal()
485         dlg.Destroy()
486                 
487         
488
489     def OnItemDelete(self, event):
490
491         strs = "Are You Sure You Want To Delete Item " + self.GetItemText(self.current) + "?"
492         dlg = wx.MessageDialog(None, strs, 'Deleting Item', wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_QUESTION)
493
494         if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
495             dlg.Destroy()
496             return
497
498         dlg.Destroy()
499         
500         pydata = self.itemdict['pydata']
501         if 'corpus_name' in pydata :
502             self.history.delete(pydata['uuid'], True)
503         else :
504             self.history.delete(pydata['uuid'])
505         self.DeleteChildren(self.current)
506         self.Delete(self.current)
507         self.current = None
508         
509
510
511     def OnItemPrepend(self, event):
512
513         dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
514
515         if dlg.ShowModal() == wx.ID_OK:
516             newname = dlg.GetValue()
517             newitem = self.PrependItem(self.current, newname)
518             self.EnsureVisible(newitem)
519
520         dlg.Destroy()
521
522     def AddAnalyse(self, parametres, itemParent = None) :
523         uuid = parametres['corpus']
524         if itemParent is None :
525             itemParent = self.root
526         child, cookie = self.GetFirstChild(itemParent)
527         while child :
528             pydata = self.GetPyData(child)
529             if pydata['uuid'] == uuid :
530                 corpus = child
531                 break
532             self.GiveFocus(child, uuid)
533             child, cookie = self.GetNextChild(itemParent, cookie)
534         item = self.AppendItem(corpus, parametres['name'])
535         self.SetPyData(item, parametres)
536         self.SetItemImage(item, 24, CT.TreeItemIcon_Normal)
537         self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
538         self.SetItemBold(item, True)
539         
540     def OnItemAppend(self, item):
541         child = self.AppendItem(self.root, item['corpus_name'])
542         self.SetPyData(child, item)
543         self.history.addtab(item)
544         self.SetItemImage(child, 24, CT.TreeItemIcon_Normal)
545         self.SetItemImage(child, 13, CT.TreeItemIcon_Expanded)
546         self.SetItemBold(child, True)
547         
548         #dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
549
550         #if dlg.ShowModal() == wx.ID_OK:
551         #    newname = dlg.GetValue()
552         #    newitem = self.AppendItem(self.current, newname)
553         #    self.EnsureVisible(newitem)
554         
555
556         #dlg.Destroy()
557         
558
559     def OnBeginEdit(self, event):
560         
561         #self.log.info("OnBeginEdit" + "\n")
562         # show how to prevent edit...
563         item = event.GetItem()
564         if item and self.GetItemText(item) == "The Root Item":
565             wx.Bell()
566             #self.log.info("You can't edit this one..." + "\n")
567
568             # Lets just see what's visible of its children
569             cookie = 0
570             root = event.GetItem()
571             (child, cookie) = self.GetFirstChild(root)
572
573             while child:
574                 #self.log.info("Child [%s] visible = %d" % (self.GetItemText(child), self.IsVisible(child)) + "\n")
575                 (child, cookie) = self.GetNextChild(root, cookie)
576
577             event.Veto()
578
579
580     def OnEndEdit(self, event):
581         
582         #self.log.info("OnEndEdit: %s %s" %(event.IsEditCancelled(), event.GetLabel()))
583         # show how to reject edit, we'll not allow any digits
584         for x in event.GetLabel():
585             if x in string.digits:
586                 #self.log.info(", You can't enter digits..." + "\n")
587                 event.Veto()
588                 return
589             
590         self.log.info("\n")
591
592
593     def OnLeftDClick(self, event):
594         
595         pt = event.GetPosition()
596         item, flags = self.HitTest(pt)
597         pydata = self.GetPyData(item)
598         if pydata['uuid'] in self.parent.history.opened :
599             for i in range(self.parent.nb.GetPageCount()) :
600                 page = self.parent.nb.GetPage(i)
601                 if 'parametres' in dir(page) :
602                     if page.parametres['uuid'] == pydata['uuid'] :
603                         self.parent.nb.SetSelection(i)
604                         break
605         else :
606             OpenAnalyse(self.parent, pydata)
607             self.SetItemBold(item, True)
608         #if item and (flags & CT.TREE_HITTEST_ONITEMLABEL):
609         #    if self.GetAGWWindowStyleFlag() & CT.TR_EDIT_LABELS:
610         #        self.log.info("OnLeftDClick: %s (manually starting label edit)"% self.GetItemText(item) + "\n")
611                 
612                 #self.EditLabel(item)
613         #    else:
614         #        pydata = self.GetPyData(item)
615         #        print pydata
616         #        self.log.info("OnLeftDClick: Cannot Start Manual Editing, Missing Style TR_EDIT_LABELS\n")
617
618         event.Skip()                
619         
620
621     def OnItemExpanded(self, event):
622         
623         item = event.GetItem()
624         if item:
625             self.log.info("OnItemExpanded: %s" % self.GetItemText(item) + "\n")
626
627
628     def OnItemExpanding(self, event):
629         
630         item = event.GetItem()
631         if item:
632             self.log.info("OnItemExpanding: %s" % self.GetItemText(item) + "\n")
633             
634         event.Skip()
635
636         
637     def OnItemCollapsed(self, event):
638
639         item = event.GetItem()
640         if item:
641             self.log.info("OnItemCollapsed: %s" % self.GetItemText(item) + "\n")
642             
643
644     def OnItemCollapsing(self, event):
645
646         item = event.GetItem()
647         if item:
648             self.log.info("OnItemCollapsing: %s" % self.GetItemText(item) + "\n")
649     
650         event.Skip()
651
652         
653     def OnSelChanged(self, event):
654         item = event.GetItem()
655         pydata = self.GetPyData(item)
656         if pydata is not None :
657             if pydata['uuid'] in self.parent.history.opened :
658                 for i in range(self.parent.nb.GetPageCount()) :
659                     page = self.parent.nb.GetPage(i)
660                     if 'parametres' in dir(page) :
661                         if page.parametres['uuid'] == pydata['uuid'] :
662                             self.parent.nb.SetSelection(i)
663                             break
664
665         #self.item = event.GetItem()
666         #if self.item:
667         #    self.
668             #self.log.info("OnSelChanged: %s" % self.GetItemText(self.item))
669         #    if wx.Platform == '__WXMSW__':
670                # self.log.info(", BoundingRect: %s" % self.GetBoundingRect(self.item, True) + "\n")
671        #        pass
672         event.Skip()
673
674
675     def OnSelChanging(self, event):
676
677         item = event.GetItem()
678         olditem = event.GetOldItem()
679         
680         if item:
681             if not olditem:
682                 olditemtext = "None"
683             else:
684                 olditemtext = self.GetItemText(olditem)
685             self.log.info("OnSelChanging: From %s" % olditemtext + " To %s" % self.GetItemText(item) + "\n")
686                 
687         event.Skip()
688
689
690     def OnBeginDrag(self, event):
691
692         self.item = event.GetItem()
693         if self.item:
694             self.log.info("Beginning Drag..." + "\n")
695
696             event.Allow()
697
698
699     def OnBeginRDrag(self, event):
700
701         self.item = event.GetItem()
702         if self.item:
703             self.log.info("Beginning Right Drag..." + "\n")
704
705             event.Allow()
706         
707
708     def OnEndDrag(self, event):
709
710         self.item = event.GetItem()
711         if self.item:
712             self.log.info("Ending Drag!" + "\n")
713
714         event.Skip()            
715
716
717     def OnDeleteItem(self, event):
718
719         item = event.GetItem()
720
721         if not item:
722             return
723
724         self.log.info("Deleting Item: %s" % self.GetItemText(item) + "\n")
725         event.Skip()
726         
727
728     def OnItemCheck(self, event):
729
730         item = event.GetItem()
731         self.log.info("Item " + self.GetItemText(item) + " Has Been Checked!\n")
732         event.Skip()
733
734
735     def OnItemChecking(self, event):
736
737         item = event.GetItem()
738         self.log.info("Item " + self.GetItemText(item) + " Is Being Checked...\n")
739         event.Skip()
740         
741
742     def OnToolTip(self, event):
743
744         item = event.GetItem()
745         if item:
746             event.SetToolTip(wx.ToolTip(self.GetItemText(item)))
747
748
749     def OnItemMenu(self, event):
750
751         item = event.GetItem()
752         if item:
753             self.log.info("OnItemMenu: %s" % self.GetItemText(item) + "\n")
754     
755         event.Skip()
756
757
758     def OnKey(self, event):
759
760         keycode = event.GetKeyCode()
761         keyname = keyMap.get(keycode, None)
762                 
763         if keycode == wx.WXK_BACK:
764             self.log.info("OnKeyDown: HAHAHAHA! I Vetoed Your Backspace! HAHAHAHA\n")
765             return
766
767         if keyname is None:
768             if "unicode" in wx.PlatformInfo:
769                 keycode = event.GetUnicodeKey()
770                 if keycode <= 127:
771                     keycode = event.GetKeyCode()
772                 keyname = "\"" + unichr(event.GetUnicodeKey()) + "\""
773                 if keycode < 27:
774                     keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
775                 
776             elif keycode < 256:
777                 if keycode == 0:
778                     keyname = "NUL"
779                 elif keycode < 27:
780                     keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
781                 else:
782                     keyname = "\"%s\"" % chr(keycode)
783             else:
784                 keyname = "unknown (%s)" % keycode
785                 
786         self.log.info("OnKeyDown: You Pressed '" + keyname + "'\n")
787
788         event.Skip()
789         
790         
791     def OnActivate(self, event):
792         
793         if self.item:
794             self.log.info("OnActivate: %s" % self.GetItemText(self.item) + "\n")
795
796         event.Skip()
797
798         
799     def OnHyperLink(self, event):
800
801         item = event.GetItem()
802         if item:
803             self.log.info("OnHyperLink: %s" % self.GetItemText(self.item) + "\n")
804             
805
806     def OnTextCtrl(self, event):
807
808         char = chr(event.GetKeyCode())
809         self.log.info("EDITING THE TEXTCTRL: You Wrote '" + char + \
810                        "' (KeyCode = " + str(event.GetKeyCode()) + ")\n")
811         event.Skip()
812
813
814     def OnComboBox(self, event):
815
816         selection = event.GetEventObject().GetValue()
817         self.log.info("CHOICE FROM COMBOBOX: You Chose '" + selection + "'\n")
818         event.Skip()