/******************************************************************************* * Copyright 2005-2006, CHISEL Group, University of Victoria, Victoria, BC, * Canada. 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: The Chisel Group, University of Victoria ******************************************************************************/ package org.eclipse.zest.core.viewers.internal; import org.eclipse.draw2d.IFigure; import org.eclipse.jface.viewers.IBaseLabelProvider; import org.eclipse.jface.viewers.IColorProvider; import org.eclipse.jface.viewers.IFontProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.SWTError; import org.eclipse.swt.graphics.Color; import org.eclipse.zest.core.viewers.IConnectionStyleProvider; import org.eclipse.zest.core.viewers.IEntityConnectionStyleProvider; import org.eclipse.zest.core.viewers.IEntityStyleProvider; import org.eclipse.zest.core.viewers.ISelfStyleProvider; import org.eclipse.zest.core.widgets.GraphConnection; import org.eclipse.zest.core.widgets.GraphItem; import org.eclipse.zest.core.widgets.GraphNode; import org.eclipse.zest.core.widgets.ZestStyles; /* * Helper class used to style graph elements based on graph element stylers. * * @author Del Myers */ // @tag bug(151327-Styles) : created to help resolve this bug public class GraphItemStyler { public static void styleItem(GraphItem item, final IBaseLabelProvider labelProvider) { if (item instanceof GraphNode) { GraphNode node = (GraphNode) item; // set defaults. if (node.getGraphModel().getNodeStyle() != ZestStyles.NONE) { node.setNodeStyle(node.getGraphModel().getNodeStyle()); } else { node.setNodeStyle(SWT.NONE); } Object entity = node.getData(); if (labelProvider instanceof IEntityStyleProvider) { styleNode(node, (IEntityStyleProvider) labelProvider); } if (labelProvider instanceof IColorProvider) { IColorProvider colorProvider = (IColorProvider) labelProvider; node.setForegroundColor(colorProvider.getForeground(entity)); node.setBackgroundColor(colorProvider.getBackground(entity)); } if (labelProvider instanceof IFontProvider) { IFontProvider fontProvider = (IFontProvider) labelProvider; node.setFont(fontProvider.getFont(entity)); } if (labelProvider instanceof ILabelProvider) { String text = ((ILabelProvider) labelProvider).getText(node.getData()); node.setText((text != null) ? text : ""); node.setImage(((ILabelProvider) labelProvider).getImage(node.getData())); } if (labelProvider instanceof ISelfStyleProvider) { ((ISelfStyleProvider) labelProvider).selfStyleNode(entity, node); } } else if (item instanceof GraphConnection) { GraphConnection conn = (GraphConnection) item; // set defaults if (conn.getGraphModel().getConnectionStyle() != ZestStyles.NONE) { int s = conn.getGraphModel().getConnectionStyle(); conn.setConnectionStyle(s); } else { conn.setConnectionStyle(SWT.NONE); } if (labelProvider instanceof ILabelProvider) { String text = ((ILabelProvider) labelProvider).getText(conn.getExternalConnection()); conn.setText((text != null) ? text : ""); conn.setImage(((ILabelProvider) labelProvider).getImage(conn.getExternalConnection())); } if (labelProvider instanceof IEntityConnectionStyleProvider) { styleEntityConnection(conn, (IEntityConnectionStyleProvider) labelProvider); } else if (labelProvider instanceof IConnectionStyleProvider) { styleConnection(conn, (IConnectionStyleProvider) labelProvider); } int swt = getLineStyleForZestStyle(conn.getConnectionStyle()); conn.setLineStyle(swt); if (labelProvider instanceof ISelfStyleProvider) { ((ISelfStyleProvider) labelProvider).selfStyleConnection(conn.getData(), conn); } } } /** * @param conn * @param provider */ private static void styleConnection(GraphConnection conn, IConnectionStyleProvider provider) { Object rel = conn.getExternalConnection(); Color c; int style = provider.getConnectionStyle(rel); if (!ZestStyles.validateConnectionStyle(style)) { throw new SWTError(SWT.ERROR_INVALID_ARGUMENT); } if (style != ZestStyles.NONE) { conn.setConnectionStyle(style); } // @tag bug(152530-Bezier(fix)) // @tat TODO curves bezier: Add back the bezier connection stuff // if (ZestStyles.checkStyle(conn.getConnectionStyle(), // ZestStyles.CONNECTIONS_BEZIER) // && provider instanceof IConnectionStyleBezierExtension) { // IConnectionStyleBezierExtension bezier = // (IConnectionStyleBezierExtension) provider; // double d; // if (!Double.isNaN((d = bezier.getStartAngle(rel)))) { // conn.setStartAngle(d); // } // if (!Double.isNaN((d = bezier.getEndAngle(rel)))) { // conn.setEndAngle(d); // } // if (!Double.isNaN((d = bezier.getStartDistance(rel)))) { // conn.setStartLength(d); // } // if (!Double.isNaN((d = bezier.getEndDistance(rel)))) { // conn.setEndLength(d); // } // } if ((c = provider.getHighlightColor(rel)) != null) { conn.setHighlightColor(c); } if ((c = provider.getColor(rel)) != null) { conn.setLineColor(c); } IFigure tooltip; if ((tooltip = provider.getTooltip(rel)) != null) { conn.setTooltip(tooltip); } int w = -1; if ((w = provider.getLineWidth(rel)) >= 0) { conn.setLineWidth(w); } } /** * @param conn * @param provider */ private static void styleEntityConnection(GraphConnection conn, IEntityConnectionStyleProvider provider) { Object src = conn.getSource().getData(); Object dest = conn.getDestination().getData(); Color c; int style = provider.getConnectionStyle(src, dest); if (!ZestStyles.validateConnectionStyle(style)) { throw new SWTError(SWT.ERROR_INVALID_ARGUMENT); } if (style != ZestStyles.NONE) { conn.setConnectionStyle(style); } // @tag bug(152530-Bezier(fisx)) // @tag TODO curved connections bezier : add back the bezier connection stuff // if (ZestStyles.checkStyle(conn.getConnectionStyle(), // ZestStyles.CONNECTIONS_BEZIER) // && provider instanceof IEntityConnectionStyleBezierExtension) { // IEntityConnectionStyleBezierExtension bezier = // (IEntityConnectionStyleBezierExtension) provider; // double d; // if (!Double.isNaN((d = bezier.getStartAngle(src, dest)))) { // conn.setStartAngle(d); // } // if (!Double.isNaN((d = bezier.getEndAngle(src, dest)))) { // conn.setEndAngle(d); // } // if (!Double.isNaN((d = bezier.getStartDistance(src, dest)))) { // conn.setStartLength(d); // } // if (!Double.isNaN((d = bezier.getEndDistance(src, dest)))) { // conn.setEndLength(d); // } // } if ((c = provider.getColor(src, dest)) != null) { conn.setLineColor(c); } if ((c = provider.getHighlightColor(src, dest)) != null) { conn.setHighlightColor(c); } int w = -1; if ((w = provider.getLineWidth(src, dest)) >= 0) { conn.setLineWidth(w); } } /** * Styles the given node according to the properties in the style provider. * * @param node * the graph element to style. * @param data * the element that is being styled. * @param provider * the style provier. */ // @tag bug(151327-Styles) : resolution private static void styleNode(GraphNode node, IEntityStyleProvider provider) { Object entity = node.getData(); // @tag ADJACENT : Removed highlight adjacent //node.setHighlightAdjacentNodes(provider.highlightAdjacentEntities(entity)); // @tag ADJACENT : Removed highlight adjacent /* if (provider.highlightAdjacentEntities(entity)) { Color c = provider.getAdjacentEntityHighlightColor(entity); if (c != null) { node.setHighlightAdjacentColor(c); } } */ Color c; IFigure figure; int width = -1; if (provider.fisheyeNode(entity) == true) { node.setNodeStyle(node.getNodeStyle() | ZestStyles.NODES_FISHEYE); } if ((c = provider.getBorderColor(entity)) != null) { node.setBorderColor(c); } if ((c = provider.getBorderHighlightColor(entity)) != null) { node.setBorderHighlightColor(c); } if ((c = provider.getNodeHighlightColor(entity)) != null) { node.setHighlightColor(c); } if ((c = provider.getBackgroundColour(entity)) != null) { node.setBackgroundColor(c); } if ((c = provider.getForegroundColour(entity)) != null) { node.setForegroundColor(c); } if ((width = provider.getBorderWidth(entity)) >= 0) { node.setBorderWidth(width); } if ((figure = provider.getTooltip(entity)) != null) { node.setTooltip(figure); } } /** * Returns the SWT line style for the given zest connection style. * */ public static int getLineStyleForZestStyle(int style) { int lineStyles = ZestStyles.CONNECTIONS_DASH_DOT | ZestStyles.CONNECTIONS_DASH | ZestStyles.CONNECTIONS_DOT | ZestStyles.CONNECTIONS_SOLID; style = style & lineStyles; if (style == 0) { style = ZestStyles.CONNECTIONS_SOLID; } switch (style) { case ZestStyles.CONNECTIONS_DASH_DOT: return SWT.LINE_DASHDOT; case ZestStyles.CONNECTIONS_DASH: return SWT.LINE_DASH; case ZestStyles.CONNECTIONS_DOT: return SWT.LINE_DOT; } return SWT.LINE_SOLID; } }