sub correction
[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, img, 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, img, 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, _(u"Informations").encode('utf8'))
385             rename = menu.Append(wx.ID_ANY, _(u"Rename").encode('utf8'))
386             menu.AppendSeparator()
387     
388             if 'corpus_name' in pydata :
389                 stat = menu.Append(wx.ID_ANY, _(u"Statistics").decode('utf8'))
390                 spec = menu.Append(wx.ID_ANY, _(u"Specificities and CA").decode('utf8'))
391                 classification = wx.Menu()
392                 reinert = classification.Append(wx.ID_ANY, _(u"Reinert method").decode('utf8'))
393                 #pam = classification.Append(wx.ID_ANY, u"Par matrice des distances")
394                 menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), classification)
395                 simi = menu.Append(wx.ID_ANY, _(u"Similarities analysis").decode('utf8'))
396                 wdc = menu.Append(wx.ID_ANY, _(u"Wordcloud").decode('utf8'))
397                 subcorpus = wx.Menu()
398                 subcorpusfrommeta = subcorpus.Append(wx.ID_ANY, _(u'Sub corpus from metadata').decode('utf8'))
399                 subcorpusfromtheme = subcorpus.Append(wx.ID_ANY, _(u'Sub corpus from thematic').decode('utf8'))
400                 menu.AppendMenu(-1, _(u"Sub corpus").decode('utf8'), subcorpus)
401                 menu.AppendSeparator()
402                 self.Bind(wx.EVT_MENU, self.OnReinert, reinert)
403                 #self.Bind(wx.EVT_MENU, self.OnPam, pam)
404                 self.Bind(wx.EVT_MENU, self.OnStat, stat)
405                 self.Bind(wx.EVT_MENU, self.OnSpec, spec)
406                 self.Bind(wx.EVT_MENU, self.OnSimiTxt, simi)
407                 self.Bind(wx.EVT_MENU, self.OnWordCloud, wdc)
408                 self.Bind(wx.EVT_MENU, self.OnSubTextFromMeta, subcorpusfrommeta)
409                 self.Bind(wx.EVT_MENU, self.OnSubTextFromTheme, subcorpusfromtheme)
410             elif 'matrix_name' in pydata :
411                 for i in range(self.parent.matrix_menu.GetMenuItemCount()) :
412                     item = self.parent.matrix_menu.FindItemByPosition(i)
413                     itemid = item.GetId()
414                     itemtext = item.GetText()
415                     menu.Append(itemid, itemtext)
416                 split = wx.Menu()
417                 splitfromvar = split.Append(-1, _(u"Split from variable").decode('utf8'))
418                 menu.AppendMenu(-1, _(u"Split matrix").decode('utf8'), split)
419                 self.Bind(wx.EVT_MENU, self.OnSplitFromVar, splitfromvar)
420                     #print item, itemid, itemtext
421                 #menu = self.parent.matrix_menu
422                 #freq = menu.Append(wx.ID_ANY, _(u"Frequency").decode('utf8'))
423                 #chi2 = menu.Append(wx.ID_ANY, _(u"Chi square").decode('utf8'))
424                 #chdreinert = menu.Append(wx.ID_ANY, _(u"Reinert clustering").decode('utf8'))
425                 #simi = menu.Append(wx.ID_ANY, _(u"Similarity analysis").decode('utf8'))
426                 menu.AppendSeparator()
427                 #self.Bind(wx.EVT_MENU, self.OnFreq, freq)
428                 #self.Bind(wx.EVT_MENU, self.OnChiSquare, chi2)
429                 #self.Bind(wx.EVT_MENU, self.OnSimiTab, simi)
430                 #self.Bind(wx.EVT_MENU, self.OnCHDReinert, chdreinert)
431             elif pydata.get('type', False) == 'alceste' and pydata['uuid'] in self.parent.history.opened :
432                 openmenu = wx.Menu()
433                 antipro = openmenu.Append(wx.ID_ANY, _(u"Antiprofiles").decode('utf8'))
434                 menu.AppendMenu(wx.ID_ANY, _(u"Open ...").decode('utf8'), openmenu)
435     
436                 profsr = menu.Append(wx.ID_ANY, _(u"Repeated segments profiles").decode('utf8'))
437                 profgram = menu.Append(wx.ID_ANY, _(u"POS profiles").decode('utf8'))
438                 export_corpus = menu.Append(wx.ID_ANY, _(u"Export corpus").decode('utf8'))
439                 colored = menu.Append(wx.ID_ANY, _(u"Colored corpus").decode('utf8'))
440                 navig = menu.Append(wx.ID_ANY, _(u"Navigator").decode('utf8'))
441                 statclasse = menu.Append(wx.ID_ANY, _(u"Clusters statistics").decode('utf8'))
442                 rapport = menu.Append(wx.ID_ANY, _(u"Report").decode('utf8'))
443                 export_classes = menu.Append(wx.ID_ANY, _(u"Export Clusters").decode('utf8'))
444                 menu.AppendSeparator()
445                 self.Bind(wx.EVT_MENU, self.OpenAntipro, antipro)
446                 self.Bind(wx.EVT_MENU, self.OnProfSR, profsr)
447                 self.Bind(wx.EVT_MENU, self.OnProfGram, profgram)
448                 self.Bind(wx.EVT_MENU, self.OnExportCorpus, export_corpus)
449                 self.Bind(wx.EVT_MENU, self.OnColored, colored)
450                 self.Bind(wx.EVT_MENU, self.OnNavig, navig)
451                 self.Bind(wx.EVT_MENU, self.StatClasse, statclasse)
452                 self.Bind(wx.EVT_MENU, self.OnRapport, rapport)
453                 self.Bind(wx.EVT_MENU, self.OnExportClasses, export_classes)
454             elif pydata.get('type', False) == 'stat'  and pydata['uuid'] in self.parent.history.opened :
455                 export_dictionary =  menu.Append(wx.ID_ANY, _(u"Export dictionary").decode('utf8'))
456                 export_lems =  menu.Append(wx.ID_ANY, _(u"Export lemma dictionary").decode('utf8'))
457                 self.Bind(wx.EVT_MENU, self.OnExportDictionary, export_dictionary)
458                 self.Bind(wx.EVT_MENU, self.OnExportLems, export_lems)
459                 menu.AppendSeparator()
460             elif pydata.get('type', False) == 'spec'  and pydata['uuid'] in self.parent.history.opened :
461                 tgen = menu.Append(wx.ID_ANY, _(u"Tgen Editor").decode('utf8'))
462                 computetgen = menu.Append(wx.ID_ANY, _(u"Compute Tgen").decode('utf8'))
463                 self.Bind(wx.EVT_MENU, self.OnTgenEditor, tgen)
464                 self.Bind(wx.EVT_MENU, self.OnTgenCompute, computetgen)
465                 menu.AppendSeparator()
466             elif pydata.get('type', False) == 'reinertmatrix' and pydata['uuid'] in self.parent.history.opened :
467                 openmenu = wx.Menu()
468                 antipro = openmenu.Append(wx.ID_ANY, _(u"antiprofiles").decode('utf8'))
469                 menu.AppendMenu(wx.ID_ANY, _(u"Open ...").decode('utf8'), openmenu)
470                 self.Bind(wx.EVT_MENU, self.OpenAntipro, antipro)
471     
472     
473             itemdelete = menu.Append(wx.ID_ANY, _(u"Delete from history").decode('utf8'))
474             #item11 = menu.Append(wx.ID_ANY, "Prepend An Item")
475             #item12 = menu.Append(wx.ID_ANY, "Append An Item")
476     
477             #self.Bind(wx.EVT_MENU, self.OnItemBackground, item1)
478             #self.Bind(wx.EVT_MENU, self.OnItemForeground, item2)
479             #self.Bind(wx.EVT_MENU, self.OnItemBold, item3)
480             #self.Bind(wx.EVT_MENU, self.OnItemFont, item4)
481             #self.Bind(wx.EVT_MENU, self.OnItemHyperText, item5)
482             #self.Bind(wx.EVT_MENU, self.OnEnableWindow, item6)
483             #self.Bind(wx.EVT_MENU, self.OnDisableItem, item7)
484             #self.Bind(wx.EVT_MENU, self.OnItemIcons, item8)
485             self.Bind(wx.EVT_MENU, self.OnItemInfo, info)
486             self.Bind(wx.EVT_MENU, self.OnRename, rename)
487             self.Bind(wx.EVT_MENU, self.OnItemDelete, itemdelete)
488             #self.Bind(wx.EVT_MENU, self.OnItemPrepend, item11)
489             #self.Bind(wx.EVT_MENU, self.OnItemAppend, item12)
490             
491             self.PopupMenu(menu)
492             menu.Destroy()
493
494     def getcorpus(self):
495         busy = wx.BusyInfo(_("Please wait...Reading corpus").decode('utf8'), self.parent)
496         wx.SafeYield()
497         if self.pydata['uuid'] in self.parent.history.openedcorpus :
498             corpus = copycorpus(self.parent.history.openedcorpus[self.pydata['uuid']])
499         elif 'corpus_name' in self.pydata :
500             corpus = Corpus(self.parent, parametres = DoConf(self.pydata['ira']).getoptions('corpus'), read = True)
501         else :
502             cuuid = self.pydata['corpus']
503             if cuuid in self.parent.history.openedcorpus :
504                 corpus = copycorpus(self.parent.history.openedcorpus[cuuid])
505             else :
506                 irapath = self.parent.history.corpus[cuuid]['ira']
507                 corpus = Corpus(self.parent, parametres = DoConf(irapath).getoptions('corpus'), read = True)
508         del busy
509         return corpus
510     
511     def getmatrix(self):
512         if 'matrix_name' in self.pydata :
513             matrix = Tableau(self.parent, parametres = DoConf(self.pydata['ira']).getoptions('matrix'))
514             matrix.open()
515             return copymatrix(matrix)
516         else :
517             cuuid = self.pydata['matrix']
518             matrix = Tableau(self.parent, parametres = DoConf(self.history.matrixanalyse[cuuid]['ira']).getoptions('matrix'))
519             matrix.open()
520             return copymatrix(matrix)
521
522     def OnSpec(self, evt) :
523         self.parent.OnTextSpec(evt, self.getcorpus())
524
525     def OnStat(self, evt) :
526         self.parent.OnTextStat(evt, self.getcorpus())
527         
528     def OnReinert(self, evt) :
529         self.parent.OnTextReinert(evt, self.getcorpus())
530
531     def OnPam(self, evt) :
532         self.parent.OnPamSimple(evt, self.getcorpus())
533
534     def OnSimiTxt(self, evt) :
535         self.parent.OnSimiTxt(evt, self.getcorpus())
536
537     def OnWordCloud(self, evt) :
538         self.parent.OnWordCloud(evt, self.getcorpus())
539     
540     def OnFreq(self, evt):
541         self.parent.OnFreq(evt, self.getmatrix())
542         
543     def OnChiSquare(self, evt):
544         self.parent.OnChi2(evt, self.getmatrix())
545         
546     def OnSimiTab(self, evt): 
547         self.parent.OnSimiTab(evt, self.getmatrix())
548     
549     def OnProto(self, evt):
550         self.parent.OnProto(evt, self.getmatrix())
551     
552     def OnSplitFromVar(self, evt):
553         self.parent.OnSplitVar(evt, self.getmatrix())
554         
555     def OnCHDReinert(self, evt):
556         self.parent.OnCHDReinert(evt, self.getmatrix())
557     
558     def OnSubTextFromMeta(self, evt):
559         self.parent.OnSubText(self.getcorpus(), parametres = {'frommeta' : True})
560     
561     def OnSubTextFromTheme(self, evt):
562         self.parent.OnSubText(self.getcorpus(), parametres = {'fromtheme' : True})    
563
564     def OnProfSR(self, evt) :
565         ProfileSegment(self.parent, self.page.dictpathout, self.page.parametres, self.page.corpus)
566
567     def OnProfGram(self, evt) :
568         ProfilType(self.parent, self.page.corpus, self.page.parametres)
569
570     def OnExportCorpus(self, evt) :
571         dial = PrefExport(self, self.parent)
572         dial.fbb.SetValue(os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'export_corpus.txt'))
573         dial.CenterOnParent()
574         res = dial.ShowModal()
575         if res == wx.ID_OK :
576             if dial.radio_type.GetSelection() == 0 : alc = True
577             else : alc = False
578             if dial.radio_lem.GetSelection() == 0 : lem = True
579             else : lem = False
580             if self.page.parametres['classif_mode'] != 2 :
581                 uci = False
582             else :
583                 uci = True
584             self.page.corpus.export_corpus_classes(dial.fbb.GetValue(), alc = alc, lem = lem, uci = uci)
585             msg = u"Fini !"
586             dial.Destroy()
587             dlg = wx.MessageDialog(self.parent, msg, u"Export", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
588             dlg.CenterOnParent()
589             dlg.ShowModal()
590             dlg.Destroy()
591
592     def OnColored(self, evt) :
593         dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.html', 'title': _(u"Colored corpus").decode('utf8')})
594         dial.fbb.SetValue(os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'corpus_couleur.html'))
595         dial.CenterOnParent()
596         res = dial.ShowModal()
597         if res == wx.ID_OK :
598             fileout = dial.fbb.GetValue()
599             dial.Destroy()
600             if self.page.parametres['classif_mode'] != 2 :
601                 uci = False
602             else :
603                 uci = True
604             txt = self.page.corpus.make_colored_corpus(uci = uci)
605             with open(fileout, 'w') as f :
606                 f.write(txt)
607             msg = ' !\n'.join([_(u"Done").decode('utf8'), _(u"Open in a web browser ?").decode('utf8')])
608             dlg = wx.MessageDialog(self.parent, msg, u"Corpus en couleur", wx.NO | wx.YES | wx.NO_DEFAULT | wx.ICON_QUESTION)
609             dlg.CenterOnParent()
610             if dlg.ShowModal() == wx.ID_YES :
611                 webbrowser.open(fileout)
612             dlg.Destroy()
613
614     def OnNavig(self, evt):
615         if 'FrameSearch' not in dir(self.page) :
616             self.page.FrameSearch = SearchFrame(self.parent, -1, _(u"Search ...").decode('utf8'), self.page.corpus)
617         self.page.FrameSearch.Show()
618
619     def StatClasse(self, evt):
620         dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.csv', 'title': _(u"Clusters statistics").decode('utf8')})
621         dial.fbb.SetValue( os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'stat_par_classe.csv'))
622         dial.CenterOnParent()
623         res = dial.ShowModal()
624         if res == wx.ID_OK :
625             fileout = dial.fbb.GetValue()
626             dial.Destroy()
627             self.page.corpus.get_stat_by_cluster(fileout)
628             msg = u"Fini !"
629             dlg = wx.MessageDialog(self.parent, msg, _(u"Clusters statistics").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
630             dlg.CenterOnParent()
631             if dlg.ShowModal() == wx.ID_OK :
632                 dlg.Destroy()        
633
634     def OpenAntipro(self, evt) :
635         find = False
636         for i in range(0, self.page.TabChdSim.GetPageCount()) :
637             page = self.page.TabChdSim.GetPage(i)
638             if self.page.TabChdSim.GetPageText(i) == _(u"Antiprofiles").decode('utf8') :
639                 self.page.TabChdSim.SetSelection(i)
640                 find = True
641                 break
642         if not find :
643             open_antiprofil(self.page, self.page.dictpathout['ANTIPRO_OUT'], self.parent.syscoding)
644             self.page.TabChdSim.SetSelection(self.page.TabChdSim.GetPageCount() - 1)
645
646     def OnRapport(self, evt) :
647         dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.txt', 'title': _(u"Report").decode('utf8')})
648         dial.fbb.SetValue(self.page.dictpathout['rapport'])
649         dial.CenterOnParent()
650         res = dial.ShowModal()
651         if res == wx.ID_OK :
652             fileout = dial.fbb.GetValue()
653             dial.Destroy()
654             with open(fileout, 'w') as f :
655                 f.write(self.page.debtext + '\n' + GetTxtProfile(self.page.DictProfile, self.page.cluster_size))
656             msg = u"Fini !"
657             dlg = wx.MessageDialog(self.parent, msg, _(u"Report").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
658             dlg.CenterOnParent()
659             dlg.ShowModal()
660             dlg.Destroy()
661         else :
662             dial.Destroy()
663
664     def OnExportDictionary(self, evt) :
665         corpus = self.page.corpus
666         corpus.export_dictionary(self.page.pathout['dictionary.csv'], self.parent.syscoding)
667         log.info('export dictionary %s' % self.page.pathout['dictionary.csv'])
668         dial = wx.MessageDialog(self.parent, self.page.pathout['dictionary.csv'], 'Export', wx.OK)
669         dial.ShowModal()
670         dial.Destroy()
671         
672     def OnExportLems(self, evt) :
673         corpus = self.page.corpus
674         corpus.export_lems(self.page.pathout['lemmes.csv'], self.parent.syscoding)
675         log.info('export lemmes %s' % self.page.pathout['lemmes.csv'])
676         dial = wx.MessageDialog(self.parent, self.page.pathout['lemmes.csv'], 'Export', wx.OK)
677         dial.ShowModal()
678         dial.Destroy()
679     
680     def OnTgenEditor(self, evt):
681         corpus = self.page.corpus
682         tgenpath = os.path.join(self.page.parametres['pathout'], 'tgen.csv')
683         tgen = TGen(path = tgenpath, encoding = self.parent.syscoding)
684         if os.path.exists(tgenpath) :
685             tgen.read(tgenpath)
686         if isinstance(evt, list) :
687             i = 0
688             while 'tgen%i' %i in tgen.tgen :
689                 i += 1
690             tgenname = 'tgen%i' %i
691             tgen.tgen[tgenname] = evt
692         tgenframe = TGenFrame(self.parent, corpus, tgen)
693         tgenframe.Show()
694         if isinstance(evt, list) :
695             tgenframe.OnNewTgen(None, tgen = tgenname)
696     
697     def OnTgenCompute(self, evt):
698         corpus = self.page.corpus
699         tgenpath = os.path.join(self.page.parametres['pathout'], 'tgen.csv')        
700         self.page.parametres['tgenpath'] = tgenpath
701         tgen = TGen(path = tgenpath, encoding = self.parent.syscoding)
702         self.page.parametres['etoiles'] = self.page.etoiles
703         TgenSpec(self.parent, corpus, self.page.parametres)
704         TgenLayout(self.page)
705     
706     def OnExportClasses(self, event):
707         corpus = self.page.corpus
708         if self.page.parametres['classif_mode'] != 2 :
709             uci = False
710         else :
711             uci = True
712         busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self.parent)
713         wx.SafeYield()
714         for i in range(1, self.page.parametres['clnb'] + 1) :
715             corpus.export_classe(self.page.pathout['classe_%i_export.txt' % i], i, uci = uci)
716         del busy
717         dial = wx.MessageDialog(self, self.page.pathout['classe_x_export.txt'], u"Export", wx.OK|wx.ICON_INFORMATION)
718         dial.ShowModal()
719         dial.Destroy()
720     
721     def OnRename(self, event):
722         pydata = self.itemdict['pydata']
723         print pydata
724
725     def OnItemBackground(self, event):
726
727         colourdata = wx.ColourData()
728         colourdata.SetColour(self.itemdict["back"])
729         dlg = wx.ColourDialog(self, colourdata)
730         
731         dlg.GetColourData().SetChooseFull(True)
732
733         if dlg.ShowModal() == wx.ID_OK:
734             data = dlg.GetColourData()
735             col1 = data.GetColour().Get()
736             self.SetItemBackgroundColour(self.current, col1)
737         dlg.Destroy()
738
739
740     def OnItemForeground(self, event):
741
742         colourdata = wx.ColourData()
743         colourdata.SetColour(self.itemdict["fore"])
744         dlg = wx.ColourDialog(self, colourdata)
745         
746         dlg.GetColourData().SetChooseFull(True)
747
748         if dlg.ShowModal() == wx.ID_OK:
749             data = dlg.GetColourData()
750             col1 = data.GetColour().Get()
751             self.SetItemTextColour(self.current, col1)
752         dlg.Destroy()
753
754
755     def OnItemBold(self, event):
756
757         self.SetItemBold(self.current, not self.itemdict["isbold"])
758
759
760     def OnItemFont(self, event):
761
762         data = wx.FontData()
763         font = self.itemdict["font"]
764         
765         if font is None:
766             font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
767             
768         data.SetInitialFont(font)
769
770         dlg = wx.FontDialog(self, data)
771         
772         if dlg.ShowModal() == wx.ID_OK:
773             data = dlg.GetFontData()
774             font = data.GetChosenFont()
775             self.SetItemFont(self.current, font)
776
777         dlg.Destroy()
778         
779
780     def OnItemHyperText(self, event):
781
782         self.SetItemHyperText(self.current, not self.itemdict["ishtml"])
783
784
785     def OnEnableWindow(self, event):
786
787         enable = self.GetItemWindowEnabled(self.current)
788         self.SetItemWindowEnabled(self.current, not enable)
789
790
791     def OnDisableItem(self, event):
792
793         self.EnableItem(self.current, False)
794         
795
796     def OnItemIcons(self, event):
797
798         bitmaps = [self.itemdict["normal"], self.itemdict["selected"],
799                    self.itemdict["expanded"], self.itemdict["selexp"]]
800
801         wx.BeginBusyCursor()        
802         dlg = TreeIcons(self, -1, bitmaps=bitmaps)
803         wx.EndBusyCursor()
804         dlg.ShowModal()
805
806
807     def SetNewIcons(self, bitmaps):
808
809         self.SetItemImage(self.current, bitmaps[0], CT.TreeItemIcon_Normal)
810         self.SetItemImage(self.current, bitmaps[1], CT.TreeItemIcon_Selected)
811         self.SetItemImage(self.current, bitmaps[2], CT.TreeItemIcon_Expanded)
812         self.SetItemImage(self.current, bitmaps[3], CT.TreeItemIcon_SelectedExpanded)
813
814
815     def OnItemInfo(self, event):
816
817         itemtext = self.itemdict["text"]
818         numchildren = str(self.itemdict["children"])
819         itemtype = self.itemdict["itemtype"]
820         pydata = self.itemdict['pydata']
821         #if 'analyses' in pydata :
822         #    toshow = dict([[val, pydata[val]] for val in pydata if val not in['analyses', 'isload']])
823         #else :
824         toshow = pydata['ira']
825         toshow = DoConf(toshow).getoptions()
826         txt = DoConf().totext(toshow)
827         parametres = [val.split('\t\t:') for val in txt.splitlines()]
828         parametres.sort()
829
830         if itemtype == 0:
831             itemtype = "Normal"
832         elif itemtype == 1:
833             itemtype = "CheckBox"
834         else:
835             itemtype = "RadioButton"
836
837         dlg = InfoDialog(self, itemtext, parametres)
838         dlg.CenterOnParent()
839         dlg.ShowModal()
840         dlg.Destroy()
841                 
842         
843
844     def OnItemDelete(self, event):
845
846         strs = "Are You Sure You Want To Delete Item " + self.GetItemText(self.current) + "?"
847         dlg = wx.MessageDialog(None, strs, 'Deleting Item', wx.OK | wx.CANCEL | wx.ICON_QUESTION)
848
849         if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
850             dlg.Destroy()
851             return
852
853         dlg.Destroy()
854         
855         pydata = self.itemdict['pydata']
856         if 'corpus_name' in pydata :
857             self.history.delete(pydata, True)
858         else :
859             self.history.delete(pydata)
860         self.DeleteChildren(self.current)
861         self.Delete(self.current)
862         self.current = None
863         
864
865
866     def OnItemPrepend(self, event):
867
868         dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
869
870         if dlg.ShowModal() == wx.ID_OK:
871             newname = dlg.GetValue()
872             newitem = self.PrependItem(self.current, newname)
873             self.EnsureVisible(newitem)
874
875         dlg.Destroy()
876
877     def AddAnalyse(self, parametres, itemParent = None, bold = True) :
878         uuid = parametres.get('corpus', None)
879         if uuid is not None :
880             if itemParent is None :
881                 itemParent = self.textroot
882             child, cookie = self.GetFirstChild(itemParent)
883             corpus = None
884             while child :
885                 pydata = self.GetPyData(child)
886                 if pydata['uuid'] == uuid :
887                     corpus = child
888                     break
889                 self.GiveFocus(child, uuid)
890                 child, cookie = self.GetNextChild(itemParent, cookie)
891             #item = self.AppendItem(child, parametres['name'])
892             if corpus is not None : 
893                 item = self.AppendItem(corpus, parametres['name'])
894             else :
895                 item = self.AppendItem(self.textroot, parametres['name'])
896         else :
897             item = self.AppendItem(self.matroot, parametres['name'])
898         self.SetPyData(item, parametres)
899         if parametres['type'] in self.ild :
900             img = self.ild[parametres['type']]
901         else :
902             img = 24
903         self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
904         self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
905         self.SetItemBold(item, bold)
906     
907     def AddMatAnalyse(self, parametres, itemParent = None, bold = True) :
908         uuid = parametres.get('matrix', None)
909         if uuid is not None :
910             if itemParent is None :
911                 itemParent = self.matroot
912             child, cookie = self.GetFirstChild(itemParent)
913             matrix = None
914             while child :
915                 pydata = self.GetPyData(child)
916                 if pydata['uuid'] == uuid :
917                     matrix = child
918                     break
919                 self.GiveFocus(child, uuid)
920                 child, cookie = self.GetNextChild(itemParent, cookie)
921             #item = self.AppendItem(child, parametres['name'])
922             if matrix is not None : 
923                 item = self.AppendItem(matrix, parametres['name'])
924             else :
925                 item = self.AppendItem(self.matroot, parametres['name'])
926         self.SetPyData(item, parametres)
927         if parametres['type'] in self.ild :
928             img = self.ild[parametres['type']]
929         else :
930             img = 24
931         self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
932         self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
933         self.SetItemBold(item, bold)    
934         
935     def OnItemAppend(self, item):
936         if 'corpus_name' in item :
937             child = self.InsertItem(self.textroot, 0, item['corpus_name'])
938         else :
939             child = self.InsertItem(self.matroot, 0, item['matrix_name'])
940         self.SetPyData(child, item)
941         self.history.addtab(item)
942         if item['type'] in self.ild :
943             img = self.ild[item['type']]
944         else :
945             img = 24
946         self.SetItemImage(child, img, CT.TreeItemIcon_Normal)
947         self.SetItemImage(child, img, CT.TreeItemIcon_Expanded)
948         self.SetItemBold(child, True)
949         
950         #dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
951
952         #if dlg.ShowModal() == wx.ID_OK:
953         #    newname = dlg.GetValue()
954         #    newitem = self.AppendItem(self.current, newname)
955         #    self.EnsureVisible(newitem)
956         
957
958         #dlg.Destroy()
959         
960
961     def OnBeginEdit(self, event):
962         
963         #self.log.info("OnBeginEdit" + "\n")
964         # show how to prevent edit...
965         item = event.GetItem()
966         if item and self.GetItemText(item) == "The Root Item":
967             wx.Bell()
968             #self.log.info("You can't edit this one..." + "\n")
969
970             # Lets just see what's visible of its children
971             cookie = 0
972             root = event.GetItem()
973             (child, cookie) = self.GetFirstChild(root)
974
975             while child:
976                 #self.log.info("Child [%s] visible = %d" % (self.GetItemText(child), self.IsVisible(child)) + "\n")
977                 (child, cookie) = self.GetNextChild(root, cookie)
978
979             event.Veto()
980
981
982     def OnEndEdit(self, event):
983         
984         #self.log.info("OnEndEdit: %s %s" %(event.IsEditCancelled(), event.GetLabel()))
985         # show how to reject edit, we'll not allow any digits
986         for x in event.GetLabel():
987             if x in string.digits:
988                 #self.log.info(", You can't enter digits..." + "\n")
989                 event.Veto()
990                 return
991             
992         self.log.info("\n")
993
994
995     def OnLeftDClick(self, event):
996         pt = event.GetPosition()
997         item, flags = self.HitTest(pt)
998         if item is not None :
999             pydata = self.GetPyData(item)
1000             if pydata['uuid'] in self.parent.history.opened :
1001                 for i in range(self.parent.nb.GetPageCount()) :
1002                     page = self.parent.nb.GetPage(i)
1003                     if 'parametres' in dir(page) :
1004                         if page.parametres['uuid'] == pydata['uuid'] :
1005                             self.parent.nb.SetSelection(i)
1006                             break
1007             elif pydata['uuid'] in ['textroot', 'matroot'] :
1008                 pass
1009             else :
1010                 busy = wx.BusyInfo(_("Please wait..."), self.parent)
1011                 wx.SafeYield()
1012                 OpenAnalyse(self.parent, pydata)
1013                 del busy
1014                 self.SetItemBold(item, True)
1015                 self.OnSelChanged(pydata = pydata)
1016         #if item and (flags & CT.TREE_HITTEST_ONITEMLABEL):
1017         #    if self.GetAGWWindowStyleFlag() & CT.TR_EDIT_LABELS:
1018         #        self.log.info("OnLeftDClick: %s (manually starting label edit)"% self.GetItemText(item) + "\n")
1019                 
1020                 #self.EditLabel(item)
1021         #    else:
1022         #        pydata = self.GetPyData(item)
1023         #        print pydata
1024         #        self.log.info("OnLeftDClick: Cannot Start Manual Editing, Missing Style TR_EDIT_LABELS\n")
1025
1026         event.Skip()                
1027         
1028
1029     def OnItemExpanded(self, event):
1030         
1031         item = event.GetItem()
1032         if item:
1033             self.log.info("OnItemExpanded: %s" % self.GetItemText(item) + "\n")
1034
1035
1036     def OnItemExpanding(self, event):
1037         
1038         item = event.GetItem()
1039         if item:
1040             self.log.info("OnItemExpanding: %s" % self.GetItemText(item) + "\n")
1041             
1042         event.Skip()
1043
1044         
1045     def OnItemCollapsed(self, event):
1046
1047         item = event.GetItem()
1048         if item:
1049             self.log.info("OnItemCollapsed: %s" % self.GetItemText(item) + "\n")
1050             
1051
1052     def OnItemCollapsing(self, event):
1053
1054         item = event.GetItem()
1055         if item:
1056             self.log.info("OnItemCollapsing: %s" % self.GetItemText(item) + "\n")
1057     
1058         event.Skip()
1059
1060         
1061     def OnSelChanged(self, event = None, pydata = None):
1062         if event is not None :
1063             item = event.GetItem()
1064             pydata = self.GetPyData(item)
1065         if pydata is not None :
1066             self.pydata = pydata
1067             if pydata['uuid'] in self.parent.history.opened :
1068                 for i in range(self.parent.nb.GetPageCount()) :
1069                     self.page = self.parent.nb.GetPage(i)
1070                     if 'parametres' in dir(self.page) :
1071                         if self.page.parametres['uuid'] == pydata['uuid'] :
1072                             self.parent.nb.SetSelection(i)
1073                             break
1074         if event is not None :
1075             event.Skip()
1076
1077
1078     def OnSelChanging(self, event):
1079
1080         item = event.GetItem()
1081         olditem = event.GetOldItem()
1082         
1083         if item:
1084             if not olditem:
1085                 olditemtext = "None"
1086             else:
1087                 olditemtext = self.GetItemText(olditem)
1088             #self.log.info("OnSelChanging: From %s" % olditemtext + " To %s" % self.GetItemText(item) + "\n")
1089                 
1090         event.Skip()
1091
1092
1093     def OnBeginDrag(self, event):
1094
1095         self.item = event.GetItem()
1096         if self.item:
1097             self.log.info("Beginning Drag..." + "\n")
1098
1099             event.Allow()
1100
1101
1102     def OnBeginRDrag(self, event):
1103
1104         self.item = event.GetItem()
1105         if self.item:
1106             self.log.info("Beginning Right Drag..." + "\n")
1107
1108             event.Allow()
1109         
1110
1111     def OnEndDrag(self, event):
1112
1113         self.item = event.GetItem()
1114         if self.item:
1115             self.log.info("Ending Drag!" + "\n")
1116
1117         event.Skip()            
1118
1119
1120     def OnDeleteItem(self, event):
1121
1122         item = event.GetItem()
1123
1124         if not item:
1125             return
1126
1127         self.log.info("Deleting Item: %s" % self.GetItemText(item) + "\n")
1128         event.Skip()
1129         
1130
1131     def OnItemCheck(self, event):
1132
1133         item = event.GetItem()
1134         self.log.info("Item " + self.GetItemText(item) + " Has Been Checked!\n")
1135         event.Skip()
1136
1137
1138     def OnItemChecking(self, event):
1139
1140         item = event.GetItem()
1141         self.log.info("Item " + self.GetItemText(item) + " Is Being Checked...\n")
1142         event.Skip()
1143         
1144
1145     def OnToolTip(self, event):
1146
1147         item = event.GetItem()
1148         if item:
1149             event.SetToolTip(wx.ToolTip(self.GetItemText(item)))
1150
1151
1152     def OnItemMenu(self, event):
1153
1154         item = event.GetItem()
1155         if item:
1156             self.log.info("OnItemMenu: %s" % self.GetItemText(item) + "\n")
1157     
1158         event.Skip()
1159
1160
1161     def OnKey(self, event):
1162
1163         keycode = event.GetKeyCode()
1164         keyname = keyMap.get(keycode, None)
1165                 
1166         if keycode == wx.WXK_BACK:
1167             self.log.info("OnKeyDown: HAHAHAHA! I Vetoed Your Backspace! HAHAHAHA\n")
1168             return
1169
1170         if keyname is None:
1171             if "unicode" in wx.PlatformInfo:
1172                 keycode = event.GetUnicodeKey()
1173                 if keycode <= 127:
1174                     keycode = event.GetKeyCode()
1175                 keyname = "\"" + unichr(event.GetUnicodeKey()) + "\""
1176                 if keycode < 27:
1177                     keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1178                 
1179             elif keycode < 256:
1180                 if keycode == 0:
1181                     keyname = "NUL"
1182                 elif keycode < 27:
1183                     keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1184                 else:
1185                     keyname = "\"%s\"" % chr(keycode)
1186             else:
1187                 keyname = "unknown (%s)" % keycode
1188                 
1189         self.log.info("OnKeyDown: You Pressed '" + keyname + "'\n")
1190
1191         event.Skip()
1192         
1193         
1194     def OnActivate(self, event):
1195         
1196         if self.item:
1197             self.log.info("OnActivate: %s" % self.GetItemText(self.item) + "\n")
1198
1199         event.Skip()
1200
1201         
1202     def OnHyperLink(self, event):
1203
1204         item = event.GetItem()
1205         if item:
1206             self.log.info("OnHyperLink: %s" % self.GetItemText(self.item) + "\n")
1207             
1208
1209     def OnTextCtrl(self, event):
1210
1211         char = chr(event.GetKeyCode())
1212         self.log.info("EDITING THE TEXTCTRL: You Wrote '" + char + \
1213                        "' (KeyCode = " + str(event.GetKeyCode()) + ")\n")
1214         event.Skip()
1215
1216
1217     def OnComboBox(self, event):
1218
1219         selection = event.GetEventObject().GetValue()
1220         self.log.info("CHOICE FROM COMBOBOX: You Chose '" + selection + "'\n")
1221         event.Skip()