1 /* MultiSplitPaneUI.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.util.Iterator;
43 import java.util.Vector;
44 
45 import javax.accessibility.Accessible;
46 import javax.swing.JComponent;
47 import javax.swing.JSplitPane;
48 import javax.swing.LookAndFeel;
49 import javax.swing.UIManager;
50 import javax.swing.plaf.ComponentUI;
51 import javax.swing.plaf.SplitPaneUI;
52 
53 /**
54  * A UI delegate that that coordinates multiple {@link SplitPaneUI}
55  * instances, one from the primary look and feel, and one or more from the
56  * auxiliary look and feel(s).
57  *
58  * @see UIManager#addAuxiliaryLookAndFeel(LookAndFeel)
59  */
60 public class MultiSplitPaneUI extends SplitPaneUI
61 {
62 
63   /** A list of references to the actual component UIs. */
64   protected Vector uis;
65 
66   /**
67    * Creates a new <code>MultiSplitPaneUI</code> instance.
68    *
69    * @see #createUI(JComponent)
70    */
MultiSplitPaneUI()71   public MultiSplitPaneUI()
72   {
73     uis = new Vector();
74   }
75 
76   /**
77    * Creates a delegate object for the specified component.  If any auxiliary
78    * look and feels support this component, a <code>MultiSplitPaneUI</code> is
79    * returned, otherwise the UI from the default look and feel is returned.
80    *
81    * @param target  the component.
82    *
83    * @see MultiLookAndFeel#createUIs(ComponentUI, Vector, JComponent)
84    */
createUI(JComponent target)85   public static ComponentUI createUI(JComponent target)
86   {
87     MultiSplitPaneUI mui = new MultiSplitPaneUI();
88     return MultiLookAndFeel.createUIs(mui, mui.uis, target);
89   }
90 
91   /**
92    * Calls the {@link ComponentUI#installUI(JComponent)} method for all
93    * the UI delegates managed by this <code>MultiSplitPaneUI</code>.
94    *
95    * @param c  the component.
96    */
installUI(JComponent c)97   public void installUI(JComponent c)
98   {
99     Iterator iterator = uis.iterator();
100     while (iterator.hasNext())
101     {
102       ComponentUI ui = (ComponentUI) iterator.next();
103       ui.installUI(c);
104     }
105   }
106 
107   /**
108    * Calls the {@link ComponentUI#uninstallUI(JComponent)} method for all
109    * the UI delegates managed by this <code>MultiSplitPaneUI</code>.
110    *
111    * @param c  the component.
112    */
uninstallUI(JComponent c)113   public void uninstallUI(JComponent c)
114   {
115     Iterator iterator = uis.iterator();
116     while (iterator.hasNext())
117     {
118       ComponentUI ui = (ComponentUI) iterator.next();
119       ui.uninstallUI(c);
120     }
121   }
122 
123   /**
124    * Returns an array containing the UI delegates managed by this
125    * <code>MultiSplitPaneUI</code>.  The first item in the array is always
126    * the UI delegate from the installed default look and feel.
127    *
128    * @return An array of UI delegates.
129    */
getUIs()130   public ComponentUI[] getUIs()
131   {
132     return MultiLookAndFeel.uisToArray(uis);
133   }
134 
135   /**
136    * Calls the {@link ComponentUI#contains(JComponent, int, int)} method for all
137    * the UI delegates managed by this <code>MultiSplitPaneUI</code>,
138    * returning the result for the UI delegate from the primary look and
139    * feel.
140    *
141    * @param c  the component.
142    * @param x  the x-coordinate.
143    * @param y  the y-coordinate.
144    *
145    * @return <code>true</code> if the specified (x, y) coordinate falls within
146    *         the bounds of the component as rendered by the UI delegate in the
147    *         primary look and feel, and <code>false</code> otherwise.
148    */
contains(JComponent c, int x, int y)149   public boolean contains(JComponent c, int x, int y)
150   {
151     boolean result = false;
152     Iterator iterator = uis.iterator();
153     // first UI delegate provides the return value
154     if (iterator.hasNext())
155       {
156         ComponentUI ui = (ComponentUI) iterator.next();
157         result = ui.contains(c, x, y);
158       }
159     // return values from auxiliary UI delegates are ignored
160     while (iterator.hasNext())
161       {
162         ComponentUI ui = (ComponentUI) iterator.next();
163         /* boolean ignored = */ ui.contains(c, x, y);
164       }
165     return result;
166   }
167 
168   /**
169    * Calls the {@link ComponentUI#update(Graphics, JComponent)} method for all
170    * the UI delegates managed by this <code>MultiSplitPaneUI</code>.
171    *
172    * @param g  the graphics device.
173    * @param c  the component.
174    */
update(Graphics g, JComponent c)175   public void update(Graphics g, JComponent c)
176   {
177     Iterator iterator = uis.iterator();
178     while (iterator.hasNext())
179     {
180       ComponentUI ui = (ComponentUI) iterator.next();
181       ui.update(g, c);
182     }
183   }
184 
185   /**
186    * Calls the <code>paint(Graphics, JComponent)</code> method for all the UI
187    * delegates managed by this <code>MultiSplitPaneUI</code>.
188    *
189    * @param g  the graphics device.
190    * @param c  the component.
191    */
paint(Graphics g, JComponent c)192   public void paint(Graphics g, JComponent c)
193   {
194     Iterator iterator = uis.iterator();
195     while (iterator.hasNext())
196     {
197       ComponentUI ui = (ComponentUI) iterator.next();
198       ui.paint(g, c);
199     }
200   }
201 
202   /**
203    * Calls the {@link ComponentUI#getPreferredSize(JComponent)} method for all
204    * the UI delegates managed by this <code>MultiSplitPaneUI</code>,
205    * returning the preferred size for the UI delegate from the primary look and
206    * feel.
207    *
208    * @param c  the component.
209    *
210    * @return The preferred size returned by the UI delegate from the primary
211    *         look and feel.
212    */
getPreferredSize(JComponent c)213   public Dimension getPreferredSize(JComponent c)
214   {
215     Dimension result = null;
216     Iterator iterator = uis.iterator();
217     // first UI delegate provides the return value
218     if (iterator.hasNext())
219       {
220         ComponentUI ui = (ComponentUI) iterator.next();
221         result = ui.getPreferredSize(c);
222       }
223     // return values from auxiliary UI delegates are ignored
224     while (iterator.hasNext())
225       {
226         ComponentUI ui = (ComponentUI) iterator.next();
227         /* Dimension ignored = */ ui.getPreferredSize(c);
228       }
229     return result;
230   }
231 
232   /**
233    * Calls the {@link ComponentUI#getMinimumSize(JComponent)} method for all
234    * the UI delegates managed by this <code>MultiSplitPaneUI</code>,
235    * returning the minimum size for the UI delegate from the primary look and
236    * feel.
237    *
238    * @param c  the component.
239    *
240    * @return The minimum size returned by the UI delegate from the primary
241    *         look and feel.
242    */
getMinimumSize(JComponent c)243   public Dimension getMinimumSize(JComponent c)
244   {
245     Dimension result = null;
246     Iterator iterator = uis.iterator();
247     // first UI delegate provides the return value
248     if (iterator.hasNext())
249       {
250         ComponentUI ui = (ComponentUI) iterator.next();
251         result = ui.getMinimumSize(c);
252       }
253     // return values from auxiliary UI delegates are ignored
254     while (iterator.hasNext())
255       {
256         ComponentUI ui = (ComponentUI) iterator.next();
257         /* Dimension ignored = */ ui.getMinimumSize(c);
258       }
259     return result;
260   }
261 
262   /**
263    * Calls the {@link ComponentUI#getMaximumSize(JComponent)} method for all
264    * the UI delegates managed by this <code>MultiSplitPaneUI</code>,
265    * returning the maximum size for the UI delegate from the primary look and
266    * feel.
267    *
268    * @param c  the component.
269    *
270    * @return The maximum size returned by the UI delegate from the primary
271    *         look and feel.
272    */
getMaximumSize(JComponent c)273   public Dimension getMaximumSize(JComponent c)
274   {
275     Dimension result = null;
276     Iterator iterator = uis.iterator();
277     // first UI delegate provides the return value
278     if (iterator.hasNext())
279       {
280         ComponentUI ui = (ComponentUI) iterator.next();
281         result = ui.getMaximumSize(c);
282       }
283     // return values from auxiliary UI delegates are ignored
284     while (iterator.hasNext())
285       {
286         ComponentUI ui = (ComponentUI) iterator.next();
287         /* Dimension ignored = */ ui.getMaximumSize(c);
288       }
289     return result;
290   }
291 
292   /**
293    * Calls the {@link ComponentUI#getAccessibleChildrenCount(JComponent)} method
294    * for all the UI delegates managed by this <code>MultiSplitPaneUI</code>,
295    * returning the count for the UI delegate from the primary look and
296    * feel.
297    *
298    * @param c  the component.
299    *
300    * @return The count returned by the UI delegate from the primary
301    *         look and feel.
302    */
getAccessibleChildrenCount(JComponent c)303   public int getAccessibleChildrenCount(JComponent c)
304   {
305     int result = 0;
306     Iterator iterator = uis.iterator();
307     // first UI delegate provides the return value
308     if (iterator.hasNext())
309       {
310         ComponentUI ui = (ComponentUI) iterator.next();
311         result = ui.getAccessibleChildrenCount(c);
312       }
313     // return values from auxiliary UI delegates are ignored
314     while (iterator.hasNext())
315       {
316         ComponentUI ui = (ComponentUI) iterator.next();
317         /* int ignored = */ ui.getAccessibleChildrenCount(c);
318       }
319     return result;
320   }
321 
322   /**
323    * Calls the {@link ComponentUI#getAccessibleChild(JComponent, int)} method
324    * for all the UI delegates managed by this <code>MultiSplitPaneUI</code>,
325    * returning the child for the UI delegate from the primary look and
326    * feel.
327    *
328    * @param c  the component
329    * @param i  the child index.
330    *
331    * @return The child returned by the UI delegate from the primary
332    *         look and feel.
333    */
getAccessibleChild(JComponent c, int i)334   public Accessible getAccessibleChild(JComponent c, int i)
335   {
336     Accessible result = null;
337     Iterator iterator = uis.iterator();
338     // first UI delegate provides the return value
339     if (iterator.hasNext())
340       {
341         ComponentUI ui = (ComponentUI) iterator.next();
342         result = ui.getAccessibleChild(c, i);
343       }
344     // return values from auxiliary UI delegates are ignored
345     while (iterator.hasNext())
346       {
347         ComponentUI ui = (ComponentUI) iterator.next();
348         /* Accessible ignored = */ ui.getAccessibleChild(c, i);
349       }
350     return result;
351   }
352 
353   /**
354    * Calls the {@link SplitPaneUI#resetToPreferredSizes(JSplitPane)} method
355    * for all the UI delegates managed by this <code>MultiSplitPaneUI</code>.
356    *
357    * @param pane  the component.
358    */
resetToPreferredSizes(JSplitPane pane)359   public void resetToPreferredSizes(JSplitPane pane)
360   {
361     Iterator iterator = uis.iterator();
362     while (iterator.hasNext())
363     {
364       SplitPaneUI ui = (SplitPaneUI) iterator.next();
365       ui.resetToPreferredSizes(pane);
366     }
367   }
368 
369   /**
370    * Calls the {@link SplitPaneUI#setDividerLocation(JSplitPane, int)} method
371    * for all the UI delegates managed by this <code>MultiSplitPaneUI</code>.
372    *
373    * @param pane  the component.
374    * @param location  the location.
375    */
setDividerLocation(JSplitPane pane, int location)376   public void setDividerLocation(JSplitPane pane, int location)
377   {
378     Iterator iterator = uis.iterator();
379     while (iterator.hasNext())
380     {
381       SplitPaneUI ui = (SplitPaneUI) iterator.next();
382       ui.setDividerLocation(pane, location);
383     }
384   }
385 
386   /**
387    * Calls the {@link SplitPaneUI#getDividerLocation(JSplitPane)} method for all
388    * the UI delegates managed by this <code>MultiSplitPaneUI</code>,
389    * returning the location for the UI delegate from the primary look and
390    * feel.
391    *
392    * @param pane  the component.
393    *
394    * @return The location returned by the UI delegate from the primary
395    *         look and feel.
396    */
getDividerLocation(JSplitPane pane)397   public int getDividerLocation(JSplitPane pane)
398   {
399     int result = 0;
400     Iterator iterator = uis.iterator();
401     // first UI delegate provides the return value
402     if (iterator.hasNext())
403       {
404         SplitPaneUI ui = (SplitPaneUI) iterator.next();
405         result = ui.getDividerLocation(pane);
406       }
407     // return values from auxiliary UI delegates are ignored
408     while (iterator.hasNext())
409       {
410         SplitPaneUI ui = (SplitPaneUI) iterator.next();
411         /* int ignored = */ ui.getDividerLocation(pane);
412       }
413     return result;
414   }
415 
416   /**
417    * Calls the {@link SplitPaneUI#getMinimumDividerLocation(JSplitPane)} method
418    * for all the UI delegates managed by this <code>MultiSplitPaneUI</code>,
419    * returning the location for the UI delegate from the primary look and
420    * feel.
421    *
422    * @param pane  the component.
423    *
424    * @return The location returned by the UI delegate from the primary
425    *         look and feel.
426    */
getMinimumDividerLocation(JSplitPane pane)427   public int getMinimumDividerLocation(JSplitPane pane)
428   {
429     int result = 0;
430     Iterator iterator = uis.iterator();
431     // first UI delegate provides the return value
432     if (iterator.hasNext())
433       {
434         SplitPaneUI ui = (SplitPaneUI) iterator.next();
435         result = ui.getMinimumDividerLocation(pane);
436       }
437     // return values from auxiliary UI delegates are ignored
438     while (iterator.hasNext())
439       {
440         SplitPaneUI ui = (SplitPaneUI) iterator.next();
441         /* int ignored = */ ui.getMinimumDividerLocation(pane);
442       }
443     return result;
444   }
445 
446   /**
447    * Calls the {@link SplitPaneUI#getMaximumDividerLocation(JSplitPane)} method
448    * for all the UI delegates managed by this <code>MultiSplitPaneUI</code>,
449    * returning the location for the UI delegate from the primary look and
450    * feel.
451    *
452    * @param pane  the component.
453    *
454    * @return The location returned by the UI delegate from the primary
455    *         look and feel.
456    */
getMaximumDividerLocation(JSplitPane pane)457   public int getMaximumDividerLocation(JSplitPane pane)
458   {
459     int result = 0;
460     Iterator iterator = uis.iterator();
461     // first UI delegate provides the return value
462     if (iterator.hasNext())
463       {
464         SplitPaneUI ui = (SplitPaneUI) iterator.next();
465         result = ui.getMaximumDividerLocation(pane);
466       }
467     // return values from auxiliary UI delegates are ignored
468     while (iterator.hasNext())
469       {
470         SplitPaneUI ui = (SplitPaneUI) iterator.next();
471         /* int ignored = */ ui.getMaximumDividerLocation(pane);
472       }
473     return result;
474   }
475 
476   /**
477    * Calls the {@link SplitPaneUI#finishedPaintingChildren(JSplitPane,
478    * Graphics)} method for all the UI delegates managed by this
479    * <code>MultiSplitPaneUI</code>.
480    *
481    * @param pane  the component.
482    * @param g  the graphics device.
483    */
finishedPaintingChildren(JSplitPane pane, Graphics g)484   public void finishedPaintingChildren(JSplitPane pane, Graphics g)
485   {
486     Iterator iterator = uis.iterator();
487     while (iterator.hasNext())
488     {
489       SplitPaneUI ui = (SplitPaneUI) iterator.next();
490       ui.finishedPaintingChildren(pane, g);
491     }
492   }
493 
494 }
495