jsyntaxpane.actions.XmlPrettifyAction Maven / Gradle / Ivy
/*
* Copyright 2008 Ayman Al-Sairafi [email protected]
*
* Licensed under the Apache 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.apache.org/licenses/LICENSE-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.
*/
package jsyntaxpane.actions;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import javax.swing.text.JTextComponent;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import jsyntaxpane.SyntaxDocument;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
/**
* Attempt to prettify an XML document.
* @author Ayman Al-Sairafi
*/
public class XmlPrettifyAction extends DefaultSyntaxAction {
public XmlPrettifyAction() {
super("XML_PRETTIFY");
}
@Override
public void actionPerformed(ActionEvent e) {
if (transformer == null) {
return;
}
JTextComponent target = getTextComponent(e);
try {
SyntaxDocument sdoc = ActionUtils.getSyntaxDocument(target);
StringWriter out = new StringWriter(sdoc.getLength());
StringReader reader = new StringReader(target.getText());
InputSource src = new InputSource(reader);
Document doc = getDocBuilder().parse(src);
//Setup indenting to "pretty print"
getTransformer().transform(new DOMSource(doc), new StreamResult(out));
target.setText(out.toString());
} catch (SAXParseException ex) {
showErrorMessage(target,
String.format("XML error: %s\nat(%d, %d)",
ex.getMessage(), ex.getLineNumber(), ex.getColumnNumber()));
ActionUtils.setCaretPosition(target, ex.getLineNumber(), ex.getColumnNumber() - 1);
} catch (TransformerException ex) {
showErrorMessage(target, ex.getMessageAndLocation());
} catch (SAXException ex) {
showErrorMessage(target, ex.getLocalizedMessage());
} catch (IOException ex) {
showErrorMessage(target, ex.getLocalizedMessage());
}
}
static Transformer transformer;
static DocumentBuilderFactory docBuilderFactory;
static DocumentBuilder docBuilder;
private static void showErrorMessage(JTextComponent text, String msg) {
Component parent = SwingUtilities.getWindowAncestor(text);
JOptionPane.showMessageDialog(parent, msg, "JsyntaxPAne XML", JOptionPane.ERROR_MESSAGE);
}
public static Transformer getTransformer() {
if (transformer == null) {
TransformerFactory tfactory = TransformerFactory.newInstance();
try {
transformer = tfactory.newTransformer();
} catch (TransformerConfigurationException ex) {
throw new IllegalArgumentException("Unable to create transformer. ", ex);
}
}
return transformer;
}
public void setIndent(String text) {
getTransformer().setOutputProperty(OutputKeys.INDENT, text);
}
public void setStandAlone(String text) {
getTransformer().setOutputProperty(OutputKeys.STANDALONE, text);
}
public void setSOmitDeclaration(String text) {
getTransformer().setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, text);
}
public void setIndentAmount(String text) {
getTransformer().setOutputProperty("{http://xml.apache.org/xslt}indent-amount", text);
}
public void setIgnoreComments(String ic) {
getDocBuilderFactory().setIgnoringComments(Boolean.parseBoolean(ic));
}
public void setIgnoreWhiteSpace(String value) {
getDocBuilderFactory().setIgnoringElementContentWhitespace(Boolean.parseBoolean(value));
}
public static DocumentBuilderFactory getDocBuilderFactory() {
if (docBuilderFactory == null) {
docBuilderFactory = DocumentBuilderFactory.newInstance();
}
return docBuilderFactory;
}
public DocumentBuilder getDocBuilder() {
if (docBuilder == null) {
try {
docBuilder = getDocBuilderFactory().newDocumentBuilder();
} catch (ParserConfigurationException ex) {
throw new IllegalArgumentException("Unable to create document builder", ex);
}
}
return docBuilder;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy