xmlgraphics-batik-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From patc <pat.consid...@fineos.com>
Subject Re: Problem calling applet method from script in svg file
Date Tue, 25 Sep 2007 12:24:15 GMT


Hi Thomas

Thanks alot for your excellent response.  Once I got a better understanding
of how the setDocument(svgDoc) API works I was able to add a listener to
create the binding.  All works now.  I have included the source of my
example in case anyone else encounters the same problem.  Thanks again...


public class SVGScriptApplet extends Applet {
	private static class MyCanvas extends JSVGCanvas {		
		public BridgeContext getBridgeContext() {
            return bridgeContext;
        }
    }
	
    public void init() {
    	String parser = XMLResourceDescriptor.getXMLParserClassName();
    	SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
	    try{	        
	        final MyCanvas canvas = new MyCanvas();
	        URL url = new URL(getCodeBase(), "3D.svg");
	        SVGOMDocument svgDoc =
(SVGOMDocument)f.createDocument(url.toString());	        
	        canvas.addSVGLoadEventDispatcherListener(new 		
SVGLoadEventDispatcherAdapter() {
	                public void svgLoadEventDispatchStarted
	                    (SVGLoadEventDispatcherEvent e) {
	                		
	                		Interpreter i = 					
canvas.getBridgeContext().getInterpreter("text/ecmascript");	        
	    	    	        i.bindObject("appletHost", SVGScriptApplet.this);	    	    	        	 
  	    	        
	                }
	            });
	        canvas.setDocument(svgDoc);
	        this.add(canvas);
		    this.setVisible(true);	        
	    }catch (Exception e){
	    	System.out.println(e);
	    }
    }        
    public void doSomething() {
    	System.out.println("Do something!");
    }
}

Regards

Pat


thomas.deweese wrote:
> 
> Hi Pat,
> 
> patc <pat.considine@fineos.com> wrote on 09/04/2007 10:52:06 AM:
> 
>    The problem with the following code is that when you
> call 'setDocument' the canvas will create a whole new
> BridgeContext, and Ecmascript interpreter so your hard
> work is all forgotten.
> 
>    To do this right you should register an SVGLoad event
> listener with the canvas.  When that is called you should
> be able to bind your object.
> 
>>     public void init() {
>>        String parser = XMLResourceDescriptor.getXMLParserClassName();
>>        SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
>>        try{ 
>>            MyCanvas canvas = new MyCanvas();
>>            URL url = new URL(getCodeBase(), "3D.svg");
>>            SVGOMDocument svgDoc =
>> (SVGOMDocument)f.createDocument(url.toString());
>>            canvas.setBridgeContext(svgDoc); 
>>            // 'Unknown document' exception encountered if the following 
> 2
>> lines are not included
>>            GVTBuilder builder   = new GVTBuilder();
>>            builder.build(canvas.getBridgeContext(), svgDoc); 
>>            Interpreter i =
>> canvas.getBridgeContext().getInterpreter("text/ecmascript"); 
>>            i.bindObject("appletHost", this);
>>            canvas.setDocument(svgDoc);
>>        }catch (Exception e){
>>           System.out.println(e);
>>        }
>>     }
>>     public void doSomething() {
>>        System.out.println("Do something!");
>>     }
>> }
>> 
>> This applet loads the 3D.svg that comes in samples directory of Batik 
> 1.7
>> release (in order to keep things simple and easily reproducable).
>> 
>> I have updated the 3D.svg file to reference the applet and call
>> 'doSomething()' method:
>> 
>> <svg xmlns="http://www.w3.org/2000/svg" 
>>      xmlns:xlink="http://www.w3.org/1999/xlink"
>>      id="body" width="640" height="480" viewBox="0 0 640 480">
>> 
>>     <script type="text/ecmascript"><![CDATA[
>> 
>>      .....
>>      // Global initialization
>>      function startAnimation(evt) {
>>           appletHost.doSomething();
>>           .....
>>      }
>>      ....
>> 
>> Unfortunately the interpreter does not seem to take note of the mapping 
> of
>> type of name 'appletHost' with the applet, and I get the following
>> exception;
>> 
>> org.mozilla.javascript.WrappedException: Wrapped
>> org.mozilla.javascript.EcmaError: ReferenceError: "appletHost" is not
>> defined. (Inline <script> 
> http://localhost:8080/FO5/applet/3D.svg:-1#107)
>> (Event attribute http://localhost:8080/FO5/applet/3D.svg:-1 onload#1)
>> at
>> 
> org.apache.batik.script.rhino.BatikSecurityController.callWithDomain(Unknown
>> Source)
>>    at org.mozilla.javascript.Interpreter.interpret(Unknown Source)
>>    at org.mozilla.javascript.InterpretedFunction.call(Unknown Source)
>>    at org.mozilla.javascript.Interpreter.interpretLoop(Unknown Source)
>>    at script(Event attribute http://localhost:8080/FO5/applet/3D.svg:-1
>> onload:1)
>>    at org.mozilla.javascript.Interpreter.interpret(Unknown Source)
>>    at org.mozilla.javascript.InterpretedFunction.call(Unknown Source)
>>    at 
> org.apache.batik.script.rhino.BatikSecurityController$1.run(Unknown
>> Source)
>>    at java.security.AccessController.doPrivileged(Native Method)
>>    at
>> 
> org.apache.batik.script.rhino.BatikSecurityController.callWithDomain(Unknown
>> Source)
>>    at org.mozilla.javascript.Interpreter.interpret(Unknown Source)
>>    at org.mozilla.javascript.InterpretedFunction.call(Unknown Source)
>>    at org.mozilla.javascript.ContextFactory.doTopCall(Unknown Source)
>>    at org.mozilla.javascript.ScriptRuntime.doTopCall(Unknown Source)
>>    at org.mozilla.javascript.InterpretedFunction.exec(Unknown Source)
>>    at org.mozilla.javascript.Context.evaluateReader(Unknown Source)
>>    at org.apache.batik.script.rhino.RhinoInterpreter$2.run(Unknown 
> Source)
>>    at org.mozilla.javascript.Context.call(Unknown Source)
>> 
>> Not really sure what I am doing wrong.  Is there something I am missing?
>> 
>> Any help greatly appreciated
>> 
>> Pat
>> -- 
>> View this message in context: http://www.nabble.com/Problem-calling-
>> applet-method-from-script-in-svg-file-tf4378175.html#a12479719
>> Sent from the Batik - Users mailing list archive at Nabble.com.
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: batik-users-unsubscribe@xmlgraphics.apache.org
>> For additional commands, e-mail: batik-users-help@xmlgraphics.apache.org
>> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: batik-users-unsubscribe@xmlgraphics.apache.org
> For additional commands, e-mail: batik-users-help@xmlgraphics.apache.org
> 
> 
> 

-- 
View this message in context: http://www.nabble.com/Problem-calling-applet-method-from-script-in-svg-file-tf4378175.html#a12878410
Sent from the Batik - Users mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: batik-users-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: batik-users-help@xmlgraphics.apache.org


Mime
View raw message