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 if item.IsSubMenu() :
418 for val in item.GetSubMenu().GetMenuItems() :
419 nmenu.Append(val.GetId(), val.GetText())
420 menu.AppendMenu(itemid, itemtext, nmenu)
422 menu.Append(itemid, itemtext)
424 splitfromvar = split.Append(-1, _(u"Split from variable").decode('utf8'))
425 menu.AppendMenu(-1, _(u"Split matrix").decode('utf8'), split)
426 self.Bind(wx.EVT_MENU, self.OnSplitFromVar, splitfromvar)
427 #print item, itemid, itemtext
428 #menu = self.parent.matrix_menu
429 #freq = menu.Append(wx.ID_ANY, _(u"Frequency").decode('utf8'))
430 #chi2 = menu.Append(wx.ID_ANY, _(u"Chi square").decode('utf8'))
431 #chdreinert = menu.Append(wx.ID_ANY, _(u"Reinert clustering").decode('utf8'))
432 #simi = menu.Append(wx.ID_ANY, _(u"Similarity analysis").decode('utf8'))
433 menu.AppendSeparator()
434 #self.Bind(wx.EVT_MENU, self.OnFreq, freq)
435 #self.Bind(wx.EVT_MENU, self.OnChiSquare, chi2)
436 #self.Bind(wx.EVT_MENU, self.OnSimiTab, simi)
437 #self.Bind(wx.EVT_MENU, self.OnCHDReinert, chdreinert)
438 elif pydata.get('type', False) == 'alceste' and pydata['uuid'] in self.parent.history.opened :
440 antipro = openmenu.Append(wx.ID_ANY, _(u"Antiprofiles").decode('utf8'))
441 menu.AppendMenu(wx.ID_ANY, _(u"Open ...").decode('utf8'), openmenu)
443 profsr = menu.Append(wx.ID_ANY, _(u"Repeated segments profiles").decode('utf8'))
444 profgram = menu.Append(wx.ID_ANY, _(u"POS profiles").decode('utf8'))
445 export_corpus = menu.Append(wx.ID_ANY, _(u"Export corpus").decode('utf8'))
446 colored = menu.Append(wx.ID_ANY, _(u"Colored corpus").decode('utf8'))
447 navig = menu.Append(wx.ID_ANY, _(u"Navigator").decode('utf8'))
448 statclasse = menu.Append(wx.ID_ANY, _(u"Clusters statistics").decode('utf8'))
449 rapport = menu.Append(wx.ID_ANY, _(u"Report").decode('utf8'))
450 export_classes = menu.Append(wx.ID_ANY, _(u"Export clusters").decode('utf8'))
451 subcorpusfromcl = menu.Append(wx.ID_ANY, _(u"Sub corpus from clusters").decode('utf8'))
452 menu.AppendSeparator()
453 self.Bind(wx.EVT_MENU, self.OpenAntipro, antipro)
454 self.Bind(wx.EVT_MENU, self.OnProfSR, profsr)
455 self.Bind(wx.EVT_MENU, self.OnProfGram, profgram)
456 self.Bind(wx.EVT_MENU, self.OnExportCorpus, export_corpus)
457 self.Bind(wx.EVT_MENU, self.OnColored, colored)
458 self.Bind(wx.EVT_MENU, self.OnNavig, navig)
459 self.Bind(wx.EVT_MENU, self.StatClasse, statclasse)
460 self.Bind(wx.EVT_MENU, self.OnRapport, rapport)
461 self.Bind(wx.EVT_MENU, self.OnExportClasses, export_classes)
462 self.Bind(wx.EVT_MENU, self.OnSubCorpusFromClusters, subcorpusfromcl)
463 elif pydata.get('type', False) == 'stat' and pydata['uuid'] in self.parent.history.opened :
464 export_dictionary = menu.Append(wx.ID_ANY, _(u"Export dictionary").decode('utf8'))
465 export_lems = menu.Append(wx.ID_ANY, _(u"Export lemma dictionary").decode('utf8'))
466 self.Bind(wx.EVT_MENU, self.OnExportDictionary, export_dictionary)
467 self.Bind(wx.EVT_MENU, self.OnExportLems, export_lems)
468 menu.AppendSeparator()
469 elif pydata.get('type', False) == 'spec' and pydata['uuid'] in self.parent.history.opened :
470 tgen = menu.Append(wx.ID_ANY, _(u"Tgen Editor").decode('utf8'))
471 computetgen = menu.Append(wx.ID_ANY, _(u"Compute Tgen").decode('utf8'))
472 self.Bind(wx.EVT_MENU, self.OnTgenEditor, tgen)
473 self.Bind(wx.EVT_MENU, self.OnTgenCompute, computetgen)
474 menu.AppendSeparator()
475 elif pydata.get('type', False) == 'reinertmatrix' and pydata['uuid'] in self.parent.history.opened :
477 antipro = openmenu.Append(wx.ID_ANY, _(u"antiprofiles").decode('utf8'))
478 rapport = menu.Append(wx.ID_ANY, _(u"Report").decode('utf8'))
479 menu.AppendMenu(wx.ID_ANY, _(u"Open ...").decode('utf8'), openmenu)
480 self.Bind(wx.EVT_MENU, self.OpenAntipro, antipro)
481 self.Bind(wx.EVT_MENU, self.OnRapport, rapport)
484 itemdelete = menu.Append(wx.ID_ANY, _(u"Delete from history").decode('utf8'))
485 #item11 = menu.Append(wx.ID_ANY, "Prepend An Item")
486 #item12 = menu.Append(wx.ID_ANY, "Append An Item")
488 #self.Bind(wx.EVT_MENU, self.OnItemBackground, item1)
489 #self.Bind(wx.EVT_MENU, self.OnItemForeground, item2)
490 #self.Bind(wx.EVT_MENU, self.OnItemBold, item3)
491 #self.Bind(wx.EVT_MENU, self.OnItemFont, item4)
492 #self.Bind(wx.EVT_MENU, self.OnItemHyperText, item5)
493 #self.Bind(wx.EVT_MENU, self.OnEnableWindow, item6)
494 #self.Bind(wx.EVT_MENU, self.OnDisableItem, item7)
495 #self.Bind(wx.EVT_MENU, self.OnItemIcons, item8)
496 self.Bind(wx.EVT_MENU, self.OnItemInfo, info)
497 self.Bind(wx.EVT_MENU, self.OnRename, rename)
498 self.Bind(wx.EVT_MENU, self.OnItemDelete, itemdelete)
499 #self.Bind(wx.EVT_MENU, self.OnItemPrepend, item11)
500 #self.Bind(wx.EVT_MENU, self.OnItemAppend, item12)
506 busy = wx.BusyInfo(_("Please wait...Reading corpus").decode('utf8'), self.parent)
508 if self.pydata['uuid'] in self.parent.history.openedcorpus :
509 corpus = copycorpus(self.parent.history.openedcorpus[self.pydata['uuid']])
510 elif 'corpus_name' in self.pydata :
511 corpus = Corpus(self.parent, parametres = DoConf(self.pydata['ira']).getoptions('corpus'), read = True)
513 cuuid = self.pydata['corpus']
514 if cuuid in self.parent.history.openedcorpus :
515 corpus = copycorpus(self.parent.history.openedcorpus[cuuid])
517 irapath = self.parent.history.corpus[cuuid]['ira']
518 corpus = Corpus(self.parent, parametres = DoConf(irapath).getoptions('corpus'), read = True)
523 if 'matrix_name' in self.pydata :
524 matrix = Tableau(self.parent, parametres = DoConf(self.pydata['ira']).getoptions('matrix'))
526 return copymatrix(matrix)
528 cuuid = self.pydata['matrix']
529 matrix = Tableau(self.parent, parametres = DoConf(self.history.matrixanalyse[cuuid]['ira']).getoptions('matrix'))
531 return copymatrix(matrix)
533 def OnSpec(self, evt) :
534 self.parent.OnTextSpec(evt, self.getcorpus())
536 def OnStat(self, evt) :
537 self.parent.OnTextStat(evt, self.getcorpus())
539 def OnReinert(self, evt) :
540 self.parent.OnTextReinert(evt, self.getcorpus())
542 def OnPam(self, evt) :
543 self.parent.OnPamSimple(evt, self.getcorpus())
545 def OnSimiTxt(self, evt) :
546 self.parent.OnSimiTxt(evt, self.getcorpus())
548 def OnWordCloud(self, evt) :
549 self.parent.OnWordCloud(evt, self.getcorpus())
551 def OnFreq(self, evt):
552 self.parent.OnFreq(evt, self.getmatrix())
554 def OnChiSquare(self, evt):
555 self.parent.OnChi2(evt, self.getmatrix())
557 def OnSimiTab(self, evt):
558 self.parent.OnSimiTab(evt, self.getmatrix())
560 def OnProto(self, evt):
561 self.parent.OnProto(evt, self.getmatrix())
563 def OnSplitFromVar(self, evt):
564 self.parent.OnSplitVar(evt, self.getmatrix())
566 def OnCHDReinert(self, evt):
567 self.parent.OnCHDReinert(evt, self.getmatrix())
569 def OnSubTextFromMeta(self, evt):
570 self.parent.OnSubText(self.getcorpus(), parametres = {'frommeta' : True})
572 def OnSubTextFromTheme(self, evt):
573 self.parent.OnSubText(self.getcorpus(), parametres = {'fromtheme' : True})
575 def OnProfSR(self, evt) :
576 ProfileSegment(self.parent, self.page.dictpathout, self.page.parametres, self.page.corpus)
578 def OnProfGram(self, evt) :
579 ProfilType(self.parent, self.page.corpus, self.page.parametres)
581 def OnExportCorpus(self, evt) :
582 dial = PrefExport(self, self.parent)
583 dial.fbb.SetValue(os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'export_corpus.txt'))
584 dial.CenterOnParent()
585 res = dial.ShowModal()
587 if dial.radio_type.GetSelection() == 0 : alc = True
589 if dial.radio_lem.GetSelection() == 0 : lem = True
591 if self.page.parametres['classif_mode'] != 2 :
595 self.page.corpus.export_corpus_classes(dial.fbb.GetValue(), alc = alc, lem = lem, uci = uci)
598 dlg = wx.MessageDialog(self.parent, msg, u"Export", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
603 def OnColored(self, evt) :
604 dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.html', 'title': _(u"Colored corpus").decode('utf8')})
605 dial.fbb.SetValue(os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'corpus_couleur.html'))
606 dial.CenterOnParent()
607 res = dial.ShowModal()
609 fileout = dial.fbb.GetValue()
611 if self.page.parametres['classif_mode'] != 2 :
615 txt = self.page.corpus.make_colored_corpus(uci = uci)
616 with open(fileout, 'w') as f :
618 msg = ' !\n'.join([_(u"Done").decode('utf8'), _(u"Open in a web browser ?").decode('utf8')])
619 dlg = wx.MessageDialog(self.parent, msg, u"Corpus en couleur", wx.NO | wx.YES | wx.NO_DEFAULT | wx.ICON_QUESTION)
621 if dlg.ShowModal() == wx.ID_YES :
622 webbrowser.open(fileout)
625 def OnNavig(self, evt):
626 if 'FrameSearch' not in dir(self.page) :
627 self.page.FrameSearch = SearchFrame(self.parent, -1, _(u"Search ...").decode('utf8'), self.page.corpus)
628 self.page.FrameSearch.Show()
630 def StatClasse(self, evt):
631 dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.csv', 'title': _(u"Clusters statistics").decode('utf8')})
632 dial.fbb.SetValue( os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'stat_par_classe.csv'))
633 dial.CenterOnParent()
634 res = dial.ShowModal()
636 fileout = dial.fbb.GetValue()
638 self.page.corpus.get_stat_by_cluster(fileout)
640 dlg = wx.MessageDialog(self.parent, msg, _(u"Clusters statistics").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
642 if dlg.ShowModal() == wx.ID_OK :
645 def OpenAntipro(self, evt) :
647 for i in range(0, self.page.TabChdSim.GetPageCount()) :
648 page = self.page.TabChdSim.GetPage(i)
649 if self.page.TabChdSim.GetPageText(i) == _(u"Antiprofiles").decode('utf8') :
650 self.page.TabChdSim.SetSelection(i)
654 open_antiprofil(self.page, self.page.dictpathout['ANTIPRO_OUT'], self.parent.syscoding)
655 self.page.TabChdSim.SetSelection(self.page.TabChdSim.GetPageCount() - 1)
657 def OnRapport(self, evt) :
658 dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.txt', 'title': _(u"Report").decode('utf8')})
659 dial.fbb.SetValue(self.page.dictpathout['rapport'])
660 dial.CenterOnParent()
661 res = dial.ShowModal()
663 fileout = dial.fbb.GetValue()
665 with open(fileout, 'w') as f :
666 f.write(self.page.debtext + '\n' + GetTxtProfile(self.page.DictProfile, self.page.cluster_size))
668 dlg = wx.MessageDialog(self.parent, msg, _(u"Report").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
675 def OnExportDictionary(self, evt) :
676 corpus = self.page.corpus
677 corpus.export_dictionary(self.page.pathout['dictionary.csv'], self.parent.syscoding)
678 log.info('export dictionary %s' % self.page.pathout['dictionary.csv'])
679 dial = wx.MessageDialog(self.parent, self.page.pathout['dictionary.csv'], 'Export', wx.OK)
683 def OnExportLems(self, evt) :
684 corpus = self.page.corpus
685 corpus.export_lems(self.page.pathout['lemmes.csv'], self.parent.syscoding)
686 log.info('export lemmes %s' % self.page.pathout['lemmes.csv'])
687 dial = wx.MessageDialog(self.parent, self.page.pathout['lemmes.csv'], 'Export', wx.OK)
691 def OnTgenEditor(self, evt):
692 corpus = self.page.corpus
693 tgenpath = os.path.join(self.page.parametres['pathout'], 'tgen.csv')
694 tgen = TGen(path = tgenpath, encoding = self.parent.syscoding)
695 if os.path.exists(tgenpath) :
697 if isinstance(evt, list) :
699 while 'tgen%i' %i in tgen.tgen :
701 tgenname = 'tgen%i' %i
702 tgen.tgen[tgenname] = evt
703 tgenframe = TGenFrame(self.parent, corpus, tgen)
705 if isinstance(evt, list) :
706 tgenframe.OnNewTgen(None, tgen = tgenname)
708 def OnTgenCompute(self, evt):
709 corpus = self.page.corpus
710 tgenpath = os.path.join(self.page.parametres['pathout'], 'tgen.csv')
711 if not os.path.exists(tgenpath) :
712 message = wx.MessageDialog(self.parent, _(u"No TGen yet !"), style = wx.ICON_EXCLAMATION | wx.OK)
716 self.page.parametres['tgenpath'] = tgenpath
717 tgen = TGen(path = tgenpath, encoding = self.parent.syscoding)
718 self.page.parametres['etoiles'] = self.page.etoiles
719 TgenSpec(self.parent, corpus, self.page.parametres)
720 TgenLayout(self.page)
722 def OnExportClasses(self, event):
723 corpus = self.page.corpus
724 if self.page.parametres['classif_mode'] != 2 :
728 busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self.parent)
730 for i in range(1, self.page.parametres['clnb'] + 1) :
731 corpus.export_classe(self.page.pathout['classe_%i_export.txt' % i], i, uci = uci)
733 dial = wx.MessageDialog(self, self.page.pathout['classe_x_export.txt'], u"Export", wx.OK|wx.ICON_INFORMATION)
737 def OnSubCorpusFromClusters(self, evt):
738 self.parent.OnSubText(self.getcorpus(), parametres = {'fromclusters' : True, 'clnb': self.page.parametres['clnb'], 'lc' : self.page.corpus.lc})
740 def OnRename(self, event):
741 pydata = self.itemdict['pydata']
744 def OnItemBackground(self, event):
746 colourdata = wx.ColourData()
747 colourdata.SetColour(self.itemdict["back"])
748 dlg = wx.ColourDialog(self, colourdata)
750 dlg.GetColourData().SetChooseFull(True)
752 if dlg.ShowModal() == wx.ID_OK:
753 data = dlg.GetColourData()
754 col1 = data.GetColour().Get()
755 self.SetItemBackgroundColour(self.current, col1)
759 def OnItemForeground(self, event):
761 colourdata = wx.ColourData()
762 colourdata.SetColour(self.itemdict["fore"])
763 dlg = wx.ColourDialog(self, colourdata)
765 dlg.GetColourData().SetChooseFull(True)
767 if dlg.ShowModal() == wx.ID_OK:
768 data = dlg.GetColourData()
769 col1 = data.GetColour().Get()
770 self.SetItemTextColour(self.current, col1)
774 def OnItemBold(self, event):
776 self.SetItemBold(self.current, not self.itemdict["isbold"])
779 def OnItemFont(self, event):
782 font = self.itemdict["font"]
785 font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
787 data.SetInitialFont(font)
789 dlg = wx.FontDialog(self, data)
791 if dlg.ShowModal() == wx.ID_OK:
792 data = dlg.GetFontData()
793 font = data.GetChosenFont()
794 self.SetItemFont(self.current, font)
799 def OnItemHyperText(self, event):
801 self.SetItemHyperText(self.current, not self.itemdict["ishtml"])
804 def OnEnableWindow(self, event):
806 enable = self.GetItemWindowEnabled(self.current)
807 self.SetItemWindowEnabled(self.current, not enable)
810 def OnDisableItem(self, event):
812 self.EnableItem(self.current, False)
815 def OnItemIcons(self, event):
817 bitmaps = [self.itemdict["normal"], self.itemdict["selected"],
818 self.itemdict["expanded"], self.itemdict["selexp"]]
821 dlg = TreeIcons(self, -1, bitmaps=bitmaps)
826 def SetNewIcons(self, bitmaps):
828 self.SetItemImage(self.current, bitmaps[0], CT.TreeItemIcon_Normal)
829 self.SetItemImage(self.current, bitmaps[1], CT.TreeItemIcon_Selected)
830 self.SetItemImage(self.current, bitmaps[2], CT.TreeItemIcon_Expanded)
831 self.SetItemImage(self.current, bitmaps[3], CT.TreeItemIcon_SelectedExpanded)
834 def OnItemInfo(self, event):
836 itemtext = self.itemdict["text"]
837 numchildren = str(self.itemdict["children"])
838 itemtype = self.itemdict["itemtype"]
839 pydata = self.itemdict['pydata']
840 #if 'analyses' in pydata :
841 # toshow = dict([[val, pydata[val]] for val in pydata if val not in['analyses', 'isload']])
843 toshow = pydata['ira']
844 toshow = DoConf(toshow).getoptions()
845 txt = DoConf().totext(toshow)
846 parametres = [val.split('\t\t:') for val in txt.splitlines()]
852 itemtype = "CheckBox"
854 itemtype = "RadioButton"
856 dlg = InfoDialog(self, itemtext, parametres)
863 def OnItemDelete(self, event):
865 strs = "Are You Sure You Want To Delete Item " + self.GetItemText(self.current) + "?"
866 dlg = wx.MessageDialog(None, strs, 'Deleting Item', wx.OK | wx.CANCEL | wx.ICON_QUESTION)
868 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
874 pydata = self.itemdict['pydata']
875 if 'corpus_name' in pydata :
876 self.history.delete(pydata, True)
878 self.history.delete(pydata)
879 self.DeleteChildren(self.current)
880 self.Delete(self.current)
885 def OnItemPrepend(self, event):
887 dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
889 if dlg.ShowModal() == wx.ID_OK:
890 newname = dlg.GetValue()
891 newitem = self.PrependItem(self.current, newname)
892 self.EnsureVisible(newitem)
896 def AddAnalyse(self, parametres, itemParent = None, bold = True) :
897 uuid = parametres.get('corpus', None)
898 if uuid is not None :
899 if itemParent is None :
900 itemParent = self.textroot
901 child, cookie = self.GetFirstChild(itemParent)
904 pydata = self.GetPyData(child)
905 if pydata['uuid'] == uuid :
908 self.GiveFocus(child, uuid)
909 child, cookie = self.GetNextChild(itemParent, cookie)
910 #item = self.AppendItem(child, parametres['name'])
911 if corpus is not None :
912 item = self.AppendItem(corpus, parametres['name'])
914 item = self.AppendItem(self.textroot, parametres['name'])
916 item = self.AppendItem(self.matroot, parametres['name'])
917 self.SetPyData(item, parametres)
918 if parametres['type'] in self.ild :
919 img = self.ild[parametres['type']]
922 self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
923 self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
924 self.SetItemBold(item, bold)
925 self.SelectItem(item)
927 def AddMatAnalyse(self, parametres, itemParent = None, bold = True) :
928 uuid = parametres.get('matrix', None)
929 if uuid is not None :
930 if itemParent is None :
931 itemParent = self.matroot
932 child, cookie = self.GetFirstChild(itemParent)
935 pydata = self.GetPyData(child)
936 if pydata['uuid'] == uuid :
939 self.GiveFocus(child, uuid)
940 child, cookie = self.GetNextChild(itemParent, cookie)
941 #item = self.AppendItem(child, parametres['name'])
942 if matrix is not None :
943 item = self.AppendItem(matrix, parametres['name'])
945 item = self.AppendItem(self.matroot, parametres['name'])
946 self.SetPyData(item, parametres)
947 if parametres['type'] in self.ild :
948 img = self.ild[parametres['type']]
951 self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
952 self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
953 self.SetItemBold(item, bold)
954 self.SelectItem(item)
956 def OnItemAppend(self, item, select = True):
957 if 'corpus_name' in item :
958 child = self.InsertItem(self.textroot, 0, item['corpus_name'])
960 child = self.InsertItem(self.matroot, 0, item['matrix_name'])
961 self.SetPyData(child, item)
962 if item['type'] in self.ild :
963 img = self.ild[item['type']]
966 self.SetItemImage(child, img, CT.TreeItemIcon_Normal)
967 self.SetItemImage(child, img, CT.TreeItemIcon_Expanded)
969 self.history.addtab(item)
970 self.SetItemBold(child, True)
972 #dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
974 #if dlg.ShowModal() == wx.ID_OK:
975 # newname = dlg.GetValue()
976 # newitem = self.AppendItem(self.current, newname)
977 # self.EnsureVisible(newitem)
983 def OnBeginEdit(self, event):
985 #self.log.info("OnBeginEdit" + "\n")
986 # show how to prevent edit...
987 item = event.GetItem()
988 if item and self.GetItemText(item) == "The Root Item":
990 #self.log.info("You can't edit this one..." + "\n")
992 # Lets just see what's visible of its children
994 root = event.GetItem()
995 (child, cookie) = self.GetFirstChild(root)
998 #self.log.info("Child [%s] visible = %d" % (self.GetItemText(child), self.IsVisible(child)) + "\n")
999 (child, cookie) = self.GetNextChild(root, cookie)
1004 def OnEndEdit(self, event):
1006 #self.log.info("OnEndEdit: %s %s" %(event.IsEditCancelled(), event.GetLabel()))
1007 # show how to reject edit, we'll not allow any digits
1008 for x in event.GetLabel():
1009 if x in string.digits:
1010 #self.log.info(", You can't enter digits..." + "\n")
1017 def OnLeftDClick(self, event):
1018 pt = event.GetPosition()
1019 item, flags = self.HitTest(pt)
1020 if item is not None :
1021 pydata = self.GetPyData(item)
1022 if pydata['uuid'] in self.parent.history.opened :
1023 for i in range(self.parent.nb.GetPageCount()) :
1024 page = self.parent.nb.GetPage(i)
1025 if 'parametres' in dir(page) :
1026 if page.parametres['uuid'] == pydata['uuid'] :
1027 self.parent.nb.SetSelection(i)
1029 elif pydata['uuid'] in ['textroot', 'matroot'] :
1032 busy = wx.BusyInfo(_("Please wait..."), self.parent)
1034 OpenAnalyse(self.parent, pydata)
1036 self.SetItemBold(item, True)
1037 self.OnSelChanged(pydata = pydata)
1038 #if item and (flags & CT.TREE_HITTEST_ONITEMLABEL):
1039 # if self.GetAGWWindowStyleFlag() & CT.TR_EDIT_LABELS:
1040 # self.log.info("OnLeftDClick: %s (manually starting label edit)"% self.GetItemText(item) + "\n")
1042 #self.EditLabel(item)
1044 # pydata = self.GetPyData(item)
1046 # self.log.info("OnLeftDClick: Cannot Start Manual Editing, Missing Style TR_EDIT_LABELS\n")
1051 def OnItemExpanded(self, event):
1053 item = event.GetItem()
1055 self.log.info("OnItemExpanded: %s" % self.GetItemText(item) + "\n")
1058 def OnItemExpanding(self, event):
1060 item = event.GetItem()
1062 self.log.info("OnItemExpanding: %s" % self.GetItemText(item) + "\n")
1067 def OnItemCollapsed(self, event):
1069 item = event.GetItem()
1071 self.log.info("OnItemCollapsed: %s" % self.GetItemText(item) + "\n")
1074 def OnItemCollapsing(self, event):
1076 item = event.GetItem()
1078 self.log.info("OnItemCollapsing: %s" % self.GetItemText(item) + "\n")
1083 def OnSelChanged(self, event = None, pydata = None):
1084 if event is not None :
1085 item = event.GetItem()
1086 pydata = self.GetPyData(item)
1087 if pydata is not None :
1088 self.pydata = pydata
1089 if pydata['uuid'] in self.parent.history.opened :
1090 for i in range(self.parent.nb.GetPageCount()) :
1091 self.page = self.parent.nb.GetPage(i)
1092 if 'parametres' in dir(self.page) :
1093 if self.page.parametres['uuid'] == pydata['uuid'] :
1094 self.parent.nb.SetSelection(i)
1096 if event is not None :
1100 def OnSelChanging(self, event):
1102 item = event.GetItem()
1103 olditem = event.GetOldItem()
1107 olditemtext = "None"
1109 olditemtext = self.GetItemText(olditem)
1110 #self.log.info("OnSelChanging: From %s" % olditemtext + " To %s" % self.GetItemText(item) + "\n")
1115 def OnBeginDrag(self, event):
1117 self.item = event.GetItem()
1119 self.log.info("Beginning Drag..." + "\n")
1124 def OnBeginRDrag(self, event):
1126 self.item = event.GetItem()
1128 self.log.info("Beginning Right Drag..." + "\n")
1133 def OnEndDrag(self, event):
1135 self.item = event.GetItem()
1137 self.log.info("Ending Drag!" + "\n")
1142 def OnDeleteItem(self, event):
1144 item = event.GetItem()
1149 self.log.info("Deleting Item: %s" % self.GetItemText(item) + "\n")
1153 def OnItemCheck(self, event):
1155 item = event.GetItem()
1156 self.log.info("Item " + self.GetItemText(item) + " Has Been Checked!\n")
1160 def OnItemChecking(self, event):
1162 item = event.GetItem()
1163 self.log.info("Item " + self.GetItemText(item) + " Is Being Checked...\n")
1167 def OnToolTip(self, event):
1169 item = event.GetItem()
1171 event.SetToolTip(wx.ToolTip(self.GetItemText(item)))
1174 def OnItemMenu(self, event):
1176 item = event.GetItem()
1178 self.log.info("OnItemMenu: %s" % self.GetItemText(item) + "\n")
1183 def OnKey(self, event):
1185 keycode = event.GetKeyCode()
1186 keyname = keyMap.get(keycode, None)
1188 if keycode == wx.WXK_BACK:
1189 self.log.info("OnKeyDown: HAHAHAHA! I Vetoed Your Backspace! HAHAHAHA\n")
1193 if "unicode" in wx.PlatformInfo:
1194 keycode = event.GetUnicodeKey()
1196 keycode = event.GetKeyCode()
1197 keyname = "\"" + unichr(event.GetUnicodeKey()) + "\""
1199 keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1205 keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1207 keyname = "\"%s\"" % chr(keycode)
1209 keyname = "unknown (%s)" % keycode
1211 self.log.info("OnKeyDown: You Pressed '" + keyname + "'\n")
1216 def OnActivate(self, event):
1219 self.log.info("OnActivate: %s" % self.GetItemText(self.item) + "\n")
1224 def OnHyperLink(self, event):
1226 item = event.GetItem()
1228 self.log.info("OnHyperLink: %s" % self.GetItemText(self.item) + "\n")
1231 def OnTextCtrl(self, event):
1233 char = chr(event.GetKeyCode())
1234 self.log.info("EDITING THE TEXTCTRL: You Wrote '" + char + \
1235 "' (KeyCode = " + str(event.GetKeyCode()) + ")\n")
1239 def OnComboBox(self, event):
1241 selection = event.GetEventObject().GetValue()
1242 self.log.info("CHOICE FROM COMBOBOX: You Chose '" + selection + "'\n")