#!/usr/bin/env python
# -*- coding: utf-8 -*
 
import os
import multiprocessing
import time
import random
import xmlrpclib
import cairo
import grp
import sys
try:
	from gi.repository import Gtk, Gdk, GObject, GLib, PangoCairo, Pango
except:
	pass
	#zero-server-wizard initialization forces me to do this
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
import gettext
gettext.textdomain('zero-center')
_ = gettext.gettext
BAR_HEIGHT=90
CONF_X=5
if os.path.exists("/home/lliurex/banners/"):
	BANNER_PATH="/home/lliurex/banners/"
else:
	BANNER_PATH="/usr/share/banners/lliurex-neu/"
	
class CategoriesParser:
	
	CATEGORIES_PATH="/usr/share/zero-center/categories/"
	
	def __init__(self):
		
		self.parse_categories()
		
	#def init
	
	def parse_categories(self,path=None):
		
		self.categories=[]
		
		if path==None:
			path=self.CATEGORIES_PATH
			
		for item in os.listdir(path):
			file_path=path+item
			
			f=open(file_path)
			lines=f.readlines()
			f.close()
			
			cat={}
			
			for line in lines:
				key,value=line.split("=")
				cat[key]=value.strip("\n")
				if key=="level":
					cat[key]=int(cat[key])
			
			self.categories.append(cat)
			
		tmp=[]
		
		while len(self.categories)>0:
			selected_index=0
			index=0
			level=0
			for item in self.categories:
				if item["level"]>level:
					level=item["level"]
					selected_index=index
					
				
				index+=1
			
			tmp.append(self.categories[selected_index])
			self.categories.pop(selected_index)
			
		self.categories=tmp
		
	#def parse_categories
		
		
#class CategoriesParser
class AppParser:
	
	BASE_DIR="/usr/share/zero-center/"
	APP_PATH=BASE_DIR+"applications/"
	ZMD_PATH=BASE_DIR+"zmds/"
	
	
	def __init__(self):
		
		self.categories=["ID","Name","Comment","Icon","Category","Icon","ScriptPath","Groups","Service","Locks"]
		self.apps={}
		self.app_list=[]
		self.configured=[]
		#print("[ZeroCenter] Parsing apps...")
		self.parse_all()
		
		
	#def init
	
	def add_app(self,app):
		
		try:
			if app["Category"].lower() not in self.apps:
				self.apps[app["Category"].lower()]=[]
			
			self.apps[app["Category"].lower()].append(app)
			self.app_list.append(app["ID"])
		except:
			pass
			
	#def add_app
	
	def parse_all(self,dir=None):
		
		if dir==None:
			dir=self.APP_PATH
	
		for item in os.listdir(dir):
			file_path=self.APP_PATH+item
			app=self.parse_file(file_path)
			self.add_app(app)
			
	#def parse_all
	
	def parse_file(self,file_path):
		
		f=open(file_path)
		lines=f.readlines()
		f.close()
		id=file_path.split("/")[-1].split(".")[0]
		app={}
		for item in lines:
			try:
				key,value=item.split("=")
				app[key]=value.strip("\n")
			except:
				pass
		
		app["ID"]=id
		app["configured"]=-1
		app["custom_msg"]=""
		
		app["bar_height"]=BAR_HEIGHT
		app["conf_alpha"]=1.0
		
		app["expanding"]=False
		app["restoring"]=False
		return app
		
	#def parse_file
	
