/**
* Copyright (c) 2012-2016 Marsha Chechik, Alessio Di Sandro, Michalis Famelis,
* Rick Salay.
* 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:
* Alessio Di Sandro - Implementation.
*/
package edu.toronto.cs.se.mmint.mid.diagram.library;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint;
import org.eclipse.gmf.runtime.notation.Node;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.PlatformUI;
import edu.toronto.cs.se.mmint.MMINT;
import edu.toronto.cs.se.mmint.MMINTException;
import edu.toronto.cs.se.mmint.mid.MID;
import edu.toronto.cs.se.mmint.mid.MIDPackage;
import edu.toronto.cs.se.mmint.mid.Model;
import edu.toronto.cs.se.mmint.mid.diagram.edit.parts.MIDEditPart;
import edu.toronto.cs.se.mmint.mid.diagram.part.MIDDiagramEditor;
import edu.toronto.cs.se.mmint.mid.diagram.part.MIDDiagramEditorPlugin;
import edu.toronto.cs.se.mmint.mid.diagram.providers.MIDDiagramViewProvider;
import edu.toronto.cs.se.mmint.mid.ui.GMFUtils;
public class MIDDiagramUtils {
public static @NonNull Map<MID, List<IFile>> getInstanceMIDsInWorkspace() {
Map<MID, List<IFile>> mids = new HashMap<>();
for (IEditorReference editorReference : PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getEditorReferences()) {
String editorName = editorReference.getName();
if (editorName.endsWith(MMINT.MODEL_FILEEXTENSION_SEPARATOR + MIDPackage.eNAME + GMFUtils.DIAGRAM_SUFFIX)) {
MIDDiagramEditor midDiagram = (MIDDiagramEditor) editorReference.getEditor(true);
MID mid = (MID) midDiagram.getDiagram().getElement();
if (!mid.isInstancesLevel()) {
continue;
}
List<IFile> midFiles = new ArrayList<>();
IFile diagramFile = (IFile) midDiagram.getEditorInput().getAdapter(IFile.class);
if (diagramFile == null) {
continue;
}
midFiles.add(diagramFile);
try {
midFiles.add(GMFUtils.getModelFileFromDiagramFile(diagramFile));
}
catch (Exception e) {
MMINTException.print(IStatus.WARNING, "Can't add model file of MID " + diagramFile.getName(), e);
}
mids.put(mid, midFiles);
}
}
return mids;
}
public static List<IFile> getActiveInstanceMIDFiles() {
List<IFile> files = new ArrayList<>();
IFile instanceMIDFile = MMINT.getActiveInstanceMIDFile();
if (instanceMIDFile != null) {
files.add(instanceMIDFile);
try {
files.add(GMFUtils.getModelFileFromDiagramFile(instanceMIDFile));
}
catch (Exception e) {
MMINTException.print(IStatus.WARNING, "Can't add model file of diagram " + instanceMIDFile.getName() + " for gmf transactional command", e);
}
}
return files;
}
public static Node createModelShortcut(Model model, View gmfDiagramRoot) throws Exception {
MIDDiagramViewProvider gmfViewProvider = new MIDDiagramViewProvider();
Node gmfNode = gmfViewProvider.createModel_2002(
model,
gmfDiagramRoot,
-1,
true,
new PreferencesHint(MIDDiagramEditorPlugin.ID));
GMFUtils.addGMFShortcut(gmfNode, MIDEditPart.MODEL_ID);
return gmfNode;
}
}