1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 package org.openoffice.java.accessibility;
25 
26 import com.sun.star.uno.UnoRuntime;
27 import com.sun.star.accessibility.*;
28 
29 /**
30  */
31 public class TextComponent extends Component implements javax.accessibility.Accessible {
32 
TextComponent(XAccessible xAccessible, XAccessibleContext xAccessibleContext)33     protected TextComponent(XAccessible xAccessible, XAccessibleContext xAccessibleContext) {
34         super(xAccessible, xAccessibleContext);
35     }
36 
37     protected class AccessibleTextComponentListener extends AccessibleUNOComponentListener {
38 
AccessibleTextComponentListener()39         protected AccessibleTextComponentListener() {
40             super();
41         }
42 
setComponentState(short state, boolean enable)43         protected void setComponentState(short state, boolean enable) {
44             switch (state) {
45                 case AccessibleStateType.EDITABLE:
46                     fireStatePropertyChange(javax.accessibility.AccessibleState.EDITABLE, enable);
47                     break;
48                 case AccessibleStateType.MULTI_LINE:
49                     fireStatePropertyChange(javax.accessibility.AccessibleState.MULTI_LINE, enable);
50                     break;
51                 case AccessibleStateType.SINGLE_LINE:
52                     break;
53                 default:
54                     super.setComponentState(state, enable);
55                     break;
56             }
57         }
58     }
59 
createEventListener()60     protected XAccessibleEventListener createEventListener() {
61         return new AccessibleTextComponentListener();
62     }
63 
64     /** Creates the AccessibleContext associated with this object */
createAccessibleContext()65     public javax.accessibility.AccessibleContext createAccessibleContext() {
66         return new AccessibleTextComponent();
67     }
68 
69     protected class AccessibleTextComponent extends AccessibleUNOComponent {
70 
71         /**
72         * Though the class is abstract, this should be called by all sub-classes
73         */
AccessibleTextComponent()74         protected AccessibleTextComponent() {
75             super();
76         }
77 
78         /*
79         * AccessibleContext
80         */
81 
82         /** Gets the role of this object */
getAccessibleRole()83         public javax.accessibility.AccessibleRole getAccessibleRole() {
84             return javax.accessibility.AccessibleRole.TEXT;
85         }
86 
87         /** Gets the AccessibleText associated with this object presenting text on the display */
getAccessibleText()88         public javax.accessibility.AccessibleText getAccessibleText() {
89 
90             if (disposed)
91                 return null;
92 
93             try {
94                 XAccessibleText unoAccessibleText = (XAccessibleText)
95                     UnoRuntime.queryInterface(XAccessibleText.class,unoAccessibleComponent);
96                 if (unoAccessibleText != null) {
97                     return new AccessibleTextImpl(unoAccessibleText);
98                 } else {
99                     return null;
100                 }
101             } catch (com.sun.star.uno.RuntimeException e) {
102                 return null;
103             }
104         }
105 
106         /** Gets the AccessibleEditableText associated with this object presenting text on the display */
getAccessibleEditableText()107         public javax.accessibility.AccessibleEditableText getAccessibleEditableText() {
108             try {
109                 XAccessibleEditableText unoAccessibleText = (XAccessibleEditableText)
110                     UnoRuntime.queryInterface(XAccessibleEditableText.class,unoAccessibleComponent);
111                 if (unoAccessibleText != null) {
112                     return new AccessibleEditableTextImpl(unoAccessibleText);
113                 } else {
114                     return null;
115                 }
116             } catch (com.sun.star.uno.RuntimeException e) {
117                 return null;
118             }
119         }
120 
121         /** Gets the AccessibleAction associated with this object that has a graphical representation */
getAccessibleAction()122         public javax.accessibility.AccessibleAction getAccessibleAction() {
123             try {
124                 XAccessibleAction unoAccessibleAction = (XAccessibleAction)
125                     UnoRuntime.queryInterface(XAccessibleAction.class, unoAccessibleComponent);
126                 return (unoAccessibleAction != null) ?
127                     new AccessibleActionImpl(unoAccessibleAction) : null;
128             } catch (com.sun.star.uno.RuntimeException e) {
129                 return null;
130             }
131         }
132 
133         /** Returns the relation set of this object */
getAccessibleRelationSet()134         public javax.accessibility.AccessibleRelationSet getAccessibleRelationSet() {
135             try {
136                 XAccessibleRelationSet unoAccessibleRelationSet =
137                     unoAccessible.getAccessibleContext().getAccessibleRelationSet();
138                 if (unoAccessibleRelationSet == null) {
139                     return super.getAccessibleRelationSet();
140                 }
141 
142                 javax.accessibility.AccessibleRelationSet relationSet = new javax.accessibility.AccessibleRelationSet();
143                 int count = unoAccessibleRelationSet.getRelationCount();
144                 for (int i = 0; i < count; i++) {
145                     AccessibleRelation unoAccessibleRelation = unoAccessibleRelationSet.getRelation(i);
146                     switch (unoAccessibleRelation.RelationType) {
147                         case AccessibleRelationType.CONTROLLED_BY:
148                             relationSet.add(new javax.accessibility.AccessibleRelation(
149                                 javax.accessibility.AccessibleRelation.CONTROLLED_BY,
150                                 getAccessibleComponents(unoAccessibleRelation.TargetSet)));
151                             break;
152                         case AccessibleRelationType.CONTROLLER_FOR:
153                             relationSet.add(new javax.accessibility.AccessibleRelation(
154                                 javax.accessibility.AccessibleRelation.CONTROLLER_FOR,
155                                 getAccessibleComponents(unoAccessibleRelation.TargetSet)));
156                             break;
157                         case AccessibleRelationType.LABELED_BY:
158                             relationSet.add(new javax.accessibility.AccessibleRelation(
159                                 javax.accessibility.AccessibleRelation.LABELED_BY,
160                                 getAccessibleComponents(unoAccessibleRelation.TargetSet)));
161                             break;
162                         case AccessibleRelationType.MEMBER_OF:
163                             relationSet.add(new javax.accessibility.AccessibleRelation(
164                                 javax.accessibility.AccessibleRelation.MEMBER_OF,
165                                 getAccessibleComponents(unoAccessibleRelation.TargetSet)));
166                             break;
167                         case AccessibleRelationType.CONTENT_FLOWS_TO:
168                             relationSet.add(new javax.accessibility.AccessibleRelation(
169                                 "flowsTo",
170                                 getAccessibleComponents(unoAccessibleRelation.TargetSet)));
171                             break;
172                         case AccessibleRelationType.CONTENT_FLOWS_FROM:
173                             relationSet.add(new javax.accessibility.AccessibleRelation(
174                                 "flowsFrom",
175                                 getAccessibleComponents(unoAccessibleRelation.TargetSet)));
176                             break;
177                         default:
178                             break;
179                     }
180                 }
181                 return relationSet;
182             } catch (com.sun.star.lang.IndexOutOfBoundsException e) {
183                 return super.getAccessibleRelationSet();
184             } catch (com.sun.star.uno.RuntimeException e) {
185                 return super.getAccessibleRelationSet();
186             }
187         }
188     }
189 }
190 
191