Adding some comments
[gc-dialer] / src / gc_dialer.py
index 9c0df9b..d29c860 100755 (executable)
@@ -42,12 +42,6 @@ except ImportError:
 
 try:
        import osso
-       try:
-               import abook
-               import evolution.ebook as evobook
-       except ImportError:
-               abook = None
-               evobook = None
 except ImportError:
        osso = None
 
@@ -63,7 +57,8 @@ except ImportError:
        doctest = None
        optparse = None
 
-from gcbackend import GCDialer
+from gc_backend import GCDialer
+from evo_backend import EvolutionAddressBook
 
 import socket
 
@@ -137,20 +132,122 @@ def make_idler(func):
        """
        a = []
 
-       def callable(*args, **kwds):
+       def decorated_func(*args, **kwds):
                if not a:
                        a.append(func(*args, **kwds))
                try:
                        a[0].next()
                        return True
                except StopIteration:
+                       del a[:]
                        return False
        
-       callable.__name__ = func.__name__
-       callable.__doc__ = func.__doc__
-       callable.__dict__.update(func.__dict__)
+       decorated_func.__name__ = func.__name__
+       decorated_func.__doc__ = func.__doc__
+       decorated_func.__dict__.update(func.__dict__)
 
-       return callable
+       return decorated_func
+
+
+class DummyAddressBook(object):
+       """
+       Minimal example of both an addressbook factory and an addressbook
+       """
+
+       def get_addressbooks(self):
+               """
+               @returns Iterable of (Address Book Factory, Book Id, Book Name)
+               """
+               yield self, "", "None"
+       
+       def open_addressbook(self, bookId):
+               return self
+
+       @staticmethod
+       def factory_name():
+               return ""
+
+       def get_contacts(self):
+               """
+               @returns Iterable of (contact id, contact name)
+               """
+               return []
+
+       def get_contact_details(self, contactId):
+               """
+               @returns Iterable of (Phone Type, Phone Number)
+               """
+               return []
+
+
+class SettingsDialog(object):
+       """
+       @todo Remove this.  Currently its only used for addressbooks and I want to make that a combo box on the contacts tab
+       """
+
+       def __init__(self, widgetTree, gcDialer):
+               self._gcDialer = gcDialer
+               self._widgetTree = widgetTree
+               self._dialog = self._widgetTree.get_widget("settings_dialog")
+
+               self._applyButton = self._widgetTree.get_widget("apply_settings")
+               self._applyButton.connect("clicked", self.custom_button_response(gtk.RESPONSE_OK))
+
+               self._cancelButton = self._widgetTree.get_widget("cancel_settings")
+               self._cancelButton.connect("clicked", self.custom_button_response(gtk.RESPONSE_CANCEL))
+
+               self._booksList = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
+               for (factoryId, bookId), (factoryName, bookName) in self._gcDialer.get_addressbooks():
+                       row = (str(factoryId), bookId, factoryName, bookName)
+                       self._booksList.append(row)
+
+               self._booksView = self._widgetTree.get_widget("books_view")
+               self._booksView.set_model(self._booksList)
+
+               # Add the column to the treeview
+               column = gtk.TreeViewColumn("Addressbook")
+
+               textrenderer = gtk.CellRendererText()
+               column.pack_start(textrenderer, expand=False)
+               column.add_attribute(textrenderer, 'text', 2)
+
+               textrenderer = gtk.CellRendererText()
+               column.pack_start(textrenderer, expand=True)
+               column.add_attribute(textrenderer, 'text', 3)
+
+               column.set_sizing(gtk.TREE_VIEW_COLUMN_FIXED)
+               column.set_sort_column_id(2)
+               column.set_visible(True)
+               self._booksView.append_column(column)
+
+               self._booksViewSelection = self._booksView.get_selection()
+               self._booksViewSelection.set_mode(gtk.SELECTION_SINGLE)
+               self.reset()
+       
+       def reset(self):
+               pass
+       
+       def custom_button_response(self, response):
+
+               def button_handler(*args, **kwds):
+                       self._dialog.response(response)
+
+               return button_handler
+
+       def run(self):
+               userResponse = self._dialog.run()
+
+               if userResponse == gtk.RESPONSE_OK:
+                       model, itr = self._booksViewSelection.get_selected()
+                       if itr:
+                               factoryId = int(self._booksList.get_value(itr, 0))
+                               bookId = self._booksList.get_value(itr, 1)
+                               self._gcDialer.open_addressbook(factoryId, bookId)
+                               self._booksViewSelection.unselect_all()
+               else:
+                       self.reset()
+
+               self._dialog.hide()
 
 
 class PhoneTypeSelector(object):
@@ -230,6 +327,7 @@ class Dialpad(object):
                self._clipboard = gtk.clipboard_get()
 
                self._deviceIsOnline = True
+               self.callbacklist = None
                self._callbackNeedsSetup = True
 
                self._recenttime = 0.0
@@ -315,11 +413,6 @@ class Dialpad(object):
                        self._osso = osso.Context(Dialpad.__app_name__, Dialpad.__version__, False)
                        device = osso.DeviceState(self._osso)
                        device.set_device_state_callback(self._on_device_state_change, 0)
-                       if abook is not None and evobook is not None:
-                               abook.init_with_name(Dialpad.__app_name__, self._osso)
-                               self._ebook = evobook.open_addressbook("default")
-                       else:
-                               warnings.warn("No abook and No evolution address book support", UserWarning, 2)
                else:
                        warnings.warn("No OSSO", UserWarning, 2)
 
@@ -339,6 +432,7 @@ class Dialpad(object):
                        "on_dialpad_quit": self._on_close,
                        "on_paste": self._on_paste,
                        "on_clear_number": self._on_clear_number,
+                       "on_settings": self._on_settings,
 
                        "on_clearcookies_clicked": self._on_clearcookies_clicked,
                        "on_notebook_switch_page": self._on_notebook_switch_page,
@@ -358,7 +452,16 @@ class Dialpad(object):
 
                self._gcBackend = GCDialer()
 
+               self._addressBookFactories = [
+                       DummyAddressBook(),
+                       EvolutionAddressBook(),
+                       self._gcBackend,
+               ]
+               self._addressBook = None
+               self.open_addressbook(*self.get_addressbooks().next()[0][0:2])
+
                self._phoneTypeSelector = PhoneTypeSelector(self._widgetTree, self._gcBackend)
+               self._settingsDialog = SettingsDialog(self._widgetTree, self)
 
                if not self._gcBackend.is_authed():
                        self.attempt_login(2)
@@ -368,7 +471,9 @@ class Dialpad(object):
                gobject.idle_add(self._idly_init_contacts_view)
 
        def _idly_init_recent_view(self):
-               """ Deferred initalization of the recent view treeview """
+               """
+               Deferred initalization of the recent view treeview
+               """
 
                recentview = self._widgetTree.get_widget("recentview")
                recentview.set_model(self._recentmodel)
@@ -472,7 +577,7 @@ class Dialpad(object):
                        contactType = (self._gcContactIcon,)
                else:
                        contactType = (self._gcContactText,)
-               for contactId, contactName in self._gcBackend.get_contacts():
+               for contactId, contactName in self._addressBook.get_contacts():
                        self._contactsmodel.append(contactType + (contactName, "", contactId) + ("",))
                        yield
 
@@ -515,13 +620,26 @@ class Dialpad(object):
                error_dialog.connect("response", close, self)
                error_dialog.run()
 
+       def get_addressbooks(self):
+               """
+               @returns Iterable of ((Factory Id, Book Id), (Factory Name, Book Name))
+               """
+               for i, factory in enumerate(self._addressBookFactories):
+                       for bookFactory, bookId, bookName in factory.get_addressbooks():
+                               yield (i, bookId), (factory.factory_name(), bookName)
+       
+       def open_addressbook(self, bookFactoryId, bookId):
+               self._addressBook = self._addressBookFactories[bookFactoryId].open_addressbook(bookId)
+               self._contactstime = 0
+               gobject.idle_add(self._idly_populate_contactsview)
+
        def set_number(self, number):
                """
                Set the callback phonenumber
                """
                self._phonenumber = make_ugly(number)
                self._prettynumber = make_pretty(self._phonenumber)
-               self._numberdisplay.set_label("<span size='30000' weight='bold'>%s</span>" % ( self._prettynumber ) )
+               self._numberdisplay.set_label("<span size='30000' weight='bold'>%s</span>" % (self._prettynumber))
 
        def set_account_number(self):
                """
@@ -569,6 +687,9 @@ class Dialpad(object):
                        self._isFullScreen = True
                else:
                        self._isFullScreen = False
+       
+       def _on_settings(self, *args, **kwds):
+               self._settingsDialog.run()
 
        def _on_key_press(self, widget, event, *args):
                """
@@ -626,7 +747,7 @@ class Dialpad(object):
                        return
 
                contactId = self._contactsmodel.get_value(itr, 3)
-               contactDetails = self._gcBackend.get_contact_details(contactId)
+               contactDetails = self._addressBook.get_contact_details(contactId)
                contactDetails = [phoneNumber for phoneNumber in contactDetails]
 
                if len(contactDetails) == 0: