Fusa_Medini/ASIL-C_BOM/config/scripts/.lib/trashbin.js

169 lines
5.8 KiB
JavaScript

/*
* Copyright 2017-2024 ANSYS, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
* documentation files (the "Software"), to deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of
* the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
* OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* v2024-03-27 - JM support deletion of MissionProfile
* v2020-03-20 - JM support deletion of normal SysML packages
* v2018-01-15 - JM fail safe when deleting same object multiple times
* v2017-09-13 - JM initial version
*/
if (!bind) {
throw "This script requires extended API";
}
// bind operations (NOT OFFICIAL API YET)
var DeleteElementOperation = bind("de.ikv.analyze.core",
"de.ikv.analyze.core.operations.DeleteElementOperation", false);
var TraceQuickLinkHandler = bind("de.ikv.analyze.ui",
"de.ikv.analyze.ui.handlers.TraceQuickLinkHandler", false);
var VanillaAction = bind("de.ikv.medini.util.eclipse",
"de.ikv.medini.util.eclipse.jface.action.VanillaAction", false);
var StructuredSelection = bind("org.eclipse.jface",
"org.eclipse.jface.viewers.StructuredSelection", false);
var ExecutionEvent = bind("org.eclipse.core.commands",
"org.eclipse.core.commands.ExecutionEvent", false);
var EvaluationContext = bind("org.eclipse.core.expressions",
"org.eclipse.core.expressions.EvaluationContext", false);
var MediniProjectModelUtil = bind("de.ikv.medini.metamodel.projectmodel",
"de.ikv.medini.metamodel.projectmodel.util.MediniProjectModelUtil", false);
var MediniEMFUtil = bind("de.ikv.medini.util.emf.plugin",
"de.ikv.medini.util.emf.MediniEMFUtil", false);
/**
* Object Trashbin()
*
* @constructor
* @since 3.1.0
* @stability 1 - Experimental
*/
function Trashbin() {}
Trashbin.prototype = new Object();
/**
* Returns <code>true</code> if the given element is for sure a top level
* element in the sense, that it is hooked into the overall project model using
* a PJProxy. In all other cases it returns false.
*
* @param {Object}
* element
* @returns <code>true</code> if this is a top level element
*/
Trashbin.isTopLevelElement = function(element) {
if (element.prototype == Metamodel.safetygoals.SafetyRequirementsModel) {
return true;
}
if (element.prototype == Metamodel.hazard.PlainItem) {
return true;
}
if (element.prototype == Metamodel.hazard.HazardAnalysisModel) {
return true;
}
if (element.prototype == Metamodel.FTA.FTAModel) {
return true;
}
if (element.prototype == Metamodel.FMEA.FMEAWorksheet) {
return true;
}
if (element.prototype == Metamodel.dc.DCWorksheet) {
return true;
}
if (element.prototype == Metamodel.safetyModel.MeasureCatalog) {
return true;
}
if (element.prototype == Metamodel.safetyModel.FailureCollection) {
return true;
}
if (element.prototype == Metamodel.checklist.Checklist) {
return true;
}
if (element.prototype == Metamodel.failureratecatalogs.MissionProfile) {
return true;
}
// allow the deletion of plain packages, but not top level (== models)
if (element.prototype == Metamodel.sysml.SysMLContainerPackage && (element.mediniGetContainer() == undefined)) {
throw "elements of this type cannot be deleted - not supported";
}
if (element.prototype == Metamodel.Simulink.Configuration) {
throw "elements of this type cannot be deleted - not supported";
}
return false;
};
Trashbin.deleteElement = function(element) {
if (!element) {
throw "missing element for deletion";
}
// at this stage we shall check whether the object is inside an editing domain
if (MediniEMFUtil.getEditingDomain(element) == undefined) {
// silently return
return;
}
// add some paranoia here
if (element.prototype == Metamodel.FTA.Event) {
throw "pure Event objects cannot be deleted, only EventNode objects";
}
// all top level objects need special attention
if (Trashbin.isTopLevelElement(element)) {
element = MediniProjectModelUtil.findPJProxyModel(element);
if (element == null) {
throw "this object seems to be outside the containment hirarchy already";
}
}
var op = new DeleteElementOperation(element, "");
op.clientExecute(null);
};
Trashbin.deleteRelation = function(source, target, type) {
if (!source) {
throw "missing mandatory source argument";
}
if (!target) {
throw "missing mandatory target argument";
}
if (!type) {
throw "missing mandatory type argument";
}
// Trace (HACK!)
if (type == "TRACE" || type == Metamodel.traceability.Trace) {
var action = new VanillaAction("Delete Trace");
var selection = new StructuredSelection([source, target]);
var context = new EvaluationContext(null, selection);
context.addVariable("selection", selection);
var params = new java.util.HashMap();
params["traceLink.inverse"] = "true";
var event = new ExecutionEvent(null, params, null, context);
var handler = new TraceQuickLinkHandler();
handler.selectionChanged(action, selection);
handler.execute(event);
return;
}
// not supported
throw "relation type is not supported";
};