1
# -*- coding: utf-8 -*-
2
# Copyright (C) 2006-2009 Vodafone España, S.A.
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.
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.
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"""
22
from wader.bcm.models.contacts import ContactsStoreModel
24
from wader.bcm.phonebook import get_phonebook, Contact
25
from wader.bcm.translate import _
27
#from gtkmvc import Controller
28
from wader.bcm.contrib.gtkmvc import Controller
29
from wader.bcm import dialogs
31
from wader.bcm.contrib.ValidatedEntry import (ValidatedEntry, v_phone,
35
class AddContactController(Controller):
36
"""Controller for the add contact dialog"""
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)
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)
50
def on_add_contact_ok_button_clicked(self, widget):
51
if not self.name_entry.isvalid() or not self.number_entry.isvalid():
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()
58
phonebook = get_phonebook(self.parent_ctrl.model.device)
59
contact = Contact(name, number)
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)
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)
72
def on_add_contact_cancel_button_clicked(self, widget):
77
self.model.unregister_observer(self)
80
class SearchContactController(Controller):
81
"""Controller for the search contact interface"""
83
def __init__(self, model, parent_ctrl):
84
super(SearchContactController, self).__init__(model)
85
self.parent_ctrl = parent_ctrl
87
def on_search_cancel_button_clicked(self, widget):
90
def on_search_find_button_clicked(self, widget):
91
pattern = self.view['search_entry'].get_text()
93
treeview = self.parent_ctrl.view['contacts_treeview']
94
model = treeview.get_model()
96
contacts = model.find_contacts(pattern)
98
dialogs.show_warning_dialog(_('No contact found'),
99
_('No contact with the name %s found') % pattern)
103
path = [str(i) for i, row in enumerate(model)
104
if row[3] in contacts]
106
sel = treeview.get_selection()
109
# and set the new selection
110
sel.select_path(elem)
113
class ContactsListController(Controller):
114
"""Controller for the contacts list"""
116
def __init__(self, model, parent_ctrl, contacts):
117
super(ContactsListController, self).__init__(model)
118
self.parent_ctrl = parent_ctrl
119
self.contacts = contacts
121
def register_view(self, view):
122
super(ContactsListController, self).register_view(view)
123
self._position_and_show()
125
self._fill_treeview()
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
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())
142
treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
143
treeview.connect('row-activated', self._row_activated_handler)
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)
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)
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)
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)
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)
177
# make add contact insensitive until a row has been selected
178
self.view['add_button'].set_sensitive(False)
180
def _fill_treeview(self):
182
_model = self.view['treeview1'].get_model()
183
_model.add_contacts(self.contacts)
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:
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)
197
current_numbers.append(number)
198
self.parent_ctrl.set_entry_text(','.join(current_numbers))
200
self.model.unregister_observer(self)
203
def on_add_button_clicked(self, widget):
204
treeview = self.view['treeview1']
206
selection = treeview.get_selection()
207
model, selected = selection.get_selected_rows()
208
iters = [model.get_iter(path) for path in selected]
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)
218
def on_cancel_button_clicked(self, widget):
219
self.model.unregister_observer(self)
222
def on_treeview1_cursor_changed(self, treeview):
223
model, selected = treeview.get_selection().get_selected_rows()
225
self.view['add_button'].set_sensitive(True)