Index: conseil.py
===================================================================
--- conseil.py	(révision 78)
+++ conseil.py	(copie de travail)
@@ -14,7 +14,6 @@
 	import gtk
   	import gtk.glade
 	import gobject
-	import gnome
 except:
 	sys.exit(1)
 
@@ -71,9 +70,9 @@
 from protocol_launchpadstaging_web import protocol
 from bug import bug
 from bookmarks_store import *
-from retriever import *
 from definitions import *
 from management import *
+from retriever import *
 
 class MainWindow :
 	
@@ -85,7 +84,7 @@
 		self.bugs_tabs		= self.full_glade.get_widget("bugs_notebook")
 		self.statusbar		= self.full_glade.get_widget("statusbar")
 		self.sidebar		= self.full_glade.get_widget("sidebar")
-		self.accounts_widget    = manage_accounts(self.full_glade)
+		self.accounts    = manage_accounts(self.full_glade)
 		#self.display_sidebar_menu = self.full_glade.get_widget("sidebar_display")
 		#hpane = self.full_glade.get_widget("hpaned1")
 		#hpane.set_property("min-position", 100)
@@ -102,13 +101,15 @@
 			"on_quit_activate": gtk.main_quit,
 			"on_import_activate" : self.import_bookmarks,	
 			"on_open_activate" : self.open_bookmarks,
-			"on_account_activate" : self.accounts_widget.show,
-			"on_close_accountsconfig_button_clicked" : self.accounts_widget.hide,
-			"on_accounts_friendlyname_changed" : self.accounts_widget.friendlyname_change,
-			"on_accounts_protocol_changed" : self.accounts_widget.protocol_change,
-			"on_accounts_url_changed" : self.accounts_widget.url_change,
-			"on_accounts_login_changed" : self.accounts_widget.login_change,
-			"on_accounts_password_changed" : self.accounts_widget.password_change,
+			"on_account_activate" : self.accounts.show,
+			"on_close_accountsconfig_button_clicked" : self.accounts.hide,
+			"on_accounts_friendlyname_changed" : self.accounts.friendlyname_change,
+			"on_accounts_protocol_changed" : self.accounts.protocol_change,
+			"on_accounts_url_changed" : self.accounts.url_change,
+			"on_accounts_login_changed" : self.accounts.login_change,
+			"on_accounts_password_changed" : self.accounts.password_change,
+			"on_accounts_add" : self.add_account,
+			"on_accounts_remove" : self.remove_account,
 			"on_a_propos_activate" : self.about_dialog,
 			"on_aboutdialog_response" : lambda x, y: x.hide(),
 			"on_bugs_notebook_switch_page" : self.switch_page,
@@ -121,18 +122,18 @@
 		#self.sidebar_bm.connect("button_press_event", self.bookmarks_button_press)
 		#Wich BTS are we using ?
 		#self.auth = user()
-		self.bts = protocol(self.accounts_widget.get_manager() )
-		self.retriever = retriever(self.bts, self.bugs_tabs, self.full_glade)
 		#bookmarks init
-		self.bookmarks = bookmarks_store(self.bts.btsName())
 		#construction of the bookmarks widget
+		self.bookmarksStorage = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING) # title, bts name, xml
 		self.bookmarksTreeV = self.full_glade.get_widget("bookmarks_list")
-		self.bookmarksTreeV.set_model(self.bookmarks.get())
+		self.bookmarksTreeV.set_model(self.bookmarksStorage)
 		self.renderer = gtk.CellRendererText()
 		self.renderer.set_property('editable', False)
 		self.renderer.connect('edited', self.__edited_callback)
 		column = gtk.TreeViewColumn("title", self.renderer, text=0)
 		self.bookmarksTreeV.append_column(column)
+		#~ self.bookmarksTreeV.append_column(gtk.TreeViewColumn("bts", gtk.CellRendererText(), text=1))
+		#~ self.bookmarksTreeV.append_column(gtk.TreeViewColumn("bug_id", gtk.CellRendererText(), text=2))
 		self.bookmarksTreeV.show()
 		#construction of the advanced search widget
 		#with scrollbars
@@ -143,12 +144,12 @@
 		to_remove = self.full_glade.get_widget("omega13")
 
 		statusbox = self.full_glade.get_widget("adv_search_status_box")
-		for e in self.bts.availableStatus():
+		for e in self.accounts[0].bts().availableStatus(): # fixme !
 			checkbox = gtk.CheckButton(label=e)
 			checkbox.show()
 			statusbox.pack_start(checkbox,expand=0,padding=1)
 		importancebox = self.full_glade.get_widget("adv_search_importance_box")
-		for e in self.bts.availableImportance():
+		for e in self.accounts[0].bts().availableImportance(): # fixme !
 			checkbox = gtk.CheckButton(label=e)
 			checkbox.show()
 			importancebox.pack_start(checkbox,expand=0,padding=1)	
@@ -158,7 +159,36 @@
 		
 		adv_parent.remove(to_remove)
 		adv_parent.add(adv_main)
-
+		
+		self.bookmarks = {}
+		for account in self.accounts:
+			bts = account.bts().btsName()
+			if not bts in self.bookmarks:
+				self.bookmarks[bts] = bookmarks_store(bts, self.bookmarksStorage)
+		
+		self.btslist = btslist = self.full_glade.get_widget('bts_list1')
+		cell = gtk.CellRendererText()
+		model = gtk.ListStore(gobject.TYPE_STRING)
+		btslist.set_model(model)
+		btslist.pack_start(cell)
+		btslist.set_attributes(cell, text=0)
+		for bts in self.bookmarks:
+			btslist.append_text(bts)
+		btslist.set_active(0)
+	
+	def add_account(self, x):
+		bts = self.accounts.add_account().bts().btsName()
+		if not bts in self.bookmarks:
+			self.bookmarks[bts] = bookmarks_store(bts, self.bookmarksStorage)
+	
+	def remove_account(self, x):
+		acc = self.accounts.selected_account()
+		if acc:
+			bts = acc.bts().btsName()
+			self.accounts.remove_account()
+			if len(self.get_accounts_for_bts(bts)) == 1:
+				del self.booksmarks[bts]
+	
 	def __isint(self,x):
 		try:
 			x = int(x)
