/**********************************************************************
- * Copyright (c) 2005, 2008, 2011 IBM Corporation and others.
+ * Copyright (c) 2005, 2012 IBM Corporation, Ericsson
* 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
- * $Id: GraphNode.java,v 1.3 2008/01/24 02:28:49 apnan Exp $
- *
- * Contributors:
- * IBM - Initial API and implementation
- * Bernd Hufmann - Updated for TMF
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ * Bernd Hufmann - Updated for TMF
**********************************************************************/
+
package org.eclipse.linuxtools.tmf.ui.views.uml2sd.core;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
-import org.eclipse.linuxtools.tmf.ui.TmfUiTracer;
+import org.eclipse.linuxtools.internal.tmf.ui.TmfUiTracer;
import org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.IGC;
-import org.eclipse.linuxtools.tmf.ui.views.uml2sd.drawings.ISDPreferences;
+import org.eclipse.linuxtools.tmf.ui.views.uml2sd.preferences.ISDPreferences;
+import org.eclipse.linuxtools.tmf.ui.views.uml2sd.preferences.SDViewPref;
/**
* The base class used for all UML2 graph nodes displayed in the Sequence Diagram SDWidget.
- *
+ *
* @author sveyrier
* @version 1.0
*/
-
public abstract class GraphNode {
- protected int startEventOccurrence = 0;
-
- protected int endEventOccurrence = 0;
-
+ // ------------------------------------------------------------------------
+ // Attributes
+ // ------------------------------------------------------------------------
+ /**
+ * The start event occurrence.
+ */
+ protected int fStartEventOccurrence = 0;
+ /**
+ * The event event occurrence.
+ */
+ protected int fEndEventOccurrence = 0;
/**
* Preference ColorId to use to draw font
*/
- public String prefId = ISDPreferences.PREF_SYNC_MESS;
-
+ public String fPrefId = ISDPreferences.PREF_SYNC_MESS;
/**
* The selection state of the graph node.
*/
- protected boolean selected = false;
-
+ protected boolean fSelected = false;
/**
* The focus state of the graph node.
*/
- protected boolean focused = false;
-
- protected boolean hasChilden = false;
-
+ protected boolean fFocused = false;
+ /**
+ * Flag to indicate whether node has children or not.
+ */
+ protected boolean fHasChilden = false;
/**
* The graph node name used to label the graph node in the View.
*/
- protected String name = ""; //$NON-NLS-1$
-
- protected HashMap<String, List<GraphNode>> nodes;
- protected HashMap<String, List<GraphNode>> fnodes;
- protected HashMap<String, List<GraphNode>> bnodes;
+ protected String fName = ""; //$NON-NLS-1$
+ /**
+ * A map from node name to graph node.
+ */
+ protected Map<String, List<GraphNode>> fNodes;
+ /**
+ * A map from node name to graph node for forward sorting
+ */
+ protected Map<String, List<GraphNode>> fForwardNodes;
+ /**
+ * A map from node name to graph node for backwards sorting.
+ */
+ protected Map<String, List<GraphNode>> fBackwardNodes;
+ /**
+ * A map from node name to index.
+ */
+ protected Map<String, Integer> fIndexes;
+ /**
+ * A map from node name to index for forwards sorting.
+ */
+ protected Map<String, Boolean> fForwardSort;
+ /**
+ * A map from node name to index for forwards sorting.
+ */
+ protected Map<String, Boolean> fBackwardSort;
- protected HashMap<String, Integer> indexes;
- protected HashMap<String, Boolean> fSort;
- protected HashMap<String, Boolean> bSort;
+ // ------------------------------------------------------------------------
+ // Methods
+ // ------------------------------------------------------------------------
/**
* Reset the internal index of the first visible GraphNode for each ordered GraphNode lists
- *
*/
public void resetIndex() {
- if (!hasChilden)
+ if (!fHasChilden) {
return;
- Iterator<String> it = indexes.keySet().iterator();
+ }
+
+ Iterator<String> it = fIndexes.keySet().iterator();
while (it.hasNext()) {
String nodeType = it.next();
- indexes.put(nodeType, Integer.valueOf(0));
+ fIndexes.put(nodeType, Integer.valueOf(0));
}
}
/**
* Add a GraphNode into the receiver
- *
+ *
* @param nodeToAdd the node to add
*/
public void addNode(GraphNode nodeToAdd) {
- if (!hasChilden) {
- nodes = new HashMap<String, List<GraphNode>>(2);
- fnodes = new HashMap<String, List<GraphNode>>(2);
- bnodes = new HashMap<String, List<GraphNode>>(2);
- indexes = new HashMap<String, Integer>(2);
- bSort = new HashMap<String, Boolean>(2);
- fSort = new HashMap<String, Boolean>(2);
- hasChilden = true;
+ if (!fHasChilden) {
+ fNodes = new HashMap<String, List<GraphNode>>(2);
+ fForwardNodes = new HashMap<String, List<GraphNode>>(2);
+ fBackwardNodes = new HashMap<String, List<GraphNode>>(2);
+ fIndexes = new HashMap<String, Integer>(2);
+ fBackwardSort = new HashMap<String, Boolean>(2);
+ fForwardSort = new HashMap<String, Boolean>(2);
+ fHasChilden = true;
}
// Nothing to add
- if (nodeToAdd == null)
+ if (nodeToAdd == null) {
return;
+ }
- if (nodes.get(nodeToAdd.getArrayId()) == null) {
- nodes.put(nodeToAdd.getArrayId(), new ArrayList<GraphNode>(1));
- indexes.put(nodeToAdd.getArrayId(), Integer.valueOf(0));
- fnodes.put(nodeToAdd.getArrayId(), new ArrayList<GraphNode>(1));
- fSort.put(nodeToAdd.getArrayId(), Boolean.valueOf(false));
+ if (fNodes.get(nodeToAdd.getArrayId()) == null) {
+ fNodes.put(nodeToAdd.getArrayId(), new ArrayList<GraphNode>(1));
+ fIndexes.put(nodeToAdd.getArrayId(), Integer.valueOf(0));
+ fForwardNodes.put(nodeToAdd.getArrayId(), new ArrayList<GraphNode>(1));
+ fForwardSort.put(nodeToAdd.getArrayId(), Boolean.FALSE);
if (nodeToAdd.getBackComparator() != null) {
- bnodes.put(nodeToAdd.getArrayId(), new ArrayList<GraphNode>(1));
- bSort.put(nodeToAdd.getArrayId(), Boolean.valueOf(false));
+ fBackwardNodes.put(nodeToAdd.getArrayId(), new ArrayList<GraphNode>(1));
+ fBackwardSort.put(nodeToAdd.getArrayId(), Boolean.FALSE);
}
}
- List<GraphNode> fNodeList = (List<GraphNode>) fnodes.get(nodeToAdd.getArrayId());
+ List<GraphNode> fNodeList = fForwardNodes.get(nodeToAdd.getArrayId());
List<GraphNode> bNodeList = null;
- if (bnodes != null)
- bNodeList = (List<GraphNode>) bnodes.get(nodeToAdd.getArrayId());
+ if (fBackwardNodes != null) {
+ bNodeList = fBackwardNodes.get(nodeToAdd.getArrayId());
+ }
if (fNodeList != null && fNodeList.size() > 0) {
// check if the nodes are added y ordered
// if not, tag the list to sort it later (during draw)
- GraphNode node = (GraphNode) fNodeList.get(fNodeList.size() - 1);
+ GraphNode node = fNodeList.get(fNodeList.size() - 1);
Comparator<GraphNode> fcomp = nodeToAdd.getComparator();
Comparator<GraphNode> bcomp = nodeToAdd.getBackComparator();
- if ((fcomp != null) && (fcomp.compare(node, nodeToAdd) == 1)) {
- fSort.put(nodeToAdd.getArrayId(), Boolean.valueOf(true));
+ if ((fcomp != null) && (fcomp.compare(node, nodeToAdd) > 0)) {
+ fForwardSort.put(nodeToAdd.getArrayId(), Boolean.TRUE);
}
- if ((bcomp != null) && (bcomp.compare(node, nodeToAdd) == 1)) {
- bSort.put(nodeToAdd.getArrayId(), Boolean.valueOf(true));
+ if ((bcomp != null) && (bcomp.compare(node, nodeToAdd) > 0)) {
+ fBackwardSort.put(nodeToAdd.getArrayId(), Boolean.TRUE);
}
}
}
fNodeList.add(nodeToAdd);
- nodes.put(nodeToAdd.getArrayId(), fNodeList);
- fnodes.put(nodeToAdd.getArrayId(), fNodeList);
- if (nodeToAdd.getBackComparator() != null) {
+ fNodes.put(nodeToAdd.getArrayId(), fNodeList);
+ fForwardNodes.put(nodeToAdd.getArrayId(), fNodeList);
+ if ((bNodeList != null) && (nodeToAdd.getBackComparator() != null)) {
bNodeList.add(nodeToAdd);
- bnodes.put(nodeToAdd.getArrayId(), bNodeList);
+ fBackwardNodes.put(nodeToAdd.getArrayId(), bNodeList);
}
}
/**
* Set the graph node name.<br>
* It is the name display in the view to label the graph node.
- *
- * @param the name to set
+ *
+ * @param nodeName the name to set
*/
public void setName(String nodeName) {
- name = nodeName;
+ fName = nodeName;
}
/**
* Returns the graph node name.<br>
* It is the name display in the view to label the graph node.
- *
+ *
* @return the graph node name
*/
public String getName() {
- return name;
+ return fName;
}
/**
* Tags the the graph node has selected.<br>
* WARNING: This method is only used to draw the graph node using the system selection colors. <br>
* To use the complete SDViewer selection mechanism (selection management, notification, etc..) see SDWidget class
- *
+ *
* @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.SDWidget#addSelection(GraphNode)
* @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.SDWidget#removeSelection(GraphNode)
* @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.SDWidget#clearSelection()
* @param selection - true to set selected, false to set unselected
*/
public void setSelected(boolean selection) {
- selected = selection;
+ fSelected = selection;
}
/**
* Tags the the graph node as focused.<br>
* WARNING: This method is only used to draw the graph node using the system focus style. <br>
* To use the complete SDViewer focus mechanism see SDWidget class
- *
+ *
* @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.SDWidget#addSelection(GraphNode)
* @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.SDWidget#removeSelection(GraphNode)
* @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.SDWidget#clearSelection()
* @param focus - true to set focued, false otherwise
*/
public void setFocused(boolean focus) {
- focused = focus;
+ fFocused = focus;
}
/**
* Returns true if the graph node is selected, false otherwise.<br>
* The returned value is used to highlight the graph node in the View.
- *
+ *
* @return true if selected, false otherwise
- *
*/
public boolean isSelected() {
- return selected;
+ return fSelected;
}
/**
* Returns true if the graph node is focused, false otherwise.<br>
* The returned value is used to highlight the graph node in the View.
- *
- * @return true if focued, false otherwise
- *
+ *
+ * @return true if focused, false otherwise
*/
public boolean hasFocus() {
- return focused;
+ return fFocused;
}
/**
- * Returns true if the graph node contains the point given in parameter, return false otherwise.
- *
- * @param x the x coordinate of the point to test containment <br>
- * y the y coordinate of the point to test containment
+ * Returns true if the graph node contains the point given in parameter,
+ * return false otherwise.
+ *
+ * @param x
+ * the x coordinate of the point to test containment
+ * @param y
+ * the y coordinate of the point to test containment
* @return true if contained, false otherwise
*/
abstract public boolean contains(int x, int y);
/**
* Returns the x coordinate of the graph node
- *
+ *
* @return the x coordinate
*/
abstract public int getX();
/**
* Returns the y coordinate of the graph node
- *
+ *
* @return the y coordinate
*/
abstract public int getY();
/**
* Returns the graph node height
- *
+ *
* @return the graph node height
*/
abstract public int getHeight();
/**
* Returns the graph node width
- *
+ *
* @return the graph node width
*/
abstract public int getWidth();
/**
* Draws the graph node in the given context
- *
+ *
* @param context the graphical context to draw in
*/
abstract protected void draw(IGC context);
/**
- * Returns the GraphNode visibility for the given visible area. Wrong visibility calculation, may strongly impact
- * drawing performance
- *
- * @param vx
- * @param vy
- * @param vwidth
- * @param vheight
- * @return true if visible false otherwise
+ * Returns the GraphNode visibility for the given visible area. Wrong
+ * visibility calculation, may strongly impact drawing performance
+ *
+ * @param x
+ * The X coordinate
+ * @param y
+ * The Y coordinate
+ * @param width
+ * The width of the area
+ * @param height
+ * The height of the area
+ * @return true if visible, false otherwise
*/
public boolean isVisible(int x, int y, int width, int height) {
return true;
}
/**
- * Return a comparator to sort the GraphNode of the same type This comparator is used to order the GraphNode array
- * of the given node type. (see getArrayId).
- *
+ * Return a comparator to sort the GraphNode of the same type This
+ * comparator is used to order the GraphNode array of the given node type.
+ * (see getArrayId).
+ *
* @return the comparator
*/
public Comparator<GraphNode> getComparator() {
}
/**
- * If needed, return a different comparator to backward scan the GraphNode array
- *
+ * If needed, return a different comparator to backward scan the GraphNode
+ * array
+ *
* @return the backward comparator or null if not needed
*/
public Comparator<GraphNode> getBackComparator() {
/**
* Compare two graphNodes
- *
- * @param node the node to compare to
+ *
+ * @param node
+ * the node to compare to
* @return true if equal false otherwise
*/
public boolean isSameAs(GraphNode node) {
/**
* Return the node type for all class instances. This id is used to store the same nodes kind in the same ordered
* array.
- *
+ *
* @return the node type identifier
*/
abstract public String getArrayId();
/**
* Return true if the distance from the GraphNode to the given point is positive
- *
+ *
* @param x the point x coordinate
* @param y the point y coordinate
* @return true if positive false otherwise
/**
* Returns the graph node which contains the point given in parameter WARNING: Only graph nodes in the current
* visible area can be returned
- *
+ *
* @param x the x coordinate of the point to test
* @param y the y coordinate of the point to test
* @return the graph node containing the point given in parameter, null otherwise
public GraphNode getNodeAt(int x, int y) {
GraphNode toReturn = null;
- if (!hasChilden)
+ if (!fHasChilden) {
return null;
+ }
- Iterator<String> it = nodes.keySet().iterator();
+ Iterator<String> it = fNodes.keySet().iterator();
GraphNode node = null;
while (it.hasNext()) {
Object nodeType = it.next();
- List<GraphNode> list = (List<GraphNode>) nodes.get(nodeType);
- int index = ((Integer) indexes.get(nodeType)).intValue();
+ List<GraphNode> list = fNodes.get(nodeType);
+ int index = fIndexes.get(nodeType).intValue();
node = getNodeFromListAt(x, y, list, index);
- if (toReturn == null)
+ if (toReturn == null) {
toReturn = node;
+ }
if (node != null) {
GraphNode internalNode = node.getNodeAt(x, y);
- if (internalNode != null)
+ if (internalNode != null) {
return internalNode;
- // else return node;
- else if (Math.abs(node.getWidth()) < Math.abs(toReturn.getWidth()) || Math.abs(node.getHeight()) < Math.abs(toReturn.getHeight()))
+ } else if (Math.abs(node.getWidth()) < Math.abs(toReturn.getWidth()) || Math.abs(node.getHeight()) < Math.abs(toReturn.getHeight())) {
toReturn = node;
+ }
}
}
return toReturn;
}
- public ArrayList<GraphNode> getNodeList(GraphNode from, GraphNode to) {
- ArrayList<GraphNode> result = new ArrayList<GraphNode>();
+ /**
+ * Gets node list from node A to node B
+
+ * @param from A from node
+ * @param to A to node
+ * @return the list of nodes
+ */
+ public List<GraphNode> getNodeList(GraphNode from, GraphNode to) {
+ List<GraphNode> result = new ArrayList<GraphNode>();
if (from != null) {
result.add(from);
result.add(to);
}
- if (from == null || to == null)
+ if ((from == null) || (to == null)) {
return result;
+ }
- if (from == to)
+ if (from == to) {
return result;
+ }
int startX = Math.min(from.getX(), Math.min(to.getX(), Math.min(from.getX() + from.getWidth(), to.getX() + to.getWidth())));
int endX = Math.max(from.getX(), Math.max(to.getX(), Math.max(from.getX() + from.getWidth(), to.getX() + to.getWidth())));
int startY = Math.min(from.getY(), Math.min(to.getY(), Math.min(from.getY() + from.getHeight(), to.getY() + to.getHeight())));
int endY = Math.max(from.getY(), Math.max(to.getY(), Math.max(from.getY() + from.getHeight(), to.getY() + to.getHeight())));
- if (!hasChilden)
+ if (!fHasChilden) {
return result;
+ }
- Iterator<String> it = nodes.keySet().iterator();
+ Iterator<String> it = fNodes.keySet().iterator();
while (it.hasNext()) {
Object nodeType = it.next();
- List<GraphNode> nodesList = (List<GraphNode>) nodes.get(nodeType);
- if (nodesList == null || nodesList.isEmpty())
+ List<GraphNode> nodesList = fNodes.get(nodeType);
+ if (nodesList == null || nodesList.isEmpty()) {
return null;
+ }
for (int i = 0; i < nodesList.size(); i++) {
- GraphNode node = (GraphNode) nodesList.get(i);
+ GraphNode node = nodesList.get(i);
int nw = node.getWidth();
int nh = node.getHeight();
int nx = node.getX();
int ny = node.getY();
- if (contains(startX, startY, endX - startX, endY - startY, nx + 1, ny + 1) && contains(startX, startY, endX - startX, endY - startY, nx + nw - 2, ny + nh - 2))
+ if (contains(startX, startY, endX - startX, endY - startY, nx + 1, ny + 1) && contains(startX, startY, endX - startX, endY - startY, nx + nw - 2, ny + nh - 2)) {
result.add(node);
+ }
result.addAll(node.getNodeList(from, to));
}
}
- if ((to != null) && (!result.contains(to)))
+
+ if (!result.contains(to)) {
result.add(to);
+ }
return result;
}
* Returns the graph node which contains the point given in parameter for the given graph node list and starting the
* iteration at the given index<br>
* WARNING: Only graph nodes with smaller coordinates than the current visible area can be returned.<br>
- *
+ *
* @param x the x coordinate of the point to test
* @param y the y coordinate of the point to test
* @param list the list to search in
* @return the graph node containing the point given in parameter, null otherwise
*/
protected GraphNode getNodeFromListAt(int x, int y, List<GraphNode> list, int fromIndex) {
- if (list == null)
+ if (list == null) {
return null;
+ }
for (int i = fromIndex; i < list.size(); i++) {
- GraphNode node = (GraphNode) list.get(i);
- if (node.contains(x, y))
+ GraphNode node = list.get(i);
+ if (node.contains(x, y)) {
return node;
+ }
}
return null;
}
/**
* Returns the start event occurrence attached to this graphNode.
- *
+ *
* @return the start event occurrence attached to the graphNode
*/
public int getStartOccurrence() {
- return startEventOccurrence;
+ return fStartEventOccurrence;
}
/**
* Returns the end event occurrence attached to this graphNode
- *
+ *
* @return the start event occurrence attached to the graphNode
*/
public int getEndOccurrence() {
- return endEventOccurrence;
+ return fEndEventOccurrence;
}
/**
* Computes the index of the first visible GraphNode for each ordered graph node lists depending on the visible area
* given in parameter
- *
+ *
* @param x visible area top left corner x coordinate
* @param y visible area top left corner y coordinate
* @param width visible area width
* @param height visible area height
*/
public void updateIndex(int x, int y, int width, int height) {
- if (!hasChilden)
+ if (!fHasChilden) {
return;
+ }
if(TmfUiTracer.isIndexTraced()) {
TmfUiTracer.traceIndex("*****************************\n"); //$NON-NLS-1$
TmfUiTracer.traceIndex("Visible area position in virtual screen (x,y)= " + x + " " + y + "\n\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
- Iterator<String> it = nodes.keySet().iterator();
+ Iterator<String> it = fNodes.keySet().iterator();
while (it.hasNext()) {
String nodeType = it.next();
int direction = 1;
- int drawIndex = ((Integer) indexes.get(nodeType)).intValue();
+ int drawIndex = fIndexes.get(nodeType).intValue();
/*
* if (x==0) { drawIndex = 0; indexes.put(nodeType,new Integer(drawIndex)); }
*/
- if ((nodes.get(nodeType) != null) && (((List<GraphNode>) nodes.get(nodeType)).size() > 1)) {
- if (((GraphNode) ((List<GraphNode>) nodes.get(nodeType)).get(drawIndex)).positiveDistanceToPoint(x, y))
+ if ((fNodes.get(nodeType) != null) && (fNodes.get(nodeType).size() > 1)) {
+ if (fNodes.get(nodeType).get(drawIndex).positiveDistanceToPoint(x, y)) {
direction = -1;
+ }
- if (drawIndex == 0)
+ if (drawIndex == 0) {
direction = 1;
+ }
- if ((direction == -1) && (bnodes.get(nodeType) != null)) {
- GraphNode currentNode = (GraphNode) ((List<GraphNode>) nodes.get(nodeType)).get(drawIndex);
- drawIndex = Arrays.binarySearch(((List<GraphNode>) bnodes.get(nodeType)).toArray(new GraphNode[0]), ((List<GraphNode>) nodes.get(nodeType)).get(drawIndex), currentNode.getBackComparator());
- nodes.put(nodeType, (List<GraphNode>) bnodes.get(nodeType));
+ if ((direction == -1) && (fBackwardNodes.get(nodeType) != null)) {
+ GraphNode currentNode = fNodes.get(nodeType).get(drawIndex);
+ drawIndex = Arrays.binarySearch(fBackwardNodes.get(nodeType).toArray(new GraphNode[fBackwardNodes.get(nodeType).size()]),
+ fNodes.get(nodeType).get(drawIndex), currentNode.getBackComparator());
+ fNodes.put(nodeType, fBackwardNodes.get(nodeType));
if (drawIndex < 0) {
drawIndex = 0;
direction = 1;
- } else
- nodes.put(nodeType, (List<GraphNode>) bnodes.get(nodeType));
+ } else {
+ fNodes.put(nodeType, fBackwardNodes.get(nodeType));
+ }
}
GraphNode prev = null;
- for (int i = drawIndex; i < ((List<GraphNode>) nodes.get(nodeType)).size() && i >= 0; i = i + direction) {
+ for (int i = drawIndex; i < fNodes.get(nodeType).size() && i >= 0; i = i + direction) {
drawIndex = i;
- indexes.put(nodeType, Integer.valueOf(i));
+ fIndexes.put(nodeType, Integer.valueOf(i));
- GraphNode currentNode = (GraphNode) ((List<GraphNode>) nodes.get(nodeType)).get(i);
+ GraphNode currentNode = fNodes.get(nodeType).get(i);
- if (prev == null)
+ if (prev == null) {
prev = currentNode;
+ }
Comparator<GraphNode> comp = currentNode.getComparator();
- HashMap<String, Boolean> sort = fSort;
+ Map<String, Boolean> sort = fForwardSort;
- if (direction == -1) {
- if (currentNode.getBackComparator() != null) {
- comp = currentNode.getBackComparator();
- sort = bSort;
- }
+ if ((direction == -1) && (currentNode.getBackComparator() != null)) {
+ comp = currentNode.getBackComparator();
+ sort = fBackwardSort;
}
- if (i < ((List<GraphNode>) nodes.get(nodeType)).size() - 1) {
- GraphNode next = (GraphNode) ((List<GraphNode>) nodes.get(nodeType)).get(i + 1);
+ if (i < fNodes.get(nodeType).size() - 1) {
+ GraphNode next = fNodes.get(nodeType).get(i + 1);
- if ((comp != null) && (comp.compare(currentNode, next) == 1))
- sort.put(nodeType, Boolean.valueOf(true));
+ if ((comp != null) && (comp.compare(currentNode, next) > 0)) {
+ sort.put(nodeType, Boolean.TRUE);
+ }
}
if (direction == 1) {
- if (((GraphNode) ((List<GraphNode>) nodes.get(nodeType)).get(i)).positiveDistanceToPoint(x, y))
+ if (fNodes.get(nodeType).get(i).positiveDistanceToPoint(x, y)) {
break;
+ }
} else {
if (currentNode.getBackComparator() == null) {
if // (currentNode.isVisible(x,y,width,height)
- (!currentNode.positiveDistanceToPoint(x, y))
+ (!currentNode.positiveDistanceToPoint(x, y)) {
break;
+ }
} else {
if (currentNode.isVisible(x, y, width, height) && !currentNode.positiveDistanceToPoint(x, y)) {
- if ((comp != null) && (comp.compare(currentNode, prev) <= 0))
+ if ((comp != null) && (comp.compare(currentNode, prev) <= 0)) {
break;
- } else if ((comp != null) && (comp.compare(currentNode, prev) <= 0))
+ }
+ } else if ((comp != null) && (comp.compare(currentNode, prev) <= 0)) {
prev = currentNode;
+ }
}
}
}
- nodes.put(nodeType, fnodes.get(nodeType));
- if ((bnodes.get(nodeType) != null) && (direction == -1)) {
+ fNodes.put(nodeType, fForwardNodes.get(nodeType));
+ if ((fBackwardNodes.get(nodeType) != null) && (direction == -1)) {
// nodes.put(nodeType,fnodes.get(nodeType));
- int index = ((Integer) indexes.get(nodeType)).intValue();
- List<GraphNode> list = (List<GraphNode>) nodes.get(nodeType);
- List<GraphNode> backList = (List<GraphNode>) bnodes.get(nodeType);
- GraphNode currentNode = (GraphNode) (backList.get(index));
+ int index = fIndexes.get(nodeType).intValue();
+ List<GraphNode> list = fNodes.get(nodeType);
+ List<GraphNode> backList = fBackwardNodes.get(nodeType);
+ GraphNode currentNode = (backList.get(index));
if (index > 0) {
- index = Arrays.binarySearch(list.toArray(new GraphNode[0]), backList.get(index), currentNode.getComparator());
- if (index < 0)
+ index = Arrays.binarySearch(list.toArray(new GraphNode[list.size()]), backList.get(index), currentNode.getComparator());
+ if (index < 0) {
index = 0;
- indexes.put(nodeType, Integer.valueOf(index));
+ }
+ fIndexes.put(nodeType, Integer.valueOf(index));
}
}
- for (int i = drawIndex; i < ((List<GraphNode>) nodes.get(nodeType)).size() && i >= 0; i++) {
- GraphNode toDraw = (GraphNode) ((List<GraphNode>) nodes.get(nodeType)).get(i);
+ for (int i = drawIndex; i < fNodes.get(nodeType).size() && i >= 0; i++) {
+ GraphNode toDraw = fNodes.get(nodeType).get(i);
toDraw.updateIndex(x, y, width, height);
- if (!toDraw.isVisible(x, y, width, height))
+ if (!toDraw.isVisible(x, y, width, height)) {
break;
+ }
}
}
if (TmfUiTracer.isIndexTraced()) {
- TmfUiTracer.traceIndex("First drawn " + nodeType + " index = " + drawIndex + "\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ TmfUiTracer.traceIndex("First drawn " + nodeType + " index = " + drawIndex + "\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
TmfUiTracer.traceIndex(nodeType + " found in " + 0 + " iterations\n"); //$NON-NLS-1$ //$NON-NLS-2$
}
}
* Draws the children nodes on the given context.<br>
* This method start width GraphNodes ordering if needed.<br>
* After, depending on the visible area, only visible GraphNodes are drawn.<br>
- *
+ *
* @param context the context to draw to
- * @param drawFrame indicate if the frame rectangle need to be redrawn
* @see org.eclipse.linuxtools.tmf.ui.views.uml2sd.core.GraphNode#draw(IGC)
*/
protected void drawChildenNodes(IGC context) {
- if (!hasChilden)
+ if (!fHasChilden) {
return;
+ }
// If the nodes have not been added ordered, the array is ordered
- Iterator<String> it = fSort.keySet().iterator();
+ Iterator<String> it = fForwardSort.keySet().iterator();
while (it.hasNext()) {
String nodeType = it.next();
- boolean sort = ((Boolean) fSort.get(nodeType)).booleanValue();
+ boolean sort = fForwardSort.get(nodeType).booleanValue();
if (sort) {
- GraphNode[] temp = ((List<GraphNode>) fnodes.get(nodeType)).toArray(new GraphNode[0]);
- GraphNode node = (GraphNode) ((List<GraphNode>) nodes.get(nodeType)).get(0);
+ GraphNode[] temp = fForwardNodes.get(nodeType).toArray(new GraphNode[fForwardNodes.get(nodeType).size()]);
+ GraphNode node = fNodes.get(nodeType).get(0);
Arrays.sort(temp, node.getComparator());
- fSort.put(nodeType, Boolean.valueOf(false));
- nodes.put(nodeType, Arrays.asList(temp));
- fnodes.put(nodeType, Arrays.asList(temp));
- if (TmfUiTracer.isSortingTraced())
+ fForwardSort.put(nodeType, Boolean.FALSE);
+ fNodes.put(nodeType, Arrays.asList(temp));
+ fForwardNodes.put(nodeType, Arrays.asList(temp));
+ if (TmfUiTracer.isSortingTraced()) {
TmfUiTracer.traceSorting(nodeType + " array sorted\n"); //$NON-NLS-1$
+ }
}
}
- Iterator<String> it2 = bSort.keySet().iterator();
+ Iterator<String> it2 = fBackwardSort.keySet().iterator();
while (it2.hasNext()) {
String nodeType = it2.next();
- boolean sort = ((Boolean) bSort.get(nodeType)).booleanValue();
+ boolean sort = fBackwardSort.get(nodeType).booleanValue();
if (sort) {
- GraphNode[] temp = ((List<GraphNode>) bnodes.get(nodeType)).toArray(new GraphNode[0]);
- GraphNode node = (GraphNode) ((List<GraphNode>) nodes.get(nodeType)).get(0);
+ GraphNode[] temp = fBackwardNodes.get(nodeType).toArray(new GraphNode[fBackwardNodes.get(nodeType).size()]);
+ GraphNode node = fNodes.get(nodeType).get(0);
Arrays.sort(temp, node.getBackComparator());
- bSort.put(nodeType, Boolean.valueOf(false));
- bnodes.put(nodeType, Arrays.asList(temp));
- if (TmfUiTracer.isSortingTraced())
+ fBackwardSort.put(nodeType, Boolean.FALSE);
+ fBackwardNodes.put(nodeType, Arrays.asList(temp));
+ if (TmfUiTracer.isSortingTraced()) {
TmfUiTracer.traceSorting(nodeType + " back array sorted\n"); //$NON-NLS-1$
+ }
}
}
}
int arrayStep = 1;
- if ((Metrics.getMessageFontHeigth() + Metrics.MESSAGES_NAME_SPACING * 2) * context.getZoom() < Metrics.MESSAGE_SIGNIFICANT_VSPACING)
+ if ((Metrics.getMessageFontHeigth() + Metrics.MESSAGES_NAME_SPACING * 2) * context.getZoom() < Metrics.MESSAGE_SIGNIFICANT_VSPACING) {
arrayStep = Math.round(Metrics.MESSAGE_SIGNIFICANT_VSPACING / ((Metrics.getMessageFontHeigth() + Metrics.MESSAGES_NAME_SPACING * 2) * context.getZoom()));
+ }
int count = 0;
- Iterator<String> it3 = fSort.keySet().iterator();
+ Iterator<String> it3 = fForwardSort.keySet().iterator();
while (it3.hasNext()) {
count = 0;
Object nodeType = it3.next();
- GraphNode node = (GraphNode) ((List<GraphNode>) nodes.get(nodeType)).get(0);
- context.setFont(Frame.getUserPref().getFont(node.prefId));
- int index = ((Integer) indexes.get(nodeType)).intValue();
- count = drawNodes(context, (List<GraphNode>) nodes.get(nodeType), index, arrayStep);
- if (TmfUiTracer.isDisplayTraced())
+ GraphNode node = fNodes.get(nodeType).get(0);
+ context.setFont(SDViewPref.getInstance().getFont(node.fPrefId));
+ int index = fIndexes.get(nodeType).intValue();
+ count = drawNodes(context, fNodes.get(nodeType), index, arrayStep);
+ if (TmfUiTracer.isDisplayTraced()) {
TmfUiTracer.traceDisplay(count + " " + nodeType + " drawn, starting from index " + index + "\r\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
}
if (TmfUiTracer.isDisplayTraced()) {
TmfUiTracer.traceDisplay("*****************************\n"); //$NON-NLS-1$
/**
* Draw the GraphNode stored in the given list, starting at index startIndex with the given step
- *
+ *
* @param context the context to draw to
* @param list the GraphNodes list
* @param startIndex the start index
* @return the number of GraphNodes drawn
*/
protected int drawNodes(IGC context, List<GraphNode> list, int startIndex, int step) {
- if (!hasChilden)
+ if (!fHasChilden) {
return 0;
+ }
GraphNode last = null;
int nodesCount = 0;
- if (list.size() < 0)
+ if (list.size() < 0) {
return 0;
+ }
- GraphNode node = (GraphNode) list.get(0);
- context.setFont(Frame.getUserPref().getFont(node.prefId));
+ GraphNode node = list.get(0);
+ context.setFont(SDViewPref.getInstance().getFont(node.fPrefId));
Comparator<GraphNode> comparator = node.getComparator();
for (int i = startIndex; i < list.size(); i = i + step) {
- GraphNode toDraw = (GraphNode) list.get(i);
+ GraphNode toDraw = list.get(i);
if (i < list.size() - 1) {
- GraphNode next = (GraphNode) list.get(i + 1);
- if ((comparator != null) && (comparator.compare(toDraw, next) == 1)) {
- fSort.put(next.getArrayId(), Boolean.valueOf(true));
+ GraphNode next = list.get(i + 1);
+ if ((comparator != null) && (comparator.compare(toDraw, next) > 0)) {
+ fForwardSort.put(next.getArrayId(), Boolean.TRUE);
}
}
int cx = context.getContentsX();
int cw = context.getVisibleWidth();
int ch = context.getVisibleHeight();
// The arrays should be ordered, no needs to continue for this one
- if (!toDraw.isVisible(cx, cy, cw, ch) && toDraw.positiveDistanceToPoint(cx + cw, cy + ch))
+ if (!toDraw.isVisible(cx, cy, cw, ch) && toDraw.positiveDistanceToPoint(cx + cw, cy + ch)) {
break;
+ }
// ***Common*** nodes visibility
if ((!toDraw.isSameAs(last) || toDraw.isSelected()) && (toDraw.isVisible(context.getContentsX(), context.getContentsY(), context.getVisibleWidth(), context.getVisibleHeight()))) {
nodesCount++;
-
+
toDraw.draw(context);
- if (hasFocus())
+ if (hasFocus()) {
toDraw.drawFocus(context);
+ }
}
last = toDraw;
}
return nodesCount;
}
+ /**
+ * Draws the focus within the graphical context.
+ *
+ * @param context
+ * The context
+ */
public void drawFocus(IGC context) {
context.drawFocus(getX(), getY(), getWidth(), getHeight());
}
/**
* Determine if the given point (px,py) is contained in the rectangle (x,y,width,height)
- *
+ *
* @param x the rectangle x coordinate
* @param y the rectangle y coordinate
* @param width the rectangle width