xmlgraphics-batik-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Roger I Martin PhD" <hypernex...@hypernexinc.com>
Subject Re: JSVGCanvas displayed gvt components, editing and then saving.
Date Wed, 07 Jul 2004 22:49:36 GMT
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 
  To: Batik Users 
  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

Mime
View raw message