You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openoffice.apache.org by ms...@apache.org on 2019/01/31 12:21:22 UTC
svn commit: r1852588 [1/3] - in
/openoffice/trunk/main/accessibility/java/java_uno_accessbridge/src/main/java/org/openoffice/java/accessibility:
AccessibleTextImpl.java Component.java Container.java Paragraph.java
Author: mseidel
Date: Thu Jan 31 12:21:22 2019
New Revision: 1852588
URL: http://svn.apache.org/viewvc?rev=1852588&view=rev
Log:
Removed whitespace, fixed branding in comments (OOo -> AOO)
Modified:
openoffice/trunk/main/accessibility/java/java_uno_accessbridge/src/main/java/org/openoffice/java/accessibility/AccessibleTextImpl.java
openoffice/trunk/main/accessibility/java/java_uno_accessbridge/src/main/java/org/openoffice/java/accessibility/Component.java
openoffice/trunk/main/accessibility/java/java_uno_accessbridge/src/main/java/org/openoffice/java/accessibility/Container.java
openoffice/trunk/main/accessibility/java/java_uno_accessbridge/src/main/java/org/openoffice/java/accessibility/Paragraph.java
Modified: openoffice/trunk/main/accessibility/java/java_uno_accessbridge/src/main/java/org/openoffice/java/accessibility/AccessibleTextImpl.java
URL: http://svn.apache.org/viewvc/openoffice/trunk/main/accessibility/java/java_uno_accessbridge/src/main/java/org/openoffice/java/accessibility/AccessibleTextImpl.java?rev=1852588&r1=1852587&r2=1852588&view=diff
==============================================================================
--- openoffice/trunk/main/accessibility/java/java_uno_accessbridge/src/main/java/org/openoffice/java/accessibility/AccessibleTextImpl.java (original)
+++ openoffice/trunk/main/accessibility/java/java_uno_accessbridge/src/main/java/org/openoffice/java/accessibility/AccessibleTextImpl.java Thu Jan 31 12:21:22 2019
@@ -1,5 +1,5 @@
/**************************************************************
- *
+ *
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
@@ -7,19 +7,20 @@
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
- *
+ *
* http://www.apache.org/licenses/LICENSE-2.0
- *
+ *
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
- *
+ *
*************************************************************/
+
package org.openoffice.java.accessibility;
import com.sun.star.accessibility.*;
@@ -41,634 +42,634 @@ import javax.swing.text.StyleConstants;
* interface to the corresponding methods of the UNO XAccessibleEditableText interface.
*/
public class AccessibleTextImpl implements javax.accessibility.AccessibleText {
- final static double toPointFactor = 1 / ((7 / 10) + 34.5);
- final static String[] attributeList = {
- "ParaAdjust", "CharBackColor", "CharWeight", "ParaFirstLineIndent",
- "CharFontPitch", "CharHeight", "CharColor", "CharPosture",
- "ParaLeftMargin", "ParaLineSpacing", "ParaTopMargin", "ParaBottomMargin",
- "CharStrikeout", "CharEscapement", "ParaTabStops", "CharUnderline"
- };
-
- final static String[] localeAttributeList = {
- "CharLocale", "CharLocaleAsian", "CharLocaleComplex"
- };
-
- XAccessibleText unoObject;
- private javax.swing.text.TabSet tabSet = null;
- private javax.swing.text.TabStop[] tabStops = null;
- private static Type TextSegmentType = new Type(TextSegment.class);
- private static Type UnoLocaleType = new Type(com.sun.star.lang.Locale.class);
-
- /** Creates new GenericAccessibleEditableText object */
- public AccessibleTextImpl(XAccessibleText xAccessibleText) {
-
- if (Build.PRODUCT) {
- unoObject = xAccessibleText;
- } else {
- String property = System.getProperty("AccessBridgeLogging");
- if ((property != null) && (property.indexOf("text") != -1)) {
- unoObject = new XAccessibleTextLog(xAccessibleText);
- } else {
- unoObject = xAccessibleText;
- }
- }
- }
-
- public AccessibleTextImpl() {
- }
-
- public static javax.accessibility.AccessibleText get(com.sun.star.uno.XInterface unoObject) {
- try {
- XAccessibleText unoAccessibleText = (XAccessibleText)
- UnoRuntime.queryInterface(XAccessibleText.class, unoObject);
- if (unoAccessibleText != null) {
- return new AccessibleTextImpl(unoAccessibleText);
- }
- } catch (com.sun.star.uno.RuntimeException e) {
- }
- return null;
- }
-
- protected static Object convertTextSegment(Object any) {
- try {
- if (AnyConverter.isObject(any)) {
- TextSegment ts = (TextSegment)
- AnyConverter.toObject(TextSegmentType, any);
- if (ts != null) {
- // Since there is nothing like a "range" object in the JAA yet,
- // the Object[3] is a private negotiation with the JABG
- Object[] array = { new Integer(ts.SegmentStart),
- new Integer(ts.SegmentEnd), ts.SegmentText };
- return array;
- }
- }
- } catch (com.sun.star.lang.IllegalArgumentException e) {
- }
-
- return null;
- }
-
- /** Returns the locale object.
- *
- * Since switching the UI language only takes effect on the next
- * office start, UI elements can return a cached value here - given
- * that Java UNO initializes the default locale correctly, this is
- * the perfect place to grab this cached values.
- *
- * However, since there are more sophisticated components with
- * potentially more than one locale, we first check for the
- * CharLocale[Asian|Complex] property.
- */
-
- protected java.util.Locale getLocale(int index) {
- try {
- com.sun.star.beans.PropertyValue[] propertyValues =
- unoObject.getCharacterAttributes(index, localeAttributeList);
-
- if (null != propertyValues) {
- for (int i = 0; i < propertyValues.length; i++) {
- com.sun.star.lang.Locale unoLocale = (com.sun.star.lang.Locale)
- AnyConverter.toObject(UnoLocaleType, propertyValues[i]);
- if (unoLocale != null) {
- return new java.util.Locale(unoLocale.Language, unoLocale.Country);
- }
- }
- }
-
- return java.util.Locale.getDefault();
- } catch (com.sun.star.lang.IllegalArgumentException e) {
- return java.util.Locale.getDefault();
- } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
- return java.util.Locale.getDefault();
- }
- }
-
-
- /** Returns the string after a given index
- *
- * The Java word iterator has a different understanding of what
- * a word is than the word iterator used by OOo, so we use the
- * Java iterators to ensure maximal compatibility with Java.
- */
- public String getAfterIndex(int part, int index) {
- switch (part) {
- case AccessibleText.CHARACTER:
- try {
- String s = unoObject.getText();
- return s.substring(index+1, index+2);
- } catch (IndexOutOfBoundsException e) {
- return null;
- }
- case AccessibleText.WORD:
- try {
- String s = unoObject.getText();
- BreakIterator words = BreakIterator.getWordInstance(getLocale(index));
- words.setText(s);
- int start = words.following(index);
- if (start == BreakIterator.DONE || start >= s.length()) {
- return null;
- }
- int end = words.following(start);
- if (end == BreakIterator.DONE || end >= s.length()) {
- return null;
- }
- return s.substring(start, end);
- } catch (IllegalArgumentException e) {
- return null;
- } catch (IndexOutOfBoundsException e) {
- return null;
- }
- case AccessibleText.SENTENCE:
- try {
- String s = unoObject.getText();
- BreakIterator sentence =
- BreakIterator.getSentenceInstance(getLocale(index));
- sentence.setText(s);
- int start = sentence.following(index);
- if (start == BreakIterator.DONE || start >= s.length()) {
- return null;
- }
- int end = sentence.following(start);
- if (end == BreakIterator.DONE || end >= s.length()) {
- return null;
- }
- return s.substring(start, end);
- } catch (IllegalArgumentException e) {
- return null;
- } catch (IndexOutOfBoundsException e) {
- return null;
- }
- case 4:
- try {
- TextSegment ts = unoObject.getTextBehindIndex(index, AccessibleTextType.LINE);
- return ts.SegmentText;
- } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
- // Workaround for #104847#
- if (index > 0 && getCharCount() == index) {
- return getAfterIndex(part, index - 1);
- }
- return null;
- } catch (com.sun.star.lang.IllegalArgumentException e) {
- return null;
- }
- case 5:
- try {
- TextSegment ts = unoObject.getTextBehindIndex(index, AccessibleTextType.ATTRIBUTE_RUN);
- return ts.SegmentText;
- } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
- return null;
- } catch (com.sun.star.lang.IllegalArgumentException e) {
- return null;
- }
- default:
- return null;
- }
- }
-
- /** Returns the zero-based offset of the caret */
- public int getCaretPosition() {
- try {
- return unoObject.getCaretPosition();
- } catch (com.sun.star.uno.RuntimeException e) {
- return -1;
- }
- }
-
- /** Returns the start offset within the selected text */
- public int getSelectionStart() {
- try {
- int index = unoObject.getSelectionStart();
-
- if (index == -1) {
- index = getCaretPosition();
- }
-
- return index;
- } catch (com.sun.star.uno.RuntimeException e) {
- return -1;
- }
- }
-
- protected void setAttribute(javax.swing.text.MutableAttributeSet as,
- com.sun.star.beans.PropertyValue property) {
- try {
- // Map alignment attribute
- if (property.Name.equals("ParaAdjust")) {
- ParagraphAdjust adjust = null;
-
- if (property.Value instanceof ParagraphAdjust) {
- adjust = (ParagraphAdjust) property.Value;
- } else if (property.Value instanceof Any) {
- adjust = (ParagraphAdjust) AnyConverter.toObject(new Type(
- ParagraphAdjust.class), property.Value);
- } else {
- adjust = ParagraphAdjust.fromInt(AnyConverter.toInt(
- property.Value));
- }
-
- if (adjust != null) {
- if (adjust.equals(ParagraphAdjust.LEFT)) {
- StyleConstants.setAlignment(as,
- StyleConstants.ALIGN_LEFT);
- } else if (adjust.equals(ParagraphAdjust.RIGHT)) {
- StyleConstants.setAlignment(as,
- StyleConstants.ALIGN_RIGHT);
- } else if (adjust.equals(ParagraphAdjust.CENTER)) {
- StyleConstants.setAlignment(as,
- StyleConstants.ALIGN_CENTER);
- } else if (adjust.equals(ParagraphAdjust.BLOCK) ||
- adjust.equals(ParagraphAdjust.STRETCH)) {
- StyleConstants.setAlignment(as,
- StyleConstants.ALIGN_JUSTIFIED);
- }
- } else if (Build.DEBUG) {
- System.err.println(
- "Invalid property value for key ParaAdjust: " +
- property.Value.getClass().getName());
- }
-
- // Map background color
- } else if (property.Name.equals("CharBackColor")) {
- StyleConstants.setBackground(as,
- new java.awt.Color(AnyConverter.toInt(property.Value)));
-
- // FIXME: BidiLevel
- // Set bold attribute
- } else if (property.Name.equals("CharWeight")) {
- boolean isBold = AnyConverter.toFloat(property.Value) > 125;
- StyleConstants.setBold(as, isBold);
-
- // FIXME: Java 1.4 ComponentAttribute, ComponentElementName, ComposedTextAttribute
- // Set FirstLineIndent attribute
- } else if (property.Name.equals("ParaFirstLineIndent")) {
- StyleConstants.setFirstLineIndent(as,
- (float) (toPointFactor * AnyConverter.toInt(property.Value)));
-
- // Set font family attribute
- } else if (property.Name.equals("CharFontPitch")) {
- if (AnyConverter.toShort(property.Value) == 2) {
- StyleConstants.setFontFamily(as, "Proportional");
- }
-
- // Set font size attribute
- } else if (property.Name.equals("CharHeight")) {
- StyleConstants.setFontSize(as,
- (int) AnyConverter.toFloat(property.Value));
-
- // Map foreground color
- } else if (property.Name.equals("CharColor")) {
- StyleConstants.setForeground(as,
- new java.awt.Color(AnyConverter.toInt(property.Value)));
-
- // FIXME: IconAttribute, IconElementName
- // Set italic attribute
- } else if (property.Name.equals("CharPosture")) {
- FontSlant fs = null;
-
- if (property.Value instanceof FontSlant) {
- fs = (FontSlant) property.Value;
- } else if (property.Value instanceof Any) {
- fs = (FontSlant) AnyConverter.toObject(new Type(
- FontSlant.class), property.Value);
- }
-
- if (fs != null) {
- StyleConstants.setItalic(as, FontSlant.ITALIC.equals(fs));
- }
-
- // Set left indent attribute
- } else if (property.Name.equals("ParaLeftMargin")) {
- StyleConstants.setLeftIndent(as,
- (float) (toPointFactor * AnyConverter.toInt(property.Value)));
-
- // Set right indent attribute
- } else if (property.Name.equals("ParaRightMargin")) {
- StyleConstants.setRightIndent(as,
- (float) (toPointFactor * AnyConverter.toInt(property.Value)));
- }
- // Set line spacing attribute
- else if (property.Name.equals("ParaLineSpacing")) {
- LineSpacing ls = null;
-
- if (property.Value instanceof LineSpacing) {
- ls = (LineSpacing) property.Value;
- } else if (property.Value instanceof Any) {
- ls = (LineSpacing) AnyConverter.toObject(new Type(
- LineSpacing.class), property.Value);
- }
-
- if (ls != null) {
- StyleConstants.setLineSpacing(as,
- (float) (toPointFactor * ls.Height));
- }
- }
- // FIXME: Java 1.4 NameAttribute, Orientation, ResolveAttribute
- // Set space above attribute
- else if (property.Name.equals("ParaTopMargin")) {
- StyleConstants.setSpaceAbove(as,
- (float) (toPointFactor * AnyConverter.toInt(property.Value)));
- }
- // Set space below attribute
- else if (property.Name.equals("ParaBottomMargin")) {
- StyleConstants.setSpaceBelow(as,
- (float) (toPointFactor * AnyConverter.toInt(property.Value)));
-
- // Set strike through attribute
- } else if (property.Name.equals("CharStrikeout")) {
- boolean isStrikeThrough = (FontStrikeout.NONE != AnyConverter.toShort(property.Value));
- StyleConstants.setStrikeThrough(as, isStrikeThrough);
-
- // Set sub-/superscript attribute
- } else if (property.Name.equals("CharEscapement")) {
- short value = AnyConverter.toShort(property.Value);
-
- if (value > 0) {
- StyleConstants.setSuperscript(as, true);
- } else if (value < 0) {
- StyleConstants.setSubscript(as, true);
- }
-
- // Set tabset attribute
- } else if (property.Name.equals("ParaTabStops")) {
- TabStop[] unoTabStops = (TabStop[]) AnyConverter.toArray(property.Value);
- javax.swing.text.TabStop[] tabStops = new javax.swing.text.TabStop[unoTabStops.length];
-
- for (int index2 = 0; index2 < unoTabStops.length; index2++) {
- float pos = (float) (toPointFactor * unoTabStops[index2].Position);
-
- if (unoTabStops[index2].Alignment.equals(TabAlign.LEFT)) {
- tabStops[index2] = new javax.swing.text.TabStop(pos,
- javax.swing.text.TabStop.ALIGN_LEFT,
- javax.swing.text.TabStop.LEAD_NONE);
- } else if (unoTabStops[index2].Alignment.equals(
- TabAlign.CENTER)) {
- tabStops[index2] = new javax.swing.text.TabStop(pos,
- javax.swing.text.TabStop.ALIGN_CENTER,
- javax.swing.text.TabStop.LEAD_NONE);
- } else if (unoTabStops[index2].Alignment.equals(
- TabAlign.RIGHT)) {
- tabStops[index2] = new javax.swing.text.TabStop(pos,
- javax.swing.text.TabStop.ALIGN_RIGHT,
- javax.swing.text.TabStop.LEAD_NONE);
- } else if (unoTabStops[index2].Alignment.equals(
- TabAlign.DECIMAL)) {
- tabStops[index2] = new javax.swing.text.TabStop(pos,
- javax.swing.text.TabStop.ALIGN_DECIMAL,
- javax.swing.text.TabStop.LEAD_NONE);
- } else {
- tabStops[index2] = new javax.swing.text.TabStop(pos);
- }
- }
-
- // Re-use tabSet object if possible to make AttributeSet.equals work
- if ((this.tabSet == null) ||
- !java.util.Arrays.equals(tabStops, this.tabStops)) {
- this.tabStops = tabStops;
- this.tabSet = new javax.swing.text.TabSet(tabStops);
- }
-
- StyleConstants.setTabSet(as, this.tabSet);
-
- // Set underline attribute
- } else if (property.Name.equals("CharUnderline")) {
- boolean isUnderline = (FontUnderline.NONE != AnyConverter.toShort(property.Value));
- StyleConstants.setUnderline(as, isUnderline);
- }
- } catch (com.sun.star.lang.IllegalArgumentException e) {
- if (Build.DEBUG) {
- System.err.println("*** ERROR *** " + e.getClass().getName() +
- " caught for property " + property.Name + ": " +
- e.getMessage());
- System.err.println(" value is of type " +
- property.Value.getClass().getName());
- }
- }
- }
-
- /** Returns the AttributSet for a given character at a given index */
- public javax.swing.text.AttributeSet getCharacterAttribute(int index) {
- try {
- com.sun.star.beans.PropertyValue[] propertyValues = unoObject.getCharacterAttributes(index,
- attributeList);
- javax.swing.text.SimpleAttributeSet attributeSet = new javax.swing.text.SimpleAttributeSet();
-
- if (null != propertyValues) {
- for (int i = 0; i < propertyValues.length; i++) {
- setAttribute(attributeSet, propertyValues[i]);
- }
- }
-
- return attributeSet;
- } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
- if ((index > 0) && (getCharCount() == index)) {
- return getCharacterAttribute(index - 1);
- }
- return null;
- }
- }
-
- /** Given a point in local coordinates, return the zero-based index of the character under that point */
- public int getIndexAtPoint(java.awt.Point point) {
- try {
- return unoObject.getIndexAtPoint(new Point(point.x, point.y));
- } catch (com.sun.star.uno.RuntimeException e) {
- return -1;
- }
- }
-
- /** Returns the end offset within the selected text */
- public int getSelectionEnd() {
- try {
- int index = unoObject.getSelectionEnd();
-
- if (index == -1) {
- index = getCaretPosition();
- }
-
- return index;
- } catch (com.sun.star.uno.RuntimeException e) {
- return -1;
- }
- }
-
- /** Returns the string before a given index
- *
- * The Java word iterator has a different understanding of what
- * a word is than the word iterator used by OOo, so we use the
- * Java iterators to ensure maximal compatibility with Java.
- */
- public java.lang.String getBeforeIndex(int part, int index) {
- switch (part) {
- case AccessibleText.CHARACTER:
- try {
- String s = unoObject.getText();
- return s.substring(index-1, index);
- } catch (IndexOutOfBoundsException e) {
- return null;
- }
- case AccessibleText.WORD:
- try {
- String s = unoObject.getText();
- BreakIterator words = BreakIterator.getWordInstance(getLocale(index));
- words.setText(s);
- int end = words.following(index);
- end = words.previous();
- int start = words.previous();
- if (start == BreakIterator.DONE) {
- return null;
- }
- return s.substring(start, end);
- } catch (IllegalArgumentException e) {
- return null;
- } catch (IndexOutOfBoundsException e) {
- return null;
- }
- case AccessibleText.SENTENCE:
- try {
- String s = unoObject.getText();
- BreakIterator sentence =
- BreakIterator.getSentenceInstance(getLocale(index));
- sentence.setText(s);
- int end = sentence.following(index);
- end = sentence.previous();
- int start = sentence.previous();
- if (start == BreakIterator.DONE) {
- return null;
- }
- return s.substring(start, end);
- } catch (IllegalArgumentException e) {
- return null;
- } catch (IndexOutOfBoundsException e) {
- return null;
- }
- case 4:
- try {
- TextSegment ts = unoObject.getTextBeforeIndex(index, AccessibleTextType.LINE);
- return ts.SegmentText;
- } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
- // Workaround for #104847#
- if (index > 0 && getCharCount() == index) {
- return getBeforeIndex(part, index - 1);
- }
- return null;
- } catch (com.sun.star.lang.IllegalArgumentException e) {
- return null;
- }
- case 5:
- try {
- TextSegment ts = unoObject.getTextBeforeIndex(index, AccessibleTextType.ATTRIBUTE_RUN);
- return ts.SegmentText;
- } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
- return null;
- } catch (com.sun.star.lang.IllegalArgumentException e) {
- return null;
- }
- default:
- return null;
- }
- }
-
-
- /** Returns the string at a given index
- *
- * The Java word iterator has a different understanding of what
- * a word is than the word iterator used by OOo, so we use the
- * Java iterators to ensure maximal compatibility with Java.
- */
- public java.lang.String getAtIndex(int part, int index) {
- switch (part) {
- case AccessibleText.CHARACTER:
- try {
- String s = unoObject.getText();
- return s.substring(index, index + 1);
- } catch (IndexOutOfBoundsException e) {
- return null;
- }
- case AccessibleText.WORD:
- try {
- String s = unoObject.getText();
- BreakIterator words = BreakIterator.getWordInstance(getLocale(index));
- words.setText(s);
- int end = words.following(index);
- return s.substring(words.previous(), end);
- } catch (IllegalArgumentException e) {
- return null;
- } catch (IndexOutOfBoundsException e) {
- return null;
- }
- case AccessibleText.SENTENCE:
- try {
- String s = unoObject.getText();
- BreakIterator sentence =
- BreakIterator.getSentenceInstance(getLocale(index));
- sentence.setText(s);
- int end = sentence.following(index);
- return s.substring(sentence.previous(), end);
- } catch (IllegalArgumentException e) {
- return null;
- } catch (IndexOutOfBoundsException e) {
- return null;
- }
- case 4:
- try {
- TextSegment ts = unoObject.getTextAtIndex(index, AccessibleTextType.LINE);
- return ts.SegmentText;
- } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
- // Workaround for #104847#
- if (index > 0 && getCharCount() == index) {
- return getAtIndex(part, index - 1);
- }
- return null;
- } catch (com.sun.star.lang.IllegalArgumentException e) {
- return null;
- }
- case 5:
- try {
- TextSegment ts = unoObject.getTextAtIndex(index, AccessibleTextType.ATTRIBUTE_RUN);
- return ts.SegmentText;
- } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
- return null;
- } catch (com.sun.star.lang.IllegalArgumentException e) {
- return null;
- }
-
- default:
- return null;
- }
- }
-
- /** Returns the number of characters (valid indices) */
- public int getCharCount() {
- try {
- return unoObject.getCharacterCount();
- } catch (com.sun.star.uno.RuntimeException e) {
- }
-
- return 0;
- }
-
- /** Returns the portion of the text that is selected */
- public java.lang.String getSelectedText() {
- try {
- return unoObject.getSelectedText();
- } catch (com.sun.star.uno.RuntimeException e) {
- }
-
- return null;
- }
-
- /** Determines the bounding box of the character at the given index into the string */
- public java.awt.Rectangle getCharacterBounds(int index) {
- try {
- Rectangle unoRect = unoObject.getCharacterBounds(index);
- return new java.awt.Rectangle(unoRect.X, unoRect.Y, unoRect.Width, unoRect.Height);
- } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
- if ((index > 0) && (getCharCount() == index)) {
- return getCharacterBounds(index - 1);
- }
- } catch (com.sun.star.uno.RuntimeException e) {
- }
+ final static double toPointFactor = 1 / ((7 / 10) + 34.5);
+ final static String[] attributeList = {
+ "ParaAdjust", "CharBackColor", "CharWeight", "ParaFirstLineIndent",
+ "CharFontPitch", "CharHeight", "CharColor", "CharPosture",
+ "ParaLeftMargin", "ParaLineSpacing", "ParaTopMargin", "ParaBottomMargin",
+ "CharStrikeout", "CharEscapement", "ParaTabStops", "CharUnderline"
+ };
+
+ final static String[] localeAttributeList = {
+ "CharLocale", "CharLocaleAsian", "CharLocaleComplex"
+ };
+
+ XAccessibleText unoObject;
+ private javax.swing.text.TabSet tabSet = null;
+ private javax.swing.text.TabStop[] tabStops = null;
+ private static Type TextSegmentType = new Type(TextSegment.class);
+ private static Type UnoLocaleType = new Type(com.sun.star.lang.Locale.class);
+
+ /** Creates new GenericAccessibleEditableText object */
+ public AccessibleTextImpl(XAccessibleText xAccessibleText) {
+
+ if (Build.PRODUCT) {
+ unoObject = xAccessibleText;
+ } else {
+ String property = System.getProperty("AccessBridgeLogging");
+ if ((property != null) && (property.indexOf("text") != -1)) {
+ unoObject = new XAccessibleTextLog(xAccessibleText);
+ } else {
+ unoObject = xAccessibleText;
+ }
+ }
+ }
+
+ public AccessibleTextImpl() {
+ }
+
+ public static javax.accessibility.AccessibleText get(com.sun.star.uno.XInterface unoObject) {
+ try {
+ XAccessibleText unoAccessibleText = (XAccessibleText)
+ UnoRuntime.queryInterface(XAccessibleText.class, unoObject);
+ if (unoAccessibleText != null) {
+ return new AccessibleTextImpl(unoAccessibleText);
+ }
+ } catch (com.sun.star.uno.RuntimeException e) {
+ }
+ return null;
+ }
+
+ protected static Object convertTextSegment(Object any) {
+ try {
+ if (AnyConverter.isObject(any)) {
+ TextSegment ts = (TextSegment)
+ AnyConverter.toObject(TextSegmentType, any);
+ if (ts != null) {
+ // Since there is nothing like a "range" object in the JAA yet,
+ // the Object[3] is a private negotiation with the JABG
+ Object[] array = { new Integer(ts.SegmentStart),
+ new Integer(ts.SegmentEnd), ts.SegmentText };
+ return array;
+ }
+ }
+ } catch (com.sun.star.lang.IllegalArgumentException e) {
+ }
+
+ return null;
+ }
+
+ /** Returns the locale object.
+ *
+ * Since switching the UI language only takes effect on the next
+ * office start, UI elements can return a cached value here - given
+ * that Java UNO initializes the default locale correctly, this is
+ * the perfect place to grab this cached values.
+ *
+ * However, since there are more sophisticated components with
+ * potentially more than one locale, we first check for the
+ * CharLocale[Asian|Complex] property.
+ */
+
+ protected java.util.Locale getLocale(int index) {
+ try {
+ com.sun.star.beans.PropertyValue[] propertyValues =
+ unoObject.getCharacterAttributes(index, localeAttributeList);
+
+ if (null != propertyValues) {
+ for (int i = 0; i < propertyValues.length; i++) {
+ com.sun.star.lang.Locale unoLocale = (com.sun.star.lang.Locale)
+ AnyConverter.toObject(UnoLocaleType, propertyValues[i]);
+ if (unoLocale != null) {
+ return new java.util.Locale(unoLocale.Language, unoLocale.Country);
+ }
+ }
+ }
+
+ return java.util.Locale.getDefault();
+ } catch (com.sun.star.lang.IllegalArgumentException e) {
+ return java.util.Locale.getDefault();
+ } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
+ return java.util.Locale.getDefault();
+ }
+ }
+
+
+ /** Returns the string after a given index
+ *
+ * The Java word iterator has a different understanding of what
+ * a word is than the word iterator used by AOO, so we use the
+ * Java iterators to ensure maximal compatibility with Java.
+ */
+ public String getAfterIndex(int part, int index) {
+ switch (part) {
+ case AccessibleText.CHARACTER:
+ try {
+ String s = unoObject.getText();
+ return s.substring(index+1, index+2);
+ } catch (IndexOutOfBoundsException e) {
+ return null;
+ }
+ case AccessibleText.WORD:
+ try {
+ String s = unoObject.getText();
+ BreakIterator words = BreakIterator.getWordInstance(getLocale(index));
+ words.setText(s);
+ int start = words.following(index);
+ if (start == BreakIterator.DONE || start >= s.length()) {
+ return null;
+ }
+ int end = words.following(start);
+ if (end == BreakIterator.DONE || end >= s.length()) {
+ return null;
+ }
+ return s.substring(start, end);
+ } catch (IllegalArgumentException e) {
+ return null;
+ } catch (IndexOutOfBoundsException e) {
+ return null;
+ }
+ case AccessibleText.SENTENCE:
+ try {
+ String s = unoObject.getText();
+ BreakIterator sentence =
+ BreakIterator.getSentenceInstance(getLocale(index));
+ sentence.setText(s);
+ int start = sentence.following(index);
+ if (start == BreakIterator.DONE || start >= s.length()) {
+ return null;
+ }
+ int end = sentence.following(start);
+ if (end == BreakIterator.DONE || end >= s.length()) {
+ return null;
+ }
+ return s.substring(start, end);
+ } catch (IllegalArgumentException e) {
+ return null;
+ } catch (IndexOutOfBoundsException e) {
+ return null;
+ }
+ case 4:
+ try {
+ TextSegment ts = unoObject.getTextBehindIndex(index, AccessibleTextType.LINE);
+ return ts.SegmentText;
+ } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
+ // Workaround for #104847#
+ if (index > 0 && getCharCount() == index) {
+ return getAfterIndex(part, index - 1);
+ }
+ return null;
+ } catch (com.sun.star.lang.IllegalArgumentException e) {
+ return null;
+ }
+ case 5:
+ try {
+ TextSegment ts = unoObject.getTextBehindIndex(index, AccessibleTextType.ATTRIBUTE_RUN);
+ return ts.SegmentText;
+ } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
+ return null;
+ } catch (com.sun.star.lang.IllegalArgumentException e) {
+ return null;
+ }
+ default:
+ return null;
+ }
+ }
+
+ /** Returns the zero-based offset of the caret */
+ public int getCaretPosition() {
+ try {
+ return unoObject.getCaretPosition();
+ } catch (com.sun.star.uno.RuntimeException e) {
+ return -1;
+ }
+ }
+
+ /** Returns the start offset within the selected text */
+ public int getSelectionStart() {
+ try {
+ int index = unoObject.getSelectionStart();
+
+ if (index == -1) {
+ index = getCaretPosition();
+ }
+
+ return index;
+ } catch (com.sun.star.uno.RuntimeException e) {
+ return -1;
+ }
+ }
+
+ protected void setAttribute(javax.swing.text.MutableAttributeSet as,
+ com.sun.star.beans.PropertyValue property) {
+ try {
+ // Map alignment attribute
+ if (property.Name.equals("ParaAdjust")) {
+ ParagraphAdjust adjust = null;
+
+ if (property.Value instanceof ParagraphAdjust) {
+ adjust = (ParagraphAdjust) property.Value;
+ } else if (property.Value instanceof Any) {
+ adjust = (ParagraphAdjust) AnyConverter.toObject(new Type(
+ ParagraphAdjust.class), property.Value);
+ } else {
+ adjust = ParagraphAdjust.fromInt(AnyConverter.toInt(
+ property.Value));
+ }
+
+ if (adjust != null) {
+ if (adjust.equals(ParagraphAdjust.LEFT)) {
+ StyleConstants.setAlignment(as,
+ StyleConstants.ALIGN_LEFT);
+ } else if (adjust.equals(ParagraphAdjust.RIGHT)) {
+ StyleConstants.setAlignment(as,
+ StyleConstants.ALIGN_RIGHT);
+ } else if (adjust.equals(ParagraphAdjust.CENTER)) {
+ StyleConstants.setAlignment(as,
+ StyleConstants.ALIGN_CENTER);
+ } else if (adjust.equals(ParagraphAdjust.BLOCK) ||
+ adjust.equals(ParagraphAdjust.STRETCH)) {
+ StyleConstants.setAlignment(as,
+ StyleConstants.ALIGN_JUSTIFIED);
+ }
+ } else if (Build.DEBUG) {
+ System.err.println(
+ "Invalid property value for key ParaAdjust: " +
+ property.Value.getClass().getName());
+ }
+
+ // Map background color
+ } else if (property.Name.equals("CharBackColor")) {
+ StyleConstants.setBackground(as,
+ new java.awt.Color(AnyConverter.toInt(property.Value)));
+
+ // FIXME: BidiLevel
+ // Set bold attribute
+ } else if (property.Name.equals("CharWeight")) {
+ boolean isBold = AnyConverter.toFloat(property.Value) > 125;
+ StyleConstants.setBold(as, isBold);
+
+ // FIXME: Java 1.4 ComponentAttribute, ComponentElementName, ComposedTextAttribute
+ // Set FirstLineIndent attribute
+ } else if (property.Name.equals("ParaFirstLineIndent")) {
+ StyleConstants.setFirstLineIndent(as,
+ (float) (toPointFactor * AnyConverter.toInt(property.Value)));
+
+ // Set font family attribute
+ } else if (property.Name.equals("CharFontPitch")) {
+ if (AnyConverter.toShort(property.Value) == 2) {
+ StyleConstants.setFontFamily(as, "Proportional");
+ }
+
+ // Set font size attribute
+ } else if (property.Name.equals("CharHeight")) {
+ StyleConstants.setFontSize(as,
+ (int) AnyConverter.toFloat(property.Value));
+
+ // Map foreground color
+ } else if (property.Name.equals("CharColor")) {
+ StyleConstants.setForeground(as,
+ new java.awt.Color(AnyConverter.toInt(property.Value)));
+
+ // FIXME: IconAttribute, IconElementName
+ // Set italic attribute
+ } else if (property.Name.equals("CharPosture")) {
+ FontSlant fs = null;
+
+ if (property.Value instanceof FontSlant) {
+ fs = (FontSlant) property.Value;
+ } else if (property.Value instanceof Any) {
+ fs = (FontSlant) AnyConverter.toObject(new Type(
+ FontSlant.class), property.Value);
+ }
+
+ if (fs != null) {
+ StyleConstants.setItalic(as, FontSlant.ITALIC.equals(fs));
+ }
+
+ // Set left indent attribute
+ } else if (property.Name.equals("ParaLeftMargin")) {
+ StyleConstants.setLeftIndent(as,
+ (float) (toPointFactor * AnyConverter.toInt(property.Value)));
+
+ // Set right indent attribute
+ } else if (property.Name.equals("ParaRightMargin")) {
+ StyleConstants.setRightIndent(as,
+ (float) (toPointFactor * AnyConverter.toInt(property.Value)));
+ }
+ // Set line spacing attribute
+ else if (property.Name.equals("ParaLineSpacing")) {
+ LineSpacing ls = null;
+
+ if (property.Value instanceof LineSpacing) {
+ ls = (LineSpacing) property.Value;
+ } else if (property.Value instanceof Any) {
+ ls = (LineSpacing) AnyConverter.toObject(new Type(
+ LineSpacing.class), property.Value);
+ }
+
+ if (ls != null) {
+ StyleConstants.setLineSpacing(as,
+ (float) (toPointFactor * ls.Height));
+ }
+ }
+ // FIXME: Java 1.4 NameAttribute, Orientation, ResolveAttribute
+ // Set space above attribute
+ else if (property.Name.equals("ParaTopMargin")) {
+ StyleConstants.setSpaceAbove(as,
+ (float) (toPointFactor * AnyConverter.toInt(property.Value)));
+ }
+ // Set space below attribute
+ else if (property.Name.equals("ParaBottomMargin")) {
+ StyleConstants.setSpaceBelow(as,
+ (float) (toPointFactor * AnyConverter.toInt(property.Value)));
+
+ // Set strike through attribute
+ } else if (property.Name.equals("CharStrikeout")) {
+ boolean isStrikeThrough = (FontStrikeout.NONE != AnyConverter.toShort(property.Value));
+ StyleConstants.setStrikeThrough(as, isStrikeThrough);
+
+ // Set sub-/superscript attribute
+ } else if (property.Name.equals("CharEscapement")) {
+ short value = AnyConverter.toShort(property.Value);
+
+ if (value > 0) {
+ StyleConstants.setSuperscript(as, true);
+ } else if (value < 0) {
+ StyleConstants.setSubscript(as, true);
+ }
+
+ // Set tabset attribute
+ } else if (property.Name.equals("ParaTabStops")) {
+ TabStop[] unoTabStops = (TabStop[]) AnyConverter.toArray(property.Value);
+ javax.swing.text.TabStop[] tabStops = new javax.swing.text.TabStop[unoTabStops.length];
+
+ for (int index2 = 0; index2 < unoTabStops.length; index2++) {
+ float pos = (float) (toPointFactor * unoTabStops[index2].Position);
+
+ if (unoTabStops[index2].Alignment.equals(TabAlign.LEFT)) {
+ tabStops[index2] = new javax.swing.text.TabStop(pos,
+ javax.swing.text.TabStop.ALIGN_LEFT,
+ javax.swing.text.TabStop.LEAD_NONE);
+ } else if (unoTabStops[index2].Alignment.equals(
+ TabAlign.CENTER)) {
+ tabStops[index2] = new javax.swing.text.TabStop(pos,
+ javax.swing.text.TabStop.ALIGN_CENTER,
+ javax.swing.text.TabStop.LEAD_NONE);
+ } else if (unoTabStops[index2].Alignment.equals(
+ TabAlign.RIGHT)) {
+ tabStops[index2] = new javax.swing.text.TabStop(pos,
+ javax.swing.text.TabStop.ALIGN_RIGHT,
+ javax.swing.text.TabStop.LEAD_NONE);
+ } else if (unoTabStops[index2].Alignment.equals(
+ TabAlign.DECIMAL)) {
+ tabStops[index2] = new javax.swing.text.TabStop(pos,
+ javax.swing.text.TabStop.ALIGN_DECIMAL,
+ javax.swing.text.TabStop.LEAD_NONE);
+ } else {
+ tabStops[index2] = new javax.swing.text.TabStop(pos);
+ }
+ }
+
+ // Re-use tabSet object if possible to make AttributeSet.equals work
+ if ((this.tabSet == null) ||
+ !java.util.Arrays.equals(tabStops, this.tabStops)) {
+ this.tabStops = tabStops;
+ this.tabSet = new javax.swing.text.TabSet(tabStops);
+ }
+
+ StyleConstants.setTabSet(as, this.tabSet);
+
+ // Set underline attribute
+ } else if (property.Name.equals("CharUnderline")) {
+ boolean isUnderline = (FontUnderline.NONE != AnyConverter.toShort(property.Value));
+ StyleConstants.setUnderline(as, isUnderline);
+ }
+ } catch (com.sun.star.lang.IllegalArgumentException e) {
+ if (Build.DEBUG) {
+ System.err.println("*** ERROR *** " + e.getClass().getName() +
+ " caught for property " + property.Name + ": " +
+ e.getMessage());
+ System.err.println(" value is of type " +
+ property.Value.getClass().getName());
+ }
+ }
+ }
+
+ /** Returns the AttributSet for a given character at a given index */
+ public javax.swing.text.AttributeSet getCharacterAttribute(int index) {
+ try {
+ com.sun.star.beans.PropertyValue[] propertyValues = unoObject.getCharacterAttributes(index,
+ attributeList);
+ javax.swing.text.SimpleAttributeSet attributeSet = new javax.swing.text.SimpleAttributeSet();
+
+ if (null != propertyValues) {
+ for (int i = 0; i < propertyValues.length; i++) {
+ setAttribute(attributeSet, propertyValues[i]);
+ }
+ }
+
+ return attributeSet;
+ } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
+ if ((index > 0) && (getCharCount() == index)) {
+ return getCharacterAttribute(index - 1);
+ }
+ return null;
+ }
+ }
+
+ /** Given a point in local coordinates, return the zero-based index of the character under that point */
+ public int getIndexAtPoint(java.awt.Point point) {
+ try {
+ return unoObject.getIndexAtPoint(new Point(point.x, point.y));
+ } catch (com.sun.star.uno.RuntimeException e) {
+ return -1;
+ }
+ }
+
+ /** Returns the end offset within the selected text */
+ public int getSelectionEnd() {
+ try {
+ int index = unoObject.getSelectionEnd();
+
+ if (index == -1) {
+ index = getCaretPosition();
+ }
+
+ return index;
+ } catch (com.sun.star.uno.RuntimeException e) {
+ return -1;
+ }
+ }
+
+ /** Returns the string before a given index
+ *
+ * The Java word iterator has a different understanding of what
+ * a word is than the word iterator used by AOO, so we use the
+ * Java iterators to ensure maximal compatibility with Java.
+ */
+ public java.lang.String getBeforeIndex(int part, int index) {
+ switch (part) {
+ case AccessibleText.CHARACTER:
+ try {
+ String s = unoObject.getText();
+ return s.substring(index-1, index);
+ } catch (IndexOutOfBoundsException e) {
+ return null;
+ }
+ case AccessibleText.WORD:
+ try {
+ String s = unoObject.getText();
+ BreakIterator words = BreakIterator.getWordInstance(getLocale(index));
+ words.setText(s);
+ int end = words.following(index);
+ end = words.previous();
+ int start = words.previous();
+ if (start == BreakIterator.DONE) {
+ return null;
+ }
+ return s.substring(start, end);
+ } catch (IllegalArgumentException e) {
+ return null;
+ } catch (IndexOutOfBoundsException e) {
+ return null;
+ }
+ case AccessibleText.SENTENCE:
+ try {
+ String s = unoObject.getText();
+ BreakIterator sentence =
+ BreakIterator.getSentenceInstance(getLocale(index));
+ sentence.setText(s);
+ int end = sentence.following(index);
+ end = sentence.previous();
+ int start = sentence.previous();
+ if (start == BreakIterator.DONE) {
+ return null;
+ }
+ return s.substring(start, end);
+ } catch (IllegalArgumentException e) {
+ return null;
+ } catch (IndexOutOfBoundsException e) {
+ return null;
+ }
+ case 4:
+ try {
+ TextSegment ts = unoObject.getTextBeforeIndex(index, AccessibleTextType.LINE);
+ return ts.SegmentText;
+ } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
+ // Workaround for #104847#
+ if (index > 0 && getCharCount() == index) {
+ return getBeforeIndex(part, index - 1);
+ }
+ return null;
+ } catch (com.sun.star.lang.IllegalArgumentException e) {
+ return null;
+ }
+ case 5:
+ try {
+ TextSegment ts = unoObject.getTextBeforeIndex(index, AccessibleTextType.ATTRIBUTE_RUN);
+ return ts.SegmentText;
+ } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
+ return null;
+ } catch (com.sun.star.lang.IllegalArgumentException e) {
+ return null;
+ }
+ default:
+ return null;
+ }
+ }
+
+
+ /** Returns the string at a given index
+ *
+ * The Java word iterator has a different understanding of what
+ * a word is than the word iterator used by AOO, so we use the
+ * Java iterators to ensure maximal compatibility with Java.
+ */
+ public java.lang.String getAtIndex(int part, int index) {
+ switch (part) {
+ case AccessibleText.CHARACTER:
+ try {
+ String s = unoObject.getText();
+ return s.substring(index, index + 1);
+ } catch (IndexOutOfBoundsException e) {
+ return null;
+ }
+ case AccessibleText.WORD:
+ try {
+ String s = unoObject.getText();
+ BreakIterator words = BreakIterator.getWordInstance(getLocale(index));
+ words.setText(s);
+ int end = words.following(index);
+ return s.substring(words.previous(), end);
+ } catch (IllegalArgumentException e) {
+ return null;
+ } catch (IndexOutOfBoundsException e) {
+ return null;
+ }
+ case AccessibleText.SENTENCE:
+ try {
+ String s = unoObject.getText();
+ BreakIterator sentence =
+ BreakIterator.getSentenceInstance(getLocale(index));
+ sentence.setText(s);
+ int end = sentence.following(index);
+ return s.substring(sentence.previous(), end);
+ } catch (IllegalArgumentException e) {
+ return null;
+ } catch (IndexOutOfBoundsException e) {
+ return null;
+ }
+ case 4:
+ try {
+ TextSegment ts = unoObject.getTextAtIndex(index, AccessibleTextType.LINE);
+ return ts.SegmentText;
+ } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
+ // Workaround for #104847#
+ if (index > 0 && getCharCount() == index) {
+ return getAtIndex(part, index - 1);
+ }
+ return null;
+ } catch (com.sun.star.lang.IllegalArgumentException e) {
+ return null;
+ }
+ case 5:
+ try {
+ TextSegment ts = unoObject.getTextAtIndex(index, AccessibleTextType.ATTRIBUTE_RUN);
+ return ts.SegmentText;
+ } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
+ return null;
+ } catch (com.sun.star.lang.IllegalArgumentException e) {
+ return null;
+ }
+
+ default:
+ return null;
+ }
+ }
+
+ /** Returns the number of characters (valid indices) */
+ public int getCharCount() {
+ try {
+ return unoObject.getCharacterCount();
+ } catch (com.sun.star.uno.RuntimeException e) {
+ }
+
+ return 0;
+ }
+
+ /** Returns the portion of the text that is selected */
+ public java.lang.String getSelectedText() {
+ try {
+ return unoObject.getSelectedText();
+ } catch (com.sun.star.uno.RuntimeException e) {
+ }
+
+ return null;
+ }
+
+ /** Determines the bounding box of the character at the given index into the string */
+ public java.awt.Rectangle getCharacterBounds(int index) {
+ try {
+ Rectangle unoRect = unoObject.getCharacterBounds(index);
+ return new java.awt.Rectangle(unoRect.X, unoRect.Y, unoRect.Width, unoRect.Height);
+ } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
+ if ((index > 0) && (getCharCount() == index)) {
+ return getCharacterBounds(index - 1);
+ }
+ } catch (com.sun.star.uno.RuntimeException e) {
+ }
- return new java.awt.Rectangle();
- }
+ return new java.awt.Rectangle();
+ }
}