@@ -239,7 +269,7 @@
 			zetuple = widget.get_selection().get_selected()
 			#Fixme : what if the user didn't click on the tree first ?
 			if zetuple[1] != None :
-				clicked = bookmark(widget,None)
+				clicked = bookmark(widget,None,zetuple[2])
 				self.open_page(clicked)
 			
 		#right click menu
@@ -270,12 +300,15 @@
 			menu.popup(None, None, None, event.button, event.time)
 
 	
-	def bookmarkClicked(widget, path, view_column,user_param1):
-		clicked = bookmark(path,None)
-		widget.open_page(clicked)
+	def bookmarkClicked(self, widget, path, view_column):
+		clicked = bookmark(widget,None,self.bookmarksStorage[path][2])
+		self.open_page(clicked)
 
 	#open a page in the given widget using clicked, which is a bookmark object
 	def open_page(self,clicked) :
+		accs = self.get_accounts_for_bts(clicked.bts)
+		retriever = accs[0].retriever(self.bugs_tabs, self.full_glade)
+		
 		method = clicked.get_method()
 		dic = makedict()
 		if method == 1:
@@ -283,19 +316,19 @@
 			dic["method"] = 1
 			bug_nbr = clicked.get_bug()
 			dic["bug"] = bug_nbr
-			self.retriever.display(dic)
+			retriever.display(dic)
 		elif method == 2:
 			dic["method"] = 2
 			searchString = clicked.get_search()
 			dic["search"] = searchString
-			self.retriever.display(dic)
+			retriever.display(dic)
 		elif method == 3:
 			dic["method"] = 3
 			product = clicked.get_product()
 			dic["product"] = product
 			search = clicked.get_search()
 			dic["search"] = search
-			self.retriever.display(dic)
+			retriever.display(dic)
 
 	#when the "add bookmark button is clicked
 	def addBookmark_clicked(self, widget):
@@ -303,15 +336,20 @@
 		if tab != None :
 			#tab_descr function is part of page
 			descr = tab_descr(tab)
-			self.bookmarks.add(descr)
+			self.bookmarks[read_bts(descr)].add(descr)
 	
 	#the "remove bookmark" button is clicked
 	def removeBookmark_clicked(self, widget):
 		to_delete = self.bookmarksTreeV.get_selection().get_selected()[1]	
-		self.bookmarks.delete(to_delete)
+		bts = self.bookmarksStorage.get_value(to_delete, 2)
+		self.bookmarks[bts].delete(to_delete)
 	
 	#main search button pressed
 	def simpleSearch_clicked(self, widget):
+		acc = self.get_accounts_for_bts(self.btslist.get_active_text())[0]
+		bts = acc.bts()
+		retriever = acc.retriever(self.bugs_tabs, self.full_glade)
+		
 		searchString = self.full_glade.get_widget("simple_search_entry").get_text().strip()
 		if searchString.startswith("#") :
 			tmp = searchString.lstrip("#")
@@ -319,26 +357,27 @@
 				searchString = tmp
 		if searchString != '' :
 			dic = makedict()
+			dic["bts"] = bts.btsName()
 			# Have we a single bug number ?
 			if self.__isint(searchString) :
 				dic["method"] = 1
 				dic["bug"] = searchString
-				self.retriever.display(dic)
+				retriever.display(dic)
 			# no, we have a search.
 			else :
 				array = string.split(searchString,' ',1)
-				if self.bts.packageExist(array[0]) :
+				if bts.packageExist(array[0]) :
 					dic["method"]= 3
 					dic["product"] = array[0]
 					if len(array) < 2 :
 						dic["search"] = None
 					else :
 						dic["search"] = array[1]	
-					self.retriever.display(dic)
+					retriever.display(dic)
 				else :
 					dic["method"]= 2
 					dic["search"] = searchString
-					self.retriever.display(dic)
+					retriever.display(dic)
 	
 	def about_dialog(self,widget):
 		about_widget = self.full_glade.get_widget("aboutdialog")
@@ -348,7 +387,12 @@
 		widget.hide()
 		return True
 
-		
+	def get_accounts_for_bts(self, bts):
+		accounts = []
+		for account in self.accounts:
+			if account.bts().btsName() == bts:
+				accounts.append(account)
+		return accounts
 
 if __name__ == "__main__":
 	gobject.threads_init()
Index: protocols/protocol_launchpadstaging_web.py
===================================================================
--- protocols/protocol_launchpadstaging_web.py	(révision 78)
+++ protocols/protocol_launchpadstaging_web.py	(copie de travail)
@@ -20,17 +20,17 @@
 		self.user = manager
 		
 	def url(self):
-		zeurl = self.user.url()
+		zeurl = self.user.url
 		if zeurl.endswith("/") :
 			return zeurl
 		else :
 			return "%s/" %zeurl
 					
 	def login(self) :
-		return self.user.login()
+		return self.user.login
 		
 	def password(self) :
-		return self.user.password()
+		return self.user.password
 
 # LAUNCHPAD protocol using the web : suboptimal
 
@@ -52,8 +52,8 @@
 
 	# Send back the name of the protocol as a simple string
 	
-	#deprecated
-	def Name(self):
+	@staticmethod
+	def Name():
 		return "launchpadstaging_web"
 
 	# send the name of the bts this protocol will talk too.
Index: protocols/protocol_launchpadweb.py
===================================================================
--- protocols/protocol_launchpadweb.py	(révision 78)
+++ protocols/protocol_launchpadweb.py	(copie de travail)
@@ -7,7 +7,7 @@
 from mechanize import Browser
 from BeautifulSoup import BeautifulSoup
 # You have to change this if you have another storage
-from auth_dummy import user
+#from auth_dummy import user
 
 baseurl = "https://staging.launchpad.net/"
 #baseurl = "https://launchpad.net/"
