e8e84df19014b8139f913005475ccc6e76b1daac
[idea/community.git] / java / compiler / forms-compiler / src / com / intellij / uiDesigner / lw / LwXmlReader.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.uiDesigner.lw;
17
18 import com.intellij.uiDesigner.UIFormXmlConstants;
19 import org.jdom.Attribute;
20 import org.jdom.Element;
21
22 import java.awt.*;
23 import java.lang.reflect.Method;
24
25 public final class LwXmlReader {
26   private LwXmlReader() {
27   }
28
29   /**
30    * @return can be <code>null</code>.
31    */
32   public static Element getChild(final Element element, final String childName) {
33     return element.getChild(childName, element.getNamespace());
34   }
35
36   /**
37    * @return never <code>null</code>.
38    */
39   public static Element getRequiredChild(final Element element, final String childName) {
40     final Element child = getChild(element, childName);
41     if(child == null){
42       throw new IllegalArgumentException("subtag '" + childName + "' is required: "+element);
43     }
44     return child;
45   }
46
47   /**
48    * @return <code>null</code> or trimmed attribute value.
49    */
50   public static String getString(final Element element, final String attributeName){
51     final String value = element.getAttributeValue(attributeName);
52     return value != null ? value.trim() : null;
53   }
54
55   /**
56    * @return never <code>null</code> trimmed attribute value.
57    */
58   public static String getRequiredString(final Element element, final String attributeName) {
59     final String value = getString(element, attributeName);
60     if(value != null){
61       return value;
62     }
63     else{
64       throw new IllegalArgumentException("attribute '" + attributeName + "' is required: "+element);
65     }
66   }
67
68   public static String getOptionalString(final Element element, final String attributeName, final String defaultValue) {
69     final String value = element.getAttributeValue(attributeName);
70     return value != null ? value.trim() : defaultValue;
71   }
72
73   public static int getRequiredInt(final Element element, final String attributeName) {
74     final String str = getRequiredString(element, attributeName);
75     try {
76       return Integer.parseInt(str);
77     }
78     catch (NumberFormatException e) {
79       throw new IllegalArgumentException("attribute '" + attributeName + "' is not a proper integer: " + str);
80     }
81   }
82
83   public static int getOptionalInt(final Element element, final String attributeName, final int defaultValue) {
84     final String str = element.getAttributeValue(attributeName);
85     if (str == null) {
86       return defaultValue;
87     }
88     try {
89       return Integer.parseInt(str);
90     }
91     catch (NumberFormatException e) {
92       throw new IllegalArgumentException("attribute '" + attributeName + "' is not a proper integer: " + str);
93     }
94   }
95
96   public static boolean getOptionalBoolean(final Element element, final String attributeName, final boolean defaultValue) {
97     final String str = element.getAttributeValue(attributeName);
98     if (str == null) {
99       return defaultValue;
100     }
101     return Boolean.valueOf(str).booleanValue();
102   }
103
104   public static double getRequiredDouble(final Element element, final String attributeName) {
105     final String str = getRequiredString(element, attributeName);
106     try {
107       return Double.parseDouble(str);
108     }
109     catch (NumberFormatException e) {
110       throw new IllegalArgumentException("attribute '" + attributeName + "' is not a proper double: " + str);
111     }
112   }
113
114   public static double getOptionalDouble(final Element element, final String attributeName, double defaultValue) {
115     final String str = element.getAttributeValue(attributeName);
116     if (str == null) {
117       return defaultValue;
118     }
119     try {
120       return Double.parseDouble(str);
121     }
122     catch (NumberFormatException e) {
123       throw new IllegalArgumentException("attribute '" + attributeName + "' is not a proper double: " + str);
124     }
125   }
126
127   public static float getRequiredFloat(final Element element, final String attributeName) {
128     final String str = getRequiredString(element, attributeName);
129     try {
130       return Float.parseFloat(str);
131     }
132     catch (NumberFormatException e) {
133       throw new IllegalArgumentException("attribute '" + attributeName + "' is not a proper float: " + str);
134     }
135   }
136
137   public static Object getRequiredPrimitiveTypeValue(final Element element, final String attributeName, final Class valueClass) {
138     final String str = getRequiredString(element, attributeName);
139     try {
140       final Method method = valueClass.getMethod("valueOf", new Class[]{String.class});
141       //noinspection unchecked
142       return method.invoke(null, new Object[]{str});
143     }
144     catch (NumberFormatException e) {
145       throw new IllegalArgumentException("attribute '" + attributeName + "' is not a proper float: " + str);
146     }
147     catch (Exception e) {
148       throw new RuntimeException(e);
149     }
150   }
151
152   public static StringDescriptor getStringDescriptor(final Element element, final String valueAttr,
153                                                      final String bundleAttr, final String keyAttr) {
154     final String title = element.getAttributeValue(valueAttr);
155     if (title != null) {
156       StringDescriptor descriptor = StringDescriptor.create(title);
157       descriptor.setNoI18n(getOptionalBoolean(element, UIFormXmlConstants.ATTRIBUTE_NOI18N, false));
158       return descriptor;
159     }
160     else {
161       final String bundle = element.getAttributeValue(bundleAttr);
162       if (bundle != null) {
163         final String key = getRequiredString(element, keyAttr);
164         return new StringDescriptor(bundle, key);
165       }
166     }
167
168     return null;
169   }
170
171   public static FontDescriptor getFontDescriptor(final Element element) {
172     String swingFont = element.getAttributeValue(UIFormXmlConstants.ATTRIBUTE_SWING_FONT);
173     if (swingFont != null) {
174       return FontDescriptor.fromSwingFont(swingFont);
175     }
176
177     String fontName = element.getAttributeValue(UIFormXmlConstants.ATTRIBUTE_NAME);
178     int fontStyle = getOptionalInt(element, UIFormXmlConstants.ATTRIBUTE_STYLE, -1);
179     int fontSize = getOptionalInt(element, UIFormXmlConstants.ATTRIBUTE_SIZE, -1);
180     return new FontDescriptor(fontName, fontStyle, fontSize);
181   }
182
183   public static ColorDescriptor getColorDescriptor(final Element element) throws Exception {
184     Attribute attr = element.getAttribute(UIFormXmlConstants.ATTRIBUTE_COLOR);
185     if (attr != null) {
186       return new ColorDescriptor(new Color(attr.getIntValue()));
187     }
188     String swingColor = element.getAttributeValue(UIFormXmlConstants.ATTRIBUTE_SWING_COLOR);
189     if (swingColor != null) {
190       return ColorDescriptor.fromSwingColor(swingColor);
191     }
192     String systemColor = element.getAttributeValue(UIFormXmlConstants.ATTRIBUTE_SYSTEM_COLOR);
193     if (systemColor != null) {
194       return ColorDescriptor.fromSystemColor(systemColor);
195     }
196     String awtColor = element.getAttributeValue(UIFormXmlConstants.ATTRIBUTE_AWT_COLOR);
197     if (awtColor != null) {
198       return ColorDescriptor.fromAWTColor(awtColor);
199     }
200     return new ColorDescriptor(null);
201   }
202
203   public static ColorDescriptor getOptionalColorDescriptor(final Element element) {
204     if (element == null) return null;
205     try {
206       return getColorDescriptor(element);
207     }
208     catch(Exception ex) {
209       return null;
210     }
211   }
212
213   public static Insets readInsets(final Element element) {
214     final int top = getRequiredInt(element, UIFormXmlConstants.ATTRIBUTE_TOP);
215     final int left = getRequiredInt(element, UIFormXmlConstants.ATTRIBUTE_LEFT);
216     final int bottom = getRequiredInt(element, UIFormXmlConstants.ATTRIBUTE_BOTTOM);
217     final int right = getRequiredInt(element, UIFormXmlConstants.ATTRIBUTE_RIGHT);
218     return new Insets(top, left, bottom, right);
219   }
220 }