mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-08-15 11:01:21 +08:00
237 lines
7.0 KiB
TypeScript
237 lines
7.0 KiB
TypeScript
import spanModule = require("text/span");
|
|
import observable = require("data/observable");
|
|
import observableArray = require("data/observable-array");
|
|
import definition = require("text/formatted-string");
|
|
import view = require("ui/core/view");
|
|
import types = require("utils/types");
|
|
import colorModule = require("color");
|
|
|
|
export module knownCollections {
|
|
export var spans = "spans";
|
|
}
|
|
|
|
var CHILD_SPAN = "Span";
|
|
var CHILD_FORMATTED_TEXT = "formattedText";
|
|
var CHILD_FORMATTED_STRING = "FormattedString";
|
|
|
|
export class FormattedString extends observable.Observable implements definition.FormattedString, view.AddArrayFromBuilder {
|
|
private _spans: observableArray.ObservableArray<spanModule.Span>;
|
|
public _formattedText: any;
|
|
private _isDirty: boolean;
|
|
private _fontFamily: string;
|
|
private _fontSize: number;
|
|
private _foregroundColor: colorModule.Color;
|
|
private _backgroundColor: colorModule.Color;
|
|
private _underline: number;
|
|
private _strikethrough: number;
|
|
private _fontAttributes: number;
|
|
private _parent: view.View;
|
|
|
|
get parent(): view.View {
|
|
return this._parent;
|
|
}
|
|
|
|
set parent(value: view.View) {
|
|
if (this._parent !== value) {
|
|
this._parent = value;
|
|
}
|
|
}
|
|
|
|
get fontFamily(): string {
|
|
return this._fontFamily;
|
|
}
|
|
|
|
set fontFamily(value: string) {
|
|
if (this._fontFamily !== value) {
|
|
this._fontFamily = value;
|
|
}
|
|
}
|
|
|
|
get fontSize(): number {
|
|
return this._fontSize;
|
|
}
|
|
set fontSize(value: number) {
|
|
var fSize: number;
|
|
if (types.isString(value)) {
|
|
fSize = parseInt(<any>value);
|
|
}
|
|
else {
|
|
fSize = value;
|
|
}
|
|
if (this._fontSize !== fSize) {
|
|
this._fontSize = fSize;
|
|
}
|
|
}
|
|
|
|
get foregroundColor(): colorModule.Color {
|
|
return this._foregroundColor;
|
|
}
|
|
set foregroundColor(value: colorModule.Color) {
|
|
var foreColor;
|
|
if (types.isString(value)) {
|
|
foreColor = new colorModule.Color(<any>value);
|
|
}
|
|
else {
|
|
foreColor = value;
|
|
}
|
|
if (this._foregroundColor !== foreColor) {
|
|
this._foregroundColor = foreColor;
|
|
}
|
|
}
|
|
|
|
get backgroundColor(): colorModule.Color {
|
|
return this._backgroundColor;
|
|
}
|
|
set backgroundColor(value: colorModule.Color) {
|
|
var backColor;
|
|
if (types.isString(value)) {
|
|
backColor = new colorModule.Color(<any>value);
|
|
}
|
|
else {
|
|
backColor = value;
|
|
}
|
|
if (this._backgroundColor !== backColor) {
|
|
this._backgroundColor = backColor;
|
|
}
|
|
}
|
|
|
|
get underline(): number {
|
|
return this._underline;
|
|
}
|
|
|
|
set underline(value: number) {
|
|
var underlineIntValue: number;
|
|
if (types.isString(value)) {
|
|
underlineIntValue = parseInt(<any>value);
|
|
}
|
|
else {
|
|
underlineIntValue = value;
|
|
}
|
|
if (this._underline !== underlineIntValue) {
|
|
this._underline = underlineIntValue;
|
|
}
|
|
}
|
|
|
|
get strikethrough(): number {
|
|
return this._strikethrough;
|
|
}
|
|
|
|
set strikethrough(value: number) {
|
|
var strikethroughIntValue: number;
|
|
if (types.isString(value)) {
|
|
strikethroughIntValue = parseInt(<any>value);
|
|
}
|
|
else {
|
|
strikethroughIntValue = value;
|
|
}
|
|
if (this._strikethrough !== strikethroughIntValue) {
|
|
this._strikethrough = strikethroughIntValue;
|
|
}
|
|
}
|
|
|
|
get fontAttributes(): number {
|
|
return this._fontAttributes;
|
|
}
|
|
|
|
set fontAttributes(value: number) {
|
|
if (this._fontAttributes !== value) {
|
|
this._fontAttributes = value;
|
|
}
|
|
}
|
|
|
|
constructor() {
|
|
super();
|
|
this._spans = new observableArray.ObservableArray<spanModule.Span>();
|
|
this._spans.addEventListener(observableArray.ObservableArray.changeEvent, this.onSpansCollectionChanged, this);
|
|
this._isDirty = true;
|
|
}
|
|
|
|
get spans(): observableArray.ObservableArray<spanModule.Span> {
|
|
if (!this._spans) {
|
|
this._spans = new observableArray.ObservableArray<spanModule.Span>();
|
|
}
|
|
return this._spans;
|
|
}
|
|
|
|
private onSpansCollectionChanged(eventData: observableArray.ChangedData<spanModule.Span>) {
|
|
var i;
|
|
if (eventData.addedCount > 0) {
|
|
for (i = 0; i < eventData.addedCount; i++) {
|
|
var addedSpan: spanModule.Span = (<observableArray.ObservableArray<spanModule.Span>>eventData.object).getItem(eventData.index + i);
|
|
addedSpan.parentFormattedString = this;
|
|
addedSpan.addEventListener(observable.Observable.propertyChangeEvent, this.onSpanChanged, this);
|
|
}
|
|
}
|
|
if (eventData.removed && eventData.removed.length > 0) {
|
|
var p;
|
|
for (p = 0; p < eventData.removed.length; p++) {
|
|
var removedSpan = eventData.removed[p];
|
|
removedSpan.removeEventListener(observable.Observable.propertyChangeEvent, this.onSpanChanged, this);
|
|
}
|
|
}
|
|
this.updateFormattedText(true);
|
|
}
|
|
|
|
private onSpanChanged(eventData: observable.PropertyChangeData) {
|
|
this.updateFormattedText(true);
|
|
}
|
|
|
|
private updateFormattedText(isDirty?: boolean) {
|
|
var shouldUpdate = isDirty || this._isDirty;
|
|
if (shouldUpdate) {
|
|
this.createFormattedStringCore();
|
|
this._isDirty = false;
|
|
this.notify(this._createPropertyChangeData("", this));
|
|
}
|
|
}
|
|
|
|
public createFormattedStringCore() {
|
|
// a virtual method overriden in platform specific implementations.
|
|
}
|
|
|
|
public toString(): string {
|
|
var result = "";
|
|
var i;
|
|
for (i = 0; i < this._spans.length; i++) {
|
|
result += this._spans.getItem(i).text;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public _addArrayFromBuilder(name: string, value: Array<any>) {
|
|
var i;
|
|
var span;
|
|
if (name === knownCollections.spans) {
|
|
for (i = 0; i < value.length; i++) {
|
|
span = value[i];
|
|
this.spans.push(span);
|
|
}
|
|
}
|
|
}
|
|
|
|
public updateSpansBindingContext(newBindingContext) {
|
|
var i;
|
|
for (i = 0; i < this.spans.length; i++) {
|
|
var span = this.spans.getItem(i);
|
|
span.bindingContext = newBindingContext;
|
|
}
|
|
}
|
|
|
|
public _addChildFromBuilder(name: string, value: any): void {
|
|
if(name === CHILD_SPAN) {
|
|
this.spans.push(value);
|
|
}
|
|
}
|
|
|
|
public static addFormattedStringToView(view: definition.FormattedStringView, name: string, value: any): void {
|
|
if(name === CHILD_SPAN) {
|
|
if (!view.formattedText) {
|
|
view.formattedText = new FormattedString();
|
|
}
|
|
view.formattedText.spans.push(value);
|
|
}
|
|
else if (name === CHILD_FORMATTED_TEXT || name === CHILD_FORMATTED_STRING) {
|
|
view.formattedText = value;
|
|
}
|
|
}
|
|
} |