Wow Thomas, I've been missing out. Under http://java.sun.com/j2se/1.5.0/docs/api/index.html there is no mention of the org.w3c.dom.events.* particularly org.w3c.dom.events.Event, org.w3c.dom.events.MouseEvent and org.w3c.dom.events.UIEvent. And I have never found where to add a listener till reading your reply and now I'm employing org.apache.batik.dom.svg.SVGOMDocument.addEventListener. Was looking at org.w3c.dom.svg.SVGDocument interface too much.
Thank you, I can now make a lot of good progress, Roger P.S. I'll be able to model my MathML light-weight visual DOM off of this too. ----- Original Message ----- From: "Thomas DeWeese" <[EMAIL PROTECTED]> To: "Batik Users" <[EMAIL PROTECTED]> Sent: Wednesday, July 07, 2004 8:44 PM Subject: Re: JSVGCanvas displayed gvt components, editing and then saving. > 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.getSVGDocume nt(); > > 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.ge om.Line2D)theShape).getP2().distance(endPoint)) > > { > > > > ((java.awt.geom.Line2D)theShape).setLine(((java.awt.geom.Line2D)theShape).ge tP1(), > > 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:[EMAIL PROTECTED]> > > *To:* Batik Users <mailto:[EMAIL PROTECTED]> > > *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: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]