| /* |
| * 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.apache.ivyde.eclipse.resolvevisualizer; |
| |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.Map; |
| |
| import org.apache.ivyde.eclipse.resolvevisualizer.label.ConfigurationConflictAlgorithm; |
| import org.apache.ivyde.eclipse.resolvevisualizer.label.ConnectionStyle; |
| import org.apache.ivyde.eclipse.resolvevisualizer.label.DirectDependenciesAlgorithm; |
| import org.apache.ivyde.eclipse.resolvevisualizer.label.ILabelDecoratorAlgorithm; |
| import org.apache.ivyde.eclipse.resolvevisualizer.label.ShortestRootPathAlgorithm; |
| import org.apache.ivyde.eclipse.resolvevisualizer.model.IvyNodeElement; |
| import org.eclipse.draw2d.ColorConstants; |
| import org.eclipse.draw2d.IFigure; |
| import org.eclipse.draw2d.Label; |
| import org.eclipse.jface.viewers.ILabelProvider; |
| import org.eclipse.jface.viewers.ILabelProviderListener; |
| import org.eclipse.swt.graphics.Color; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.widgets.Display; |
| import org.eclipse.zest.core.viewers.EntityConnectionData; |
| import org.eclipse.zest.core.viewers.GraphViewer; |
| import org.eclipse.zest.core.viewers.IConnectionStyleProvider; |
| import org.eclipse.zest.core.viewers.IEntityStyleProvider; |
| import org.eclipse.zest.core.widgets.ZestStyles; |
| |
| /** |
| * Alters the color of the labels and connections based on the selected analysis algorithm. |
| */ |
| public class IvyNodeLabelProvider implements ILabelProvider, IConnectionStyleProvider, IEntityStyleProvider { |
| public Color GRAY = new Color(Display.getDefault(), 128, 128, 128); |
| public Color LIGHT_GRAY = new Color(Display.getDefault(), 220, 220, 220); |
| public Color BLACK = new Color(Display.getDefault(), 0, 0, 0); |
| public Color RED = new Color(Display.getDefault(), 255, 0, 0); |
| public Color LIGHT_GREEN = new Color(Display.getDefault(), 96, 255, 96); |
| |
| private IvyNodeElement selected = null; |
| private IvyNodeElement rootNode = null; |
| private Map/* <EntityConnectionData, Color> */highlightedRelationships = new HashMap/* <EntityConnectionData, Color> */(); |
| private Map/* <IvyNodeElement, Color> */highlightedDependencies = new HashMap/* <IvyNodeElement, Color> */(); |
| private Color disabledColor = null; |
| private IvyNodeElement pinnedNode = null; |
| private GraphViewer viewer; |
| |
| private ILabelDecoratorAlgorithm autoSelectDecorator = new ShortestRootPathAlgorithm(); |
| private DirectDependenciesAlgorithm rootDirectDependenciesDecorator = new DirectDependenciesAlgorithm();; |
| private ConfigurationConflictAlgorithm conflictDecorator = new ConfigurationConflictAlgorithm(); |
| |
| private Color rootColor; |
| private Color rootSelectedColor; |
| |
| public IvyNodeLabelProvider(GraphViewer viewer) { |
| this.viewer = viewer; |
| this.rootDirectDependenciesDecorator.setStyles(new Color(Display.getDefault(), 197, 237, 197), |
| new ConnectionStyle(ZestStyles.CONNECTIONS_SOLID, new Color(Display.getDefault(), 175, 175, 175), 1, |
| false)); |
| } |
| |
| public Image getImage(Object element) { |
| if (element instanceof IvyNodeElement) { |
| IvyNodeElement node = (IvyNodeElement) element; |
| if (node.isEvicted()) { |
| return ResolveVisualizerPlugin.getImageDescriptor("icons/evicted.gif").createImage(); |
| } |
| } |
| |
| return null; |
| } |
| |
| public String getText(Object element) { |
| if (element instanceof IvyNodeElement) { |
| IvyNodeElement node = (IvyNodeElement) element; |
| String text = node.getOrganization() + "#" + node.getName() + ";"; |
| if (node.getRevision().indexOf("working@") != -1) |
| text += "WORKSPACE"; |
| else |
| text += node.getRevision(); |
| return text; |
| } |
| |
| return ""; |
| } |
| |
| public void addListener(ILabelProviderListener listener) { |
| } |
| |
| public void removeListener(ILabelProviderListener listener) { |
| } |
| |
| public boolean isLabelProperty(Object element, String property) { |
| return false; |
| } |
| |
| /** |
| * Colors all connections regardless of their selection status. |
| */ |
| public Color getColor(Object rel) { |
| if (highlightedRelationships.keySet().contains(rel)) { |
| ConnectionStyle style = (ConnectionStyle) highlightedRelationships.get(rel); |
| return style.getHighlightColor(); |
| } |
| return LIGHT_GRAY; |
| } |
| |
| public int getConnectionStyle(Object rel) { |
| return ZestStyles.CONNECTIONS_DIRECTED; |
| } |
| |
| /** |
| * Colors "highlighted" relationships. We want to differentiate between those highlighted programatically by the |
| * auto-select mechanism, and those hand-selected by the user. |
| */ |
| public Color getHighlightColor(Object rel) { |
| if (highlightedRelationships.keySet().contains(rel)) { |
| ConnectionStyle style = (ConnectionStyle) highlightedRelationships.get(rel); |
| return style.getHighlightColor(); |
| } |
| return ColorConstants.blue; |
| } |
| |
| public Color getNodeHighlightColor(Object entity) { |
| return null; |
| } |
| |
| public int getLineWidth(Object rel) { |
| if (highlightedRelationships.keySet().contains(rel)) { |
| ConnectionStyle style = (ConnectionStyle) highlightedRelationships.get(rel); |
| if (style.isRevealOnHighlight()) { |
| return style.getLineWidth(); |
| } |
| } |
| return 1; |
| } |
| |
| public Color getAdjacentEntityHighlightColor(Object entity) { |
| return null; |
| } |
| |
| public Color getBorderColor(Object entity) { |
| if (this.selected != null || this.pinnedNode != null) { |
| if (entity == this.selected || entity == this.pinnedNode) { |
| return BLACK; |
| } else if (highlightedDependencies.keySet().contains(entity)) { |
| // If this entity is directly connected to the selected entity |
| return BLACK; |
| } else { |
| return LIGHT_GRAY; |
| } |
| |
| } |
| |
| return BLACK; |
| } |
| |
| public Color getBorderHighlightColor(Object entity) { |
| return null; |
| } |
| |
| public int getBorderWidth(Object entity) { |
| return 0; |
| } |
| |
| public Color getBackgroundColour(Object entity) { |
| |
| if (entity == this.rootNode) { |
| if (rootColor == null) { |
| rootColor = LIGHT_GREEN; |
| } |
| return rootColor; |
| } |
| if (highlightedDependencies.keySet().contains(entity)) { |
| return (Color) highlightedDependencies.get(entity); // viewer.getGraphControl().HIGHLIGHT_ADJACENT_COLOR; |
| } else { |
| return viewer.getGraphControl().DEFAULT_NODE_COLOR; |
| } |
| } |
| |
| public Color getForegroundColour(Object entity) { |
| if (this.selected != null || this.pinnedNode != null) { |
| if (entity == this.selected || this.pinnedNode == entity) { |
| return BLACK; |
| } else if (highlightedDependencies.keySet().contains(entity)) { |
| // If this entity is directly connected to the selected entity |
| return BLACK; |
| } else { |
| return GRAY; |
| } |
| |
| } |
| return BLACK; |
| } |
| |
| public void setPinnedNode(IvyNodeElement pinnedNode) { |
| this.pinnedNode = pinnedNode; |
| } |
| |
| protected IvyNodeElement getSelected() { |
| if (pinnedNode != null) { |
| return pinnedNode; |
| } |
| return selected; |
| } |
| |
| /** |
| * Sets the current selection |
| * |
| * @param root |
| * @param currentSelection |
| */ |
| public void setCurrentSelection(IvyNodeElement root, IvyNodeElement currentSelection) { |
| for (Iterator iter = highlightedRelationships.keySet().iterator(); iter.hasNext();) { |
| EntityConnectionData entityConnectionData = (EntityConnectionData) iter.next(); |
| |
| ConnectionStyle style = (ConnectionStyle) highlightedRelationships.get(entityConnectionData); |
| if (style.isRevealOnHighlight()) { |
| viewer.unReveal(entityConnectionData); |
| } |
| } |
| |
| this.rootNode = root; |
| this.selected = null; |
| this.selected = currentSelection; |
| |
| highlightedRelationships = new HashMap/* <EntityConnectionData, Color> */(); |
| highlightedDependencies = new HashMap/* <IvyNodeElement, Color> */(); |
| |
| rootDirectDependenciesDecorator.calculateHighlighted(root, root, highlightedRelationships, |
| highlightedDependencies); |
| conflictDecorator.calculateHighlighted(root, root, highlightedRelationships, highlightedDependencies); |
| |
| if (this.selected != null || this.pinnedNode != null) { |
| autoSelectDecorator.calculateHighlighted(root, selected, highlightedRelationships, highlightedDependencies); |
| } |
| |
| Object[] connections = viewer.getConnectionElements(); |
| for (Iterator iter = highlightedRelationships.keySet().iterator(); iter.hasNext();) { |
| Object entityConnectionData = iter.next(); |
| |
| ConnectionStyle style = (ConnectionStyle) highlightedRelationships.get(entityConnectionData); |
| if (style.isRevealOnHighlight()) { |
| viewer.reveal(entityConnectionData); |
| } |
| } |
| |
| for (int i = 0; i < connections.length; i++) { |
| viewer.update(connections[i], null); |
| } |
| } |
| |
| public void dispose() { |
| if (this.disabledColor != null) { |
| this.disabledColor.dispose(); |
| this.disabledColor = null; |
| } |
| if (this.rootColor != null) { |
| this.rootColor.dispose(); |
| this.rootColor = null; |
| } |
| if (this.rootSelectedColor != null) { |
| this.rootSelectedColor.dispose(); |
| this.rootSelectedColor = null; |
| } |
| } |
| |
| public IFigure getTooltip(Object entity) { |
| if (entity instanceof EntityConnectionData) { |
| EntityConnectionData connection = (EntityConnectionData) entity; |
| IvyNodeElement source = (IvyNodeElement) connection.source; |
| IvyNodeElement dest = (IvyNodeElement) connection.dest; |
| |
| String[] confs = dest.getCallerConfigurations(source); |
| String tooltipText = ""; |
| for (int i = 0; i < confs.length; i++) { |
| tooltipText += confs[i] + ", "; |
| } |
| return new Label(tooltipText.substring(0, tooltipText.length() - 2)); |
| } |
| |
| return null; |
| } |
| |
| public boolean fisheyeNode(Object entity) { |
| return false; |
| } |
| |
| public void setAutoSelectDecorator(ILabelDecoratorAlgorithm decoratorAlgorithm) { |
| this.autoSelectDecorator = decoratorAlgorithm; |
| } |
| } |