mirror of
https://bitbucket.org/wisemapping/wisemapping-frontend.git
synced 2024-11-30 01:24:55 +01:00
198 lines
6.1 KiB
JavaScript
198 lines
6.1 KiB
JavaScript
/*
|
|
* Copyright [2015] [wisemapping]
|
|
*
|
|
* Licensed under WiseMapping Public License, Version 1.0 (the "License").
|
|
* It is basically the Apache License, Version 2.0 (the "License") plus the
|
|
* "powered by wisemapping" text requirement on every single page;
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the license at
|
|
*
|
|
* http://www.wisemapping.org/license
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
const ElementPeer = require('./ElementPeer').default
|
|
const Font = require('../../Font').default
|
|
|
|
const TextPeer = new Class({
|
|
Extends: ElementPeer,
|
|
initialize: function () {
|
|
var svgElement = window.document.createElementNS(this.svgNamespace, 'text');
|
|
this.parent(svgElement);
|
|
this._position = {x: 0, y: 0};
|
|
this._font = new Font("Arial", this);
|
|
},
|
|
|
|
append: function (element) {
|
|
this._native.appendChild(element._native);
|
|
},
|
|
|
|
setTextAlignment: function (align) {
|
|
this._textAlign = align;
|
|
},
|
|
|
|
|
|
getTextAlignment: function () {
|
|
return $defined(this._textAlign) ? this._textAlign : 'left';
|
|
},
|
|
|
|
setText: function (text) {
|
|
// Remove all previous nodes ...
|
|
while (this._native.firstChild) {
|
|
this._native.removeChild(this._native.firstChild);
|
|
}
|
|
|
|
this._text = text;
|
|
if (text) {
|
|
var lines = text.split('\n');
|
|
var me = this;
|
|
//FIXME: we could use underscorejs here
|
|
lines.forEach(function (line) {
|
|
var tspan = window.document.createElementNS(me.svgNamespace, 'tspan');
|
|
tspan.setAttribute('dy', '1em');
|
|
tspan.setAttribute('x', me.getPosition().x);
|
|
|
|
tspan.textContent = line.length == 0 ? " " : line;
|
|
me._native.appendChild(tspan);
|
|
});
|
|
}
|
|
},
|
|
|
|
getText: function () {
|
|
return this._text;
|
|
},
|
|
|
|
setPosition: function (x, y) {
|
|
this._position = {x: x, y: y};
|
|
this._native.setAttribute('y', y);
|
|
this._native.setAttribute('x', x);
|
|
|
|
// tspan must be positioned manually.
|
|
$(this._native).children('tspan').attr('x', x);
|
|
},
|
|
|
|
getPosition: function () {
|
|
return this._position;
|
|
},
|
|
|
|
getNativePosition: function() {
|
|
return $(this._native).position();
|
|
},
|
|
|
|
setFont: function (font, size, style, weight) {
|
|
if ($defined(font)) {
|
|
this._font = new Font(font, this);
|
|
}
|
|
if ($defined(style)) {
|
|
this._font.setStyle(style);
|
|
}
|
|
if ($defined(weight)) {
|
|
this._font.setWeight(weight);
|
|
}
|
|
if ($defined(size)) {
|
|
this._font.setSize(size);
|
|
}
|
|
this._updateFontStyle();
|
|
},
|
|
|
|
_updateFontStyle: function () {
|
|
this._native.setAttribute('font-family', this._font.getFontFamily());
|
|
this._native.setAttribute('font-size', this._font.getGraphSize());
|
|
this._native.setAttribute('font-style', this._font.getStyle());
|
|
this._native.setAttribute('font-weight', this._font.getWeight());
|
|
},
|
|
|
|
setColor: function (color) {
|
|
this._native.setAttribute('fill', color);
|
|
},
|
|
|
|
getColor: function () {
|
|
return this._native.getAttribute('fill');
|
|
},
|
|
|
|
setTextSize: function (size) {
|
|
this._font.setSize(size);
|
|
this._updateFontStyle();
|
|
},
|
|
|
|
setContentSize: function (width, height) {
|
|
this._native.xTextSize = width.toFixed(1) + "," + height.toFixed(1);
|
|
},
|
|
|
|
setStyle: function (style) {
|
|
this._font.setStyle(style);
|
|
this._updateFontStyle();
|
|
},
|
|
|
|
setWeight: function (weight) {
|
|
this._font.setWeight(weight);
|
|
this._updateFontStyle();
|
|
},
|
|
|
|
setFontFamily: function (family) {
|
|
var oldFont = this._font;
|
|
this._font = new Font(family, this);
|
|
this._font.setSize(oldFont.getSize());
|
|
this._font.setStyle(oldFont.getStyle());
|
|
this._font.setWeight(oldFont.getWeight());
|
|
this._updateFontStyle();
|
|
},
|
|
|
|
getFont: function () {
|
|
return {
|
|
font: this._font.getFont(),
|
|
size: parseInt(this._font.getSize()),
|
|
style: this._font.getStyle(),
|
|
weight: this._font.getWeight()
|
|
};
|
|
},
|
|
|
|
setSize: function (size) {
|
|
this._font.setSize(size);
|
|
this._updateFontStyle();
|
|
},
|
|
|
|
getWidth: function () {
|
|
var computedWidth;
|
|
// Firefox hack for this issue:http://stackoverflow.com/questions/6390065/doing-ajax-updates-in-svg-breaks-getbbox-is-there-a-workaround
|
|
try {
|
|
|
|
computedWidth = this._native.getBBox().width;
|
|
// Chrome bug is producing this error, oly during page loading. Remove the hack if it works. The issue seems to be
|
|
// caused when the element is hidden. I don't know why, but it works ...
|
|
if (computedWidth == 0) {
|
|
var bbox = this._native.getBBox();
|
|
computedWidth = bbox.width;
|
|
}
|
|
|
|
} catch (e) {
|
|
computedWidth = 10;
|
|
|
|
}
|
|
|
|
var width = parseInt(computedWidth);
|
|
width = width + this._font.getWidthMargin();
|
|
return width;
|
|
},
|
|
|
|
getHeight: function () {
|
|
// Firefox hack for this issue:http://stackoverflow.com/questions/6390065/doing-ajax-updates-in-svg-breaks-getbbox-is-there-a-workaround
|
|
try {
|
|
var computedHeight = this._native.getBBox().height;
|
|
} catch (e) {
|
|
computedHeight = 10;
|
|
}
|
|
return parseInt(computedHeight);
|
|
},
|
|
|
|
getHtmlFontSize: function () {
|
|
return this._font.getHtmlSize();
|
|
}
|
|
});
|
|
|
|
export default TextPeer;
|