@@ -20,6 +20,8 @@
 # -  user.login()  -> string that contains the login
 # -  user.password() -> string that contains the password
 
+	def __init__(self,manager) :
+		self.user = manager
 
 ### Launchpad only functions ####
 
@@ -33,7 +35,8 @@
 
 	# Send back the name of the protocol as a simple string
 
-	def Name(self):
+	@staticmethod
+	def Name():
 		return "launchpadweb"
 
 	# send the name of the bts this protocol will talk too.
@@ -246,14 +249,13 @@
 	#private function that log the user into Launchpad
 	# return a mechanize Browser object
 	def __login(self):
-		me=user()
 		urllog="%s+login" %baseurl
 		br = Browser()
 		br.set_handle_robots(False)
 		br.open(urllog)
 		br.select_form(name="login")
-		br["loginpage_email"]=me.login()
-		br["loginpage_password"]=me.password()
+		br["loginpage_email"]=self.user.login
+		br["loginpage_password"]=self.user.password
 		response = br.submit()
 		return br
 
Index: retriever.py
===================================================================
--- retriever.py	(révision 78)
+++ retriever.py	(copie de travail)
@@ -17,7 +17,7 @@
 	import gtk
   	import gtk.glade
 	import gobject
-	import gnome
+	import desktop
 except:
 	sys.exit(1)
 from page import *
@@ -122,7 +122,7 @@
 					# Fixme !
 					if itera != None :
 						bugnbr = store.get_value(itera,0)
-						gnome.url_show(self.bts.getBugUrl(bugnbr))
+						desktop.url_show(self.bts.getBugUrl(bugnbr))
 				browser = gtk.MenuItem(_("Open in a web browser"))
 				browser.connect("activate", browser_callback)
 				browser.show()
@@ -165,6 +165,7 @@
 		dic = makedict()
 		dic["method"] = 1
 		dic["bug"] = str(bug_nbr)
+		dic["bts"] = self.bts.btsName()
 		self.display(dic)
 
 	#We did a simple search
Index: management.py
===================================================================
--- management.py	(révision 78)
+++ management.py	(copie de travail)
@@ -1,20 +1,38 @@
 #!/usr/bin/python
 # -*- coding: utf-8 -*-
 import sys, string, xml.dom.minidom, os
+import gtk, gobject, protocols
 
-# from auth_file import user
+import protocols, retriever
 
 class manage_accounts :
 	def __init__(self, gladefile) :
 		self.widget = gladefile.get_widget("accounts_dialog")
 		self.gladefile = gladefile
-		self.accounts_file ="accounts.xml"
-		self.friendlyname = ""
-		self.protocol = ""
-		self.url = ""
-		self.login = ""
-		self.password = ""
+		self.accounts = []
+		self.accounts_file = "accounts.xml"
+		self.updated_account_bts = None
 		
+		# Glade sucks, following should be its job :(
+		self.accountsTreeV = gladefile.get_widget('treeview1')
+		self.accountsViewList = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_INT)
+		self.accountsTreeV.append_column(gtk.TreeViewColumn("Name", gtk.CellRendererText(), text=0))
+		#~ self.accountsTreeV.append_column(gtk.TreeViewColumn("pos", gtk.CellRendererText(), text=1))
+		self.accountsTreeV.set_model(self.accountsViewList)
+		self.accountsTreeV.get_selection().set_mode(gtk.SELECTION_SINGLE)
+		self.accountsTreeV.get_selection().connect("changed", self.update_display)
+		self.accountsTreeV.set_headers_visible(False)
+		cell = gtk.CellRendererText()
+		model = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
+		protos_list = gladefile.get_widget("accounts_protocol")
+		protos_list.set_model(model)
+		protos_list.pack_start(cell)
+		protos_list.set_attributes(cell, text=0)
+		
+		for proto in protocols.__all__:
+			name = getattr(protocols, proto).protocol.Name()
+			protos_list.get_model().append((name,proto))
+		
 		if os.path.exists(self.accounts_file) :
 			f = open(self.accounts_file,mode='r')
 			if self.open_file(f) == 0 :
@@ -24,13 +42,18 @@
 			self.doc = xml.dom.minidom.Document()
 			store = self.doc.createElement("store")
 			self.doc.appendChild(store)
-			#here we can put hardcoded default
 			self.add_account()
 			#then we create the file
 			f = open(self.accounts_file, mode='a+')
 			f.write(self.doc.toxml().encode("utf-8"))
 			f.close()
-			
+	
+	def __iter__(self):
+		return iter(self.accounts)
+	
+	def __getitem__(self, i):
+		return self.accounts[i]
+	
 	def account_error(self) :
 		message = _("Accounts are not in a valid format. \n Please remove the %s file and restart Conseil") %self.accounts_file
 		#error_window = gtk.MessageDialog(parent=None, flags=0, type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_CLOSE, message_format=message)
@@ -51,124 +74,179 @@
 				self.add_account()
 		else :
 			return 0
-		self.read_value()
+		for account in self.doc.getElementsByTagName("account"):
+			self.add_account(bts_info(xml = account))
+		self.select_index(0)
 		return 1
 		
-			
-	def show(self,x) :
-		self.widget.show()
-		self.f = open(self.accounts_file, mode='r')
-		self.open_file(self.f)
-		self.update_display()
-		self.f.close()
-		
-
-	def hide(self,x) :
-		self.widget.hide()
-		#self.sync()
-		
-		
 	def sync(self) :
 		self.f = open(self.accounts_file, mode='w')
 		self.f.write(self.doc.toprettyxml().encode("utf-8"))
 		self.f.close()
+	
+	def selected_index(self):
+		sel = self.accountsTreeV.get_selection()
+		nil, iter = sel.get_selected()
 		
-	def read_value(self) :
-		#multi accounts support here
-		#we set the value of friendlyname
-		#self.friendlyname = get_Value_of_widget
-		#for i in self.doc.getElementsByTagName("account") :
-		#	if i.getAttribute("friendlyname") = self.friendlyname :
-		#		self.account = i
+		if iter == None or len(self.accounts) == 0:
+			return None
+		else:
+			return self.accountsViewList.get(iter, 1)[0]
 		
