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