Actually use svgedit.document.Document in svgcanvas.js. Added Document.releaseId() to prevent mouseUp using up ids.
git-svn-id: http://svg-edit.googlecode.com/svn/trunk@1912 eee81c28-f429-11dd-99c0-75d572ba1ddd
This commit is contained in:
@@ -10,7 +10,6 @@
|
|||||||
TODOs:
|
TODOs:
|
||||||
|
|
||||||
Phase 1:
|
Phase 1:
|
||||||
- migrate svgcanvas to using a Document object for its calls to getNextId() and getId()
|
|
||||||
- migrate usages of randomizeIds() to proxy into the Document
|
- migrate usages of randomizeIds() to proxy into the Document
|
||||||
|
|
||||||
Phase 2:
|
Phase 2:
|
||||||
@@ -51,6 +50,7 @@ svgedit.document.Document = function(svgElem, opt_idPrefix) {
|
|||||||
this.svgElem_ = svgElem;
|
this.svgElem_ = svgElem;
|
||||||
this.obj_num = 0;
|
this.obj_num = 0;
|
||||||
this.idPrefix = opt_idPrefix || "svg_";
|
this.idPrefix = opt_idPrefix || "svg_";
|
||||||
|
this.releasedNums = [];
|
||||||
|
|
||||||
// Determine if the <svg> element has a nonce on it
|
// Determine if the <svg> element has a nonce on it
|
||||||
this.nonce_ = this.svgElem_.getAttributeNS(se_ns, 'nonce') || "";
|
this.nonce_ = this.svgElem_.getAttributeNS(se_ns, 'nonce') || "";
|
||||||
@@ -89,16 +89,65 @@ svgedit.document.Document.prototype.getId = function() {
|
|||||||
* @return {String} The next object Id to use.
|
* @return {String} The next object Id to use.
|
||||||
*/
|
*/
|
||||||
svgedit.document.Document.prototype.getNextId = function() {
|
svgedit.document.Document.prototype.getNextId = function() {
|
||||||
// always increment the obj_num every time we call getNextId()
|
var oldObjNum = this.obj_num;
|
||||||
this.obj_num++;
|
var restoreOldObjNum = false;
|
||||||
|
|
||||||
// ensure the ID does not exist
|
// If there are any released numbers in the release stack,
|
||||||
|
// use the last one instead of the next obj_num.
|
||||||
|
// We need to temporarily use obj_num as that is what getId() depends on.
|
||||||
|
if (this.releasedNums.length > 0) {
|
||||||
|
this.obj_num = this.releasedNums.pop();
|
||||||
|
restoreOldObjNum = true;
|
||||||
|
} else {
|
||||||
|
// If we are not using a released id, then increment the obj_num.
|
||||||
|
this.obj_num++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ensure the ID does not exist.
|
||||||
var id = this.getId();
|
var id = this.getId();
|
||||||
while (this.getElem_(id)) {
|
while (this.getElem_(id)) {
|
||||||
|
if (restoreOldObjNum) {
|
||||||
|
this.obj_num = oldObjNum;
|
||||||
|
restoreOldObjNum = false;
|
||||||
|
}
|
||||||
this.obj_num++;
|
this.obj_num++;
|
||||||
id = this.getId();
|
id = this.getId();
|
||||||
}
|
}
|
||||||
|
// Restore the old object number if required.
|
||||||
|
if (restoreOldObjNum) {
|
||||||
|
this.obj_num = oldObjNum;
|
||||||
|
}
|
||||||
return id;
|
return id;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Releases the object Id, letting it be used as the next id in getNextId().
|
||||||
|
* This method DOES NOT remove any elements from the DOM, it is expected
|
||||||
|
* that client code will do this.
|
||||||
|
*
|
||||||
|
* @param {String} The id to release.
|
||||||
|
* @return {boolean} Returns true if the id was valid to be released,
|
||||||
|
* false otherwise.
|
||||||
|
*/
|
||||||
|
svgedit.document.Document.prototype.releaseId = function(id) {
|
||||||
|
// confirm if this is a valid id for this Document, else return false
|
||||||
|
var front = this.idPrefix + (this.nonce_ ? this.nonce_ +'_' : '');
|
||||||
|
if (typeof id != typeof '' || id.indexOf(front) != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// extract the obj_num of this id
|
||||||
|
var num = parseInt(id.substr(front.length));
|
||||||
|
|
||||||
|
// if we didn't get a positive number or we already released this number
|
||||||
|
// then return false.
|
||||||
|
if (typeof num != typeof 1 || num <= 0 || this.releasedNums.indexOf(num) != -1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// push the released number into the released queue
|
||||||
|
this.releasedNums.push(num);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
// 7) sanitize.js
|
// 7) sanitize.js
|
||||||
// 8) history.js
|
// 8) history.js
|
||||||
// 9) select.js
|
// 9) select.js
|
||||||
|
// 10) document.js
|
||||||
|
|
||||||
if(!window.console) {
|
if(!window.console) {
|
||||||
window.console = {};
|
window.console = {};
|
||||||
@@ -162,6 +163,18 @@ $(svgcontent).attr({
|
|||||||
"xmlns:xlink": xlinkns
|
"xmlns:xlink": xlinkns
|
||||||
}).appendTo(svgroot);
|
}).appendTo(svgroot);
|
||||||
|
|
||||||
|
// Prefix string for element IDs
|
||||||
|
var idprefix = "svg_";
|
||||||
|
|
||||||
|
// Function: setIdPrefix
|
||||||
|
// Changes the ID prefix to the given value
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// p - String with the new prefix
|
||||||
|
canvas.setIdPrefix = function(p) {
|
||||||
|
idprefix = p;
|
||||||
|
};
|
||||||
|
|
||||||
// nonce to uniquify id's
|
// nonce to uniquify id's
|
||||||
var nonce = Math.floor(Math.random() * 100001);
|
var nonce = Math.floor(Math.random() * 100001);
|
||||||
|
|
||||||
@@ -171,6 +184,16 @@ var randomize_ids = false;
|
|||||||
// Set nonce if randomize_ids = true
|
// Set nonce if randomize_ids = true
|
||||||
if (randomize_ids) svgcontent.setAttributeNS(se_ns, 'se:nonce', nonce);
|
if (randomize_ids) svgcontent.setAttributeNS(se_ns, 'se:nonce', nonce);
|
||||||
|
|
||||||
|
// Current svgedit.document.Document object
|
||||||
|
// @type {svgedit.document.Document}
|
||||||
|
var current_doc = new svgedit.document.Document(svgcontent, idprefix);
|
||||||
|
|
||||||
|
// Function: getCurrentDoc
|
||||||
|
// Returns the current Document JS object.
|
||||||
|
// @return {svgedit.document.Document}
|
||||||
|
canvas.getCurrentDoc = function() {
|
||||||
|
return current_doc;
|
||||||
|
};
|
||||||
|
|
||||||
// Float displaying the current zoom level (1 = 100%, .5 = 50%, etc)
|
// Float displaying the current zoom level (1 = 100%, .5 = 50%, etc)
|
||||||
var current_zoom = 1;
|
var current_zoom = 1;
|
||||||
@@ -536,9 +559,6 @@ var all_layers = [],
|
|||||||
// Boolean indicating whether or not a draw action has been started
|
// Boolean indicating whether or not a draw action has been started
|
||||||
started = false,
|
started = false,
|
||||||
|
|
||||||
// Integer with internal ID number for the latest element
|
|
||||||
obj_num = 0,
|
|
||||||
|
|
||||||
// String with an element's initial transform attribute value
|
// String with an element's initial transform attribute value
|
||||||
start_transform = null,
|
start_transform = null,
|
||||||
|
|
||||||
@@ -981,31 +1001,17 @@ var getId, getNextId, call;
|
|||||||
// Object to contain editor event names and callback functions
|
// Object to contain editor event names and callback functions
|
||||||
var events = {};
|
var events = {};
|
||||||
|
|
||||||
// Prefix string for element IDs
|
|
||||||
var idprefix = "svg_";
|
|
||||||
|
|
||||||
// Function: getId
|
// Function: getId
|
||||||
// Returns the last created DOM element ID string
|
// Returns the last created DOM element ID string
|
||||||
getId = c.getId = function() {
|
getId = c.getId = function() {
|
||||||
if (randomize_ids) {
|
return current_doc.getId();
|
||||||
return idprefix + nonce +'_' + obj_num;
|
|
||||||
} else {
|
|
||||||
return idprefix + obj_num;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Function: getNextId
|
// Function: getNextId
|
||||||
// Creates and returns a unique ID string for a DOM element
|
// Creates and returns a unique ID string for a DOM element
|
||||||
getNextId = c.getNextId = function() {
|
getNextId = c.getNextId = function() {
|
||||||
// always increment the obj_num every time we call getNextId()
|
var id = current_doc.getNextId();
|
||||||
obj_num++;
|
console.log("getNextId() returned " + id);
|
||||||
|
|
||||||
// ensure the ID does not exist
|
|
||||||
var id = getId();
|
|
||||||
while (getElem(id)) {
|
|
||||||
obj_num++;
|
|
||||||
id = getId();
|
|
||||||
}
|
|
||||||
return id;
|
return id;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1036,14 +1042,6 @@ var getId, getNextId, call;
|
|||||||
return old;
|
return old;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Function: setIdPrefix
|
|
||||||
// Changes the ID prefix to the given value
|
|
||||||
//
|
|
||||||
// Parameters:
|
|
||||||
// p - String with the new prefix
|
|
||||||
c.setIdPrefix = function(p) {
|
|
||||||
idprefix = p;
|
|
||||||
};
|
|
||||||
}(canvas));
|
}(canvas));
|
||||||
|
|
||||||
// Function: canvas.prepareSvg
|
// Function: canvas.prepareSvg
|
||||||
@@ -3259,7 +3257,6 @@ var getMouseTarget = this.getMouseTarget = function(evt) {
|
|||||||
|
|
||||||
// TODO: Make true when in multi-unit mode
|
// TODO: Make true when in multi-unit mode
|
||||||
var useUnit = false; // (curConfig.baseUnit !== 'px');
|
var useUnit = false; // (curConfig.baseUnit !== 'px');
|
||||||
|
|
||||||
started = false;
|
started = false;
|
||||||
switch (current_mode)
|
switch (current_mode)
|
||||||
{
|
{
|
||||||
@@ -3476,6 +3473,7 @@ var getMouseTarget = this.getMouseTarget = function(evt) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (!keep && element != null) {
|
if (!keep && element != null) {
|
||||||
|
current_doc.releaseId(getId());
|
||||||
element.parentNode.removeChild(element);
|
element.parentNode.removeChild(element);
|
||||||
element = null;
|
element = null;
|
||||||
|
|
||||||
@@ -6693,7 +6691,10 @@ this.setSvgString = function(xmlString) {
|
|||||||
svgcontent.setAttributeNS(xmlnsns, 'xmlns:se', se_ns);
|
svgcontent.setAttributeNS(xmlnsns, 'xmlns:se', se_ns);
|
||||||
svgcontent.setAttributeNS(se_ns, 'se:nonce', nonce);
|
svgcontent.setAttributeNS(se_ns, 'se:nonce', nonce);
|
||||||
if (extensions["Arrows"]) call("setarrownonce", nonce) ;
|
if (extensions["Arrows"]) call("setarrownonce", nonce) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
current_doc = new svgedit.document.Document(svgcontent, idprefix);
|
||||||
|
|
||||||
// change image href vals if possible
|
// change image href vals if possible
|
||||||
content.find('image').each(function() {
|
content.find('image').each(function() {
|
||||||
var image = this;
|
var image = this;
|
||||||
|
|||||||
@@ -153,6 +153,24 @@
|
|||||||
|
|
||||||
while(svg_n.firstChild) {svg_n.removeChild(svg.firstChild);}
|
while(svg_n.firstChild) {svg_n.removeChild(svg.firstChild);}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('Test releaseId()', function() {
|
||||||
|
expect(6);
|
||||||
|
|
||||||
|
var doc = new svgedit.document.Document(svg);
|
||||||
|
|
||||||
|
var firstId = doc.getNextId();
|
||||||
|
var secondId = doc.getNextId();
|
||||||
|
|
||||||
|
var result = doc.releaseId(firstId);
|
||||||
|
ok(result);
|
||||||
|
equals(doc.getNextId(), firstId);
|
||||||
|
equals(doc.getNextId(), "svg_3");
|
||||||
|
|
||||||
|
ok(!doc.releaseId("bad-id"));
|
||||||
|
ok(doc.releaseId(firstId));
|
||||||
|
ok(!doc.releaseId(firstId));
|
||||||
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
Reference in New Issue
Block a user