/******************************************************************************* * Copyright (c) 2000, 2005 IBM Corporation and others. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: IBM Corporation - initial API and implementation Chisel Group, * University of Victoria - Adapted for XY Scaled Graphics ******************************************************************************/ package org.eclipse.zest.core.widgets.internal; import org.eclipse.draw2d.FreeformLayer; import org.eclipse.draw2d.IFigure; /** * The root figure for Zest. The figure is broken up into four segments, * 1. The Connections * 2. The Nodes * 3. The Highlighted Connections * 4. The Highlighted Nodes * * @author Ian Bull * */ public class ZestRootLayer extends FreeformLayer { public static final boolean EDGES_ON_TOP = false; private int numberOfNodes = 0; private int numberOfConnections = 0; private int numberOfHighlightedNodes = 0; private int numberOfHighlightedConnections = 0; /** * Adds a node to the ZestRootLayer * @param nodeFigure The figure representing the node */ public void addNode(IFigure nodeFigure) { int nodePosition = getNodePosition(); numberOfNodes++; add(nodeFigure, nodePosition); } /** * Removes a node from the layer * @param nodeFigure */ public void removeNode(IFigure nodeFigure) { if (!this.getChildren().contains(nodeFigure)) { throw new RuntimeException("Node not contained on the ZestRootLayer"); } int nodePosition = this.getChildren().indexOf(nodeFigure); if (nodePosition > getHighlightNodeStartPosition()) { // The node is in the highlight node area numberOfHighlightedNodes--; } else { // The node is in the node area numberOfNodes--; } this.remove(nodeFigure); } public void removeConnection(IFigure connectionFigure) { int connectionPosition = this.getChildren().indexOf(connectionFigure); if (connectionPosition > getHighlightConnectionStartPosition()) { // The connection is in the highlight connection area numberOfHighlightedConnections--; } else { // The connection is in the connection area numberOfConnections--; } this.remove(connectionFigure); } public void addConnection(IFigure connectionFigure) { int connectionPosition = getConnectionPosition(); numberOfConnections++; add(connectionFigure, connectionPosition); } public void highlightNode(IFigure nodeFigure) { this.numberOfNodes--; int highlightNodePosition = getHighlightNodePosition(); this.numberOfHighlightedNodes++; this.getChildren().remove(nodeFigure); this.getChildren().add(highlightNodePosition, nodeFigure); this.invalidate(); this.repaint(); } public void highlightConnection(IFigure connectionFigure) { this.numberOfConnections--; int highlightConnectionPosition = getHighlightConnectionPosition(); this.numberOfHighlightedConnections++; this.getChildren().remove(connectionFigure); this.getChildren().add(highlightConnectionPosition, connectionFigure); this.invalidate(); this.repaint(); } public void unHighlightNode(IFigure nodeFigure) { int nodePosition = this.getChildren().indexOf(nodeFigure); if (nodePosition > getHighlightNodePosition()) { //throw new RuntimeException("Node: " + nodeFigure + " not currently Highlighted"); return; } this.numberOfHighlightedNodes--; nodePosition = getNodePosition(); this.numberOfNodes++; this.getChildren().remove(nodeFigure); this.getChildren().add(nodePosition, nodeFigure); this.invalidate(); this.repaint(); } public void unHighlightConnection(IFigure connectionFigure) { int connectionPosition = this.getChildren().indexOf(connectionFigure); if (connectionPosition > getHighlightConnectionPosition()) { //throw new RuntimeException("Connection: " + connectionFigure + " not currently Highlighted"); return; } this.numberOfHighlightedConnections--; this.numberOfConnections++; connectionPosition = getConnectionPosition(); this.getChildren().remove(connectionFigure); if (connectionPosition > this.getChildren().size()) { this.getChildren().add(connectionFigure); } else { this.getChildren().add(connectionPosition, connectionFigure); } this.invalidate(); this.repaint(); } /* * Node position is at the end of the list of nodes */ private int getNodePosition() { if (EDGES_ON_TOP) { return numberOfNodes; } return numberOfConnections + numberOfNodes; } /* * Connection position is at the end of the list of connections */ private int getConnectionPosition() { if (EDGES_ON_TOP) { return 0 + numberOfConnections + numberOfNodes; } return 0 + numberOfConnections; } /* * Highlight node position is at the end of the list of highlighted nodes */ private int getHighlightNodePosition() { if (EDGES_ON_TOP) { return numberOfConnections + numberOfNodes + numberOfHighlightedNodes; } return numberOfConnections + numberOfHighlightedConnections + numberOfNodes + numberOfHighlightedNodes; } /* * Highlighted connection position is at the end of the list of highlighted connections */ private int getHighlightConnectionPosition() { if (EDGES_ON_TOP) { return numberOfNodes + +numberOfConnections + numberOfHighlightedNodes + numberOfHighlightedConnections; } return numberOfConnections + numberOfNodes + numberOfHighlightedConnections; } private int getHighlightConnectionStartPosition() { if (EDGES_ON_TOP) { return numberOfConnections + numberOfNodes + numberOfHighlightedNodes; } return numberOfConnections + numberOfNodes; } private int getHighlightNodeStartPosition() { if (EDGES_ON_TOP) { return numberOfNodes + numberOfConnections; } return numberOfConnections + numberOfHighlightedConnections + numberOfNodes; } }