from gettext import gettext as _
from gettext import ngettext

import wnck, gtk
import deskbar.Handler, deskbar
import re
import cgi

HANDLERS = {
  "ISwitchWindowHandler" : {
    "name": _("Deskbar iswitch window"),
    "description": _("Switch to a window with title or application name matching pattern"),

    "categories" : {
      "windows"  : {
        "name": _("Windows"),
        "nest": lambda n: ngettext("%s more window", "%s more windows", n),
        "threshold": 5
        }
      }
    }
  }

class ISwitchWindowMatch(deskbar.Match.Match):
  def __init__(self, handler, name=None, window=None, icon=None, **args):
    self.name = cgi.escape(name)
    deskbar.Match.Match.__init__ (self, handler, name=self.name)
    self._window = window

  def get_verb(self):
    return _("Switch to <b>%(name)s</b>")

  def action(self, text=None):
    if not self._window.is_active():
      ws = self._window.get_workspace()

      active_ws = self._window.get_screen().get_active_workspace()

      print ws
      print active_ws

      if ws is not active_ws:
        print "Switching workspace"
        ws.activate(gtk.get_current_event_time())

      self._window.activate(gtk.get_current_event_time() + 10)

  def get_category(self):
    return "windows"

  def get_hash(self, text=None):
    return self.name

class ISwitchWindowHandler(deskbar.Handler.Handler):
  def __init__(self):
    deskbar.Handler.Handler.__init__(self, "panel-window-menu.png")
    self.screen = wnck.screen_get_default()

  def query(self, qstring, maxq = 5):
    regex = re.compile(qstring, re.I)
    qmax = min (deskbar.DEFAULT_RESULTS_PER_HANDLER, maxq)

    matches = [ISwitchWindowMatch(self, name = w.get_name(), window = w, icon = w.get_mini_icon()) for w in self.screen.get_windows_stacked() 
               if (not w.is_skip_tasklist() and (regex.search(w.get_name()) or regex.search(w.get_application().get_name()))) ]

    return matches[:qmax]
