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