#class AppParser
class ZeroCenter:
	
	def __init__(self):
		
		self.client=xmlrpclib.ServerProxy("https://localhost:9779")
		self.create_user_env()
		self.categories_parser=CategoriesParser()
		self.app_parser=AppParser()
		self.configured_apps=[]
		self.get_states()
		
		self.mprocess=multiprocessing.Process()
		self.commands=["set-configured","set-non-configured","set-failed","set-custom-text","add-zero-center-notification","remove-zero-center-notification","help","add-pulsating-color","remove-pulsating-color","non-animated","animated"]
		self.drawing_mode=True
		self.msg_text=""
		self.msg_x=0
		self.scrolling=False
		
		try:
			self.msg_text=self.client.get_zc_messages("","ZCenterVariables",self.lang)
			if self.msg_text=="":
				txt=self.client.lliurex_version("","LliurexVersion")
				if type(txt)==type([]):
					self.msg_text=str(txt[1])
				else:
					self.msg_text=txt
		except:
			self.msg_text=""
		
		#self.msg_text="hi, i'm a long enough text so that it won't show in just one line. I wonder how many lines I can get inside the box. In my restless dreams I see that town, Silent Hill. I don't know what to type, but I have to keep typing"
		#57
		
	#def init
	
	def get_states(self):
		
		try:
			var=self.client.get_all_states("","ZCenterVariables")
			
			for cat in self.app_parser.apps:
			
				for app in self.app_parser.apps[cat]:
					app["configured"]=0
					
					if app["ID"] in var:
						for key in ["state","pulsating","time","custom_text"]:
							if key in var[app["ID"]]:
								app[key]=var[app["ID"]][key]
		
							
					if "state" in app:
						app["configured"]=app["state"]
				
					if app["configured"]==1:
						self.configured_apps.append(app["ID"])
				
				
		except Exception as e:
			print e
			pass
			
	#def get_states
	
	def get_translation(self,text):
		
		for category in self.categories_parser.categories:
			
			if text.lower()==category["name"].lower():
				for lang in self.language:
					try:
						return category["name["+lang+"]"]
					except Exception as e:
						pass
				return category["name"]
		
		return text
		
	#def get_translation
	
	def get_name(self,app):
		
		for lang in self.language:
			try:
				return app["Name["+lang+"]"]
			except:
				pass
				
		return app["Name"]
		
	#def get_name
	
	def get_comment(self,app):
		
		for lang in self.language:
			try:
				return app["Comment["+lang+"]"]
			except:
				pass
				
		return app["Comment"]
		
	#def get_name
	
	def create_user_env(self):
		
		try:
			self.lang=os.environ["LANGUAGE"].split(":")[0]
			self.language=os.environ["LANGUAGE"].split(":")
			if "es_ES" in self.language and "es" not in self.language:
				self.language.insert(self.language.index("es_ES")+1,"es")
			self.lang=self.lang.split("_")[0]
		except:
			try:
				self.lang=os.environ["LANG"].split(".")[0]
				self.language=[]
				self.language.append(self.lang)
				self.lang=self.lang.split("_")[0]
				
			except:
				self.lang="en"
				
			
		groups={}
		
		for item in grp.getgrall():
			if len(item.gr_mem)>0:
				if item.gr_name not in groups:
					groups[item.gr_name]=item.gr_mem
				else:
					groups[item.gr_name]=list(groups[item.gr_name]+item.gr_mem)
			
		
		self.user_groups=[]
		try:
			for item in groups:
				if os.environ["USER"] in groups[item]:
					self.user_groups.append(item)
					
			self.yser_groups.append("*")
		except:
			pass
		
	#def create_user_area
	
	def start_gui(self):
		
		
		self.icon_theme=Gtk.IconTheme()
		self.icon_theme.set_custom_theme("lliurex-neu")
		
		builder=Gtk.Builder()
		if os.path.exists("/srv/svn/pandora/zero-center2/install-files/usr/share/zero-center/rsrc/zero-center.glade"):
			builder.add_from_file("/srv/svn/pandora/zero-center2/install-files/usr/share/zero-center/rsrc/zero-center.glade")
		else:
			builder.add_from_file("/usr/share/zero-center/rsrc/zero-center.glade")
		self.window=builder.get_object("window1")
		self.window.connect("delete_event",self.close_window)
		self.window.set_name("BLACK")
		self.buttons_vbox=builder.get_object("buttons_vbox")
		self.content_hbox=builder.get_object("main_box")
		self.content_hbox.override_background_color(Gtk.StateType.NORMAL, Gdk.RGBA(1,0,0,1))
		self.window_box=builder.get_object("window_box")
		self.viewport=builder.get_object("viewport1")
		self.viewport.set_name("ORANGE")
		self.category_combobox=builder.get_object("category_combobox")
		self.msg_label=builder.get_object("llx_label")
		self.msg_label.connect("draw",self.drawing_label_event)
		self.msg_label.set_tooltip_text(self.msg_text)
		
		self.progress_bar=builder.get_object("progressbar")
		self.progress_label=builder.get_object("progress_label")
		self.progress_label.set_name("WHITE")
		
		self.add_categories_to_window("All")
		self.set_css_info()
		
		self.window.show()
		GObject.threads_init()
		Gtk.main()
		
	#def start_gui
	
	
	def scroll_me(self,img):
		
		if self.msg_x > (self.scroll_width)*-1:
			self.msg_x-=1
		else:
			self.msg_x=401
		img.queue_draw()
		return self.scrolling
		
	#def scroll_me
	def set_msg_label_text(self,txt):
	
		self.msg_text=txt
		self.msg_label.queue_draw()
		
	#def set_msg_label_text()
	
	def drawing_label_event(self,widget,ctx):
		
		lg1 = cairo.LinearGradient(0.0,18.0, 400.0, 18.0)
		lg1.add_color_stop_rgba(0, 0.38, 0.38, 0.38, 1)
		lg1.add_color_stop_rgba(0.1, 0.2, 0.2, 0.2, 1)
		lg1.add_color_stop_rgba(0.9, 0.2, 0.2, 0.2, 1)
		lg1.add_color_stop_rgba(1, 0.38, 0.38, 0.38, 1)
		ctx.rectangle(0, 0, 400, 18)
		ctx.set_source(lg1)
		ctx.fill()
		tmp_text=self.msg_text
		if len(tmp_text)>66:
			if self.drawing_mode:
				if not self.scrolling:
					self.scrolling=True
					self.msg_x=200
					GLib.timeout_add(12,self.scroll_me,widget)
			else:
				tmp_text=tmp_text[:63]
				tmp_text="      " + tmp_text+u" …"
		else:
			self.scrolling=False
			spaces=90-len(tmp_text)
			space="".join([" "]*(spaces/2))
			tmp_text=space+tmp_text+space
			
		
		
		tmp_text=tmp_text.replace("[","[")
		tmp_text=tmp_text.replace("]","] ")
		
		x=self.msg_x
		pctx = PangoCairo.create_layout(ctx)
		desc = Pango.font_description_from_string ("Ubuntu 9")
		pctx.set_font_description(desc)
		ctx.set_source_rgb(0.9,0.9,0.9)
		pctx.set_markup(tmp_text)
		self.scroll_width=pctx.get_pixel_size()[0]
		ctx.move_to(x,0)
		PangoCairo.show_layout(ctx, pctx)
		
	#def set_msg_label
	
	
	def set_css_info(self):
		
		css = """
		
		#BLACK {
			background-image: -gtk-gradient (linear,	left top, left bottom, from (#1a1a1a),  to (#616161));
			/*background-image: url("/home/lliurex/python/zero-center/wood.png");*/
		}
		#ORANGE {
			background-image: -gtk-gradient (linear,	left top, left bottom, from (#575757),  to (#373737));
			/*background-image: url("/home/lliurex/python/zero-center/wood.png");*/
		}
		
		#BLACKEXPANDER {
			background-image: -gtk-gradient (linear,	left top, left bottom, from (#1a1a1a),  to (#1a1a1a));
			color: white;
			box-shadow: 50 50 red;
			
		}
		
		#WHITE {
			color: white;
			text-shadow: 0 1 black;
		}		
		
		#WHITE-15 {
			color: white;
			font-size: 15;
			text-shadow: 1 2 black;
		}
		
		#BLACKBUTTON{
			background-image: -gtk-gradient (linear,	left top, left bottom, from (#2a2a2a),  to (#616161));
			color: #e0e0e0;
			border-color: #000;
			border-style: none;
			border-radius: 10px;
			
		}
		
		
		
		#APPBUTTON:hover{
			border-color: red;
			color: red;
			background-image: -gtk-gradient (linear,	left top, left bottom, from (#ffffff),  to (#ffff00));
		}
		
		"""
		
		self.style_provider=Gtk.CssProvider()
		self.style_provider.load_from_data(css)
		
		Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
		
	#def set_css_info	
	
	
	def get_banner_image(self,app):
		package_rsrc_path=BANNER_PATH
		img_path=package_rsrc_path+"package.png"
		
		for item in os.listdir(package_rsrc_path):
			f,ext=item.split(".")
			if app["Icon"] == f:
				img_path=package_rsrc_path+item
		
		
		img=cairo.ImageSurface.create_from_png(img_path)
		ctx=cairo.Context(img)
		if not self.check_app_dependences(app):
			ctx.set_source_rgba(0.5,0.5,0.5,0.7)
			ctx.rectangle(0,0,235,110)
			ctx.fill()
		
		ctx.set_source_rgba(0,0,0,0.8)
		ctx.rectangle(0,90,235,110)
		ctx.fill()
		show_status=True
		if "Depends" in app:
			if not self.check_app_dependences(app):
				
				lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
				lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
				lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
				ctx.rectangle(0, 0, 200, 20)
				ctx.set_source(lg1)
				ctx.fill()
											
				ctx.select_font_face("Ubuntu")
				ctx.set_font_size(15)
				ctx.move_to(5,15)
				ctx.set_source_rgba(1,1,1,app["conf_alpha"])
											
				ctx.show_text(_("Unmet dependences"))
				ctx.stroke()
				
				show_status=False
		if "Service" in app and show_status:
			if app["Service"].lower()=="true":
				if app["configured"]==1:
					lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
							       
					lg1.add_color_stop_rgba(0, 0, 0.2, 0, 1)
					lg1.add_color_stop_rgba(1, 0, 1, 0, 0)
					ctx.rectangle(0, 0, 200, 20)
					ctx.set_source(lg1)
					ctx.fill()
							
					ctx.select_font_face("Ubuntu")
					ctx.set_font_size(15)
					ctx.move_to(5,15)
					ctx.set_source_rgb(1,1,1)
							
					ctx.show_text(_("Configured"))
					ctx.stroke()
				elif app["configured"]==0:
					lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
							       
					lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
					lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
					ctx.rectangle(0, 0, 200, 20)
					ctx.set_source(lg1)
					ctx.fill()
							
					ctx.select_font_face("Ubuntu")
					ctx.set_font_size(15)
					ctx.move_to(5,15)
					ctx.set_source_rgb(1,1,1)
							
					ctx.show_text(_("Not configured"))
					ctx.stroke()
					
				else:
					lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
					lg1.add_color_stop_rgba(0, 1, 0, 0, 1)
					lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
					ctx.rectangle(0, 0, 200, 20)
					ctx.set_source(lg1)
					ctx.fill()
								
					ctx.select_font_face("Ubuntu")
					ctx.set_font_size(15)
					ctx.move_to(5,15)
					ctx.set_source_rgba(1,1,1,app["conf_alpha"])
								
					ctx.show_text(_("Failed"))
					ctx.stroke()
		ctx.select_font_face("Ubuntu")
		ctx.set_font_size(15)
		ctx.move_to(5,105)
		ctx.set_source_rgb(1,1,1)
		txt=""
		fix=True
		
		text=self.get_name(app)
		
		
		for char in range(30):
			try:
				txt+=text[char]
			except:
				fix=False
				break
							
		if fix:
			txt+="…"
		
		ctx.show_text(txt)
		ctx.stroke()
		#img.write_to_png(self.user_rsrc_path+item)
		image=Gtk.Image()
		#image.set_from_file(self.user_rsrc_path+item)
		image.set_from_pixbuf(Gdk.pixbuf_get_from_surface(img,0,0,235,110))
		image.set_name("BIMAGE")
		return image
		
	#def get_image
	
	def drawing_banner_event(self,widget,ctx,app):
		
		package_rsrc_path=BANNER_PATH
		img_path=package_rsrc_path+"package.png"
		for item in os.listdir(package_rsrc_path):
			f,ext=item.split(".")
			if app["Icon"] == f:
				img_path=package_rsrc_path+item
		
	
		img=cairo.ImageSurface.create_from_png(img_path)
		ctx.set_source_surface(img,0,0)
		
		if not self.check_app_dependences(app):
			ctx.paint_with_alpha(0.2)
			ctx.set_source_rgba(0.5,0.5,0.5,0.7)
			ctx.rectangle(0,0,235,110)
			ctx.fill()
		else:
			ctx.paint()
		if "pulsating" in app and app["pulsating"]:
			
			'''
			if app["pulsating"]:
				ctx.set_source_rgba(1,1,1,app["pulsating_alpha"])
				ctx.rectangle(0,0,235,110)
				ctx.fill()		
			'''
	
			lg1 = cairo.LinearGradient(0.0,10.0, 235.0, 10.0)
			lg1.add_color_stop_rgba(0, 0, 0.0, 0.8, 0.7)
			lg1.add_color_stop_rgba(app["pulsating_alpha"], 0.1, 0.7, 0.9, 1)
			lg1.add_color_stop_rgba(1, 0, 0, 0.8, 0.5)
			ctx.rectangle(0,app["bar_height"],235,20)
			ctx.set_source(lg1)
			ctx.fill()
			ctx.set_source_rgba(0,0,0,0.8)
			ctx.rectangle(0,app["bar_height"]+20,235,110)
			ctx.fill()			
			
		else:
			
			ctx.set_source_rgba(0,0,0,0.7)
			ctx.rectangle(0,app["bar_height"],235,110)
			ctx.fill()
		
		show_status=True
		if "Depends" in app:
			if not self.check_app_dependences(app):
				
				lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
				lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
				lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
				ctx.rectangle(0, 0, 200, 20)
				ctx.set_source(lg1)
				ctx.fill()
											
				ctx.select_font_face("Ubuntu")
				ctx.set_font_size(15)
				ctx.move_to(5,15)
				ctx.set_source_rgba(1,1,1,app["conf_alpha"])
											
				ctx.show_text(_("Unmet dependences"))
				ctx.stroke()
				
				show_status=False
		if "Service" in app and show_status:
			
			if app["Service"].lower()=="true":
				if app["configured"]==1:
					lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
					lg1.add_color_stop_rgba(0, 0, 0.2, 0, 1)
					lg1.add_color_stop_rgba(1, 0, 1, 0, 0)
					ctx.rectangle(0, 0, 200, 20)
					ctx.set_source(lg1)
					ctx.fill()
							
					ctx.select_font_face("Ubuntu")
					ctx.set_font_size(15)
					ctx.move_to(5,15)
					ctx.set_source_rgba(1,1,1,app["conf_alpha"])
							
					ctx.show_text(_("Configured"))
					ctx.stroke()
							
				elif app["configured"]==-1:
					lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
					lg1.add_color_stop_rgba(0, 0.7, 0, 0, 1)
					lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
					ctx.rectangle(0, 0, 200, 20)
					ctx.set_source(lg1)
					ctx.fill()
							
					ctx.select_font_face("Ubuntu")
					ctx.set_font_size(15)
					ctx.move_to(5,15)
					ctx.set_source_rgba(1,1,1,app["conf_alpha"])
							
					ctx.show_text(_("Failed"))
					ctx.stroke()
					
				else:
					
					lg1 = cairo.LinearGradient(0.0,110.0, 200.0, 110.0)
					lg1.add_color_stop_rgba(0, 0.8, 0, 0, 1)
					lg1.add_color_stop_rgba(1, 1, 0.2, 0.2, 0)
					ctx.rectangle(0, 0, 200, 20)
					ctx.set_source(lg1)
					ctx.fill()
					ctx.select_font_face("Ubuntu")
					ctx.set_font_size(15)
					ctx.move_to(5,15)
					ctx.set_source_rgba(1,1,1,app["conf_alpha"])
					ctx.show_text(_("Not configured"))
					ctx.stroke()					
		ctx.select_font_face("Ubuntu")
		ctx.set_font_size(15)
		ctx.move_to(5,app["bar_height"]+15)
		ctx.set_source_rgb(1,1,1)
		txt=""
		fix=True
		for char in range(30):
			try:
				txt+=self.get_name(app)[char]
			except:
				fix=False
				break
							
		if fix:
			txt+="…"
				
		ctx.show_text(txt)
		ctx.stroke()		
		
		
		
		y=app["bar_height"]+30
		pctx = PangoCairo.create_layout(ctx)
		desc = Pango.font_description_from_string ("Ubuntu 8")
		pctx.set_font_description(desc)
		pctx.set_alignment(Pango.Alignment.LEFT)
		pctx.set_justify(True)
		pctx.set_width(225000)
		pctx.set_height(10)
		ctx.set_source_rgb(1,1,0.8)
		pctx.set_text(self.get_comment(app),-1)
		
		ctx.move_to(6,y)
		PangoCairo.show_layout (ctx, pctx)
		
		if "custom_text" in app:
			
			ctx.set_source_rgb(0.5,0.5,1)
			pctx.set_text(app["custom_text"],-1)
			ctx.move_to(6,y+60)
			PangoCairo.show_layout (ctx, pctx)
			
		
	#def drawing_event
	
	def mouse_over(self,widget,event,app,img):
		
		if not app["expanding"]:
			app["restoring"]=False
			app["expanding"]=True
			GLib.timeout_add(10,self.expand_black_area,app,img)
		
	#def mouse_over
	
	def mouse_left(self,widget,event,app,img):
		
		if not app["restoring"]:
			app["expanding"]=False
			app["restoring"]=True
			GLib.timeout_add(10,self.restore_black_area,app,img)
		
	#def mouse_left
	
	def expand_black_area(self,app,img):
		
		while app["bar_height"]>0 and app["expanding"]:
			app["bar_height"]-=2
			if app["conf_alpha"]>0.0:
				app["conf_alpha"]-=0.025
			img.queue_draw()
			return True
			
		if not app["expanding"]:
			return False
			
		app["expanding"]=False
		app["conf_alpha"]=0.0
		img.queue_draw()
		return False
		
	#def expand_black_area
	
	
	def restore_black_area(self,app,img):
		
		while app["bar_height"]= 1.0 :
			
			app["pulsating_increment"]=-0.02
			
		if app["pulsating_alpha"] <= 0.0 :
			
			app["pulsating_increment"]=0.02
			
		image.queue_draw()
		return app["pulsating"]
		
	#def pulsate_color
		
		
	def check_app_dependences(self,app):
		
		if "Depends" in app:
			depends=app["Depends"].split(";")
			for dep in depends:
				
				if dep not in self.configured_apps:
					return False
				
		return True
		
	#def check_app_dependences
	
	def add_categories_to_window(self,category):
		for category in self.categories_parser.categories:
			
			category=category["name"].lower()
			once=True
			hbox=Gtk.HBox()
			count=0
			if category in self.app_parser.apps:
				for app in self.app_parser.apps[category]:
					
					if self.check_app_groups(app):
						button=Gtk.Button()
						button.set_name("APPBUTTON")
						button.set_size_request(235,110)
						
						if not self.drawing_mode:
							image=self.get_banner_image(app)
						else:
							image=Gtk.DrawingArea()
							image.show()
							image.connect("draw",self.drawing_banner_event,app)
							
							if "pulsating" in app:
								if app["pulsating"]:
									app["pulsating_alpha"]=0.0
									app["pulsating_increment"]=0.02
									self.add_pulsating(app,image)
							
							
							button.add_events(Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.LEAVE_NOTIFY_MASK)
							button.connect("motion-notify-event",self.mouse_over,app,image)
							button.connect("leave_notify_event",self.mouse_left,app,image)
							button.set_size_request(245,120)
						
						button.add(image)
						if "Name["+self.lang+"]" in app:
							button.set_tooltip_text(app["Name["+self.lang+"]"])
						else:
							button.set_tooltip_text(app["Name"])
						button.connect("clicked",self.app_clicked,app)
						app["gtk_button"]=button
						hbox.pack_start(button,False,False,5)
						count+=1
						if count==3:
							hbox.show_all()
							if once:
								self.add_label(self.get_translation(category))
								once=False
							self.content_hbox.pack_start(hbox,False,False,5)
							count=0
							hbox=Gtk.HBox()
						
			if count!=0:
				hbox.show_all()
				if once:
					self.add_label(self.get_translation(category))
					once=False
				self.content_hbox.pack_start(hbox,False,False,5)
		
	#def add_categories_to_window
	
		
	def add_label(self,label_name,icon_name=None):
		
		if icon_name==None:
			icon_name="applications-internet"
			
		tmpbox=Gtk.HBox()
		img=Gtk.Image()
		img.set_from_icon_name(icon_name,Gtk.IconSize.MENU)
		label=Gtk.Label(label_name)
		label.set_name("WHITE-15")
		expander=Gtk.HSeparator()
		tmpbox.pack_start(img,False,False,5)
		tmpbox.pack_start(label,False,False,0)
		tmpbox.pack_start(expander,True,True,14)
		tmpbox.show_all()
		self.content_hbox.pack_start(tmpbox,False,False,5)		
		
	#def add_label
	
	
	def app_clicked(self,widget,app):
		
		if app["ID"] in self.configured_apps:
			ret=self.open_dialog("Warning",_("%s is already configured. Do you want to execute it again?")%self.get_name(app),True)
			if ret==Gtk.ResponseType.CANCEL:
				return -1
		
		if self.check_app_dependences(app):
		
			cmd=""
				
			if "Using" in app:
				cmd+=app["Using"].strip(" ").strip("\n") +" "
					
			cmd+=self.app_parser.ZMD_PATH + app["ScriptPath"]
			
			gt=False
			if "Gnome-terminal" in app:
				if app["Gnome-terminal"].lower()=="true":
					cmd='gnome-terminal --command="'+cmd+'"'
					gt=True
					
			if not gt:
				if "gnome-terminal" in app:
					if app["gnome-terminal"].lower()=="true":
						cmd='gnome-terminal --command="'+cmd+'"'
				
				
			
			blocked=False
			print(' * Executing "' + cmd + '" ...')
			if "Modal" in app:
				if app["Modal"].lower()=="true" and not self.mprocess.is_alive():
					GLib.timeout_add(250,self.pulse_progress)
					self.progress_bar.show()
					self.progress_bar.set_text("asd")
					try:
						txt="Executing %s"%app["Name["+self.lang+"]"]
					except:
						txt="Executing %s"%app["Name"]
					self.progress_label.set_text(txt)
					self.progress_label.show()
					self.mprocess_app_name=app["Name"]
					blocked=True
				else:
					self.open_dialog("Warning","%s is being executed. Please wait until it finishes."%self.mprocess_app_name )
					return -1
		
			self.execute(cmd,blocked,app,widget)
			
		else:
			
			self.open_dialog("Warning","%s dependences have not been configured."%self.get_name(app) +"\n[ %s ]"%app["Depends"])
		
	#def app_clicked
	
	
	def check_output(self,process,app,button):
		
		if not process.is_alive():
			
			print "[ZeroCenter] %s has ended"%app["ID"]
			
			if "Service" in app:
				if app["Service"].lower()=="true":
					
					try:
						var=self.client.get_state("","ZCenterVariables",app["Name"],True)
						app["configured"]=var["state"]
						app["time"]=var["time"]
						
						for key in ["pulsating","custom_text"]:
							if key in var:
								app[key]=var[key]
						
						#print var["state"]
						if app["configured"]==1:
							if app["ID"] not in self.configured_apps:
								self.configured_apps.append(app["ID"])
								for cat in self.app_parser.apps:
									for item in self.app_parser.apps[cat]:
										if "Depends" in item:
											if app["ID"] in item["Depends"]:
												#print "Refreshing " + item["ID"]
												item["gtk_button"].get_child().queue_draw()
						
						darea=button.get_child()
						darea.queue_draw()
					except Exception as e:
						#print e
						pass
					
		return process.is_alive()
		
	#def check_output
	
	
	def pulse_progress(self):
		
		self.progress_bar.pulse()
		if not self.mprocess.is_alive():
			self.progress_bar.hide()
			self.progress_label.hide()
		return self.mprocess.is_alive()
	#def pulse_progress
	
	def execute(self,cmd,blocked=False,app=None,widget=None):
		
		if not blocked:
			p=multiprocessing.Process(target=self._execute,args=(cmd,))
			#p.daemon=True
			GLib.timeout_add(1000,self.check_output,p,app,widget)
			p.start()
			
		if blocked:
			
			if not self.mprocess.is_alive():
				self.mprocess=multiprocessing.Process(target=self._execute,args=(cmd,))
				#self.mprocess.daemon=True
				self.mprocess.start()
				GLib.timeout_add(1000,self.check_output,self.mprocess,app,widget)
			else:
				self.open_dialog("Warning",_("%s is being executed. Please wait until it finishes.")%self.mprocess_app_name )
		
	#def execute
	def _execute(self,cmd):
		
		os.system(cmd)
		
	#def _execute
	
	def close_window(self,widget,data):
		
		if self.mprocess.is_alive():
			ret=self.open_dialog("Warning",_("%s is being executed. Are you sure you want to exit?")%self.mprocess_app_name ,True)
		
			if ret==Gtk.ResponseType.CANCEL:
				return -1
				
			self.mprocess.terminate()
			self.mprocess=multiprocessing.Process()
		
		Gtk.main_quit()
		print("")
		
	#def close_window
		
	def open_dialog(self,title,text,show_cancel=False):
		label = Gtk.Label()
		label.set_markup(text)
		if show_cancel:
			dialog = Gtk.Dialog(title, None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT,Gtk.STOCK_CANCEL,Gtk.ResponseType.CANCEL))
		else:
			dialog = Gtk.Dialog(title, None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT))
		hbox = Gtk.HBox()
		img=Gtk.Image.new_from_icon_name("emblem-important",Gtk.IconSize.DIALOG)
		hbox.pack_start(img,True,True,5)
		hbox.pack_start(label,True,True,10)
		hbox.show_all()
		dialog.vbox.pack_start(hbox,True,True,10)
		dialog.set_border_width(6)
		response = dialog.run()
		dialog.destroy()
		return response
		
	#def open_dialog
	
	def get_state(self,app):
		try:
			configured=self.client.get_state("","ZCenterVariables",app["ID"])
			return configured
		except:
			return 0
		
	#def get_state
	
	def set_configured(self,app,key):
		
		if app in self.app_parser.app_list:
			
			try:
				self.client.set_configured(key,"ZCenterVariables",app)
			except Exception as e:
				print e
				
		else:
			print("[!] %s is not installed"%app)
		
		sys.exit(0)
				
	#def set_configured
	
	def set_non_configured(self,app,key):
		
		if app in self.app_parser.app_list:
			
			try:
				self.client.set_non_configured(key,"ZCenterVariables",app)
			except:
				pass
				
		else:
			print("\t[!] %s is not installed"%app)
		
		sys.exit(0)
		
	#def set_non_configured
	
	def set_failed(self,app,key):
		
		if app in self.app_parser.app_list:
			
			try:
				self.client.set_failed(key,"ZCenterVariables",app)
			except:
				pass
				
		else:
			print("\t[!] %s is not installed"%app)
		
		sys.exit(0)
		
	#def set_non_configured
	
	def set_custom_text(self,app,text,key):
		
		if app in self.app_parser.app_list:
			
			try:
				self.client.set_custom_text(key,"ZCenterVariables",app,text)
			except:
				pass
				
		else:
			print("\t[!] %s is not installed"%app)
		
		sys.exit(0)
		
	#def set_custom_text
	
	def add_pulsating_color(self,key,app):
		
		try:
			self.client.add_pulsating_color(key,"ZCenterVariables",app)
		except:
			pass
			
		sys.exit(0)
		
	#def add_pulsating_color
	
	def remove_pulsating_color(self,key,app):
		
		try:
			self.client.remove_pulsating_color(key,"ZCenterVariables",app)
		except:
			pass
		
		sys.exit(0)
		
	#def add_pulsating_color
	
	def add_zc_notification(self,key,app,text,text_es="",text_qcv=""):
		
		try:
			self.client.set_zc_message(key,"ZCenterVariables",app,text,text_es,text_qcv)
		except Exception as e:
			print e
			
		sys.exit(0)
		
	#def add_zc_notification
	
	def remove_zc_notification(self,key,app):
		
		try:
			self.client.remove_zc_message(key,"ZCenterVariables",app)
		except Exception as e:
			print e
			
		sys.exit(0)
		
	#def remove_zc_notification
	def usage(self):
		
		print("USAGE:")
		print("\tzero-center [ OPTION [ APP ] ]")
		print("Options:")
		print("\tset-configured APP") 
		print("\tset-non-configured APP") 
		print("\tset-custom-text APP TEXT") 
		print("\tadd-zero-center-notification APP TEXT_EN [TEXT_ES TEXT_QCV]") 
		print("\tremove-zero-center-notification APP") 
		print("\tadd-pulsating-color APP") 
		print("\tremove-pulsating-color APP") 
		print("\tnon-animated")
		print("\tanimated")
		print("\thelp")
		print("")
		sys.exit(0)
		
	#def usage
	
