349 lines
9.7 KiB
JavaScript
349 lines
9.7 KiB
JavaScript
|
|
function node(PKey,nodeText) {
|
||
|
|
// private vars
|
||
|
|
var m_PKey=PKey;
|
||
|
|
var m_displayDom=document.createElement("span");
|
||
|
|
var m_nodeRelations=new Array();
|
||
|
|
var m_toolbar=null;
|
||
|
|
var m_textControl=null;
|
||
|
|
var m_iconControl=null;
|
||
|
|
var m_contextMenu=null;
|
||
|
|
var m_isCollapsed=false;
|
||
|
|
|
||
|
|
if (arguments.length >= 1) {
|
||
|
|
return(construct());
|
||
|
|
} else {
|
||
|
|
this.fromXML=fromXML;
|
||
|
|
return(this);
|
||
|
|
}
|
||
|
|
|
||
|
|
// properties
|
||
|
|
function getPKey() { return(m_PKey); }
|
||
|
|
function getNodeRelations() { return(m_nodeRelations); }
|
||
|
|
|
||
|
|
// methods
|
||
|
|
function construct() {
|
||
|
|
// the basic node
|
||
|
|
m_displayDom.setAttribute("id","mmNode_" + m_PKey);
|
||
|
|
m_displayDom.setAttribute("class","node");
|
||
|
|
m_displayDom.extends(new Publisher());
|
||
|
|
dragNDrop.activateForObject(m_displayDom);
|
||
|
|
|
||
|
|
m_contextMenu=addContextMenu();
|
||
|
|
m_displayDom.appendChild(m_contextMenu);
|
||
|
|
|
||
|
|
exportFunctions();
|
||
|
|
|
||
|
|
// add a toolbar
|
||
|
|
if (!m_toolbar) {
|
||
|
|
m_toolbar=new toolbar(m_displayDom);
|
||
|
|
m_displayDom.appendChild(m_toolbar);
|
||
|
|
m_toolbar.hide();
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!m_textControl){ m_textControl=new textControl(nodeText); }
|
||
|
|
m_displayDom.appendChild(m_textControl);
|
||
|
|
m_textControl.addSubscriber(notifyTextUpdate,"changeMode");
|
||
|
|
|
||
|
|
if (!m_iconControl) {
|
||
|
|
m_iconControl=new iconControl();
|
||
|
|
}
|
||
|
|
//m_displayDom.appendChild(document.createElement("br"));
|
||
|
|
m_displayDom.appendChild(m_iconControl);
|
||
|
|
|
||
|
|
if (m_isCollapsed) {collapse();}
|
||
|
|
|
||
|
|
m_displayDom.onmouseup=mouseUpHandler;
|
||
|
|
m_displayDom.onmouseover=mouseOverHandler;
|
||
|
|
m_displayDom.onmouseout=mouseOutHandler;
|
||
|
|
|
||
|
|
document.getElementById('nodes').appendChild(m_displayDom);
|
||
|
|
|
||
|
|
m_textControl.focus();
|
||
|
|
return(m_displayDom);
|
||
|
|
}
|
||
|
|
function addContextMenu(){
|
||
|
|
var contextMenu;
|
||
|
|
var mi=new Array();
|
||
|
|
for (var i=0;i<g_iconList.childNodes.length;i++) {
|
||
|
|
var iconName=g_iconList.childNodes[i].getAttribute("filename");
|
||
|
|
var iconTitle=g_iconList.childNodes[i].getAttribute("description");
|
||
|
|
mi[mi.length]=new pictureMenuItem("icons/" + iconName ,iconTitle,onAddIconClick,"nodeIconMenuItem");
|
||
|
|
}
|
||
|
|
//mi[mi.length]=new textMenuItem("Close",contextMenu.hide,"nodeContextMenuItem");
|
||
|
|
contextMenu=new menuControl(mi,5);
|
||
|
|
contextMenu.setAttribute("class","nodeContextMenu");
|
||
|
|
contextMenu.hide();
|
||
|
|
document.addSubscriber(contextMenu.hide,"clicked");
|
||
|
|
|
||
|
|
m_displayDom.onmousedown=function(event) {contextMenuOpenAction(event);dragNDrop.onMouseDownHandler(event);}
|
||
|
|
dragNDrop.addSubscriber(contextMenu.hide,"moving");
|
||
|
|
function contextMenuOpenAction(event){
|
||
|
|
if (event.target==m_displayDom) {
|
||
|
|
contextMenu.toggleVisible();
|
||
|
|
contextMenu.style.position="absolute";
|
||
|
|
contextMenu.style.left=(event.clientX+window.scrollX-m_displayDom.style.left.split("px")[0]) + "px";
|
||
|
|
contextMenu.style.top=(event.clientY+window.scrollY-m_displayDom.style.top.split("px")[0]) + "px";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onAddIconClick(event){
|
||
|
|
m_iconControl.addIcon(event.target.getAttribute("src"));
|
||
|
|
}
|
||
|
|
return(contextMenu);
|
||
|
|
}
|
||
|
|
|
||
|
|
function exportFunctions(){
|
||
|
|
m_displayDom.debugOut=debugOut;
|
||
|
|
m_displayDom.addNodeRelation=addNodeRelation;
|
||
|
|
m_displayDom.deleteNodeRelation=deleteNodeRelation;
|
||
|
|
m_displayDom.getPKey=getPKey;
|
||
|
|
m_displayDom.getNodeRelations=getNodeRelations;
|
||
|
|
m_displayDom.redrawNodeRelations=redrawNodeRelations;
|
||
|
|
m_displayDom.hide=hide;
|
||
|
|
m_displayDom.show=show;
|
||
|
|
m_displayDom.collapse=collapse;
|
||
|
|
m_displayDom.expand=expand;
|
||
|
|
m_displayDom.erase=erase;
|
||
|
|
m_displayDom.isCollapsed=isCollapsed;
|
||
|
|
m_displayDom.isLeafNode=isLeafNode;
|
||
|
|
m_displayDom.getParentNode=getParentNode;
|
||
|
|
m_displayDom.getParentNodeRelation=getParentNodeRelation;
|
||
|
|
m_displayDom.isChildNodeOf=isChildNodeOf;
|
||
|
|
m_displayDom.isRootNode=isRootNode;
|
||
|
|
|
||
|
|
m_displayDom.toXML=toXML;
|
||
|
|
m_displayDom.fromXML=fromXML;
|
||
|
|
}
|
||
|
|
function notifyTextUpdate(publisher,eventType){
|
||
|
|
redrawNodeRelations();
|
||
|
|
}
|
||
|
|
function mouseUpHandler(){
|
||
|
|
redrawNodeRelations();
|
||
|
|
}
|
||
|
|
function mouseOverHandler(){
|
||
|
|
m_displayDom.notifySubscribers(m_displayDom,"mouseOver");
|
||
|
|
m_toolbar.show();
|
||
|
|
}
|
||
|
|
function mouseOutHandler(){
|
||
|
|
m_displayDom.notifySubscribers(m_displayDom,"mouseOut");
|
||
|
|
m_toolbar.hide();
|
||
|
|
}
|
||
|
|
function isCollapsed(){
|
||
|
|
return(m_isCollapsed);
|
||
|
|
}
|
||
|
|
function getParentNodeRelation(){
|
||
|
|
for (var i=0;i < m_nodeRelations.length;i++) {
|
||
|
|
if ((m_nodeRelations[i].getChildNode()==m_displayDom) && (m_nodeRelations[i].isMain())){
|
||
|
|
return(m_nodeRelations[i]);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return(null);
|
||
|
|
}
|
||
|
|
function getParentNode(){
|
||
|
|
var parentNode=getParentNodeRelation();
|
||
|
|
if (parentNode) {
|
||
|
|
return(parentNode.getParentNode());
|
||
|
|
} else {
|
||
|
|
return(null);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
function isChildNodeOf(testNode){
|
||
|
|
var parentNode=getParentNode();
|
||
|
|
if (parentNode){
|
||
|
|
if (parentNode==testNode) {
|
||
|
|
return(true);
|
||
|
|
} else {
|
||
|
|
return(parentNode.isChildNodeOf(testNode));
|
||
|
|
}
|
||
|
|
} else {
|
||
|
|
// hit rootnode
|
||
|
|
return(false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
function isLeafNode(){
|
||
|
|
for (var i=0;i < m_nodeRelations.length;i++) {
|
||
|
|
if (m_nodeRelations[i].getParentNode()==m_displayDom){
|
||
|
|
return(false);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return(true);
|
||
|
|
}
|
||
|
|
function expand(isNonRecursive){
|
||
|
|
m_isCollapsed=false;
|
||
|
|
m_displayDom.setAttribute("class","node");
|
||
|
|
for (var i=0;i < m_nodeRelations.length;i++) {
|
||
|
|
if ((m_nodeRelations[i].isMain())
|
||
|
|
&& (m_nodeRelations[i].getParentNode()==m_displayDom)){
|
||
|
|
if (!isNonRecursive) { m_nodeRelations[i].getChildNode().expand(isNonRecursive); }
|
||
|
|
m_nodeRelations[i].getChildNode().show();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
function erase(){
|
||
|
|
// first delete all free relations
|
||
|
|
for (var i=m_nodeRelations.length-1;i>=0;i--) {
|
||
|
|
if (!m_nodeRelations[i].isMain()) {
|
||
|
|
var nodeRel=m_nodeRelations[i];
|
||
|
|
deleteNodeRelation(nodeRel);
|
||
|
|
nodeRel.erase();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
for (var i=m_nodeRelations.length-1;i>=0;i--) {
|
||
|
|
// recursively delete childs following the Main-Links
|
||
|
|
if (m_nodeRelations[i].getParentNode()==m_displayDom) {
|
||
|
|
m_nodeRelations[i].getChildNode().erase();
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|
||
|
|
// delete the relation to the parent
|
||
|
|
for (var i=0;i < m_nodeRelations.length;i++) {
|
||
|
|
if (m_nodeRelations[i].getChildNode()==m_displayDom){
|
||
|
|
m_nodeRelations[i].erase();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
removeFromRootNodes();
|
||
|
|
destroy();
|
||
|
|
}
|
||
|
|
function isRootNode(){
|
||
|
|
for (var i=0;i < rootNode.length;i++) {
|
||
|
|
if (m_displayDom==rootNode[i]) {
|
||
|
|
return(true);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return(false);
|
||
|
|
}
|
||
|
|
function removeFromRootNodes(){
|
||
|
|
// remove current node from the rootnodes
|
||
|
|
for (var i=0;i < rootNode.length;i++) {
|
||
|
|
if (m_displayDom==rootNode[i]) {
|
||
|
|
rootNode.splice(i,1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
function destroy(){
|
||
|
|
m_displayDom.parentNode.removeChild(m_displayDom);
|
||
|
|
}
|
||
|
|
|
||
|
|
function collapse(){
|
||
|
|
m_isCollapsed=true;
|
||
|
|
if (!isLeafNode()) { m_displayDom.setAttribute("class","collapsedNode"); }
|
||
|
|
for (var i=0;i < m_nodeRelations.length;i++) {
|
||
|
|
if ((m_nodeRelations[i].isMain())
|
||
|
|
&& (m_nodeRelations[i].getParentNode()==m_displayDom)){
|
||
|
|
m_nodeRelations[i].getChildNode().collapse();
|
||
|
|
m_nodeRelations[i].getChildNode().hide();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function hide(){
|
||
|
|
m_displayDom.style.display="none";
|
||
|
|
for (var i=0;i < m_nodeRelations.length;i++) {
|
||
|
|
m_nodeRelations[i].hide();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function show(){
|
||
|
|
m_displayDom.style.display="block";
|
||
|
|
for (var i=0;i < m_nodeRelations.length;i++) {
|
||
|
|
m_nodeRelations[i].show();
|
||
|
|
}
|
||
|
|
redrawNodeRelations();
|
||
|
|
}
|
||
|
|
|
||
|
|
function addNodeRelation(newNodeRel) {
|
||
|
|
if (!hasNodeRelation(newNodeRel)) {
|
||
|
|
m_nodeRelations[m_nodeRelations.length]=newNodeRel;
|
||
|
|
if ((newNodeRel.getChildNode) && (newNodeRel.getChildNode()==m_displayDom) && (newNodeRel.isMain())) {
|
||
|
|
removeFromRootNodes();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
function deleteNodeRelation(nodeRel) {
|
||
|
|
for (var i=0;i<m_nodeRelations.length;i++) {
|
||
|
|
if (m_nodeRelations[i]==nodeRel) {
|
||
|
|
m_nodeRelations.splice(i,1);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
function hasNodeRelation(nodeRel) {
|
||
|
|
for (var i=0;i<m_nodeRelations.length;i++) {
|
||
|
|
if (m_nodeRelations[i]==nodeRel) {
|
||
|
|
return(true);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
function debugOut() {
|
||
|
|
var output=("PKey: _"+ m_PKey + "_");
|
||
|
|
output=output + "\nRootNode: " + isRootNode();
|
||
|
|
output=output + "\nLeafNode: " + isLeafNode();
|
||
|
|
output=output + "\nNodeText: " + m_textControl.getText();
|
||
|
|
output=output + "\nisCollapsed: " + m_isCollapsed;
|
||
|
|
output=output + "\nNodeRelations:";
|
||
|
|
for (i=0;i < m_nodeRelations.length;i++) {
|
||
|
|
output=output + m_nodeRelations[i].debugOut();
|
||
|
|
}
|
||
|
|
return(output);
|
||
|
|
}
|
||
|
|
|
||
|
|
function redrawNodeRelations(){
|
||
|
|
var rels=getNodeRelations();
|
||
|
|
var i;
|
||
|
|
for (i=0;i<rels.length;i++) {
|
||
|
|
rels[i].redraw();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function toXML(){
|
||
|
|
var xmlEle=document.createElement("NODE");
|
||
|
|
xmlEle.setAttribute("pkey",m_PKey);
|
||
|
|
xmlEle.setAttribute("offsetleft",m_displayDom.style.left.split("px")[0]);
|
||
|
|
xmlEle.setAttribute("offsettop",m_displayDom.style.top.split("px")[0]);
|
||
|
|
xmlEle.setAttribute("iscollapsed",m_displayDom.isCollapsed());
|
||
|
|
xmlEle.appendChild(m_textControl.toXML());
|
||
|
|
xmlEle.appendChild(m_iconControl.toXML());
|
||
|
|
|
||
|
|
var rels=getNodeRelations();
|
||
|
|
|
||
|
|
for (var i=0;i<rels.length;i++){
|
||
|
|
if (rels[i].getParentNode()==m_displayDom){
|
||
|
|
xmlEle.appendChild(rels[i].toXML());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return(xmlEle);
|
||
|
|
}
|
||
|
|
|
||
|
|
function fromXML(inXML){
|
||
|
|
if (inXML.nodeName=="NODE") {
|
||
|
|
m_PKey=inXML.getAttribute("pkey");
|
||
|
|
m_displayDom.style.left=inXML.getAttribute("offsetleft")+"px";
|
||
|
|
m_displayDom.style.top=inXML.getAttribute("offsettop")+"px";
|
||
|
|
m_isCollapsed=inXML.getAttribute("iscollapsed")=="true";
|
||
|
|
var freeRelations = new Array();
|
||
|
|
for (var i=0;i<inXML.childNodes.length;i++){
|
||
|
|
var theChildNode=inXML.childNodes[i];
|
||
|
|
switch(theChildNode.nodeName){
|
||
|
|
case "ICONS":
|
||
|
|
m_iconControl=new iconControl().fromXML(theChildNode);
|
||
|
|
break;
|
||
|
|
case "TEXTCONTROL":
|
||
|
|
m_textControl=new textControl().fromXML(theChildNode);
|
||
|
|
break;
|
||
|
|
case "NODEREL":
|
||
|
|
construct();
|
||
|
|
// only main relations handled here
|
||
|
|
if (theChildNode.getAttribute("relationtype") == "main") {
|
||
|
|
var newNodeRel=new nodeRel().fromXML(theChildNode);
|
||
|
|
addNodeRelation(newNodeRel);
|
||
|
|
newNodeRel.redraw();
|
||
|
|
}
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return(construct());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|