1 /*
2  *
3  * Copyright (c) 2007, Oracle and/or its affiliates. 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  *   - Redistributions of source code must retain the above copyright
10  *     notice, this list of conditions and the following disclaimer.
11  *
12  *   - Redistributions in binary form must reproduce the above copyright
13  *     notice, this list of conditions and the following disclaimer in the
14  *     documentation and/or other materials provided with the distribution.
15  *
16  *   - Neither the name of Oracle nor the names of its
17  *     contributors may be used to endorse or promote products derived
18  *     from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
21  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 
34 import javax.swing.*;
35 import javax.swing.event.*;
36 import javax.swing.text.*;
37 import javax.swing.border.*;
38 import javax.swing.colorchooser.*;
39 import javax.swing.filechooser.*;
40 import javax.accessibility.*;
41 
42 import java.awt.*;
43 import java.awt.event.*;
44 import java.beans.*;
45 import java.util.*;
46 import java.io.*;
47 import java.applet.*;
48 import java.net.*;
49 
50 /**
51  * JComboBox Demo
52  *
53  * @author Jeff Dinkins
54  */
55 public class ComboBoxDemo extends DemoModule implements ActionListener {
56 
57     Face face;
58     JLabel faceLabel;
59 
60     JComboBox hairCB;
61     JComboBox eyesCB;
62     JComboBox mouthCB;
63 
64     JComboBox presetCB;
65 
66     Hashtable parts = new Hashtable();
67 
68     /**
69      * main method allows us to run as a standalone demo.
70      */
main(String[] args)71     public static void main(String[] args) {
72         ComboBoxDemo demo = new ComboBoxDemo(null);
73         demo.mainImpl();
74     }
75 
76     /**
77      * ComboBoxDemo Constructor
78      */
ComboBoxDemo(SwingSet2 swingset)79     public ComboBoxDemo(SwingSet2 swingset) {
80         // Set the title for this demo, and an icon used to represent this
81         // demo inside the SwingSet2 app.
82         super(swingset, "ComboBoxDemo", "toolbar/JComboBox.gif");
83 
84         createComboBoxDemo();
85     }
86 
createComboBoxDemo()87     public void createComboBoxDemo() {
88         JPanel demo = getDemoPanel();
89 
90         JPanel demoPanel = getDemoPanel();
91         demoPanel.setLayout(new BoxLayout(demoPanel, BoxLayout.Y_AXIS));
92 
93         JPanel innerPanel = new JPanel();
94         innerPanel.setLayout(new BoxLayout(innerPanel, BoxLayout.X_AXIS));
95 
96         demoPanel.add(Box.createRigidArea(VGAP20));
97         demoPanel.add(innerPanel);
98         demoPanel.add(Box.createRigidArea(VGAP20));
99 
100         innerPanel.add(Box.createRigidArea(HGAP20));
101 
102         // Create a panel to hold buttons
103         JPanel comboBoxPanel = new JPanel() {
104                 public Dimension getMaximumSize() {
105                     return new Dimension(getPreferredSize().width, super.getMaximumSize().height);
106                 }
107         };
108         comboBoxPanel.setLayout(new BoxLayout(comboBoxPanel, BoxLayout.Y_AXIS));
109 
110         comboBoxPanel.add(Box.createRigidArea(VGAP15));
111 
112         JLabel l = (JLabel) comboBoxPanel.add(new JLabel(getString("ComboBoxDemo.presets")));
113         l.setAlignmentX(JLabel.LEFT_ALIGNMENT);
114         presetCB = (JComboBox) comboBoxPanel.add(createPresetComboBox());
115         presetCB.setAlignmentX(JComboBox.LEFT_ALIGNMENT);
116         l.setLabelFor(presetCB);
117         comboBoxPanel.add(Box.createRigidArea(VGAP30));
118 
119         l = (JLabel) comboBoxPanel.add(new JLabel(getString("ComboBoxDemo.hair_description")));
120         l.setAlignmentX(JLabel.LEFT_ALIGNMENT);
121         hairCB = (JComboBox) comboBoxPanel.add(createHairComboBox());
122         hairCB.setAlignmentX(JComboBox.LEFT_ALIGNMENT);
123         l.setLabelFor(hairCB);
124         comboBoxPanel.add(Box.createRigidArea(VGAP15));
125 
126         l = (JLabel) comboBoxPanel.add(new JLabel(getString("ComboBoxDemo.eyes_description")));
127         l.setAlignmentX(JLabel.LEFT_ALIGNMENT);
128         eyesCB = (JComboBox) comboBoxPanel.add(createEyesComboBox());
129         eyesCB.setAlignmentX(JComboBox.LEFT_ALIGNMENT);
130         l.setLabelFor(eyesCB);
131         comboBoxPanel.add(Box.createRigidArea(VGAP15));
132 
133         l = (JLabel) comboBoxPanel.add(new JLabel(getString("ComboBoxDemo.mouth_description")));
134         l.setAlignmentX(JLabel.LEFT_ALIGNMENT);
135         mouthCB = (JComboBox) comboBoxPanel.add(createMouthComboBox());
136         mouthCB.setAlignmentX(JComboBox.LEFT_ALIGNMENT);
137         l.setLabelFor(mouthCB);
138         comboBoxPanel.add(Box.createRigidArea(VGAP15));
139 
140         // Fill up the remaining space
141         comboBoxPanel.add(new JPanel(new BorderLayout()));
142 
143         // Create and place the Face.
144 
145         face = new Face();
146         JPanel facePanel = new JPanel();
147         facePanel.setLayout(new BorderLayout());
148         facePanel.setBorder(new BevelBorder(BevelBorder.LOWERED));
149 
150         faceLabel = new JLabel(face);
151         facePanel.add(faceLabel, BorderLayout.CENTER);
152         // Indicate that the face panel is controlled by the hair, eyes and
153         // mouth combo boxes.
154         Object [] controlledByObjects = new Object[3];
155         controlledByObjects[0] = hairCB;
156         controlledByObjects[1] = eyesCB;
157         controlledByObjects[2] = mouthCB;
158         AccessibleRelation controlledByRelation =
159             new AccessibleRelation(AccessibleRelation.CONTROLLED_BY_PROPERTY,
160                                    controlledByObjects);
161         facePanel.getAccessibleContext().getAccessibleRelationSet().add(controlledByRelation);
162 
163         // Indicate that the hair, eyes and mouth combo boxes are controllers
164         // for the face panel.
165         AccessibleRelation controllerForRelation =
166             new AccessibleRelation(AccessibleRelation.CONTROLLER_FOR_PROPERTY,
167                                    facePanel);
168         hairCB.getAccessibleContext().getAccessibleRelationSet().add(controllerForRelation);
169         eyesCB.getAccessibleContext().getAccessibleRelationSet().add(controllerForRelation);
170         mouthCB.getAccessibleContext().getAccessibleRelationSet().add(controllerForRelation);
171 
172         // add buttons and image panels to inner panel
173         innerPanel.add(comboBoxPanel);
174         innerPanel.add(Box.createRigidArea(HGAP30));
175         innerPanel.add(facePanel);
176         innerPanel.add(Box.createRigidArea(HGAP20));
177 
178         // load up the face parts
179         addFace("brent",     getString("ComboBoxDemo.brent"));
180         addFace("georges",   getString("ComboBoxDemo.georges"));
181         addFace("hans",      getString("ComboBoxDemo.hans"));
182         addFace("howard",    getString("ComboBoxDemo.howard"));
183         addFace("james",     getString("ComboBoxDemo.james"));
184         addFace("jeff",      getString("ComboBoxDemo.jeff"));
185         addFace("jon",       getString("ComboBoxDemo.jon"));
186         addFace("lara",      getString("ComboBoxDemo.lara"));
187         addFace("larry",     getString("ComboBoxDemo.larry"));
188         addFace("lisa",      getString("ComboBoxDemo.lisa"));
189         addFace("michael",   getString("ComboBoxDemo.michael"));
190         addFace("philip",    getString("ComboBoxDemo.philip"));
191         addFace("scott",     getString("ComboBoxDemo.scott"));
192 
193         // set the default face
194         presetCB.setSelectedIndex(0);
195     }
196 
addFace(String name, String i18n_name)197     void addFace(String name, String i18n_name) {
198         ImageIcon i;
199         String i18n_hair = getString("ComboBoxDemo.hair");
200         String i18n_eyes = getString("ComboBoxDemo.eyes");
201         String i18n_mouth = getString("ComboBoxDemo.mouth");
202 
203         parts.put(i18n_name, name); // i18n name lookup
204         parts.put(name, i18n_name); // reverse name lookup
205 
206         i = createImageIcon("combobox/" + name + "hair.jpg", i18n_name + i18n_hair);
207         parts.put(name +  "hair", i);
208 
209         i = createImageIcon("combobox/" + name + "eyes.jpg", i18n_name + i18n_eyes);
210         parts.put(name +  "eyes", i);
211 
212         i = createImageIcon("combobox/" + name + "mouth.jpg", i18n_name + i18n_mouth);
213         parts.put(name +  "mouth", i);
214     }
215 
getFace()216     Face getFace() {
217         return face;
218     }
219 
createHairComboBox()220     JComboBox createHairComboBox() {
221         JComboBox cb = new JComboBox();
222         fillComboBox(cb);
223         cb.addActionListener(this);
224         return cb;
225     }
226 
createEyesComboBox()227     JComboBox createEyesComboBox() {
228         JComboBox cb = new JComboBox();
229         fillComboBox(cb);
230         cb.addActionListener(this);
231         return cb;
232     }
233 
createNoseComboBox()234     JComboBox createNoseComboBox() {
235         JComboBox cb = new JComboBox();
236         fillComboBox(cb);
237         cb.addActionListener(this);
238         return cb;
239     }
240 
createMouthComboBox()241     JComboBox createMouthComboBox() {
242         JComboBox cb = new JComboBox();
243         fillComboBox(cb);
244         cb.addActionListener(this);
245         return cb;
246     }
247 
createPresetComboBox()248     JComboBox createPresetComboBox() {
249         JComboBox cb = new JComboBox();
250         cb.addItem(getString("ComboBoxDemo.preset1"));
251         cb.addItem(getString("ComboBoxDemo.preset2"));
252         cb.addItem(getString("ComboBoxDemo.preset3"));
253         cb.addItem(getString("ComboBoxDemo.preset4"));
254         cb.addItem(getString("ComboBoxDemo.preset5"));
255         cb.addItem(getString("ComboBoxDemo.preset6"));
256         cb.addItem(getString("ComboBoxDemo.preset7"));
257         cb.addItem(getString("ComboBoxDemo.preset8"));
258         cb.addItem(getString("ComboBoxDemo.preset9"));
259         cb.addItem(getString("ComboBoxDemo.preset10"));
260         cb.addActionListener(this);
261         return cb;
262     }
263 
fillComboBox(JComboBox cb)264     void fillComboBox(JComboBox cb) {
265         cb.addItem(getString("ComboBoxDemo.brent"));
266         cb.addItem(getString("ComboBoxDemo.georges"));
267         cb.addItem(getString("ComboBoxDemo.hans"));
268         cb.addItem(getString("ComboBoxDemo.howard"));
269         cb.addItem(getString("ComboBoxDemo.james"));
270         cb.addItem(getString("ComboBoxDemo.jeff"));
271         cb.addItem(getString("ComboBoxDemo.jon"));
272         cb.addItem(getString("ComboBoxDemo.lara"));
273         cb.addItem(getString("ComboBoxDemo.larry"));
274         cb.addItem(getString("ComboBoxDemo.lisa"));
275         cb.addItem(getString("ComboBoxDemo.michael"));
276         cb.addItem(getString("ComboBoxDemo.philip"));
277         cb.addItem(getString("ComboBoxDemo.scott"));
278     }
279 
actionPerformed(ActionEvent e)280     public void actionPerformed(ActionEvent e) {
281         if(e.getSource() == hairCB) {
282             String name = (String) parts.get((String) hairCB.getSelectedItem());
283             face.setHair((ImageIcon) parts.get(name + "hair"));
284             faceLabel.repaint();
285         } else if(e.getSource() == eyesCB) {
286             String name = (String) parts.get((String) eyesCB.getSelectedItem());
287             face.setEyes((ImageIcon) parts.get(name + "eyes"));
288             faceLabel.repaint();
289         } else if(e.getSource() == mouthCB) {
290             String name = (String) parts.get((String) mouthCB.getSelectedItem());
291             face.setMouth((ImageIcon) parts.get(name + "mouth"));
292             faceLabel.repaint();
293         } else if(e.getSource() == presetCB) {
294             String hair = null;
295             String eyes = null;
296             String mouth = null;
297             switch(presetCB.getSelectedIndex()) {
298                case 0:
299                    hair = (String) parts.get("philip");
300                    eyes = (String) parts.get("howard");
301                    mouth = (String) parts.get("jeff");
302                    break;
303                case 1:
304                    hair = (String) parts.get("jeff");
305                    eyes = (String) parts.get("larry");
306                    mouth = (String) parts.get("philip");
307                    break;
308                case 2:
309                    hair = (String) parts.get("howard");
310                    eyes = (String) parts.get("scott");
311                    mouth = (String) parts.get("hans");
312                    break;
313                case 3:
314                    hair = (String) parts.get("philip");
315                    eyes = (String) parts.get("jeff");
316                    mouth = (String) parts.get("hans");
317                    break;
318                case 4:
319                    hair = (String) parts.get("brent");
320                    eyes = (String) parts.get("jon");
321                    mouth = (String) parts.get("scott");
322                    break;
323                case 5:
324                    hair = (String) parts.get("lara");
325                    eyes = (String) parts.get("larry");
326                    mouth = (String) parts.get("lisa");
327                    break;
328                case 6:
329                    hair = (String) parts.get("james");
330                    eyes = (String) parts.get("philip");
331                    mouth = (String) parts.get("michael");
332                    break;
333                case 7:
334                    hair = (String) parts.get("philip");
335                    eyes = (String) parts.get("lisa");
336                    mouth = (String) parts.get("brent");
337                    break;
338                case 8:
339                    hair = (String) parts.get("james");
340                    eyes = (String) parts.get("philip");
341                    mouth = (String) parts.get("jon");
342                    break;
343                case 9:
344                    hair = (String) parts.get("lara");
345                    eyes = (String) parts.get("jon");
346                    mouth = (String) parts.get("scott");
347                    break;
348             }
349             if(hair != null) {
350                 hairCB.setSelectedItem(hair);
351                 eyesCB.setSelectedItem(eyes);
352                 mouthCB.setSelectedItem(mouth);
353                 faceLabel.repaint();
354             }
355         }
356     }
357 
358     class Face implements Icon {
359         ImageIcon hair;
360         ImageIcon eyes;
361         ImageIcon mouth;
362 
setHair(ImageIcon i)363         void setHair(ImageIcon i) {
364             hair = i;
365         }
366 
setEyes(ImageIcon i)367         void setEyes(ImageIcon i) {
368             eyes = i;
369         }
370 
setMouth(ImageIcon i)371         void setMouth(ImageIcon i) {
372             mouth = i;
373         }
374 
paintIcon(Component c, Graphics g, int x, int y)375         public void paintIcon(Component c, Graphics g, int x, int y) {
376             int height = y;
377             x = c.getWidth()/2 - getIconWidth()/2;
378 
379             if(hair != null) {
380                 hair.paintIcon(c, g, x, height);   height += hair.getIconHeight();
381             }
382 
383             if(eyes != null) {
384                 eyes.paintIcon(c, g, x, height);   height += eyes.getIconHeight();
385             }
386 
387             if(mouth != null) {
388                 mouth.paintIcon(c, g, x, height);
389             }
390         }
391 
getIconWidth()392         public int getIconWidth() {
393             return 344;
394         }
395 
getIconHeight()396         public int getIconHeight() {
397             return 455;
398         }
399     }
400 }
401