#!/usr/bin/env python
"""
gdick_applet.py by ddt<ddt@mirstyle.org>
license: GPL
"""
import pygtk
pygtk.require("2.0")
import gtk
import gnome.applet

from gdick import gdick
from gdick.Utils import sleeper

class GDickApplet(gtk.HBox):
    def __init__(self, applet):
        gtk.HBox.__init__(self, spacing=3)
        self.drag_dest_set(gtk.DEST_DEFAULT_ALL,
                           [('STRING',0,0),('text/plain',0,0)],
                           gtk.gdk.ACTION_COPY)
        self.connect('drag-data-received', self.drop_cb)
        
        entry = gtk.Entry()
        entry.connect("activate", self.entry_cb)
        self.add(entry)

        button = gtk.Button("search")
        button.connect("button-press-event", self.button_press_cb, applet)
        button.connect("clicked", self.button_cb, entry)
        self.pack_end(button, gtk.FALSE)
        
        self.dict = gdick.GDick()
        self.dict.win.hide_all()
        self.dict.win.connect("delete-event", self.delete_cb)
        self.dict.xml.signal_connect("on_quit_activate", self.delete_cb)
        
        self.x = self.y = self.w = self.h = 0
        self.ref_count = 1

    def drop_cb(self, widget, context, x, y, data, info, timestamp):
        if data and data.format == 8:
            self.search(data.data)
        context.finish(gtk.TRUE,gtk.FALSE, timestamp)
    
    def delete_cb(self, widget, *args):
        self.ref_count -= 1
        if self.ref_count != 0:
            self.x, self.y = self.dict.win.get_position()
            self.w, self.h = self.dict.win.get_size()
            self.dict.win.hide_all()
            return gtk.TRUE
        else:
            return gtk.FALSE

    def entry_cb(self, widget):
        self.search(widget.get_text())
    
    def button_cb(self, widget, entry):
        self.search(entry.get_text())

    def button_press_cb(self, widget, event, applet):
        if event.button == 3 or event.button == 2:
            applet.emit("button_press_event",event)
            return gtk.FALSE

    def search(self, word):
        if self.ref_count == 1:
            self.ref_count += 1
            self.dict.win.show_all()
            if self.w == 0 or self.h == 0:
                self.w = 300
                self.h = 300
            self.dict.win.resize(self.w,self.h)
            self.dict.win.move(self.x,self.y)
        else:
            self.dict.win.show_all()
        self.dict.search(word)

def dict_factory(applet, iid):
    gtk.timeout_add(33, sleeper)
    d = GDickApplet(applet)
    applet.add(d)
    applet.show_all()
    return gtk.TRUE

gnome.applet.bonobo_factory("OAFIID:GNOME_GDick_Factory",
                            gnome.applet.Applet.__gtype__,
                            "gdick", "0", dict_factory)
