package com.horstmann.violet.web.workspace.editorpart.behavior;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import com.horstmann.violet.framework.dialog.DialogFactory;
import com.horstmann.violet.framework.injection.bean.ManiocFramework.BeanInjector;
import com.horstmann.violet.framework.injection.bean.ManiocFramework.InjectedBean;
import com.horstmann.violet.framework.injection.resources.ResourceBundleInjector;
import com.horstmann.violet.framework.injection.resources.annotation.ResourceBundleBean;
import com.horstmann.violet.product.diagram.abstracts.IGraph;
import com.horstmann.violet.product.diagram.abstracts.edge.IEdge;
import com.horstmann.violet.product.diagram.abstracts.node.INode;
import com.horstmann.violet.web.property.PropertyEditorWidget;
import com.horstmann.violet.web.workspace.editorpart.EditorPartWidget;
import com.horstmann.violet.workspace.editorpart.IEditorPart;
import com.horstmann.violet.workspace.editorpart.IEditorPartSelectionHandler;
import com.horstmann.violet.workspace.editorpart.behavior.AbstractEditorPartBehavior;
import eu.webtoolkit.jwt.Signal;
import eu.webtoolkit.jwt.WContainerWidget;
import eu.webtoolkit.jwt.WDialog;
import eu.webtoolkit.jwt.WLength;
import eu.webtoolkit.jwt.WPushButton;
import eu.webtoolkit.jwt.WText;
import eu.webtoolkit.jwt.WLength.Unit;
@ResourceBundleBean(resourceReference = com.horstmann.violet.workspace.editorpart.behavior.EditSelectedBehavior.class)
public class EditSelectedBehavior extends AbstractEditorPartBehavior {
private EditorPartWidget editorPartWidget;
private IEditorPartSelectionHandler selectionHandler;
private IEditorPart editorPart;
private IGraph graph;
@InjectedBean
private DialogFactory dialogFactory;
@ResourceBundleBean(key = "edit.properties.title")
private String dialogTitle;
@ResourceBundleBean(key = "edit.properties.empty_bean_message")
private String uneditableBeanMessage;
private static final double MAX_CONTENT_HEIGHT = 400;
public EditSelectedBehavior(IEditorPart editorPart, EditorPartWidget editorPartWidget) {
BeanInjector.getInjector().inject(this);
ResourceBundleInjector.getInjector().inject(this);
this.editorPartWidget = editorPartWidget;
this.editorPart = editorPart;
this.graph = editorPart.getGraph();
this.selectionHandler = editorPart.getSelectionHandler();
}
@Override
public void onMouseClicked(MouseEvent event) {
boolean isClickEvent = (event.getID() == MouseEvent.MOUSE_CLICKED);
boolean isButton1Clicked = (event.getButton() == MouseEvent.BUTTON1);
boolean isDoubleClick = (event.getClickCount() == 2);
if (isClickEvent && isButton1Clicked && isDoubleClick) {
double zoom = editorPart.getZoomFactor();
Point2D mouseLocation = new Point2D.Double(event.getX() / zoom, event.getY() / zoom);
this.selectionHandler.clearSelection();
INode node = this.graph.findNode(mouseLocation);
IEdge edge = this.graph.findEdge(mouseLocation);
if (node != null) {
this.selectionHandler.setSelectedElement(node);
} else if (edge != null) {
this.selectionHandler.addSelectedElement(edge);
}
editSelected();
}
}
public void editSelected() {
final Object edited = selectionHandler.isNodeSelectedAtLeast() ? selectionHandler.getLastSelectedNode() : selectionHandler.getLastSelectedEdge();
if (edited == null) {
return;
}
PropertyEditorWidget editorWidget = new PropertyEditorWidget(edited, this.editorPart, this.editorPartWidget);
final WDialog dialog = new WDialog(this.dialogTitle);
WContainerWidget dialogContainer = dialog.getContents();
if (editorWidget.isEditable()) {
dialogContainer.addWidget(editorWidget);
dialogContainer.setHeight(new WLength(MAX_CONTENT_HEIGHT, Unit.Pixel));
}
if (!editorWidget.isEditable()) {
WText wText = new WText(this.uneditableBeanMessage);
dialogContainer.addWidget(wText);
}
WPushButton doneButton = new WPushButton("Done");
doneButton.clicked().addListener(doneButton, new Signal.Listener() {
public void trigger() {
dialog.accept();
}
});
WContainerWidget footerContainer = dialog.getFooter();
footerContainer.addWidget(doneButton);
dialog.setModal(true);
dialog.rejectWhenEscapePressed(true);
dialog.show();
}
}