OSDN Git Service

2006-06-09 Thomas Fitzsimmons <fitzsim@redhat.com>
[pf3gnuchains/gcc-fork.git] / libjava / classpath / javax / swing / plaf / multi / MultiListUI.java
1 /* MultiListUI.java --
2    Copyright (C) 2005 Free Software Foundation, Inc.
3
4 This file is part of GNU Classpath.
5
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)
9 any later version.
10
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.
15
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
19 02110-1301 USA.
20
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
24 combination.
25
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. */
37
38 package javax.swing.plaf.multi;
39
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;
46
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;
54
55 /**
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).
59  * 
60  * @see UIManager#addAuxiliaryLookAndFeel(LookAndFeel)
61  */
62 public class MultiListUI extends ListUI 
63 {
64
65   /** A list of references to the actual component UIs. */
66   protected Vector uis;
67     
68   /**
69    * Creates a new <code>MultiListUI</code> instance.
70    * 
71    * @see #createUI(JComponent)
72    */
73   public MultiListUI() 
74   {
75     uis = new Vector();
76   }
77   
78   /**
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.
82    * 
83    * @param target  the component.
84    * 
85    * @see MultiLookAndFeel#createUIs(ComponentUI, Vector, JComponent)
86    */
87   public static ComponentUI createUI(JComponent target)
88   {
89     MultiListUI mui = new MultiListUI();
90     return MultiLookAndFeel.createUIs(mui, mui.uis, target);
91   }
92     
93   /**
94    * Calls the {@link ComponentUI#installUI(JComponent)} method for all 
95    * the UI delegates managed by this <code>MultiListUI</code>.
96    * 
97    * @param c  the component.
98    */
99   public void installUI(JComponent c)
100   {
101     Iterator iterator = uis.iterator();
102     while (iterator.hasNext())
103     {
104       ComponentUI ui = (ComponentUI) iterator.next();
105       ui.installUI(c);
106     }
107   }
108
109   /**
110    * Calls the {@link ComponentUI#uninstallUI(JComponent)} method for all 
111    * the UI delegates managed by this <code>MultiListUI</code>.
112    * 
113    * @param c  the component.
114    */
115   public void uninstallUI(JComponent c)
116   {
117     Iterator iterator = uis.iterator();
118     while (iterator.hasNext())
119     {
120       ComponentUI ui = (ComponentUI) iterator.next();
121       ui.uninstallUI(c);
122     }
123   }
124   
125   /**
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.
129    * 
130    * @return An array of UI delegates.
131    */
132   public ComponentUI[] getUIs()
133   {
134     return MultiLookAndFeel.uisToArray(uis);
135   }
136   
137   /**
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 
141    * feel. 
142    * 
143    * @param c  the component.
144    * @param x  the x-coordinate.
145    * @param y  the y-coordinate.
146    * 
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. 
150    */
151   public boolean contains(JComponent c, int x, int y) 
152   {
153     boolean result = false;
154     Iterator iterator = uis.iterator();
155     // first UI delegate provides the return value
156     if (iterator.hasNext()) 
157       {
158         ComponentUI ui = (ComponentUI) iterator.next();
159         result = ui.contains(c, x, y);
160       }
161     // return values from auxiliary UI delegates are ignored
162     while (iterator.hasNext())
163       {
164         ComponentUI ui = (ComponentUI) iterator.next();
165         /* boolean ignored = */ ui.contains(c, x, y);
166       }
167     return result;
168   }
169   
170   /**
171    * Calls the {@link ComponentUI#update(Graphics, JComponent)} method for all 
172    * the UI delegates managed by this <code>MultiListUI</code>.
173    * 
174    * @param g  the graphics device.
175    * @param c  the component.
176    */
177   public void update(Graphics g, JComponent c)
178   {
179     Iterator iterator = uis.iterator();
180     while (iterator.hasNext())
181     {
182       ComponentUI ui = (ComponentUI) iterator.next();
183       ui.update(g, c);
184     }
185   }
186
187   /**
188    * Calls the <code>paint(Graphics, JComponent)</code> method for all the UI 
189    * delegates managed by this <code>MultiListUI</code>.
190    * 
191    * @param g  the graphics device.
192    * @param c  the component.
193    */
194   public void paint(Graphics g, JComponent c)
195   {
196     Iterator iterator = uis.iterator();
197     while (iterator.hasNext())
198     {
199       ComponentUI ui = (ComponentUI) iterator.next();
200       ui.paint(g, c);
201     }
202   }
203   
204   /**
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 
208    * feel. 
209    * 
210    * @param c  the component.
211    * 
212    * @return The preferred size returned by the UI delegate from the primary 
213    *         look and feel. 
214    */
215   public Dimension getPreferredSize(JComponent c)
216   {
217     Dimension result = null;
218     Iterator iterator = uis.iterator();
219     // first UI delegate provides the return value
220     if (iterator.hasNext()) 
221       {
222         ComponentUI ui = (ComponentUI) iterator.next();
223         result = ui.getPreferredSize(c);
224       }
225     // return values from auxiliary UI delegates are ignored
226     while (iterator.hasNext())
227       {
228         ComponentUI ui = (ComponentUI) iterator.next();
229         /* Dimension ignored = */ ui.getPreferredSize(c);
230       }
231     return result;
232   }
233   
234   /**
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 
238    * feel. 
239    * 
240    * @param c  the component.
241    * 
242    * @return The minimum size returned by the UI delegate from the primary 
243    *         look and feel. 
244    */
245   public Dimension getMinimumSize(JComponent c)
246   {
247     Dimension result = null;
248     Iterator iterator = uis.iterator();
249     // first UI delegate provides the return value
250     if (iterator.hasNext()) 
251       {
252         ComponentUI ui = (ComponentUI) iterator.next();
253         result = ui.getMinimumSize(c);
254       }
255     // return values from auxiliary UI delegates are ignored
256     while (iterator.hasNext())
257       {
258         ComponentUI ui = (ComponentUI) iterator.next();
259         /* Dimension ignored = */ ui.getMinimumSize(c);
260       }
261     return result;
262   }
263     
264   /**
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 
268    * feel. 
269    * 
270    * @param c  the component.
271    * 
272    * @return The maximum size returned by the UI delegate from the primary 
273    *         look and feel. 
274    */
275   public Dimension getMaximumSize(JComponent c)
276   {
277     Dimension result = null;
278     Iterator iterator = uis.iterator();
279     // first UI delegate provides the return value
280     if (iterator.hasNext()) 
281       {
282         ComponentUI ui = (ComponentUI) iterator.next();
283         result = ui.getMaximumSize(c);
284       }
285     // return values from auxiliary UI delegates are ignored
286     while (iterator.hasNext())
287       {
288         ComponentUI ui = (ComponentUI) iterator.next();
289         /* Dimension ignored = */ ui.getMaximumSize(c);
290       }
291     return result;
292   }
293   
294   /**
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 
298    * feel. 
299    * 
300    * @param c  the component.
301    * 
302    * @return The count returned by the UI delegate from the primary 
303    *         look and feel. 
304    */
305   public int getAccessibleChildrenCount(JComponent c)
306   {
307     int result = 0;
308     Iterator iterator = uis.iterator();
309     // first UI delegate provides the return value
310     if (iterator.hasNext()) 
311       {
312         ComponentUI ui = (ComponentUI) iterator.next();
313         result = ui.getAccessibleChildrenCount(c);
314       }
315     // return values from auxiliary UI delegates are ignored
316     while (iterator.hasNext())
317       {
318         ComponentUI ui = (ComponentUI) iterator.next();
319         /* int ignored = */ ui.getAccessibleChildrenCount(c);
320       }
321     return result;
322   }
323   
324   /**
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 
328    * feel. 
329    * 
330    * @param c  the component
331    * @param i  the child index.
332    * 
333    * @return The child returned by the UI delegate from the primary 
334    *         look and feel. 
335    */
336   public Accessible getAccessibleChild(JComponent c, int i)
337   {
338     Accessible result = null;
339     Iterator iterator = uis.iterator();
340     // first UI delegate provides the return value
341     if (iterator.hasNext()) 
342       {
343         ComponentUI ui = (ComponentUI) iterator.next();
344         result = ui.getAccessibleChild(c, i);
345       }
346     // return values from auxiliary UI delegates are ignored
347     while (iterator.hasNext())
348       {
349         ComponentUI ui = (ComponentUI) iterator.next();
350         /* Accessible ignored = */ ui.getAccessibleChild(c, i);
351       }
352     return result;
353   }
354   
355   /**
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 
359    * feel. 
360    * 
361    * @param list  the list.
362    * @param location  the location.
363    * 
364    * @return The index returned by the UI delegate from the primary 
365    *         look and feel. 
366    */
367   public int locationToIndex(JList list, Point location) 
368   {
369     int result = 0;
370     Iterator iterator = uis.iterator();
371     // first UI delegate provides the return value
372     if (iterator.hasNext()) 
373       {
374         ListUI ui = (ListUI) iterator.next();
375         result = ui.locationToIndex(list, location);
376       }
377     // return values from auxiliary UI delegates are ignored
378     while (iterator.hasNext())
379       {
380         ListUI ui = (ListUI) iterator.next();
381         /* int ignored = */ ui.locationToIndex(list, location);
382       }
383     return result;
384   }
385
386   /**
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 
390    * feel. 
391    * 
392    * @param list  the list.
393    * @param index  the index.
394    * 
395    * @return The location returned by the UI delegate from the primary 
396    *         look and feel. 
397    */
398   public Point indexToLocation(JList list, int index) 
399   {
400     Point result = null;
401     Iterator iterator = uis.iterator();
402     // first UI delegate provides the return value
403     if (iterator.hasNext()) 
404       {
405         ListUI ui = (ListUI) iterator.next();
406         result = ui.indexToLocation(list, index);
407       }
408     // return values from auxiliary UI delegates are ignored
409     while (iterator.hasNext())
410       {
411         ListUI ui = (ListUI) iterator.next();
412         /* Point ignored = */ ui.indexToLocation(list, index);
413       }
414     return result;
415   }
416
417   /**
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 
421    * feel. 
422    * 
423    * @param list  the list.
424    * @param index1  the first index.
425    * @param index2  the second index.
426    * 
427    * @return The bounds returned by the UI delegate from the primary 
428    *         look and feel. 
429    */
430   public Rectangle getCellBounds(JList list, int index1, int index2) 
431   {
432     Rectangle result = null;
433     Iterator iterator = uis.iterator();
434     // first UI delegate provides the return value
435     if (iterator.hasNext()) 
436       {
437         ListUI ui = (ListUI) iterator.next();
438         result = ui.getCellBounds(list, index1, index2);
439       }
440     // return values from auxiliary UI delegates are ignored
441     while (iterator.hasNext())
442       {
443         ListUI ui = (ListUI) iterator.next();
444         /* Rectangle ignored = */ ui.getCellBounds(list, index1, index2);
445       }
446     return result;
447   }
448
449 }