All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jgraph.graph.DefaultGraphCell Maven / Gradle / Ivy

There is a newer version: 0.4.7
Show newest version
/*
 * @(#)AbstractGraphCell.java	1.0 1/1/02
 * 
 * Copyright (c) 2001-2004, Gaudenz Alder 
 * All rights reserved. 
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * 
 * - Redistributions of source code must retain the above copyright notice,
 *   this list of conditions and the following disclaimer.
 * - 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.
 * - Neither the name of JGraph 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.
 *
 */

package org.jgraph.graph;

import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.MutableTreeNode;
import java.awt.*;
import java.util.Collections;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;

/**
 * The default implementation for the GraphCell interface.
 *
 * @version 1.0 1/1/02
 * @author Gaudenz Alder
 */

public class DefaultGraphCell
	extends DefaultMutableTreeNode
	implements GraphCell, Cloneable {

	public final static Rectangle defaultBounds = new Rectangle(10, 10, 20, 20);

	/** Hashtable for properties. Initially empty */
	protected Map attributes = GraphConstants.createMap();

	/**
	 * Creates an empty cell.
	 */
	public DefaultGraphCell() {
		this(null);
	}

	/**
	 * Creates a graph cell and initializes it with the specified user object.
	 *
	 * @param userObject an Object provided by the user that constitutes
	 *                   the cell's data
	 */
	public DefaultGraphCell(Object userObject) {
		this(userObject, null);
	}

	/**
	 * Constructs a cell that holds a reference to the specified user object
	 * and contains the specified array of children and sets default values
	 * for the bounds attribute.
	 *
	 * @param userObject reference to the user object
	 * @param children array of children
	 */
	public DefaultGraphCell(Object userObject, MutableTreeNode[] children) {
		super(userObject, true);
		setUserObject(userObject);
		if (children != null)
			for (int i = 0; i < children.length; i++)
				add(children[i]);
		GraphConstants.setBounds(attributes, defaultBounds);
	}

	/**
	 * Creates a graph cell and initializes it with the specified user object.
	 * The GraphCell allows children only if specified.
	 *
	 * @param userObject an Object provided by the user that constitutes
	 *                   the cell's data
	 */
	public DefaultGraphCell(Object userObject, boolean allowsChildren) {
		super(userObject, allowsChildren);
	}

	/**
	 * Override parent method to synchronize value property and userObject.
	 * The following holds for each GraphCell c:

* GraphConstants.getValue(c.getAttributes()) == c.getUserObject()

* Note: A cell's userObject can be set using * GraphModel.edit() with a propertyMap that carries a value entry * for that cell. */ public void setUserObject(Object obj) { if (userObject instanceof ValueChangeHandler) { ((ValueChangeHandler) userObject).valueChanged(obj); } else super.setUserObject(obj); obj = getUserObject(); if (obj == null) GraphConstants.setValue(attributes, ""); else GraphConstants.setValue(attributes, obj); } /** * Provides access to the children list to change ordering. * This method returns a Collections.EMPTY_LIST * if the list of childrenpoints to null. */ public List getChildren() { if (children == null) return Collections.EMPTY_LIST; return children; } /** * Returns the properies of the cell. */ public Map getAttributes() { return attributes; } /** * Apply change to the cell and sync userObject. */ public Map changeAttributes(Map change) { Map undo = GraphConstants.applyMap(change, attributes); Object newValue = GraphConstants.getValue(attributes); // Check for inconsistencies if (userObject != null && newValue == null) GraphConstants.setValue(attributes, userObject); else if (userObject instanceof ValueChangeHandler) { Object oldValue = ((ValueChangeHandler) userObject).valueChanged(newValue); if (oldValue == null || !newValue.toString().equals(oldValue.toString())) GraphConstants.setValue(undo, oldValue); GraphConstants.setValue(attributes, userObject); } else userObject = newValue; // Ensure non-null bounds Rectangle bounds = GraphConstants.getBounds(attributes); if (bounds == null) GraphConstants.setBounds(attributes, defaultBounds); return undo; } /** * Sets the attributes. * @param attributes The attributes to set */ public void setAttributes(Map attributes) { this.attributes = attributes; } /** * Create a clone of the cell. The cloning of the * user object is deferred to the cloneUserObject() * method. * * @return Object a clone of this object. */ public Object clone() { DefaultGraphCell c = (DefaultGraphCell) super.clone(); c.attributes = new Hashtable(attributes); c.userObject = cloneUserObject(); return c; } /** * Create a clone of the user object. This is provided for * subclassers who need special cloning. This implementation * simply returns a reference to the original user object. * * @return Object a clone of this cells user object. */ protected Object cloneUserObject() { if (userObject instanceof ValueChangeHandler) return ((ValueChangeHandler) userObject).clone(); return userObject; } public interface ValueChangeHandler { /** * Messaged when the value of the cell has changed. * Return the old value for correct undo/redo. */ public Object valueChanged(Object newValue); /** * Invoked to clone the user object. */ public Object clone(); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy