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, BugReport
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
21 from textreinert import TgenProf
23 log = logging.getLogger('iramuteq.tree')
25 def buildmenu(menu, parent_menu):
26 for i in range(parent_menu.GetMenuItemCount()) :
27 item = parent_menu.FindItemByPosition(i)
29 itemtext = item.GetText()
30 itemicon = item.GetBitmap()
31 nitem = wx.MenuItem(menu, itemid, itemtext)
32 nitem.SetBitmap(itemicon)
35 for val in item.GetSubMenu().GetMenuItems() :
37 itemtext = val.GetText()
38 itemicon = val.GetBitmap()
39 nitem = wx.MenuItem(menu, itemid, itemtext)
40 nitem.SetBitmap(itemicon)
41 nmenu.AppendItem(nitem)
42 menu.AppendMenu(-1, item.GetText(), nmenu)
44 menu.AppendItem(nitem)
46 class InfoDialog ( wx.Dialog ):
48 def __init__( self, parent, txt, parametres ):
49 wx.Dialog.__init__ ( self, parent, id = wx.ID_ANY, title = u"Informations", pos = wx.DefaultPosition, size = wx.DefaultSize, style = wx.DEFAULT_DIALOG_STYLE )
50 if len(parametres) > 30 :
54 self.SetSizeHintsSz( wx.Size( 500,200 ), wx.DefaultSize )
56 bSizer1 = wx.BoxSizer( wx.VERTICAL )
58 self.m_panel2 = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
59 bSizer2 = wx.BoxSizer( wx.VERTICAL )
61 self.m_staticText4 = wx.StaticText( self.m_panel2, wx.ID_ANY, txt, wx.DefaultPosition, wx.DefaultSize, 0 )
62 self.m_staticText4.Wrap( -1 )
63 bSizer2.Add( self.m_staticText4, 0, wx.ALL, 5 )
66 self.m_panel2.SetSizer( bSizer2 )
67 self.m_panel2.Layout()
68 bSizer2.Fit( self.m_panel2 )
69 bSizer1.Add( self.m_panel2, 0, wx.EXPAND |wx.ALL, 5 )
71 self.m_panel1 = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
73 fgSizer1 = wx.FlexGridSizer( 0, nb, 0, 0 )
74 fgSizer1.SetFlexibleDirection( wx.BOTH )
75 fgSizer1.SetNonFlexibleGrowMode( wx.FLEX_GROWMODE_SPECIFIED )
78 for val in parametres :
79 fgSizer1.Add( wx.StaticText( self.m_panel1, wx.ID_ANY, val[0], wx.DefaultPosition, wx.DefaultSize, 0 ), 0, wx.ALL, 0)
80 #fgSizer1.Add( wx.StaticText( self.m_panel1, wx.ID_ANY, val[1], wx.DefaultPosition, wx.DefaultSize, 0 ), 0, wx.ALL, 0)
81 txtctrl.append( wx.TextCtrl( self.m_panel1, wx.ID_ANY, val[1], wx.DefaultPosition, (450, 20), wx.TE_READONLY ) )
82 txtctrl[-1].SetBackgroundColour('#DDE8EB')
83 #wx.SystemSettings.GetColour(wx.SYS_COLOUR_GRAYTEXT))
84 fgSizer1.Add( txtctrl[-1], 0, wx.ALL|wx.EXPAND, 0)
85 #fgSizer1.Add( wx.StaticLine( self.m_panel1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL ), 0, wx.EXPAND |wx.ALL, 0)
86 #fgSizer1.Add( wx.StaticLine( self.m_panel1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL ), 0, wx.EXPAND|wx.ALL, 0)
88 self.m_panel1.SetSizer( fgSizer1 )
89 self.m_panel1.Layout()
90 fgSizer1.Fit( self.m_panel1 )
91 bSizer1.Add( self.m_panel1, 0, wx.EXPAND|wx.ALL, 3 )
93 m_sdbSizer1 = wx.StdDialogButtonSizer()
94 self.m_sdbSizer1OK = wx.Button( self, wx.ID_OK )
95 m_sdbSizer1.AddButton( self.m_sdbSizer1OK )
96 m_sdbSizer1.Realize();
98 bSizer1.Add( m_sdbSizer1, 0, wx.EXPAND, 5 )
101 self.SetSizer( bSizer1 )
105 self.Centre( wx.BOTH )
111 class LeftTree(CT.CustomTreeCtrl):
113 def __init__(self, parent, id=wx.ID_ANY, pos=wx.DefaultPosition,
115 style=wx.SUNKEN_BORDER|wx.WANTS_CHARS,
116 agwStyle=CT.TR_HIDE_ROOT|CT.TR_HAS_BUTTONS|CT.TR_HAS_VARIABLE_ROW_HEIGHT):
118 CT.CustomTreeCtrl.__init__(self, parent, id, pos, size, style, agwStyle)
124 if data.startswith("TR_"):
125 treestyles.append(data)
126 elif data.startswith("EVT_"):
131 self.styles = treestyles
135 self.il = wx.ImageList(16, 16)
137 for img in self.ira.images_analyses :
138 self.ild[img] = self.il.Add(self.ira.images_analyses[img])
139 self.SetImageList(self.il)
144 self.history = parent.history
145 self.h = self.history.history
146 self.root = self.AddRoot("Iramuteq")
148 if not(self.GetAGWWindowStyleFlag() & CT.TR_HIDE_ROOT):
149 self.SetPyData(self.root, None)
150 self.SetItemImage(self.root, 24, CT.TreeItemIcon_Normal)
151 self.SetItemImage(self.root, 13, CT.TreeItemIcon_Expanded)
153 self.textroot = self.AppendItem(self.root, _(u'Textual corpus'))
154 self.SetPyData(self.textroot, {'uuid': 'textroot'})
155 self.SetItemImage(self.textroot, self.ild['textroot'], CT.TreeItemIcon_Normal)
156 self.SetItemImage(self.textroot, self.ild['textroot'], CT.TreeItemIcon_Expanded)
158 for corpus in reversed(self.h) :
159 child = self.AppendItem(self.textroot, corpus['corpus_name'])
160 self.SetPyData(child, corpus)
161 self.SetItemImage(child, self.ild['corpus'], CT.TreeItemIcon_Normal)
162 self.SetItemImage(child, self.ild['corpus'], CT.TreeItemIcon_Expanded)
164 if 'analyses' in corpus :
165 for y in corpus['analyses'] :
166 last = self.AppendItem(child, y['name'], ct_type=0)
167 self.SetPyData(last, y)
168 if y['type'] in self.ild :
169 img = self.ild[y['type']]
172 self.SetItemImage(last, img, CT.TreeItemIcon_Normal)
173 self.SetItemImage(last, img, CT.TreeItemIcon_Expanded)
175 self.matroot = self.AppendItem(self.root, _(u'Matrix'))
176 self.SetPyData(self.matroot, {'uuid': 'matroot'})
177 self.SetItemImage(self.matroot, self.ild['matroot'], CT.TreeItemIcon_Normal)
178 self.SetItemImage(self.matroot, self.ild['matroot'], CT.TreeItemIcon_Expanded)
181 for matrix in reversed(self.history.matrix) :
182 if 'matrix_name' in matrix :
183 child = self.AppendItem(self.matroot, matrix['matrix_name'])
184 self.SetPyData(child, matrix)
185 self.SetItemImage(child, self.ild['matrix'], CT.TreeItemIcon_Normal)
186 self.SetItemImage(child, self.ild['matrix'], CT.TreeItemIcon_Expanded)
187 if 'analyses' in matrix :
188 for y in matrix['analyses'] :
189 last = self.AppendItem(child, y['name'], ct_type=0)
190 self.SetPyData(last, y)
191 if y['type'] in self.ild :
192 img = self.ild[y['type']]
195 self.SetItemImage(last, img, CT.TreeItemIcon_Normal)
196 self.SetItemImage(last, img, CT.TreeItemIcon_Expanded)
198 orphmat.append(matrix)
200 self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDClick)
201 #self.Bind(wx.EVT_IDLE, self.OnIdle)
203 self.eventdict = {'EVT_TREE_BEGIN_DRAG': self.OnBeginDrag, 'EVT_TREE_BEGIN_LABEL_EDIT': self.OnBeginEdit,
204 'EVT_TREE_BEGIN_RDRAG': self.OnBeginRDrag, 'EVT_TREE_DELETE_ITEM': self.OnDeleteItem,
205 'EVT_TREE_END_DRAG': self.OnEndDrag, 'EVT_TREE_END_LABEL_EDIT': self.OnEndEdit,
206 'EVT_TREE_ITEM_ACTIVATED': self.OnActivate, 'EVT_TREE_ITEM_CHECKED': self.OnItemCheck,
207 'EVT_TREE_ITEM_CHECKING': self.OnItemChecking, 'EVT_TREE_ITEM_COLLAPSED': self.OnItemCollapsed,
208 'EVT_TREE_ITEM_COLLAPSING': self.OnItemCollapsing, 'EVT_TREE_ITEM_EXPANDED': self.OnItemExpanded,
209 'EVT_TREE_ITEM_EXPANDING': self.OnItemExpanding, 'EVT_TREE_ITEM_GETTOOLTIP': self.OnToolTip,
210 'EVT_TREE_ITEM_MENU': self.OnItemMenu, 'EVT_TREE_ITEM_RIGHT_CLICK': self.OnRightDown,
211 'EVT_TREE_KEY_DOWN': self.OnKey, 'EVT_TREE_SEL_CHANGED': self.OnSelChanged,
212 'EVT_TREE_SEL_CHANGING': self.OnSelChanging, "EVT_TREE_ITEM_HYPERLINK": self.OnHyperLink}
214 mainframe = wx.GetTopLevelParent(self)
216 if not hasattr(mainframe, "leftpanel"):
217 #self.Bind(CT.EVT_TREE_ITEM_EXPANDED, self.OnItemExpanded)
218 #self.Bind(CT.EVT_TREE_ITEM_COLLAPSED, self.OnItemCollapsed)
219 self.Bind(CT.EVT_TREE_SEL_CHANGED, self.OnSelChanged)
220 self.Bind(CT.EVT_TREE_SEL_CHANGING, self.OnSelChanging)
221 self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
222 self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp)
224 for combos in mainframe.treeevents:
225 self.BindEvents(combos)
227 if hasattr(mainframe, "leftpanel"):
228 self.ChangeStyle(mainframe.treestyles)
230 if not(self.GetAGWWindowStyleFlag() & CT.TR_HIDE_ROOT):
231 self.SelectItem(self.root)
232 self.Expand(self.root)
235 def BindEvents(self, choice, recreate=False):
237 value = choice.GetValue()
238 text = choice.GetLabel()
241 binder = self.eventdict[text]
244 if evt == "CT.EVT_TREE_BEGIN_RDRAG":
245 self.Bind(wx.EVT_RIGHT_DOWN, None)
246 self.Bind(wx.EVT_RIGHT_UP, None)
247 self.Bind(eval(evt), binder)
249 self.Bind(eval(evt), None)
250 if evt == "CT.EVT_TREE_BEGIN_RDRAG":
251 self.Bind(wx.EVT_RIGHT_DOWN, self.OnRightDown)
252 self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp)
255 def ChangeStyle(self, combos):
259 if combo.GetValue() == 1:
260 style = style | eval("CT." + combo.GetLabel())
262 if self.GetAGWWindowStyleFlag() != style:
263 self.SetAGWWindowStyleFlag(style)
266 def OnCompareItems(self, item1, item2):
268 t1 = self.GetItemText(item1)
269 t2 = self.GetItemText(item2)
280 def OnIdle(self, event):
284 # if self.gauge.IsEnabled() and self.gauge.IsShown():
285 # self.count = self.count + 1
287 # if self.count >= 50:
290 # self.gauge.SetValue(self.count)
298 def CloseItem(self, itemParent = None, uuid = None) :
299 if itemParent is None :
300 itemParent = self.root
301 child, cookie = self.GetFirstChild(itemParent)
303 pydata = self.GetPyData(child)
304 if pydata['uuid'] == uuid :
305 self.SetItemBold(child, False)
307 self.CloseItem(child, uuid)
308 child, cookie = self.GetNextChild(itemParent, cookie)
310 def GiveFocus(self, itemParent = None, uuid = None, bold = False) :
311 if itemParent is None :
312 itemParent = self.root
313 child, cookie = self.GetFirstChild(itemParent)
315 pydata = self.GetPyData(child)
316 if pydata['uuid'] == uuid :
317 self.SelectItem(child)
319 self.SetItemBold(child, True)
321 self.GiveFocus(child, uuid, bold)
322 child, cookie = self.GetNextChild(itemParent, cookie)
324 def IsInTree(self, itemParent = None, uuid = None) :
325 if itemParent is None :
326 itemParent = self.root
327 child, cookie = self.GetFirstChild(itemParent)
330 pydata = self.GetPyData(child)
331 if pydata['uuid'] == uuid :
333 self.GiveFocus(child, uuid)
334 child, cookie = self.GetNextChild(itemParent, cookie)
338 def OnRightDown(self, event):
340 pt = event.GetPosition()
341 item, flags = self.HitTest(pt)
345 #self.log.info("OnRightClick: %s, %s, %s" % (self.GetItemText(item), type(item), item.__class__) + "\n")
346 self.SelectItem(item)
349 def OnRightUp(self, event):
357 if not self.IsItemEnabled(item):
361 # Item Text Appearance
362 ishtml = self.IsItemHyperText(item)
363 back = self.GetItemBackgroundColour(item)
364 fore = self.GetItemTextColour(item)
365 isbold = self.IsBold(item)
366 font = self.GetItemFont(item)
369 normal = self.GetItemImage(item, CT.TreeItemIcon_Normal)
370 selected = self.GetItemImage(item, CT.TreeItemIcon_Selected)
371 expanded = self.GetItemImage(item, CT.TreeItemIcon_Expanded)
372 selexp = self.GetItemImage(item, CT.TreeItemIcon_SelectedExpanded)
374 # Enabling/Disabling Windows Associated To An Item
375 haswin = self.GetItemWindow(item)
377 # Enabling/Disabling Items
378 enabled = self.IsItemEnabled(item)
380 # Generic Item's Info
381 children = self.GetChildrenCount(item)
382 itemtype = self.GetItemType(item)
383 text = self.GetItemText(item)
384 pydata = self.GetPyData(item)
388 self.itemdict = {"ishtml": ishtml, "back": back, "fore": fore, "isbold": isbold,
389 "font": font, "normal": normal, "selected": selected, "expanded": expanded,
390 "selexp": selexp, "haswin": haswin, "children": children,
391 "itemtype": itemtype, "text": text, "pydata": pydata, "enabled": enabled}
393 if not item in [self.textroot, self.matroot] :
395 info = menu.Append(wx.ID_ANY, _(u"Informations").decode('utf8'))
396 rename = menu.Append(wx.ID_ANY, _(u"Rename").decode('utf8'))
397 menu.AppendSeparator()
399 if 'corpus_name' in pydata :
400 buildmenu(menu, self.parent.text_menu)
401 menu.AppendSeparator()
402 elif 'matrix_name' in pydata :
403 buildmenu(menu, self.parent.matrix_menu)
404 menu.AppendSeparator()
405 elif pydata.get('type', False) == 'alceste' and pydata['uuid'] in self.parent.history.opened :
407 antipro = openmenu.Append(wx.ID_ANY, _(u"Antiprofiles").decode('utf8'))
408 menu.AppendMenu(wx.ID_ANY, _(u"Open ...").decode('utf8'), openmenu)
410 profsr = menu.Append(wx.ID_ANY, _(u"Repeated segments profiles").decode('utf8'))
411 profgram = menu.Append(wx.ID_ANY, _(u"POS profiles").decode('utf8'))
412 tgen = menu.Append(wx.ID_ANY, _(u"Tgen Editor").decode('utf8'))
413 computetgen = menu.Append(wx.ID_ANY, _(u"Compute Tgen").decode('utf8'))
414 export_corpus = menu.Append(wx.ID_ANY, _(u"Export corpus").decode('utf8'))
415 colored = menu.Append(wx.ID_ANY, _(u"Colored corpus").decode('utf8'))
416 navig = menu.Append(wx.ID_ANY, _(u"Navigator").decode('utf8'))
417 statclasse = menu.Append(wx.ID_ANY, _(u"Clusters statistics").decode('utf8'))
418 rapport = menu.Append(wx.ID_ANY, _(u"Report").decode('utf8'))
419 export_classes = menu.Append(wx.ID_ANY, _(u"Export clusters").decode('utf8'))
420 subcorpusfromcl = menu.Append(wx.ID_ANY, _(u"Sub corpus from clusters").decode('utf8'))
421 menu.AppendSeparator()
422 self.Bind(wx.EVT_MENU, self.OpenAntipro, antipro)
423 self.Bind(wx.EVT_MENU, self.OnProfSR, profsr)
424 self.Bind(wx.EVT_MENU, self.OnProfGram, profgram)
425 self.Bind(wx.EVT_MENU, self.OnTgenEditor, tgen)
426 self.Bind(wx.EVT_MENU, self.OnTgenCompute, computetgen)
427 self.Bind(wx.EVT_MENU, self.OnExportCorpus, export_corpus)
428 self.Bind(wx.EVT_MENU, self.OnColored, colored)
429 self.Bind(wx.EVT_MENU, self.OnNavig, navig)
430 self.Bind(wx.EVT_MENU, self.StatClasse, statclasse)
431 self.Bind(wx.EVT_MENU, self.OnRapport, rapport)
432 self.Bind(wx.EVT_MENU, self.OnExportClasses, export_classes)
433 self.Bind(wx.EVT_MENU, self.OnSubCorpusFromClusters, subcorpusfromcl)
434 elif pydata.get('type', False) == 'stat' and pydata['uuid'] in self.parent.history.opened :
435 export_dictionary = menu.Append(wx.ID_ANY, _(u"Export dictionary").decode('utf8'))
436 export_lems = menu.Append(wx.ID_ANY, _(u"Export lemma dictionary").decode('utf8'))
437 self.Bind(wx.EVT_MENU, self.OnExportDictionary, export_dictionary)
438 self.Bind(wx.EVT_MENU, self.OnExportLems, export_lems)
439 menu.AppendSeparator()
440 elif pydata.get('type', False) == 'spec' and pydata['uuid'] in self.parent.history.opened :
441 tgen = menu.Append(wx.ID_ANY, _(u"Tgen Editor").decode('utf8'))
442 computetgen = menu.Append(wx.ID_ANY, _(u"Compute Tgen").decode('utf8'))
443 self.Bind(wx.EVT_MENU, self.OnTgenEditor, tgen)
444 self.Bind(wx.EVT_MENU, self.OnTgenCompute, computetgen)
445 menu.AppendSeparator()
446 elif pydata.get('type', False) == 'reinertmatrix' and pydata['uuid'] in self.parent.history.opened :
448 antipro = openmenu.Append(wx.ID_ANY, _(u"antiprofiles").decode('utf8'))
449 rapport = menu.Append(wx.ID_ANY, _(u"Report").decode('utf8'))
450 menu.AppendMenu(wx.ID_ANY, _(u"Open ...").decode('utf8'), openmenu)
451 self.Bind(wx.EVT_MENU, self.OpenAntipro, antipro)
452 self.Bind(wx.EVT_MENU, self.OnRapport, rapport)
455 itemdelete = menu.Append(wx.ID_ANY, _(u"Delete from history").decode('utf8'))
456 #item11 = menu.Append(wx.ID_ANY, "Prepend An Item")
457 #item12 = menu.Append(wx.ID_ANY, "Append An Item")
459 #self.Bind(wx.EVT_MENU, self.OnItemBackground, item1)
460 #self.Bind(wx.EVT_MENU, self.OnItemForeground, item2)
461 #self.Bind(wx.EVT_MENU, self.OnItemBold, item3)
462 #self.Bind(wx.EVT_MENU, self.OnItemFont, item4)
463 #self.Bind(wx.EVT_MENU, self.OnItemHyperText, item5)
464 #self.Bind(wx.EVT_MENU, self.OnEnableWindow, item6)
465 #self.Bind(wx.EVT_MENU, self.OnDisableItem, item7)
466 #self.Bind(wx.EVT_MENU, self.OnItemIcons, item8)
467 self.Bind(wx.EVT_MENU, self.OnItemInfo, info)
468 self.Bind(wx.EVT_MENU, self.OnRename, rename)
469 self.Bind(wx.EVT_MENU, self.OnItemDelete, itemdelete)
470 #self.Bind(wx.EVT_MENU, self.OnItemPrepend, item11)
471 #self.Bind(wx.EVT_MENU, self.OnItemAppend, item12)
477 busy = wx.BusyInfo(_("Please wait...Reading corpus").decode('utf8'), self.parent)
479 if self.pydata['uuid'] in self.parent.history.openedcorpus :
480 corpus = copycorpus(self.parent.history.openedcorpus[self.pydata['uuid']])
481 elif 'corpus_name' in self.pydata :
482 corpus = Corpus(self.parent, parametres = DoConf(self.pydata['ira']).getoptions('corpus'), read = True)
484 cuuid = self.pydata['corpus']
485 if cuuid in self.parent.history.openedcorpus :
486 corpus = copycorpus(self.parent.history.openedcorpus[cuuid])
488 irapath = self.parent.history.corpus[cuuid]['ira']
489 corpus = Corpus(self.parent, parametres = DoConf(irapath).getoptions('corpus'), read = True)
494 if 'matrix_name' in self.pydata :
495 matrix = Tableau(self.parent, parametres = DoConf(self.pydata['ira']).getoptions('matrix'))
497 return copymatrix(matrix)
499 cuuid = self.pydata['matrix']
500 matrix = Tableau(self.parent, parametres = DoConf(self.history.matrixanalyse[cuuid]['ira']).getoptions('matrix'))
502 return copymatrix(matrix)
504 def OnSpec(self, evt) :
505 self.parent.OnTextSpec(evt, self.getcorpus())
507 def OnStat(self, evt) :
508 self.parent.OnTextStat(evt, self.getcorpus())
510 def OnReinert(self, evt) :
511 self.parent.OnTextReinert(evt, self.getcorpus())
513 def OnPam(self, evt) :
514 self.parent.OnPamSimple(evt, self.getcorpus())
516 def OnSimiTxt(self, evt) :
517 self.parent.OnSimiTxt(evt, self.getcorpus())
519 def OnWordCloud(self, evt) :
520 self.parent.OnWordCloud(evt, self.getcorpus())
522 # def OnFreq(self, evt):
523 # self.parent.OnFreq(evt, self.getmatrix())
525 # def OnChiSquare(self, evt):
526 # self.parent.OnChi2(evt, self.getmatrix())
528 # def OnSimiTab(self, evt):
529 # self.parent.OnSimiTab(evt, self.getmatrix())
531 # def OnProto(self, evt):
532 # self.parent.OnProto(evt, self.getmatrix())
534 # def OnSplitFromVar(self, evt):
535 # self.parent.OnSplitVar(evt, self.getmatrix())
537 # def OnCHDReinert(self, evt):
538 # self.parent.OnCHDReinert(evt, self.getmatrix())
540 #def OnSubTextFromMeta(self, evt):
541 # self.parent.OnSubText(self.getcorpus(), parametres = {'frommeta' : True})
543 #def OnSubTextFromTheme(self, evt):
544 # self.parent.OnSubText(self.getcorpus(), parametres = {'fromtheme' : True})
546 def OnProfSR(self, evt) :
547 ProfileSegment(self.parent, self.page.dictpathout, self.page.parametres, self.page.corpus)
549 def OnProfGram(self, evt) :
550 ProfilType(self.parent, self.page.corpus, self.page.parametres)
552 def OnExportCorpus(self, evt) :
553 dial = PrefExport(self, self.parent)
554 dial.fbb.SetValue(os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'export_corpus.txt'))
555 dial.CenterOnParent()
556 res = dial.ShowModal()
558 if dial.radio_type.GetSelection() == 0 : alc = True
560 if dial.radio_lem.GetSelection() == 0 : lem = True
562 if self.page.parametres['classif_mode'] != 2 :
566 self.page.corpus.export_corpus_classes(dial.fbb.GetValue(), alc = alc, lem = lem, uci = uci)
569 dlg = wx.MessageDialog(self.parent, msg, u"Export", wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
574 def OnColored(self, evt) :
575 dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.html', 'title': _(u"Colored corpus").decode('utf8')})
576 dial.fbb.SetValue(os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'corpus_couleur.html'))
577 dial.CenterOnParent()
578 res = dial.ShowModal()
580 fileout = dial.fbb.GetValue()
582 if self.page.parametres['classif_mode'] != 2 :
586 txt = self.page.corpus.make_colored_corpus(uci = uci)
587 with open(fileout, 'w') as f :
589 msg = ' !\n'.join([_(u"Done").decode('utf8'), _(u"Open in a web browser ?").decode('utf8')])
590 dlg = wx.MessageDialog(self.parent, msg, u"Corpus en couleur", wx.NO | wx.YES | wx.NO_DEFAULT | wx.ICON_QUESTION)
592 if dlg.ShowModal() == wx.ID_YES :
593 webbrowser.open(fileout)
596 def OnNavig(self, evt):
597 if 'FrameSearch' not in dir(self.page) :
598 self.page.FrameSearch = SearchFrame(self.parent, -1, _(u"Search ...").decode('utf8'), self.page.corpus)
599 self.page.FrameSearch.Show()
601 def StatClasse(self, evt):
602 dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.csv', 'title': _(u"Clusters statistics").decode('utf8')})
603 dial.fbb.SetValue( os.path.join(os.path.dirname(self.page.dictpathout['ira']), 'stat_par_classe.csv'))
604 dial.CenterOnParent()
605 res = dial.ShowModal()
607 fileout = dial.fbb.GetValue()
609 self.page.corpus.get_stat_by_cluster(fileout)
611 dlg = wx.MessageDialog(self.parent, msg, _(u"Clusters statistics").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
613 if dlg.ShowModal() == wx.ID_OK :
616 def OpenAntipro(self, evt) :
618 for i in range(0, self.page.TabChdSim.GetPageCount()) :
619 page = self.page.TabChdSim.GetPage(i)
620 if self.page.TabChdSim.GetPageText(i) == _(u"Antiprofiles").decode('utf8') :
621 self.page.TabChdSim.SetSelection(i)
625 open_antiprofil(self.page, self.page.dictpathout['ANTIPRO_OUT'], self.parent.syscoding)
626 self.page.TabChdSim.SetSelection(self.page.TabChdSim.GetPageCount() - 1)
628 def OnRapport(self, evt) :
629 dial = PrefSimpleFile(self, self.parent, **{'mask' : '*.txt', 'title': _(u"Report").decode('utf8')})
630 dial.fbb.SetValue(self.page.dictpathout['rapport'])
631 dial.CenterOnParent()
632 res = dial.ShowModal()
634 fileout = dial.fbb.GetValue()
636 with open(fileout, 'w') as f :
637 f.write(self.page.debtext + '\n' + GetTxtProfile(self.page.DictProfile, self.page.cluster_size))
639 dlg = wx.MessageDialog(self.parent, msg, _(u"Report").decode('utf8'), wx.OK | wx.NO_DEFAULT | wx.ICON_INFORMATION)
646 def OnExportDictionary(self, evt) :
647 corpus = self.page.corpus
648 corpus.export_dictionary(self.page.pathout['dictionary.csv'], self.parent.syscoding)
649 log.info('export dictionary %s' % self.page.pathout['dictionary.csv'])
650 dial = wx.MessageDialog(self.parent, self.page.pathout['dictionary.csv'], 'Export', wx.OK)
654 def OnExportLems(self, evt) :
655 corpus = self.page.corpus
656 corpus.export_lems(self.page.pathout['lemmes.csv'], self.parent.syscoding)
657 log.info('export lemmes %s' % self.page.pathout['lemmes.csv'])
658 dial = wx.MessageDialog(self.parent, self.page.pathout['lemmes.csv'], 'Export', wx.OK)
662 def OnTgenEditor(self, evt):
663 corpus = self.page.corpus
664 tgenpath = os.path.join(self.page.parametres['pathout'], 'tgen.csv')
665 tgen = TGen(path = tgenpath, encoding = self.parent.syscoding)
666 if os.path.exists(tgenpath) :
668 if isinstance(evt, list) :
670 while 'tgen%i' %i in tgen.tgen :
672 tgenname = 'tgen%i' %i
673 tgen.tgen[tgenname] = evt
674 tgenframe = TGenFrame(self.parent, corpus, tgen)
676 if isinstance(evt, list) :
677 tgenframe.OnNewTgen(None, tgen = tgenname)
679 def OnTgenCompute(self, evt):
680 corpus = self.page.corpus
681 tgenpath = os.path.join(self.page.parametres['pathout'], 'tgen.csv')
682 if not os.path.exists(tgenpath) :
683 message = wx.MessageDialog(self.parent, _(u"No TGen yet !"), style = wx.ICON_EXCLAMATION | wx.OK)
687 self.page.parametres['tgenpath'] = tgenpath
688 tgen = TGen(path = tgenpath, encoding = self.parent.syscoding)
689 if self.page.parametres['type'] == 'spec' :
690 self.page.parametres['etoiles'] = self.page.etoiles
691 TgenSpec(self.parent, corpus, self.page.parametres)
692 elif self.page.parametres['type'] == 'alceste' :
693 TgenProf(self.parent, corpus, self.page.parametres, self.page.cluster_size)
694 TgenLayout(self.page)
696 def OnExportClasses(self, event):
697 corpus = self.page.corpus
698 if self.page.parametres['classif_mode'] != 2 :
702 busy = wx.BusyInfo(_("Please wait...").decode('utf8'), self.parent)
704 for i in range(1, self.page.parametres['clnb'] + 1) :
705 corpus.export_classe(self.page.pathout['classe_%i_export.txt' % i], i, uci = uci)
707 dial = wx.MessageDialog(self, self.page.pathout['classe_x_export.txt'], u"Export", wx.OK|wx.ICON_INFORMATION)
711 def OnSubCorpusFromClusters(self, evt):
712 self.parent.OnSubText(evt, corpus = self.getcorpus(), parametres = {'fromclusters' : True, 'clnb': self.page.parametres['clnb'], 'lc' : self.page.corpus.lc})
714 def OnRename(self, event):
715 pydata = self.itemdict['pydata']
716 if 'matrix_name' in pydata :
718 elif 'corpus_name' in pydata :
722 oldname = pydata[name]
723 dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', oldname)
724 if dlg.ShowModal() == wx.ID_OK:
725 newname = dlg.GetValue()
727 pydata[name] = newname
728 Totconf = DoConf(configfile=pydata['ira'])
729 conf = Totconf.getoptions()
731 Totconf.makeoptions(Totconf.getsections(), [conf])
732 self.history.update(pydata)
733 self.SetItemText(self.current, newname)
734 self.EnsureVisible(self.current)
736 def OnItemBackground(self, event):
738 colourdata = wx.ColourData()
739 colourdata.SetColour(self.itemdict["back"])
740 dlg = wx.ColourDialog(self, colourdata)
742 dlg.GetColourData().SetChooseFull(True)
744 if dlg.ShowModal() == wx.ID_OK:
745 data = dlg.GetColourData()
746 col1 = data.GetColour().Get()
747 self.SetItemBackgroundColour(self.current, col1)
751 def OnItemForeground(self, event):
753 colourdata = wx.ColourData()
754 colourdata.SetColour(self.itemdict["fore"])
755 dlg = wx.ColourDialog(self, colourdata)
757 dlg.GetColourData().SetChooseFull(True)
759 if dlg.ShowModal() == wx.ID_OK:
760 data = dlg.GetColourData()
761 col1 = data.GetColour().Get()
762 self.SetItemTextColour(self.current, col1)
766 def OnItemBold(self, event):
768 self.SetItemBold(self.current, not self.itemdict["isbold"])
771 def OnItemFont(self, event):
774 font = self.itemdict["font"]
777 font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
779 data.SetInitialFont(font)
781 dlg = wx.FontDialog(self, data)
783 if dlg.ShowModal() == wx.ID_OK:
784 data = dlg.GetFontData()
785 font = data.GetChosenFont()
786 self.SetItemFont(self.current, font)
791 def OnItemHyperText(self, event):
793 self.SetItemHyperText(self.current, not self.itemdict["ishtml"])
796 def OnEnableWindow(self, event):
798 enable = self.GetItemWindowEnabled(self.current)
799 self.SetItemWindowEnabled(self.current, not enable)
802 def OnDisableItem(self, event):
804 self.EnableItem(self.current, False)
807 def OnItemIcons(self, event):
809 bitmaps = [self.itemdict["normal"], self.itemdict["selected"],
810 self.itemdict["expanded"], self.itemdict["selexp"]]
813 dlg = TreeIcons(self, -1, bitmaps=bitmaps)
818 def SetNewIcons(self, bitmaps):
820 self.SetItemImage(self.current, bitmaps[0], CT.TreeItemIcon_Normal)
821 self.SetItemImage(self.current, bitmaps[1], CT.TreeItemIcon_Selected)
822 self.SetItemImage(self.current, bitmaps[2], CT.TreeItemIcon_Expanded)
823 self.SetItemImage(self.current, bitmaps[3], CT.TreeItemIcon_SelectedExpanded)
826 def OnItemInfo(self, event):
828 itemtext = self.itemdict["text"]
829 numchildren = str(self.itemdict["children"])
830 itemtype = self.itemdict["itemtype"]
831 pydata = self.itemdict['pydata']
832 #if 'analyses' in pydata :
833 # toshow = dict([[val, pydata[val]] for val in pydata if val not in['analyses', 'isload']])
835 toshow = pydata['ira']
836 toshow = DoConf(toshow).getoptions()
837 txt = DoConf().totext(toshow)
838 parametres = [val.split('\t\t:') for val in txt.splitlines()]
844 itemtype = "CheckBox"
846 itemtype = "RadioButton"
848 dlg = InfoDialog(self, itemtext, parametres)
855 def OnItemDelete(self, event):
857 strs = "Are You Sure You Want To Delete Item " + self.GetItemText(self.current) + "?"
858 dlg = wx.MessageDialog(None, strs, 'Deleting Item', wx.OK | wx.CANCEL | wx.ICON_QUESTION)
860 if dlg.ShowModal() in [wx.ID_NO, wx.ID_CANCEL]:
866 pydata = self.itemdict['pydata']
867 if 'corpus_name' in pydata :
868 self.history.delete(pydata, True)
870 self.history.delete(pydata)
871 self.DeleteChildren(self.current)
872 self.Delete(self.current)
877 def OnItemPrepend(self, event):
879 dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
881 if dlg.ShowModal() == wx.ID_OK:
882 newname = dlg.GetValue()
883 newitem = self.PrependItem(self.current, newname)
884 self.EnsureVisible(newitem)
888 def AddAnalyse(self, parametres, itemParent = None, bold = True) :
889 uuid = parametres.get('corpus', None)
890 if uuid is not None :
891 if itemParent is None :
892 itemParent = self.textroot
893 child, cookie = self.GetFirstChild(itemParent)
896 pydata = self.GetPyData(child)
897 if pydata['uuid'] == uuid :
900 self.GiveFocus(child, uuid)
901 child, cookie = self.GetNextChild(itemParent, cookie)
902 #item = self.AppendItem(child, parametres['name'])
903 if corpus is not None :
904 item = self.AppendItem(corpus, parametres['name'])
906 item = self.AppendItem(self.textroot, parametres['name'])
908 item = self.AppendItem(self.matroot, parametres['name'])
909 self.SetPyData(item, parametres)
910 if parametres['type'] in self.ild :
911 img = self.ild[parametres['type']]
914 self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
915 self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
916 self.SetItemBold(item, bold)
917 self.SelectItem(item)
919 def AddMatAnalyse(self, parametres, itemParent = None, bold = True) :
920 uuid = parametres.get('matrix', None)
921 if uuid is not None :
922 if itemParent is None :
923 itemParent = self.matroot
924 child, cookie = self.GetFirstChild(itemParent)
927 pydata = self.GetPyData(child)
928 if pydata['uuid'] == uuid :
931 self.GiveFocus(child, uuid)
932 child, cookie = self.GetNextChild(itemParent, cookie)
933 #item = self.AppendItem(child, parametres['name'])
934 if matrix is not None :
935 item = self.AppendItem(matrix, parametres['name'])
937 item = self.AppendItem(self.matroot, parametres['name'])
938 self.SetPyData(item, parametres)
939 if parametres['type'] in self.ild :
940 img = self.ild[parametres['type']]
943 self.SetItemImage(item, img, CT.TreeItemIcon_Normal)
944 self.SetItemImage(item, 13, CT.TreeItemIcon_Expanded)
945 self.SetItemBold(item, bold)
946 self.SelectItem(item)
948 def OnItemAppend(self, item, select = True):
949 if 'corpus_name' in item :
950 child = self.InsertItem(self.textroot, 0, item['corpus_name'])
952 child = self.InsertItem(self.matroot, 0, item['matrix_name'])
953 self.SetPyData(child, item)
954 if item['type'] in self.ild :
955 img = self.ild[item['type']]
958 self.SetItemImage(child, img, CT.TreeItemIcon_Normal)
959 self.SetItemImage(child, img, CT.TreeItemIcon_Expanded)
961 self.history.addtab(item)
962 self.SetItemBold(child, True)
963 self.SelectItem(child)
965 #dlg = wx.TextEntryDialog(self, "Please Enter The New Item Name", 'Item Naming', 'Python')
967 #if dlg.ShowModal() == wx.ID_OK:
968 # newname = dlg.GetValue()
969 # newitem = self.AppendItem(self.current, newname)
970 # self.EnsureVisible(newitem)
976 def OnBeginEdit(self, event):
978 #self.log.info("OnBeginEdit" + "\n")
979 # show how to prevent edit...
980 item = event.GetItem()
981 if item and self.GetItemText(item) == "The Root Item":
983 #self.log.info("You can't edit this one..." + "\n")
985 # Lets just see what's visible of its children
987 root = event.GetItem()
988 (child, cookie) = self.GetFirstChild(root)
991 #self.log.info("Child [%s] visible = %d" % (self.GetItemText(child), self.IsVisible(child)) + "\n")
992 (child, cookie) = self.GetNextChild(root, cookie)
997 def OnEndEdit(self, event):
999 #self.log.info("OnEndEdit: %s %s" %(event.IsEditCancelled(), event.GetLabel()))
1000 # show how to reject edit, we'll not allow any digits
1001 for x in event.GetLabel():
1002 if x in string.digits:
1003 #self.log.info(", You can't enter digits..." + "\n")
1010 def OnLeftDClick(self, event):
1011 pt = event.GetPosition()
1012 item, flags = self.HitTest(pt)
1013 if item is not None :
1014 pydata = self.GetPyData(item)
1015 if pydata['uuid'] in self.parent.history.opened :
1016 for i in range(self.parent.nb.GetPageCount()) :
1017 page = self.parent.nb.GetPage(i)
1018 if 'parametres' in dir(page) :
1019 if page.parametres['uuid'] == pydata['uuid'] :
1020 self.parent.nb.SetSelection(i)
1022 elif pydata['uuid'] in ['textroot', 'matroot'] :
1025 if os.path.exists(pydata['ira']) :
1026 busy = wx.BusyInfo(_("Please wait..."), self.parent)
1029 OpenAnalyse(self.parent, pydata)
1031 self.SetItemBold(item, True)
1032 self.OnSelChanged(pydata = pydata)
1037 wx.MessageBox(_(u"This file does not exist : %s" % pydata['ira']).decode('utf8'), 'Information', wx.ICON_EXCLAMATION | wx.STAY_ON_TOP )
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)
1088 if pydata is not None :
1089 if 'corpus_name' in pydata or 'corpus' in pydata :
1090 self.ira.ShowMenu('text', True)
1091 self.ira.ShowMenu('matrix', False)
1092 if 'matrix_name' in pydata or 'matrix' in pydata:
1093 self.ira.ShowMenu('text', False)
1094 self.ira.ShowMenu('matrix', True)
1095 self.pydata = pydata
1096 if pydata['uuid'] in self.parent.history.opened :
1097 for i in range(self.parent.nb.GetPageCount()) :
1098 self.page = self.parent.nb.GetPage(i)
1099 if 'parametres' in dir(self.page) :
1100 if self.page.parametres['uuid'] == pydata['uuid'] :
1101 self.parent.nb.SetSelection(i)
1103 if event is not None :
1107 def OnSelChanging(self, event):
1109 item = event.GetItem()
1110 olditem = event.GetOldItem()
1114 olditemtext = "None"
1116 olditemtext = self.GetItemText(olditem)
1117 #self.log.info("OnSelChanging: From %s" % olditemtext + " To %s" % self.GetItemText(item) + "\n")
1122 def OnBeginDrag(self, event):
1124 self.item = event.GetItem()
1126 self.log.info("Beginning Drag..." + "\n")
1131 def OnBeginRDrag(self, event):
1133 self.item = event.GetItem()
1135 self.log.info("Beginning Right Drag..." + "\n")
1140 def OnEndDrag(self, event):
1142 self.item = event.GetItem()
1144 self.log.info("Ending Drag!" + "\n")
1149 def OnDeleteItem(self, event):
1151 item = event.GetItem()
1156 self.log.info("Deleting Item: %s" % self.GetItemText(item) + "\n")
1160 def OnItemCheck(self, event):
1162 item = event.GetItem()
1163 self.log.info("Item " + self.GetItemText(item) + " Has Been Checked!\n")
1167 def OnItemChecking(self, event):
1169 item = event.GetItem()
1170 self.log.info("Item " + self.GetItemText(item) + " Is Being Checked...\n")
1174 def OnToolTip(self, event):
1176 item = event.GetItem()
1178 event.SetToolTip(wx.ToolTip(self.GetItemText(item)))
1181 def OnItemMenu(self, event):
1183 item = event.GetItem()
1185 self.log.info("OnItemMenu: %s" % self.GetItemText(item) + "\n")
1190 def OnKey(self, event):
1192 keycode = event.GetKeyCode()
1193 keyname = keyMap.get(keycode, None)
1195 if keycode == wx.WXK_BACK:
1196 self.log.info("OnKeyDown: HAHAHAHA! I Vetoed Your Backspace! HAHAHAHA\n")
1200 if "unicode" in wx.PlatformInfo:
1201 keycode = event.GetUnicodeKey()
1203 keycode = event.GetKeyCode()
1204 keyname = "\"" + unichr(event.GetUnicodeKey()) + "\""
1206 keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1212 keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
1214 keyname = "\"%s\"" % chr(keycode)
1216 keyname = "unknown (%s)" % keycode
1218 self.log.info("OnKeyDown: You Pressed '" + keyname + "'\n")
1223 def OnActivate(self, event):
1226 self.log.info("OnActivate: %s" % self.GetItemText(self.item) + "\n")
1231 def OnHyperLink(self, event):
1233 item = event.GetItem()
1235 self.log.info("OnHyperLink: %s" % self.GetItemText(self.item) + "\n")
1238 def OnTextCtrl(self, event):
1240 char = chr(event.GetKeyCode())
1241 self.log.info("EDITING THE TEXTCTRL: You Wrote '" + char + \
1242 "' (KeyCode = " + str(event.GetKeyCode()) + ")\n")
1246 def OnComboBox(self, event):
1248 selection = event.GetEventObject().GetValue()
1249 self.log.info("CHOICE FROM COMBOBOX: You Chose '" + selection + "'\n")