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