package at.bestsolution.efxclipse.runtime.workbench.renderers;
import java.net.URL;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBase;
import javafx.scene.control.Tooltip;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
import org.eclipse.e4.core.services.contributions.IContributionFactory;
import org.eclipse.e4.core.services.events.IEventBroker;
import org.eclipse.e4.ui.model.application.ui.MUIElement;
import org.eclipse.e4.ui.model.application.ui.menu.ItemType;
import org.eclipse.e4.ui.model.application.ui.menu.MDirectToolItem;
import org.eclipse.e4.ui.model.application.ui.menu.MHandledItem;
import org.eclipse.e4.ui.model.application.ui.menu.MHandledToolItem;
import org.eclipse.e4.ui.model.application.ui.menu.MToolItem;
import org.eclipse.e4.ui.workbench.UIEvents;
import org.eclipse.e4.ui.workbench.UIEvents.EventTags;
import org.eclipse.emf.common.util.URI;
import org.osgi.service.event.Event;
@SuppressWarnings("restriction")
public class ToolItemRenderer extends ItemRenderer {
@Inject
IContributionFactory contributionFactory;
static class RadioButton extends Button {
}
private org.osgi.service.event.EventHandler selectionHandler = new org.osgi.service.event.EventHandler() {
@Override
public void handleEvent(Event event) {
ButtonBase button = (ButtonBase) event.getProperty(EventTags.WIDGET);
if( Boolean.TRUE.equals(event.getProperty(EventTags.NEW_VALUE)) ) {
button.getStyleClass().add("efxSelectedRadioToolButton");
} else {
button.getStyleClass().remove("efxSelectedRadioToolButton");
}
}
};
@Inject
IEventBroker eventBroker;
@PostConstruct
void init() {
eventBroker.subscribe(UIEvents.Item.TOPIC_SELECTED, selectionHandler);
}
@Override
public Object createWidget(MUIElement element, Object parent) {
MToolItem item = (MToolItem) element;
ButtonBase button;
if (item.getType() == ItemType.RADIO) {
button = new RadioButton();
if( item.isSelected() ) {
button.getStyleClass().add("efxSelectedRadioToolButton");
}
} else {
button = new Button();
}
if( item.getLocalizedLabel() != null ) {
button.setText(item.getLocalizedLabel());
}
if (item.getIconURI() != null) {
URL url = Util.convertToOSGiURL(URI.createURI(item.getIconURI()));
Image img = new Image(url.toExternalForm());
button.setGraphic(new ImageView(img));
}
if (item.getTooltip() != null) {
button.setTooltip(new Tooltip(item.getLocalizedTooltip()));
}
return button;
}
@Override
public void hookControllerLogic(MUIElement me) {
final EventHandler<ActionEvent> h;
final ButtonBase button = (ButtonBase) me.getWidget();
if (me instanceof MDirectToolItem) {
final MDirectToolItem item = (MDirectToolItem) me;
item.setObject(contributionFactory.create(item.getContributionURI(), getContext(item)));
h = createEventHandler(item);
} else if (me instanceof MHandledToolItem) {
final MHandledItem item = (MHandledToolItem) me;
h = createParametrizedCommandEventHandler(item);
} else {
h = null;
}
button.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
if (button instanceof RadioButton) {
selectButton(button);
}
if (h != null) {
h.handle(event);
}
}
});
}
private void selectButton(ButtonBase button) {
for (Node n : button.getParent().getChildrenUnmodifiable()) {
if (n instanceof RadioButton) {
if( n != button ) {
((MToolItem)n.getUserData()).setSelected(false);
}
}
}
System.err.println("Add selection");
((MToolItem)button.getUserData()).setSelected(true);
}
}