diff options
Diffstat (limited to 'odk/examples/DevelopersGuide/Accessibility/GraphicalDisplay.java')
-rw-r--r-- | odk/examples/DevelopersGuide/Accessibility/GraphicalDisplay.java | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/odk/examples/DevelopersGuide/Accessibility/GraphicalDisplay.java b/odk/examples/DevelopersGuide/Accessibility/GraphicalDisplay.java new file mode 100644 index 000000000000..37579e1c3242 --- /dev/null +++ b/odk/examples/DevelopersGuide/Accessibility/GraphicalDisplay.java @@ -0,0 +1,189 @@ +/************************************************************************* + * + * The Contents of this file are made available subject to the terms of + * the BSD license. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Sun Microsystems, Inc. nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR + * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE + * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + *************************************************************************/ + +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; +} |