openfl
Version:
A fast, productive library for 2D cross-platform development.
263 lines (246 loc) • 10.7 kB
JavaScript
// Class: openfl.display._internal.DOMTextField
var $global = typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : this
$global.Object.defineProperty(exports, "__esModule", {value: true});
var __map_reserved = {};
// Imports
var $hxClasses = require("./../../../hxClasses_stub").default;
var $hxEnums = require("./../../../hxEnums_stub").default;
var $import = require("./../../../import_stub").default;
function EReg() {return require("./../../../EReg");}
function openfl_display__$internal_DOMDisplayObject() {return require("./../../../openfl/display/_internal/DOMDisplayObject");}
function openfl_text__$internal_TextEngine() {return require("./../../../openfl/text/_internal/TextEngine");}
function Std() {return require("./../../../Std");}
function openfl_events_TextEvent() {return require("./../../../openfl/events/TextEvent");}
function StringTools() {return require("./../../../StringTools");}
function openfl_text__$internal_HTMLParser() {return require("./../../../openfl/text/_internal/HTMLParser");}
function openfl__$Vector_VectorIterator() {return require("./../../../openfl/_Vector/VectorIterator");}
function openfl_display__$internal_DOMBitmap() {return require("./../../../openfl/display/_internal/DOMBitmap");}
// Constructor
var DOMTextField = function(){}
// Meta
DOMTextField.__name__ = "openfl.display._internal.DOMTextField";
DOMTextField.__isInterface__ = false;
DOMTextField.prototype = {
};
DOMTextField.prototype.__class__ = DOMTextField.prototype.constructor = $hxClasses["openfl.display._internal.DOMTextField"] = DOMTextField;
// Init
// Statics
DOMTextField.clear = function(textField,renderer) {
(openfl_display__$internal_DOMDisplayObject().default).clear(textField,renderer);
if(textField.__div != null) {
renderer.element.removeChild(textField.__div);
textField.__div = null;
textField.__style = null;
}
}
DOMTextField.measureText = function(textField) {
var textEngine = textField.__textEngine;
var div = textField.__div;
if(div == null) {
div = window.document.createElement("div");
div.innerHTML = new (EReg().default)("\n","g").replace(textEngine.text,"<br>");
div.style.setProperty("font",(openfl_text__$internal_TextEngine().default).getFont(textField.__textFormat),null);
div.style.setProperty("pointer-events","none",null);
div.style.position = "absolute";
div.style.top = "110%";
window.document.body.appendChild(div);
}
textEngine.__measuredWidth = div.clientWidth;
if(textField.__div == null) {
div.style.width = (Std().default).string(textEngine.width - 4) + "px";
}
textEngine.__measuredHeight = div.clientHeight;
if(textField.__div == null) {
window.document.body.removeChild(div);
}
}
DOMTextField.render = function(textField,renderer) {
var textEngine = textField.__textEngine;
if(textField.stage != null && textField.__worldVisible && textField.__renderable) {
if(textField.__dirty || textField.__renderTransformChanged || textField.__div == null) {
if(textEngine.text != "" || textEngine.background || textEngine.border || textEngine.type == "input") {
textField.__updateLayout();
if(textField.__div == null) {
textField.__div = window.document.createElement("div");
renderer.__initializeElement(textField,textField.__div);
textField.__style.setProperty("outline","none",null);
textField.__div.addEventListener("input",function(event) {
event.preventDefault();
if(textField.get_htmlText() != textField.__div.innerHTML) {
textField.set_htmlText(textField.__div.innerHTML);
var textField1 = textField.__displayAsPassword;
textField.__dirty = false;
var tmp = textField.get_htmlText();
textField.dispatchEvent(new (openfl_events_TextEvent().default)("textInput",false,false,tmp));
}
},true);
}
if(!textEngine.wordWrap) {
textField.__style.setProperty("white-space","nowrap",null);
} else {
textField.__style.setProperty("word-wrap","break-word",null);
}
textField.__style.setProperty("overflow","hidden",null);
if(textEngine.selectable) {
textField.__style.setProperty("cursor","text",null);
textField.__style.setProperty("-webkit-user-select","text",null);
textField.__style.setProperty("-moz-user-select","text",null);
textField.__style.setProperty("-ms-user-select","text",null);
textField.__style.setProperty("-o-user-select","text",null);
} else {
textField.__style.setProperty("cursor","inherit",null);
}
var div = textField.__div;
div.contentEditable = textEngine.type == "input";
var style = textField.__style;
if(textEngine.background) {
style.setProperty("background-color","#" + (StringTools().default).hex(textEngine.backgroundColor & 16777215,6),null);
} else {
style.removeProperty("background-color");
}
var w = textEngine.width;
var h = textEngine.height;
var scale = 1;
var text = "";
if(textField.__isHTML) {
var tmp1 = (openfl_text__$internal_HTMLParser().default).parse(textField.__text,textField.get_multiline(),textField.__styleSheet,textField.__textFormat,textField.__textEngine.textFormatRanges);
textField.__updateText(tmp1);
}
var useTextBounds = !(textEngine.background || textEngine.border);
var bounds = useTextBounds ? textEngine.textBounds : textEngine.bounds;
var scrollX = -textField.get_scrollH();
var scrollY = 0.0;
var group = new (openfl__$Vector_VectorIterator().default)(textEngine.layoutGroups);
while(group.hasNext()) {
var group1 = group.next();
if(group1.lineIndex < textField.get_scrollV() - 1) {
continue;
}
if(group1.lineIndex > textEngine.get_bottomScrollV() - 1) {
break;
}
text += "<div style=\"";
if(group1.format.font != null) {
text += "font: " + (openfl_text__$internal_TextEngine().default).getFont(group1.format) + "; ";
}
if(group1.format.color != null) {
text += "color: #" + (StringTools().default).hex(group1.format.color & 16777215,6) + "; ";
}
if(group1.format.underline == true) {
text += "text-decoration: underline; ";
}
if(group1.format.align != null) {
switch(group1.format.align) {
case "center":
text += "text-align: center; ";
break;
case "justify":
text += "text-align: justify; ";
break;
case "right":
text += "text-align: right; ";
break;
default:
text += "text-align: left; ";
}
}
if(group1.format.leftMargin != null) {
text += "padding-left: " + group1.format.leftMargin * scale + "px; ";
}
if(group1.format.rightMargin != null) {
text += "padding-right: " + group1.format.rightMargin * scale + "px; ";
}
if(group1.format.indent != null) {
text += "text-indent: " + group1.format.indent * scale + "px; ";
}
var tmp2 = group1.format.leading != null;
var x = group1.offsetX + scrollX;
var y = group1.offsetY + scrollY + 3;
text += "left: " + x + "px; top: " + y + "px; vertical-align: top; position: absolute;\">";
if(group1.format.url != null && group1.format.url != "") {
var anchorStyle = "text-decoration: underline; ";
if(group1.format.color != null) {
anchorStyle += "color: #" + (StringTools().default).hex(group1.format.color & 16777215,6) + "; ";
}
text += "<a style='" + anchorStyle + "' href='" + group1.format.url + "' target='" + group1.format.target + "'>";
}
if(!textField.__isHTML) {
text += (StringTools().default).replace((StringTools().default).htmlEscape(textEngine.text.substring(group1.startIndex,group1.endIndex))," "," ");
} else {
text += (StringTools().default).replace(textEngine.text.substring(group1.startIndex,group1.endIndex)," "," ");
}
if(group1.format.url != null && group1.format.url != "") {
text += "</a>";
}
text += "</div>";
}
if(textEngine.border) {
style.setProperty("border","solid 1px #" + (StringTools().default).hex(textEngine.borderColor & 16777215,6),null);
textField.__renderTransform.translate(-1,-1);
textField.__renderTransformChanged = true;
textField.__transformDirty = true;
} else if(style.border != "") {
style.removeProperty("border");
textField.__renderTransformChanged = true;
}
style.setProperty("width",w + "px",null);
style.setProperty("height",h + "px",null);
textField.__div.innerHTML = text;
textField.__dirty = false;
} else if(textField.__div != null) {
renderer.element.removeChild(textField.__div);
textField.__div = null;
}
}
if(textField.__div != null) {
var old = renderer.__roundPixels;
renderer.__roundPixels = true;
renderer.__updateClip(textField);
renderer.__applyStyle(textField,true,true,true);
renderer.__roundPixels = old;
}
} else {
DOMTextField.clear(textField,renderer);
}
}
DOMTextField.renderDrawable = function(textField,renderer) {
textField.__domRender = true;
renderer.__updateCacheBitmap(textField,textField.__forceCachedBitmapUpdate);
textField.__forceCachedBitmapUpdate = false;
textField.__domRender = false;
if(textField.__cacheBitmap != null && !textField.__isCacheBitmapRender) {
renderer.__renderDrawableClear(textField);
textField.__cacheBitmap.stage = textField.stage;
(openfl_display__$internal_DOMBitmap().default).render(textField.__cacheBitmap,renderer);
} else {
if(textField.__renderedOnCanvasWhileOnDOM) {
textField.__renderedOnCanvasWhileOnDOM = false;
if(textField.__isHTML && textField.__htmlText != null) {
textField.__updateText(textField.__htmlText);
textField.__dirty = true;
textField.__layoutDirty = true;
textField.__setRenderDirty();
}
}
DOMTextField.render(textField,renderer);
}
renderer.__renderEvent(textField);
}
DOMTextField.renderDrawableClear = function(textField,renderer) {
DOMTextField.clear(textField,renderer);
}
DOMTextField.__getAttributeMatch = function(regex) {
if(regex.matched(2) != null) {
return regex.matched(2);
} else {
return regex.matched(3);
}
}
DOMTextField.__meta__ = { obj : { SuppressWarnings : ["checkstyle:FieldDocComment"]}}
DOMTextField.__regexColor = new (EReg().default)("color=(\"#([^\"]+)\"|'#([^']+)')","i")
DOMTextField.__regexFace = new (EReg().default)("face=(\"([^\"]+)\"|'([^']+)')","i")
DOMTextField.__regexFont = new (EReg().default)("<font ([^>]+)>","gi")
DOMTextField.__regexCloseFont = new (EReg().default)("</font>","gi")
DOMTextField.__regexSize = new (EReg().default)("size=(\"([^\"]+)\"|'([^']+)')","i")
// Export
exports.default = DOMTextField;