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