blob: 54f92ec3f260065aa18fc1a520145a5628b48bfb [file] [log] [blame]
/**
* Add string values to the virtual corpus
*/
"use strict";
define(['util'], {
/**
* Create new string value helper.
*/
create : function () {
const a = arguments;
let regexOp = true,
regex = false,
value = '';
// Set value
if (a.length >= 1) {
if (a[0] !== undefined)
value = a[0];
};
// Set regex
if (a.length >= 2) {
if (a[1] !== undefined)
regex = a[1];
};
// Set regexOp
if (a.length >= 3) {
regexOp = a[2];
if (regexOp === false) {
regex = false;
}
};
return Object.create(this)._init(value, regex, regexOp);
},
// Initialize the string value
_init : function (value, regex, regexOp) {
this.value(value);
this.regex(regex);
this._regexOp(regexOp);
return this;
},
/**
* Get or set the regex boolean value.
*
* @param bool Either true or false
*/
regex : function (bool) {
if (arguments.length === 1) {
this._regex = bool ? true : false;
this._update();
};
return this._regex;
},
_regexOp : function (regexOp) {
if (arguments.length === 1) {
this.__regexOp = regexOp ? true : false;
this._update();
};
return this.__regexOp;
},
/**
* Toggle the regex, make it either true,
* if it is false, or make it false, if it is true.
*/
toggleRegex : function () {
this.regex(this._regex === false ? true : false);
},
/**
* Get or set the string value.
*/
value : function (val) {
if (arguments.length === 1) {
this._value = val;
// this._input.value = val;
this._update();
};
return this._value;
},
// Update dom element
_update : function () {
if (this._el === undefined)
return;
this._value = this._input.value;
const cl = this._el.classList;
if (this._regexOp() && this._regex) {
cl.add('regex');
}
else {
cl.remove('regex');
};
},
/**
* Store the string value.
* This method should be overwritten.
* The method receives the value and the regex.
*/
store : function (v,r) {},
/**
* Put focus on element
*/
focus : function () {
this._el.children[0].focus();
},
/**
* Get the associated dom element.
*/
element : function () {
if (this._el !== undefined)
return this._el;
// Create element
const e = this._el = document.createElement('div');
e.setAttribute('tabindex', 0);
e.style.outline = 0;
const cl = e.classList;
cl.add('value');
if (this.regex() === true)
cl.add('regex');
// Add input field
this._input = e.addE('input');
if (this.value() !== undefined) {
this._input.value = this.value();
};
// Add regex button
if (this._regexOp()) {
const re = e.addE('div');
re.addEventListener(
'click',
function () {
this.toggleRegex();
// ev.halt();
}.bind(this),
true
);
re.addT('RE');
};
// If the focus is not on the text field anymore,
// delegate focus to
this._input.addEventListener(
'blur',
function () {
const t = this;
if (!t._inField) {
t.value(t._input.value);
t.store(t.value(), t.regex());
};
ev.halt();
}.bind(this)
);
// Workaround to check the click is in the field
e.addEventListener(
'mousedown',
function () {
this._inField = true;
}.bind(this)
);
e.addEventListener(
'mouseup',
function () {
this._inField = false;
this._input.focus();
}.bind(this)
);
this._input.addEventListener(
'keypress',
function (ev) {
const t = this;
if (ev.keyCode == 13) {
t.value(t._input.value);
t.store(t.value(), t.regex());
return false;
};
}.bind(this)
);
// Add store button
/*
e.appendChild(
document.createElement('div')
).addEventListener('click', function () {
this.store(this.value(), this.regex());
}.bind(this));
*/
return e;
}
});