Thanks Robert, I'll experiment with this. However, my main priority is actually adding the links and event handler rather than the appearance of the pointer etc. Clicking the text doesn't trigger the handler using the code I posted.
(Apologies for top posting-sent from my phone.) Robert Marcano <rob...@marcanoonline.com> wrote: >On 08/09/2013 10:26 AM, James Burton wrote: >> On 09/08/13 13:58, Robert Marcano wrote: >>> On 08/08/2013 05:55 PM, James Burton wrote: >>>> I'm new to using batik, and I want to turn all text elements in an >>>> SVGDocument into links which pass the text to a callback. Can you point >>>> me to an example of something similar? I'm finding the text elements >>>> like this: >>> >>> There is no need to modify the document >>> >> >> Hi Robert, thanks for your reply. I've applied your suggestion but >> haven't managed to add links to my document yet as far as I can tell. >> The pointer doesn't change over the text (not sure if it that's the >> default) and more importantly the event handler isn't triggered. Here's >> what it looks like now: > >IIRC if your document doesn't contains JavaScript, the canvas consider >it is a static document. You need to tell to the canvas before loading >the document you want them to be dynamic ALWAYS_DYNAMIC or interactive >(ALWAYS_INTERACTIVE), I don't remember which one is for events > >canvas.setDocumentState(ALWAYS_DYNAMIC) > >You can add a CSS stylesheet (inline or linked) that change the cursor >property to all text elements, you can use standard DOM APIs to add the >style element attributes and content > >Element styleElem = doc.createElementNS("http://www.w3.org/2000/svg", >"style"); >styleElem.setAttribute("type", "text/css"); >Text styleText = doc.createTextNode("text {cursor: pointer}"); >styleElem.appendChild(styleText); >doc.getDocumentElement().appendChild(styleElem); > >Before setting the document on the canvas I think, I don't remember if >ALWAYS_DYNAMIC notices changes on the CSS > >But adding the CSS you are already modifying the document, You can play >with the SVGUserAgent interface and SVGUserAgentGUIAdapter and override >the method that return the user stylesheet, this way all you documents >can have the same CSS without modifying the document > >All this because you want a event handler in Java, you don't get the >default <a> links look and feel adding those > >> >> for(int i=0;i<labels.getLength();i++) { >> n = labels.item(i); >> log.info("A label:"+n.getFirstChild().getNodeValue());//prints as >> //expected >> EventListener l = new EventListener() { >> public void handleEvent(Event evt) { >> log.info("Clicked on "+( >> (Node) evt.getTarget()).getFirstChild().getNodeValue()); >> } >> }; >> ((EventTarget) n).addEventListener("click", l, false); >> } >> >> Quite happy to RTFM if someone can point me to a suitable FM. I'm aware >> of http://xmlgraphics.apache.org/batik/using/, but it's low on examples. >> Cheers, >> >> Jim >> >>>> >>>> SVGDocument doc = ... >>>> Element svgRoot = doc.getDocumentElement(); >>>> NodeList labels = svgRoot.getElementsByTagNameNS("*", "text"); >>>> Node n; >>>> for(int i=0;i<labels.getLength();i++) { >>>> n = labels.item(i); >>>> log.info("A label:"+n.getFirstChild().getNodeValue()); >>> >>> EventListener l = new EventListener { >>> public void handleEvent(Event evt) { >>> // you can try to use the current n element here, that >>> // means you need to make it final and build one listener >>> // for each element or use evt.getTarget() to get the >>> // element and use only one listener instance per document >>> } >>> } >>> n.addEventListener("click", l, false) >>> >>>> //presumably, replace n with a link element that contains n? >>>> } >>>> >>> >>> You can use too event bubbling on the addEventListener and attach only >>> one listener on the document root and check the element type you are >>> getting, instead of attaching a listener to each element, the advantage >>> of this method is that it work for all text elements you add later >>> without need to add a listener to them >>> >>> >>>> Thanks in advance, >>>> >>>> Jim >>>> >>>> ___________________________________________________________ >>>> This email has been scanned by MessageLabs' Email Security >>>> System on behalf of the University of Brighton. >>>> For more information see http://www.brighton.ac.uk/is/spam/ >>>> ___________________________________________________________ >>>> >>>> --------------------------------------------------------------------- >>>> To unsubscribe, e-mail: batik-users-unsubscr...@xmlgraphics.apache.org >>>> For additional commands, e-mail: batik-users-h...@xmlgraphics.apache.org >>>> >>> >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: batik-users-unsubscr...@xmlgraphics.apache.org >>> For additional commands, e-mail: batik-users-h...@xmlgraphics.apache.org >>> >>> >>> ___________________________________________________________ >>> This email has been scanned by MessageLabs' Email Security >>> System on behalf of the University of Brighton. >>> For more information see http://www.brighton.ac.uk/is/spam/ >>> ___________________________________________________________ >> > > >--------------------------------------------------------------------- >To unsubscribe, e-mail: batik-users-unsubscr...@xmlgraphics.apache.org >For additional commands, e-mail: batik-users-h...@xmlgraphics.apache.org > > >___________________________________________________________ >This email has been scanned by MessageLabs' Email Security >System on behalf of the University of Brighton. >For more information see http://www.brighton.ac.uk/is/spam/ >___________________________________________________________ ___________________________________________________________ This email has been scanned by MessageLabs' Email Security System on behalf of the University of Brighton. For more information see http://www.brighton.ac.uk/is/spam/ ___________________________________________________________