diff options
author | Silenio Quarti <silenio> | 2010-05-20 19:38:56 +0000 |
---|---|---|
committer | Silenio Quarti <silenio> | 2010-05-20 19:38:56 +0000 |
commit | fe5fa54e22f97eef927dafab577effaeba080c1d (patch) | |
tree | ea96c57e1e8a21b8851045578baf9f2baeda685d /bundles/org.eclipse.swt/Eclipse SWT Accessibility/gtk/org/eclipse/swt/accessibility/AccessibleObject.java | |
parent | 3aca5aa105cc29fd2171fa71f9b573ccd1cff2ea (diff) | |
download | eclipse.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.java | 147 |
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; |