xmlgraphics-batik-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Thomas DeWeese <Thomas.DeWe...@Kodak.com>
Subject Re: JSVGCanvas displayed gvt components, editing and then saving.
Date Thu, 08 Jul 2004 00:44:00 GMT
Hi Roger,

    I applaud your enthusiasm with the GVT, but since you clearly
are aware of (and are making use of) modifying the DOM to manipulate
the displayed graphics - why don't you do the same thing for your
'interactive' bits?

 >
 > ((java.awt.geom.Line2D)theShape).setLine(endPoint,
 > ((java.awt.geom.Line2D)theShape).getP2());

     This could be replaced with a DOM mouseMove event listener,
and setting the attributes on the line element:

    Element line;
    line.setAttribute("x1", endPoint.x);
    line.setAttribute("y1", endPoint.y);

     You can even go back and forth between the GVT and DOM node
using the BridgeContext (if you want to peak at the Java2D shapes),
but if you have a dynamic document it's really nasty to go changing
the GVT 'under the hood'.

Roger I Martin PhD wrote:

> 
> Hi,
>  
> I'm doing DOM adds, removes, attribute changes and I see the JSVGCanvas 
> rendering update each time.  Also the DOM transformed to an svg doc 
> shows all the final states and attributes.  For example:
>  
>             JComponent currentFocus=getCurrentFocus();
>             if(currentFocus==null)
>             {
>                 return;
>             }
>             else if(currentFocus instanceof 
> org.apache.batik.swing.JSVGCanvas)
>             {
>                 svgCanvas=(org.apache.batik.swing.JSVGCanvas)currentFocus;
>                 org.apache.batik.dom.svg.SVGOMDocument 
> svgOMDocument=(org.apache.batik.dom.svg.SVGOMDocument)svgCanvas.getSVGDocument();
>                 org.apache.batik.dom.svg.SVGOMSVGElement 
> root=(org.apache.batik.dom.svg.SVGOMSVGElement)svgOMDocument.getRootElement();
>                 org.apache.batik.dom.svg.SVGDOMImplementation 
> svgDOMImplementation=new org.apache.batik.dom.svg.SVGDOMImplementation();
>                 org.apache.batik.dom.svg.SVGOMImageElement image=new 
> org.apache.batik.dom.svg.SVGOMImageElement("image", svgOMDocument);
>                 try
>                 {
>                 javax.imageio.stream.FileImageInputStream fiis=new 
> javax.imageio.stream.FileImageInputStream(new File(fiob.getFilePath()));
>                 java.util.Iterator 
> iterator=javax.imageio.ImageIO.getImageReaders(fiis);
>                 if(iterator.hasNext())
>                 {
>                     javax.imageio.ImageReader 
> ir=(javax.imageio.ImageReader)iterator.next();
>                     ir.setInput(fiis);
>                     java.awt.image.BufferedImage bi=ir.read(0);
>                     org.apache.batik.svggen.ImageHandlerBase64Encoder 
> dih=new org.apache.batik.svggen.ImageHandlerBase64Encoder();
>                     dih.handleHREF((java.awt.image.RenderedImage)bi, 
> image, 
> org.apache.batik.svggen.SVGGeneratorContext.createDefault(svgOMDocument));
>                     org.apache.batik.dom.svg.SVGOMGElement g=new 
> org.apache.batik.dom.svg.SVGOMGElement("g", svgOMDocument);
>                     
> image.setAttribute("width",Integer.toString(bi.getWidth()));
>                     
> image.setAttribute("height",Integer.toString(bi.getHeight()));
>                     g.appendChild(image);
>                     root.appendChild(g);
>                 }
>                 }
>                 catch(FileNotFoundException fnfe)
>                 {
>  
>                 }
>                 catch(java.io.IOException ioe)
>                 {
>  
>                 }
>             }
> ...
> This adds a raster image to the DOM as a base 64 encoded image, it shows 
> in the JSVGCanvas update and can be saved to the svg doc.
>  
> Now without the DOM I can change the JSVGCanvas position of a selected 
> line by doing this:
>  
> public class SVGCanvasAdapter extends 
> org.apache.batik.gvt.event.GraphicsNodeMouseAdapter implements 
> org.apache.batik.gvt.event.GraphicsNodeKeyListener, 
> org.apache.batik.gvt.event.SelectionListener {
> ...
>     public void 
> mouseClicked(org.apache.batik.gvt.event.GraphicsNodeMouseEvent evt)
>     {
>         switch(mode)
>         {
>             case 0:
>                 if(evt.getSource() instanceof 
> org.apache.batik.gvt.ShapeNode)
>                 {
>                     org.apache.batik.gvt.ShapeNode 
> shapeNode=(org.apache.batik.gvt.ShapeNode)evt.getSource();
>                    
>                     java.awt.Graphics2D 
> g2=(java.awt.Graphics2D)svgCanvas.getGraphics();
>                     if(g2!=null)
>                     {
>                     g2.setColor(Color.blue);
>                     g2.draw(shapeNode.getOutline());
>                     g2.dispose();
>                     }
>                     java.awt.Shape shape=shapeNode.getShape();
>                     this.shapeNode=shapeNode;
>                 }
>                 break;
>         }
>     }
>    
>     public void 
> mouseDragged(org.apache.batik.gvt.event.GraphicsNodeMouseEvent evt)
>     {
>         endPoint=evt.getPoint2D();//getClientPoint();
>         if(evt.getSource() instanceof org.apache.batik.gvt.ShapeNode)
>         {
>             if(shapeNode!=null)
>             {
>                 java.awt.Shape theShape=shapeNode.getShape();
>                 
> System.out.println("shape="+shapeNode.getShape().getClass().getName());
>                 if(theShape instanceof java.awt.geom.Line2D)
>                 {
>                         
> shapeNode.getParent().fireGraphicsNodeChangeStarted();
>                     
> if(((java.awt.geom.Line2D)theShape).getP1().distance(endPoint)>((java.awt.geom.Line2D)theShape).getP2().distance(endPoint))
>                     {
>                         
> ((java.awt.geom.Line2D)theShape).setLine(((java.awt.geom.Line2D)theShape).getP1(), 
> endPoint);
>                         System.out.println("near P1");
>                     }
>                     else
>                     {
>                         
> ((java.awt.geom.Line2D)theShape).setLine(endPoint, 
> ((java.awt.geom.Line2D)theShape).getP2());
>                         System.out.println("near P2");
>                     }
>                         //shapeNode.getParent().
>                         
> shapeNode.getParent().fireGraphicsNodeChangeCompleted();
>                 svgCanvas.repaint();
>                 }
>                 //evt.
>             }
>             else
>             {
>                 org.apache.batik.gvt.ShapeNode 
> shapeNode=(org.apache.batik.gvt.ShapeNode)evt.getSource();
>                 java.awt.Shape shape=shapeNode.getShape();
>                 this.shapeNode=new org.apache.batik.gvt.ShapeNode();
>             }
>         }
>     }
> ...
>    
> but I don't get these changes back in the DOM or get to save them to 
> file.  Or should I just use svggen to create the file with the changes 
> from the JSVGCanvas and be done with it?  But sometimes new primitives 
> are added from the DOM and that update will reset the gvt view.  I also 
> want to right-click and popup a dialog with an appropriate primitive 
> dialog for line, ellipse, rectangle, etc.  Basically turn it into a full 
> blown editor.
>  
>  
> 
>     ----- Original Message -----
>     *From:* Andres Toussaint <mailto:andres@onemileup.com>
>     *To:* Batik Users <mailto:batik-users@xml.apache.org>
>     *Sent:* Wednesday, July 07, 2004 4:17 PM
>     *Subject:* Re: JSVGCanvas displayed gvt components, editing and then
>     saving.
> 
>     Hi:
> 
>     What type of changes are you doing in the GVT component? Why not do
>     the changes to the objects in the DOM and catch the UpdateManager to
>     be sure the modifications are ready before saving.
> 
>     I have to assume that you are doing Java2D modifications, beacuse if
>     not, then i do not see the reason to do your modifications in the
>     GVT, you can do all modifications in the DOM, by changing the
>     attributes of the Elements in your DOM.
> 
>     If the modification was triggered by a element.EventListener (i.r
>     OnClickAction), then you are already in the JSCGCanvas runnable
>     queue, if not, then you need to invoke the runnable queue and do
>     your attribute changes there.
> 
>     To invoke the runnable queue, you need to do several things:
> 
>     1. in JSVGCanvas.gvtRenderingCompeted(GVTTreeRenderEvent) {
>     UpdateManager updateM = JSVGCanvas.getUpdateManager();
>     }
> 
>     2. to call the runnable queue:
>     updateM.getUpdateRunnableQueue().invokelater(new Runnable() {
>     public void run() {
>     //////////////////////////All the Element attribute changes here
>     //For example
>     SVGDocument doc = JSCGCanvas.getSVGDocument();
>     SVGOMSVGElement docElt = (SVGOMSVGElement) doc.getDocumentElement();
>     Element group = docElt.getElementById("some id tag");
>     Element theElement = (Element) group.getFirstChild();
> 
>     //// The attribute changes here:
>     theElement.setAttribute("width","200");
>     }
>     } );
> 
> 
>     Hope this helps,
> 
>     Andres.
> 
> 
>     On Jul 7, 2004, at 12:29 PM, Roger I Martin PhD wrote:
> 
>         Hi,
>          
>         I've learned to add, remove, modify the JSVGCanvas displayed svg
>         DOM, save it back to a file with the changes.  Also learned how
>         to modify a gvt component on the canvas with user keyboard and
>         mouse interaction (i.e.
>         mouseDragged(org.apache.batik.gvt.event.GraphicsNodeMouseEvent
>         evt);).  What I don't have is how to "bridge" the results of the
>         gvt modifications back to the DOM and subsequently save the
>         results back to an svg doc.  After the change is back in the DOM
>         I could then save it.  Anybody have a hint to how it can be done?
>          
>         --Roger


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


Mime
View raw message