blob: 0f47cc3001248769e99a6827baf335ddd49e152a [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.
*
*************************************************************/
package org.openoffice.accessibility.awb.canvas;
import java.awt.Rectangle;
import java.util.Iterator;
import javax.swing.event.TreeModelListener;
import javax.swing.event.TreeExpansionListener;
import javax.swing.event.TreeWillExpandListener;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeModelEvent;
import javax.swing.tree.TreeNode;
import com.sun.star.accessibility.XAccessibleEventBroadcaster;
/** Each canvas has a shape container that is responsible for maintaining
a collection of shapes that are displayed by the canvas.
*/
public class ShapeContainer
implements TreeModelListener,
TreeExpansionListener,
TreeWillExpandListener
{
public ShapeContainer (Canvas aCanvas)
{
maShapeList = new java.util.Hashtable();
maBoundingBox = new Rectangle (0,0,100,100);
maCanvas = aCanvas;
maTree = null;
}
public synchronized void SetTree (javax.swing.JTree aTree)
{
if (aTree != maTree)
{
if (maTree != null)
{
maTree.getModel().removeTreeModelListener (this);
maTree.removeTreeExpansionListener (this);
maTree.removeTreeWillExpandListener (this);
}
Clear();
maTree = aTree;
maTree.getModel().addTreeModelListener (this);
maTree.addTreeExpansionListener (this);
maTree.addTreeWillExpandListener (this);
}
}
public synchronized boolean AddNode (TreeNode aNode)
{
CanvasShape aShape = (CanvasShape)maShapeList.get (aNode);
if (aShape == null)
{
aShape = new CanvasShape (aNode, maCanvas);
if (aNode instanceof XAccessibleEventBroadcaster)
((XAccessibleEventBroadcaster) aNode).addEventListener(aShape);
// Update bounding box that includes all objects.
if (maShapeList.size() == 0)
maBoundingBox = aShape.GetBBox();
else
maBoundingBox = maBoundingBox.union (aShape.GetBBox());
maShapeList.put (aNode, aShape);
maCanvas.repaint();
return true;
}
else
return false;
}
/**
*/
public synchronized boolean RemoveNode (TreeNode aNode)
{
CanvasShape aShape = (CanvasShape)maShapeList.get (aNode);
if (aShape != null)
{
if (aNode instanceof XAccessibleEventBroadcaster)
((XAccessibleEventBroadcaster) aNode).removeEventListener(aShape);
maShapeList.remove (aNode);
maCanvas.SelectObject (null);
maCanvas.repaint ();
return true;
}
else
return false;
}
public synchronized void Clear ()
{
maShapeList.clear ();
}
public Iterator GetIterator ()
{
return maShapeList.values().iterator ();
}
public CanvasShape Get (TreeNode aNode)
{
if (aNode != null) {
return (CanvasShape)maShapeList.get (aNode);
}
return null;
}
private void PrintMessage (String aMessage, java.util.EventObject aEvent)
{
// System.out.println ("ShapeContainer: " + aMessage + ": " + aEvent);
}
public void treeNodesChanged (TreeModelEvent aEvent)
{
PrintMessage ("treeNodesChanged", aEvent);
}
public void treeNodesInserted (TreeModelEvent aEvent)
{
PrintMessage ("treeNodesInserted", aEvent);
Object[] aNewNodes = aEvent.getChildren();
for (int i=0; i<aNewNodes.length; i++)
AddNode ((TreeNode)aNewNodes[i]);
}
public void treeNodesRemoved (TreeModelEvent aEvent)
{
PrintMessage ("treeNodesRemoved", aEvent);
Object[] aOldNodes = aEvent.getChildren();
for (int i=0; i<aOldNodes.length; i++)
RemoveNode ((TreeNode)aOldNodes[i]);
}
public void treeStructureChanged (TreeModelEvent aEvent)
{
PrintMessage ("treeStructureChanged", aEvent);
TreeNode aNode = (TreeNode)aEvent.getTreePath().getLastPathComponent();
RemoveAllChildren(aNode);
AddAllChildren(aNode);
}
public void treeWillExpand (TreeExpansionEvent aEvent)
{
PrintMessage ("treeWillExpand", aEvent);
}
public void treeWillCollapse (TreeExpansionEvent aEvent)
{
PrintMessage ("treeWillCollapse", aEvent);
TreeNode aNode = (TreeNode)aEvent.getPath().getLastPathComponent();
RemoveAllChildren (aNode);
}
public void treeExpanded (TreeExpansionEvent aEvent)
{
PrintMessage ("treeExpanded", aEvent);
TreeNode aNode = (TreeNode)aEvent.getPath().getLastPathComponent();
AddAllChildren (aNode);
}
public void treeCollapsed (TreeExpansionEvent aEvent)
{
PrintMessage ("treeCollapsed", aEvent);
}
private void AddAllChildren (TreeNode aNode) {
java.util.Enumeration aChildList = aNode.children();
while (aChildList.hasMoreElements()) {
TreeNode aChild = (TreeNode) aChildList.nextElement();
if (aChild != null) {
AddAllChildren (aChild);
AddNode (aChild);
}
}
}
private void RemoveAllChildren (TreeNode aNode) {
java.util.Enumeration aChildList = aNode.children();
while (aChildList.hasMoreElements()) {
TreeNode aChild = (TreeNode) aChildList.nextElement();
if (aChild != null) {
RemoveAllChildren (aChild);
RemoveNode (aChild);
}
}
}
private java.util.Hashtable maShapeList;
private Rectangle maBoundingBox;
private Canvas maCanvas;
private javax.swing.JTree maTree;
}