#!/usr/bin/python
#
# Author : Ben Lau <benlau@visionware.com.hk>
# Version : 0.1
# License : New BSD License
#

import gtk
import vte
import gtkmozembed
import sys
import os
import re
import gobject
	
class Commander(gtk.Window):
	def __init__(self):
		self.issue_id = ""
		self.path =  os.getcwd()
		self._create_ui()
		# Signal binding
		self._signal_connect()

		self.vbox.show_all()
		return

	# Change path to the location of ditz repository
	def change_path(self,path):
		self.path = path
		self.index_page = path + "/html/index.html"
		
		self.html_created = os.path.exists(self.index_page)
		if self.html_created:
			self.browser.load_url("file://" + self.index_page)
		else:
			self.browser.load_url("file://" + self.path)
			self.EditButton.set_sensitive(False)
			self.CommentButton.set_sensitive(False)
		self.gohome()
		return
		
	# Open Folder Selection Dialog		
	def open_folder_selection(self,button):
		dialog = gtk.FileChooserDialog(title = "Open Folder" , 
			action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
			buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                              gtk.STOCK_OK, gtk.RESPONSE_OK))
		response = dialog.run()	
		
		if (response == gtk.RESPONSE_OK):
			self.change_path(dialog.get_filename())
		dialog.destroy()
			
		return

	def gohome(self):
		self.vte.feed_child("cd " + self.path + " \n")
	
	# Add an issue	
	def add_issue(self):
		self.gohome()
		self.vte.feed_child("ditz add\n")
		
	def edit_issue(self):
		if self.issue_id != "":
			self.gohome()
			self.vte.feed_child("ditz edit " + self.issue_id +" \n")

	def comment_issue(self):
		if self.issue_id != "":
			self.gohome()
			self.vte.feed_child("ditz comment " + self.issue_id +" \n")
	
	# Generate HTML and reload current path
	def refresh_html(self):
		self.gohome()
		self.vte.feed_child("ditz html\n")
		#self.browser.reload(gtk.GtkMozEmbedReloadFlags.GTK_MOZ_EMBED_FLAG_RELOADNORMAL)
		gobject.timeout_add(2000,self.browser_reload)
		
	def browser_reload(self):
		if self.html_created:
			self.browser.reload(0)
		else:
			self.html_created = os.path.exists(self.index_page)
			if self.html_created:
				self.browser.load_url("file://" + self.index_page)
		return False
		
	def _create_ui(self):
		#Create UI
		gtk.Window.__init__(self)
		
		width = 800
		height = 600
		
		self.set_title("Ditz Commander")
		self.vbox = gtk.VBox()
		self.add(self.vbox)
		
		self._create_toolbar()
		
		self.vpaned = gtk.VPaned()
		self.vpaned.show()
		self.vbox.add(self.vpaned)
		
		self.browser = gtkmozembed.MozEmbed()
		self.browser.show()
		self.browser.set_size_request(width,height * 2 / 3)
		self.vpaned.add1(self.browser)
		
		self.vte = vte.Terminal ()
		self.vte.set_size_request(width,height / 3)
		self.vte.set_scroll_on_output(True)
		self.vte.show()
		self.vte.fork_command()
		self.vpaned.add2(self.vte)
		
		self._create_button_group()
		return
		
	def _create_toolbar(self):
		self.toolbar = gtk.Toolbar()
		self.vbox.pack_start(self.toolbar,expand=False,fill=True)
		
		self.OpenButton = gtk.ToolButton(gtk.STOCK_OPEN)
		self.toolbar.add(self.OpenButton)
		
		separator = gtk.SeparatorToolItem()
		self.toolbar.add(separator)
		
		self.QuitButton = gtk.ToolButton(gtk.STOCK_QUIT)
		self.toolbar.add(self.QuitButton)
		return
	
	def _create_button_group(self):
		# HBox to hold ButtonBox1 and ButtonBox2
		hbox = gtk.HBox()
		self.vbox.pack_end(hbox,expand=False,fill=True)
		
		LeftButtonBox = gtk.HButtonBox()
		LeftButtonBox.set_layout(gtk.BUTTONBOX_START)
		hbox.add(LeftButtonBox)
		
		RightButtonBox = gtk.HButtonBox()
		RightButtonBox.set_layout(gtk.BUTTONBOX_END)
		hbox.add(RightButtonBox)

		self.AddButton = gtk.Button(label="Add")
		self.AddButton.set_relief(gtk.RELIEF_NONE)
		LeftButtonBox.add(self.AddButton)
		
		self.EditButton = gtk.Button(label="Edit")
		self.EditButton.set_relief(gtk.RELIEF_NONE)
		self.EditButton.set_sensitive(False)
		LeftButtonBox.add(self.EditButton)
		

		self.CommentButton = gtk.Button(label="Comment")
		self.CommentButton.set_relief(gtk.RELIEF_NONE)
		self.CommentButton.set_sensitive(False)
		LeftButtonBox.add(self.CommentButton)

		self.RefreshButton = gtk.Button(label="Refresh")
		self.RefreshButton.set_relief(gtk.RELIEF_NONE)
		RightButtonBox.add(self.RefreshButton)	
		
	def _signal_connect(self):
		self.connect('delete-event', lambda window, event: gtk.main_quit())
		self.QuitButton.connect('clicked', lambda button: gtk.main_quit() )
		self.vte.connect('child-exited',gtk.main_quit)
		self.browser.connect('open-uri',self._open_uri_callback)
		self.OpenButton.connect('clicked' , self.open_folder_selection)
	
		self.RefreshButton.connect('clicked' , lambda button : self.refresh_html() )
		self.AddButton.connect('clicked' , lambda button : self.add_issue() )
		self.EditButton.connect('clicked' , lambda button : self.edit_issue() )
		self.CommentButton.connect('clicked' , lambda button : self.comment_issue() )
	
	def _open_uri_callback(self,mozembed, uri):
		pattern = r'^.*issue-(?P<ID>[0-9a-zA-Z]{40}).html'
		m = re.search(pattern,uri)
		if m:
			self.issue_id = m.group('ID')
			self.EditButton.set_sensitive(True)
			self.CommentButton.set_sensitive(True)
		else:
			self.issue_id = ""
			self.EditButton.set_sensitive(False)
			self.CommentButton.set_sensitive(False)
		return
	
if __name__ == "__main__":
	commander = Commander()
	commander.show()
	if len(sys.argv) > 1:
		commander.change_path(sys.argv[1])
	else:
		commander.change_path(os.getcwd())
	gtk.main()

	