blob: 20bf9bad8dd8f6e5b5db155100996fd189d5deb6 [file] [log] [blame]
/**************************************************************
*
* 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 java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
import java.awt.geom.Rectangle2D;
import com.sun.star.beans.XPropertyChangeListener;
import com.sun.star.beans.PropertyChangeEvent;
import com.sun.star.accessibility.XAccessible;
import com.sun.star.accessibility.XAccessibleContext;
import com.sun.star.accessibility.XAccessibleComponent;
import com.sun.star.accessibility.XAccessibleExtendedComponent;
import com.sun.star.accessibility.XAccessibleText;
import com.sun.star.accessibility.XAccessibleStateSet;
import com.sun.star.accessibility.AccessibleStateType;
class CanvasShape
{
public final Color maHighlightColor = Color.red;
public final Color maSelectionColor = Color.green;
public final Color maFocusColor = Color.blue;
// public AccessibleObject (XAccessibleContext xContext, TreePath aPath)
public CanvasShape (AccTreeNode aNode)
{
maNode = aNode;
mxContext = aNode.getContext();
msName = "name unknown";
msDescription = "description unknown";
maShape = new Rectangle2D.Double (-10,-10,10,10);
maPosition = new Point (-10,-10);
maSize = new Dimension (10,10);
maFgColor = java.awt.Color.black;
maBgColor = Color.blue;
mnRole = -1;
mbHighlighted = false;
mbSelected = false;
mbFocused = false;
mxComponent = aNode.getComponent();
update ();
}
/** Update the data obtained from the xAccessible.
*/
public void update ()
{
if (mxContext != null)
{
msName = mxContext.getAccessibleName();
msDescription = mxContext.getAccessibleDescription();
mnRole = mxContext.getAccessibleRole();
// Extract the selected and focused flag.
XAccessibleStateSet xStateSet = mxContext.getAccessibleStateSet ();
if (xStateSet != null)
{
mbSelected = xStateSet.contains (AccessibleStateType.SELECTED);
mbFocused = xStateSet.contains (AccessibleStateType.FOCUSED);
}
}
updateGeometry ();
if (mxComponent != null)
{
// Note: alpha values in office 0..255 have to be mapped to
// 255..0 in Java
Color aCol = new Color (mxComponent.getForeground(), true);
maFgColor = new Color (aCol.getRed (),
aCol.getGreen (),
aCol.getBlue (),
0xff - aCol.getAlpha ());
aCol = new Color (mxComponent.getBackground(), true);
maBgColor = new Color (aCol.getRed (),
aCol.getGreen (),
aCol.getBlue (),
0xff - aCol.getAlpha ());
}
}
public void updateGeometry ()
{
if (mxComponent != null)
{
com.sun.star.awt.Point aLocationOnScreen = mxComponent.getLocationOnScreen();
com.sun.star.awt.Size aSizeOnScreen = mxComponent.getSize();
maPosition = new Point (
aLocationOnScreen.X,
aLocationOnScreen.Y);
maSize = new Dimension (
aSizeOnScreen.Width,
aSizeOnScreen.Height);
}
}
/** Paint the object into the specified canvas. It is transformed
according to the specified offset and scale.
*/
public void paint (Graphics2D g,
double nXOffset, double nYOffset, double nScaleFactor,
boolean bShowDescription, boolean bShowName, boolean bShowText)
{
try{
// Transform the object's position and size according to the
// specified offset and scale.
Point aLocation = new Point();
maShape = new Rectangle2D.Double (
maPosition.x * nScaleFactor + nXOffset,
maPosition.y * nScaleFactor + nYOffset,
maSize.width * nScaleFactor,
maSize.height * nScaleFactor);
// Fill the object's bounding box with its background color if it
// has no children.
if (mxContext.getAccessibleChildCount() == 0)
{
g.setColor (maBgColor);
g.fill (maShape);
}
// Remove alpha channel from color before drawing the frame.
Color color = maFgColor;
if (maFgColor.getAlpha()<128)
color = new Color (maFgColor.getRed(), maFgColor.getGreen(), maFgColor.getBlue());
g.setColor (color);
g.draw (maShape);
if (mbFocused)
{
g.setColor (maFocusColor);
for (int x=0; x<=2; x++)
for (int y=0; y<=2; y++)
g.fill (
new Rectangle2D.Double (
maShape.x + x/2.0 * maShape.width-3,
maShape.y + y/2.0 * maShape.height-3,
6,
6));
}
if (mbSelected)
{
g.setColor (maSelectionColor);
for (int x=0; x<=2; x++)
for (int y=0; y<=2; y++)
g.draw (
new Rectangle2D.Double (
maShape.x + x/2.0 * maShape.width-2,
maShape.y + y/2.0 * maShape.height-2,
4,
4));
}
// Write the object's text OR name and description.
g.setColor (maFgColor);
if (bShowName)
paintName (g);
if (bShowDescription)
paintDescription (g);
if (bShowText)
paintText (g);
}
catch (Exception e)
{ // don't care
}
}
public void paint_highlight (Graphics2D g,
double nXOffset, double nYOffset, double nScaleFactor)
{
if (mbHighlighted)
g.setColor (maHighlightColor);
else
g.setColor (maFgColor);
g.draw (maShape);
}
private void paintName (Graphics2D g)
{
g.drawString ("Name: " + msName,
(float)maShape.x+5,
(float)maShape.y+15);
}
private void paintDescription (Graphics2D g)
{
g.drawString ("Description: " + msDescription,
(float)maShape.x+5,
(float)maShape.y+35);
}
private void paintText (Graphics2D g)
{
XAccessibleText xText = null;
// get XAccessibleText
xText = maNode.getText();
// Draw every character in the text string.
if (xText != null)
{
String sText = xText.getText();
try
{
for(int i = 0; i < sText.length(); i++)
{
com.sun.star.awt.Rectangle aRect =
xText.getCharacterBounds(i);
double x = maShape.x + aRect.X;
double y = maShape.y + aRect.Y + aRect.Height;
g.drawString(sText.substring(i, i+1), (float)x, (float)y);
}
}
catch (com.sun.star.lang.IndexOutOfBoundsException e)
{}
}
}
/** Callback for disposing events.
*/
public void disposing (com.sun.star.lang.EventObject e)
{
System.out.println ("Disposing");
}
/** Compute whether the specified point lies inside the object's
bounding box.
*/
public boolean contains (int x, int y)
{
return (maShape.contains (x,y));
}
public void highlight ()
{
mbHighlighted = true;
}
public void unhighlight ()
{
mbHighlighted = false;
}
public boolean isHighlighted ()
{
return mbHighlighted;
}
public Rectangle getBBox ()
{
return new Rectangle (maPosition, maSize);
}
public Point getOrigin ()
{
return maPosition;
}
public TreePath getPath ()
{
return new TreePath (maNode.createPath());
}
public int getRole ()
{
return mnRole;
}
public XAccessibleContext getContext ()
{
return mxContext;
}
public XAccessibleComponent getComponent ()
{
return mxComponent;
}
public String toString ()
{
return ">"+msName+", "+msDescription+" +"+maPosition.x+"+"+maPosition.y
+"x"+maSize.width+"x"+maSize.height+"<";
}
private AccTreeNode
maNode;
private XAccessibleContext
mxContext;
private XAccessibleComponent
mxComponent;
private String
msDescription,
msName;
private Rectangle2D.Double
maShape;
private Point
maPosition;
private Dimension
maTransformedSize,
maSize;
private Color
maFgColor,
maBgColor;
private boolean
// Highlighting objects is an internal concept. Corresponds to selection in the tree view.
mbHighlighted,
// Set when the accessible object is selected.
mbSelected,
// Set when the accessible object is focused.
mbFocused;
private int
mnRole;
}