org.pushingpixels.flamingo.api.ribbon.AbstractRibbonBand Maven / Gradle / Ivy
/*
* Copyright (c) 2005-2010 Flamingo Kirill Grouchnikov. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* o Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* o Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* o Neither the name of Flamingo Kirill Grouchnikov nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.pushingpixels.flamingo.api.ribbon;
import java.awt.event.ActionListener;
import java.util.Collections;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.UIManager;
import org.pushingpixels.flamingo.api.common.RichTooltip;
import org.pushingpixels.flamingo.api.common.icon.ResizableIcon;
import org.pushingpixels.flamingo.api.ribbon.resize.*;
import org.pushingpixels.flamingo.internal.ui.ribbon.*;
import org.pushingpixels.flamingo.internal.utils.FlamingoUtilities;
/**
* Ribbon band. Is part of a logical {@link RibbonTask}. This is an abstract
* base class for two types of ribbon bands - flow in {@link JFlowRibbonBand}
* and general in {@link JRibbonBand}.
*
*
* This class provides the following common functionality:
*
*
* - Tracking the available and current resize policies.
* - Tracking the collapsed state of the ribbon band - when there is not
* enough horizontal space to show this panel under the smallest resize setting
* (see {@link RibbonBandResizePolicy} and {@link CoreRibbonResizePolicies}) -
* the band content is replaced by one collapsed button. When that button is
* activated, the original ribbon band content is shown in a popup panel.
* - Associating key tip and rich tooltip with the expand button of the ribbon
* band.
* - Associating key tip with the collapsed button of the ribbon band.
*
*
* @author Kirill Grouchnikov
* @param
* Class parameter that specifies the type of band control panel
* implementation.
*/
public abstract class AbstractRibbonBand
extends JComponent {
/**
* The UI class ID string.
*/
public static final String uiClassID = "RibbonBandUI";
/**
* The ribbon task of this ribbon band.
*/
RibbonTask ribbonTask;
/**
* Band title.
*
* @see #getTitle()
* @see #setTitle(String)
*/
private String title;
/**
* Optional expand
action listener. If present, the title pane
* shows button with plus sign. The action listener on the button will be
* this
listener.
*
* @see #getExpandActionListener()
* @see #AbstractRibbonBand(String, ResizableIcon, ActionListener,
* AbstractBandControlPanel)
*/
private ActionListener expandActionListener;
/**
* Band control panel. When there is not enough horizontal space to show
* this panel under the smallest resize setting, the control panel is hidden
* and a collapsed button is shown. When this collapsed button is activated,
* it shows the {@link #popupRibbonBand} in a popup panel. The collapsed
* button itself is implemented as a part of the UI delegate in
* {@link BasicRibbonBandUI}.
*
* @see #popupRibbonBand
* @see #icon
*/
protected T controlPanel;
/**
* Ribbon band shown in a popup panel when this ribbon band is in a
* collapsed state.
*
* @see #controlPanel
* @see #getPopupRibbonBand()
* @see #setPopupRibbonBand(AbstractRibbonBand)
*/
private AbstractRibbonBand popupRibbonBand;
/**
* Icon for the collapsed state. Is set on the button that represents the
* collapsed state of this band. The collapsed button itself is implemented
* as a part of the UI delegate in {@link BasicRibbonBandUI}.
*
* @see #getIcon()
*/
private ResizableIcon icon;
/**
* The current resize policy for this band. Must be one of the policies in
* the {@link #resizePolicies} list.
*
* @see #resizePolicies
* @see #setCurrentResizePolicy(RibbonBandResizePolicy)
* @see #getCurrentResizePolicy()
*/
private RibbonBandResizePolicy currResizePolicy;
/**
* The list of available resize policies.
*
* @see #currResizePolicy
* @see #setResizePolicies(List)
* @see #getResizePolicies()
* @see #getCurrentResizePolicy()
*/
protected List resizePolicies;
/**
* The key tip for the ribbon band expand button. Is relevant only when
* {@link #expandActionListener} is not null
.
*
* @see #setExpandButtonKeyTip(String)
* @see #getExpandButtonKeyTip()
*/
private String expandButtonKeyTip;
/**
* The rich tooltip for the ribbon band expand button. Is relevant only when
* {@link #expandActionListener} is not null
.
*
* @see #setExpandButtonRichTooltip(RichTooltip)
* @see #getExpandButtonRichTooltip()
*/
private RichTooltip expandButtonRichTooltip;
/**
* The key tip for the collapsed button which is shown when there is not
* enough horizontal space to show the ribbon band content under the most
* restrictive resize policy. The collapsed button itself is implemented as
* a part of the UI delegate in {@link BasicRibbonBandUI}.
*
* @see #setCollapsedStateKeyTip(String)
* @see #getCollapsedStateKeyTip()
*/
private String collapsedStateKeyTip;
/**
* Creates a new ribbon band.
*
* @param title
* Band title.
* @param icon
* Associated icon (for collapsed state).
* @param expandActionListener
* Expand action listener (can be null
).
* @param controlPanel
* The control panel of this ribbon band.
*/
public AbstractRibbonBand(String title, ResizableIcon icon,
ActionListener expandActionListener, T controlPanel) {
super();
this.title = title;
this.icon = icon;
this.expandActionListener = expandActionListener;
this.controlPanel = controlPanel;
this.controlPanel.setRibbonBand(this);
this.add(this.controlPanel);
updateUI();
}
/**
* Returns a clone of this ribbon band.
*
* @return A clone of this ribbon band.
*/
public abstract AbstractRibbonBand cloneBand();
/**
* Returns the UI object which implements the L&F for this component.
*
* @return a RibbonBandUI
object
* @see #setUI
*/
public RibbonBandUI getUI() {
return (RibbonBandUI) ui;
}
/**
* Sets the new UI delegate.
*
* @param ui
* New UI delegate.
*/
public void setUI(RibbonBandUI ui) {
super.setUI(ui);
}
/*
* (non-Javadoc)
*
* @see javax.swing.JComponent#updateUI()
*/
@Override
public void updateUI() {
if (UIManager.get(getUIClassID()) != null) {
setUI((RibbonBandUI) UIManager.getUI(this));
} else {
setUI(new BasicRibbonBandUI());
}
}
/*
* (non-Javadoc)
*
* @see javax.swing.JComponent#getUIClassID()
*/
@Override
public String getUIClassID() {
return uiClassID;
}
/**
* Returns the title of this
band.
*
* @return Title of this
band.
* @see #setTitle(String)
*/
public String getTitle() {
return this.title;
}
/**
* Returns the icon for the collapsed state.
*
* @return The icon for the collapsed state.
* @see #AbstractRibbonBand(String, ResizableIcon, ActionListener,
* AbstractBandControlPanel)
*/
public ResizableIcon getIcon() {
return this.icon;
}
/**
* Changes the title of this ribbon band. Fires a title
* property change event.
*
* @param title
* The new title for this ribbon band.
* @see #AbstractRibbonBand(String, ResizableIcon, ActionListener,
* AbstractBandControlPanel)
* @see #getTitle()
*/
public void setTitle(String title) {
String old = this.title;
this.title = title;
this.firePropertyChange("title", old, this.title);
}
/**
* Returns the expand action listener of this
ribbon band. The
* result may be null
.
*
* @return Expand action listener of this
ribbon band.
* @see #AbstractRibbonBand(String, ResizableIcon, ActionListener,
* AbstractBandControlPanel)
* @see #setExpandActionListener(ActionListener)
*/
public ActionListener getExpandActionListener() {
return this.expandActionListener;
}
/**
* Sets the specified action listener to be activated when the user clicks
* the expand button on this ribbon band. Passing null
will
* remove the expand button from this ribbon band.
*
* @param expandActionListener
* Expand action listener for this ribbon band.
* @see #getExpandActionListener()
*/
public void setExpandActionListener(ActionListener expandActionListener) {
ActionListener old = this.expandActionListener;
this.expandActionListener = expandActionListener;
this.firePropertyChange("expandActionListener", old,
this.expandActionListener);
}
/**
* Returns the control panel of this
ribbon band. The result
* may be null
.
*
* @return Control panel of this
ribbon band.
* @see #AbstractRibbonBand(String, ResizableIcon, ActionListener,
* AbstractBandControlPanel)
* @see #setControlPanel(AbstractBandControlPanel)
*/
public T getControlPanel() {
return this.controlPanel;
}
/**
* Sets the control panel of this
ribbon band. The parameter
* may be null
. This method is for internal use only.
*
* @param controlPanel
* The new control panel for this
ribbon band. May
* be null
.
* @see #AbstractRibbonBand(String, ResizableIcon, ActionListener,
* AbstractBandControlPanel)
* @see #getControlPanel()
*/
public void setControlPanel(T controlPanel) {
if (controlPanel == null) {
this.remove(this.controlPanel);
} else {
this.add(controlPanel);
controlPanel.applyComponentOrientation(this
.getComponentOrientation());
}
this.controlPanel = controlPanel;
}
/**
* Returns the ribbon band shown in a popup panel when this ribbon band is
* in a collapsed state. This method is for internal use only and should not
* be called by the application code.
*
* @return The ribbon band shown in a popup panel when this ribbon band is
* in a collapsed state.
* @see #setPopupRibbonBand(AbstractRibbonBand)
*/
public AbstractRibbonBand getPopupRibbonBand() {
return this.popupRibbonBand;
}
/**
* Sets the specified parameter to be the ribbon band shown in a popup panel
* when this ribbon band is in a collapsed state. This method is for
* internal use only and should not be called by the application code.
*
* @param popupRibbonBand
* The ribbon band to be shown in a popup panel when this ribbon
* band is in a collapsed state.
*/
public void setPopupRibbonBand(AbstractRibbonBand popupRibbonBand) {
this.popupRibbonBand = popupRibbonBand;
if (this.popupRibbonBand != null) {
popupRibbonBand.applyComponentOrientation(this
.getComponentOrientation());
}
}
/**
* Returns the current resize policy of this ribbon band.
*
* @return The current resize policy of this ribbon band.
*/
public RibbonBandResizePolicy getCurrentResizePolicy() {
return currResizePolicy;
}
/**
* Sets the specified parameter to be the current resize policy of this
* ribbon band. This method is for internal use only and should not be
* called by the application code.
*
* @param resizePolicy
* The new resize policy for this ribbon band.
* @see #getCurrentResizePolicy()
* @see #getResizePolicies()
*/
public void setCurrentResizePolicy(RibbonBandResizePolicy resizePolicy) {
this.currResizePolicy = resizePolicy;
}
/**
* Returns an unmodifiable list of available resize policies of this ribbon
* band.
*
* @return An unmodifiable list of available resize policies of this ribbon
* band.
*/
public List getResizePolicies() {
return Collections.unmodifiableList(this.resizePolicies);
}
/**
* Sets the specified parameter as the available resize policies of this
* ribbon band. The order of the resize policies in this list is important.
* The first entry in the list must be the most permissive policies that
* returns the largest value from its
* {@link RibbonBandResizePolicy#getPreferredWidth(int, int)}. Each
* successive entry in the list must return the value smaller than its
* predecessors. If {@link IconRibbonBandResizePolicy} is in the list, it
* must be the last entry.
*
* @param resizePolicies
* The new available resize policies of this ribbon band.
*/
public void setResizePolicies(List resizePolicies) {
this.resizePolicies = Collections.unmodifiableList(resizePolicies);
if (this.ribbonTask != null) {
FlamingoUtilities.checkResizePoliciesConsistency(this);
}
}
/**
* Returns the key tip for the expand button of this ribbon band.
*
* @return The key tip for the expand button of this ribbon band.
* @see #setExpandButtonKeyTip(String)
*/
public String getExpandButtonKeyTip() {
return this.expandButtonKeyTip;
}
/**
* Changes the key tip for the expand button of this ribbon band. Fires an
* expandButtonKeyTip
property change event.
*
* @param expandButtonKeyTip
* The new key tip for the expand button of this ribbon band.
* @see #getExpandButtonKeyTip()
*/
public void setExpandButtonKeyTip(String expandButtonKeyTip) {
String old = this.expandButtonKeyTip;
this.expandButtonKeyTip = expandButtonKeyTip;
this.firePropertyChange("expandButtonKeyTip", old,
this.expandButtonKeyTip);
}
/**
* Returns the rich tooltip for the expand button of this ribbon band.
*
* @return The rich tooltip for the expand button of this ribbon band.
* @see #setExpandButtonRichTooltip(RichTooltip)
*/
public RichTooltip getExpandButtonRichTooltip() {
return this.expandButtonRichTooltip;
}
/**
* Changes the rich tooltip for the expand button of this ribbon band. Fires
* an expandButtonRichTooltip
property change event.
*
* @param expandButtonRichTooltip
* The new rich tooltip for the expand button of this ribbon
* band.
* @see #getExpandButtonRichTooltip()
*/
public void setExpandButtonRichTooltip(RichTooltip expandButtonRichTooltip) {
RichTooltip old = this.expandButtonRichTooltip;
this.expandButtonRichTooltip = expandButtonRichTooltip;
this.firePropertyChange("expandButtonRichTooltip", old,
this.expandButtonRichTooltip);
}
/**
* Returns the key tip for the collapsed button which is shown when there is
* not enough horizontal space to show the ribbon band content under the
* most restrictive resize policy.
*
* @return The key tip for the collapsed button of this ribbon band.
* @see #setCollapsedStateKeyTip(String)
*/
public String getCollapsedStateKeyTip() {
return this.collapsedStateKeyTip;
}
/**
* Changes the key tip for the collapsed button which is shown when there is
* not enough horizontal space to show the ribbon band content under the
* most restrictive resize policy. Fires a collapsedStateKeyTip
* property change event.
*
* @param collapsedStateKeyTip
* The new key tip for the collapsed button of this ribbon band.
* @see #getCollapsedStateKeyTip()
*/
public void setCollapsedStateKeyTip(String collapsedStateKeyTip) {
String old = this.collapsedStateKeyTip;
this.collapsedStateKeyTip = collapsedStateKeyTip;
this.firePropertyChange("collapsedStateKeyTip", old,
this.collapsedStateKeyTip);
}
/**
* Associates this ribbon band with the specified ribbon task.
*
* @param ribbonTask
* Ribbon task.
* @throws IllegalArgumentException
* When this ribbon band has already been associated with a
* ribbon task.
*/
void setRibbonTask(RibbonTask ribbonTask) {
if (this.ribbonTask != null) {
throw new IllegalArgumentException(
"Ribbon band cannot be added to more than one ribbon task");
}
this.ribbonTask = ribbonTask;
FlamingoUtilities.checkResizePoliciesConsistency(this);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy