...
[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 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         print pydata
754
755     def OnItemBackground(self, event):
756
757         colourdata = wx.ColourData()
758         colourdata.SetColour(self.itemdict["back"])
759         dlg = wx.ColourDialog(self, colourdata)
760         
761         dlg.GetColourData().SetChooseFull(True)
762
763         if dlg.ShowModal() == wx.ID_OK:
764             data = dlg.GetColourData()
765             col1 = data.GetColour().Get()
766             self.SetItemBackgroundColour(self.current, col1)
767         dlg.Destroy()
768
769
770     def OnItemForeground(self, event):
771
772         colourdata = wx.ColourData()
773         colourdata.SetColour(self.itemdict["fore"])
774         dlg = wx.ColourDialog(self, colourdata)
775         
776         dlg.GetColourData().SetChooseFull(True)
777
778         if dlg.ShowModal() == wx.ID_OK:
779             data = dlg.GetColourData()
780             col1 = data.GetColour().Get()
781             self.SetItemTextColour(self.current, col1)
782         dlg.Destroy()
783
784
785     def OnItemBold(self, event):
786
787         self.SetItemBold(self.current, not self.itemdict["isbold"])
788
789
790     def OnItemFont(self, event):
791
792         data = wx.FontData()
793         font = self.itemdict["font"]
794         
795         if font is None:
796             font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
797             
798         data.SetInitialFont(font)
799
800         dlg = wx.FontDialog(self, data)
801         
802         if dlg.ShowModal() == wx.ID_OK:
803             data = dlg.GetFontData()
804             font = data.GetChosenFont()
805             self.SetItemFont(self.current, font)
806
807         dlg.Destroy()
808         
809
810     def OnItemHyperText(self, event):
811
812         self.SetItemHyperText(self.current, not self.itemdict["ishtml"])
813
814
815     def OnEnableWindow(self, event):
816
817         enable = self.GetItemWindowEnabled(self.current)
818         self.SetItemWindowEnabled(self.current, not enable)
819
820
821     def OnDisableItem(self, event):
822
823         self.EnableItem(self.current, False)
824         
825
826     def OnItemIcons(self, event):
827
828         bitmaps = [self.itemdict["normal"], self.itemdict["selected"],
829                    self.itemdict["expanded"], self.itemdict["selexp"]]
830
831         wx.BeginBusyCursor()        
832         dlg = TreeIcons(self, -1, bitmaps=bitmaps)
833         wx.EndBusyCursor()
834         dlg.ShowModal()
835
836
837     def SetNewIcons(self, bitmaps):
838
839         self.SetItemImage(self.current, bitmaps[0], CT.TreeItemIcon_Normal)
840         self.SetItemImage(self.current, bitmaps[1], CT.TreeItemIcon_Selected)
841         self.SetItemImage(self.current, bitmaps[2], CT.TreeItemIcon_Expanded)
842         self.SetItemImage(self.current, bitmaps[3], CT.TreeItemIcon_SelectedExpanded)
843
844
845     def OnItemInfo(self, event):
846
847         itemtext = self.itemdict["text"]
848         numchildren = str(self.itemdict["children"])
849         itemtype = self.itemdict["itemtype"]
850         pydata = self.itemdict['pydata']
851         #if 'analyses' in pydata :
852         #    toshow = dict([[val, pydata[val]] for val in pydata if val not in['analyses', 'isload']])
853         #else :
854         toshow = pydata['ira']
855         toshow = DoConf(toshow).getoptions()
856         txt = DoConf().totext(toshow)
857         parametres = [val.split('\t\t:') for val in txt.splitlines()]
858         parametres.sort()
859
860         if itemtype == 0:
861             itemtype = "Normal"
862         elif itemtype == 1:
863             itemtype = "CheckBox"
864         else:
865             itemtype = "RadioButton"
866
867         dlg = InfoDialog(self, itemtext, parametres)
868         dlg.CenterOnParent()
869         dlg.ShowModal()
870         dlg.Destroy()
871                 
872         
873
874     def OnItemDelete(self, event):
875
876         strs = "Are You Sure You Want To Delete Item " + self.GetItemText(self.current) + "?"
877         dlg = wx.MessageDialog(None, strs, 'Deleting Item', wx.OK | wx.CANCEL | wx.ICON_QUESTION)
878
879         if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
880             dlg.Destroy()
881             return
882
883         dlg.Destroy()
884         
885         pydata = self.itemdict['pydata']
886         if 'corpus_name' in pydata :
887             self.history.delete(pydata, True)
888         else :
889             self.history.delete(pydata)
890         self.DeleteChildren(self.current)
891         self.Delete(self.current)
892         self.current = None
893         
894
895
896     def OnItemPrepend(self, event):
897
898         dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
899
900         if dlg.ShowModal() == wx.ID_OK:
901             newname = dlg.GetValue()
902             newitem = self.PrependItem(self.current, newname)
903             self.EnsureVisible(newitem)
904
905         dlg.Destroy()
906
907     def AddAnalyse(self, parametres, itemParent = None, bold = True) :
908         uuid = parametres.get('corpus', None)
909         if uuid is not None :
910             if itemParent is None :
911                 itemParent = self.textroot
912             child, cookie = self.GetFirstChild(itemParent)
913             corpus = None
914             while child :
915                 pydata = self.GetPyData(child)
916                 if pydata['uuid'] == uuid :
917                     corpus = child
918                     break
919                 self.GiveFocus(child, uuid)
920                 child, cookie = self.GetNextChild(itemParent, cookie)
921             #item = self.AppendItem(child, parametres['name'])
922             if corpus is not None : 
923                 item = self.AppendItem(corpus, parametres['name'])
924             else :
925                 item = self.AppendItem(self.textroot, parametres['name'])
926         else :
927             item = self.AppendItem(self.matroot, parametres['name'])
928         self.SetPyData(item, parametres)
929         if parametres['type'] in self.ild :
930             img = self.ild[parametres['type']]
931         else :
932             img = 24
933         self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
934         self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
935         self.SetItemBold(item, bold)
936         self.SelectItem(item)
937     
938     def AddMatAnalyse(self, parametres, itemParent = None, bold = True) :
939         uuid = parametres.get('matrix', None)
940         if uuid is not None :
941             if itemParent is None :
942                 itemParent = self.matroot
943             child, cookie = self.GetFirstChild(itemParent)
944             matrix = None
945             while child :
946                 pydata = self.GetPyData(child)
947                 if pydata['uuid'] == uuid :
948                     matrix = child
949                     break
950                 self.GiveFocus(child, uuid)
951                 child, cookie = self.GetNextChild(itemParent, cookie)
952             #item = self.AppendItem(child, parametres['name'])
953             if matrix is not None : 
954                 item = self.AppendItem(matrix, parametres['name'])
955             else :
956                 item = self.AppendItem(self.matroot, parametres['name'])
957         self.SetPyData(item, parametres)
958         if parametres['type'] in self.ild :
959             img = self.ild[parametres['type']]
960         else :
961             img = 24
962         self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
963         self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
964         self.SetItemBold(item, bold)
965         self.SelectItem(item)  
966         
967     def OnItemAppend(self, item, select = True):
968         if 'corpus_name' in item :
969             child = self.InsertItem(self.textroot, 0, item['corpus_name'])
970         else :
971             child = self.InsertItem(self.matroot, 0, item['matrix_name'])
972         self.SetPyData(child, item)
973         if item['type'] in self.ild :
974             img = self.ild[item['type']]
975         else :
976             img = 24
977         self.SetItemImage(child, img, CT.TreeItemIcon_Normal)
978         self.SetItemImage(child, img, CT.TreeItemIcon_Expanded)
979         if select :
980             self.history.addtab(item)
981             self.SetItemBold(child, True)
982             self.SelectItem(child)
983         
984         #dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
985
986         #if dlg.ShowModal() == wx.ID_OK:
987         #    newname = dlg.GetValue()
988         #    newitem = self.AppendItem(self.current, newname)
989         #    self.EnsureVisible(newitem)
990         
991
992         #dlg.Destroy()
993         
994
995     def OnBeginEdit(self, event):
996         
997         #self.log.info("OnBeginEdit" + "\n")
998         # show how to prevent edit...
999         item = event.GetItem()
1000         if item and self.GetItemText(item) == "The Root Item":
1001             wx.Bell()
1002             #self.log.info("You can't edit this one..." + "\n")
1003
1004             # Lets just see what's visible of its children
1005             cookie = 0
1006             root = event.GetItem()
1007             (child, cookie) = self.GetFirstChild(root)
1008
1009             while child:
1010                 #self.log.info("Child [%s] visible = %d" % (self.GetItemText(child), self.IsVisible(child)) + "\n")
1011                 (child, cookie) = self.GetNextChild(root, cookie)
1012
1013             event.Veto()
1014
1015
1016     def OnEndEdit(self, event):
1017         
1018         #self.log.info("OnEndEdit: %s %s" %(event.IsEditCancelled(), event.GetLabel()))
1019         # show how to reject edit, we'll not allow any digits
1020         for x in event.GetLabel():
1021             if x in string.digits:
1022                 #self.log.info(", You can't enter digits..." + "\n")
1023                 event.Veto()
1024                 return
1025             
1026         self.log.info("\n")
1027
1028
1029     def OnLeftDClick(self, event):
1030         pt = event.GetPosition()
1031         item, flags = self.HitTest(pt)
1032         if item is not None :
1033             pydata = self.GetPyData(item)
1034             if pydata['uuid'] in self.parent.history.opened :
1035                 for i in range(self.parent.nb.GetPageCount()) :
1036                     page = self.parent.nb.GetPage(i)
1037                     if 'parametres' in dir(page) :
1038                         if page.parametres['uuid'] == pydata['uuid'] :
1039                             self.parent.nb.SetSelection(i)
1040                             break
1041             elif pydata['uuid'] in ['textroot', 'matroot'] :
1042                 pass
1043             else :
1044                 if os.path.exists(pydata['ira']) :
1045                     busy = wx.BusyInfo(_("Please wait..."), self.parent)
1046                     wx.SafeYield()
1047                     try :
1048                         OpenAnalyse(self.parent, pydata)
1049                         del busy
1050                         self.SetItemBold(item, True)
1051                         self.OnSelChanged(pydata = pydata)
1052                     except :
1053                         del busy
1054                         BugReport(self.ira)
1055                 else :
1056                     wx.MessageBox(_(u"This file does not exist : %s" % pydata['ira']).decode('utf8'), 'Information', wx.ICON_EXCLAMATION | wx.STAY_ON_TOP )
1057         #if item and (flags & CT.TREE_HITTEST_ONITEMLABEL):
1058         #    if self.GetAGWWindowStyleFlag() & CT.TR_EDIT_LABELS:
1059         #        self.log.info("OnLeftDClick: %s (manually starting label edit)"% self.GetItemText(item) + "\n")
1060                 
1061                 #self.EditLabel(item)
1062         #    else:
1063         #        pydata = self.GetPyData(item)
1064         #        print pydata
1065         #        self.log.info("OnLeftDClick: Cannot Start Manual Editing, Missing Style TR_EDIT_LABELS\n")
1066
1067         event.Skip()                
1068         
1069
1070     def OnItemExpanded(self, event):
1071         
1072         item = event.GetItem()
1073         if item:
1074             self.log.info("OnItemExpanded: %s" % self.GetItemText(item) + "\n")
1075
1076
1077     def OnItemExpanding(self, event):
1078         
1079         item = event.GetItem()
1080         if item:
1081             self.log.info("OnItemExpanding: %s" % self.GetItemText(item) + "\n")
1082             
1083         event.Skip()
1084
1085         
1086     def OnItemCollapsed(self, event):
1087
1088         item = event.GetItem()
1089         if item:
1090             self.log.info("OnItemCollapsed: %s" % self.GetItemText(item) + "\n")
1091             
1092
1093     def OnItemCollapsing(self, event):
1094
1095         item = event.GetItem()
1096         if item:
1097             self.log.info("OnItemCollapsing: %s" % self.GetItemText(item) + "\n")
1098     
1099         event.Skip()
1100
1101         
1102     def OnSelChanged(self, event = None, pydata = None):
1103         if event is not None :
1104             item = event.GetItem()
1105             pydata = self.GetPyData(item)
1106
1107         if pydata is not None :
1108             if 'corpus_name' in pydata or 'corpus' in pydata :
1109                 self.ira.ShowMenu('text', True)
1110                 self.ira.ShowMenu('matrix', False)
1111             if 'matrix_name' in pydata or 'matrix' in pydata:
1112                 self.ira.ShowMenu('text', False)
1113                 self.ira.ShowMenu('matrix', True)                
1114             self.pydata = pydata
1115             if pydata['uuid'] in self.parent.history.opened :
1116                 for i in range(self.parent.nb.GetPageCount()) :
1117                     self.page = self.parent.nb.GetPage(i)
1118                     if 'parametres' in dir(self.page) :
1119                         if self.page.parametres['uuid'] == pydata['uuid'] :
1120                             self.parent.nb.SetSelection(i)
1121                             break
1122         if event is not None :
1123             event.Skip()
1124
1125
1126     def OnSelChanging(self, event):
1127
1128         item = event.GetItem()
1129         olditem = event.GetOldItem()
1130         
1131         if item:
1132             if not olditem:
1133                 olditemtext = "None"
1134             else:
1135                 olditemtext = self.GetItemText(olditem)
1136             #self.log.info("OnSelChanging: From %s" % olditemtext + " To %s" % self.GetItemText(item) + "\n")
1137                 
1138         event.Skip()
1139
1140
1141     def OnBeginDrag(self, event):
1142
1143         self.item = event.GetItem()
1144         if self.item:
1145             self.log.info("Beginning Drag..." + "\n")
1146
1147             event.Allow()
1148
1149
1150     def OnBeginRDrag(self, event):
1151
1152         self.item = event.GetItem()
1153         if self.item:
1154             self.log.info("Beginning Right Drag..." + "\n")
1155
1156             event.Allow()
1157         
1158
1159     def OnEndDrag(self, event):
1160
1161         self.item = event.GetItem()
1162         if self.item:
1163             self.log.info("Ending Drag!" + "\n")
1164
1165         event.Skip()            
1166
1167
1168     def OnDeleteItem(self, event):
1169
1170         item = event.GetItem()
1171
1172         if not item:
1173             return
1174
1175         self.log.info("Deleting Item: %s" % self.GetItemText(item) + "\n")
1176         event.Skip()
1177         
1178
1179     def OnItemCheck(self, event):
1180
1181         item = event.GetItem()
1182         self.log.info("Item " + self.GetItemText(item) + " Has Been Checked!\n")
1183         event.Skip()
1184
1185
1186     def OnItemChecking(self, event):
1187
1188         item = event.GetItem()
1189         self.log.info("Item " + self.GetItemText(item) + " Is Being Checked...\n")
1190         event.Skip()
1191         
1192
1193     def OnToolTip(self, event):
1194
1195         item = event.GetItem()
1196         if item:
1197             event.SetToolTip(wx.ToolTip(self.GetItemText(item)))
1198
1199
1200     def OnItemMenu(self, event):
1201
1202         item = event.GetItem()
1203         if item:
1204             self.log.info("OnItemMenu: %s" % self.GetItemText(item) + "\n")
1205     
1206         event.Skip()
1207
1208
1209     def OnKey(self, event):
1210
1211         keycode = event.GetKeyCode()
1212         keyname = keyMap.get(keycode, None)
1213                 
1214         if keycode == wx.WXK_BACK:
1215             self.log.info("OnKeyDown: HAHAHAHA! I Vetoed Your Backspace! HAHAHAHA\n")
1216             return
1217
1218         if keyname is None:
1219             if "unicode" in wx.PlatformInfo:
1220                 keycode = event.GetUnicodeKey()
1221                 if keycode <= 127:
1222                     keycode = event.GetKeyCode()
1223                 keyname = "\"" + unichr(event.GetUnicodeKey()) + "\""
1224                 if keycode < 27:
1225                     keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1226                 
1227             elif keycode < 256:
1228                 if keycode == 0:
1229                     keyname = "NUL"
1230                 elif keycode < 27:
1231                     keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1232                 else:
1233                     keyname = "\"%s\"" % chr(keycode)
1234             else:
1235                 keyname = "unknown (%s)" % keycode
1236                 
1237         self.log.info("OnKeyDown: You Pressed '" + keyname + "'\n")
1238
1239         event.Skip()
1240         
1241         
1242     def OnActivate(self, event):
1243         
1244         if self.item:
1245             self.log.info("OnActivate: %s" % self.GetItemText(self.item) + "\n")
1246
1247         event.Skip()
1248
1249         
1250     def OnHyperLink(self, event):
1251
1252         item = event.GetItem()
1253         if item:
1254             self.log.info("OnHyperLink: %s" % self.GetItemText(self.item) + "\n")
1255             
1256
1257     def OnTextCtrl(self, event):
1258
1259         char = chr(event.GetKeyCode())
1260         self.log.info("EDITING THE TEXTCTRL: You Wrote '" + char + \
1261                        "' (KeyCode = " + str(event.GetKeyCode()) + ")\n")
1262         event.Skip()
1263
1264
1265     def OnComboBox(self, event):
1266
1267         selection = event.GetEventObject().GetValue()
1268         self.log.info("CHOICE FROM COMBOBOX: You Chose '" + selection + "'\n")
1269         event.Skip()