#!/usr/bin/env python

import pygtk
pygtk.require('2.0')
import gtk, gobject
import os

class Gontact:

	def recreate_socket (self):
		# Recreate socket
		if self.socket:
			self.socket.destroy ()
		self.socket = gtk.Socket ()
		self.main_hbox.pack_end (child=self.socket,
			expand=True, fill=True, padding=0)
		self.socket.show ()
		self.socket.connect ("destroy", self.socket_destroy)
		self.socket.connect ("plug-added", self.plug_added)
		self.socket.connect ("plug-removed", self.plug_removed)

	def load_app (self, app):
		# Load app
		self.recreate_socket ()
		socket_id = self.socket.get_id ()
		print 'Loading ' + app + ' into socket %d' % (socket_id)
		os.spawnlp (os.P_NOWAIT, app, app, '--plug', str(socket_id))

	def tinymail_toggled (self, widget, data=None):
		if widget.get_active ():
			# Load TinyMail
			self.load_app ('tinymail')

	def contacts_toggled (self, widget, data=None):
		if widget.get_active ():
			# Load Contacts
			self.load_app ('contacts')

	def dates_toggled (self, widget, data=None):
		if widget.get_active ():
			self.recreate_socket ()
			# Load Dates
			self.load_app ('dates')

	def plug_added (self, socket, data=None):
		print 'Plug added'
	
	def plug_removed (self, socket, data=None):
		print 'Plug removed'
	
	def socket_destroy (self, socket, data=None):
		print 'Socket destroyed'

	def delete_event (self, widget, event, data=None):
		return False
	
	def destroy (self, widget, data=None):
		gtk.main_quit ()
	
	def get_main_menu (self):
		# Create menu
		menu_items = (
			("/_File", None, None, 0, "<Branch>" ),
			("/File/_Quit", "<control>Q", gtk.main_quit, 0,
				"<StockItem>", "gtk-quit" ),
			("/_Edit", None, None, 0, "<Branch>" ),
			("/Edit/Cu_t", "<control>X", None, 0,
				"<StockItem>", "gtk-cut" ),
			("/Edit/_Copy", "<control>C", None, 0,
				"<StockItem>", "gtk-copy" ),
			("/Edit/_Paste", "<control>V", None, 0,
				"<StockItem>", "gtk-paste" ),
			("/_Help", None, None, 0, "<Branch>" ),
			("/Help/_About", None, None, 0, "<StockItem>",
				"gtk-about" ),
			)
		accel_group = gtk.AccelGroup ()
		self.item_factory = gtk.ItemFactory (gtk.MenuBar, "<main>",
			accel_group)
		self.item_factory.create_items (menu_items)
		self.window.add_accel_group (accel_group)
		
		return self.item_factory.get_widget ("<main>")

	def __init__ (self):
		self.window = gtk.Window (gtk.WINDOW_TOPLEVEL)
		
		self.main_hbox = gtk.HBox (homogeneous=False, spacing=12)
		self.main_vbox = gtk.VBox (homogeneous=False, spacing=0)
		self.button_vbox = gtk.VBox (homogeneous=True, spacing=12)
		self.socket = None
		self.main_hbox.pack_start (child=self.button_vbox, expand=False,
			fill=False, padding=0)
		self.main_vbox.pack_start (child=self.get_main_menu (),
			expand=False)
		self.main_vbox.pack_start (child=self.main_hbox, expand=True,
			fill=True, padding=0)
		self.main_vbox.pack_end (child=gtk.Statusbar (), expand=False)
		self.window.add (self.main_vbox)
		
		# Create component chooser buttons
		tinymail_button = gtk.RadioButton (group=None)
		tinymail_button.set_mode (draw_indicator=False)
		tinymail_vbox = gtk.VBox (homogeneous=False, spacing=6)
		tinymail_vbox.pack_start (child=gtk.image_new_from_icon_name (
			icon_name="stock_mail", size=gtk.ICON_SIZE_DIALOG))
		tinymail_vbox.pack_end (child=gtk.Label (str="Mail"),
			expand=False)
		tinymail_button.add (tinymail_vbox)
				
		contacts_button = gtk.RadioButton (group=tinymail_button)
		contacts_button.set_mode (draw_indicator=False)
		contacts_vbox = gtk.VBox (homogeneous=False, spacing=6)
		contacts_vbox.pack_start (child=gtk.image_new_from_icon_name (
			icon_name="stock_person", size=gtk.ICON_SIZE_DIALOG))
		contacts_vbox.pack_end (child=gtk.Label (str="Contacts"),
			expand=False)
		contacts_button.add (contacts_vbox)
				
		dates_button = gtk.RadioButton (group=tinymail_button)
		dates_button.set_mode (draw_indicator=False)
		dates_vbox = gtk.VBox (homogeneous=False, spacing=6)
		dates_vbox.pack_start (child=gtk.image_new_from_icon_name (
			icon_name="stock_calendar", size=gtk.ICON_SIZE_DIALOG))
		dates_vbox.pack_end (child=gtk.Label (str="Calendar"),
			expand=False)
		dates_button.add (dates_vbox)
		
		# Add buttons to button hbox
		self.button_vbox.pack_start (tinymail_button, expand=False,
			fill=True, padding=0)
		self.button_vbox.pack_start (contacts_button, expand=False,
			fill=True, padding=0)
		self.button_vbox.pack_start (dates_button, expand=False,
			fill=True, padding=0)
		
		# Connect signals
		self.window.connect ("delete_event", self.delete_event)
		self.window.connect ("destroy", self.destroy)
		tinymail_button.connect ("toggled", self.tinymail_toggled)
		contacts_button.connect ("toggled", self.contacts_toggled)
		dates_button.connect ("toggled", self.dates_toggled)
		
		# Select a component
		tinymail_button.set_active (is_active=True)
		self.tinymail_toggled (tinymail_button)
		
		self.window.show_all ()
	
	def main (self):
		gtk.main ()

if __name__ == "__main__":
	Gontact = Gontact ()
	Gontact.main ()

