/*
* Jitsi, the OpenSource Java VoIP and Instant Messaging client.
*
* Copyright @ 2015 Atlassian Pty Ltd
*
* 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 net.java.sip.communicator.plugin.desktoputil;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import org.jvnet.lafwidget.animation.*;
/**
* The <tt>FadeInBaloonPanel</tt> is a semi-transparent "balloon" panel, which
* could be shown in a glass pane for example. You can define a begin point,
* where the balloon triangle would show.
*
* @author Yana Stamcheva
*/
public class FadeInBalloonPanel
extends TransparentPanel
{
/**
* The begin point, where the balloon triangle will be shown.
*/
private Point beginPoint;
/**
* The begin point shift, which defines the rectangle point shift.
*/
private final static int beginPointShift = 6;
/**
* Sets the begin point.
*
* @param beginPoint the begin point
*/
public void setBeginPoint(Point beginPoint)
{
this.beginPoint = beginPoint;
}
/**
* Overrides the <code>paintComponent</code> method of <tt>JButton</tt> to
* paint the button background and icon, and all additional effects of this
* configurable button.
*
* @param g The Graphics object.
*/
@Override
protected void paintComponent(Graphics g)
{
g = g.create();
try
{
internalPaintComponent((Graphics2D) g);
}
finally
{
g.dispose();
}
}
/**
* Paints this button.
* @param g the <tt>Graphics</tt> object used for painting
*/
private void internalPaintComponent(Graphics2D g)
{
AntialiasingManager.activateAntialiasing(g);
/*
* As JComponent#paintComponent says, if you do not invoke super's
* implementation you must honor the opaque property, that is if this
* component is opaque, you must completely fill in the background in a
* non-opaque color. If you do not honor the opaque property you will
* likely see visual artifacts.
*/
if (isOpaque())
{
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
}
// Paint a roll over fade out.
FadeTracker fadeTracker = FadeTracker.getInstance();
float visibility = isVisible() ? 0.8f : 0.0f;
if (fadeTracker.isTracked(this, FadeKind.ROLLOVER))
{
visibility = fadeTracker.getFade(this, FadeKind.ROLLOVER);
}
g.setColor(new Color(0f, 0f, 0f, visibility));
int y = 0;
// draw triangle (polygon)
if (beginPoint != null)
{
y = beginPointShift;
int x1Points[] = { beginPoint.x,
beginPoint.x + beginPointShift,
beginPoint.x - beginPointShift};
int y1Points[] = { beginPoint.y,
beginPoint.y + beginPointShift,
beginPoint.y + beginPointShift};
GeneralPath polygon =
new GeneralPath(GeneralPath.WIND_EVEN_ODD,
x1Points.length);
polygon.moveTo(x1Points[0], y1Points[0]);
for (int index = 1; index < x1Points.length; index++) {
polygon.lineTo(x1Points[index], y1Points[index]);
};
polygon.closePath();
g.fill(polygon);
}
if (visibility != 0.0f)
{
g.fillRoundRect(
0, y, this.getWidth(), this.getHeight(), 10, 10);
}
}
/**
* The <tt>ButtonRepaintCallback</tt> is charged to repaint this button
* when the fade animation is performed.
*/
private class PanelRepaintCallback implements FadeTrackerCallback
{
public void fadeEnded(FadeKind arg0)
{
repaintLater();
}
public void fadePerformed(FadeKind arg0, float arg1)
{
repaintLater();
}
private void repaintLater()
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
FadeInBalloonPanel.this.repaint();
}
});
}
public void fadeReversed(FadeKind arg0, boolean arg1, float arg2)
{
}
}
/**
* Shows/hides this panel.
*
* @param isVisible <tt>true</tt> to show this panel, <tt>false</tt> to
* hide it
*/
@Override
public void setVisible(boolean isVisible)
{
FadeTracker fadeTracker = FadeTracker.getInstance();
if (isVisible)
{
fadeTracker.trackFadeIn(FadeKind.ROLLOVER,
FadeInBalloonPanel.this,
true,
new PanelRepaintCallback());
}
else
{
fadeTracker.trackFadeOut(FadeKind.ROLLOVER,
FadeInBalloonPanel.this,
true,
new PanelRepaintCallback());
}
}
}