/***************************************************************************** * Limpet - the Lightweight InforMation ProcEssing Toolkit * http://limpet.info * * (C) 2015-2016, Deep Blue C Technologies Ltd * * This library is free software; you can redistribute it and/or * modify it under the terms of the Eclipse Public License v1.0 * (http://www.eclipse.org/legal/epl-v10.html) * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *****************************************************************************/ package info.limpet.ui.decorators; import info.limpet.ICollection; import info.limpet.ICommand; import info.limpet.ui.Activator; import info.limpet.ui.data_provider.data.CollectionWrapper; import info.limpet.ui.data_provider.data.CommandWrapper; import info.limpet.ui.data_provider.data.GroupWrapper; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.IDecoration; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ILightweightLabelDecorator; import org.eclipse.ui.plugin.AbstractUIPlugin; public class LimpetDecorator implements ILightweightLabelDecorator { private static final ImageDescriptor TIME; private static final ImageDescriptor SINGLE; private static final ImageDescriptor LEFT_ARROW; private static final ImageDescriptor RIGHT_ARROW; private static final ImageDescriptor TWO_WAY_ARROW; private static final ImageDescriptor DYNAMIC; static { LEFT_ARROW = AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/left.png"); RIGHT_ARROW = AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/right.png"); TWO_WAY_ARROW = AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/left_right.png"); TIME = AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/clock.png"); SINGLE = AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/singleton.png"); // TODO: switch to better "dynamic/connected" icon. DYNAMIC = AbstractUIPlugin.imageDescriptorFromPlugin(Activator.PLUGIN_ID, "icons/plus.png"); } @Override public void addListener(ILabelProviderListener listener) { } @Override public void dispose() { } @Override public boolean isLabelProperty(Object element, String property) { return false; } @Override public void removeListener(ILabelProviderListener listener) { } @Override public void decorate(Object element, IDecoration decoration) { if (element instanceof CollectionWrapper) { decorateWrapper((CollectionWrapper) element, decoration); } if (element instanceof CommandWrapper) { decorateWrapper((CommandWrapper) element, decoration); } if (element instanceof GroupWrapper) { decorateWrapper((GroupWrapper) element, decoration); } } protected void decorateWrapper(GroupWrapper element, IDecoration decoration) { // we don't currently apply and decorations to groups } protected void decorateWrapper(CommandWrapper element, IDecoration decoration) { final ICommand<?> coll = element.getCommand(); boolean in = coll.getInputs() != null && coll.getInputs().size() > 0; boolean out = coll.getOutputs() != null && coll.getOutputs().size() > 0; decorateInOut(decoration, in, out); // also apply a decoration to indicate that the symbol is dynamically updating if (coll.getDynamic()) { decoration.addOverlay(DYNAMIC, IDecoration.BOTTOM_RIGHT); } } protected void decorateWrapper(CollectionWrapper element, IDecoration decoration) { final ICollection coll = element.getCollection(); boolean out = coll.getPrecedent() != null; boolean in = coll.getDependents() != null && coll.getDependents().size() > 0; decorateInOut(decoration, in, out); if (coll.isTemporal()) { decoration.addOverlay(TIME, IDecoration.BOTTOM_RIGHT); } if (coll.getValuesCount() == 1) { decoration.addOverlay(SINGLE, IDecoration.BOTTOM_LEFT); } } private void decorateInOut(IDecoration decoration, boolean in, boolean out) { if (in && out) { decoration.addOverlay(TWO_WAY_ARROW, IDecoration.TOP_RIGHT); } else if (out) { decoration.addOverlay(LEFT_ARROW, IDecoration.TOP_RIGHT); } else if (in) { decoration.addOverlay(RIGHT_ARROW, IDecoration.TOP_RIGHT); } } }