/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package net.java.sip.communicator.impl.gui.lookandfeel;
import java.awt.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.plaf.*;
import javax.swing.plaf.metal.*;
import net.java.sip.communicator.impl.gui.utils.*;
import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.util.skin.*;
/**
* SIPCommButtonUI implementation.
*
* @author Yana Stamcheva
*/
public class SIPCommButtonUI
extends MetalButtonUI
implements Skinnable
{
/**
* The background button image.
*/
private static BufferedImage buttonBG
= ImageLoader.getImage(ImageLoader.BUTTON);
/**
* The background image for the pressed button state.
*/
private static BufferedImage buttonRolloverBG
= ImageLoader.getImage(ImageLoader.BUTTON_ROLLOVER);
/**
* Indicates if the button is in rollover state.
*/
private boolean bufferIsRollover = false;
/**
* The paint buffer.
*/
private BufferedImage paintBuffer = null;
/**
* The buffered component.
*/
private Component bufferedComponent = null;
/**
* Creates the UI for the given JComponent.
*
* @param c the JComponent, for which to create an UI
* @return the component UI
*/
public static ComponentUI createUI(JComponent c)
{
return new SIPCommButtonUI();
}
/**
* Installs default configurations for the given AbstractButton.
*
* @param b the button, for which we're installing the defaults
*/
@Override
public void installDefaults(AbstractButton b)
{
super.installDefaults(b);
b.setOpaque(false);
b.setBorderPainted(false);
b.setFocusPainted(true);
b.setRolloverEnabled(true);
}
/**
* Uninstalls default configurations for the given AbstractButton.
*
* @param b the button, for which we're uninstalling the defaults
*/
@Override
public void uninstallDefaults(AbstractButton b)
{
super.uninstallDefaults(b);
b.setBorderPainted(true);
b.setFocusPainted(false);
b.setOpaque(true);
b.setRolloverEnabled(false);
}
/**
* Paints this button UI.
*
* @param g the Graphics object used for painting
* @param c the Component to paint
*/
@Override
public void paint(Graphics g, JComponent c)
{
AbstractButton button = (AbstractButton)c;
ButtonModel model = button.getModel();
// check if the context of the buffer is consistent or else recreate it
if (paintBuffer == null || c != bufferedComponent
|| bufferIsRollover != model.isRollover())
{
// create a buffer in the best available format
paintBuffer = ((Graphics2D) g).getDeviceConfiguration().
createCompatibleImage(c.getWidth(), c.getHeight(),
Transparency.TRANSLUCENT);
// save the context
bufferedComponent = c;
bufferIsRollover = model.isRollover();
// draw in the buffer
BufferedImage leftImg;
BufferedImage middleImg;
BufferedImage rightImg;
int imgWidth;
int imgHeight;
int indentWidth = 10;
if(bufferIsRollover){
imgWidth = buttonRolloverBG.getWidth();
imgHeight = buttonRolloverBG.getHeight();
leftImg = buttonRolloverBG.getSubimage(0, 0, indentWidth,
imgHeight);
middleImg = buttonRolloverBG.getSubimage(indentWidth, 0,
imgWidth-2*indentWidth,
imgHeight);
rightImg = buttonRolloverBG.getSubimage(imgWidth-indentWidth, 0,
indentWidth, imgHeight);
}
else{
imgWidth = buttonBG.getWidth();
imgHeight = buttonBG.getHeight();
leftImg = buttonBG.getSubimage(0, 0, 10, imgHeight);
middleImg = buttonBG.getSubimage(10, 0, imgWidth-20, imgHeight);
rightImg = buttonBG.getSubimage(imgWidth-10, 0, 10, imgHeight);
}
Graphics2D g2 = paintBuffer.createGraphics();
AntialiasingManager.activateAntialiasing(g2);
g2.drawImage(leftImg, 0, 0, indentWidth, c.getHeight(), null);
g2.drawImage(middleImg, indentWidth, 0,
c.getWidth() - 2 * indentWidth, c.getHeight(), null);
g2.drawImage(rightImg, c.getWidth() - indentWidth, 0,
indentWidth, c.getHeight(), null);
}
AntialiasingManager.activateAntialiasing(g);
// draw the buffer in the graphics object
g.drawImage(paintBuffer, 0, 0, c.getWidth(), c.getHeight(),
0, 0, c.getWidth(), c.getHeight(), null);
super.paint(g, c);
}
/**
* Paints the focused view of the given AbstractButton.
*
* @param g the Graphics object used for painting
* @param b the button to paint
* @param viewRect the rectangle indicating the bounds of the focused button
* @param textRect the rectangle indicating the bounds of the text
* @param iconRect the rectangle indicating the bounds of the icon
*/
@Override
protected void paintFocus(Graphics g, AbstractButton b,
Rectangle viewRect, Rectangle textRect, Rectangle iconRect)
{
Graphics2D g2 = (Graphics2D)g;
Rectangle focusRect = new Rectangle();
String text = b.getText();
boolean isIcon = b.getIcon() != null;
// If there is text
if ( text != null && !text.equals( "" ) )
{
if ( !isIcon )
{
focusRect.setBounds( textRect );
}
else
{
focusRect.setBounds( iconRect.union( textRect ) );
}
}
// If there is an icon and no text
else if ( isIcon )
{
focusRect.setBounds( iconRect );
}
g2.setStroke(new BasicStroke(0.5f,// Width
BasicStroke.CAP_ROUND, // End cap
BasicStroke.JOIN_ROUND, // Join style
10.0f, // Miter limit
new float[] {1.0f,1.0f},// Dash pattern
2.0f));
g2.setColor(Color.GRAY);
g2.drawRoundRect((focusRect.x-3), (focusRect.y-3),
focusRect.width+4, focusRect.height+4, 5, 5);
}
/**
* Overriden to do nothing.
*/
@Override
protected void paintButtonPressed(Graphics g, AbstractButton b)
{
if ( b.isContentAreaFilled() )
{
Dimension size = b.getSize();
g.setColor(getSelectColor());
g.fillRoundRect(0, 0, size.width, size.height, 5, 5);
}
}
/**
* Reloads buffered images.
*/
public void loadSkin()
{
buttonBG
= ImageLoader.getImage(ImageLoader.BUTTON);
buttonRolloverBG
= ImageLoader.getImage(ImageLoader.BUTTON_ROLLOVER);
paintBuffer = null;
}
}