-		# As long as we only support one account :
-		self.account = self.doc.getElementsByTagName("account")[0]
-		self.friendlyname = self.account.getAttribute("friendlyname")
+	def selected_account(self):
+		sel = self.selected_index()
+		if sel is None:
+			return None
+		else:
+			return self.accounts[sel]
+	
+	def select_index(self, i):
+		for account in self.accountsViewList:
+			if account[1] == i:
+				self.accountsTreeV.get_selection().select_iter(account.iter)
+	
+	def add_account(self, account = None) :
+		if account is None: # create a new account
+			account = bts_info(doc = self.doc)
 		
-		# Then read the values
-		if self.account.getElementsByTagName("url")[0].hasChildNodes() :
-			self.url = self.account.getElementsByTagName("url")[0].childNodes[0].nodeValue
-		if self.account.getElementsByTagName("protocol")[0].hasChildNodes() :
-			self.protocol = self.account.getElementsByTagName("protocol")[0].childNodes[0].nodeValue
-		if self.account.getElementsByTagName("login")[0].hasChildNodes() :
-			self.login = self.account.getElementsByTagName("login")[0].childNodes[0].nodeValue
-		if self.account.getElementsByTagName("password")[0].hasChildNodes() :	
-			self.password = self.account.getElementsByTagName("password")[0].childNodes[0].nodeValue
+		self.accounts.append(account)
+		self.accountsViewList.append((account.friendlyname, len(self.accounts)-1))
+		self.select_index(len(self.accounts)-1)
 		
-	def add_account(self) :
-		self.account = self.doc.createElement("account")
-		self.account.setAttribute("friendlyname",self.friendlyname)
-		protocol_node = self.doc.createElement("protocol")
-		protocol_node.appendChild(self.doc.createTextNode(self.protocol))
-		url_node = self.doc.createElement("url")
-		url_node.appendChild(self.doc.createTextNode(self.url))
-		login_node = self.doc.createElement("login")
-		login_node.appendChild(self.doc.createTextNode(self.login))
-		pass_node = self.doc.createElement("password")
-		pass_node.appendChild(self.doc.createTextNode(self.password))	
-		self.account.appendChild(protocol_node)
-		self.account.appendChild(url_node)
-		self.account.appendChild(login_node)
-		self.account.appendChild(pass_node)		
-		self.doc.firstChild.appendChild(self.account)
+		self.sync()
+		self.update_display()
 		
-	def update_display(self) :
-		self.gladefile.get_widget("accounts_friendlyname").set_text(self.friendlyname)
-		#self.gladefile.get_widget("accounts_protocol")
-		self.gladefile.get_widget("accounts_url").set_text(self.url)
-		self.gladefile.get_widget("accounts_login").set_text(self.login)
-		self.gladefile.get_widget("accounts_password").set_text(self.password)
+		return account
+		
+	def remove_account(self):
+		idx = self.selected_index()
+		if idx is None:
+			return
+		self.accounts[idx].remove()
+		self.accounts.remove(self.accounts[idx])
+		for account in self.accountsViewList:
+			if account[1] < idx:
+				continue
+			elif account[1] == idx:
+				self.accountsViewList.remove(account.iter)
+			else: # account[1] > idx
+				account[1] -= 1
+		self.select_index(idx)
+		if self.selected_index() is None:
+			self.select_index(idx-1)
+		self.sync()
+	
+	def show(self,x) :
+		self.widget.show()
+		self.update_display()
 
+	def hide(self,x) :
+		self.widget.hide()
+		
+	def update_display(self,nil=None) :
+		if self.selected_index() is None:
+			return
+		
+		self.gladefile.get_widget("accounts_friendlyname").set_text(self.selected_account().friendlyname)
+		self.gladefile.get_widget("accounts_url").set_text(self.selected_account().url)
+		self.gladefile.get_widget("accounts_login").set_text(self.selected_account().login)
+		self.gladefile.get_widget("accounts_password").set_text(self.selected_account().password)
+		
+		for proto in self.gladefile.get_widget("accounts_protocol").get_model():
+			if proto[1] == self.selected_account().protocol:
+				self.gladefile.get_widget("accounts_protocol").set_active_iter(proto.iter)
+				break
+
 	def friendlyname_change(self,x) :
-		self.friendlyname = x.get_text()
-		self.account.setAttribute("friendlyname",self.friendlyname)
+		self.selected_account().friendlyname = x.get_text()
 		self.sync()
 
 	def protocol_change(self,x) :
-		self.protocol = x.get_active_text()
-		self.change("protocol",self.protocol)
+		self.selected_account().protocol = x.get_model()[x.get_active()][1]
+		if old_bts != new_bts and self.updated_account_bts:
+			self.updated_account_bts(old_bts, new_bts)
+		self.sync()
 
 	def url_change(self,x) :
-		self.url = x.get_text()
-		self.change("url",self.url)
+		self.selected_account().url = x.get_text()
+		self.sync()
 
 	def login_change(self,x) :
-		self.login = x.get_text()
-		self.change("login",self.login)
+		self.selected_account().login = x.get_text()
+		self.sync()
 
 	def password_change(self,x) :
-		self.password = x.get_text()
-		self.change("password",self.password)
-	
-	def change(self,field,value) :
-		old = self.account.getElementsByTagName(field)[0]
-		new = self.doc.createElement(field)
-		new.appendChild(self.doc.createTextNode(value))
-		self.account.replaceChild(new,old)
+		self.selected_account().password = x.get_text()
 		self.sync()
+
+class bts_info(object) :
+	def __init__(self, xml = None, doc = None):
+		""" xml = None and doc != None: create a new node under parent
+			xml != None and doc = None: read infos from node
+			xml = doc: well, you can try, could be funny... (but I'm not responsible ;)) """
 		
