package org.projectusus.ui.dependencygraph.nodes;
import static org.eclipse.zest.core.widgets.ZestStyles.CONNECTIONS_DOT;
import static org.eclipse.zest.core.widgets.ZestStyles.CONNECTIONS_SOLID;
import static org.projectusus.ui.colors.UsusColors.BLACK;
import static org.projectusus.ui.colors.UsusColors.getSharedColors;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Label;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.zest.core.viewers.EntityConnectionData;
import org.eclipse.zest.core.viewers.IEntityConnectionStyleProvider;
import org.eclipse.zest.core.viewers.IEntityStyleProvider;
import org.projectusus.core.filerelations.model.Packagename;
import org.projectusus.core.util.Defect;
import org.projectusus.ui.colors.UsusColors;
public class NodeLabelProvider extends LabelProvider implements IEntityStyleProvider, IEntityConnectionStyleProvider {
private static final double DEFAULT_ZOOM = 1d;
private double zoom = DEFAULT_ZOOM;
private boolean highlightStrongConnections;
private final IEdgeColorProvider edgeColorProvider;
public NodeLabelProvider( IEdgeColorProvider edgeColorProvider ) {
this.edgeColorProvider = edgeColorProvider;
}
@Override
public String getText( Object element ) {
if( element instanceof GraphNode ) {
return ((GraphNode)element).getDisplayText();
}
if( element instanceof EntityConnectionData ) {
return getText( (EntityConnectionData)element );
}
throw new Defect( "Type not supported: " + element.getClass().toString() );
}
private String getText( EntityConnectionData data ) {
return ((GraphNode)data.dest).getEdgeEndLabel();
}
@Override
public Image getImage( Object element ) {
if( element instanceof GraphNode ) {
return JavaUI.getSharedImages().getImage( ((GraphNode)element).getImageName() );
}
return null;
}
// From IEntityStyleProvider
public Color getBackgroundColour( Object element ) {
if( element instanceof GraphNode ) {
Packagename packageName = ((GraphNode)element).getRelatedPackage();
return UsusColors.getSharedColors().getNodeColorFor( packageName.hashCode() );
}
return null;
}
public Color getNodeHighlightColor( Object entity ) {
return null;
}
public Color getBorderColor( Object entity ) {
return getSharedColors().getColor( BLACK );
}
public Color getBorderHighlightColor( Object entity ) {
return null;
}
public int getBorderWidth( Object entity ) {
return 0;
}
public Color getForegroundColour( Object entity ) {
if( isVeryDark( entity ) ) {
return getSharedColors().getColor( UsusColors.WHITE );
}
return getSharedColors().getColor( BLACK );
}
private boolean isVeryDark( Object entity ) {
float[] hsb = getBackgroundColour( entity ).getRGB().getHSB();
float saturation = hsb[1];
float brightness = hsb[2];
return (saturation > 0.6 || brightness < 0.85);
}
public IFigure getTooltip( Object entity ) {
if( entity instanceof GraphNode ) {
Label label = new Label();
label.setText( ((GraphNode)entity).getTooltipText() );
return label;
}
return null;
}
public boolean fisheyeNode( Object entity ) {
return false;
}
// From IEntityConnectionStyleProvider
public int getConnectionStyle( Object src, Object dest ) {
if( isCrossPackageRelation( src, dest ) ) {
return CONNECTIONS_SOLID;
}
return CONNECTIONS_DOT;
}
public Color getColor( Object src, Object dest ) {
return edgeColorProvider.getEdgeColor( src, dest, highlightStrongConnections );
}
public Color getHighlightColor( Object src, Object dest ) {
return null;
}
public int getLineWidth( Object src, Object dest ) {
if( isCrossPackageRelation( src, dest ) ) {
return zoomed( 2 );
}
return zoomed( 1 );
}
private int zoomed( int width ) {
return (int)Math.round( zoom * width );
}
public void setZoom( double zoom ) {
this.zoom = zoom;
}
public void resetZoom() {
setZoom( DEFAULT_ZOOM );
}
public void setHighlightStrongConnections( boolean highlightStrongConnections ) {
this.highlightStrongConnections = highlightStrongConnections;
}
public static boolean isCrossPackageRelation( Object src, Object dest ) {
if( (src instanceof GraphNode) && dest instanceof GraphNode ) {
return ((GraphNode)src).isInDifferentPackageThan( (GraphNode)dest );
}
return false;
}
}