247 lines
8.7 KiB
Java
Executable File
247 lines
8.7 KiB
Java
Executable File
package envoy.client.ui.settings;
|
|
|
|
import java.awt.*;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
|
|
import javax.swing.*;
|
|
|
|
import envoy.client.data.Settings;
|
|
import envoy.client.event.ThemeChangeEvent;
|
|
import envoy.client.ui.Color;
|
|
import envoy.client.ui.Theme;
|
|
import envoy.client.ui.primary.PrimaryButton;
|
|
import envoy.event.EventBus;
|
|
import envoy.util.EnvoyLog;
|
|
|
|
/**
|
|
* Displays GUI components that allow changing the current {@Theme} and creating
|
|
* new ones.<br>
|
|
* <br>
|
|
* Project: <strong>envoy-client</strong><br>
|
|
* File: <strong>ThemeCustomizationPanel.java</strong><br>
|
|
* Created: <strong>20 Dec 2019</strong><br>
|
|
*
|
|
* @author Kai S. K. Engelbart
|
|
* @author Maximilian Käfer
|
|
* @since Envoy Client v0.2-alpha
|
|
*/
|
|
public class ThemeCustomizationPanel extends SettingsPanel {
|
|
|
|
private JPanel colorsPanel = new JPanel();
|
|
|
|
private DefaultComboBoxModel<String> themesModel;
|
|
private JComboBox<String> themes;
|
|
private Theme temporaryTheme;
|
|
private PrimaryButton createThemeButton = new PrimaryButton("Create Theme");
|
|
|
|
private boolean themeChanged;
|
|
private final Insets insets = new Insets(5, 5, 5, 5);
|
|
|
|
private static final Logger logger = EnvoyLog.getLogger(ThemeCustomizationPanel.class);
|
|
private static final long serialVersionUID = 0L;
|
|
|
|
/**
|
|
* Initializes a {@link ThemeCustomizationPanel} that enables the user to change
|
|
* the current {@link Theme} and create new themes as part of the
|
|
* {@link SettingsScreen}.
|
|
*
|
|
* @param parent the {@link SettingsScreen} as a part of which this
|
|
* {@link SettingsPanel} is displayed
|
|
* @since Envoy Client v0.2-alpha
|
|
*/
|
|
public ThemeCustomizationPanel(SettingsScreen parent) {
|
|
super(parent);
|
|
temporaryTheme = new Theme("temporaryTheme", Settings.getInstance().getCurrentTheme());
|
|
|
|
var themeNames = Settings.getInstance().getThemes().keySet().toArray(new String[0]);
|
|
String currentThemeName = Settings.getInstance().getCurrentThemeName();
|
|
for (int i = 0; i < themeNames.length; i++)
|
|
if (currentThemeName.equals(themeNames[i])) {
|
|
themeNames[i] = themeNames[0];
|
|
themeNames[0] = currentThemeName;
|
|
break;
|
|
}
|
|
themesModel = new DefaultComboBoxModel<>(themeNames);
|
|
themes = new JComboBox<>(themesModel);
|
|
GridBagLayout gbl_themeLayout = new GridBagLayout();
|
|
|
|
gbl_themeLayout.columnWidths = new int[] { 1, 1 };
|
|
gbl_themeLayout.rowHeights = new int[] { 1, 1, 1 };
|
|
gbl_themeLayout.columnWeights = new double[] { 1.0, 1.0 };
|
|
gbl_themeLayout.rowWeights = new double[] { 0.01, 1.0, 0.01 };
|
|
|
|
setLayout(gbl_themeLayout);
|
|
|
|
themes.setSelectedItem(Settings.getInstance().getCurrentTheme());
|
|
|
|
GridBagConstraints gbc_themes = new GridBagConstraints();
|
|
gbc_themes.fill = GridBagConstraints.HORIZONTAL;
|
|
gbc_themes.gridwidth = 2;
|
|
gbc_themes.gridx = 0;
|
|
gbc_themes.gridy = 0;
|
|
gbc_themes.anchor = GridBagConstraints.NORTHWEST;
|
|
gbc_themes.insets = new Insets(10, 10, 20, 10);
|
|
|
|
add(themes, gbc_themes);
|
|
GridBagLayout gbl_colorCustomizations = new GridBagLayout();
|
|
|
|
gbl_colorCustomizations.columnWidths = new int[] { 1, 1 };
|
|
gbl_colorCustomizations.rowHeights = new int[] { 1, 1, 1, 1, 1, 1, 1, 1, 1 };
|
|
gbl_colorCustomizations.columnWeights = new double[] { 1, 1 };
|
|
gbl_colorCustomizations.rowWeights = new double[] { 1, 1, 1, 1, 1, 1, 1, 1 };
|
|
|
|
colorsPanel.setLayout(gbl_colorCustomizations);
|
|
|
|
Theme theme = Settings.getInstance().getCurrentTheme();
|
|
buildCustomizeElements(theme);
|
|
|
|
GridBagConstraints gbc_colorsPanel = new GridBagConstraints();
|
|
gbc_colorsPanel.fill = GridBagConstraints.HORIZONTAL;
|
|
gbc_colorsPanel.gridx = 0;
|
|
gbc_colorsPanel.gridy = 1;
|
|
gbc_colorsPanel.gridwidth = 2;
|
|
gbc_colorsPanel.anchor = GridBagConstraints.NORTHWEST;
|
|
gbc_colorsPanel.insets = insets;
|
|
|
|
add(colorsPanel, gbc_colorsPanel);
|
|
|
|
createThemeButton.addActionListener((evt) -> {
|
|
if (themeChanged) {
|
|
new NewThemeScreen(parent, name -> {
|
|
// Create new theme
|
|
logger.log(Level.FINEST, name);
|
|
Settings.getInstance().addNewThemeToMap(new Theme(name, temporaryTheme));
|
|
|
|
// Add new theme name to combo box
|
|
themesModel.addElement(name);
|
|
|
|
// Select new theme name
|
|
themes.setSelectedIndex(themesModel.getSize() - 1);
|
|
}, name -> {
|
|
// Modify theme
|
|
Settings.getInstance().getThemes().replace(name, new Theme(name, temporaryTheme));
|
|
if (themes.getSelectedItem().equals(name))
|
|
EventBus.getInstance().dispatch(new ThemeChangeEvent(Settings.getInstance().getTheme(name)));
|
|
else themes.setSelectedItem(name);
|
|
}).setVisible(true);
|
|
themeChanged = false;
|
|
}
|
|
});
|
|
GridBagConstraints gbc_createThemeButton = new GridBagConstraints();
|
|
gbc_createThemeButton.fill = GridBagConstraints.HORIZONTAL;
|
|
gbc_createThemeButton.gridx = 0;
|
|
gbc_createThemeButton.gridy = 2;
|
|
gbc_createThemeButton.anchor = GridBagConstraints.CENTER;
|
|
gbc_createThemeButton.insets = insets;
|
|
add(createThemeButton, gbc_createThemeButton);
|
|
|
|
colorsPanel.setBackground(theme.getCellColor());
|
|
|
|
// Apply theme upon selection
|
|
themes.addItemListener(e -> {
|
|
String selectedValue = (String) themes.getSelectedItem();
|
|
logger.log(Level.FINEST, "Selected theme: " + selectedValue);
|
|
|
|
final Theme currentTheme = Settings.getInstance().getTheme(selectedValue);
|
|
Settings.getInstance().setCurrentTheme(selectedValue);
|
|
EventBus.getInstance().dispatch(new ThemeChangeEvent(currentTheme));
|
|
});
|
|
|
|
// Apply current theme
|
|
applyTheme(theme);
|
|
|
|
// Respond to theme changes
|
|
EventBus.getInstance()
|
|
.register(ThemeChangeEvent.class,
|
|
evt -> {
|
|
final Theme currentTheme = evt.get();
|
|
temporaryTheme = new Theme("temporaryTheme", currentTheme);
|
|
applyTheme(currentTheme);
|
|
});
|
|
}
|
|
|
|
private void applyTheme(Theme theme) {
|
|
// themeContent
|
|
setForeground(theme.getUserNameColor());
|
|
setBackground(theme.getCellColor());
|
|
|
|
// createThemeButton
|
|
createThemeButton.setForeground(theme.getInteractableForegroundColor());
|
|
createThemeButton.setBackground(theme.getInteractableBackgroundColor());
|
|
|
|
// themes
|
|
themes.setBackground(theme.getInteractableBackgroundColor());
|
|
themes.setForeground(theme.getInteractableForegroundColor());
|
|
colorsPanel.setBackground(theme.getCellColor());
|
|
|
|
// Color panel
|
|
updateColorVariables(theme);
|
|
|
|
revalidate();
|
|
repaint();
|
|
}
|
|
|
|
private void updateColorVariables(Theme theme) {
|
|
colorsPanel.removeAll();
|
|
buildCustomizeElements(theme);
|
|
}
|
|
|
|
private void buildCustomizeElements(Theme theme) {
|
|
buildCustomizeElement(theme, theme.getBackgroundColor(), "Background", "backgroundColor", 1);
|
|
buildCustomizeElement(theme, theme.getCellColor(), "Cells", "cellColor", 2);
|
|
buildCustomizeElement(theme, theme.getInteractableForegroundColor(), "Interactable Foreground", "interactableForegroundColor", 3);
|
|
buildCustomizeElement(theme, theme.getInteractableBackgroundColor(), "Interactable Background", "interactableBackgroundColor", 4);
|
|
buildCustomizeElement(theme, theme.getTextColor(), "Text Color", "textColor", 5);
|
|
buildCustomizeElement(theme, theme.getDateColor(), "Date Chat", "dateColorChat", 6);
|
|
buildCustomizeElement(theme, theme.getSelectionColor(), "Selection", "selectionColor", 7);
|
|
buildCustomizeElement(theme, theme.getTypingMessageColor(), "Typing Message", "typingMessageColor", 8);
|
|
buildCustomizeElement(theme, theme.getUserNameColor(), "User Names", "userNameColor", 9);
|
|
}
|
|
|
|
private void buildCustomizeElement(Theme theme, Color color, String name, String colorName, int gridy) {
|
|
JButton button = new JButton();
|
|
JTextPane textPane = new JTextPane();
|
|
|
|
textPane.setFont(new Font("Arial", Font.PLAIN, 14));
|
|
textPane.setBackground(theme.getBackgroundColor());
|
|
textPane.setForeground(theme.getBackgroundColor().invert());
|
|
textPane.setText(name);
|
|
textPane.setEditable(false);
|
|
|
|
button.setBackground(color);
|
|
button.setPreferredSize(new Dimension(25, 25));
|
|
|
|
button.addActionListener((evt) -> {
|
|
java.awt.Color c = JColorChooser.showDialog(null, "Choose a color", color);
|
|
if (c != null) {
|
|
Color newColor = new Color(c);
|
|
if (!color.equals(newColor)) {
|
|
logger.log(Level.FINEST, "New Color: " + newColor);
|
|
temporaryTheme.setColor(colorName, newColor);
|
|
themeChanged = true;
|
|
}
|
|
button.setBackground(newColor);
|
|
}
|
|
});
|
|
|
|
GridBagConstraints gbc_textPane = new GridBagConstraints();
|
|
gbc_textPane.fill = GridBagConstraints.BOTH;
|
|
gbc_textPane.gridx = 0;
|
|
gbc_textPane.gridy = gridy;
|
|
gbc_textPane.anchor = GridBagConstraints.CENTER;
|
|
gbc_textPane.insets = insets;
|
|
|
|
colorsPanel.add(textPane, gbc_textPane);
|
|
|
|
GridBagConstraints gbc_button = new GridBagConstraints();
|
|
gbc_button.fill = GridBagConstraints.BOTH;
|
|
gbc_button.gridx = 1;
|
|
gbc_button.gridy = gridy;
|
|
gbc_button.anchor = GridBagConstraints.CENTER;
|
|
gbc_button.insets = insets;
|
|
|
|
colorsPanel.add(button, gbc_button);
|
|
}
|
|
}
|