initial checkin from subversion
This commit is contained in:
348
node.js
Normal file
348
node.js
Normal file
@@ -0,0 +1,348 @@
|
||||
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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user