1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski import com.sun.star.uno.UnoRuntime;
23*b1cdbd2cSJim Jagielski import com.sun.star.accessibility.XAccessible;
24*b1cdbd2cSJim Jagielski import com.sun.star.accessibility.XAccessibleContext;
25*b1cdbd2cSJim Jagielski import com.sun.star.accessibility.XAccessibleSelection;
26*b1cdbd2cSJim Jagielski import com.sun.star.lang.IndexOutOfBoundsException;
27*b1cdbd2cSJim Jagielski 
28*b1cdbd2cSJim Jagielski import javax.swing.*;
29*b1cdbd2cSJim Jagielski import java.awt.*;
30*b1cdbd2cSJim Jagielski import java.util.Vector;
31*b1cdbd2cSJim Jagielski import java.awt.event.ActionListener;
32*b1cdbd2cSJim Jagielski import java.awt.event.ActionEvent;
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski 
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski /**
38*b1cdbd2cSJim Jagielski  * Display a dialog with a list-box of children and select/deselect buttons
39*b1cdbd2cSJim Jagielski  */
40*b1cdbd2cSJim Jagielski class SelectionDialog extends JDialog
41*b1cdbd2cSJim Jagielski     implements ActionListener
42*b1cdbd2cSJim Jagielski {
SelectionDialog(AccTreeNode aNode)43*b1cdbd2cSJim Jagielski     public SelectionDialog (AccTreeNode aNode)
44*b1cdbd2cSJim Jagielski     {
45*b1cdbd2cSJim Jagielski         super (AccessibilityWorkBench.Instance());
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski         maNode = aNode;
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski         Layout();
50*b1cdbd2cSJim Jagielski     }
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski     /** build dialog */
Layout()53*b1cdbd2cSJim Jagielski     protected void Layout ()
54*b1cdbd2cSJim Jagielski     {
55*b1cdbd2cSJim Jagielski         setTitle( "Select" );
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski         // vertical stacking of the elements
58*b1cdbd2cSJim Jagielski         Container aContent = getContentPane();
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski         // label with explanation
61*b1cdbd2cSJim Jagielski         aContent.add( new JLabel( "Select/Deselect child elements" ),
62*b1cdbd2cSJim Jagielski                       BorderLayout.NORTH );
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski         // the JListBox
65*b1cdbd2cSJim Jagielski         maChildrenSelector = new JList (GetChildrenList());
66*b1cdbd2cSJim Jagielski         maChildrenSelector.setPreferredSize (new Dimension (500,300));
67*b1cdbd2cSJim Jagielski         aContent.add (maChildrenSelector, BorderLayout.CENTER);
68*b1cdbd2cSJim Jagielski         maChildrenSelector.setSelectionMode (ListSelectionModel.SINGLE_SELECTION);
69*b1cdbd2cSJim Jagielski 
70*b1cdbd2cSJim Jagielski         JPanel aButtons = new JPanel();
71*b1cdbd2cSJim Jagielski         aButtons.setLayout( new FlowLayout() );
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski         JButton aButton;
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski         aButton = new JButton( "Select" );
76*b1cdbd2cSJim Jagielski         aButton.setActionCommand( "Select" );
77*b1cdbd2cSJim Jagielski         aButton.addActionListener( this );
78*b1cdbd2cSJim Jagielski         aButtons.add( aButton );
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski         aButton = new JButton( "Deselect" );
81*b1cdbd2cSJim Jagielski         aButton.setActionCommand( "Deselect" );
82*b1cdbd2cSJim Jagielski         aButton.addActionListener( this );
83*b1cdbd2cSJim Jagielski         aButtons.add( aButton );
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski         aButton = new JButton( "Select all" );
86*b1cdbd2cSJim Jagielski         aButton.setActionCommand( "Select all" );
87*b1cdbd2cSJim Jagielski         aButton.addActionListener( this );
88*b1cdbd2cSJim Jagielski         aButtons.add( aButton );
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski         aButton = new JButton( "Clear Selection" );
91*b1cdbd2cSJim Jagielski         aButton.setActionCommand( "Clear Selection" );
92*b1cdbd2cSJim Jagielski         aButton.addActionListener( this );
93*b1cdbd2cSJim Jagielski         aButtons.add( aButton );
94*b1cdbd2cSJim Jagielski 
95*b1cdbd2cSJim Jagielski         aButton = new JButton( "Close" );
96*b1cdbd2cSJim Jagielski         aButton.setActionCommand( "Close" );
97*b1cdbd2cSJim Jagielski         aButton.addActionListener( this );
98*b1cdbd2cSJim Jagielski         aButtons.add( aButton );
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski         // add Panel with buttons
101*b1cdbd2cSJim Jagielski         aContent.add( aButtons, BorderLayout.SOUTH );
102*b1cdbd2cSJim Jagielski 
103*b1cdbd2cSJim Jagielski         setSize( getPreferredSize() );
104*b1cdbd2cSJim Jagielski     }
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski     /** Get a list of all children
107*b1cdbd2cSJim Jagielski     */
GetChildrenList()108*b1cdbd2cSJim Jagielski     private Vector GetChildrenList ()
109*b1cdbd2cSJim Jagielski     {
110*b1cdbd2cSJim Jagielski         mxSelection = maNode.getSelection();
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski         XAccessibleContext xContext = maNode.getContext();
113*b1cdbd2cSJim Jagielski         int nCount = xContext.getAccessibleChildCount();
114*b1cdbd2cSJim Jagielski         Vector aChildVector = new Vector();
115*b1cdbd2cSJim Jagielski         for(int i = 0; i < nCount; i++)
116*b1cdbd2cSJim Jagielski         {
117*b1cdbd2cSJim Jagielski             try
118*b1cdbd2cSJim Jagielski             {
119*b1cdbd2cSJim Jagielski                 XAccessible xChild = xContext.getAccessibleChild(i);
120*b1cdbd2cSJim Jagielski                 XAccessibleContext xChildContext = xChild.getAccessibleContext();
121*b1cdbd2cSJim Jagielski                 aChildVector.add( i + " " + xChildContext.getAccessibleName());
122*b1cdbd2cSJim Jagielski             }
123*b1cdbd2cSJim Jagielski             catch( IndexOutOfBoundsException e )
124*b1cdbd2cSJim Jagielski             {
125*b1cdbd2cSJim Jagielski                 aChildVector.add( "ERROR: IndexOutOfBoundsException" );
126*b1cdbd2cSJim Jagielski             }
127*b1cdbd2cSJim Jagielski         }
128*b1cdbd2cSJim Jagielski         return aChildVector;
129*b1cdbd2cSJim Jagielski     }
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski 
close()132*b1cdbd2cSJim Jagielski     void close ()
133*b1cdbd2cSJim Jagielski     {
134*b1cdbd2cSJim Jagielski         hide();
135*b1cdbd2cSJim Jagielski         dispose();
136*b1cdbd2cSJim Jagielski     }
137*b1cdbd2cSJim Jagielski 
select()138*b1cdbd2cSJim Jagielski     void select()
139*b1cdbd2cSJim Jagielski     {
140*b1cdbd2cSJim Jagielski         try
141*b1cdbd2cSJim Jagielski         {
142*b1cdbd2cSJim Jagielski             mxSelection.selectAccessibleChild (maChildrenSelector.getSelectedIndex());
143*b1cdbd2cSJim Jagielski         }
144*b1cdbd2cSJim Jagielski         catch( IndexOutOfBoundsException e )
145*b1cdbd2cSJim Jagielski         {
146*b1cdbd2cSJim Jagielski             JOptionPane.showMessageDialog( AccessibilityWorkBench.Instance(),
147*b1cdbd2cSJim Jagielski                                            "Can't select: IndexOutofBounds",
148*b1cdbd2cSJim Jagielski                                            "Error in selectAccessibleChild",
149*b1cdbd2cSJim Jagielski                                            JOptionPane.ERROR_MESSAGE);
150*b1cdbd2cSJim Jagielski         }
151*b1cdbd2cSJim Jagielski     }
152*b1cdbd2cSJim Jagielski 
deselect()153*b1cdbd2cSJim Jagielski     void deselect()
154*b1cdbd2cSJim Jagielski     {
155*b1cdbd2cSJim Jagielski         try
156*b1cdbd2cSJim Jagielski         {
157*b1cdbd2cSJim Jagielski             mxSelection.deselectAccessibleChild(
158*b1cdbd2cSJim Jagielski                 maChildrenSelector.getSelectedIndex());
159*b1cdbd2cSJim Jagielski         }
160*b1cdbd2cSJim Jagielski         catch( IndexOutOfBoundsException e )
161*b1cdbd2cSJim Jagielski         {
162*b1cdbd2cSJim Jagielski             JOptionPane.showMessageDialog( AccessibilityWorkBench.Instance(),
163*b1cdbd2cSJim Jagielski                                            "Can't deselect: IndexOutofBounds",
164*b1cdbd2cSJim Jagielski                                            "Error in deselectAccessibleChild",
165*b1cdbd2cSJim Jagielski                                            JOptionPane.ERROR_MESSAGE);
166*b1cdbd2cSJim Jagielski         }
167*b1cdbd2cSJim Jagielski     }
168*b1cdbd2cSJim Jagielski 
selectAll()169*b1cdbd2cSJim Jagielski     void selectAll()
170*b1cdbd2cSJim Jagielski     {
171*b1cdbd2cSJim Jagielski         mxSelection.selectAllAccessibleChildren();
172*b1cdbd2cSJim Jagielski     }
173*b1cdbd2cSJim Jagielski 
clearSelection()174*b1cdbd2cSJim Jagielski     void clearSelection()
175*b1cdbd2cSJim Jagielski     {
176*b1cdbd2cSJim Jagielski         mxSelection.clearAccessibleSelection();
177*b1cdbd2cSJim Jagielski     }
178*b1cdbd2cSJim Jagielski 
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski 
actionPerformed(ActionEvent e)181*b1cdbd2cSJim Jagielski     public void actionPerformed(ActionEvent e)
182*b1cdbd2cSJim Jagielski     {
183*b1cdbd2cSJim Jagielski         String sCommand = e.getActionCommand();
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski         if( "Close".equals( sCommand ) )
186*b1cdbd2cSJim Jagielski             close();
187*b1cdbd2cSJim Jagielski         else if ( "Select".equals( sCommand ) )
188*b1cdbd2cSJim Jagielski             select();
189*b1cdbd2cSJim Jagielski         else if ( "Deselect".equals( sCommand ) )
190*b1cdbd2cSJim Jagielski             deselect();
191*b1cdbd2cSJim Jagielski         else if ( "Clear Selection".equals( sCommand ) )
192*b1cdbd2cSJim Jagielski             clearSelection();
193*b1cdbd2cSJim Jagielski         else if ( "Select all".equals( sCommand ) )
194*b1cdbd2cSJim Jagielski             selectAll();
195*b1cdbd2cSJim Jagielski     }
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski     private JList maChildrenSelector;
198*b1cdbd2cSJim Jagielski     private XAccessibleSelection mxSelection;
199*b1cdbd2cSJim Jagielski     private AccTreeNode maNode;
200*b1cdbd2cSJim Jagielski }
201