/*
GNU GENERAL LICENSE
Copyright (C) 2006 The Lobo Project. Copyright (C) 2014 - 2017 Lobo Evolution
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
verion 3 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General License for more details.
You should have received a copy of the GNU General Public
along with this program. If not, see <http://www.gnu.org/licenses/>.
Contact info: lobochief@users.sourceforge.net; ivan.difrancesco@yahoo.it
*/
package org.lobobrowser.primary.gui.prefs;
import static java.awt.font.TextAttribute.FAMILY;
import static java.awt.font.TextAttribute.POSTURE;
import static java.awt.font.TextAttribute.POSTURE_OBLIQUE;
import static java.awt.font.TextAttribute.SIZE;
import static java.awt.font.TextAttribute.STRIKETHROUGH;
import static java.awt.font.TextAttribute.STRIKETHROUGH_ON;
import static java.awt.font.TextAttribute.SUPERSCRIPT;
import static java.awt.font.TextAttribute.SUPERSCRIPT_SUB;
import static java.awt.font.TextAttribute.SUPERSCRIPT_SUPER;
import static java.awt.font.TextAttribute.UNDERLINE;
import static java.awt.font.TextAttribute.UNDERLINE_LOW_ONE_PIXEL;
import static java.awt.font.TextAttribute.WEIGHT;
import static java.awt.font.TextAttribute.WEIGHT_BOLD;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.font.TextAttribute;
import java.util.HashMap;
import java.util.Map;
import javax.swing.BoxLayout;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import org.lobobrowser.primary.gui.FontLabel;
import org.lobobrowser.primary.gui.AbstractSettingsUI;
import org.lobobrowser.primary.gui.ColorComboBox;
import org.lobobrowser.primary.gui.ValidationException;
import org.lobobrowser.util.gui.LAFSettings;
/**
* The Class LookAndFeelsSettingsUI.
*/
public class LookAndFeelsSettingsUI extends AbstractSettingsUI {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/** The settings. */
private LAFSettings settings = LAFSettings.getInstance();
private String PREVIEW_TEXT = "Preview Font";
/** The Acryl Box. */
private JCheckBox acrylCheckBox;
/** The Aero Box. */
private JCheckBox aeroCheckBox;
/** The Aluminium Box. */
private JCheckBox aluminiumCheckBox;
/** The Bernstein Box. */
private JCheckBox bernsteinCheckBox;
/** The Fast Box. */
private JCheckBox fastCheckBox;
/** The Graphite Box. */
private JCheckBox graphiteCheckBox;
/** The HiFi Box. */
private JCheckBox hiFiCheckBox;
/** The Luna Box. */
private JCheckBox lunaCheckBox;
/** The McWin Box. */
private JCheckBox mcWinCheckBox;
/** The Mint Box. */
private JCheckBox mintCheckBox;
/** The Noire Box. */
private JCheckBox noireCheckBox;
/** The Smart Box. */
private JCheckBox smartCheckBox;
/** The Texture Box. */
private JCheckBox textureCheckBox;
/** The Bold Box. */
private JCheckBox boldCheckBox;
/** The Italic Box. */
private JCheckBox italicCheckBox;
/** The Underline Box. */
private JCheckBox underlineCheckBox;
/** The Strikethrough Box. */
private JCheckBox strikethroughCheckBox;
/** The Subscript Box. */
private JCheckBox subscriptCheckBox;
/** The Superscript Box. */
private JCheckBox superscriptCheckBox;
/** The color Combo Box. */
private ColorComboBox colorComboBox;
/** The search engine list control. */
private JComboBox<String> fontList;
/** The Font Size list. */
private JComboBox<String> fontSizeList;
protected FontLabel previewLabel;
public LookAndFeelsSettingsUI() {
JPanel groupBox = new JPanel();
groupBox.setLayout(new BoxLayout(groupBox, BoxLayout.Y_AXIS));
boldCheckBox = new JCheckBox(LAFSettings.BOLD);
italicCheckBox = new JCheckBox(LAFSettings.ITALIC);
underlineCheckBox = new JCheckBox(LAFSettings.UNDERLINE);
strikethroughCheckBox = new JCheckBox(LAFSettings.STRIKETHROUGH);
subscriptCheckBox = new JCheckBox(LAFSettings.SUBSCRIPT);
superscriptCheckBox = new JCheckBox(LAFSettings.SUPERSCRIPT);
acrylCheckBox = new JCheckBox(LAFSettings.ACRYL);
aeroCheckBox = new JCheckBox(LAFSettings.AERO);
aluminiumCheckBox = new JCheckBox(LAFSettings.ALUMINIUM);
bernsteinCheckBox = new JCheckBox(LAFSettings.BERNSTEIN);
fastCheckBox = new JCheckBox(LAFSettings.FAST);
graphiteCheckBox = new JCheckBox(LAFSettings.GRAPHITE);
hiFiCheckBox = new JCheckBox(LAFSettings.HIFI);
lunaCheckBox = new JCheckBox(LAFSettings.LUNA);
mcWinCheckBox = new JCheckBox(LAFSettings.MCWIN);
mintCheckBox = new JCheckBox(LAFSettings.MINT);
noireCheckBox = new JCheckBox(LAFSettings.NOIRE);
smartCheckBox = new JCheckBox(LAFSettings.SMART);
textureCheckBox = new JCheckBox(LAFSettings.TEXTURE);
colorComboBox = new ColorComboBox();
colorComboBox.setPreferredSize(new Dimension(400, 20));
fontList = new JComboBox<String>(LAFSettings.FONTS);
fontSizeList = new JComboBox<String>(LAFSettings.FONTS_SIZE);
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
updatePreview();
}
};
this.loadSettings();
boldCheckBox.addActionListener(actionListener);
italicCheckBox.addActionListener(actionListener);
underlineCheckBox.addActionListener(actionListener);
strikethroughCheckBox.addActionListener(actionListener);
subscriptCheckBox.addActionListener(actionListener);
superscriptCheckBox.addActionListener(actionListener);
colorComboBox.addActionListener(actionListener);
fontList.addActionListener(actionListener);
fontSizeList.addActionListener(actionListener);
groupBox.add(lookAndFeelsPanel());
groupBox.add(fontPanel());
groupBox.add(effectsPanel());
groupBox.add(fontColorPanel());
groupBox.add(previewPanel());
add(groupBox);
}
@Override
public void save() throws ValidationException {
LAFSettings settings = this.settings;
settings.setAcryl(this.acrylCheckBox.isSelected());
settings.setAero(this.aeroCheckBox.isSelected());
settings.setAluminium(this.aluminiumCheckBox.isSelected());
settings.setBernstein(this.bernsteinCheckBox.isSelected());
settings.setFast(this.fastCheckBox.isSelected());
settings.setGraphite(this.graphiteCheckBox.isSelected());
settings.setHiFi(this.hiFiCheckBox.isSelected());
settings.setLuna(this.lunaCheckBox.isSelected());
settings.setMcWin(this.mcWinCheckBox.isSelected());
settings.setMint(this.mintCheckBox.isSelected());
settings.setNoire(this.noireCheckBox.isSelected());
settings.setSmart(this.smartCheckBox.isSelected());
settings.setTexture(this.textureCheckBox.isSelected());
settings.setBold(this.boldCheckBox.isSelected());
settings.setItalic(this.italicCheckBox.isSelected());
settings.setUnderline(this.underlineCheckBox.isSelected());
settings.setStrikethrough(this.strikethroughCheckBox.isSelected());
settings.setSubscript(this.subscriptCheckBox.isSelected());
settings.setSuperscript(this.superscriptCheckBox.isSelected());
settings.setFontSize(new Float(this.fontSizeList.getSelectedItem().toString()));
settings.setFont(this.fontList.getSelectedItem().toString());
settings.setColor((Color)colorComboBox.getSelectedItem());
if (validate(settings)) {
settings.save();
}
}
@Override
public void restoreDefaults() {
acrylCheckBox.setSelected(false);
aeroCheckBox.setSelected(true);
aluminiumCheckBox.setSelected(false);
bernsteinCheckBox.setSelected(false);
fastCheckBox.setSelected(false);
graphiteCheckBox.setSelected(false);
hiFiCheckBox.setSelected(false);
lunaCheckBox.setSelected(false);
mcWinCheckBox.setSelected(false);
mintCheckBox.setSelected(false);
noireCheckBox.setSelected(false);
smartCheckBox.setSelected(false);
textureCheckBox.setSelected(false);
boldCheckBox.setSelected(false);
italicCheckBox.setSelected(false);
underlineCheckBox.setSelected(false);
strikethroughCheckBox.setSelected(false);
subscriptCheckBox.setSelected(false);
superscriptCheckBox.setSelected(false);
fontSizeList.setSelectedItem("14");
fontList.setSelectedItem(LAFSettings.TIMES_NEW_ROMAN);
acrylCheckBox.revalidate();
aeroCheckBox.revalidate();
aluminiumCheckBox.revalidate();
bernsteinCheckBox.revalidate();
fastCheckBox.revalidate();
graphiteCheckBox.revalidate();
hiFiCheckBox.revalidate();
lunaCheckBox.revalidate();
mcWinCheckBox.revalidate();
mintCheckBox.revalidate();
noireCheckBox.revalidate();
smartCheckBox.revalidate();
textureCheckBox.revalidate();
boldCheckBox.revalidate();
italicCheckBox.revalidate();
underlineCheckBox.revalidate();
strikethroughCheckBox.revalidate();
subscriptCheckBox.revalidate();
superscriptCheckBox.revalidate();
colorComboBox.setSelectedItem(Color.BLACK);
previewLabel.setText(PREVIEW_TEXT);
Map<TextAttribute, Object> attributes = new HashMap<TextAttribute, Object>();
attributes.put(FAMILY, LAFSettings.TIMES_NEW_ROMAN);
attributes.put(SIZE, (float) 14.0);
previewLabel.setFont(new Font(attributes));
previewLabel.setForeground(Color.BLACK);//TODO
}
private Component lookAndFeelsPanel(){
JPanel p = new JPanel(new GridLayout(4, 3, 10, 5));
p.setBorder(new TitledBorder(new EtchedBorder(), "Look And Feels"));
p.add(acrylCheckBox);
p.add(aeroCheckBox);
p.add(aluminiumCheckBox);
p.add(bernsteinCheckBox);
p.add(fastCheckBox);
p.add(graphiteCheckBox);
p.add(hiFiCheckBox);
p.add(lunaCheckBox);
p.add(mcWinCheckBox);
p.add(mintCheckBox);
p.add(noireCheckBox);
p.add(smartCheckBox);
p.add(textureCheckBox);
return p;
}
private Component fontPanel() {
JPanel p = new JPanel(new GridLayout(1, 2, 10, 5));
p.setBorder(new TitledBorder(new EtchedBorder(), "Font"));
p.add(fontList);
p.add(fontSizeList);
return p;
}
private Component effectsPanel() {
JPanel p = new JPanel(new GridLayout(2, 3, 10, 5));
p.setBorder(new TitledBorder(new EtchedBorder(), "Font Effect"));
p.add(boldCheckBox);
p.add(italicCheckBox);
p.add(underlineCheckBox);
p.add(strikethroughCheckBox);
p.add(subscriptCheckBox);
p.add(superscriptCheckBox);
return p;
}
private Component fontColorPanel() {
JPanel p = new JPanel();
p.setBorder(new TitledBorder(new EtchedBorder(), "Font Color"));
p.add(colorComboBox);
return p;
}
private Component previewPanel() {
JPanel p = new JPanel(new BorderLayout());
p.setBorder(new TitledBorder(new EtchedBorder(), "Preview"));
previewLabel = new FontLabel(PREVIEW_TEXT);
p.add(previewLabel, BorderLayout.CENTER);
return p;
}
private void updatePreview() {
StringBuilder previewText = new StringBuilder(PREVIEW_TEXT);
String name = (String)fontList.getSelectedItem();
int size = Integer.valueOf((String)fontSizeList.getSelectedItem());
if (size <= 0)
return;
Map<TextAttribute, Object> attributes = new HashMap<TextAttribute, Object>();
attributes.put(FAMILY, name);
attributes.put(SIZE, (float) size);
// Using HTML to force JLabel manage natively unsupported attributes
if (underlineCheckBox.isSelected() || strikethroughCheckBox.isSelected()) {
previewText.insert(0, "<html>");
previewText.append("</html>");
}
if (underlineCheckBox.isSelected()) {
attributes.put(UNDERLINE, UNDERLINE_LOW_ONE_PIXEL);
previewText.insert(6, "<u>");
previewText.insert(previewText.length() - 7, "</u>");
}
if (strikethroughCheckBox.isSelected()) {
attributes.put(STRIKETHROUGH, STRIKETHROUGH_ON);
previewText.insert(6, "<strike>");
previewText.insert(previewText.length() - 7, "</strike>");
}
if (boldCheckBox.isSelected())
attributes.put(WEIGHT, WEIGHT_BOLD);
if (italicCheckBox.isSelected())
attributes.put(POSTURE, POSTURE_OBLIQUE);
if (subscriptCheckBox.isSelected()) {
attributes.put(SUPERSCRIPT, SUPERSCRIPT_SUB);
}
if (superscriptCheckBox.isSelected())
attributes.put(SUPERSCRIPT, SUPERSCRIPT_SUPER);
superscriptCheckBox.setEnabled(!subscriptCheckBox.isSelected());
subscriptCheckBox.setEnabled(!superscriptCheckBox.isSelected());
Font fn = new Font(attributes);
previewLabel.setText(previewText.toString());
previewLabel.setFont(fn);
Color c = (Color) colorComboBox.getSelectedItem();
previewLabel.setForeground(c);
previewLabel.repaint();
}
private void loadSettings() {
LAFSettings settings = this.settings;
acrylCheckBox.setSelected(settings.isAcryl());
aeroCheckBox.setSelected(settings.isAero());
aluminiumCheckBox.setSelected(settings.isAluminium());
bernsteinCheckBox.setSelected(settings.isBernstein());
fastCheckBox.setSelected(settings.isFast());
graphiteCheckBox.setSelected(settings.isGraphite());
hiFiCheckBox.setSelected(settings.isHiFi());
lunaCheckBox.setSelected(settings.isLuna());
mcWinCheckBox.setSelected(settings.isMcWin());
mintCheckBox.setSelected(settings.isMint());
noireCheckBox.setSelected(settings.isNoire());
smartCheckBox.setSelected(settings.isSmart());
textureCheckBox.setSelected(settings.isTexture());
boldCheckBox.setSelected(settings.isBold());
italicCheckBox.setSelected(settings.isItalic());
underlineCheckBox.setSelected(settings.isUnderline());
strikethroughCheckBox.setSelected(settings.isStrikethrough());
subscriptCheckBox.setSelected(settings.isSubscript());
superscriptCheckBox.setSelected(settings.isSuperscript());
fontSizeList.setSelectedItem(String.valueOf((int)(Math.round(settings.getFontSize()))));
fontList.setSelectedItem(settings.getFont());
colorComboBox.setSelectedItem(settings.getColor());
acrylCheckBox.revalidate();
acrylCheckBox.revalidate();
aeroCheckBox.revalidate();
aluminiumCheckBox.revalidate();
bernsteinCheckBox.revalidate();
fastCheckBox.revalidate();
graphiteCheckBox.revalidate();
hiFiCheckBox.revalidate();
lunaCheckBox.revalidate();
mcWinCheckBox.revalidate();
mintCheckBox.revalidate();
noireCheckBox.revalidate();
smartCheckBox.revalidate();
textureCheckBox.revalidate();
boldCheckBox.revalidate();
italicCheckBox.revalidate();
underlineCheckBox.revalidate();
strikethroughCheckBox.revalidate();
subscriptCheckBox.revalidate();
superscriptCheckBox.revalidate();
}
private boolean validate(LAFSettings settings) {
int check = 0;
if (settings.isAcryl())
check = check + 1;
if (settings.isAero())
check = check + 1;
if (settings.isAluminium())
check = check + 1;
if (settings.isBernstein())
check = check + 1;
if (settings.isFast())
check = check + 1;
if (settings.isGraphite())
check = check + 1;
if (settings.isHiFi())
check = check + 1;
if (settings.isLuna())
check = check + 1;
if (settings.isMcWin())
check = check + 1;
if (settings.isMint())
check = check + 1;
if (settings.isNoire())
check = check + 1;
if (settings.isSmart())
check = check + 1;
if (settings.isTexture())
check = check + 1;
if (check == 0) {
JOptionPane.showMessageDialog(this, "Checks a Look & Feels");
return false;
} else if (check > 1) {
JOptionPane.showMessageDialog(this, "Checks only one Look & Feels");
return false;
} else {
JOptionPane.showMessageDialog(this, "Please restart Lobo Evolution");
return true;
}
}
}