diff --git a/src/history_manager.glade b/src/history_manager.glade
index c4c10ecd4..fb4657937 100644
--- a/src/history_manager.glade
+++ b/src/history_manager.glade
@@ -53,7 +53,6 @@
False
False
False
-
diff --git a/src/history_manager.py b/src/history_manager.py
index be0d0b5d0..7000ffbce 100755
--- a/src/history_manager.py
+++ b/src/history_manager.py
@@ -33,7 +33,7 @@ _ = i18n._
gtk.glade.bindtextdomain(i18n.APP, i18n.DIR)
gtk.glade.textdomain(i18n.APP)
-# log_line_id (HIDDEN), jid_id (HIDDEN), time, message, subject
+# time, message, subject
(
C_UNIXTIME,
C_MESSAGE,
@@ -54,11 +54,19 @@ class HistoryManager:
'%s does not exist.' % LOG_DB_PATH).get_response()
sys.exit()
- self.xml = gtk.glade.XML('history_manager.glade',
+ xml = gtk.glade.XML('history_manager.glade',
'history_manager_window', i18n.APP)
- self.window = self.xml.get_widget('history_manager_window')
- self.jids_listview = self.xml.get_widget('jids_listview')
- self.logs_listview = self.xml.get_widget('logs_listview')
+ self.window = xml.get_widget('history_manager_window')
+ self.jids_listview = xml.get_widget('jids_listview')
+ self.logs_listview = xml.get_widget('logs_listview')
+ self.search_entry = xml.get_widget('search_entry')
+ self.logs_scrolledwindow = xml.get_widget('logs_scrolledwindow')
+ self.search_results_scrolledwindow = xml.get_widget(
+ 'search_results_scrolledwindow')
+ self.welcome_label = xml.get_widget('welcome_label')
+
+ self.logs_scrolledwindow.set_no_show_all(True)
+ self.search_results_scrolledwindow.set_no_show_all(True)
self.jids_already_in = [] # holds jids that we already have in DB
@@ -72,20 +80,24 @@ class HistoryManager:
self._fill_jids_listview()
- #self.jids_listview.get_selection().unselect_all()
+ self.search_entry.grab_focus()
self.window.maximize()
self.window.show_all()
- self.xml.signal_autoconnect(self)
+ xml.signal_autoconnect(self)
def _init_jids_listview(self):
- self.jids_liststore = gtk.ListStore(str) # jid
+ self.jids_liststore = gtk.ListStore(str, str) # jid, jid_id
self.jids_listview.set_model(self.jids_liststore)
+ self.jids_listview.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
renderer_text = gtk.CellRendererText() # holds jid
col = gtk.TreeViewColumn('Contacts', renderer_text, text = 0)
self.jids_listview.append_column(col)
+
+ self.jids_listview.get_selection().connect('changed',
+ self.on_jids_listview_selection_changed)
def _init_logs_listview(self):
# log_line_id (HIDDEN), jid_id (HIDDEN), time, message, subject
@@ -99,7 +111,6 @@ class HistoryManager:
col.set_resizable(True)
self.logs_listview.append_column(col)
-
renderer_text = gtk.CellRendererText() # holds message
col = gtk.TreeViewColumn('Message', renderer_text, text = C_MESSAGE)
col.set_sort_column_id(C_MESSAGE) # user can click this header and sort
@@ -116,17 +127,36 @@ class HistoryManager:
gtk.main_quit()
def _fill_jids_listview(self):
- self.cur.execute('SELECT jid FROM jids')
+ self.cur.execute('SELECT jid, jid_id FROM jids')
rows = self.cur.fetchall() # list of tupples: [(u'aaa@bbb',), (u'cc@dd',)]
for row in rows:
- # row[0] is first item of row (the only result here, the jid)
- self.jids_already_in.append(row[0])
- self.jids_liststore.append(row)
+ self.jids_already_in.append(row[0]) # jid
+ self.jids_liststore.append(row) # jid, jid_id
- def on_jids_listview_cursor_changed(self, widget, data = None):
- model, iter_ = self.jids_listview.get_selection().get_selected()
- jid = model[iter_][0] # jid
- self._fill_logs_listview(jid)
+ def on_jids_listview_selection_changed(self, widget, data = None):
+ liststore, list_of_paths = self.jids_listview.get_selection()\
+ .get_selected_rows()
+ paths_len = len(list_of_paths)
+ if paths_len == 0: # nothing is selected
+ return
+ elif paths_len == 1:
+ do_clear = True
+ else:
+ do_clear = False
+
+ self.welcome_label.hide()
+ self.logs_scrolledwindow.show()
+
+ list_of_rowrefs = []
+ for path in list_of_paths: # make them treerowrefs (it's needed)
+ list_of_rowrefs.append(gtk.TreeRowReference(liststore, path))
+
+ for rowref in list_of_rowrefs:
+ path = rowref.get_path()
+ if path is None:
+ continue
+ jid = liststore[path][0] # jid
+ self._fill_logs_listview(jid, do_clear)
def _get_jid_id(self, jid):
'''jids table has jid and jid_id
@@ -161,10 +191,11 @@ class HistoryManager:
else:
return False
- def _fill_logs_listview(self, jid):
+ def _fill_logs_listview(self, jid, do_clear = True):
'''fill the listview with all messages that user sent to or
received from JID'''
- self.logs_liststore.clear() # first clear the store
+ if do_clear:
+ self.logs_liststore.clear() # clear the store
# no need to lower jid in this context as jid is already lowered
# as we use those jids from db
jid_id = self._get_jid_id(jid)
@@ -188,6 +219,21 @@ class HistoryManager:
else:
self.logs_liststore.append((row[0], row[1], time_, row[4], row[5]))
+ def _fill_search_results_listview(self, text):
+ '''ask db and fill listview with results that match text'''
+ # FIXME: check kind and set color accordingly
+ # exposed in UI (TreeViewColumns) are only JID, time, message and subject
+ # but store in liststore jid, time, message and subject
+ self.cur.execute('''
+ SELECT jid_id, time, kind, message, subject FROM logs
+ WHERE jid_id = %d
+ ORDER BY time
+ ''' % (jid_id,))
+
+ results = self.cur.fetchall()
+ for row in results:
+ pass
+
def on_logs_listview_key_press_event(self, widget, event):
liststore, list_of_paths = self.logs_listview.get_selection()\
.get_selected_rows()
@@ -197,14 +243,14 @@ class HistoryManager:
if event.keyval == gtk.keysyms.Delete:
pri_text = i18n.ngettext(
- 'Do you really want to delete the selected message?',
- 'Do you really want to delete the selected messages?', paths_len)
+ 'Do you really want to delete the selected message?',
+ 'Do you really want to delete the selected messages?', paths_len)
dialog = dialogs.ConfirmationDialog(pri_text,
_('This is an irreversible operation.'))
if dialog.get_response() != gtk.RESPONSE_OK:
return
- # delete rows from db (using log_line_id)
+ # delete rows from db that match log_line_id
list_of_rowrefs = []
for path in list_of_paths: # make them treerowrefs (it's needed)
list_of_rowrefs.append(gtk.TreeRowReference(liststore, path))
@@ -223,9 +269,59 @@ class HistoryManager:
self.con.commit()
+ def on_jids_listview_key_press_event(self, widget, event):
+ liststore, list_of_paths = self.jids_listview.get_selection()\
+ .get_selected_rows()
+ paths_len = len(list_of_paths)
+ if paths_len == 0: # nothing is selected
+ return
+
+ if event.keyval == gtk.keysyms.Delete:
+ pri_text = i18n.ngettext(
+ 'Do you really want to delete logs of the selected contact?',
+ 'Do you really want to delete logs of the selected contacts?',
+ paths_len)
+ dialog = dialogs.ConfirmationDialog(pri_text,
+ _('This is an irreversible operation.'))
+ if dialog.get_response() != gtk.RESPONSE_OK:
+ return
- def delete_messages_from_log(self, selection):
- pass
+ # delete all rows from db that match jid_id
+ list_of_rowrefs = []
+ for path in list_of_paths: # make them treerowrefs (it's needed)
+ list_of_rowrefs.append(gtk.TreeRowReference(liststore, path))
+
+ for rowref in list_of_rowrefs:
+ path = rowref.get_path()
+ if path is None:
+ continue
+ jid_id = liststore[path][1]
+ del liststore[path] # remove from UI
+ # remove from db
+ self.cur.execute('''
+ DELETE FROM logs
+ WHERE jid_id = %s
+ ''' % (jid_id,))
+
+ # now delete "jid, jid_id" row from jids table
+ self.cur.execute('''
+ DELETE FROM jids
+ WHERE jid_id = %s
+ ''' % (jid_id,))
+
+ self.con.commit()
+
+ def on_search_db_button_clicked(self, widget):
+ text = self.search_entry.get_text()
+ if text == '':
+ return
+
+ self.welcome_label.hide()
+ self.search_results_scrolledwindow.show()
+
+ def on_search_results_listview_row_activated(self, widget, path, column):
+ model = widget.get_model()
+ print model[path][0]
if __name__ == '__main__':
signal.signal(signal.SIGINT, signal.SIG_DFL) # ^C exits the application