1 # -*- coding: utf-8 -*-
2 #Author: Pierre Ratinaud
3 #Copyright (c) 2012, Pierre Ratinaud
9 import wx.lib.agw.customtreectrl as CT
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
22 log = logging.getLogger('iramuteq.tree')
24 class InfoDialog ( wx.Dialog ):
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 :
32 self.SetSizeHintsSz( wx.Size( 500,200 ), wx.DefaultSize )
34 bSizer1 = wx.BoxSizer( wx.VERTICAL )
36 self.m_panel2 = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
37 bSizer2 = wx.BoxSizer( wx.VERTICAL )
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 )
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 )
49 self.m_panel1 = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
51 fgSizer1 = wx.FlexGridSizer( 0, nb, 0, 0 )
52 fgSizer1.SetFlexibleDirection( wx.BOTH )
53 fgSizer1.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED )
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)
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 )
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();
76 bSizer1.Add( m_sdbSizer1, 0, wx.EXPAND, 5 )
79 self.SetSizer( bSizer1 )
83 self.Centre( wx.BOTH )
89 class LeftTree(CT.CustomTreeCtrl):
91 def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition,
93 style=wx.SUNKEN_BORDER|wx.WANTS_CHARS,
94 agwStyle=CT.TR_HIDE_ROOT|CT.TR_HAS_BUTTONS|CT.TR_HAS_VARIABLE_ROW_HEIGHT):
96 CT.CustomTreeCtrl.__init__(self, parent, id, pos, size, style, agwStyle)
102 if data.startswith("TR_"):
103 treestyles.append(data)
104 elif data.startswith("EVT_"):
108 self.styles = treestyles
111 self.il = wx.ImageList(16, 16)
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)
134 self.history = parent.history
135 self.h = self.history.history
136 self.root = self.AddRoot("Iramuteq")
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)
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)
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)
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']]
162 self.SetItemImage(last, img, CT.TreeItemIcon_Normal)
163 self.SetItemImage(last, img, CT.TreeItemIcon_Expanded)
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)
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']]
185 self.SetItemImage(last, img, CT.TreeItemIcon_Normal)
186 self.SetItemImage(last, img, CT.TreeItemIcon_Expanded)
188 orphmat.append(matrix)
190 self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDClick)
191 #self.Bind(wx.EVT_IDLE, self.OnIdle)
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}
204 mainframe = wx.GetTopLevelParent(self)
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)
214 for combos in mainframe.treeevents:
215 self.BindEvents(combos)
217 if hasattr(mainframe, "leftpanel"):
218 self.ChangeStyle(mainframe.treestyles)
220 if not(self.GetAGWWindowStyleFlag() & CT.TR_HIDE_ROOT):
221 self.SelectItem(self.root)
222 self.Expand(self.root)
225 def BindEvents(self, choice, recreate=False):
227 value = choice.GetValue()
228 text = choice.GetLabel()
231 binder = self.eventdict[text]
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)
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)
245 def ChangeStyle(self, combos):
249 if combo.GetValue() == 1:
250 style = style | eval("CT." + combo.GetLabel())
252 if self.GetAGWWindowStyleFlag() != style:
253 self.SetAGWWindowStyleFlag(style)
256 def OnCompareItems(self, item1, item2):
258 t1 = self.GetItemText(item1)
259 t2 = self.GetItemText(item2)
270 def OnIdle(self, event):
274 # if self.gauge.IsEnabled() and self.gauge.IsShown():
275 # self.count = self.count + 1
277 # if self.count >= 50:
280 # self.gauge.SetValue(self.count)
288 def CloseItem(self, itemParent = None, uuid = None) :
289 if itemParent is None :
290 itemParent = self.root
291 child, cookie = self.GetFirstChild(itemParent)
293 pydata = self.GetPyData(child)
294 if pydata['uuid'] == uuid :
295 self.SetItemBold(child, False)
297 self.CloseItem(child, uuid)
298 child, cookie = self.GetNextChild(itemParent, cookie)
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)
305 pydata = self.GetPyData(child)
306 if pydata['uuid'] == uuid :
307 self.SelectItem(child)
309 self.SetItemBold(child, True)
311 self.GiveFocus(child, uuid, bold)
312 child, cookie = self.GetNextChild(itemParent, cookie)
314 def IsInTree(self, itemParent = None, uuid = None) :
315 if itemParent is None :
316 itemParent = self.root
317 child, cookie = self.GetFirstChild(itemParent)
320 pydata = self.GetPyData(child)
321 if pydata['uuid'] == uuid :
323 self.GiveFocus(child, uuid)
324 child, cookie = self.GetNextChild(itemParent, cookie)
328 def OnRightDown(self, event):
330 pt = event.GetPosition()
331 item, flags = self.HitTest(pt)
335 #self.log.info("OnRightClick: %s, %s, %s" % (self.GetItemText(item), type(item), item.__class__) + "\n")
336 self.SelectItem(item)
339 def OnRightUp(self, event):
347 if not self.IsItemEnabled(item):
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)
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)
364 # Enabling/Disabling Windows Associated To An Item
365 haswin = self.GetItemWindow(item)
367 # Enabling/Disabling Items
368 enabled = self.IsItemEnabled(item)
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)
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}
383 if not item in [self.textroot, self.matroot] :
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()
389 if 'corpus_name' in pydata :
390 stat = menu.Append(wx.ID_ANY, _(u"Statistics").decode('utf8'))
391 spec = menu.Append(wx.ID_ANY, _(u"Specificities and CA").decode('utf8'))
392 classification = wx.Menu()
393 reinert = classification.Append(wx.ID_ANY, _(u"Reinert method").decode('utf8'))
394 #pam = classification.Append(wx.ID_ANY, u"Par matrice des distances")
395 menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), classification)
396 simi = menu.Append(wx.ID_ANY, _(u"Similarities analysis").decode('utf8'))
397 wdc = menu.Append(wx.ID_ANY, _(u"Wordcloud").decode('utf8'))
398 subcorpus = wx.Menu()
399 subcorpusfrommeta = subcorpus.Append(wx.ID_ANY, _(u'Sub corpus from metadata').decode('utf8'))
400 subcorpusfromtheme = subcorpus.Append(wx.ID_ANY, _(u'Sub corpus from thematic').decode('utf8'))
401 menu.AppendMenu(-1, _(u"Sub corpus").decode('utf8'), subcorpus)
402 menu.AppendSeparator()
403 self.Bind(wx.EVT_MENU, self.OnReinert, reinert)
404 #self.Bind(wx.EVT_MENU, self.OnPam, pam)
405 self.Bind(wx.EVT_MENU, self.OnStat, stat)
406 self.Bind(wx.EVT_MENU, self.OnSpec, spec)
407 self.Bind(wx.EVT_MENU, self.OnSimiTxt, simi)
408 self.Bind(wx.EVT_MENU, self.OnWordCloud, wdc)
409 self.Bind(wx.EVT_MENU, self.OnSubTextFromMeta, subcorpusfrommeta)
410 self.Bind(wx.EVT_MENU, self.OnSubTextFromTheme, subcorpusfromtheme)
411 elif 'matrix_name' in pydata :
412 for i in range(self.parent.matrix_menu.GetMenuItemCount()) :
413 item = self.parent.matrix_menu.FindItemByPosition(i)
414 itemid = item.GetId()
415 itemtext = item.GetText()
416 menu.Append(itemid, itemtext)
418 splitfromvar = split.Append(-1, _(u"Split from variable").decode('utf8'))
419 menu.AppendMenu(-1, _(u"Split matrix").decode('utf8'), split)
420 self.Bind(wx.EVT_MENU, self.OnSplitFromVar, splitfromvar)
421 #print item, itemid, itemtext
422 #menu = self.parent.matrix_menu
423 #freq = menu.Append(wx.ID_ANY, _(u"Frequency").decode('utf8'))
424 #chi2 = menu.Append(wx.ID_ANY, _(u"Chi square").decode('utf8'))
425 #chdreinert = menu.Append(wx.ID_ANY, _(u"Reinert clustering").decode('utf8'))
426 #simi = menu.Append(wx.ID_ANY, _(u"Similarity analysis").decode('utf8'))
427 menu.AppendSeparator()
428 #self.Bind(wx.EVT_MENU, self.OnFreq, freq)
429 #self.Bind(wx.EVT_MENU, self.OnChiSquare, chi2)
430 #self.Bind(wx.EVT_MENU, self.OnSimiTab, simi)
431 #self.Bind(wx.EVT_MENU, self.OnCHDReinert, chdreinert)
432 elif pydata.get('type', False) == 'alceste' and pydata['uuid'] in self.parent.history.opened :
434 antipro = openmenu.Append(wx.ID_ANY, _(u"Antiprofiles").decode('utf8'))
435 menu.AppendMenu(wx.ID_ANY, _(u"Open ...").decode('utf8'), openmenu)
437 profsr = menu.Append(wx.ID_ANY, _(u"Repeated segments profiles").decode('utf8'))
438 profgram = menu.Append(wx.ID_ANY, _(u"POS profiles").decode('utf8'))
439 export_corpus = menu.Append(wx.ID_ANY, _(u"Export corpus").decode('utf8'))
440 colored = menu.Append(wx.ID_ANY, _(u"Colored corpus").decode('utf8'))
441 navig = menu.Append(wx.ID_ANY, _(u"Navigator").decode('utf8'))
442 statclasse = menu.Append(wx.ID_ANY, _(u"Clusters statistics").decode('utf8'))
443 rapport = menu.Append(wx.ID_ANY, _(u"Report").decode('utf8'))
444 export_classes = menu.Append(wx.ID_ANY, _(u"Export clusters").decode('utf8'))
445 subcorpusfromcl = menu.Append(wx.ID_ANY, _(u"Sub corpus from clusters").decode('utf8'))
446 menu.AppendSeparator()
447 self.Bind(wx.EVT_MENU, self.OpenAntipro, antipro)
448 self.Bind(wx.EVT_MENU, self.OnProfSR, profsr)
449 self.Bind(wx.EVT_MENU, self.OnProfGram, profgram)
450 self.Bind(wx.EVT_MENU, self.OnExportCorpus, export_corpus)
451 self.Bind(wx.EVT_MENU, self.OnColored, colored)
452 self.Bind(wx.EVT_MENU, self.OnNavig, navig)
453 self.Bind(wx.EVT_MENU, self.StatClasse, statclasse)
454 self.Bind(wx.EVT_MENU, self.OnRapport, rapport)
455 self.Bind(wx.EVT_MENU, self.OnExportClasses, export_classes)
456 self.Bind(wx.EVT_MENU, self.OnSubCorpusFromClusters, subcorpusfromcl)
457 elif pydata.get('type', False) == 'stat' and pydata['uuid'] in self.parent.history.opened :
458 export_dictionary = menu.Append(wx.ID_ANY, _(u"Export dictionary").decode('utf8'))
459 export_lems = menu.Append(wx.ID_ANY, _(u"Export lemma dictionary").decode('utf8'))
460 self.Bind(wx.EVT_MENU, self.OnExportDictionary, export_dictionary)
461 self.Bind(wx.EVT_MENU, self.OnExportLems, export_lems)
462 menu.AppendSeparator()
463 elif pydata.get('type', False) == 'spec' and pydata['uuid'] in self.parent.history.opened :
464 tgen = menu.Append(wx.ID_ANY, _(u"Tgen Editor").decode('utf8'))
465 computetgen = menu.Append(wx.ID_ANY, _(u"Compute Tgen").decode('utf8'))
466 self.Bind(wx.EVT_MENU, self.OnTgenEditor, tgen)
467 self.Bind(wx.EVT_MENU, self.OnTgenCompute, computetgen)
468 menu.AppendSeparator()
469 elif pydata.get('type', False) == 'reinertmatrix' and pydata['uuid'] in self.parent.history.opened :
471 antipro = openmenu.Append(wx.ID_ANY, _(u"antiprofiles").decode('utf8'))
472 rapport = menu.Append(wx.ID_ANY, _(u"Report").decode('utf8'))
473 menu.AppendMenu(wx.ID_ANY, _(u"Open ...").decode('utf8'), openmenu)
474 self.Bind(wx.EVT_MENU, self.OpenAntipro, antipro)
475 self.Bind(wx.EVT_MENU, self.OnRapport, rapport)
478 itemdelete = menu.Append(wx.ID_ANY, _(u"Delete from history").decode('utf8'))
479 #item11 = menu.Append(wx.ID_ANY, "Prepend An Item")
480 #item12 = menu.Append(wx.ID_ANY, "Append An Item")
482 #self.Bind(wx.EVT_MENU, self.OnItemBackground, item1)
483 #self.Bind(wx.EVT_MENU, self.OnItemForeground, item2)
484 #self.Bind(wx.EVT_MENU, self.OnItemBold, item3)
485 #self.Bind(wx.EVT_MENU, self.OnItemFont, item4)
486 #self.Bind(wx.EVT_MENU, self.OnItemHyperText, item5)
487 #self.Bind(wx.EVT_MENU, self.OnEnableWindow, item6)
488 #self.Bind(wx.EVT_MENU, self.OnDisableItem, item7)
489 #self.Bind(wx.EVT_MENU, self.OnItemIcons, item8)
490 self.Bind(wx.EVT_MENU, self.OnItemInfo, info)
491 self.Bind(wx.EVT_MENU, self.OnRename, rename)
492 self.Bind(wx.EVT_MENU, self.OnItemDelete, itemdelete)
493 #self.Bind(wx.EVT_MENU, self.OnItemPrepend, item11)
494 #self.Bind(wx.EVT_MENU, self.OnItemAppend, item12)
500 busy = wx.BusyInfo(_("Please wait...Reading corpus").decode('utf8'), self.parent)
502 if self.pydata['uuid'] in self.parent.history.openedcorpus :
503 corpus = copycorpus(self.parent.history.openedcorpus[self.pydata['uuid']])
504 elif 'corpus_name' in self.pydata :
505 corpus = Corpus(self.parent, parametres = DoConf(self.pydata['ira']).getoptions('corpus'), read = True)
507 cuuid = self.pydata['corpus']
508 if cuuid in self.parent.history.openedcorpus :
509 corpus = copycorpus(self.parent.history.openedcorpus[cuuid])
511 irapath = self.parent.history.corpus[cuuid]['ira']
512 corpus = Corpus(self.parent, parametres = DoConf(irapath).getoptions('corpus'), read = True)
517 if 'matrix_name' in self.pydata :
518 matrix = Tableau(self.parent, parametres = DoConf(self.pydata['ira']).getoptions('matrix'))
520 return copymatrix(matrix)
522 cuuid = self.pydata['matrix']
523 matrix = Tableau(self.parent, parametres = DoConf(self.history.matrixanalyse[cuuid]['ira']).getoptions('matrix'))
525 return copymatrix(matrix)
527 def OnSpec(self, evt) :
528 self.parent.OnTextSpec(evt, self.getcorpus())
530 def OnStat(self, evt) :
531 self.parent.OnTextStat(evt, self.getcorpus())
533 def OnReinert(self, evt) :
534 self.parent.OnTextReinert(evt, self.getcorpus())
536 def OnPam(self, evt) :
537 self.parent.OnPamSimple(evt, self.getcorpus())
539 def OnSimiTxt(self, evt) :
540 self.parent.OnSimiTxt(evt, self.getcorpus())
542 def OnWordCloud(self, evt) :
543 self.parent.OnWordCloud(evt, self.getcorpus())
545 def OnFreq(self, evt):
546 self.parent.OnFreq(evt, self.getmatrix())
548 def OnChiSquare(self, evt):
549 self.parent.OnChi2(evt, self.getmatrix())
551 def OnSimiTab(self, evt):
552 self.parent.OnSimiTab(evt, self.getmatrix())
554 def OnProto(self, evt):
555 self.parent.OnProto(evt, self.getmatrix())
557 def OnSplitFromVar(self, evt):
558 self.parent.OnSplitVar(evt, self.getmatrix())
560 def OnCHDReinert(self, evt):
561 self.parent.OnCHDReinert(evt, self.getmatrix())
563 def OnSubTextFromMeta(self, evt):
564 self.parent.OnSubText(self.getcorpus(), parametres = {'frommeta' : True})
566 def OnSubTextFromTheme(self, evt):
567 self.parent.OnSubText(self.getcorpus(), parametres = {'fromtheme' : True})
569 def OnProfSR(self, evt) :
570 ProfileSegment(self.parent, self.page.dictpathout, self.page.parametres, self.page.corpus)
572 def OnProfGram(self, evt) :
573 ProfilType(self.parent, self.page.corpus, self.page.parametres)
575 def OnExportCorpus(self, evt) :
576 dial = PrefExport(self, self.parent)
577 dial.fbb.SetValue(os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'export_corpus.txt'))
578 dial.CenterOnParent()
579 res = dial.ShowModal()
581 if dial.radio_type.GetSelection() == 0 : alc = True
583 if dial.radio_lem.GetSelection() == 0 : lem = True
585 if self.page.parametres['classif_mode'] != 2 :
589 self.page.corpus.export_corpus_classes(dial.fbb.GetValue(), alc = alc, lem = lem, uci = uci)
592 dlg = wx.MessageDialog(self.parent, msg, u"Export", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
597 def OnColored(self, evt) :
598 dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.html', 'title': _(u"Colored corpus").decode('utf8')})
599 dial.fbb.SetValue(os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'corpus_couleur.html'))
600 dial.CenterOnParent()
601 res = dial.ShowModal()
603 fileout = dial.fbb.GetValue()
605 if self.page.parametres['classif_mode'] != 2 :
609 txt = self.page.corpus.make_colored_corpus(uci = uci)
610 with open(fileout, 'w') as f :
612 msg = ' !\n'.join([_(u"Done").decode('utf8'), _(u"Open in a web browser ?").decode('utf8')])
613 dlg = wx.MessageDialog(self.parent, msg, u"Corpus en couleur", wx.NO | wx.YES | wx.NO_DEFAULT | wx.ICON_QUESTION)
615 if dlg.ShowModal() == wx.ID_YES :
616 webbrowser.open(fileout)
619 def OnNavig(self, evt):
620 if 'FrameSearch' not in dir(self.page) :
621 self.page.FrameSearch = SearchFrame(self.parent, -1, _(u"Search ...").decode('utf8'), self.page.corpus)
622 self.page.FrameSearch.Show()
624 def StatClasse(self, evt):
625 dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.csv', 'title': _(u"Clusters statistics").decode('utf8')})
626 dial.fbb.SetValue( os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'stat_par_classe.csv'))
627 dial.CenterOnParent()
628 res = dial.ShowModal()
630 fileout = dial.fbb.GetValue()
632 self.page.corpus.get_stat_by_cluster(fileout)
634 dlg = wx.MessageDialog(self.parent, msg, _(u"Clusters statistics").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
636 if dlg.ShowModal() == wx.ID_OK :
639 def OpenAntipro(self, evt) :
641 for i in range(0, self.page.TabChdSim.GetPageCount()) :
642 page = self.page.TabChdSim.GetPage(i)
643 if self.page.TabChdSim.GetPageText(i) == _(u"Antiprofiles").decode('utf8') :
644 self.page.TabChdSim.SetSelection(i)
648 open_antiprofil(self.page, self.page.dictpathout['ANTIPRO_OUT'], self.parent.syscoding)
649 self.page.TabChdSim.SetSelection(self.page.TabChdSim.GetPageCount() - 1)
651 def OnRapport(self, evt) :
652 dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.txt', 'title': _(u"Report").decode('utf8')})
653 dial.fbb.SetValue(self.page.dictpathout['rapport'])
654 dial.CenterOnParent()
655 res = dial.ShowModal()
657 fileout = dial.fbb.GetValue()
659 with open(fileout, 'w') as f :
660 f.write(self.page.debtext + '\n' + GetTxtProfile(self.page.DictProfile, self.page.cluster_size))
662 dlg = wx.MessageDialog(self.parent, msg, _(u"Report").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
669 def OnExportDictionary(self, evt) :
670 corpus = self.page.corpus
671 corpus.export_dictionary(self.page.pathout['dictionary.csv'], self.parent.syscoding)
672 log.info('export dictionary %s' % self.page.pathout['dictionary.csv'])
673 dial = wx.MessageDialog(self.parent, self.page.pathout['dictionary.csv'], 'Export', wx.OK)
677 def OnExportLems(self, evt) :
678 corpus = self.page.corpus
679 corpus.export_lems(self.page.pathout['lemmes.csv'], self.parent.syscoding)
680 log.info('export lemmes %s' % self.page.pathout['lemmes.csv'])
681 dial = wx.MessageDialog(self.parent, self.page.pathout['lemmes.csv'], 'Export', wx.OK)
685 def OnTgenEditor(self, evt):
686 corpus = self.page.corpus
687 tgenpath = os.path.join(self.page.parametres['pathout'], 'tgen.csv')
688 tgen = TGen(path = tgenpath, encoding = self.parent.syscoding)
689 if os.path.exists(tgenpath) :
691 if isinstance(evt, list) :
693 while 'tgen%i' %i in tgen.tgen :
695 tgenname = 'tgen%i' %i
696 tgen.tgen[tgenname] = evt
697 tgenframe = TGenFrame(self.parent, corpus, tgen)
699 if isinstance(evt, list) :
700 tgenframe.OnNewTgen(None, tgen = tgenname)
702 def OnTgenCompute(self, evt):
703 corpus = self.page.corpus
704 tgenpath = os.path.join(self.page.parametres['pathout'], 'tgen.csv')
705 if not os.path.exists(tgenpath) :
706 message = wx.MessageDialog(self.parent, _(u"No TGen yet !"), style = wx.ICON_EXCLAMATION | wx.OK)
710 self.page.parametres['tgenpath'] = tgenpath
711 tgen = TGen(path = tgenpath, encoding = self.parent.syscoding)
712 self.page.parametres['etoiles'] = self.page.etoiles
713 TgenSpec(self.parent, corpus, self.page.parametres)
714 TgenLayout(self.page)
716 def OnExportClasses(self, event):
717 corpus = self.page.corpus
718 if self.page.parametres['classif_mode'] != 2 :
722 busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self.parent)
724 for i in range(1, self.page.parametres['clnb'] + 1) :
725 corpus.export_classe(self.page.pathout['classe_%i_export.txt' % i], i, uci = uci)
727 dial = wx.MessageDialog(self, self.page.pathout['classe_x_export.txt'], u"Export", wx.OK|wx.ICON_INFORMATION)
731 def OnSubCorpusFromClusters(self, evt):
732 self.parent.OnSubText(self.getcorpus(), parametres = {'fromclusters' : True, 'clnb': self.page.parametres['clnb'], 'lc' : self.page.corpus.lc})
734 def OnRename(self, event):
735 pydata = self.itemdict['pydata']
738 def OnItemBackground(self, event):
740 colourdata = wx.ColourData()
741 colourdata.SetColour(self.itemdict["back"])
742 dlg = wx.ColourDialog(self, colourdata)
744 dlg.GetColourData().SetChooseFull(True)
746 if dlg.ShowModal() == wx.ID_OK:
747 data = dlg.GetColourData()
748 col1 = data.GetColour().Get()
749 self.SetItemBackgroundColour(self.current, col1)
753 def OnItemForeground(self, event):
755 colourdata = wx.ColourData()
756 colourdata.SetColour(self.itemdict["fore"])
757 dlg = wx.ColourDialog(self, colourdata)
759 dlg.GetColourData().SetChooseFull(True)
761 if dlg.ShowModal() == wx.ID_OK:
762 data = dlg.GetColourData()
763 col1 = data.GetColour().Get()
764 self.SetItemTextColour(self.current, col1)
768 def OnItemBold(self, event):
770 self.SetItemBold(self.current, not self.itemdict["isbold"])
773 def OnItemFont(self, event):
776 font = self.itemdict["font"]
779 font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
781 data.SetInitialFont(font)
783 dlg = wx.FontDialog(self, data)
785 if dlg.ShowModal() == wx.ID_OK:
786 data = dlg.GetFontData()
787 font = data.GetChosenFont()
788 self.SetItemFont(self.current, font)
793 def OnItemHyperText(self, event):
795 self.SetItemHyperText(self.current, not self.itemdict["ishtml"])
798 def OnEnableWindow(self, event):
800 enable = self.GetItemWindowEnabled(self.current)
801 self.SetItemWindowEnabled(self.current, not enable)
804 def OnDisableItem(self, event):
806 self.EnableItem(self.current, False)
809 def OnItemIcons(self, event):
811 bitmaps = [self.itemdict["normal"], self.itemdict["selected"],
812 self.itemdict["expanded"], self.itemdict["selexp"]]
815 dlg = TreeIcons(self, -1, bitmaps=bitmaps)
820 def SetNewIcons(self, bitmaps):
822 self.SetItemImage(self.current, bitmaps[0], CT.TreeItemIcon_Normal)
823 self.SetItemImage(self.current, bitmaps[1], CT.TreeItemIcon_Selected)
824 self.SetItemImage(self.current, bitmaps[2], CT.TreeItemIcon_Expanded)
825 self.SetItemImage(self.current, bitmaps[3], CT.TreeItemIcon_SelectedExpanded)
828 def OnItemInfo(self, event):
830 itemtext = self.itemdict["text"]
831 numchildren = str(self.itemdict["children"])
832 itemtype = self.itemdict["itemtype"]
833 pydata = self.itemdict['pydata']
834 #if 'analyses' in pydata :
835 # toshow = dict([[val, pydata[val]] for val in pydata if val not in['analyses', 'isload']])
837 toshow = pydata['ira']
838 toshow = DoConf(toshow).getoptions()
839 txt = DoConf().totext(toshow)
840 parametres = [val.split('\t\t:') for val in txt.splitlines()]
846 itemtype = "CheckBox"
848 itemtype = "RadioButton"
850 dlg = InfoDialog(self, itemtext, parametres)
857 def OnItemDelete(self, event):
859 strs = "Are You Sure You Want To Delete Item " + self.GetItemText(self.current) + "?"
860 dlg = wx.MessageDialog(None, strs, 'Deleting Item', wx.OK | wx.CANCEL | wx.ICON_QUESTION)
862 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
868 pydata = self.itemdict['pydata']
869 if 'corpus_name' in pydata :
870 self.history.delete(pydata, True)
872 self.history.delete(pydata)
873 self.DeleteChildren(self.current)
874 self.Delete(self.current)
879 def OnItemPrepend(self, event):
881 dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
883 if dlg.ShowModal() == wx.ID_OK:
884 newname = dlg.GetValue()
885 newitem = self.PrependItem(self.current, newname)
886 self.EnsureVisible(newitem)
890 def AddAnalyse(self, parametres, itemParent = None, bold = True) :
891 uuid = parametres.get('corpus', None)
892 if uuid is not None :
893 if itemParent is None :
894 itemParent = self.textroot
895 child, cookie = self.GetFirstChild(itemParent)
898 pydata = self.GetPyData(child)
899 if pydata['uuid'] == uuid :
902 self.GiveFocus(child, uuid)
903 child, cookie = self.GetNextChild(itemParent, cookie)
904 #item = self.AppendItem(child, parametres['name'])
905 if corpus is not None :
906 item = self.AppendItem(corpus, parametres['name'])
908 item = self.AppendItem(self.textroot, parametres['name'])
910 item = self.AppendItem(self.matroot, parametres['name'])
911 self.SetPyData(item, parametres)
912 if parametres['type'] in self.ild :
913 img = self.ild[parametres['type']]
916 self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
917 self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
918 self.SetItemBold(item, bold)
919 self.SelectItem(item)
921 def AddMatAnalyse(self, parametres, itemParent = None, bold = True) :
922 uuid = parametres.get('matrix', None)
923 if uuid is not None :
924 if itemParent is None :
925 itemParent = self.matroot
926 child, cookie = self.GetFirstChild(itemParent)
929 pydata = self.GetPyData(child)
930 if pydata['uuid'] == uuid :
933 self.GiveFocus(child, uuid)
934 child, cookie = self.GetNextChild(itemParent, cookie)
935 #item = self.AppendItem(child, parametres['name'])
936 if matrix is not None :
937 item = self.AppendItem(matrix, parametres['name'])
939 item = self.AppendItem(self.matroot, parametres['name'])
940 self.SetPyData(item, parametres)
941 if parametres['type'] in self.ild :
942 img = self.ild[parametres['type']]
945 self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
946 self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
947 self.SetItemBold(item, bold)
948 self.SelectItem(item)
950 def OnItemAppend(self, item):
951 if 'corpus_name' in item :
952 child = self.InsertItem(self.textroot, 0, item['corpus_name'])
954 child = self.InsertItem(self.matroot, 0, item['matrix_name'])
955 self.SetPyData(child, item)
956 self.history.addtab(item)
957 if item['type'] in self.ild :
958 img = self.ild[item['type']]
961 self.SetItemImage(child, img, CT.TreeItemIcon_Normal)
962 self.SetItemImage(child, img, CT.TreeItemIcon_Expanded)
963 self.SetItemBold(child, True)
965 #dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
967 #if dlg.ShowModal() == wx.ID_OK:
968 # newname = dlg.GetValue()
969 # newitem = self.AppendItem(self.current, newname)
970 # self.EnsureVisible(newitem)
976 def OnBeginEdit(self, event):
978 #self.log.info("OnBeginEdit" + "\n")
979 # show how to prevent edit...
980 item = event.GetItem()
981 if item and self.GetItemText(item) == "The Root Item":
983 #self.log.info("You can't edit this one..." + "\n")
985 # Lets just see what's visible of its children
987 root = event.GetItem()
988 (child, cookie) = self.GetFirstChild(root)
991 #self.log.info("Child [%s] visible = %d" % (self.GetItemText(child), self.IsVisible(child)) + "\n")
992 (child, cookie) = self.GetNextChild(root, cookie)
997 def OnEndEdit(self, event):
999 #self.log.info("OnEndEdit: %s %s" %(event.IsEditCancelled(), event.GetLabel()))
1000 # show how to reject edit, we'll not allow any digits
1001 for x in event.GetLabel():
1002 if x in string.digits:
1003 #self.log.info(", You can't enter digits..." + "\n")
1010 def OnLeftDClick(self, event):
1011 pt = event.GetPosition()
1012 item, flags = self.HitTest(pt)
1013 if item is not None :
1014 pydata = self.GetPyData(item)
1015 if pydata['uuid'] in self.parent.history.opened :
1016 for i in range(self.parent.nb.GetPageCount()) :
1017 page = self.parent.nb.GetPage(i)
1018 if 'parametres' in dir(page) :
1019 if page.parametres['uuid'] == pydata['uuid'] :
1020 self.parent.nb.SetSelection(i)
1022 elif pydata['uuid'] in ['textroot', 'matroot'] :
1025 busy = wx.BusyInfo(_("Please wait..."), self.parent)
1027 OpenAnalyse(self.parent, pydata)
1029 self.SetItemBold(item, True)
1030 self.OnSelChanged(pydata = pydata)
1031 #if item and (flags & CT.TREE_HITTEST_ONITEMLABEL):
1032 # if self.GetAGWWindowStyleFlag() & CT.TR_EDIT_LABELS:
1033 # self.log.info("OnLeftDClick: %s (manually starting label edit)"% self.GetItemText(item) + "\n")
1035 #self.EditLabel(item)
1037 # pydata = self.GetPyData(item)
1039 # self.log.info("OnLeftDClick: Cannot Start Manual Editing, Missing Style TR_EDIT_LABELS\n")
1044 def OnItemExpanded(self, event):
1046 item = event.GetItem()
1048 self.log.info("OnItemExpanded: %s" % self.GetItemText(item) + "\n")
1051 def OnItemExpanding(self, event):
1053 item = event.GetItem()
1055 self.log.info("OnItemExpanding: %s" % self.GetItemText(item) + "\n")
1060 def OnItemCollapsed(self, event):
1062 item = event.GetItem()
1064 self.log.info("OnItemCollapsed: %s" % self.GetItemText(item) + "\n")
1067 def OnItemCollapsing(self, event):
1069 item = event.GetItem()
1071 self.log.info("OnItemCollapsing: %s" % self.GetItemText(item) + "\n")
1076 def OnSelChanged(self, event = None, pydata = None):
1077 if event is not None :
1078 item = event.GetItem()
1079 pydata = self.GetPyData(item)
1080 if pydata is not None :
1081 self.pydata = pydata
1082 if pydata['uuid'] in self.parent.history.opened :
1083 for i in range(self.parent.nb.GetPageCount()) :
1084 self.page = self.parent.nb.GetPage(i)
1085 if 'parametres' in dir(self.page) :
1086 if self.page.parametres['uuid'] == pydata['uuid'] :
1087 self.parent.nb.SetSelection(i)
1089 if event is not None :
1093 def OnSelChanging(self, event):
1095 item = event.GetItem()
1096 olditem = event.GetOldItem()
1100 olditemtext = "None"
1102 olditemtext = self.GetItemText(olditem)
1103 #self.log.info("OnSelChanging: From %s" % olditemtext + " To %s" % self.GetItemText(item) + "\n")
1108 def OnBeginDrag(self, event):
1110 self.item = event.GetItem()
1112 self.log.info("Beginning Drag..." + "\n")
1117 def OnBeginRDrag(self, event):
1119 self.item = event.GetItem()
1121 self.log.info("Beginning Right Drag..." + "\n")
1126 def OnEndDrag(self, event):
1128 self.item = event.GetItem()
1130 self.log.info("Ending Drag!" + "\n")
1135 def OnDeleteItem(self, event):
1137 item = event.GetItem()
1142 self.log.info("Deleting Item: %s" % self.GetItemText(item) + "\n")
1146 def OnItemCheck(self, event):
1148 item = event.GetItem()
1149 self.log.info("Item " + self.GetItemText(item) + " Has Been Checked!\n")
1153 def OnItemChecking(self, event):
1155 item = event.GetItem()
1156 self.log.info("Item " + self.GetItemText(item) + " Is Being Checked...\n")
1160 def OnToolTip(self, event):
1162 item = event.GetItem()
1164 event.SetToolTip(wx.ToolTip(self.GetItemText(item)))
1167 def OnItemMenu(self, event):
1169 item = event.GetItem()
1171 self.log.info("OnItemMenu: %s" % self.GetItemText(item) + "\n")
1176 def OnKey(self, event):
1178 keycode = event.GetKeyCode()
1179 keyname = keyMap.get(keycode, None)
1181 if keycode == wx.WXK_BACK:
1182 self.log.info("OnKeyDown: HAHAHAHA! I Vetoed Your Backspace! HAHAHAHA\n")
1186 if "unicode" in wx.PlatformInfo:
1187 keycode = event.GetUnicodeKey()
1189 keycode = event.GetKeyCode()
1190 keyname = "\"" + unichr(event.GetUnicodeKey()) + "\""
1192 keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1198 keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1200 keyname = "\"%s\"" % chr(keycode)
1202 keyname = "unknown (%s)" % keycode
1204 self.log.info("OnKeyDown: You Pressed '" + keyname + "'\n")
1209 def OnActivate(self, event):
1212 self.log.info("OnActivate: %s" % self.GetItemText(self.item) + "\n")
1217 def OnHyperLink(self, event):
1219 item = event.GetItem()
1221 self.log.info("OnHyperLink: %s" % self.GetItemText(self.item) + "\n")
1224 def OnTextCtrl(self, event):
1226 char = chr(event.GetKeyCode())
1227 self.log.info("EDITING THE TEXTCTRL: You Wrote '" + char + \
1228 "' (KeyCode = " + str(event.GetKeyCode()) + ")\n")
1232 def OnComboBox(self, event):
1234 selection = event.GetEventObject().GetValue()
1235 self.log.info("CHOICE FROM COMBOBOX: You Chose '" + selection + "'\n")