# For editing personalities of mailboxes import gtk import gobject import ptk.misc_widgets from ptk.big_edit_box import * import personality import utils import string import copy class personalitybox(gtk.VBox): def apply_changes(self): self.user.personalities = self.userpersonalities self.msgbox.personalities = self.ourpersonalities self.msgbox.default_personality = self.default_personality def __init__(self, msgbox, user, parent_win): self.parent_win = parent_win gtk.VBox.__init__(self, spacing=5) self.set_border_width(5) self.msgbox = msgbox self.user = user # Copies of stuff we are changing self.default_personality = msgbox.default_personality self.ourpersonalities = copy.deepcopy(msgbox.personalities) self.userpersonalities = copy.deepcopy(user.personalities) box1 = gtk.HBox(spacing=5) self.pack_start(box1, expand=False) box1.show() label = gtk.Label(_("Default personality")) box1.pack_start(label, expand=False) label.show() # Menu to select default personality self.optmenu = gtk.combo_box_new_text () self.optmenu.connect("changed", self._change_default_personality) self.update_optmenu() box1.pack_start(self.optmenu) self.optmenu.show() box2 = gtk.HBox(spacing=5) box2.set_size_request(-1, 100) self.pack_start(box2) box2.show() self.selected = None def _ourperson_clicked(_button, event, self=self): selected = self.ourperson_list.get_path_at_pos (int (event.x), int (event.y)) if selected == None: self.selected = None self.edit_button.set_sensitive(False) return model = self.ourperson_list.get_model () iter = model.get_iter (selected[0]) self.ourperson_list_selected = model.get_value (iter, 1) self.selected = self.ourperson_list_selected # double-click opens edit box thingy if event.type == gtk.gdk._2BUTTON_PRESS: self.userpersonalities[self.ourperson_list_selected].edit_box(user, self) if selected and (len(self.ourpersonalities) > 1): self.edit_button.set_sensitive(True) self.moveback_button.set_sensitive(True) else: self.moveback_button.set_sensitive(False) def _userperson_clicked(_button, event, self=self): selected = self.userperson_list.get_path_at_pos (int (event.x), int (event.y)) if selected == None: self.selected = None self.edit_button.set_sensitive(False) return model = self.userperson_list.get_model () iter = model.get_iter (selected[0]) self.userperson_list_selected = model.get_value (iter, 1) self.selected = self.userperson_list_selected # double-click opens edit box thingy if event.type == gtk.gdk._2BUTTON_PRESS: self.userpersonalities[self.userperson_list_selected].edit_box(user, self) if selected: self.move_button.set_sensitive(True) self.delete_button.set_sensitive(True) self.edit_button.set_sensitive(True) self.copy_button.set_sensitive(True) else: self.move_button.set_sensitive(False) self.delete_button.set_sensitive(False) self.edit_button.set_sensitive(False) self.copy_button.set_sensitive(False) # List of our personalities self.ourperson_list = gtk.TreeView () cell = gtk.CellRendererText () col = gtk.TreeViewColumn (_("Personalities"), cell, text=0) self.ourperson_list.append_column (col) model = gtk.ListStore (gobject.TYPE_STRING, gobject.TYPE_STRING) self.ourperson_list.set_model (model) self.ourperson_list_selected = None self.ourperson_list.connect("button_press_event", _ourperson_clicked) swin = gtk.ScrolledWindow() swin.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) swin.show() swin.add(self.ourperson_list) self.ourperson_list.show() box2.pack_start(swin) movebox = gtk.VBox() box2.pack_start(movebox, expand=False) movebox.show() button = gtk.Button("<-") button.connect("clicked", self.add_to_ourpersons) movebox.pack_start(button) button.set_sensitive(False) button.show() self.move_button = button button = gtk.Button(_("->")) button.connect("clicked", self.moveback_personality) movebox.pack_start(button) button.set_sensitive(False) button.show() self.moveback_button = button # List of global personalities self.userperson_list = gtk.TreeView () cell = gtk.CellRendererText () col = gtk.TreeViewColumn (_("Global personalities"), cell, text=0) self.userperson_list.append_column (col) model = gtk.ListStore (gobject.TYPE_STRING, gobject.TYPE_STRING) self.userperson_list.set_model (model) self.userperson_list_selected = None self.userperson_list.connect("button_press_event", _userperson_clicked) swin = gtk.ScrolledWindow() swin.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) swin.show() swin.add(self.userperson_list) self.userperson_list.show() box2.pack_start(swin) buttonbox = gtk.HBox(spacing=5) self.pack_start(buttonbox, expand=False) buttonbox.show() button = gtk.Button(stock="gtk-delete") button.connect("clicked", self.delete_global) buttonbox.pack_end(button, expand=False) button.set_sensitive(False) button.show() self.delete_button = button button = gtk.Button(stock="gtk-copy") button.connect("clicked", self.copy_personality) buttonbox.pack_end(button, expand=False) button.set_sensitive(False) button.show() self.copy_button = button button = gtk.Button(" "+_("Edit")+" ") button.connect("clicked", self.edit_global) buttonbox.pack_end(button, expand=False) button.set_sensitive(False) button.show() self.edit_button = button button = gtk.Button(stock="gtk-new") button.connect("clicked", self.new_personality) buttonbox.pack_end(button, expand=False) button.show() self.update_personlist() def get_personality_uid(self): """ Get a new unique personality ID (uid). """ i = 0 ids = self.userpersonalities.keys() while 1: if not str(i) in ids: return str(i) i = i + 1 def edit_global (self, _button=None): self.userpersonalities[self.selected].edit_box(self.user, self) def delete_global(self, _button): """ Delete a personality globally. """ uid = self.userperson_list_selected def _find_personality(folder, uid=uid, ourfolder=self.msgbox): if folder is ourfolder: return if folder.__dict__.has_key("personalities"): if uid in folder.personalities: return folder.name if uid in self.ourpersonalities: ptk.misc_widgets.InfoBox (_("Error"), _("You cannot delete the selected personality\nbecause this folders is using it."), gtk.STOCK_CANCEL, parent_win=self.parent_win) return # Are other folders using it? others = utils.recurse_apply(self.user.contents, _find_personality) if len(others) != 0: ptk.misc_widgets.InfoBox (_("Error"), _("You cannot delete the selected personality\nbecause one or more folders are using it:\n%s") % string.join(others, ","), gtk.STOCK_CANCEL, parent_win=self.parent_win) return # Do it del self.userpersonalities[uid] self.update_personlist() def add_to_ourpersons(self, _button): """ Add the selected global personality to our local ones. """ uid = self.userperson_list_selected if not (uid in self.ourpersonalities): self.ourpersonalities.append(uid) self.update_personlist() self.update_optmenu() def copy_personality(self, _button): """ Add the selected global personality to our local ones. """ uid = self.userperson_list_selected old = self.userpersonalities[uid] new = copy.copy(old) new.pname = "Copy of "+new.pname new.uid = self.get_personality_uid() self.userpersonalities[new.uid] = new self.ourpersonalities.append(new.uid) self.update_personlist() self.update_optmenu() def new_personality(self, _button): p = personality.personality(_("New personality")) p.uid = self.get_personality_uid() self.userpersonalities[p.uid] = p self.ourpersonalities.append(p.uid) self.update_personlist() self.update_optmenu() def moveback_personality(self, _button): uid = self.ourperson_list_selected self.ourpersonalities.remove (uid) self.update_personlist() self.update_optmenu() def update_personlist(self): model = self.ourperson_list.get_model () model.clear () for i in self.ourpersonalities: iter = model.append () model.set (iter, 0, self.userpersonalities[i].pname, 1, i) if self.ourperson_list_selected == None: self.moveback_button.set_sensitive(False) if self.userperson_list_selected == None: self.delete_button.set_sensitive(False) self.edit_button.set_sensitive(False) self.move_button.set_sensitive(False) self.copy_button.set_sensitive(False) model = self.userperson_list.get_model () model.clear () for i in self.userpersonalities.keys(): iter = model.append () model.set (iter, 0, self.userpersonalities[i].pname, 1, i) def _change_default_personality(self, item): index = self.optmenu.get_active () uid = self.userpersonalities[self.ourpersonalities[index]].uid self.default_personality = uid def update_optmenu(self): self.optmenu.get_model ().clear () # Default personality menu for i in range (0, len (self.ourpersonalities)): p = self.userpersonalities[self.ourpersonalities[i]] self.optmenu.append_text (p.pname) try: self.optmenu.set_active (self.ourpersonalities.index(self.default_personality)) except ValueError: # Eek. We deleted our default. Just set default to first in list self.optmenu.set_active (0) uid = self.ourpersonalities[0] self.default_personality = uid