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_"):
109 self.styles = treestyles
112 self.il = wx.ImageList(16, 16)
114 imgtextroot = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'textroot.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
115 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())
116 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())
117 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())
118 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())
119 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())
120 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())
121 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())
122 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())
123 imgmatroot = self.il.Add(wx.Image(os.path.join(self.parent.images_path,'matroot.png'), wx.BITMAP_TYPE_PNG).Scale(16,16).ConvertToBitmap())
124 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())
125 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())
126 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())
127 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())
128 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())
129 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())
130 self.SetImageList(self.il)
135 self.history = parent.history
136 self.h = self.history.history
137 self.root = self.AddRoot("Iramuteq")
139 if not(self.GetAGWWindowStyleFlag() & CT.TR_HIDE_ROOT):
140 self.SetPyData(self.root, None)
141 self.SetItemImage(self.root, 24, CT.TreeItemIcon_Normal)
142 self.SetItemImage(self.root, 13, CT.TreeItemIcon_Expanded)
144 self.textroot = self.AppendItem(self.root, u'Corpus texte')
145 self.SetPyData(self.textroot, {'uuid': 'textroot'})
146 self.SetItemImage(self.textroot, imgtextroot, CT.TreeItemIcon_Normal)
147 self.SetItemImage(self.textroot, imgtextroot, CT.TreeItemIcon_Expanded)
149 for corpus in reversed(self.h) :
150 child = self.AppendItem(self.textroot, corpus['corpus_name'])
151 self.SetPyData(child, corpus)
152 self.SetItemImage(child, self.ild['corpus'], CT.TreeItemIcon_Normal)
153 self.SetItemImage(child, self.ild['corpus'], CT.TreeItemIcon_Expanded)
155 if 'analyses' in corpus :
156 for y in corpus['analyses'] :
157 last = self.AppendItem(child, y['name'], ct_type=0)
158 self.SetPyData(last, y)
159 if y['type'] in self.ild :
160 img = self.ild[y['type']]
163 self.SetItemImage(last, img, CT.TreeItemIcon_Normal)
164 self.SetItemImage(last, img, CT.TreeItemIcon_Expanded)
166 self.matroot = self.AppendItem(self.root, u'Matrices')
167 self.SetPyData(self.matroot, {'uuid': 'matroot'})
168 self.SetItemImage(self.matroot, imgmatroot, CT.TreeItemIcon_Normal)
169 self.SetItemImage(self.matroot, imgmatroot, CT.TreeItemIcon_Expanded)
172 for matrix in reversed(self.history.matrix) :
173 if 'matrix_name' in matrix :
174 child = self.AppendItem(self.matroot, matrix['matrix_name'])
175 self.SetPyData(child, matrix)
176 self.SetItemImage(child, self.ild['matrix'], CT.TreeItemIcon_Normal)
177 self.SetItemImage(child, self.ild['matrix'], CT.TreeItemIcon_Expanded)
178 if 'analyses' in matrix :
179 for y in matrix['analyses'] :
180 last = self.AppendItem(child, y['name'], ct_type=0)
181 self.SetPyData(last, y)
182 if y['type'] in self.ild :
183 img = self.ild[y['type']]
186 self.SetItemImage(last, img, CT.TreeItemIcon_Normal)
187 self.SetItemImage(last, img, CT.TreeItemIcon_Expanded)
189 orphmat.append(matrix)
191 self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDClick)
192 #self.Bind(wx.EVT_IDLE, self.OnIdle)
194 self.eventdict = {'EVT_TREE_BEGIN_DRAG': self.OnBeginDrag, 'EVT_TREE_BEGIN_LABEL_EDIT': self.OnBeginEdit,
195 'EVT_TREE_BEGIN_RDRAG': self.OnBeginRDrag, 'EVT_TREE_DELETE_ITEM': self.OnDeleteItem,
196 'EVT_TREE_END_DRAG': self.OnEndDrag, 'EVT_TREE_END_LABEL_EDIT': self.OnEndEdit,
197 'EVT_TREE_ITEM_ACTIVATED': self.OnActivate, 'EVT_TREE_ITEM_CHECKED': self.OnItemCheck,
198 'EVT_TREE_ITEM_CHECKING': self.OnItemChecking, 'EVT_TREE_ITEM_COLLAPSED': self.OnItemCollapsed,
199 'EVT_TREE_ITEM_COLLAPSING': self.OnItemCollapsing, 'EVT_TREE_ITEM_EXPANDED': self.OnItemExpanded,
200 'EVT_TREE_ITEM_EXPANDING': self.OnItemExpanding, 'EVT_TREE_ITEM_GETTOOLTIP': self.OnToolTip,
201 'EVT_TREE_ITEM_MENU': self.OnItemMenu, 'EVT_TREE_ITEM_RIGHT_CLICK': self.OnRightDown,
202 'EVT_TREE_KEY_DOWN': self.OnKey, 'EVT_TREE_SEL_CHANGED': self.OnSelChanged,
203 'EVT_TREE_SEL_CHANGING': self.OnSelChanging, "EVT_TREE_ITEM_HYPERLINK": self.OnHyperLink}
205 mainframe = wx.GetTopLevelParent(self)
207 if not hasattr(mainframe, "leftpanel"):
208 #self.Bind(CT.EVT_TREE_ITEM_EXPANDED, self.OnItemExpanded)
209 #self.Bind(CT.EVT_TREE_ITEM_COLLAPSED, self.OnItemCollapsed)
210 self.Bind(CT.EVT_TREE_SEL_CHANGED, self.OnSelChanged)
211 self.Bind(CT.EVT_TREE_SEL_CHANGING, self.OnSelChanging)
212 self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
213 self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp)
215 for combos in mainframe.treeevents:
216 self.BindEvents(combos)
218 if hasattr(mainframe, "leftpanel"):
219 self.ChangeStyle(mainframe.treestyles)
221 if not(self.GetAGWWindowStyleFlag() & CT.TR_HIDE_ROOT):
222 self.SelectItem(self.root)
223 self.Expand(self.root)
226 def BindEvents(self, choice, recreate=False):
228 value = choice.GetValue()
229 text = choice.GetLabel()
232 binder = self.eventdict[text]
235 if evt == "CT.EVT_TREE_BEGIN_RDRAG":
236 self.Bind(wx.EVT_RIGHT_DOWN, None)
237 self.Bind(wx.EVT_RIGHT_UP, None)
238 self.Bind(eval(evt), binder)
240 self.Bind(eval(evt), None)
241 if evt == "CT.EVT_TREE_BEGIN_RDRAG":
242 self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
243 self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp)
246 def ChangeStyle(self, combos):
250 if combo.GetValue() == 1:
251 style = style | eval("CT." + combo.GetLabel())
253 if self.GetAGWWindowStyleFlag() != style:
254 self.SetAGWWindowStyleFlag(style)
257 def OnCompareItems(self, item1, item2):
259 t1 = self.GetItemText(item1)
260 t2 = self.GetItemText(item2)
271 def OnIdle(self, event):
275 # if self.gauge.IsEnabled() and self.gauge.IsShown():
276 # self.count = self.count + 1
278 # if self.count >= 50:
281 # self.gauge.SetValue(self.count)
289 def CloseItem(self, itemParent = None, uuid = None) :
290 if itemParent is None :
291 itemParent = self.root
292 child, cookie = self.GetFirstChild(itemParent)
294 pydata = self.GetPyData(child)
295 if pydata['uuid'] == uuid :
296 self.SetItemBold(child, False)
298 self.CloseItem(child, uuid)
299 child, cookie = self.GetNextChild(itemParent, cookie)
301 def GiveFocus(self, itemParent = None, uuid = None, bold = False) :
302 if itemParent is None :
303 itemParent = self.root
304 child, cookie = self.GetFirstChild(itemParent)
306 pydata = self.GetPyData(child)
307 if pydata['uuid'] == uuid :
308 self.SelectItem(child)
310 self.SetItemBold(child, True)
312 self.GiveFocus(child, uuid, bold)
313 child, cookie = self.GetNextChild(itemParent, cookie)
315 def IsInTree(self, itemParent = None, uuid = None) :
316 if itemParent is None :
317 itemParent = self.root
318 child, cookie = self.GetFirstChild(itemParent)
321 pydata = self.GetPyData(child)
322 if pydata['uuid'] == uuid :
324 self.GiveFocus(child, uuid)
325 child, cookie = self.GetNextChild(itemParent, cookie)
329 def OnRightDown(self, event):
331 pt = event.GetPosition()
332 item, flags = self.HitTest(pt)
336 #self.log.info("OnRightClick: %s, %s, %s" % (self.GetItemText(item), type(item), item.__class__) + "\n")
337 self.SelectItem(item)
340 def OnRightUp(self, event):
348 if not self.IsItemEnabled(item):
352 # Item Text Appearance
353 ishtml = self.IsItemHyperText(item)
354 back = self.GetItemBackgroundColour(item)
355 fore = self.GetItemTextColour(item)
356 isbold = self.IsBold(item)
357 font = self.GetItemFont(item)
360 normal = self.GetItemImage(item, CT.TreeItemIcon_Normal)
361 selected = self.GetItemImage(item, CT.TreeItemIcon_Selected)
362 expanded = self.GetItemImage(item, CT.TreeItemIcon_Expanded)
363 selexp = self.GetItemImage(item, CT.TreeItemIcon_SelectedExpanded)
365 # Enabling/Disabling Windows Associated To An Item
366 haswin = self.GetItemWindow(item)
368 # Enabling/Disabling Items
369 enabled = self.IsItemEnabled(item)
371 # Generic Item's Info
372 children = self.GetChildrenCount(item)
373 itemtype = self.GetItemType(item)
374 text = self.GetItemText(item)
375 pydata = self.GetPyData(item)
379 self.itemdict = {"ishtml": ishtml, "back": back, "fore": fore, "isbold": isbold,
380 "font": font, "normal": normal, "selected": selected, "expanded": expanded,
381 "selexp": selexp, "haswin": haswin, "children": children,
382 "itemtype": itemtype, "text": text, "pydata": pydata, "enabled": enabled}
384 if not item in [self.textroot, self.matroot] :
386 info = menu.Append(wx.ID_ANY, _(u"Informations").encode('utf8'))
387 rename = menu.Append(wx.ID_ANY, _(u"Rename").encode('utf8'))
388 menu.AppendSeparator()
390 if 'corpus_name' in pydata :
391 stat = menu.Append(wx.ID_ANY, _(u"Statistics").decode('utf8'))
392 spec = menu.Append(wx.ID_ANY, _(u"Specificities and CA").decode('utf8'))
393 classification = wx.Menu()
394 reinert = classification.Append(wx.ID_ANY, _(u"Reinert method").decode('utf8'))
395 #pam = classification.Append(wx.ID_ANY, u"Par matrice des distances")
396 menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), classification)
397 simi = menu.Append(wx.ID_ANY, _(u"Similarities analysis").decode('utf8'))
398 wdc = menu.Append(wx.ID_ANY, _(u"Wordcloud").decode('utf8'))
399 subcorpus = wx.Menu()
400 subcorpusfrommeta = subcorpus.Append(wx.ID_ANY, _(u'Sub corpus from metadata').decode('utf8'))
401 subcorpusfromtheme = subcorpus.Append(wx.ID_ANY, _(u'Sub corpus from thematic').decode('utf8'))
402 menu.AppendMenu(-1, _(u"Sub corpus").decode('utf8'), subcorpus)
403 menu.AppendSeparator()
404 self.Bind(wx.EVT_MENU, self.OnReinert, reinert)
405 #self.Bind(wx.EVT_MENU, self.OnPam, pam)
406 self.Bind(wx.EVT_MENU, self.OnStat, stat)
407 self.Bind(wx.EVT_MENU, self.OnSpec, spec)
408 self.Bind(wx.EVT_MENU, self.OnSimiTxt, simi)
409 self.Bind(wx.EVT_MENU, self.OnWordCloud, wdc)
410 self.Bind(wx.EVT_MENU, self.OnSubTextFromMeta, subcorpusfrommeta)
411 self.Bind(wx.EVT_MENU, self.OnSubTextFromTheme, subcorpusfromtheme)
412 elif 'matrix_name' in pydata :
413 for i in range(self.parent.matrix_menu.GetMenuItemCount()) :
414 item = self.parent.matrix_menu.FindItemByPosition(i)
415 itemid = item.GetId()
416 itemtext = item.GetText()
417 if item.IsSubMenu() :
419 for val in item.GetSubMenu().GetMenuItems() :
420 nmenu.Append(val.GetId(), val.GetText())
421 menu.AppendMenu(itemid, itemtext, nmenu)
423 menu.Append(itemid, itemtext)
425 splitfromvar = split.Append(-1, _(u"Split from variable").decode('utf8'))
426 menu.AppendMenu(-1, _(u"Split matrix").decode('utf8'), split)
427 self.Bind(wx.EVT_MENU, self.OnSplitFromVar, splitfromvar)
428 #print item, itemid, itemtext
429 #menu = self.parent.matrix_menu
430 #freq = menu.Append(wx.ID_ANY, _(u"Frequency").decode('utf8'))
431 #chi2 = menu.Append(wx.ID_ANY, _(u"Chi square").decode('utf8'))
432 #chdreinert = menu.Append(wx.ID_ANY, _(u"Reinert clustering").decode('utf8'))
433 #simi = menu.Append(wx.ID_ANY, _(u"Similarity analysis").decode('utf8'))
434 menu.AppendSeparator()
435 #self.Bind(wx.EVT_MENU, self.OnFreq, freq)
436 #self.Bind(wx.EVT_MENU, self.OnChiSquare, chi2)
437 #self.Bind(wx.EVT_MENU, self.OnSimiTab, simi)
438 #self.Bind(wx.EVT_MENU, self.OnCHDReinert, chdreinert)
439 elif pydata.get('type', False) == 'alceste' and pydata['uuid'] in self.parent.history.opened :
441 antipro = openmenu.Append(wx.ID_ANY, _(u"Antiprofiles").decode('utf8'))
442 menu.AppendMenu(wx.ID_ANY, _(u"Open ...").decode('utf8'), openmenu)
444 profsr = menu.Append(wx.ID_ANY, _(u"Repeated segments profiles").decode('utf8'))
445 profgram = menu.Append(wx.ID_ANY, _(u"POS profiles").decode('utf8'))
446 export_corpus = menu.Append(wx.ID_ANY, _(u"Export corpus").decode('utf8'))
447 colored = menu.Append(wx.ID_ANY, _(u"Colored corpus").decode('utf8'))
448 navig = menu.Append(wx.ID_ANY, _(u"Navigator").decode('utf8'))
449 statclasse = menu.Append(wx.ID_ANY, _(u"Clusters statistics").decode('utf8'))
450 rapport = menu.Append(wx.ID_ANY, _(u"Report").decode('utf8'))
451 export_classes = menu.Append(wx.ID_ANY, _(u"Export clusters").decode('utf8'))
452 subcorpusfromcl = menu.Append(wx.ID_ANY, _(u"Sub corpus from clusters").decode('utf8'))
453 menu.AppendSeparator()
454 self.Bind(wx.EVT_MENU, self.OpenAntipro, antipro)
455 self.Bind(wx.EVT_MENU, self.OnProfSR, profsr)
456 self.Bind(wx.EVT_MENU, self.OnProfGram, profgram)
457 self.Bind(wx.EVT_MENU, self.OnExportCorpus, export_corpus)
458 self.Bind(wx.EVT_MENU, self.OnColored, colored)
459 self.Bind(wx.EVT_MENU, self.OnNavig, navig)
460 self.Bind(wx.EVT_MENU, self.StatClasse, statclasse)
461 self.Bind(wx.EVT_MENU, self.OnRapport, rapport)
462 self.Bind(wx.EVT_MENU, self.OnExportClasses, export_classes)
463 self.Bind(wx.EVT_MENU, self.OnSubCorpusFromClusters, subcorpusfromcl)
464 elif pydata.get('type', False) == 'stat' and pydata['uuid'] in self.parent.history.opened :
465 export_dictionary = menu.Append(wx.ID_ANY, _(u"Export dictionary").decode('utf8'))
466 export_lems = menu.Append(wx.ID_ANY, _(u"Export lemma dictionary").decode('utf8'))
467 self.Bind(wx.EVT_MENU, self.OnExportDictionary, export_dictionary)
468 self.Bind(wx.EVT_MENU, self.OnExportLems, export_lems)
469 menu.AppendSeparator()
470 elif pydata.get('type', False) == 'spec' and pydata['uuid'] in self.parent.history.opened :
471 tgen = menu.Append(wx.ID_ANY, _(u"Tgen Editor").decode('utf8'))
472 computetgen = menu.Append(wx.ID_ANY, _(u"Compute Tgen").decode('utf8'))
473 self.Bind(wx.EVT_MENU, self.OnTgenEditor, tgen)
474 self.Bind(wx.EVT_MENU, self.OnTgenCompute, computetgen)
475 menu.AppendSeparator()
476 elif pydata.get('type', False) == 'reinertmatrix' and pydata['uuid'] in self.parent.history.opened :
478 antipro = openmenu.Append(wx.ID_ANY, _(u"antiprofiles").decode('utf8'))
479 rapport = menu.Append(wx.ID_ANY, _(u"Report").decode('utf8'))
480 menu.AppendMenu(wx.ID_ANY, _(u"Open ...").decode('utf8'), openmenu)
481 self.Bind(wx.EVT_MENU, self.OpenAntipro, antipro)
482 self.Bind(wx.EVT_MENU, self.OnRapport, rapport)
485 itemdelete = menu.Append(wx.ID_ANY, _(u"Delete from history").decode('utf8'))
486 #item11 = menu.Append(wx.ID_ANY, "Prepend An Item")
487 #item12 = menu.Append(wx.ID_ANY, "Append An Item")
489 #self.Bind(wx.EVT_MENU, self.OnItemBackground, item1)
490 #self.Bind(wx.EVT_MENU, self.OnItemForeground, item2)
491 #self.Bind(wx.EVT_MENU, self.OnItemBold, item3)
492 #self.Bind(wx.EVT_MENU, self.OnItemFont, item4)
493 #self.Bind(wx.EVT_MENU, self.OnItemHyperText, item5)
494 #self.Bind(wx.EVT_MENU, self.OnEnableWindow, item6)
495 #self.Bind(wx.EVT_MENU, self.OnDisableItem, item7)
496 #self.Bind(wx.EVT_MENU, self.OnItemIcons, item8)
497 self.Bind(wx.EVT_MENU, self.OnItemInfo, info)
498 self.Bind(wx.EVT_MENU, self.OnRename, rename)
499 self.Bind(wx.EVT_MENU, self.OnItemDelete, itemdelete)
500 #self.Bind(wx.EVT_MENU, self.OnItemPrepend, item11)
501 #self.Bind(wx.EVT_MENU, self.OnItemAppend, item12)
507 busy = wx.BusyInfo(_("Please wait...Reading corpus").decode('utf8'), self.parent)
509 if self.pydata['uuid'] in self.parent.history.openedcorpus :
510 corpus = copycorpus(self.parent.history.openedcorpus[self.pydata['uuid']])
511 elif 'corpus_name' in self.pydata :
512 corpus = Corpus(self.parent, parametres = DoConf(self.pydata['ira']).getoptions('corpus'), read = True)
514 cuuid = self.pydata['corpus']
515 if cuuid in self.parent.history.openedcorpus :
516 corpus = copycorpus(self.parent.history.openedcorpus[cuuid])
518 irapath = self.parent.history.corpus[cuuid]['ira']
519 corpus = Corpus(self.parent, parametres = DoConf(irapath).getoptions('corpus'), read = True)
524 if 'matrix_name' in self.pydata :
525 matrix = Tableau(self.parent, parametres = DoConf(self.pydata['ira']).getoptions('matrix'))
527 return copymatrix(matrix)
529 cuuid = self.pydata['matrix']
530 matrix = Tableau(self.parent, parametres = DoConf(self.history.matrixanalyse[cuuid]['ira']).getoptions('matrix'))
532 return copymatrix(matrix)
534 def OnSpec(self, evt) :
535 self.parent.OnTextSpec(evt, self.getcorpus())
537 def OnStat(self, evt) :
538 self.parent.OnTextStat(evt, self.getcorpus())
540 def OnReinert(self, evt) :
541 self.parent.OnTextReinert(evt, self.getcorpus())
543 def OnPam(self, evt) :
544 self.parent.OnPamSimple(evt, self.getcorpus())
546 def OnSimiTxt(self, evt) :
547 self.parent.OnSimiTxt(evt, self.getcorpus())
549 def OnWordCloud(self, evt) :
550 self.parent.OnWordCloud(evt, self.getcorpus())
552 def OnFreq(self, evt):
553 self.parent.OnFreq(evt, self.getmatrix())
555 def OnChiSquare(self, evt):
556 self.parent.OnChi2(evt, self.getmatrix())
558 def OnSimiTab(self, evt):
559 self.parent.OnSimiTab(evt, self.getmatrix())
561 def OnProto(self, evt):
562 self.parent.OnProto(evt, self.getmatrix())
564 def OnSplitFromVar(self, evt):
565 self.parent.OnSplitVar(evt, self.getmatrix())
567 def OnCHDReinert(self, evt):
568 self.parent.OnCHDReinert(evt, self.getmatrix())
570 def OnSubTextFromMeta(self, evt):
571 self.parent.OnSubText(self.getcorpus(), parametres = {'frommeta' : True})
573 def OnSubTextFromTheme(self, evt):
574 self.parent.OnSubText(self.getcorpus(), parametres = {'fromtheme' : True})
576 def OnProfSR(self, evt) :
577 ProfileSegment(self.parent, self.page.dictpathout, self.page.parametres, self.page.corpus)
579 def OnProfGram(self, evt) :
580 ProfilType(self.parent, self.page.corpus, self.page.parametres)
582 def OnExportCorpus(self, evt) :
583 dial = PrefExport(self, self.parent)
584 dial.fbb.SetValue(os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'export_corpus.txt'))
585 dial.CenterOnParent()
586 res = dial.ShowModal()
588 if dial.radio_type.GetSelection() == 0 : alc = True
590 if dial.radio_lem.GetSelection() == 0 : lem = True
592 if self.page.parametres['classif_mode'] != 2 :
596 self.page.corpus.export_corpus_classes(dial.fbb.GetValue(), alc = alc, lem = lem, uci = uci)
599 dlg = wx.MessageDialog(self.parent, msg, u"Export", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
604 def OnColored(self, evt) :
605 dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.html', 'title': _(u"Colored corpus").decode('utf8')})
606 dial.fbb.SetValue(os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'corpus_couleur.html'))
607 dial.CenterOnParent()
608 res = dial.ShowModal()
610 fileout = dial.fbb.GetValue()
612 if self.page.parametres['classif_mode'] != 2 :
616 txt = self.page.corpus.make_colored_corpus(uci = uci)
617 with open(fileout, 'w') as f :
619 msg = ' !\n'.join([_(u"Done").decode('utf8'), _(u"Open in a web browser ?").decode('utf8')])
620 dlg = wx.MessageDialog(self.parent, msg, u"Corpus en couleur", wx.NO | wx.YES | wx.NO_DEFAULT | wx.ICON_QUESTION)
622 if dlg.ShowModal() == wx.ID_YES :
623 webbrowser.open(fileout)
626 def OnNavig(self, evt):
627 if 'FrameSearch' not in dir(self.page) :
628 self.page.FrameSearch = SearchFrame(self.parent, -1, _(u"Search ...").decode('utf8'), self.page.corpus)
629 self.page.FrameSearch.Show()
631 def StatClasse(self, evt):
632 dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.csv', 'title': _(u"Clusters statistics").decode('utf8')})
633 dial.fbb.SetValue( os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'stat_par_classe.csv'))
634 dial.CenterOnParent()
635 res = dial.ShowModal()
637 fileout = dial.fbb.GetValue()
639 self.page.corpus.get_stat_by_cluster(fileout)
641 dlg = wx.MessageDialog(self.parent, msg, _(u"Clusters statistics").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
643 if dlg.ShowModal() == wx.ID_OK :
646 def OpenAntipro(self, evt) :
648 for i in range(0, self.page.TabChdSim.GetPageCount()) :
649 page = self.page.TabChdSim.GetPage(i)
650 if self.page.TabChdSim.GetPageText(i) == _(u"Antiprofiles").decode('utf8') :
651 self.page.TabChdSim.SetSelection(i)
655 open_antiprofil(self.page, self.page.dictpathout['ANTIPRO_OUT'], self.parent.syscoding)
656 self.page.TabChdSim.SetSelection(self.page.TabChdSim.GetPageCount() - 1)
658 def OnRapport(self, evt) :
659 dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.txt', 'title': _(u"Report").decode('utf8')})
660 dial.fbb.SetValue(self.page.dictpathout['rapport'])
661 dial.CenterOnParent()
662 res = dial.ShowModal()
664 fileout = dial.fbb.GetValue()
666 with open(fileout, 'w') as f :
667 f.write(self.page.debtext + '\n' + GetTxtProfile(self.page.DictProfile, self.page.cluster_size))
669 dlg = wx.MessageDialog(self.parent, msg, _(u"Report").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
676 def OnExportDictionary(self, evt) :
677 corpus = self.page.corpus
678 corpus.export_dictionary(self.page.pathout['dictionary.csv'], self.parent.syscoding)
679 log.info('export dictionary %s' % self.page.pathout['dictionary.csv'])
680 dial = wx.MessageDialog(self.parent, self.page.pathout['dictionary.csv'], 'Export', wx.OK)
684 def OnExportLems(self, evt) :
685 corpus = self.page.corpus
686 corpus.export_lems(self.page.pathout['lemmes.csv'], self.parent.syscoding)
687 log.info('export lemmes %s' % self.page.pathout['lemmes.csv'])
688 dial = wx.MessageDialog(self.parent, self.page.pathout['lemmes.csv'], 'Export', wx.OK)
692 def OnTgenEditor(self, evt):
693 corpus = self.page.corpus
694 tgenpath = os.path.join(self.page.parametres['pathout'], 'tgen.csv')
695 tgen = TGen(path = tgenpath, encoding = self.parent.syscoding)
696 if os.path.exists(tgenpath) :
698 if isinstance(evt, list) :
700 while 'tgen%i' %i in tgen.tgen :
702 tgenname = 'tgen%i' %i
703 tgen.tgen[tgenname] = evt
704 tgenframe = TGenFrame(self.parent, corpus, tgen)
706 if isinstance(evt, list) :
707 tgenframe.OnNewTgen(None, tgen = tgenname)
709 def OnTgenCompute(self, evt):
710 corpus = self.page.corpus
711 tgenpath = os.path.join(self.page.parametres['pathout'], 'tgen.csv')
712 if not os.path.exists(tgenpath) :
713 message = wx.MessageDialog(self.parent, _(u"No TGen yet !"), style = wx.ICON_EXCLAMATION | wx.OK)
717 self.page.parametres['tgenpath'] = tgenpath
718 tgen = TGen(path = tgenpath, encoding = self.parent.syscoding)
719 self.page.parametres['etoiles'] = self.page.etoiles
720 TgenSpec(self.parent, corpus, self.page.parametres)
721 TgenLayout(self.page)
723 def OnExportClasses(self, event):
724 corpus = self.page.corpus
725 if self.page.parametres['classif_mode'] != 2 :
729 busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self.parent)
731 for i in range(1, self.page.parametres['clnb'] + 1) :
732 corpus.export_classe(self.page.pathout['classe_%i_export.txt' % i], i, uci = uci)
734 dial = wx.MessageDialog(self, self.page.pathout['classe_x_export.txt'], u"Export", wx.OK|wx.ICON_INFORMATION)
738 def OnSubCorpusFromClusters(self, evt):
739 self.parent.OnSubText(self.getcorpus(), parametres = {'fromclusters' : True, 'clnb': self.page.parametres['clnb'], 'lc' : self.page.corpus.lc})
741 def OnRename(self, event):
742 pydata = self.itemdict['pydata']
745 def OnItemBackground(self, event):
747 colourdata = wx.ColourData()
748 colourdata.SetColour(self.itemdict["back"])
749 dlg = wx.ColourDialog(self, colourdata)
751 dlg.GetColourData().SetChooseFull(True)
753 if dlg.ShowModal() == wx.ID_OK:
754 data = dlg.GetColourData()
755 col1 = data.GetColour().Get()
756 self.SetItemBackgroundColour(self.current, col1)
760 def OnItemForeground(self, event):
762 colourdata = wx.ColourData()
763 colourdata.SetColour(self.itemdict["fore"])
764 dlg = wx.ColourDialog(self, colourdata)
766 dlg.GetColourData().SetChooseFull(True)
768 if dlg.ShowModal() == wx.ID_OK:
769 data = dlg.GetColourData()
770 col1 = data.GetColour().Get()
771 self.SetItemTextColour(self.current, col1)
775 def OnItemBold(self, event):
777 self.SetItemBold(self.current, not self.itemdict["isbold"])
780 def OnItemFont(self, event):
783 font = self.itemdict["font"]
786 font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
788 data.SetInitialFont(font)
790 dlg = wx.FontDialog(self, data)
792 if dlg.ShowModal() == wx.ID_OK:
793 data = dlg.GetFontData()
794 font = data.GetChosenFont()
795 self.SetItemFont(self.current, font)
800 def OnItemHyperText(self, event):
802 self.SetItemHyperText(self.current, not self.itemdict["ishtml"])
805 def OnEnableWindow(self, event):
807 enable = self.GetItemWindowEnabled(self.current)
808 self.SetItemWindowEnabled(self.current, not enable)
811 def OnDisableItem(self, event):
813 self.EnableItem(self.current, False)
816 def OnItemIcons(self, event):
818 bitmaps = [self.itemdict["normal"], self.itemdict["selected"],
819 self.itemdict["expanded"], self.itemdict["selexp"]]
822 dlg = TreeIcons(self, -1, bitmaps=bitmaps)
827 def SetNewIcons(self, bitmaps):
829 self.SetItemImage(self.current, bitmaps[0], CT.TreeItemIcon_Normal)
830 self.SetItemImage(self.current, bitmaps[1], CT.TreeItemIcon_Selected)
831 self.SetItemImage(self.current, bitmaps[2], CT.TreeItemIcon_Expanded)
832 self.SetItemImage(self.current, bitmaps[3], CT.TreeItemIcon_SelectedExpanded)
835 def OnItemInfo(self, event):
837 itemtext = self.itemdict["text"]
838 numchildren = str(self.itemdict["children"])
839 itemtype = self.itemdict["itemtype"]
840 pydata = self.itemdict['pydata']
841 #if 'analyses' in pydata :
842 # toshow = dict([[val, pydata[val]] for val in pydata if val not in['analyses', 'isload']])
844 toshow = pydata['ira']
845 toshow = DoConf(toshow).getoptions()
846 txt = DoConf().totext(toshow)
847 parametres = [val.split('\t\t:') for val in txt.splitlines()]
853 itemtype = "CheckBox"
855 itemtype = "RadioButton"
857 dlg = InfoDialog(self, itemtext, parametres)
864 def OnItemDelete(self, event):
866 strs = "Are You Sure You Want To Delete Item " + self.GetItemText(self.current) + "?"
867 dlg = wx.MessageDialog(None, strs, 'Deleting Item', wx.OK | wx.CANCEL | wx.ICON_QUESTION)
869 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
875 pydata = self.itemdict['pydata']
876 if 'corpus_name' in pydata :
877 self.history.delete(pydata, True)
879 self.history.delete(pydata)
880 self.DeleteChildren(self.current)
881 self.Delete(self.current)
886 def OnItemPrepend(self, event):
888 dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
890 if dlg.ShowModal() == wx.ID_OK:
891 newname = dlg.GetValue()
892 newitem = self.PrependItem(self.current, newname)
893 self.EnsureVisible(newitem)
897 def AddAnalyse(self, parametres, itemParent = None, bold = True) :
898 uuid = parametres.get('corpus', None)
899 if uuid is not None :
900 if itemParent is None :
901 itemParent = self.textroot
902 child, cookie = self.GetFirstChild(itemParent)
905 pydata = self.GetPyData(child)
906 if pydata['uuid'] == uuid :
909 self.GiveFocus(child, uuid)
910 child, cookie = self.GetNextChild(itemParent, cookie)
911 #item = self.AppendItem(child, parametres['name'])
912 if corpus is not None :
913 item = self.AppendItem(corpus, parametres['name'])
915 item = self.AppendItem(self.textroot, parametres['name'])
917 item = self.AppendItem(self.matroot, parametres['name'])
918 self.SetPyData(item, parametres)
919 if parametres['type'] in self.ild :
920 img = self.ild[parametres['type']]
923 self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
924 self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
925 self.SetItemBold(item, bold)
926 self.SelectItem(item)
928 def AddMatAnalyse(self, parametres, itemParent = None, bold = True) :
929 uuid = parametres.get('matrix', None)
930 if uuid is not None :
931 if itemParent is None :
932 itemParent = self.matroot
933 child, cookie = self.GetFirstChild(itemParent)
936 pydata = self.GetPyData(child)
937 if pydata['uuid'] == uuid :
940 self.GiveFocus(child, uuid)
941 child, cookie = self.GetNextChild(itemParent, cookie)
942 #item = self.AppendItem(child, parametres['name'])
943 if matrix is not None :
944 item = self.AppendItem(matrix, parametres['name'])
946 item = self.AppendItem(self.matroot, parametres['name'])
947 self.SetPyData(item, parametres)
948 if parametres['type'] in self.ild :
949 img = self.ild[parametres['type']]
952 self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
953 self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
954 self.SetItemBold(item, bold)
955 self.SelectItem(item)
957 def OnItemAppend(self, item, select = True):
958 if 'corpus_name' in item :
959 child = self.InsertItem(self.textroot, 0, item['corpus_name'])
961 child = self.InsertItem(self.matroot, 0, item['matrix_name'])
962 self.SetPyData(child, item)
963 if item['type'] in self.ild :
964 img = self.ild[item['type']]
967 self.SetItemImage(child, img, CT.TreeItemIcon_Normal)
968 self.SetItemImage(child, img, CT.TreeItemIcon_Expanded)
970 self.history.addtab(item)
971 self.SetItemBold(child, True)
973 #dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
975 #if dlg.ShowModal() == wx.ID_OK:
976 # newname = dlg.GetValue()
977 # newitem = self.AppendItem(self.current, newname)
978 # self.EnsureVisible(newitem)
984 def OnBeginEdit(self, event):
986 #self.log.info("OnBeginEdit" + "\n")
987 # show how to prevent edit...
988 item = event.GetItem()
989 if item and self.GetItemText(item) == "The Root Item":
991 #self.log.info("You can't edit this one..." + "\n")
993 # Lets just see what's visible of its children
995 root = event.GetItem()
996 (child, cookie) = self.GetFirstChild(root)
999 #self.log.info("Child [%s] visible = %d" % (self.GetItemText(child), self.IsVisible(child)) + "\n")
1000 (child, cookie) = self.GetNextChild(root, cookie)
1005 def OnEndEdit(self, event):
1007 #self.log.info("OnEndEdit: %s %s" %(event.IsEditCancelled(), event.GetLabel()))
1008 # show how to reject edit, we'll not allow any digits
1009 for x in event.GetLabel():
1010 if x in string.digits:
1011 #self.log.info(", You can't enter digits..." + "\n")
1018 def OnLeftDClick(self, event):
1019 pt = event.GetPosition()
1020 item, flags = self.HitTest(pt)
1021 if item is not None :
1022 pydata = self.GetPyData(item)
1023 if pydata['uuid'] in self.parent.history.opened :
1024 for i in range(self.parent.nb.GetPageCount()) :
1025 page = self.parent.nb.GetPage(i)
1026 if 'parametres' in dir(page) :
1027 if page.parametres['uuid'] == pydata['uuid'] :
1028 self.parent.nb.SetSelection(i)
1030 elif pydata['uuid'] in ['textroot', 'matroot'] :
1033 busy = wx.BusyInfo(_("Please wait..."), self.parent)
1035 OpenAnalyse(self.parent, pydata)
1037 self.SetItemBold(item, True)
1038 self.OnSelChanged(pydata = pydata)
1039 #if item and (flags & CT.TREE_HITTEST_ONITEMLABEL):
1040 # if self.GetAGWWindowStyleFlag() & CT.TR_EDIT_LABELS:
1041 # self.log.info("OnLeftDClick: %s (manually starting label edit)"% self.GetItemText(item) + "\n")
1043 #self.EditLabel(item)
1045 # pydata = self.GetPyData(item)
1047 # self.log.info("OnLeftDClick: Cannot Start Manual Editing, Missing Style TR_EDIT_LABELS\n")
1052 def OnItemExpanded(self, event):
1054 item = event.GetItem()
1056 self.log.info("OnItemExpanded: %s" % self.GetItemText(item) + "\n")
1059 def OnItemExpanding(self, event):
1061 item = event.GetItem()
1063 self.log.info("OnItemExpanding: %s" % self.GetItemText(item) + "\n")
1068 def OnItemCollapsed(self, event):
1070 item = event.GetItem()
1072 self.log.info("OnItemCollapsed: %s" % self.GetItemText(item) + "\n")
1075 def OnItemCollapsing(self, event):
1077 item = event.GetItem()
1079 self.log.info("OnItemCollapsing: %s" % self.GetItemText(item) + "\n")
1084 def OnSelChanged(self, event = None, pydata = None):
1085 if event is not None :
1086 item = event.GetItem()
1087 pydata = self.GetPyData(item)
1089 if pydata is not None :
1090 if 'corpus_name' in pydata :
1091 self.ira.ShowMenu('text', True)
1092 self.ira.ShowMenu('matrix', False)
1093 if 'matrix_name' in pydata :
1094 self.ira.ShowMenu('text', False)
1095 self.ira.ShowMenu('matrix', True)
1096 self.pydata = pydata
1097 if pydata['uuid'] in self.parent.history.opened :
1098 for i in range(self.parent.nb.GetPageCount()) :
1099 self.page = self.parent.nb.GetPage(i)
1100 if 'parametres' in dir(self.page) :
1101 if self.page.parametres['uuid'] == pydata['uuid'] :
1102 self.parent.nb.SetSelection(i)
1104 if event is not None :
1108 def OnSelChanging(self, event):
1110 item = event.GetItem()
1111 olditem = event.GetOldItem()
1115 olditemtext = "None"
1117 olditemtext = self.GetItemText(olditem)
1118 #self.log.info("OnSelChanging: From %s" % olditemtext + " To %s" % self.GetItemText(item) + "\n")
1123 def OnBeginDrag(self, event):
1125 self.item = event.GetItem()
1127 self.log.info("Beginning Drag..." + "\n")
1132 def OnBeginRDrag(self, event):
1134 self.item = event.GetItem()
1136 self.log.info("Beginning Right Drag..." + "\n")
1141 def OnEndDrag(self, event):
1143 self.item = event.GetItem()
1145 self.log.info("Ending Drag!" + "\n")
1150 def OnDeleteItem(self, event):
1152 item = event.GetItem()
1157 self.log.info("Deleting Item: %s" % self.GetItemText(item) + "\n")
1161 def OnItemCheck(self, event):
1163 item = event.GetItem()
1164 self.log.info("Item " + self.GetItemText(item) + " Has Been Checked!\n")
1168 def OnItemChecking(self, event):
1170 item = event.GetItem()
1171 self.log.info("Item " + self.GetItemText(item) + " Is Being Checked...\n")
1175 def OnToolTip(self, event):
1177 item = event.GetItem()
1179 event.SetToolTip(wx.ToolTip(self.GetItemText(item)))
1182 def OnItemMenu(self, event):
1184 item = event.GetItem()
1186 self.log.info("OnItemMenu: %s" % self.GetItemText(item) + "\n")
1191 def OnKey(self, event):
1193 keycode = event.GetKeyCode()
1194 keyname = keyMap.get(keycode, None)
1196 if keycode == wx.WXK_BACK:
1197 self.log.info("OnKeyDown: HAHAHAHA! I Vetoed Your Backspace! HAHAHAHA\n")
1201 if "unicode" in wx.PlatformInfo:
1202 keycode = event.GetUnicodeKey()
1204 keycode = event.GetKeyCode()
1205 keyname = "\"" + unichr(event.GetUnicodeKey()) + "\""
1207 keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1213 keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1215 keyname = "\"%s\"" % chr(keycode)
1217 keyname = "unknown (%s)" % keycode
1219 self.log.info("OnKeyDown: You Pressed '" + keyname + "'\n")
1224 def OnActivate(self, event):
1227 self.log.info("OnActivate: %s" % self.GetItemText(self.item) + "\n")
1232 def OnHyperLink(self, event):
1234 item = event.GetItem()
1236 self.log.info("OnHyperLink: %s" % self.GetItemText(self.item) + "\n")
1239 def OnTextCtrl(self, event):
1241 char = chr(event.GetKeyCode())
1242 self.log.info("EDITING THE TEXTCTRL: You Wrote '" + char + \
1243 "' (KeyCode = " + str(event.GetKeyCode()) + ")\n")
1247 def OnComboBox(self, event):
1249 selection = event.GetEventObject().GetValue()
1250 self.log.info("CHOICE FROM COMBOBOX: You Chose '" + selection + "'\n")