-	def get_url(self) :
-		return self.url
+		if xml is None:
+			self._xml = xml = doc.createElement("account")
+			
+			# here we can put hardcoded defaults
+			friendlyname = "New account"
+			protocol = protocols.__all__[0]
+			url = ""
+			login = ""
+			password = ""
+			
+			xml.setAttribute("friendlyname",friendlyname)
+			protocol_node = doc.createElement("protocol")
+			protocol_node.appendChild(doc.createTextNode(protocol))
+			url_node = doc.createElement("url")
+			url_node.appendChild(doc.createTextNode(url))
+			login_node = doc.createElement("login")
+			login_node.appendChild(doc.createTextNode(login))
+			pass_node = doc.createElement("password")
+			pass_node.appendChild(doc.createTextNode(password))	
+			xml.appendChild(protocol_node)
+			xml.appendChild(url_node)
+			xml.appendChild(login_node)
+			xml.appendChild(pass_node)		
+			doc.firstChild.appendChild(xml)
+		else:
+			self._xml = xml
+		
+		self._bts = getattr(protocols, self.protocol).protocol(self)
 	
-	def get_login(self) :
-		return self.login
+	def __getattr__(self,name):
+		if name == 'friendlyname':
+			return self._xml.getAttribute(name)
+		elif name in ('protocol', 'url', 'login', 'password'):
+			if self._xml.getElementsByTagName(name)[0].hasChildNodes():
+				return self._xml.getElementsByTagName(name)[0].childNodes[0].nodeValue
+			else:
+				return ''
+		else:
+			raise AttributeError, name
 	
-	def get_password(self) :
-		return self.password
+	def __setattr__(self,name,value):
+		if name in ('_xml', '_bts'): # a better way must exists ;)
+			object.__setattr__(self, name, value)
+		elif name == 'friendlyname':
+			self._xml.setAttribute(name, value)
+		elif name in ('protocol', 'url', 'login', 'password'):
+			doc = self._xml.ownerDocument
+			old = self._xml.getElementsByTagName(name)[0]
+			new = doc.createElement(name)
+			new.appendChild(doc.createTextNode(value))
+			self._xml.replaceChild(new,old)
+			
+			if name == 'protocol':
+				self._bts = getattr(protocols, value).protocol(self)
+		else:
+			raise AttributeError, name
 	
-	def get_manager(self) :
-		return bts_info(self)
-		
-
-class bts_info :
-	def __init__(self,manager) :
-		self.manager = manager
-		
-	def login(self) :
-		return self.manager.get_login()
+	def remove(self):
+		self._xml.parentNode.removeChild(self._xml)
 	
-	def password(self) :
-		return self.manager.get_password()
+	def retriever(self, tabs, gladef):
+		return retriever.retriever(self.bts(), tabs, gladef)
 	
-	def url(self) :
-		return self.manager.get_url()
+	def bts(self):
+		return self._bts
Index: page.py
===================================================================
--- page.py	(révision 78)
+++ page.py	(copie de travail)
@@ -30,6 +30,12 @@
 	title =  bmark.getAttribute("title")
 	return title
 
+def read_bts(string) :
+	doc2 = xml.dom.minidom.parseString(string)
+	bmark = doc2.getElementsByTagName("bookmark")[0]
+	title =  bmark.getAttribute("bts")
+	return title
+
 def read_type(string) :
 	#return the type from a descriptive string
 	doc2 = xml.dom.minidom.parseString(string)
@@ -92,6 +98,7 @@
 		title=''
 		doc = xml.dom.minidom.Document()
 		bmark = doc.createElement("bookmark")
+		bmark.setAttribute('bts', args['bts'])
 		doc.appendChild(bmark)
 		search_type = args["method"]
 		if search_type == 1 :
Index: storage/bookmarks_store.py
===================================================================
--- storage/bookmarks_store.py	(révision 78)
+++ storage/bookmarks_store.py	(copie de travail)
@@ -12,7 +12,7 @@
 	
 	# bts_name is a string arg. It will be used to have
 	# differents bookmarks for differents protocols.
-	def __init__(self, bts_name) :
+	def __init__(self, bts_name, listing) :
 		self.bmark_file ="bookmarks_%s.xml" %(bts_name)
 		#listing is : Title of the bookmarks, description of the search
 		# search method :
@@ -20,7 +20,11 @@
 		# 2- simple search
 		# 3- package search
 		# 4- advanced search
-		self.listing = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING)
+		
+		self.listing = listing
+		self.bts_name = bts_name
+		self.root = listing.append(None, (bts_name, "", bts_name))
+		
 		# rows-reordered signal not sent
 		# but I let this code here, don't know why.
 		def reorder_callback(treemodel, path, itera, new_order):
@@ -31,6 +35,7 @@
 			self.sync_file()
 		self.listing.connect("rows-reordered", reorder_callback)
 		self.listing.connect("row-deleted", deleted_callback)
+		
 		if os.path.exists(self.bmark_file) :
 			if self.import_file(self.bmark_file) == 0 :
 				print "Bookmarks not in a valid format."
@@ -58,7 +63,7 @@
 			return 0
 		for bmark in doc.getElementsByTagName("bookmark") :
 			title = bmark.getAttribute("title")
-			self.listing.insert_before(None, [title, bmark.toxml()])
+			self.listing.insert_before(self.root, None, (title, bmark.toxml(), self.bts_name))
 		return 1
 	
 	def open_file(self,zefile) :
@@ -76,34 +81,35 @@
 			array.append(bmark.toxml())
 		return array
 
-	
-	def get(self) :
-		return self.listing
-
 	def add(self,args) :
 		#do not forget to also add the bookmarks to
 		#the stored bookmarks. (sync with storage)
 		doc2 = xml.dom.minidom.parseString(args)
 		bmark = doc2.getElementsByTagName("bookmark")[0]
 		title = bmark.getAttribute("title")
-		self.listing.insert_before(None, [title, args])
+		self.listing.insert_before(self.root, None, (title, args, self.bts_name))
 		self.sync_file()
 
 	def delete(self, to_delete) :
 		#do not forget to also remove the bookmarks from
 		#the stored bookmarks. (sync with storage)
