Tuesday, 11 October 2016

XML : Problems in implementing GUI for editing XML Document using DOM with Java

I need a GUI to manipulate two XML docs with Drag and Drop. The XML docs need to appear in tree structure next to each other so you can easily drag elements from one doc to another. One tree is static, and the other can be changed, example: nodes can be added or deleted. Until now the program reads the xml docs with DOM and displays them with JTrees. What I cannot do now is changing the xml doc itself and updating the JTree after the change. Im using transferable to transfer data. To do this i believe I have to adapt the insertNodeInto function: I have made some short comments in the code.

Any help is appreciated

  import java.util.LinkedList;  import javax.swing.event.TreeModelEvent;  import javax.swing.event.TreeModelListener;  import javax.swing.tree.DefaultTreeModel;  import javax.swing.tree.TreePath;  import org.w3c.dom.Document;  import org.w3c.dom.Node;    public class DomToTreeModel extends DefaultTreeModel {    private static final long serialVersionUID = 1L;    private LinkedList<TreeModelListener> listenerList = new LinkedList<TreeModelListener>();    static String[] treeElementsNames = {      "amtltext",      "gesetz",      "amttitel",      "amtgl",      "artikel",      "paragr",      "anlage",      "vorbem",     };    private static Document document;    public DomToTreeModel(AdapterNode root, Document document){      super((AdapterNode) root);      DomToTreeModel.document=document;     }    @Override  public Object getChild(Object node, int index) {      AdapterNode theNode = (AdapterNode) node;      return theNode.child(index);  }    @Override  public int getChildCount(Object node) {      AdapterNode theNode = (AdapterNode) node;      return theNode.childCount();  }    @Override  public int getIndexOfChild(Object parent, Object child) {      AdapterNode theParent = (AdapterNode) parent;      AdapterNode theChild = (AdapterNode) child;      return theParent.index(theChild);  }    @Override  public Object getRoot() {          return new AdapterNode(document);  }    @Override  public boolean isLeaf(Object node) {      AdapterNode theNode = (AdapterNode) node;        for (int i = 0; i < treeElementsNames.length; i++){          if( ((Node) theNode.node).getNodeType() == 1 && treeElementsNames[i].equals(((Node) theNode.node).getNodeValue()) ){     theNode.domNode).getNodeValue()) + " nodeValue " + ((Node) theNode.domNode).getNodeValue());              return true;          }      }      return false;  }    @Override  public void addTreeModelListener(TreeModelListener listener) {      // TODO Auto-generated method stub      if( listener != null && ! listenerList.contains(listener)){          listenerList.add(listener);      }  }    @Override  public void valueForPathChanged(TreePath path, Object newValue) {   //dont know how to use this??  }    @Override  public void removeTreeModelListener(TreeModelListener listener) {      if(listener != null){          listenerList.remove(listener);      }  }      public void nodeStructureChanged(AdapterNode draggedNodeParent){      System.out.println("nodestruchanged ");      if(draggedNodeParent != null){          TreeModelEvent e = new TreeModelEvent(this, getPathToRoot(draggedNodeParent),null,null);          firetreeStructureChanged(e);      }  }    protected AdapterNode[] getPathToRoot(AdapterNode node, int depth){      AdapterNode[] retNodes;      if(node == null){          if( depth == 0){                return null;          }          else              retNodes = new AdapterNode[depth];      }      else{          depth++;          if(node == this.getRoot()){              retNodes = new AdapterNode[depth];          }          else{              AdapterNode parentNode = (AdapterNode) node.node.getParentNode();              retNodes = getPathToRoot(parentNode, depth);          }          retNodes[retNodes.length - depth] = node;      }      return retNodes;  }    public void firetreeNodesChanged(TreeModelEvent e) {      for(int i = 0; i < listenerList.size(); i++ ){          if(listenerList.get(i) != null){              TreeModelListener listener = (TreeModelListener) listenerList.get(i);              listener.treeNodesChanged(e);          }      }    }      public void firetreeNodesInserted(TreeModelEvent e) {      for(int i = 0; i < listenerList.size(); i++ ){          if(listenerList.get(i) != null){              TreeModelListener listener = (TreeModelListener) listenerList.get(i);              listener.treeNodesInserted(e);          }      }  }      public void firetreeNodesRemoved(TreeModelEvent e) {      for(int i = 0; i < listenerList.size(); i++ ){          if(listenerList.get(i) != null){              TreeModelListener listener = (TreeModelListener) listenerList.get(i);              listener.treeNodesRemoved(e);          }      }  }      public void firetreeStructureChanged(TreeModelEvent e) {      for(int i = 0; i < listenerList.size(); i++ ){          if(listenerList.get(i) != null){              TreeModelListener listener = (TreeModelListener) listenerList.get(i);              listener.treeStructureChanged(e);          }      }  }  public void insertNodeInto(AdapterNode draggedNode, AdapterNode newParentNode) {        AdapterNode parent = (AdapterNode) newParentNode.getParent();      parent.insert(draggedNode, parent.index(newParentNode) + 1);      //do i need to use the document to manipulate the XML?  }  }    

Fuction executeDrop calls the change in treeModel:

  import java.awt.*;  import javax.swing.tree.*;  import domBuild.AdapterNode;  import java.awt.dnd.*;  import domBuild.DomToTreeModel;    public class DefaultTreeTransferHandler extends AbstractTreeTransferHandler{  public DefaultTreeTransferHandler(DNDTree tree, int action){      super(tree, action, true);  }    /*Conditions on performing an action   * returns whether the action can be performed or not*/  public boolean canPerformAction(DNDTree target, AdapterNode draggedNode, int action, Point location){      TreePath currentSelection = target.getPathForLocation(location.x, location.y);   target.getSelectionPath().getLastPathComponent();      if(currentSelection == null){          target.setSelectionPath(null);          return false;      }      else if(currentSelection.getParentPath() == null){          target.setSelectionPath(null);          return false;      }      target.setSelectionPath(currentSelection);      if(action == DnDConstants.ACTION_COPY){          return (true);      }      else          if(action == DnDConstants.ACTION_MOVE){                           TreePath parentPath = currentSelection.getParentPath();              if(draggedNode.getNode().getParentNode().equals(null) || parentNode.getNode().isSameNode(draggedNode.getNode().getParentNode()) ){                  return(false);              }              else{                  return (true);              }          }          else{              return (false);          }  }      public boolean executeDrop(DNDTree target, AdapterNode draggedNode, AdapterNode newParentNode, int action) {        if (action == DnDConstants.ACTION_MOVE){        draggedNode.getNode().getParentNode().removeChild(draggedNode.node);          ((DomToTreeModel)target.getModel()).insertNodeInto(draggedNode, newParentNode, newParentNode.childCount());          TreePath treePath = new TreePath(draggedNode.getParent());          target.scrollPathToVisible(treePath);          target.setSelectionPath(treePath);          return true;      }      return false;  }    

}

If more information is needed about the other classes please comment. Thank you a loooot!!!

No comments:

Post a Comment