Slowly cleaning up the code
authorEd Page <eopage@byu.net>
Thu, 18 Mar 2010 23:38:19 +0000 (18:38 -0500)
committerEd Page <eopage@byu.net>
Thu, 18 Mar 2010 23:38:19 +0000 (18:38 -0500)
src/copydb.py
src/libbottombar.py
src/libliststorehandler.py
src/libmultilist.py
src/multilist.py

index e50f303..8361cf3 100755 (executable)
@@ -3,25 +3,30 @@
 
 import time
 import sqlite3
-import shelve
 import uuid
 
-db="/home/chris/Documents/Schule/Schule/schulplaner/schuljahr200708enni.s3db"
-conn = sqlite3.connect(db)
-cur = conn.cursor()
 
-sql="UPDATE sync SET syncpartner=? WHERE syncpartner=?"
-cur.execute(sql,(str(uuid.uuid4()),"self")) #Eigene Id ändern feststellen
-conn.commit()
+def copydb(db):
+       conn = sqlite3.connect(db)
+       cur = conn.cursor()
 
-sql="DELETE FROM sync WHERE syncpartner=?"
-cur.execute(sql,("self",))
-conn.commit()
+       sql = "UPDATE sync SET syncpartner=? WHERE syncpartner=?"
+       cur.execute(sql,(str(uuid.uuid4()),"self")) #Eigene Id ändern feststellen
+       conn.commit()
 
-sql="INSERT INTO sync (syncpartner,uuid,pcdatum) VALUES (?,?,?)"
-cur.execute(sql,("self",str(uuid.uuid4()),int(time.time())))
+       sql = "DELETE FROM sync WHERE syncpartner=?"
+       cur.execute(sql,("self",))
+       conn.commit()
 
-sql="UPDATE sync SET pcdatum=?"
-cur.execute(sql,(int(time.time()),))
+       sql = "INSERT INTO sync (syncpartner,uuid,pcdatum) VALUES (?,?,?)"
+       cur.execute(sql,("self",str(uuid.uuid4()),int(time.time())))
 
-conn.commit()
\ No newline at end of file
+       sql = "UPDATE sync SET pcdatum=?"
+       cur.execute(sql,(int(time.time()),))
+
+       conn.commit()
+
+
+if __name__ == "__main__":
+       db = "/home/chris/Documents/Schule/Schule/schulplaner/schuljahr200708enni.s3db"
+       copydb(db)
index 654c72d..5542fa5 100644 (file)
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
-  
+
 """
-    This file is part of Multilist.
-
-    Multilist is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Multilist is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Multilist.  If not, see <http://www.gnu.org/licenses/>.
-    
-    Copyright (C) 2008 Christoph Würstle
+This file is part of Multilist.
+
+Multilist is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Multilist is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Multilist.  If not, see <http://www.gnu.org/licenses/>.
+
+Copyright (C) 2008 Christoph Würstle
 """
 
 
 import gobject
-import time
 import logging
 
 import gtk
 
+try:
+       _
+except NameError:
+       _ = lambda x: x
+
+
+_moduleLogger = logging.getLogger(__name__)
+
+
 class Bottombar(gtk.HBox):
-       
+
        __gsignals__ = {
-               'changed' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,(gobject.TYPE_STRING,gobject.TYPE_STRING)),
+               'changed' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,(gobject.TYPE_STRING,gobject.TYPE_STRING)),
                #'changedCategory': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,(gobject.TYPE_STRING,gobject.TYPE_STRING))
-       }
+       }
 
