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