Merge pull request #77 from informatik-ag-ngl/f/onCloseToggleSwitch
General Settings screen
This commit is contained in:
commit
8556e31ce9
@ -1,11 +1,11 @@
|
|||||||
package envoy.client;
|
package envoy.client;
|
||||||
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.prefs.Preferences;
|
import java.util.prefs.Preferences;
|
||||||
|
|
||||||
|
import envoy.client.ui.Color;
|
||||||
import envoy.client.ui.Theme;
|
import envoy.client.ui.Theme;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -28,6 +28,7 @@ public class Settings {
|
|||||||
private boolean enterToSend = true;
|
private boolean enterToSend = true;
|
||||||
private Map<String, Theme> themes;
|
private Map<String, Theme> themes;
|
||||||
private String currentTheme;
|
private String currentTheme;
|
||||||
|
private boolean currentOnCloseMode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Required to save the settings.
|
* Required to save the settings.
|
||||||
@ -64,6 +65,7 @@ public class Settings {
|
|||||||
private void load() {
|
private void load() {
|
||||||
setEnterToSend(prefs.getBoolean("enterToSend", true));
|
setEnterToSend(prefs.getBoolean("enterToSend", true));
|
||||||
setCurrentTheme(prefs.get("theme", "dark"));
|
setCurrentTheme(prefs.get("theme", "dark"));
|
||||||
|
setCurrentOnCloseMode(prefs.getBoolean("onCloseMode", true));
|
||||||
|
|
||||||
// Load themes from theme file
|
// Load themes from theme file
|
||||||
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(themeFile))) {
|
try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(themeFile))) {
|
||||||
@ -94,6 +96,7 @@ public class Settings {
|
|||||||
public void save() throws IOException {
|
public void save() throws IOException {
|
||||||
prefs.put("theme", currentTheme);
|
prefs.put("theme", currentTheme);
|
||||||
prefs.putBoolean("enterToSend", isEnterToSend());
|
prefs.putBoolean("enterToSend", isEnterToSend());
|
||||||
|
prefs.putBoolean("onCloseMode", currentOnCloseMode);
|
||||||
|
|
||||||
// Save themes to theme file
|
// Save themes to theme file
|
||||||
themeFile.createNewFile();
|
themeFile.createNewFile();
|
||||||
@ -155,4 +158,18 @@ public class Settings {
|
|||||||
* @since Envoy v0.2-alpha
|
* @since Envoy v0.2-alpha
|
||||||
*/
|
*/
|
||||||
public void setThemes(Map<String, Theme> themes) { this.themes = themes; }
|
public void setThemes(Map<String, Theme> themes) { this.themes = themes; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the current on close mode.
|
||||||
|
* @since Envoy v0.3-alpha
|
||||||
|
*/
|
||||||
|
public boolean getCurrentOnCloseMode() { return currentOnCloseMode; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the current on close mode.
|
||||||
|
*
|
||||||
|
* @param currentOnCloseMode the on close mode that should be set.
|
||||||
|
* @since Envoy v0.3-alpha
|
||||||
|
*/
|
||||||
|
public void setCurrentOnCloseMode(boolean currentOnCloseMode) { this.currentOnCloseMode = currentOnCloseMode; }
|
||||||
}
|
}
|
27
src/main/java/envoy/client/event/EnterToSendEvent.java
Normal file
27
src/main/java/envoy/client/event/EnterToSendEvent.java
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package envoy.client.event;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encapsulates a change to the {@code enterToSend} setting.<br>
|
||||||
|
* <br>
|
||||||
|
* Project: <strong>envoy-client</strong><br>
|
||||||
|
* File: <strong>EnterToSendEvent.java</strong><br>
|
||||||
|
* Created: <strong>22 Dec 2019</strong><br>
|
||||||
|
*
|
||||||
|
* @author Maximilian Käfer
|
||||||
|
* @since Envoy v0.3-alpha
|
||||||
|
*/
|
||||||
|
public class EnterToSendEvent implements Event<Boolean> {
|
||||||
|
|
||||||
|
private boolean mode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes an {@link EnterToSendEvent}.
|
||||||
|
*
|
||||||
|
* @param mode the state of the {@code enterToSend} setting
|
||||||
|
* @since Envoy 0.3-alpha
|
||||||
|
*/
|
||||||
|
public EnterToSendEvent(boolean mode) { this.mode = mode; }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean get() { return mode; }
|
||||||
|
}
|
27
src/main/java/envoy/client/event/OnCloseChangeEvent.java
Normal file
27
src/main/java/envoy/client/event/OnCloseChangeEvent.java
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package envoy.client.event;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encapsulates a change to the {@code currentOnCloseMode} setting.<br>
|
||||||
|
* <br>
|
||||||
|
* Project: <strong>envoy-client</strong><br>
|
||||||
|
* File: <strong>OnCloseChangeEvent.java</strong><br>
|
||||||
|
* Created: <strong>22 Dec 2019</strong><br>
|
||||||
|
*
|
||||||
|
* @author Maximilian Käfer
|
||||||
|
* @since Envoy v0.3-alpha
|
||||||
|
*/
|
||||||
|
public class OnCloseChangeEvent implements Event<Boolean> {
|
||||||
|
|
||||||
|
private boolean closeMode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes an {@link OnCloseChangeEvent}.
|
||||||
|
*
|
||||||
|
* @param closeMode the state of the {@code currentOnCloseMode} setting
|
||||||
|
* @since Envoy 0.3-alpha
|
||||||
|
*/
|
||||||
|
public OnCloseChangeEvent(boolean closeMode) { this.closeMode = closeMode; }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean get() { return closeMode; }
|
||||||
|
}
|
106
src/main/java/envoy/client/ui/Color.java
Normal file
106
src/main/java/envoy/client/ui/Color.java
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
package envoy.client.ui;
|
||||||
|
|
||||||
|
import java.awt.color.ColorSpace;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Project: <strong>envoy-clientChess</strong><br>
|
||||||
|
* File: <strong>Color.javaEvent.java</strong><br>
|
||||||
|
* Created: <strong>23.12.2019</strong><br>
|
||||||
|
*
|
||||||
|
* @author Kai S. K. Engelbart
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("javadoc")
|
||||||
|
public class Color extends java.awt.Color {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The color white. In the default sRGB space.
|
||||||
|
*/
|
||||||
|
public static final Color white = new Color(255, 255, 255);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The color light gray. In the default sRGB space.
|
||||||
|
*/
|
||||||
|
public static final Color lightGray = new Color(192, 192, 192);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The color gray. In the default sRGB space.
|
||||||
|
*/
|
||||||
|
public static final Color gray = new Color(128, 128, 128);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The color dark gray. In the default sRGB space.
|
||||||
|
*/
|
||||||
|
public static final Color darkGray = new Color(64, 64, 64);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The color black. In the default sRGB space.
|
||||||
|
*/
|
||||||
|
public static final Color black = new Color(0, 0, 0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The color red. In the default sRGB space.
|
||||||
|
*/
|
||||||
|
public static final Color red = new Color(255, 0, 0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The color pink. In the default sRGB space.
|
||||||
|
*/
|
||||||
|
public static final Color pink = new Color(255, 175, 175);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The color orange. In the default sRGB space.
|
||||||
|
*/
|
||||||
|
public static final Color orange = new Color(255, 200, 0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The color yellow. In the default sRGB space.
|
||||||
|
*/
|
||||||
|
public static final Color yellow = new Color(255, 255, 0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The color green. In the default sRGB space.
|
||||||
|
*/
|
||||||
|
public static final Color green = new Color(0, 255, 0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The color magenta. In the default sRGB space.
|
||||||
|
*/
|
||||||
|
public static final Color magenta = new Color(255, 0, 255);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The color cyan. In the default sRGB space.
|
||||||
|
*/
|
||||||
|
public static final Color cyan = new Color(0, 255, 255);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The color blue. In the default sRGB space.
|
||||||
|
*/
|
||||||
|
public static final Color blue = new Color(0, 0, 255);
|
||||||
|
|
||||||
|
private static final long serialVersionUID = -9166233199998257344L;
|
||||||
|
|
||||||
|
public Color(int rgb) { super(rgb); }
|
||||||
|
|
||||||
|
public Color(int rgba, boolean hasalpha) { super(rgba, hasalpha); }
|
||||||
|
|
||||||
|
public Color(int r, int g, int b) { super(r, g, b); }
|
||||||
|
|
||||||
|
public Color(float r, float g, float b) { super(r, g, b); }
|
||||||
|
|
||||||
|
public Color(ColorSpace cspace, float[] components, float alpha) { super(cspace, components, alpha); }
|
||||||
|
|
||||||
|
public Color(int r, int g, int b, int a) { super(r, g, b, a); }
|
||||||
|
|
||||||
|
public Color(float r, float g, float b, float a) { super(r, g, b, a); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the inversion of this {@link Color} by replacing the red, green and
|
||||||
|
* blue values by subtracting them form 255
|
||||||
|
*/
|
||||||
|
public Color invert() { return new Color(255 - getRed(), 255 - getGreen(), 255 - getBlue()); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the hex value of this {@link Color}
|
||||||
|
*/
|
||||||
|
public String toHex() { return String.format("#%02x%02x%02x", getRed(), getGreen(), getBlue()); }
|
||||||
|
}
|
@ -1,6 +1,5 @@
|
|||||||
package envoy.client.ui;
|
package envoy.client.ui;
|
||||||
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
|
|
||||||
@ -46,11 +45,11 @@ public class MessageListRenderer extends JLabel implements ListCellRenderer<Mess
|
|||||||
// Getting the MessageColor in the Chat of the current theme
|
// Getting the MessageColor in the Chat of the current theme
|
||||||
String textColor = null;
|
String textColor = null;
|
||||||
|
|
||||||
textColor = toHex(Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getMessageColorChat());
|
textColor = Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getMessageColorChat().toHex();
|
||||||
|
|
||||||
// Getting the DateColor in the Chat of the current theme
|
// Getting the DateColor in the Chat of the current theme
|
||||||
String dateColor = null;
|
String dateColor = null;
|
||||||
dateColor = toHex(Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getDateColorChat());
|
dateColor = Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getDateColorChat().toHex();
|
||||||
|
|
||||||
setText(String.format("<html><p style=\"color:%s\"><b><small>%s</b></small><br><p style=\"color:%s\">%s :%s</html>",
|
setText(String.format("<html><p style=\"color:%s\"><b><small>%s</b></small><br><p style=\"color:%s\">%s :%s</html>",
|
||||||
dateColor,
|
dateColor,
|
||||||
@ -60,12 +59,4 @@ public class MessageListRenderer extends JLabel implements ListCellRenderer<Mess
|
|||||||
state));
|
state));
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String toHex(Color c) {
|
|
||||||
int r = c.getRed();
|
|
||||||
int g = c.getGreen();
|
|
||||||
int b = c.getBlue();
|
|
||||||
String hex = String.format("#%02x%02x%02x", r, g, b);
|
|
||||||
return hex;
|
|
||||||
}
|
|
||||||
}
|
}
|
114
src/main/java/envoy/client/ui/PrimaryToggleSwitch.java
Normal file
114
src/main/java/envoy/client/ui/PrimaryToggleSwitch.java
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
package envoy.client.ui;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import javax.swing.JButton;
|
||||||
|
import javax.swing.JPanel;
|
||||||
|
|
||||||
|
import envoy.client.Settings;
|
||||||
|
import envoy.client.event.Event;
|
||||||
|
import envoy.client.event.EventBus;
|
||||||
|
import envoy.client.util.EnvoyLog;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This Component can be used to toggle between two options. e.g. on and
|
||||||
|
* off.<br>
|
||||||
|
* <br>
|
||||||
|
* Project: <strong>envoy-client</strong><br>
|
||||||
|
* File: <strong>PrimaryToggleSwitch.java</strong><br>
|
||||||
|
* Created: <strong>21 Dec 2019</strong><br>
|
||||||
|
*
|
||||||
|
* @author Maximilian Käfer
|
||||||
|
* @since Envoy v0.3-alpha
|
||||||
|
*/
|
||||||
|
public class PrimaryToggleSwitch extends JPanel {
|
||||||
|
|
||||||
|
private final JButton b = new JButton("");
|
||||||
|
|
||||||
|
private boolean currentState;
|
||||||
|
|
||||||
|
private static final Logger logger = EnvoyLog.getLogger(PrimaryToggleSwitch.class.getSimpleName());
|
||||||
|
private static final long serialVersionUID = -721155303106833184L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the constructor for the PrimaryToggleSwitch.
|
||||||
|
*
|
||||||
|
* @param initialState The state the toggleSwitch is standardly set to. </br>
|
||||||
|
* true: off </br>
|
||||||
|
* false: on
|
||||||
|
* @param eventClass the class of the event dispatched by this toggleSwitch
|
||||||
|
* @since Envoy v0.3-alpha
|
||||||
|
*/
|
||||||
|
public PrimaryToggleSwitch(boolean initialState, Class<? extends Event<Boolean>> eventClass) {
|
||||||
|
setEnabled(true);
|
||||||
|
setVisible(true);
|
||||||
|
|
||||||
|
setPreferredSize(new Dimension(50, 25));
|
||||||
|
setMinimumSize(new Dimension(50, 25));
|
||||||
|
setMaximumSize(new Dimension(50, 25));
|
||||||
|
|
||||||
|
b.setPreferredSize(new Dimension(25, 25));
|
||||||
|
b.setMinimumSize(new Dimension(25, 25));
|
||||||
|
b.setMaximumSize(new Dimension(25, 25));
|
||||||
|
|
||||||
|
b.setBackground(Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getInteractableBackgroundColor());
|
||||||
|
|
||||||
|
GridBagLayout gbl_toggleSwitch = new GridBagLayout();
|
||||||
|
gbl_toggleSwitch.columnWidths = new int[] { 1, 1 };
|
||||||
|
gbl_toggleSwitch.rowHeights = new int[] { 1 };
|
||||||
|
gbl_toggleSwitch.columnWeights = new double[] { 1.0, 1.0 };
|
||||||
|
gbl_toggleSwitch.rowWeights = new double[] { 1.0 };
|
||||||
|
|
||||||
|
setLayout(gbl_toggleSwitch);
|
||||||
|
|
||||||
|
setState(initialState);
|
||||||
|
|
||||||
|
b.addActionListener((evt) -> {
|
||||||
|
try {
|
||||||
|
// Dispatch event
|
||||||
|
Constructor<? extends Event<Boolean>> constructor = eventClass.getConstructor(boolean.class);
|
||||||
|
EventBus.getInstance().dispatch(constructor.newInstance(currentState));
|
||||||
|
|
||||||
|
setState(!currentState);
|
||||||
|
revalidate();
|
||||||
|
repaint();
|
||||||
|
} catch (ReflectiveOperationException | SecurityException e) {
|
||||||
|
logger.warning("An error occured while changing the setting: " + e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void paintComponent(Graphics g) {
|
||||||
|
g.setColor(Color.LIGHT_GRAY);
|
||||||
|
g.fillRect(0, 0, 50, 25);
|
||||||
|
g.setColor(Color.GREEN);
|
||||||
|
g.fillRect(0, 0, 25, 25);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method sets the state of this {@link PrimaryToggleSwitch}.
|
||||||
|
*
|
||||||
|
* @param state {@code true} to enable the switch, {@code false} to disable it
|
||||||
|
* @since Envoy 0.3-alpha
|
||||||
|
*/
|
||||||
|
public void setState(boolean state) {
|
||||||
|
GridBagConstraints gbc_toggleButton = new GridBagConstraints();
|
||||||
|
|
||||||
|
if (state) {
|
||||||
|
gbc_toggleButton.anchor = GridBagConstraints.WEST;
|
||||||
|
gbc_toggleButton.gridx = 0;
|
||||||
|
} else {
|
||||||
|
gbc_toggleButton.anchor = GridBagConstraints.EAST;
|
||||||
|
gbc_toggleButton.gridx = 1;
|
||||||
|
}
|
||||||
|
gbc_toggleButton.gridy = 0;
|
||||||
|
add(b, gbc_toggleButton);
|
||||||
|
|
||||||
|
currentState = state;
|
||||||
|
}
|
||||||
|
}
|
@ -142,7 +142,8 @@ public class Startup {
|
|||||||
try {
|
try {
|
||||||
new StatusTrayIcon(chatWindow).show();
|
new StatusTrayIcon(chatWindow).show();
|
||||||
|
|
||||||
// If the tray icon is supported, hide the chat window on close
|
// If the tray icon is supported and corresponding settings is set, hide the chat window on close
|
||||||
|
if (Settings.getInstance().getCurrentOnCloseMode())
|
||||||
chatWindow.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
|
chatWindow.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
|
||||||
} catch (EnvoyException e) {
|
} catch (EnvoyException e) {
|
||||||
logger.warning("The StatusTrayIcon is not supported on this platform!");
|
logger.warning("The StatusTrayIcon is not supported on this platform!");
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package envoy.client.ui;
|
package envoy.client.ui;
|
||||||
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package envoy.client.ui;
|
package envoy.client.ui;
|
||||||
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
|
|
||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
@ -44,7 +43,7 @@ public class UserListRenderer extends JLabel implements ListCellRenderer<User> {
|
|||||||
|
|
||||||
// Getting the UserNameColor of the current theme
|
// Getting the UserNameColor of the current theme
|
||||||
String textColor = null;
|
String textColor = null;
|
||||||
textColor = toHex(Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getUserNameColor());
|
textColor = Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getUserNameColor().toHex();
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case ONLINE:
|
case ONLINE:
|
||||||
setText(String
|
setText(String
|
||||||
@ -57,12 +56,4 @@ public class UserListRenderer extends JLabel implements ListCellRenderer<User> {
|
|||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String toHex(Color c) {
|
|
||||||
int r = c.getRed();
|
|
||||||
int g = c.getGreen();
|
|
||||||
int b = c.getBlue();
|
|
||||||
String hex = String.format("#%02x%02x%02x", r, g, b);
|
|
||||||
return hex;
|
|
||||||
}
|
|
||||||
}
|
}
|
169
src/main/java/envoy/client/ui/settings/General.java
Normal file
169
src/main/java/envoy/client/ui/settings/General.java
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
package envoy.client.ui.settings;
|
||||||
|
|
||||||
|
import java.awt.GridBagConstraints;
|
||||||
|
import java.awt.GridBagLayout;
|
||||||
|
import java.awt.Insets;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
import javax.swing.JOptionPane;
|
||||||
|
import javax.swing.JTextPane;
|
||||||
|
|
||||||
|
import envoy.client.Settings;
|
||||||
|
import envoy.client.event.*;
|
||||||
|
import envoy.client.ui.PrimaryToggleSwitch;
|
||||||
|
import envoy.client.ui.Theme;
|
||||||
|
import envoy.client.util.EnvoyLog;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays GUI components that allow general settings regarding the client.<br>
|
||||||
|
* <br>
|
||||||
|
* Project: <strong>envoy-client</strong><br>
|
||||||
|
* File: <strong>General.java</strong><br>
|
||||||
|
* Created: <strong>21 Dec 2019</strong><br>
|
||||||
|
*
|
||||||
|
* @author Maximilian Käfer
|
||||||
|
* @since Envoy v0.3-alpha
|
||||||
|
*/
|
||||||
|
public class General extends SettingsPanel {
|
||||||
|
|
||||||
|
private Theme theme;
|
||||||
|
private boolean onCloseState;
|
||||||
|
private boolean enterToSend;
|
||||||
|
|
||||||
|
private PrimaryToggleSwitch toggleSwitch;
|
||||||
|
private JTextPane onCloseModeTextPane = new JTextPane();
|
||||||
|
private JTextPane onCloseModeStatePane = new JTextPane();
|
||||||
|
|
||||||
|
private PrimaryToggleSwitch toggleSwitchEnterToSend;
|
||||||
|
private JTextPane enterToSendTextPane = new JTextPane();
|
||||||
|
private JTextPane enterToSendStatePane = new JTextPane();
|
||||||
|
|
||||||
|
private static final Logger logger = EnvoyLog.getLogger(General.class.getSimpleName());
|
||||||
|
private static final long serialVersionUID = -7470848775130754239L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is the constructor for the General class. Here the user can set general
|
||||||
|
* settings for the client.
|
||||||
|
*
|
||||||
|
* @since Envoy 0.3-alpha
|
||||||
|
*/
|
||||||
|
public General() {
|
||||||
|
theme = Settings.getInstance().getThemes().get(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, 1, 1 };
|
||||||
|
gbl_general.columnWeights = new double[] { 1.0, 0.1 };
|
||||||
|
gbl_general.rowWeights = new double[] { 0.02, 0.0005, 0.02, 0.0005, 1.0 };
|
||||||
|
|
||||||
|
setLayout(gbl_general);
|
||||||
|
|
||||||
|
createSettingElement(0,
|
||||||
|
OnCloseChangeEvent.class,
|
||||||
|
Settings.getInstance().getCurrentOnCloseMode(),
|
||||||
|
toggleSwitch,
|
||||||
|
onCloseModeStatePane,
|
||||||
|
onCloseModeTextPane,
|
||||||
|
"Client runs in the background, when window is closed");
|
||||||
|
EventBus.getInstance().register(OnCloseChangeEvent.class, (evt) -> changeOnClose(((OnCloseChangeEvent) evt).get()));
|
||||||
|
|
||||||
|
createSettingElement(2,
|
||||||
|
EnterToSendEvent.class,
|
||||||
|
Settings.getInstance().isEnterToSend(),
|
||||||
|
toggleSwitchEnterToSend,
|
||||||
|
enterToSendStatePane,
|
||||||
|
enterToSendTextPane,
|
||||||
|
"Press Enter to send messages");
|
||||||
|
EventBus.getInstance().register(EnterToSendEvent.class, (evt) -> changeEnterToSend(((EnterToSendEvent) evt).get()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method changes the on close mode of the client.
|
||||||
|
*
|
||||||
|
* @param state This is the integer that defines weather the toggleSwitch is on
|
||||||
|
* or off.
|
||||||
|
* @since Envoy v0.3-alpha
|
||||||
|
*/
|
||||||
|
public void changeOnClose(boolean state) {
|
||||||
|
this.onCloseState = state;
|
||||||
|
|
||||||
|
onCloseModeStatePane.setText(state ? "ON" : "OFF");
|
||||||
|
revalidate();
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method changes the enter to send a message setting.
|
||||||
|
*
|
||||||
|
* @param state This is the integer that defines weather the toggleSwitch is on
|
||||||
|
* or off.
|
||||||
|
* @since Envoy v0.3-alpha
|
||||||
|
*/
|
||||||
|
public void changeEnterToSend(boolean state) {
|
||||||
|
this.enterToSend = state;
|
||||||
|
|
||||||
|
enterToSendStatePane.setText(state ? "ON" : "OFF");
|
||||||
|
revalidate();
|
||||||
|
repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createSettingElement(int gridy, Class<? extends Event<Boolean>> eventClass, boolean state, PrimaryToggleSwitch toggleSwitch,
|
||||||
|
JTextPane stateText, JTextPane descriptionText, String text) {
|
||||||
|
toggleSwitch = new PrimaryToggleSwitch(state, eventClass);
|
||||||
|
|
||||||
|
GridBagConstraints gbc_toggleSwitch = new GridBagConstraints();
|
||||||
|
gbc_toggleSwitch.gridx = 1;
|
||||||
|
gbc_toggleSwitch.gridy = gridy;
|
||||||
|
|
||||||
|
add(toggleSwitch, gbc_toggleSwitch);
|
||||||
|
|
||||||
|
stateText.setText(state ? "ON" : "OFF");
|
||||||
|
stateText.setBackground(theme.getCellColor());
|
||||||
|
stateText.setForeground(theme.getUserNameColor());
|
||||||
|
stateText.setEditable(false);
|
||||||
|
|
||||||
|
GridBagConstraints gbc_stateText = new GridBagConstraints();
|
||||||
|
gbc_stateText.anchor = GridBagConstraints.NORTH;
|
||||||
|
gbc_stateText.gridx = 1;
|
||||||
|
gbc_stateText.gridy = gridy + 1;
|
||||||
|
|
||||||
|
add(stateText, gbc_stateText);
|
||||||
|
|
||||||
|
descriptionText.setText(text);
|
||||||
|
descriptionText.setBackground(theme.getBackgroundColor().invert());
|
||||||
|
descriptionText.setForeground(theme.getUserNameColor());
|
||||||
|
descriptionText.setEditable(false);
|
||||||
|
|
||||||
|
GridBagConstraints gbc_descriptionText = new GridBagConstraints();
|
||||||
|
gbc_descriptionText.fill = GridBagConstraints.BOTH;
|
||||||
|
gbc_descriptionText.gridx = 0;
|
||||||
|
gbc_descriptionText.gridy = gridy;
|
||||||
|
gbc_descriptionText.gridheight = 2;
|
||||||
|
gbc_descriptionText.insets = new Insets(5, 5, 5, 5);
|
||||||
|
|
||||||
|
add(descriptionText, gbc_descriptionText);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ActionListener getOkButtonAction() {
|
||||||
|
return (evt) -> {
|
||||||
|
if (onCloseState != Settings.getInstance().getCurrentOnCloseMode()) try {
|
||||||
|
Settings.getInstance().setCurrentOnCloseMode(onCloseState);
|
||||||
|
JOptionPane.showMessageDialog(null, "The changes will take effect the next time the program is started.");
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.log(Level.WARNING, "Close mode could not be changed! ", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (enterToSend != Settings.getInstance().isEnterToSend()) try {
|
||||||
|
Settings.getInstance().setEnterToSend(enterToSend);
|
||||||
|
JOptionPane.showMessageDialog(null, "The changes will take effect the next time the program is started.");
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.log(Level.WARNING, "Enter to send mode could not be changed! ", e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
@ -57,6 +57,7 @@ public class SettingsScreen extends JDialog {
|
|||||||
public SettingsScreen() {
|
public SettingsScreen() {
|
||||||
// Initialize settings pages
|
// Initialize settings pages
|
||||||
Map<String, Class<? extends SettingsPanel>> panels = new HashMap<>();
|
Map<String, Class<? extends SettingsPanel>> panels = new HashMap<>();
|
||||||
|
panels.put("General", General.class);
|
||||||
panels.put("Color Themes", ThemeCustomizationPanel.class);
|
panels.put("Color Themes", ThemeCustomizationPanel.class);
|
||||||
|
|
||||||
setBounds(10, 10, 450, 650);
|
setBounds(10, 10, 450, 650);
|
||||||
@ -118,10 +119,10 @@ public class SettingsScreen extends JDialog {
|
|||||||
|
|
||||||
// ButtonPane
|
// ButtonPane
|
||||||
GridBagLayout gbl_buttonPane = new GridBagLayout();
|
GridBagLayout gbl_buttonPane = new GridBagLayout();
|
||||||
gbl_buttonPane.columnWidths = new int[] { 1, 1};
|
gbl_buttonPane.columnWidths = new int[] { 1, 1 };
|
||||||
gbl_buttonPane.rowHeights = new int[] { 25};
|
gbl_buttonPane.rowHeights = new int[] { 25 };
|
||||||
gbl_buttonPane.columnWeights = new double[] { 1.0, 1.0};
|
gbl_buttonPane.columnWeights = new double[] { 1.0, 1.0 };
|
||||||
gbl_buttonPane.rowWeights = new double[] { 0.0};
|
gbl_buttonPane.rowWeights = new double[] { 0.0 };
|
||||||
|
|
||||||
getContentPane().add(buttonPane, BorderLayout.SOUTH);
|
getContentPane().add(buttonPane, BorderLayout.SOUTH);
|
||||||
buttonPane.setLayout(gbl_buttonPane);
|
buttonPane.setLayout(gbl_buttonPane);
|
||||||
|
@ -13,6 +13,7 @@ import javax.swing.*;
|
|||||||
import envoy.client.Settings;
|
import envoy.client.Settings;
|
||||||
import envoy.client.event.EventBus;
|
import envoy.client.event.EventBus;
|
||||||
import envoy.client.event.ThemeChangeEvent;
|
import envoy.client.event.ThemeChangeEvent;
|
||||||
|
import envoy.client.ui.Color;
|
||||||
import envoy.client.ui.Theme;
|
import envoy.client.ui.Theme;
|
||||||
import envoy.client.util.EnvoyLog;
|
import envoy.client.util.EnvoyLog;
|
||||||
|
|
||||||
@ -30,8 +31,6 @@ import envoy.client.util.EnvoyLog;
|
|||||||
*/
|
*/
|
||||||
public class ThemeCustomizationPanel extends SettingsPanel {
|
public class ThemeCustomizationPanel extends SettingsPanel {
|
||||||
|
|
||||||
private static final long serialVersionUID = -8697897390666456624L;
|
|
||||||
|
|
||||||
private JPanel colorsPanel = new JPanel();
|
private JPanel colorsPanel = new JPanel();
|
||||||
|
|
||||||
private String[] themeArray = Settings.getInstance().getThemes().keySet().toArray(new String[0]);
|
private String[] themeArray = Settings.getInstance().getThemes().keySet().toArray(new String[0]);
|
||||||
@ -42,6 +41,7 @@ public class ThemeCustomizationPanel extends SettingsPanel {
|
|||||||
private final Insets insets = new Insets(5, 5, 5, 5);
|
private final Insets insets = new Insets(5, 5, 5, 5);
|
||||||
|
|
||||||
private static final Logger logger = EnvoyLog.getLogger(ThemeCustomizationPanel.class.getSimpleName());
|
private static final Logger logger = EnvoyLog.getLogger(ThemeCustomizationPanel.class.getSimpleName());
|
||||||
|
private static final long serialVersionUID = -8697897390666456624L;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes a {@link ThemeCustomizationPanel} that enables the user to change
|
* Initializes a {@link ThemeCustomizationPanel} that enables the user to change
|
||||||
@ -51,8 +51,7 @@ public class ThemeCustomizationPanel extends SettingsPanel {
|
|||||||
* @since Envoy v0.2-alpha
|
* @since Envoy v0.2-alpha
|
||||||
*/
|
*/
|
||||||
public ThemeCustomizationPanel() {
|
public ThemeCustomizationPanel() {
|
||||||
temporaryTheme = new Theme("temporaryTheme",
|
temporaryTheme = new Theme("temporaryTheme", Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()));
|
||||||
Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()));
|
|
||||||
|
|
||||||
GridBagLayout gbl_themeLayout = new GridBagLayout();
|
GridBagLayout gbl_themeLayout = new GridBagLayout();
|
||||||
|
|
||||||
@ -125,8 +124,7 @@ public class ThemeCustomizationPanel extends SettingsPanel {
|
|||||||
themeArray = Arrays.copyOf(themeArray, themeArray.length + 1);
|
themeArray = Arrays.copyOf(themeArray, themeArray.length + 1);
|
||||||
themeArray[themeArray.length - 1] = Settings.getInstance().getThemes().get(name).getThemeName();
|
themeArray[themeArray.length - 1] = Settings.getInstance().getThemes().get(name).getThemeName();
|
||||||
|
|
||||||
temporaryTheme = new Theme("temporaryTheme",
|
temporaryTheme = new Theme("temporaryTheme", Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()));
|
||||||
Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()));
|
|
||||||
|
|
||||||
themes.addItem(themeArray[themeArray.length - 1]);
|
themes.addItem(themeArray[themeArray.length - 1]);
|
||||||
themes.setSelectedIndex(themeArray.length - 1);
|
themes.setSelectedIndex(themeArray.length - 1);
|
||||||
@ -172,10 +170,8 @@ public class ThemeCustomizationPanel extends SettingsPanel {
|
|||||||
private void buildCustomizeElements(Theme theme) {
|
private void buildCustomizeElements(Theme theme) {
|
||||||
buildCustomizeElement(theme, theme.getBackgroundColor(), "Background", "backgroundColor", 1);
|
buildCustomizeElement(theme, theme.getBackgroundColor(), "Background", "backgroundColor", 1);
|
||||||
buildCustomizeElement(theme, theme.getCellColor(), "Cells", "cellColor", 2);
|
buildCustomizeElement(theme, theme.getCellColor(), "Cells", "cellColor", 2);
|
||||||
buildCustomizeElement(theme, theme.getInteractableForegroundColor(), "Interactable Foreground",
|
buildCustomizeElement(theme, theme.getInteractableForegroundColor(), "Interactable Foreground", "interactableForegroundColor", 3);
|
||||||
"interactableForegroundColor", 3);
|
buildCustomizeElement(theme, theme.getInteractableBackgroundColor(), "Interactable Background", "interactableBackgroundColor", 4);
|
||||||
buildCustomizeElement(theme, theme.getInteractableBackgroundColor(), "Interactable Background",
|
|
||||||
"interactableBackgroundColor", 4);
|
|
||||||
buildCustomizeElement(theme, theme.getMessageColorChat(), "Messages Chat", "messageColorChat", 5);
|
buildCustomizeElement(theme, theme.getMessageColorChat(), "Messages Chat", "messageColorChat", 5);
|
||||||
buildCustomizeElement(theme, theme.getDateColorChat(), "Date Chat", "dateColorCat", 6);
|
buildCustomizeElement(theme, theme.getDateColorChat(), "Date Chat", "dateColorCat", 6);
|
||||||
buildCustomizeElement(theme, theme.getSelectionColor(), "Selection", "selectionColor", 7);
|
buildCustomizeElement(theme, theme.getSelectionColor(), "Selection", "selectionColor", 7);
|
||||||
@ -189,7 +185,7 @@ public class ThemeCustomizationPanel extends SettingsPanel {
|
|||||||
|
|
||||||
textPane.setFont(new Font("Arial", Font.PLAIN, 14));
|
textPane.setFont(new Font("Arial", Font.PLAIN, 14));
|
||||||
textPane.setBackground(theme.getBackgroundColor());
|
textPane.setBackground(theme.getBackgroundColor());
|
||||||
textPane.setForeground(getInvertedColor(theme.getBackgroundColor()));
|
textPane.setForeground(theme.getBackgroundColor().invert());
|
||||||
textPane.setText(name);
|
textPane.setText(name);
|
||||||
textPane.setEditable(false);
|
textPane.setEditable(false);
|
||||||
|
|
||||||
@ -198,7 +194,7 @@ public class ThemeCustomizationPanel extends SettingsPanel {
|
|||||||
|
|
||||||
button.addActionListener((evt) -> {
|
button.addActionListener((evt) -> {
|
||||||
try {
|
try {
|
||||||
Color newColor = JColorChooser.showDialog(null, "Choose a color", color);
|
Color newColor = (Color) JColorChooser.showDialog(null, "Choose a color", color);
|
||||||
if (newColor.getRGB() != color.getRGB()) {
|
if (newColor.getRGB() != color.getRGB()) {
|
||||||
logger.log(Level.FINEST, "New Color: " + String.valueOf(color.getRGB()));
|
logger.log(Level.FINEST, "New Color: " + String.valueOf(color.getRGB()));
|
||||||
// TODO: When Theme changed in same settings screen, color variable doesn't
|
// TODO: When Theme changed in same settings screen, color variable doesn't
|
||||||
@ -232,8 +228,4 @@ public class ThemeCustomizationPanel extends SettingsPanel {
|
|||||||
|
|
||||||
colorsPanel.add(button, gbc_button);
|
colorsPanel.add(button, gbc_button);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Color getInvertedColor(Color color) {
|
|
||||||
return new Color(255 - color.getRed(), 255 - color.getGreen(), 255 - color.getBlue());
|
|
||||||
}
|
|
||||||
}
|
}
|
Reference in New Issue
Block a user