84 | | self.palette = LinkPalette(self._browser, title, target.href, |
85 | | target.ownerDocument) |
| 75 | def __button_press_cb(self, browser, event): |
| 76 | logging.debug('===> event=%s', event.button) |
| 77 | if event.button != 3: |
| 78 | return False |
| 79 | hit_test = self._browser.get_hit_test_result(event) |
| 80 | if hit_test.props.context & WebKit.HitTestResultContext.LINK: |
| 81 | logging.debug('===> click LINK') |
| 82 | link_uri = hit_test.props.link_uri |
| 83 | self.palette = LinkPalette(self._browser, None, link_uri, None) |
87 | | elif target.tagName.lower() == 'img': |
88 | | if target.title: |
89 | | title = target.title |
90 | | elif target.title: |
91 | | title = target.alt |
92 | | elif target.name: |
93 | | title = target.name |
94 | | else: |
95 | | title = os.path.basename(urlparse.urlparse(target.src).path) |
96 | | |
97 | | self.palette = ImagePalette(title, target.src, |
98 | | target.ownerDocument) |
| 85 | elif hit_test.props.context & WebKit.HitTestResultContext.IMAGE: |
| 86 | logging.debug('===< click IMAGE %s %s', hit_test.props.image_uri, hit_test.props.inner_node) |
| 87 | self.palette = ImagePalette('', hit_test.props.image_uri, '') |
100 | | else: |
101 | | return |
102 | | |
103 | | if self._popdown_handler_id is not None: |
104 | | self._popdown_handler_id = self.palette.connect( \ |
105 | | 'popdown', self.__palette_popdown_cb) |
106 | | |
107 | | self._mouseout_listener = MouseOutListener(target) |
108 | | wrapper = xpcom.server.WrapObject(self._mouseout_listener, |
109 | | interfaces.nsIDOMEventListener) |
110 | | target.addEventListener('mouseout', wrapper, False) |
111 | | self._mouseout_listener.connect('mouse-out', self.__moved_out_cb) |
112 | | |
113 | | def __moved_out_cb(self, listener): |
114 | | self.palette.popdown() |
115 | | |
116 | | def __palette_popdown_cb(self, palette): |
117 | | if self._mouseout_listener is not None: |
118 | | wrapper = xpcom.server.WrapObject(self._mouseout_listener, |
119 | | interfaces.nsIDOMEventListener) |
120 | | self._mouseout_listener.target.removeEventListener('mouseout', |
121 | | wrapper, False) |
122 | | del self._mouseout_listener |
| 89 | return True |
140 | | menu_item = MenuItem(_('Follow link'), 'browse-follow-link') |
141 | | menu_item.connect('activate', self.__follow_activate_cb) |
142 | | self.menu.append(menu_item) |
| 107 | menu_box = Gtk.VBox() |
| 108 | self.set_content(menu_box) |
| 109 | menu_box.show() |
| 110 | self._content.set_border_width(1) |
| 111 | |
| 112 | menu_item = SugarMenuItem(_('Follow link'), 'browse-follow-link') |
| 113 | menu_item.connect('clicked', self.__follow_activate_cb) |
| 114 | menu_box.pack_end(menu_item, False, False, 0) |
145 | | menu_item = MenuItem(_('Follow link in new tab'), |
146 | | 'browse-follow-link-new-tab') |
147 | | menu_item.connect('activate', self.__follow_activate_cb, True) |
148 | | self.menu.append(menu_item) |
| 117 | menu_item = SugarMenuItem(_('Follow link in new tab'), |
| 118 | 'browse-follow-link-new-tab') |
| 119 | menu_item.connect('clicked', self.__follow_activate_cb, True) |
| 120 | menu_box.pack_end(menu_item, False, False, 0) |
151 | | menu_item = MenuItem(_('Keep link')) |
152 | | icon = Icon(icon_name='document-save', xo_color=profile.get_color(), |
153 | | icon_size=Gtk.IconSize.MENU) |
154 | | menu_item.set_image(icon) |
155 | | menu_item.connect('activate', self.__download_activate_cb) |
156 | | self.menu.append(menu_item) |
| 123 | menu_item = SugarMenuItem(_('Keep link'), 'document-save') |
| 124 | menu_item.icon.props.xo_color = profile.get_color() |
| 125 | menu_item.connect('clicked', self.__download_activate_cb) |
| 126 | menu_box.pack_end(menu_item, False, False, 0) |
159 | | menu_item = MenuItem(_('Copy link')) |
160 | | icon = Icon(icon_name='edit-copy', xo_color=profile.get_color(), |
161 | | icon_size=Gtk.IconSize.MENU) |
162 | | menu_item.set_image(icon) |
163 | | menu_item.connect('activate', self.__copy_activate_cb) |
164 | | self.menu.append(menu_item) |
| 129 | menu_item = SugarMenuItem(_('Copy link'), 'edit-copy') |
| 130 | menu_item.icon.props.xo_color = profile.get_color() |
| 131 | menu_item.connect('clicked', self.__copy_activate_cb) |
| 132 | menu_box.pack_end(menu_item, False, False, 0) |
215 | | menu_item = MenuItem(_('Keep image')) |
216 | | icon = Icon(icon_name='document-save', xo_color=profile.get_color(), |
217 | | icon_size=Gtk.IconSize.MENU) |
218 | | menu_item.set_image(icon) |
219 | | menu_item.connect('activate', self.__download_activate_cb) |
220 | | self.menu.append(menu_item) |
| 187 | menu_box = Gtk.VBox() |
| 188 | self.set_content(menu_box) |
| 189 | menu_box.show() |
| 190 | self._content.set_border_width(1) |
| 191 | |
| 192 | menu_item = SugarMenuItem(_('Keep image'), 'document-save') |
| 193 | menu_item.icon.props.xo_color = profile.get_color() |
| 194 | menu_item.connect('clicked', self.__download_activate_cb) |
| 195 | menu_box.pack_end(menu_item, False, False, 0) |
223 | | menu_item = MenuItem(_('Copy image')) |
224 | | icon = Icon(icon_name='edit-copy', xo_color=profile.get_color(), |
225 | | icon_size=Gtk.IconSize.MENU) |
226 | | menu_item.set_image(icon) |
227 | | menu_item.connect('activate', self.__copy_activate_cb) |
228 | | self.menu.append(menu_item) |
| 198 | menu_item = SugarMenuItem(_('Copy image'), 'edit-copy') |
| 199 | menu_item.icon.props.xo_color = profile.get_color() |
| 200 | menu_item.connect('clicked', self.__copy_activate_cb) |
| 201 | menu_box.pack_end(menu_item, False, False, 0) |
245 | | |
246 | | cls = components.classes['@mozilla.org/network/io-service;1'] |
247 | | io_service = cls.getService(interfaces.nsIIOService) |
248 | | uri = io_service.newURI(self._url, None, None) |
249 | | |
250 | | cls = components.classes['@mozilla.org/file/local;1'] |
251 | | target_file = cls.createInstance(interfaces.nsILocalFile) |
252 | | target_file.initWithPath(temp_file) |
253 | | |
254 | | cls = components.classes[ \ |
255 | | '@mozilla.org/embedding/browser/nsWebBrowserPersist;1'] |
256 | | persist = cls.createInstance(interfaces.nsIWebBrowserPersist) |
257 | | persist.persistFlags = 1 # PERSIST_FLAGS_FROM_CACHE |
258 | | listener = xpcom.server.WrapObject(_ImageProgressListener(temp_file), |
259 | | interfaces.nsIWebProgressListener) |
260 | | persist.progressListener = listener |
261 | | persist.saveURI(uri, None, None, None, None, target_file) |
| 220 | # write data |
| 221 | ''' |
264 | | downloadmanager.save_link(self._url, self._title, self._owner_document) |
265 | | |
266 | | |
267 | | class _ImageProgressListener(object): |
268 | | _com_interfaces_ = interfaces.nsIWebProgressListener |
269 | | |
270 | | def __init__(self, temp_file): |
271 | | self._temp_file = temp_file |
272 | | |
273 | | def onLocationChange(self, webProgress, request, location): |
274 | | pass |
275 | | |
276 | | def onProgressChange(self, webProgress, request, curSelfProgress, |
277 | | maxSelfProgress, curTotalProgress, maxTotalProgress): |
278 | | pass |
279 | | |
280 | | def onSecurityChange(self, webProgress, request, state): |
281 | | pass |
282 | | |
283 | | def onStatusChange(self, webProgress, request, status, message): |
284 | | pass |
285 | | |
286 | | def onStateChange(self, webProgress, request, stateFlags, status): |
287 | | if (stateFlags & interfaces.nsIWebProgressListener.STATE_IS_REQUEST and |
288 | | stateFlags & interfaces.nsIWebProgressListener.STATE_STOP): |
289 | | clipboard = Gtk.Clipboard() |
290 | | clipboard.set_with_data([('text/uri-list', 0, 0)], |
291 | | _clipboard_get_func_cb, |
292 | | _clipboard_clear_func_cb, |
293 | | self._temp_file) |
| 224 | pass # downloadmanager.save_link(self._url, self._title, self._owner_document) |