package org.projectusus.ui.dependencygraph.colorProvider;
import static org.projectusus.ui.colors.UsusColors.DARK_RED;
import static org.projectusus.ui.colors.UsusColors.getSharedColors;
import java.util.Set;
import org.eclipse.swt.graphics.Color;
import org.projectusus.core.filerelations.model.PackageRelations;
import org.projectusus.core.filerelations.model.Packagename;
import org.projectusus.ui.dependencygraph.nodes.IEdgeColorProvider;
import org.projectusus.ui.dependencygraph.nodes.PackageRepresenter;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
public class PackageEdgeColorProvider implements IEdgeColorProvider {
private Supplier<PackageRelations> packageRelationsSupplier;
private Predicate<Packagename> isVisible;
public PackageEdgeColorProvider() {
isVisible = Predicates.<Packagename> alwaysTrue();
calculatePackageRelations();
}
public Color getEdgeColor( Object src, Object dest, boolean highlightStrongConnections ) {
if( highlightStrongConnections ) {
float saturation = computeSaturation( src, dest );
return getSharedColors().adjustSaturation( DARK_RED, saturation );
}
return getSharedColors().getColor( DARK_RED );
}
private float computeSaturation( Object src, Object dest ) {
PackageRelations packageRelations = packageRelationsSupplier.get();
int crossLinkCount = getCrossLinkCount( (PackageRepresenter)src, (PackageRepresenter)dest, packageRelations );
float maxCrossLinkCount = packageRelations.getMaxCrossLinkCount();
float saturation = crossLinkCount / maxCrossLinkCount;
return saturation;
}
private int getCrossLinkCount( PackageRepresenter src, PackageRepresenter target, PackageRelations packageRelations ) {
return packageRelations.getCrossLinkCount( src.getPackagename(), target.getPackagename() );
}
public void recalculateColors( final Set<Packagename> visiblePackages ) {
isVisible = new Predicate<Packagename>() {
public boolean apply( Packagename packagename ) {
return visiblePackages.contains( packagename );
}
};
calculatePackageRelations();
}
public void calculatePackageRelations() {
packageRelationsSupplier = Suppliers.memoize( new Supplier<PackageRelations>() {
public PackageRelations get() {
return new PackageRelations( isVisible );
}
} );
}
}