Files
libreoffice/odk/examples/DevelopersGuide/Accessibility/GraphicalDisplay.java
Noel Grandin 743e22ec8b Java cleanup, remove unnecessary imports
Change-Id: I2629a3068d8abd61957097268f5ab0fabf3e9722
2012-09-06 17:13:58 +02:00

188 lines
7.0 KiB
Java

/*************************************************************************
*
* 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 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;
}