d856799d0cc963492685a23c7028f2fcae0e1ada
[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.history.corpora)) :
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             wdc = menu.Append(wx.ID_ANY, u"Nuage de mots")
320             menu.AppendSeparator()
321             self.Bind(wx.EVT_MENU, self.OnAlceste, alceste)
322             self.Bind(wx.EVT_MENU, self.OnPam, pam)
323             self.Bind(wx.EVT_MENU, self.OnStat, stat)
324             self.Bind(wx.EVT_MENU, self.OnSpec, spec)
325             self.Bind(wx.EVT_MENU, self.OnSimiTxt, simi)
326             self.Bind(wx.EVT_MENU, self.OnWordCloud, wdc)
327
328         itemdelete = menu.Append(wx.ID_ANY, "Supprimer de l'historique")
329         if item == self.GetRootItem():
330             itemdelete.Enable(False)
331         #item11 = menu.Append(wx.ID_ANY, "Prepend An Item")
332         #item12 = menu.Append(wx.ID_ANY, "Append An Item")
333
334         #self.Bind(wx.EVT_MENU, self.OnItemBackground, item1)
335         #self.Bind(wx.EVT_MENU, self.OnItemForeground, item2)
336         #self.Bind(wx.EVT_MENU, self.OnItemBold, item3)
337         #self.Bind(wx.EVT_MENU, self.OnItemFont, item4)
338         #self.Bind(wx.EVT_MENU, self.OnItemHyperText, item5)
339         #self.Bind(wx.EVT_MENU, self.OnEnableWindow, item6)
340         #self.Bind(wx.EVT_MENU, self.OnDisableItem, item7)
341         #self.Bind(wx.EVT_MENU, self.OnItemIcons, item8)
342         self.Bind(wx.EVT_MENU, self.OnItemInfo, info)
343         self.Bind(wx.EVT_MENU, self.OnItemDelete, itemdelete)
344         #self.Bind(wx.EVT_MENU, self.OnItemPrepend, item11)
345         #self.Bind(wx.EVT_MENU, self.OnItemAppend, item12)
346         
347         self.PopupMenu(menu)
348         menu.Destroy()
349
350     def getcorpus(self, itemdict):
351         if itemdict['pydata']['uuid'] in self.parent.history.openedcorpus :
352             return copycorpus(self.parent.history.openedcorpus[itemdict['pydata']['uuid']])
353         else :
354             return Corpus(self.parent, parametres = DoConf(itemdict['pydata']['ira']).getoptions('corpus'), read = True)
355
356     def OnSpec(self, evt) :
357         self.parent.OnTextSpec(evt, self.getcorpus(self.itemdict))
358
359     def OnStat(self, evt) :
360         self.parent.OnTextStat(evt, self.getcorpus(self.itemdict))
361         
362     def OnAlceste(self, evt) :
363         self.parent.OnTextAlceste(evt, self.getcorpus(self.itemdict))
364
365     def OnPam(self, evt) :
366         print 'rien'
367
368     def OnSimiTxt(self, evt) :
369         self.parent.OnSimiTxt(evt, self.getcorpus(self.itemdict))
370
371     def OnWordCloud(self, evt) :
372         self.parent.OnWordCloud(evt, self.getcorpus(self.itemdict))
373
374     def OnItemBackground(self, event):
375
376         colourdata = wx.ColourData()
377         colourdata.SetColour(self.itemdict["back"])
378         dlg = wx.ColourDialog(self, colourdata)
379         
380         dlg.GetColourData().SetChooseFull(True)
381
382         if dlg.ShowModal() == wx.ID_OK:
383             data = dlg.GetColourData()
384             col1 = data.GetColour().Get()
385             self.SetItemBackgroundColour(self.current, col1)
386         dlg.Destroy()
387
388
389     def OnItemForeground(self, event):
390
391         colourdata = wx.ColourData()
392         colourdata.SetColour(self.itemdict["fore"])
393         dlg = wx.ColourDialog(self, colourdata)
394         
395         dlg.GetColourData().SetChooseFull(True)
396
397         if dlg.ShowModal() == wx.ID_OK:
398             data = dlg.GetColourData()
399             col1 = data.GetColour().Get()
400             self.SetItemTextColour(self.current, col1)
401         dlg.Destroy()
402
403
404     def OnItemBold(self, event):
405
406         self.SetItemBold(self.current, not self.itemdict["isbold"])
407
408
409     def OnItemFont(self, event):
410
411         data = wx.FontData()
412         font = self.itemdict["font"]
413         
414         if font is None:
415             font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
416             
417         data.SetInitialFont(font)
418
419         dlg = wx.FontDialog(self, data)
420         
421         if dlg.ShowModal() == wx.ID_OK:
422             data = dlg.GetFontData()
423             font = data.GetChosenFont()
424             self.SetItemFont(self.current, font)
425
426         dlg.Destroy()
427         
428
429     def OnItemHyperText(self, event):
430
431         self.SetItemHyperText(self.current, not self.itemdict["ishtml"])
432
433
434     def OnEnableWindow(self, event):
435
436         enable = self.GetItemWindowEnabled(self.current)
437         self.SetItemWindowEnabled(self.current, not enable)
438
439
440     def OnDisableItem(self, event):
441
442         self.EnableItem(self.current, False)
443         
444
445     def OnItemIcons(self, event):
446
447         bitmaps = [self.itemdict["normal"], self.itemdict["selected"],
448                    self.itemdict["expanded"], self.itemdict["selexp"]]
449
450         wx.BeginBusyCursor()        
451         dlg = TreeIcons(self, -1, bitmaps=bitmaps)
452         wx.EndBusyCursor()
453         dlg.ShowModal()
454
455
456     def SetNewIcons(self, bitmaps):
457
458         self.SetItemImage(self.current, bitmaps[0], CT.TreeItemIcon_Normal)
459         self.SetItemImage(self.current, bitmaps[1], CT.TreeItemIcon_Selected)
460         self.SetItemImage(self.current, bitmaps[2], CT.TreeItemIcon_Expanded)
461         self.SetItemImage(self.current, bitmaps[3], CT.TreeItemIcon_SelectedExpanded)
462
463
464     def OnItemInfo(self, event):
465
466         itemtext = self.itemdict["text"]
467         numchildren = str(self.itemdict["children"])
468         itemtype = self.itemdict["itemtype"]
469         pydata = self.itemdict['pydata']
470         if 'analyses' in pydata :
471             toshow = dict([[val, pydata[val]] for val in pydata if val not in['analyses', 'isload']])
472         else :
473             toshow = pydata
474         pydata = DoConf().totext(toshow)
475
476         if itemtype == 0:
477             itemtype = "Normal"
478         elif itemtype == 1:
479             itemtype = "CheckBox"
480         else:
481             itemtype = "RadioButton"
482
483         strs = "Information On Selected Item:\n\n" + "Text: " + itemtext + "\n" \
484                "Number Of Children: " + numchildren + "\n" \
485                "Item Type: " + itemtype + "\n" \
486                "Item Data Type: " + pydata + "\n"
487
488         dlg = wx.MessageDialog(self, strs, "CustomTreeCtrlDemo Info", wx.OK | wx.ICON_INFORMATION)
489         dlg.ShowModal()
490         dlg.Destroy()
491                 
492         
493
494     def OnItemDelete(self, event):
495
496         strs = "Are You Sure You Want To Delete Item " + self.GetItemText(self.current) + "?"
497         dlg = wx.MessageDialog(None, strs, 'Deleting Item', wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_QUESTION)
498
499         if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
500             dlg.Destroy()
501             return
502
503         dlg.Destroy()
504         
505         pydata = self.itemdict['pydata']
506         if 'corpus_name' in pydata :
507             self.history.delete(pydata['uuid'], True)
508         else :
509             self.history.delete(pydata['uuid'])
510         self.DeleteChildren(self.current)
511         self.Delete(self.current)
512         self.current = None
513         
514
515
516     def OnItemPrepend(self, event):
517
518         dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
519
520         if dlg.ShowModal() == wx.ID_OK:
521             newname = dlg.GetValue()
522             newitem = self.PrependItem(self.current, newname)
523             self.EnsureVisible(newitem)
524
525         dlg.Destroy()
526
527     def AddAnalyse(self, parametres, itemParent = None, bold = True) :
528         uuid = parametres['corpus']
529         if itemParent is None :
530             itemParent = self.root
531         child, cookie = self.GetFirstChild(itemParent)
532         corpus = None
533         while child :
534             pydata = self.GetPyData(child)
535             if pydata['uuid'] == uuid :
536                 corpus = child
537                 break
538             self.GiveFocus(child, uuid)
539             child, cookie = self.GetNextChild(itemParent, cookie)
540         #item = self.AppendItem(child, parametres['name'])
541         if corpus is not None : 
542             item = self.AppendItem(corpus, parametres['name'])
543         else :
544             item = self.AppendItem(self.root, parametres['name'])
545         self.SetPyData(item, parametres)
546         self.SetItemImage(item, 24, CT.TreeItemIcon_Normal)
547         self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
548         self.SetItemBold(item, bold)
549         
550     def OnItemAppend(self, item):
551         child = self.AppendItem(self.root, item['corpus_name'])
552         self.SetPyData(child, item)
553         self.history.addtab(item)
554         self.SetItemImage(child, 24, CT.TreeItemIcon_Normal)
555         self.SetItemImage(child, 13, CT.TreeItemIcon_Expanded)
556         self.SetItemBold(child, True)
557         
558         #dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
559
560         #if dlg.ShowModal() == wx.ID_OK:
561         #    newname = dlg.GetValue()
562         #    newitem = self.AppendItem(self.current, newname)
563         #    self.EnsureVisible(newitem)
564         
565
566         #dlg.Destroy()
567         
568
569     def OnBeginEdit(self, event):
570         
571         #self.log.info("OnBeginEdit" + "\n")
572         # show how to prevent edit...
573         item = event.GetItem()
574         if item and self.GetItemText(item) == "The Root Item":
575             wx.Bell()
576             #self.log.info("You can't edit this one..." + "\n")
577
578             # Lets just see what's visible of its children
579             cookie = 0
580             root = event.GetItem()
581             (child, cookie) = self.GetFirstChild(root)
582
583             while child:
584                 #self.log.info("Child [%s] visible = %d" % (self.GetItemText(child), self.IsVisible(child)) + "\n")
585                 (child, cookie) = self.GetNextChild(root, cookie)
586
587             event.Veto()
588
589
590     def OnEndEdit(self, event):
591         
592         #self.log.info("OnEndEdit: %s %s" %(event.IsEditCancelled(), event.GetLabel()))
593         # show how to reject edit, we'll not allow any digits
594         for x in event.GetLabel():
595             if x in string.digits:
596                 #self.log.info(", You can't enter digits..." + "\n")
597                 event.Veto()
598                 return
599             
600         self.log.info("\n")
601
602
603     def OnLeftDClick(self, event):
604         
605         pt = event.GetPosition()
606         item, flags = self.HitTest(pt)
607         pydata = self.GetPyData(item)
608         if pydata['uuid'] in self.parent.history.opened :
609             for i in range(self.parent.nb.GetPageCount()) :
610                 page = self.parent.nb.GetPage(i)
611                 if 'parametres' in dir(page) :
612                     if page.parametres['uuid'] == pydata['uuid'] :
613                         self.parent.nb.SetSelection(i)
614                         break
615         else :
616             OpenAnalyse(self.parent, pydata)
617             self.SetItemBold(item, True)
618         #if item and (flags & CT.TREE_HITTEST_ONITEMLABEL):
619         #    if self.GetAGWWindowStyleFlag() & CT.TR_EDIT_LABELS:
620         #        self.log.info("OnLeftDClick: %s (manually starting label edit)"% self.GetItemText(item) + "\n")
621                 
622                 #self.EditLabel(item)
623         #    else:
624         #        pydata = self.GetPyData(item)
625         #        print pydata
626         #        self.log.info("OnLeftDClick: Cannot Start Manual Editing, Missing Style TR_EDIT_LABELS\n")
627
628         event.Skip()                
629         
630
631     def OnItemExpanded(self, event):
632         
633         item = event.GetItem()
634         if item:
635             self.log.info("OnItemExpanded: %s" % self.GetItemText(item) + "\n")
636
637
638     def OnItemExpanding(self, event):
639         
640         item = event.GetItem()
641         if item:
642             self.log.info("OnItemExpanding: %s" % self.GetItemText(item) + "\n")
643             
644         event.Skip()
645
646         
647     def OnItemCollapsed(self, event):
648
649         item = event.GetItem()
650         if item:
651             self.log.info("OnItemCollapsed: %s" % self.GetItemText(item) + "\n")
652             
653
654     def OnItemCollapsing(self, event):
655
656         item = event.GetItem()
657         if item:
658             self.log.info("OnItemCollapsing: %s" % self.GetItemText(item) + "\n")
659     
660         event.Skip()
661
662         
663     def OnSelChanged(self, event):
664         item = event.GetItem()
665         pydata = self.GetPyData(item)
666         if pydata is not None :
667             if pydata['uuid'] in self.parent.history.opened :
668                 for i in range(self.parent.nb.GetPageCount()) :
669                     page = self.parent.nb.GetPage(i)
670                     if 'parametres' in dir(page) :
671                         if page.parametres['uuid'] == pydata['uuid'] :
672                             self.parent.nb.SetSelection(i)
673                             break
674
675         #self.item = event.GetItem()
676         #if self.item:
677         #    self.
678             #self.log.info("OnSelChanged: %s" % self.GetItemText(self.item))
679         #    if wx.Platform == '__WXMSW__':
680                # self.log.info(", BoundingRect: %s" % self.GetBoundingRect(self.item, True) + "\n")
681        #        pass
682         event.Skip()
683
684
685     def OnSelChanging(self, event):
686
687         item = event.GetItem()
688         olditem = event.GetOldItem()
689         
690         if item:
691             if not olditem:
692                 olditemtext = "None"
693             else:
694                 olditemtext = self.GetItemText(olditem)
695             self.log.info("OnSelChanging: From %s" % olditemtext + " To %s" % self.GetItemText(item) + "\n")
696                 
697         event.Skip()
698
699
700     def OnBeginDrag(self, event):
701
702         self.item = event.GetItem()
703         if self.item:
704             self.log.info("Beginning Drag..." + "\n")
705
706             event.Allow()
707
708
709     def OnBeginRDrag(self, event):
710
711         self.item = event.GetItem()
712         if self.item:
713             self.log.info("Beginning Right Drag..." + "\n")
714
715             event.Allow()
716         
717
718     def OnEndDrag(self, event):
719
720         self.item = event.GetItem()
721         if self.item:
722             self.log.info("Ending Drag!" + "\n")
723
724         event.Skip()            
725
726
727     def OnDeleteItem(self, event):
728
729         item = event.GetItem()
730
731         if not item:
732             return
733
734         self.log.info("Deleting Item: %s" % self.GetItemText(item) + "\n")
735         event.Skip()
736         
737
738     def OnItemCheck(self, event):
739
740         item = event.GetItem()
741         self.log.info("Item " + self.GetItemText(item) + " Has Been Checked!\n")
742         event.Skip()
743
744
745     def OnItemChecking(self, event):
746
747         item = event.GetItem()
748         self.log.info("Item " + self.GetItemText(item) + " Is Being Checked...\n")
749         event.Skip()
750         
751
752     def OnToolTip(self, event):
753
754         item = event.GetItem()
755         if item:
756             event.SetToolTip(wx.ToolTip(self.GetItemText(item)))
757
758
759     def OnItemMenu(self, event):
760
761         item = event.GetItem()
762         if item:
763             self.log.info("OnItemMenu: %s" % self.GetItemText(item) + "\n")
764     
765         event.Skip()
766
767
768     def OnKey(self, event):
769
770         keycode = event.GetKeyCode()
771         keyname = keyMap.get(keycode, None)
772                 
773         if keycode == wx.WXK_BACK:
774             self.log.info("OnKeyDown: HAHAHAHA! I Vetoed Your Backspace! HAHAHAHA\n")
775             return
776
777         if keyname is None:
778             if "unicode" in wx.PlatformInfo:
779                 keycode = event.GetUnicodeKey()
780                 if keycode <= 127:
781                     keycode = event.GetKeyCode()
782                 keyname = "\"" + unichr(event.GetUnicodeKey()) + "\""
783                 if keycode < 27:
784                     keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
785                 
786             elif keycode < 256:
787                 if keycode == 0:
788                     keyname = "NUL"
789                 elif keycode < 27:
790                     keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
791                 else:
792                     keyname = "\"%s\"" % chr(keycode)
793             else:
794                 keyname = "unknown (%s)" % keycode
795                 
796         self.log.info("OnKeyDown: You Pressed '" + keyname + "'\n")
797
798         event.Skip()
799         
800         
801     def OnActivate(self, event):
802         
803         if self.item:
804             self.log.info("OnActivate: %s" % self.GetItemText(self.item) + "\n")
805
806         event.Skip()
807
808         
809     def OnHyperLink(self, event):
810
811         item = event.GetItem()
812         if item:
813             self.log.info("OnHyperLink: %s" % self.GetItemText(self.item) + "\n")
814             
815
816     def OnTextCtrl(self, event):
817
818         char = chr(event.GetKeyCode())
819         self.log.info("EDITING THE TEXTCTRL: You Wrote '" + char + \
820                        "' (KeyCode = " + str(event.GetKeyCode()) + ")\n")
821         event.Skip()
822
823
824     def OnComboBox(self, event):
825
826         selection = event.GetEventObject().GetValue()
827         self.log.info("CHOICE FROM COMBOBOX: You Chose '" + selection + "'\n")
828         event.Skip()