first import
[iramuteq] / listlex.py
1 # -*- coding: utf-8 -*-
2
3 #----------------------------------------------------------------------------
4 # Author:       Pierre Ratinaud
5
6
7 #comes from ListCtrl.py from the demo tool of wxPython:
8 # Author:       Robin Dunn & Gary Dumer
9 #
10 # Created:
11 # Copyright:    (c) 1998 by Total Control Software
12 # Licence:      wxWindows license
13 #----------------------------------------------------------------------------
14
15 import os
16 import sys
17 import  wx
18 import  wx.lib.mixins.listctrl  as  listmix
19 import cStringIO
20 import tempfile
21 from functions import exec_rcode, MessageImage
22 from chemins import ffr
23 from PrintRScript import barplot
24 from dialog import SearchDial
25 #---------------------------------------------------------------------------
26
27 class List(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):
28     def __init__(self, parent, ID, pos=wx.DefaultPosition,
29                  size=wx.DefaultSize, style=0):
30         wx.ListCtrl.__init__(self, parent, ID, pos, size, style)
31         listmix.ListCtrlAutoWidthMixin.__init__(self)
32
33 class ListForSpec(wx.Panel, listmix.ColumnSorterMixin):
34     def __init__(self, parent,gparent, dlist,first):
35         self.parent=parent
36         self.gparent=gparent
37         self.dlist=dlist
38         self.first = first
39         wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS)
40
41         search_id = wx.NewId()
42         self.parent.Bind(wx.EVT_MENU, self.onsearch, id = search_id)
43         self.accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('F'), search_id)])
44         self.SetAcceleratorTable(self.accel_tbl)
45
46         self.il = wx.ImageList(16, 16)
47
48         self.sm_up = self.il.Add(getSmallUpArrowBitmap())
49         self.sm_dn = self.il.Add(getSmallDnArrowBitmap())
50
51         tID = wx.NewId()
52
53         self.list = List(self, tID,
54                                  style=wx.LC_REPORT 
55                                  | wx.BORDER_NONE
56                                  | wx.LC_EDIT_LABELS
57                                  | wx.LC_SORT_ASCENDING
58                                  )
59         
60         self.list.SetImageList(self.il, wx.IMAGE_LIST_SMALL)
61         
62         self.dlist = dlist 
63         self.PopulateList(dlist,first)
64         self.Bind(wx.EVT_SIZE, self.OnSize)
65
66         self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list)
67         self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick)
68         
69         # for wxMSW
70         self.list.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightClick)
71
72         # for wxGTK
73         self.list.Bind(wx.EVT_RIGHT_UP, self.OnRightClick)
74         
75         
76         self.itemDataMap = dlist
77         listmix.ColumnSorterMixin.__init__(self, len(first))
78         self.SortListItems(1, False)
79         self.do_greyline()
80         
81 #-----------------------------------------------------------------------------------------    
82
83     def PopulateList(self, dlist,first):
84         i=0
85         for name in first :
86             self.list.InsertColumn(i,name,wx.LIST_FORMAT_LEFT)
87             i+=1
88         ct=0
89         for key,data in dlist.iteritems() :
90             ct+=1
91             index = self.list.InsertStringItem(sys.maxint, str(data[0]))
92             i=1
93             for val in data[1:]:
94                 self.list.SetStringItem(index, i, str(data[i]))
95                 i+=1
96
97             self.list.SetItemData(index, key)
98             
99         self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE)
100         for i in range(1,len(first)-1):
101             self.list.SetColumnWidth(i, 130)
102         
103     def do_greyline(self):
104         for row in xrange(self.list.GetItemCount()):
105             if row % 2 :
106                 self.list.SetItemBackgroundColour(row,(230,230,230))
107             else :
108                 self.list.SetItemBackgroundColour(row,wx.WHITE)
109
110
111     # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
112     def GetListCtrl(self):
113         return self.list
114
115     # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
116     def GetSortImages(self):
117         return (self.sm_dn, self.sm_up)
118
119
120     def OnRightDown(self, event):
121         x = event.GetX()
122         y = event.GetY()
123         item, flags = self.list.HitTest((x, y))
124
125         if flags & wx.LIST_HITTEST_ONITEM:
126             self.list.Select(item)
127
128         event.Skip()
129
130     def getColumnText(self, index, col):
131         item = self.list.GetItem(index, col)
132         return item.GetText()
133
134     def OnItemSelected(self, event):
135         self.currentItem = event.m_itemIndex
136         event.Skip()
137
138     def onsearch(self, evt) :
139         self.dial = SearchDial(self, self, 0, True)
140         self.dial.CenterOnParent()
141         self.dial.ShowModal()
142         self.dial.Destroy()
143     
144     def OnRightClick(self, event):
145
146         # only do this part the first time so the events are only bound once
147         if not hasattr(self, "popupID1"):
148             self.popupID1 = wx.NewId()
149             self.popupID2 = wx.NewId()
150             self.popupID3 = wx.NewId()
151             self.popup_Tgen_glob = wx.NewId()
152
153             self.Bind(wx.EVT_MENU, self.OnPopupOne, id=self.popupID1)
154             self.Bind(wx.EVT_MENU, self.OnPopupTwo, id=self.popupID2)
155             self.Bind(wx.EVT_MENU, self.OnPopupThree, id=self.popupID3)
156             self.Bind(wx.EVT_MENU, self.OnTgen_glob, id=self.popup_Tgen_glob)
157         # make a menu
158         menu = wx.Menu()
159         # add some items
160         menu.Append(self.popupID1, u"Formes associĆ©es")
161         menu.Append(self.popupID2, u"Concordancier")
162         menu.Append(self.popupID3, "Graphique")
163         #menu.Append(self.popup_Tgen_glob, "Tgen global")
164
165         self.PopupMenu(menu)
166         menu.Destroy()
167
168
169     def OnPopupOne(self, event):
170         activenotebook = self.parent.nb.GetSelection()
171         page = self.parent.nb.GetPage(activenotebook)
172         corpus = page.corpus
173         word = self.getColumnText(self.list.GetFirstSelected(), 0)
174         lems = corpus.getlems()
175         rep = []
176         for forme in lems[word].formes :
177              rep.append([corpus.getforme(forme).forme, corpus.getforme(forme).freq])
178         win = message(self, -1, u"Formes associĆ©es", size=(300, 200), style=wx.DEFAULT_FRAME_STYLE)
179         win.html = '<html>\n' + '<br>'.join([' : '.join([str(val) for val in forme]) for forme in rep]) + '\n</html>'
180         win.HtmlPage.SetPage(win.html)
181         win.Show(True)
182
183     def OnPopupTwo(self, event):
184         activenotebook = self.parent.nb.GetSelection()
185         page = self.parent.nb.GetPage(activenotebook)
186         item=self.getColumnText(self.list.GetFirstSelected(), 0)
187         corpus = page.corpus
188         win = message(self, -1, u"Concordancier", size=(600, 200),style = wx.DEFAULT_FRAME_STYLE)
189         avap=60
190         listmot = corpus.getlems()[item].formes       
191         uce_ok = corpus.getlemuces(item)
192         txt = '<h1>Concordancier</h1>'
193         res = corpus.getconcorde(uce_ok)
194         for uce in res :
195             ucetxt = ' '+uce[1]+' '
196             txt += ' '.join(corpus.ucis[corpus.getucefromid(uce[0]).uci].etoiles) + '<br>'
197             for forme in listmot :
198                 forme = corpus.getforme(forme).forme
199                 ucetxt = ucetxt.replace(' '+forme+' ', '<font color=red> ' + forme + ' </font>')
200             txt += ucetxt + '<br><br>'        
201 #        for uce in uce_ok:
202 #            content = ' '+' '.join(corpus.ucis_paras_uces[uce[0]][uce[1]][uce[2]])+' '
203 #            for form in listmot :
204 #                sp = ''
205 #                i = 0
206 #                forme = ' ' + form + ' '
207 #                while i < len(content):
208 #                    coordword = content[i:].find(forme)
209 #                    if coordword != -1 and i == 0:
210 #                        txt += '<br><b>' + ' '.join(corpus.ucis[uce[0]][0]) + '</b><br>'
211 #                        if coordword < avap:
212 #                            sp = '&nbsp;' * (avap - coordword)
213 #                            deb = i
214 #                        else:
215 #                            deb = i + coordword - avap
216 #                        if len(content) < i + coordword + avap:
217 #                            fin = len(content) - 1
218 #                        else:
219 #                            fin = i + coordword + avap
220 #                        txt += '<TT>' + sp + content[deb:fin].replace(forme, '<font color=red>' + forme + '</font>') + '</TT><br>'
221 #                        i += coordword + len(forme)
222 #                        sp = ''
223 #                    elif coordword != -1 and i != 0 :
224 #                        if coordword < avap:
225 #                            sp = '&nbsp;' * (avap - coordword)
226 #                            deb = i
227 #                        else:
228 #                            deb = i + coordword - avap
229 #                        if len(content) < i + coordword + avap:
230 #                            fin = len(content) - 1
231 #                        else:
232 #                            fin = i + coordword + avap
233 #                        txt += '<TT>' + sp + content[deb:fin].replace(forme, '<font color=red>' + forme + '</font>') + '</TT><br>'
234 #                        i += coordword + len(forme)
235 #                        sp = ''                   
236 #                    else:
237 #                        i = len(content)
238 #                        sp = ''
239         win.HtmlPage.SetPage(txt)
240         win.Show(True)
241
242     def OnPopupThree(self, event) :
243         datas = [self.dlist[self.list.GetItemData(self.list.GetFirstSelected())]]
244         last = self.list.GetFirstSelected()
245         while self.list.GetNextSelected(last) != -1:
246             last = self.list.GetNextSelected(last)
247             data = self.dlist[self.list.GetItemData(last)]
248             datas += [data]
249         colnames = self.first[1:]
250         table = [[str(val) for val in line[1:]] for line in datas]
251         rownames = [val[0] for val in datas]
252         tmpgraph = tempfile.mktemp(dir=self.parent.TEMPDIR)
253
254         txt = barplot(table, rownames, colnames, self.parent.RscriptsPath['Rgraph'], tmpgraph)
255
256         tmpscript = tempfile.mktemp(dir=self.parent.TEMPDIR)
257         file = open(tmpscript,'w')
258         file.write(txt)
259         file.close()
260         exec_rcode(self.parent.RPath, tmpscript, wait = True)
261         win = MessageImage(self, -1, u"Graphique", size=(700, 500),style = wx.DEFAULT_FRAME_STYLE)
262         win.addsaveimage(tmpgraph)
263         txt = "<img src='%s'>" % tmpgraph
264         win.HtmlPage.SetPage(txt)
265         win.Show(True)
266
267     def OnTgen_glob(self, evt) :
268         activenotebook = self.parent.nb.GetSelection()
269         page = self.parent.nb.GetPage(activenotebook)
270         corpus = page.corpus
271
272         tmpgraph = tempfile.mktemp(dir=self.gparent.parent.TEMPDIR)
273         intxt = """
274         load("%s")
275         """ % corpus.dictpathout['RData']
276         intxt += """
277         Tgen.glob = NULL
278         tovire <- NULL
279         for (i in 1:ncol(dmf)) {
280             Tgen.glob <- rbind(Tgen.glob,colSums(dmf[which(specf[,i] > 3),]))
281             tovire <- append(tovire, which(specf[,i] > 3))
282         }
283         rownames(Tgen.glob) <- colnames(dmf)
284         Tgen.table <- dmf[-unique(tovire),]
285         Tgen.table<- rbind(Tgen.table, Tgen.glob)
286         spec.Tgen.glob <- AsLexico2(Tgen.table)
287         spec.Tgen.glob <- spec.Tgen.glob[[1]][((nrow(Tgen.table)-ncol(Tgen.table))+1):nrow(Tgen.table),]
288         di <- spec.Tgen.glob
289         """
290         txt = barplot('', '', '', self.gparent.parent.RscriptsPath['Rgraph'], tmpgraph, intxt = intxt) 
291         tmpscript = tempfile.mktemp(dir=self.gparent.parent.TEMPDIR)
292         with open(tmpscript, 'w') as f :
293             f.write(txt)
294         exec_rcode(self.gparent.parent.RPath, tmpscript, wait = True)
295         win = MessageImage(self, -1, u"Graphique", size=(700, 500),style = wx.DEFAULT_FRAME_STYLE)
296         win.addsaveimage(tmpgraph)
297         txt = "<img src='%s'>" % tmpgraph
298         win.HtmlPage.SetPage(txt)
299         win.Show(True)
300
301     def OnSize(self, event):
302         w,h = self.GetClientSizeTuple()
303         self.list.SetDimensions(0, 0, w, h)
304         
305     def OnColClick(self,event):
306         self.do_greyline()
307
308 class message(wx.Frame):
309     def __init__(self, *args, **kwds):
310         # begin wxGlade: MyFrame.__init__
311         kwds["style"] = wx.DEFAULT_FRAME_STYLE
312         wx.Frame.__init__(self, *args, **kwds)
313         #self.text_ctrl_1 = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE)
314         self.HtmlPage=wx.html.HtmlWindow(self, -1)
315         if "gtk2" in wx.PlatformInfo:
316             self.HtmlPage.SetStandardFonts()
317         self.HtmlPage.SetFonts('Courier','Courier')
318         
319         
320         self.button_1 = wx.Button(self, -1, "Fermer")
321         self.Bind(wx.EVT_BUTTON, self.OnCloseMe, self.button_1)
322         self.Bind(wx.EVT_CLOSE, self.OnCloseWindow)
323         self.__do_layout()
324         # end wxGlade
325
326     def __do_layout(self):
327         # begin wxGlade: MyFrame.__do_layout
328         sizer_1 = wx.BoxSizer(wx.VERTICAL)
329         sizer_2 = wx.BoxSizer(wx.VERTICAL)
330         sizer_2.Add(self.HtmlPage, 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)
331         sizer_2.Add(self.button_1, 0, wx.ALIGN_CENTER_HORIZONTAL|wx.ADJUST_MINSIZE, 0)
332         sizer_1.Add(sizer_2, 1, wx.EXPAND, 0)
333         self.SetAutoLayout(True)
334         self.SetSizer(sizer_1)
335         self.Layout()
336         # end wxGlade
337         
338     def OnCloseMe(self, event):
339         self.Close(True)
340
341     def OnCloseWindow(self, event):
342         self.Destroy()
343
344
345 def getSmallUpArrowData():
346     return \
347 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
348 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
349 \x00\x00<IDAT8\x8dcddbf\xa0\x040Q\xa4{h\x18\xf0\xff\xdf\xdf\xffd\x1b\x00\xd3\
350 \x8c\xcf\x10\x9c\x06\xa0k\xc2e\x08m\xc2\x00\x97m\xd8\xc41\x0c \x14h\xe8\xf2\
351 \x8c\xa3)q\x10\x18\x00\x00R\xd8#\xec\xb2\xcd\xc1Y\x00\x00\x00\x00IEND\xaeB`\
352 \x82' 
353
354 def getSmallUpArrowBitmap():
355     return wx.BitmapFromImage(getSmallUpArrowImage())
356
357 def getSmallUpArrowImage():
358     stream = cStringIO.StringIO(getSmallUpArrowData())
359     return wx.ImageFromStream(stream)
360
361 #----------------------------------------------------------------------
362 def getSmallDnArrowData():
363     return \
364 "\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\x00\x00\x00\x10\x08\x06\
365 \x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\x00\
366 \x00\x00HIDAT8\x8dcddbf\xa0\x040Q\xa4{\xd4\x00\x06\x06\x06\x06\x06\x16t\x81\
367 \xff\xff\xfe\xfe'\xa4\x89\x91\x89\x99\x11\xa7\x0b\x90%\ti\xc6j\x00>C\xb0\x89\
368 \xd3.\x10\xd1m\xc3\xe5*\xbc.\x80i\xc2\x17.\x8c\xa3y\x81\x01\x00\xa1\x0e\x04e\
369 ?\x84B\xef\x00\x00\x00\x00IEND\xaeB`\x82" 
370
371 def getSmallDnArrowBitmap():
372     return wx.BitmapFromImage(getSmallDnArrowImage())
373
374 def getSmallDnArrowImage():
375     stream = cStringIO.StringIO(getSmallDnArrowData())
376     return wx.ImageFromStream(stream)