2010-01-12 20:39:03 +00:00
/ *
2009-11-22 20:13:06 +00:00
Embedded SVG - edit API
General usage :
- Have an iframe somewhere pointing to a version of svg - edit > r1000
- Initialize the magic with :
2014-01-31 04:54:49 +00:00
var svgCanvas = new EmbeddedSVGEdit ( window . frames . svgedit ) ;
2009-11-22 20:13:06 +00:00
- Pass functions in this format :
svgCanvas . setSvgString ( "string" )
- Or if a callback is needed :
svgCanvas . setSvgString ( "string" ) ( function ( data , error ) {
2014-01-31 04:54:49 +00:00
if ( error ) {
// There was an error
} else {
// Handle data
2009-11-22 20:13:06 +00:00
}
} )
2013-02-23 17:37:05 +00:00
Everything is done with the same API as the real svg - edit ,
2013-10-14 03:25:35 +00:00
and all documentation is unchanged .
2014-01-31 04:54:49 +00:00
However , this file depends on the postMessage API which
can only support JSON - serializable arguments and
2013-10-14 03:25:35 +00:00
return values , so , for example , arguments whose value is
"undefined" , a function , a non - finite number , or a built - in
object like Date ( ) , RegExp ( ) , etc . will most likely not behave
as expected . In such a case one may need to host
the SVG editor on the same domain and reference the
JavaScript methods on the frame itself .
The only other difference is
when handling returns : the callback notation is used instead .
2009-11-22 20:13:06 +00:00
2014-01-31 04:54:49 +00:00
var blah = new EmbeddedSVGEdit ( window . frames . svgedit ) ;
2009-11-22 20:13:06 +00:00
blah . clearSelection ( "woot" , "blah" , 1337 , [ 1 , 2 , 3 , 4 , 5 , "moo" ] , - 42 , { a : "tree" , b : 6 , c : 9 } ) ( function ( ) { console . log ( "GET DATA" , arguments ) } )
* /
2013-10-13 23:59:32 +00:00
( function ( ) { 'use strict' ;
var cbid = 0 ;
function getCallbackSetter ( d ) {
return function ( ) {
2014-01-31 07:13:17 +00:00
var t = this , // New callback
2013-10-13 23:59:32 +00:00
args = [ ] . slice . call ( arguments ) ,
2014-01-31 07:13:17 +00:00
cbid = t . send ( d , args , function ( ) { } ) ; // The callback (currently it's nothing, but will be set later)
2013-10-13 23:59:32 +00:00
return function ( newcallback ) {
2014-01-31 07:13:17 +00:00
t . callbacks [ cbid ] = newcallback ; // Set callback
2013-10-13 23:59:32 +00:00
} ;
} ;
}
function EmbeddedSVGEdit ( frame ) {
if ( ! ( this instanceof EmbeddedSVGEdit ) ) { // Allow invocation without "new" keyword
return new EmbeddedSVGEdit ( frame ) ;
}
2014-01-31 07:13:17 +00:00
// Initialize communication
2009-11-22 20:13:06 +00:00
this . frame = frame ;
2014-01-31 07:13:17 +00:00
this . callbacks = { } ;
// List of functions extracted with this:
// Run in firebug on http://svg-edit.googlecode.com/svn/trunk/docs/files/svgcanvas-js.html
2013-02-23 17:37:05 +00:00
2014-01-31 08:57:22 +00:00
// for (var i=0,q=[],f = document.querySelectorAll("div.CFunction h3.CTitle a"); i < f.length; i++) { q.push(f[i].name); }; q
// var functions = ["clearSelection", "addToSelection", "removeFromSelection", "open", "save", "getSvgString", "setSvgString",
// "createLayer", "deleteCurrentLayer", "setCurrentLayer", "renameCurrentLayer", "setCurrentLayerPosition", "setLayerVisibility",
// "moveSelectedToLayer", "clear"];
2013-02-23 17:37:05 +00:00
2014-01-31 07:13:17 +00:00
// Newer, well, it extracts things that aren't documented as well. All functions accessible through the normal thingy can now be accessed though the API
// var l = []; for (var i in svgCanvas){ if (typeof svgCanvas[i] == "function") { l.push(i);} };
// Run in svgedit itself
2013-10-13 23:59:32 +00:00
var i ,
t = this ,
2014-01-31 08:57:22 +00:00
functions = [ "updateElementFromJson" , "embedImage" , "fixOperaXML" , "clearSelection" ,
"addToSelection" ,
"removeFromSelection" , "addNodeToSelection" , "open" , "save" , "getSvgString" , "setSvgString" , "createLayer" ,
"deleteCurrentLayer" , "getCurrentDrawing" , "setCurrentLayer" , "renameCurrentLayer" , "setCurrentLayerPosition" ,
"setLayerVisibility" , "moveSelectedToLayer" , "clear" , "clearPath" , "getNodePoint" , "clonePathNode" , "deletePathNode" ,
"getResolution" , "getImageTitle" , "setImageTitle" , "setResolution" , "setBBoxZoom" , "setZoom" , "getMode" , "setMode" ,
"getStrokeColor" , "setStrokeColor" , "getFillColor" , "setFillColor" , "setStrokePaint" , "setFillPaint" , "getStrokeWidth" ,
"setStrokeWidth" , "getStrokeStyle" , "setStrokeStyle" , "getOpacity" , "setOpacity" , "getFillOpacity" , "setFillOpacity" ,
"getStrokeOpacity" , "setStrokeOpacity" , "getTransformList" , "getBBox" , "getRotationAngle" , "setRotationAngle" , "each" ,
"bind" , "setIdPrefix" , "getBold" , "setBold" , "getItalic" , "setItalic" , "getFontFamily" , "setFontFamily" , "getFontSize" ,
"setFontSize" , "getText" , "setTextContent" , "setImageURL" , "setRectRadius" , "setSegType" , "quickClone" ,
"changeSelectedAttributeNoUndo" , "changeSelectedAttribute" , "deleteSelectedElements" , "groupSelectedElements" , "zoomChanged" ,
"ungroupSelectedElement" , "moveToTopSelectedElement" , "moveToBottomSelectedElement" , "moveSelectedElements" ,
"getStrokedBBox" , "getVisibleElements" , "cycleElement" , "getUndoStackSize" , "getRedoStackSize" , "getNextUndoCommandText" ,
"getNextRedoCommandText" , "undo" , "redo" , "cloneSelectedElements" , "alignSelectedElements" , "getZoom" , "getVersion" ,
"setIconSize" , "setLang" , "setCustomHandlers" ] ;
2013-02-23 17:37:05 +00:00
2013-10-13 23:59:32 +00:00
// TODO: rewrite the following, it's pretty scary.
2014-01-31 07:13:17 +00:00
for ( i = 0 ; i < functions . length ; i ++ ) {
2013-10-13 23:59:32 +00:00
this [ functions [ i ] ] = getCallbackSetter ( functions [ i ] ) ;
2009-11-22 20:13:06 +00:00
}
2013-10-13 23:59:32 +00:00
// Older IE may need a polyfill for addEventListener, but so it would for SVG
2014-01-31 07:13:17 +00:00
window . addEventListener ( 'message' , function ( e ) {
// We accept and post strings as opposed to objets for the sake of IE9 support; this
// will most likely be changed in the future
2013-10-14 01:24:52 +00:00
if ( typeof e . data !== 'string' ) {
2014-01-31 08:57:22 +00:00
return ;
2013-10-14 01:24:52 +00:00
}
2014-01-31 02:13:37 +00:00
var result , cbid ,
2014-01-31 08:57:22 +00:00
data = e . data && JSON . parse ( e . data ) ;
2013-10-14 01:24:52 +00:00
if ( ! data || typeof data !== 'object' || data . namespace !== 'svg-edit' ) {
2013-10-13 23:59:32 +00:00
return ;
}
2014-01-31 02:13:37 +00:00
result = data . result || data . error ;
cbid = data . id ;
2014-01-31 07:13:17 +00:00
if ( t . callbacks [ cbid ] ) {
if ( data . result ) {
2013-10-14 01:24:52 +00:00
t . callbacks [ cbid ] ( result ) ;
2014-01-31 07:13:17 +00:00
} else {
2013-10-14 01:24:52 +00:00
t . callbacks [ cbid ] ( result , "error" ) ;
2009-11-22 20:13:06 +00:00
}
}
2013-02-23 17:37:05 +00:00
} , false ) ;
2009-11-22 20:13:06 +00:00
}
2013-10-13 23:59:32 +00:00
EmbeddedSVGEdit . prototype . send = function ( name , args , callback ) {
2009-11-22 20:33:12 +00:00
var t = this ;
2013-10-13 23:59:32 +00:00
cbid ++ ;
this . callbacks [ cbid ] = callback ;
2014-01-31 07:13:17 +00:00
setTimeout ( function ( ) { // Delay for the callback to be set in case its synchronous
2013-10-13 23:59:32 +00:00
// Todo: Handle non-JSON arguments and return values (undefined, nonfinite numbers, functions, and built-in objects like Date, RegExp), etc.?
2013-10-14 01:24:52 +00:00
// We accept and post strings for the sake of IE9 support
t . frame . contentWindow . postMessage ( JSON . stringify ( { namespace : "svgCanvas" , id : cbid , name : name , args : args } ) , '*' ) ;
2009-11-22 20:33:12 +00:00
} , 0 ) ;
return cbid ;
2013-02-23 17:37:05 +00:00
} ;
2013-10-13 23:59:32 +00:00
window . embedded _svg _edit = EmbeddedSVGEdit ; // Export old, deprecated API
window . EmbeddedSVGEdit = EmbeddedSVGEdit ; // Follows common JS convention of CamelCase and, as enforced in JSLint, of initial caps for constructors
} ( ) ) ;