...
[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             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) :
528         uuid = parametres['corpus']
529         if itemParent is None :
530             itemParent = self.root
531         child, cookie = self.GetFirstChild(itemParent)
532         while child :
533             pydata = self.GetPyData(child)
534             if pydata['uuid'] == uuid :
535                 corpus = child
536                 break
537             self.GiveFocus(child, uuid)
538             child, cookie = self.GetNextChild(itemParent, cookie)
539         item = self.AppendItem(corpus, parametres['name'])
540         self.SetPyData(item, parametres)
541         self.SetItemImage(item, 24, CT.TreeItemIcon_Normal)
542         self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
543         self.SetItemBold(item, True)
544         
545     def OnItemAppend(self, item):
546         child = self.AppendItem(self.root, item['corpus_name'])
547         self.SetPyData(child, item)
548         self.history.addtab(item)
549         self.SetItemImage(child, 24, CT.TreeItemIcon_Normal)
550         self.SetItemImage(child, 13, CT.TreeItemIcon_Expanded)
551         self.SetItemBold(child, True)
552         
553         #dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
554
555         #if dlg.ShowModal() == wx.ID_OK:
556         #    newname = dlg.GetValue()
557         #    newitem = self.AppendItem(self.current, newname)
558         #    self.EnsureVisible(newitem)
559         
560
561         #dlg.Destroy()
562         
563
564     def OnBeginEdit(self, event):
565         
566         #self.log.info("OnBeginEdit" + "\n")
567         # show how to prevent edit...
568         item = event.GetItem()
569         if item and self.GetItemText(item) == "The Root Item":
570             wx.Bell()
571             #self.log.info("You can't edit this one..." + "\n")
572
573             # Lets just see what's visible of its children
574             cookie = 0
575             root = event.GetItem()
576             (child, cookie) = self.GetFirstChild(root)
577
578             while child:
579                 #self.log.info("Child [%s] visible = %d" % (self.GetItemText(child), self.IsVisible(child)) + "\n")
580                 (child, cookie) = self.GetNextChild(root, cookie)
581
582             event.Veto()
583
584
585     def OnEndEdit(self, event):
586         
587         #self.log.info("OnEndEdit: %s %s" %(event.IsEditCancelled(), event.GetLabel()))
588         # show how to reject edit, we'll not allow any digits
589         for x in event.GetLabel():
590             if x in string.digits:
591                 #self.log.info(", You can't enter digits..." + "\n")
592                 event.Veto()
593                 return
594             
595         self.log.info("\n")
596
597
598     def OnLeftDClick(self, event):
599         
600         pt = event.GetPosition()
601         item, flags = self.HitTest(pt)
602         pydata = self.GetPyData(item)
603         if pydata['uuid'] in self.parent.history.opened :
604             for i in range(self.parent.nb.GetPageCount()) :
605                 page = self.parent.nb.GetPage(i)
606                 if 'parametres' in dir(page) :
607                     if page.parametres['uuid'] == pydata['uuid'] :
608                         self.parent.nb.SetSelection(i)
609                         break
610         else :
611             OpenAnalyse(self.parent, pydata)
612             self.SetItemBold(item, True)
613         #if item and (flags & CT.TREE_HITTEST_ONITEMLABEL):
614         #    if self.GetAGWWindowStyleFlag() & CT.TR_EDIT_LABELS:
615         #        self.log.info("OnLeftDClick: %s (manually starting label edit)"% self.GetItemText(item) + "\n")
616                 
617                 #self.EditLabel(item)
618         #    else:
619         #        pydata = self.GetPyData(item)
620         #        print pydata
621         #        self.log.info("OnLeftDClick: Cannot Start Manual Editing, Missing Style TR_EDIT_LABELS\n")
622
623         event.Skip()                
624         
625
626     def OnItemExpanded(self, event):
627         
628         item = event.GetItem()
629         if item:
630             self.log.info("OnItemExpanded: %s" % self.GetItemText(item) + "\n")
631
632
633     def OnItemExpanding(self, event):
634         
635         item = event.GetItem()
636         if item:
637             self.log.info("OnItemExpanding: %s" % self.GetItemText(item) + "\n")
638             
639         event.Skip()
640
641         
642     def OnItemCollapsed(self, event):
643
644         item = event.GetItem()
645         if item:
646             self.log.info("OnItemCollapsed: %s" % self.GetItemText(item) + "\n")
647             
648
649     def OnItemCollapsing(self, event):
650
651         item = event.GetItem()
652         if item:
653             self.log.info("OnItemCollapsing: %s" % self.GetItemText(item) + "\n")
654     
655         event.Skip()
656
657         
658     def OnSelChanged(self, event):
659         item = event.GetItem()
660         pydata = self.GetPyData(item)
661         if pydata is not None :
662             if pydata['uuid'] in self.parent.history.opened :
663                 for i in range(self.parent.nb.GetPageCount()) :
664                     page = self.parent.nb.GetPage(i)
665                     if 'parametres' in dir(page) :
666                         if page.parametres['uuid'] == pydata['uuid'] :
667                             self.parent.nb.SetSelection(i)
668                             break
669
670         #self.item = event.GetItem()
671         #if self.item:
672         #    self.
673             #self.log.info("OnSelChanged: %s" % self.GetItemText(self.item))
674         #    if wx.Platform == '__WXMSW__':
675                # self.log.info(", BoundingRect: %s" % self.GetBoundingRect(self.item, True) + "\n")
676        #        pass
677         event.Skip()
678
679
680     def OnSelChanging(self, event):
681
682         item = event.GetItem()
683         olditem = event.GetOldItem()
684         
685         if item:
686             if not olditem:
687                 olditemtext = "None"
688             else:
689                 olditemtext = self.GetItemText(olditem)
690             self.log.info("OnSelChanging: From %s" % olditemtext + " To %s" % self.GetItemText(item) + "\n")
691                 
692         event.Skip()
693
694
695     def OnBeginDrag(self, event):
696
697         self.item = event.GetItem()
698         if self.item:
699             self.log.info("Beginning Drag..." + "\n")
700
701             event.Allow()
702
703
704     def OnBeginRDrag(self, event):
705
706         self.item = event.GetItem()
707         if self.item:
708             self.log.info("Beginning Right Drag..." + "\n")
709
710             event.Allow()
711         
712
713     def OnEndDrag(self, event):
714
715         self.item = event.GetItem()
716         if self.item:
717             self.log.info("Ending Drag!" + "\n")
718
719         event.Skip()            
720
721
722     def OnDeleteItem(self, event):
723
724         item = event.GetItem()
725
726         if not item:
727             return
728
729         self.log.info("Deleting Item: %s" % self.GetItemText(item) + "\n")
730         event.Skip()
731         
732
733     def OnItemCheck(self, event):
734
735         item = event.GetItem()
736         self.log.info("Item " + self.GetItemText(item) + " Has Been Checked!\n")
737         event.Skip()
738
739
740     def OnItemChecking(self, event):
741
742         item = event.GetItem()
743         self.log.info("Item " + self.GetItemText(item) + " Is Being Checked...\n")
744         event.Skip()
745         
746
747     def OnToolTip(self, event):
748
749         item = event.GetItem()
750         if item:
751             event.SetToolTip(wx.ToolTip(self.GetItemText(item)))
752
753
754     def OnItemMenu(self, event):
755
756         item = event.GetItem()
757         if item:
758             self.log.info("OnItemMenu: %s" % self.GetItemText(item) + "\n")
759     
760         event.Skip()
761
762
763     def OnKey(self, event):
764
765         keycode = event.GetKeyCode()
766         keyname = keyMap.get(keycode, None)
767                 
768         if keycode == wx.WXK_BACK:
769             self.log.info("OnKeyDown: HAHAHAHA! I Vetoed Your Backspace! HAHAHAHA\n")
770             return
771
772         if keyname is None:
773             if "unicode" in wx.PlatformInfo:
774                 keycode = event.GetUnicodeKey()
775                 if keycode <= 127:
776                     keycode = event.GetKeyCode()
777                 keyname = "\"" + unichr(event.GetUnicodeKey()) + "\""
778                 if keycode < 27:
779                     keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
780                 
781             elif keycode < 256:
782                 if keycode == 0:
783                     keyname = "NUL"
784                 elif keycode < 27:
785                     keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
786                 else:
787                     keyname = "\"%s\"" % chr(keycode)
788             else:
789                 keyname = "unknown (%s)" % keycode
790                 
791         self.log.info("OnKeyDown: You Pressed '" + keyname + "'\n")
792
793         event.Skip()
794         
795         
796     def OnActivate(self, event):
797         
798         if self.item:
799             self.log.info("OnActivate: %s" % self.GetItemText(self.item) + "\n")
800
801         event.Skip()
802
803         
804     def OnHyperLink(self, event):
805
806         item = event.GetItem()
807         if item:
808             self.log.info("OnHyperLink: %s" % self.GetItemText(self.item) + "\n")
809             
810
811     def OnTextCtrl(self, event):
812
813         char = chr(event.GetKeyCode())
814         self.log.info("EDITING THE TEXTCTRL: You Wrote '" + char + \
815                        "' (KeyCode = " + str(event.GetKeyCode()) + ")\n")
816         event.Skip()
817
818
819     def OnComboBox(self, event):
820
821         selection = event.GetEventObject().GetValue()
822         self.log.info("CHOICE FROM COMBOBOX: You Chose '" + selection + "'\n")
823         event.Skip()