/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2012-2013, Geomatys
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* 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. See the GNU
* Lesser General Public License for more details.
*/
package org.geotoolkit.gui.swing.etl;
import static org.geotoolkit.gui.swing.etl.ChainEditorConstants.*;
import java.awt.BasicStroke;
import java.util.ArrayList;
import java.util.List;
import org.geotoolkit.processing.chain.model.DataLink;
import org.geotoolkit.processing.chain.model.event.EventChain;
import org.netbeans.api.visual.action.TwoStateHoverProvider;
import org.netbeans.api.visual.widget.ConnectionWidget;
import org.netbeans.api.visual.widget.Widget;
/**
*
* @author Quentin Boileau (Geomatys)
*/
public class ProviderWidgetHover implements TwoStateHoverProvider {
public ProviderWidgetHover() {
}
@Override
public void unsetHovering(Widget widget) {
final ChainScene scene = getWidgetScene(widget);
// if (widget instanceof WElementProcess) {
// final WElementProcess elem = (WElementProcess) widget;
// elem.setBorder(BorderFactory.createRoundedBorder(20, 20, 8, 8, elem.getBgColor(), elem.getBgColor()));
// } else if (widget instanceof WElementCondition) {
// final WElementCondition elem = (WElementCondition) widget;
// elem.setBorder(BorderFactory.createRoundedBorder(20, 20, 8, 8, elem.getBgColor(), elem.getBgColor()));
// }
if (scene != null) {
final EventChain chain = scene.getChain();
for (DataLink link : chain.getDataLinks()) {
final ConnectionWidget linkWidget = (ConnectionWidget) scene.getWidget(link);
if (linkWidget != null) {
linkWidget.setLineColor(DEFAULT_LINE_COLOR);
linkWidget.setStroke(new BasicStroke(1.0f));
}
}
scene.validate();
}
}
@Override
public void setHovering(Widget widget) {
final List<ConnectionWidget> widgetLinks = getWidgetLinks(widget);
final ChainScene scene = getWidgetScene(widget);
// if (widget instanceof WElementProcess) {
// final WElementProcess elem = (WElementProcess) widget;
// elem.setBorder(BorderFactory.createRoundedBorder(20, 20, 8, 8, elem.getBgColor(), SELECT_BORDER_COLOR));
// } else if (widget instanceof WElementCondition) {
// final WElementCondition elem = (WElementCondition) widget;
// elem.setBorder(BorderFactory.createRoundedBorder(20, 20, 8, 8, elem.getBgColor(), SELECT_BORDER_COLOR));
// }
if (scene != null) {
final EventChain chain = scene.getChain();
for (DataLink link : chain.getDataLinks()) {
final ConnectionWidget linkWidget = (ConnectionWidget) scene.getWidget(link);
if (linkWidget != null) {
if (widgetLinks.contains(linkWidget)) {
linkWidget.setLineColor(SELECT_LINE_COLOR);
linkWidget.setStroke(new BasicStroke(2.5f));
} else {
linkWidget.setLineColor(UNSELECT_LINE_COLOR);
linkWidget.setStroke(new BasicStroke(0.1f));
}
}
}
scene.validate();
}
}
private ChainScene getWidgetScene(final Widget widget) {
if (widget instanceof WElementProcess) {
final WElementProcess elem = (WElementProcess) widget;
return (ChainScene) elem.getScene();
} else if (widget instanceof WConstant) {
final WConstant elem = (WConstant) widget;
return (ChainScene) elem.getScene();
} else if (widget instanceof WElementCondition) {
final WElementCondition elem = (WElementCondition) widget;
return (ChainScene) elem.getScene();
}
return null;
}
private List<ConnectionWidget> getWidgetLinks(final Widget widget) {
final List<ConnectionWidget> widgetLinks = new ArrayList<ConnectionWidget>();
final ChainScene scene = getWidgetScene(widget);
if (scene != null) {
final EventChain chain = scene.getChain();
if (widget instanceof WElementProcess) {
final WElementProcess elem = (WElementProcess) widget;
final List<WReceivingParameter> inputs = elem.getInputsParameters();
final List<WOfferingParameter> outputs = elem.getOutputsParameters();
for (WReceivingParameter in : inputs) {
final List<DataLink> links = chain.findDataLink(elem.getId(), in.getCode(), false);
if (!links.isEmpty() && links.size() == 1) {
final ConnectionWidget linkWidget = (ConnectionWidget) scene.getWidget(links.get(0));
if (linkWidget != null) {
widgetLinks.add(linkWidget);
}
}
}
for (WOfferingParameter out : outputs) {
final List<DataLink> links = chain.findDataLink(elem.getId(), out.getCode(), true);
if (!links.isEmpty()) {
for (DataLink link : links) {
final ConnectionWidget linkWidget = (ConnectionWidget) scene.getWidget(link);
if (linkWidget != null) {
widgetLinks.add(linkWidget);
}
}
}
}
} else if (widget instanceof WConstant) {
final WConstant elem = (WConstant) widget;
final WOfferingParameter out = elem.getOffering();
final List<DataLink> links = chain.findDataLink(out.getId(), null, true);
if (!links.isEmpty()) {
for (DataLink link : links) {
final ConnectionWidget linkWidget = (ConnectionWidget) scene.getWidget(link);
if (linkWidget != null) {
widgetLinks.add(linkWidget);
}
}
}
} else if (widget instanceof WElementCondition) {
final WElementCondition elem = (WElementCondition) widget;
final List<DataLink> links = chain.getOutputLinks(elem.getId());
for (DataLink link : links) {
final ConnectionWidget linkWidget = (ConnectionWidget) scene.getWidget(link);
if (linkWidget != null) {
widgetLinks.add(linkWidget);
}
}
}
}
return widgetLinks;
}
}