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