def check_root():
	try:
		f=open("/etc/n4d/key","r")
		key=f.readline().strip("\n")
		f.close()
		return key
	except:
		print("[!] You need root privileges to execute this option [!]")
		sys.exit(1)
if __name__=="__main__":
	
	zc=ZeroCenter()
	zc.drawing_mode=True
	if len(sys.argv)>=2:
		
		if sys.argv[1] not in zc.commands:
			zc.usage()
			sys.exit(1)
			
		if sys.argv[1] == "help":
			zc.usage()
			
		if sys.argv[1] == "set-configured":
			key=check_root()
			zc.set_configured(sys.argv[2],key)
			
		if sys.argv[1] == "set-non-configured":
			key=check_root()
			zc.set_non_configured(sys.argv[2],key)
			
		if sys.argv[1] == "set-failed":
			key=check_root()
			zc.set_failed(sys.argv[2],key)
			
		if sys.argv[1] == "set-custom-text":
			key=check_root()
			zc.set_custom_text(sys.argv[2],sys.argv[3],key)
			
		if sys.argv[1] == "add-zero-center-notification":
			key=check_root()
			
			try:
				app=sys.argv[2]
			except:
				zc.usage()
			try:
				text=sys.argv[3]
			except:
				zc.usage()
			try:
				text_es=sys.argv[4]
			except Exception as e:
				print e
				text_es=""
			try:
				text_qcv=sys.argv[5]
			except Exception as e:
				print e
				text_qcv=""
			
			zc.add_zc_notification(key,app,text,text_es,text_qcv)
			
		if sys.argv[1] == "remove-zero-center-notification":
			
			key=check_root()
			
			try:
				app=sys.argv[2]
			except:
				zc.usage()
				
			zc.remove_zc_notification(key,app)
			
		if sys.argv[1] == "add-pulsating-color":
			key=check_root()
			try:
				app=sys.argv[2]
			except:
				zc.usage()
				
			zc.add_pulsating_color(key,app)
				
		if sys.argv[1] == "remove-pulsating-color":
			key=check_root()
			
			try:
				app=sys.argv[2]
			except:
				zc.usage()
				
			zc.remove_pulsating_color(key,app)
			
		if sys.argv[1]=="animated":
			zc.drawing_mode=True
			
		if sys.argv[1]=="non-animated":
			zc.drawing_mode=False
		
	
	
	zc.start_gui()