147 lines
3.5 KiB
JavaScript
147 lines
3.5 KiB
JavaScript
/**
|
|
* Package: svedit.select
|
|
*
|
|
* Licensed under the Apache License, Version 2
|
|
*
|
|
* Copyright(c) 2010 Alexis Deveria
|
|
* Copyright(c) 2010 Jeff Schiller
|
|
*/
|
|
|
|
// Dependencies:
|
|
// 1) jQuery
|
|
// 2) browser.js
|
|
// 3) math.js
|
|
// 4) svgutils.js
|
|
|
|
var svgedit = svgedit || {};
|
|
|
|
(function() {
|
|
|
|
if (!svgedit.hover) {
|
|
svgedit.hover = {};
|
|
}
|
|
|
|
var svgFactory_;
|
|
var config_;
|
|
var hoverManager_; // A Singleton
|
|
|
|
// Class: svgedit.select.Selector
|
|
// Private class for DOM element selection boxes
|
|
//
|
|
// Parameters:
|
|
// id - integer to internally indentify the selector
|
|
// elem - DOM element associated with this selector
|
|
svgedit.hover.Hoverer = function(id, elem) {
|
|
// this is the selector's unique number
|
|
this.id = id;
|
|
|
|
// this holds a reference to the element for which this selector is being used
|
|
this.hoveredElement = elem;
|
|
|
|
// this is a flag used internally to track whether the selector is being used or not
|
|
this.locked = true;
|
|
|
|
// this holds a reference to the <g> element that holds all visual elements of the selector
|
|
this.hoverGroup = svgFactory_.createSVGElement({
|
|
'element': 'g',
|
|
'attr': {'id': ('hoverGroup' + this.id)}
|
|
});
|
|
|
|
// this holds a reference to the path rect
|
|
this.hoverElem = this.selectorGroup.appendChild(
|
|
svgFactory_.createSVGElement({
|
|
'element': 'path',
|
|
'attr': {
|
|
'id': ('hoverBox' + this.id),
|
|
'fill': 'none',
|
|
'stroke': '#4F80FF',
|
|
'stroke-width': '1',
|
|
'shape-rendering': 'crispEdges',
|
|
'style': 'pointer-events:none'
|
|
}
|
|
})
|
|
);
|
|
|
|
|
|
this.reset(this.hoveredElement);
|
|
};
|
|
|
|
|
|
// Function: svgedit.select.Selector.reset
|
|
// Used to reset the id and element that the selector is attached to
|
|
//
|
|
// Parameters:
|
|
// e - DOM element associated with this selector
|
|
svgedit.hover.Hoverer.prototype.reset = function(e) {
|
|
this.locked = true;
|
|
this.hoveredElement = e;
|
|
this.resize();
|
|
this.hoverGroup.setAttribute('display', 'inline');
|
|
};
|
|
|
|
|
|
// Class: svgedit.select.SelectorManager
|
|
svgedit.hover.HoverManager = function() {
|
|
// this will hold the <g> element that contains all hover elements
|
|
this.hoverParentGroup = null;
|
|
this.initGroup();
|
|
};
|
|
|
|
// Function: svgedit.select.SelectorManager.initGroup
|
|
// Resets the parent selector group element
|
|
svgedit.hover.HoverManager.prototype.initGroup = function() {
|
|
// remove old selector parent group if it existed
|
|
if (this.hoverParentGroup && this.hoverParentGroup.parentNode) {
|
|
this.hoverParentGroup.parentNode.removeChild(this.hoverParentGroup);
|
|
}
|
|
|
|
// create parent selector group and add it to svgroot
|
|
this.selectorParentGroup = svgFactory_.createSVGElement({
|
|
'element': 'g',
|
|
'attr': {'id': 'hoverParentGroup'}
|
|
});
|
|
|
|
|
|
if($('#canvasBackground').length) return;
|
|
|
|
var rect = svgFactory_.createSVGElement({
|
|
'element': 'rect',
|
|
'attr': {
|
|
'width': '100%',
|
|
'height': '100%',
|
|
'x': 0,
|
|
'y': 0,
|
|
'stroke-width': 1,
|
|
'stroke': '#000',
|
|
'fill': '#FFF',
|
|
'shape-rendering': 'crispEdges',
|
|
'style': 'pointer-events:none'
|
|
}
|
|
});
|
|
|
|
// Both Firefox and WebKit are too slow with this filter region (especially at higher
|
|
// zoom levels) and Opera has at least one bug
|
|
// if (!svgedit.browser.isOpera()) rect.setAttribute('filter', 'url(#canvashadow)');
|
|
canvasbg.appendChild(rect);
|
|
svgFactory_.svgRoot().insertBefore(canvasbg, svgFactory_.svgContent());
|
|
};
|
|
|
|
|
|
|
|
svgedit.hover.init = function(config, svgFactory) {
|
|
config_ = config;
|
|
svgFactory_ = svgFactory;
|
|
selectorManager_ = new svgedit.hover.HoverManager();
|
|
};
|
|
|
|
/**
|
|
* Function: svgedit.select.getSelectorManager
|
|
*
|
|
* Returns:
|
|
* The SelectorManager instance.
|
|
*/
|
|
svgedit.hover.getHoverManager = function() {
|
|
return selectorManager_;
|
|
};
|
|
|
|
})(); |