-		self.listing.remove(to_delete)
-		self.sync_file()
+		if self._is_bookmark(to_delete):
+			self.listing.remove(to_delete)
+			self.sync_file()
 	
 	def rename(self, to_rename, new_name) :
-		self.listing[to_rename][0]=new_name
-		self.sync_file()
+		if self._is_bookmark(to_delete):
+			self.listing[to_rename][0]=new_name
+			self.sync_file()
+	
+	def _is_bookmark(self, iter):
+		return self.listing.get_value(iter, 1)
 
 	def sync_file(self) :
 		doc = xml.dom.minidom.Document()
 		store = doc.createElement("store")
 		doc.appendChild(store)
-		for i in self.listing :
+		for i in self.listing[self.listing.get_path(self.root)].iterchildren() :
 			doc2 = xml.dom.minidom.parseString(i[1])
 			bmark = doc2.getElementsByTagName("bookmark")[0]
 			bmark.setAttribute("title",i[0].strip())
@@ -114,12 +120,11 @@
 		f = open(self.bmark_file, mode='w+')
 		f.write(doc.toprettyxml().encode("utf-8"))
 		f.close()
-		
 
 # this is a lonely bookmark in the store
 class bookmark : 
 	# constructor take the path to the bug in the store.
-	def __init__(self,path,descr) :
+	def __init__(self,path,descr,bts) :
 		zbug = 0
 		zsearch = ''
 		zproduct = ''
@@ -156,6 +161,7 @@
 		self.search = zsearch
 		self.product = zproduct
 		self.title = bmark.getAttribute("title")
+		self.bts = bts
 
 	def get_method(self) :
 		return self.method
Index: conseil.glade
===================================================================
--- conseil.glade	(révision 78)
+++ conseil.glade	(copie de travail)
@@ -427,6 +427,15 @@
                         <property name="position">1</property>
                       </packing>
                     </child>
+                    <child>
+                      <widget class="GtkComboBox" id="bts_list1">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                      </widget>
+                      <packing>
+                        <property name="position">2</property>
+                      </packing>
+                    </child>
                   </widget>
                   <packing>
                     <property name="expand">False</property>
@@ -1014,18 +1023,26 @@
                     <property name="column_spacing">4</property>
                     <property name="row_spacing">2</property>
                     <child>
-                      <widget class="GtkEntry" id="adv_search_entry">
+                      <widget class="GtkEntry" id="adv_search_package_entry">
                         <property name="visible">True</property>
                         <property name="can_focus">True</property>
                       </widget>
                       <packing>
                         <property name="left_attach">1</property>
                         <property name="right_attach">2</property>
-                        <property name="top_attach">1</property>
-                        <property name="bottom_attach">2</property>
                       </packing>
                     </child>
                     <child>
+                      <widget class="GtkLabel" id="adv_search_search_label">
+                        <property name="visible">True</property>
+                        <property name="xalign">1</property>
+                        <property name="xpad">2</property>
+                        <property name="ypad">2</property>
+                        <property name="label" translatable="yes">Search:</property>
+                        <property name="justify">GTK_JUSTIFY_RIGHT</property>
+                      </widget>
+                    </child>
+                    <child>
                       <widget class="GtkLabel" id="adv_search_package_label">
                         <property name="visible">True</property>
                         <property name="xalign">1</property>
@@ -1037,23 +1054,15 @@
                       </packing>
                     </child>
                     <child>
-                      <widget class="GtkLabel" id="adv_search_search_label">
+                      <widget class="GtkEntry" id="adv_search_entry">
                         <property name="visible">True</property>
-                        <property name="xalign">1</property>
-                        <property name="xpad">2</property>
-                        <property name="ypad">2</property>
-                        <property name="label" translatable="yes">Search:</property>
-                        <property name="justify">GTK_JUSTIFY_RIGHT</property>
-                      </widget>
-                    </child>
-                    <child>
-                      <widget class="GtkEntry" id="adv_search_package_entry">
-                        <property name="visible">True</property>
                         <property name="can_focus">True</property>
                       </widget>
                       <packing>
                         <property name="left_attach">1</property>
                         <property name="right_attach">2</property>
+                        <property name="top_attach">1</property>
+                        <property name="bottom_attach">2</property>
                       </packing>
                     </child>
                   </widget>
@@ -1237,7 +1246,7 @@
     <property name="authors">Lionel Dricot &lt;ploum@ubuntu.com&gt;
 Étienne Bersac &lt;bersace@gnome.org&gt;</property>
     <property name="artists">André Wyrwa</property>
-    <property name="logo">icons/72x72/conseil.png</property>
+    <property name="logo">conseil.png</property>
     <signal name="close" handler="on_aboutdialog_response"/>
     <signal name="delete_event" handler="on_aboutdialog_delete_event"/>
     <signal name="response" handler="on_aboutdialog_response"/>
@@ -1286,16 +1295,94 @@
             <property name="column_spacing">12</property>
             <property name="row_spacing">6</property>
             <child>
-              <widget class="GtkLabel" id="account_label">
+              <widget class="GtkAlignment" id="accounts_list_alignment">
                 <property name="visible">True</property>
                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                <property name="left_padding">12</property>
