/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.diagram.ui.editor;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.EditPart;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.widgets.Display;
import org.teiid.designer.diagram.ui.DiagramUiConstants;
import org.teiid.designer.diagram.ui.connection.NodeConnectionEditPart;
import org.teiid.designer.diagram.ui.connection.NodeConnectionModel;
import org.teiid.designer.diagram.ui.part.DiagramEditPart;
import org.teiid.designer.diagram.ui.part.EditableEditPart;
import org.teiid.designer.diagram.ui.util.DiagramUiUtilities;
import org.teiid.designer.diagram.ui.util.directedit.DirectEditPart;
import org.teiid.designer.diagram.ui.util.directedit.DirectEditPartManager;
import org.teiid.designer.metamodels.core.ModelAnnotation;
import org.teiid.designer.ui.common.eventsupport.SelectionUtilities;
import org.teiid.designer.ui.common.viewsupport.UiBusyIndicator;
/**
* DiagramSelectionHandler
*
* @since 8.0
*/
public class DiagramSelectionHandler implements IDiagramSelectionHandler {
private DiagramViewer viewer;
private boolean clearHilites = true;
/**
* Construct an instance of DiagramSelectionHandler.
*/
public DiagramSelectionHandler( DiagramViewer viewer ) {
super();
this.viewer = viewer;
}
@Override
public DiagramViewer getViewer() {
return this.viewer;
}
@Override
public void deselectAll() {
if (!getViewer().getSelectedEditParts().isEmpty()) {
getViewer().deselectAll();
}
}
@Override
public void select( EObject selectedObject ) {
EditPart selectedPart = findEditPart(selectedObject, false);
if (selectedPart != null) {
deselectAll();
getViewer().select(selectedPart);
}
}
public void select( List selectedEObjects ) {
// System.out.println("[DiagramSelectionHandler.select 2] TOP");
List selectedEPs = new ArrayList(selectedEObjects.size());
Iterator iter = selectedEObjects.iterator();
EObject nextEO = null;
EditPart nextEP = null;
while (iter.hasNext()) {
nextEO = (EObject)iter.next();
if (nextEO != null) {
nextEP = findEditPart(nextEO, false);
if (nextEP != null) selectedEPs.add(nextEP);
}
}
if (!selectedEPs.isEmpty()) {
deselectAll();
// System.out.println("[DiagramSelectionHandler.select 2] About to call viewer.select() at end of select 2");
getViewer().select(selectedEPs);
}
// else {
// System.out.println("[DiagramSelectionHandler.select 2] WILL NOT!! call viewer.select() at end of select 2");
// }
// System.out.println("[DiagramSelectionHandler.select 2] BOT");
}
private boolean allSelectedAreEObjects( List objects ) {
Iterator iter = objects.iterator();
Object obj = null;
while (iter.hasNext()) {
obj = iter.next();
if (!(obj instanceof EObject)) {
return false;
}
}
return true;
}
@Override
public List getSelectedEObjects() {
List selectedEObjects = new ArrayList();
Iterator iter = getViewer().getSelectedEditParts().iterator();
Object obj = null;
EObject eObj = null;
while (iter.hasNext()) {
obj = iter.next();
if (obj instanceof DiagramEditPart) {
eObj = ((DiagramEditPart)obj).getModelObject();
if (eObj != null && !selectedEObjects.contains(eObj)) selectedEObjects.add(eObj);
} else if (obj instanceof NodeConnectionEditPart) {
eObj = ((NodeConnectionModel)((NodeConnectionEditPart)obj).getModel()).getModelObject();
if (eObj != null && !selectedEObjects.contains(eObj)) selectedEObjects.add(eObj);
}
}
return selectedEObjects;
}
@Override
public void select( ISelection selection ) {
if (SelectionUtilities.isEmptySelection(selection)) {
deselectAll();
return;
}
List selectedObjects = SelectionUtilities.getSelectedObjects(selection);
// Now let's make sure they are all eObjects.
if (allSelectedAreEObjects(selectedObjects)) {
if (selectedObjects.size() == 1) {
select((EObject)selectedObjects.iterator().next());
} else {
select(selectedObjects);
}
}
}
@Override
public void clearDependencyHilites() {
// get all parts and call clearHiliting();
if (viewerContainsPart()) {
List contents = getViewer().getRootEditPart().getChildren();
Iterator iter = contents.iterator();
Object nextObj = null;
while (iter.hasNext()) {
nextObj = iter.next();
if (nextObj instanceof DiagramEditPart) {
((DiagramEditPart)nextObj).clearHiliting();
}
}
}
}
@Override
public void hiliteDependencies( Object selectedObject ) {
clearDependencyHilites();
if (selectedObject == null) clearConnectionHilites();
if (selectedObject != null && selectedObject instanceof EObject) {
EObject selectedEObject = (EObject)selectedObject;
EditPart selectedPart = findEditPart(selectedEObject, false);
if (selectedPart != null && selectedPart instanceof DiagramEditPart) {
List allDependencies = ((DiagramEditPart)selectedPart).getDependencies();
if (allDependencies != null) {
Iterator iter = allDependencies.iterator();
EditPart nextEP = null;
EObject nextEObject = null;
while (iter.hasNext()) {
nextEObject = (EObject)iter.next();
nextEP = findEditPart(nextEObject, false);
if (nextEP != null && nextEP instanceof DiagramEditPart) {
((DiagramEditPart)nextEP).hiliteBackground(DiagramUiConstants.Colors.DEPENDENCY);
}
}
}
}
} else if (selectedObject != null && selectedObject instanceof NodeConnectionEditPart) {
// let's get the two ends here....
EditPart sourceEP = DiagramUiUtilities.getSourceEndEditPart((NodeConnectionEditPart)selectedObject);
EditPart targetEP = DiagramUiUtilities.getTargetEndEditPart((NodeConnectionEditPart)selectedObject);
if (sourceEP != null && sourceEP instanceof DiagramEditPart) ((DiagramEditPart)sourceEP).hiliteBackground(DiagramUiConstants.Colors.DEPENDENCY);
if (targetEP != null && sourceEP instanceof DiagramEditPart) ((DiagramEditPart)targetEP).hiliteBackground(DiagramUiConstants.Colors.DEPENDENCY);
}
// System.out.println("[DiagramSelectionHandler.hiliteDependencies] BOT");
}
@Override
public void selectAndReveal( EObject selectedObject ) {
}
@Override
public EditPart findEditPart( EObject selectedObject,
boolean linksAllowed ) {
// System.out.println("[DiagramSelectionHandler.findEditPart] TOP; selectedObject: " + selectedObject );
EditPart matchingPart = null;
if (viewerContainsPart()) {
List contents = getViewer().getRootEditPart().getChildren();
Iterator iter = contents.iterator();
Object nextObj = null;
while (iter.hasNext() && matchingPart == null) {
nextObj = iter.next();
if (linksAllowed) {
matchingPart = ((DiagramEditPart)nextObj).getEditPart(selectedObject, linksAllowed);
} else {
if (nextObj instanceof DiagramEditPart) {
if (selectedObject instanceof ModelAnnotation) matchingPart = (DiagramEditPart)nextObj;
else matchingPart = ((DiagramEditPart)nextObj).getEditPart(selectedObject, linksAllowed);
}
}
}
}
// System.out.println("[DiagramSelectionHandler.findEditPart] BOT; About to return: matchingPart: " + matchingPart );
return matchingPart;
}
@Override
public EditPart findDiagramChildEditPart( EObject selectedObject,
boolean linksAllowed ) {
if (viewerContainsPart()) {
List contents = getViewer().getRootEditPart().getChildren();
Iterator iter = contents.iterator();
Object diagramEP = null;
while (iter.hasNext()) {
diagramEP = iter.next();
if (diagramEP instanceof EditPart) {
// Check the children
List dContents = ((EditPart)diagramEP).getChildren();
Iterator innerIter = dContents.iterator();
EditPart nextEP = null;
while (innerIter.hasNext()) {
nextEP = (EditPart)innerIter.next();
if (nextEP instanceof DiagramEditPart) {
if (((DiagramEditPart)nextEP).getModelObject().equals(selectedObject)) return nextEP;
}
}
}
}
}
return null;
}
@Override
public boolean handleDoubleClick( EObject selectedObject ) {
boolean handledHere = false;
if (getViewer() != null) {
final EditPart selectedEP = findEditPart(selectedObject, false);
if (selectedEP != null && selectedEP instanceof EditableEditPart) {
// Check to see if we want to direct edit
UiBusyIndicator.showWhile(Display.getCurrent(), new Runnable() {
@Override
public void run() {
((EditableEditPart)selectedEP).edit();
}
});
handledHere = true;
}
}
return handledHere;
}
@Override
public String getDiagramType() {
if (getViewer().getEditor().getDiagram() != null) return getViewer().getEditor().getDiagram().getType();
return "UNKNOWN TYPE"; //$NON-NLS-1$
}
@Override
public boolean shouldReveal( EObject eObject ) {
return true;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.editor.IDiagramSelectionHandler#hiliteConnection(null)
*/
@Override
public void hiliteConnection( NodeConnectionEditPart connectionEditPart ) {
clearConnectionHilites();
connectionEditPart.hilite(true);
}
@Override
public void clearConnectionHilites() {
if (!clearHilites) return;
if (viewerContainsPart()) {
EditPart rootPart = getViewer().getRootEditPart().getContents();
List contents = rootPart.getChildren();
Iterator iter = contents.iterator();
Object nextObj = null;
while (iter.hasNext()) {
nextObj = iter.next();
if (nextObj instanceof DiagramEditPart) {
List connections = ((DiagramEditPart)nextObj).getSourceConnections();
Iterator innerIter = connections.iterator();
Object nextConn = null;
while (innerIter.hasNext()) {
nextConn = innerIter.next();
if (nextConn instanceof NodeConnectionEditPart) {
((NodeConnectionEditPart)nextConn).hilite(false);
}
}
}
}
}
}
/*
* Private method added to handle all null checks for viewer. There were some cases where the
* diagram editor was closing and the diagram cleared out. In this instance, the rootEditPart was
* null. This method takes care of all that for any method in this class that wishes to check viewer content.
*/
private boolean viewerContainsPart() {
return (viewer != null && viewer.getRootEditPart() != null && viewer.getRootEditPart().getContents() != null);
}
/**
* @param b
*/
@Override
public void setClearHilites( boolean clear ) {
clearHilites = clear;
}
/* (non-Javadoc)
* @See org.teiid.designer.diagram.ui.editor.IDiagramSelectionHandler#fireMouseExit()
*/
@Override
public void fireMouseExit() {
// This is where we need to locate any DirectEditParts, find out if they have a DEM and
// find out if it's in the edit mode, then call commit;
if (viewerContainsPart()) {
EditPart rootPart = getViewer().getRootEditPart().getContents();
List contents = rootPart.getChildren();
Iterator iter = contents.iterator();
Object nextObj = null;
DirectEditPartManager depm = null;
while (iter.hasNext()) {
nextObj = iter.next();
if (nextObj instanceof DirectEditPart) {
depm = ((DirectEditPart)nextObj).getEditManager();
if (depm != null) depm.commitAndDispose();
}
}
}
}
@Override
public boolean shouldRename( EObject dClickedEObject ) {
return true;
}
/**
* Defect 19537 - new renameInline() method
*
* @see org.teiid.designer.diagram.ui.editor.IDiagramSelectionHandler#renameInline(org.eclipse.emf.ecore.EObject)
* @since 5.0.2
*/
@Override
public void renameInline( EObject theSelectedEObject ) {
if (getViewer() != null) {
final EditPart selectedEP = findEditPart(theSelectedEObject, false);
if (selectedEP != null && selectedEP instanceof DirectEditPart) {
// Check to see if we want to direct edit
UiBusyIndicator.showWhile(Display.getCurrent(), new Runnable() {
@Override
public void run() {
((DirectEditPart)selectedEP).performDirectEdit();
}
});
}
}
}
}