Hi,
this patch adds an entry field and a previous and next button to the edit toolbar
to search in the context. You can use (ctrl+f) to focus the search entry in the
edit toolbar. The find is typeahead. Hitting 'Enter' will find the next occurrence.
I used the xpcom interface nsITypeAheadFind since it allows find() and findAgain()
compared to nsIWebBrowserFind.
Open questions:
- what feedback do we give when no occurrence was found (firefox paints the entry
red)
- do we provide shortcuts for next and previous (firefox uses ctrl+g for
findAgain)
Best,
Simon
diff --git a/edittoolbar.py b/edittoolbar.py
index 91e8d6a..a5f27b5 100644
--- a/edittoolbar.py
+++ b/edittoolbar.py
@@ -14,9 +14,15 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+import gtk
+from gettext import gettext as _
+
+from xpcom import components
from xpcom.components import interfaces
from sugar.activity import activity
+from sugar.graphics import iconentry
+from sugar.graphics.toolbutton import ToolButton
class EditToolbar(activity.EditToolbar):
@@ -25,14 +31,12 @@ class EditToolbar(activity.EditToolbar):
def __init__(self, browser):
activity.EditToolbar.__init__(self)
- self._browser = browser
-
self.undo.connect('clicked', self.__undo_cb)
self.redo.connect('clicked', self.__redo_cb)
self.copy.connect('clicked', self.__copy_cb)
self.paste.connect('clicked', self.__paste_cb)
- """
+ """
Notifications are not working right now:
https://bugzilla.mozilla.org/show_bug.cgi?id=207339
@@ -54,7 +58,49 @@ class EditToolbar(activity.EditToolbar):
def observe(self, subject, topic, data):
logging.debug('observe: %r %r %r' % (subject, topic, data))
- """
+ """
+
+ separator = gtk.SeparatorToolItem()
+ separator.set_draw(False)
+ separator.set_expand(True)
+ self.insert(separator, -1)
+ separator.show()
+
+ cls = components.classes["@mozilla.org/typeaheadfind;1"]
+ self._typeahead = cls.createInstance(interfaces.nsITypeAheadFind)
+ self._typeahead.init(browser.doc_shell)
+
+ search_item = gtk.ToolItem()
+ self.search_entry = iconentry.IconEntry()
+ self.search_entry.set_icon_from_name(iconentry.ICON_ENTRY_PRIMARY,
+ 'system-search')
+ self.search_entry.add_clear_button()
+ self.search_entry.connect('activate', self.__search_entry_activate_cb)
+ self.search_entry.connect('changed', self.__search_entry_changed_cb)
+ self.search_entry_changed = True
+
+ width = int(gtk.gdk.screen_width() / 3)
+ self.search_entry.set_size_request(width, -1)
+
+ search_item.add(self.search_entry)
+ self.search_entry.show()
+
+ self.insert(search_item, -1)
+ search_item.show()
+
+ self._prev = ToolButton('go-previous-paired')
+ self._prev.set_tooltip(_('Previous'))
+ self._prev.props.sensitive = False
+ self._prev.connect('clicked', self.__find_previous_cb)
+ self.insert(self._prev, -1)
+ self._prev.show()
+
+ self._next = ToolButton('go-next-paired')
+ self._next.set_tooltip(_('Next'))
+ self._next.props.sensitive = False
+ self._next.connect('clicked', self.__find_next_cb)
+ self.insert(self._next, -1)
+ self._next.show()
def __undo_cb(self, button):
command_manager = self._get_command_manager()
@@ -77,3 +123,25 @@ class EditToolbar(activity.EditToolbar):
requestor =
web_browser.queryInterface(interfaces.nsIInterfaceRequestor)
return requestor.getInterface(interfaces.nsICommandManager)
+ def __search_entry_activate_cb(self, entry):
+ self._typeahead.findAgain(False, False)
+
+ def __search_entry_changed_cb(self, entry):
+ if entry.props.text == '':
+ self._prev.props.sensitive = False
+ self._next.props.sensitive = False
+ return
+
+ self._prev.props.sensitive = True
+ self._next.props.sensitive = True
+
+ found = self._typeahead.find(entry.props.text, False)
+ if found == interfaces.nsITypeAheadFind.FIND_NOTFOUND:
+ #TODO give feedback that the search failed
+ pass
+
+ def __find_previous_cb(self, button):
+ self._typeahead.findAgain(True, False)
+
+ def __find_next_cb(self, button):
+ self._typeahead.findAgain(False, False)
diff --git a/webactivity.py b/webactivity.py
index 4b4544a..f0d5021 100755
--- a/webactivity.py
+++ b/webactivity.py
@@ -83,6 +83,7 @@ SERVICE = "org.laptop.WebActivity"
IFACE = SERVICE
PATH = "/org/laptop/WebActivity"
+_TOOLBAR_EDIT = 1
_TOOLBAR_BROWSE = 2
_logger = logging.getLogger('web-activity')
@@ -347,6 +348,11 @@ class WebActivity(activity.Activity):
_logger.debug('keyboard: Add link: %s.' % self.current)
self._add_link()
return True
+ elif gtk.gdk.keyval_name(event.keyval) == "f":
+ _logger.debug('keyboard: Find')
+ self.toolbox.set_current_toolbar(_TOOLBAR_EDIT)
+ self._edit_toolbar.search_entry.grab_focus()
+ return True
elif gtk.gdk.keyval_name(event.keyval) == "u":
_logger.debug('keyboard: Show source of the current page')
self._show_source()
_______________________________________________
Sugar mailing list
[email protected]
http://lists.laptop.org/listinfo/sugar