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