| /************************************************************** |
| * |
| * 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 |
| * regarding copyright ownership. The ASF licenses this file |
| * 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. |
| * |
| *************************************************************/ |
| |
| |
| |
| import javax.swing.*; |
| import java.awt.Dimension; |
| import java.awt.*; |
| import java.awt.geom.*; |
| |
| import com.sun.star.accessibility.XAccessible; |
| import com.sun.star.accessibility.XAccessibleContext; |
| import com.sun.star.accessibility.XAccessibleComponent; |
| |
| import com.sun.star.awt.Point; |
| import com.sun.star.awt.Size; |
| import com.sun.star.uno.UnoRuntime; |
| |
| |
| /** Display the currently focused accessible object graphically. |
| */ |
| public class GraphicalDisplay |
| extends JPanel |
| implements IAccessibleObjectDisplay |
| { |
| /** Create a new graphical widget the displays some of the geometrical |
| information availbable from accessible objects. |
| */ |
| public GraphicalDisplay () |
| { |
| setPreferredSize (new Dimension (300,200)); |
| } |
| |
| |
| /** Paint some or all of the area of this widget with the outlines of |
| the currently focues object and its ancestors. |
| */ |
| public synchronized void paintComponent (Graphics g) |
| { |
| super.paintComponent (g); |
| |
| setupTransformation (); |
| |
| // Draw the screen representation to give a hint of the location of the |
| // accessible object on the screen. |
| Dimension aScreenSize = Toolkit.getDefaultToolkit().getScreenSize(); |
| // Fill the screen rectangle. |
| g.setColor (new Color (250,240,230)); |
| g.fillRect ( |
| (int)(mnHOffset+0.5), |
| (int)(mnVOffset+0.5), |
| (int)(mnScale*aScreenSize.getWidth()), |
| (int)(mnScale*aScreenSize.getHeight())); |
| // Draw a frame arround the screen rectangle to increase its visibility. |
| g.setColor (Color.BLACK); |
| g.drawRect ( |
| (int)(mnHOffset+0.5), |
| (int)(mnVOffset+0.5), |
| (int)(mnScale*aScreenSize.getWidth()), |
| (int)(mnScale*aScreenSize.getHeight())); |
| |
| // Now do the actual display of the accessible object. |
| drawAccessibleObject (g, mxContext, Color.GREEN); |
| } |
| public synchronized void paintChildren (Graphics g) |
| { |
| } |
| public synchronized void paintBorder (Graphics g) |
| { |
| } |
| |
| |
| |
| |
| /** Draw a simple representation of the given accessible object in the |
| specified color. |
| */ |
| public void drawAccessibleObject (Graphics g, XAccessibleContext xContext, Color aColor) |
| { |
| if (xContext != null) |
| { |
| // First draw our parent. |
| XAccessible xParent = xContext.getAccessibleParent(); |
| if (xParent != null) |
| drawAccessibleObject (g, xParent.getAccessibleContext(), Color.GRAY); |
| |
| // When the context supports the XAccessibleComponent interface |
| // then draw its outline. |
| XAccessibleComponent xComponent = |
| (XAccessibleComponent)UnoRuntime.queryInterface( |
| XAccessibleComponent.class, xContext); |
| if (xComponent != null) |
| { |
| // Get size and location on screen and transform them to fit |
| // everything inside this widget. |
| Point aLocation = xComponent.getLocationOnScreen(); |
| Size aSize = xComponent.getSize(); |
| g.setColor (aColor); |
| g.drawRect ( |
| (int)(mnHOffset + mnScale*aLocation.X+0.5), |
| (int)(mnVOffset + mnScale*aLocation.Y+0.5), |
| (int)(mnScale*aSize.Width), |
| (int)(mnScale*aSize.Height)); |
| } |
| } |
| } |
| |
| |
| public synchronized void setAccessibleObject (XAccessibleContext xContext) |
| { |
| mxContext = xContext; |
| repaint (); |
| } |
| |
| public synchronized void updateAccessibleObject (XAccessibleContext xContext) |
| { |
| repaint (); |
| } |
| |
| |
| /** Set up the transformation so that the graphical display can show a |
| centered representation of the whole screen. |
| */ |
| private void setupTransformation () |
| { |
| Dimension aScreenSize = Toolkit.getDefaultToolkit().getScreenSize(); |
| Dimension aWidgetSize = getSize(); |
| if ((aScreenSize.getWidth() > 0) && (aScreenSize.getHeight() > 0)) |
| { |
| // Calculate the scales that would map the screen onto the |
| // widget in both of the coordinate axes and select the smaller |
| // of the two: it maps the screen onto the widget in both axes |
| // at the same time. |
| double nHScale = (aWidgetSize.getWidth() - 10) / aScreenSize.getWidth(); |
| double nVScale = (aWidgetSize.getHeight() - 10) / aScreenSize.getHeight(); |
| if (nHScale < nVScale) |
| mnScale = nHScale; |
| else |
| mnScale = nVScale; |
| |
| // Calculate offsets that center the scaled screen inside the widget. |
| mnHOffset = (aWidgetSize.getWidth() - mnScale*aScreenSize.getWidth()) / 2.0; |
| mnVOffset = (aWidgetSize.getHeight() - mnScale*aScreenSize.getHeight()) / 2.0; |
| } |
| else |
| { |
| // In case of a degenerate (not yet initialized?) screen size |
| // use some meaningless default values. |
| mnScale = 1; |
| mnHOffset = 0; |
| mnVOffset = 0; |
| } |
| } |
| |
| |
| private XAccessibleContext mxContext; |
| private double mnScale; |
| private double mnHOffset; |
| private double mnVOffset; |
| } |