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

# TODO - ability to organize profiles into submenus
# TODO - Jump to running terminal a-la window chooser
import pygtk
pygtk.require('2.0')

import gtk
import gnomeapplet
import gnome
import gobject
import gconf
import sys, os, getopt, string

from termlaunch_globals import *

class TermLaunch(gnomeapplet.Applet):
  def __init__(self, applet, iid):
    self.logo_hi = 0

    self.__gobject_init__()
    #gnome.init(APP_NAME, APP_VERSION)
    self.applet = applet

    self.tooltips = gtk.Tooltips()
    
    self.hbox = gtk.HBox()
    self.applet.add(self.hbox)

    self.client = gconf.client_get_default()
    self.client.add_dir("/apps/termlauncher-applet", gconf.CLIENT_PRELOAD_ONELEVEL)
    self.update_menu()

    self.ev_box = gtk.EventBox()
    self.ev_box.set_events(gtk.gdk.BUTTON_PRESS_MASK)
    self.hbox.add(self.ev_box)

    size = self.applet.get_size()
    size = size - 4

    self.image = gtk.Image()

    pixbuf = gtk.gdk.pixbuf_new_from_file(APP_LOGO)
    self.pixbuf = pixbuf.scale_simple(size, size, gtk.gdk.INTERP_BILINEAR)
    pixbuf_hi = gtk.gdk.pixbuf_new_from_file(APP_LOGO_HI)
    self.pixbuf_hi = pixbuf_hi.scale_simple(size, size, gtk.gdk.INTERP_BILINEAR)

    self.image.set_from_pixbuf(self.pixbuf)

    self.ev_box.connect("button_press_event", self.button_press)
    self.ev_box.connect("enter_notify_event", self.toggle_logo)
    self.ev_box.connect("leave_notify_event", self.toggle_logo)
    self.applet.connect("delete-event", self.cleanup)
    self.ev_box.add(self.image)

    self.tooltips.set_tip(self.ev_box, APP_SHORT_DESC)

    self.applet.show_all()

  def cleanup(self,event):
    self.client.unref()
    gtk.main_quit()

  def toggle_logo(self, widget, event):
    if event.type == gtk.gdk.LEAVE_NOTIFY and self.logo_hi == 1:
      self.image.set_from_pixbuf(self.pixbuf)
      self.logo_hi = 0
    elif event.type == gtk.gdk.ENTER_NOTIFY and self.logo_hi == 0:
      self.image.set_from_pixbuf(self.pixbuf_hi)
      self.logo_hi = 1

    return
      
  def get_default_profile(self):
    return self.client.get_string("/apps/gnome-terminal/global/default_profile")

  def button_press(self, widget, event):
    if event.type == gtk.gdk.BUTTON_PRESS and event.button == 3:
      self.update_menu()
    if event.type == gtk.gdk.BUTTON_PRESS and event.button == 1:
      default_profile = self.get_default_profile()
      self.open_term(default_profile)

  def get_menu_list(self):
    return self.client.get_list("/apps/termlauncher-applet/menus", 1)

  def get_profile_list(self):
    return self.client.get_list("/apps/gnome-terminal/global/profile_list", 1)

  def get_visible_name(self, profile):
    return self.client.get_string("/apps/gnome-terminal/profiles/%s/visible_name" % profile)

  def update_menu(self):
    self.menus = self.get_menu_list()
    self.profiles = self.get_profile_list()
    self.profiles.sort(key=string.upper)

    self.verbs = []
    self.menuxml = "<popup name=\"button3\">"

    i = 1
    for p in self.profiles:
      name = self.get_visible_name(p)
      self.verbs.append((name, self.menu_select))
      self.menuxml = "%s\n<menuitem name=\"Item %s\" verb=\"%s\" label=\"%s\" />" % (self.menuxml, i, name, name)
      i += 1

    # Test Submenus
    #self.menuxml += "<submenu name=\"sub\" _label=\"subs\"><menuitem name=\"Item %s\" verb=\"About\" label=\"_About...\" pixtype=\"stock\" pixname=\"gnome-stock-about\"/></submenu>"

    self.menuxml="%s\n<menuitem name=\"Item %s\" verb=\"About\" label=\"_About...\" pixtype=\"stock\" pixname=\"gnome-stock-about\"/>\n</popup>" % (self.menuxml, i)
        
    self.verbs.append(( "About", self.about_info ))
    #print self.menuxml
    #print self.verbs

    self.applet.setup_menu(self.menuxml, self.verbs, None)

    return

  def about_info(self, event, data=None):
    about = gtk.AboutDialog()
    info = {
      "program-name" : (APP_NAME),
      "version" : APP_VERSION,
      "comments" : (APP_COMMENTS),
      "copyright" : APP_COPY,
      "website" : APP_WEBSITE
    }

    about.set_authors([APP_AUTHOR])

    for prop, val in info.items():
      about.set_property(prop, val)

    about.connect ("response", lambda self, *args: self.destroy ())
    about.show_all()  

  def menu_select(self, event, data=None):
    self.open_term(data)

  def open_term(self, data=None):
    if data:
      cmd = "gnome-terminal --tab-with-profile=\"%s\" &" % data
    else:
      cmd = "gnome-terminal &"

    os.system(cmd)
    return

gobject.type_register(TermLaunch)

def termlaunch_factory(applet, iid):
  t = TermLaunch(applet, iid)
  return

def usage():
  print """=== TermLauncher applet: Usage
$ termlauncher-applet [OPTIONS]

OPTIONS:
        -h, --help        Print this help notice.
        -d, --debug       Enable debug output (default=off).
        -w, --window      Launch the applet in a standalone window for test purposes (default=no).
        """
  sys.exit()

if __name__ == "__main__":
  standalone = False

  try:
    opts, args = getopt.getopt(sys.argv[1:], "hdw", ["help", "debug", "window"])
  except getopt.GetoptError:
    # Unknown args were passed, behave as if
    # no options were passed
    opts = []
    args = sys.argv[1:]

  for o, a in opts:
    if o in ("-h", "--help"):
      usage()
    elif o in ("-d", "--debug"):
      print "Not yet implemented."
    elif o in ("-w", "--window"):
      standalone = True

  if standalone:
    main_window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    main_window.set_title("TermLauncher Applet")
    main_window.connect("destroy", gtk.main_quit) 
    app = gnomeapplet.Applet()
    termlaunch_factory(app, None)
    app.reparent(main_window)
    main_window.show_all()
    gtk.main()
    sys.exit()
  else:
    gnomeapplet.bonobo_factory("OAFIID:TermLauncher_Applet_Factory", 
                             gnomeapplet.Applet.__gtype__, 
                             APP_NAME, APP_VERSION, termlaunch_factory)
