/* * Copyright 2003-2010 Tufts University Licensed under the * Educational Community License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may * obtain a copy of the License at * * http://www.osedu.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an "AS IS" * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing * permissions and limitations under the License. */ /* * XMLView.java * * Created on June 11, 2003, 4:49 PM */ package tufts.vue.action; /** * * @author Jay Briedis */ import javax.swing.*; import java.awt.event.*; import java.io.*; import java.util.regex.*; import java.util.ArrayList; import java.awt.Font; import java.awt.Color; import javax.swing.text.StyledDocument; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.Transformer; import org.w3c.dom.Document; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import tufts.vue.*; public class XMLView extends AbstractAction{ private static String fileName = "default.xml"; private XMLTextPane xmlArea = null; private StyledDocument doc = null; private ArrayList braces = null; public XMLView() { } public XMLView(String label) { super(label); putValue(Action.SHORT_DESCRIPTION,label); } class XMLTextPane extends JTextPane implements Scrollable{ public boolean getScrollableTracksViewportWidth() { return false; } } public void actionPerformed(ActionEvent e) { System.out.println("Action["+e.getActionCommand()+"] invoked..."); if(VUE.getTabbedPane().getSelectedComponent() instanceof MapViewer) { ActionUtil.marshallMap(new File(fileName)); //create html view from default.xml File xmlFile = new File(fileName); xmlArea = new XMLTextPane(); doc = (StyledDocument)xmlArea.getDocument(); xmlArea.setText(""); xmlArea.setEditable(false); xmlArea.setFont(new Font("SansSerif", Font.PLAIN, 14)); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); org.w3c.dom.Document xmlDoc = null; try{ DocumentBuilder documentBuilder = factory.newDocumentBuilder(); xmlDoc = documentBuilder.parse(fileName); }catch(Exception ex){ System.out.println("problem creating dom object from xml file: "+ex); } try { xmlArea.setText(docToString(xmlDoc)); } catch (TransformerException te){ System.out.println("transformer exception: "+te); } JScrollPane pane = new JScrollPane(xmlArea); String mapName = VUE.getActiveMap().getLabel(); JTabbedPane tabPane = VUE.getTabbedPane(); for(int i = 0; i < tabPane.getComponentCount(); i++){ if(tabPane.getTitleAt(i).equals(mapName +".xml")){ VUE.getTabbedPane().setSelectedIndex(i); return; } } VUE.getTabbedPane().addTab(mapName+".xml", pane); VUE.getTabbedPane().setSelectedIndex(VUE.getTabbedPane().getComponentCount()-1); //setAttributes(); pane.repaint(); System.out.println("Action["+e.getActionCommand()+"] completed."); } } /* private void setAttributes(){ SimpleAttributeSet att = new SimpleAttributeSet(); StyleConstants.setForeground(att, Color.blue); for(int i = 0; i < braces.size(); i++) doc.setCharacterAttributes(Integer.parseInt((String)braces.get(i)), 1, att, false); }*/ private String docToString(org.w3c.dom.Document xmlDoc) throws TransformerException{ DOMSource domSource=new DOMSource(xmlDoc); StringWriter stringWriter = new StringWriter(); StreamResult result = new StreamResult(stringWriter); TransformerFactory factory = TransformerFactory.newInstance(); Transformer transformer = factory.newTransformer(); transformer.transform(domSource, result); Pattern p = Pattern.compile("</|<|>"); String lookUp = stringWriter.toString(); Matcher m = p.matcher(lookUp); StringBuffer sb = new StringBuffer(); int indent = -2; //braces = new ArrayList(); while(m.find()){ String group = m.group(); String tab = ""; String tabInd = " "; if(group.equals("</")){ for(int i = 0; i < indent; i++) tab += tabInd; indent--; m.appendReplacement(sb, "\n" + tab + "</"); } else if(group.equals("<")){ indent++; for(int i = 0; i < indent; i++) tab += tabInd; m.appendReplacement(sb, "\n" + tab + "<"); } else if(group.equals(">")){ indent++; for(int i = 0; i < indent; i++) tab += tabInd; if(m.end() < lookUp.length()){ Pattern pat = Pattern.compile("\\w|#"); Matcher match = pat.matcher(lookUp.substring(m.end(), m.end()+1)); boolean b = match.matches(); if(b) { m.appendReplacement(sb, ">\n" + tab); } else{ m.appendReplacement(sb, ">"); }indent--; } } else if(group.equals(">#")){ indent++; for(int i = 0; i < indent; i++) tab += tabInd; m.appendReplacement(sb, ">\n" + tab + " #" ); indent--; } else if(group.equals(">\\w")){ indent++; for(int i = 0; i < indent; i++) tab += tabInd; m.appendReplacement(sb, ">\n" + tab + " $1" ); indent--; } } m.appendTail(sb); return sb.toString(); } }