~nherriot/bcm/tags

« back to all changes in this revision

Viewing changes to bcm-2.99.03-alpha1/src/gui/bcm/wader/bcm/controllers/contacts.py

  • Committer: andrewbird
  • Date: 2010-04-29 07:52:44 UTC
  • Revision ID: svn-v4:302e0824-f0b9-4af8-b993-bc22a3d40462:tags:766
Create tag bcm-2.99.03-alpha1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
# Copyright (C) 2006-2009  Vodafone España, S.A.
 
3
# Author:  Pablo Martí
 
4
#
 
5
# This program is free software; you can redistribute it and/or modify
 
6
# it under the terms of the GNU General Public License as published by
 
7
# the Free Software Foundation; either version 2 of the License, or
 
8
# (at your option) any later version.
 
9
#
 
10
# This program is distributed in the hope that it will be useful,
 
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
# GNU General Public License for more details.
 
14
#
 
15
# You should have received a copy of the GNU General Public License along
 
16
# with this program; if not, write to the Free Software Foundation, Inc.,
 
17
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
18
"""Controllers for both add_contact and search_contact dialogs"""
 
19
 
 
20
import gtk
 
21
 
 
22
from wader.bcm.models.contacts import ContactsStoreModel
 
23
 
 
24
from wader.bcm.phonebook import get_phonebook, Contact
 
25
from wader.bcm.translate import _
 
26
 
 
27
#from gtkmvc import Controller
 
28
from wader.bcm.contrib.gtkmvc import Controller
 
29
from wader.bcm import dialogs
 
30
 
 
31
from wader.bcm.contrib.ValidatedEntry import (ValidatedEntry, v_phone,
 
32
                                              v_ucs2_name)
 
33
 
 
34
 
 
35
class AddContactController(Controller):
 
36
    """Controller for the add contact dialog"""
 
37
 
 
38
    def __init__(self, model, parent_ctrl):
 
39
        super(AddContactController, self).__init__(model)
 
40
        self.parent_ctrl = parent_ctrl
 
41
        self.name_entry = ValidatedEntry(v_ucs2_name)
 
42
        self.number_entry = ValidatedEntry(v_phone)
 
43
 
 
44
    def register_view(self, view):
 
45
        super(AddContactController, self).register_view(view)
 
46
        if not self.model.device:
 
47
            self.view['mobile_radio_button'].set_sensitive(False)
 
48
            self.view['computer_radio_button'].set_active(True)
 
49
 
 
50
    def on_add_contact_ok_button_clicked(self, widget):
 
51
        if not self.name_entry.isvalid() or not self.number_entry.isvalid():
 
52
            return
 
53
 
 
54
        name = self.name_entry.get_text()
 
55
        number = self.number_entry.get_text()
 
56
        save_in_sim = self.view['mobile_radio_button'].get_active()
 
57
 
 
58
        phonebook = get_phonebook(self.parent_ctrl.model.device)
 
59
        contact = Contact(name, number)
 
60
 
 
61
        def add_callback(contact):
 
62
            # add it to the treeview model
 
63
            model = self.parent_ctrl.view['contacts_treeview'].get_model()
 
64
            model.add_contact(contact)
 
65
            self._hide_me()
 
66
 
 
67
        #d = phonebook.add_contact(contact, sim=save_in_sim)
 
68
        #d.addCallback(add_callback)
 
69
        new_contact = phonebook.add_contact(contact, sim=save_in_sim)
 
70
        add_callback(new_contact)
 
71
 
 
72
    def on_add_contact_cancel_button_clicked(self, widget):
 
73
        self._hide_me()
 
74
 
 
75
    def _hide_me(self):
 
76
        self.view.hide()
 
77
        self.model.unregister_observer(self)
 
78
 
 
79
 
 
80
class SearchContactController(Controller):
 
81
    """Controller for the search contact interface"""
 
82
 
 
83
    def __init__(self, model, parent_ctrl):
 
84
        super(SearchContactController, self).__init__(model)
 
85
        self.parent_ctrl = parent_ctrl
 
86
 
 
87
    def on_search_cancel_button_clicked(self, widget):
 
88
        pass
 
89
 
 
90
    def on_search_find_button_clicked(self, widget):
 
91
        pattern = self.view['search_entry'].get_text()
 
92
 
 
93
        treeview = self.parent_ctrl.view['contacts_treeview']
 
94
        model = treeview.get_model()
 
95
 
 
96
        contacts = model.find_contacts(pattern)
 
97
        if not contacts:
 
98
            dialogs.show_warning_dialog(_('No contact found'),
 
99
                _('No contact with the name %s found') % pattern)
 
100
            return
 
101
 
 
102
        # get the path
 
103
        path = [str(i) for i, row in enumerate(model)
 
104
                    if row[3] in contacts]
 
105
        # unselect
 
106
        sel = treeview.get_selection()
 
107
        sel.unselect_all()
 
108
        for elem in path:
 
109
            # and set the new selection
 
110
            sel.select_path(elem)
 
111
 
 
112
 
 
113
class ContactsListController(Controller):
 
