Added GeneralSettingsPane, added JavaFX support in SettingsItem
Also removed the old settings ui components.
This commit is contained in:
parent
7023562add
commit
0e75bdd057
@ -103,7 +103,7 @@ public class Settings {
|
|||||||
private void supplementDefaults() {
|
private void supplementDefaults() {
|
||||||
items.putIfAbsent("enterToSend", new SettingsItem<>(true, "Enter to send", "Sends a message by pressing the enter key."));
|
items.putIfAbsent("enterToSend", new SettingsItem<>(true, "Enter to send", "Sends a message by pressing the enter key."));
|
||||||
items.putIfAbsent("onCloseMode", new SettingsItem<>(true, "Hide on close", "Hides the chat window when it is closed."));
|
items.putIfAbsent("onCloseMode", new SettingsItem<>(true, "Hide on close", "Hides the chat window when it is closed."));
|
||||||
items.putIfAbsent("currentTheme", new SettingsItem<>("dark", null));
|
items.putIfAbsent("currentTheme", new SettingsItem<>("dark", "Current Theme Name", "The name of the currently selected theme."));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -4,10 +4,11 @@ import java.io.Serializable;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
||||||
|
|
||||||
import envoy.client.ui.primary.PrimaryToggleSwitch;
|
import javafx.scene.Node;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encapsulates a persistent value that is directly or indirectly mutable by the
|
* Encapsulates a persistent value that is directly or indirectly mutable by the
|
||||||
@ -24,17 +25,17 @@ import envoy.client.ui.primary.PrimaryToggleSwitch;
|
|||||||
public class SettingsItem<T> implements Serializable {
|
public class SettingsItem<T> implements Serializable {
|
||||||
|
|
||||||
private T value;
|
private T value;
|
||||||
private Class<? extends JComponent> componentClass;
|
|
||||||
private String userFriendlyName, description;
|
private String userFriendlyName, description;
|
||||||
|
|
||||||
transient private Consumer<T> changeHandler;
|
private transient Consumer<T> changeHandler;
|
||||||
|
private transient Function<SettingsItem<?>, Node> nodeCreator;
|
||||||
|
|
||||||
private static final Map<Class<?>, Class<? extends JComponent>> componentClasses = new HashMap<>();
|
private static final Map<Class<?>, Function<SettingsItem<?>, Node>> nodeCreators = new HashMap<>();
|
||||||
|
|
||||||
private static final long serialVersionUID = 0L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
componentClasses.put(Boolean.class, PrimaryToggleSwitch.class);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -48,37 +49,11 @@ public class SettingsItem<T> implements Serializable {
|
|||||||
* @since Envoy Client v0.3-alpha
|
* @since Envoy Client v0.3-alpha
|
||||||
*/
|
*/
|
||||||
public SettingsItem(T value, String userFriendlyName, String description) {
|
public SettingsItem(T value, String userFriendlyName, String description) {
|
||||||
this(value, componentClasses.get(value.getClass()));
|
this.value = value;
|
||||||
this.userFriendlyName = userFriendlyName;
|
this.userFriendlyName = userFriendlyName;
|
||||||
this.description = description;
|
this.description = description;
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
if (nodeCreators.containsKey(value.getClass())) nodeCreator = nodeCreators.get(value.getClass());
|
||||||
* Initializes a {@link SettingsItem}. The default value's class will be mapped
|
|
||||||
* to a specific {@link JComponent}. The mapping can also be disables if this
|
|
||||||
* parameter is {@code null}. In that case a {@link NullPointerException} will
|
|
||||||
* be thrown if the method {@link SettingsItem#getComponent()} is called.
|
|
||||||
*
|
|
||||||
* @param value the default value
|
|
||||||
* @param componentClass the class of the {@link JComponent} to represent this
|
|
||||||
* {@link SettingsItem} with
|
|
||||||
* @since Envoy Client v0.3-alpha
|
|
||||||
*/
|
|
||||||
public SettingsItem(T value, Class<? extends JComponent> componentClass) {
|
|
||||||
this.value = value;
|
|
||||||
this.componentClass = componentClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return an instance of the {@link JComponent} that represents this
|
|
||||||
* {@link SettingsItem}
|
|
||||||
* @throws ReflectiveOperationException if the component initialization failed
|
|
||||||
* @throws SecurityException if the component initialization failed
|
|
||||||
* @since Envoy Client v0.3-alpha
|
|
||||||
*/
|
|
||||||
public JComponent getComponent() throws ReflectiveOperationException, SecurityException {
|
|
||||||
if (componentClass == null) throw new NullPointerException("Component class is null");
|
|
||||||
return componentClass.getConstructor(SettingsItem.class).newInstance(this);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -99,18 +74,6 @@ public class SettingsItem<T> implements Serializable {
|
|||||||
this.value = value;
|
this.value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the componentClass
|
|
||||||
* @since Envoy Client v0.3-alpha
|
|
||||||
*/
|
|
||||||
public Class<? extends JComponent> getComponentClass() { return componentClass; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param componentClass the componentClass to set
|
|
||||||
* @since Envoy Client v0.3-alpha
|
|
||||||
*/
|
|
||||||
public void setComponentClass(Class<? extends JComponent> componentClass) { this.componentClass = componentClass; }
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the userFriendlyName
|
* @return the userFriendlyName
|
||||||
* @since Envoy Client v0.3-alpha
|
* @since Envoy Client v0.3-alpha
|
||||||
@ -147,4 +110,8 @@ public class SettingsItem<T> implements Serializable {
|
|||||||
this.changeHandler = changeHandler;
|
this.changeHandler = changeHandler;
|
||||||
changeHandler.accept(value);
|
changeHandler.accept(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasNodeCreator() { return nodeCreator != null; }
|
||||||
|
|
||||||
|
public Node getNode() { return nodeCreator.apply(this); }
|
||||||
}
|
}
|
||||||
|
21
src/main/java/envoy/client/ui/GeneralSettingsPane.java
Normal file
21
src/main/java/envoy/client/ui/GeneralSettingsPane.java
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package envoy.client.ui;
|
||||||
|
|
||||||
|
import envoy.client.data.Settings;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Project: <strong>envoy-client</strong><br>
|
||||||
|
* File: <strong>GeneralSettingsPane.java</strong><br>
|
||||||
|
* Created: <strong>18.04.2020</strong><br>
|
||||||
|
*
|
||||||
|
* @author Kai S. K. Engelbart
|
||||||
|
* @since Envoy Client v0.1-beta
|
||||||
|
*/
|
||||||
|
public class GeneralSettingsPane extends SettingsPane {
|
||||||
|
|
||||||
|
private static final Settings settings = Settings.getInstance();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since Envoy Client v0.1-beta
|
||||||
|
*/
|
||||||
|
public GeneralSettingsPane() { super("General"); }
|
||||||
|
}
|
@ -1,7 +1,6 @@
|
|||||||
package envoy.client.ui;
|
package envoy.client.ui;
|
||||||
|
|
||||||
import javafx.scene.Node;
|
import javafx.scene.layout.Pane;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Project: <strong>envoy-client</strong><br>
|
* Project: <strong>envoy-client</strong><br>
|
||||||
@ -11,9 +10,15 @@ import javafx.scene.Node;
|
|||||||
* @author Kai S. K. Engelbart
|
* @author Kai S. K. Engelbart
|
||||||
* @since Envoy Client v0.1-beta
|
* @since Envoy Client v0.1-beta
|
||||||
*/
|
*/
|
||||||
public abstract class SettingsPane extends Node {
|
public abstract class SettingsPane extends Pane {
|
||||||
|
|
||||||
protected String title;
|
protected String title;
|
||||||
|
|
||||||
public abstract String getTitle();
|
protected SettingsPane(String title) { this.title = title; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the title of this settings pane
|
||||||
|
* @since Envoy Client v0.1-beta
|
||||||
|
*/
|
||||||
|
public String getTitle() { return title; }
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,6 @@ package envoy.client.ui;
|
|||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
import javafx.scene.control.*;
|
import javafx.scene.control.*;
|
||||||
|
|
||||||
import envoy.client.data.Settings;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Project: <strong>envoy-client</strong><br>
|
* Project: <strong>envoy-client</strong><br>
|
||||||
* File: <strong>SettingsSceneController.java</strong><br>
|
* File: <strong>SettingsSceneController.java</strong><br>
|
||||||
@ -13,7 +11,7 @@ import envoy.client.data.Settings;
|
|||||||
* @author Kai S. K. Engelbart
|
* @author Kai S. K. Engelbart
|
||||||
* @since Envoy Client v0.1-beta
|
* @since Envoy Client v0.1-beta
|
||||||
*/
|
*/
|
||||||
public class SettingsSceneController {
|
public final class SettingsSceneController {
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
private ListView<SettingsPane> settingsList;
|
private ListView<SettingsPane> settingsList;
|
||||||
@ -21,8 +19,6 @@ public class SettingsSceneController {
|
|||||||
@FXML
|
@FXML
|
||||||
private TitledPane titledPane;
|
private TitledPane titledPane;
|
||||||
|
|
||||||
private static final Settings settings = Settings.getInstance();
|
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
private void initialize() {
|
private void initialize() {
|
||||||
settingsList.setCellFactory(listView -> new ListCell<>() {
|
settingsList.setCellFactory(listView -> new ListCell<>() {
|
||||||
|
@ -1,89 +0,0 @@
|
|||||||
package envoy.client.ui.settings;
|
|
||||||
|
|
||||||
import java.awt.GridBagConstraints;
|
|
||||||
import java.awt.GridBagLayout;
|
|
||||||
import java.awt.Insets;
|
|
||||||
import java.util.logging.Level;
|
|
||||||
import java.util.logging.Logger;
|
|
||||||
|
|
||||||
import javax.swing.JComponent;
|
|
||||||
import javax.swing.JTextPane;
|
|
||||||
|
|
||||||
import envoy.client.data.Settings;
|
|
||||||
import envoy.client.data.SettingsItem;
|
|
||||||
import envoy.client.ui.Theme;
|
|
||||||
import envoy.util.EnvoyLog;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Displays GUI components that allow general settings regarding the client.<br>
|
|
||||||
* <br>
|
|
||||||
* Project: <strong>envoy-client</strong><br>
|
|
||||||
* File: <strong>GeneralSettingsPanel.java</strong><br>
|
|
||||||
* Created: <strong>21 Dec 2019</strong><br>
|
|
||||||
*
|
|
||||||
* @author Maximilian Käfer
|
|
||||||
* @since Envoy Client v0.3-alpha
|
|
||||||
*/
|
|
||||||
public class GeneralSettingsPanel extends SettingsPanel {
|
|
||||||
|
|
||||||
private Theme theme;
|
|
||||||
|
|
||||||
private static final String[] items = { "onCloseMode", "enterToSend" };
|
|
||||||
private static final Logger logger = EnvoyLog.getLogger(GeneralSettingsPanel.class);
|
|
||||||
private static final long serialVersionUID = 0L;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is the constructor for the General class. Here the user can set general
|
|
||||||
* settings for the client.
|
|
||||||
*
|
|
||||||
* @param parent the {@link SettingsScreen} as a part of which this
|
|
||||||
* {@link SettingsPanel} is displayed
|
|
||||||
* @since Envoy Client v0.3-alpha
|
|
||||||
*/
|
|
||||||
public GeneralSettingsPanel(SettingsScreen parent) {
|
|
||||||
super(parent);
|
|
||||||
theme = Settings.getInstance().getCurrentTheme();
|
|
||||||
|
|
||||||
setBackground(theme.getCellColor());
|
|
||||||
|
|
||||||
GridBagLayout gbl_general = new GridBagLayout();
|
|
||||||
gbl_general.columnWidths = new int[] { 1, 1 };
|
|
||||||
gbl_general.rowHeights = new int[] { 1, 1, 1 };
|
|
||||||
gbl_general.columnWeights = new double[] { 1.0, 0.1 };
|
|
||||||
gbl_general.rowWeights = new double[] { 0.02, 0.02, 1.0 };
|
|
||||||
|
|
||||||
setLayout(gbl_general);
|
|
||||||
|
|
||||||
for (int i = 0; i < items.length; i++)
|
|
||||||
try {
|
|
||||||
createSettingElement(i, Settings.getInstance().getItems().get(items[i]));
|
|
||||||
} catch (SecurityException | ReflectiveOperationException e) {
|
|
||||||
logger.log(Level.WARNING, "Could not create settings item", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void createSettingElement(int gridy, SettingsItem<?> settingsItem) throws SecurityException, ReflectiveOperationException {
|
|
||||||
JTextPane descriptionText = new JTextPane();
|
|
||||||
|
|
||||||
JComponent settingComponent = settingsItem.getComponent();
|
|
||||||
|
|
||||||
GridBagConstraints gbc_toggleSwitch = new GridBagConstraints();
|
|
||||||
gbc_toggleSwitch.gridx = 1;
|
|
||||||
gbc_toggleSwitch.gridy = gridy;
|
|
||||||
|
|
||||||
add(settingComponent, gbc_toggleSwitch);
|
|
||||||
|
|
||||||
descriptionText.setText(settingsItem.getDescription());
|
|
||||||
descriptionText.setBackground(theme.getBackgroundColor());
|
|
||||||
descriptionText.setForeground(theme.getBackgroundColor().invert());
|
|
||||||
descriptionText.setEditable(false);
|
|
||||||
|
|
||||||
GridBagConstraints gbc_descriptionText = new GridBagConstraints();
|
|
||||||
gbc_descriptionText.fill = GridBagConstraints.BOTH;
|
|
||||||
gbc_descriptionText.gridx = 0;
|
|
||||||
gbc_descriptionText.gridy = gridy;
|
|
||||||
gbc_descriptionText.insets = new Insets(5, 5, 5, 5);
|
|
||||||
|
|
||||||
add(descriptionText, gbc_descriptionText);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,228 +0,0 @@
|
|||||||
package envoy.client.ui.settings;
|
|
||||||
|
|
||||||
import java.awt.*;
|
|
||||||
import java.util.function.Consumer;
|
|
||||||
|
|
||||||
import javax.swing.JDialog;
|
|
||||||
import javax.swing.JPanel;
|
|
||||||
import javax.swing.JTextPane;
|
|
||||||
|
|
||||||
import envoy.client.data.Settings;
|
|
||||||
import envoy.client.ui.Theme;
|
|
||||||
import envoy.client.ui.primary.PrimaryButton;
|
|
||||||
import envoy.client.ui.primary.PrimaryTextArea;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Displays window where you can choose a name for the new {@link Theme}.
|
|
||||||
* <br>
|
|
||||||
* Project: <strong>envoy-client</strong><br>
|
|
||||||
* File: <strong>NewThemeScreen.java</strong><br>
|
|
||||||
* Created: <strong>26 Dec 2019</strong><br>
|
|
||||||
*
|
|
||||||
* @author Maximilian Käfer
|
|
||||||
* @since Envoy Client v0.3-alpha
|
|
||||||
*/
|
|
||||||
public class NewThemeScreen extends JDialog {
|
|
||||||
|
|
||||||
private final JPanel standardPanel = new JPanel();
|
|
||||||
private final JPanel secondaryPanel = new JPanel();
|
|
||||||
private JTextPane text = new JTextPane();
|
|
||||||
private PrimaryTextArea nameEnterTextArea = new PrimaryTextArea(4);
|
|
||||||
private PrimaryButton confirmButton = new PrimaryButton("Confirm");
|
|
||||||
|
|
||||||
private JTextPane errorText = new JTextPane();
|
|
||||||
private PrimaryButton otherName = new PrimaryButton("Other Name");
|
|
||||||
private PrimaryButton overwrite = new PrimaryButton("Overwrite");
|
|
||||||
|
|
||||||
private final Consumer<String> newThemeAction, modifyThemeAction;
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 0L;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a window, where you can choose a name for a new {@link Theme}. <br>
|
|
||||||
* There are two versions of this Window. The first one is responsible for
|
|
||||||
* choosing the name, the second one appears, if the name already exists.
|
|
||||||
*
|
|
||||||
* @param parent the dialog is launched with its location relative to
|
|
||||||
* this {@link SettingsScreen}
|
|
||||||
* @param newThemeAction is executed when a new theme name is entered
|
|
||||||
* @param modifyThemeAction is executed when an existing theme name is entered
|
|
||||||
* and confirmed
|
|
||||||
* @since Envoy Client v0.3-alpha
|
|
||||||
*/
|
|
||||||
public NewThemeScreen(SettingsScreen parent, Consumer<String> newThemeAction, Consumer<String> modifyThemeAction) {
|
|
||||||
this.newThemeAction = newThemeAction;
|
|
||||||
this.modifyThemeAction = modifyThemeAction;
|
|
||||||
|
|
||||||
setLocationRelativeTo(parent);
|
|
||||||
setTitle("New Theme");
|
|
||||||
setModal(true);
|
|
||||||
|
|
||||||
setDimensions(true);
|
|
||||||
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
|
|
||||||
|
|
||||||
Theme theme = Settings.getInstance().getCurrentTheme();
|
|
||||||
|
|
||||||
getContentPane().setLayout(new BorderLayout());
|
|
||||||
standardPanel.setBackground(theme.getBackgroundColor());
|
|
||||||
secondaryPanel.setBackground(theme.getBackgroundColor());
|
|
||||||
loadStandardContent(theme);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setDimensions(boolean isStandard) {
|
|
||||||
Dimension size = isStandard ? new Dimension(300, 170) : new Dimension(300, 225);
|
|
||||||
setPreferredSize(size);
|
|
||||||
setMinimumSize(size);
|
|
||||||
setMaximumSize(size);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadStandardContent(Theme theme) {
|
|
||||||
getContentPane().removeAll();
|
|
||||||
|
|
||||||
// ContentPane
|
|
||||||
GridBagLayout gbl_contentPanel = new GridBagLayout();
|
|
||||||
|
|
||||||
gbl_contentPanel.columnWidths = new int[] { 1, 1 };
|
|
||||||
gbl_contentPanel.rowHeights = new int[] { 1, 1, 1 };
|
|
||||||
gbl_contentPanel.columnWeights = new double[] { 1, 1 };
|
|
||||||
gbl_contentPanel.rowWeights = new double[] { 1, 1, 1 };
|
|
||||||
|
|
||||||
getContentPane().add(standardPanel, BorderLayout.CENTER);
|
|
||||||
standardPanel.setLayout(gbl_contentPanel);
|
|
||||||
|
|
||||||
// text.setFont(new Font());
|
|
||||||
text.setText("Please enter a name for the new Theme");
|
|
||||||
text.setAlignmentX(CENTER_ALIGNMENT);
|
|
||||||
text.setBackground(theme.getCellColor());
|
|
||||||
text.setForeground(theme.getUserNameColor());
|
|
||||||
text.setEditable(false);
|
|
||||||
|
|
||||||
GridBagConstraints gbc_text = new GridBagConstraints();
|
|
||||||
gbc_text.fill = GridBagConstraints.HORIZONTAL;
|
|
||||||
gbc_text.gridx = 0;
|
|
||||||
gbc_text.gridy = 0;
|
|
||||||
gbc_text.gridwidth = 2;
|
|
||||||
gbc_text.insets = new Insets(5, 5, 5, 5);
|
|
||||||
|
|
||||||
standardPanel.add(text, gbc_text);
|
|
||||||
|
|
||||||
nameEnterTextArea.setBackground(theme.getCellColor());
|
|
||||||
nameEnterTextArea.setForeground(theme.getTypingMessageColor());
|
|
||||||
nameEnterTextArea.setText("");
|
|
||||||
nameEnterTextArea.setEditable(true);
|
|
||||||
|
|
||||||
GridBagConstraints gbc_input = new GridBagConstraints();
|
|
||||||
gbc_input.fill = GridBagConstraints.HORIZONTAL;
|
|
||||||
gbc_input.gridx = 0;
|
|
||||||
gbc_input.gridy = 1;
|
|
||||||
gbc_input.gridwidth = 2;
|
|
||||||
gbc_input.insets = new Insets(5, 5, 5, 5);
|
|
||||||
|
|
||||||
standardPanel.add(nameEnterTextArea, gbc_input);
|
|
||||||
|
|
||||||
confirmButton.setBackground(theme.getInteractableBackgroundColor());
|
|
||||||
confirmButton.setForeground(theme.getInteractableForegroundColor());
|
|
||||||
|
|
||||||
GridBagConstraints gbc_confirmButton = new GridBagConstraints();
|
|
||||||
gbc_confirmButton.gridx = 0;
|
|
||||||
gbc_confirmButton.gridy = 2;
|
|
||||||
gbc_confirmButton.gridwidth = 2;
|
|
||||||
gbc_confirmButton.insets = new Insets(5, 5, 5, 5);
|
|
||||||
|
|
||||||
standardPanel.add(confirmButton, gbc_confirmButton);
|
|
||||||
|
|
||||||
confirmButton.addActionListener((evt) -> {
|
|
||||||
if (!nameEnterTextArea.getText().isEmpty()) if (Settings.getInstance().getThemes().containsKey(nameEnterTextArea.getText())) {
|
|
||||||
// load other panel
|
|
||||||
setDimensions(false);
|
|
||||||
loadSecondaryPage(theme);
|
|
||||||
} else {
|
|
||||||
newThemeAction.accept(nameEnterTextArea.getText());
|
|
||||||
dispose();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadSecondaryPage(Theme theme) {
|
|
||||||
// ContentPane
|
|
||||||
getContentPane().removeAll();
|
|
||||||
|
|
||||||
GridBagLayout gbl_secondaryPanel = new GridBagLayout();
|
|
||||||
|
|
||||||
gbl_secondaryPanel.columnWidths = new int[] { 1, 1 };
|
|
||||||
gbl_secondaryPanel.rowHeights = new int[] { 1, 1, 1, 1 };
|
|
||||||
gbl_secondaryPanel.columnWeights = new double[] { 1, 1 };
|
|
||||||
gbl_secondaryPanel.rowWeights = new double[] { 1, 1, 1, 1 };
|
|
||||||
|
|
||||||
getContentPane().add(secondaryPanel, BorderLayout.CENTER);
|
|
||||||
secondaryPanel.setLayout(gbl_secondaryPanel);
|
|
||||||
|
|
||||||
// text.setFont(new Font());
|
|
||||||
text.setText("Please enter a name for the new Theme");
|
|
||||||
text.setAlignmentX(CENTER_ALIGNMENT);
|
|
||||||
text.setBackground(theme.getCellColor());
|
|
||||||
text.setForeground(theme.getUserNameColor());
|
|
||||||
text.setEditable(false);
|
|
||||||
|
|
||||||
GridBagConstraints gbc_text = new GridBagConstraints();
|
|
||||||
gbc_text.fill = GridBagConstraints.HORIZONTAL;
|
|
||||||
gbc_text.gridx = 0;
|
|
||||||
gbc_text.gridy = 0;
|
|
||||||
gbc_text.gridwidth = 2;
|
|
||||||
gbc_text.insets = new Insets(5, 5, 5, 5);
|
|
||||||
|
|
||||||
secondaryPanel.add(text, gbc_text);
|
|
||||||
|
|
||||||
nameEnterTextArea.setBackground(theme.getCellColor());
|
|
||||||
nameEnterTextArea.setForeground(theme.getTypingMessageColor());
|
|
||||||
nameEnterTextArea.setEditable(false);
|
|
||||||
|
|
||||||
GridBagConstraints gbc_input = new GridBagConstraints();
|
|
||||||
gbc_input.fill = GridBagConstraints.HORIZONTAL;
|
|
||||||
gbc_input.gridx = 0;
|
|
||||||
gbc_input.gridy = 1;
|
|
||||||
gbc_input.gridwidth = 2;
|
|
||||||
gbc_input.insets = new Insets(5, 5, 5, 5);
|
|
||||||
|
|
||||||
secondaryPanel.add(nameEnterTextArea, gbc_input);
|
|
||||||
|
|
||||||
errorText.setText("The name does already exist. Choose another one or overwrite the old theme.");
|
|
||||||
errorText.setAlignmentX(CENTER_ALIGNMENT);
|
|
||||||
errorText.setBackground(theme.getCellColor());
|
|
||||||
errorText.setForeground(theme.getUserNameColor());
|
|
||||||
errorText.setEditable(false);
|
|
||||||
|
|
||||||
GridBagConstraints gbc_errorText = new GridBagConstraints();
|
|
||||||
gbc_errorText.fill = GridBagConstraints.HORIZONTAL;
|
|
||||||
gbc_errorText.gridx = 0;
|
|
||||||
gbc_errorText.gridy = 2;
|
|
||||||
gbc_errorText.gridwidth = 2;
|
|
||||||
gbc_errorText.insets = new Insets(5, 5, 5, 5);
|
|
||||||
|
|
||||||
secondaryPanel.add(errorText, gbc_errorText);
|
|
||||||
|
|
||||||
otherName.setBackground(theme.getInteractableBackgroundColor());
|
|
||||||
otherName.setForeground(theme.getInteractableForegroundColor());
|
|
||||||
|
|
||||||
GridBagConstraints gbc_otherName = new GridBagConstraints();
|
|
||||||
gbc_otherName.gridx = 0;
|
|
||||||
gbc_otherName.gridy = 3;
|
|
||||||
gbc_otherName.insets = new Insets(5, 5, 5, 5);
|
|
||||||
|
|
||||||
secondaryPanel.add(otherName, gbc_otherName);
|
|
||||||
|
|
||||||
overwrite.setBackground(theme.getInteractableBackgroundColor());
|
|
||||||
overwrite.setForeground(theme.getInteractableForegroundColor());
|
|
||||||
|
|
||||||
GridBagConstraints gbc_overwrite = new GridBagConstraints();
|
|
||||||
gbc_overwrite.gridx = 1;
|
|
||||||
gbc_overwrite.gridy = 3;
|
|
||||||
gbc_overwrite.insets = new Insets(5, 5, 5, 5);
|
|
||||||
|
|
||||||
secondaryPanel.add(overwrite, gbc_overwrite);
|
|
||||||
|
|
||||||
otherName.addActionListener((evt) -> { setDimensions(true); loadStandardContent(theme); });
|
|
||||||
|
|
||||||
overwrite.addActionListener((evt) -> { modifyThemeAction.accept(nameEnterTextArea.getText()); dispose(); });
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,30 +0,0 @@
|
|||||||
package envoy.client.ui.settings;
|
|
||||||
|
|
||||||
import javax.swing.JPanel;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Serves as an interface between {@link SettingsScreen} and different
|
|
||||||
* {@link JPanel}s with actual settings that are defined as sub classes of this
|
|
||||||
* class.<br>
|
|
||||||
* <br>
|
|
||||||
* Project: <strong>envoy-client</strong><br>
|
|
||||||
* File: <strong>SettingsPanel.java</strong><br>
|
|
||||||
* Created: <strong>20 Dec 2019</strong><br>
|
|
||||||
*
|
|
||||||
* @author Kai S. K. Engelbart
|
|
||||||
* @since Envoy Client v0.2-alpha
|
|
||||||
*/
|
|
||||||
public abstract class SettingsPanel extends JPanel {
|
|
||||||
|
|
||||||
protected final SettingsScreen parent;
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 0L;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes a {@link SettingsPanel}.
|
|
||||||
*
|
|
||||||
* @param parent the {@link SettingsScreen} as a part of which this
|
|
||||||
* {@link SettingsPanel} is displayed
|
|
||||||
*/
|
|
||||||
public SettingsPanel(SettingsScreen parent) { this.parent = parent; }
|
|
||||||
}
|
|
@ -1,172 +0,0 @@
|
|||||||
package envoy.client.ui.settings;
|
|
||||||
|
|
||||||
import java.awt.*;
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
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.Theme;
|
|
||||||
import envoy.client.ui.primary.PrimaryButton;
|
|
||||||
import envoy.event.EventBus;
|
|
||||||
import envoy.util.EnvoyLog;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This class provides the GUI to change the user specific settings.<br>
|
|
||||||
* <br>
|
|
||||||
* Project: <strong>envoy-client</strong><br>
|
|
||||||
* File: <strong>SettingsScreen.java</strong><br>
|
|
||||||
* Created: <strong>31 Oct 2019</strong><br>
|
|
||||||
*
|
|
||||||
* @author Leon Hofmeister
|
|
||||||
* @author Maximilian Käfer
|
|
||||||
* @author Kai S. K. Engelbart
|
|
||||||
* @since Envoy Client v0.2-alpha
|
|
||||||
*/
|
|
||||||
public class SettingsScreen extends JDialog {
|
|
||||||
|
|
||||||
private static final long serialVersionUID = 0L;
|
|
||||||
|
|
||||||
private final JPanel contentPanel = new JPanel();
|
|
||||||
|
|
||||||
// Settings panel list
|
|
||||||
private final DefaultListModel<String> optionsListModel = new DefaultListModel<>();
|
|
||||||
private final JList<String> options = new JList<>(optionsListModel);
|
|
||||||
|
|
||||||
// OK and cancel buttons
|
|
||||||
private final JPanel buttonPane = new JPanel();
|
|
||||||
private final PrimaryButton cancelButton = new PrimaryButton("Cancel");
|
|
||||||
|
|
||||||
private final Insets insets = new Insets(5, 5, 5, 5);
|
|
||||||
|
|
||||||
private SettingsPanel settingsPanel;
|
|
||||||
|
|
||||||
private static final Logger logger = EnvoyLog.getLogger(SettingsScreen.class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initializes the settings screen.
|
|
||||||
*
|
|
||||||
* @since Envoy Client v0.1-alpha
|
|
||||||
*/
|
|
||||||
public SettingsScreen() {
|
|
||||||
// Initialize settings pages
|
|
||||||
Map<String, Class<? extends SettingsPanel>> panels = new HashMap<>();
|
|
||||||
panels.put("General", GeneralSettingsPanel.class);
|
|
||||||
panels.put("Color Themes", ThemeCustomizationPanel.class);
|
|
||||||
|
|
||||||
setBounds(10, 10, 450, 650);
|
|
||||||
getContentPane().setLayout(new BorderLayout());
|
|
||||||
{
|
|
||||||
// ContentPane
|
|
||||||
GridBagLayout gbl_contentPanel = new GridBagLayout();
|
|
||||||
|
|
||||||
gbl_contentPanel.columnWidths = new int[] { 1, 1 };
|
|
||||||
gbl_contentPanel.rowHeights = new int[] { 1 };
|
|
||||||
gbl_contentPanel.columnWeights = new double[] { 0.05, 1.0 };
|
|
||||||
gbl_contentPanel.rowWeights = new double[] { 1.0 };
|
|
||||||
|
|
||||||
getContentPane().add(contentPanel, BorderLayout.CENTER);
|
|
||||||
contentPanel.setLayout(gbl_contentPanel);
|
|
||||||
|
|
||||||
// Constraints for the settings panel
|
|
||||||
GridBagConstraints gbc_panel = new GridBagConstraints();
|
|
||||||
gbc_panel.fill = GridBagConstraints.BOTH;
|
|
||||||
gbc_panel.gridx = 1;
|
|
||||||
gbc_panel.gridy = 0;
|
|
||||||
gbc_panel.anchor = GridBagConstraints.PAGE_START;
|
|
||||||
gbc_panel.insets = insets;
|
|
||||||
|
|
||||||
options.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
|
|
||||||
options.addListSelectionListener((listSelectionEvent) -> {
|
|
||||||
if (!listSelectionEvent.getValueIsAdjusting()) {
|
|
||||||
// Get selected settings panel
|
|
||||||
final String option = options.getSelectedValue();
|
|
||||||
logger.log(Level.FINEST, "Selected settings panel: " + option);
|
|
||||||
|
|
||||||
// Remove previous settings panel
|
|
||||||
if (settingsPanel != null) contentPanel.remove(settingsPanel);
|
|
||||||
|
|
||||||
try {
|
|
||||||
settingsPanel = panels.get(option).getDeclaredConstructor(getClass()).newInstance(this);
|
|
||||||
|
|
||||||
// Add selected settings panel
|
|
||||||
contentPanel.add(settingsPanel, gbc_panel);
|
|
||||||
revalidate();
|
|
||||||
repaint();
|
|
||||||
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException
|
|
||||||
| NoSuchMethodException | SecurityException e) {
|
|
||||||
logger.log(Level.SEVERE, "Failed to invoke constructor of SettingsPanel " + option, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
options.setFont(new Font("Arial", Font.PLAIN, 14));
|
|
||||||
|
|
||||||
GridBagConstraints gbc_optionsList = new GridBagConstraints();
|
|
||||||
gbc_optionsList.fill = GridBagConstraints.BOTH;
|
|
||||||
gbc_optionsList.gridx = 0;
|
|
||||||
gbc_optionsList.gridy = 0;
|
|
||||||
gbc_optionsList.anchor = GridBagConstraints.PAGE_START;
|
|
||||||
gbc_optionsList.insets = insets;
|
|
||||||
|
|
||||||
panels.keySet().forEach(name -> optionsListModel.addElement(name));
|
|
||||||
contentPanel.add(options, gbc_optionsList);
|
|
||||||
|
|
||||||
// ButtonPane
|
|
||||||
GridBagLayout gbl_buttonPane = new GridBagLayout();
|
|
||||||
gbl_buttonPane.columnWidths = new int[] { 1, 1 };
|
|
||||||
gbl_buttonPane.rowHeights = new int[] { 25 };
|
|
||||||
gbl_buttonPane.columnWeights = new double[] { 1.0, 1.0 };
|
|
||||||
gbl_buttonPane.rowWeights = new double[] { 0.0 };
|
|
||||||
|
|
||||||
getContentPane().add(buttonPane, BorderLayout.SOUTH);
|
|
||||||
buttonPane.setLayout(gbl_buttonPane);
|
|
||||||
{
|
|
||||||
cancelButton.setActionCommand("Cancel");
|
|
||||||
cancelButton.setBorderPainted(false);
|
|
||||||
GridBagConstraints gbc_cancelButton = new GridBagConstraints();
|
|
||||||
gbc_cancelButton.anchor = GridBagConstraints.NORTHWEST;
|
|
||||||
gbc_cancelButton.insets = insets;
|
|
||||||
gbc_cancelButton.gridx = 0;
|
|
||||||
gbc_cancelButton.gridy = 0;
|
|
||||||
buttonPane.add(cancelButton, gbc_cancelButton);
|
|
||||||
|
|
||||||
cancelButton.addActionListener((evt) -> { dispose(); });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply current theme
|
|
||||||
applyTheme(Settings.getInstance().getCurrentTheme());
|
|
||||||
|
|
||||||
// Respond to theme changes
|
|
||||||
EventBus.getInstance().register(ThemeChangeEvent.class, evt -> applyTheme(evt.get()));
|
|
||||||
|
|
||||||
setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
|
|
||||||
setModal(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void applyTheme(Theme theme) {
|
|
||||||
// JDialog
|
|
||||||
setBackground(theme.getBackgroundColor());
|
|
||||||
|
|
||||||
// contentPanel
|
|
||||||
contentPanel.setBackground(theme.getBackgroundColor());
|
|
||||||
|
|
||||||
// buttonPane
|
|
||||||
buttonPane.setBackground(theme.getCellColor());
|
|
||||||
|
|
||||||
// cancelButton
|
|
||||||
cancelButton.setBackground(theme.getInteractableBackgroundColor());
|
|
||||||
cancelButton.setForeground(theme.getInteractableForegroundColor());
|
|
||||||
|
|
||||||
// options
|
|
||||||
options.setSelectionForeground(theme.getUserNameColor());
|
|
||||||
options.setSelectionBackground(theme.getSelectionColor());
|
|
||||||
options.setForeground(theme.getUserNameColor());
|
|
||||||
options.setBackground(theme.getCellColor());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,246 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
/**
|
|
||||||
* This package contains user interface classes related to the settings screen.
|
|
||||||
*
|
|
||||||
* @author Kai S. K. Engelbart
|
|
||||||
* @author Leon Hofmeister
|
|
||||||
* @author Maximilian Käfer
|
|
||||||
* @since Envoy Client v0.2-alpha
|
|
||||||
*/
|
|
||||||
package envoy.client.ui.settings;
|
|
Reference in New Issue
Block a user