view editor.js @ 229:7435367a932a

Allow newlines between binary operator and the right argument to the operator
author Michael Pavone <pavone@retrodev.com>
date Thu, 02 Jan 2014 21:02:11 -0800
parents 15aac5334b64
children
line wrap: on
line source



object.prototype.toHTML = function(node, up) {
	this.up = up;
	var astNode = this;
	var el = newEl('div', {
		className: 'object',
		onclick: function(event) {
			main_module.objectClick(this, astNode, event);
		}
	});
	this.domNode = el;
	node.appendChild(el);
	for (var i in this.messages) {
		this.messages[i].toHTML(el, this);
	}
};

object.prototype.getNext = function(curNode) {
	for (var i = 0; i < this.messages.length-1; i++) {
		if (this.messages[i] == curNode) {
			return this.messages[i+1];
		}
	}
	return this.up.getNext(this);
};

object.prototype.getPrev = function(curNode) {
	for (var i = 1; i < this.messages.length; i++) {
		if (this.messages[i] == curNode) {
			return this.messages[i - 1];
		}
	}
	return this.up.getPrev(this);
};

lambda.prototype.toHTML = function(node, up) {
	this.up = up
	var astNode = this;
	var el = newEl('div', {
		className: 'lambda',
		onclick: function(event) {
			main_module.lambdaClick(this, astNode, event);
		}
	});
	this.domNode = el;
	var args = newEl('div', {
		className: 'args'
	});
	for (var i in this.args) {
		this.args[i].toHTML(args, this);
	}
	var body = newEl('div', {
		className: 'lambdabody'
	});
	for (var i in this.expressions) {
		this.expressions[i].toHTML(body, this);
	}
	el.appendChild(args);
	el.appendChild(body);
	node.appendChild(el);
};

lambda.prototype.getNext = function(curNode) {
	for (var i = 0; i < this.args.length; i++) {
		if (this.args[i] == curNode) {
			if ((i + 1) < this.args.length) {
				return this.args[i+1];
			} else if(this.expressions.length) {
				return this.expressions[0];
			} else {
				break;
			}
		}
	}
	for (var i = 0; i < this.expressions.length-1; i++) {
		if (this.expressions[i] == curNode) {
			return this.expressions[i+1];
		}
	}
	return this.up.getNext(this);
};

lambda.prototype.getPrev = function(curNode) {
	for (var i = 0; i < this.args.length; i++) {
		if (this.args[i] == curNode) {
			if (i > 0) {
				return this.args[i-1];
			} else {
				return this.up.getPrev(this);
			}
		}
	}
	for (var i = 0; i < this.expressions.length; i++) {
		if (this.expressions[i] == curNode) {
			if (i > 0) {
				return this.expressions[i-1];
			} else if(this.args.length) {
				return this.args[this.args.length-1];
			} else {
				break;
			}
		}
	}
	return this.up.getPrev(this);
};

assignment.prototype.toHTML = function(node, up) {
	this.up = up;
	var astNode = this;
	var base = newEl('div', {
		className: 'assignment',
		onclick: function(event) {
			main_module.assignClick(this, astNode, event);
		}
	});
	var varName = newEl('span', {
		textContent: this.symbol.name,
		className: 'varname'
	});
	this.domNode = base;
	base.appendChild(varName);
	node.appendChild(base);
	this.expression.toHTML(base, this);
};

assignment.prototype.getNext = function(curNode) {
	return this.up.getNext(this);
};

assignment.prototype.getPrev = function(curNode) {
	return this;
};

op.prototype.toHTML = function(node, up) {
	this.up = up;
	var astNode = this;
	var base = newEl('span', {
		className: 'op',
		onclick: function(event) {
			main_module.opClick(this, astNode, event);
		}
	});
	this.domNode = base;
	this.left.toHTML(base, this);
	base.appendChild(newEl('span', {
		textContent: this.op,
		className: 'opname'
	}));
	if (this.op == '&&' || this.op == '||') {
		this.right.expressions[0].toHTML(base, this);
	} else {
		this.right.toHTML(base, this);
	}
	node.appendChild(base);
};

op.prototype.getNext = function(curNode) {
	if (this.left == curNode) {
		return this.right;
	}
	return this.up.getNext(this);
};

op.prototype.getPrev = function(curNode) {
	if (this.right == curNode) {
		return this.left;
	}
	return this.up.getPrev(this);
};

