change dictionary on build
[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                     if item.IsSubMenu() :
417                         nmenu = wx.Menu()
418                         for val in item.GetSubMenu().GetMenuItems() :
419                             nmenu.Append(val.GetId(), val.GetText())
420                         menu.AppendMenu(itemid, itemtext, nmenu)
421                     else :
422                         menu.Append(itemid, itemtext)
423                 split = wx.Menu()
424                 splitfromvar = split.Append(-1, _(u"Split from variable").decode('utf8'))
425                 menu.AppendMenu(-1, _(u"Split matrix").decode('utf8'), split)
426                 self.Bind(wx.EVT_MENU, self.OnSplitFromVar, splitfromvar)
427                     #print item, itemid, itemtext
428                 #menu = self.parent.matrix_menu
429                 #freq = menu.Append(wx.ID_ANY, _(u"Frequency").decode('utf8'))
430                 #chi2 = menu.Append(wx.ID_ANY, _(u"Chi square").decode('utf8'))
431                 #chdreinert = menu.Append(wx.ID_ANY, _(u"Reinert clustering").decode('utf8'))
432                 #simi = menu.Append(wx.ID_ANY, _(u"Similarity analysis").decode('utf8'))
433                 menu.AppendSeparator()
434                 #self.Bind(wx.EVT_MENU, self.OnFreq, freq)
435                 #self.Bind(wx.EVT_MENU, self.OnChiSquare, chi2)
436                 #self.Bind(wx.EVT_MENU, self.OnSimiTab, simi)
437                 #self.Bind(wx.EVT_MENU, self.OnCHDReinert, chdreinert)
438             elif pydata.get('type', False) == 'alceste' and pydata['uuid'] in self.parent.history.opened :
439                 openmenu = wx.Menu()
440                 antipro = openmenu.Append(wx.ID_ANY, _(u"Antiprofiles").decode('utf8'))
441                 menu.AppendMenu(wx.ID_ANY, _(u"Open ...").decode('utf8'), openmenu)
442     
443                 profsr = menu.Append(wx.ID_ANY, _(u"Repeated segments profiles").decode('utf8'))
444                 profgram = menu.Append(wx.ID_ANY, _(u"POS profiles").decode('utf8'))
445                 export_corpus = menu.Append(wx.ID_ANY, _(u"Export corpus").decode('utf8'))
446                 colored = menu.Append(wx.ID_ANY, _(u"Colored corpus").decode('utf8'))
447                 navig = menu.Append(wx.ID_ANY, _(u"Navigator").decode('utf8'))
448                 statclasse = menu.Append(wx.ID_ANY, _(u"Clusters statistics").decode('utf8'))
449                 rapport = menu.Append(wx.ID_ANY, _(u"Report").decode('utf8'))
450                 export_classes = menu.Append(wx.ID_ANY, _(u"Export clusters").decode('utf8'))
451                 subcorpusfromcl = menu.Append(wx.ID_ANY, _(u"Sub corpus from clusters").decode('utf8'))
452                 menu.AppendSeparator()
453                 self.Bind(wx.EVT_MENU, self.OpenAntipro, antipro)
454                 self.Bind(wx.EVT_MENU, self.OnProfSR, profsr)
455                 self.Bind(wx.EVT_MENU, self.OnProfGram, profgram)
456                 self.Bind(wx.EVT_MENU, self.OnExportCorpus, export_corpus)
457                 self.Bind(wx.EVT_MENU, self.OnColored, colored)
458                 self.Bind(wx.EVT_MENU, self.OnNavig, navig)
459                 self.Bind(wx.EVT_MENU, self.StatClasse, statclasse)
460                 self.Bind(wx.EVT_MENU, self.OnRapport, rapport)
461                 self.Bind(wx.EVT_MENU, self.OnExportClasses, export_classes)
462                 self.Bind(wx.EVT_MENU, self.OnSubCorpusFromClusters, subcorpusfromcl)
463             elif pydata.get('type', False) == 'stat'  and pydata['uuid'] in self.parent.history.opened :
464                 export_dictionary =  menu.Append(wx.ID_ANY, _(u"Export dictionary").decode('utf8'))
465                 export_lems =  menu.Append(wx.ID_ANY, _(u"Export lemma dictionary").decode('utf8'))
466                 self.Bind(wx.EVT_MENU, self.OnExportDictionary, export_dictionary)
467                 self.Bind(wx.EVT_MENU, self.OnExportLems, export_lems)
468                 menu.AppendSeparator()
469             elif pydata.get('type', False) == 'spec'  and pydata['uuid'] in self.parent.history.opened :
470                 tgen = menu.Append(wx.ID_ANY, _(u"Tgen Editor").decode('utf8'))
471                 computetgen = menu.Append(wx.ID_ANY, _(u"Compute Tgen").decode('utf8'))
472                 self.Bind(wx.EVT_MENU, self.OnTgenEditor, tgen)
473                 self.Bind(wx.EVT_MENU, self.OnTgenCompute, computetgen)
474                 menu.AppendSeparator()
475             elif pydata.get('type', False) == 'reinertmatrix' and pydata['uuid'] in self.parent.history.opened :
476                 openmenu = wx.Menu()
477                 antipro = openmenu.Append(wx.ID_ANY, _(u"antiprofiles").decode('utf8'))
478                 rapport = menu.Append(wx.ID_ANY, _(u"Report").decode('utf8'))
479                 menu.AppendMenu(wx.ID_ANY, _(u"Open ...").decode('utf8'), openmenu)
480                 self.Bind(wx.EVT_MENU, self.OpenAntipro, antipro)
481                 self.Bind(wx.EVT_MENU, self.OnRapport, rapport)
482     
483     
484             itemdelete = menu.Append(wx.ID_ANY, _(u"Delete from history").decode('utf8'))
485             #item11 = menu.Append(wx.ID_ANY, "Prepend An Item")
486             #item12 = menu.Append(wx.ID_ANY, "Append An Item")
487     
488             #self.Bind(wx.EVT_MENU, self.OnItemBackground, item1)
489             #self.Bind(wx.EVT_MENU, self.OnItemForeground, item2)
490             #self.Bind(wx.EVT_MENU, self.OnItemBold, item3)
491             #self.Bind(wx.EVT_MENU, self.OnItemFont, item4)
492             #self.Bind(wx.EVT_MENU, self.OnItemHyperText, item5)
493             #self.Bind(wx.EVT_MENU, self.OnEnableWindow, item6)
494             #self.Bind(wx.EVT_MENU, self.OnDisableItem, item7)
495             #self.Bind(wx.EVT_MENU, self.OnItemIcons, item8)
496             self.Bind(wx.EVT_MENU, self.OnItemInfo, info)
497             self.Bind(wx.EVT_MENU, self.OnRename, rename)
498             self.Bind(wx.EVT_MENU, self.OnItemDelete, itemdelete)
499             #self.Bind(wx.EVT_MENU, self.OnItemPrepend, item11)
500             #self.Bind(wx.EVT_MENU, self.OnItemAppend, item12)
501             
502             self.PopupMenu(menu)
503             menu.Destroy()
504
505     def getcorpus(self):
506         busy = wx.BusyInfo(_("Please wait...Reading corpus").decode('utf8'), self.parent)
507         wx.SafeYield()
508         if self.pydata['uuid'] in self.parent.history.openedcorpus :
509             corpus = copycorpus(self.parent.history.openedcorpus[self.pydata['uuid']])
510         elif 'corpus_name' in self.pydata :
511             corpus = Corpus(self.parent, parametres = DoConf(self.pydata['ira']).getoptions('corpus'), read = True)
512         else :
513             cuuid = self.pydata['corpus']
514             if cuuid in self.parent.history.openedcorpus :
515                 corpus = copycorpus(self.parent.history.openedcorpus[cuuid])
516             else :
517                 irapath = self.parent.history.corpus[cuuid]['ira']
518                 corpus = Corpus(self.parent, parametres = DoConf(irapath).getoptions('corpus'), read = True)
519         del busy
520         return corpus
521     
522     def getmatrix(self):
523         if 'matrix_name' in self.pydata :
524             matrix = Tableau(self.parent, parametres = DoConf(self.pydata['ira']).getoptions('matrix'))
525             matrix.open()
526             return copymatrix(matrix)
527         else :
528             cuuid = self.pydata['matrix']
529             matrix = Tableau(self.parent, parametres = DoConf(self.history.matrixanalyse[cuuid]['ira']).getoptions('matrix'))
530             matrix.open()
531             return copymatrix(matrix)
532
533     def OnSpec(self, evt) :
534         self.parent.OnTextSpec(evt, self.getcorpus())
535
536     def OnStat(self, evt) :
537         self.parent.OnTextStat(evt, self.getcorpus())
538         
539     def OnReinert(self, evt) :
540         self.parent.OnTextReinert(evt, self.getcorpus())
541
542     def OnPam(self, evt) :
543         self.parent.OnPamSimple(evt, self.getcorpus())
544
545     def OnSimiTxt(self, evt) :
546         self.parent.OnSimiTxt(evt, self.getcorpus())
547
548     def OnWordCloud(self, evt) :
549         self.parent.OnWordCloud(evt, self.getcorpus())
550     
551     def OnFreq(self, evt):
552         self.parent.OnFreq(evt, self.getmatrix())
553         
554     def OnChiSquare(self, evt):
555         self.parent.OnChi2(evt, self.getmatrix())
556         
557     def OnSimiTab(self, evt): 
558         self.parent.OnSimiTab(evt, self.getmatrix())
559     
560     def OnProto(self, evt):
561         self.parent.OnProto(evt, self.getmatrix())
562     
563     def OnSplitFromVar(self, evt):
564         self.parent.OnSplitVar(evt, self.getmatrix())
565         
566     def OnCHDReinert(self, evt):
567         self.parent.OnCHDReinert(evt, self.getmatrix())
568     
569     def OnSubTextFromMeta(self, evt):
570         self.parent.OnSubText(self.getcorpus(), parametres = {'frommeta' : True})
571     
572     def OnSubTextFromTheme(self, evt):
573         self.parent.OnSubText(self.getcorpus(), parametres = {'fromtheme' : True})    
574
575     def OnProfSR(self, evt) :
576         ProfileSegment(self.parent, self.page.dictpathout, self.page.parametres, self.page.corpus)
577
578     def OnProfGram(self, evt) :
579         ProfilType(self.parent, self.page.corpus, self.page.parametres)
580
581     def OnExportCorpus(self, evt) :
582         dial = PrefExport(self, self.parent)
583         dial.fbb.SetValue(os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'export_corpus.txt'))
584         dial.CenterOnParent()
585         res = dial.ShowModal()
586         if res == wx.ID_OK :
587             if dial.radio_type.GetSelection() == 0 : alc = True
588             else : alc = False
589             if dial.radio_lem.GetSelection() == 0 : lem = True
590             else : lem = False
591             if self.page.parametres['classif_mode'] != 2 :
592                 uci = False
593             else :
594                 uci = True
595             self.page.corpus.export_corpus_classes(dial.fbb.GetValue(), alc = alc, lem = lem, uci = uci)
596             msg = u"Fini !"
597             dial.Destroy()
598             dlg = wx.MessageDialog(self.parent, msg, u"Export", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
599             dlg.CenterOnParent()
600             dlg.ShowModal()
601             dlg.Destroy()
602
603     def OnColored(self, evt) :
604         dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.html', 'title': _(u"Colored corpus").decode('utf8')})
605         dial.fbb.SetValue(os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'corpus_couleur.html'))
606         dial.CenterOnParent()
607         res = dial.ShowModal()
608         if res == wx.ID_OK :
609             fileout = dial.fbb.GetValue()
610             dial.Destroy()
611             if self.page.parametres['classif_mode'] != 2 :
612                 uci = False
613             else :
614                 uci = True
615             txt = self.page.corpus.make_colored_corpus(uci = uci)
616             with open(fileout, 'w') as f :
617                 f.write(txt)
618             msg = ' !\n'.join([_(u"Done").decode('utf8'), _(u"Open in a web browser ?").decode('utf8')])
619             dlg = wx.MessageDialog(self.parent, msg, u"Corpus en couleur", wx.NO | wx.YES | wx.NO_DEFAULT | wx.ICON_QUESTION)
620             dlg.CenterOnParent()
621             if dlg.ShowModal() == wx.ID_YES :
622                 webbrowser.open(fileout)
623             dlg.Destroy()
624
625     def OnNavig(self, evt):
626         if 'FrameSearch' not in dir(self.page) :
627             self.page.FrameSearch = SearchFrame(self.parent, -1, _(u"Search ...").decode('utf8'), self.page.corpus)
628         self.page.FrameSearch.Show()
629
630     def StatClasse(self, evt):
631         dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.csv', 'title': _(u"Clusters statistics").decode('utf8')})
632         dial.fbb.SetValue( os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'stat_par_classe.csv'))
633         dial.CenterOnParent()
634         res = dial.ShowModal()
635         if res == wx.ID_OK :
636             fileout = dial.fbb.GetValue()
637             dial.Destroy()
638             self.page.corpus.get_stat_by_cluster(fileout)
639             msg = u"Fini !"
640             dlg = wx.MessageDialog(self.parent, msg, _(u"Clusters statistics").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
641             dlg.CenterOnParent()
642             if dlg.ShowModal() == wx.ID_OK :
643                 dlg.Destroy()        
644
645     def OpenAntipro(self, evt) :
646         find = False
647         for i in range(0, self.page.TabChdSim.GetPageCount()) :
648             page = self.page.TabChdSim.GetPage(i)
649             if self.page.TabChdSim.GetPageText(i) == _(u"Antiprofiles").decode('utf8') :
650                 self.page.TabChdSim.SetSelection(i)
651                 find = True
652                 break
653         if not find :
654             open_antiprofil(self.page, self.page.dictpathout['ANTIPRO_OUT'], self.parent.syscoding)
655             self.page.TabChdSim.SetSelection(self.page.TabChdSim.GetPageCount() - 1)
656
657     def OnRapport(self, evt) :
658         dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.txt', 'title': _(u"Report").decode('utf8')})
659         dial.fbb.SetValue(self.page.dictpathout['rapport'])
660         dial.CenterOnParent()
661         res = dial.ShowModal()
662         if res == wx.ID_OK :
663             fileout = dial.fbb.GetValue()
664             dial.Destroy()
665             with open(fileout, 'w') as f :
666                 f.write(self.page.debtext + '\n' + GetTxtProfile(self.page.DictProfile, self.page.cluster_size))
667             msg = u"Fini !"
668             dlg = wx.MessageDialog(self.parent, msg, _(u"Report").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
669             dlg.CenterOnParent()
670             dlg.ShowModal()
671             dlg.Destroy()
672         else :
673             dial.Destroy()
674
675     def OnExportDictionary(self, evt) :
676         corpus = self.page.corpus
677         corpus.export_dictionary(self.page.pathout['dictionary.csv'], self.parent.syscoding)
678         log.info('export dictionary %s' % self.page.pathout['dictionary.csv'])
679         dial = wx.MessageDialog(self.parent, self.page.pathout['dictionary.csv'], 'Export', wx.OK)
680         dial.ShowModal()
681         dial.Destroy()
682         
683     def OnExportLems(self, evt) :
684         corpus = self.page.corpus
685         corpus.export_lems(self.page.pathout['lemmes.csv'], self.parent.syscoding)
686         log.info('export lemmes %s' % self.page.pathout['lemmes.csv'])
687         dial = wx.MessageDialog(self.parent, self.page.pathout['lemmes.csv'], 'Export', wx.OK)
688         dial.ShowModal()
689         dial.Destroy()
690     
691     def OnTgenEditor(self, evt):
692         corpus = self.page.corpus
693         tgenpath = os.path.join(self.page.parametres['pathout'], 'tgen.csv')
694         tgen = TGen(path = tgenpath, encoding = self.parent.syscoding)
695         if os.path.exists(tgenpath) :
696             tgen.read(tgenpath)
697         if isinstance(evt, list) :
698             i = 0
699             while 'tgen%i' %i in tgen.tgen :
700                 i += 1
701             tgenname = 'tgen%i' %i
702             tgen.tgen[tgenname] = evt
703         tgenframe = TGenFrame(self.parent, corpus, tgen)
704         tgenframe.Show()
705         if isinstance(evt, list) :
706             tgenframe.OnNewTgen(None, tgen = tgenname)
707     
708     def OnTgenCompute(self, evt):
709         corpus = self.page.corpus
710         tgenpath = os.path.join(self.page.parametres['pathout'], 'tgen.csv')        
711         if not os.path.exists(tgenpath) :
712             message = wx.MessageDialog(self.parent, _(u"No TGen yet !"), style = wx.ICON_EXCLAMATION | wx.OK) 
713             message.ShowModal()
714             message.Destroy()
715         else :
716             self.page.parametres['tgenpath'] = tgenpath
717             tgen = TGen(path = tgenpath, encoding = self.parent.syscoding)
718             self.page.parametres['etoiles'] = self.page.etoiles
719             TgenSpec(self.parent, corpus, self.page.parametres)
720             TgenLayout(self.page)
721     
722     def OnExportClasses(self, event):
723         corpus = self.page.corpus
724         if self.page.parametres['classif_mode'] != 2 :
725             uci = False
726         else :
727             uci = True
728         busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self.parent)
729         wx.SafeYield()
730         for i in range(1, self.page.parametres['clnb'] + 1) :
731             corpus.export_classe(self.page.pathout['classe_%i_export.txt' % i], i, uci = uci)
732         del busy
733         dial = wx.MessageDialog(self, self.page.pathout['classe_x_export.txt'], u"Export", wx.OK|wx.ICON_INFORMATION)
734         dial.ShowModal()
735         dial.Destroy()
736     
737     def OnSubCorpusFromClusters(self, evt):
738         self.parent.OnSubText(self.getcorpus(), parametres = {'fromclusters' : True, 'clnb': self.page.parametres['clnb'], 'lc' : self.page.corpus.lc})
739     
740     def OnRename(self, event):
741         pydata = self.itemdict['pydata']
742         print pydata
743
744     def OnItemBackground(self, event):
745
746         colourdata = wx.ColourData()
747         colourdata.SetColour(self.itemdict["back"])
748         dlg = wx.ColourDialog(self, colourdata)
749         
750         dlg.GetColourData().SetChooseFull(True)
751
752         if dlg.ShowModal() == wx.ID_OK:
753             data = dlg.GetColourData()
754             col1 = data.GetColour().Get()
755             self.SetItemBackgroundColour(self.current, col1)
756         dlg.Destroy()
757
758
759     def OnItemForeground(self, event):
760
761         colourdata = wx.ColourData()
762         colourdata.SetColour(self.itemdict["fore"])
763         dlg = wx.ColourDialog(self, colourdata)
764         
765         dlg.GetColourData().SetChooseFull(True)
766
767         if dlg.ShowModal() == wx.ID_OK:
768             data = dlg.GetColourData()
769             col1 = data.GetColour().Get()
770             self.SetItemTextColour(self.current, col1)
771         dlg.Destroy()
772
773
774     def OnItemBold(self, event):
775
776         self.SetItemBold(self.current, not self.itemdict["isbold"])
777
778
779     def OnItemFont(self, event):
780
781         data = wx.FontData()
782         font = self.itemdict["font"]
783         
784         if font is None:
785             font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
786             
787         data.SetInitialFont(font)
788
789         dlg = wx.FontDialog(self, data)
790         
791         if dlg.ShowModal() == wx.ID_OK:
792             data = dlg.GetFontData()
793             font = data.GetChosenFont()
794             self.SetItemFont(self.current, font)
795
796         dlg.Destroy()
797         
798
799     def OnItemHyperText(self, event):
800
801         self.SetItemHyperText(self.current, not self.itemdict["ishtml"])
802
803
804     def OnEnableWindow(self, event):
805
806         enable = self.GetItemWindowEnabled(self.current)
807         self.SetItemWindowEnabled(self.current, not enable)
808
809
810     def OnDisableItem(self, event):
811
812         self.EnableItem(self.current, False)
813         
814
815     def OnItemIcons(self, event):
816
817         bitmaps = [self.itemdict["normal"], self.itemdict["selected"],
818                    self.itemdict["expanded"], self.itemdict["selexp"]]
819
820         wx.BeginBusyCursor()        
821         dlg = TreeIcons(self, -1, bitmaps=bitmaps)
822         wx.EndBusyCursor()
823         dlg.ShowModal()
824
825
826     def SetNewIcons(self, bitmaps):
827
828         self.SetItemImage(self.current, bitmaps[0], CT.TreeItemIcon_Normal)
829         self.SetItemImage(self.current, bitmaps[1], CT.TreeItemIcon_Selected)
830         self.SetItemImage(self.current, bitmaps[2], CT.TreeItemIcon_Expanded)
831         self.SetItemImage(self.current, bitmaps[3], CT.TreeItemIcon_SelectedExpanded)
832
833
834     def OnItemInfo(self, event):
835
836         itemtext = self.itemdict["text"]
837         numchildren = str(self.itemdict["children"])
838         itemtype = self.itemdict["itemtype"]
839         pydata = self.itemdict['pydata']
840         #if 'analyses' in pydata :
841         #    toshow = dict([[val, pydata[val]] for val in pydata if val not in['analyses', 'isload']])
842         #else :
843         toshow = pydata['ira']
844         toshow = DoConf(toshow).getoptions()
845         txt = DoConf().totext(toshow)
846         parametres = [val.split('\t\t:') for val in txt.splitlines()]
847         parametres.sort()
848
849         if itemtype == 0:
850             itemtype = "Normal"
851         elif itemtype == 1:
852             itemtype = "CheckBox"
853         else:
854             itemtype = "RadioButton"
855
856         dlg = InfoDialog(self, itemtext, parametres)
857         dlg.CenterOnParent()
858         dlg.ShowModal()
859         dlg.Destroy()
860                 
861         
862
863     def OnItemDelete(self, event):
864
865         strs = "Are You Sure You Want To Delete Item " + self.GetItemText(self.current) + "?"
866         dlg = wx.MessageDialog(None, strs, 'Deleting Item', wx.OK | wx.CANCEL | wx.ICON_QUESTION)
867
868         if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
869             dlg.Destroy()
870             return
871
872         dlg.Destroy()
873         
874         pydata = self.itemdict['pydata']
875         if 'corpus_name' in pydata :
876             self.history.delete(pydata, True)
877         else :
878             self.history.delete(pydata)
879         self.DeleteChildren(self.current)
880         self.Delete(self.current)
881         self.current = None
882         
883
884
885     def OnItemPrepend(self, event):
886
887         dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
888
889         if dlg.ShowModal() == wx.ID_OK:
890             newname = dlg.GetValue()
891             newitem = self.PrependItem(self.current, newname)
892             self.EnsureVisible(newitem)
893
894         dlg.Destroy()
895
896     def AddAnalyse(self, parametres, itemParent = None, bold = True) :
897         uuid = parametres.get('corpus', None)
898         if uuid is not None :
899             if itemParent is None :
900                 itemParent = self.textroot
901             child, cookie = self.GetFirstChild(itemParent)
902             corpus = None
903             while child :
904                 pydata = self.GetPyData(child)
905                 if pydata['uuid'] == uuid :
906                     corpus = child
907                     break
908                 self.GiveFocus(child, uuid)
909                 child, cookie = self.GetNextChild(itemParent, cookie)
910             #item = self.AppendItem(child, parametres['name'])
911             if corpus is not None : 
912                 item = self.AppendItem(corpus, parametres['name'])
913             else :
914                 item = self.AppendItem(self.textroot, parametres['name'])
915         else :
916             item = self.AppendItem(self.matroot, parametres['name'])
917         self.SetPyData(item, parametres)
918         if parametres['type'] in self.ild :
919             img = self.ild[parametres['type']]
920         else :
921             img = 24
922         self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
923         self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
924         self.SetItemBold(item, bold)
925         self.SelectItem(item)
926     
927     def AddMatAnalyse(self, parametres, itemParent = None, bold = True) :
928         uuid = parametres.get('matrix', None)
929         if uuid is not None :
930             if itemParent is None :
931                 itemParent = self.matroot
932             child, cookie = self.GetFirstChild(itemParent)
933             matrix = None
934             while child :
935                 pydata = self.GetPyData(child)
936                 if pydata['uuid'] == uuid :
937                     matrix = child
938                     break
939                 self.GiveFocus(child, uuid)
940                 child, cookie = self.GetNextChild(itemParent, cookie)
941             #item = self.AppendItem(child, parametres['name'])
942             if matrix is not None : 
943                 item = self.AppendItem(matrix, parametres['name'])
944             else :
945                 item = self.AppendItem(self.matroot, parametres['name'])
946         self.SetPyData(item, parametres)
947         if parametres['type'] in self.ild :
948             img = self.ild[parametres['type']]
949         else :
950             img = 24
951         self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
952         self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
953         self.SetItemBold(item, bold)
954         self.SelectItem(item)  
955         
956     def OnItemAppend(self, item, select = True):
957         if 'corpus_name' in item :
958             child = self.InsertItem(self.textroot, 0, item['corpus_name'])
959         else :
960             child = self.InsertItem(self.matroot, 0, item['matrix_name'])
961         self.SetPyData(child, item)
962         if item['type'] in self.ild :
963             img = self.ild[item['type']]
964         else :
965             img = 24
966         self.SetItemImage(child, img, CT.TreeItemIcon_Normal)
967         self.SetItemImage(child, img, CT.TreeItemIcon_Expanded)
968         if select :
969             self.history.addtab(item)
970             self.SetItemBold(child, True)
971         
972         #dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
973
974         #if dlg.ShowModal() == wx.ID_OK:
975         #    newname = dlg.GetValue()
976         #    newitem = self.AppendItem(self.current, newname)
977         #    self.EnsureVisible(newitem)
978         
979
980         #dlg.Destroy()
981         
982
983     def OnBeginEdit(self, event):
984         
985         #self.log.info("OnBeginEdit" + "\n")
986         # show how to prevent edit...
987         item = event.GetItem()
988         if item and self.GetItemText(item) == "The Root Item":
989             wx.Bell()
990             #self.log.info("You can't edit this one..." + "\n")
991
992             # Lets just see what's visible of its children
993             cookie = 0
994             root = event.GetItem()
995             (child, cookie) = self.GetFirstChild(root)
996
997             while child:
998                 #self.log.info("Child [%s] visible = %d" % (self.GetItemText(child), self.IsVisible(child)) + "\n")
999                 (child, cookie) = self.GetNextChild(root, cookie)
1000
1001             event.Veto()
1002
1003
1004     def OnEndEdit(self, event):
1005         
1006         #self.log.info("OnEndEdit: %s %s" %(event.IsEditCancelled(), event.GetLabel()))
1007         # show how to reject edit, we'll not allow any digits
1008         for x in event.GetLabel():
1009             if x in string.digits:
1010                 #self.log.info(", You can't enter digits..." + "\n")
1011                 event.Veto()
1012                 return
1013             
1014         self.log.info("\n")
1015
1016
1017     def OnLeftDClick(self, event):
1018         pt = event.GetPosition()
1019         item, flags = self.HitTest(pt)
1020         if item is not None :
1021             pydata = self.GetPyData(item)
1022             if pydata['uuid'] in self.parent.history.opened :
1023                 for i in range(self.parent.nb.GetPageCount()) :
1024                     page = self.parent.nb.GetPage(i)
1025                     if 'parametres' in dir(page) :
1026                         if page.parametres['uuid'] == pydata['uuid'] :
1027                             self.parent.nb.SetSelection(i)
1028                             break
1029             elif pydata['uuid'] in ['textroot', 'matroot'] :
1030                 pass
1031             else :
1032                 busy = wx.BusyInfo(_("Please wait..."), self.parent)
1033                 wx.SafeYield()
1034                 OpenAnalyse(self.parent, pydata)
1035                 del busy
1036                 self.SetItemBold(item, True)
1037                 self.OnSelChanged(pydata = pydata)
1038         #if item and (flags & CT.TREE_HITTEST_ONITEMLABEL):
1039         #    if self.GetAGWWindowStyleFlag() & CT.TR_EDIT_LABELS:
1040         #        self.log.info("OnLeftDClick: %s (manually starting label edit)"% self.GetItemText(item) + "\n")
1041                 
1042                 #self.EditLabel(item)
1043         #    else:
1044         #        pydata = self.GetPyData(item)
1045         #        print pydata
1046         #        self.log.info("OnLeftDClick: Cannot Start Manual Editing, Missing Style TR_EDIT_LABELS\n")
1047
1048         event.Skip()                
1049         
1050
1051     def OnItemExpanded(self, event):
1052         
1053         item = event.GetItem()
1054         if item:
1055             self.log.info("OnItemExpanded: %s" % self.GetItemText(item) + "\n")
1056
1057
1058     def OnItemExpanding(self, event):
1059         
1060         item = event.GetItem()
1061         if item:
1062             self.log.info("OnItemExpanding: %s" % self.GetItemText(item) + "\n")
1063             
1064         event.Skip()
1065
1066         
1067     def OnItemCollapsed(self, event):
1068
1069         item = event.GetItem()
1070         if item:
1071             self.log.info("OnItemCollapsed: %s" % self.GetItemText(item) + "\n")
1072             
1073
1074     def OnItemCollapsing(self, event):
1075
1076         item = event.GetItem()
1077         if item:
1078             self.log.info("OnItemCollapsing: %s" % self.GetItemText(item) + "\n")
1079     
1080         event.Skip()
1081
1082         
1083     def OnSelChanged(self, event = None, pydata = None):
1084         if event is not None :
1085             item = event.GetItem()
1086             pydata = self.GetPyData(item)
1087         if pydata is not None :
1088             self.pydata = pydata
1089             if pydata['uuid'] in self.parent.history.opened :
1090                 for i in range(self.parent.nb.GetPageCount()) :
1091                     self.page = self.parent.nb.GetPage(i)
1092                     if 'parametres' in dir(self.page) :
1093                         if self.page.parametres['uuid'] == pydata['uuid'] :
1094                             self.parent.nb.SetSelection(i)
1095                             break
1096         if event is not None :
1097             event.Skip()
1098
1099
1100     def OnSelChanging(self, event):
1101
1102         item = event.GetItem()
1103         olditem = event.GetOldItem()
1104         
1105         if item:
1106             if not olditem:
1107                 olditemtext = "None"
1108             else:
1109                 olditemtext = self.GetItemText(olditem)
1110             #self.log.info("OnSelChanging: From %s" % olditemtext + " To %s" % self.GetItemText(item) + "\n")
1111                 
1112         event.Skip()
1113
1114
1115     def OnBeginDrag(self, event):
1116
1117         self.item = event.GetItem()
1118         if self.item:
1119             self.log.info("Beginning Drag..." + "\n")
1120
1121             event.Allow()
1122
1123
1124     def OnBeginRDrag(self, event):
1125
1126         self.item = event.GetItem()
1127         if self.item:
1128             self.log.info("Beginning Right Drag..." + "\n")
1129
1130             event.Allow()
1131         
1132
1133     def OnEndDrag(self, event):
1134
1135         self.item = event.GetItem()
1136         if self.item:
1137             self.log.info("Ending Drag!" + "\n")
1138
1139         event.Skip()            
1140
1141
1142     def OnDeleteItem(self, event):
1143
1144         item = event.GetItem()
1145
1146         if not item:
1147             return
1148
1149         self.log.info("Deleting Item: %s" % self.GetItemText(item) + "\n")
1150         event.Skip()
1151         
1152
1153     def OnItemCheck(self, event):
1154
1155         item = event.GetItem()
1156         self.log.info("Item " + self.GetItemText(item) + " Has Been Checked!\n")
1157         event.Skip()
1158
1159
1160     def OnItemChecking(self, event):
1161
1162         item = event.GetItem()
1163         self.log.info("Item " + self.GetItemText(item) + " Is Being Checked...\n")
1164         event.Skip()
1165         
1166
1167     def OnToolTip(self, event):
1168
1169         item = event.GetItem()
1170         if item:
1171             event.SetToolTip(wx.ToolTip(self.GetItemText(item)))
1172
1173
1174     def OnItemMenu(self, event):
1175
1176         item = event.GetItem()
1177         if item:
1178             self.log.info("OnItemMenu: %s" % self.GetItemText(item) + "\n")
1179     
1180         event.Skip()
1181
1182
1183     def OnKey(self, event):
1184
1185         keycode = event.GetKeyCode()
1186         keyname = keyMap.get(keycode, None)
1187                 
1188         if keycode == wx.WXK_BACK:
1189             self.log.info("OnKeyDown: HAHAHAHA! I Vetoed Your Backspace! HAHAHAHA\n")
1190             return
1191
1192         if keyname is None:
1193             if "unicode" in wx.PlatformInfo:
1194                 keycode = event.GetUnicodeKey()
1195                 if keycode <= 127:
1196                     keycode = event.GetKeyCode()
1197                 keyname = "\"" + unichr(event.GetUnicodeKey()) + "\""
1198                 if keycode < 27:
1199                     keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1200                 
1201             elif keycode < 256:
1202                 if keycode == 0:
1203                     keyname = "NUL"
1204                 elif keycode < 27:
1205                     keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1206                 else:
1207                     keyname = "\"%s\"" % chr(keycode)
1208             else:
1209                 keyname = "unknown (%s)" % keycode
1210                 
1211         self.log.info("OnKeyDown: You Pressed '" + keyname + "'\n")
1212
1213         event.Skip()
1214         
1215         
1216     def OnActivate(self, event):
1217         
1218         if self.item:
1219             self.log.info("OnActivate: %s" % self.GetItemText(self.item) + "\n")
1220
1221         event.Skip()
1222
1223         
1224     def OnHyperLink(self, event):
1225
1226         item = event.GetItem()
1227         if item:
1228             self.log.info("OnHyperLink: %s" % self.GetItemText(self.item) + "\n")
1229             
1230
1231     def OnTextCtrl(self, event):
1232
1233         char = chr(event.GetKeyCode())
1234         self.log.info("EDITING THE TEXTCTRL: You Wrote '" + char + \
1235                        "' (KeyCode = " + str(event.GetKeyCode()) + ")\n")
1236         event.Skip()
1237
1238
1239     def OnComboBox(self, event):
1240
1241         selection = event.GetEventObject().GetValue()
1242         self.log.info("CHOICE FROM COMBOBOX: You Chose '" + selection + "'\n")
1243         event.Skip()