[orca] Handle Evince text selection events that cross into a different page



commit 686ee8df47e44dde5b6407091a93eaf738f50001
Author: Joanmarie Diggs <jdiggs igalia com>
Date:   Sat Jul 20 21:16:24 2013 -0400

    Handle Evince text selection events that cross into a different page

 src/orca/scripts/apps/evince/Makefile.am         |    3 +-
 src/orca/scripts/apps/evince/script.py           |    6 ++
 src/orca/scripts/apps/evince/script_utilities.py |   73 ++++++++++++++++++++++
 3 files changed, 81 insertions(+), 1 deletions(-)
---
diff --git a/src/orca/scripts/apps/evince/Makefile.am b/src/orca/scripts/apps/evince/Makefile.am
index 41c13c1..0959766 100644
--- a/src/orca/scripts/apps/evince/Makefile.am
+++ b/src/orca/scripts/apps/evince/Makefile.am
@@ -2,6 +2,7 @@ orca_pathdir=$(pyexecdir)
 
 orca_python_PYTHON = \
        __init__.py \
-       script.py
+       script.py \
+       script_utilities.py
 
 orca_pythondir=$(pyexecdir)/orca/scripts/apps/evince
diff --git a/src/orca/scripts/apps/evince/script.py b/src/orca/scripts/apps/evince/script.py
index 9246fb8..73148c9 100644
--- a/src/orca/scripts/apps/evince/script.py
+++ b/src/orca/scripts/apps/evince/script.py
@@ -32,6 +32,7 @@ import orca.orca_state as orca_state
 import orca.scripts.default as default
 import orca.settings as settings
 from orca.structural_navigation import StructuralNavigation
+from .script_utilities import Utilities
 
 ########################################################################
 #                                                                      #
@@ -68,6 +69,11 @@ class Script(default.Script):
 
         return keyBindings
 
+    def getUtilities(self):
+        """Returns the utilites for this script."""
+
+        return Utilities(self)
+
     def getStructuralNavigation(self):
         """Returns the 'structural navigation' class for this script."""
 
diff --git a/src/orca/scripts/apps/evince/script_utilities.py 
b/src/orca/scripts/apps/evince/script_utilities.py
new file mode 100644
index 0000000..02938ee
--- /dev/null
+++ b/src/orca/scripts/apps/evince/script_utilities.py
@@ -0,0 +1,73 @@
+# Orca
+#
+# Copyright 2013 The Orca Team.
+#
+# Author: Joanmarie Diggs <jdiggs igalia com>
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
+# Boston MA  02110-1301 USA.
+
+__id__ = "$Id$"
+__version__   = "$Revision$"
+__date__      = "$Date$"
+__copyright__ = "Copyright (c) 2013 The Orca Team"
+__license__   = "LGPL"
+
+import pyatspi
+
+import orca.script_utilities as script_utilities
+
+class Utilities(script_utilities.Utilities):
+
+    def __init__(self, script):
+        script_utilities.Utilities.__init__(self, script)
+
+    def offsetsForPhrase(self, obj):
+        """Return the start and end offset for the given phrase. Overriden
+        here because two functionally different objects (pages of a PDF)
+        are currently contained in a single accessible object whose contents
+        change. As a result, when a new text selection spans two pages, we
+        have a stored offset for our previous location that makes no sense
+        because that location no longer exists.
+
+        Arguments:
+        - obj: the Accessible object
+        """
+
+        try:
+            text = obj.queryText()
+        except:
+            return [0, 0]
+
+        if obj.getRole() != pyatspi.ROLE_DOCUMENT_FRAME:
+            return script_utilities.Utilities.offsetsForPhrase(self, obj)
+
+        lastPos = self._script.pointOfReference.get("lastCursorPosition")
+        keyString, mods = self.lastKeyAndModifiers()
+        if keyString in ["Up", "Page_Up", "Left", "Home"]:
+            # The previous location should have a larger offset. If it does
+            # not, we've crossed pages.
+            if lastPos[1] <= text.caretOffset:
+                return [text.caretOffset, text.characterCount]
+            return [text.caretOffset, lastPos[1]]
+
+        if keyString in ["Down", "Page_Down", "Right", "End"]:
+            # The previous location should have a smaller offset. If it does
+            # not, we've crossed pages.
+            if lastPos[1] >= text.caretOffset:
+                return [0, text.caretOffset]
+            return [lastPos[1], text.caretOffset]
+
+        return script_utilities.Utilities.offsetsForPhrase(self, obj)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]