...
[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):
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         self.history.addtab(item)
963         if item['type'] in self.ild :
964             img = self.ild[item['type']]
965         else :
966             img = 24
967         self.SetItemImage(child, img, CT.TreeItemIcon_Normal)
968         self.SetItemImage(child, img, CT.TreeItemIcon_Expanded)
969         self.SetItemBold(child, True)
970         
971         #dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
972
973         #if dlg.ShowModal() == wx.ID_OK:
974         #    newname = dlg.GetValue()
975         #    newitem = self.AppendItem(self.current, newname)
976         #    self.EnsureVisible(newitem)
977         
978
979         #dlg.Destroy()
980         
981
982     def OnBeginEdit(self, event):
983         
984         #self.log.info("OnBeginEdit" + "\n")
985         # show how to prevent edit...
986         item = event.GetItem()
987         if item and self.GetItemText(item) == "The Root Item":
988             wx.Bell()
989             #self.log.info("You can't edit this one..." + "\n")
990
991             # Lets just see what's visible of its children
992             cookie = 0
993             root = event.GetItem()
994             (child, cookie) = self.GetFirstChild(root)
995
996             while child:
997                 #self.log.info("Child [%s] visible = %d" % (self.GetItemText(child), self.IsVisible(child)) + "\n")
998                 (child, cookie) = self.GetNextChild(root, cookie)
999
1000             event.Veto()
1001
1002
1003     def OnEndEdit(self, event):
1004         
1005         #self.log.info("OnEndEdit: %s %s" %(event.IsEditCancelled(), event.GetLabel()))
1006         # show how to reject edit, we'll not allow any digits
1007         for x in event.GetLabel():
1008             if x in string.digits:
1009                 #self.log.info(", You can't enter digits..." + "\n")
1010                 event.Veto()
1011                 return
1012             
1013         self.log.info("\n")
1014
1015
1016     def OnLeftDClick(self, event):
1017         pt = event.GetPosition()
1018         item, flags = self.HitTest(pt)
1019         if item is not None :
1020             pydata = self.GetPyData(item)
1021             if pydata['uuid'] in self.parent.history.opened :
1022                 for i in range(self.parent.nb.GetPageCount()) :
1023                     page = self.parent.nb.GetPage(i)
1024                     if 'parametres' in dir(page) :
1025                         if page.parametres['uuid'] == pydata['uuid'] :
1026                             self.parent.nb.SetSelection(i)
1027                             break
1028             elif pydata['uuid'] in ['textroot', 'matroot'] :
1029                 pass
1030             else :
1031                 busy = wx.BusyInfo(_("Please wait..."), self.parent)
1032                 wx.SafeYield()
1033                 OpenAnalyse(self.parent, pydata)
1034                 del busy
1035                 self.SetItemBold(item, True)
1036                 self.OnSelChanged(pydata = pydata)
1037         #if item and (flags & CT.TREE_HITTEST_ONITEMLABEL):
1038         #    if self.GetAGWWindowStyleFlag() & CT.TR_EDIT_LABELS:
1039         #        self.log.info("OnLeftDClick: %s (manually starting label edit)"% self.GetItemText(item) + "\n")
1040                 
1041                 #self.EditLabel(item)
1042         #    else:
1043         #        pydata = self.GetPyData(item)
1044         #        print pydata
1045         #        self.log.info("OnLeftDClick: Cannot Start Manual Editing, Missing Style TR_EDIT_LABELS\n")
1046
1047         event.Skip()                
1048         
1049
1050     def OnItemExpanded(self, event):
1051         
1052         item = event.GetItem()
1053         if item:
1054             self.log.info("OnItemExpanded: %s" % self.GetItemText(item) + "\n")
1055
1056
1057     def OnItemExpanding(self, event):
1058         
1059         item = event.GetItem()
1060         if item:
1061             self.log.info("OnItemExpanding: %s" % self.GetItemText(item) + "\n")
1062             
1063         event.Skip()
1064
1065         
1066     def OnItemCollapsed(self, event):
1067
1068         item = event.GetItem()
1069         if item:
1070             self.log.info("OnItemCollapsed: %s" % self.GetItemText(item) + "\n")
1071             
1072
1073     def OnItemCollapsing(self, event):
1074
1075         item = event.GetItem()
1076         if item:
1077             self.log.info("OnItemCollapsing: %s" % self.GetItemText(item) + "\n")
1078     
1079         event.Skip()
1080
1081         
1082     def OnSelChanged(self, event = None, pydata = None):
1083         if event is not None :
1084             item = event.GetItem()
1085             pydata = self.GetPyData(item)
1086         if pydata is not None :
1087             self.pydata = pydata
1088             if pydata['uuid'] in self.parent.history.opened :
1089                 for i in range(self.parent.nb.GetPageCount()) :
1090                     self.page = self.parent.nb.GetPage(i)
1091                     if 'parametres' in dir(self.page) :
1092                         if self.page.parametres['uuid'] == pydata['uuid'] :
1093                             self.parent.nb.SetSelection(i)
1094                             break
1095         if event is not None :
1096             event.Skip()
1097
1098
1099     def OnSelChanging(self, event):
1100
1101         item = event.GetItem()
1102         olditem = event.GetOldItem()
1103         
1104         if item:
1105             if not olditem:
1106                 olditemtext = "None"
1107             else:
1108                 olditemtext = self.GetItemText(olditem)
1109             #self.log.info("OnSelChanging: From %s" % olditemtext + " To %s" % self.GetItemText(item) + "\n")
1110                 
1111         event.Skip()
1112
1113
1114     def OnBeginDrag(self, event):
1115
1116         self.item = event.GetItem()
1117         if self.item:
1118             self.log.info("Beginning Drag..." + "\n")
1119
1120             event.Allow()
1121
1122
1123     def OnBeginRDrag(self, event):
1124
1125         self.item = event.GetItem()
1126         if self.item:
1127             self.log.info("Beginning Right Drag..." + "\n")
1128
1129             event.Allow()
1130         
1131
1132     def OnEndDrag(self, event):
1133
1134         self.item = event.GetItem()
1135         if self.item:
1136             self.log.info("Ending Drag!" + "\n")
1137
1138         event.Skip()            
1139
1140
1141     def OnDeleteItem(self, event):
1142
1143         item = event.GetItem()
1144
1145         if not item:
1146             return
1147
1148         self.log.info("Deleting Item: %s" % self.GetItemText(item) + "\n")
1149         event.Skip()
1150         
1151
1152     def OnItemCheck(self, event):
1153
1154         item = event.GetItem()
1155         self.log.info("Item " + self.GetItemText(item) + " Has Been Checked!\n")
1156         event.Skip()
1157
1158
1159     def OnItemChecking(self, event):
1160
1161         item = event.GetItem()
1162         self.log.info("Item " + self.GetItemText(item) + " Is Being Checked...\n")
1163         event.Skip()
1164         
1165
1166     def OnToolTip(self, event):
1167
1168         item = event.GetItem()
1169         if item:
1170             event.SetToolTip(wx.ToolTip(self.GetItemText(item)))
1171
1172
1173     def OnItemMenu(self, event):
1174
1175         item = event.GetItem()
1176         if item:
1177             self.log.info("OnItemMenu: %s" % self.GetItemText(item) + "\n")
1178     
1179         event.Skip()
1180
1181
1182     def OnKey(self, event):
1183
1184         keycode = event.GetKeyCode()
1185         keyname = keyMap.get(keycode, None)
1186                 
1187         if keycode == wx.WXK_BACK:
1188             self.log.info("OnKeyDown: HAHAHAHA! I Vetoed Your Backspace! HAHAHAHA\n")
1189             return
1190
1191         if keyname is None:
1192             if "unicode" in wx.PlatformInfo:
1193                 keycode = event.GetUnicodeKey()
1194                 if keycode <= 127:
1195                     keycode = event.GetKeyCode()
1196                 keyname = "\"" + unichr(event.GetUnicodeKey()) + "\""
1197                 if keycode < 27:
1198                     keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1199                 
1200             elif keycode < 256:
1201                 if keycode == 0:
1202                     keyname = "NUL"
1203                 elif keycode < 27:
1204                     keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1205                 else:
1206                     keyname = "\"%s\"" % chr(keycode)
1207             else:
1208                 keyname = "unknown (%s)" % keycode
1209                 
1210         self.log.info("OnKeyDown: You Pressed '" + keyname + "'\n")
1211
1212         event.Skip()
1213         
1214         
1215     def OnActivate(self, event):
1216         
1217         if self.item:
1218             self.log.info("OnActivate: %s" % self.GetItemText(self.item) + "\n")
1219
1220         event.Skip()
1221
1222         
1223     def OnHyperLink(self, event):
1224
1225         item = event.GetItem()
1226         if item:
1227             self.log.info("OnHyperLink: %s" % self.GetItemText(self.item) + "\n")
1228             
1229
1230     def OnTextCtrl(self, event):
1231
1232         char = chr(event.GetKeyCode())
1233         self.log.info("EDITING THE TEXTCTRL: You Wrote '" + char + \
1234                        "' (KeyCode = " + str(event.GetKeyCode()) + ")\n")
1235         event.Skip()
1236
1237
1238     def OnComboBox(self, event):
1239
1240         selection = event.GetEventObject().GetValue()
1241         self.log.info("CHOICE FROM COMBOBOX: You Chose '" + selection + "'\n")
1242         event.Skip()