1 /*
2 * Copyright (c) 2003 Scott Howlett & Paul Libbrecht.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in
14 * the documentation and/or other materials provided with the
15 * distribution.
16 *
17 * 3. The end-user documentation included with the redistribution,
18 * if any, must include the following acknowledgment:
19 * "This product includes software developed by the Xwing
20 * Project ( http://xwing.sourceforge.net/ )."
21 * Alternately, this acknowledgment may appear in the software itself,
22 * if and wherever such third-party acknowledgments normally appear.
23 *
24 * 4. The name "Xwing" must not be used to endorse or promote products
25 * derived from this software without prior written permission. For
26 * written permission, please contact the project authors via
27 * the Xwing project site, http://xwing.sourceforge.net/ .
28 *
29 * 5. Products derived from this software may not be called "Xwing",
30 * nor may "Xwing" appear in their name, without prior written
31 * permission of the Xwing project.
32 *
33 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
34 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
35 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
36 * DISCLAIMED. IN NO EVENT SHALL THE XWING AUTHORS OR THE PROJECT
37 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
38 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
39 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
40 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
41 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
42 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
43 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
44 * SUCH DAMAGE.
45 *
46 * For more information on Xwing, please see
47 * < http://xwing.sourceforge.net/ >.
48 */
49
50 package net.sourceforge.xwing.jelly.tags.xwing;
51
52 import java.util.Map;
53
54 import javax.swing.DefaultListModel;
55 import javax.swing.JComboBox;
56 import javax.swing.ListModel;
57
58 import net.sourceforge.xwing.CachingSourceSink;
59 import net.sourceforge.xwing.dom.NodeListModel;
60 import net.sourceforge.xwing.dom.NodeTextListModel;
61 import net.sourceforge.xwing.dom.NodeTextSourceSink;
62 import net.sourceforge.xwing.swing.XComboBoxModel;
63
64 import org.apache.commons.jelly.JellyTagException;
65 import org.apache.commons.jelly.MissingAttributeException;
66 import org.apache.commons.jelly.XMLOutput;
67 import org.apache.commons.jelly.tags.swing.ComponentTag;
68 import org.apache.commons.lang.StringUtils;
69 import org.jaxen.dom.DOMXPath;
70 import org.w3c.dom.Node;
71
72 // PL: this one will need to find its right way for its documentation...
73 // as all Swing tags...
74 public class ComboBoxTag extends ComponentTag {
75
76 protected Object newInstance(
77 Class theClass,
78 Map attributes,
79 XMLOutput output)
80 throws JellyTagException {
81
82 try {
83
84 Node node = (Node) attributes.remove("node");
85 String path = (String) attributes.remove("path");
86 String editableStr = (String) attributes.remove("editable");
87 String choicesStr = (String) attributes.remove("choices");
88 Node choicesNode = (Node) attributes.remove("choicesNode");
89 String choicesPath = (String) attributes.remove("choicesPath");
90
91 if (node == null) {
92 throw new MissingAttributeException("node");
93 }
94
95 if ((choicesNode == null) != (choicesPath == null)) {
96 throw new JellyTagException(
97 "choicesNode and choicesPath "
98 + "must be specified together");
99 }
100
101 if ((choicesStr == null) == (choicesNode == null)) {
102 throw new JellyTagException(
103 "Must specify either choices "
104 + "or (choicesNode and choicesPath).");
105 }
106
107 boolean editable =
108 editableStr != null
109 && editableStr.toLowerCase().startsWith("t");
110
111 if (path != null) {
112 node = (Node) new DOMXPath(path).selectSingleNode(node);
113 }
114
115 XComboBoxModel cbm = null;
116 ListModel lm = null;
117
118 if (choicesStr != null) {
119 DefaultListModel dlm = new DefaultListModel();
120 String[] choices = StringUtils.split(choicesStr, ",");
121 for (int i = 0; i < choices.length; ++i) {
122 dlm.addElement(choices[i].trim());
123 }
124 lm = dlm;
125 } else {
126 lm =
127 new NodeTextListModel(
128 new NodeListModel(
129 choicesNode,
130 new DOMXPath(choicesPath)));
131 }
132 cbm =
133 new XComboBoxModel(
134 new CachingSourceSink(new NodeTextSourceSink(node)),
135 lm);
136
137 JComboBox cb = new JComboBox(cbm);
138 cb.setEditable(editable);
139
140 return cb;
141 } catch (JellyTagException exc) {
142 throw exc;
143 } catch (Exception exc) {
144 throw new JellyTagException(exc);
145 }
146 }
147 }
This page was automatically generated by Maven