penguin/AstroJS

Javascript framework for my blog

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

raw ยท 1420 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 )
	{
		var cur = this.__cursor;
		var feeder = cur.feeder;
		var startPos = this.__startPosition;

		if( insertLength < 0 )
		{
			startPos += insertLength;
			insertLength = 0;
		}

		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;
			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
			, 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 );
})();