+                <child>
+                  <widget class="GtkVBox" id="accounts_list_vbox">
+                    <property name="visible">True</property>
+                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                    <property name="spacing">6</property>
+                    <child>
+                      <widget class="GtkScrolledWindow" id="scrolledwindow1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                        <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+                        <child>
+                          <widget class="GtkViewport" id="viewport3">
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="resize_mode">GTK_RESIZE_QUEUE</property>
+                            <child>
+                              <widget class="GtkTreeView" id="treeview1">
+                                <property name="visible">True</property>
+                                <property name="can_focus">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <property name="headers_clickable">True</property>
+                              </widget>
+                            </child>
+                          </widget>
+                        </child>
+                      </widget>
+                    </child>
+                    <child>
+                      <widget class="GtkHBox" id="bookmark_action_box1">
+                        <property name="visible">True</property>
+                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                        <property name="spacing">4</property>
+                        <property name="homogeneous">True</property>
+                        <child>
+                          <widget class="GtkButton" id="add_account_button">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="label" translatable="yes">gtk-add</property>
+                            <property name="use_stock">True</property>
+                            <signal name="clicked" handler="on_accounts_add"/>
+                          </widget>
+                        </child>
+                        <child>
+                          <widget class="GtkButton" id="remove_account_button">
+                            <property name="visible">True</property>
+                            <property name="can_focus">True</property>
+                            <property name="receives_default">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="label" translatable="yes">gtk-remove</property>
+                            <property name="use_stock">True</property>
+                            <signal name="clicked" handler="on_accounts_remove"/>
+                          </widget>
+                          <packing>
+                            <property name="position">1</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="position">1</property>
+                      </packing>
+                    </child>
+                  </widget>
+                </child>
+              </widget>
+              <packing>
+                <property name="top_attach">1</property>
+                <property name="bottom_attach">2</property>
+                <property name="x_options">GTK_FILL</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="GtkLabel" id="accounts_label">
+                <property name="visible">True</property>
+                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                 <property name="xalign">0</property>
-                <property name="label" translatable="yes">&lt;b&gt;Account&lt;/b&gt;</property>
+                <property name="label" translatable="yes">&lt;b&gt;Accounts&lt;/b&gt;</property>
                 <property name="use_markup">True</property>
               </widget>
               <packing>
-                <property name="left_attach">1</property>
-                <property name="right_attach">2</property>
                 <property name="x_options">GTK_FILL</property>
                 <property name="y_options"></property>
               </packing>
@@ -1319,27 +1406,27 @@
                         <property name="column_spacing">6</property>
                         <property name="row_spacing">6</property>
                         <child>
-                          <widget class="GtkLabel" id="accounts_friendlyname_label">
+                          <widget class="GtkEntry" id="accounts_friendlyname">
                             <property name="visible">True</property>
+                            <property name="can_focus">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <property name="xalign">0</property>
-                            <property name="label" translatable="yes">Name:</property>
-                            <property name="use_markup">True</property>
+                            <signal name="changed" handler="on_accounts_friendlyname_changed"/>
                           </widget>
                           <packing>
-                            <property name="x_options">GTK_FILL</property>
+                            <property name="left_attach">1</property>
+                            <property name="right_attach">2</property>
                           </packing>
                         </child>
                         <child>
-                          <widget class="GtkEntry" id="accounts_friendlyname">
+                          <widget class="GtkLabel" id="accounts_friendlyname_label">
                             <property name="visible">True</property>
-                            <property name="can_focus">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <signal name="changed" handler="on_accounts_friendlyname_changed"/>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">Name:</property>
+                            <property name="use_markup">True</property>
                           </widget>
                           <packing>
-                            <property name="left_attach">1</property>
-                            <property name="right_attach">2</property>
+                            <property name="x_options">GTK_FILL</property>
                           </packing>
                         </child>
                       </widget>
@@ -1376,53 +1463,57 @@
                         <property name="column_spacing">6</property>
                         <property name="row_spacing">6</property>
                         <child>
-                          <widget class="GtkAlignment" id="alignment1">
+                          <widget class="GtkLabel" id="accounts_protocol_label">
                             <property name="visible">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                             <property name="xalign">0</property>
-                            <property name="xscale">0</property>
-                            <child>
-                              <widget class="GtkComboBox" id="accounts_protocol">
-                                <property name="visible">True</property>
-                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                              </widget>
-                            </child>
+                            <property name="label" translatable="yes">Protocol:</property>
+                            <property name="use_markup">True</property>
                           </widget>
                           <packing>
-                            <property name="left_attach">1</property>
-                            <property name="right_attach">2</property>
+                            <property name="x_options">GTK_FILL</property>
                           </packing>
                         </child>
                         <child>
-                          <widget class="GtkEntry" id="accounts_password">
+                          <widget class="GtkLabel" id="accounts_url_label">
                             <property name="visible">True</property>
-                            <property name="can_focus">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <property name="visibility">False</property>
-                            <signal name="changed" handler="on_accounts_password_changed"/>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">URL:</property>
                           </widget>
                           <packing>
-                            <property name="left_attach">1</property>
-                            <property name="right_attach">2</property>
-                            <property name="top_attach">3</property>
-                            <property name="bottom_attach">4</property>
+                            <property name="top_attach">1</property>
+                            <property name="bottom_attach">2</property>
+                            <property name="x_options">GTK_FILL</property>
                           </packing>
                         </child>
                         <child>
-                          <widget class="GtkEntry" id="accounts_login">
+                          <widget class="GtkLabel" id="accounts_login_label">
                             <property name="visible">True</property>
-                            <property name="can_focus">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <signal name="changed" handler="on_accounts_login_changed"/>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">Login:</property>
                           </widget>
                           <packing>
-                            <property name="left_attach">1</property>
-                            <property name="right_attach">2</property>
                             <property name="top_attach">2</property>
                             <property name="bottom_attach">3</property>
+                            <property name="x_options">GTK_FILL</property>
                           </packing>
                         </child>
                         <child>
+                          <widget class="GtkLabel" id="accounts_password_label">
+                            <property name="visible">True</property>
+                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                            <property name="xalign">0</property>
+                            <property name="label" translatable="yes">Password:</property>
+                          </widget>
+                          <packing>
+                            <property name="top_attach">3</property>
+                            <property name="bottom_attach">4</property>
+                            <property name="x_options">GTK_FILL</property>
+                          </packing>
+                        </child>
+                        <child>
                           <widget class="GtkEntry" id="accounts_url">
                             <property name="visible">True</property>
                             <property name="can_focus">True</property>
@@ -1437,54 +1528,51 @@
                           </packing>
                         </child>
                         <child>
-                          <widget class="GtkLabel" id="accounts_password_label">
+                          <widget class="GtkEntry" id="accounts_login">
                             <property name="visible">True</property>
