penguin/AstroJS

Javascript framework for my blog

botanjs/src/Components/Vim/State/Stator.js

raw ยท 1444 bytes

(function(){
	var ns = __namespace( "Components.Vim.State" );

	var Stator = function( cur, start )
	{
		this.__cursor = cur;
		this.__startPosition = start == undefined ? cur.aPos : start;
		this.__startState = this.__saveCur();
	};

	Stator.prototype.save = function( insertLength, contentUndo, removeLen )
	{
		if( removeLen == undefined ) removeLen = 0;
		var cur = this.__cursor;
		var feeder = cur.feeder;
		var startPos = this.__startPosition - removeLen;

		var sSt = this.__startState;
		var eSt = this.__saveCur();

		var st = sSt;
		// Calling this repeatedly will swap between UNDO / REDO state
		return function() {
			var contentRedo = feeder.content.substr( startPos, insertLength );
			feeder.content =
				feeder.content.substring( 0, startPos )
				+ contentUndo
				+ feeder.content.substring( startPos + insertLength );
			insertLength = contentUndo.length;
			contentUndo = contentRedo;

			cur.PStart = st.p;
			cur.PEnd = st.p + 1;
			cur.X = st.x;
			cur.Y = st.y;
			cur.pX = st.cpX - 1;
			feeder.panX = st.px;
			feeder.panY = st.py;

			feeder.pan();

			st = ( st == sSt ) ? eSt : sSt;
		};
	};

	Stator.prototype.__saveCur = function()
	{
		var c = this.__cursor;
		var obj = {
			p: c.PStart
			, x: c.X
			, y: c.Y
			, cpX: c.pX
			, px: c.feeder.panX
			, py: c.feeder.panY
		};

		if( 0 < obj.x )
		{
			obj.p -= 1;
			obj.x -= 1;
		}

		return obj;
	};

	ns[ NS_EXPORT ]( EX_CLASS, "Stator", Stator );
})();