2 Copyright (C) 2005 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
38 package javax.swing.plaf.multi;
40 import java.awt.Dimension;
41 import java.awt.Graphics;
42 import java.awt.Point;
43 import java.awt.Rectangle;
44 import java.util.Iterator;
45 import java.util.Vector;
47 import javax.accessibility.Accessible;
48 import javax.swing.JComponent;
49 import javax.swing.JList;
50 import javax.swing.LookAndFeel;
51 import javax.swing.UIManager;
52 import javax.swing.plaf.ComponentUI;
53 import javax.swing.plaf.ListUI;
56 * A UI delegate that that coordinates multiple {@link ListUI}
57 * instances, one from the primary look and feel, and one or more from the
58 * auxiliary look and feel(s).
60 * @see UIManager#addAuxiliaryLookAndFeel(LookAndFeel)
62 public class MultiListUI extends ListUI
65 /** A list of references to the actual component UIs. */
69 * Creates a new <code>MultiListUI</code> instance.
71 * @see #createUI(JComponent)
79 * Creates a delegate object for the specified component. If any auxiliary
80 * look and feels support this component, a <code>MultiListUI</code> is
81 * returned, otherwise the UI from the default look and feel is returned.
83 * @param target the component.
85 * @see MultiLookAndFeel#createUIs(ComponentUI, Vector, JComponent)
87 public static ComponentUI createUI(JComponent target)
89 MultiListUI mui = new MultiListUI();
90 return MultiLookAndFeel.createUIs(mui, mui.uis, target);
94 * Calls the {@link ComponentUI#installUI(JComponent)} method for all
95 * the UI delegates managed by this <code>MultiListUI</code>.
97 * @param c the component.
99 public void installUI(JComponent c)
101 Iterator iterator = uis.iterator();
102 while (iterator.hasNext())
104 ComponentUI ui = (ComponentUI) iterator.next();
110 * Calls the {@link ComponentUI#uninstallUI(JComponent)} method for all
111 * the UI delegates managed by this <code>MultiListUI</code>.
113 * @param c the component.
115 public void uninstallUI(JComponent c)
117 Iterator iterator = uis.iterator();
118 while (iterator.hasNext())
120 ComponentUI ui = (ComponentUI) iterator.next();
126 * Returns an array containing the UI delegates managed by this
127 * <code>MultiListUI</code>. The first item in the array is always
128 * the UI delegate from the installed default look and feel.
130 * @return An array of UI delegates.
132 public ComponentUI[] getUIs()
134 return MultiLookAndFeel.uisToArray(uis);
138 * Calls the {@link ComponentUI#contains(JComponent, int, int)} method for all
139 * the UI delegates managed by this <code>MultiListUI</code>,
140 * returning the result for the UI delegate from the primary look and
143 * @param c the component.
144 * @param x the x-coordinate.
145 * @param y the y-coordinate.
147 * @return <code>true</code> if the specified (x, y) coordinate falls within
148 * the bounds of the component as rendered by the UI delegate in the
149 * primary look and feel, and <code>false</code> otherwise.
151 public boolean contains(JComponent c, int x, int y)
153 boolean result = false;
154 Iterator iterator = uis.iterator();
155 // first UI delegate provides the return value
156 if (iterator.hasNext())
158 ComponentUI ui = (ComponentUI) iterator.next();
159 result = ui.contains(c, x, y);
161 // return values from auxiliary UI delegates are ignored
162 while (iterator.hasNext())
164 ComponentUI ui = (ComponentUI) iterator.next();
165 /* boolean ignored = */ ui.contains(c, x, y);
171 * Calls the {@link ComponentUI#update(Graphics, JComponent)} method for all
172 * the UI delegates managed by this <code>MultiListUI</code>.
174 * @param g the graphics device.
175 * @param c the component.
177 public void update(Graphics g, JComponent c)
179 Iterator iterator = uis.iterator();
180 while (iterator.hasNext())
182 ComponentUI ui = (ComponentUI) iterator.next();
188 * Calls the <code>paint(Graphics, JComponent)</code> method for all the UI
189 * delegates managed by this <code>MultiListUI</code>.
191 * @param g the graphics device.
192 * @param c the component.
194 public void paint(Graphics g, JComponent c)
196 Iterator iterator = uis.iterator();
197 while (iterator.hasNext())
199 ComponentUI ui = (ComponentUI) iterator.next();
205 * Calls the {@link ComponentUI#getPreferredSize(JComponent)} method for all
206 * the UI delegates managed by this <code>MultiListUI</code>,
207 * returning the preferred size for the UI delegate from the primary look and
210 * @param c the component.
212 * @return The preferred size returned by the UI delegate from the primary
215 public Dimension getPreferredSize(JComponent c)
217 Dimension result = null;
218 Iterator iterator = uis.iterator();
219 // first UI delegate provides the return value
220 if (iterator.hasNext())
222 ComponentUI ui = (ComponentUI) iterator.next();
223 result = ui.getPreferredSize(c);
225 // return values from auxiliary UI delegates are ignored
226 while (iterator.hasNext())
228 ComponentUI ui = (ComponentUI) iterator.next();
229 /* Dimension ignored = */ ui.getPreferredSize(c);
235 * Calls the {@link ComponentUI#getMinimumSize(JComponent)} method for all
236 * the UI delegates managed by this <code>MultiListUI</code>,
237 * returning the minimum size for the UI delegate from the primary look and
240 * @param c the component.
242 * @return The minimum size returned by the UI delegate from the primary
245 public Dimension getMinimumSize(JComponent c)
247 Dimension result = null;
248 Iterator iterator = uis.iterator();
249 // first UI delegate provides the return value
250 if (iterator.hasNext())
252 ComponentUI ui = (ComponentUI) iterator.next();
253 result = ui.getMinimumSize(c);
255 // return values from auxiliary UI delegates are ignored
256 while (iterator.hasNext())
258 ComponentUI ui = (ComponentUI) iterator.next();
259 /* Dimension ignored = */ ui.getMinimumSize(c);
265 * Calls the {@link ComponentUI#getMaximumSize(JComponent)} method for all
266 * the UI delegates managed by this <code>MultiListUI</code>,
267 * returning the maximum size for the UI delegate from the primary look and
270 * @param c the component.
272 * @return The maximum size returned by the UI delegate from the primary
275 public Dimension getMaximumSize(JComponent c)
277 Dimension result = null;
278 Iterator iterator = uis.iterator();
279 // first UI delegate provides the return value
280 if (iterator.hasNext())
282 ComponentUI ui = (ComponentUI) iterator.next();
283 result = ui.getMaximumSize(c);
285 // return values from auxiliary UI delegates are ignored
286 while (iterator.hasNext())
288 ComponentUI ui = (ComponentUI) iterator.next();
289 /* Dimension ignored = */ ui.getMaximumSize(c);
295 * Calls the {@link ComponentUI#getAccessibleChildrenCount(JComponent)} method
296 * for all the UI delegates managed by this <code>MultiListUI</code>,
297 * returning the count for the UI delegate from the primary look and
300 * @param c the component.
302 * @return The count returned by the UI delegate from the primary
305 public int getAccessibleChildrenCount(JComponent c)
308 Iterator iterator = uis.iterator();
309 // first UI delegate provides the return value
310 if (iterator.hasNext())
312 ComponentUI ui = (ComponentUI) iterator.next();
313 result = ui.getAccessibleChildrenCount(c);
315 // return values from auxiliary UI delegates are ignored
316 while (iterator.hasNext())
318 ComponentUI ui = (ComponentUI) iterator.next();
319 /* int ignored = */ ui.getAccessibleChildrenCount(c);
325 * Calls the {@link ComponentUI#getAccessibleChild(JComponent, int)} method
326 * for all the UI delegates managed by this <code>MultiListUI</code>,
327 * returning the child for the UI delegate from the primary look and
330 * @param c the component
331 * @param i the child index.
333 * @return The child returned by the UI delegate from the primary
336 public Accessible getAccessibleChild(JComponent c, int i)
338 Accessible result = null;
339 Iterator iterator = uis.iterator();
340 // first UI delegate provides the return value
341 if (iterator.hasNext())
343 ComponentUI ui = (ComponentUI) iterator.next();
344 result = ui.getAccessibleChild(c, i);
346 // return values from auxiliary UI delegates are ignored
347 while (iterator.hasNext())
349 ComponentUI ui = (ComponentUI) iterator.next();
350 /* Accessible ignored = */ ui.getAccessibleChild(c, i);
356 * Calls the {@link ListUI#locationToIndex(JList, Point)} method for all
357 * the UI delegates managed by this <code>MultiListUI</code>,
358 * returning the index for the UI delegate from the primary look and
361 * @param list the list.
362 * @param location the location.
364 * @return The index returned by the UI delegate from the primary
367 public int locationToIndex(JList list, Point location)
370 Iterator iterator = uis.iterator();
371 // first UI delegate provides the return value
372 if (iterator.hasNext())
374 ListUI ui = (ListUI) iterator.next();
375 result = ui.locationToIndex(list, location);
377 // return values from auxiliary UI delegates are ignored
378 while (iterator.hasNext())
380 ListUI ui = (ListUI) iterator.next();
381 /* int ignored = */ ui.locationToIndex(list, location);
387 * Calls the {@link ListUI#indexToLocation(JList, int)} method for all
388 * the UI delegates managed by this <code>MultiListUI</code>,
389 * returning the location for the UI delegate from the primary look and
392 * @param list the list.
393 * @param index the index.
395 * @return The location returned by the UI delegate from the primary
398 public Point indexToLocation(JList list, int index)
401 Iterator iterator = uis.iterator();
402 // first UI delegate provides the return value
403 if (iterator.hasNext())
405 ListUI ui = (ListUI) iterator.next();
406 result = ui.indexToLocation(list, index);
408 // return values from auxiliary UI delegates are ignored
409 while (iterator.hasNext())
411 ListUI ui = (ListUI) iterator.next();
412 /* Point ignored = */ ui.indexToLocation(list, index);
418 * Calls the {@link ListUI#getCellBounds(JList, int, int)} method for all
419 * the UI delegates managed by this <code>MultiListUI</code>,
420 * returning the bounds for the UI delegate from the primary look and
423 * @param list the list.
424 * @param index1 the first index.
425 * @param index2 the second index.
427 * @return The bounds returned by the UI delegate from the primary
430 public Rectangle getCellBounds(JList list, int index1, int index2)
432 Rectangle result = null;
433 Iterator iterator = uis.iterator();
434 // first UI delegate provides the return value
435 if (iterator.hasNext())
437 ListUI ui = (ListUI) iterator.next();
438 result = ui.getCellBounds(list, index1, index2);
440 // return values from auxiliary UI delegates are ignored
441 while (iterator.hasNext())
443 ListUI ui = (ListUI) iterator.next();
444 /* Rectangle ignored = */ ui.getCellBounds(list, index1, index2);