diff --git a/palettes.py b/palettes.py
index d5a4eb9..8ab0b22 100644
a
|
b
|
import urlparse |
21 | 21 | from gettext import gettext as _ |
22 | 22 | |
23 | 23 | import gtk |
| 24 | import gobject |
24 | 25 | import xpcom |
25 | 26 | from xpcom import components |
26 | 27 | from xpcom.components import interfaces |
… |
… |
from sugar.activity import activity |
33 | 34 | |
34 | 35 | import downloadmanager |
35 | 36 | |
| 37 | class MouseOutListener(gobject.GObject): |
| 38 | _com_interfaces_ = interfaces.nsIDOMEventListener |
| 39 | |
| 40 | __gsignals__ = { |
| 41 | 'mouse-out': (gobject.SIGNAL_RUN_FIRST, |
| 42 | gobject.TYPE_NONE, |
| 43 | ([])) |
| 44 | } |
| 45 | |
| 46 | def __init__(self, target): |
| 47 | gobject.GObject.__init__(self) |
| 48 | self._target = target |
| 49 | |
| 50 | def handleEvent(self, event): |
| 51 | self.emit('mouse-out') |
| 52 | |
| 53 | |
36 | 54 | class ContentInvoker(Invoker): |
37 | 55 | _com_interfaces_ = interfaces.nsIDOMEventListener |
38 | 56 | |
… |
… |
class ContentInvoker(Invoker): |
40 | 58 | Invoker.__init__(self) |
41 | 59 | self._position_hint = self.AT_CURSOR |
42 | 60 | self._browser = browser |
| 61 | self._mouseout_listener = None |
| 62 | self._popdown_handler_id = None |
43 | 63 | |
44 | 64 | def get_default_position(self): |
45 | 65 | return self.AT_CURSOR |
… |
… |
class ContentInvoker(Invoker): |
55 | 75 | return |
56 | 76 | |
57 | 77 | target = event.target |
| 78 | |
58 | 79 | if target.tagName.lower() == 'a': |
59 | 80 | |
60 | 81 | if target.firstChild: |
… |
… |
class ContentInvoker(Invoker): |
77 | 98 | |
78 | 99 | self.palette = ImagePalette(title, target.src, target.ownerDocument) |
79 | 100 | self.notify_right_click() |
| 101 | else: |
| 102 | return |
| 103 | |
| 104 | if self._popdown_handler_id is not None: |
| 105 | self._popdown_handler_id = self.palette.connect( \ |
| 106 | 'popdown', self.__palette_popdown_cb) |
| 107 | |
| 108 | self._mouseout_listener = MouseOutListener(target) |
| 109 | wrapper = xpcom.server.WrapObject(self._mouseout_listener, |
| 110 | interfaces.nsIDOMEventListener) |
| 111 | target.addEventListener('mouseout', wrapper, False) |
| 112 | self._mouseout_listener.connect('mouse-out', self.__moved_out_cb) |
| 113 | |
| 114 | def __moved_out_cb(self, listener): |
| 115 | self.palette.popdown() |
| 116 | |
| 117 | def __palette_popdown_cb(self, palette): |
| 118 | if self._mouseout_listener is not None: |
| 119 | wrapper = xpcom.server.WrapObject(self._mouseout_listener, |
| 120 | interfaces.nsIDOMEventListener) |
| 121 | self._mouseout_listener._target.removeEventListener('mouseout', |
| 122 | wrapper, False) |
| 123 | del self._mouseout_listener |
| 124 | |
80 | 125 | |
81 | 126 | class LinkPalette(Palette): |
82 | 127 | def __init__(self, browser, title, url, owner_document): |