/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package app.navigps.gui.svgComponents.DisplayObjects;
import app.navigps.gui.NaviRootWindow;
import app.navigps.gui.svgComponents.Canvas;
import app.config.SVGConfiguration;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Vector;
import app.database.odb.core.ServiceCore;
import org.apache.batik.bridge.UpdateManager;
import org.apache.batik.dom.events.DOMMouseEvent;
import org.apache.batik.dom.svg.SVGDOMImplementation;
import org.apache.batik.dom.svg.SVGOMPoint;
import org.apache.batik.swing.svg.SVGDocumentLoaderEvent;
import org.apache.batik.swing.svg.SVGDocumentLoaderListener;
import org.apache.batik.util.SVGConstants;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.Text;
import org.w3c.dom.events.Event;
import org.w3c.dom.events.EventListener;
import org.w3c.dom.events.EventTarget;
import org.w3c.dom.svg.SVGDocument;
import org.w3c.dom.svg.SVGElement;
/**
*
* @author vara
*/
public class XMLDOMDisplayManager extends AbstractDisplayManager{
private UpdateManager updateManager;
private SVGDocument doc;
public static final String SERVICES_NAME = "GroupServices";
public XMLDOMDisplayManager(Canvas c) {
super(c);
c.addSVGDocumentLoaderListener(getRenderingTreeListener());
}
private void putElement(Element e){
Element gServ = getGroupServices();
//if doc == null then gServ == null
if(gServ!=null){
gServ.appendChild(e);
}
}
private void putText(String txt,SVGOMPoint pointOnSVGMap){
Element gServ = getGroupServices();
//if doc == null then gServ == null
if(gServ!=null){
String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
Element textGraph = doc.createElementNS(svgNS, "text");
textGraph.setAttributeNS(null, "x", Double.toString(pointOnSVGMap.getX()));
textGraph.setAttributeNS(null, "y", Double.toString(pointOnSVGMap.getY()));
textGraph.setAttributeNS(null, "font-size", "4");
Text nodeText = doc.createTextNode(txt);
textGraph.appendChild(nodeText);
gServ.appendChild(textGraph);
}
}
/**
*
* @return
*/
public Element getGroupServices(){
Element gServ = null;
if(doc!=null){
gServ = doc.getElementById(SERVICES_NAME);
if(gServ==null){
return createGroupServices();
}
}
return gServ;
}
private Element createGroupServices(){
Element servGroup = null;
if(doc != null){
Element svgRoot = doc.getRootElement();
String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
servGroup = doc.createElementNS(svgNS, "g");
servGroup.setAttributeNS(null, "id", SERVICES_NAME);
svgRoot.appendChild(servGroup);
}
return servGroup;
}
@Override
public void removeLastServices(){
if(checkDisplaManager()){
updateManager.getUpdateRunnableQueue().invokeLater(new Runnable() {
@Override
public void run(){
if(doc!=null){
Element gTekst = doc.getElementById(SERVICES_NAME);
if(gTekst!=null){
Node nl = doc.getRootElement().removeChild(gTekst);
System.err.println("Removed "+nl.getChildNodes().getLength()+" last services");
}else{
System.err.println("Group "+SERVICES_NAME+" does not exist !");
}
}
}
});
}
}
/**
*
* @return
*/
public SVGDocumentLoaderListener getRenderingTreeListener(){
return new LoaderTreeListener();
}
/**
*
* @param object
* @param point declarate only when object is String
*/
@Override
public void putObject(final Object object, final SVGOMPoint point) {
if(checkDisplaManager()){
updateManager.getUpdateRunnableQueue().invokeLater(new Runnable() {
@Override
public void run(){
if(object instanceof String){
putText((String)object, point);
}else if(object instanceof Element){
putElement((Element)object);
}
}
});
}
}
/**
*
* @return
*/
public boolean checkDisplaManager(){
if(updateManager==null){
updateManager = can.getUpdateManager();
}
return updateManager!=null;
}
@Override
public void putObject(final Vector object) {
if(checkDisplaManager()){
updateManager.getUpdateRunnableQueue().invokeLater(new Runnable() {
@Override
public void run(){
for (Object e : object) {
if(e instanceof Element)
putElement((Element)e);
}
}
});
}
}
@Override
public void updateService(Object element) {
//throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Object createObject(ServiceCore sc) {
String xlinkNS = SVGConstants.XLINK_NAMESPACE_URI;
String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
String groupName = sc.getServiceDescription().getCategory().getName();
String serviceName = sc.getServiceDescription().getServiceName();
String serviceDesc = sc.getServiceDescription().getAdditionaInfo();
String serviceStreet = sc.getServiceDescription().getServiceStreet();
String serviceNumber = sc.getServiceDescription().getServiceNumber();
serviceDesc+="<br>Street :<b>"+serviceStreet+" "+serviceNumber+"</b>";
Element service = NaviRootWindow.getSVGCanvas().getSVGDocument().createElementNS(svgNS, "image");
service.setAttributeNS(null, "x", String.valueOf(sc.getServiceAttributes().getX()));
service.setAttributeNS(null, "y", String.valueOf(sc.getServiceAttributes().getY()));
service.setAttributeNS(null, "width", ""+SVGConfiguration.getInformationIconSize());
service.setAttributeNS(null, "height",""+SVGConfiguration.getInformationIconSize());
service.setAttributeNS(null, "groupName", groupName);
service.setAttributeNS(null, "serviceName", serviceName);
service.setAttributeNS(null, "serviceDesc", serviceDesc);
service.setAttributeNS(null, "xmlns:xlink", "http://www.w3.org/1999/xlink");
String path = "";
try {
URL url = NaviRootWindow.createNavigationIconPath("test/"+groupName,"png");
if(url != null){
path = url.toURI().toString();
}
} catch (URISyntaxException ex) {}
service.setAttributeNS(xlinkNS, SVGConstants.XLINK_HREF_QNAME,path);
EventTarget evT = (EventTarget)service;
evT.addEventListener("click", new EventListener() {
@Override
public void handleEvent(Event evt) {
SVGElement element = (SVGElement) evt.getTarget();
DOMMouseEvent elEvt = (DOMMouseEvent)evt;
int xxx = elEvt.getClientX();
int yyy = elEvt.getClientY();
System.out.println("x: "+xxx+" y: "+yyy+" Element: "+element.getNodeName());
}
}, false);
return service;
}
@Override
public Vector createObject(Vector<ServiceCore> vsc) {
Vector<Element> vele = new Vector<Element>();
for (ServiceCore sc : vsc) {
vele.add((Element)createObject(sc));
}
return vele;
}
@Override
public Object getObject(long oid) {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
public Vector getAllObjects() {
throw new UnsupportedOperationException("Not supported yet.");
}
protected class LoaderTreeListener implements SVGDocumentLoaderListener{
@Override
public void documentLoadingStarted(SVGDocumentLoaderEvent e) {
}
@Override
public void documentLoadingCompleted(SVGDocumentLoaderEvent e) {
doc = e.getSVGDocument();
}
@Override
public void documentLoadingCancelled(SVGDocumentLoaderEvent e) {
}
@Override
public void documentLoadingFailed(SVGDocumentLoaderEvent e) {
}
}
}