/*
* 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.impl.gui.main.chat;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.util.*;
import net.java.sip.communicator.util.skin.*;
import org.jitsi.service.resources.*;
/**
* The ChatConversationComponent is a component that can be added to
* the conversation area of the chat window in order to display any special
* events.
*
* @author Yana Stamcheva
* @author Adam Netocny
*/
public abstract class ChatConversationComponent
extends JPanel
implements Skinnable
{
/**
* The logger for this class.
*/
private static final Logger logger
= Logger.getLogger(ChatConversationComponent.class);
/**
* The constraints used to layout this component.
*/
protected final GridBagConstraints constraints = new GridBagConstraints();
/**
* Chat conversation default background color.
*/
private static Color defaultColor
= new Color(GuiActivator.getResources()
.getColor("service.gui.CHAT_CONVERSATION_COMPONENT"));
/**
* Chat conversation default warning background color.
*/
private static Color warningColor
= new Color(GuiActivator.getResources()
.getColor("service.gui.CHAT_CONVERSATION_WARNING_COMPONENT"));
/**
* Initializes the background color with the default color.
*/
private Color backgroundColor = defaultColor;
/**
* The service through which we access resources like colors.
*/
protected static final ResourceManagementService resources
= GuiActivator.getResources();
/**
* Creates a ChatConversationComponent.
*/
public ChatConversationComponent()
{
this.setLayout(new GridBagLayout());
this.setOpaque(false);
this.setCursor(Cursor.getDefaultCursor());
}
/**
* Reloads color information.
*/
public void loadSkin()
{
boolean defaultCol = false;
if(backgroundColor == defaultColor)
defaultCol = true;
defaultColor = new Color(GuiActivator.getResources()
.getColor("service.gui.CHAT_CONVERSATION_COMPONENT"));
warningColor = new Color(GuiActivator.getResources()
.getColor("service.gui.CHAT_CONVERSATION_WARNING_COMPONENT"));
if(defaultCol)
backgroundColor = defaultColor;
else
backgroundColor = warningColor;
}
/**
* A specially customized button to fit better chat conversation component
* look and feel.
*/
protected class ChatConversationButton
extends JButton
implements Skinnable
{
/**
* Initializes the ChatConversationButton.
*/
public ChatConversationButton()
{
init();
}
/**
* Create a new RolloverButton.
*
* @param text the button text.
* @param icon the button icon.
*/
public ChatConversationButton(String text, Icon icon)
{
super(text, icon);
init();
}
/**
* Decorates the button with the appropriate UI configurations.
*/
private void init()
{
loadSkin();
setFont(getFont().deriveFont(Font.BOLD, 11f));
setBorder(BorderFactory.createEmptyBorder());
setBorderPainted(false);
setOpaque(true);
setContentAreaFilled(false);
this.addMouseListener(new MouseAdapter()
{
@Override
public void mouseEntered(MouseEvent e)
{
setCursor(new Cursor(Cursor.HAND_CURSOR));
}
@Override
public void mouseExited(MouseEvent e)
{
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
});
}
/**
* Reloads color information.
*/
public void loadSkin()
{
int color = GuiActivator.getResources()
.getColor("service.gui.CHAT_LINK_COLOR");
setForeground(new Color(color));
}
}
/**
* Updates the background color to catch user attention if anything
* unexpected has happened.
*
* @param isWarningStyle true
to indicate that the warning
* style should be set, false
- otherwise.
*/
protected void setWarningStyle(boolean isWarningStyle)
{
if (isWarningStyle)
backgroundColor = warningColor;
else
backgroundColor = defaultColor;
this.repaint();
}
/**
* Call a custom internal paint.
*
* @param g the Graphics object used for painting
*/
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g = g.create();
try
{
internalPaintComponent(g);
}
finally
{
g.dispose();
}
}
/**
* Paints a round background for this component.
*
* @param g the Graphics object
*/
private void internalPaintComponent(Graphics g)
{
AntialiasingManager.activateAntialiasing(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(backgroundColor);
g2.fillRoundRect(
1, 1, this.getWidth() - 1, this.getHeight() -1, 15, 15);
}
/**
* Opens the given file through the DesktopService.
*
* @param downloadFile the file to open
*/
protected void openFile(File downloadFile)
{
try
{
GuiActivator.getDesktopService().open(downloadFile);
}
catch (IllegalArgumentException e)
{
if (logger.isDebugEnabled())
logger.debug("Unable to open file.", e);
this.showErrorMessage(
resources.getI18NString(
"service.gui.FILE_DOES_NOT_EXIST"));
}
catch (NullPointerException e)
{
if (logger.isDebugEnabled())
logger.debug("Unable to open file.", e);
this.showErrorMessage(
resources.getI18NString(
"service.gui.FILE_DOES_NOT_EXIST"));
}
catch (UnsupportedOperationException e)
{
if (logger.isDebugEnabled())
logger.debug("Unable to open file.", e);
this.showErrorMessage(
resources.getI18NString(
"service.gui.FILE_OPEN_NOT_SUPPORTED"));
}
catch (SecurityException e)
{
if (logger.isDebugEnabled())
logger.debug("Unable to open file.", e);
this.showErrorMessage(
resources.getI18NString(
"service.gui.FILE_OPEN_NO_PERMISSION"));
}
catch (IOException e)
{
if (logger.isDebugEnabled())
logger.debug("Unable to open file.", e);
this.showErrorMessage(
resources.getI18NString(
"service.gui.FILE_OPEN_NO_APPLICATION"));
}
catch (Exception e)
{
if (logger.isDebugEnabled())
logger.debug("Unable to open file.", e);
this.showErrorMessage(
resources.getI18NString(
"service.gui.FILE_OPEN_FAILED"));
}
}
/**
* Returns the date string to be used in order to show date and time in the
* chat conversation component.
* @param date the date to format
* @return the date string to be used in order to show date and time in the
* chat conversation component
*/
public String getDateString(Date date)
{
return ChatHtmlUtils.getDateString(date)
+ GuiUtils.formatTime(date)
+ " ";
}
/**
* Returns the date of the component event.
*
* @return the date of the component event
*/
public abstract Date getDate();
/**
* Shows the given error message to the user. This method is made abstract
* in order to allow extension classes to provide custom implementations
* of how errors are shown to the users.
*
* @param errorMessage the error message to show
*/
protected abstract void showErrorMessage(String errorMessage);
}