# 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
		


syntax highlighted by Code2HTML, v. 0.9.1