forked from Botanical/BotanJS
j for collapsed line ( partial )
This commit is contained in:
parent
2548970f3a
commit
bd35ed56b1
@ -69,7 +69,7 @@
|
|||||||
/** @type {Components.Vim.LineFeeder} */
|
/** @type {Components.Vim.LineFeeder} */
|
||||||
this.feeder = feeder;
|
this.feeder = feeder;
|
||||||
|
|
||||||
this.cols = feeder.lineBuffers[0].cols;
|
this.cols = feeder.firstBuffer.cols;
|
||||||
|
|
||||||
// The preferred X position
|
// The preferred X position
|
||||||
this.pX = 0;
|
this.pX = 0;
|
||||||
@ -136,6 +136,7 @@
|
|||||||
Cursor.prototype.updatePosition = function()
|
Cursor.prototype.updatePosition = function()
|
||||||
{
|
{
|
||||||
this.P = this.X + LineOffset( this.feeder.lineBuffers, this.Y );
|
this.P = this.X + LineOffset( this.feeder.lineBuffers, this.Y );
|
||||||
|
this.feeder.dispatcher.dispatchEvent( new BotanEvent( "VisualUpdate" ) );
|
||||||
};
|
};
|
||||||
|
|
||||||
Cursor.prototype.moveY = function( d )
|
Cursor.prototype.moveY = function( d )
|
||||||
@ -143,16 +144,42 @@
|
|||||||
var Y = this.Y;
|
var Y = this.Y;
|
||||||
|
|
||||||
Y += d;
|
Y += d;
|
||||||
if( Y < 0 ) Y = 0;
|
if( Y < 0 )
|
||||||
|
|
||||||
if( this.feeder.moreAt < Y )
|
|
||||||
{
|
{
|
||||||
this.feeder.pan( undefined, Y - this.feeder.moreAt );
|
Y = 0;
|
||||||
|
}
|
||||||
|
else if( this.feeder.moreAt < Y )
|
||||||
|
{
|
||||||
|
var feeder = this.feeder;
|
||||||
|
var lastLine = feeder.lastBuffer.lineNum;
|
||||||
|
|
||||||
|
var i = 0;
|
||||||
|
while( true )
|
||||||
|
{
|
||||||
|
feeder.pan( undefined, Y - feeder.moreAt + i );
|
||||||
|
|
||||||
|
// If it is the same line we keep scrolling it
|
||||||
|
// until the entire line cosumes the screen
|
||||||
|
if( feeder.lastBuffer.lineNum == lastLine )
|
||||||
|
{
|
||||||
|
i ++;
|
||||||
|
}
|
||||||
|
else break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for( i = 0, line = feeder.firstBuffer;
|
||||||
|
line != feeder.lastBuffer;
|
||||||
|
line = line.next )
|
||||||
|
{
|
||||||
|
if( line.br ) i ++;
|
||||||
|
if( line.lineNum == Y ) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.Y = i;
|
||||||
// Keep original position after panning
|
// Keep original position after panning
|
||||||
this.moveX();
|
this.moveX();
|
||||||
this.updatePosition();
|
this.updatePosition();
|
||||||
this.refresh();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,6 +189,21 @@
|
|||||||
this.updatePosition();
|
this.updatePosition();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Cursor.prototype.getLine = function()
|
||||||
|
{
|
||||||
|
var feeder = this.feeder;
|
||||||
|
var line = feeder.firstBuffer;
|
||||||
|
for( var i = 0;
|
||||||
|
line != feeder.lastBuffer;
|
||||||
|
line = line.next )
|
||||||
|
{
|
||||||
|
if( line.br ) i ++;
|
||||||
|
if( this.Y == i ) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return line;
|
||||||
|
};
|
||||||
|
|
||||||
__readOnly( Cursor.prototype, "position", function()
|
__readOnly( Cursor.prototype, "position", function()
|
||||||
{
|
{
|
||||||
return {
|
return {
|
||||||
@ -170,6 +212,5 @@
|
|||||||
};
|
};
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
|
||||||
ns[ NS_EXPORT ]( EX_CLASS, "Cursor", Cursor );
|
ns[ NS_EXPORT ]( EX_CLASS, "Cursor", Cursor );
|
||||||
})();
|
})();
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
this.next = nextLineBuffer;
|
this.next = nextLineBuffer;
|
||||||
this.br = false;
|
this.br = false;
|
||||||
this.placeholder = true;
|
this.placeholder = true;
|
||||||
|
this.lineNum = 0;
|
||||||
|
|
||||||
if( nextLineBuffer )
|
if( nextLineBuffer )
|
||||||
{
|
{
|
||||||
@ -26,14 +27,15 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
LineBuffer.prototype.Push = function( content, wrap )
|
LineBuffer.prototype.Push = function( content, wrap, n )
|
||||||
{
|
{
|
||||||
|
this.lineNum = n;
|
||||||
if( content == undefined || content === "" )
|
if( content == undefined || content === "" )
|
||||||
{
|
{
|
||||||
this.content = "~";
|
this.content = "~";
|
||||||
this.br = true;
|
this.br = true;
|
||||||
this.placeholder = true;
|
this.placeholder = true;
|
||||||
if( this.next ) this.next.Push( content, wrap );
|
if( this.next ) this.next.Push( content, wrap, n + 1 );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,9 +44,10 @@
|
|||||||
var line = "";
|
var line = "";
|
||||||
var br = false;
|
var br = false;
|
||||||
|
|
||||||
|
var i = 0;
|
||||||
if( wrap )
|
if( wrap )
|
||||||
{
|
{
|
||||||
for( var i = 0; i < this.cols; i ++ )
|
for( ; i < this.cols; i ++ )
|
||||||
{
|
{
|
||||||
var c = content[i];
|
var c = content[i];
|
||||||
if( c === undefined ) break;
|
if( c === undefined ) break;
|
||||||
@ -62,7 +65,7 @@
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
br = true;
|
br = true;
|
||||||
for( var i = 0; true; i ++ )
|
for( ; true; i ++ )
|
||||||
{
|
{
|
||||||
var c = content[i];
|
var c = content[i];
|
||||||
if( c === undefined ) break;
|
if( c === undefined ) break;
|
||||||
@ -83,7 +86,7 @@
|
|||||||
if( this.next )
|
if( this.next )
|
||||||
{
|
{
|
||||||
this.next.br = br;
|
this.next.br = br;
|
||||||
this.next.Push( content.substr( i ), wrap );
|
this.next.Push( content.substr( i ), wrap, br ? n + 1 : n );
|
||||||
}
|
}
|
||||||
|
|
||||||
this.content = line;
|
this.content = line;
|
||||||
@ -106,6 +109,5 @@
|
|||||||
return lines;
|
return lines;
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
|
||||||
ns[ NS_EXPORT ]( EX_CLASS, "LineBuffer", LineBuffer );
|
ns[ NS_EXPORT ]( EX_CLASS, "LineBuffer", LineBuffer );
|
||||||
})();
|
})();
|
||||||
|
@ -21,12 +21,12 @@
|
|||||||
{
|
{
|
||||||
var lineBuffers = [];
|
var lineBuffers = [];
|
||||||
|
|
||||||
// Last line
|
// Last line, hidden buffer that won't be rendered
|
||||||
lineBuffers[ rows - 1 ] = new LineBuffer( cols );
|
this.__xBuffer = lineBuffers[ rows ] = new LineBuffer( cols );
|
||||||
|
|
||||||
for( var i = rows - 2; 0 <= i; i -- )
|
for( var i = rows - 1; 0 <= i; i -- )
|
||||||
{
|
{
|
||||||
lineBuffers[i] = new LineBuffer( cols, lineBuffers[ i + 1 ] );
|
lineBuffers[ i ] = new LineBuffer( cols, lineBuffers[ i + 1 ] );
|
||||||
}
|
}
|
||||||
|
|
||||||
this.lineBuffers = lineBuffers;
|
this.lineBuffers = lineBuffers;
|
||||||
@ -41,19 +41,23 @@
|
|||||||
|
|
||||||
this.__clseLine = null;
|
this.__clseLine = null;
|
||||||
this.__moreAt = -1;
|
this.__moreAt = -1;
|
||||||
|
this.__rows = rows;
|
||||||
|
|
||||||
|
this.__wrap = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
Feeder.prototype.init = function( content, wrap )
|
Feeder.prototype.init = function( content, wrap )
|
||||||
{
|
{
|
||||||
if( wrap == undefined ) wrap = true;
|
this.content = content;
|
||||||
if( this.lineBuffers.length )
|
this.setWrap( wrap );
|
||||||
{
|
|
||||||
this.lineBuffers[0].Push( content, wrap );
|
this.firstBuffer.Push( content, this.__wrap, 0 );
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
Feeder.prototype.wrap = function( setwrap )
|
Feeder.prototype.setWrap = function( wrap )
|
||||||
{
|
{
|
||||||
|
if( wrap == undefined ) return;
|
||||||
|
this.__wrap = wrap;
|
||||||
};
|
};
|
||||||
|
|
||||||
Feeder.prototype.setRender = function( placeholder )
|
Feeder.prototype.setRender = function( placeholder )
|
||||||
@ -96,10 +100,10 @@
|
|||||||
var buffs = this.lineBuffers;
|
var buffs = this.lineBuffers;
|
||||||
|
|
||||||
if( start == undefined ) start = 0;
|
if( start == undefined ) start = 0;
|
||||||
else if( buffs.length < start ) return "";
|
else if( this.__rows < start ) return "";
|
||||||
|
|
||||||
if( length == undefined || ( buffs.length - start ) < length )
|
if( length == undefined || ( this.__rows - start ) < length )
|
||||||
length = buffs.length - start;
|
length = this.rows - start;
|
||||||
|
|
||||||
if( length == 0 ) return "";
|
if( length == 0 ) return "";
|
||||||
|
|
||||||
@ -111,16 +115,40 @@
|
|||||||
if( dX == undefined ) dX = 0;
|
if( dX == undefined ) dX = 0;
|
||||||
if( dY == undefined ) dY = 0;
|
if( dY == undefined ) dY = 0;
|
||||||
|
|
||||||
|
if( dX == 0 && dY == 0 ) return;
|
||||||
|
|
||||||
var X = this.panX + dX;
|
var X = this.panX + dX;
|
||||||
var Y = this.panY + dY;
|
var Y = this.panY + dY;
|
||||||
|
|
||||||
// this.dispatcher.dispatchEvent( new BotanEvent( "VisualUpdate" ) );
|
var f = this.content.indexOf( "\n" );
|
||||||
|
var i = 1;
|
||||||
|
|
||||||
|
while( f != - 1 && i < Y )
|
||||||
|
{
|
||||||
|
i ++;
|
||||||
|
f = this.content.indexOf( "\n", f + 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
this.firstBuffer.Push(
|
||||||
|
this.content.substr( f + 1 )
|
||||||
|
, this.__wrap, i );
|
||||||
|
|
||||||
|
this.panX = X;
|
||||||
|
this.panY = Y;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
__readOnly( Feeder.prototype, "firstBuffer", function() {
|
||||||
|
return this.lineBuffers[ 0 ];
|
||||||
|
} );
|
||||||
|
|
||||||
|
__readOnly( Feeder.prototype, "lastBuffer", function() {
|
||||||
|
return this.lineBuffers[ this.__rows - 1 ];
|
||||||
|
} );
|
||||||
|
|
||||||
__readOnly( Feeder.prototype, "moreAt", function() {
|
__readOnly( Feeder.prototype, "moreAt", function() {
|
||||||
if( 0 < this.__moreAt ) return this.__moreAt;
|
if( 0 < this.__moreAt ) return this.__moreAt;
|
||||||
|
|
||||||
var line = this.lineBuffers[0];
|
var line = this.firstBuffer;
|
||||||
if( line.placeholder ) return 0;
|
if( line.placeholder ) return 0;
|
||||||
|
|
||||||
var i = 0;
|
var i = 0;
|
||||||
@ -136,15 +164,25 @@
|
|||||||
|
|
||||||
__readOnly( Feeder.prototype, "lineStat", function() {
|
__readOnly( Feeder.prototype, "lineStat", function() {
|
||||||
var X = this.cursor.X;
|
var X = this.cursor.X;
|
||||||
return ( this.cursor.Y + this.panY + 1 ) + "," + X + "-" + ( X );
|
return ( this.cursor.getLine().lineNum + 1 ) + "," + X + "-" + ( X );
|
||||||
} );
|
} );
|
||||||
|
|
||||||
__readOnly( Feeder.prototype, "docPos", function() {
|
__readOnly( Feeder.prototype, "docPos", function() {
|
||||||
return "Top";
|
var pos = "ALL";
|
||||||
|
|
||||||
|
if( this.panY == 0 )
|
||||||
|
{
|
||||||
|
if( this.__clseLine || !this.EOF )
|
||||||
|
{
|
||||||
|
pos = "TOP";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pos;
|
||||||
} );
|
} );
|
||||||
|
|
||||||
__readOnly( Feeder.prototype, "linesOccupied", function() {
|
__readOnly( Feeder.prototype, "linesOccupied", function() {
|
||||||
var line = this.lineBuffers[0];
|
var line = this.firstBuffer;
|
||||||
if( line.placeholder ) return 0;
|
if( line.placeholder ) return 0;
|
||||||
|
|
||||||
var i = 0;
|
var i = 0;
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
(function(){ var ns = __namespace( "Components.Vim" );
|
(function(){
|
||||||
|
var ns = __namespace( "Components.Vim" );
|
||||||
|
|
||||||
/** @type {Dandelion} */
|
/** @type {Dandelion} */
|
||||||
var Dand = __import( "Dandelion" );
|
var Dand = __import( "Dandelion" );
|
||||||
|
@ -19,6 +19,8 @@
|
|||||||
/** @type {Components.Vim.StatusBar} */
|
/** @type {Components.Vim.StatusBar} */
|
||||||
var StatusBar = ns[ NS_INVOKE ]( "StatusBar" );
|
var StatusBar = ns[ NS_INVOKE ]( "StatusBar" );
|
||||||
|
|
||||||
|
var mesg = ns[ NS_INVOKE ]( "Message" );
|
||||||
|
|
||||||
var KeyHandler = function( sender, handler )
|
var KeyHandler = function( sender, handler )
|
||||||
{
|
{
|
||||||
return function( e )
|
return function( e )
|
||||||
@ -87,16 +89,6 @@
|
|||||||
case 112: // F1, help
|
case 112: // F1, help
|
||||||
}
|
}
|
||||||
|
|
||||||
var sfeeder = sender.statusFeeder;
|
|
||||||
var statusBar = sender.statusBar;
|
|
||||||
|
|
||||||
sfeeder.init( statusBar.statusText );
|
|
||||||
sender.stage.element.value =
|
|
||||||
cfeeder.render( 0, sender.rows - sfeeder.linesOccupied )
|
|
||||||
+ "\n" + sfeeder.render();
|
|
||||||
|
|
||||||
sender.__blink = false;
|
|
||||||
sender.select( cfeeder.cursor.position );
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/* stage @param {Dandelion.IDOMElement} */
|
/* stage @param {Dandelion.IDOMElement} */
|
||||||
@ -130,8 +122,7 @@
|
|||||||
stage.addEventListener( "Blur", function() { _self.__active = false; } );
|
stage.addEventListener( "Blur", function() { _self.__active = false; } );
|
||||||
|
|
||||||
// Init
|
// Init
|
||||||
this.content = element.value;
|
this.VisualizeVimFrame( element.value );
|
||||||
this.VisualizeVimFrame();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
VimArea.prototype.startInput = function( mode )
|
VimArea.prototype.startInput = function( mode )
|
||||||
@ -150,7 +141,7 @@
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
VimArea.prototype.VisualizeVimFrame = function()
|
VimArea.prototype.VisualizeVimFrame = function( content )
|
||||||
{
|
{
|
||||||
var _self = this;
|
var _self = this;
|
||||||
|
|
||||||
@ -161,7 +152,7 @@
|
|||||||
// Content feeder
|
// Content feeder
|
||||||
var cfeeder = new LineFeeder( r, c );
|
var cfeeder = new LineFeeder( r, c );
|
||||||
|
|
||||||
cfeeder.init( this.content );
|
cfeeder.init( content );
|
||||||
|
|
||||||
// Status feeder
|
// Status feeder
|
||||||
sfeeder = new LineFeeder( r, c );
|
sfeeder = new LineFeeder( r, c );
|
||||||
@ -174,18 +165,25 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
statusBar.stamp( -3, function(){
|
statusBar.stamp( -3, function(){
|
||||||
return cfeeder.docPos;
|
return mesg( cfeeder.docPos );
|
||||||
} );
|
} );
|
||||||
|
|
||||||
sfeeder.init( statusBar.statusText );
|
sfeeder.init( statusBar.statusText );
|
||||||
|
|
||||||
element.value =
|
var Update = function()
|
||||||
cfeeder.render( 0, r - sfeeder.linesOccupied )
|
|
||||||
+ "\n" + sfeeder.render();
|
|
||||||
|
|
||||||
cfeeder.dispatcher.addEventListener( "VisualUpdate", function()
|
|
||||||
{
|
{
|
||||||
} );
|
sfeeder.init( statusBar.statusText );
|
||||||
|
|
||||||
|
element.value =
|
||||||
|
cfeeder.render( 0, r - sfeeder.linesOccupied )
|
||||||
|
+ "\n" + sfeeder.render();
|
||||||
|
|
||||||
|
_self.__blink = false;
|
||||||
|
_self.select( cfeeder.cursor.position );
|
||||||
|
};
|
||||||
|
|
||||||
|
cfeeder.dispatcher.addEventListener( "VisualUpdate", Update );
|
||||||
|
Update();
|
||||||
|
|
||||||
this.contentFeeder = cfeeder;
|
this.contentFeeder = cfeeder;
|
||||||
this.statusFeeder = sfeeder;
|
this.statusFeeder = sfeeder;
|
||||||
@ -204,5 +202,9 @@
|
|||||||
}, 600 );
|
}, 600 );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
__readOnly( VimArea.prototype, "content", function() {
|
||||||
|
return this.contentFeeder.content;
|
||||||
|
} );
|
||||||
|
|
||||||
ns[ NS_EXPORT ]( EX_CLASS, "VimArea", VimArea );
|
ns[ NS_EXPORT ]( EX_CLASS, "VimArea", VimArea );
|
||||||
})();
|
})();
|
||||||
|
@ -30,15 +30,29 @@
|
|||||||
"E486": "E486: Pattern not found: %1"
|
"E486": "E486: Pattern not found: %1"
|
||||||
};
|
};
|
||||||
|
|
||||||
var Message = function( key )
|
var GetString = function( arr, key, restArgs )
|
||||||
{
|
{
|
||||||
var restArgs = Array.prototype.slice.apply( arguments, 1 );
|
if( arr[ key ] == undefined ) return key;
|
||||||
|
|
||||||
var i = 0;
|
var i = 0;
|
||||||
return messages[ key ].replace( /%\d+/g, function( e )
|
return arr[ key ].replace( /%\d+/g, function( e )
|
||||||
{
|
{
|
||||||
return restArgs[ i ++ ];
|
return restArgs[ i ++ ];
|
||||||
} );
|
} );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var Message = function( key )
|
||||||
|
{
|
||||||
|
var restArgs = Array.prototype.slice.call( arguments, 1 );
|
||||||
|
return GetString( messages, key, restArgs );
|
||||||
|
};
|
||||||
|
|
||||||
|
var Error = function( key )
|
||||||
|
{
|
||||||
|
var restArgs = Array.prototype.slice.call( arguments, 1 );
|
||||||
|
return GetString( errors, key, restArgs );
|
||||||
|
};
|
||||||
|
|
||||||
ns[ NS_EXPORT ]( EX_FUNC, "Message", Message );
|
ns[ NS_EXPORT ]( EX_FUNC, "Message", Message );
|
||||||
|
ns[ NS_EXPORT ]( EX_FUNC, "Error", Error );
|
||||||
})();
|
})();
|
||||||
|
Loading…
Reference in New Issue
Block a user