2 # -*- coding: utf-8 -*-
5 #Xephyr :2 -host-cursor -screen 800x480x16 -dpi 96 -ac
7 #run-standalone.sh ./eggtimer.py
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/
22 print "gtk import failed"
33 print "PseudoClass hildon"
36 print "PseudoClass hildon.Program"
43 import libliststorehandler
48 app_name = "Multilist"
53 class multilistclass(hildon.Program):
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 ()
63 self.window.fullscreen ()
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
69 self.window_in_fullscreen = False
72 def speichereAlles(self,data=None,data2=None):
73 logging.info("Speichere alles")
76 def ladeAlles(self,data=None,data2=None):
77 logging.info("Lade alles")
79 def beforeSync(self,data=None,data2=None):
80 logging.info("Lade alles")
83 def sync_finished(self,data=None,data2=None):
84 self.selection.comboList_changed()
85 self.selection.comboCategory_changed()
86 self.liststorehandler.update_list()
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))
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)
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()
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))
111 col_dialog.set_position(gtk.WIN_POS_CENTER)
112 cols=libview.Columns_dialog(self.db,self.liststorehandler)
114 col_dialog.vbox.pack_start(cols, True, True, 0)
115 col_dialog.set_size_request(500,350)
116 col_dialog.vbox.show_all()
118 resp=col_dialog.run()
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])
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)
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)
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)
153 logging.info('Starting Multilist')
156 logging.info('Hildon erkannt, rufe Hildon constructor auf')
157 hildon.Program.__init__(self)
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)
164 self.window = hildon.Window()
165 self.add_window(self.window)
167 #print "1b: ",time.clock()
170 self.window.connect("delete_event", self.delete_event)
171 self.window.connect("destroy", self.destroy)
172 self.window.set_title("Multilist")
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.
181 self.db=libspeichern.Speichern()
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)
188 #Haupt vbox für alle Elemente
189 self.vbox = gtk.VBox(homogeneous=False, spacing=0)
194 dateimenu = gtk.Menu()
196 menu_items = gtk.MenuItem("DB auswählen")
197 dateimenu.append(menu_items)
198 menu_items.connect("activate", self.select_db_dialog, None)
200 menu_items = gtk.MenuItem("SQL History anschauen")
201 dateimenu.append(menu_items)
202 menu_items.connect("activate", self.view_sql_history, None)
204 menu_items = gtk.MenuItem("SQL optimieren")
205 dateimenu.append(menu_items)
206 menu_items.connect("activate", self.optimizeSQL, None)
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)
214 menu_items = gtk.MenuItem("Beenden")
215 dateimenu.append(menu_items)
216 menu_items.connect("activate", self.destroy, None)
219 datei_menu = gtk.MenuItem("Datei")
221 datei_menu.set_submenu(dateimenu)
224 toolsmenu = gtk.Menu()
227 menu_items = gtk.MenuItem("Choose columns")
228 toolsmenu.append(menu_items)
229 menu_items.connect("activate", self.show_columns_dialog, None)
231 menu_items = gtk.MenuItem("Rename Category")
232 toolsmenu.append(menu_items)
233 menu_items.connect("activate", self.bottombar.rename_category, None)
235 menu_items = gtk.MenuItem("Rename List")
236 toolsmenu.append(menu_items)
237 menu_items.connect("activate", self.bottombar.rename_list, None)
239 tools_menu = gtk.MenuItem("Tools")
241 tools_menu.set_submenu(toolsmenu)
244 hilfemenu = gtk.Menu()
245 menu_items = gtk.MenuItem("Über")
246 hilfemenu.append(menu_items)
247 menu_items.connect("activate", self.show_about, None)
249 hilfe_menu = gtk.MenuItem("Hilfe")
251 hilfe_menu.set_submenu(hilfemenu)
253 menu_bar = gtk.MenuBar()
255 menu_bar.append (datei_menu)
256 menu_bar.append (tools_menu)
257 # unten -> damit als letztes menu_bar.append (hilfe_menu)
259 menu_bar.append (hilfe_menu)
263 for child in menu_bar.get_children():
265 self.window.set_menu(menu)
268 self.vbox.pack_start(menu_bar, False, False, 2)
273 #add to vbox below (to get it on top)
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)
282 if (isHildon==True): self.osso_c = osso.Context(app_name, version, False)
283 self.window.add(self.vbox)
284 self.window.show_all()
290 #print "9: ",time.clock()
294 if (isHildon==True): self.osso_c.close()
296 def destroy(self, widget=None, data=None):
297 self.speichereAlles()
302 def delete_event(self, widget, event, data=None):
303 #print "delete event occurred"
306 def dlg_delete(self,widget,event,data=None):
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)
322 def on_info1_activate(self,menuitem):
323 self.show_about(menuitem)
326 def view_sql_history(self,widget=None,data=None,data2=None):
327 sqldiag=libsqldialog.sqlDialog(self.db)
331 logging.info("exporting sql")
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)
338 #dlg = hildon.FileChooserDialog(parent = self.window, action = gtk.FILE_CHOOSER_ACTION_SAVE)
339 dlg=hildon.FileChooserDialog(self.window, gtk.FILE_CHOOSER_ACTION_SAVE)
341 dlg.set_title("Wähle SQL-Export-Datei")
342 if dlg.run() == gtk.RESPONSE_OK:
343 fileName = dlg.get_filename()
345 sqldiag.exportSQL(fileName)
352 def optimizeSQL(self,widget=None,data=None,data2=None):
354 self.db.speichereSQL("VACUUM",log=False)
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)
365 #dlg = hildon.FileChooserDialog(parent = self.window, action = gtk.FILE_CHOOSER_ACTION_SAVE)
366 dlg=hildon.FileChooserDialog(self.window, gtk.FILE_CHOOSER_ACTION_SAVE)
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()