/**
* Copyright (c) 2013 committers of YAKINDU and others.
* 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:
* committers of YAKINDU - initial API and implementation
*
*/
package org.yakindu.sct.refactoring.refactor.impl;
import static org.yakindu.sct.ui.editor.partitioning.DiagramPartitioningUtil.createInlineStyle;
import static org.yakindu.sct.ui.editor.partitioning.DiagramPartitioningUtil.getInlineStyle;
import org.eclipse.gmf.runtime.diagram.core.util.ViewUtil;
import org.eclipse.gmf.runtime.notation.BooleanValueStyle;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.Edge;
import org.eclipse.gmf.runtime.notation.View;
import org.yakindu.sct.model.sgraph.State;
import org.yakindu.sct.refactoring.refactor.AbstractRefactoring;
import org.yakindu.sct.ui.editor.partitioning.DiagramPartitioningUtil;
import org.yakindu.sct.ui.editor.providers.SemanticHints;
/**
*
* @author andreas muelder - Initial contribution and API
*
*/
public class InlineSubdiagramRefactoring extends AbstractRefactoring<View> {
@Override
public boolean isExecutable() {
BooleanValueStyle inlineStyle = getInlineStyle(getContextObject());
return super.isExecutable() && inlineStyle != null && !inlineStyle.isBooleanValue();
}
@SuppressWarnings("unchecked")
@Override
protected void internalExecute() {
BooleanValueStyle inlineStyle = getInlineStyle(getContextObject());
if (inlineStyle == null) {
inlineStyle = createInlineStyle();
getContextObject().getStyles().add(inlineStyle);
}
inlineStyle.setBooleanValue(true);
View contextView = getContextObject();
State contextElement = (State) contextView.getElement();
Diagram diagramToInline = DiagramPartitioningUtil.getSubDiagram(contextElement);
View containerView = ViewUtil.getChildBySemanticHint(contextView, SemanticHints.STATE_FIGURE_COMPARTMENT);
while (diagramToInline.getChildren().size() > 0) {
containerView.insertChild((View) diagramToInline.getChildren().get(0));
}
while (diagramToInline.getEdges().size() > 0) {
containerView.getDiagram().insertEdge((Edge) diagramToInline.getEdges().get(0));
}
getResource().getContents().remove(diagramToInline);
}
}