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

69 lines
1.4 KiB
JavaScript

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