114
    """Controller for the contacts list"""
 
115
 
 
116
    def __init__(self, model, parent_ctrl, contacts):
 
117
        super(ContactsListController, self).__init__(model)
 
118
        self.parent_ctrl = parent_ctrl
 
119
        self.contacts = contacts
 
120
 
 
121
    def register_view(self, view):
 
122
        super(ContactsListController, self).register_view(view)
 
123
        self._position_and_show()
 
124
        self._setup_view()
 
125
        self._fill_treeview()
 
126
 
 
127
    def _position_and_show(self):
 
128
        window = self.view.get_top_widget()
 
129
        parent_window = self.parent_ctrl.view.get_top_widget()
 
130
        width, height = parent_window.get_size()
 
131
        x, y = parent_window.get_position()
 
132
        reqx = x + width + 10
 
133
        window.move(reqx, y)
 
134
 
 
135
        self.view.show()
 
136
 
 
137
    def _setup_view(self):
 
138
        treeview = self.view['treeview1']
 
139
        col_type, col_name, col_number, col_pyobj, col_editable = range(5)
 
140
        treeview.set_model(ContactsStoreModel())
 
141
 
 
142
        treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
 
143
        treeview.connect('row-activated', self._row_activated_handler)
 
144
 
 
145
        cell = gtk.CellRendererPixbuf()
 
146
        column = gtk.TreeViewColumn(_("Type"))
 
147
        column.pack_start(cell)
 
148
        column.set_attributes(cell, pixbuf=col_type)
 
149
        treeview.append_column(column)
 
150
 
 
151
        cell = gtk.CellRendererText()
 
152
        column = gtk.TreeViewColumn(_("Name"), cell, text=col_name)
 
153
        column.set_resizable(True)
 
154
        column.set_sort_column_id(col_name)
 
155
        cell.set_property('editable', False)
 
156
        treeview.append_column(column)
 
157
 
 
158
        cell = gtk.CellRendererText()
 
159
        column = gtk.TreeViewColumn(_("Number"), cell, text=col_number)
 
160
        column.set_resizable(True)
 
161
        column.set_sort_column_id(col_number)
 
162
        cell.set_property('editable', False)
 
163
        treeview.append_column(column)
 
164
 
 
165
        cell = gtk.CellRendererText()
 
166
        column = gtk.TreeViewColumn("IntId", cell, text=col_pyobj)
 
167
        column.set_visible(False)
 
168
        column.set_sort_column_id(col_pyobj)
 
169
        treeview.append_column(column)
 
170
 
 
171
        cell = gtk.CellRendererText()
 
172
        column = gtk.TreeViewColumn("Editable", cell, text=col_editable)
 
173
        column.set_visible(False)
 
174
        column.set_sort_column_id(col_editable)
 
175
        treeview.append_column(column)
 
176
 
 
177
        # make add contact insensitive until a row has been selected
 
178
        self.view['add_button'].set_sensitive(False)
 
179
 
 
180
    def _fill_treeview(self):
 
181
        if self.contacts:
 
182
            _model = self.view['treeview1'].get_model()
 
183
            _model.add_contacts(self.contacts)
 
184
 
 
185
    def _row_activated_handler(self, treeview, path, col):
 
186
        model, selected = treeview.get_selection().get_selected_rows()
 
187
        if not selected or len(selected) > 1:
 
188
            return
 
189
 
 
190
        _iter = model.get_iter(selected[0])
 
191
        number = model.get_value(_iter, 2)
 
192
        current_numbers = self.parent_ctrl.get_numbers_list()
 
193
        self.parent_ctrl.set_entry_text('')
 
194
        if not current_numbers:
 
195
            self.parent_ctrl.set_entry_text(number)
 
196
        else:
 
197
            current_numbers.append(number)
 
198
            self.parent_ctrl.set_entry_text(','.join(current_numbers))
 
199
 
 
200
        self.model.unregister_observer(self)
 
201
        self.view.hide()
 
202
 
 
203
    def on_add_button_clicked(self, widget):
 
204
        treeview = self.view['treeview1']
 
205
        # get selected rows
 
206
        selection = treeview.get_selection()
 
207
        model, selected = selection.get_selected_rows()
 
208
        iters = [model.get_iter(path) for path in selected]
 
209
        numbers = []
 
210
        for _iter in iters:
 
211
            numbers.append(model.get_value(_iter, 2)) # 2 == number in model
 
212
        # set the text in the parent's text entry
 
213
        numberstext = ','.join(numbers)
 
214
        self.parent_ctrl.set_entry_text(numberstext)
 
215
        self.model.unregister_observer(self)
 
216
        self.view.hide()
 
217
 
 
218
    def on_cancel_button_clicked(self, widget):
 
219
        self.model.unregister_observer(self)
 
220
        self.view.hide()
 
221
 
 
222
    def on_treeview1_cursor_changed(self, treeview):
 
223
        model, selected = treeview.get_selection().get_selected_rows()
 
224
        if len(selected):
 
225
            self.view['add_button'].set_sensitive(True)