%line | %branch | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
org.apache.commons.jelly.tags.swing.GbcTag |
|
|
1 | /* |
|
2 | * Copyright 2002,2004 The Apache Software Foundation. |
|
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 org.apache.commons.jelly.tags.swing; |
|
17 | ||
18 | import java.awt.Component; |
|
19 | import java.awt.GridBagConstraints; |
|
20 | import java.awt.Insets; |
|
21 | import java.util.Map; |
|
22 | ||
23 | import org.apache.commons.jelly.JellyTagException; |
|
24 | import org.apache.commons.jelly.MissingAttributeException; |
|
25 | import org.apache.commons.jelly.Tag; |
|
26 | import org.apache.commons.jelly.XMLOutput; |
|
27 | import org.apache.commons.jelly.tags.core.UseBeanTag; |
|
28 | import org.apache.commons.jelly.tags.swing.impl.GridBagConstraintBean; |
|
29 | import org.apache.commons.lang.StringUtils; |
|
30 | ||
31 | /** |
|
32 | * This class represents a {@link GridBagConstraints} constraints as passed in |
|
33 | * the second argument of {@link Container#add(Component,Object)}. |
|
34 | * It supports inheritence between such tags in the following fashion: |
|
35 | * <ul> |
|
36 | * <li>either using a <code>basedOn</code> attribute which is |
|
37 | * supposed to provide a reference to another {@link GbcTag}.</li> |
|
38 | * <li>either using a parent {@link GbcTag}.</li> |
|
39 | * </ul> |
|
40 | * The first version takes precedence. |
|
41 | * A Grid-bag-constraint inherits from another simply by setting other attributes |
|
42 | * as is done in {@link GridBagConstraintBean#setBasedOn}. |
|
43 | * <p> |
|
44 | * In essence, it looks really like nothing else than a bean-class... |
|
45 | * with {@link #getConstraints}. |
|
46 | * Probably a shorter java-source is do-able. |
|
47 | * <p> |
|
48 | * TODO: this class should probably be extended with special treatment for dimensions |
|
49 | * using the converter package. |
|
50 | * |
|
51 | * @author <a href="mailto:paul@activemath.org">Paul Libbrecht</a> |
|
52 | * @version $Revision: 155420 $ |
|
53 | */ |
|
54 | 0 | public class GbcTag extends UseBeanTag implements ContainerTag { |
55 | ||
56 | public GridBagConstraints getConstraints() { |
|
57 | 0 | return (GridBagConstraints) getBean(); |
58 | } |
|
59 | ||
60 | ||
61 | // ContainerTag interface |
|
62 | //------------------------------------------------------------------------- |
|
63 | ||
64 | /** |
|
65 | * Adds a child component to this parent |
|
66 | * @param component the child to add |
|
67 | * @param constraints the constraints to use |
|
68 | * @TODO constraints looks like it's ignored |
|
69 | */ |
|
70 | public void addChild(Component component, Object constraints) throws JellyTagException { |
|
71 | 0 | GridBagLayoutTag tag = (GridBagLayoutTag) findAncestorWithClass( GridBagLayoutTag.class ); |
72 | 0 | if (tag == null) { |
73 | 0 | throw new JellyTagException( "this tag must be nested within a <gridBagLayout> tag" ); |
74 | } |
|
75 | 0 | tag.addLayoutComponent(component, getConstraints()); |
76 | 0 | } |
77 | ||
78 | // Implementation methods |
|
79 | //------------------------------------------------------------------------- |
|
80 | ||
81 | /** |
|
82 | * A class may be specified otherwise the Factory will be used. |
|
83 | * @param classObject the object to be converted |
|
84 | */ |
|
85 | protected Class convertToClass(Object classObject) |
|
86 | throws MissingAttributeException, ClassNotFoundException { |
|
87 | 0 | if (classObject == null) { |
88 | 0 | return null; |
89 | } |
|
90 | else { |
|
91 | 0 | return super.convertToClass(classObject); |
92 | } |
|
93 | } |
|
94 | ||
95 | /** |
|
96 | * A class may be specified otherwise the Factory will be used. |
|
97 | */ |
|
98 | protected Object newInstance(Class theClass, Map attributes, XMLOutput output) throws JellyTagException { |
|
99 | 0 | if (theClass != null ) { |
100 | try { |
|
101 | 0 | return theClass.newInstance(); |
102 | 0 | } catch (IllegalAccessException e) { |
103 | 0 | throw new JellyTagException(e); |
104 | 0 | } catch (InstantiationException e) { |
105 | 0 | throw new JellyTagException(e); |
106 | } |
|
107 | } |
|
108 | else { |
|
109 | 0 | return new GridBagConstraintBean(); |
110 | } |
|
111 | } |
|
112 | ||
113 | protected void setBeanProperties(Object bean, Map attributes) |
|
114 | throws JellyTagException { |
|
115 | ||
116 | 0 | Insets ins = null; |
117 | 0 | Object insetString = attributes.get("insets"); |
118 | 0 | if (insetString instanceof String) { |
119 | 0 | attributes.remove("insets"); |
120 | ||
121 | ||
122 | 0 | String[] parts = StringUtils.split((String) insetString, ","); |
123 | ||
124 | 0 | if (parts.length != 4) { |
125 | 0 | throw new JellyTagException( |
126 | "insets must be specified" |
|
127 | + "as four comma - separated integers."); |
|
128 | } |
|
129 | ||
130 | 0 | ins = |
131 | new Insets( |
|
132 | Integer.parseInt(parts[0].trim()), |
|
133 | Integer.parseInt(parts[1].trim()), |
|
134 | Integer.parseInt(parts[2].trim()), |
|
135 | Integer.parseInt(parts[3].trim())); |
|
136 | } |
|
137 | ||
138 | 0 | super.setBeanProperties(bean, attributes); |
139 | ||
140 | // set basedOn info of the bean if we have a parent gbc tag |
|
141 | // in the context of the closest gridbaglayout tag |
|
142 | ||
143 | 0 | if (bean instanceof GridBagConstraintBean) { |
144 | 0 | GridBagConstraintBean gbc = (GridBagConstraintBean) bean; |
145 | ||
146 | 0 | if (ins != null) { |
147 | 0 | gbc.setInsets(ins); |
148 | } |
|
149 | ||
150 | 0 | GridBagLayoutTag parentLayoutTag = |
151 | (GridBagLayoutTag) (findAncestorWithClass(GridBagLayoutTag |
|
152 | .class)); |
|
153 | 0 | if (parentLayoutTag != null) { |
154 | 0 | GbcTag parentGbcTag = |
155 | (GbcTag) (findAncestorWithClass(getParent(), |
|
156 | GbcTag.class, |
|
157 | parentLayoutTag)); |
|
158 | 0 | if (parentGbcTag != null) { |
159 | 0 | GridBagConstraints parentGbc = |
160 | parentGbcTag.getConstraints(); |
|
161 | ||
162 | 0 | if (parentGbc != null |
163 | && parentGbc instanceof GridBagConstraintBean) { |
|
164 | 0 | gbc.setBasedOn((GridBagConstraintBean) parentGbc); |
165 | 0 | if (insetString == null) { |
166 | 0 | gbc.setInsets(parentGbc.insets); |
167 | } |
|
168 | } |
|
169 | } |
|
170 | } |
|
171 | } |
|
172 | 0 | } |
173 | ||
174 | public static Tag findAncestorWithClass( |
|
175 | Tag from, |
|
176 | Class tagClass, |
|
177 | Tag parent) { |
|
178 | 0 | while (from != null && from != parent) { |
179 | 0 | if (tagClass.isInstance(from)) { |
180 | 0 | return from; |
181 | } |
|
182 | 0 | from = from.getParent(); |
183 | } |
|
184 | 0 | return null; |
185 | } |
|
186 | } |
|
187 |
This report is generated by jcoverage, Maven and Maven JCoverage Plugin. |