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