intlit.prototype.toHTML = function(node, up) {
	this.up = up;
	var astNode = this;
	this.domNode = newEl('span', {
		className: 'integer',
		textContent: this.val,
		onclick: function(event) {
			main_module.scalarClick(this, astNode, event);
		}
	});
	node.appendChild(this.domNode);
};

floatlit.prototype.toHTML = function(node, up) {
	this.up = up;
	var astNode = this;
	this.domNode = newEl('span', {
		className: 'float',
		textContent: this.val,
		onclick: function(event) {
			main_module.scalarClick(this, astNode, event);
		}
	});
	node.appendChild(this.domNode);
};

strlit.prototype.toHTML = function(node, up) {
	this.up = up;
	var astNode = this;
	this.domNode = newEl('span', {
		className: 'string',
		contentEditable: 'true',
		textContent: this.val,
		onclick: function(event) {
			main_module.scalarClick(this, astNode, event);
		}
	});
	node.appendChild(this.domNode);
};

listlit.prototype.toHTML = function(node, up) {
	this.up = up;
	this.domNode = newEl('span', {
		className: 'listlit',
	});
	for (var i = 0; i < this.val.length; i++) {
		this.val[i].toHTML(this.domNode, this);
	}
	node.appendChild(this.domNode);
};

listlit.prototype.getNext = arraylit.prototype.getNext = function(curNode) {
	for (var i = 0; i < this.val.length; i++) {
		if (this.val[i] == curNode) {
			if ((i + 1) < this.val.length) {
				return this.val[i+1];
			} else {
				break;
			}
		}
	}
	return this.up.getNext(this);
};

listlit.prototype.getPrev = arraylit.prototype.getPrev = function(curNode) {
	for (var i = 0; i < this.val.length; i++) {
		if (this.val[i] == curNode) {
			if (i > 0) {
				return this.val[i-1];
			} else {
				break;
			}
		}
	}
	return this.up.getPrev(this);
};

arraylit.prototype.toHTML = function(node, up) {
	this.up = up;
	this.domNode = newEl('span', {
		className: 'arraylit',
	});
	for (var i = 0; i < this.val.length; i++) {
		this.val[i].toHTML(this.domNode, this);
	}
	node.appendChild(this.domNode);
};

funcall.prototype.toHTML = function(node, up) {
	this.up = up;
	var astNode = this;
	var base = newEl('div', {
		className: 'funcall',
		onclick: function(event) {
			main_module.funClick(this, astNode, event);
		}
	});
	this.domNode = base;
	if (this.receiver) {
		this.receiver.toHTML(base, this);
	}
	var parts = this.name.split(':');
	for (var i in parts ) {
		if(parts[i]) {
			base.appendChild(newEl('span', {
				textContent: parts[i] + (this.receiver && parts.length == 1 ? '' : ':'),
				className: 'funpart'
				}));
			if (this.args[i]) {
				this.args[i].toHTML(base, this);
			}
		}
	}
	for (; i < this.args.length; i++) {
		this.args[i].toHTML(base, this);
	}
	node.appendChild(base);
};

funcall.prototype.getNext = function(curNode) {
	if (this.receiver == curNode && this.args.length) {
		return this.args[0];
	}
	for (var i = 0; i < this.args.length-1; i++) {
		if (this.args[i] == curNode) {
			return this.args[i+1];
		}
	}
	return this.up.getNext(this);
};

funcall.prototype.getPrev = function(curNode) {
	for (var i = 0; i < this.args.length; i++) {
		if (this.args[i] == curNode) {
			if (i > 0) {
				return this.args[i-1];
			} else if (this.receiver) {
				return this.receiver;
			} else {
				break;
			}
		}
	}
	return this.up.getPrev(this);
};

symbol.prototype.toHTML = function(node, up) {
	this.up = up;
	var astNode = this;
	this.domNode = newEl('span', {
		className: 'symbol',
		textContent: this.name,
		onclick: function(event) {
			main_module.symbolClick(this, astNode, event);
		}
	})
	node.appendChild(this.domNode);
}

function getEl(from, idx)
{
	return from[idx];
}

function setEl(to, idx, val)
{
	to[idx] = val;
	return to;
}

function goFullScreen()
{
	var el = q('body');
	if (el.requestFullscreen) {
		el.requestFullscreen();
	} else if (el.mozRequestFullScreen) {
		el.mozRequestFullScreen();
	} else {
		el.webkitRequestFullscreen();
	}
}

function create_symbol(name)
{
	return new symbol(name);
}