/**
* L2FProd.com Common Components 7.3 License.
*
* Copyright 2005-2007 L2FProd.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.l2fprod.common.swing;
import com.l2fprod.common.swing.plaf.ButtonBarButtonUI;
import com.l2fprod.common.swing.plaf.ButtonBarUI;
import com.l2fprod.common.swing.plaf.JButtonBarAddon;
import com.l2fprod.common.swing.plaf.LookAndFeelAddons;
import java.awt.Component;
import java.awt.event.ContainerAdapter;
import java.awt.event.ContainerEvent;
import java.awt.event.ContainerListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.AbstractButton;
import javax.swing.JComponent;
import javax.swing.SwingConstants;
/**
* JButtonBar helps organizing buttons together (as seen in Mozilla Firefox
* or IntelliJ).<br>
*
* @javabean.class
* name="JButtonBar"
* shortDescription="JButtonBar helps organizing buttons together (as seen in Mozilla Firefox or IntelliJ)."
* stopClass="java.awt.Component"
*
* @javabean.icons
* mono16="JButtonBar16-mono.gif"
* color16="JButtonBar16.gif"
* mono32="JButtonBar32-mono.gif"
* color32="JButtonBar32.gif"
*/
public class JButtonBar extends JComponent implements SwingConstants {
public static final String UI_CLASS_ID = "ButtonBarUI";
// ensure at least the default ui is registered
static {
LookAndFeelAddons.contribute(new JButtonBarAddon());
}
public static final String ORIENTATION_CHANGED_KEY = "orientation";
private int orientation;
public JButtonBar() {
this(HORIZONTAL);
}
public JButtonBar(int orientation) {
this.orientation = orientation;
updateUI();
addContainerListener(buttonTracker);
}
/**
* Notification from the <code>UIManager</code> that the L&F has changed.
* Replaces the current UI object with the latest version from the <code>UIManager</code>.
*
* @see javax.swing.JComponent#updateUI
*/
public void updateUI() {
setUI((ButtonBarUI)LookAndFeelAddons.getUI(this, ButtonBarUI.class));
}
/**
* Returns the L&F object that renders this component.
*
* @return the ButtonBarUI object
* @see #setUI
*/
public ButtonBarUI getUI() {
return (ButtonBarUI)ui;
}
/**
* Sets the L&F object that renders this component.
*
* @param ui the <code>ButtonBarUI</code> L&F object
* @see javax.swing.UIDefaults#getUI
*
* @beaninfo bound: true hidden: true description: The UI object that
* implements the buttonbar's LookAndFeel.
*/
public void setUI(ButtonBarUI ui) {
super.setUI(ui);
Component[] components = getComponents();
// whenever our UI is changed, make sure UI of our buttons is updated.
for (int i = 0, c = components.length; i < c; i++) {
if (components[i] instanceof AbstractButton) {
ui.installButtonBarUI((AbstractButton)components[i]);
}
}
}
/**
* Returns the name of the L&F class that renders this component.
*
* @return the string {@link #UI_CLASS_ID}
* @see javax.swing.JComponent#getUIClassID
* @see javax.swing.UIDefaults#getUI
*/
public String getUIClassID() {
return UI_CLASS_ID;
}
/**
* Sets the orientation of the bar. The orientation must have either the
* value <code>HORIZONTAL</code> or <code>VERTICAL</code>. If <code>orientation</code>
* is an invalid value, an exception will be thrown.
*
* @param orientation the new orientation -- either <code>HORIZONTAL</code>
* or</code> VERTICAL</code>
* @exception IllegalArgumentException if orientation is neither <code>
* HORIZONTAL</code> nor <code>VERTICAL</code>
* @see #getOrientation @beaninfo description: The current orientation of the
* bar bound: true preferred: true
*/
public void setOrientation(int orientation) {
if (!(orientation == HORIZONTAL || orientation == VERTICAL)) {
throw new IllegalArgumentException(
"orientation must be one of: " + "VERTICAL, HORIZONTAL");
}
if (this.orientation != orientation) {
int oldOrientation = this.orientation;
this.orientation = orientation;
firePropertyChange(
ORIENTATION_CHANGED_KEY,
oldOrientation,
this.orientation);
}
}
public int getOrientation() {
return orientation;
}
/**
* This listener ensures the UI of buttons added to the JButtonBar gets reset
* everytime it is changed to a pluggable UI which does not implement
* ButtonBarUI.
*/
private static PropertyChangeListener uiUpdater =
new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getSource() instanceof AbstractButton) {
AbstractButton button = (AbstractButton)evt.getSource();
if (button.getParent() instanceof JButtonBar
&& !(button.getUI() instanceof ButtonBarButtonUI)) {
(
(ButtonBarUI)
((JButtonBar)button.getParent()).ui).installButtonBarUI(
button);
}
}
}
};
/**
* This listener tracks buttons added to a JButtonBar. When a button is
* added, it updates its UI and ensures further ui changes will be tracked
* too. When the button is removed, it is no longer tracked.
*/
private static ContainerListener buttonTracker = new ContainerAdapter() {
public void componentAdded(ContainerEvent e) {
JButtonBar container = (JButtonBar)e.getContainer();
if (e.getChild() instanceof AbstractButton) {
((ButtonBarUI)container.ui).installButtonBarUI(
(AbstractButton)e.getChild());
((AbstractButton)e.getChild()).addPropertyChangeListener(
"UI",
JButtonBar.uiUpdater);
}
}
public void componentRemoved(ContainerEvent e) {
if (e.getChild() instanceof AbstractButton) {
((AbstractButton)e.getChild()).removePropertyChangeListener("UI",
JButtonBar.uiUpdater);
}
}
};
}