~nherriot/bcm/tags

2 by andrewbird
Create tag bcm-2.99.03-alpha1
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)