Initial commit
[multilist] / src / multilistclasses / libview.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3   
4 import gtk
5 import gobject
6 import logging
7 import pango
8 import libliststorehandler
9   
10
11 class Columns_dialog(gtk.VBox):
12         
13         def is_col_selected(self, icol):
14                 children=self.framebox.get_children()
15                 if icol<len(children):
16                         return children[icol].get_active()
17                 else:
18                         return None
19         
20         def save_column_setting(self):
21                 i=1 #uid can not be shown
22                 while self.liststorehandler.get_colname(i)!=None:
23                         name=str(self.liststorehandler.get_colname(i))
24                         if self.is_col_selected(i-1)==True:
25                                 self.db.speichereDirekt("showcol_"+name,"1")
26                         else:
27                                 self.db.speichereDirekt("showcol_"+name,"0")
28                         i=i+1
29                 
30         
31
32         
33         def __init__(self,db,liststorehandler):
34                 gtk.VBox.__init__(self,homogeneous=False, spacing=0)
35                 
36                 self.db=db
37                 self.liststorehandler=liststorehandler
38                 
39                 #serverbutton=gtk.ToggleButton("SyncServer starten")
40                 #serverbutton.connect("clicked",self.startServer,(None,))
41                 #self.pack_start(serverbutton, expand=False, fill=True, padding=1)
42                 #print "x1"
43                 
44                 frame=gtk.Frame("Columns")
45                 self.framebox=gtk.VBox(homogeneous=False, spacing=0)
46                 
47                 self.scrolled_window = gtk.ScrolledWindow()
48                 self.scrolled_window.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC)
49
50                 self.scrolled_window.add_with_viewport(self.framebox)
51                 
52                 
53                 i=1 #uid can not be shown
54                 while self.liststorehandler.get_colname(i)!=None:
55                         name=str(self.liststorehandler.get_colname(i))
56                         checkbutton=gtk.CheckButton(name)
57                         if self.db.ladeDirekt("showcol_"+name)=="1":
58                                 checkbutton.set_active(True)
59                                 
60                         self.framebox.pack_start(checkbutton)
61                         i=i+1
62                 
63                 frame.add(self.scrolled_window)
64                 self.pack_start(frame, expand=True, fill=True, padding=1)
65                 
66                 
67                 
68         
69
70
71 class CellRendererTriple(gtk.GenericCellRenderer):
72         __gproperties__ = {
73                 "status": (gobject.TYPE_STRING, "Status",
74                 "Status", "", gobject.PARAM_READWRITE),
75         }
76         
77         __gsignals__ = {
78                 'status_changed' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,(gobject.TYPE_INT,gobject.TYPE_STRING)),
79         }
80
81
82         def __init__(self):
83                 #self.__gobject_init__()
84                 #gtk.GenericCellRenderer.__init__(self,*args,**kwargs)
85                 gtk.GenericCellRenderer.__init__(self)
86                 #self.__gobject_init__()
87                 self.status=-1
88                 self.xpad = 2
89                 self.ypad = 2
90                 self.mode = gtk.CELL_RENDERER_MODE_ACTIVATABLE
91                 self.xpad = -2; self.ypad = -2
92                 self.xalign = 0.5; self.yalign = 0.5
93                 self.active = 0
94                 self.widget=None
95                 self.last_cell=None
96                 self.connect('editing-started', self.on_clicked)
97
98         def do_set_property(self,property,value):
99                 setattr(self, property.name, value)
100
101         def do_get_property(self, property):
102                 return getattr(self, property.name)
103
104         def get_layout(self, widget):
105                 '''Gets the Pango layout used in the cell in a TreeView widget.'''
106
107                 layout = pango.Layout(widget.get_pango_context())
108                 layout.set_width(-1)    # Do not wrap text.
109
110                 layout.set_text('  ')
111
112                 return layout
113
114         def on_get_size(self, widget, cell_area=None):
115                 xpad = 2
116                 ypad = 2
117
118                 xalign = 0
119                 yalign = 0.5
120
121                 layout = self.get_layout(widget)
122                 width, height = layout.get_pixel_size()
123
124                 x_offset = xpad
125                 y_offset = ypad
126
127                 if cell_area:
128
129                         x_offset = xalign * (cell_area.width - width)
130                         x_offset = max(x_offset, xpad)
131                         x_offset = int(round(x_offset, 0))
132
133                         y_offset = yalign * (cell_area.height - height)
134                         y_offset = max(y_offset, ypad)
135                         y_offset = int(round(y_offset, 0))
136
137                 width  = width  + (xpad * 2)
138                 height = height + (ypad * 2)
139
140                 
141                 return x_offset, y_offset, width, height
142                 
143         def on_clicked(self,  widget, data):
144                 print widget,data
145
146         def clicked(self, widget, data1=None):
147                 x,y=widget.get_pointer()
148                 widget.realize()
149                 
150                 path=widget.get_path_at_pos(x,y)
151                 
152                 #print "a",widget.get_cursor()
153                 #print path
154                 
155         
156                 
157                 path=widget.get_cursor()[0]
158                 
159                 if path!=None:
160                         irow=path[0]    #path[0][0]-1
161                         rect=widget.get_cell_area(irow, widget.get_column(0)) #FixME 0 is hardcoded
162                         if x<rect.x+rect.width:
163                                 self.emit("status_changed",irow,self.status)
164                 else:
165                         return
166                 
167                 
168                         #workarround -1 means last item, because bug in treeview?!
169                         #print "not in list"
170                         rect=widget.get_visible_rect() #widget.get_cell_area(-1, widget.get_column(0))
171                         #print rect.x,rect.y,rect.width,rect.height,x,y
172                         irow=-1
173                         rect=widget.get_cell_area(0, widget.get_column(0)) #FixME 0 is hardcoded
174                         if x<rect.x+rect.width:
175                                 self.emit("status_changed",irow,"-1")
176                 
177
178         def on_render(self, window, widget, background_area, cell_area, expose_area, flags ):
179                 if (self.widget==None):
180                         #print widget
181                         self.widget=widget
182                         self.widget.connect("cursor-changed",self.clicked) #button-press-event
183                 
184                 self.last_cell=cell_area
185                 
186                 x=int(cell_area.x+(cell_area.width-2)/2-(cell_area.height-2)/2)
187                 y=int(cell_area.y+1)
188                 height=int(cell_area.height-2)
189                 width=int(height)
190
191                 if (self.status=="1"):
192                         widget.style.paint_check(window,gtk.STATE_NORMAL, gtk.SHADOW_IN,cell_area, widget, "cellradio",x,y,width,height)
193                 elif (self.status=="0"):
194                         #width=height
195                         height=height-3
196                         width=height
197                         
198                         widget.style.paint_flat_box(window, gtk.STATE_NORMAL, gtk.SHADOW_NONE, cell_area, widget, "cellunselected",x,y,width,height)
199                         
200                         widget.style.paint_hline(window, gtk.STATE_NORMAL,cell_area, widget, "cellunselected",x,x+width,y)
201                         widget.style.paint_hline(window, gtk.STATE_NORMAL,cell_area, widget, "cellunselected",x,x+width,y+height)
202                         widget.style.paint_vline(window, gtk.STATE_NORMAL,cell_area, widget, "cellunselected",y,y+height,x)
203                         widget.style.paint_vline(window, gtk.STATE_NORMAL,cell_area, widget, "cellunselected",y,y+height,x+width)
204                         
205                 else:
206                         widget.style.paint_diamond(window, gtk.STATE_NORMAL, gtk.SHADOW_IN, cell_area, widget, "cellunselected",x,y,width,height)
207                         
208                 #widget.show_all()
209                 #print "render"
210                 pass
211     
212         def on_start_editing(self, event, widget, path, background_area, cell_area, flags):
213                 print "on_start_editing",path
214                 return None
215         
216         
217         def on_activate(self, event, widget, path, background_area, cell_area, flags):
218                 print "activate",path
219                 return False
220
221                 
222                 
223 class CellRendererCombo2(gtk.GenericCellRenderer):
224         __gproperties__ = {
225                 "text": (gobject.TYPE_STRING, "text",
226                 "Text", "", gobject.PARAM_READWRITE),
227         }
228         
229         __gsignals__ = {
230                 'status_changed' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,(gobject.TYPE_INT,gobject.TYPE_STRING)),
231         }
232
233
234         def __init__(self):
235                 #self.__gobject_init__()
236                 #gtk.GenericCellRenderer.__init__(self,*args,**kwargs)
237                 gtk.GenericCellRenderer.__init__(self)
238                 #self.__gobject_init__()
239                 self.status=-1
240                 self.xpad = 2
241                 self.ypad = 2
242                 self.mode = gtk.CELL_RENDERER_MODE_ACTIVATABLE
243                 self.xpad = -2; self.ypad = -2
244                 self.xalign = 0.5; self.yalign = 0.5
245                 self.active = 0
246                 self.widget=None
247                 self.last_cell=None
248                 self.text="(none)"
249                 self.connect('editing-started', self.on_clicked)
250
251         def do_set_property(self,property,value):
252                 #print property,value
253                 setattr(self, property.name, value)
254
255         def do_get_property(self, property):
256                 return getattr(self, property.name)
257
258         def get_layout(self, widget):
259                 '''Gets the Pango layout used in the cell in a TreeView widget.'''
260
261                 layout = pango.Layout(widget.get_pango_context())
262                 layout.set_width(-1)    # Do not wrap text.
263
264                 layout.set_text(self.text)
265
266                 return layout
267
268         def on_get_size(self, widget, cell_area=None):
269                 xpad = 2
270                 ypad = 2
271
272                 xalign = 0
273                 yalign = 0.5
274
275                 layout = self.get_layout(widget)
276                 width, height = layout.get_pixel_size()
277
278                 x_offset = xpad
279                 y_offset = ypad
280
281                 if cell_area:
282
283                         x_offset = xalign * (cell_area.width - width)
284                         x_offset = max(x_offset, xpad)
285                         x_offset = int(round(x_offset, 0))
286
287                         y_offset = yalign * (cell_area.height - height)
288                         y_offset = max(y_offset, ypad)
289                         y_offset = int(round(y_offset, 0))
290
291                 width  = width  + (xpad * 2)
292                 height = height + (ypad * 2)
293
294                 
295                 return x_offset, y_offset, width, height
296                 
297         def on_clicked(self,  widget, data):
298                 print widget,data
299
300         def clicked(self, widget, data1=None):
301                 return
302                 x,y=widget.get_pointer()
303                 widget.realize()
304                 
305                 #path=widget.get_path_at_pos(x,y)
306                 
307                 path=widget.get_cursor()[0]
308                 
309                 if path!=None:
310                         irow=path[0]    #path[0][0]-1
311                         rect=widget.get_cell_area(irow, widget.get_column(0)) #FixME 0 is hardcoded
312                         if x<rect.x+rect.width:
313                                 self.emit("status_changed",irow,self.status)
314                 else:
315                         return
316                 
317                 
318                         #workarround -1 means last item, because bug in treeview?!
319                         #print "not in list"
320                         rect=widget.get_visible_rect() #widget.get_cell_area(-1, widget.get_column(0))
321                         #print rect.x,rect.y,rect.width,rect.height,x,y
322                         irow=-1
323                         rect=widget.get_cell_area(0, widget.get_column(0)) #FixME 0 is hardcoded
324                         if x<rect.x+rect.width:
325                                 self.emit("status_changed",irow,"-1")
326                 
327
328         def on_render(self, window, widget, background_area, cell_area, expose_area, flags ):
329                 if (self.widget==None):
330                         self.widget=widget
331                         self.widget.connect("cursor-changed",self.clicked) #button-press-event
332                 
333                 self.last_cell=cell_area
334                 
335                 x=int(cell_area.x+(cell_area.width-2)/2-(cell_area.height-2)/2)
336                 y=int(cell_area.y+1)
337                 height=int(cell_area.height-2)
338                 width=int(height)
339                 
340                 widget.style.paint_layout(window,gtk.STATE_NORMAL, True, cell_area, widget, "cellradio",x,y,self.get_layout(widget))
341                         
342                 #widget.show_all()
343     
344         def on_start_editing(self, event, widget, path, background_area, cell_area, flags):
345                 print "on_start_editing",path
346                 return None
347         
348         
349         def on_activate(self, event, widget, path, background_area, cell_area, flags):
350                 print "activate",path
351                 return False
352
353
354 gobject.type_register(CellRendererCombo2)
355 gobject.type_register(CellRendererTriple)
356
357         
358   
359 class View(gtk.VBox):
360         
361         def loadList(self):
362                 ls=self.liststorehandler.get_liststore()
363                 self.treeview.set_model(ls)
364                 #self.tvcolumn[i].add_attribute( self.cell[i], "active", 1)
365                 #print "setup",ls
366                 
367                 
368         
369         
370         def col_edited(self,cell, irow, new_text,icol=None):
371                 if (irow!=4):
372                         self.liststorehandler.update_row(irow,icol,new_text)
373                 else:
374                         print cell, irow, new_text,icol
375                 
376         def col_toggled(self,widget,irow, status ):
377                 #print irow,ls[irow][1],status
378                 ls=self.treeview.get_model()
379                 
380                 if self.liststorehandler.selection.get_status()=="0":
381                         if ls[irow][1]=="0":
382                                 self.liststorehandler.update_row(irow,1,"1")
383                         else:
384                                 self.liststorehandler.update_row(irow,1,"0")
385                 else:
386                         if ls[irow][1]=="1":
387                                 self.liststorehandler.update_row(irow,1,"-1")
388                         elif ls[irow][1]=="0":
389                                 self.liststorehandler.update_row(irow,1,"1")
390                         else:
391                                 self.liststorehandler.update_row(irow,1,"0")
392                         
393                 #self.tvcolumn[i].set_attributes( self.cell[i], active=i)
394                 
395                 
396         
397         def convert(self,s):
398                 #print s
399                 if (s=="1"):
400                         return 1
401                 else:
402                         return 0
403                 
404                 
405         def del_active_row(self):
406                 path, col = self.treeview.get_cursor()
407                 #print path, col
408                 if path!=None:
409                         irow=path[0]
410                         row_iter=self.treeview.get_model().get_iter(path)
411                         self.liststorehandler.del_row(irow,row_iter)
412
413                         
414                 #treemodel.get_iter()
415                 
416                 
417                 
418         def sort_func_function(self,model, iter1, iter2, data=None):
419                 print "sorting"
420                 
421                 
422         def reload_view(self):
423                 # create the TreeView using liststore
424                 self.modelsort = gtk.TreeModelSort(self.liststorehandler.get_liststore())
425                 self.modelsort.set_sort_column_id(2, gtk.SORT_ASCENDING)
426                 
427                 self.treeview = gtk.TreeView(self.modelsort)
428                 self.treeview.set_headers_visible(True)
429                 
430                 
431                 self.cell=range(self.liststorehandler.get_colcount())
432                 self.tvcolumn=range(self.liststorehandler.get_colcount())
433
434                 
435                 m = self.liststorehandler.get_unitsstore()
436                 
437                 for i in range(self.liststorehandler.get_colcount()):
438                         
439                         if i>5:
440                                 default="0"
441                         else:
442                                 default="1"
443                         if self.db.ladeDirekt("showcol_"+str(self.liststorehandler.get_colname(i)),default)=="1":
444
445                                 if (i==1):
446                                         self.cell[i] = CellRendererTriple()
447                                         self.tvcolumn[i] =      gtk.TreeViewColumn(self.liststorehandler.get_colname(i),self.cell[i])
448                                         self.cell[i].connect( 'status_changed', self.col_toggled)
449                                         self.tvcolumn[i].set_attributes( self.cell[i], status=i)
450                                 
451                                 elif (i==3)or(i==4)or(i==6):
452                                         self.cell[i] = gtk.CellRendererCombo()
453                                         self.tvcolumn[i] =      gtk.TreeViewColumn(self.liststorehandler.get_colname(i),self.cell[i])
454                                         self.cell[i].set_property("model",m)
455                                         self.cell[i].set_property('text-column', i)
456                                         self.cell[i].set_property('editable',True)
457                                         self.cell[i].connect("edited", self.col_edited,i) 
458                                         self.tvcolumn[i].set_attributes( self.cell[i], text=i)
459                                 else:
460                                         self.cell[i] = gtk.CellRendererText()
461                                         self.tvcolumn[i] = gtk.TreeViewColumn(self.liststorehandler.get_colname(i),self.cell[i])
462                                         self.cell[i].set_property('editable',True)
463                                         self.cell[i].set_property('editable-set',True)
464                                         self.cell[i].connect("edited", self.col_edited,i) 
465                                         #self.cell[i].connect("editing-canceled", self.col_edited2,i) 
466                                         self.tvcolumn[i].set_attributes(self.cell[i], text=i)
467
468                                 self.cell[i].set_property('cell-background', 'lightgray')
469                                 self.tvcolumn[i].set_sort_column_id(i)
470                                 self.tvcolumn[i].set_resizable(True)
471                                 
472                                 
473                                 if (i>0):
474                                         self.treeview.append_column(self.tvcolumn[i])
475                                 
476                 
477                 # Allow NOT drag and drop reordering of rows
478                 self.treeview.set_reorderable(False)
479                 
480                 
481                 if self.scrolled_window != None:
482                         self.scrolled_window.destroy()
483                 
484                 self.scrolled_window = gtk.ScrolledWindow()
485                 self.scrolled_window.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC)
486
487                 self.scrolled_window.add(self.treeview)
488                 self.pack_start(self.scrolled_window, expand=True, fill=True, padding=0)
489                 self.loadList()
490                 
491                 self.show_all()
492         
493         def __init__(self,db,liststorehandler,parent_window):
494                 
495                 self.db=db
496                 self.parent_window=parent_window
497                 self.liststorehandler = liststorehandler
498                 
499                 
500                 gtk.VBox.__init__(self,homogeneous=False, spacing=0)
501                 
502                 logging.info("libview, init")
503
504                 self.scrolled_window = None
505                 self.reload_view()
506                 
507                 
508                 
509                 
510                 
511                 """
512                 bearbeitenFrame=gtk.Frame("Verteilung kopieren nach")
513                 bearbeitenvBox=gtk.VBox(homogeneous=False, spacing=0)
514                 
515                 bearbeitenhBox=gtk.HBox(homogeneous=False, spacing=0)
516                 self.comboKlassen = gtk.combo_box_new_text()
517                 bearbeitenhBox.pack_start(self.comboKlassen, expand=False, fill=True, padding=0)
518                 button=gtk.Button("Kopieren")
519                 button.connect("clicked", self.kopiereStoffverteilung, None)
520                 bearbeitenhBox.pack_start(button, expand=False, fill=True, padding=0)
521                 
522                 label=gtk.Label("   ")
523                 bearbeitenhBox.pack_start(label, expand=False, fill=True, padding=0)
524                 
525                 button=gtk.Button("Export in CSV-Datei")
526                 button.connect("clicked", self.exportStoffverteilung, None)
527                 bearbeitenhBox.pack_start(button, expand=False, fill=True, padding=0)
528                 
529                 bearbeitenvBox.pack_start(bearbeitenhBox, expand=False, fill=True, padding=0)
530                 
531         
532                 bearbeitenFrame.add(bearbeitenvBox)
533                 self.pack_start(bearbeitenFrame, expand=False, fill=True, padding=0)
534                 """
535                 
536                 #self.connect("unmap", self.speichere) 
537                 #self.connect("map", self.ladeWirklich) 
538
539                 #self.show_all()
540                 
541                 
542
543                 #print "libstoffverteilung 9: ",time.clock()
544