e0bc11a6167d5fe1a0eb3b477fd55eeabe84b55a
[iramuteq] / Liste.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 from dialog import SearchDial, message
20 import wx.lib.mixins.listctrl as listmix 
21 from operator import itemgetter
22
23 #---------------------------------------------------------------------------
24
25 class ListPanel(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin, listmix.ColumnSorterMixin):
26     def __init__(self, parent, gparent, dlist):
27         wx.ListCtrl.__init__( self, parent, -1, style=wx.LC_REPORT|wx.LC_VIRTUAL|wx.LC_HRULES|wx.LC_VRULES)
28         self.parent = parent
29         self.gparent = gparent
30         self.source = gparent
31         self.dlist = dlist
32         #wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS)
33         
34         search_id = wx.NewId()
35         self.parent.Bind(wx.EVT_MENU, self.onsearch, id = search_id)
36         self.accel_tbl = wx.AcceleratorTable([(wx.ACCEL_CTRL, ord('F'), search_id)])
37         self.SetAcceleratorTable(self.accel_tbl)
38         
39         self.il = wx.ImageList(16, 16)
40         a={"sm_up":"GO_UP","sm_dn":"GO_DOWN","w_idx":"WARNING","e_idx":"ERROR","i_idx":"QUESTION"}
41         for k,v in a.items():
42             s="self.%s= self.il.Add(wx.ArtProvider_GetBitmap(wx.ART_%s,wx.ART_TOOLBAR,(16,16)))" % (k,v)
43             exec(s)
44         self.SetImageList(self.il, wx.IMAGE_LIST_SMALL)
45
46         tID = wx.NewId()
47
48         
49 #-----------------------------------------------------------------------------------------    
50         self.attr1 = wx.ListItemAttr()
51         self.attr1.SetBackgroundColour((230, 230, 230))
52         self.attr2 = wx.ListItemAttr()
53         self.attr2.SetBackgroundColour("light blue")
54
55         
56         self.InsertColumn(0, 'forme', wx.LIST_FORMAT_RIGHT)
57         self.InsertColumn(1, 'nb', wx.LIST_FORMAT_RIGHT)
58         self.InsertColumn(2, 'type', wx.LIST_FORMAT_RIGHT)
59         #self.InsertColumn(3, '', wx.LIST_FORMAT_RIGHT)
60
61         self.SetColumnWidth(0, 150)   
62         self.SetColumnWidth(1, 100)  
63         self.SetColumnWidth(2, 100)
64         #self.SetColumnWidth(3, wx.LIST_AUTOSIZE)
65
66         self.itemDataMap = dlist
67         self.itemIndexMap = dlist.keys()
68         self.SetItemCount(len(dlist))
69
70         #self.Bind(wx.EVT_SIZE, self.OnSize)
71
72         self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self)
73         self.Bind(wx.EVT_LIST_COL_CLICK, self.OnColClick, self)
74         # for wxMSW
75         self.Bind(wx.EVT_COMMAND_RIGHT_CLICK, self.OnRightClick)
76
77         # for wxGTK
78         self.Bind(wx.EVT_RIGHT_UP, self.OnRightClick)
79
80         #listmix.ListCtrlAutoWidthMixin.__init__(self)
81         listmix.ColumnSorterMixin.__init__(self, 3)
82         self.SortListItems(1, False)
83         #self.do_greyline()
84
85         #self.currentItem = 0
86
87     def OnGetItemText(self, item, col):
88         index=self.itemIndexMap[item]
89         s = self.itemDataMap[index][col]
90         return s
91
92     def OnGetItemAttr(self, item):
93         #index=self.itemIndexMap[item]
94         #genre=self.itemDataMap[index][2]
95         if item % 2 :
96             return self.attr1
97         else :
98             return self.attr2
99
100     def OnColClick(self, event):
101         pass
102         #self.do_greyline()
103         
104     # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
105     def GetListCtrl(self):
106         return self
107
108     # Used by the ColumnSorterMixin, see wx/lib/mixins/listctrl.py
109     def GetSortImages(self):
110         return (self.sm_dn, self.sm_up)
111
112     def SortItems(self,sorter=cmp):
113         items = list(self.itemDataMap.keys())
114         items.sort(sorter)
115         self.itemIndexMap = items
116         
117         # redraw the list
118         self.Refresh()
119
120
121     def OnRightDown(self, event):
122         x = event.GetX()
123         y = event.GetY()
124         item, flags = self.HitTest((x, y))
125
126         if flags & wx.LIST_HITTEST_ONITEM:
127             self.Select(item)
128
129         event.Skip()
130
131
132     def getColumnText(self, index, col):
133         item = self.GetItem(index, col)
134         return item.GetText()
135
136
137     def OnItemSelected(self, event):
138         self.currentItem = event.m_itemIndex
139         event.Skip()
140
141     def onsearch(self, evt) :
142         self.dial = SearchDial(self, self, 0, True)
143         self.dial.CenterOnParent()
144         self.dial.Show()
145         #self.dial.Destroy()
146
147     def OnRightClick(self, event):
148
149         # only do this part the first time so the events are only bound once
150         if not hasattr(self, "popupID1"):
151             self.popupID1 = wx.NewId()
152             self.popupID2 = wx.NewId()
153  #           self.popupID3 = wx.NewId()
154
155             self.Bind(wx.EVT_MENU, self.OnPopupOne, id=self.popupID1)
156             self.Bind(wx.EVT_MENU, self.OnPopupTwo, id=self.popupID2)
157 #            self.Bind(wx.EVT_MENU, self.OnPopupThree, id=self.popupID3)
158
159         # make a menu
160         menu = wx.Menu()
161         # add some items
162         menu.Append(self.popupID1, u"Formes associĆ©es")
163         menu.Append(self.popupID2, u"Concordancier")
164 #        menu.Append(self.popupID3, "recharger")
165
166         self.PopupMenu(menu)
167         menu.Destroy()
168
169
170     def OnPopupOne(self, event):
171         corpus = self.gparent.corpus
172         word = self.getColumnText(self.GetFirstSelected(), 0)
173         lems = corpus.getlems()
174         rep = []
175         for forme in lems[word].formes :
176              rep.append([corpus.getforme(forme).forme, corpus.getforme(forme).freq])
177         rep.sort(key = itemgetter(1), reverse = True)
178         win = message(self, u"Formes associĆ©es", (300, 200))
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         corpus = self.gparent.corpus
185         win = message(self, u"Concordancier", (750, 600))
186         avap = 60
187         item = self.getColumnText(self.GetFirstSelected(), 0)
188         listmot = corpus.getlems()[item].formes
189         #uce_ok = [corpus.formes[corpus.idformes[forme].forme][1] for forme in listmot]
190         uce_ok = corpus.getlemuces(item)#list(set([tuple(val) for line in uce_ok for val in line]))
191         txt = '<h1>Concordancier</h1>'
192         res = corpus.getconcorde(uce_ok)
193         for uce in res :
194             ucetxt = ' '+uce[1]+' '
195             txt += ' '.join(corpus.ucis[corpus.getucefromid(uce[0]).uci].etoiles) + '<br>'
196             for forme in listmot :
197                 forme = corpus.getforme(forme).forme
198                 ucetxt = ucetxt.replace(' '+forme+' ', '<font color=red> ' + forme + ' </font>')
199             txt += ucetxt + '<br><br>'
200         win.HtmlPage.SetPage(txt) 
201         win.Show(True)