Initial commit
[multilist] / src / multilistclasses / libmultilist.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4 #/scratchbox/login
5 #Xephyr :2 -host-cursor -screen 800x480x16 -dpi 96 -ac
6 #af-sb-init.sh start
7 #run-standalone.sh ./eggtimer.py
8 #
9 #https://stage.maemo.org/svn/maemo/projects/haf/trunk/
10 #http://www.maemo.org/platform/docs/pymaemo/pyosso_context.html
11 #http://maemo-hackers.org/apt/
12
13 import time
14 import os
15 import sys
16 import logging
17
18 try:
19         import gtk
20         #import gtk.glade
21 except:
22         print "gtk import failed"
23         sys.exit(1)
24         
25 try:
26         import hildon
27         import osso
28         isHildon=True
29 except:
30         isHildon=False
31         class hildon():
32                 def __init__(self):
33                         print "PseudoClass hildon"
34                 class Program():
35                         def __init__(self):
36                                 print "PseudoClass hildon.Program"
37
38 #import libextdatei
39 import libspeichern
40 import libsqldialog
41 import libselection
42 import libview
43 import libliststorehandler
44 import libsync
45 import libbottombar
46
47 version = "0.3.0"
48 app_name = "Multilist"
49
50                 
51         
52
53 class multilistclass(hildon.Program):
54                 
55         def on_key_press(self, widget, event, *args):
56                 #Hildon Fullscreen Modus
57                 if (isHildon==False): return
58                 if event.keyval == gtk.keysyms.F6: 
59                         # The "Full screen" hardware key has been pressed 
60                         if self.window_in_fullscreen: 
61                                 self.window.unfullscreen () 
62                         else: 
63                                 self.window.fullscreen () 
64                 
65         def on_window_state_change(self, widget, event, *args): 
66                 if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN: 
67                         self.window_in_fullscreen = True 
68                 else: 
69                         self.window_in_fullscreen = False 
70
71         
72         def speichereAlles(self,data=None,data2=None):
73                 logging.info("Speichere alles")
74
75
76         def ladeAlles(self,data=None,data2=None):
77                 logging.info("Lade alles")
78                 
79         def beforeSync(self,data=None,data2=None):
80                 logging.info("Lade alles")
81
82
83         def sync_finished(self,data=None,data2=None):
84                 self.selection.comboList_changed()
85                 self.selection.comboCategory_changed()
86                 self.liststorehandler.update_list()
87                 
88         
89         def prepare_sync_dialog(self):
90                 self.sync_dialog = gtk.Dialog("Sync",None,gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
91                 
92                 self.sync_dialog.set_position(gtk.WIN_POS_CENTER)
93                 sync=libsync.Sync(self.db)
94                 sync.connect("syncFinished",self.sync_finished)
95                 self.sync_dialog.vbox.pack_start(sync, True, True, 0)
96                 self.sync_dialog.set_size_request(500,350)
97                 self.sync_dialog.vbox.show_all()
98                 sync.connect("syncFinished",self.sync_finished)
99         
100         
101         def sync_notes(self,widget=None,data=None):
102                 if self.sync_dialog==None:
103                         self.prepare_sync_dialog()
104                 self.sync_dialog.run()
105                 self.sync_dialog.hide()
106
107
108         def show_columns_dialog(self,widget=None,data=None):
109                 col_dialog = gtk.Dialog("Choose columns",self.window,gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
110                 
111                 col_dialog.set_position(gtk.WIN_POS_CENTER)
112                 cols=libview.Columns_dialog(self.db,self.liststorehandler)
113
114                 col_dialog.vbox.pack_start(cols, True, True, 0)
115                 col_dialog.set_size_request(500,350)
116                 col_dialog.vbox.show_all()
117                 
118                 resp=col_dialog.run()
119                 col_dialog.hide()
120                 if resp==gtk.RESPONSE_ACCEPT:
121                         logging.info("changing columns")
122                         cols.save_column_setting()
123                         self.view.reload_view()
124                         #children=self.vbox.get_children()
125                         #while len(children)>1:
126                         #       self.vbox.remove(children[1])
127
128                         #self.vbox.pack_end(self.bottombar, expand=True, fill=True, padding=0)
129                         #self.vbox.pack_end(view, expand=True, fill=True, padding=0)
130                         #self.vbox.pack_end(self.selection, expand=False, fill=True, padding=0)
131                         
132
133                 col_dialog.destroy()
134                 
135
136
137         def __init__(self):
138                 home_dir = os.path.expanduser('~')
139                 dblog=os.path.join(home_dir, "multilist.log") 
140                 logging.basicConfig(level=logging.INFO,format='%(asctime)s %(levelname)-8s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename=dblog,filemode='a')
141                 #logging.getLogger('').addHandler(console)
142                 
143                 # define a Handler which writes INFO messages or higher to the sys.stderr
144                 console = logging.StreamHandler()
145                 console.setLevel(logging.INFO)
146                 # set a format which is simpler for console use
147                 formatter = logging.Formatter('%(asctime)s  %(levelname)-8s %(message)s')
148                 # tell the handler to use this format
149                 console.setFormatter(formatter)
150                 # add the handler to the root logger
151                 logging.getLogger('').addHandler(console)
152                 
153                 logging.info('Starting Multilist')
154                 
155                 if (isHildon==True): 
156                         logging.info('Hildon erkannt, rufe Hildon constructor auf')
157                         hildon.Program.__init__(self)
158                                 
159                 #Get the Main Window, and connect the "destroy" event
160                 if (isHildon==False):
161                         self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
162                         self.window.set_default_size(700,500)
163                 else:
164                         self.window = hildon.Window()
165                         self.add_window(self.window)
166                         
167                 #print "1b: ",time.clock() 
168                 
169                 if (self.window):
170                         self.window.connect("delete_event", self.delete_event)
171                         self.window.connect("destroy", self.destroy)
172                         self.window.set_title("Multilist")
173                         
174                         
175                         
176                         if (isHildon==True): self.window.connect("key-press-event", self.on_key_press) 
177                         self.window.connect("window-state-event", self.on_window_state_change) 
178                         self.window_in_fullscreen = False #The window isn't in full screen mode initially.
179
180
181                 self.db=libspeichern.Speichern()
182                 
183                 self.selection=libselection.Selection(self.db,isHildon)
184                 self.liststorehandler=libliststorehandler.Liststorehandler(self.db,self.selection)
185                 self.view=libview.View(self.db,self.liststorehandler,self.window)
186                 self.bottombar=libbottombar.Bottombar(self.db,self.view,isHildon)
187                 
188                 #Haupt vbox für alle Elemente
189                 self.vbox = gtk.VBox(homogeneous=False, spacing=0)
190                 
191                 
192                 
193                 #Menue
194                 dateimenu = gtk.Menu()
195                 
196                 menu_items = gtk.MenuItem("DB auswählen")
197                 dateimenu.append(menu_items)
198                 menu_items.connect("activate", self.select_db_dialog, None)
199                 
200                 menu_items = gtk.MenuItem("SQL History anschauen")
201                 dateimenu.append(menu_items)
202                 menu_items.connect("activate", self.view_sql_history, None)
203                 
204                 menu_items = gtk.MenuItem("SQL optimieren")
205                 dateimenu.append(menu_items)
206                 menu_items.connect("activate", self.optimizeSQL, None)
207                 
208                 menu_items = gtk.MenuItem("Sync items")
209                 self.prepare_sync_dialog()
210                 dateimenu.append(menu_items)
211                 menu_items.connect("activate", self.sync_notes, None)
212                 
213                 
214                 menu_items = gtk.MenuItem("Beenden")
215                 dateimenu.append(menu_items)
216                 menu_items.connect("activate", self.destroy, None)
217                 #menu_items.show()
218                 
219                 datei_menu = gtk.MenuItem("Datei")
220                 datei_menu.show()
221                 datei_menu.set_submenu(dateimenu)
222                 
223                 
224                 toolsmenu = gtk.Menu()
225                 
226                 
227                 menu_items = gtk.MenuItem("Choose columns")
228                 toolsmenu.append(menu_items)
229                 menu_items.connect("activate", self.show_columns_dialog, None)
230                 
231                 menu_items = gtk.MenuItem("Rename Category")
232                 toolsmenu.append(menu_items)
233                 menu_items.connect("activate", self.bottombar.rename_category, None)
234                 
235                 menu_items = gtk.MenuItem("Rename List")
236                 toolsmenu.append(menu_items)
237                 menu_items.connect("activate", self.bottombar.rename_list, None)
238                 
239                 tools_menu = gtk.MenuItem("Tools")
240                 tools_menu.show()
241                 tools_menu.set_submenu(toolsmenu)
242                 
243                 
244                 hilfemenu = gtk.Menu()
245                 menu_items = gtk.MenuItem("Über")
246                 hilfemenu.append(menu_items)
247                 menu_items.connect("activate", self.show_about, None)
248                 
249                 hilfe_menu = gtk.MenuItem("Hilfe")
250                 hilfe_menu.show()
251                 hilfe_menu.set_submenu(hilfemenu)
252                 
253                 menu_bar = gtk.MenuBar()
254                 menu_bar.show()
255                 menu_bar.append (datei_menu)
256                 menu_bar.append (tools_menu)
257                 # unten -> damit als letztes menu_bar.append (hilfe_menu)
258                 #Als letztes menü
259                 menu_bar.append (hilfe_menu)
260                 
261                 if (isHildon==True):
262                         menu = gtk.Menu() 
263                         for child in menu_bar.get_children():
264                                 child.reparent(menu) 
265                         self.window.set_menu(menu)
266                         menu_bar.destroy()
267                 else:
268                         self.vbox.pack_start(menu_bar, False, False, 2)
269                 
270                 
271                 
272
273                 #add to vbox below (to get it on top)
274                 
275                 
276                 
277                 self.vbox.pack_end(self.bottombar, expand=False, fill=True, padding=0)
278                 self.vbox.pack_end(self.view, expand=True, fill=True, padding=0)
279                 self.vbox.pack_end(self.selection, expand=False, fill=True, padding=0)
280                 
281
282                 if (isHildon==True): self.osso_c = osso.Context(app_name, version, False)
283                 self.window.add(self.vbox)
284                 self.window.show_all()
285                 
286                 #print "8a"
287                 self.ladeAlles()
288                 
289                 
290                 #print "9: ",time.clock()
291                         
292         def main(self):
293                 gtk.main()
294                 if (isHildon==True): self.osso_c.close()
295                 
296         def destroy(self, widget=None, data=None):
297                 self.speichereAlles()
298                 self.db.close()
299                 gtk.main_quit()
300                 
301                 
302         def delete_event(self, widget, event, data=None):
303                 #print "delete event occurred"
304                 return False
305         
306         def dlg_delete(self,widget,event,data=None):
307                 return False
308
309
310         def show_about(self, widget=None,data=None):
311                 dialog = gtk.AboutDialog()
312                 dialog.set_position(gtk.WIN_POS_CENTER)
313                 dialog.set_name(app_name)
314                 dialog.set_version(version)
315                 dialog.set_copyright("")
316                 dialog.set_website("http://axique.de/f=Multilist")
317                 comments = "%s is a program to handle multiple lists." % app_name
318                 dialog.set_comments(comments)        
319                 dialog.run()     
320                 dialog.destroy()
321         
322         def on_info1_activate(self,menuitem):
323                 self.show_about(menuitem)
324
325   
326         def view_sql_history(self,widget=None,data=None,data2=None):
327                 sqldiag=libsqldialog.sqlDialog(self.db)
328                 res=sqldiag.run()
329                 sqldiag.hide()
330                 if res==444:
331                         logging.info("exporting sql")
332                         
333                         if (isHildon==False):
334                                 dlg = gtk.FileChooserDialog(parent = self.window, action = gtk.FILE_CHOOSER_ACTION_SAVE)
335                                 dlg.add_button( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
336                                 dlg.add_button( gtk.STOCK_OK, gtk.RESPONSE_OK)
337                         else:
338                                 #dlg = hildon.FileChooserDialog(parent = self.window, action = gtk.FILE_CHOOSER_ACTION_SAVE)
339                                 dlg=hildon.FileChooserDialog(self.window, gtk.FILE_CHOOSER_ACTION_SAVE)
340                         
341                         dlg.set_title("Wähle SQL-Export-Datei")
342                         if dlg.run() == gtk.RESPONSE_OK:
343                                 fileName = dlg.get_filename()
344                                 dlg.destroy()
345                                 sqldiag.exportSQL(fileName)
346                         else:
347                                 dlg.destroy()
348                                 
349                 sqldiag.destroy()
350
351                 
352         def optimizeSQL(self,widget=None,data=None,data2=None): 
353                 #optimiere sql
354                 self.db.speichereSQL("VACUUM",log=False)
355                 
356   
357
358   
359         def select_db_dialog(self,widget=None,data=None,data2=None):
360                 if (isHildon==False):
361                         dlg = gtk.FileChooserDialog(parent = self.window, action = gtk.FILE_CHOOSER_ACTION_SAVE)
362                         dlg.add_button( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
363                         dlg.add_button( gtk.STOCK_OK, gtk.RESPONSE_OK)
364                 else:
365                         #dlg = hildon.FileChooserDialog(parent = self.window, action = gtk.FILE_CHOOSER_ACTION_SAVE)
366                         dlg=hildon.FileChooserDialog(self.window, gtk.FILE_CHOOSER_ACTION_SAVE)
367                         
368                 
369                 if self.db.ladeDirekt('datenbank'):
370                         dlg.set_filename(self.db.ladeDirekt('datenbank'))
371                 dlg.set_title("Wähle Datenbank-Datei")
372                 if dlg.run() == gtk.RESPONSE_OK:
373                         fileName = dlg.get_filename()
374                         self.db.speichereDirekt('datenbank',fileName)
375                         self.speichereAlles()
376                         self.db.openDB()
377                         self.ladeAlles()
378                 dlg.destroy()
379                 
380                 
381                 
382