#!/usr/bin/env python

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

class Launchpad:

	def recreate_socket (self, app):
		# Recreate socket
		if self.socket:
			self.socket.destroy ()
		self.socket = gtk.Socket ()
		self.socket_frame.add (self.socket)
		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, widget, data):
		if widget.get_active () == False:
			return
		# Load app
		self.recreate_socket (data)
		socket_id = self.socket.get_id ()
		print 'Loading ' + data + ' into socket %d' % (socket_id)
		os.spawnlp (os.P_NOWAIT, data, data,
			'--plug', str(socket_id))

	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):
		self.socket.destroy ()
		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 create_app_button (self, group, app, name, icon):
		button = gtk.RadioButton (group=group)
		button.set_mode (draw_indicator=False)
		button.set_relief (gtk.RELIEF_NONE)
		vbox = gtk.VBox (homogeneous=False, spacing=6)
		vbox.pack_start (child=gtk.image_new_from_icon_name (
			icon_name=icon, size=gtk.ICON_SIZE_DIALOG))
		vbox.pack_end (child=gtk.Label (str=name),
			expand=False)
		button.add (vbox)
		button.connect ("toggled", self.load_app, app)
		return button

	def __init__ (self):
		self.window = gtk.Window (gtk.WINDOW_TOPLEVEL)
		
		main_hbox = gtk.HBox (homogeneous=False, spacing=12)
		main_vbox = gtk.VBox (homogeneous=False, spacing=0)
		button_vbox = gtk.VBox (homogeneous=False, spacing=12)
		self.socket_frame = gtk.Frame (label=None)
		self.socket_frame.set_shadow_type (gtk.SHADOW_IN)
		self.socket = None
		
		frame = gtk.Frame (label=None)
		frame.set_shadow_type (gtk.SHADOW_IN)
		event_box = gtk.EventBox ()
		event_box.add (button_vbox)
		event_box.modify_bg (gtk.STATE_NORMAL,
			event_box.get_style ().white)
		frame.add (event_box)
		
		main_hbox.pack_start (child=frame, expand=False,
			fill=False, padding=0)
		main_hbox.pack_end (child=self.socket_frame, expand=True,
			fill=True, padding=0)
		main_vbox.pack_start (child=self.get_main_menu (),
			expand=False)
		main_vbox.pack_start (child=main_hbox, expand=True,
			fill=True, padding=0)
		main_vbox.pack_end (child=gtk.Statusbar (), expand=False)
		self.window.add (main_vbox)
		
		# Create component chooser buttons
		tinymail_button = self.create_app_button (None,
			"tinymail", "Mail", "stock_mail")
		contacts_button = self.create_app_button (tinymail_button,
			"contacts", "Contacts", "stock_people")
		dates_button = self.create_app_button (tinymail_button,
			"dates", "Calendar", "stock_calendar")

		# Add buttons to button hbox
		button_vbox.pack_start (tinymail_button, expand=False,
			fill=True, padding=0)
		button_vbox.pack_start (contacts_button, expand=False,
			fill=True, padding=0)
		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)
		
		# Select a component
		tinymail_button.set_active (is_active=True)
		self.load_app (widget=tinymail_button, data="tinymail")
		
		self.window.set_icon_name ("stock_calendar-and-tasks")
		self.window.set_title ("Launchpad")
		self.window.show_all ()
	
	def main (self):
		gtk.main ()

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