/*
* 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 javax.swing.*;
import javax.swing.event.*;
import net.java.sip.communicator.impl.gui.*;
import net.java.sip.communicator.plugin.desktoputil.*;
import net.java.sip.communicator.util.*;
import org.jitsi.service.resources.*;
/**
* The <tt>FontChooserDialog</tt> is a dialog for font selection
*
* @author Damien Roth
*/
public class FontChooser
extends JComponent
implements ActionListener, ListSelectionListener
{
private InputList fontFamilyPanel;
private InputList fontSizePanel;
private JCheckBox boldCheckBox;
private JCheckBox italicCheckBox;
private JCheckBox underlineCheckBox;
private ColorLabel colorLabel;
private JLabel previewLabel;
private String[] fontFamilies;
private final String[] fontSizes
= { "8", "9", "10", "11", "12", "14", "16",
"18", "20", "22", "24", "26", "28", "36", "48", "72" };
private static final String previewText = "Preview Text";
private static final String ACTCMD_CHOOSE_COLOR = "ACTCMD_CHOOSE_COLOR";
public static final int OK_OPTION = 1;
public static final int CANCEL_OPTION = 0;
protected int option = CANCEL_OPTION;
public FontChooser()
{
ResourceManagementService res = GuiActivator.getResources();
this.setLayout(new BorderLayout(5, 5));
this.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
//-- Init InputList panels
// Font family
GraphicsEnvironment ge
= GraphicsEnvironment.getLocalGraphicsEnvironment();
this.fontFamilies = ge.getAvailableFontFamilyNames();
this.fontFamilyPanel
= new InputList(res.getI18NString("service.gui.FONT_FAMILY"),
this.fontFamilies);
this.fontFamilyPanel.addListSelectionListener(this);
// Font size
this.fontSizePanel
= new InputList(res.getI18NString("service.gui.FONT_SIZE"),
this.fontSizes);
this.fontSizePanel.addListSelectionListener(this);
JPanel listsPanels = new JPanel(new GridLayout(1, 2, 5, 5));
listsPanels.add(this.fontFamilyPanel, BorderLayout.WEST);
listsPanels.add(this.fontSizePanel, BorderLayout.EAST);
//-- Style
JLabel styleLabel
= new JLabel(res.getI18NString("service.gui.FONT_STYLE"));
styleLabel.setPreferredSize(new Dimension(100, 0));
styleLabel.setFont(styleLabel.getFont().deriveFont(Font.BOLD));
// Bold
this.boldCheckBox
= new SIPCommCheckBox(res.getI18NString("service.gui.FONT_BOLD"));
this.boldCheckBox.addActionListener(this);
this.boldCheckBox.setOpaque(false);
// Italic
this.italicCheckBox
= new SIPCommCheckBox(res.getI18NString("service.gui.FONT_ITALIC"));
this.italicCheckBox.addActionListener(this);
// Underline
this.underlineCheckBox
= new SIPCommCheckBox(res.getI18NString("service.gui.FONT_UNDERLINE"));
this.underlineCheckBox.addActionListener(this);
// Panel
JPanel styleGridPanel = new JPanel(new GridLayout(1, 3, 5, 5));
styleGridPanel.add(this.boldCheckBox);
styleGridPanel.add(this.italicCheckBox);
styleGridPanel.add(this.underlineCheckBox);
JPanel stylePanel = new JPanel(new BorderLayout(10, 10));
stylePanel.add(styleLabel, BorderLayout.WEST);
stylePanel.add(styleGridPanel, BorderLayout.CENTER);
//-- Color
JLabel colorTextLabel
= new JLabel(res.getI18NString("service.gui.FONT_COLOR"));
colorTextLabel.setPreferredSize(new Dimension(100, 0));
colorTextLabel.setFont(styleLabel.getFont().deriveFont(Font.BOLD));
// Color label
this.colorLabel = new ColorLabel();
this.colorLabel.setOpaque(true);
this.colorLabel.setBackground(Color.BLACK);
this.colorLabel.setPreferredSize(new Dimension(18, 18));
// Color button
JButton colorButton
= new JButton(res.getI18NString("service.gui.SELECT_COLOR"));
colorButton.addActionListener(this);
colorButton.setName(ACTCMD_CHOOSE_COLOR);
// Panel
JPanel colorPanelCenter = new JPanel(new FlowLayout(FlowLayout.LEFT));
colorPanelCenter.add(colorLabel);
colorPanelCenter.add(colorButton);
JPanel colorPanel = new JPanel(new BorderLayout());
colorPanel.add(colorTextLabel, BorderLayout.WEST);
colorPanel.add(colorPanelCenter, BorderLayout.CENTER);
// Format Panel
JPanel formatPanel = new JPanel();
formatPanel.setLayout(new BoxLayout(formatPanel, BoxLayout.Y_AXIS));
formatPanel.add(listsPanels);
formatPanel.add(stylePanel);
formatPanel.add(colorPanel);
this.add(formatPanel, BorderLayout.NORTH);
// Preview Label
this.previewLabel = new JLabel(previewText, JLabel.CENTER);
this.previewLabel.setOpaque(true);
this.previewLabel.setBackground(Color.WHITE);
this.previewLabel.setPreferredSize(new Dimension(0, 100));
this.previewLabel.setBorder(
BorderFactory.createLineBorder(Color.BLACK, 1));
this.add(this.previewLabel, BorderLayout.CENTER);
initDefaults();
}
/**
* Initializes previously saved default fonts.
*/
private void initDefaults()
{
String defaultFontFamily
= ConfigurationUtils.getChatDefaultFontFamily();
int defaultFontSize
= ConfigurationUtils.getChatDefaultFontSize();
Color defaultFontColor
= ConfigurationUtils.getChatDefaultFontColor();
if (defaultFontFamily != null)
setFontFamily(defaultFontFamily);
if (defaultFontSize > 0)
setFontSize(defaultFontSize);
setBoldStyle(ConfigurationUtils.isChatFontBold());
setItalicStyle(ConfigurationUtils.isChatFontItalic());
setUnderlineStyle(ConfigurationUtils.isChatFontUnderline());
if (defaultFontColor != null)
setColor(defaultFontColor);
}
/**
* Updates the font preview area.
*/
private void updatePreview()
{
Font f = new Font(this.fontFamilyPanel.getSelected(),
Font.PLAIN,
this.fontSizePanel.getSelectedInt());
String text = this.fontFamilyPanel.getSelected();
if (this.boldCheckBox.isSelected())
text = "<b>" + text + "</b>";
if (this.italicCheckBox.isSelected())
text = "<i>" + text + "</i>";
if (this.underlineCheckBox.isSelected())
text = "<u>" + text + "</u>";
this.previewLabel.setFont(f);
this.previewLabel.setForeground(this.colorLabel.getBackground());
this.previewLabel.setText("<html>"+text+"</html>");
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource() instanceof JButton)
{
JButton source = (JButton) e.getSource();
String name = source.getName();
if (name.equals(ACTCMD_CHOOSE_COLOR))
{
Color c = JColorChooser.showDialog(this,
"Color Chooser",
this.colorLabel.getBackground());
this.colorLabel.setBackground(c);
}
}
updatePreview();
}
public void valueChanged(ListSelectionEvent e)
{
updatePreview();
}
/**
* Sets the family name of the font
* @param family the family name
*/
public void setFontFamily(String family)
{
if (family.endsWith(".plain"))
family = family.replace(".plain", "");
for (String f : fontFamilies)
{
String oldF = f;
if (family.equals(f) || family.equals(f.replaceAll(" ", "")))
fontFamilyPanel.setSelected(oldF);
}
updatePreview();
}
/**
* Sets the size of the font
* @param size
*/
public void setFontSize(int size)
{
this.fontSizePanel.setSelectedInt(size);
this.updatePreview();
}
/**
* Enables the bold style
* @param b TRUE enable - FALSE disable
*/
public void setBoldStyle(boolean b)
{
this.boldCheckBox.setSelected(b);
this.updatePreview();
}
/**
* Enables the italic style
* @param b TRUE enable - FALSE disable
*/
public void setItalicStyle(boolean b)
{
this.italicCheckBox.setSelected(b);
this.updatePreview();
}
/**
* Enables the underline style
* @param b TRUE enable - FALSE disable
*/
public void setUnderlineStyle(boolean b)
{
this.underlineCheckBox.setSelected(b);
this.updatePreview();
}
/**
* Sets the font's color
* @param c the color
*/
public void setColor(Color c)
{
this.colorLabel.setBackground(c);
this.updatePreview();
}
/**
* Returns the family name of the selected font
* @return the family name of the selected font
*
* @see #setFontFamily
*/
public String getFontFamily()
{
return this.fontFamilyPanel.getSelected();
}
/**
* Returns the size of the selected font
* @return the size of the selected font
*
* @see #setFontSize
*/
public int getFontSize()
{
return this.fontSizePanel.getSelectedInt();
}
/**
* Checks if bold checkbox is selected
* @return TRUE is the checkbox is selected - FALSE otherwise
*/
public boolean isBoldStyleSelected()
{
return this.boldCheckBox.isSelected();
}
/**
* Checks if italic checkbox is selected
* @return TRUE is the checkbox is selected - FALSE otherwise
*/
public boolean isItalicStyleSelected()
{
return this.italicCheckBox.isSelected();
}
/**
* Checks if underline checkbox is selected
* @return TRUE is the checkbox is selected - FALSE otherwise
*/
public boolean isUnderlineStyleSelected()
{
return this.underlineCheckBox.isSelected();
}
/**
* Returns the font color
* @return the font color
*/
public Color getFontColor()
{
return this.colorLabel.getBackground();
}
private static class ColorLabel extends JLabel
{
@Override
public void paintComponent(Graphics g)
{
g = g.create();
try
{
AntialiasingManager.activateAntialiasing(g);
g.setColor(this.getBackground());
g.fillRoundRect(0, 0, getWidth(), getHeight(), 8, 8);
}
finally
{
g.dispose();
}
}
}
private class InputList
extends JPanel
implements KeyListener, ListSelectionListener
{
private JLabel label = new JLabel();
private JTextField textField = new JTextField();
private JList list;
public InputList(String title, Object[] data)
{
this.setLayout(new BorderLayout());
this.label.setText(title);
this.label.setFont(this.label.getFont().deriveFont(Font.BOLD));
this.add(this.label, BorderLayout.NORTH);
JPanel middlePanel = new JPanel(new BorderLayout());
this.textField.addKeyListener(this);
middlePanel.add(this.textField, BorderLayout.NORTH);
this.list = new JList(data);
this.list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
this.list.setVisibleRowCount(5);
this.list.setSelectedIndex(0);
this.list.addListSelectionListener(this);
this.setFocusable(false);
middlePanel.add(new JScrollPane(this.list), BorderLayout.CENTER);
this.add(middlePanel, BorderLayout.CENTER);
}
public void setSelected(String value)
{
ListModel l = this.list.getModel();
boolean inList = false;
for (int i=0; i<l.getSize() && !inList; i++)
if (l.getElementAt(i).toString().equals(value))
inList = true;
if (inList)
this.list.setSelectedValue(value, true);
else
this.list.clearSelection();
this.textField.setText(value);
}
public String getSelected()
{
return this.textField.getText();
}
public void setSelectedInt(int value)
{
this.setSelected(Integer.toString(value));
}
public int getSelectedInt()
{
try
{
return Integer.parseInt(this.getSelected());
}
catch (NumberFormatException e)
{
return -1;
}
}
public void addListSelectionListener(ListSelectionListener l)
{
this.list.addListSelectionListener(l);
}
public void valueChanged(ListSelectionEvent e)
{
String selectedValue = (String) this.list.getSelectedValue();
String oldValue = this.textField.getText();
this.textField.setText(selectedValue);
if (!oldValue.equalsIgnoreCase(selectedValue))
{
this.textField.selectAll();
this.textField.requestFocus();
}
}
public void keyReleased(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_LEFT
|| e.getKeyCode() == KeyEvent.VK_RIGHT)
return;
String elem, key = this.textField.getText().toLowerCase();
ListModel model = this.list.getModel();
for (int i=0; i<model.getSize(); i++)
{
elem = model.getElementAt(i).toString();
if (elem.toLowerCase().startsWith(key))
{
this.list.setSelectedValue(model.getElementAt(i), true);
break;
}
}
}
public void keyPressed(KeyEvent e)
{
int i = this.list.getSelectedIndex();
if (e.getKeyCode() == KeyEvent.VK_UP && i > 0)
{
this.list.setSelectedIndex(i-1);
}
else if (e.getKeyCode() == KeyEvent.VK_DOWN &&
i < this.list.getModel().getSize()-1)
{
this.list.setSelectedIndex(i+1);
}
}
// Not used
public void keyTyped(KeyEvent e) {;}
}
// Dialog creation
public int showDialog(Component parent)
{
JDialog dialog = createDialog(parent);
dialog.setVisible(true);
dialog.dispose();
dialog = null;
return this.option;
}
/**
* Creates this dialog.
*
* @param parent the parent dialog
* @return the created dialog
*/
private SIPCommDialog createDialog(Component parent)
{
final SIPCommDialog d = new SIPCommDialog();
ResourceManagementService res = GuiActivator.getResources();
d.setTitle(res.getI18NString("service.gui.FONT"));
d.setModal(true);
// Ok and Cancel buttons
JPanel buttonsPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
JButton okButton = new JButton(GuiActivator.getResources()
.getI18NString("service.gui.OK"));
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
option = OK_OPTION;
d.setVisible(false);
}
});
buttonsPanel.add(okButton);
JButton cancelButton = new JButton(GuiActivator.getResources()
.getI18NString("service.gui.CANCEL"));
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
option = CANCEL_OPTION;
d.setVisible(false);
}
});
buttonsPanel.add(cancelButton);
d.getContentPane().setLayout(new BorderLayout());
d.getContentPane().add(this, BorderLayout.CENTER);
d.getContentPane().add(buttonsPanel, BorderLayout.SOUTH);
d.pack();
d.setResizable(false);
d.setLocationRelativeTo(parent);
return d;
}
}