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 for i in range(self.parent.matrix_menu.GetMenuItemCount()) :
411 item = self.parent.matrix_menu.FindItemByPosition(i)
412 itemid = item.GetId()
413 itemtext = item.GetText()
414 menu.Append(itemid, itemtext)
415 #print item, itemid, itemtext
416 #menu = self.parent.matrix_menu
417 #freq = menu.Append(wx.ID_ANY, _(u"Frequency").decode('utf8'))
418 #chi2 = menu.Append(wx.ID_ANY, _(u"Chi square").decode('utf8'))
419 #chdreinert = menu.Append(wx.ID_ANY, _(u"Reinert clustering").decode('utf8'))
420 #simi = menu.Append(wx.ID_ANY, _(u"Similarity analysis").decode('utf8'))
421 menu.AppendSeparator()
422 #self.Bind(wx.EVT_MENU, self.OnFreq, freq)
423 #self.Bind(wx.EVT_MENU, self.OnChiSquare, chi2)
424 #self.Bind(wx.EVT_MENU, self.OnSimiTab, simi)
425 #self.Bind(wx.EVT_MENU, self.OnCHDReinert, chdreinert)
426 elif pydata.get('type', False) == 'alceste' and pydata['uuid'] in self.parent.history.opened :
428 antipro = openmenu.Append(wx.ID_ANY, _(u"Antiprofiles").decode('utf8'))
429 menu.AppendMenu(wx.ID_ANY, _(u"Open ...").decode('utf8'), openmenu)
431 profsr = menu.Append(wx.ID_ANY, _(u"Repeated segments profiles").decode('utf8'))
432 profgram = menu.Append(wx.ID_ANY, _(u"POS profiles").decode('utf8'))
433 export_corpus = menu.Append(wx.ID_ANY, _(u"Export corpora").decode('utf8'))
434 colored = menu.Append(wx.ID_ANY, _(u"Colored corpora").decode('utf8'))
435 navig = menu.Append(wx.ID_ANY, _(u"Navigator").decode('utf8'))
436 statclasse = menu.Append(wx.ID_ANY, _(u"Clusters statistics").decode('utf8'))
437 rapport = menu.Append(wx.ID_ANY, _(u"Report").decode('utf8'))
438 export_classes = menu.Append(wx.ID_ANY, _(u"Export Clusters").decode('utf8'))
439 menu.AppendSeparator()
440 self.Bind(wx.EVT_MENU, self.OpenAntipro, antipro)
441 self.Bind(wx.EVT_MENU, self.OnProfSR, profsr)
442 self.Bind(wx.EVT_MENU, self.OnProfGram, profgram)
443 self.Bind(wx.EVT_MENU, self.OnExportCorpus, export_corpus)
444 self.Bind(wx.EVT_MENU, self.OnColored, colored)
445 self.Bind(wx.EVT_MENU, self.OnNavig, navig)
446 self.Bind(wx.EVT_MENU, self.StatClasse, statclasse)
447 self.Bind(wx.EVT_MENU, self.OnRapport, rapport)
448 self.Bind(wx.EVT_MENU, self.OnExportClasses, export_classes)
449 elif pydata.get('type', False) == 'stat' and pydata['uuid'] in self.parent.history.opened :
450 export_dictionary = menu.Append(wx.ID_ANY, _(u"Export dictionary").decode('utf8'))
451 export_lems = menu.Append(wx.ID_ANY, _(u"Export lemma dictionary").decode('utf8'))
452 self.Bind(wx.EVT_MENU, self.OnExportDictionary, export_dictionary)
453 self.Bind(wx.EVT_MENU, self.OnExportLems, export_lems)
454 menu.AppendSeparator()
455 elif pydata.get('type', False) == 'spec' and pydata['uuid'] in self.parent.history.opened :
456 tgen = menu.Append(wx.ID_ANY, _(u"Tgen Editor").decode('utf8'))
457 computetgen = menu.Append(wx.ID_ANY, _(u"Compute Tgen").decode('utf8'))
458 self.Bind(wx.EVT_MENU, self.OnTgenEditor, tgen)
459 self.Bind(wx.EVT_MENU, self.OnTgenCompute, computetgen)
460 menu.AppendSeparator()
461 elif pydata.get('type', False) == 'reinertmatrix' and pydata['uuid'] in self.parent.history.opened :
463 antipro = openmenu.Append(wx.ID_ANY, _(u"antiprofiles").decode('utf8'))
464 menu.AppendMenu(wx.ID_ANY, _(u"Open ...").decode('utf8'), openmenu)
465 self.Bind(wx.EVT_MENU, self.OpenAntipro, antipro)
468 itemdelete = menu.Append(wx.ID_ANY, _(u"Delete from history").decode('utf8'))
469 #item11 = menu.Append(wx.ID_ANY, "Prepend An Item")
470 #item12 = menu.Append(wx.ID_ANY, "Append An Item")
472 #self.Bind(wx.EVT_MENU, self.OnItemBackground, item1)
473 #self.Bind(wx.EVT_MENU, self.OnItemForeground, item2)
474 #self.Bind(wx.EVT_MENU, self.OnItemBold, item3)
475 #self.Bind(wx.EVT_MENU, self.OnItemFont, item4)
476 #self.Bind(wx.EVT_MENU, self.OnItemHyperText, item5)
477 #self.Bind(wx.EVT_MENU, self.OnEnableWindow, item6)
478 #self.Bind(wx.EVT_MENU, self.OnDisableItem, item7)
479 #self.Bind(wx.EVT_MENU, self.OnItemIcons, item8)
480 self.Bind(wx.EVT_MENU, self.OnItemInfo, info)
481 self.Bind(wx.EVT_MENU, self.OnItemDelete, itemdelete)
482 #self.Bind(wx.EVT_MENU, self.OnItemPrepend, item11)
483 #self.Bind(wx.EVT_MENU, self.OnItemAppend, item12)
489 busy = wx.BusyInfo(_("Please wait...Reading corpus").decode('utf8'), self.parent)
491 if self.pydata['uuid'] in self.parent.history.openedcorpus :
492 corpus = copycorpus(self.parent.history.openedcorpus[self.pydata['uuid']])
493 elif 'corpus_name' in self.pydata :
494 corpus = Corpus(self.parent, parametres = DoConf(self.pydata['ira']).getoptions('corpus'), read = True)
496 cuuid = self.pydata['corpus']
497 if cuuid in self.parent.history.openedcorpus :
498 corpus = copycorpus(self.parent.history.openedcorpus[cuuid])
500 irapath = self.parent.history.corpus[cuuid]['ira']
501 corpus = Corpus(self.parent, parametres = DoConf(irapath).getoptions('corpus'), read = True)
506 if 'matrix_name' in self.pydata :
507 matrix = Tableau(self.parent, parametres = DoConf(self.pydata['ira']).getoptions('matrix'))
509 return copymatrix(matrix)
511 cuuid = self.pydata['matrix']
512 matrix = Tableau(self.parent, parametres = DoConf(self.history.matrixanalyse[cuuid]['ira']).getoptions('matrix'))
514 return copymatrix(matrix)
516 def OnSpec(self, evt) :
517 self.parent.OnTextSpec(evt, self.getcorpus())
519 def OnStat(self, evt) :
520 self.parent.OnTextStat(evt, self.getcorpus())
522 def OnReinert(self, evt) :
523 self.parent.OnTextReinert(evt, self.getcorpus())
525 def OnPam(self, evt) :
526 self.parent.OnPamSimple(evt, self.getcorpus())
528 def OnSimiTxt(self, evt) :
529 self.parent.OnSimiTxt(evt, self.getcorpus())
531 def OnWordCloud(self, evt) :
532 self.parent.OnWordCloud(evt, self.getcorpus())
534 def OnFreq(self, evt):
535 self.parent.OnFreq(evt, self.getmatrix())
537 def OnChiSquare(self, evt):
538 self.parent.OnChi2(evt, self.getmatrix())
540 def OnSimiTab(self, evt):
541 self.parent.OnSimiTab(evt, self.getmatrix())
543 def OnCHDReinert(self, evt):
544 self.parent.OnCHDReinert(evt, self.getmatrix())
546 def OnSubTextFromMeta(self, evt):
547 self.parent.OnSubText(self.getcorpus(), parametres = {'frommeta' : True})
549 def OnSubTextFromTheme(self, evt):
550 self.parent.OnSubText(self.getcorpus(), parametres = {'fromtheme' : True})
552 def OnProfSR(self, evt) :
553 ProfileSegment(self.parent, self.page.dictpathout, self.page.parametres, self.page.corpus)
555 def OnProfGram(self, evt) :
556 ProfilType(self.parent, self.page.corpus, self.page.parametres)
558 def OnExportCorpus(self, evt) :
559 dial = PrefExport(self, self.parent)
560 dial.fbb.SetValue(os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'export_corpus.txt'))
561 dial.CenterOnParent()
562 res = dial.ShowModal()
564 if dial.radio_type.GetSelection() == 0 : alc = True
566 if dial.radio_lem.GetSelection() == 0 : lem = True
568 if self.page.parametres['classif_mode'] != 2 :
572 self.page.corpus.export_corpus_classes(dial.fbb.GetValue(), alc = alc, lem = lem, uci = uci)
575 dlg = wx.MessageDialog(self.parent, msg, u"Export", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
580 def OnColored(self, evt) :
581 dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.html', 'title': _(u"Colored corpora").decode('utf8')})
582 dial.fbb.SetValue(os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'corpus_couleur.html'))
583 dial.CenterOnParent()
584 res = dial.ShowModal()
586 fileout = dial.fbb.GetValue()
588 if self.page.parametres['classif_mode'] != 2 :
592 txt = self.page.corpus.make_colored_corpus(uci = uci)
593 with open(fileout, 'w') as f :
595 msg = ' !\n'.join([_(u"Done").decode('utf8'), _(u"Open in a web browser ?").decode('utf8')])
596 dlg = wx.MessageDialog(self.parent, msg, u"Corpus en couleur", wx.NO | wx.YES | wx.NO_DEFAULT | wx.ICON_QUESTION)
598 if dlg.ShowModal() == wx.ID_YES :
599 webbrowser.open(fileout)
602 def OnNavig(self, evt):
603 if 'FrameSearch' not in dir(self.page) :
604 self.page.FrameSearch = SearchFrame(self.parent, -1, _(u"Search ...").decode('utf8'), self.page.corpus)
605 self.page.FrameSearch.Show()
607 def StatClasse(self, evt):
608 dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.csv', 'title': _(u"Clusters statistics").decode('utf8')})
609 dial.fbb.SetValue( os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'stat_par_classe.csv'))
610 dial.CenterOnParent()
611 res = dial.ShowModal()
613 fileout = dial.fbb.GetValue()
615 self.page.corpus.get_stat_by_cluster(fileout)
617 dlg = wx.MessageDialog(self.parent, msg, _(u"Clusters statistics").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
619 if dlg.ShowModal() == wx.ID_OK :
622 def OpenAntipro(self, evt) :
624 for i in range(0, self.page.TabChdSim.GetPageCount()) :
625 page = self.page.TabChdSim.GetPage(i)
626 if self.page.TabChdSim.GetPageText(i) == _(u"Antiprofiles").decode('utf8') :
627 self.page.TabChdSim.SetSelection(i)
631 open_antiprofil(self.page, self.page.dictpathout['ANTIPRO_OUT'], self.parent.syscoding)
632 self.page.TabChdSim.SetSelection(self.page.TabChdSim.GetPageCount() - 1)
634 def OnRapport(self, evt) :
635 dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.txt', 'title': _(u"Report").decode('utf8')})
636 dial.fbb.SetValue(self.page.dictpathout['rapport'])
637 dial.CenterOnParent()
638 res = dial.ShowModal()
640 fileout = dial.fbb.GetValue()
642 with open(fileout, 'w') as f :
643 f.write(self.page.debtext + '\n' + GetTxtProfile(self.page.DictProfile, self.page.cluster_size))
645 dlg = wx.MessageDialog(self.parent, msg, _(u"Report").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
652 def OnExportDictionary(self, evt) :
653 corpus = self.page.corpus
654 corpus.export_dictionary(self.page.pathout['dictionary.csv'], self.parent.syscoding)
655 log.info('export dictionary %s' % self.page.pathout['dictionary.csv'])
656 dial = wx.MessageDialog(self.parent, self.page.pathout['dictionary.csv'], 'Export', wx.OK)
660 def OnExportLems(self, evt) :
661 corpus = self.page.corpus
662 corpus.export_lems(self.page.pathout['lemmes.csv'], self.parent.syscoding)
663 log.info('export lemmes %s' % self.page.pathout['lemmes.csv'])
664 dial = wx.MessageDialog(self.parent, self.page.pathout['lemmes.csv'], 'Export', wx.OK)
668 def OnTgenEditor(self, evt):
669 corpus = self.page.corpus
670 tgenpath = os.path.join(self.page.parametres['pathout'], 'tgen.csv')
671 tgen = TGen(path = tgenpath, encoding = self.parent.syscoding)
672 if os.path.exists(tgenpath) :
674 if isinstance(evt, list) :
676 while 'tgen%i' %i in tgen.tgen :
678 tgenname = 'tgen%i' %i
679 tgen.tgen[tgenname] = evt
680 tgenframe = TGenFrame(self.parent, corpus, tgen)
682 if isinstance(evt, list) :
683 tgenframe.OnNewTgen(None, tgen = tgenname)
685 def OnTgenCompute(self, evt):
686 corpus = self.page.corpus
687 tgenpath = os.path.join(self.page.parametres['pathout'], 'tgen.csv')
688 self.page.parametres['tgenpath'] = tgenpath
689 tgen = TGen(path = tgenpath, encoding = self.parent.syscoding)
690 self.page.parametres['etoiles'] = self.page.etoiles
691 TgenSpec(self.parent, corpus, self.page.parametres)
692 TgenLayout(self.page)
694 def OnExportClasses(self, event):
695 corpus = self.page.corpus
696 if self.page.parametres['classif_mode'] != 2 :
700 busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self.parent)
702 for i in range(1, self.page.parametres['clnb'] + 1) :
703 corpus.export_classe(self.page.pathout['classe_%i_export.txt' % i], i, uci = uci)
705 dial = wx.MessageDialog(self, self.page.pathout['classe_x_export.txt'], u"Export", wx.OK|wx.ICON_INFORMATION)
709 def OnItemBackground(self, event):
711 colourdata = wx.ColourData()
712 colourdata.SetColour(self.itemdict["back"])
713 dlg = wx.ColourDialog(self, colourdata)
715 dlg.GetColourData().SetChooseFull(True)
717 if dlg.ShowModal() == wx.ID_OK:
718 data = dlg.GetColourData()
719 col1 = data.GetColour().Get()
720 self.SetItemBackgroundColour(self.current, col1)
724 def OnItemForeground(self, event):
726 colourdata = wx.ColourData()
727 colourdata.SetColour(self.itemdict["fore"])
728 dlg = wx.ColourDialog(self, colourdata)
730 dlg.GetColourData().SetChooseFull(True)
732 if dlg.ShowModal() == wx.ID_OK:
733 data = dlg.GetColourData()
734 col1 = data.GetColour().Get()
735 self.SetItemTextColour(self.current, col1)
739 def OnItemBold(self, event):
741 self.SetItemBold(self.current, not self.itemdict["isbold"])
744 def OnItemFont(self, event):
747 font = self.itemdict["font"]
750 font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
752 data.SetInitialFont(font)
754 dlg = wx.FontDialog(self, data)
756 if dlg.ShowModal() == wx.ID_OK:
757 data = dlg.GetFontData()
758 font = data.GetChosenFont()
759 self.SetItemFont(self.current, font)
764 def OnItemHyperText(self, event):
766 self.SetItemHyperText(self.current, not self.itemdict["ishtml"])
769 def OnEnableWindow(self, event):
771 enable = self.GetItemWindowEnabled(self.current)
772 self.SetItemWindowEnabled(self.current, not enable)
775 def OnDisableItem(self, event):
777 self.EnableItem(self.current, False)
780 def OnItemIcons(self, event):
782 bitmaps = [self.itemdict["normal"], self.itemdict["selected"],
783 self.itemdict["expanded"], self.itemdict["selexp"]]
786 dlg = TreeIcons(self, -1, bitmaps=bitmaps)
791 def SetNewIcons(self, bitmaps):
793 self.SetItemImage(self.current, bitmaps[0], CT.TreeItemIcon_Normal)
794 self.SetItemImage(self.current, bitmaps[1], CT.TreeItemIcon_Selected)
795 self.SetItemImage(self.current, bitmaps[2], CT.TreeItemIcon_Expanded)
796 self.SetItemImage(self.current, bitmaps[3], CT.TreeItemIcon_SelectedExpanded)
799 def OnItemInfo(self, event):
801 itemtext = self.itemdict["text"]
802 numchildren = str(self.itemdict["children"])
803 itemtype = self.itemdict["itemtype"]
804 pydata = self.itemdict['pydata']
805 #if 'analyses' in pydata :
806 # toshow = dict([[val, pydata[val]] for val in pydata if val not in['analyses', 'isload']])
808 toshow = pydata['ira']
809 toshow = DoConf(toshow).getoptions()
810 txt = DoConf().totext(toshow)
811 parametres = [val.split('\t\t:') for val in txt.splitlines()]
817 itemtype = "CheckBox"
819 itemtype = "RadioButton"
821 dlg = InfoDialog(self, itemtext, parametres)
828 def OnItemDelete(self, event):
830 strs = "Are You Sure You Want To Delete Item " + self.GetItemText(self.current) + "?"
831 dlg = wx.MessageDialog(None, strs, 'Deleting Item', wx.OK | wx.CANCEL | wx.ICON_QUESTION)
833 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
839 pydata = self.itemdict['pydata']
840 if 'corpus_name' in pydata :
841 self.history.delete(pydata, True)
843 self.history.delete(pydata)
844 self.DeleteChildren(self.current)
845 self.Delete(self.current)
850 def OnItemPrepend(self, event):
852 dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
854 if dlg.ShowModal() == wx.ID_OK:
855 newname = dlg.GetValue()
856 newitem = self.PrependItem(self.current, newname)
857 self.EnsureVisible(newitem)
861 def AddAnalyse(self, parametres, itemParent = None, bold = True) :
862 uuid = parametres.get('corpus', None)
863 if uuid is not None :
864 if itemParent is None :
865 itemParent = self.textroot
866 child, cookie = self.GetFirstChild(itemParent)
869 pydata = self.GetPyData(child)
870 if pydata['uuid'] == uuid :
873 self.GiveFocus(child, uuid)
874 child, cookie = self.GetNextChild(itemParent, cookie)
875 #item = self.AppendItem(child, parametres['name'])
876 if corpus is not None :
877 item = self.AppendItem(corpus, parametres['name'])
879 item = self.AppendItem(self.textroot, parametres['name'])
881 item = self.AppendItem(self.matroot, parametres['name'])
882 self.SetPyData(item, parametres)
883 if parametres['type'] in self.ild :
884 img = self.ild[parametres['type']]
887 self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
888 self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
889 self.SetItemBold(item, bold)
891 def AddMatAnalyse(self, parametres, itemParent = None, bold = True) :
892 uuid = parametres.get('matrix', None)
893 if uuid is not None :
894 if itemParent is None :
895 itemParent = self.matroot
896 child, cookie = self.GetFirstChild(itemParent)
899 pydata = self.GetPyData(child)
900 if pydata['uuid'] == uuid :
903 self.GiveFocus(child, uuid)
904 child, cookie = self.GetNextChild(itemParent, cookie)
905 #item = self.AppendItem(child, parametres['name'])
906 if matrix is not None :
907 item = self.AppendItem(matrix, parametres['name'])
909 item = self.AppendItem(self.matroot, parametres['name'])
910 self.SetPyData(item, parametres)
911 if parametres['type'] in self.ild :
912 img = self.ild[parametres['type']]
915 self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
916 self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
917 self.SetItemBold(item, bold)
919 def OnItemAppend(self, item):
920 if 'corpus_name' in item :
921 child = self.InsertItem(self.textroot, 0, item['corpus_name'])
923 child = self.InsertItem(self.matroot, 0, item['matrix_name'])
924 self.SetPyData(child, item)
925 self.history.addtab(item)
926 if item['type'] in self.ild :
927 img = self.ild[item['type']]
930 self.SetItemImage(child, img, CT.TreeItemIcon_Normal)
931 self.SetItemImage(child, 13, CT.TreeItemIcon_Expanded)
932 self.SetItemBold(child, True)
934 #dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
936 #if dlg.ShowModal() == wx.ID_OK:
937 # newname = dlg.GetValue()
938 # newitem = self.AppendItem(self.current, newname)
939 # self.EnsureVisible(newitem)
945 def OnBeginEdit(self, event):
947 #self.log.info("OnBeginEdit" + "\n")
948 # show how to prevent edit...
949 item = event.GetItem()
950 if item and self.GetItemText(item) == "The Root Item":
952 #self.log.info("You can't edit this one..." + "\n")
954 # Lets just see what's visible of its children
956 root = event.GetItem()
957 (child, cookie) = self.GetFirstChild(root)
960 #self.log.info("Child [%s] visible = %d" % (self.GetItemText(child), self.IsVisible(child)) + "\n")
961 (child, cookie) = self.GetNextChild(root, cookie)
966 def OnEndEdit(self, event):
968 #self.log.info("OnEndEdit: %s %s" %(event.IsEditCancelled(), event.GetLabel()))
969 # show how to reject edit, we'll not allow any digits
970 for x in event.GetLabel():
971 if x in string.digits:
972 #self.log.info(", You can't enter digits..." + "\n")
979 def OnLeftDClick(self, event):
980 pt = event.GetPosition()
981 item, flags = self.HitTest(pt)
982 if item is not None :
983 pydata = self.GetPyData(item)
984 if pydata['uuid'] in self.parent.history.opened :
985 for i in range(self.parent.nb.GetPageCount()) :
986 page = self.parent.nb.GetPage(i)
987 if 'parametres' in dir(page) :
988 if page.parametres['uuid'] == pydata['uuid'] :
989 self.parent.nb.SetSelection(i)
991 elif pydata['uuid'] in ['textroot', 'matroot'] :
994 busy = wx.BusyInfo(_("Please wait..."), self.parent)
996 OpenAnalyse(self.parent, pydata)
998 self.SetItemBold(item, True)
999 self.OnSelChanged(pydata = pydata)
1000 #if item and (flags & CT.TREE_HITTEST_ONITEMLABEL):
1001 # if self.GetAGWWindowStyleFlag() & CT.TR_EDIT_LABELS:
1002 # self.log.info("OnLeftDClick: %s (manually starting label edit)"% self.GetItemText(item) + "\n")
1004 #self.EditLabel(item)
1006 # pydata = self.GetPyData(item)
1008 # self.log.info("OnLeftDClick: Cannot Start Manual Editing, Missing Style TR_EDIT_LABELS\n")
1013 def OnItemExpanded(self, event):
1015 item = event.GetItem()
1017 self.log.info("OnItemExpanded: %s" % self.GetItemText(item) + "\n")
1020 def OnItemExpanding(self, event):
1022 item = event.GetItem()
1024 self.log.info("OnItemExpanding: %s" % self.GetItemText(item) + "\n")
1029 def OnItemCollapsed(self, event):
1031 item = event.GetItem()
1033 self.log.info("OnItemCollapsed: %s" % self.GetItemText(item) + "\n")
1036 def OnItemCollapsing(self, event):
1038 item = event.GetItem()
1040 self.log.info("OnItemCollapsing: %s" % self.GetItemText(item) + "\n")
1045 def OnSelChanged(self, event = None, pydata = None):
1046 if event is not None :
1047 item = event.GetItem()
1048 pydata = self.GetPyData(item)
1049 if pydata is not None :
1050 self.pydata = pydata
1051 if pydata['uuid'] in self.parent.history.opened :
1052 for i in range(self.parent.nb.GetPageCount()) :
1053 self.page = self.parent.nb.GetPage(i)
1054 if 'parametres' in dir(self.page) :
1055 if self.page.parametres['uuid'] == pydata['uuid'] :
1056 self.parent.nb.SetSelection(i)
1058 if event is not None :
1062 def OnSelChanging(self, event):
1064 item = event.GetItem()
1065 olditem = event.GetOldItem()
1069 olditemtext = "None"
1071 olditemtext = self.GetItemText(olditem)
1072 #self.log.info("OnSelChanging: From %s" % olditemtext + " To %s" % self.GetItemText(item) + "\n")
1077 def OnBeginDrag(self, event):
1079 self.item = event.GetItem()
1081 self.log.info("Beginning Drag..." + "\n")
1086 def OnBeginRDrag(self, event):
1088 self.item = event.GetItem()
1090 self.log.info("Beginning Right Drag..." + "\n")
1095 def OnEndDrag(self, event):
1097 self.item = event.GetItem()
1099 self.log.info("Ending Drag!" + "\n")
1104 def OnDeleteItem(self, event):
1106 item = event.GetItem()
1111 self.log.info("Deleting Item: %s" % self.GetItemText(item) + "\n")
1115 def OnItemCheck(self, event):
1117 item = event.GetItem()
1118 self.log.info("Item " + self.GetItemText(item) + " Has Been Checked!\n")
1122 def OnItemChecking(self, event):
1124 item = event.GetItem()
1125 self.log.info("Item " + self.GetItemText(item) + " Is Being Checked...\n")
1129 def OnToolTip(self, event):
1131 item = event.GetItem()
1133 event.SetToolTip(wx.ToolTip(self.GetItemText(item)))
1136 def OnItemMenu(self, event):
1138 item = event.GetItem()
1140 self.log.info("OnItemMenu: %s" % self.GetItemText(item) + "\n")
1145 def OnKey(self, event):
1147 keycode = event.GetKeyCode()
1148 keyname = keyMap.get(keycode, None)
1150 if keycode == wx.WXK_BACK:
1151 self.log.info("OnKeyDown: HAHAHAHA! I Vetoed Your Backspace! HAHAHAHA\n")
1155 if "unicode" in wx.PlatformInfo:
1156 keycode = event.GetUnicodeKey()
1158 keycode = event.GetKeyCode()
1159 keyname = "\"" + unichr(event.GetUnicodeKey()) + "\""
1161 keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1167 keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1169 keyname = "\"%s\"" % chr(keycode)
1171 keyname = "unknown (%s)" % keycode
1173 self.log.info("OnKeyDown: You Pressed '" + keyname + "'\n")
1178 def OnActivate(self, event):
1181 self.log.info("OnActivate: %s" % self.GetItemText(self.item) + "\n")
1186 def OnHyperLink(self, event):
1188 item = event.GetItem()
1190 self.log.info("OnHyperLink: %s" % self.GetItemText(self.item) + "\n")
1193 def OnTextCtrl(self, event):
1195 char = chr(event.GetKeyCode())
1196 self.log.info("EDITING THE TEXTCTRL: You Wrote '" + char + \
1197 "' (KeyCode = " + str(event.GetKeyCode()) + ")\n")
1201 def OnComboBox(self, event):
1203 selection = event.GetEventObject().GetValue()
1204 self.log.info("CHOICE FROM COMBOBOX: You Chose '" + selection + "'\n")