#!/usr/bin/env python

""" This is the main src of SSC MSP platform framework """

import os, sys
import gobject
import gtk

import xml.dom.minidom
from xml.dom.minidom import Node

import string
import time
import thread

import locale
import gettext

APP_NAME = "ssc_ccm"

import plugin_mgr
import ssc_message_window
from ssc_widget import *

# sys.path.append('./scripts')
# import ssc_widget

class ccm(gtk.Window):
	window = None

	layout = None

	label_des = None
	label_alert = None

	label_halt = None
	label_reboot = None
	
	evtbox_halt = None
	evtbox_reboot = None

	button_halt = None
	button_reboot = None
	
	default_des = None
	cmd = None
	thread_ended = True

	btn_focus = None

	def destroy(*args):
		gtk.main_quit()

	def plugin_cmd(self):
		os.system(self.cmd)
		self.btn_focus.b_press = False
		self.btn_focus.leave_notify(None, None)
		self.thread_ended = True
		
	def btn_plugin_manager_press_event(self, widget, event, cmd):
		dlg = gtk.MessageDialog(None, 0, 0, gtk.BUTTONS_OK, _("Not implemented yet."))
		dlg.run()
		dlg.hide()
		return True
	
	def btn_exit_press_event(self, widget, event, cmd):
		# ssc_exit.ssc_exit()
		return True
	
	def btn_plugin_press_event(self, widget, event, plugin):
		self.cmd = plugin.command
		#if plugin.ID != "":
		if True:
			if self.thread_ended == True:
				self.btn_focus = widget
				self.thread_ended = False
				#thread.start_new(self.startup_splash, ())
				#win = ssc_message_window.splash_window(None, 0, None, _("%s Plugin is starting!!!") % plugin.name )
				#win.run()
				thread.start_new(self.plugin_cmd, ())
		else:
			self.btn_focus = widget
			self.thread_ended = False
			thread.start_new(self.plugin_cmd,())
		return True

	def btn_plugin_enter_notify(self, widget, event, comment):
		self.label_des.set_markup(comment)
		return False

	def btn_plugin_leave(self, widget, event, comment):
		self.label_des.set_markup(self.default_des)
		return False

	def evtbox_halt_press_event(self, widget, event, cmd):
		if self.thread_ended == False:
			return
		self.window.set_sensitive(False)
		win = ssc_message_window.ssc_message_window(None, 0, None, gtk.BUTTONS_YES_NO, _("Are you sure you want to halt the system?"))
		win.run()
		widget.b_press = False
		widget.leave_notify(None, None)
		if win.response_id == gtk.RESPONSE_YES:
			os.system("poweroff")
		else:
			self.window.set_sensitive(True)
		return
	
	def evtbox_reboot_press_event(self, widget, event, cmd):
		if self.thread_ended == False:
			return
		self.window.set_sensitive(False)
		win = ssc_message_window.ssc_message_window(None, 0, None, gtk.BUTTONS_YES_NO, _("Are you sure you want to reboot the system?"))
		win.run()
		widget.b_press = False
		widget.leave_notify(None, None)
		if win.response_id == gtk.RESPONSE_YES:
			os.system("reboot")
		else:
			self.window.set_sensitive(True)
		return

	def __init__(self):
		self.window = gtk.Window()
		self.window.set_position(gtk.WIN_POS_CENTER_ALWAYS)
		self.window.set_decorated(False)
		self.window.set_resizable(False)

		self.layout = gtk.Layout()
		self.layout_scr = gtk.Layout()

		bg = gtk.Image()
		alert = None
		doc = xml.dom.minidom.parse("res/ssc_plugin_mgr.xml")
		node = doc.getElementsByTagName("window_main")
		if node:
			bg.set_from_file(node[0].getAttribute("background"))
			self.window.set_size_request(string.atoi(node[0].getAttribute("width")), string.atoi(node[0].getAttribute("height")))
			self.layout.add(bg)

		# mask = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, True, 8, 800, 600)
		# drawable = gtk.GdkDrawable()
		# drawable = self.window
		# mask = gtk.gdk.Pixmap(self.window, 800, 600)
		# mask = gtk.gdk.Pixmap(None, 800, 600, 1) # !!!
		# mask = gtk.gdk.Pixmap(None, 800, 600)
		# self.window.shape_combine_mask(mask, 0, 0)

		scroll_win = gtk.ScrolledWindow()
		scroll_win.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)

		node = doc.getElementsByTagName("scrollwin_plugin")
		if node:
			scr_bg = gtk.Image()
			scr_bg.set_from_file(node[0].getAttribute("background"))
			self.layout.put(scroll_win,
							string.atoi(node[0].getAttribute("x-coordinate")),
							string.atoi(node[0].getAttribute("y-coordinate")))
			scroll_win.set_size_request(string.atoi(node[0].getAttribute("width")), string.atoi(node[0].getAttribute("height")))
			self.layout_scr.add(scr_bg)

		y = 10
		i = 0

		pm = plugin_mgr.ssc_plugin_mgr()
		for p in pm.plugin_list:
			icon = gtk.Image()
			icon.set_from_file(p.icon)

			button = None
			
			# btn = gtk.Button(p[1])
			# btn.set_alignment(0.0, 0.0)
			# btn.set_focus_on_click(True)
