from shell.Plugin import Plugin
from main import ICON

import gtk

from utils import vfs


#
# The GUI shell where other plugins can plug into.
#
class UI_Shell(Plugin,):

    __TARGET_URL = 0
    __NETSCAPE_URL = 1

    # what we accept for drag & drop
    __DND_TYPES = [("text/uri-list", 0, __TARGET_URL),
                   ("x-url/http", 0, __NETSCAPE_URL),
                   ("_NETSCAPE_URL", 0, __NETSCAPE_URL)]


    def init(self):
        win = gtk.Window()
        win.set_title("gDesklets Shell")
        win.set_default_size(500, 300)
        win.connect("delete-event", self.__on_close)

        # set the icon
        win.set_icon(gtk.gdk.pixbuf_new_from_file(ICON))

        vbox = gtk.VBox()
        vbox.set_border_width(2)
        win.add(vbox)

        self.__menubox = gtk.HBox()
        vbox.pack_start(self.__menubox, False, False, 0)

        self.__toolbarbox = gtk.HandleBox()

        pane = gtk.HPaned()
        vbox.add(pane)

        lpane = gtk.VBox()
        pane.add1(lpane)

        self.__sidebarbox = gtk.HBox()
        lpane.pack_start(self.__sidebarbox, True, True, 0)

        self.__switchbox = gtk.HBox()
        lpane.pack_end(self.__switchbox, False, False, 0)

        self.__bodybox = gtk.HBox()
        pane.add2(self.__bodybox)

        self.__statusbox = gtk.HBox()
        vbox.pack_end(self.__statusbox, False, False, 0)

        win.show_all()

        menu = self._get_plugin("UI_Menu")
        menu.set_item("File", None, _("_File"), None)
        menu.set_slot("File/Slot")
        menu.set_separator("File/Separator")
        menu.set_item("File/Quit", gtk.STOCK_QUIT, "", self.__quit)

        menu.set_slot("Slot1")
        menu.set_slot("Slot2")

        plugins = self._get_plugins_by_pattern("name", "Shell_*")
        installer = self._get_plugin("Installer_Package")

        # set up drag & drop
        self.__bodybox.drag_dest_set(gtk.DEST_DEFAULT_ALL, self.__DND_TYPES,
                                     gtk.gdk.ACTION_COPY)
        self.__bodybox.connect("drag_data_received", self.__on_file_drop)



    def __on_file_drop(self, widget, context, x, y, data, info, time):

        files = [uri for uri in data.data.split("\r\n") if uri != '']
        installer = self._get_plugin("Installer_Package")

        if (info == self.__NETSCAPE_URL):
            for f in files:
                f, name = f.splitlines()[0:2]
                installer.install_from(f)
            #end for

        elif (info == self.__TARGET_URL):
            for f in files:
                if (f.startswith("file://")): f = f[7:]
                # filenames are URL-quoted
                installer.install_from(vfs.unescape_path(f))
            #end for



    def __on_close(self, src, event):

        self.__quit()


    def set_menu(self, widget):

        self.__menubox.add(widget)


    def set_toolbar(self, widget):

        self.__toolbarbox.add(widget)


    def set_switch(self, widget):

        self.__switchbox.add(widget)


    def set_sidebar(self, widget):

        self.__sidebarbox.add(widget)


    def set_body(self, widget):

        self.__bodybox.add(widget)


    def set_statusbar(self, widget):

        self.__statusbox.add(widget)


    def run(self):

        gtk.main()


    def __quit(self):

        gtk.main_quit()


def get_class(): return UI_Shell


try:
    import pygtk; pygtk.require("2.0")
except:
    pass

gtk.gdk.threads_init()

