# (c) 2005 Canonical, GPL

import pygtk
pygtk.require('2.0')
from SimpleGladeApp import SimpleGladeApp

import gtk
import gobject
import os

from gettext import gettext as _

from Util import *

class DialogNewlyInstalled(SimpleGladeApp):
    def __init__(self, datadir, parent, to_add, cache):
        SimpleGladeApp.__init__(self,
                                path=datadir+"/gnome-app-install.glade",
                                root="dialog_newly_installed",
                                domain="gnome-app-install")
                                
        self.store = gtk.ListStore(gobject.TYPE_STRING,
                                   gobject.TYPE_PYOBJECT)
        for elm in to_add:
            if cache.has_key(elm.pkgname) and cache[elm.pkgname].isInstalled \
               and elm.execCmd:
                self.store.append([elm.name,elm])                    
        self.treeview_newly_installed.set_model(self.store)
        self.dialog_newly_installed.set_transient_for(parent)
        self.init_treeview(self.treeview_newly_installed)

    def run(self):
        if len(self.store):
            return self.dialog_newly_installed.run()

    def init_treeview(self, view):
        def package_view_func(cell_layout, renderer, model, iter):
            (name, item) = model.get(iter, COL_NAME, COL_ITEM)
            if not item.menupath:
                return
            menupath = "</b> &gt; <b>".join(item.menupath)
            menupath = "<b>" + menupath + "</b>"
            renderer.set_property("markup",
                                  "%s\n<small>%s %s</small>" % \
                                  (item.name, _("Menu:"), menupath))
        def icon_cell_func(column, cell, model, iter):
            item = model.get_value(iter, COL_ITEM)
            if item.iconname != None:
                icon = item.icontheme._getIcon(item.iconname, 24)
                cell.set_property("pixbuf", icon)
            else:
                cell.set_property("pixbuf", None)
            cell.set_property("visible", True)
        view.set_search_column(COL_NAME)
        view.get_selection().set_mode(gtk.SELECTION_NONE)
        column = gtk.TreeViewColumn("")
        render = gtk.CellRendererPixbuf()
        column.pack_start(render, False)
        column.set_cell_data_func (render, icon_cell_func)
        render = gtk.CellRendererText()
        render.set_property("xpad", 4)
        column.pack_start(render, True)
        column.add_attribute(render, "markup", COL_NAME)
        column.set_cell_data_func (render, package_view_func)
        view.append_column(column)


    def on_treeview_newly_installed_row_activated(self, treeview_packages,
                                                  path, view_column):
        if os.getuid() == 0:
            return False
        treeiter = self.store.get_iter(path)
        (name, item) = self.store[treeiter]
        cmd_parts = []
        command = item.execCmd
        terminal = item.needsTerminal
        if command == "": return
        for part in command.split():
            while True:
                # two consecutive '%' characters represent an actual '%'
                if len(part) >= 2 and part[:2] == '%%':
                    cmd_parts.append('%')
                    part = part[2:]
                    continue
                # we're running the command without any options, so strip out placeholders
                if part[0] == '%': break
                # if the last part was an actual '%', we don't want to join it with a space, so do it by hand
                if cmd_parts[-1:] == '%':
                    part = '%' + part
                    cmd_parts[-1:] = part
                    break
                cmd_parts.append(part)
                break
        
        if terminal:
            command = " ".join(cmd_parts)
            command = "gnome-terminal --command=\"" + command + "\""
            cmd_parts = command.split()
        
        # run program
        os.spawnvp(os.P_NOWAIT, cmd_parts[0], cmd_parts)

    def hide(self):
        self.dialog_newly_installed.hide()
        

if __name__ == "__main__":
    from Menu import ApplicationMenu
    cache = apt.Cache()
    datadir = "/usr/share/gnome-app-install/"
    progress = apt.progress.OpTextProgress()
    to_add = []
    
    treeview_categories = gtk.TreeView()
    treeview_packages = gtk.TreeView()

    menu = ApplicationMenu(datadir, cache,
                           treeview_categories,
                           treeview_packages,
                           progress)
    

    to_add = set()
    for (type, name, item) in menu.store:
        for (type,name,item) in item.real_applications_store:
            to_add.add(item)
    print to_add
    dia = DialogNewlyInstalled(datadir, None,
                               to_add,
                               cache)
    dia.run()
    dia.hide()
