package org.limewire.ui.swing.util;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Insets;
import java.awt.Rectangle;
import java.util.List;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
/**
* Common methods for adjusting the size of various components.
*/
public class ResizeUtils {
/**
* Forces a component to a specific height without changing any of the
* width defaults.
*/
public static void forceHeight(Component comp, int height) {
comp.setMinimumSize(new Dimension((int)comp.getMinimumSize().getWidth(), height));
comp.setMaximumSize(new Dimension((int)comp.getMaximumSize().getWidth(), height));
comp.setPreferredSize(new Dimension((int)comp.getPreferredSize().getWidth(), height));
comp.setSize(new Dimension((int)comp.getSize().getWidth(), height));
}
/**
* Forces a component to a specific width without changing any of the
* height defaults.
*/
public static void forceWidth(Component comp, int width) {
comp.setMinimumSize(new Dimension(width, (int)comp.getMinimumSize().getHeight()));
comp.setMaximumSize(new Dimension(width, (int)comp.getMaximumSize().getHeight()));
comp.setPreferredSize(new Dimension(width, (int)comp.getPreferredSize().getHeight()));
comp.setSize(new Dimension(width, (int)comp.getSize().getHeight()));
}
public static void forceSize(Component comp, Dimension d) {
comp.setMaximumSize(d);
comp.setMaximumSize(d);
comp.setPreferredSize(d);
comp.setSize(d);
}
/**
* Attempts to set sane maximum and minimum size values for a component
* without modifying preferred and set size. Minimally invasive and
* usually leaves things in a state where the component width grows with contents.
*/
public static void looseForceHeight(Component comp, int height) {
comp.setMinimumSize(new Dimension(10, height));
comp.setMaximumSize(new Dimension(Integer.MAX_VALUE, height));
}
public static void looseForceWidth(Component comp, int width) {
comp.setMinimumSize(new Dimension(width, 10));
comp.setMaximumSize(new Dimension(width, Integer.MAX_VALUE));
}
/**
* Updates the size of the button to match either the explicit text of the
* button, or the largest item in the menu.
*/
public static void updateSize(JButton comp, List<Action> items) {
if (comp.getText() == null && (items == null || items.isEmpty())) {
return;
}
Font font = comp.getFont();
FontMetrics fm = comp.getFontMetrics(font);
Rectangle largest = new Rectangle();
Rectangle iconR = new Rectangle();
Rectangle textR = new Rectangle();
Rectangle viewR = new Rectangle(Short.MAX_VALUE, Short.MAX_VALUE);
// If text is explicitly set, layout that text.
if(comp.getText() != null && !comp.getText().isEmpty()) {
SwingUtilities.layoutCompoundLabel(
comp, fm, comp.getText(), comp.getIcon(),
comp.getVerticalAlignment(), comp.getHorizontalAlignment(),
comp.getVerticalTextPosition(), comp.getHorizontalTextPosition(),
viewR, iconR, textR, comp.getIconTextGap()
);
Rectangle r = iconR.union(textR);
largest = r;
} else {
// Otherwise, find the largest layout area of all the menu items.
for(Action action : items) {
Icon icon = (Icon)action.getValue(Action.SMALL_ICON);
String text = (String)action.getValue(Action.NAME);
iconR.height = iconR.width = iconR.x = iconR.y = 0;
textR.height = textR.width = textR.x = textR.y = 0;
viewR.x = viewR.y = 0;
viewR.height = viewR.width = Short.MAX_VALUE;
SwingUtilities.layoutCompoundLabel(
comp, fm, text, icon,
SwingConstants.CENTER, SwingConstants.CENTER,
SwingConstants.CENTER, SwingConstants.TRAILING,
viewR, iconR, textR, (text == null ? 0 : 4)
);
Rectangle r = iconR.union(textR);
largest.height = Math.max(r.height, largest.height);
largest.width = Math.max(r.width, largest.width);
}
}
Insets insets = comp.getInsets();
largest.width += insets.left + insets.right;
largest.height += insets.top + insets.bottom;
largest.height = Math.max(comp.getMinimumSize().height, largest.height);
comp.setMaximumSize(new Dimension(200, 100));
comp.setMinimumSize(largest.getSize());
comp.setPreferredSize(largest.getSize());
comp.setSize(largest.getSize());
comp.revalidate();
comp.repaint();
}
}