#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import pygtk
if not sys.platform == 'win32':
	pygtk.require('2.0')
import gtk
import gobject
import os.path
import string
import urllib
import xml.etree.ElementTree

class ListStoreApps(gtk.ListStore):
	def __init__(self, config):
		self.config = config
		gtk.ListStore.__init__(self, gobject.TYPE_BOOLEAN, gtk.gdk.Pixbuf, str, gobject.TYPE_PYOBJECT)
		gtk.ListStore.set_sort_column_id(self, 2, gtk.SORT_ASCENDING)
	
	def ajouter(self, app, desc, version, element, size = "0", icone = None, installed = False):
		image = None
		if icone != None:
			if os.path.isfile(icone):
				try:
					image = gtk.gdk.pixbuf_new_from_file(icone).scale_simple(32,32,gtk.gdk.INTERP_BILINEAR)
				except gobject.GError:
					image = gtk.gdk.pixbuf_new_from_file('img/Applications.png')
				
		if image == None: 
			if os.path.isfile('img/' + app + '.png'):
				image = gtk.gdk.pixbuf_new_from_file('img/' + app + '.png').scale_simple(32,32,gtk.gdk.INTERP_BILINEAR)
			else:
				image = gtk.gdk.pixbuf_new_from_file('img/Applications.png')
		
		return self.append([installed, image, "<big>" + app + "</big> <small>" + version + "\n" + desc + " (" + size + ")</small>", element])
	
	def display_cat(self, cat, filtre = ""):
		for app in cat.get("apps"):
			pos = string.find(string.lower(app.get("name")), string.lower(filtre))
			if pos == -1:
				pos = string.find(string.lower(app.get("desc")), string.lower(filtre))
				if pos == -1:
					pos = string.find(string.lower(app.get("longdesc")), string.lower(filtre))
			
			if pos != -1 and ((self.config.get("Display", "DisplayInstalled") == True and app.get("installed") == True) or (self.config.get("Display", "DisplayUninstalled") == True and app.get("installed") == False)):
				self.ajouter(app.get("parentname"), app.get("desc"), app.get("version"), app, app.get("strsize"), app.get("icon"), app.get("install"))
		
	def import_cat(self, element, list, filtre = "", modifs = {'install': [], 'uninstall': []}, modele = None, iter = None, appspath = ""):
		if element == None and modele != None and iter != None:
			childiter = modele.iter_children(iter)
			while childiter != None:
				self.import_cat(modele[modele.get_path(childiter)][2], list, filtre, modifs, modele, childiter, appspath)
				childiter = modele.iter_next(childiter)
		else:
			categories = element.findall("category")
			for category in categories:
				self.import_cat(category, list, filtre, modifs, None, None, appspath)
			apps = element.findall("app")
			for app in apps:
				if not os.path.isfile("img/" + app.get("name") + ".png"):
					try:
						urllib.urlretrieve(app.find("icon").text, "img/" + app.get("name") + ".png")
					except:					
						pass
				try:	desc = app.find("desc").text
				except:	desc = ""
				try:	version = app.find("download").get("version", 0)
				except:	version = ""
				try:	size = app.find("size").text
				except:	size = ""
				
				if desc == None:
					desc = ""
				if version == None:
					version = ""
				if size == None or size == "":
					size = "0"
				
				try:
					dir = app.find("dir").text
					exe = app.find("exe").text
				except:
					dir = ""
					exe = ""
					
				if dir == "" or dir == None:
					dir = app.get("name")
				if exe == "" or exe == None:
					exe = app.get("name") + ".exe"
					
				if os.path.isfile(appspath + "/" + dir + "/" + exe):
					installed = True
				else:
					installed = False
				
				if os.path.isfile(appspath + "/" + dir + "/version.txt"):
					versionfile = open(appspath + "/" + dir + '/version.txt','r')
					versionfile.close()
				
				for element in modifs["uninstall"]:
					if element == app:
						installed = False
				for element in modifs["install"]:
					if element == app:
						installed = True
				
				iter = list.get_iter_first()
				(activable, displayuninstalled, name, link) = list.get(iter)
				iter = list.iter_next(iter)
				(activable, displayinstalled, name, link) = list.get(iter)
				
				filtre = string.lower(filtre)
				
				pos = string.find(string.lower(app.get("name")), filtre)
				if pos == -1:
					pos = string.find(string.lower(desc), filtre)
					if pos == -1:
						try:	longdesc = app.find("longdesc").text
						except:	longdesc = ""
						if longdesc == None:
							longdesc = ""
						pos = string.find(string.lower(longdesc), filtre)
				
				if pos != -1 and ((displayinstalled and installed) or (displayuninstalled and not installed)):
					self.ajouter(app.get("parentname"), desc, version, app, size, "img/" + app.get("name") + ".png", installed)
