package com.horstmann.violet.workspace.editorpart.behavior;
import java.awt.Font;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
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.propertyeditor.CustomPropertyEditor;
import com.horstmann.violet.product.diagram.propertyeditor.ICustomPropertyEditor;
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.product.diagram.common.node.DiagramLinkNode;
import com.horstmann.violet.workspace.editorpart.IEditorPart;
import com.horstmann.violet.workspace.editorpart.IEditorPartBehaviorManager;
import com.horstmann.violet.workspace.editorpart.IEditorPartSelectionHandler;
public class EditSelectedBehavior extends AbstractEditorPartBehavior
{
public EditSelectedBehavior(IEditorPart editorPart)
{
BeanInjector.getInjector().inject(this);
ResourceBundleInjector.getInjector().inject(this);
this.editorPart = editorPart;
this.graph = editorPart.getGraph();
this.selectionHandler = editorPart.getSelectionHandler();
this.behaviorManager = editorPart.getBehaviorManager();
}
@Override
public void onMouseClicked(MouseEvent event)
{
boolean isButton1Clicked = (event.getButton() == MouseEvent.BUTTON1);
if (event.getClickCount() > 1 && isButton1Clicked)
{
double zoom = editorPart.getZoomFactor();
Point2D mouseLocation = new Point2D.Double(event.getX() / zoom, event.getY() / zoom);
processSelection(mouseLocation);
editSelected();
}
}
/**
* Selects double clicked element (inspired from SelectByClickBehavior class)
*
* @param mouseLocation
*/
private void processSelection(Point2D mouseLocation)
{
this.selectionHandler.clearSelection();
INode node = this.graph.findNode(mouseLocation);
IEdge edge = this.graph.findEdge(mouseLocation);
if (edge != null)
{
this.selectionHandler.addSelectedElement(edge);
if (this.selectionHandler.getSelectedEdges().size() == 1) {
this.behaviorManager.fireOnEdgeSelected(edge);
}
return;
}
if (node != null)
{
this.selectionHandler.addSelectedElement(node);
if (this.selectionHandler.getSelectedNodes().size() == 1) {
this.behaviorManager.fireOnNodeSelected(node);
}
return;
}
}
public void editSelected()
{
final Object edited = selectionHandler.isNodeSelectedAtLeast() ? selectionHandler.getLastSelectedNode() : selectionHandler.getLastSelectedEdge();
if (edited == null)
{
return;
}
final ICustomPropertyEditor sheet = new CustomPropertyEditor(edited);
sheet.addPropertyChangeListener(new PropertyChangeListener()
{
public void propertyChange(final PropertyChangeEvent event)
{
// TODO : fix open file event
if (event.getSource() instanceof DiagramLinkNode)
{
// DiagramLinkNode ln = (DiagramLinkNode) event.getSource();
// DiagramLink dl = ln.getDiagramLink();
// if (dl != null && dl.getOpenFlag().booleanValue())
// {
// diagramPanel.fireMustOpenFile(dl.getFile());
// dl.setOpenFlag(new Boolean(false));
// }
}
if (edited instanceof INode)
{
behaviorManager.fireWhileEditingNode((INode) edited, event);
}
if (edited instanceof IEdge)
{
behaviorManager.fireWhileEditingEdge((IEdge) edited, event);
}
editorPart.getSwingComponent().invalidate();
}
});
JOptionPane optionPane = new JOptionPane();
optionPane.setOpaque(true);
optionPane.addPropertyChangeListener(new PropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent event)
{
if ((event.getPropertyName().equals(JOptionPane.VALUE_PROPERTY)) && event.getNewValue() != null && event.getNewValue() != JOptionPane.UNINITIALIZED_VALUE)
{
if (sheet.isEditable())
{
// This manages optionPane submits through a property
// listener because, as dialog display could be
// delegated
// (to Eclipse for example), host system can work in
// other threads
if (edited instanceof INode)
{
behaviorManager.fireAfterEditingNode((INode) edited);
}
if (edited instanceof IEdge)
{
behaviorManager.fireAfterEditingEdge((IEdge) edited);
}
editorPart.getSwingComponent().invalidate();
}
}
}
});
String tooltip = "";
if (sheet.isEditable())
{
if (edited instanceof INode)
{
tooltip = ((INode) edited).getToolTip();
this.behaviorManager.fireBeforeEditingNode((INode) edited);
}
if (edited instanceof IEdge)
{
tooltip = ((IEdge) edited).getToolTip();
this.behaviorManager.fireBeforeEditingEdge((IEdge) edited);
}
optionPane.setMessage(sheet.getAWTComponent());
}
if (!sheet.isEditable())
{
JLabel label = new JLabel(this.uneditableBeanMessage);
label.setFont(label.getFont().deriveFont(Font.PLAIN));
optionPane.setMessage(label);
}
this.dialogFactory.showDialog(optionPane, tooltip+": "+this.dialogTitle, true);
}
private IEditorPartSelectionHandler selectionHandler;
private IEditorPart editorPart;
private IGraph graph;
private IEditorPartBehaviorManager behaviorManager;
@InjectedBean
private DialogFactory dialogFactory;
@ResourceBundleBean(key = "edit.properties.title")
private String dialogTitle;
@ResourceBundleBean(key = "edit.properties.empty_bean_message")
private String uneditableBeanMessage;
}