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.SetImageList(self.il)
133 self.history = parent.history
134 self.h = self.history.history
135 self.root = self.AddRoot("Iramuteq")
137 if not(self.GetAGWWindowStyleFlag() & CT.TR_HIDE_ROOT):
138 self.SetPyData(self.root, None)
139 self.SetItemImage(self.root, 24, CT.TreeItemIcon_Normal)
140 self.SetItemImage(self.root, 13, CT.TreeItemIcon_Expanded)
142 self.textroot = self.AppendItem(self.root, u'Corpus texte')
143 self.SetPyData(self.textroot, {'uuid': 'textroot'})
144 self.SetItemImage(self.textroot, imgtextroot, CT.TreeItemIcon_Normal)
145 self.SetItemImage(self.textroot, imgtextroot, CT.TreeItemIcon_Expanded)
147 for corpus in reversed(self.h) :
148 child = self.AppendItem(self.textroot, corpus['corpus_name'])
149 self.SetPyData(child, corpus)
150 self.SetItemImage(child, self.ild['corpus'], CT.TreeItemIcon_Normal)
151 self.SetItemImage(child, self.ild['corpus'], CT.TreeItemIcon_Expanded)
153 if 'analyses' in corpus :
154 for y in corpus['analyses'] :
155 last = self.AppendItem(child, y['name'], ct_type=0)
156 self.SetPyData(last, y)
157 if y['type'] in self.ild :
158 img = self.ild[y['type']]
161 self.SetItemImage(last, img, CT.TreeItemIcon_Normal)
162 self.SetItemImage(last, 13, CT.TreeItemIcon_Expanded)
164 self.matroot = self.AppendItem(self.root, u'Matrices')
165 self.SetPyData(self.matroot, {'uuid': 'matroot'})
166 self.SetItemImage(self.matroot, imgmatroot, CT.TreeItemIcon_Normal)
167 self.SetItemImage(self.matroot, imgmatroot, CT.TreeItemIcon_Expanded)
170 for matrix in reversed(self.history.matrix) :
171 if 'matrix_name' in matrix :
172 child = self.AppendItem(self.matroot, matrix['matrix_name'])
173 self.SetPyData(child, matrix)
174 self.SetItemImage(child, self.ild['matrix'], CT.TreeItemIcon_Normal)
175 self.SetItemImage(child, self.ild['matrix'], CT.TreeItemIcon_Expanded)
176 if 'analyses' in matrix :
177 for y in matrix['analyses'] :
178 last = self.AppendItem(child, y['name'], ct_type=0)
179 self.SetPyData(last, y)
180 if y['type'] in self.ild :
181 img = self.ild[y['type']]
184 self.SetItemImage(last, img, CT.TreeItemIcon_Normal)
185 self.SetItemImage(last, 13, CT.TreeItemIcon_Expanded)
187 orphmat.append(matrix)
189 self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDClick)
190 #self.Bind(wx.EVT_IDLE, self.OnIdle)
192 self.eventdict = {'EVT_TREE_BEGIN_DRAG': self.OnBeginDrag, 'EVT_TREE_BEGIN_LABEL_EDIT': self.OnBeginEdit,
193 'EVT_TREE_BEGIN_RDRAG': self.OnBeginRDrag, 'EVT_TREE_DELETE_ITEM': self.OnDeleteItem,
194 'EVT_TREE_END_DRAG': self.OnEndDrag, 'EVT_TREE_END_LABEL_EDIT': self.OnEndEdit,
195 'EVT_TREE_ITEM_ACTIVATED': self.OnActivate, 'EVT_TREE_ITEM_CHECKED': self.OnItemCheck,
196 'EVT_TREE_ITEM_CHECKING': self.OnItemChecking, 'EVT_TREE_ITEM_COLLAPSED': self.OnItemCollapsed,
197 'EVT_TREE_ITEM_COLLAPSING': self.OnItemCollapsing, 'EVT_TREE_ITEM_EXPANDED': self.OnItemExpanded,
198 'EVT_TREE_ITEM_EXPANDING': self.OnItemExpanding, 'EVT_TREE_ITEM_GETTOOLTIP': self.OnToolTip,
199 'EVT_TREE_ITEM_MENU': self.OnItemMenu, 'EVT_TREE_ITEM_RIGHT_CLICK': self.OnRightDown,
200 'EVT_TREE_KEY_DOWN': self.OnKey, 'EVT_TREE_SEL_CHANGED': self.OnSelChanged,
201 'EVT_TREE_SEL_CHANGING': self.OnSelChanging, "EVT_TREE_ITEM_HYPERLINK": self.OnHyperLink}
203 mainframe = wx.GetTopLevelParent(self)
205 if not hasattr(mainframe, "leftpanel"):
206 #self.Bind(CT.EVT_TREE_ITEM_EXPANDED, self.OnItemExpanded)
207 #self.Bind(CT.EVT_TREE_ITEM_COLLAPSED, self.OnItemCollapsed)
208 self.Bind(CT.EVT_TREE_SEL_CHANGED, self.OnSelChanged)
209 self.Bind(CT.EVT_TREE_SEL_CHANGING, self.OnSelChanging)
210 self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
211 self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp)
213 for combos in mainframe.treeevents:
214 self.BindEvents(combos)
216 if hasattr(mainframe, "leftpanel"):
217 self.ChangeStyle(mainframe.treestyles)
219 if not(self.GetAGWWindowStyleFlag() & CT.TR_HIDE_ROOT):
220 self.SelectItem(self.root)
221 self.Expand(self.root)
224 def BindEvents(self, choice, recreate=False):
226 value = choice.GetValue()
227 text = choice.GetLabel()
230 binder = self.eventdict[text]
233 if evt == "CT.EVT_TREE_BEGIN_RDRAG":
234 self.Bind(wx.EVT_RIGHT_DOWN, None)
235 self.Bind(wx.EVT_RIGHT_UP, None)
236 self.Bind(eval(evt), binder)
238 self.Bind(eval(evt), None)
239 if evt == "CT.EVT_TREE_BEGIN_RDRAG":
240 self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
241 self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp)
244 def ChangeStyle(self, combos):
248 if combo.GetValue() == 1:
249 style = style | eval("CT." + combo.GetLabel())
251 if self.GetAGWWindowStyleFlag() != style:
252 self.SetAGWWindowStyleFlag(style)
255 def OnCompareItems(self, item1, item2):
257 t1 = self.GetItemText(item1)
258 t2 = self.GetItemText(item2)
269 def OnIdle(self, event):
273 # if self.gauge.IsEnabled() and self.gauge.IsShown():
274 # self.count = self.count + 1
276 # if self.count >= 50:
279 # self.gauge.SetValue(self.count)
287 def CloseItem(self, itemParent = None, uuid = None) :
288 if itemParent is None :
289 itemParent = self.root
290 child, cookie = self.GetFirstChild(itemParent)
292 pydata = self.GetPyData(child)
293 if pydata['uuid'] == uuid :
294 self.SetItemBold(child, False)
296 self.CloseItem(child, uuid)
297 child, cookie = self.GetNextChild(itemParent, cookie)
299 def GiveFocus(self, itemParent = None, uuid = None, bold = False) :
300 if itemParent is None :
301 itemParent = self.root
302 child, cookie = self.GetFirstChild(itemParent)
304 pydata = self.GetPyData(child)
305 if pydata['uuid'] == uuid :
306 self.SelectItem(child)
308 self.SetItemBold(child, True)
310 self.GiveFocus(child, uuid, bold)
311 child, cookie = self.GetNextChild(itemParent, cookie)
313 def IsInTree(self, itemParent = None, uuid = None) :
314 if itemParent is None :
315 itemParent = self.root
316 child, cookie = self.GetFirstChild(itemParent)
319 pydata = self.GetPyData(child)
320 if pydata['uuid'] == uuid :
322 self.GiveFocus(child, uuid)
323 child, cookie = self.GetNextChild(itemParent, cookie)
327 def OnRightDown(self, event):
329 pt = event.GetPosition()
330 item, flags = self.HitTest(pt)
334 #self.log.info("OnRightClick: %s, %s, %s" % (self.GetItemText(item), type(item), item.__class__) + "\n")
335 self.SelectItem(item)
338 def OnRightUp(self, event):
346 if not self.IsItemEnabled(item):
350 # Item Text Appearance
351 ishtml = self.IsItemHyperText(item)
352 back = self.GetItemBackgroundColour(item)
353 fore = self.GetItemTextColour(item)
354 isbold = self.IsBold(item)
355 font = self.GetItemFont(item)
358 normal = self.GetItemImage(item, CT.TreeItemIcon_Normal)
359 selected = self.GetItemImage(item, CT.TreeItemIcon_Selected)
360 expanded = self.GetItemImage(item, CT.TreeItemIcon_Expanded)
361 selexp = self.GetItemImage(item, CT.TreeItemIcon_SelectedExpanded)
363 # Enabling/Disabling Windows Associated To An Item
364 haswin = self.GetItemWindow(item)
366 # Enabling/Disabling Items
367 enabled = self.IsItemEnabled(item)
369 # Generic Item's Info
370 children = self.GetChildrenCount(item)
371 itemtype = self.GetItemType(item)
372 text = self.GetItemText(item)
373 pydata = self.GetPyData(item)
377 self.itemdict = {"ishtml": ishtml, "back": back, "fore": fore, "isbold": isbold,
378 "font": font, "normal": normal, "selected": selected, "expanded": expanded,
379 "selexp": selexp, "haswin": haswin, "children": children,
380 "itemtype": itemtype, "text": text, "pydata": pydata, "enabled": enabled}
382 if not item in [self.textroot, self.matroot] :
384 info = menu.Append(wx.ID_ANY, "Informations")
385 menu.AppendSeparator()
387 if 'corpus_name' in pydata :
388 stat = menu.Append(wx.ID_ANY, _(u"Statistics").decode('utf8'))
389 spec = menu.Append(wx.ID_ANY, _(u"Specificities and CA").decode('utf8'))
390 classification = wx.Menu()
391 reinert = classification.Append(wx.ID_ANY, _(u"Reinert method").decode('utf8'))
392 #pam = classification.Append(wx.ID_ANY, u"Par matrice des distances")
393 menu.AppendMenu(-1, _(u"Clustering").decode('utf8'), classification)
394 simi = menu.Append(wx.ID_ANY, _(u"Similarities analysis").decode('utf8'))
395 wdc = menu.Append(wx.ID_ANY, _(u"Wordcloud").decode('utf8'))
396 subcorpus = wx.Menu()
397 subcorpusfrommeta = subcorpus.Append(wx.ID_ANY, _(u'Sub corpora from metadata').decode('utf8'))
398 subcorpusfromtheme = subcorpus.Append(wx.ID_ANY, _(u'Sub corpora from thematic').decode('utf8'))
399 menu.AppendMenu(-1, _(u"SubCorpora").decode('utf8'), subcorpus)
400 menu.AppendSeparator()
401 self.Bind(wx.EVT_MENU, self.OnReinert, reinert)
402 #self.Bind(wx.EVT_MENU, self.OnPam, pam)
403 self.Bind(wx.EVT_MENU, self.OnStat, stat)
404 self.Bind(wx.EVT_MENU, self.OnSpec, spec)
405 self.Bind(wx.EVT_MENU, self.OnSimiTxt, simi)
406 self.Bind(wx.EVT_MENU, self.OnWordCloud, wdc)
407 self.Bind(wx.EVT_MENU, self.OnSubTextFromMeta, subcorpusfrommeta)
408 self.Bind(wx.EVT_MENU, self.OnSubTextFromTheme, subcorpusfromtheme)
409 elif 'matrix_name' in pydata :
410 freq = menu.Append(wx.ID_ANY, _(u"Frequency").decode('utf8'))
411 chi2 = menu.Append(wx.ID_ANY, _(u"Chi square").decode('utf8'))
412 chdreinert = menu.Append(wx.ID_ANY, _(u"Reinert clustering").decode('utf8'))
413 simi = menu.Append(wx.ID_ANY, _(u"Similarity analysis").decode('utf8'))
414 menu.AppendSeparator()
415 self.Bind(wx.EVT_MENU, self.OnFreq, freq)
416 self.Bind(wx.EVT_MENU, self.OnChiSquare, chi2)
417 self.Bind(wx.EVT_MENU, self.OnSimiTab, simi)
418 self.Bind(wx.EVT_MENU, self.OnCHDReinert, chdreinert)
419 elif pydata.get('type', False) == 'alceste' and pydata['uuid'] in self.parent.history.opened :
421 antipro = openmenu.Append(wx.ID_ANY, _(u"antiprofiles").decode('utf8'))
422 menu.AppendMenu(wx.ID_ANY, _(u"Open ...").decode('utf8'), openmenu)
424 profsr = menu.Append(wx.ID_ANY, _(u"Repeated segments profiles").decode('utf8'))
425 profgram = menu.Append(wx.ID_ANY, _(u"POS profiles").decode('utf8'))
426 export_corpus = menu.Append(wx.ID_ANY, _(u"Export corpora").decode('utf8'))
427 colored = menu.Append(wx.ID_ANY, _(u"Colored corpora").decode('utf8'))
428 navig = menu.Append(wx.ID_ANY, _(u"Navigator").decode('utf8'))
429 statclasse = menu.Append(wx.ID_ANY, _(u"Clusters statistics").decode('utf8'))
430 rapport = menu.Append(wx.ID_ANY, _(u"Report").decode('utf8'))
431 export_classes = menu.Append(wx.ID_ANY, _(u"Exports Clusters").decode('utf8'))
432 menu.AppendSeparator()
433 self.Bind(wx.EVT_MENU, self.OpenAntipro, antipro)
434 self.Bind(wx.EVT_MENU, self.OnProfSR, profsr)
435 self.Bind(wx.EVT_MENU, self.OnProfGram, profgram)
436 self.Bind(wx.EVT_MENU, self.OnExportCorpus, export_corpus)
437 self.Bind(wx.EVT_MENU, self.OnColored, colored)
438 self.Bind(wx.EVT_MENU, self.OnNavig, navig)
439 self.Bind(wx.EVT_MENU, self.StatClasse, statclasse)
440 self.Bind(wx.EVT_MENU, self.OnRapport, rapport)
441 self.Bind(wx.EVT_MENU, self.OnExportClasses, export_classes)
442 elif pydata.get('type', False) == 'stat' and pydata['uuid'] in self.parent.history.opened :
443 export_dictionary = menu.Append(wx.ID_ANY, _(u"Export dictionary").decode('utf8'))
444 export_lems = menu.Append(wx.ID_ANY, _(u"Export lemma dictionary").decode('utf8'))
445 self.Bind(wx.EVT_MENU, self.OnExportDictionary, export_dictionary)
446 self.Bind(wx.EVT_MENU, self.OnExportLems, export_lems)
447 menu.AppendSeparator()
448 elif pydata.get('type', False) == 'spec' and pydata['uuid'] in self.parent.history.opened :
449 tgen = menu.Append(wx.ID_ANY, _(u"Tgen Editor").decode('utf8'))
450 computetgen = menu.Append(wx.ID_ANY, _(u"Compute Tgen").decode('utf8'))
451 self.Bind(wx.EVT_MENU, self.OnTgenEditor, tgen)
452 self.Bind(wx.EVT_MENU, self.OnTgenCompute, computetgen)
453 menu.AppendSeparator()
454 elif pydata.get('type', False) == 'reinertmatrix' and pydata['uuid'] in self.parent.history.opened :
456 antipro = openmenu.Append(wx.ID_ANY, _(u"antiprofiles").decode('utf8'))
457 menu.AppendMenu(wx.ID_ANY, _(u"Open ...").decode('utf8'), openmenu)
458 self.Bind(wx.EVT_MENU, self.OpenAntipro, antipro)
461 itemdelete = menu.Append(wx.ID_ANY, _(u"Delete from history").decode('utf8'))
462 #item11 = menu.Append(wx.ID_ANY, "Prepend An Item")
463 #item12 = menu.Append(wx.ID_ANY, "Append An Item")
465 #self.Bind(wx.EVT_MENU, self.OnItemBackground, item1)
466 #self.Bind(wx.EVT_MENU, self.OnItemForeground, item2)
467 #self.Bind(wx.EVT_MENU, self.OnItemBold, item3)
468 #self.Bind(wx.EVT_MENU, self.OnItemFont, item4)
469 #self.Bind(wx.EVT_MENU, self.OnItemHyperText, item5)
470 #self.Bind(wx.EVT_MENU, self.OnEnableWindow, item6)
471 #self.Bind(wx.EVT_MENU, self.OnDisableItem, item7)
472 #self.Bind(wx.EVT_MENU, self.OnItemIcons, item8)
473 self.Bind(wx.EVT_MENU, self.OnItemInfo, info)
474 self.Bind(wx.EVT_MENU, self.OnItemDelete, itemdelete)
475 #self.Bind(wx.EVT_MENU, self.OnItemPrepend, item11)
476 #self.Bind(wx.EVT_MENU, self.OnItemAppend, item12)
482 busy = wx.BusyInfo(_("Please wait...Reading corpus").decode('utf8'), self.parent)
484 if self.pydata['uuid'] in self.parent.history.openedcorpus :
485 corpus = copycorpus(self.parent.history.openedcorpus[self.pydata['uuid']])
486 elif 'corpus_name' in self.pydata :
487 corpus = Corpus(self.parent, parametres = DoConf(self.pydata['ira']).getoptions('corpus'), read = True)
489 cuuid = self.pydata['corpus']
490 if cuuid in self.parent.history.openedcorpus :
491 corpus = copycorpus(self.parent.history.openedcorpus[cuuid])
493 irapath = self.parent.history.corpus[cuuid]['ira']
494 corpus = Corpus(self.parent, parametres = DoConf(irapath).getoptions('corpus'), read = True)
499 if 'matrix_name' in self.pydata :
500 matrix = Tableau(self.parent, parametres = DoConf(self.pydata['ira']).getoptions('matrix'))
502 return copymatrix(matrix)
504 cuuid = self.pydata['matrix']
505 matrix = Tableau(self.parent, parametres = DoConf(self.history.matrixanalyse[cuuid]['ira']).getoptions('matrix'))
507 return copymatrix(matrix)
509 def OnSpec(self, evt) :
510 self.parent.OnTextSpec(evt, self.getcorpus())
512 def OnStat(self, evt) :
513 self.parent.OnTextStat(evt, self.getcorpus())
515 def OnReinert(self, evt) :
516 self.parent.OnTextReinert(evt, self.getcorpus())
518 def OnPam(self, evt) :
519 self.parent.OnPamSimple(evt, self.getcorpus())
521 def OnSimiTxt(self, evt) :
522 self.parent.OnSimiTxt(evt, self.getcorpus())
524 def OnWordCloud(self, evt) :
525 self.parent.OnWordCloud(evt, self.getcorpus())
527 def OnFreq(self, evt):
528 self.parent.OnFreq(evt, self.getmatrix())
530 def OnChiSquare(self, evt):
531 self.parent.OnChi2(evt, self.getmatrix())
533 def OnSimiTab(self, evt):
534 self.parent.OnSimiTab(evt, self.getmatrix())
536 def OnCHDReinert(self, evt):
537 self.parent.OnCHDReinert(evt, self.getmatrix())
539 def OnSubTextFromMeta(self, evt):
540 self.parent.OnSubText(self.getcorpus(), parametres = {'frommeta' : True})
542 def OnSubTextFromTheme(self, evt):
543 self.parent.OnSubText(self.getcorpus(), parametres = {'fromtheme' : True})
545 def OnProfSR(self, evt) :
546 ProfileSegment(self.parent, self.page.dictpathout, self.page.parametres, self.page.corpus)
548 def OnProfGram(self, evt) :
549 ProfilType(self.parent, self.page.corpus, self.page.parametres)
551 def OnExportCorpus(self, evt) :
552 dial = PrefExport(self, self.parent)
553 dial.fbb.SetValue(os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'export_corpus.txt'))
554 dial.CenterOnParent()
555 res = dial.ShowModal()
557 if dial.radio_type.GetSelection() == 0 : alc = True
559 if dial.radio_lem.GetSelection() == 0 : lem = True
561 if self.page.parametres['classif_mode'] != 2 :
565 self.page.corpus.export_corpus_classes(dial.fbb.GetValue(), alc = alc, lem = lem, uci = uci)
568 dlg = wx.MessageDialog(self.parent, msg, u"Export", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
573 def OnColored(self, evt) :
574 dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.html', 'title': _(u"Colored corpora").decode('utf8')})
575 dial.fbb.SetValue(os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'corpus_couleur.html'))
576 dial.CenterOnParent()
577 res = dial.ShowModal()
579 fileout = dial.fbb.GetValue()
581 if self.page.parametres['classif_mode'] != 2 :
585 txt = self.page.corpus.make_colored_corpus(uci = uci)
586 with open(fileout, 'w') as f :
588 msg = ' !\n'.join([_(u"Done").decode('utf8'), _(u"Open in a web browser ?").decode('utf8')])
589 dlg = wx.MessageDialog(self.parent, msg, u"Corpus en couleur", wx.NO | wx.YES | wx.NO_DEFAULT | wx.ICON_QUESTION)
591 if dlg.ShowModal() == wx.ID_YES :
592 webbrowser.open(fileout)
595 def OnNavig(self, evt):
596 if 'FrameSearch' not in dir(self.page) :
597 self.page.FrameSearch = SearchFrame(self.parent, -1, _(u"Search ...").decode('utf8'), self.page.corpus)
598 self.page.FrameSearch.Show()
600 def StatClasse(self, evt):
601 dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.csv', 'title': _(u"Clusters statistics").decode('utf8')})
602 dial.fbb.SetValue( os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'stat_par_classe.csv'))
603 dial.CenterOnParent()
604 res = dial.ShowModal()
606 fileout = dial.fbb.GetValue()
608 self.page.corpus.get_stat_by_cluster(fileout)
610 dlg = wx.MessageDialog(self.parent, msg, _(u"Clusters statistics").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
612 if dlg.ShowModal() == wx.ID_OK :
615 def OpenAntipro(self, evt) :
617 for i in range(0, self.page.TabChdSim.GetPageCount()) :
618 page = self.page.TabChdSim.GetPage(i)
619 if self.page.TabChdSim.GetPageText(i) == _(u"Antiprofiles").decode('utf8') :
620 self.page.TabChdSim.SetSelection(i)
624 open_antiprofil(self.page, self.page.dictpathout['ANTIPRO_OUT'], self.parent.syscoding)
625 self.page.TabChdSim.SetSelection(self.page.TabChdSim.GetPageCount() - 1)
627 def OnRapport(self, evt) :
628 dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.txt', 'title': _(u"Report").decode('utf8')})
629 dial.fbb.SetValue(self.page.dictpathout['rapport'])
630 dial.CenterOnParent()
631 res = dial.ShowModal()
633 fileout = dial.fbb.GetValue()
635 with open(fileout, 'w') as f :
636 f.write(self.page.debtext + '\n' + GetTxtProfile(self.page.DictProfile, self.page.cluster_size))
638 dlg = wx.MessageDialog(self.parent, msg, _(u"Report").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
645 def OnExportDictionary(self, evt) :
646 corpus = self.page.corpus
647 corpus.export_dictionary(self.page.pathout['dictionary.csv'], self.parent.syscoding)
648 log.info('export dictionary %s' % self.page.pathout['dictionary.csv'])
649 dial = wx.MessageDialog(self.parent, self.page.pathout['dictionary.csv'], 'Export', wx.OK)
653 def OnExportLems(self, evt) :
654 corpus = self.page.corpus
655 corpus.export_lems(self.page.pathout['lemmes.csv'], self.parent.syscoding)
656 log.info('export lemmes %s' % self.page.pathout['lemmes.csv'])
657 dial = wx.MessageDialog(self.parent, self.page.pathout['lemmes.csv'], 'Export', wx.OK)
661 def OnTgenEditor(self, evt):
662 corpus = self.page.corpus
663 tgenpath = os.path.join(self.page.parametres['pathout'], 'tgen.csv')
664 tgen = TGen(path = tgenpath, encoding = self.parent.syscoding)
665 if os.path.exists(tgenpath) :
667 if isinstance(evt, list) :
669 while 'tgen%i' %i in tgen.tgen :
671 tgenname = 'tgen%i' %i
672 tgen.tgen[tgenname] = evt
673 tgenframe = TGenFrame(self.parent, corpus, tgen)
675 if isinstance(evt, list) :
676 tgenframe.OnNewTgen(None, tgen = tgenname)
678 def OnTgenCompute(self, evt):
679 corpus = self.page.corpus
680 tgenpath = os.path.join(self.page.parametres['pathout'], 'tgen.csv')
681 self.page.parametres['tgenpath'] = tgenpath
682 tgen = TGen(path = tgenpath, encoding = self.parent.syscoding)
683 self.page.parametres['etoiles'] = self.page.etoiles
684 TgenSpec(self.parent, corpus, self.page.parametres)
685 TgenLayout(self.page)
687 def OnExportClasses(self, event):
688 corpus = self.page.corpus
689 if self.page.parametres['classif_mode'] != 2 :
693 busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self.parent)
695 for i in range(1, self.page.parametres['clnb'] + 1) :
696 corpus.export_classe(self.page.pathout['classe_%i_export.txt' % i], i, uci = uci)
698 dial = wx.MessageDialog(self, self.page.pathout['classe_x_export.txt'], u"Export", wx.OK|wx.ICON_INFORMATION)
702 def OnItemBackground(self, event):
704 colourdata = wx.ColourData()
705 colourdata.SetColour(self.itemdict["back"])
706 dlg = wx.ColourDialog(self, colourdata)
708 dlg.GetColourData().SetChooseFull(True)
710 if dlg.ShowModal() == wx.ID_OK:
711 data = dlg.GetColourData()
712 col1 = data.GetColour().Get()
713 self.SetItemBackgroundColour(self.current, col1)
717 def OnItemForeground(self, event):
719 colourdata = wx.ColourData()
720 colourdata.SetColour(self.itemdict["fore"])
721 dlg = wx.ColourDialog(self, colourdata)
723 dlg.GetColourData().SetChooseFull(True)
725 if dlg.ShowModal() == wx.ID_OK:
726 data = dlg.GetColourData()
727 col1 = data.GetColour().Get()
728 self.SetItemTextColour(self.current, col1)
732 def OnItemBold(self, event):
734 self.SetItemBold(self.current, not self.itemdict["isbold"])
737 def OnItemFont(self, event):
740 font = self.itemdict["font"]
743 font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
745 data.SetInitialFont(font)
747 dlg = wx.FontDialog(self, data)
749 if dlg.ShowModal() == wx.ID_OK:
750 data = dlg.GetFontData()
751 font = data.GetChosenFont()
752 self.SetItemFont(self.current, font)
757 def OnItemHyperText(self, event):
759 self.SetItemHyperText(self.current, not self.itemdict["ishtml"])
762 def OnEnableWindow(self, event):
764 enable = self.GetItemWindowEnabled(self.current)
765 self.SetItemWindowEnabled(self.current, not enable)
768 def OnDisableItem(self, event):
770 self.EnableItem(self.current, False)
773 def OnItemIcons(self, event):
775 bitmaps = [self.itemdict["normal"], self.itemdict["selected"],
776 self.itemdict["expanded"], self.itemdict["selexp"]]
779 dlg = TreeIcons(self, -1, bitmaps=bitmaps)
784 def SetNewIcons(self, bitmaps):
786 self.SetItemImage(self.current, bitmaps[0], CT.TreeItemIcon_Normal)
787 self.SetItemImage(self.current, bitmaps[1], CT.TreeItemIcon_Selected)
788 self.SetItemImage(self.current, bitmaps[2], CT.TreeItemIcon_Expanded)
789 self.SetItemImage(self.current, bitmaps[3], CT.TreeItemIcon_SelectedExpanded)
792 def OnItemInfo(self, event):
794 itemtext = self.itemdict["text"]
795 numchildren = str(self.itemdict["children"])
796 itemtype = self.itemdict["itemtype"]
797 pydata = self.itemdict['pydata']
798 #if 'analyses' in pydata :
799 # toshow = dict([[val, pydata[val]] for val in pydata if val not in['analyses', 'isload']])
801 toshow = pydata['ira']
802 toshow = DoConf(toshow).getoptions()
803 txt = DoConf().totext(toshow)
804 parametres = [val.split('\t\t:') for val in txt.splitlines()]
810 itemtype = "CheckBox"
812 itemtype = "RadioButton"
814 dlg = InfoDialog(self, itemtext, parametres)
821 def OnItemDelete(self, event):
823 strs = "Are You Sure You Want To Delete Item " + self.GetItemText(self.current) + "?"
824 dlg = wx.MessageDialog(None, strs, 'Deleting Item', wx.OK | wx.CANCEL | wx.ICON_QUESTION)
826 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
832 pydata = self.itemdict['pydata']
833 if 'corpus_name' in pydata :
834 self.history.delete(pydata, True)
836 self.history.delete(pydata)
837 self.DeleteChildren(self.current)
838 self.Delete(self.current)
843 def OnItemPrepend(self, event):
845 dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
847 if dlg.ShowModal() == wx.ID_OK:
848 newname = dlg.GetValue()
849 newitem = self.PrependItem(self.current, newname)
850 self.EnsureVisible(newitem)
854 def AddAnalyse(self, parametres, itemParent = None, bold = True) :
855 uuid = parametres.get('corpus', None)
856 if uuid is not None :
857 if itemParent is None :
858 itemParent = self.textroot
859 child, cookie = self.GetFirstChild(itemParent)
862 pydata = self.GetPyData(child)
863 if pydata['uuid'] == uuid :
866 self.GiveFocus(child, uuid)
867 child, cookie = self.GetNextChild(itemParent, cookie)
868 #item = self.AppendItem(child, parametres['name'])
869 if corpus is not None :
870 item = self.AppendItem(corpus, parametres['name'])
872 item = self.AppendItem(self.textroot, parametres['name'])
874 item = self.AppendItem(self.matroot, parametres['name'])
875 self.SetPyData(item, parametres)
876 if parametres['type'] in self.ild :
877 img = self.ild[parametres['type']]
880 self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
881 self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
882 self.SetItemBold(item, bold)
884 def AddMatAnalyse(self, parametres, itemParent = None, bold = True) :
885 uuid = parametres.get('matrix', None)
886 if uuid is not None :
887 if itemParent is None :
888 itemParent = self.matroot
889 child, cookie = self.GetFirstChild(itemParent)
892 pydata = self.GetPyData(child)
893 if pydata['uuid'] == uuid :
896 self.GiveFocus(child, uuid)
897 child, cookie = self.GetNextChild(itemParent, cookie)
898 #item = self.AppendItem(child, parametres['name'])
899 if matrix is not None :
900 item = self.AppendItem(matrix, parametres['name'])
902 item = self.AppendItem(self.matroot, parametres['name'])
903 self.SetPyData(item, parametres)
904 if parametres['type'] in self.ild :
905 img = self.ild[parametres['type']]
908 self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
909 self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
910 self.SetItemBold(item, bold)
912 def OnItemAppend(self, item):
913 if 'corpus_name' in item :
914 child = self.InsertItem(self.textroot, 0, item['corpus_name'])
916 child = self.InsertItem(self.matroot, 0, item['matrix_name'])
917 self.SetPyData(child, item)
918 self.history.addtab(item)
919 if item['type'] in self.ild :
920 img = self.ild[item['type']]
923 self.SetItemImage(child, img, CT.TreeItemIcon_Normal)
924 self.SetItemImage(child, 13, CT.TreeItemIcon_Expanded)
925 self.SetItemBold(child, True)
927 #dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
929 #if dlg.ShowModal() == wx.ID_OK:
930 # newname = dlg.GetValue()
931 # newitem = self.AppendItem(self.current, newname)
932 # self.EnsureVisible(newitem)
938 def OnBeginEdit(self, event):
940 #self.log.info("OnBeginEdit" + "\n")
941 # show how to prevent edit...
942 item = event.GetItem()
943 if item and self.GetItemText(item) == "The Root Item":
945 #self.log.info("You can't edit this one..." + "\n")
947 # Lets just see what's visible of its children
949 root = event.GetItem()
950 (child, cookie) = self.GetFirstChild(root)
953 #self.log.info("Child [%s] visible = %d" % (self.GetItemText(child), self.IsVisible(child)) + "\n")
954 (child, cookie) = self.GetNextChild(root, cookie)
959 def OnEndEdit(self, event):
961 #self.log.info("OnEndEdit: %s %s" %(event.IsEditCancelled(), event.GetLabel()))
962 # show how to reject edit, we'll not allow any digits
963 for x in event.GetLabel():
964 if x in string.digits:
965 #self.log.info(", You can't enter digits..." + "\n")
972 def OnLeftDClick(self, event):
973 pt = event.GetPosition()
974 item, flags = self.HitTest(pt)
975 if item is not None :
976 pydata = self.GetPyData(item)
977 if pydata['uuid'] in self.parent.history.opened :
978 for i in range(self.parent.nb.GetPageCount()) :
979 page = self.parent.nb.GetPage(i)
980 if 'parametres' in dir(page) :
981 if page.parametres['uuid'] == pydata['uuid'] :
982 self.parent.nb.SetSelection(i)
984 elif pydata['uuid'] in ['textroot', 'matroot'] :
987 busy = wx.BusyInfo(_("Please wait..."), self.parent)
989 OpenAnalyse(self.parent, pydata)
991 self.SetItemBold(item, True)
992 self.OnSelChanged(pydata = pydata)
993 #if item and (flags & CT.TREE_HITTEST_ONITEMLABEL):
994 # if self.GetAGWWindowStyleFlag() & CT.TR_EDIT_LABELS:
995 # self.log.info("OnLeftDClick: %s (manually starting label edit)"% self.GetItemText(item) + "\n")
997 #self.EditLabel(item)
999 # pydata = self.GetPyData(item)
1001 # self.log.info("OnLeftDClick: Cannot Start Manual Editing, Missing Style TR_EDIT_LABELS\n")
1006 def OnItemExpanded(self, event):
1008 item = event.GetItem()
1010 self.log.info("OnItemExpanded: %s" % self.GetItemText(item) + "\n")
1013 def OnItemExpanding(self, event):
1015 item = event.GetItem()
1017 self.log.info("OnItemExpanding: %s" % self.GetItemText(item) + "\n")
1022 def OnItemCollapsed(self, event):
1024 item = event.GetItem()
1026 self.log.info("OnItemCollapsed: %s" % self.GetItemText(item) + "\n")
1029 def OnItemCollapsing(self, event):
1031 item = event.GetItem()
1033 self.log.info("OnItemCollapsing: %s" % self.GetItemText(item) + "\n")
1038 def OnSelChanged(self, event = None, pydata = None):
1039 if event is not None :
1040 item = event.GetItem()
1041 pydata = self.GetPyData(item)
1042 if pydata is not None :
1043 self.pydata = pydata
1044 if pydata['uuid'] in self.parent.history.opened :
1045 for i in range(self.parent.nb.GetPageCount()) :
1046 self.page = self.parent.nb.GetPage(i)
1047 if 'parametres' in dir(self.page) :
1048 if self.page.parametres['uuid'] == pydata['uuid'] :
1049 self.parent.nb.SetSelection(i)
1051 if event is not None :
1055 def OnSelChanging(self, event):
1057 item = event.GetItem()
1058 olditem = event.GetOldItem()
1062 olditemtext = "None"
1064 olditemtext = self.GetItemText(olditem)
1065 #self.log.info("OnSelChanging: From %s" % olditemtext + " To %s" % self.GetItemText(item) + "\n")
1070 def OnBeginDrag(self, event):
1072 self.item = event.GetItem()
1074 self.log.info("Beginning Drag..." + "\n")
1079 def OnBeginRDrag(self, event):
1081 self.item = event.GetItem()
1083 self.log.info("Beginning Right Drag..." + "\n")
1088 def OnEndDrag(self, event):
1090 self.item = event.GetItem()
1092 self.log.info("Ending Drag!" + "\n")
1097 def OnDeleteItem(self, event):
1099 item = event.GetItem()
1104 self.log.info("Deleting Item: %s" % self.GetItemText(item) + "\n")
1108 def OnItemCheck(self, event):
1110 item = event.GetItem()
1111 self.log.info("Item " + self.GetItemText(item) + " Has Been Checked!\n")
1115 def OnItemChecking(self, event):
1117 item = event.GetItem()
1118 self.log.info("Item " + self.GetItemText(item) + " Is Being Checked...\n")
1122 def OnToolTip(self, event):
1124 item = event.GetItem()
1126 event.SetToolTip(wx.ToolTip(self.GetItemText(item)))
1129 def OnItemMenu(self, event):
1131 item = event.GetItem()
1133 self.log.info("OnItemMenu: %s" % self.GetItemText(item) + "\n")
1138 def OnKey(self, event):
1140 keycode = event.GetKeyCode()
1141 keyname = keyMap.get(keycode, None)
1143 if keycode == wx.WXK_BACK:
1144 self.log.info("OnKeyDown: HAHAHAHA! I Vetoed Your Backspace! HAHAHAHA\n")
1148 if "unicode" in wx.PlatformInfo:
1149 keycode = event.GetUnicodeKey()
1151 keycode = event.GetKeyCode()
1152 keyname = "\"" + unichr(event.GetUnicodeKey()) + "\""
1154 keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1160 keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1162 keyname = "\"%s\"" % chr(keycode)
1164 keyname = "unknown (%s)" % keycode
1166 self.log.info("OnKeyDown: You Pressed '" + keyname + "'\n")
1171 def OnActivate(self, event):
1174 self.log.info("OnActivate: %s" % self.GetItemText(self.item) + "\n")
1179 def OnHyperLink(self, event):
1181 item = event.GetItem()
1183 self.log.info("OnHyperLink: %s" % self.GetItemText(self.item) + "\n")
1186 def OnTextCtrl(self, event):
1188 char = chr(event.GetKeyCode())
1189 self.log.info("EDITING THE TEXTCTRL: You Wrote '" + char + \
1190 "' (KeyCode = " + str(event.GetKeyCode()) + ")\n")
1194 def OnComboBox(self, event):
1196 selection = event.GetEventObject().GetValue()
1197 self.log.info("CHOICE FROM COMBOBOX: You Chose '" + selection + "'\n")