2014-10-22 05:12:44 +00:00
|
|
|
/* jslint node: true */
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
var View = require('./view.js').View;
|
|
|
|
var miscUtil = require('./misc_util.js');
|
|
|
|
var strUtil = require('./string_util.js');
|
|
|
|
var ansi = require('./ansi_term.js');
|
2015-04-27 02:46:16 +00:00
|
|
|
|
2014-10-22 05:12:44 +00:00
|
|
|
var util = require('util');
|
2015-04-27 02:46:16 +00:00
|
|
|
var _ = require('lodash');
|
2014-10-22 05:12:44 +00:00
|
|
|
|
|
|
|
exports.TextView = TextView;
|
|
|
|
|
2015-04-09 04:54:13 +00:00
|
|
|
function TextView(options) {
|
2015-05-11 22:39:28 +00:00
|
|
|
if(options.dimens) {
|
|
|
|
options.dimens.height = 1; // force height of 1 for TextView's & sub classes
|
|
|
|
}
|
|
|
|
|
2015-04-09 04:54:13 +00:00
|
|
|
View.call(this, options);
|
2014-10-22 05:12:44 +00:00
|
|
|
|
2015-04-08 05:15:34 +00:00
|
|
|
var self = this;
|
|
|
|
|
2015-04-09 04:54:13 +00:00
|
|
|
if(options.maxLength) {
|
|
|
|
this.maxLength = options.maxLength;
|
2015-04-27 02:46:16 +00:00
|
|
|
} else {
|
2015-06-29 04:31:12 +00:00
|
|
|
this.maxLength = this.client.term.termWidth - this.position.col;
|
2014-10-22 05:12:44 +00:00
|
|
|
}
|
|
|
|
|
2015-04-27 02:46:16 +00:00
|
|
|
this.fillChar = miscUtil.valueWithDefault(options.fillChar, ' ').substr(0, 1);
|
|
|
|
this.justify = options.justify || 'right';
|
|
|
|
this.resizable = miscUtil.valueWithDefault(options.resizable, true);
|
|
|
|
this.horizScroll = miscUtil.valueWithDefault(options.horizScroll, true);
|
2015-05-08 04:13:12 +00:00
|
|
|
|
|
|
|
if(_.isString(options.textOverflow)) {
|
|
|
|
this.textOverflow = options.textOverflow;
|
|
|
|
}
|
2014-11-02 19:07:17 +00:00
|
|
|
|
2015-04-27 02:46:16 +00:00
|
|
|
if(_.isString(options.textMaskChar) && 1 === options.textMaskChar.length) {
|
|
|
|
this.textMaskChar = options.textMaskChar;
|
2014-10-22 05:12:44 +00:00
|
|
|
}
|
2015-04-27 02:46:16 +00:00
|
|
|
|
2015-04-06 06:18:08 +00:00
|
|
|
this.drawText = function(s) {
|
|
|
|
|
2015-04-27 02:46:16 +00:00
|
|
|
//
|
2015-04-27 03:57:23 +00:00
|
|
|
// |<- this.maxLength
|
2015-04-27 02:46:16 +00:00
|
|
|
// ABCDEFGHIJK
|
2015-04-27 03:57:23 +00:00
|
|
|
// |ABCDEFG| ^_ this.text.length
|
|
|
|
// ^-- this.dimens.width
|
2015-04-27 02:46:16 +00:00
|
|
|
//
|
|
|
|
var textToDraw = _.isString(this.textMaskChar) ?
|
|
|
|
new Array(s.length + 1).join(this.textMaskChar) :
|
|
|
|
strUtil.stylizeString(s, this.hasFocus ? this.focusTextStyle : this.textStyle);
|
2016-07-16 19:06:03 +00:00
|
|
|
|
|
|
|
// :TODO: Add pipe code support
|
2015-04-27 02:46:16 +00:00
|
|
|
|
|
|
|
if(textToDraw.length > this.dimens.width) {
|
|
|
|
// XXXXXXXXXXXXXXXXX
|
|
|
|
// this is the text but too long
|
|
|
|
// text but too long
|
2015-05-08 04:13:12 +00:00
|
|
|
if(this.hasFocus) {
|
|
|
|
if(this.horizScroll) {
|
|
|
|
textToDraw = textToDraw.substr(textToDraw.length - this.dimens.width, textToDraw.length);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if(textToDraw.length > this.dimens.width) {
|
|
|
|
if(this.textOverflow &&
|
|
|
|
this.dimens.width > this.textOverflow.length &&
|
|
|
|
textToDraw.length - this.textOverflow.length >= this.textOverflow.length)
|
|
|
|
{
|
|
|
|
textToDraw = textToDraw.substr(0, this.dimens.width - this.textOverflow.length) + this.textOverflow;
|
|
|
|
} else {
|
|
|
|
textToDraw = textToDraw.substr(0, this.dimens.width);
|
|
|
|
}
|
|
|
|
}
|
2015-04-27 02:46:16 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-04-29 21:38:20 +00:00
|
|
|
this.client.term.write(strUtil.pad(
|
|
|
|
textToDraw,
|
|
|
|
this.dimens.width + 1,
|
|
|
|
this.fillChar,
|
|
|
|
this.justify,
|
|
|
|
this.hasFocus ? this.getFocusSGR() : this.getSGR(),
|
2015-05-15 05:01:00 +00:00
|
|
|
this.getStyleSGR(1) || this.getSGR()
|
2015-07-06 01:05:55 +00:00
|
|
|
), false);
|
2015-04-06 06:18:08 +00:00
|
|
|
};
|
|
|
|
|
2015-05-18 17:31:35 +00:00
|
|
|
this.getEndOfTextColumn = function() {
|
2015-05-16 20:39:14 +00:00
|
|
|
var offset = Math.min(this.text.length, this.dimens.width);
|
2015-05-18 17:31:35 +00:00
|
|
|
return this.position.col + offset;
|
2015-05-16 20:39:14 +00:00
|
|
|
};
|
|
|
|
|
2015-12-24 18:54:03 +00:00
|
|
|
// :TODO: Whatever needs init here should be done separately from setText() since it redraws/etc.
|
2015-04-09 04:54:13 +00:00
|
|
|
this.setText(options.text || '');
|
2014-10-22 05:12:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
util.inherits(TextView, View);
|
|
|
|
|
|
|
|
TextView.prototype.redraw = function() {
|
|
|
|
TextView.super_.prototype.redraw.call(this);
|
|
|
|
|
2015-12-24 18:54:03 +00:00
|
|
|
if(_.isString(this.text)) {
|
|
|
|
this.drawText(this.text);
|
|
|
|
}
|
2014-10-22 05:12:44 +00:00
|
|
|
};
|
|
|
|
|
2014-10-23 05:41:00 +00:00
|
|
|
TextView.prototype.setFocus = function(focused) {
|
|
|
|
TextView.super_.prototype.setFocus.call(this, focused);
|
|
|
|
|
|
|
|
this.redraw();
|
2015-05-16 20:39:14 +00:00
|
|
|
|
2015-05-18 17:31:35 +00:00
|
|
|
this.client.term.write(ansi.goto(this.position.row, this.getEndOfTextColumn()));
|
2015-04-29 21:38:20 +00:00
|
|
|
this.client.term.write(this.getFocusSGR());
|
2014-10-23 05:41:00 +00:00
|
|
|
};
|
|
|
|
|
2015-04-17 04:29:53 +00:00
|
|
|
TextView.prototype.getData = function() {
|
2015-03-31 03:29:06 +00:00
|
|
|
return this.text;
|
|
|
|
};
|
|
|
|
|
2014-10-22 05:12:44 +00:00
|
|
|
TextView.prototype.setText = function(text) {
|
2016-07-16 19:06:03 +00:00
|
|
|
if(!_.isString(text)) {
|
|
|
|
text = text.toString();
|
|
|
|
}
|
|
|
|
|
2015-04-12 05:48:41 +00:00
|
|
|
var widthDelta = 0;
|
|
|
|
if(this.text && this.text !== text) {
|
|
|
|
widthDelta = Math.abs(this.text.length - text.length);
|
|
|
|
}
|
|
|
|
|
2014-10-22 05:12:44 +00:00
|
|
|
this.text = text;
|
|
|
|
|
|
|
|
if(this.maxLength > 0) {
|
|
|
|
this.text = this.text.substr(0, this.maxLength);
|
|
|
|
}
|
|
|
|
|
2015-04-06 06:18:08 +00:00
|
|
|
this.text = strUtil.stylizeString(this.text, this.hasFocus ? this.focusTextStyle : this.textStyle);
|
2014-10-22 05:12:44 +00:00
|
|
|
|
2015-09-03 05:11:17 +00:00
|
|
|
/*
|
2015-04-27 02:46:16 +00:00
|
|
|
if(this.resizable) {
|
|
|
|
this.dimens.width = this.text.length + widthDelta;
|
2014-10-22 05:12:44 +00:00
|
|
|
}
|
2015-09-03 05:11:17 +00:00
|
|
|
*/
|
|
|
|
if(this.autoScale.width) {
|
|
|
|
this.dimens.width = this.text.length + widthDelta;
|
|
|
|
}
|
2014-11-04 05:53:01 +00:00
|
|
|
|
|
|
|
this.redraw();
|
2014-10-22 05:12:44 +00:00
|
|
|
};
|
2015-04-06 06:18:08 +00:00
|
|
|
|
|
|
|
TextView.prototype.clearText = function() {
|
|
|
|
this.setText('');
|
|
|
|
};
|
2015-06-30 05:14:17 +00:00
|
|
|
|
|
|
|
TextView.prototype.setPropertyValue = function(propName, value) {
|
|
|
|
switch(propName) {
|
2016-07-16 19:06:03 +00:00
|
|
|
case 'textMaskChar' : this.textMaskChar = value.substr(0, 1); break;
|
|
|
|
case 'textOverflow' : this.textOverflow = value; break;
|
|
|
|
case 'maxLength' : this.maxLength = parseInt(value, 10); break;
|
|
|
|
case 'password' :
|
|
|
|
if(true === value) {
|
|
|
|
this.textMaskChar = this.client.currentTheme.helpers.getPasswordChar();
|
|
|
|
}
|
|
|
|
break;
|
2015-06-30 05:14:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
TextView.super_.prototype.setPropertyValue.call(this, propName, value);
|
2015-07-22 05:52:20 +00:00
|
|
|
};
|