blob: 1cd64b35e45cb9bad95893e7606466740d8ae2d4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 Agence spatiale canadienne / Canadian Space Agency.
* 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:
* Pierre Allard - initial API and implementation
*
* SPDX-License-Identifier: EPL-1.0
*******************************************************************************/
package org.eclipse.apogy.core.topology.ui.parts;
import java.io.File;
import org.eclipse.apogy.common.emf.ApogyCommonEMFFactory;
import org.eclipse.apogy.common.emf.TreeRootNode;
import org.eclipse.apogy.common.emf.transaction.ApogyCommonTransactionFacade;
import org.eclipse.apogy.common.emf.ui.parts.AbstractPart;
import org.eclipse.apogy.common.topology.bindings.ApogyCommonTopologyBindingsFactory;
import org.eclipse.apogy.common.topology.bindings.ApogyCommonTopologyBindingsPackage;
import org.eclipse.apogy.common.topology.bindings.BindingsList;
import org.eclipse.apogy.common.topology.bindings.BindingsSet;
import org.eclipse.apogy.common.topology.bindings.FeatureRootsList;
import org.eclipse.apogy.core.ApogyCoreFactory;
import org.eclipse.apogy.core.ApogyCorePackage;
import org.eclipse.apogy.core.ApogySystem;
import org.eclipse.apogy.core.AssemblyLinksList;
import org.eclipse.apogy.core.ConnectionPointsList;
import org.eclipse.apogy.core.TopologyRoot;
import org.eclipse.apogy.core.topology.ui.ApogyCoreTopologyUIFacade;
import org.eclipse.apogy.core.topology.ui.composites.ApogySystemEditingComposite;
import org.eclipse.apogy.core.topology.ui.internal.ApogySystem3dUtils;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.e4.ui.model.application.ui.basic.MPart;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.progress.UIJob;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ApogySystemFileEditorPart extends AbstractPart {
private static final Logger Logger = LoggerFactory.getLogger(ApogySystemFileEditorPart.class);
private ApogySystemEditingComposite apogySystemEditingComposite;
private boolean dirty = false;
private String fileName = null;
private ApogySystem apogySystem;
private String apogySystemFilePath;
public ApogySystem getApogySystem() {
return this.apogySystem;
}
public String getApogySystemFilePath() {
return this.apogySystemFilePath;
}
public void saveToFile() {
try {
this.apogySystemEditingComposite.save();
} catch (Exception e) {
Logger.error(e.getMessage(), e);
}
}
@Override
public void userPostConstruct(MPart mPart) {
super.userPostConstruct(mPart);
}
@Override
public void userPreDestroy(MPart mPart) {
// Clear the assembly topology.
ApogyCoreTopologyUIFacade.INSTANCE.setEditedApogySystemAssemblyRoot(null);
super.userPreDestroy(mPart);
}
@Override
protected EObject getInitializeObject() {
return null;
}
@Override
protected void createContentComposite(Composite parent, int style) {
this.apogySystemEditingComposite = new ApogySystemEditingComposite(parent, style) {
@Override
protected void setFileIsDirty(boolean newDirty) {
if (newDirty) {
// Update the assembly root.
if (getApogySystem() != null) {
UIJob updateJob = new UIJob("Update Assembly Topology") {
@Override
public IStatus runInUIThread(IProgressMonitor arg0) {
try {
ApogySystem as = getApogySystem();
if (as != null) {
ApogyCoreTopologyUIFacade.INSTANCE.setEditedApogySystemAssemblyRoot(
ApogySystem3dUtils.assembleSubSystem(as));
}
} catch (Exception e) {
Logger.error(e.getMessage(), e);
}
return Status.OK_STATUS;
}
};
updateJob.schedule();
}
}
ApogySystemFileEditorPart.this.dirty = newDirty;
// Update the dirty file asterix.
ApogySystemFileEditorPart.this.mPart.setLabel(getPartDisplayedName());
}
@Override
public void setApogySystem(org.eclipse.apogy.core.ApogySystem newApogySystem) {
ApogySystemFileEditorPart.this.apogySystem = newApogySystem;
fixApogySystem(newApogySystem);
super.setApogySystem(newApogySystem);
// Raise a selection containing the Apogy System.
ApogySystemFileEditorPart.this.selectionService.setSelection(newApogySystem);
// Create the system assembly topology and raise a selection.
if (newApogySystem != null) {
ApogyCoreTopologyUIFacade.INSTANCE
.setEditedApogySystemAssemblyRoot(ApogySystem3dUtils.assembleSubSystem(newApogySystem));
}
}
@Override
protected void apogySystemPathSet(String newApogySystemPath) {
ApogySystemFileEditorPart.this.apogySystemFilePath = newApogySystemPath;
if (newApogySystemPath != null) {
ApogySystemFileEditorPart.this.fileName = newApogySystemPath;
} else {
ApogySystemFileEditorPart.this.fileName = null;
}
// Update displayed name.
ApogySystemFileEditorPart.this.mPart.setLabel(getPartDisplayedName());
}
};
}
@Override
protected void setCompositeContent(EObject eObject) {
if (this.apogySystemEditingComposite != null && !this.apogySystemEditingComposite.isDisposed()) {
this.apogySystemEditingComposite.setApogySystem((ApogySystem) eObject);
}
}
@Override
protected void createNoContentComposite(Composite parent, int style) {
createContentComposite(parent, style);
}
private String getPartDisplayedName() {
String label = "";
if (this.fileName != null) {
label += this.fileName.substring(this.fileName.lastIndexOf(File.separator) + 1);
if (this.dirty) {
label = "*" + label;
}
} else {
label += "System Details";
}
return label;
}
private void fixApogySystem(ApogySystem apogySystem) {
if (apogySystem != null) {
if (apogySystem.getAssemblyLinksList() == null) {
AssemblyLinksList assemblyLinksList = ApogyCoreFactory.eINSTANCE.createAssemblyLinksList();
ApogyCommonTransactionFacade.INSTANCE.basicSet(apogySystem,
ApogyCorePackage.Literals.APOGY_SYSTEM__ASSEMBLY_LINKS_LIST, assemblyLinksList);
}
if (apogySystem.getBindingSet() == null) {
BindingsSet bindingsSet = ApogyCommonTopologyBindingsFactory.eINSTANCE.createBindingsSet();
bindingsSet.setFeatureRootsList(ApogyCommonTopologyBindingsFactory.eINSTANCE.createFeatureRootsList());
bindingsSet.setBindingsList(ApogyCommonTopologyBindingsFactory.eINSTANCE.createBindingsList());
ApogyCommonTransactionFacade.INSTANCE.basicSet(apogySystem,
ApogyCorePackage.Literals.APOGY_SYSTEM__BINDING_SET, bindingsSet);
} else {
if (apogySystem.getBindingSet().getFeatureRootsList() == null) {
FeatureRootsList featureRootsList = ApogyCommonTopologyBindingsFactory.eINSTANCE
.createFeatureRootsList();
TreeRootNode treeRoot = ApogyCommonEMFFactory.eINSTANCE.createTreeRootNode();
treeRoot.setSourceClass(apogySystem.getInterfaceClass());
featureRootsList.getFeatureRoots().add(treeRoot);
ApogyCommonTransactionFacade.INSTANCE.basicSet(apogySystem.getBindingSet(),
ApogyCommonTopologyBindingsPackage.Literals.BINDINGS_SET__FEATURE_ROOTS_LIST,
featureRootsList);
}
if (apogySystem.getBindingSet().getFeatureRootsList().getFeatureRoots().isEmpty()) {
if (apogySystem.getInterfaceClass() != null) {
TreeRootNode treeRoot = ApogyCommonEMFFactory.eINSTANCE.createTreeRootNode();
treeRoot.setSourceClass(apogySystem.getInterfaceClass());
ApogyCommonTransactionFacade.INSTANCE.basicAdd(
apogySystem.getBindingSet().getFeatureRootsList(),
ApogyCommonTopologyBindingsPackage.Literals.FEATURE_ROOTS_LIST__FEATURE_ROOTS,
treeRoot);
}
}
if (apogySystem.getBindingSet().getBindingsList() == null) {
BindingsList bindingsList = ApogyCommonTopologyBindingsFactory.eINSTANCE.createBindingsList();
ApogyCommonTransactionFacade.INSTANCE.basicSet(apogySystem.getBindingSet(),
ApogyCommonTopologyBindingsPackage.Literals.BINDINGS_SET__BINDINGS_LIST, bindingsList);
}
}
if (apogySystem.getConnectionPointsList() == null) {
ConnectionPointsList connectionPointsList = ApogyCoreFactory.eINSTANCE.createConnectionPointsList();
ApogyCommonTransactionFacade.INSTANCE.basicSet(apogySystem,
ApogyCorePackage.Literals.APOGY_SYSTEM__CONNECTION_POINTS_LIST, connectionPointsList);
}
if (apogySystem.getTopologyRoot() == null) {
TopologyRoot topologyRoot = ApogyCoreFactory.eINSTANCE.createTopologyRoot();
ApogyCommonTransactionFacade.INSTANCE.basicSet(apogySystem,
ApogyCorePackage.Literals.APOGY_SYSTEM__TOPOLOGY_ROOT, topologyRoot);
}
}
}
}