summaryrefslogtreecommitdiffstats
path: root/bundles/org.eclipse.swt/Eclipse SWT Accessibility/gtk/org/eclipse/swt/accessibility/AccessibleObject.java
diff options
context:
space:
mode:
authorSilenio Quarti <silenio>2010-05-20 19:38:56 +0000
committerSilenio Quarti <silenio>2010-05-20 19:38:56 +0000
commitfe5fa54e22f97eef927dafab577effaeba080c1d (patch)
treeea96c57e1e8a21b8851045578baf9f2baeda685d /bundles/org.eclipse.swt/Eclipse SWT Accessibility/gtk/org/eclipse/swt/accessibility/AccessibleObject.java
parent3aca5aa105cc29fd2171fa71f9b573ccd1cff2ea (diff)
downloadeclipse.platform.swt-fe5fa54e22f97eef927dafab577effaeba080c1d.tar.gz
eclipse.platform.swt-fe5fa54e22f97eef927dafab577effaeba080c1d.tar.xz
eclipse.platform.swt-fe5fa54e22f97eef927dafab577effaeba080c1d.zip
Bug 313071 - AccessibleTextExtendedListener.getText line/word offset problems
Diffstat (limited to 'bundles/org.eclipse.swt/Eclipse SWT Accessibility/gtk/org/eclipse/swt/accessibility/AccessibleObject.java')
-rw-r--r--bundles/org.eclipse.swt/Eclipse SWT Accessibility/gtk/org/eclipse/swt/accessibility/AccessibleObject.java147
1 files changed, 147 insertions, 0 deletions
diff --git a/bundles/org.eclipse.swt/Eclipse SWT Accessibility/gtk/org/eclipse/swt/accessibility/AccessibleObject.java b/bundles/org.eclipse.swt/Eclipse SWT Accessibility/gtk/org/eclipse/swt/accessibility/AccessibleObject.java
index d8b69055a9..9be6779346 100644
--- a/bundles/org.eclipse.swt/Eclipse SWT Accessibility/gtk/org/eclipse/swt/accessibility/AccessibleObject.java
+++ b/bundles/org.eclipse.swt/Eclipse SWT Accessibility/gtk/org/eclipse/swt/accessibility/AccessibleObject.java
@@ -2264,6 +2264,7 @@ class AccessibleObject {
Vector listeners = accessible.accessibleTextExtendedListeners;
int length = listeners.size();
if (length > 0) {
+ int /*long*/ charCount = atkText_get_character_count (atkObject);
AccessibleTextEvent event = new AccessibleTextEvent(accessible);
event.start = event.end = (int)/*64*/offset_value;
event.count = 1;
@@ -2276,10 +2277,58 @@ class AccessibleObject {
case ATK.ATK_TEXT_BOUNDARY_LINE_START: event.type = ACC.TEXT_BOUNDARY_LINE; break;
case ATK.ATK_TEXT_BOUNDARY_LINE_END: event.type = ACC.TEXT_BOUNDARY_LINE; break;
}
+ int eventStart = event.start;
+ int eventEnd = event.end;
for (int i = 0; i < length; i++) {
AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) listeners.elementAt(i);
listener.getText(event);
}
+ switch ((int)/*64*/boundary_type) {
+ case ATK.ATK_TEXT_BOUNDARY_WORD_START:
+ case ATK.ATK_TEXT_BOUNDARY_SENTENCE_START:
+ case ATK.ATK_TEXT_BOUNDARY_LINE_START:
+ if (event.end < charCount) {
+ int start = event.start;
+ event.start = eventStart;
+ event.end = eventEnd;
+ event.count = 2;
+ for (int i = 0; i < length; i++) {
+ AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) listeners.elementAt(i);
+ listener.getText(event);
+ }
+ event.end = event.start;
+ event.start = start;
+ event.type = ACC.TEXT_BOUNDARY_ALL;
+ event.count = 0;
+ for (int i = 0; i < length; i++) {
+ AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) listeners.elementAt(i);
+ listener.getText(event);
+ }
+ }
+ break;
+ case ATK.ATK_TEXT_BOUNDARY_WORD_END:
+ case ATK.ATK_TEXT_BOUNDARY_SENTENCE_END:
+ case ATK.ATK_TEXT_BOUNDARY_LINE_END:
+ if (0 < event.start) {
+ int end = event.end;
+ event.start = eventStart;
+ event.end = eventEnd;
+ event.count = 0;
+ for (int i = 0; i < length; i++) {
+ AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) listeners.elementAt(i);
+ listener.getText(event);
+ }
+ event.start = event.end;
+ event.end = end;
+ event.type = ACC.TEXT_BOUNDARY_ALL;
+ event.count = 0;
+ for (int i = 0; i < length; i++) {
+ AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) listeners.elementAt(i);
+ listener.getText(event);
+ }
+ }
+ break;
+ }
OS.memmove (start_offset, new int[] {event.start}, 4);
OS.memmove (end_offset, new int[] {event.end}, 4);
return getStringPtr (event.result);
@@ -2463,6 +2512,7 @@ class AccessibleObject {
Vector listeners = accessible.accessibleTextExtendedListeners;
int length = listeners.size();
if (length > 0) {
+ int /*long*/ charCount = atkText_get_character_count (atkObject);
AccessibleTextEvent event = new AccessibleTextEvent(accessible);
event.start = event.end = (int)/*64*/offset_value;
event.count = 0;
@@ -2475,10 +2525,58 @@ class AccessibleObject {
case ATK.ATK_TEXT_BOUNDARY_LINE_START: event.type = ACC.TEXT_BOUNDARY_LINE; break;
case ATK.ATK_TEXT_BOUNDARY_LINE_END: event.type = ACC.TEXT_BOUNDARY_LINE; break;
}
+ int eventStart = event.start;
+ int eventEnd = event.end;
for (int i = 0; i < length; i++) {
AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) listeners.elementAt(i);
listener.getText(event);
}
+ switch ((int)/*64*/boundary_type) {
+ case ATK.ATK_TEXT_BOUNDARY_WORD_START:
+ case ATK.ATK_TEXT_BOUNDARY_SENTENCE_START:
+ case ATK.ATK_TEXT_BOUNDARY_LINE_START:
+ if (event.end < charCount) {
+ int start = event.start;
+ event.start = eventStart;
+ event.end = eventEnd;
+ event.count = 1;
+ for (int i = 0; i < length; i++) {
+ AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) listeners.elementAt(i);
+ listener.getText(event);
+ }
+ event.end = event.start;
+ event.start = start;
+ event.type = ACC.TEXT_BOUNDARY_ALL;
+ event.count = 0;
+ for (int i = 0; i < length; i++) {
+ AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) listeners.elementAt(i);
+ listener.getText(event);
+ }
+ }
+ break;
+ case ATK.ATK_TEXT_BOUNDARY_WORD_END:
+ case ATK.ATK_TEXT_BOUNDARY_SENTENCE_END:
+ case ATK.ATK_TEXT_BOUNDARY_LINE_END:
+ if (0 < event.start) {
+ int end = event.end;
+ event.start = eventStart;
+ event.end = eventEnd;
+ event.count = -1;
+ for (int i = 0; i < length; i++) {
+ AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) listeners.elementAt(i);
+ listener.getText(event);
+ }
+ event.start = event.end;
+ event.end = end;
+ event.type = ACC.TEXT_BOUNDARY_ALL;
+ event.count = 0;
+ for (int i = 0; i < length; i++) {
+ AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) listeners.elementAt(i);
+ listener.getText(event);
+ }
+ }
+ break;
+ }
OS.memmove (start_offset, new int[] {event.start}, 4);
OS.memmove (end_offset, new int[] {event.end}, 4);
return getStringPtr (event.result);
@@ -2605,6 +2703,7 @@ class AccessibleObject {
Vector listeners = accessible.accessibleTextExtendedListeners;
int length = listeners.size();
if (length > 0) {
+ int /*long*/ charCount = atkText_get_character_count (atkObject);
AccessibleTextEvent event = new AccessibleTextEvent(accessible);
event.start = event.end = (int)/*64*/offset_value;
event.count = -1;
@@ -2617,12 +2716,60 @@ class AccessibleObject {
case ATK.ATK_TEXT_BOUNDARY_LINE_START: event.type = ACC.TEXT_BOUNDARY_LINE; break;
case ATK.ATK_TEXT_BOUNDARY_LINE_END: event.type = ACC.TEXT_BOUNDARY_LINE; break;
}
+ int eventStart = event.start;
+ int eventEnd = event.end;
for (int i = 0; i < length; i++) {
AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) listeners.elementAt(i);
listener.getText(event);
}
OS.memmove (start_offset, new int[] {event.start}, 4);
OS.memmove (end_offset, new int[] {event.end}, 4);
+ switch ((int)/*64*/boundary_type) {
+ case ATK.ATK_TEXT_BOUNDARY_WORD_START:
+ case ATK.ATK_TEXT_BOUNDARY_SENTENCE_START:
+ case ATK.ATK_TEXT_BOUNDARY_LINE_START:
+ if (event.end < charCount) {
+ int start = event.start;
+ event.start = eventStart;
+ event.end = eventEnd;
+ event.count = 0;
+ for (int i = 0; i < length; i++) {
+ AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) listeners.elementAt(i);
+ listener.getText(event);
+ }
+ event.end = event.start;
+ event.start = start;
+ event.type = ACC.TEXT_BOUNDARY_ALL;
+ event.count = 0;
+ for (int i = 0; i < length; i++) {
+ AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) listeners.elementAt(i);
+ listener.getText(event);
+ }
+ }
+ break;
+ case ATK.ATK_TEXT_BOUNDARY_WORD_END:
+ case ATK.ATK_TEXT_BOUNDARY_SENTENCE_END:
+ case ATK.ATK_TEXT_BOUNDARY_LINE_END:
+ if (0 < event.start) {
+ int end = event.end;
+ event.start = eventStart;
+ event.end = eventEnd;
+ event.count = -2;
+ for (int i = 0; i < length; i++) {
+ AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) listeners.elementAt(i);
+ listener.getText(event);
+ }
+ event.start = event.end;
+ event.end = end;
+ event.type = ACC.TEXT_BOUNDARY_ALL;
+ event.count = 0;
+ for (int i = 0; i < length; i++) {
+ AccessibleTextExtendedListener listener = (AccessibleTextExtendedListener) listeners.elementAt(i);
+ listener.getText(event);
+ }
+ }
+ break;
+ }
return getStringPtr (event.result);
}
int offset = (int)/*64*/offset_value;