blob: ee502c86790a887653d216497e6f119fa74446e5 [file] [log] [blame]
// Copyright (c) 2000-2019 Ericsson Telecom AB Telecom AB //
// All rights reserved. This program and the accompanying materials are made available under the //
// terms of the Eclipse Public License v2.0 which accompanies this distribution, and is available at //
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html //
///////////////////////////////////////////////////////////////////////////////////////////////////////
function GuiEditor_ViewEditor_View(p_viewModel, p_parentId, p_viewId, p_parent, p_desktopData) {
"use strict";
var base = new GuiEditor_BaseEditor_View(p_viewModel, p_parentId, p_viewId, p_parent, p_desktopData, this);
var v_this = this;
var v_selectedNode = "";
var viewmodelConnections = [];
var viewConnections = [];
///////////////////// GENERAL VIEW FUNCTIONS //////////////////////////////
this.init = function(callback) {
base.init(callback, "GuiEditor_ViewEditor", 610);
var viewmodelIndexes = base.viewmodel.getViewModelIndexes();
for (var i = 0; i < viewmodelIndexes.length; ++i) {
var endpoint = new ViewmodelConnectionEndpoint([0, i], viewmodelIndexes[i]);
viewmodelConnections.push(endpoint);
}
var childIds = base.viewmodel.getChildIds();
for (var i = 0; i < childIds.length; ++i) {
var endpoint = getViewEndpoint([2, i], childIds[i]);
viewConnections.push(endpoint);
}
base.validate();
};
this.destroy = base.destroy;
this.setDefaultZidx = base.setDefaultZidx;
this.setZidx = base.setZidx;
this.deletePressed = function() {
var node = base.tree.jstree("get_selected");
if (node.length > 0) {
deleteNode(node);
}
};
///////////////////// GENERAL EDITOR VIEW FUNCTIONS //////////////////////////////
this.disabled = base.disabled;
this.isNodeFromTree = base.isNodeFromTree;
this.search = base.search;
this.validate = base.validate;
///////////////////// VIEW EDITOR SPECIFIC FUNCTIONS //////////////////////////////
this.wouldCreateACycle = function(node, id) {
if (base.jsTreeUtils.isNodeFromTree(node, base.tree)) {
return base.viewmodel.wouldCreateACycle(id);
} else {
return false;
}
};
this.removeViewConnection = function(connectionIndex) {
base.connectionDeleted(viewConnections, connectionIndex);
base.createTree(function() {
base.tree.jstree("open_all");
base.refreshConnections();
});
base.validate();
};
this.removeViewmodelConnection = function(viewmodelIndex) {
var indexes = base.viewmodel.getViewModelIndexes();
var index = indexes.indexOf(viewmodelIndex);
base.viewmodel.viewModelDeleted(viewmodelIndex);
if (index != -1) {
base.connectionDeleted(viewmodelConnections, index);
base.createTree(function() {
base.tree.jstree("open_all");
base.refreshConnections();
});
base.validate();
}
};
///////////////////// CREATING THE VIEW //////////////////////////////
base.fillHeader = function(header) {
base.addButtonToHeader(header, "_Button_Edit", "GuiEditor_EditorButtonLeft", "EDIT");
var labelText = document.createElement("label");
labelText.setAttribute("id", base.id + "_HeaderText");
labelText.setAttribute("class", "GuiEditor_ViewEditorHeaderLabel");
header.appendChild(labelText);
base.addButtonToHeader(header, "_Button_Minimize", "GuiEditor_EditorButtonRight", " ");
};
base.createTree = function(p_callback) {
var data = base.viewmodel.getTreeData();
base.tree.jstree("destroy");
base.tree.jstree({
"core": {
"data": data,
"check_callback": function(operation, node, node_parent, node_position, more) {
if (operation === "copy_node") {
if (base.jsTreeUtils.isRoot(node_parent)) {
return false;
}
return isViewModelConnection(node, node_parent) || isAllowedViewConnection(node, node_parent, node_position) || isImportConnection(node, node_parent) || (base.jsTreeUtils.isNodeFromTree(node, base.tree) && base.jsTreeUtils.isTheParentOfNode(node, node_parent, base.tree));
} else {
return true;
}
},
"multiple": false,
"animation": false,
"worker": false
},
"plugins": ["contextmenu", "dnd"],
"contextmenu": {
"items": function($node) {
return {
"Delete": {
"label": "Delete",
"action": function(data) {
deleteNode(data.reference);
}
}
};
},
"select_node": false
},
"dnd": {
"always_copy": true
}
});
base.tree.bind("copy_node.jstree", function(e, data) {
if (base.tree.jstree("get_node", data.original.id)) {
connectionMoved(data);
} else if (data.original.text == "View connection point") {
viewModelAdded(data);
} else if (data.original.text == "Child of ...") {
viewAdded(data);
} else if (data.original.text == "Import into ...") {
viewAdded(data);
}
});
base.tree.bind("select_node.jstree", function(e, data) {
if (v_selectedNode == data.node.id) {
data.instance.deselect_node(data.node);
v_selectedNode = "";
} else {
v_selectedNode = data.node.id;
}
});
base.tree.bind("redraw.jstree", function(e, data) {
document.getElementById(base.id).style.height = "auto";
document.getElementById(base.id).style.width = "auto";
});
base.openNodes();
base.tree.bind("after_open.jstree after_close.jstree", function(e, data) {
base.parent.refreshConnections(v_this);
document.getElementById(base.id).style.height = "auto";
document.getElementById(base.id).style.width = "auto";
base.saveOpenNodes();
});
base.tree.bind("ready.jstree", function(e, data) {
p_callback(true);
});
};
///////////////////// HANDLING EVENTS //////////////////////////////
base.copyEditor = function() {
base.parent.copyViewEditor(base.viewmodel.getClass(), base.viewmodel.getCustomData());
};
base.treeSlid = function() {
if (base.isVisible) {
for (var i = 0; i < viewConnections.length; ++i) {
viewConnections[i].multiple = false;
viewConnections[i].style = "horizontal";
}
} else {
for (var i = 0; i < viewConnections.length; ++i) {
viewConnections[i].multiple = true;
viewConnections[i].style = "vertical";
}
}
base.refreshConnections();
};
base.editorDeleted = function() {
base.parent.editorDeleted("View", v_this);
};
base.getClasses = function(p_callback) {
base.parent.getViewClasses(p_callback);
};
///////////////////// CHECKING OWN EVENTS //////////////////////////////
function isViewModelConnection(node, parent) {
return node.text === "View connection point" && base.jsTreeUtils.getDepth(parent, base.tree) === 1 && base.jsTreeUtils.getIndexOfNode(parent, base.tree) === 0;
}
function isAllowedViewConnection(node, parent, pos) {
if (node.text === "Child of ..." && !base.jsTreeUtils.isNodeFromTree(node, base.tree) && base.jsTreeUtils.getDepth(parent, base.tree) === 1 && base.jsTreeUtils.getIndexOfNode(parent, base.tree) === 2) {
var id = base.viewmodel.wouldUseId(pos);
return !base.parent.wouldCreateACycle(node, id);
} else {
return false;
}
}
function isImportConnection(node, parent) {
return node.text === "Import into ..." && base.jsTreeUtils.getDepth(parent, base.tree) === 1 && base.jsTreeUtils.getIndexOfNode(parent, base.tree) === 2;
}
///////////////////// HANDLING OWN EVENTS //////////////////////////////
function deleteNode(p_data) {
// we have to get the jquery node instead of the jstree node
var treeNode = base.tree.jstree("get_node", p_data);
var jqueryNode = $("#" + treeNode.id);
var index = jqueryNode.parent().children().index(jqueryNode[0]);
var path = base.jsTreeUtils.getPath(base.tree.jstree("get_node", treeNode.id)).path;
if (path.length > 1 && path[0] == 0) {
base.viewmodel.deleteViewModelIndexFromPosition(index);
base.tree.jstree("delete_node", p_data);
base.connectionDeleted(viewmodelConnections, index);
base.refreshConnections();
} else if (path.length > 1 && path[0] == 2) {
base.viewmodel.removeChildView(index);
var nodeToDelete = base.jsTreeUtils.getLastNodeIdFromPath(base.tree, [2, jqueryNode.parent().children().length - 1])
base.tree.jstree("delete_node", nodeToDelete);
base.connectionDeleted(viewConnections, index);
base.refreshConnections();
}
base.saveOpenNodes();
base.validate();
}
function viewModelAdded(data) {
base.tree.jstree("delete_node", data.node.id);
var index = data.position;
var viewModelIndex = base.parent.getConnectionInformation("VM_V", data.original.id);
var text = "ViewModel " + viewModelIndex;
base.tree.jstree("create_node", data.parent, text, data.position);
base.tree.jstree("open_node", data.parent);
base.viewmodel.addViewModelIndex(viewModelIndex, index);
base.connectionAdded(viewmodelConnections, index, new ViewmodelConnectionEndpoint([0, index], viewModelIndex));
base.refreshConnections();
base.validate();
}
function viewAdded(data) {
base.tree.jstree("delete_node", data.node.id);
var index = data.position;
var size = base.viewmodel.getChildIds().length;
var parentId = base.viewmodel.addChildView(index);
var oldParentId = base.parent.getConnectionInformation("V_V", {"treeId": data.original.id, "parentId": parentId, "type": "set"});
var text = "Child view " + size;
base.tree.jstree("create_node", data.parent, text, "last");
base.tree.jstree("open_node", data.parent);
base.connectionAdded(viewConnections, index, getViewEndpoint([2, index], parentId));
// the next line will invalidate the parentId if the connection was moved from a parent view, so this is the safest place we can do this
base.viewmodel.removeConnectedChild(oldParentId);
base.refreshConnections();
base.validate();
}
function connectionMoved(data) {
var path = base.jsTreeUtils.getPath(base.tree.jstree("get_node", data.original.id)).path;
if (path[0] == 0) {
viewmodelConnectionMoved(data);
} else if (path[0] == 2) {
viewConnectionMoved(data);
}
}
function viewmodelConnectionMoved(data) {
base.tree.jstree("delete_node", data.original.id);
var fromIndex = data.old_position;
var toIndex = data.position;
if (toIndex > fromIndex) {
--toIndex;
} else if (fromIndex > toIndex) {
--fromIndex;
}
if (fromIndex == toIndex) {
return;
}
base.viewmodel.connectionOrderChanged(fromIndex, toIndex);
base.connectionMoved(viewmodelConnections, fromIndex, toIndex);
base.refreshConnections();
}
function viewConnectionMoved(data) {
base.tree.jstree("delete_node", data.node.id);
var fromIndex = data.old_position;
var toIndex = data.position;
if (toIndex > fromIndex) {
--toIndex;
} else if (fromIndex > toIndex) {
--fromIndex;
}
if (fromIndex == toIndex) {
return;
}
base.viewmodel.childViewOrderChanged(fromIndex, toIndex);
base.connectionMoved(viewConnections, fromIndex, toIndex);
base.refreshConnections();
}
///////////////////// HANDLING CONNECTIONS //////////////////////////////
function ViewmodelConnectionEndpoint(p_path, p_identifier) {
return new base.Endpoint(
p_path,
p_identifier,
"target",
"VM_V",
{
"stroke": "blue"
},
function(htmlObj) {
var offset = htmlObj.offset();
offset.top += htmlObj.height() / 2;
return offset;
}
);
}
function ViewConnectionEndpoint(p_path, p_identifier, p_multiple, p_style) {
var endpoint = new base.Endpoint(
p_path,
p_identifier,
"target",
"V_V",
{
"stroke": "green"
},
function(htmlObj) {
var offset = htmlObj.offset();
offset.top += htmlObj.height() / 2;
return offset;
}
);
endpoint.multiple = p_multiple;
endpoint.style = p_style;
endpoint.getOffsets = function() {
var htmlObj = $("#" + base.id);
var offset = htmlObj.offset();
var upper = mcopy(offset);
upper.left += htmlObj.width() / 2;
var lower = mcopy(offset);
lower.left += htmlObj.width() / 2;
lower.top += htmlObj.height();
return [upper, lower];
}
return endpoint;
}
var viewConnectionPoint = {
"getOffset": function() {
var htmlObj;
if (!base.isVisible) {
var id = base.id + "_Header";
htmlObj = $("#" + id);
} else {
var id = base.jsTreeUtils.getLastNodeIdFromPath(base.tree, [1]);
htmlObj = $("#" + id + "_anchor");
}
var offset = htmlObj.offset();
offset.left += htmlObj.width();
offset.top += htmlObj.height() / 2;
return offset;
},
"getZIndex": function() {
return base.zIndex + 1;
},
"isEnabled": function() {
return base.isEnabled;
},
"object": v_this
}
function getViewEndpoint(p_path, p_identifier) {
if (base.isVisible) {
return new ViewConnectionEndpoint(p_path, p_identifier, false, "horizontal");
} else {
return new ViewConnectionEndpoint(p_path, p_identifier, true, "vertical");
}
}
this.getEndpoint = function(identifier) {
if (identifier == base.viewmodel.getParentId()) {
return viewConnectionPoint;
} else {
return undefined;
}
};
this.getConnectionInformation = function(identifier) {
var parentId = base.viewmodel.getParentId();
if (identifier.type == "set" && base.tree.jstree("get_node", identifier.treeId)) {
base.viewmodel.setParentId(identifier.parentId);
return parentId;
} else if (identifier.type == "get" && identifier.parentId == base.viewmodel.getParentId()) {
return parentId;
} else {
return undefined;
}
};
this.getEndpoints = function() {
var list = [];
for (var i = 0; i < viewmodelConnections.length; ++i) {
list.push(viewmodelConnections[i]);
}
for (var i = 0; i < viewConnections.length; ++i) {
list.push(viewConnections[i]);
}
return list;
};
}
//# sourceURL=GuiEditor\Views\View_ViewEditor.js