package org.eclipse.uml2.diagram.clazz.action;
import java.util.List;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.gef.Request;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CompoundCommand;
import org.eclipse.gmf.runtime.diagram.ui.actions.DiagramAction;
import org.eclipse.gmf.runtime.diagram.ui.commands.ICommandProxy;
import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart;
import org.eclipse.gmf.runtime.emf.type.core.commands.EditElementCommand;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.uml2.diagram.clazz.details.UMLDetailLevel;
import org.eclipse.uml2.diagram.clazz.details.UMLDetailLevelService;
public class ChangeDetailLevel extends DiagramAction {
private UMLDetailLevel myNewLevel;
public ChangeDetailLevel(IWorkbenchPage workbenchPage, UMLDetailLevel level) {
super(workbenchPage);
myNewLevel = level;
setText(level.getLabel());
}
@Override
public void refresh() {
super.refresh();
setChecked(calculateChecked());
}
@Override
protected boolean calculateEnabled() {
DiagramEditPart diagram = getDiagramEditPart();
if (diagram == null || diagram.getDiagramView() == null) {
return false;
}
return UMLDetailLevelService.getLevel(diagram.getDiagramView()) != myNewLevel && super.calculateEnabled();
}
@Override
protected Command getCommand() {
CompoundCommand result = new CompoundCommand();
DiagramEditPart diagramEditPart = getDiagramEditPart();
Diagram diagram = diagramEditPart.getDiagramView();
TransactionalEditingDomain editingDomain = diagramEditPart.getEditingDomain();
UMLDetailLevel oldLevel = UMLDetailLevelService.getLevel(diagram);
List<View> affectedViews = oldLevel.getAffectedViews(diagram);
for (View affected : affectedViews) {
for (EditElementCommand command : oldLevel.getUnapplyCommands(editingDomain, affected)) {
result.add(new ICommandProxy(command));
}
}
affectedViews = myNewLevel.getAffectedViews(diagram);
for (View affected : affectedViews) {
for (EditElementCommand command : myNewLevel.getApplyCommands(editingDomain, affected)) {
result.add(new ICommandProxy(command));
}
}
result.add(new ICommandProxy(myNewLevel.getSetLevelCommand(editingDomain, diagram)));
return result;
}
@Override
protected Request createTargetRequest() {
return null;
}
@Override
protected boolean isSelectionListener() {
return true;
}
private boolean calculateChecked() {
DiagramEditPart diagram = getDiagramEditPart();
if (diagram == null || diagram.getDiagramView() == null) {
return false;
}
return UMLDetailLevelService.getLevel(diagram.getDiagramView()) == myNewLevel;
}
}