2 # -*- coding: utf-8 -*-
5 This file is part of Multilist.
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.
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.
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/>.
20 Copyright (C) 2008 Christoph Würstle
24 #Xephyr :2 -host-cursor -screen 800x480x16 -dpi 96 -ac
26 #run-standalone.sh ./eggtimer.py
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/
41 print "gtk import failed"
52 print "PseudoClass hildon"
55 print "PseudoClass hildon.Program"
62 import libliststorehandler
67 app_name = "multilist"
72 class multilistclass(hildon.Program):
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 ()
82 self.window.fullscreen ()
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
88 self.window_in_fullscreen = False
91 def speichereAlles(self,data=None,data2=None):
92 logging.info("Speichere alles")
95 def ladeAlles(self,data=None,data2=None):
96 logging.info("Lade alles")
98 def beforeSync(self,data=None,data2=None):
99 logging.info("Lade alles")
102 def sync_finished(self,data=None,data2=None):
103 self.selection.comboList_changed()
104 self.selection.comboCategory_changed()
105 self.liststorehandler.update_list()
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))
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)
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()
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))
130 col_dialog.set_position(gtk.WIN_POS_CENTER)
131 cols=libview.Columns_dialog(self.db,self.liststorehandler)
133 col_dialog.vbox.pack_start(cols, True, True, 0)
134 col_dialog.set_size_request(500,350)
135 col_dialog.vbox.show_all()
137 resp=col_dialog.run()
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])
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)
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)
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)
172 logging.info('Starting Multilist')
175 logging.info('Hildon erkannt, rufe Hildon constructor auf')
176 hildon.Program.__init__(self)
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)
183 self.window = hildon.Window()
184 self.add_window(self.window)
186 #print "1b: ",time.clock()
189 self.window.connect("delete_event", self.delete_event)
190 self.window.connect("destroy", self.destroy)
191 self.window.set_title("Multilist")
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.
200 self.db=libspeichern.Speichern()
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)
207 #Haupt vbox für alle Elemente
208 self.vbox = gtk.VBox(homogeneous=False, spacing=0)
213 dateimenu = gtk.Menu()
215 menu_items = gtk.MenuItem(_("Choose database file"))
216 dateimenu.append(menu_items)
217 menu_items.connect("activate", self.select_db_dialog, None)
219 menu_items = gtk.MenuItem(_("SQL history"))
220 dateimenu.append(menu_items)
221 menu_items.connect("activate", self.view_sql_history, None)
223 menu_items = gtk.MenuItem(_("SQL optimize"))
224 dateimenu.append(menu_items)
225 menu_items.connect("activate", self.optimizeSQL, None)
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)
233 menu_items = gtk.MenuItem(_("Quit"))
234 dateimenu.append(menu_items)
235 menu_items.connect("activate", self.destroy, None)
238 datei_menu = gtk.MenuItem(_("File"))
240 datei_menu.set_submenu(dateimenu)
243 toolsmenu = gtk.Menu()
246 menu_items = gtk.MenuItem(_("Choose columns"))
247 toolsmenu.append(menu_items)
248 menu_items.connect("activate", self.show_columns_dialog, None)
250 menu_items = gtk.MenuItem(_("Rename Category"))
251 toolsmenu.append(menu_items)
252 menu_items.connect("activate", self.bottombar.rename_category, None)
254 menu_items = gtk.MenuItem(_("Rename List"))
255 toolsmenu.append(menu_items)
256 menu_items.connect("activate", self.bottombar.rename_list, None)
258 tools_menu = gtk.MenuItem(_("Tools"))
260 tools_menu.set_submenu(toolsmenu)
263 hilfemenu = gtk.Menu()
264 menu_items = gtk.MenuItem(_("About"))
265 hilfemenu.append(menu_items)
266 menu_items.connect("activate", self.show_about, None)
268 hilfe_menu = gtk.MenuItem(_("Help"))
270 hilfe_menu.set_submenu(hilfemenu)
272 menu_bar = gtk.MenuBar()
274 menu_bar.append (datei_menu)
275 menu_bar.append (tools_menu)
276 # unten -> damit als letztes menu_bar.append (hilfe_menu)
278 menu_bar.append (hilfe_menu)
282 for child in menu_bar.get_children():
284 self.window.set_menu(menu)
287 self.vbox.pack_start(menu_bar, False, False, 2)
292 #add to vbox below (to get it on top)
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)
301 if (isHildon==True): self.osso_c = osso.Context(app_name, version, False)
302 self.window.add(self.vbox)
303 self.window.show_all()
309 #print "9: ",time.clock()
313 if (isHildon==True): self.osso_c.close()
315 def destroy(self, widget=None, data=None):
316 self.speichereAlles()
321 def delete_event(self, widget, event, data=None):
322 #print "delete event occurred"
325 def dlg_delete(self,widget,event,data=None):
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)
341 def on_info1_activate(self,menuitem):
342 self.show_about(menuitem)
345 def view_sql_history(self,widget=None,data=None,data2=None):
346 sqldiag=libsqldialog.sqlDialog(self.db)
350 logging.info("exporting sql")
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)
357 #dlg = hildon.FileChooserDialog(parent = self.window, action = gtk.FILE_CHOOSER_ACTION_SAVE)
358 dlg=hildon.FileChooserDialog(self.window, gtk.FILE_CHOOSER_ACTION_SAVE)
360 dlg.set_title(_("Select SQL export file"))
361 if dlg.run() == gtk.RESPONSE_OK:
362 fileName = dlg.get_filename()
364 sqldiag.exportSQL(fileName)
371 def optimizeSQL(self,widget=None,data=None,data2=None):
373 self.db.speichereSQL("VACUUM",log=False)
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)
384 #dlg = hildon.FileChooserDialog(parent = self.window, action = gtk.FILE_CHOOSER_ACTION_SAVE)
385 dlg=hildon.FileChooserDialog(self.window, gtk.FILE_CHOOSER_ACTION_SAVE)
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()