73f8ff721d52dc124cffd9a236a755dff6ebc33c
[iramuteq] / ProfList.py
1 # -*- coding: utf-8 -*-
2
3 #----------------------------------------------------------------------------
4 # Name:         ListCtrl.py
5 # Author:       Pierre Ratinaud
6
7
8 #comes from ListCtrl.py from the demo tool of wxPython:
9 # Author:       Robin Dunn & Gary Dumer
10 #
11 # Created:
12 # Copyright:    (c) 1998 by Total Control Software
13 # Licence:      wxWindows license
14 #----------------------------------------------------------------------------
15
16 import os
17 import sys
18 import  wx
19 import  wx.lib.mixins.listctrl  as  listmix
20 from tabsimi import DoSimi
21 from listlex import ListForSpec
22 from chemins import ConstructPathOut, ffr
23 from dialog import PrefExport, PrefUCECarac, SearchDial
24 from tableau import Tableau
25 from search_tools import SearchFrame
26 import webbrowser
27 import cStringIO
28 import tempfile
29 import codecs
30 from functions import exec_rcode, MessageImage, progressbar, treat_var_mod
31 from PrintRScript import barplot
32 from textclassechd import ClasseCHD
33 from shutil import copyfile
34
35 #---------------------------------------------------------------------------
36 class ProfListctrlPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSorterMixin):
37     def __init__(self, parent, gparent, profclasse, Alceste=False, cl=0):
38         wx.ListCtrl.__init__( self, parent, -1, style=wx.LC_REPORT|wx.LC_VIRTUAL|wx.LC_HRULES|wx.LC_VRULES)
39
40         self.parent = parent
41         self.Alceste = Alceste
42         self.Source = gparent
43         self.cl = cl
44
45         line1 = profclasse.pop(0)
46         classen = [line for line in profclasse if line[0] != '*' and line[0] != '*****']
47         try :
48             self.lenact = profclasse.index([u'*****', u'*', u'*', u'*', u'*', u'*', '', ''])
49             profclasse.pop(self.lenact)
50         except ValueError:
51             self.lenact = len(profclasse)
52         try :
53             self.lensup = profclasse.index([u'*', u'*', u'*', u'*', u'*', u'*', '', ''])
54             self.lensup = self.lensup - self.lenact
55             profclasse.pop(self.lensup)
56         except ValueError: 
57             self.lensup = 0
58         self.lenet = len(profclasse) - (self.lenact + self.lensup)
59         print self.lenact, self.lensup, self.lenet
60         for i,  line in enumerate(classen) :
61             line[0] = i
62         dictdata = dict(zip([i for i in range(0,len(classen))], classen))
63
64         if self.lenact != 0 :
65             self.la = [dictdata[i][6] for i in range(0, self.lenact)]
66             self.lchi = [dictdata[i][4] for i in range(0, self.lenact)]
67             self.lfreq = [dictdata[i][1] for i in range(0, self.lenact)]
68         else :
69             self.la = []
70             self.lchi = []
71             self.lfreq = []
72             
73         #adding some art
74         self.il = wx.ImageList(16, 16)
75         a={"sm_up":"GO_UP","sm_dn":"GO_DOWN","w_idx":"WARNING","e_idx":"ERROR","i_idx":"QUESTION"}
76         for k,v in a.items():
77             s="self.%s= self.il.Add(wx.ArtProvider_GetBitmap(wx.ART_%s,wx.ART_TOOLBAR,(16,16)))" % (k,v)
78             exec(s)
79         self.SetImageList(self.il, wx.IMAGE_LIST_SMALL)
80
81         #adding some attributes (colourful background for each item rows)
82         self.attr1 = wx.ListItemAttr()
83         self.attr1.SetBackgroundColour((220, 220, 220))
84         self.attrsg = wx.ListItemAttr()
85         self.attrsg.SetBackgroundColour((230, 230, 230))
86         self.attr2 = wx.ListItemAttr()
87         self.attr2.SetBackgroundColour((190, 249, 236))
88         self.attr2s = wx.ListItemAttr()
89         self.attr2s.SetBackgroundColour((211, 252, 244))        
90         self.attr3 = wx.ListItemAttr()
91         self.attr3.SetBackgroundColour((245, 180, 180))
92         self.attr3s = wx.ListItemAttr()
93         self.attr3s.SetBackgroundColour((245, 190, 190))
94
95
96         self.InsertColumn(0, "num", wx.LIST_FORMAT_RIGHT)
97         self.InsertColumn(1, "eff. uce", wx.LIST_FORMAT_RIGHT)
98         self.InsertColumn(2, "eff. total", wx.LIST_FORMAT_RIGHT)
99         self.InsertColumn(3, "pourcentage", wx.LIST_FORMAT_RIGHT)
100         self.InsertColumn(4, "chi2", wx.LIST_FORMAT_RIGHT)
101         self.InsertColumn(5, "Type", wx.LIST_FORMAT_RIGHT)
102         self.InsertColumn(6, "forme", wx.LIST_FORMAT_RIGHT)
103         self.InsertColumn(7, "p", wx.LIST_FORMAT_RIGHT)
104         
105
106         self.SetColumnWidth(0, 60)
107         self.SetColumnWidth(1, 70)
108         self.SetColumnWidth(2, 80)
109         self.SetColumnWidth(3, 100)
110         self.SetColumnWidth(4, 70)
111         self.SetColumnWidth(5, 60)
112         self.SetColumnWidth(6, 140)
113         self.SetColumnWidth(7, wx.LIST_AUTOSIZE)
114
115         #These two should probably be passed to init more cleanly
116         #setting the numbers of items = number of elements in the dictionary
117         self.itemDataMap = dictdata
118         self.itemIndexMap = dictdata.keys()
119         self.SetItemCount(len(dictdata))
120         
121         #mixins
122         listmix.ListCtrlAutoWidthMixin.__init__(self)
123         listmix.ColumnSorterMixin.__init__(self, len(classen[0]))
124
125         #sort by genre (column 2), A->Z ascending order (1)
126         self.SortListItems(0, 1)
127
128         #events
129         #self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected)
130         #self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated)
131         #self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected)
132         self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick)
133
134         # for wxMSW
135         self.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightClick)
136
137         # for wxGTK
138         self.Bind(wx.EVT_RIGHT_UP, self.OnRightClick)
139
140         #for searching
141         search_id = wx.NewId()
142         searchall_id = wx.NewId()
143         self.parent.Bind(wx.EVT_MENU, self.onsearch, id = search_id)
144         self.parent.Bind(wx.EVT_MENU, self.onsearchall, id = searchall_id)
145         self.accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('F'), search_id),
146                                               (wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('F'), searchall_id)])
147         self.SetAcceleratorTable(self.accel_tbl)
148
149
150
151     def OnColClick(self,event):
152         event.Skip()
153
154     def OnItemSelected(self, event):
155         self.currentItem = event.m_itemIndex
156         print 'OnItemSelected: "%s", "%s", "%s", "%s"\n' % (self.currentItem, self.GetItemText(self.currentItem), self.getColumnText(self.currentItem, 1), self.getColumnText(self.currentItem, 2))
157         #self.log.WriteText('OnItemSelected: "%s", "%s", "%s", "%s"\n' %
158         #                   (self.currentItem,
159         #                    self.GetItemText(self.currentItem),
160         #                    self.getColumnText(self.currentItem, 1),
161         #                    self.getColumnText(self.currentItem, 2)))
162
163     def OnItemActivated(self, event):
164         self.currentItem = event.m_itemIndex
165         print "OnItemActivated: %s\nTopItem: %s\n" % (self.GetItemText(self.currentItem), self.GetTopItem())
166         #self.log.WriteText("OnItemActivated: %s\nTopItem: %s\n" %
167         #                   (self.GetItemText(self.currentItem), self.GetTopItem()))
168
169     def getColumnText(self, index, col):
170         item = self.GetItem(index, col)
171         return item.GetText()
172
173     def OnItemDeselected(self, evt):
174         pass
175         #self.log.WriteText("OnItemDeselected: %s" % evt.m_itemIndex)
176
177
178     #---------------------------------------------------
179     # These methods are callbacks for implementing the
180     # "virtualness" of the list...
181
182     def OnGetItemText(self, item, col):
183         index=self.itemIndexMap[item]
184         s = self.itemDataMap[index][col]
185         return s
186
187     def OnGetItemImage(self, item):
188         index=self.itemIndexMap[item]
189         genre=self.itemDataMap[index][2]
190
191         if genre=="Rock":
192             return self.w_idx
193         elif genre=="Jazz":
194             return self.e_idx
195         elif genre=="New Age":
196             return self.i_idx
197         else:
198             return -1
199
200     def OnGetItemAttr(self, item):
201         index=self.itemIndexMap[item]
202         #genre=self.itemDataMap[index][2]
203         if index < self.lenact :
204             if item % 2 :
205                 return self.attr1
206             else :
207                 return self.attrsg
208         elif index >= self.lenact and index < (self.lenact + self.lensup) :
209             if item % 2 :
210                 return self.attr2
211             else :
212                 return self.attr2s
213         elif index >= (self.lenact + self.lensup) :
214             if item % 2 :
215                 return self.attr3
216             else :
217                 return self.attr3s
218         else :
219             return None
220
221 #        if genre=="Rock":
222 #            return self.attr2
223 #        elif genre=="Jazz":
224 #            return self.attr1
225 #        elif genre=="New Age":
226 #            return self.attr3
227 #        else:
228 #            return None
229
230     #---------------------------------------------------
231     # Matt C, 2006/02/22
232     # Here's a better SortItems() method --
233     # the ColumnSorterMixin.__ColumnSorter() method already handles the ascending/descending,
234     # and it knows to sort on another column if the chosen columns have the same value.
235
236     def SortItems(self,sorter=cmp):
237         items = list(self.itemDataMap.keys())
238         items.sort(sorter)
239         self.itemIndexMap = items
240         
241         # redraw the list
242         self.Refresh()
243
244     # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
245     def GetListCtrl(self):
246         return self
247
248     # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
249     def GetSortImages(self):
250         return (self.sm_dn, self.sm_up)
251
252     def onsearch(self, evt) :
253         self.dial = SearchDial(self, self, 6, True)
254         self.dial.CenterOnParent()
255         self.dial.ShowModal()
256         self.dial.Destroy()
257
258     def onsearchall(self, evt) :
259         if 'FrameSearch' not in dir(self.Source) :
260             self.Source.FrameSearch = SearchFrame(self.parent, -1, u"Rechercher...", self.Source.corpus)
261         self.dial = SearchDial(self, self.Source.FrameSearch.liste, 1, False)
262         self.dial.CenterOnParent()
263         self.dial.ShowModal()
264         self.dial.Destroy()
265
266     def OnRightClick(self, event):
267
268         # only do this part the first time so the events are only bound once
269         if self.Alceste:
270             if not hasattr(self, "popupID1"):
271                 self.popupID1 = wx.NewId()
272                 self.popupID2 = wx.NewId()
273                 self.popupID3 = wx.NewId()
274                 self.popupID4 = wx.NewId()
275                 self.popupID5 = wx.NewId()
276                 self.popupID6 = wx.NewId()
277                 self.popupID7 = wx.NewId()
278                 self.popupID8 = wx.NewId()
279                 self.popupID9 = wx.NewId()
280                 #self.popupID10 = wx.NewId()
281                 self.popupIDgraph = wx.NewId()
282                 self.idseg = wx.NewId()
283                 self.iducecarac = wx.NewId()
284                 self.idtablex = wx.NewId()
285                 self.idchimod = wx.NewId()
286                 self.idwordgraph = wx.NewId()
287                 self.popup_proxe = wx.NewId()
288                 self.idlexdendro = wx.NewId()
289                 self.idexport = wx.NewId()
290             #    self.export_classes = wx.NewId()
291    
292                 self.Bind(wx.EVT_MENU, self.OnPopupOne, id=self.popupID1)
293                 self.Bind(wx.EVT_MENU, self.OnPopupTwo, id=self.popupID2)
294                 self.Bind(wx.EVT_MENU, self.OnPopupThree, id=self.popupID3)
295                 self.Bind(wx.EVT_MENU, self.OnPopupFour, id=self.popupID4)
296                 self.Bind(wx.EVT_MENU, self.OnPopupFive, id=self.popupID5)
297                 self.Bind(wx.EVT_MENU, self.OnPopupSix, id=self.popupID6)
298                 self.Bind(wx.EVT_MENU, self.OnPopupSeven, id=self.popupID7)
299                 self.Bind(wx.EVT_MENU, self.OnPopupHeight, id=self.popupID8)
300                 self.Bind(wx.EVT_MENU, self.OnPopupNine, id=self.popupID9)
301                 #self.Bind(wx.EVT_MENU, self.OnPopupSpec, id=self.popupID10)
302                 self.Bind(wx.EVT_MENU, self.on_graph, id=self.popupIDgraph)
303                 self.Bind(wx.EVT_MENU, self.on_segments, id=self.idseg)
304                 self.Bind(wx.EVT_MENU, self.on_uce_carac, id = self.iducecarac)
305                 self.Bind(wx.EVT_MENU, self.on_tablex, id = self.idtablex)
306                 self.Bind(wx.EVT_MENU, self.quest_var_mod, id = self.idchimod)
307                 self.Bind(wx.EVT_MENU, self.onwordgraph, id = self.idwordgraph)
308                 self.Bind(wx.EVT_MENU, self.onproxe, id = self.popup_proxe)
309                 self.Bind(wx.EVT_MENU, self.onlexdendro, id = self.idlexdendro)
310                 self.Bind(wx.EVT_MENU, self.onexport, id = self.idexport)
311              #  self.Bind(wx.EVT_MENU, self.on_export_classes, id = self.export_classes)
312    #            self.Bind(wx.EVT_MENU, self.OnPopupThree, id=self.popupID3)
313     
314             # make a menu
315             menu = wx.Menu()
316             menu.Append(self.popupID1, u"Formes associées")
317             menu.Append(self.idtablex, u"Chi2 par classe")
318             menu.Append(self.idlexdendro, u"Chi2 par classe + dendro")
319             menu.Append(self.idchimod, u"Chi2 modalités de la variable")
320             menu.Append(self.idwordgraph, u"Graphe du mot")
321             #menu.Append(self.export_classes, u"Exporter le corpus...") 
322             
323             #menu.Append(self.popupID10, u"Spécificités")
324
325             menu_conc = wx.Menu()
326             menu_conc.Append(self.popupID2, u"dans les uce de la classe")
327             menu_conc.Append(self.popupID3, u"dans les uce classées")
328             menu_conc.Append(self.popupID4, u"dans toutes les uce")
329             menu.AppendMenu(-1, u"Concordancier", menu_conc) 
330             menu_cnrtl = wx.Menu()      
331             menu_cnrtl.Append(self.popupID5, u"Définition")
332             menu_cnrtl.Append(self.popupID6, u"Etymologie")
333             menu_cnrtl.Append(self.popupID7, u"Synonymie")
334             menu_cnrtl.Append(self.popupID8, u"Antonymie")
335             menu_cnrtl.Append(self.popupID9, u"Morphologie")
336             menu_cnrtl.Append(self.popup_proxe, u"Proxémie")
337             menu.AppendMenu(-1, u"Outils du CNRTL", menu_cnrtl)
338             menu.AppendSeparator()
339             menu.Append(self.popupIDgraph, u"Graphe de la classe")
340             menu.Append(self.idseg, u"Segments répétés")
341             menu.Append(self.iducecarac, u"UCE caractéristiques")
342             menu.Append(self.idexport, 'Partitionner...')
343             #menu.Append(self.popupID2, u"Concordancier")
344     #        menu.Append(self.popupID3, "recharger")
345     
346             self.PopupMenu(menu)
347             menu.Destroy()
348         elif 'tableau' in dir(self.Source) :
349             if not hasattr(self, "pop1"):
350                 self.pop1 = wx.NewId()
351                 self.pop2 = wx.NewId()
352                 self.pop3 = wx.NewId()
353                 self.Bind(wx.EVT_MENU, self.quest_simi, id=self.pop1)
354                 self.Bind(wx.EVT_MENU, self.on_tablex, id=self.pop2)
355                 self.Bind(wx.EVT_MENU, self.quest_var_mod, id=self.pop3)
356
357             menu = wx.Menu()
358             menu.Append(self.pop2, u"Chi2 par classe")
359             menu.Append(self.pop3, u"Chi2 modalités de la variable")
360             menu.AppendSeparator()
361             menu.Append(self.pop1, u"Graph de la classe")
362             self.PopupMenu(menu)
363             menu.Destroy()
364
365     def onexport(self, evt) :
366         if 'corpus' in dir(self.Source):
367             corpus = self.Source.corpus
368         ClasseCHD(self.parent, corpus, self.cl)
369
370     def quest_var_mod(self, evt) :
371         if 'corpus' in dir(self.Source):
372             corpus = self.Source.corpus
373             if self.var_mod == {} :
374                 self.var_mod = treat_var_mod([val for val in corpus.make_etoiles()])
375         else :
376             corpus = self.Source.tableau
377             if self.var_mod == {} :
378                 self.var_mod = treat_var_mod([val for val in corpus.actives] + [val for val in corpus.sups])
379         with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
380             chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
381         title = chistable[0]
382         title.pop(0)
383         chistable.pop(0)
384         vchistable = [line[1:] for line in chistable]
385         fchistable = [line[0] for line in chistable]
386         word = self.getColumnText(self.GetFirstSelected(), 6)
387         if len(word.split('_')) > 1 :
388             var = word.split('_')[0]
389             words = [word for word in self.var_mod[var]]
390             words.sort()
391             tableout = []
392             kwords = []
393             for word in words :
394                 if word in fchistable :
395                     tableout.append(vchistable[fchistable.index(word)])
396                     kwords.append(word)
397             tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
398             txt = barplot(tableout, kwords, title, self.Source.parent.RscriptsPath['Rgraph'], tmpgraph)
399             tmpscript = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
400             file = open(tmpscript,'w')
401             file.write(txt)
402             file.close()
403             exec_rcode(self.Source.parent.RPath, tmpscript, wait = True)
404             win = MessageImage(self, -1, u"Graphique", size=(700, 500),style = wx.DEFAULT_FRAME_STYLE)
405             win.addsaveimage(tmpgraph)
406             txt = "<img src='%s'>" % tmpgraph
407             win.HtmlPage.SetPage(txt)
408             win.Show(True)
409         else :
410             dial = wx.MessageDialog(self, u"Ce n'est pas une forme du type variable_modalité", u"Problème", wx.OK | wx.ICON_WARNING)
411             dial.CenterOnParent()
412             dial.ShowModal()
413             dial.Destroy()
414
415     def quest_simi(self, evt) :
416         tableau = self.Source.tableau
417         tab = tableau.make_table_from_classe(self.cl, self.la)
418         pathout = ConstructPathOut(self.Source.pathout+'/', 'simi_classe_%i' %self.cl)
419         self.filename = os.path.join(pathout,'mat01.csv')
420         tableau.printtable(self.filename, tab)
421         del tab
422         paramsimi = {'coeff' : 0,
423                           'layout' : 2,
424                           'type' : 1,
425                           'arbremax' : 1,
426                           'coeff_tv' : 1,
427                           'coeff_tv_nb' : 0,
428                           'tvprop' : 0,
429                           'tvmin' : 5,
430                           'tvmax' : 30,
431                           'coeff_te' : 1,
432                           'coeff_temin' : 1,
433                           'coeff_temax' : 10,
434                           'label_v': 1,
435                           'label_e': 1,
436                           'vcex' : 0,
437                           'vcexmin' : 10,
438                           'vcexmax' : 25,
439                           'cex' : 10,
440                           'cexfromchi' : True,
441                           'sfromchi': False,
442                           'seuil_ok' : 0,
443                           'seuil' : 1,
444                           'cols' : (255,0,0),
445                           'cola' : (200,200,200),
446                           'width' : 1000,
447                           'height' : 1000,
448                           'first' : True,
449                           'keep_coord' : True,
450                           'alpha' : 20,
451                           'film': False,
452                           }
453 #        self.tableau.actives = {}
454 #        self.tableau.lchi = self.lchi
455 #        self.tableau.chi = {}
456 #        for i, val in enumerate(self.la) :
457 #            self.tableau.actives[val] = [self.lfreq[i]]
458 #            self.tableau.chi[val] = [self.lchi[i]]
459                           
460         act = {}
461         self.tableau.chi = {}
462         self.tableau.lchi = self.lchi
463         self.tableau.parametre['fromprof'] = True
464         for i, val in enumerate(self.la) :
465             act[val] = [self.lfreq[i]]
466             self.tableau.chi[val] = [self.lchi[i]]
467         DoSimi(self, param = paramsimi, fromprof = ffr(self.filename), pathout = pathout, listactives = self.la, actives = act)
468
469     def onwordgraph(self, evt):
470         word = self.getColumnText(self.GetFirstSelected(), 6)
471         dlg = progressbar(self, 2)
472         corpus = self.Source.corpus
473         uces = corpus.lc[self.cl-1]
474         dlg.Update(1, u'Tableau...')
475         #tab = corpus.make_table_with_classe(uces, self.la)
476         pathout = ConstructPathOut(self.Source.pathout.dirout + '/' , 'simi_%s' % word)
477         self.filename = os.path.join(pathout,'mat01.csv')
478         dlg.Update(2, u'Ecriture...')
479         #corpus.write_tab(tab, self.filename)
480         #del tab
481         corpus.make_and_write_sparse_matrix_from_classe(self.la, uces, self.filename)
482         dlg.Destroy()
483         paramsimi = {'coeff' : 0,
484                           'layout' : 2,
485                           'type' : 1,
486                           'arbremax' : 0,
487                           'coeff_tv' : 1,
488                           'coeff_tv_nb' : 0,
489                           'tvprop' : 0,
490                           'tvmin' : 5,
491                           'tvmax' : 30,
492                           'coeff_te' : 1,
493                           'coeff_temin' : 1,
494                           'coeff_temax' : 10,
495                           'label_v': 1,
496                           'label_e': 0,
497                           'vcex' : 1,
498                           'vcexmin' : 10,
499                           'vcexmax' : 25, 
500                           'cex' : 10,
501                           'seuil_ok' : 1,
502                           'seuil' : 1,
503                           'cols' : (255,0,0),
504                           'cola' : (200,200,200),
505                           'width' : 600,
506                           'height' : 600,
507                           'first' : True,
508                           'keep_coord' : True,
509                           'alpha' : 20,
510                           'film': False,
511                           }
512         self.tableau = Tableau(self.parent, '')
513         self.tableau.listactives = self.la
514         self.tableau.actives = {}
515         for i, val in enumerate(self.la) :
516             self.tableau.actives[val] = [self.lfreq[i]]
517         DoSimi(self, param = paramsimi, fromprof = ffr(self.filename), pathout = pathout, wordgraph = word)
518
519     def on_graph(self, evt):
520         dlg = progressbar(self, 2)
521         corpus = self.Source.corpus
522         uces = corpus.lc[self.cl-1]
523         dlg.Update(1, u'Tableau...')
524         #tab = corpus.make_table_with_classe(uces, self.la)
525         pathout = ConstructPathOut(self.Source.pathout.dirout+'/', 'simi_classe_%i' %self.cl)
526         self.filename = os.path.join(pathout,'mat01.csv')
527         dlg.Update(2, u'Ecriture...')
528         #corpus.write_tab(tab, self.filename)
529         #del tab
530         corpus.make_and_write_sparse_matrix_from_classe(self.la, uces, self.filename)
531         dlg.Destroy()
532         paramsimi = {'coeff' : 0,
533                           'layout' : 2,
534                           'type' : 1,
535                           'arbremax' : 1,
536                           'coeff_tv' : 1,
537                           'coeff_tv_nb' : 0,
538                           'tvprop' : 0,
539                           'tvmin' : 5,
540                           'tvmax' : 30,
541                           'coeff_te' : 1,
542                           'coeff_temin' : 1,
543                           'coeff_temax' : 10,
544                           'label_v': 1,
545                           'label_e': 0,
546                           'vcex' : 0,
547                           'vcexmin' : 10,
548                           'vcexmax' : 25,
549                           'cex' : 10,
550                           'cexfromchi' : True,
551                           'sfromchi': False,
552                           'seuil_ok' : 0,
553                           'seuil' : 1,
554                           'cols' : (255,0,0),
555                           'cola' : (200,200,200),
556                           'width' : 1000,
557                           'height' : 1000,
558                           'first' : True,
559                           'keep_coord' : True,
560                           'alpha' : 20,
561                           'film': False,
562                           }
563         self.tableau = Tableau(self.parent, '')
564         self.tableau.listactives = self.la
565         self.tableau.actives = {}
566         self.tableau.lchi = self.lchi
567         self.tableau.chi = {}
568         self.tableau.parametre['fromprof'] = True
569         for i, val in enumerate(self.la) :
570             self.tableau.actives[val] = [self.lfreq[i]]
571             self.tableau.chi[val] = [self.lchi[i]]
572         DoSimi(self, param = paramsimi, fromprof = ffr(self.filename), pathout = pathout)
573
574     def on_segments(self,evt) :
575         dlg = progressbar(self, 2)
576         corpus = self.Source.corpus
577         uces = corpus.lc[self.cl-1]
578         l = []
579         dlg.Update(1, u'Segments...')
580         for i in range(2,10) :
581             li = corpus.find_segments_in_classe(uces, i, 1000)
582             if li == [] :
583                 break
584             else :
585                 l += li
586         l.sort(reverse = True)
587         d = {}
588         dlg.Update(2, 'Tri...')
589         for i, line in enumerate(l) :
590             d[i] = [line[1],line[0], line[2]]
591         first = ['','','']
592         para={'dico': d,'fline':first}
593         dlg.Destroy()
594         win = wliste(self, -1, u"Segments répétés - Classe %i" % self.cl, d, first, size=(600, 500))
595         win.Show(True)
596
597     def on_uce_carac(self,evt) :
598         dial = PrefUCECarac(self, self.parent)
599         dial.CenterOnParent()
600         if dial.ShowModal() == wx.ID_OK :
601             limite = dial.spin_eff.GetValue()
602             atype = dial.radio_type.GetSelection()
603             dlg = progressbar(self,maxi = 4)
604             corpus = self.Source.corpus
605             uces = corpus.lc[self.cl-1]
606             tab = corpus.make_table_with_classe(uces, self.la)
607             tab.pop(0)
608             dlg.Update(2, u'score...')
609             if atype == 0 :
610                 ntab = [round(sum([self.lchi[i] for i, word in enumerate(line) if word == 1]),2) for line in tab]
611             else :
612                 ntab = [round(sum([self.lchi[i] for i, word in enumerate(line) if word == 1])/float(sum(line)),2) if sum(line)!=0 else 0 for line in tab]
613             ntab2 = [[ntab[i], uces[i]] for i, val in enumerate(ntab)]
614             del ntab
615             ntab2.sort(reverse = True)
616             ntab2 = ntab2[:limite]
617             nuces = [val[1] for val in ntab2]
618             dlg.Update(3, u'concordancier...')
619             #ucestxt = [corpus.ucis_paras_uces[val[1][0]][val[1][1]][val[1][2]] for val in ntab2]
620             ucestxt1 = [row for row in corpus.getconcorde(nuces)]
621             ucestxt = []
622             ucis_txt = []
623             for uce in ucestxt1 :
624                 ucetxt = ' '+uce[1]+' '
625                 ucis_txt.append(' '.join(corpus.ucis[corpus.getucefromid(uce[0]).uci].etoiles) + '<br>')
626                 for lem in self.la :
627                     listmot = corpus.getlems()[lem].formes
628                     for id in listmot :
629                         forme = corpus.getforme(id).forme
630                         ucetxt = ucetxt.replace(' '+forme+' ', '<font color=red> ' + forme + ' </font>')
631                 ucestxt.append(ucetxt)        
632             #ucestxt = [corpus.make_concord(self.la, ' '.join(uce), 'red') for uce in ucestxt]
633             dlg.Update(4, u'texte...')
634             #ucis_txt = [' '.join(corpus.ucis[val[1][0]][0]) for val in ntab2]
635             win = message(self, -1, u"UCE caractéristiques - Classe %i" % self.cl, size=(600, 500), style=wx.DEFAULT_FRAME_STYLE)
636             win.html = '<html>\n' + '<br><br>'.join(['<br>'.join([ucis_txt[i], 'score : ' + str(ntab2[i][0]), ucestxt[i]]) for i in range(0,len(ucestxt))]) + '\n</html>'
637             win.HtmlPage.SetPage(win.html)
638             dlg.Destroy()
639             win.Show(True)
640     
641     def on_tablex(self, evt):
642         if 'corpus' in dir(self.Source):
643             corpus = self.Source.corpus
644         else :
645             corpus = self.Source.tableau
646         with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
647             chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
648         title = chistable[0]
649         title.pop(0)
650         chistable.pop(0)
651         vchistable = [line[1:] for line in chistable]
652         fchistable = [line[0] for line in chistable]
653         words = [self.getColumnText(self.GetFirstSelected(), 6)]
654         tableout = [vchistable[fchistable.index(words[0])]]
655         last = self.GetFirstSelected()
656         while self.GetNextSelected(last) != -1:
657             last = self.GetNextSelected(last)
658             word = self.getColumnText(last, 6)
659             words.append(word)
660             tableout.append(vchistable[fchistable.index(word)])
661         tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
662         nbcl = len(title)
663         txt = barplot(tableout, words, title, self.Source.parent.RscriptsPath['Rgraph'], tmpgraph)
664         tmpscript = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
665         file = open(tmpscript,'w')
666         file.write(txt)
667         file.close()
668         
669         exec_rcode(self.Source.parent.RPath, tmpscript, wait = True)
670         win = MessageImage(self, -1, u"Graphique", size=(700, 500),style = wx.DEFAULT_FRAME_STYLE)
671         win.addsaveimage(tmpgraph)
672         txt = "<img src='%s'>" % tmpgraph
673         win.HtmlPage.SetPage(txt)
674         win.Show(True)
675
676     def onlexdendro(self, evt):
677         if 'corpus' in dir(self.Source):
678             corpus = self.Source.corpus
679         else :
680             corpus = self.Source.tableau
681         with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
682             chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
683         title = chistable[0]
684         title.pop(0)
685         chistable.pop(0)
686         vchistable = [line[1:] for line in chistable]
687         fchistable = [line[0] for line in chistable]
688         words = [self.getColumnText(self.GetFirstSelected(), 6)]
689         tableout = [vchistable[fchistable.index(words[0])]]
690         last = self.GetFirstSelected()
691         while self.GetNextSelected(last) != -1:
692             last = self.GetNextSelected(last)
693             word = self.getColumnText(last, 6)
694             words.append(word)
695             tableout.append(vchistable[fchistable.index(word)])
696         tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
697         txttable = 'c(' + ','.join([','.join(line) for line in tableout]) + ')'
698         rownames = 'c("' + '","'.join(words) + '")'
699         colnames = 'c("' + '","'.join(title) + '")'
700         nbcl = len(title)
701         rownb = len(words)
702         txt = """
703         load("%s")
704         di <- matrix(data=%s, nrow=%i, byrow = TRUE)
705         rownames(di)<- %s
706         colnames(di) <- %s
707         library(ape)
708         source("%s")
709         height <- (30*ncol(di)) + (15*nrow(di))
710         height <- ifelse(height <= 400, 400, height)
711         width <- 500
712         open_file_graph("%s", width=width, height=height)
713         plot.dendro.lex(tree.cut1$tree.cl, di)
714         """ % (self.Source.pathout['Rdendro'], txttable, rownb, rownames, colnames, self.Source.parent.RscriptsPath['Rgraph'], ffr(tmpgraph))
715         tmpscript = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
716         file = open(tmpscript,'w')
717         file.write(txt)
718         file.close()
719         exec_rcode(self.Source.parent.RPath, tmpscript, wait = True)
720         win = MessageImage(self, -1, u"Graphique", size=(700, 500),style = wx.DEFAULT_FRAME_STYLE)
721         win.addsaveimage(tmpgraph)
722         txt = "<img src='%s'>" % tmpgraph
723         win.HtmlPage.SetPage(txt)
724         win.Show(True)
725
726
727     def make_concord(self, uces, title, color = 'red') :
728         corpus = self.Source.corpus
729         ListWord = [self.getColumnText(self.GetFirstSelected(), 6)]
730         last = self.GetFirstSelected()
731         while self.GetNextSelected(last) != -1:
732             last = self.GetNextSelected(last)
733             ListWord.append(self.getColumnText(last, 6))
734         listmot = [forme for item in ListWord for forme in corpus.getlems()[item].formes]
735         win = message(self, -1, title, size=(600, 500), style=wx.DEFAULT_FRAME_STYLE)
736         toshow = ['<html>\n<H1>Concordancier</H1>\n']
737         toshow.append('<h3><font color=%s>' % color + ' '.join(ListWord) + '</font></h3><br>')
738         duce = {}
739         ucef = []
740         for word in ListWord : 
741             ucef += list(set(corpus.getlemuces(word)).intersection(uces))
742         ucef = list(set(ucef))
743         ucef.sort()
744         res = corpus.getconcorde(ucef)
745         txt = '<br>'.join(toshow) +'<br><br>'
746         for uce in res :
747             ucetxt = ' '+uce[1]+' '
748             txt += ' '.join(corpus.ucis[corpus.getucefromid(uce[0]).uci].etoiles) + '<br>'
749             for forme in listmot:
750                 forme = corpus.getforme(forme).forme
751                 ucetxt = ucetxt.replace(' '+forme+' ', '<font color=red> ' + forme + ' </font>')
752             txt += ucetxt + '<br><br>'
753         win.HtmlPage.SetPage(txt)
754         return win
755
756     def OnPopupTwo(self, event):
757         corpus = self.Source.corpus
758         uces = corpus.lc[self.cl-1]
759         win = self.make_concord(uces, "Concordancier - Classe %i" % self.cl)
760         win.Show(True)
761     
762     def OnPopupThree(self, event):
763         corpus = self.Source.corpus
764         uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))]
765         win = self.make_concord(uces, "Concordancier - UCE classées")
766         win.Show(True)
767         
768     def OnPopupFour(self, event):
769         corpus = self.Source.corpus
770         uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))] + corpus.lc0
771         win = self.make_concord(uces, "Concordancier - Toutes les UCE")
772         win.Show(True)
773
774     def OnPopupFive(self, event):
775         word = self.getColumnText(self.GetFirstSelected(), 6)
776         lk = "http://www.cnrtl.fr/definition/" + word
777         webbrowser.open(lk)
778
779     def OnPopupSix(self, event):  
780         word = self.getColumnText(self.GetFirstSelected(), 6)
781         lk = "http://www.cnrtl.fr/etymologie/" + word
782         webbrowser.open(lk)
783         
784     def OnPopupSeven(self, event):        
785         word = self.getColumnText(self.GetFirstSelected(), 6)
786         lk = "http://www.cnrtl.fr/synonymie/" + word
787         webbrowser.open(lk)
788         
789     def OnPopupHeight(self, event):  
790         word = self.getColumnText(self.GetFirstSelected(), 6)
791         lk = "http://www.cnrtl.fr/antonymie/" + word
792         webbrowser.open(lk)
793         
794     def OnPopupNine(self, event):            
795         word = self.getColumnText(self.GetFirstSelected(), 6)
796         lk = "http://www.cnrtl.fr/morphologie/" + word
797         webbrowser.open(lk)
798
799     def onproxe(self, evt) :
800         word = self.getColumnText(self.GetFirstSelected(), 6)
801         lk = "http://www.cnrtl.fr/proxemie/" + word
802         webbrowser.open(lk)
803 #
804
805 #---------------------------------------------------------------------------
806 #class ProfListctrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):
807 #    def __init__(self, parent, ID, pos=wx.DefaultPosition,
808 #                 size=wx.DefaultSize, style=0):
809 #        wx.ListCtrl.__init__(self, parent, ID, pos, size, style)
810 #        listmix.ListCtrlAutoWidthMixin.__init__(self)
811 #
812 #
813 #class ProfListctrlPanel(wx.Panel, listmix.ColumnSorterMixin):
814 #    def __init__(self, parent, gparent, ProfClasse, Alceste=False, cl=0):
815 #        self.parent = parent
816 #        classe = ProfClasse
817 #        self.cl = cl
818 #        self.Source = gparent
819 #        if 'tableau' in dir(self.Source):
820 #            self.tableau = self.Source.tableau
821 #        self.Alceste = Alceste
822 #        self.var_mod = {}
823 #        
824 #
825 #        wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS)
826 #        
827 #        search_id = wx.NewId()
828 #        searchall_id = wx.NewId()
829 #        self.parent.Bind(wx.EVT_MENU, self.onsearch, id = search_id)
830 #        self.parent.Bind(wx.EVT_MENU, self.onsearchall, id = searchall_id)
831 #        self.accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('F'), search_id),
832 #                                              (wx.ACCEL_CTRL|wx.ACCEL_SHIFT, ord('F'), searchall_id)])
833 #        self.SetAcceleratorTable(self.accel_tbl)
834 #       
835 #        self.il = wx.ImageList(16, 16)
836 ##        self.idx1 = self.il.Add(images.getSmilesBitmap())
837 #        self.sm_up = self.il.Add(getSmallUpArrowBitmap())
838 #        self.sm_dn = self.il.Add(getSmallDnArrowBitmap())
839 #        tID = wx.NewId()
840 #
841 #        self.list = ProfListctrl(self, tID,
842 #                                 style=wx.LC_REPORT 
843 #                                 | wx.BORDER_NONE
844 #                                 | wx.LC_EDIT_LABELS
845 #                                 | wx.LC_SORT_ASCENDING
846 #                                 )
847 #        line1 = classe.pop(0)
848 #        limit = 0
849 #        limitsup = 0
850 #        i = 0
851 #        dictdata = {}
852 #        classen = [line for line in classe if line[0] != '*' and line[0] != '*****']
853 #        if len(classen) == 0 :
854 #            lenact = 0
855 #            lensup = 0
856 #            lenet = 0
857 #        else :
858 #            lenact = [i for i,b in enumerate(classe) if b[0] == '*****']
859 #            if lenact == [] :
860 #                lensup = 0
861 #                lenact = [i for i,b in enumerate(classe) if b[0] == '*']
862 #                if lenact == [] :
863 #                    lenact = len(classen)
864 #                    lenet = 0
865 #                else :
866 #                    lenact = 0
867 #                    lenet = len(classen)
868 #            else :
869 #                lenact = lenact[0]
870 #                lensup = [i for i,b in enumerate(classe[1:]) if b[0] == '*']
871 #                if lensup != [] :
872 #                   lensup = lensup[0] - lenact
873 #                   lenet = len(classen) - lensup
874 #                else :
875 #                   lensup == 0
876 #                   lenet = len(classen)
877 #        debsup = lenact
878 #                
879 #        self.lenact = lenact
880 #
881 #        debet = lenact + lensup
882 #        dictdata = dict(zip([i for i in range(0,len(classen))], classen))
883 #        self.list.SetImageList(self.il, wx.IMAGE_LIST_SMALL)
884 #        
885 #        self.PopulateList(dictdata, debet, debsup, Alceste)
886 #
887 #        self.Bind(wx.EVT_SIZE, self.OnSize)
888 #        self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick)
889 #        self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list)
890 #
891 #        # for wxMSW
892 #        self.list.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightClick)
893 #
894 #        # for wxGTK
895 #        self.list.Bind(wx.EVT_RIGHT_UP, self.OnRightClick)
896 #        self.itemDataMap = dictdata
897 #        listmix.ColumnSorterMixin.__init__(self, 8)
898 #        self.do_greyline()
899 ##-----------------------------------------------------------------------------------------    
900 #
901 #    def PopulateList(self, dictdata, limit, limitsup, Alceste):
902 #        
903 #        
904 #            # for normal, simple columns, you can add them like this:
905 #        self.list.InsertColumn(0, "num", wx.LIST_FORMAT_RIGHT)
906 #        self.list.InsertColumn(1, "eff. uce", wx.LIST_FORMAT_RIGHT)
907 #        self.list.InsertColumn(2, "eff. total", wx.LIST_FORMAT_RIGHT)
908 #        self.list.InsertColumn(3, "pourcentage", wx.LIST_FORMAT_RIGHT)
909 #        self.list.InsertColumn(4, "chi2", wx.LIST_FORMAT_RIGHT)
910 #        self.list.InsertColumn(5, "Type", wx.LIST_FORMAT_RIGHT)
911 #        self.list.InsertColumn(6, "forme", wx.LIST_FORMAT_RIGHT)
912 #        self.list.InsertColumn(7, "p", wx.LIST_FORMAT_RIGHT)
913 #        
914 #        for key in dictdata : #.iteritems():
915 #                index = self.list.InsertStringItem(sys.maxint, '%4i' % key)
916 #                i = 1
917 #                for val in dictdata[key][1:]:
918 #                    self.list.SetStringItem(index, i, str(dictdata[key][i]))
919 #                    i += 1
920 #                self.list.SetItemData(index, key)
921 #
922 #        self.list.SetColumnWidth(0, 60)
923 #        self.list.SetColumnWidth(1, 70)
924 #        self.list.SetColumnWidth(2, 80)
925 #        self.list.SetColumnWidth(3, 100)
926 #        self.list.SetColumnWidth(4, 70)
927 #        self.list.SetColumnWidth(5, wx.LIST_AUTOSIZE)
928 #        self.list.SetColumnWidth(6, wx.LIST_AUTOSIZE)
929 #        self.list.SetColumnWidth(7, wx.LIST_AUTOSIZE)
930 #
931 #        # show how to change the colour of a couple items
932 #        for i in range(limitsup, limit):
933 #            item = self.list.GetItem(i)
934 #            item.SetTextColour(wx.RED) 
935 #            self.list.SetItem(item)
936 #        
937 #        for i in range(limit, len(dictdata)):
938 #            item = self.list.GetItem(i)
939 #            item.SetTextColour(wx.BLUE)
940 #            self.list.SetItem(item)          
941 #        
942 #        if self.lenact != 0 :
943 #            self.la = [self.getColumnText(i,6) for i in range(0, self.lenact)]
944 #            self.lchi = [float(self.getColumnText(i,4)) for i in range(0, self.lenact)]
945 #            self.lfreq = [int(self.getColumnText(i,1)) for i in range(0, self.lenact)]
946 #        else :
947 #            self.la = []
948 #            self.lchi = []
949 #            self.lfreq = []
950 #
951 #    def do_greyline(self):
952 #        for row in xrange(self.list.GetItemCount()):
953 #            if row % 2 :
954 #                self.list.SetItemBackgroundColour(row, (230, 230, 230))
955 #            else :
956 #                self.list.SetItemBackgroundColour(row, wx.WHITE)
957 #
958 #
959 #    # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
960 #    def GetListCtrl(self):
961 #        return self.list
962 #
963 #    # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
964 #    def GetSortImages(self):
965 #        return (self.sm_dn, self.sm_up)
966 #
967 #
968 #    def OnRightDown(self, event):
969 #        x = event.GetX()
970 #        y = event.GetY()
971 #        item, flags = self.list.HitTest((x, y))
972 #
973 #        if flags & wx.LIST_HITTEST_ONITEM:
974 #            self.list.Select(item)
975 #
976 #        event.Skip()
977 #
978 #
979 #    def getColumnText(self, index, col):
980 #        item = self.list.GetItem(index, col)
981 #        return item.GetText()
982 #
983 #
984 #    def OnItemSelected(self, event):
985 #        self.currentItem = event.m_itemIndex
986 #        event.Skip()
987 #
988 #    def onsearch(self, evt) :
989 #        self.dial = SearchDial(self, self, 6, True)
990 #        self.dial.CenterOnParent()
991 #        self.dial.ShowModal()
992 #        self.dial.Destroy()
993 #
994 #    def onsearchall(self, evt) :
995 #        if 'FrameSearch' not in dir(self.Source) :
996 #            self.Source.FrameSearch = SearchFrame(self.parent, -1, u"Rechercher...", self.Source.corpus)
997 #        self.dial = SearchDial(self, self.Source.FrameSearch.liste, 1, False)
998 #        self.dial.CenterOnParent()
999 #        self.dial.ShowModal()
1000 #        self.dial.Destroy()
1001 #
1002 #    def OnRightClick(self, event):
1003 #
1004 #        # only do this part the first time so the events are only bound once
1005 #        if self.Alceste:
1006 #            if not hasattr(self, "popupID1"):
1007 #                self.popupID1 = wx.NewId()
1008 #                self.popupID2 = wx.NewId()
1009 #                self.popupID3 = wx.NewId()
1010 #                self.popupID4 = wx.NewId()
1011 #                self.popupID5 = wx.NewId()
1012 #                self.popupID6 = wx.NewId()
1013 #                self.popupID7 = wx.NewId()
1014 #                self.popupID8 = wx.NewId()
1015 #                self.popupID9 = wx.NewId()
1016 #                #self.popupID10 = wx.NewId()
1017 #                self.popupIDgraph = wx.NewId()
1018 #                self.idseg = wx.NewId()
1019 #                self.iducecarac = wx.NewId()
1020 #                self.idtablex = wx.NewId()
1021 #                self.idchimod = wx.NewId()
1022 #                self.idwordgraph = wx.NewId()
1023 #                self.popup_proxe = wx.NewId()
1024 #                self.idlexdendro = wx.NewId()
1025 #                self.idexport = wx.NewId()
1026 #            #    self.export_classes = wx.NewId()
1027 #   
1028 #                self.Bind(wx.EVT_MENU, self.OnPopupOne, id=self.popupID1)
1029 #                self.Bind(wx.EVT_MENU, self.OnPopupTwo, id=self.popupID2)
1030 #                self.Bind(wx.EVT_MENU, self.OnPopupThree, id=self.popupID3)
1031 #                self.Bind(wx.EVT_MENU, self.OnPopupFour, id=self.popupID4)
1032 #                self.Bind(wx.EVT_MENU, self.OnPopupFive, id=self.popupID5)
1033 #                self.Bind(wx.EVT_MENU, self.OnPopupSix, id=self.popupID6)
1034 #                self.Bind(wx.EVT_MENU, self.OnPopupSeven, id=self.popupID7)
1035 #                self.Bind(wx.EVT_MENU, self.OnPopupHeight, id=self.popupID8)
1036 #                self.Bind(wx.EVT_MENU, self.OnPopupNine, id=self.popupID9)
1037 #                #self.Bind(wx.EVT_MENU, self.OnPopupSpec, id=self.popupID10)
1038 #                self.Bind(wx.EVT_MENU, self.on_graph, id=self.popupIDgraph)
1039 #                self.Bind(wx.EVT_MENU, self.on_segments, id=self.idseg)
1040 #                self.Bind(wx.EVT_MENU, self.on_uce_carac, id = self.iducecarac)
1041 #                self.Bind(wx.EVT_MENU, self.on_tablex, id = self.idtablex)
1042 #                self.Bind(wx.EVT_MENU, self.quest_var_mod, id = self.idchimod)
1043 #                self.Bind(wx.EVT_MENU, self.onwordgraph, id = self.idwordgraph)
1044 #                self.Bind(wx.EVT_MENU, self.onproxe, id = self.popup_proxe)
1045 #                self.Bind(wx.EVT_MENU, self.onlexdendro, id = self.idlexdendro)
1046 #                self.Bind(wx.EVT_MENU, self.onexport, id = self.idexport)
1047 #              #  self.Bind(wx.EVT_MENU, self.on_export_classes, id = self.export_classes)
1048 #    #            self.Bind(wx.EVT_MENU, self.OnPopupThree, id=self.popupID3)
1049 #    
1050 #            # make a menu
1051 #            menu = wx.Menu()
1052 #            menu.Append(self.popupID1, u"Formes associées")
1053 #            menu.Append(self.idtablex, u"Chi2 par classe")
1054 #            menu.Append(self.idlexdendro, u"Chi2 par classe + dendro")
1055 #            menu.Append(self.idchimod, u"Chi2 modalités de la variable")
1056 #            menu.Append(self.idwordgraph, u"Graphe du mot")
1057 #            #menu.Append(self.export_classes, u"Exporter le corpus...") 
1058 #            
1059 #            #menu.Append(self.popupID10, u"Spécificités")
1060 #
1061 #            menu_conc = wx.Menu()
1062 #            menu_conc.Append(self.popupID2, u"dans les uce de la classe")
1063 #            menu_conc.Append(self.popupID3, u"dans les uce classées")
1064 #            menu_conc.Append(self.popupID4, u"dans toutes les uce")
1065 #            menu.AppendMenu(-1, u"Concordancier", menu_conc) 
1066 #            menu_cnrtl = wx.Menu()      
1067 #            menu_cnrtl.Append(self.popupID5, u"Définition")
1068 #            menu_cnrtl.Append(self.popupID6, u"Etymologie")
1069 #            menu_cnrtl.Append(self.popupID7, u"Synonymie")
1070 #            menu_cnrtl.Append(self.popupID8, u"Antonymie")
1071 #            menu_cnrtl.Append(self.popupID9, u"Morphologie")
1072 #            menu_cnrtl.Append(self.popup_proxe, u"Proxémie")
1073 #            menu.AppendMenu(-1, u"Outils du CNRTL", menu_cnrtl)
1074 #            menu.AppendSeparator()
1075 #            menu.Append(self.popupIDgraph, u"Graphe de la classe")
1076 #            menu.Append(self.idseg, u"Segments répétés")
1077 #            menu.Append(self.iducecarac, u"UCE caractéristiques")
1078 #            menu.Append(self.idexport, 'Partitionner...')
1079 #            #menu.Append(self.popupID2, u"Concordancier")
1080 #    #        menu.Append(self.popupID3, "recharger")
1081 #    
1082 #            self.PopupMenu(menu)
1083 #            menu.Destroy()
1084 #        elif 'tableau' in dir(self.Source) :
1085 #            if not hasattr(self, "pop1"):
1086 #                self.pop1 = wx.NewId()
1087 #                self.pop2 = wx.NewId()
1088 #                self.pop3 = wx.NewId()
1089 #                self.Bind(wx.EVT_MENU, self.quest_simi, id=self.pop1)
1090 #                self.Bind(wx.EVT_MENU, self.on_tablex, id=self.pop2)
1091 #                self.Bind(wx.EVT_MENU, self.quest_var_mod, id=self.pop3)
1092 #
1093 #            menu = wx.Menu()
1094 #            menu.Append(self.pop2, u"Chi2 par classe")
1095 #            menu.Append(self.pop3, u"Chi2 modalités de la variable")
1096 #            menu.AppendSeparator()
1097 #            menu.Append(self.pop1, u"Graph de la classe")
1098 #            self.PopupMenu(menu)
1099 #            menu.Destroy()
1100 #
1101 #    def onexport(self, evt) :
1102 #        if 'corpus' in dir(self.Source):
1103 #            corpus = self.Source.corpus
1104 #        ClasseCHD(self.parent, corpus, self.cl)
1105 #
1106 #    def quest_var_mod(self, evt) :
1107 #        if 'corpus' in dir(self.Source):
1108 #            corpus = self.Source.corpus
1109 #            if self.var_mod == {} :
1110 #                self.var_mod = treat_var_mod([val for val in corpus.make_etoiles()])
1111 #        else :
1112 #            corpus = self.Source.tableau
1113 #            if self.var_mod == {} :
1114 #                self.var_mod = treat_var_mod([val for val in corpus.actives] + [val for val in corpus.sups])
1115 #        with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
1116 #            chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
1117 #        title = chistable[0]
1118 #        title.pop(0)
1119 #        chistable.pop(0)
1120 #        vchistable = [line[1:] for line in chistable]
1121 #        fchistable = [line[0] for line in chistable]
1122 #        word = self.getColumnText(self.list.GetFirstSelected(), 6)
1123 #        if len(word.split('_')) > 1 :
1124 #            var = word.split('_')[0]
1125 #            words = [word for word in self.var_mod[var]]
1126 #            words.sort()
1127 #            tableout = []
1128 #            kwords = []
1129 #            for word in words :
1130 #                if word in fchistable :
1131 #                    tableout.append(vchistable[fchistable.index(word)])
1132 #                    kwords.append(word)
1133 #            tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
1134 #            txt = barplot(tableout, kwords, title, self.Source.parent.RscriptsPath['Rgraph'], tmpgraph)
1135 #            tmpscript = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
1136 #            file = open(tmpscript,'w')
1137 #            file.write(txt)
1138 #            file.close()
1139 #            exec_rcode(self.Source.parent.RPath, tmpscript, wait = True)
1140 #            win = MessageImage(self, -1, u"Graphique", size=(700, 500),style = wx.DEFAULT_FRAME_STYLE)
1141 #            win.addsaveimage(tmpgraph)
1142 #            txt = "<img src='%s'>" % tmpgraph
1143 #            win.HtmlPage.SetPage(txt)
1144 #            win.Show(True)
1145 #        else :
1146 #            dial = wx.MessageDialog(self, u"Ce n'est pas une forme du type variable_modalité", u"Problème", wx.OK | wx.ICON_WARNING)
1147 #            dial.CenterOnParent()
1148 #            dial.ShowModal()
1149 #            dial.Destroy()
1150 #
1151 #    def quest_simi(self, evt) :
1152 #        tableau = self.Source.tableau
1153 #        tab = tableau.make_table_from_classe(self.cl, self.la)
1154 #        pathout = ConstructPathOut(self.Source.pathout+'/', 'simi_classe_%i' %self.cl)
1155 #        self.filename = os.path.join(pathout,'mat01.csv')
1156 #        tableau.printtable(self.filename, tab)
1157 #        del tab
1158 #        paramsimi = {'coeff' : 0,
1159 #                          'layout' : 2,
1160 #                          'type' : 1,
1161 #                          'arbremax' : 1,
1162 #                          'coeff_tv' : 1,
1163 #                          'coeff_tv_nb' : 0,
1164 #                          'tvprop' : 0,
1165 #                          'tvmin' : 5,
1166 #                          'tvmax' : 30,
1167 #                          'coeff_te' : 1,
1168 #                          'coeff_temin' : 1,
1169 #                          'coeff_temax' : 10,
1170 #                          'label_v': 1,
1171 #                          'label_e': 1,
1172 #                          'vcex' : 0,
1173 #                          'vcexmin' : 10,
1174 #                          'vcexmax' : 25,
1175 #                          'cex' : 10,
1176 #                          'cexfromchi' : True,
1177 #                          'sfromchi': False,
1178 #                          'seuil_ok' : 0,
1179 #                          'seuil' : 1,
1180 #                          'cols' : (255,0,0),
1181 #                          'cola' : (200,200,200),
1182 #                          'width' : 1000,
1183 #                          'height' : 1000,
1184 #                          'first' : True,
1185 #                          'keep_coord' : True,
1186 #                          'alpha' : 20,
1187 #                          'film': False,
1188 #                          }
1189 ##        self.tableau.actives = {}
1190 ##        self.tableau.lchi = self.lchi
1191 ##        self.tableau.chi = {}
1192 ##        for i, val in enumerate(self.la) :
1193 ##            self.tableau.actives[val] = [self.lfreq[i]]
1194 ##            self.tableau.chi[val] = [self.lchi[i]]
1195 #                          
1196 #        act = {}
1197 #        self.tableau.chi = {}
1198 #        self.tableau.lchi = self.lchi
1199 #        self.tableau.parametre['fromprof'] = True
1200 #        for i, val in enumerate(self.la) :
1201 #            act[val] = [self.lfreq[i]]
1202 #            self.tableau.chi[val] = [self.lchi[i]]
1203 #        DoSimi(self, param = paramsimi, fromprof = ffr(self.filename), pathout = pathout, listactives = self.la, actives = act)
1204 #
1205 #    def onwordgraph(self, evt):
1206 #        word = self.getColumnText(self.list.GetFirstSelected(), 6)
1207 #        dlg = progressbar(self, 2)
1208 #        corpus = self.Source.corpus
1209 #        uces = corpus.lc[self.cl-1]
1210 #        dlg.Update(1, u'Tableau...')
1211 #        #tab = corpus.make_table_with_classe(uces, self.la)
1212 #        pathout = ConstructPathOut(self.Source.pathout.dirout + '/' , 'simi_%s' % word)
1213 #        self.filename = os.path.join(pathout,'mat01.csv')
1214 #        dlg.Update(2, u'Ecriture...')
1215 #        #corpus.write_tab(tab, self.filename)
1216 #        #del tab
1217 #        corpus.make_and_write_sparse_matrix_from_classe(self.la, uces, self.filename)
1218 #        dlg.Destroy()
1219 #        paramsimi = {'coeff' : 0,
1220 #                          'layout' : 2,
1221 #                          'type' : 1,
1222 #                          'arbremax' : 0,
1223 #                          'coeff_tv' : 1,
1224 #                          'coeff_tv_nb' : 0,
1225 #                          'tvprop' : 0,
1226 #                          'tvmin' : 5,
1227 #                          'tvmax' : 30,
1228 #                          'coeff_te' : 1,
1229 #                          'coeff_temin' : 1,
1230 #                          'coeff_temax' : 10,
1231 #                          'label_v': 1,
1232 #                          'label_e': 0,
1233 #                          'vcex' : 1,
1234 #                          'vcexmin' : 10,
1235 #                          'vcexmax' : 25, 
1236 #                          'cex' : 10,
1237 #                          'seuil_ok' : 1,
1238 #                          'seuil' : 1,
1239 #                          'cols' : (255,0,0),
1240 #                          'cola' : (200,200,200),
1241 #                          'width' : 600,
1242 #                          'height' : 600,
1243 #                          'first' : True,
1244 #                          'keep_coord' : True,
1245 #                          'alpha' : 20,
1246 #                          'film': False,
1247 #                          }
1248 #        self.tableau = Tableau(self.parent, '')
1249 #        self.tableau.listactives = self.la
1250 #        self.tableau.actives = {}
1251 #        for i, val in enumerate(self.la) :
1252 #            self.tableau.actives[val] = [self.lfreq[i]]
1253 #        DoSimi(self, param = paramsimi, fromprof = ffr(self.filename), pathout = pathout, wordgraph = word)
1254 #
1255 #
1256     def OnPopupOne(self, event):
1257         corpus = self.Source.corpus
1258         #print 'ATTENTION PRINT ET TABLE'
1259         #corpus.make_et_table()
1260         word = self.getColumnText(self.GetFirstSelected(), 6)
1261         lems = corpus.getlems()
1262         uces = corpus.lc[self.cl-1]
1263         rep = []
1264         #FIXME : donner aussi eff reel a la place de nb uce
1265         for forme in lems[word].formes :
1266             ucef = list(set(corpus.getworduces(forme)).intersection(uces))
1267             #ucef = [uce for uce in corpus.formes[forme][1] if uce in uces]
1268             if ucef != [] :
1269                 nb = len(ucef)
1270                 rep.append([corpus.getforme(forme).forme, nb])
1271         win = message(self, -1, u"Formes associées", size=(300, 200), style=wx.DEFAULT_FRAME_STYLE)
1272         win.html = '<html>\n' + '<br>'.join([' : '.join([str(val) for val in forme]) for forme in rep]) + '\n</html>'
1273         win.HtmlPage.SetPage(win.html)
1274         win.Show(True)
1275 #
1276 #    def on_graph(self, evt):
1277 #        dlg = progressbar(self, 2)
1278 #        corpus = self.Source.corpus
1279 #        uces = corpus.lc[self.cl-1]
1280 #        dlg.Update(1, u'Tableau...')
1281 #        #tab = corpus.make_table_with_classe(uces, self.la)
1282 #        pathout = ConstructPathOut(self.Source.pathout.dirout+'/', 'simi_classe_%i' %self.cl)
1283 #        self.filename = os.path.join(pathout,'mat01.csv')
1284 #        dlg.Update(2, u'Ecriture...')
1285 #        #corpus.write_tab(tab, self.filename)
1286 #        #del tab
1287 #        corpus.make_and_write_sparse_matrix_from_classe(self.la, uces, self.filename)
1288 #        dlg.Destroy()
1289 #        paramsimi = {'coeff' : 0,
1290 #                          'layout' : 2,
1291 #                          'type' : 1,
1292 #                          'arbremax' : 1,
1293 #                          'coeff_tv' : 1,
1294 #                          'coeff_tv_nb' : 0,
1295 #                          'tvprop' : 0,
1296 #                          'tvmin' : 5,
1297 #                          'tvmax' : 30,
1298 #                          'coeff_te' : 1,
1299 #                          'coeff_temin' : 1,
1300 #                          'coeff_temax' : 10,
1301 #                          'label_v': 1,
1302 #                          'label_e': 0,
1303 #                          'vcex' : 0,
1304 #                          'vcexmin' : 10,
1305 #                          'vcexmax' : 25,
1306 #                          'cex' : 10,
1307 #                          'cexfromchi' : True,
1308 #                          'sfromchi': False,
1309 #                          'seuil_ok' : 0,
1310 #                          'seuil' : 1,
1311 #                          'cols' : (255,0,0),
1312 #                          'cola' : (200,200,200),
1313 #                          'width' : 1000,
1314 #                          'height' : 1000,
1315 #                          'first' : True,
1316 #                          'keep_coord' : True,
1317 #                          'alpha' : 20,
1318 #                          'film': False,
1319 #                          }
1320 #        self.tableau = Tableau(self.parent, '')
1321 #        self.tableau.listactives = self.la
1322 #        self.tableau.actives = {}
1323 #        self.tableau.lchi = self.lchi
1324 #        self.tableau.chi = {}
1325 #        self.tableau.parametre['fromprof'] = True
1326 #        for i, val in enumerate(self.la) :
1327 #            self.tableau.actives[val] = [self.lfreq[i]]
1328 #            self.tableau.chi[val] = [self.lchi[i]]
1329 #        DoSimi(self, param = paramsimi, fromprof = ffr(self.filename), pathout = pathout)
1330 #
1331 #    def on_segments(self,evt) :
1332 #        dlg = progressbar(self, 2)
1333 #        corpus = self.Source.corpus
1334 #        uces = corpus.lc[self.cl-1]
1335 #        l = []
1336 #        dlg.Update(1, u'Segments...')
1337 #        for i in range(2,10) :
1338 #            li = corpus.find_segments_in_classe(uces, i, 1000)
1339 #            if li == [] :
1340 #                break
1341 #            else :
1342 #                l += li
1343 #        l.sort(reverse = True)
1344 #        d = {}
1345 #        dlg.Update(2, 'Tri...')
1346 #        for i, line in enumerate(l) :
1347 #            d[i] = [line[1],line[0], line[2]]
1348 #        first = ['','','']
1349 #        para={'dico': d,'fline':first}
1350 #        dlg.Destroy()
1351 #        win = wliste(self, -1, u"Segments répétés - Classe %i" % self.cl, d, first, size=(600, 500))
1352 #        win.Show(True)
1353 #
1354 #    def on_uce_carac(self,evt) :
1355 #        dial = PrefUCECarac(self, self.parent)
1356 #        dial.CenterOnParent()
1357 #        if dial.ShowModal() == wx.ID_OK :
1358 #            limite = dial.spin_eff.GetValue()
1359 #            atype = dial.radio_type.GetSelection()
1360 #            dlg = progressbar(self,maxi = 4)
1361 #            corpus = self.Source.corpus
1362 #            uces = corpus.lc[self.cl-1]
1363 #            tab = corpus.make_table_with_classe(uces, self.la)
1364 #            tab.pop(0)
1365 #            dlg.Update(2, u'score...')
1366 #            if atype == 0 :
1367 #                ntab = [round(sum([self.lchi[i] for i, word in enumerate(line) if word == 1]),2) for line in tab]
1368 #            else :
1369 #                ntab = [round(sum([self.lchi[i] for i, word in enumerate(line) if word == 1])/float(sum(line)),2) if sum(line)!=0 else 0 for line in tab]
1370 #            ntab2 = [[ntab[i], uces[i]] for i, val in enumerate(ntab)]
1371 #            del ntab
1372 #            ntab2.sort(reverse = True)
1373 #            ntab2 = ntab2[:limite]
1374 #            nuces = [val[1] for val in ntab2]
1375 #            dlg.Update(3, u'concordancier...')
1376 #            #ucestxt = [corpus.ucis_paras_uces[val[1][0]][val[1][1]][val[1][2]] for val in ntab2]
1377 #            ucestxt1 = [row for row in corpus.getconcorde(nuces)]
1378 #            ucestxt = []
1379 #            ucis_txt = []
1380 #            for uce in ucestxt1 :
1381 #                ucetxt = ' '+uce[1]+' '
1382 #                ucis_txt.append(' '.join(corpus.ucis[corpus.getucefromid(uce[0]).uci].etoiles) + '<br>')
1383 #                for lem in self.la :
1384 #                    listmot = corpus.getlems()[lem].formes
1385 #                    for id in listmot :
1386 #                        forme = corpus.getforme(id).forme
1387 #                        ucetxt = ucetxt.replace(' '+forme+' ', '<font color=red> ' + forme + ' </font>')
1388 #                ucestxt.append(ucetxt)        
1389 #            #ucestxt = [corpus.make_concord(self.la, ' '.join(uce), 'red') for uce in ucestxt]
1390 #            dlg.Update(4, u'texte...')
1391 #            #ucis_txt = [' '.join(corpus.ucis[val[1][0]][0]) for val in ntab2]
1392 #            win = message(self, -1, u"UCE caractéristiques - Classe %i" % self.cl, size=(600, 500), style=wx.DEFAULT_FRAME_STYLE)
1393 #            win.html = '<html>\n' + '<br><br>'.join(['<br>'.join([ucis_txt[i], 'score : ' + str(ntab2[i][0]), ucestxt[i]]) for i in range(0,len(ucestxt))]) + '\n</html>'
1394 #            win.HtmlPage.SetPage(win.html)
1395 #            dlg.Destroy()
1396 #            win.Show(True)
1397 #    
1398 #    def on_tablex(self, evt):
1399 #        if 'corpus' in dir(self.Source):
1400 #            corpus = self.Source.corpus
1401 #        else :
1402 #            corpus = self.Source.tableau
1403 #        with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
1404 #            chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
1405 #        title = chistable[0]
1406 #        title.pop(0)
1407 #        chistable.pop(0)
1408 #        vchistable = [line[1:] for line in chistable]
1409 #        fchistable = [line[0] for line in chistable]
1410 #        words = [self.getColumnText(self.list.GetFirstSelected(), 6)]
1411 #        tableout = [vchistable[fchistable.index(words[0])]]
1412 #        last = self.list.GetFirstSelected()
1413 #        while self.list.GetNextSelected(last) != -1:
1414 #            last = self.list.GetNextSelected(last)
1415 #            word = self.getColumnText(last, 6)
1416 #            words.append(word)
1417 #            tableout.append(vchistable[fchistable.index(word)])
1418 #        tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
1419 #        nbcl = len(title)
1420 #        txt = barplot(tableout, words, title, self.Source.parent.RscriptsPath['Rgraph'], tmpgraph)
1421 #        tmpscript = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
1422 #        file = open(tmpscript,'w')
1423 #        file.write(txt)
1424 #        file.close()
1425 #        
1426 #        exec_rcode(self.Source.parent.RPath, tmpscript, wait = True)
1427 #        win = MessageImage(self, -1, u"Graphique", size=(700, 500),style = wx.DEFAULT_FRAME_STYLE)
1428 #        win.addsaveimage(tmpgraph)
1429 #        txt = "<img src='%s'>" % tmpgraph
1430 #        win.HtmlPage.SetPage(txt)
1431 #        win.Show(True)
1432 #
1433 #    def onlexdendro(self, evt):
1434 #        if 'corpus' in dir(self.Source):
1435 #            corpus = self.Source.corpus
1436 #        else :
1437 #            corpus = self.Source.tableau
1438 #        with codecs.open(self.Source.pathout['chisqtable'], 'r', corpus.parametres['syscoding']) as f :
1439 #            chistable = [line.replace('\n','').replace('\r','').replace('"','').replace(',','.').split(';') for line in f]
1440 #        title = chistable[0]
1441 #        title.pop(0)
1442 #        chistable.pop(0)
1443 #        vchistable = [line[1:] for line in chistable]
1444 #        fchistable = [line[0] for line in chistable]
1445 #        words = [self.getColumnText(self.list.GetFirstSelected(), 6)]
1446 #        tableout = [vchistable[fchistable.index(words[0])]]
1447 #        last = self.list.GetFirstSelected()
1448 #        while self.list.GetNextSelected(last) != -1:
1449 #            last = self.list.GetNextSelected(last)
1450 #            word = self.getColumnText(last, 6)
1451 #            words.append(word)
1452 #            tableout.append(vchistable[fchistable.index(word)])
1453 #        tmpgraph = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
1454 #        txttable = 'c(' + ','.join([','.join(line) for line in tableout]) + ')'
1455 #        rownames = 'c("' + '","'.join(words) + '")'
1456 #        colnames = 'c("' + '","'.join(title) + '")'
1457 #        nbcl = len(title)
1458 #        rownb = len(words)
1459 #        txt = """
1460 #        load("%s")
1461 #        di <- matrix(data=%s, nrow=%i, byrow = TRUE)
1462 #        rownames(di)<- %s
1463 #        colnames(di) <- %s
1464 #        library(ape)
1465 #        source("%s")
1466 #        height <- (30*ncol(di)) + (15*nrow(di))
1467 #        height <- ifelse(height <= 400, 400, height)
1468 #        width <- 500
1469 #        open_file_graph("%s", width=width, height=height)
1470 #        plot.dendro.lex(tree.cut1$tree.cl, di)
1471 #        """ % (self.Source.pathout['Rdendro'], txttable, rownb, rownames, colnames, self.Source.parent.RscriptsPath['Rgraph'], ffr(tmpgraph))
1472 #        tmpscript = tempfile.mktemp(dir=self.Source.parent.TEMPDIR)
1473 #        file = open(tmpscript,'w')
1474 #        file.write(txt)
1475 #        file.close()
1476 #        exec_rcode(self.Source.parent.RPath, tmpscript, wait = True)
1477 #        win = MessageImage(self, -1, u"Graphique", size=(700, 500),style = wx.DEFAULT_FRAME_STYLE)
1478 #        win.addsaveimage(tmpgraph)
1479 #        txt = "<img src='%s'>" % tmpgraph
1480 #        win.HtmlPage.SetPage(txt)
1481 #        win.Show(True)
1482 #
1483 #
1484 #    def make_concord(self, uces, title, color = 'red') :
1485 #        corpus = self.Source.corpus
1486 #        ListWord = [self.getColumnText(self.list.GetFirstSelected(), 6)]
1487 #        last = self.list.GetFirstSelected()
1488 #        while self.list.GetNextSelected(last) != -1:
1489 #            last = self.list.GetNextSelected(last)
1490 #            ListWord.append(self.getColumnText(last, 6))
1491 #        listmot = [forme for item in ListWord for forme in corpus.getlems()[item].formes]
1492 #        win = message(self, -1, title, size=(600, 500), style=wx.DEFAULT_FRAME_STYLE)
1493 #        toshow = ['<html>\n<H1>Concordancier</H1>\n']
1494 #        toshow.append('<h3><font color=%s>' % color + ' '.join(ListWord) + '</font></h3><br>')
1495 #        duce = {}
1496 #        ucef = []
1497 #        for word in ListWord : 
1498 #            ucef += list(set(corpus.getlemuces(word)).intersection(uces))
1499 #        ucef = list(set(ucef))
1500 #        ucef.sort()
1501 #        res = corpus.getconcorde(ucef)
1502 #        txt = '<br>'.join(toshow) +'<br><br>'
1503 #        for uce in res :
1504 #            ucetxt = ' '+uce[1]+' '
1505 #            txt += ' '.join(corpus.ucis[corpus.getucefromid(uce[0]).uci].etoiles) + '<br>'
1506 #            for forme in listmot:
1507 #                forme = corpus.getforme(forme).forme
1508 #                ucetxt = ucetxt.replace(' '+forme+' ', '<font color=red> ' + forme + ' </font>')
1509 #            txt += ucetxt + '<br><br>'
1510 #        win.HtmlPage.SetPage(txt)
1511 #        return win
1512 #
1513 #    def OnPopupTwo(self, event):
1514 #        corpus = self.Source.corpus
1515 #        uces = corpus.lc[self.cl-1]
1516 #        win = self.make_concord(uces, "Concordancier - Classe %i" % self.cl)
1517 #        win.Show(True)
1518 #    
1519 #    def OnPopupThree(self, event):
1520 #        corpus = self.Source.corpus
1521 #        uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))]
1522 #        win = self.make_concord(uces, "Concordancier - UCE classées")
1523 #        win.Show(True)
1524 #        
1525 #    def OnPopupFour(self, event):
1526 #        corpus = self.Source.corpus
1527 #        uces = [classe[i] for classe in corpus.lc for i in range(0,len(classe))] + corpus.lc0
1528 #        win = self.make_concord(uces, "Concordancier - Toutes les UCE")
1529 #        win.Show(True)
1530 #
1531 #    def OnPopupFive(self, event):
1532 #        word = self.getColumnText(self.list.GetFirstSelected(), 6)
1533 #        lk = "http://www.cnrtl.fr/definition/" + word
1534 #        webbrowser.open(lk)
1535 #
1536 #    def OnPopupSix(self, event):  
1537 #        word = self.getColumnText(self.list.GetFirstSelected(), 6)
1538 #        lk = "http://www.cnrtl.fr/etymologie/" + word
1539 #        webbrowser.open(lk)
1540 #        
1541 #    def OnPopupSeven(self, event):        
1542 #        word = self.getColumnText(self.list.GetFirstSelected(), 6)
1543 #        lk = "http://www.cnrtl.fr/synonymie/" + word
1544 #        webbrowser.open(lk)
1545 #        
1546 #    def OnPopupHeight(self, event):  
1547 #        word = self.getColumnText(self.list.GetFirstSelected(), 6)
1548 #        lk = "http://www.cnrtl.fr/antonymie/" + word
1549 #        webbrowser.open(lk)
1550 #        
1551 #    def OnPopupNine(self, event):            
1552 #        word = self.getColumnText(self.list.GetFirstSelected(), 6)
1553 #        lk = "http://www.cnrtl.fr/morphologie/" + word
1554 #        webbrowser.open(lk)
1555 #
1556 #    def onproxe(self, evt) :
1557 #        word = self.getColumnText(self.list.GetFirstSelected(), 6)
1558 #        lk = "http://www.cnrtl.fr/proxemie/" + word
1559 #        webbrowser.open(lk)
1560 #
1561 #    def OnSize(self, event):
1562 #        w, h = self.GetClientSizeTuple()
1563 #        self.list.SetDimensions(0, 0, w, h)
1564 #        
1565 #    def OnColClick(self, event):
1566 #        self.do_greyline()
1567 #
1568 #
1569 #class wliste(wx.Frame):
1570 #    def __init__(self, parent, id, title, d, fline, size=(600, 500)):
1571 #        wx.Frame.__init__(self, parent, id)
1572 #        self.liste = ListForSpec(self, parent, d, fline)
1573 #        self.button_1 = wx.Button(self, -1, "Fermer")
1574 #        self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button_1)
1575 #        self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
1576 #        self.__do_layout()
1577 #
1578 #    def __do_layout(self):
1579 #        sizer_1 = wx.BoxSizer(wx.VERTICAL)
1580 #        sizer_2 = wx.BoxSizer(wx.VERTICAL)
1581 #        sizer_2.Add(self.liste, 1, wx.EXPAND | wx.ADJUST_MINSIZE, 0)
1582 #        sizer_2.Add(self.button_1, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ADJUST_MINSIZE, 0)
1583 #        sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
1584 #        self.SetAutoLayout(True)
1585 #        self.SetSizer(sizer_1)
1586 #        self.Layout()
1587 #        
1588 #    def OnCloseMe(self, event):
1589 #        self.Close(True)
1590 #
1591 #    def OnCloseWindow(self, event):
1592 #        self.Destroy()
1593 #
1594 class message(wx.Frame):
1595     def __init__(self, *args, **kwds):
1596         kwds["style"] = wx.DEFAULT_FRAME_STYLE
1597         wx.Frame.__init__(self, *args, **kwds)
1598         self.html = ""
1599         self.HtmlPage=wx.html.HtmlWindow(self, -1)
1600         if "gtk2" in wx.PlatformInfo:
1601             self.HtmlPage.SetStandardFonts()
1602         self.HtmlPage.SetFonts('Courier','Courier')
1603         self.button_1 = wx.Button(self, -1, "Fermer")
1604         self.button_2 = wx.Button(self, -1, u"Enregistrer...")
1605
1606         self.Bind(wx.EVT_BUTTON, self.OnSavePage, self.button_2)
1607         self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button_1)
1608         self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
1609         self.__do_layout()
1610
1611     def __do_layout(self):
1612         sizer_1 = wx.BoxSizer(wx.VERTICAL)
1613         sizer_2 = wx.BoxSizer(wx.VERTICAL)
1614         sizer_2.Add(self.HtmlPage, 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)
1615         sizer_2.Add(self.button_1, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ADJUST_MINSIZE, 0)
1616         sizer_2.Add(self.button_2, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ADJUST_MINSIZE, 0)
1617         sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
1618         self.SetAutoLayout(True)
1619         self.SetSizer(sizer_1)
1620         self.Layout()
1621
1622     def OnSavePage(self, evt) :
1623         dlg = wx.FileDialog(
1624             self, message="Enregistrer sous...", defaultDir=os.getcwd(),
1625             defaultFile="concordancier.html", wildcard="html|*.html", style=wx.SAVE | wx.OVERWRITE_PROMPT
1626             )
1627         dlg.SetFilterIndex(2)
1628         dlg.CenterOnParent()
1629         if dlg.ShowModal() == wx.ID_OK:
1630             path = dlg.GetPath()
1631             with open(path, 'w') as f :
1632                 f.write(self.html)
1633
1634     def OnCloseMe(self, event):
1635         self.Close(True)
1636
1637     def OnCloseWindow(self, event):
1638         self.Destroy()
1639 #
1640 #def getSmallUpArrowData():
1641 #    return \
1642 #'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
1643 #\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
1644 #\x00\x00<IDAT8\x8dcddbf\xa0\x040Q\xa4{h\x18\xf0\xff\xdf\xdf\xffd\x1b\x00\xd3\
1645 #\x8c\xcf\x10\x9c\x06\xa0k\xc2e\x08m\xc2\x00\x97m\xd8\xc41\x0c \x14h\xe8\xf2\
1646 #\x8c\xa3)q\x10\x18\x00\x00R\xd8#\xec\xb2\xcd\xc1Y\x00\x00\x00\x00IEND\xaeB`\
1647 #\x82' 
1648 #
1649 #def getSmallUpArrowBitmap():
1650 #    return wx.BitmapFromImage(getSmallUpArrowImage())
1651 #
1652 #def getSmallUpArrowImage():
1653 #    stream = cStringIO.StringIO(getSmallUpArrowData())
1654 #    return wx.ImageFromStream(stream)
1655 #
1656 ##----------------------------------------------------------------------
1657 #def getSmallDnArrowData():
1658 #    return \
1659 #"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
1660 #\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
1661 #\x00\x00HIDAT8\x8dcddbf\xa0\x040Q\xa4{\xd4\x00\x06\x06\x06\x06\x06\x16t\x81\
1662 #\xff\xff\xfe\xfe'\xa4\x89\x91\x89\x99\x11\xa7\x0b\x90%\ti\xc6j\x00>C\xb0\x89\
1663 #\xd3.\x10\xd1m\xc3\xe5*\xbc.\x80i\xc2\x17.\x8c\xa3y\x81\x01\x00\xa1\x0e\x04e\
1664 #?\x84B\xef\x00\x00\x00\x00IEND\xaeB`\x82" 
1665 #
1666 #def getSmallDnArrowBitmap():
1667 #    return wx.BitmapFromImage(getSmallDnArrowImage())
1668 #
1669 #def getSmallDnArrowImage():
1670 #    stream = cStringIO.StringIO(getSmallDnArrowData())
1671 #    return wx.ImageFromStream(stream)