/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.gui.workflow.editor.handlers;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.commands.CommandStack;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import de.rcenvironment.core.component.workflow.model.api.WorkflowDescription;
import de.rcenvironment.core.component.workflow.model.api.WorkflowLabel;
import de.rcenvironment.core.component.workflow.model.api.WorkflowNode;
import de.rcenvironment.core.gui.workflow.editor.WorkflowEditor;
import de.rcenvironment.core.gui.workflow.editor.commands.WorkflowLabelSendLayerwiseCommand;
import de.rcenvironment.core.gui.workflow.editor.commands.WorkflowNodeSendLayerwiseCommand;
import de.rcenvironment.core.gui.workflow.parts.WorkflowLabelPart;
import de.rcenvironment.core.gui.workflow.parts.WorkflowNodePart;
/**
*
* The common base class for a label "send" handler.
*
* @author Jascha Riedel
*/
public abstract class AbstractWorkflowPartSendHandler extends AbstractHandler {
protected GraphicalViewer viewer;
protected CommandStack commandStack;
protected WorkflowDescription workflowDescription;
/**
*
* Enum to define where to send the workflow part.
*
* @author Jascha
*/
public enum SendType {
/** One layer back. */
SEND_BACK,
/** One layer forward. */
SEND_FORWARD,
/** All the way back. */
SEND_TO_BACKGROUND,
/** All the way forward. */
SEND_TO_FOREGROUND;
}
@Override
public Object execute(ExecutionEvent arg0) throws ExecutionException {
final IWorkbenchPart activePart = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getActivePage().getActivePart();
if (activePart instanceof WorkflowEditor) {
viewer = ((WorkflowEditor) activePart).getViewer();
commandStack = (CommandStack) ((WorkflowEditor) activePart).getAdapter(CommandStack.class);
workflowDescription = (WorkflowDescription) viewer.getContents().getModel();
edit();
}
return null;
}
abstract void edit();
protected void send(SendType sendType) {
if (viewer.getSelectedEditParts().get(0) instanceof WorkflowLabelPart) {
@SuppressWarnings("unchecked") List<WorkflowLabelPart> labelParts = viewer.getSelectedEditParts();
switch (sendType) {
case SEND_BACK:
case SEND_TO_BACKGROUND:
if (onlyLabelsInBackgroundSelected(labelParts)) {
return;
}
break;
case SEND_FORWARD:
case SEND_TO_FOREGROUND:
if (onlyLabelsInForegroundSelected(labelParts)) {
return;
}
break;
default:
return;
}
commandStack.execute(new WorkflowLabelSendLayerwiseCommand((WorkflowDescription) viewer.getContents().getModel(),
labelParts, sendType));
} else if (viewer.getSelectedEditParts().get(0) instanceof WorkflowNodePart) {
@SuppressWarnings("unchecked") List<WorkflowNodePart> nodeParts = viewer.getSelectedEditParts();
switch (sendType) {
case SEND_BACK:
case SEND_TO_BACKGROUND:
if (onlyNodesInBackgroundSelected(nodeParts)) {
return;
}
break;
case SEND_FORWARD:
case SEND_TO_FOREGROUND:
if (onlyNodesInForegroundSelected(nodeParts)) {
return;
}
break;
default:
return;
}
commandStack.execute(new WorkflowNodeSendLayerwiseCommand((WorkflowDescription) viewer.getContents().getModel(),
nodeParts, sendType));
}
}
protected boolean onlyLabelsInForegroundSelected(List<WorkflowLabelPart> labels) {
List<WorkflowLabelPart> returnList = new ArrayList<WorkflowLabelPart>();
for (WorkflowLabelPart labelPart : labels) {
returnList.add(labelPart);
}
int topIndex = workflowDescription.getWorkflowLabels().size() - 1;
while (true) {
int currentIndex = topIndex;
for (WorkflowLabelPart labelPart : returnList) {
if (((WorkflowLabel) labelPart.getModel()).getZIndex() == topIndex) {
returnList.remove(labelPart);
topIndex--;
break;
}
}
if (currentIndex == topIndex) {
break;
}
}
return returnList.isEmpty();
}
protected boolean onlyLabelsInBackgroundSelected(List<WorkflowLabelPart> labels) {
List<WorkflowLabelPart> returnList = new ArrayList<WorkflowLabelPart>();
for (WorkflowLabelPart labelPart : labels) {
returnList.add(labelPart);
}
int bottomIndex = 0;
while (true) {
int currentIndex = bottomIndex;
for (WorkflowLabelPart labelPart : returnList) {
if (((WorkflowLabel) labelPart.getModel()).getZIndex() == bottomIndex) {
returnList.remove(labelPart);
bottomIndex++;
break;
}
}
if (currentIndex == bottomIndex) {
break;
}
}
return returnList.isEmpty();
}
protected boolean onlyNodesInForegroundSelected(List<WorkflowNodePart> nodes) {
List<WorkflowNodePart> returnList = new ArrayList<WorkflowNodePart>();
for (WorkflowNodePart nodePart : nodes) {
returnList.add(nodePart);
}
int topIndex = workflowDescription.getWorkflowNodes().size() - 1;
while (true) {
int currentIndex = topIndex;
for (WorkflowNodePart nodePart : returnList) {
if (((WorkflowNode) nodePart.getModel()).getZIndex() == topIndex) {
returnList.remove(nodePart);
topIndex--;
break;
}
}
if (currentIndex == topIndex) {
break;
}
}
return returnList.isEmpty();
}
protected boolean onlyNodesInBackgroundSelected(List<WorkflowNodePart> nodes) {
List<WorkflowNodePart> returnList = new ArrayList<WorkflowNodePart>();
for (WorkflowNodePart nodePart : nodes) {
returnList.add(nodePart);
}
int bottomIndex = 0;
while (true) {
int currentIndex = bottomIndex;
for (WorkflowNodePart nodePart : returnList) {
if (((WorkflowNode) nodePart.getModel()).getZIndex() == bottomIndex) {
returnList.remove(nodePart);
bottomIndex++;
break;
}
}
if (currentIndex == bottomIndex) {
break;
}
}
return returnList.isEmpty();
}
}