tinylaf-1_4_0_src.src.de.muntjak.tinylookandfeel.TinyFileChooserUI Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of tinylaf Show documentation
Show all versions of tinylaf Show documentation
A (mostly painted) Look and Feel for Java 1.4 and higher.
The newest version!
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* This file is part of the Tiny Look and Feel *
* Copyright 2003 - 2008 Hans Bickel *
* *
* For licensing information and credits, please refer to the *
* comment in file de.muntjak.tinylookandfeel.TinyLookAndFeel *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*
*
* This is an almost unchanged version of MetalFileChooserUI.
*
*
* @(#)MetalFileChooserUI.java 1.45 02/04/11
*
* Copyright 2002 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package de.muntjak.tinylookandfeel;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Insets;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.AbstractButton;
import javax.swing.Box;
import javax.swing.Icon;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.border.Border;
import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.FileChooserUI;
import javax.swing.plaf.basic.BasicFileChooserUI;
import javax.swing.plaf.metal.MetalFileChooserUI;
import de.muntjak.tinylookandfeel.borders.TinyToolButtonBorder;
/**
* TinyFileChooserUI
*
* Rewrote this in 1.4.0 to get rid of the dependency on
* sun.awt.shell.ShellFolder class.
*
* @author Hans Bickel
* @version 1.4.0
*
*/
public class TinyFileChooserUI extends MetalFileChooserUI {
/** Key for a button's isFileChooserButton client property */
public static final String IS_FILE_CHOOSER_BUTTON_KEY = "isFileChooserButton";
private static final Dimension hstrut1 = new Dimension(1, 1);
public static ComponentUI createUI(JComponent c) {
return new TinyFileChooserUI((JFileChooser) c);
}
private TinyFileChooserUI(JFileChooser c) {
super(c);
}
public void installComponents(JFileChooser fc) {
super.installComponents(fc);
// We want to access the icon-only buttons and
// their parent panel which were constructed in
// the super call. This is a hack, but MetalFileChooserUI
// would need a rewrite to be used correctly.
// Note: The code makes assumptions about the layout
// of the file chooser component which might fail with
// future swing releases.
// Search for topButtonPanel which is assumed to be
// a child of a child of the file chooser component
Component[] ci = fc.getComponents();
for(int i = 0; i < ci.length; i++) {
if(ci[i] instanceof JPanel) {
Component[] cj = ((Container)ci[i]).getComponents();
for(int j = 0; j < cj.length; j++) {
if(cj[j] instanceof JPanel) {
Component[] ck = ((Container)cj[j]).getComponents();
Vector buttons = new Vector();
for(int k = 0; k < ck.length; k++) {
if(ck[k] instanceof AbstractButton) {
Icon icon = ((AbstractButton)ck[k]).getIcon();
if(isFileChooserIcon(icon)) {
buttons.add(ck[k]);
}
}
}
// newFolder button might be present or not
if(buttons.size() >= 4) {
// ok, we have the topButtonPanel and
// we have all icon-only buttons
JPanel topButtonPanel = (JPanel)cj[j];
Border toolButtonBorder = new TinyToolButtonBorder();
// we want other gaps between button
topButtonPanel.removeAll();
// order of buttons should already be left to right
Iterator ii = buttons.iterator();
while(ii.hasNext()) {
AbstractButton b = (AbstractButton)ii.next();
b.putClientProperty(IS_FILE_CHOOSER_BUTTON_KEY, Boolean.TRUE);
b.setOpaque(false);
b.setBorder(toolButtonBorder);
if(b instanceof JToggleButton) {
topButtonPanel.add(Box.createRigidArea(hstrut1));
b.setMargin(new Insets(4, 2, 5, 2));
}
else {
b.setMargin(new Insets(2, 2, 2, 2));
}
topButtonPanel.add(b);
}
}
}
}
}
}
}
private boolean isFileChooserIcon(Icon icon) {
if(icon == null) return false;
return icon.equals(upFolderIcon) ||
icon.equals(homeFolderIcon) ||
icon.equals(newFolderIcon) ||
icon.equals(listViewIcon) ||
icon.equals(detailsViewIcon);
}
}