...
[iramuteq] / tree.py
1 # -*- coding: utf-8 -*-
2 #Author: Pierre Ratinaud
3 #Copyright (c) 2012, Pierre Ratinaud
4 #License: GNU GPL
5
6 import wx
7 import os
8 import webbrowser
9 import wx.lib.agw.customtreectrl as CT
10 import logging
11 from openanalyse import OpenAnalyse
12 from corpus import Corpus, copycorpus
13 from tableau import Tableau, copymatrix
14 from functions import DoConf, GetTxtProfile, TGen
15 from profile_segment import ProfileSegment, ProfilType
16 from search_tools import SearchFrame
17 from dialog import PrefSimpleFile, PrefExport
18 from layout import open_antiprofil, TgenLayout
19 from guifunct import TGenFrame
20 from textaslexico import TgenSpec
21
22 log = logging.getLogger('iramuteq.tree')
23
24 class InfoDialog ( wx.Dialog ):
25     
26     def __init__( self, parent, txt, parametres ):
27         wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = u"Informations", pos = wx.DefaultPosition, size = wx.DefaultSize, style = wx.DEFAULT_DIALOG_STYLE )
28         if len(parametres) > 30 :
29             nb = 4
30         else :
31             nb = 2       
32         self.SetSizeHintsSz( wx.Size( 500,200 ), wx.DefaultSize )
33         
34         bSizer1 = wx.BoxSizer( wx.VERTICAL )
35         
36         self.m_panel2 = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
37         bSizer2 = wx.BoxSizer( wx.VERTICAL )
38         
39         self.m_staticText4 = wx.StaticText( self.m_panel2, wx.ID_ANY, txt, wx.DefaultPosition, wx.DefaultSize, 0 )
40         self.m_staticText4.Wrap( -1 )
41         bSizer2.Add( self.m_staticText4, 0, wx.ALL, 5 )
42         
43         
44         self.m_panel2.SetSizer( bSizer2 )
45         self.m_panel2.Layout()
46         bSizer2.Fit( self.m_panel2 )
47         bSizer1.Add( self.m_panel2, 0, wx.EXPAND |wx.ALL, 5 )
48         
49         self.m_panel1 = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
50
51         fgSizer1 = wx.FlexGridSizer( 0, nb, 0, 0 )
52         fgSizer1.SetFlexibleDirection( wx.BOTH )
53         fgSizer1.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED )
54         
55         txtctrl = []
56         for val in parametres :
57             fgSizer1.Add( wx.StaticText( self.m_panel1, wx.ID_ANY, val[0], wx.DefaultPosition, wx.DefaultSize, 0 ), 0, wx.ALL, 0)
58             #fgSizer1.Add( wx.StaticText( self.m_panel1, wx.ID_ANY, val[1], wx.DefaultPosition, wx.DefaultSize, 0 ), 0, wx.ALL, 0)
59             txtctrl.append( wx.TextCtrl( self.m_panel1, wx.ID_ANY, val[1], wx.DefaultPosition, (450, 20), wx.TE_READONLY ) )
60             txtctrl[-1].SetBackgroundColour('#DDE8EB')
61             #wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT))
62             fgSizer1.Add( txtctrl[-1], 0, wx.ALL|wx.EXPAND, 0)
63             #fgSizer1.Add( wx.StaticLine( self.m_panel1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL ), 0, wx.EXPAND |wx.ALL, 0)
64             #fgSizer1.Add( wx.StaticLine( self.m_panel1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL ), 0, wx.EXPAND|wx.ALL, 0)
65
66         self.m_panel1.SetSizer( fgSizer1 )
67         self.m_panel1.Layout()
68         fgSizer1.Fit( self.m_panel1 )
69         bSizer1.Add( self.m_panel1, 0, wx.EXPAND|wx.ALL, 3 )
70         
71         m_sdbSizer1 = wx.StdDialogButtonSizer()
72         self.m_sdbSizer1OK = wx.Button( self, wx.ID_OK )
73         m_sdbSizer1.AddButton( self.m_sdbSizer1OK )
74         m_sdbSizer1.Realize();
75         
76         bSizer1.Add( m_sdbSizer1, 0, wx.EXPAND, 5 )
77         
78         
79         self.SetSizer( bSizer1 )
80         self.Layout()
81         bSizer1.Fit( self )
82         
83         self.Centre( wx.BOTH )
84     
85     def __del__( self ):
86         pass
87
88
89 class LeftTree(CT.CustomTreeCtrl):
90
91     def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition,
92                  size=wx.DefaultSize,
93                  style=wx.SUNKEN_BORDER|wx.WANTS_CHARS,
94                  agwStyle=CT.TR_HIDE_ROOT|CT.TR_HAS_BUTTONS|CT.TR_HAS_VARIABLE_ROW_HEIGHT):
95
96         CT.CustomTreeCtrl.__init__(self, parent, id, pos, size, style, agwStyle)
97         self.log = log
98         alldata = dir(CT)
99         treestyles = []
100         events = []
101         for data in alldata:
102             if data.startswith("TR_"):
103                 treestyles.append(data)
104             elif data.startswith("EVT_"):
105                 events.append(data)
106         self.parent = parent
107         self.events = events
108         self.styles = treestyles
109         self.item = None
110         
111         self.il = wx.ImageList(16, 16)
112         self.ild = {}
113         imgtextroot = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'textroot.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
114         self.ild['alceste'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'reinert.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
115         self.ild['corpus'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'textcorpus.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
116         self.ild['wordcloud'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'wordcloud.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
117         self.ild['stat'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'stats.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
118         self.ild['simitxt'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'simitxt.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
119         self.ild['clustersimitxt'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'clustersimitxt.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
120         self.ild['clustercloud'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'clustercloud.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
121         self.ild['spec'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'spec.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
122         imgmatroot = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'matroot.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
123         self.ild['matrix'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'matrix.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
124         self.ild['freq'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'frequences.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
125         self.ild['chi2'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'chi2.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
126         self.ild['reinertmatrix'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'reinertmatrix.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
127         self.ild['simimatrix'] = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'simimatrix.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
128         self.SetImageList(self.il)
129         
130         self.count = 0
131         self.log = log
132
133         self.history = parent.history
134         self.h = self.history.history
135         self.root = self.AddRoot("Iramuteq")
136         
137         if not(self.GetAGWWindowStyleFlag() & CT.TR_HIDE_ROOT):
138             self.SetPyData(self.root, None)
139             self.SetItemImage(self.root, 24, CT.TreeItemIcon_Normal)
140             self.SetItemImage(self.root, 13, CT.TreeItemIcon_Expanded)
141         
142         self.textroot = self.AppendItem(self.root, u'Corpus texte')
143         self.SetPyData(self.textroot, {'uuid': 'textroot'})
144         self.SetItemImage(self.textroot, imgtextroot, CT.TreeItemIcon_Normal)
145         self.SetItemImage(self.textroot, imgtextroot, CT.TreeItemIcon_Expanded)     
146
147         for corpus in reversed(self.h) :
148             child = self.AppendItem(self.textroot, corpus['corpus_name'])
149             self.SetPyData(child, corpus)
150             self.SetItemImage(child, self.ild['corpus'], CT.TreeItemIcon_Normal)
151             self.SetItemImage(child, self.ild['corpus'], CT.TreeItemIcon_Expanded)
152
153             if 'analyses' in corpus :
154                 for y in corpus['analyses'] :
155                     last = self.AppendItem(child, y['name'], ct_type=0)
156                     self.SetPyData(last, y)
157                     if y['type'] in self.ild :
158                         img = self.ild[y['type']]
159                     else :
160                         img = 24
161                     self.SetItemImage(last, img, CT.TreeItemIcon_Normal)
162                     self.SetItemImage(last, 13, CT.TreeItemIcon_Expanded)
163
164         self.matroot = self.AppendItem(self.root, u'Matrices')
165         self.SetPyData(self.matroot, {'uuid': 'matroot'})
166         self.SetItemImage(self.matroot, imgmatroot, CT.TreeItemIcon_Normal)
167         self.SetItemImage(self.matroot, imgmatroot, CT.TreeItemIcon_Expanded)
168         
169         orphmat = []
170         for matrix in reversed(self.history.matrix) :
171             if 'matrix_name' in matrix :
172                 child = self.AppendItem(self.matroot, matrix['matrix_name'])
173                 self.SetPyData(child, matrix)
174                 self.SetItemImage(child, self.ild['matrix'], CT.TreeItemIcon_Normal)
175                 self.SetItemImage(child, self.ild['matrix'], CT.TreeItemIcon_Expanded)
176                 if 'analyses' in matrix :
177                     for y in matrix['analyses'] :
178                         last = self.AppendItem(child, y['name'], ct_type=0)
179                         self.SetPyData(last, y)
180                         if y['type'] in self.ild :
181                             img = self.ild[y['type']]
182                         else :
183                             img = 24
184                         self.SetItemImage(last, img, CT.TreeItemIcon_Normal)
185                         self.SetItemImage(last, 13, CT.TreeItemIcon_Expanded)
186             else :
187                 orphmat.append(matrix)     
188
189         self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDClick)
190         #self.Bind(wx.EVT_IDLE, self.OnIdle)
191
192         self.eventdict = {'EVT_TREE_BEGIN_DRAG': self.OnBeginDrag, 'EVT_TREE_BEGIN_LABEL_EDIT': self.OnBeginEdit,
193                           'EVT_TREE_BEGIN_RDRAG': self.OnBeginRDrag, 'EVT_TREE_DELETE_ITEM': self.OnDeleteItem,
194                           'EVT_TREE_END_DRAG': self.OnEndDrag, 'EVT_TREE_END_LABEL_EDIT': self.OnEndEdit,
195                           'EVT_TREE_ITEM_ACTIVATED': self.OnActivate, 'EVT_TREE_ITEM_CHECKED': self.OnItemCheck,
196                           'EVT_TREE_ITEM_CHECKING': self.OnItemChecking, 'EVT_TREE_ITEM_COLLAPSED': self.OnItemCollapsed,
197                           'EVT_TREE_ITEM_COLLAPSING': self.OnItemCollapsing, 'EVT_TREE_ITEM_EXPANDED': self.OnItemExpanded,
198                           'EVT_TREE_ITEM_EXPANDING': self.OnItemExpanding, 'EVT_TREE_ITEM_GETTOOLTIP': self.OnToolTip,
199                           'EVT_TREE_ITEM_MENU': self.OnItemMenu, 'EVT_TREE_ITEM_RIGHT_CLICK': self.OnRightDown,
200                           'EVT_TREE_KEY_DOWN': self.OnKey, 'EVT_TREE_SEL_CHANGED': self.OnSelChanged,
201                           'EVT_TREE_SEL_CHANGING': self.OnSelChanging, "EVT_TREE_ITEM_HYPERLINK": self.OnHyperLink}
202
203         mainframe = wx.GetTopLevelParent(self)
204         
205         if not hasattr(mainframe, "leftpanel"):
206             #self.Bind(CT.EVT_TREE_ITEM_EXPANDED, self.OnItemExpanded)
207             #self.Bind(CT.EVT_TREE_ITEM_COLLAPSED, self.OnItemCollapsed)
208             self.Bind(CT.EVT_TREE_SEL_CHANGED, self.OnSelChanged)
209             self.Bind(CT.EVT_TREE_SEL_CHANGING, self.OnSelChanging)
210             self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
211             self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp)
212         else:
213             for combos in mainframe.treeevents:
214                 self.BindEvents(combos)
215
216         if hasattr(mainframe, "leftpanel"):
217             self.ChangeStyle(mainframe.treestyles)
218
219         if not(self.GetAGWWindowStyleFlag() & CT.TR_HIDE_ROOT):
220             self.SelectItem(self.root)
221             self.Expand(self.root)
222
223
224     def BindEvents(self, choice, recreate=False):
225
226         value = choice.GetValue()
227         text = choice.GetLabel()
228         
229         evt = "CT." + text
230         binder = self.eventdict[text]
231
232         if value == 1:
233             if evt == "CT.EVT_TREE_BEGIN_RDRAG":
234                 self.Bind(wx.EVT_RIGHT_DOWN, None)
235                 self.Bind(wx.EVT_RIGHT_UP, None)
236             self.Bind(eval(evt), binder)
237         else:
238             self.Bind(eval(evt), None)
239             if evt == "CT.EVT_TREE_BEGIN_RDRAG":
240                 self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
241                 self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp)
242
243
244     def ChangeStyle(self, combos):
245
246         style = 0
247         for combo in combos:
248             if combo.GetValue() == 1:
249                 style = style | eval("CT." + combo.GetLabel())
250
251         if self.GetAGWWindowStyleFlag() != style:
252             self.SetAGWWindowStyleFlag(style)
253             
254
255     def OnCompareItems(self, item1, item2):
256         
257         t1 = self.GetItemText(item1)
258         t2 = self.GetItemText(item2)
259         
260
261         if t1 < t2:
262             return -1
263         if t1 == t2:
264             return 0
265
266         return 1
267
268     
269     def OnIdle(self, event):
270
271     #    if self.gauge:
272     #        try:
273     #            if self.gauge.IsEnabled() and self.gauge.IsShown():
274     #                self.count = self.count + 1
275
276     #                if self.count >= 50:
277     #                    self.count = 0
278
279     #                self.gauge.SetValue(self.count)
280
281     #        except:
282     #            self.gauge = None
283
284         event.Skip()
285
286
287     def CloseItem(self, itemParent = None, uuid = None) :
288         if itemParent is None :
289             itemParent = self.root
290         child, cookie = self.GetFirstChild(itemParent)
291         while child :
292             pydata = self.GetPyData(child)
293             if pydata['uuid'] == uuid :
294                 self.SetItemBold(child, False)
295                 break
296             self.CloseItem(child, uuid)
297             child, cookie = self.GetNextChild(itemParent, cookie)
298
299     def GiveFocus(self, itemParent = None, uuid = None, bold = False) :
300         if itemParent is None :
301             itemParent = self.root
302         child, cookie = self.GetFirstChild(itemParent)
303         while child :
304             pydata = self.GetPyData(child)
305             if pydata['uuid'] == uuid :
306                 self.SelectItem(child)
307                 if bold :
308                     self.SetItemBold(child, True)
309                 return
310             self.GiveFocus(child, uuid, bold)
311             child, cookie = self.GetNextChild(itemParent, cookie)
312
313     def IsInTree(self, itemParent = None, uuid = None) :
314         if itemParent is None :
315             itemParent = self.root
316         child, cookie = self.GetFirstChild(itemParent)
317         
318         while child :
319             pydata = self.GetPyData(child)
320             if pydata['uuid'] == uuid :
321                 return True
322             self.GiveFocus(child, uuid)
323             child, cookie = self.GetNextChild(itemParent, cookie)
324         return False
325
326
327     def OnRightDown(self, event):
328         
329         pt = event.GetPosition()
330         item, flags = self.HitTest(pt)
331
332         if item:
333             self.item = item
334             #self.log.info("OnRightClick: %s, %s, %s" % (self.GetItemText(item), type(item), item.__class__) + "\n")
335             self.SelectItem(item)
336
337
338     def OnRightUp(self, event):
339
340         item = self.item
341         
342         if not item:
343             event.Skip()
344             return
345
346         if not self.IsItemEnabled(item):
347             event.Skip()
348             return
349
350         # Item Text Appearance
351         ishtml = self.IsItemHyperText(item)
352         back = self.GetItemBackgroundColour(item)
353         fore = self.GetItemTextColour(item)
354         isbold = self.IsBold(item)
355         font = self.GetItemFont(item)
356
357         # Icons On Item
358         normal = self.GetItemImage(item, CT.TreeItemIcon_Normal)
359         selected = self.GetItemImage(item, CT.TreeItemIcon_Selected)
360         expanded = self.GetItemImage(item, CT.TreeItemIcon_Expanded)
361         selexp = self.GetItemImage(item, CT.TreeItemIcon_SelectedExpanded)
362
363         # Enabling/Disabling Windows Associated To An Item
364         haswin = self.GetItemWindow(item)
365
366         # Enabling/Disabling Items
367         enabled = self.IsItemEnabled(item)
368
369         # Generic Item's Info
370         children = self.GetChildrenCount(item)
371         itemtype = self.GetItemType(item)
372         text = self.GetItemText(item)
373         pydata = self.GetPyData(item)
374         self.pydata = pydata
375         
376         self.current = item
377         self.itemdict = {"ishtml": ishtml, "back": back, "fore": fore, "isbold": isbold,
378                          "font": font, "normal": normal, "selected": selected, "expanded": expanded,
379                          "selexp": selexp, "haswin": haswin, "children": children,
380                          "itemtype": itemtype, "text": text, "pydata": pydata, "enabled": enabled}
381         
382         if not item in [self.textroot, self.matroot] :
383             menu = wx.Menu()
384             info = menu.Append(wx.ID_ANY, "Informations")
385             menu.AppendSeparator()
386     
387             if 'corpus_name' in pydata :
388                 stat = menu.Append(wx.ID_ANY, _(u"Statistics").decode('utf8'))
389                 spec = menu.Append(wx.ID_ANY, _(u"Specificities and CA").decode('utf8'))
390                 classification = wx.Menu()
391                 reinert = classification.Append(wx.ID_ANY, _(u"Reinert method").decode('utf8'))
392                 #pam = classification.Append(wx.ID_ANY, u"Par matrice des distances")
393                 menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), classification)
394                 simi = menu.Append(wx.ID_ANY, _(u"Similarities analysis").decode('utf8'))
395                 wdc = menu.Append(wx.ID_ANY, _(u"Wordcloud").decode('utf8'))
396                 subcorpus = wx.Menu()
397                 subcorpusfrommeta = subcorpus.Append(wx.ID_ANY, _(u'Sub corpora from metadata').decode('utf8'))
398                 subcorpusfromtheme = subcorpus.Append(wx.ID_ANY, _(u'Sub corpora from thematic').decode('utf8'))
399                 menu.AppendMenu(-1, _(u"SubCorpora").decode('utf8'), subcorpus)
400                 menu.AppendSeparator()
401                 self.Bind(wx.EVT_MENU, self.OnReinert, reinert)
402                 #self.Bind(wx.EVT_MENU, self.OnPam, pam)
403                 self.Bind(wx.EVT_MENU, self.OnStat, stat)
404                 self.Bind(wx.EVT_MENU, self.OnSpec, spec)
405                 self.Bind(wx.EVT_MENU, self.OnSimiTxt, simi)
406                 self.Bind(wx.EVT_MENU, self.OnWordCloud, wdc)
407                 self.Bind(wx.EVT_MENU, self.OnSubTextFromMeta, subcorpusfrommeta)
408                 self.Bind(wx.EVT_MENU, self.OnSubTextFromTheme, subcorpusfromtheme)
409             elif 'matrix_name' in pydata :
410                 freq = menu.Append(wx.ID_ANY, _(u"Frequency").decode('utf8'))
411                 chi2 = menu.Append(wx.ID_ANY, _(u"Chi square").decode('utf8'))
412                 chdreinert = menu.Append(wx.ID_ANY, _(u"Reinert clustering").decode('utf8'))
413                 simi = menu.Append(wx.ID_ANY, _(u"Similarity analysis").decode('utf8'))
414                 menu.AppendSeparator()
415                 self.Bind(wx.EVT_MENU, self.OnFreq, freq)
416                 self.Bind(wx.EVT_MENU, self.OnChiSquare, chi2)
417                 self.Bind(wx.EVT_MENU, self.OnSimiTab, simi)
418                 self.Bind(wx.EVT_MENU, self.OnCHDReinert, chdreinert)
419             elif pydata.get('type', False) == 'alceste' and pydata['uuid'] in self.parent.history.opened :
420                 openmenu = wx.Menu()
421                 antipro = openmenu.Append(wx.ID_ANY, _(u"antiprofiles").decode('utf8'))
422                 menu.AppendMenu(wx.ID_ANY, _(u"Open ...").decode('utf8'), openmenu)
423     
424                 profsr = menu.Append(wx.ID_ANY, _(u"Repeated segments profiles").decode('utf8'))
425                 profgram = menu.Append(wx.ID_ANY, _(u"POS profiles").decode('utf8'))
426                 export_corpus = menu.Append(wx.ID_ANY, _(u"Export corpora").decode('utf8'))
427                 colored = menu.Append(wx.ID_ANY, _(u"Colored corpora").decode('utf8'))
428                 navig = menu.Append(wx.ID_ANY, _(u"Navigator").decode('utf8'))
429                 statclasse = menu.Append(wx.ID_ANY, _(u"Clusters statistics").decode('utf8'))
430                 rapport = menu.Append(wx.ID_ANY, _(u"Report").decode('utf8'))
431                 export_classes = menu.Append(wx.ID_ANY, _(u"Exports Clusters").decode('utf8'))
432                 menu.AppendSeparator()
433                 self.Bind(wx.EVT_MENU, self.OpenAntipro, antipro)
434                 self.Bind(wx.EVT_MENU, self.OnProfSR, profsr)
435                 self.Bind(wx.EVT_MENU, self.OnProfGram, profgram)
436                 self.Bind(wx.EVT_MENU, self.OnExportCorpus, export_corpus)
437                 self.Bind(wx.EVT_MENU, self.OnColored, colored)
438                 self.Bind(wx.EVT_MENU, self.OnNavig, navig)
439                 self.Bind(wx.EVT_MENU, self.StatClasse, statclasse)
440                 self.Bind(wx.EVT_MENU, self.OnRapport, rapport)
441                 self.Bind(wx.EVT_MENU, self.OnExportClasses, export_classes)
442             elif pydata.get('type', False) == 'stat'  and pydata['uuid'] in self.parent.history.opened :
443                 export_dictionary =  menu.Append(wx.ID_ANY, _(u"Export dictionary").decode('utf8'))
444                 export_lems =  menu.Append(wx.ID_ANY, _(u"Export lemma dictionary").decode('utf8'))
445                 self.Bind(wx.EVT_MENU, self.OnExportDictionary, export_dictionary)
446                 self.Bind(wx.EVT_MENU, self.OnExportLems, export_lems)
447                 menu.AppendSeparator()
448             elif pydata.get('type', False) == 'spec'  and pydata['uuid'] in self.parent.history.opened :
449                 tgen = menu.Append(wx.ID_ANY, _(u"Tgen Editor").decode('utf8'))
450                 computetgen = menu.Append(wx.ID_ANY, _(u"Compute Tgen").decode('utf8'))
451                 self.Bind(wx.EVT_MENU, self.OnTgenEditor, tgen)
452                 self.Bind(wx.EVT_MENU, self.OnTgenCompute, computetgen)
453                 menu.AppendSeparator()
454             elif pydata.get('type', False) == 'reinertmatrix' and pydata['uuid'] in self.parent.history.opened :
455                 openmenu = wx.Menu()
456                 antipro = openmenu.Append(wx.ID_ANY, _(u"antiprofiles").decode('utf8'))
457                 menu.AppendMenu(wx.ID_ANY, _(u"Open ...").decode('utf8'), openmenu)
458                 self.Bind(wx.EVT_MENU, self.OpenAntipro, antipro)
459     
460     
461             itemdelete = menu.Append(wx.ID_ANY, _(u"Delete from history").decode('utf8'))
462             #item11 = menu.Append(wx.ID_ANY, "Prepend An Item")
463             #item12 = menu.Append(wx.ID_ANY, "Append An Item")
464     
465             #self.Bind(wx.EVT_MENU, self.OnItemBackground, item1)
466             #self.Bind(wx.EVT_MENU, self.OnItemForeground, item2)
467             #self.Bind(wx.EVT_MENU, self.OnItemBold, item3)
468             #self.Bind(wx.EVT_MENU, self.OnItemFont, item4)
469             #self.Bind(wx.EVT_MENU, self.OnItemHyperText, item5)
470             #self.Bind(wx.EVT_MENU, self.OnEnableWindow, item6)
471             #self.Bind(wx.EVT_MENU, self.OnDisableItem, item7)
472             #self.Bind(wx.EVT_MENU, self.OnItemIcons, item8)
473             self.Bind(wx.EVT_MENU, self.OnItemInfo, info)
474             self.Bind(wx.EVT_MENU, self.OnItemDelete, itemdelete)
475             #self.Bind(wx.EVT_MENU, self.OnItemPrepend, item11)
476             #self.Bind(wx.EVT_MENU, self.OnItemAppend, item12)
477             
478             self.PopupMenu(menu)
479             menu.Destroy()
480
481     def getcorpus(self):
482         busy = wx.BusyInfo(_("Please wait...Reading corpus").decode('utf8'), self.parent)
483         wx.SafeYield()
484         if self.pydata['uuid'] in self.parent.history.openedcorpus :
485             corpus = copycorpus(self.parent.history.openedcorpus[self.pydata['uuid']])
486         elif 'corpus_name' in self.pydata :
487             corpus = Corpus(self.parent, parametres = DoConf(self.pydata['ira']).getoptions('corpus'), read = True)
488         else :
489             cuuid = self.pydata['corpus']
490             if cuuid in self.parent.history.openedcorpus :
491                 corpus = copycorpus(self.parent.history.openedcorpus[cuuid])
492             else :
493                 irapath = self.parent.history.corpus[cuuid]['ira']
494                 corpus = Corpus(self.parent, parametres = DoConf(irapath).getoptions('corpus'), read = True)
495         del busy
496         return corpus
497     
498     def getmatrix(self):
499         if 'matrix_name' in self.pydata :
500             matrix = Tableau(self.parent, parametres = DoConf(self.pydata['ira']).getoptions('matrix'))
501             matrix.open()
502             return copymatrix(matrix)
503         else :
504             cuuid = self.pydata['matrix']
505             matrix = Tableau(self.parent, parametres = DoConf(self.history.matrixanalyse[cuuid]['ira']).getoptions('matrix'))
506             matrix.open()
507             return copymatrix(matrix)
508
509     def OnSpec(self, evt) :
510         self.parent.OnTextSpec(evt, self.getcorpus())
511
512     def OnStat(self, evt) :
513         self.parent.OnTextStat(evt, self.getcorpus())
514         
515     def OnReinert(self, evt) :
516         self.parent.OnTextReinert(evt, self.getcorpus())
517
518     def OnPam(self, evt) :
519         self.parent.OnPamSimple(evt, self.getcorpus())
520
521     def OnSimiTxt(self, evt) :
522         self.parent.OnSimiTxt(evt, self.getcorpus())
523
524     def OnWordCloud(self, evt) :
525         self.parent.OnWordCloud(evt, self.getcorpus())
526     
527     def OnFreq(self, evt):
528         self.parent.OnFreq(evt, self.getmatrix())
529         
530     def OnChiSquare(self, evt):
531         self.parent.OnChi2(evt, self.getmatrix())
532         
533     def OnSimiTab(self, evt): 
534         self.parent.OnSimiTab(evt, self.getmatrix())
535         
536     def OnCHDReinert(self, evt):
537         self.parent.OnCHDReinert(evt, self.getmatrix())
538     
539     def OnSubTextFromMeta(self, evt):
540         self.parent.OnSubText(self.getcorpus(), parametres = {'frommeta' : True})
541     
542     def OnSubTextFromTheme(self, evt):
543         self.parent.OnSubText(self.getcorpus(), parametres = {'fromtheme' : True})    
544
545     def OnProfSR(self, evt) :
546         ProfileSegment(self.parent, self.page.dictpathout, self.page.parametres, self.page.corpus)
547
548     def OnProfGram(self, evt) :
549         ProfilType(self.parent, self.page.corpus, self.page.parametres)
550
551     def OnExportCorpus(self, evt) :
552         dial = PrefExport(self, self.parent)
553         dial.fbb.SetValue(os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'export_corpus.txt'))
554         dial.CenterOnParent()
555         res = dial.ShowModal()
556         if res == wx.ID_OK :
557             if dial.radio_type.GetSelection() == 0 : alc = True
558             else : alc = False
559             if dial.radio_lem.GetSelection() == 0 : lem = True
560             else : lem = False
561             if self.page.parametres['classif_mode'] != 2 :
562                 uci = False
563             else :
564                 uci = True
565             self.page.corpus.export_corpus_classes(dial.fbb.GetValue(), alc = alc, lem = lem, uci = uci)
566             msg = u"Fini !"
567             dial.Destroy()
568             dlg = wx.MessageDialog(self.parent, msg, u"Export", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
569             dlg.CenterOnParent()
570             dlg.ShowModal()
571             dlg.Destroy()
572
573     def OnColored(self, evt) :
574         dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.html', 'title': _(u"Colored corpora").decode('utf8')})
575         dial.fbb.SetValue(os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'corpus_couleur.html'))
576         dial.CenterOnParent()
577         res = dial.ShowModal()
578         if res == wx.ID_OK :
579             fileout = dial.fbb.GetValue()
580             dial.Destroy()
581             if self.page.parametres['classif_mode'] != 2 :
582                 uci = False
583             else :
584                 uci = True
585             txt = self.page.corpus.make_colored_corpus(uci = uci)
586             with open(fileout, 'w') as f :
587                 f.write(txt)
588             msg = ' !\n'.join([_(u"Done").decode('utf8'), _(u"Open in a web browser ?").decode('utf8')])
589             dlg = wx.MessageDialog(self.parent, msg, u"Corpus en couleur", wx.NO | wx.YES | wx.NO_DEFAULT | wx.ICON_QUESTION)
590             dlg.CenterOnParent()
591             if dlg.ShowModal() == wx.ID_YES :
592                 webbrowser.open(fileout)
593             dlg.Destroy()
594
595     def OnNavig(self, evt):
596         if 'FrameSearch' not in dir(self.page) :
597             self.page.FrameSearch = SearchFrame(self.parent, -1, _(u"Search ...").decode('utf8'), self.page.corpus)
598         self.page.FrameSearch.Show()
599
600     def StatClasse(self, evt):
601         dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.csv', 'title': _(u"Clusters statistics").decode('utf8')})
602         dial.fbb.SetValue( os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'stat_par_classe.csv'))
603         dial.CenterOnParent()
604         res = dial.ShowModal()
605         if res == wx.ID_OK :
606             fileout = dial.fbb.GetValue()
607             dial.Destroy()
608             self.page.corpus.get_stat_by_cluster(fileout)
609             msg = u"Fini !"
610             dlg = wx.MessageDialog(self.parent, msg, _(u"Clusters statistics").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
611             dlg.CenterOnParent()
612             if dlg.ShowModal() == wx.ID_OK :
613                 dlg.Destroy()        
614
615     def OpenAntipro(self, evt) :
616         find = False
617         for i in range(0, self.page.TabChdSim.GetPageCount()) :
618             page = self.page.TabChdSim.GetPage(i)
619             if self.page.TabChdSim.GetPageText(i) == _(u"Antiprofiles").decode('utf8') :
620                 self.page.TabChdSim.SetSelection(i)
621                 find = True
622                 break
623         if not find :
624             open_antiprofil(self.page, self.page.dictpathout['ANTIPRO_OUT'], self.parent.syscoding)
625             self.page.TabChdSim.SetSelection(self.page.TabChdSim.GetPageCount() - 1)
626
627     def OnRapport(self, evt) :
628         dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.txt', 'title': _(u"Report").decode('utf8')})
629         dial.fbb.SetValue(self.page.dictpathout['rapport'])
630         dial.CenterOnParent()
631         res = dial.ShowModal()
632         if res == wx.ID_OK :
633             fileout = dial.fbb.GetValue()
634             dial.Destroy()
635             with open(fileout, 'w') as f :
636                 f.write(self.page.debtext + '\n' + GetTxtProfile(self.page.DictProfile, self.page.cluster_size))
637             msg = u"Fini !"
638             dlg = wx.MessageDialog(self.parent, msg, _(u"Report").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
639             dlg.CenterOnParent()
640             dlg.ShowModal()
641             dlg.Destroy()
642         else :
643             dial.Destroy()
644
645     def OnExportDictionary(self, evt) :
646         corpus = self.page.corpus
647         corpus.export_dictionary(self.page.pathout['dictionary.csv'], self.parent.syscoding)
648         log.info('export dictionary %s' % self.page.pathout['dictionary.csv'])
649         dial = wx.MessageDialog(self.parent, self.page.pathout['dictionary.csv'], 'Export', wx.OK)
650         dial.ShowModal()
651         dial.Destroy()
652         
653     def OnExportLems(self, evt) :
654         corpus = self.page.corpus
655         corpus.export_lems(self.page.pathout['lemmes.csv'], self.parent.syscoding)
656         log.info('export lemmes %s' % self.page.pathout['lemmes.csv'])
657         dial = wx.MessageDialog(self.parent, self.page.pathout['lemmes.csv'], 'Export', wx.OK)
658         dial.ShowModal()
659         dial.Destroy()
660     
661     def OnTgenEditor(self, evt):
662         corpus = self.page.corpus
663         tgenpath = os.path.join(self.page.parametres['pathout'], 'tgen.csv')
664         tgen = TGen(path = tgenpath, encoding = self.parent.syscoding)
665         if os.path.exists(tgenpath) :
666             tgen.read(tgenpath)
667         if isinstance(evt, list) :
668             i = 0
669             while 'tgen%i' %i in tgen.tgen :
670                 i += 1
671             tgenname = 'tgen%i' %i
672             tgen.tgen[tgenname] = evt
673         tgenframe = TGenFrame(self.parent, corpus, tgen)
674         tgenframe.Show()
675         if isinstance(evt, list) :
676             tgenframe.OnNewTgen(None, tgen = tgenname)
677     
678     def OnTgenCompute(self, evt):
679         corpus = self.page.corpus
680         tgenpath = os.path.join(self.page.parametres['pathout'], 'tgen.csv')        
681         self.page.parametres['tgenpath'] = tgenpath
682         tgen = TGen(path = tgenpath, encoding = self.parent.syscoding)
683         self.page.parametres['etoiles'] = self.page.etoiles
684         TgenSpec(self.parent, corpus, self.page.parametres)
685         TgenLayout(self.page)
686     
687     def OnExportClasses(self, event):
688         corpus = self.page.corpus
689         if self.page.parametres['classif_mode'] != 2 :
690             uci = False
691         else :
692             uci = True
693         busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self.parent)
694         wx.SafeYield()
695         for i in range(1, self.page.parametres['clnb'] + 1) :
696             corpus.export_classe(self.page.pathout['classe_%i_export.txt' % i], i, uci = uci)
697         del busy
698         dial = wx.MessageDialog(self, self.page.pathout['classe_x_export.txt'], u"Export", wx.OK|wx.ICON_INFORMATION)
699         dial.ShowModal()
700         dial.Destroy()
701
702     def OnItemBackground(self, event):
703
704         colourdata = wx.ColourData()
705         colourdata.SetColour(self.itemdict["back"])
706         dlg = wx.ColourDialog(self, colourdata)
707         
708         dlg.GetColourData().SetChooseFull(True)
709
710         if dlg.ShowModal() == wx.ID_OK:
711             data = dlg.GetColourData()
712             col1 = data.GetColour().Get()
713             self.SetItemBackgroundColour(self.current, col1)
714         dlg.Destroy()
715
716
717     def OnItemForeground(self, event):
718
719         colourdata = wx.ColourData()
720         colourdata.SetColour(self.itemdict["fore"])
721         dlg = wx.ColourDialog(self, colourdata)
722         
723         dlg.GetColourData().SetChooseFull(True)
724
725         if dlg.ShowModal() == wx.ID_OK:
726             data = dlg.GetColourData()
727             col1 = data.GetColour().Get()
728             self.SetItemTextColour(self.current, col1)
729         dlg.Destroy()
730
731
732     def OnItemBold(self, event):
733
734         self.SetItemBold(self.current, not self.itemdict["isbold"])
735
736
737     def OnItemFont(self, event):
738
739         data = wx.FontData()
740         font = self.itemdict["font"]
741         
742         if font is None:
743             font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
744             
745         data.SetInitialFont(font)
746
747         dlg = wx.FontDialog(self, data)
748         
749         if dlg.ShowModal() == wx.ID_OK:
750             data = dlg.GetFontData()
751             font = data.GetChosenFont()
752             self.SetItemFont(self.current, font)
753
754         dlg.Destroy()
755         
756
757     def OnItemHyperText(self, event):
758
759         self.SetItemHyperText(self.current, not self.itemdict["ishtml"])
760
761
762     def OnEnableWindow(self, event):
763
764         enable = self.GetItemWindowEnabled(self.current)
765         self.SetItemWindowEnabled(self.current, not enable)
766
767
768     def OnDisableItem(self, event):
769
770         self.EnableItem(self.current, False)
771         
772
773     def OnItemIcons(self, event):
774
775         bitmaps = [self.itemdict["normal"], self.itemdict["selected"],
776                    self.itemdict["expanded"], self.itemdict["selexp"]]
777
778         wx.BeginBusyCursor()        
779         dlg = TreeIcons(self, -1, bitmaps=bitmaps)
780         wx.EndBusyCursor()
781         dlg.ShowModal()
782
783
784     def SetNewIcons(self, bitmaps):
785
786         self.SetItemImage(self.current, bitmaps[0], CT.TreeItemIcon_Normal)
787         self.SetItemImage(self.current, bitmaps[1], CT.TreeItemIcon_Selected)
788         self.SetItemImage(self.current, bitmaps[2], CT.TreeItemIcon_Expanded)
789         self.SetItemImage(self.current, bitmaps[3], CT.TreeItemIcon_SelectedExpanded)
790
791
792     def OnItemInfo(self, event):
793
794         itemtext = self.itemdict["text"]
795         numchildren = str(self.itemdict["children"])
796         itemtype = self.itemdict["itemtype"]
797         pydata = self.itemdict['pydata']
798         #if 'analyses' in pydata :
799         #    toshow = dict([[val, pydata[val]] for val in pydata if val not in['analyses', 'isload']])
800         #else :
801         toshow = pydata['ira']
802         toshow = DoConf(toshow).getoptions()
803         txt = DoConf().totext(toshow)
804         parametres = [val.split('\t\t:') for val in txt.splitlines()]
805         parametres.sort()
806
807         if itemtype == 0:
808             itemtype = "Normal"
809         elif itemtype == 1:
810             itemtype = "CheckBox"
811         else:
812             itemtype = "RadioButton"
813
814         dlg = InfoDialog(self, itemtext, parametres)
815         dlg.CenterOnParent()
816         dlg.ShowModal()
817         dlg.Destroy()
818                 
819         
820
821     def OnItemDelete(self, event):
822
823         strs = "Are You Sure You Want To Delete Item " + self.GetItemText(self.current) + "?"
824         dlg = wx.MessageDialog(None, strs, 'Deleting Item', wx.OK | wx.CANCEL | wx.ICON_QUESTION)
825
826         if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
827             dlg.Destroy()
828             return
829
830         dlg.Destroy()
831         
832         pydata = self.itemdict['pydata']
833         if 'corpus_name' in pydata :
834             self.history.delete(pydata, True)
835         else :
836             self.history.delete(pydata)
837         self.DeleteChildren(self.current)
838         self.Delete(self.current)
839         self.current = None
840         
841
842
843     def OnItemPrepend(self, event):
844
845         dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
846
847         if dlg.ShowModal() == wx.ID_OK:
848             newname = dlg.GetValue()
849             newitem = self.PrependItem(self.current, newname)
850             self.EnsureVisible(newitem)
851
852         dlg.Destroy()
853
854     def AddAnalyse(self, parametres, itemParent = None, bold = True) :
855         uuid = parametres.get('corpus', None)
856         if uuid is not None :
857             if itemParent is None :
858                 itemParent = self.textroot
859             child, cookie = self.GetFirstChild(itemParent)
860             corpus = None
861             while child :
862                 pydata = self.GetPyData(child)
863                 if pydata['uuid'] == uuid :
864                     corpus = child
865                     break
866                 self.GiveFocus(child, uuid)
867                 child, cookie = self.GetNextChild(itemParent, cookie)
868             #item = self.AppendItem(child, parametres['name'])
869             if corpus is not None : 
870                 item = self.AppendItem(corpus, parametres['name'])
871             else :
872                 item = self.AppendItem(self.textroot, parametres['name'])
873         else :
874             item = self.AppendItem(self.matroot, parametres['name'])
875         self.SetPyData(item, parametres)
876         if parametres['type'] in self.ild :
877             img = self.ild[parametres['type']]
878         else :
879             img = 24
880         self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
881         self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
882         self.SetItemBold(item, bold)
883     
884     def AddMatAnalyse(self, parametres, itemParent = None, bold = True) :
885         uuid = parametres.get('matrix', None)
886         if uuid is not None :
887             if itemParent is None :
888                 itemParent = self.matroot
889             child, cookie = self.GetFirstChild(itemParent)
890             matrix = None
891             while child :
892                 pydata = self.GetPyData(child)
893                 if pydata['uuid'] == uuid :
894                     matrix = child
895                     break
896                 self.GiveFocus(child, uuid)
897                 child, cookie = self.GetNextChild(itemParent, cookie)
898             #item = self.AppendItem(child, parametres['name'])
899             if matrix is not None : 
900                 item = self.AppendItem(matrix, parametres['name'])
901             else :
902                 item = self.AppendItem(self.matroot, parametres['name'])
903         self.SetPyData(item, parametres)
904         if parametres['type'] in self.ild :
905             img = self.ild[parametres['type']]
906         else :
907             img = 24
908         self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
909         self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
910         self.SetItemBold(item, bold)    
911         
912     def OnItemAppend(self, item):
913         if 'corpus_name' in item :
914             child = self.InsertItem(self.textroot, 0, item['corpus_name'])
915         else :
916             child = self.InsertItem(self.matroot, 0, item['matrix_name'])
917         self.SetPyData(child, item)
918         self.history.addtab(item)
919         if item['type'] in self.ild :
920             img = self.ild[item['type']]
921         else :
922             img = 24
923         self.SetItemImage(child, img, CT.TreeItemIcon_Normal)
924         self.SetItemImage(child, 13, CT.TreeItemIcon_Expanded)
925         self.SetItemBold(child, True)
926         
927         #dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
928
929         #if dlg.ShowModal() == wx.ID_OK:
930         #    newname = dlg.GetValue()
931         #    newitem = self.AppendItem(self.current, newname)
932         #    self.EnsureVisible(newitem)
933         
934
935         #dlg.Destroy()
936         
937
938     def OnBeginEdit(self, event):
939         
940         #self.log.info("OnBeginEdit" + "\n")
941         # show how to prevent edit...
942         item = event.GetItem()
943         if item and self.GetItemText(item) == "The Root Item":
944             wx.Bell()
945             #self.log.info("You can't edit this one..." + "\n")
946
947             # Lets just see what's visible of its children
948             cookie = 0
949             root = event.GetItem()
950             (child, cookie) = self.GetFirstChild(root)
951
952             while child:
953                 #self.log.info("Child [%s] visible = %d" % (self.GetItemText(child), self.IsVisible(child)) + "\n")
954                 (child, cookie) = self.GetNextChild(root, cookie)
955
956             event.Veto()
957
958
959     def OnEndEdit(self, event):
960         
961         #self.log.info("OnEndEdit: %s %s" %(event.IsEditCancelled(), event.GetLabel()))
962         # show how to reject edit, we'll not allow any digits
963         for x in event.GetLabel():
964             if x in string.digits:
965                 #self.log.info(", You can't enter digits..." + "\n")
966                 event.Veto()
967                 return
968             
969         self.log.info("\n")
970
971
972     def OnLeftDClick(self, event):
973         pt = event.GetPosition()
974         item, flags = self.HitTest(pt)
975         if item is not None :
976             pydata = self.GetPyData(item)
977             if pydata['uuid'] in self.parent.history.opened :
978                 for i in range(self.parent.nb.GetPageCount()) :
979                     page = self.parent.nb.GetPage(i)
980                     if 'parametres' in dir(page) :
981                         if page.parametres['uuid'] == pydata['uuid'] :
982                             self.parent.nb.SetSelection(i)
983                             break
984             elif pydata['uuid'] in ['textroot', 'matroot'] :
985                 pass
986             else :
987                 busy = wx.BusyInfo(_("Please wait..."), self.parent)
988                 wx.SafeYield()
989                 OpenAnalyse(self.parent, pydata)
990                 del busy
991                 self.SetItemBold(item, True)
992                 self.OnSelChanged(pydata = pydata)
993         #if item and (flags & CT.TREE_HITTEST_ONITEMLABEL):
994         #    if self.GetAGWWindowStyleFlag() & CT.TR_EDIT_LABELS:
995         #        self.log.info("OnLeftDClick: %s (manually starting label edit)"% self.GetItemText(item) + "\n")
996                 
997                 #self.EditLabel(item)
998         #    else:
999         #        pydata = self.GetPyData(item)
1000         #        print pydata
1001         #        self.log.info("OnLeftDClick: Cannot Start Manual Editing, Missing Style TR_EDIT_LABELS\n")
1002
1003         event.Skip()                
1004         
1005
1006     def OnItemExpanded(self, event):
1007         
1008         item = event.GetItem()
1009         if item:
1010             self.log.info("OnItemExpanded: %s" % self.GetItemText(item) + "\n")
1011
1012
1013     def OnItemExpanding(self, event):
1014         
1015         item = event.GetItem()
1016         if item:
1017             self.log.info("OnItemExpanding: %s" % self.GetItemText(item) + "\n")
1018             
1019         event.Skip()
1020
1021         
1022     def OnItemCollapsed(self, event):
1023
1024         item = event.GetItem()
1025         if item:
1026             self.log.info("OnItemCollapsed: %s" % self.GetItemText(item) + "\n")
1027             
1028
1029     def OnItemCollapsing(self, event):
1030
1031         item = event.GetItem()
1032         if item:
1033             self.log.info("OnItemCollapsing: %s" % self.GetItemText(item) + "\n")
1034     
1035         event.Skip()
1036
1037         
1038     def OnSelChanged(self, event = None, pydata = None):
1039         if event is not None :
1040             item = event.GetItem()
1041             pydata = self.GetPyData(item)
1042         if pydata is not None :
1043             self.pydata = pydata
1044             if pydata['uuid'] in self.parent.history.opened :
1045                 for i in range(self.parent.nb.GetPageCount()) :
1046                     self.page = self.parent.nb.GetPage(i)
1047                     if 'parametres' in dir(self.page) :
1048                         if self.page.parametres['uuid'] == pydata['uuid'] :
1049                             self.parent.nb.SetSelection(i)
1050                             break
1051         if event is not None :
1052             event.Skip()
1053
1054
1055     def OnSelChanging(self, event):
1056
1057         item = event.GetItem()
1058         olditem = event.GetOldItem()
1059         
1060         if item:
1061             if not olditem:
1062                 olditemtext = "None"
1063             else:
1064                 olditemtext = self.GetItemText(olditem)
1065             #self.log.info("OnSelChanging: From %s" % olditemtext + " To %s" % self.GetItemText(item) + "\n")
1066                 
1067         event.Skip()
1068
1069
1070     def OnBeginDrag(self, event):
1071
1072         self.item = event.GetItem()
1073         if self.item:
1074             self.log.info("Beginning Drag..." + "\n")
1075
1076             event.Allow()
1077
1078
1079     def OnBeginRDrag(self, event):
1080
1081         self.item = event.GetItem()
1082         if self.item:
1083             self.log.info("Beginning Right Drag..." + "\n")
1084
1085             event.Allow()
1086         
1087
1088     def OnEndDrag(self, event):
1089
1090         self.item = event.GetItem()
1091         if self.item:
1092             self.log.info("Ending Drag!" + "\n")
1093
1094         event.Skip()            
1095
1096
1097     def OnDeleteItem(self, event):
1098
1099         item = event.GetItem()
1100
1101         if not item:
1102             return
1103
1104         self.log.info("Deleting Item: %s" % self.GetItemText(item) + "\n")
1105         event.Skip()
1106         
1107
1108     def OnItemCheck(self, event):
1109
1110         item = event.GetItem()
1111         self.log.info("Item " + self.GetItemText(item) + " Has Been Checked!\n")
1112         event.Skip()
1113
1114
1115     def OnItemChecking(self, event):
1116
1117         item = event.GetItem()
1118         self.log.info("Item " + self.GetItemText(item) + " Is Being Checked...\n")
1119         event.Skip()
1120         
1121
1122     def OnToolTip(self, event):
1123
1124         item = event.GetItem()
1125         if item:
1126             event.SetToolTip(wx.ToolTip(self.GetItemText(item)))
1127
1128
1129     def OnItemMenu(self, event):
1130
1131         item = event.GetItem()
1132         if item:
1133             self.log.info("OnItemMenu: %s" % self.GetItemText(item) + "\n")
1134     
1135         event.Skip()
1136
1137
1138     def OnKey(self, event):
1139
1140         keycode = event.GetKeyCode()
1141         keyname = keyMap.get(keycode, None)
1142                 
1143         if keycode == wx.WXK_BACK:
1144             self.log.info("OnKeyDown: HAHAHAHA! I Vetoed Your Backspace! HAHAHAHA\n")
1145             return
1146
1147         if keyname is None:
1148             if "unicode" in wx.PlatformInfo:
1149                 keycode = event.GetUnicodeKey()
1150                 if keycode <= 127:
1151                     keycode = event.GetKeyCode()
1152                 keyname = "\"" + unichr(event.GetUnicodeKey()) + "\""
1153                 if keycode < 27:
1154                     keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1155                 
1156             elif keycode < 256:
1157                 if keycode == 0:
1158                     keyname = "NUL"
1159                 elif keycode < 27:
1160                     keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1161                 else:
1162                     keyname = "\"%s\"" % chr(keycode)
1163             else:
1164                 keyname = "unknown (%s)" % keycode
1165                 
1166         self.log.info("OnKeyDown: You Pressed '" + keyname + "'\n")
1167
1168         event.Skip()
1169         
1170         
1171     def OnActivate(self, event):
1172         
1173         if self.item:
1174             self.log.info("OnActivate: %s" % self.GetItemText(self.item) + "\n")
1175
1176         event.Skip()
1177
1178         
1179     def OnHyperLink(self, event):
1180
1181         item = event.GetItem()
1182         if item:
1183             self.log.info("OnHyperLink: %s" % self.GetItemText(self.item) + "\n")
1184             
1185
1186     def OnTextCtrl(self, event):
1187
1188         char = chr(event.GetKeyCode())
1189         self.log.info("EDITING THE TEXTCTRL: You Wrote '" + char + \
1190                        "' (KeyCode = " + str(event.GetKeyCode()) + ")\n")
1191         event.Skip()
1192
1193
1194     def OnComboBox(self, event):
1195
1196         selection = event.GetEventObject().GetValue()
1197         self.log.info("CHOICE FROM COMBOBOX: You Chose '" + selection + "'\n")
1198         event.Skip()