+                            <property name="can_focus">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <property name="xalign">0</property>
-                            <property name="label" translatable="yes">Password:</property>
+                            <signal name="changed" handler="on_accounts_login_changed"/>
                           </widget>
                           <packing>
-                            <property name="top_attach">3</property>
-                            <property name="bottom_attach">4</property>
-                            <property name="x_options">GTK_FILL</property>
-                          </packing>
-                        </child>
-                        <child>
-                          <widget class="GtkLabel" id="accounts_login_label">
-                            <property name="visible">True</property>
-                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <property name="xalign">0</property>
-                            <property name="label" translatable="yes">Login:</property>
-                          </widget>
-                          <packing>
+                            <property name="left_attach">1</property>
+                            <property name="right_attach">2</property>
                             <property name="top_attach">2</property>
                             <property name="bottom_attach">3</property>
-                            <property name="x_options">GTK_FILL</property>
                           </packing>
                         </child>
                         <child>
-                          <widget class="GtkLabel" id="accounts_url_label">
+                          <widget class="GtkEntry" id="accounts_password">
                             <property name="visible">True</property>
+                            <property name="can_focus">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <property name="xalign">0</property>
-                            <property name="label" translatable="yes">URL:</property>
+                            <property name="visibility">False</property>
+                            <signal name="changed" handler="on_accounts_password_changed"/>
                           </widget>
                           <packing>
-                            <property name="top_attach">1</property>
-                            <property name="bottom_attach">2</property>
-                            <property name="x_options">GTK_FILL</property>
+                            <property name="left_attach">1</property>
+                            <property name="right_attach">2</property>
+                            <property name="top_attach">3</property>
+                            <property name="bottom_attach">4</property>
                           </packing>
                         </child>
                         <child>
-                          <widget class="GtkLabel" id="accounts_protocol_label">
+                          <widget class="GtkAlignment" id="alignment1">
                             <property name="visible">True</property>
                             <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                             <property name="xalign">0</property>
-                            <property name="label" translatable="yes">Protocol:</property>
-                            <property name="use_markup">True</property>
+                            <property name="xscale">0</property>
+                            <child>
+                              <widget class="GtkComboBox" id="accounts_protocol">
+                                <property name="visible">True</property>
+                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+                                <signal name="changed" handler="on_accounts_protocol_changed"/>
+                              </widget>
+                            </child>
                           </widget>
                           <packing>
-                            <property name="x_options">GTK_FILL</property>
+                            <property name="left_attach">1</property>
+                            <property name="right_attach">2</property>
                           </packing>
                         </child>
                       </widget>
@@ -1517,96 +1605,20 @@
               </packing>
             </child>
             <child>
-              <widget class="GtkLabel" id="accounts_label">
+              <widget class="GtkLabel" id="account_label">
                 <property name="visible">True</property>
                 <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
                 <property name="xalign">0</property>
-                <property name="label" translatable="yes">&lt;b&gt;Accounts&lt;/b&gt;</property>
+                <property name="label" translatable="yes">&lt;b&gt;Account&lt;/b&gt;</property>
                 <property name="use_markup">True</property>
               </widget>
               <packing>
+                <property name="left_attach">1</property>
+                <property name="right_attach">2</property>
                 <property name="x_options">GTK_FILL</property>
                 <property name="y_options"></property>
               </packing>
             </child>
-            <child>
-              <widget class="GtkAlignment" id="accounts_list_alignment">
-                <property name="visible">True</property>
-                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                <property name="left_padding">12</property>
-                <child>
-                  <widget class="GtkVBox" id="accounts_list_vbox">
-                    <property name="visible">True</property>
-                    <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                    <property name="spacing">6</property>
-                    <child>
-                      <widget class="GtkScrolledWindow" id="scrolledwindow1">
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                        <property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                        <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
-                        <child>
-                          <widget class="GtkViewport" id="viewport3">
-                            <property name="visible">True</property>
-                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <property name="resize_mode">GTK_RESIZE_QUEUE</property>
-                            <child>
-                              <widget class="GtkTreeView" id="treeview1">
-                                <property name="visible">True</property>
-                                <property name="can_focus">True</property>
-                                <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                                <property name="headers_clickable">True</property>
-                              </widget>
-                            </child>
-                          </widget>
-                        </child>
-                      </widget>
-                    </child>
-                    <child>
-                      <widget class="GtkHBox" id="bookmark_action_box1">
-                        <property name="visible">True</property>
-                        <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                        <property name="spacing">4</property>
-                        <property name="homogeneous">True</property>
-                        <child>
-                          <widget class="GtkButton" id="add_bookmark_button2">
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">True</property>
-                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <property name="label" translatable="yes">gtk-add</property>
-                            <property name="use_stock">True</property>
-                          </widget>
-                        </child>
-                        <child>
-                          <widget class="GtkButton" id="remove_bookmark_button1">
-                            <property name="visible">True</property>
-                            <property name="can_focus">True</property>
-                            <property name="receives_default">True</property>
-                            <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
-                            <property name="label" translatable="yes">gtk-remove</property>
-                            <property name="use_stock">True</property>
-                          </widget>
-                          <packing>
-                            <property name="position">1</property>
-                          </packing>
-                        </child>
-                      </widget>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="position">1</property>
-                      </packing>
-                    </child>
-                  </widget>
-                </child>
-              </widget>
-              <packing>
-                <property name="top_attach">1</property>
-                <property name="bottom_attach">2</property>
-                <property name="x_options">GTK_FILL</property>
-              </packing>
-            </child>
           </widget>
           <packing>
             <property name="position">1</property>

Index: protocols/__init__.py
===================================================================
--- protocols/__init__.py	(révision 0)
+++ protocols/__init__.py	(révision 0)
@@ -0,0 +1,5 @@
+__all__ = ["protocol_bugzilla", "protocol_launchpadweb", "protocol_launchpadstaging_web"]
+
+import protocol_launchpadweb
+import protocol_launchpadstaging_web
+import protocol_bugzilla