-               
        def new_item(self,widget=None,data1=None,data2=None):
                dialog = gtk.Dialog(_("New item name:"),None,gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
-               
-               dialog.set_position(gtk.WIN_POS_CENTER)
+               dialog.set_position(gtk.WIN_POS_CENTER)
                entryKlasse=gtk.Entry()
                entryKlasse.set_text("")
-               
+
                dialog.vbox.pack_start(entryKlasse, True, True, 0)
-               
-               dialog.vbox.show_all()
+
+               dialog.vbox.show_all()
                #dialog.set_size_request(400,300)
 
                if dialog.run() == gtk.RESPONSE_ACCEPT:
-                       #logging.info("new category name "+entryKlasse.get_text())
+                       #_moduleLogger.info("new category name "+entryKlasse.get_text())
                        #self.view.liststorehandler.rename_category(entryKlasse.get_text())
                        self.view.liststorehandler.add_row(entryKlasse.get_text())
                dialog.destroy()
 
-               
        def del_item(self,widget=None,data1=None,data2=None):
                path, col = self.view.treeview.get_cursor()
                if path!=None:
-                       mbox=gtk.MessageDialog(None,gtk.DIALOG_MODAL,gtk.MESSAGE_QUESTION,gtk.BUTTONS_YES_NO,_("Delete current item?")) 
-                       response=mbox.run() 
-                       mbox.hide() 
-                       mbox.destroy() 
+                       mbox=gtk.MessageDialog(None,gtk.DIALOG_MODAL,gtk.MESSAGE_QUESTION,gtk.BUTTONS_YES_NO,_("Delete current item?"))
+                       response=mbox.run()
+                       mbox.hide()
+                       mbox.destroy()
                        if response==gtk.RESPONSE_YES:
                                self.view.del_active_row()
                else:
-                       mbox=gtk.MessageDialog(None,gtk.DIALOG_MODAL,gtk.MESSAGE_ERROR,gtk.BUTTONS_OK,_("No item selected!")) 
-                       response=mbox.run() 
-                       mbox.hide() 
-                       mbox.destroy()                  
-               
-               
+                       mbox=gtk.MessageDialog(None,gtk.DIALOG_MODAL,gtk.MESSAGE_ERROR,gtk.BUTTONS_OK,_("No item selected!"))
+                       response=mbox.run()
+                       mbox.hide()
+                       mbox.destroy()
+
        def checkout_items(self,widget=None,data1=None,data2=None):
                #self.view.del_active_row()
-               mbox=gtk.MessageDialog(None,gtk.DIALOG_MODAL,gtk.MESSAGE_QUESTION,gtk.BUTTONS_YES_NO,(_("Really checkout all items?"))) 
-               response=mbox.run() 
-               mbox.hide() 
-               mbox.destroy() 
+               mbox=gtk.MessageDialog(None,gtk.DIALOG_MODAL,gtk.MESSAGE_QUESTION,gtk.BUTTONS_YES_NO,(_("Really checkout all items?")))
+               response=mbox.run()
+               mbox.hide()
+               mbox.destroy()
                if response==gtk.RESPONSE_YES:
                        self.view.liststorehandler.checkout_rows()
                        #n=len(self.view.liststorehandler.get_liststore())
                        #for i in range(n):
                        #       self.view.liststorehandler.checkout_rows()
                        #       #print i
-                       
+
        def search_list(self,widget=None,data1=None,data2=None):
                self.view.liststorehandler.get_liststore(widget.get_text())
-                       
-       
+
        def rename_category(self,widget=None,data1=None,data2=None):
                dialog = gtk.Dialog(_("New category name:"),None,gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
-               
-               dialog.set_position(gtk.WIN_POS_CENTER)
+
+               dialog.set_position(gtk.WIN_POS_CENTER)
                entryKlasse=gtk.Entry()
                entryKlasse.set_text(self.view.liststorehandler.selection.get_category())
-               
+
                dialog.vbox.pack_start(entryKlasse, True, True, 0)
-               
-               dialog.vbox.show_all()
+
+               dialog.vbox.show_all()
                #dialog.set_size_request(400,300)
 
                if dialog.run() == gtk.RESPONSE_ACCEPT:
-                       logging.info("new category name "+entryKlasse.get_text())
+                       _moduleLogger.info("new category name "+entryKlasse.get_text())
                        self.view.liststorehandler.rename_category(entryKlasse.get_text())
                else:
                        #print "Cancel",res
                        pass
-               dialog.destroy()
-               
-               
+               dialog.destroy()
+
        def rename_list(self,widget=None,data1=None,data2=None):
                dialog = gtk.Dialog(_("New list name:"),None,gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,(gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT,gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
-               
-               dialog.set_position(gtk.WIN_POS_CENTER)
+
+               dialog.set_position(gtk.WIN_POS_CENTER)
                entryKlasse=gtk.Entry()
                entryKlasse.set_text(self.view.liststorehandler.selection.get_list())
-               
+
                dialog.vbox.pack_start(entryKlasse, True, True, 0)
-               
-               dialog.vbox.show_all()
+
+               dialog.vbox.show_all()
                #dialog.set_size_request(400,300)
 
                if dialog.run() == gtk.RESPONSE_ACCEPT:
-                       logging.info("new list name "+entryKlasse.get_text())
+                       _moduleLogger.info("new list name "+entryKlasse.get_text())
                        self.view.liststorehandler.rename_list(entryKlasse.get_text())
                else:
                        #print "Cancel",res
                        pass
-               dialog.destroy()
-       
+               dialog.destroy()
+
        def __init__(self,db,view,isHildon):
                gtk.HBox.__init__(self,homogeneous=False, spacing=3)
-               
+
                self.db=db
                self.isHildon=isHildon
                self.view=view
-               
-               logging.info("libBottomBar, init")
-                       
-               
+
+               _moduleLogger.info("libBottomBar, init")
+
                button=gtk.Button(_("New item"))
                button.connect("clicked",self.new_item)
                self.pack_start(button, expand=False, fill=True, padding=0)
-               
+
                label=gtk.Label("  ")
                self.pack_start(label, expand=True, fill=True, padding=0)
-               
+
                label=gtk.Label(_("Search:"))
                self.pack_start(label, expand=False, fill=True, padding=0)
                searchEntry=gtk.Entry()
                searchEntry.connect("changed",self.search_list)
                self.pack_start(searchEntry, expand=True, fill=True, padding=0)
-               
+
                label=gtk.Label("  ")
                self.pack_start(label, expand=True, fill=True, padding=0)
-               
+
                button=gtk.Button(_("Checkout all items"))
                button.connect("clicked",self.checkout_items)
                self.pack_start(button, expand=False, fill=True, padding=0)
-               
+
                button=gtk.Button(_("Del item"))
                button.connect("clicked",self.del_item)
                self.pack_start(button, expand=False, fill=True, padding=0)
-               
-               
-               
index 933a90c..2b013b8 100644 (file)
@@ -1,33 +1,40 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
-  
+
 """
-    This file is part of Multilist.
-
-    Multilist is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Multilist is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Multilist.  If not, see <http://www.gnu.org/licenses/>.
-    
-    Copyright (C) 2008 Christoph Würstle
+This file is part of Multilist.
+
+Multilist is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Multilist is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Multilist.  If not, see <http://www.gnu.org/licenses/>.
+
+Copyright (C) 2008 Christoph Würstle
 """
 
 import gtk
-import gobject
-import libspeichern
 import logging
 
 
-class Liststorehandler():
-       
+try:
+       _
+except NameError:
+       _ = lambda x: x
+
+
+_moduleLogger = logging.getLogger(__name__)
+
+
+class Liststorehandler(object):
+
        def get_unitsstore(self):
                if (self.unitsstore==None):
                        self.unitsstore=gtk.ListStore(str, str, str,str,str,  str,str, str, str,str, str, str,str)
@@ -35,38 +42,34 @@ class Liststorehandler():
                #row(3) quantities
                #row 4 units
                #row 6 priority
-               self.unitsstore.append(["-1","-1","","","","","","","","","","",""])    
-               self.unitsstore.append(["-1","-1","","1","g","","0","","","","","",""]) 
-               self.unitsstore.append(["-1","-1","","2","kg","","1","","","","","",""])        
-               self.unitsstore.append(["-1","-1","","3","liter","","2","","","","","",""])     
-               self.unitsstore.append(["-1","-1","","4","packs","","3","","","","","",""])     
-               self.unitsstore.append(["-1","-1","","5","","","4","","","","","",""])  
-               self.unitsstore.append(["-1","-1","","6","","","5","","","","","",""])  
-               self.unitsstore.append(["-1","-1","","7","","","6","","","","","",""])  
-               self.unitsstore.append(["-1","-1","","8","","","7","","","","","",""])  
-               self.unitsstore.append(["-1","-1","","9","","","8","","","","","",""])  
-               self.unitsstore.append(["-1","-1","","","","","9","","","","","",""])   
-               
+               self.unitsstore.append(["-1","-1","","","","","","","","","","",""])
+               self.unitsstore.append(["-1","-1","","1","g","","0","","","","","",""])
+               self.unitsstore.append(["-1","-1","","2","kg","","1","","","","","",""])
+               self.unitsstore.append(["-1","-1","","3","liter","","2","","","","","",""])
+               self.unitsstore.append(["-1","-1","","4","packs","","3","","","","","",""])
+               self.unitsstore.append(["-1","-1","","5","","","4","","","","","",""])
+               self.unitsstore.append(["-1","-1","","6","","","5","","","","","",""])
+               self.unitsstore.append(["-1","-1","","7","","","6","","","","","",""])
+               self.unitsstore.append(["-1","-1","","8","","","7","","","","","",""])
+               self.unitsstore.append(["-1","-1","","9","","","8","","","","","",""])
+               self.unitsstore.append(["-1","-1","","","","","9","","","","","",""])
+
                return self.unitsstore
-               
-               
-       
-       
+
        def get_liststore(self,titlesearch=""):
                if (self.liststore==None):
                        self.liststore=gtk.ListStore(str, str, str,str,str,  str,str, str, str,str, str, str,str)
                self.liststore.clear()
-               
+
                titlesearch=titlesearch+"%"
-               
-               
+
                if (self.selection.get_status()=="0"): #only 0 and 1 (active items)
                        sql="SELECT uid,status,title,quantitiy,unit,price,priority,date,private,stores,note,custom1,custom2 FROM items WHERE list=? AND category LIKE ? AND status>=? AND title like ? ORDER BY category, status, title"
                        rows=self.db.ladeSQL(sql,(self.selection.get_list(),self.selection.get_category(True),self.selection.get_status(),titlesearch))
                else:
                        sql="SELECT uid,status,title,quantitiy,unit,price,priority,date,private,stores,note,custom1,custom2 FROM items WHERE list=? AND category LIKE ? AND title LIKE ? ORDER BY category, title ASC"
                        rows=self.db.ladeSQL(sql,(self.selection.get_list(),self.selection.get_category(True),titlesearch))
-                       
+
                #print rows
                if ((rows!=None)and(len(rows)>0)):
                        for row in rows:
@@ -79,52 +82,45 @@ class Liststorehandler():
                        #self.liststore.append(["-1","-1",""," ","","","","","","","","",""])   
                #import uuid
                #self.liststore.append(["-1","-1","","","","","","","","","","",""])
-               
+
                return self.liststore
-       
-       
+
        def emptyValueExists(self):
                for child in self.liststore:
                        if child[2]=="":
                                return True
                return False
-               
-       
 
        def update_row(self,irow,icol,new_text):
                #print "liststore 1"
                #for x in self.liststore:
                #       print x[0],x[2]
-               
+
                if (irow>-1)and(self.liststore[irow][0]!="-1")and(self.liststore[irow][0]!=None):
                        sql = "UPDATE items SET "+self.collist[icol]+"=? WHERE uid=?"
                        self.db.speichereSQL(sql,(new_text,self.liststore[irow][0]),rowid=self.liststore[irow][0])
-                       
-                       logging.info("Updated row: "+self.collist[icol]+" new text "+new_text+" Titel: "+str(self.liststore[irow][2])+" with uid "+str(self.liststore[irow][0]))
-                       
-                       self.liststore[irow][icol]=new_text 
+
+                       _moduleLogger.info("Updated row: "+self.collist[icol]+" new text "+new_text+" Titel: "+str(self.liststore[irow][2])+" with uid "+str(self.liststore[irow][0]))
+
+                       self.liststore[irow][icol]=new_text
                else:
-                       logging.warning("update_row: row does not exist")
+                       _moduleLogger.warning("update_row: row does not exist")
                        return
                        #if (self.emptyValueExists()==True)and(icol<2):
                        #       #print "letzter Eintrag ohne inhalt"
                        #       return
-                       
+
                #print "liststore 2"
                #for x in self.liststore:
                #       print x[0],x[2]
-               
-               
+
        def checkout_rows(self):
                sql = "UPDATE items SET status=? WHERE list=? AND category LIKE ? AND status=?"
                self.db.speichereSQL(sql,("-1",self.selection.get_list(),self.selection.get_category(True),"1"))
                for i in range(len(self.liststore)):
                        if self.liststore[i][1]=="1":
                                self.liststore[i][1]="-1"
-                       
-                       
-               
-               
+
        def add_row(self,title=""):
                #self.update_row(-1,1,"-1")
                #for x in self.liststore:
@@ -134,9 +130,9 @@ class Liststorehandler():
                uid=str(uuid.uuid4())
                sql = "INSERT INTO items (uid,list,category,status, title) VALUES (?,?,?,?,?)"
                self.db.speichereSQL(sql,(uid,self.selection.get_list(),self.selection.get_category(),status,title),rowid=uid)
-               logging.info("Insertet row: status = "+status+" with uid "+str(uid))
+               _moduleLogger.info("Insertet row: status = "+status+" with uid "+str(uid))
                        #self.liststore[irow][0]=str(uuid.uuid4())
-                       
+
                self.liststore.append([uid,status,title," ","","","","","","","","",""])
                self.selection.comboLists_check_for_update()
                #       if (irow>-1):
@@ -147,62 +143,56 @@ class Liststorehandler():
                                #print "xy",self.liststore[len(self.liststore)-1][0]
                        #Check if a new list/category is opened
                #       self.selection.comboLists_check_for_update()
-               
+
        def del_row(self,irow,row_iter):
                uid=self.liststore[irow][0]
                self.liststore.remove(row_iter)
                sql = "DELETE FROM items WHERE uid=?"
                self.db.speichereSQL(sql,(uid,))
-               #
-               
-               
+
        def get_colname(self,i):
                if i<len(self.collist):
                        return self.collist[i]
                else:
                        return None
-               
+
        def get_colcount(self):
                return len(self.collist)
 
-       
        def rename_category(self,new_name):
                sql = "UPDATE items SET category=? WHERE list=? AND category=?"
                self.db.speichereSQL(sql,(new_name,self.selection.get_list(),self.selection.get_category()))
                self.selection.comboList_changed()
                self.selection.set_category(new_name)
-                               
+
        def rename_list(self,new_name):
                sql = "UPDATE items SET list=? WHERE list=?"
                self.db.speichereSQL(sql,(new_name,self.selection.get_list(),))
                self.selection.load()
-               self.selection.set_list(new_name)       
-       
-       
+               self.selection.set_list(new_name)
+
        #def update_category(self,widget=None,data=None,data2=None,data3=None):
        #       self.get_liststore()
-               
+
        def update_list(self,widget=None,data=None,data2=None,data3=None):
                self.get_liststore()
-               
+
        def __init__(self,db,selection):
                self.db=db
                self.liststore=None
                self.unitsstore=None
                self.selection=selection
                self.collist=("uid","status","title","quantitiy","unit","price","priority","date","private","stores","note","custom1","custom2")
-               
+
                #sql="DROP TABLE items"
                #self.db.speichereSQL(sql)
-               
+
                sql = "CREATE TABLE items (uid TEXT, list TEXT, category TEXT, status TEXT, title TEXT, quantitiy TEXT, unit TEXT, price TEXT, priority TEXT, date TEXT, pcdate TEXT, private TEXT, stores TEXT, note TEXT, custom1 TEXT, custom2 TEXT)"
                self.db.speichereSQL(sql)
-               
-               
+
                self.selection.load()
                self.selection.connect("changed",self.update_list)
                #self.selection.connect("changedCategory",self.update_category)
-               
 
                """
                sql = "INSERT INTO items (uid,list,category,title) VALUES (?,?,?,?)"
@@ -213,6 +203,3 @@ class Liststorehandler():
                
                print "inserted"
                """
-
-               
-               
\ No newline at end of file
index 69321c6..fc5956e 100755 (executable)
@@ -1,49 +1,33 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
-  
-"""
-    This file is part of Multilist.
-
-    Multilist is free software: you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    Multilist is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with Multilist.  If not, see <http://www.gnu.org/licenses/>.
-    
-    Copyright (C) 2008 Christoph Würstle
+
 """
+This file is part of Multilist.
+
+Multilist is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Multilist is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
 
-#/scratchbox/login
-#Xephyr :2 -host-cursor -screen 800x480x16 -dpi 96 -ac
-#af-sb-init.sh start
-#run-standalone.sh ./eggtimer.py
-#
-#https://stage.maemo.org/svn/maemo/projects/haf/trunk/
-#http://www.maemo.org/platform/docs/pymaemo/pyosso_context.html
-#http://maemo-hackers.org/apt/
+You should have received a copy of the GNU General Public License
+along with Multilist.  If not, see <http://www.gnu.org/licenses/>.
+
+Copyright (C) 2008 Christoph Würstle
+"""
 
-import time
 import os
 import sys
 import logging
 
-try:
-        import gtk
-        #import gtk.glade
-except:
-       print "gtk import failed"
-        sys.exit(1)
-       
+import gtk
+
 try:
        import hildon
-       import osso
        isHildon=True
 except:
        isHildon=False
@@ -54,7 +38,14 @@ except:
                        def __init__(self):
                                print "PseudoClass hildon.Program"
 
-#import libextdatei
+try:
+       import osso
+except ImportError:
+       osso = None
+
+import constants
+import hildonize
+
 import libspeichern
 import libsqldialog
 import libselection
@@ -63,77 +54,96 @@ import libliststorehandler
 import libsync
 import libbottombar
 
-version = "0.3.0"
-app_name = "multilist"
+try:
+       _
+except NameError:
+       _ = lambda x: x
+
 
-               
-       
+_moduleLogger = logging.getLogger(__name__)
+PROFILE_STARTUP = False
+
+
+class multilistclass(hildonize.get_app_class()):
+
+       _user_data = os.path.join(os.path.expanduser("~"), ".%s" % constants.__app_name__)
+       _user_settings = "%s/settings.ini" % _user_data
 
-class multilistclass(hildon.Program):
-               
        def on_key_press(self, widget, event, *args):
-               #Hildon Fullscreen Modus
-               if (isHildon==False): return
-               if event.keyval == gtk.keysyms.F6: 
-                       # The "Full screen" hardware key has been pressed 
-                       if self.window_in_fullscreen: 
-                               self.window.unfullscreen () 
-                       else: 
-                               self.window.fullscreen () 
-               
-       def on_window_state_change(self, widget, event, *args): 
-               if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN: 
-                       self.window_in_fullscreen = True 
-               else: 
-                       self.window_in_fullscreen = False 
-
-       
+               RETURN_TYPES = (gtk.keysyms.Return, gtk.keysyms.ISO_Enter, gtk.keysyms.KP_Enter)
+               isCtrl = bool(event.get_state() & gtk.gdk.CONTROL_MASK)
+               if (
+                       event.keyval == gtk.keysyms.F6 or
+                       event.keyval in RETURN_TYPES and isCtrl
+               ):
+                       # The "Full screen" hardware key has been pressed 
+                       if self.window_in_fullscreen:
+                               self.window.unfullscreen ()
+                       else:
+                               self.window.fullscreen ()
+                       return True
+               #elif event.keyval == gtk.keysyms.f and isCtrl:
+               #       self._toggle_search()
+               #       return True
+               elif (
+                       event.keyval in (gtk.keysyms.w, gtk.keysyms.q) and
+                       event.get_state() & gtk.gdk.CONTROL_MASK
+               ):
+                       self._window.destroy()
+               elif event.keyval == gtk.keysyms.l and event.get_state() & gtk.gdk.CONTROL_MASK:
+                       with open(constants._user_logpath_, "r") as f:
+                               logLines = f.xreadlines()
+                               log = "".join(logLines)
+                               self._clipboard.set_text(str(log))
+                       return True
+
+       def on_window_state_change(self, widget, event, *args):
+               if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN:
+                       self.window_in_fullscreen = True
+               else:
+                       self.window_in_fullscreen = False
+
        def speichereAlles(self,data=None,data2=None):
                logging.info("Speichere alles")
 
-
        def ladeAlles(self,data=None,data2=None):
                logging.info("Lade alles")
-               
+
        def beforeSync(self,data=None,data2=None):
                logging.info("Lade alles")
 
-
        def sync_finished(self,data=None,data2=None):
                self.selection.comboList_changed()
                self.selection.comboCategory_changed()
                self.liststorehandler.update_list()
-               
-       
+
        def prepare_sync_dialog(self):
                self.sync_dialog = gtk.Dialog(_("Sync"),None,gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
-               
-               self.sync_dialog.set_position(gtk.WIN_POS_CENTER)
+
+               self.sync_dialog.set_position(gtk.WIN_POS_CENTER)
                sync=libsync.Sync(self.db,self.window,50503)
                sync.connect("syncFinished",self.sync_finished)
                self.sync_dialog.vbox.pack_start(sync, True, True, 0)
                self.sync_dialog.set_size_request(500,350)
                self.sync_dialog.vbox.show_all()
                sync.connect("syncFinished",self.sync_finished)
-       
-       
+
        def sync_notes(self,widget=None,data=None):
                if self.sync_dialog==None:
                        self.prepare_sync_dialog()
                self.sync_dialog.run()
-               self.sync_dialog.hide()
-
+               self.sync_dialog.hide()
 
        def show_columns_dialog(self,widget=None,data=None):
                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))
-               
-               col_dialog.set_position(gtk.WIN_POS_CENTER)
+
+               col_dialog.set_position(gtk.WIN_POS_CENTER)
                cols=libview.Columns_dialog(self.db,self.liststorehandler)
 
                col_dialog.vbox.pack_start(cols, True, True, 0)
                col_dialog.set_size_request(500,350)
                col_dialog.vbox.show_all()
-               
+
                resp=col_dialog.run()
                col_dialog.hide()
                if resp==gtk.RESPONSE_ACCEPT:
@@ -147,255 +157,237 @@ class multilistclass(hildon.Program):
                        #self.vbox.pack_end(self.bottombar, expand=True, fill=True, padding=0)
                        #self.vbox.pack_end(view, expand=True, fill=True, padding=0)
                        #self.vbox.pack_end(self.selection, expand=False, fill=True, padding=0)
-                       
 
                col_dialog.destroy()
-               
-
 
        def __init__(self):
-               home_dir = os.path.expanduser('~')
-               dblog=os.path.join(home_dir, "multilist.log") 
-               logging.basicConfig(level=logging.INFO,format='%(asctime)s %(levelname)-8s %(message)s', datefmt='%a, %d %b %Y %H:%M:%S', filename=dblog,filemode='a')
-               #logging.getLogger('').addHandler(console)
-               
-               # define a Handler which writes INFO messages or higher to the sys.stderr
-               console = logging.StreamHandler()
-               console.setLevel(logging.INFO)
-               # set a format which is simpler for console use
-               formatter = logging.Formatter('%(asctime)s  %(levelname)-8s %(message)s')
-               # tell the handler to use this format
-               console.setFormatter(formatter)
-               # add the handler to the root logger
-               logging.getLogger('').addHandler(console)
-               
+               super(multilistclass, self).__init__()
+               self._clipboard = gtk.clipboard_get()
+
                logging.info('Starting Multilist')
-               
-               if (isHildon==True): 
-                       logging.info('Hildon erkannt, rufe Hildon constructor auf')
-                       hildon.Program.__init__(self)
-                               
-                #Get the Main Window, and connect the "destroy" event
-               if (isHildon==False):
-                       self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
-                       self.window.set_default_size(700,500)
-               else:
-                       self.window = hildon.Window()
-                       self.add_window(self.window)
-                       
-               #print "1b: ",time.clock() 
-               
-                if (self.window):
-                       self.window.connect("delete_event", self.delete_event)
-                       self.window.connect("destroy", self.destroy)
-                       self.window.set_title("Multilist")
-                       
-                       
-                       
-                       if (isHildon==True): self.window.connect("key-press-event", self.on_key_press) 
-                       self.window.connect("window-state-event", self.on_window_state_change) 
-                       self.window_in_fullscreen = False #The window isn't in full screen mode initially.
-
-
-               self.db=libspeichern.Speichern()
-               
-               self.selection=libselection.Selection(self.db,isHildon)
-               self.liststorehandler=libliststorehandler.Liststorehandler(self.db,self.selection)
-               self.view=libview.View(self.db,self.liststorehandler,self.window)
-               self.bottombar=libbottombar.Bottombar(self.db,self.view,isHildon)
-               
+
+               try:
+                       os.makedirs(self._user_data)
+               except OSError, e:
+                       if e.errno != 17:
+                               raise
+
+               self.db = libspeichern.Speichern()
+               self.window_in_fullscreen = False #The window isn't in full screen mode initially.
+
                #Haupt vbox für alle Elemente
+               self.window = gtk.Window()
                self.vbox = gtk.VBox(homogeneous=False, spacing=0)
-               
-               
-               
+
+               self.selection = libselection.Selection(self.db, isHildon)
+               self.liststorehandler = libliststorehandler.Liststorehandler(self.db, self.selection)
+               self.view = libview.View(self.db, self.liststorehandler, self.window)
+               self.bottombar = libbottombar.Bottombar(self.db, self.view, isHildon)
+
                #Menue
-               dateimenu = gtk.Menu()
-               
-               menu_items = gtk.MenuItem(_("Choose database file"))
-               dateimenu.append(menu_items)
-               menu_items.connect("activate", self.select_db_dialog, None)
-               
-               menu_items = gtk.MenuItem(_("SQL history"))
-               dateimenu.append(menu_items)
-               menu_items.connect("activate", self.view_sql_history, None)
-               
-               menu_items = gtk.MenuItem(_("SQL optimize"))
-               dateimenu.append(menu_items)
-               menu_items.connect("activate", self.optimizeSQL, None)
-               
-               menu_items = gtk.MenuItem(_("Sync items"))
-               self.prepare_sync_dialog()
-               dateimenu.append(menu_items)
-               menu_items.connect("activate", self.sync_notes, None)
-               
-               
-               menu_items = gtk.MenuItem(_("Quit"))
-               dateimenu.append(menu_items)
-               menu_items.connect("activate", self.destroy, None)
-               #menu_items.show()
-               
-               datei_menu = gtk.MenuItem(_("File"))
-               datei_menu.show()
-               datei_menu.set_submenu(dateimenu)
-               
-               
-               toolsmenu = gtk.Menu()
-               
-               
-               menu_items = gtk.MenuItem(_("Choose columns"))
-               toolsmenu.append(menu_items)
-               menu_items.connect("activate", self.show_columns_dialog, None)
-               
-               menu_items = gtk.MenuItem(_("Rename Category"))
-               toolsmenu.append(menu_items)
-               menu_items.connect("activate", self.bottombar.rename_category, None)
-               
-               menu_items = gtk.MenuItem(_("Rename List"))
-               toolsmenu.append(menu_items)
-               menu_items.connect("activate", self.bottombar.rename_list, None)
-               
-               tools_menu = gtk.MenuItem(_("Tools"))
-               tools_menu.show()
-               tools_menu.set_submenu(toolsmenu)
-               
-               
-               hilfemenu = gtk.Menu()
-               menu_items = gtk.MenuItem(_("About"))
-               hilfemenu.append(menu_items)
-               menu_items.connect("activate", self.show_about, None)
-               
-               hilfe_menu = gtk.MenuItem(_("Help"))
-               hilfe_menu.show()
-               hilfe_menu.set_submenu(hilfemenu)
-               
-               menu_bar = gtk.MenuBar()
-               menu_bar.show()
-               menu_bar.append (datei_menu)
-               menu_bar.append (tools_menu)
-               # unten -> damit als letztes menu_bar.append (hilfe_menu)
-               #Als letztes menü
-               menu_bar.append (hilfe_menu)
-               
-               if (isHildon==True):
-                       menu = gtk.Menu() 
-                       for child in menu_bar.get_children():
-                               child.reparent(menu) 
-                       self.window.set_menu(menu)
-                       menu_bar.destroy()
+               if hildonize.GTK_MENU_USED:
+                       dateimenu = gtk.Menu()
+
+                       menu_items = gtk.MenuItem(_("Choose database file"))
+                       dateimenu.append(menu_items)
+                       menu_items.connect("activate", self.select_db_dialog, None)
+
+                       menu_items = gtk.MenuItem(_("SQL history"))
+                       dateimenu.append(menu_items)
+                       menu_items.connect("activate", self.view_sql_history, None)
+
+                       menu_items = gtk.MenuItem(_("SQL optimize"))
+                       dateimenu.append(menu_items)
+                       menu_items.connect("activate", self.optimizeSQL, None)
+
+                       menu_items = gtk.MenuItem(_("Sync items"))
+                       dateimenu.append(menu_items)
+                       menu_items.connect("activate", self.sync_notes, None)
+
+                       menu_items = gtk.MenuItem(_("Quit"))
+                       dateimenu.append(menu_items)
+                       menu_items.connect("activate", self.destroy, None)
+                       #menu_items.show()
+
+                       datei_menu = gtk.MenuItem(_("File"))
+                       datei_menu.show()
+                       datei_menu.set_submenu(dateimenu)
+
+                       toolsmenu = gtk.Menu()
+
+                       menu_items = gtk.MenuItem(_("Choose columns"))
+                       toolsmenu.append(menu_items)
+                       menu_items.connect("activate", self.show_columns_dialog, None)
+
+                       menu_items = gtk.MenuItem(_("Rename Category"))
+                       toolsmenu.append(menu_items)
+                       menu_items.connect("activate", self.bottombar.rename_category, None)
+
+                       menu_items = gtk.MenuItem(_("Rename List"))
+                       toolsmenu.append(menu_items)
+                       menu_items.connect("activate", self.bottombar.rename_list, None)
+
+                       tools_menu = gtk.MenuItem(_("Tools"))
+                       tools_menu.show()
+                       tools_menu.set_submenu(toolsmenu)
+
+                       hilfemenu = gtk.Menu()
+                       menu_items = gtk.MenuItem(_("About"))
+                       hilfemenu.append(menu_items)
+                       menu_items.connect("activate", self.show_about, None)
+
+                       hilfe_menu = gtk.MenuItem(_("Help"))
+                       hilfe_menu.show()
+                       hilfe_menu.set_submenu(hilfemenu)
+
+                       menu_bar = gtk.MenuBar()
+                       menu_bar.show()
+                       menu_bar.append (datei_menu)
+                       menu_bar.append (tools_menu)
+                       # unten -> damit als letztes menu_bar.append (hilfe_menu)
+                       #Als letztes menü
+                       menu_bar.append (hilfe_menu)
+
+                       self.vbox.pack_start(menu_bar, False, False, 0)
                else:
-                       self.vbox.pack_start(menu_bar, False, False, 2)
-               
-               
-               
+                       menuBar = gtk.MenuBar()
+                       menuBar.show()
+                       self.vbox.pack_start(menuBar, False, False, 0)
 
                #add to vbox below (to get it on top)
-               
-               
-               
                self.vbox.pack_end(self.bottombar, expand=False, fill=True, padding=0)
                self.vbox.pack_end(self.view, expand=True, fill=True, padding=0)
                self.vbox.pack_end(self.selection, expand=False, fill=True, padding=0)
-               
 
-               if (isHildon==True): self.osso_c = osso.Context(app_name, version, False)
+               #Get the Main Window, and connect the "destroy" event
                self.window.add(self.vbox)
+
+               self.window = hildonize.hildonize_window(self, self.window)
+               hildonize.set_application_title(self.window, "%s" % constants.__pretty_app_name__)
+               menu_bar = hildonize.hildonize_menu(
+                       self.window,
+                       menu_bar,
+               )
+               if hildonize.IS_FREMANTLE_SUPPORTED:
+                       pass
+
+               if not hildonize.IS_HILDON_SUPPORTED:
+                       _moduleLogger.info("No hildonization support")
+
+               if osso is not None:
+                       self.osso_c = osso.Context(
+                               constants.__app_name__,
+                               constants.__version__,
+                               False
+                       )
+               else:
+                       _moduleLogger.info("No osso support")
+                       self._osso_c = None
+
+               self.window.connect("delete_event", self.delete_event)
+               self.window.connect("destroy", self.destroy)
+               self.window.connect("key-press-event", self.on_key_press)
+               self.window.connect("window-state-event", self.on_window_state_change)
+
                self.window.show_all()
-               
-               #print "8a"
+               self.prepare_sync_dialog()
                self.ladeAlles()
-               
-               
-               #print "9: ",time.clock()
-                       
-       def main(self):
-               gtk.main()
-               if (isHildon==True): self.osso_c.close()
-               
+
        def destroy(self, widget=None, data=None):
-               self.speichereAlles()
-               self.db.close()
-               gtk.main_quit()
-               
-               
+               try:
+                       self.speichereAlles()
+                       self.db.close()
+                       try:
+                               self._osso_c.close()
+                       except AttributeError:
+                               pass # Either None or close was removed (in Fremantle)
+               finally:
+                       gtk.main_quit()
+
        def delete_event(self, widget, event, data=None):
                #print "delete event occurred"
                return False
-       
+
        def dlg_delete(self,widget,event,data=None):
                return False
 
-
        def show_about(self, widget=None,data=None):
-               dialog = gtk.AboutDialog()
-               dialog.set_position(gtk.WIN_POS_CENTER)
-               dialog.set_name(app_name)
-               dialog.set_version(version)
-               dialog.set_copyright("")
+               dialog = gtk.AboutDialog()
+               dialog.set_position(gtk.WIN_POS_CENTER)
+               dialog.set_name(constants.__pretty_app_name__)
+               dialog.set_version(constants.__version__)
+               dialog.set_copyright("")
                dialog.set_website("http://axique.de/f=Multilist")
-               comments = "%s is a program to handle multiple lists." % app_name
-               dialog.set_comments(comments)        
-               dialog.run()     
-               dialog.destroy()
-       
+               comments = "%s is a program to handle multiple lists." % constants.__pretty_app_name__
+               dialog.set_comments(comments)
+               dialog.set_authors(["Christoph Wurstle <n800@axique.net>", "Ed Page <eopage@byu.net> (Blame him for the most recent bugs)"])
+               dialog.run()
+               dialog.destroy()
+
        def on_info1_activate(self,menuitem):
                self.show_about(menuitem)
 
-  
        def view_sql_history(self,widget=None,data=None,data2=None):
                sqldiag=libsqldialog.sqlDialog(self.db)
                res=sqldiag.run()
                sqldiag.hide()
                if res==444:
                        logging.info("exporting sql")
-                       
-                       if (isHildon==False):
-                               dlg = gtk.FileChooserDialog(parent = self.window, action = gtk.FILE_CHOOSER_ACTION_SAVE)
+
+                       if not isHildon:
+                               dlg = gtk.FileChooserDialog(
+                                       parent = self.window,
+                                       action = gtk.FILE_CHOOSER_ACTION_SAVE
+                               )
                                dlg.add_button( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
-                               dlg.add_button( gtk.STOCK_OK, gtk.RESPONSE_OK)
+                               dlg.add_button( gtk.STOCK_OK, gtk.RESPONSE_OK)
                        else:
                                #dlg = hildon.FileChooserDialog(parent = self.window, action = gtk.FILE_CHOOSER_ACTION_SAVE)
                                dlg=hildon.FileChooserDialog(self.window, gtk.FILE_CHOOSER_ACTION_SAVE)
-                       
+
                        dlg.set_title(_("Select SQL export file"))
-                       if dlg.run() == gtk.RESPONSE_OK:
+                       if dlg.run() == gtk.RESPONSE_OK:
                                fileName = dlg.get_filename()
                                dlg.destroy()
                                sqldiag.exportSQL(fileName)
                        else:
                                dlg.destroy()
-                               
+
                sqldiag.destroy()
 
-               
-       def optimizeSQL(self,widget=None,data=None,data2=None): 
+       def optimizeSQL(self,widget=None,data=None,data2=None):
                #optimiere sql
                self.db.speichereSQL("VACUUM",log=False)
-               
-  
 
-  
        def select_db_dialog(self,widget=None,data=None,data2=None):
                if (isHildon==False):
-                       dlg = gtk.FileChooserDialog(parent = self.window, action = gtk.FILE_CHOOSER_ACTION_SAVE)
+                       dlg = gtk.FileChooserDialog(parent = self.window, action = gtk.FILE_CHOOSER_ACTION_SAVE)
                        dlg.add_button( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
-                       dlg.add_button( gtk.STOCK_OK, gtk.RESPONSE_OK)
+                       dlg.add_button( gtk.STOCK_OK, gtk.RESPONSE_OK)
                else:
                        #dlg = hildon.FileChooserDialog(parent = self.window, action = gtk.FILE_CHOOSER_ACTION_SAVE)
                        dlg=hildon.FileChooserDialog(self.window, gtk.FILE_CHOOSER_ACTION_SAVE)
-                       
-               
-               if self.db.ladeDirekt('datenbank'):
+
+               if self.db.ladeDirekt('datenbank'):
                        dlg.set_filename(self.db.ladeDirekt('datenbank'))
                dlg.set_title(_("Choose your database file"))
-               if dlg.run() == gtk.RESPONSE_OK:
+               if dlg.run() == gtk.RESPONSE_OK:
                        fileName = dlg.get_filename()
                        self.db.speichereDirekt('datenbank',fileName)
                        self.speichereAlles()
                        self.db.openDB()
                        self.ladeAlles()
-               dlg.destroy()
-               
-               
-               
+               dlg.destroy()
+
+
+def run_multilist():
+       if hildonize.IS_HILDON_SUPPORTED:
+               gtk.set_application_name(constants.__pretty_app_name__)
+       app = multilistclass()
+       if not PROFILE_STARTUP:
+               gtk.main()
+
 
+if __name__ == "__main__":
+       logging.basicConfig(level=logging.DEBUG)
+       run_multilist()
index 5d6fb81..aaacb6c 100755 (executable)
@@ -35,5 +35,4 @@ if __name__ == "__main__":
        _moduleLogger.info("Kernel: %s (%s) for %s" % os.uname()[2:])
        _moduleLogger.info("Hostname: %s" % os.uname()[1])
 
-       app = libmultilist.multilistclass()
-       app.main()
+       libmultilist.run_multilist()