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