/*
* 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.utils;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import java.util.regex.*;
import javax.swing.*;
import javax.swing.text.html.*;
import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.service.msghistory.*;
import net.java.sip.communicator.service.muc.*;
import net.java.sip.communicator.service.protocol.*;
import net.java.sip.communicator.util.*;
/**
* All look and feel related constants are stored here.
*
* @author Yana Stamcheva
* @author Adam Netocny
*/
public class Constants
{
private static final Logger logger = Logger.getLogger(Constants.class);
/*
* ===================================================================
* ------------------------ CONFIG CONSTANTS ---------------------------
* ===================================================================
*/
/**
* Indicates whether to ask for confirmation when user tries to delete
* a contact.
*/
public static boolean REMOVE_CONTACT_ASK = true;
/**
* Indicates whether to ask for confirmation when user tries to delete
* a contact.
*/
public static boolean REMOVE_GROUP_ASK = true;
/*
* ======================================================================
* -------------------- FONTS AND COLOR CONSTANTS ------------------------
* ======================================================================
*/
/**
* Background color for even records in call history.
*/
public static Color CALL_HISTORY_EVEN_ROW_COLOR
= new Color(GuiActivator.getResources().
getColor("service.gui.CALL_HISTORY_EVEN_ROW_COLOR"));
/**
* Background color for chat room contact rows.
*/
public static Color CHAT_ROOM_ROW_COLOR
= new Color(GuiActivator.getResources().
getColor("service.gui.CHAT_ROOM_ROW_COLOR"));
/**
* The start color used to paint a gradient selected background of some
* components.
*/
public static Color SELECTED_COLOR
= new Color(GuiActivator.getResources().
getColor("service.gui.LIST_SELECTION_COLOR"));
/**
* The end color used to paint a gradient selected background of some
* components.
*/
public static Color SELECTED_GRADIENT_COLOR
= new Color(GuiActivator.getResources()
.getColor("service.gui.LIST_SELECTION_COLOR_GRADIENT"));
/**
* The start color used to paint a gradient mouse over background of some
* components.
*/
public static Color GRADIENT_DARK_COLOR
= new Color(GuiActivator.getResources().
getColor("service.gui.GRADIENT_DARK_COLOR"));
/**
* The end color used to paint a gradient mouse over background of some
* components.
*/
public static Color GRADIENT_LIGHT_COLOR
= new Color(GuiActivator.getResources().
getColor("service.gui.GRADIENT_LIGHT_COLOR"));
/**
* A color between blue and gray used to paint some borders.
*/
public static Color BORDER_COLOR
= new Color(GuiActivator.getResources().
getColor("service.gui.BORDER_COLOR"));
/**
* A color between blue and gray (darker than the other one), used to paint
* some borders.
*/
public static Color LIST_SELECTION_BORDER_COLOR
= new Color(GuiActivator.getResources().
getColor("service.gui.LIST_SELECTION_BORDER_COLOR"));
/**
* The color used to paint the background of contact list groups.
*/
public static Color CONTACT_LIST_GROUP_BG_COLOR
= new Color(GuiActivator.getResources()
.getColor("service.gui.CONTACT_LIST_GROUP_ROW"));
/**
* The end color used to paint a gradient mouse over background of some
* components.
*/
public static Color CONTACT_LIST_GROUP_BG_GRADIENT_COLOR
= new Color(GuiActivator.getResources().
getColor("service.gui.CONTACT_LIST_GROUP_GRADIENT"));
/*
* ======================================================================
* --------------------------- FONT CONSTANTS ---------------------------
* ======================================================================
*/
/**
* The default <tt>Font</tt> object used through this ui implementation.
*/
public static final Font FONT;
static
{
LookAndFeel laf = UIManager.getLookAndFeel();
Font font = null;
String fontName = null;
int fontSize = 0;
if (laf != null)
{
String lafClassName = laf.getClass().getName();
if ("com.sun.java.swing.plaf.windows.WindowsLookAndFeel".equals(
lafClassName))
{
Object desktopPropertyValue
= Toolkit.getDefaultToolkit().getDesktopProperty(
"win.messagebox.font");
if (desktopPropertyValue instanceof Font)
font = (Font) desktopPropertyValue;
}
else if ("com.sun.java.swing.plaf.gtk.GTKLookAndFeel".equals(
lafClassName))
{
font = UIManager.getDefaults().getFont("Panel.font");
}
}
FONT
= (font == null)
? new Font(
(fontName == null) ? "Verdana" : fontName,
Font.PLAIN,
(fontSize == 0) ? 12 : fontSize)
: font;
}
/*
* ======================================================================
* ------------------------ OTHER CONSTANTS ------------------------------
* ======================================================================
*/
/**
* The default path, where chat window styles could be found.
*/
public static final String DEFAULT_STYLE_PATH
= "resources/styles";
/*
* ======================================================================
* ------------------------ SPECIAL CHARS LIST --------------------------
* ======================================================================
*/
/**
* A list of all special chars that should be escaped for some reasons.
*/
private static final int[] specialChars = new int[]
{
KeyEvent.VK_PLUS,
KeyEvent.VK_MINUS,
KeyEvent.VK_SPACE,
KeyEvent.VK_ENTER,
KeyEvent.VK_LEFT,
KeyEvent.VK_RIGHT
};
/**
* Checks if the given char is in the list of application special chars.
*
* @param charCode The char code.
*/
public static boolean isSpecialChar(int charCode) {
for (int specialChar : specialChars) {
if (specialChar == charCode)
return true;
}
return false;
}
/**
* Returns the image corresponding to the given presence status.
* @param status The presence status.
* @return the image corresponding to the given presence status.
*/
public static BufferedImage getStatusIcon(PresenceStatus status)
{
if(status != null)
{
int connectivity = status.getStatus();
if(connectivity < PresenceStatus.ONLINE_THRESHOLD)
{
return ImageLoader
.getImage(ImageLoader.USER_OFFLINE_ICON);
}
else if(connectivity < PresenceStatus.EXTENDED_AWAY_THRESHOLD)
{
return ImageLoader
.getImage(ImageLoader.USER_DND_ICON);
}
else if(connectivity < PresenceStatus.AWAY_THRESHOLD)
{
String statusName = "";
if(status.getStatusName() != null)
statusName = Pattern.compile("\\p{Space}").matcher(
status.getStatusName()).replaceAll("");
if(statusName.equalsIgnoreCase("OnThePhone"))
return ImageLoader
.getImage(ImageLoader.USER_USER_ON_THE_PHONE_ICON);
else if(statusName.equalsIgnoreCase("InAMeeting"))
return ImageLoader
.getImage(ImageLoader.USER_USER_IN_A_MEETING_ICON);
else
return ImageLoader
.getImage(ImageLoader.USER_EXTENDED_AWAY_ICON);
}
else if(connectivity < PresenceStatus.AVAILABLE_THRESHOLD)
{
return ImageLoader
.getImage(ImageLoader.USER_AWAY_ICON);
}
else if(connectivity
< PresenceStatus.EAGER_TO_COMMUNICATE_THRESHOLD)
{
return ImageLoader
.getImage(ImageLoader.USER_ONLINE_ICON);
}
else if(connectivity <
ChatRoomPresenceStatus.CHAT_ROOM_ONLINE_THRESHOLD)
{
return ImageLoader
.getImage(ImageLoader.USER_FFC_ICON);
}
else if(connectivity <
ChatRoomPresenceStatus.CHAT_ROOM_OFFLINE_THRESHOLD)
{
return ImageLoader
.getImage(ImageLoader.CHAT_ROOM_ONLINE_ICON);
}
else if(connectivity == MessageSourceContactPresenceStatus
.MSG_SRC_CONTACT_ONLINE_THRESHOLD)
{
return ImageLoader
.getImage(ImageLoader.MSG_SRC_CONTACT_ONLINE_ICON);
}
else if(connectivity < PresenceStatus.MAX_STATUS_VALUE)
{
return ImageLoader
.getImage(ImageLoader.CHAT_ROOM_OFFLINE_ICON);
}
else
{
return ImageLoader
.getImage(ImageLoader.USER_OFFLINE_ICON);
}
}
else
{
return ImageLoader
.getImage(ImageLoader.USER_OFFLINE_ICON);
}
}
/**
* Returns the image corresponding to the given presence status.
* @param status The presence status.
* @return the image corresponding to the given presence status.
*/
public static BufferedImage getMessageStatusIcon(PresenceStatus status)
{
if(status != null)
{
int connectivity = status.getStatus();
if(connectivity < PresenceStatus.ONLINE_THRESHOLD)
{
return ImageLoader
.getImage(ImageLoader.CHAT_BUTTON_OFFLINE_ICON);
}
else if(connectivity < PresenceStatus.EXTENDED_AWAY_THRESHOLD)
{
return ImageLoader
.getImage(ImageLoader.CHAT_BUTTON_DND_ICON);
}
else if(connectivity == PresenceStatus.EXTENDED_AWAY_THRESHOLD)
{
// the special status On The Phone is state
// between DND and EXTENDED AWAY states.
return ImageLoader
.getImage(ImageLoader.CHAT_BUTTON_ON_THE_PHONE_ICON);
}
else if(connectivity < PresenceStatus.AWAY_THRESHOLD)
{
return ImageLoader
.getImage(ImageLoader.CHAT_BUTTON_EXTENDED_AWAY_ICON);
}
else if(connectivity < PresenceStatus.AVAILABLE_THRESHOLD)
{
return ImageLoader
.getImage(ImageLoader.CHAT_BUTTON_AWAY_ICON);
}
else if(connectivity
< PresenceStatus.EAGER_TO_COMMUNICATE_THRESHOLD)
{
return ImageLoader
.getImage(ImageLoader.CHAT_BUTTON_ONLINE_ICON);
}
else if(connectivity < PresenceStatus.MAX_STATUS_VALUE)
{
return ImageLoader
.getImage(ImageLoader.CHAT_BUTTON_FFC_ICON);
}
else
{
return ImageLoader
.getImage(ImageLoader.CHAT_BUTTON_OFFLINE_ICON);
}
}
else
{
return ImageLoader
.getImage(ImageLoader.CHAT_BUTTON_SMALL_WHITE);
}
}
/**
* Loads a chat window style.
*/
public static void loadAdiumStyle(){
new File(Constants.class.getClassLoader()
.getResource(DEFAULT_STYLE_PATH + "/TotallyClear").toString());
}
/**
* Temporary method to load the css style used in the chat window.
* @param styleSheet style sheet
* @param defaultFont default font
*/
public static void loadSimpleStyle(StyleSheet styleSheet, Font defaultFont)
{
Reader r =
new BufferedReader(
new InputStreamReader(
GuiActivator.getResources().getSettingsInputStream(
"service.gui.HTML_TEXT_STYLE")));
if (defaultFont != null)
styleSheet.addRule(
"body, div, h1, h2, h3, h4, h5, h6, h7, p, td, th { "
+ "font-family: "
+ defaultFont.getName()
+ "; font-size: "
+ defaultFont.getSize()
+ "pt; }");
try
{
styleSheet.loadRules(r, null);
}
catch (IOException ex)
{
logger.error("Failed to load CSS stream.", ex);
}
finally
{
try
{
r.close();
}
catch (IOException ex)
{
logger.error("Failed to close CSS stream.", ex);
}
}
}
/**
* Reloads constants.
*/
public static void reload()
{
CALL_HISTORY_EVEN_ROW_COLOR
= new Color(GuiActivator.getResources().
getColor("service.gui.CALL_HISTORY_EVEN_ROW_COLOR"));
SELECTED_COLOR
= new Color(GuiActivator.getResources().
getColor("service.gui.LIST_SELECTION_COLOR"));
GRADIENT_DARK_COLOR
= new Color(GuiActivator.getResources().
getColor("service.gui.GRADIENT_DARK_COLOR"));
GRADIENT_LIGHT_COLOR
= new Color(GuiActivator.getResources().
getColor("service.gui.GRADIENT_LIGHT_COLOR"));
BORDER_COLOR
= new Color(GuiActivator.getResources().
getColor("service.gui.BORDER_COLOR"));
LIST_SELECTION_BORDER_COLOR
= new Color(GuiActivator.getResources().
getColor("service.gui.LIST_SELECTION_BORDER_COLOR"));
CONTACT_LIST_GROUP_BG_COLOR
= new Color(GuiActivator.getResources()
.getColor("service.gui.CONTACT_LIST_GROUP_ROW"));
CONTACT_LIST_GROUP_BG_GRADIENT_COLOR
= new Color(GuiActivator.getResources().
getColor("service.gui.CONTACT_LIST_GROUP_GRADIENT"));
}
}