You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
2.8 KiB
107 lines
2.8 KiB
/** |
|
* Wrapper for VML element. |
|
* @constructor |
|
* @extends jvm.AbstractElement |
|
* @param {String} name Tag name of the element |
|
* @param {Object} config Set of parameters to initialize element with |
|
*/ |
|
|
|
jvm.VMLElement = function(name, config){ |
|
if (!jvm.VMLElement.VMLInitialized) { |
|
jvm.VMLElement.initializeVML(); |
|
} |
|
|
|
jvm.VMLElement.parentClass.apply(this, arguments); |
|
}; |
|
|
|
jvm.inherits(jvm.VMLElement, jvm.AbstractElement); |
|
|
|
/** |
|
* Shows if VML was already initialized for the current document or not. |
|
* @static |
|
* @private |
|
* @type {Boolean} |
|
*/ |
|
jvm.VMLElement.VMLInitialized = false; |
|
|
|
/** |
|
* Initializes VML handling before creating the first element |
|
* (adds CSS class and creates namespace). Adds one of two forms |
|
* of createElement method depending of support by browser. |
|
* @static |
|
* @private |
|
*/ |
|
|
|
// The following method of VML handling is borrowed from the |
|
// Raphael library by Dmitry Baranovsky. |
|
|
|
jvm.VMLElement.initializeVML = function(){ |
|
try { |
|
if (!document.namespaces.rvml) { |
|
document.namespaces.add("rvml","urn:schemas-microsoft-com:vml"); |
|
} |
|
/** |
|
* Creates DOM element. |
|
* @param {String} tagName Name of element |
|
* @private |
|
* @returns DOMElement |
|
*/ |
|
jvm.VMLElement.prototype.createElement = function (tagName) { |
|
return document.createElement('<rvml:' + tagName + ' class="rvml">'); |
|
}; |
|
} catch (e) { |
|
/** |
|
* @private |
|
*/ |
|
jvm.VMLElement.prototype.createElement = function (tagName) { |
|
return document.createElement('<' + tagName + ' xmlns="urn:schemas-microsoft.com:vml" class="rvml">'); |
|
}; |
|
} |
|
document.createStyleSheet().addRule(".rvml", "behavior:url(#default#VML)"); |
|
jvm.VMLElement.VMLInitialized = true; |
|
}; |
|
|
|
/** |
|
* Returns constructor for element by name prefixed with 'VML'. |
|
* @param {String} ctr Name of basic constructor to return |
|
* proper implementation for. |
|
* @returns Function |
|
* @private |
|
*/ |
|
jvm.VMLElement.prototype.getElementCtr = function( ctr ){ |
|
return jvm['VML'+ctr]; |
|
}; |
|
|
|
/** |
|
* Adds CSS class for underlying DOM element. |
|
* @param {String} className Name of CSS class name |
|
*/ |
|
jvm.VMLElement.prototype.addClass = function( className ){ |
|
jvm.$(this.node).addClass(className); |
|
}; |
|
|
|
/** |
|
* Applies attribute value to the underlying DOM element. |
|
* @param {String} name Name of attribute |
|
* @param {Number|String} config Value of attribute to apply |
|
* @private |
|
*/ |
|
jvm.VMLElement.prototype.applyAttr = function( attr, value ){ |
|
this.node[attr] = value; |
|
}; |
|
|
|
/** |
|
* Returns boundary box for the element. |
|
* @returns {Object} Boundary box with numeric fields: x, y, width, height |
|
* @override |
|
*/ |
|
jvm.VMLElement.prototype.getBBox = function(){ |
|
var node = jvm.$(this.node); |
|
|
|
return { |
|
x: node.position().left / this.canvas.scale, |
|
y: node.position().top / this.canvas.scale, |
|
width: node.width() / this.canvas.scale, |
|
height: node.height() / this.canvas.scale |
|
}; |
|
}; |