package gov.nasa.jpl.mbee.mdk.actions;
import com.nomagic.magicdraw.core.Application;
import com.nomagic.magicdraw.openapi.uml.ReadOnlyElementException;
import com.nomagic.magicdraw.openapi.uml.SessionManager;
import com.nomagic.magicdraw.ui.browser.actions.DefaultBrowserAction;
import com.nomagic.magicdraw.uml.ConvertElementInfo;
import com.nomagic.magicdraw.uml.Refactoring;
import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Class;
import com.nomagic.uml2.ext.magicdraw.classes.mdkernel.Element;
import com.nomagic.uml2.ext.magicdraw.components.mdbasiccomponents.Component;
import gov.nasa.jpl.mbee.mdk.api.incubating.convert.Converters;
import gov.nasa.jpl.mbee.mdk.util.Utils;
import gov.nasa.jpl.mbee.mdk.mms.sync.local.LocalSyncProjectEventListenerAdapter;
import gov.nasa.jpl.mbee.mdk.mms.sync.local.LocalSyncTransactionCommitListener;
import java.awt.event.ActionEvent;
import java.util.Collection;
public class ClassToComponentRefactorWithIDAction extends DefaultBrowserAction {
Collection<Element> elements;
public static final String DEFAULT_ID = "ConvertClass";
private static final long serialVersionUID = 1L;
public ClassToComponentRefactorWithIDAction(Collection<Element> e) {
super(DEFAULT_ID, "Convert Class To Component", null, null);
this.elements = e;
}
public void actionPerformed(ActionEvent e) {
Boolean con = Utils.getUserYesNoAnswer("Warning! Refactor with ID action is best used with an immediate commit/save"
+ "\nand no remote users on this project. Otherwise, data loss may \n"
+ "happen on remote update. Do you want to continue?");
if (con == null || !con) {
return;
}
LocalSyncTransactionCommitListener listener = LocalSyncProjectEventListenerAdapter.getProjectMapping(Application.getInstance().getProject()).getLocalSyncTransactionCommitListener();
if (listener != null) {
listener.setDisabled(true);
}
SessionManager sessionManager = SessionManager.getInstance();
sessionManager.createSession("Convert Class To Component");
for (Element element : elements) {
if (!(element instanceof Class)) {
continue;
}
String elementID = Converters.getElementToIdConverter().apply(element);
// Converts the element to an interface.
ConvertElementInfo info = new ConvertElementInfo(Component.class);
// Preserves the old element ID for the new element. this doesn't work, will throw md error if set to true
info.setPreserveElementID(false);
try {
Element conversionTarget = Refactoring.Converting.convert(element, info);
Application.getInstance().getProject().getCounter().setCanResetIDForObject(true);
// element.setID(elementID);
conversionTarget.setID(elementID);
// String newElementID = conversionTarget.getID();
} catch (ReadOnlyElementException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
sessionManager.closeSession();
if (listener != null) {
listener.setDisabled(false);
}
}
}