blob: 808383463627e19b0baa9a8c5c5e500c3370c9d2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012-2014 SAP SE.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP SE - initial API and implementation and/or initial documentation
*
*******************************************************************************/
package org.eclipse.ogee.designer;
import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.emf.transaction.RecordingCommand;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.graphiti.dt.IDiagramTypeProvider;
import org.eclipse.graphiti.features.IDirectEditingInfo;
import org.eclipse.graphiti.features.context.impl.CustomContext;
import org.eclipse.graphiti.mm.algorithms.Image;
import org.eclipse.graphiti.mm.algorithms.Text;
import org.eclipse.graphiti.mm.pictograms.ContainerShape;
import org.eclipse.graphiti.mm.pictograms.PictogramElement;
import org.eclipse.graphiti.mm.pictograms.Shape;
import org.eclipse.ogee.designer.contexts.NavigationPropertyContext;
import org.eclipse.ogee.designer.features.ODataAddComplexPropertyFeature;
import org.eclipse.ogee.designer.features.ODataAddEntitySetFeature;
import org.eclipse.ogee.designer.features.ODataAddEnumMemberFeature;
import org.eclipse.ogee.designer.features.ODataAddEnumPropertyFeature;
import org.eclipse.ogee.designer.features.ODataAddNavigationPropertyFeature;
import org.eclipse.ogee.designer.features.ODataAddParameterFeature;
import org.eclipse.ogee.designer.features.ODataAddPropertyFeature;
import org.eclipse.ogee.designer.features.ODataCollapsibleFeature;
import org.eclipse.ogee.designer.features.ODataDoubleClickFeature;
import org.eclipse.ogee.designer.messages.Messages;
import org.eclipse.ogee.designer.providers.ODataFeatureProvider;
import org.eclipse.ogee.designer.providers.ODataToolBehaviorProvider;
import org.eclipse.ogee.designer.utils.ArtifactUtil;
import org.eclipse.ogee.designer.utils.ODataShapeUtil;
import org.eclipse.ogee.designer.utils.PropertyUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Control;
public class ODataDiagramListener implements MouseListener, KeyListener {
ODataEditor designEditor;
private TransactionalEditingDomain editingDomain;
private ODataFeatureProvider featureProvider;
/**
* @param designEditor
*/
public ODataDiagramListener(ODataEditor designEditor) {
super();
this.designEditor = designEditor;
this.editingDomain = designEditor.getEditingDomain();
IDiagramTypeProvider dtp = designEditor.getDiagramTypeProvider();
if (dtp != null) {
this.featureProvider = (ODataFeatureProvider) dtp
.getFeatureProvider();
}
}
/**
*
*/
public void registerListeners() {
GraphicalViewer graphicalViewer = this.designEditor
.getGraphicalViewer();
if (graphicalViewer != null) {
Control control = graphicalViewer.getControl();
if (control != null) {
control.addMouseListener(this);
control.addKeyListener(this);
}
}
}
/**
*
*/
public void removeListeners() {
GraphicalViewer graphicalViewer = this.designEditor
.getGraphicalViewer();
if (graphicalViewer != null) {
Control control = graphicalViewer.getControl();
if (control != null) {
control.removeMouseListener(this);
control.removeKeyListener(this);
}
}
}
/**
*
*
* @see
* org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events
* .MouseEvent)
*/
@Override
public void mouseDown(MouseEvent arg0) {
PictogramElement[] selectedPes = this.designEditor
.getSelectedPictogramElements();
if (selectedPes.length == 1) {
final PictogramElement pe = selectedPes[0];
if (pe.getGraphicsAlgorithm() instanceof Image
&& PropertyUtil.isTitle(pe)
&& arg0.getSource() instanceof FigureCanvas) {
ODataToolBehaviorProvider currentToolBehaviorProvider = (ODataToolBehaviorProvider) this.designEditor
.getDiagramTypeProvider()
.getCurrentToolBehaviorProvider();
// If both Scroll bars are present in order to find the exact
// location in Graphical editor
org.eclipse.draw2d.geometry.Point viewLocation = ((FigureCanvas) arg0
.getSource()).getViewport().getViewLocation();
Point point = new Point(arg0.x + viewLocation.x, arg0.y
+ viewLocation.y);
if (currentToolBehaviorProvider.isLocationExists(pe, point)) {
this.editingDomain.getCommandStack().execute(
new RecordingCommand(this.editingDomain,
Messages.ODATAEDITOR_EXPANDCOLLAPSE_LABEL) {
@Override
public void doExecute() {
ODataCollapsibleFeature collapsableFe = new ODataCollapsibleFeature(
getFeatureProvider());
CustomContext context = new CustomContext();
context.setPictogramElements(new PictogramElement[] { (PictogramElement) pe
.eContainer() });
collapsableFe.execute(context);
}
});
}
}
}
}
/**
* Adds a new property on Enter Key press
* based on Key Event
* @see
* org.eclipse.swt.events.KeyListener#keyPressed(org.eclipse.swt.events.
* KeyEvent)
*/
@Override
public void keyPressed(KeyEvent arg0) {
PictogramElement[] selectedPes = this.designEditor
.getSelectedPictogramElements();
if (selectedPes.length == 1 && selectedPes[0] != null) {
final PictogramElement pe = selectedPes[0];
if (arg0.keyCode == SWT.CR || arg0.keyCode == SWT.KEYPAD_CR) {
if ((pe instanceof ContainerShape || (PropertyUtil
.isEnumMember(pe) || PropertyUtil.isEnumMemberValue(pe)))
&& PropertyUtil.isEnterKeyEnabled(pe)
&& !this.designEditor.isReadOnly()) {
this.editingDomain.getCommandStack().execute(
new RecordingCommand(this.editingDomain) {
@Override
public void doExecute() {
CustomContext context = new CustomContext();
PictogramElement topContainer = ODataShapeUtil
.getTopContainer(pe);
context.setPictogramElements(new PictogramElement[] { topContainer });
if (PropertyUtil.isProperty(pe)) {
Object businessObject = getFeatureProvider()
.getBusinessObjectForPictogramElement(
pe);
if (ArtifactUtil
.isComplexTypeProperty(businessObject)) {
ODataAddComplexPropertyFeature complexTypeFeature = new ODataAddComplexPropertyFeature(
getFeatureProvider(),
getFeatureProvider()
.getArtifactFactory(),
getFeatureProvider()
.getShapesFactory());
complexTypeFeature.execute(context);
} else if (ArtifactUtil
.isEnumTypeProperty(businessObject)) {
ODataAddEnumPropertyFeature enumTypeFeature = new ODataAddEnumPropertyFeature(
getFeatureProvider(),
getFeatureProvider()
.getArtifactFactory(),
getFeatureProvider()
.getShapesFactory());
enumTypeFeature.execute(context);
} else {
ODataAddPropertyFeature addFeature = new ODataAddPropertyFeature(
getFeatureProvider(),
getFeatureProvider()
.getArtifactFactory(),
getFeatureProvider()
.getShapesFactory());
addFeature.setKeyValue(pe);
addFeature.execute(context);
}
} else if (PropertyUtil.isEntitySet(pe)) {
ODataAddEntitySetFeature addFeature = new ODataAddEntitySetFeature(
getFeatureProvider(),
getFeatureProvider()
.getArtifactFactory(),
getFeatureProvider()
.getShapesFactory());
addFeature.execute(context);
} else if (PropertyUtil.isEnumMember(pe)
|| PropertyUtil
.isEnumMemberValue(pe)) {
ODataAddEnumMemberFeature addFeature = new ODataAddEnumMemberFeature(
getFeatureProvider(),
getFeatureProvider()
.getArtifactFactory(),
getFeatureProvider()
.getShapesFactory());
addFeature.execute(context);
} else if (PropertyUtil.isParameter(pe)) {
ODataAddParameterFeature addFeature = new ODataAddParameterFeature(
getFeatureProvider(),
getFeatureProvider()
.getArtifactFactory(),
getFeatureProvider()
.getShapesFactory());
addFeature.execute(context);
} else if (PropertyUtil
.isNavigationProperty(pe)) {
NavigationPropertyContext navPropertyContext = new NavigationPropertyContext(
ODataShapeUtil
.getTopContainer(pe));
navPropertyContext.setEditMode(true);
ODataAddNavigationPropertyFeature navPropertyFeature = new ODataAddNavigationPropertyFeature(
getFeatureProvider(),
getFeatureProvider()
.getArtifactFactory(),
getFeatureProvider()
.getShapesFactory());
navPropertyFeature
.execute(navPropertyContext);
}
}
@Override
public String getLabel() {
String lbl = ""; //$NON-NLS-1$
if (PropertyUtil.isProperty(pe)) {
Object businessObject = getFeatureProvider()
.getBusinessObjectForPictogramElement(
pe);
if (ArtifactUtil
.isComplexTypeProperty(businessObject)) {
lbl = Messages.ODATAEDITOR_COMPLEXPROPERTY_NAME;
} else {
lbl = Messages.ODATAEDITOR_PROPERTIES_MENU;
}
} else if (PropertyUtil.isEntitySet(pe)) {
lbl = Messages.ODATAEDITOR_ENTITYSET_MENU;
} else if (PropertyUtil.isParameter(pe)) {
lbl = Messages.ODATAEDITOR_PARAMETERS_MENU;
} else if (PropertyUtil
.isNavigationProperty(pe)) {
lbl = Messages.ODATAEDITOR_NAVIGATION_PROPERTIES_MENU;
} else if (PropertyUtil.isEnumMember(pe)) {
lbl = Messages.ODATAEDITOR_ENUMMEMBER_MENU;
}
return lbl;
}
});
}
} else if (arg0.keyCode == SWT.ARROW_RIGHT
&& PropertyUtil.isCollapsed(pe)
|| arg0.keyCode == SWT.ARROW_LEFT
&& PropertyUtil.isExpanded(pe)) {
this.editingDomain.getCommandStack().execute(
new RecordingCommand(this.editingDomain,
Messages.ODATAEDITOR_EXPANDCOLLAPSE_LABEL) {
@Override
public void doExecute() {
ODataCollapsibleFeature collapsableFe = new ODataCollapsibleFeature(
getFeatureProvider());
CustomContext context = new CustomContext();
context.setPictogramElements(new PictogramElement[] { pe });
collapsableFe.execute(context);
}
});
} else if (arg0.keyCode == SWT.F2) {
if (pe instanceof ContainerShape
&& PropertyUtil.isTopContainer(pe)) {
this.editingDomain.getCommandStack().execute(
new RecordingCommand(this.editingDomain,
Messages.ODATAEDITOR_DIRECTEDITING) {
@Override
public void doExecute() {
CustomContext context = new CustomContext();
context.setPictogramElements(new PictogramElement[] { pe });
ODataDoubleClickFeature editingFeature = new ODataDoubleClickFeature(
getFeatureProvider());
if (editingFeature.canExecute(context)) {
editingFeature.execute(context);
}
}
});
} else if (pe instanceof ContainerShape
&& PropertyUtil.isTypeIdentifier(pe)) {
if (((ContainerShape) pe).getChildren().size() == 4) {
this.editingDomain.getCommandStack().execute(
new RecordingCommand(this.editingDomain,
Messages.ODATAEDITOR_DIRECTEDITING) {
@Override
public void doExecute() {
Shape textShape = ((ContainerShape) pe)
.getChildren().get(1);
if (textShape.getGraphicsAlgorithm() instanceof Text) {
IDirectEditingInfo directEditingInfo = getFeatureProvider()
.getDirectEditingInfo();
directEditingInfo
.setMainPictogramElement(textShape);
directEditingInfo
.setPictogramElement(textShape);
directEditingInfo
.setGraphicsAlgorithm(textShape
.getGraphicsAlgorithm());
directEditingInfo.setActive(true);
ODataDiagramListener.this.designEditor
.getDiagramBehavior()
.refresh();
}
}
});
}
} else if (PropertyUtil.isEnumMember(pe)
|| PropertyUtil.isEnumMemberValue(pe)) {
this.editingDomain.getCommandStack().execute(
new RecordingCommand(this.editingDomain,
Messages.ODATAEDITOR_DIRECTEDITING) {
@Override
public void doExecute() {
if (pe.getGraphicsAlgorithm() instanceof Text) {
IDirectEditingInfo directEditingInfo = getFeatureProvider()
.getDirectEditingInfo();
directEditingInfo
.setMainPictogramElement(pe);
directEditingInfo
.setPictogramElement(pe);
directEditingInfo.setGraphicsAlgorithm(pe
.getGraphicsAlgorithm());
directEditingInfo.setActive(true);
ODataDiagramListener.this.designEditor
.getDiagramBehavior().refresh();
}
}
});
}
}
}
}
/**
* @return
*/
protected ODataFeatureProvider getFeatureProvider() {
return this.featureProvider;
}
@Override
public void mouseDoubleClick(MouseEvent arg0) {
// Not required to implement.
}
@Override
public void mouseUp(MouseEvent arg0) {
// Not required to implement.
}
@Override
public void keyReleased(KeyEvent arg0) {
// Not required to implement.
}
}