/* * Copyright 2000-2009 JetBrains s.r.o. * * 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 com.intellij.uiDesigner; import com.intellij.openapi.util.text.StringUtil; import com.intellij.uiDesigner.lw.ColorDescriptor; import com.intellij.uiDesigner.lw.FontDescriptor; import com.intellij.uiDesigner.lw.StringDescriptor; import com.intellij.xml.util.XmlStringUtil; import org.jdom.Attribute; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import java.awt.*; import java.util.Stack; /** * This is utility for serialization of component hierarchy. * * @author Anton Katilin * @author Vladimir Kondratyev */ public final class XmlWriter{ private static final int INDENT = 2; private final Stack<String> myElementNames; private final Stack<Boolean> myElementHasBody; @NonNls private final StringBuffer myBuffer; public XmlWriter(){ myElementNames = new Stack<>(); myElementHasBody = new Stack<>(); myBuffer = new StringBuffer(); myBuffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); } public String getText(){ return myBuffer.toString(); } public void writeDimension(final Dimension dimension, @NonNls final String elementName) { if (dimension.width == -1 && dimension.height == -1) { return; } startElement(elementName); try { addAttribute("width", dimension.width); addAttribute("height", dimension.height); } finally { endElement(); } } public void startElement(@NonNls final String elementName){ startElement(elementName, null); } public void startElement(@NonNls final String elementName, final String namespace){ if (myElementNames.size() > 0) { if(!myElementHasBody.peek().booleanValue()){ myBuffer.append(">\n"); } myElementHasBody.set(myElementHasBody.size()-1,Boolean.TRUE); } writeSpaces(myElementNames.size()*INDENT); myBuffer.append("<").append(elementName); if (namespace != null) { myBuffer.append(" xmlns=\"").append(namespace).append('"'); } myElementNames.push(elementName); myElementHasBody.push(Boolean.FALSE); } public void endElement() { final String elementName = myElementNames.peek(); final boolean hasBody = myElementHasBody.peek().booleanValue(); myElementNames.pop(); myElementHasBody.pop(); if (hasBody) { writeSpaces(myElementNames.size()*INDENT); myBuffer.append("</").append(elementName).append(">\n"); } else { myBuffer.append("/>\n"); } } /** * Helper method */ private void addAttributeImpl(final String name,final String value){ myBuffer.append(' ').append(name).append("=\"").append(value).append('"'); } /** * Helper method */ public void addAttribute(@NonNls final String name, final String value){ addAttributeImpl(name, StringUtil.convertLineSeparators(XmlStringUtil.escapeString(value, true, false))); } /** * Helper method */ public void addAttribute(@NonNls final String name, final int value){ addAttributeImpl(name, Integer.toString(value)); } /** * Helper method */ public void addAttribute(@NonNls final String name, final boolean value){ addAttributeImpl(name, Boolean.toString(value)); } public void addAttribute(@NonNls final String name, final Double value){ addAttributeImpl(name, Double.toString(value)); } public void writeElement(final Element element){ startElement(element.getName()); try { for (final Object o1 : element.getAttributes()) { final Attribute attribute = (Attribute)o1; addAttribute(attribute.getName(), attribute.getValue()); } for (final Object o : element.getChildren()) { final Element child = (Element)o; writeElement(child); } } finally { endElement(); } } /** * Helper method */ private void writeSpaces(final int count){ for (int i=0; i < count; i++) { myBuffer.append(' '); } } public void writeStringDescriptor(final StringDescriptor descriptor, final String valueAttr, final String bundleAttr, final String keyAttr) { if(descriptor.getValue() != null){ // direct value addAttribute(valueAttr, descriptor.getValue()); if (descriptor.isNoI18n()) { addAttribute(UIFormXmlConstants.ATTRIBUTE_NOI18N, Boolean.TRUE.toString()); } } else{ // via resource bundle addAttribute(bundleAttr, descriptor.getBundleName()); addAttribute(keyAttr, descriptor.getKey()); } } public void writeColorDescriptor(final ColorDescriptor value) { Color color = value.getColor(); if (color != null) { addAttribute(UIFormXmlConstants.ATTRIBUTE_COLOR, color.getRGB()); } else if (value.getSwingColor() != null) { addAttribute(UIFormXmlConstants.ATTRIBUTE_SWING_COLOR, value.getSwingColor()); } else if (value.getSystemColor() != null) { addAttribute(UIFormXmlConstants.ATTRIBUTE_SYSTEM_COLOR, value.getSystemColor()); } else if (value.getAWTColor() != null) { addAttribute(UIFormXmlConstants.ATTRIBUTE_AWT_COLOR, value.getAWTColor()); } } public void writeFontDescriptor(final FontDescriptor value) { if (value.getSwingFont() != null) { addAttribute(UIFormXmlConstants.ATTRIBUTE_SWING_FONT, value.getSwingFont()); } else { if (value.getFontName() != null) { addAttribute(UIFormXmlConstants.ATTRIBUTE_NAME, value.getFontName()); } if (value.getFontSize() >= 0) { addAttribute(UIFormXmlConstants.ATTRIBUTE_SIZE, value.getFontSize()); } if (value.getFontStyle() >= 0) { addAttribute(UIFormXmlConstants.ATTRIBUTE_STYLE, value.getFontStyle()); } } } public void writeInsets(final Insets value) { addAttribute(UIFormXmlConstants.ATTRIBUTE_TOP, value.top); addAttribute(UIFormXmlConstants.ATTRIBUTE_LEFT, value.left); addAttribute(UIFormXmlConstants.ATTRIBUTE_BOTTOM, value.bottom); addAttribute(UIFormXmlConstants.ATTRIBUTE_RIGHT, value.right); } }