#			 btn.set_relief(gtk.RELIEF_NONE)
#			 btn.set_image(icon)
#			 btn.set_size_request(120, 40)
			if p.expired_comment == None:
				button = ssc_button("./res/ssc_msp_button_1.png","./res/ssc_msp_button_2.png","./res/ssc_msp_button_3.png",	p.icon,p.name)
				button.connect("button-press-event", self.btn_plugin_press_event, p)
				button.connect("enter-notify-event", self.btn_plugin_enter_notify, p.comment)
				button.connect("leave-notify-event", self.btn_plugin_leave, p.comment)
			else:
				if p.is_expired == True:
					button = ssc_button("./res/ssc_msp_button_1.png","./res/ssc_msp_button_1.png","./res/ssc_msp_button_1.png",	p.icon,p.name)
					button.connect("enter-notify-event", self.btn_plugin_enter_notify, p.expired_comment)
					pass
				else:
					button = ssc_button("./res/ssc_msp_button_1.png","./res/ssc_msp_button_2.png","./res/ssc_msp_button_3.png",	p.icon,p.name)
					button.connect("button-press-event", self.btn_plugin_press_event, p)
					button.connect("enter-notify-event", self.btn_plugin_enter_notify, p.comment)
					button.connect("leave-notify-event", self.btn_plugin_leave, p.comment)
					
			# self.layout_scr.put(btn, 15, y)
			self.layout_scr.put(button, 15, y)
#			 btn.set_property("can-focus", False)
			y += 75
			i += 1
			#if i == 3:
			#	break

		self.layout_scr.set_size(65, y)

		node = doc.getElementsByTagName("label_description")
		if node:
			self.default_des = node[0].getAttribute("label")
			self.label_des = gtk.Label("")
			self.label_des.set_size_request(string.atoi(node[0].getAttribute("width")),
											string.atoi(node[0].getAttribute("height")))
			self.label_des.set_markup(self.default_des)
			self.label_des.set_line_wrap(True)
			self.layout.put(self.label_des,
							string.atoi(node[0].getAttribute("x-coordinate")),
							string.atoi(node[0].getAttribute("y-coordinate")))
			
		node = doc.getElementsByTagName("label_alert")
		if node:
			alert = node[0].getAttribute("label")
			self.label_alert = gtk.Label("")
			self.label_alert.set_markup(alert)
			self.label_alert.set_line_wrap(True)
			self.label_alert.set_size_request(450, -1)
			self.layout.put(self.label_alert,
							string.atoi(node[0].getAttribute("x-coordinate")),
							string.atoi(node[0].getAttribute("y-coordinate")))

		btn_pm = gtk.Button(_("Plug-in manager"))
		btn_pm.set_alignment(0.0, 0.0)
		btn_pm.set_focus_on_click(False)
		btn_pm.set_relief(gtk.RELIEF_NONE)
		btn_pm.set_size_request(-1, -1)
		img_pm = gtk.Image()
		img_pm.set_from_file("./res/ssc_msp_icon_plugin_mgr.png")
		btn_pm.set_image(img_pm)
		btn_pm.connect("button-press-event", self.btn_plugin_manager_press_event, None)
		
		btn_exit = gtk.Button(_("Exit"))
		# btn_exit.set_border_width(0)
		# btn_exit.set_alignment(0.0, 0.0)
		btn_exit.set_focus_on_click(False)
		btn_exit.set_property("can-focus", False)
		btn_exit.set_relief(gtk.RELIEF_NONE)
		btn_exit.set_size_request(-1, -1)
		img_exit = gtk.Image()
		img_exit.set_from_file("./res/ssc_msp_icon_exit.png")
		btn_exit.set_image(img_exit)
		
		color = gtk.gdk.Color(128, -1, 128)
		# btn_exit.modify_bg(gtk.STATE_PRELIGHT, color)

		btn_exit.connect("button-press-event", self.btn_exit_press_event, None)

		self.button_halt = ssc_button("./res/ssc_msp_button_1.png",
									  "./res/ssc_msp_button_2.png",
									  "./res/ssc_msp_button_3.png",
									  "./res/ssc_msp_icon_halt.png",
									  "Halt")
		self.button_halt1 = ssc_button("./res/ssc_msp_icon_halt_1.png",
									  "./res/ssc_msp_icon_halt_2.png",
									  "./res/ssc_msp_icon_halt_3.png",
									  None,
									  None)
		self.button_reboot = ssc_button("./res/ssc_msp_button_1.png",
										"./res/ssc_msp_button_2.png",
										"./res/ssc_msp_button_3.png",
										"./res/ssc_msp_icon_reboot.png",
										"Reboot")

		# self.button_halt.set_size_request(80, -1)
		
		self.button_halt.connect("button-press-event", self.evtbox_halt_press_event, None)
		self.button_reboot.connect("button-press-event", self.evtbox_reboot_press_event, None)

		self.label_halt = gtk.Label("")
		self.label_halt.set_markup(_("Halt"))
		self.evtbox_halt = gtk.EventBox()
		self.evtbox_halt.add(self.label_halt)
		self.evtbox_halt.set_visible_window(False)
		self.evtbox_halt.connect("button-press-event", self.evtbox_halt_press_event, None)

		self.label_reboot = gtk.Label("")
		self.label_reboot.set_markup(_("Reboot"))
		self.evtbox_reboot = gtk.EventBox()
		self.evtbox_reboot.add(self.label_reboot)
		self.evtbox_reboot.set_visible_window(False)
		self.evtbox_reboot.connect("button-press-event", self.evtbox_reboot_press_event, None)

		scroll_win.add(self.layout_scr)
		scroll_win.set_shadow_type(gtk.SHADOW_ETCHED_OUT)
		# self.layout_scr.set_default(None)
		
		self.layout.put(btn_pm, 630, 500)
		# self.layout.put(btn_exit, 660, 40)
		# self.layout.put(self.evtbox_halt, 650, 480)
		# self.layout.put(self.evtbox_reboot, 715, 480)

		# self.layout.put(self.button_halt, 625, 462)
		# self.layout.put(self.button_reboot, 717, 462)
		self.layout.put(self.button_halt, 500, 462)
		self.layout.put(self.button_reboot, 650, 462)

		self.window.connect("destroy", self.destroy)
		
		self.window.add(self.layout)
		
		self.window.show_all()
		if(len(pm.plugin_list) == 0):
			scroll_win.hide()
			self.label_des.hide()
			# self.layout.move(self.label_des, 50, 120)
		else:
			self.label_alert.hide()
			
		btn_pm.hide()
		gtk.gdk.threads_init()

		gtk.main()

if __name__ == '__main__':
	# gettext.bindtextdomain(APP_NAME, "/usr/local/share/locale/")
	os.system("touch /tmp/startup_splash")
	os.system("/opt/plugin_mgr/decrypt_active.sh")
	os.system("mkdir -p /mnt/hidpart/Data/apps/wsysrt/opt/wsysrt/")
	os.system("[ ! -e /mnt/hidpart/Data/apps/wsysrt/opt/wsysrt/Password.ini ] && cp /opt/wsysrt/Password.ini /mnt/hidpart/Data/apps/wsysrt/opt/wsysrt/")
	gettext.bindtextdomain(APP_NAME, "./po")
	gettext.textdomain(APP_NAME)
	_ = gettext.gettext
	ccm()
