/*
|
* CDDL HEADER START
|
*
|
* The contents of this file are subject to the terms of the
|
* Common Development and Distribution License, Version 1.0 only
|
* (the "License"). You may not use this file except in compliance
|
* with the License.
|
*
|
* You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
|
* or http://forgerock.org/license/CDDLv1.0.html.
|
* See the License for the specific language governing permissions
|
* and limitations under the License.
|
*
|
* When distributing Covered Code, include this CDDL HEADER in each
|
* file and include the License file at legal-notices/CDDLv1_0.txt.
|
* If applicable, add the following below this CDDL HEADER, with the
|
* fields enclosed by brackets "[]" replaced with your own identifying
|
* information:
|
* Portions Copyright [yyyy] [name of copyright owner]
|
*
|
* CDDL HEADER END
|
*
|
*
|
* Copyright 2008-2009 Sun Microsystems, Inc.
|
* Portions Copyright 2014 ForgeRock AS
|
*/
|
|
|
package org.opends.guitools.controlpanel.ui.components;
|
|
import java.awt.Color;
|
import java.awt.Dimension;
|
import java.awt.Font;
|
import java.awt.Graphics;
|
import java.awt.event.ActionEvent;
|
import java.awt.event.MouseEvent;
|
|
import javax.swing.BorderFactory;
|
import javax.swing.JButton;
|
import javax.swing.SwingConstants;
|
import javax.swing.SwingUtilities;
|
import javax.swing.UIManager;
|
import javax.swing.border.Border;
|
import javax.swing.border.EmptyBorder;
|
|
import org.opends.guitools.controlpanel.datamodel.Action;
|
import org.opends.guitools.controlpanel.datamodel.Category;
|
import org.opends.guitools.controlpanel.ui.ColorAndFontConstants;
|
import org.forgerock.i18n.LocalizableMessage;
|
|
/**
|
* A basic extension of a button that changes its rendering so that the looks
|
* are more similar to a row in a list. It is used in the actions on the left
|
* of the main Control Center dialog (in actions like 'Manage Entries...',
|
* 'Import from LDIF...' etc.
|
*
|
*/
|
public class ActionButton extends JButton
|
{
|
private static final long serialVersionUID = -1898192406268037714L;
|
|
private Action action;
|
private boolean isBeingPressed;
|
private boolean hasMouseOver;
|
private static Border buttonBorder;
|
private static Border focusBorder;
|
static
|
{
|
//Calculate border based on category settings
|
Category cat = new Category();
|
cat.setName(LocalizableMessage.EMPTY);
|
CategoryButton b = new CategoryButton(cat);
|
int n = b.getIconTextGap() + b.getIcon().getIconWidth() +
|
b.getBorder().getBorderInsets(b).left;
|
buttonBorder = new EmptyBorder(5, n, 5, 25);
|
Border highlightBorder =
|
UIManager.getBorder("List.focusCellHighlightBorder");
|
// This is required (see issue
|
// https://opends.dev.java.net/issues/show_bug.cgi?id=4400)
|
// since in OpenJDK the CompoundBorder class does not handle properly
|
// null insets.
|
if (highlightBorder != null)
|
{
|
try
|
{
|
b.setBorder(BorderFactory.createCompoundBorder(
|
highlightBorder, buttonBorder));
|
}
|
catch (Throwable t)
|
{
|
highlightBorder = null;
|
}
|
}
|
if (highlightBorder == null)
|
{
|
highlightBorder =
|
new javax.swing.plaf.BorderUIResource.LineBorderUIResource(
|
ColorAndFontConstants.pressedForeground, 1);
|
}
|
focusBorder = BorderFactory.createCompoundBorder(
|
highlightBorder, buttonBorder);
|
};
|
|
private static final Color defaultBackground =
|
ColorAndFontConstants.background;
|
|
private static final Color defaultForeground =
|
ColorAndFontConstants.foreground;
|
|
private static final Color mouseOverBackground =
|
ColorAndFontConstants.mouseOverBackground;
|
|
private static final Color mouseOverForeground =
|
ColorAndFontConstants.mouseOverForeground;
|
|
private static final Color pressedBackground =
|
ColorAndFontConstants.pressedBackground;
|
|
private static final Color pressedForeground =
|
ColorAndFontConstants.pressedForeground;
|
|
private static final Font actionFont = ColorAndFontConstants.defaultFont;
|
|
|
/**
|
* Creates a button associated with the provided action.
|
* @param action the action.
|
*/
|
public ActionButton(Action action) {
|
super();
|
this.action = action;
|
setText(action.getName().toString());
|
setIconTextGap(0);
|
setHorizontalTextPosition(SwingConstants.TRAILING);
|
setHorizontalAlignment(SwingConstants.LEADING);
|
setOpaque(true);
|
|
setBorder(buttonBorder);
|
setFont(actionFont);
|
|
setFocusPainted(true);
|
setContentAreaFilled(false);
|
setToolTipText(action.getName().toString());
|
setRolloverEnabled(false);
|
|
Dimension d1 = getPreferredSize();
|
setBorder(focusBorder);
|
Dimension d2 = getPreferredSize();
|
setPreferredSize(new Dimension(Math.max(d1.width,d2.width),
|
Math.max(d1.height, d2.height)));
|
setBorder(buttonBorder);
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
public void actionPerformed(ActionEvent ev)
|
{
|
isBeingPressed = true;
|
final boolean[] hadMouseOver = {hasMouseOver};
|
hasMouseOver = true;
|
repaint();
|
SwingUtilities.invokeLater(new Runnable()
|
{
|
public void run()
|
{
|
isBeingPressed = false;
|
hasMouseOver = hadMouseOver[0];
|
repaint();
|
}
|
});
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
public void mousePressed(MouseEvent e)
|
{
|
isBeingPressed = true;
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
public void mouseReleased(MouseEvent e)
|
{
|
isBeingPressed = false;
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
public void mouseExited(MouseEvent e)
|
{
|
hasMouseOver = false;
|
repaint();
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
public void mouseEntered(MouseEvent e)
|
{
|
hasMouseOver = true;
|
repaint();
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
public void updateUI() {
|
super.updateUI();
|
// some look and feels replace our border, so take it back
|
setBorder(buttonBorder);
|
}
|
|
/**
|
* {@inheritDoc}
|
*/
|
protected void paintComponent(Graphics g) {
|
setBorder(hasFocus() ? focusBorder : buttonBorder);
|
if (isBeingPressed && hasMouseOver)
|
{
|
setBackground(pressedBackground);
|
g.setColor(pressedBackground);
|
Dimension size = getSize();
|
g.fillRect(0, 0, size.width, size.height);
|
setForeground(pressedForeground);
|
}
|
else if (hasMouseOver)
|
{
|
setBackground(mouseOverBackground);
|
g.setColor(mouseOverBackground);
|
Dimension size = getSize();
|
g.fillRect(0, 0, size.width, size.height);
|
setForeground(mouseOverForeground);
|
}
|
else {
|
setBackground(defaultBackground);
|
g.setColor(defaultBackground);
|
Dimension size = getSize();
|
g.fillRect(0, 0, size.width, size.height);
|
setForeground(defaultForeground);
|
}
|
super.paintComponent(g);
|
}
|
|
/**
|
* Returns the action associated with this button.
|
* @return the action associated with this button.
|
*/
|
public Action getActionObject() {
|
return action;
|
}
|
}
|