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