diff --git a/.gitignore b/.gitignore
index e12b13a..2b99822 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
/target/
-/localDB/
\ No newline at end of file
+/localDB/
+/themes.ser
diff --git a/src/main/java/envoy/client/Settings.java b/src/main/java/envoy/client/Settings.java
index fa6088f..21a1afa 100644
--- a/src/main/java/envoy/client/Settings.java
+++ b/src/main/java/envoy/client/Settings.java
@@ -1,12 +1,17 @@
package envoy.client;
import java.awt.Color;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.prefs.Preferences;
import envoy.client.ui.Theme;
-import envoy.schema.User;
/**
* Project: envoy-client
@@ -15,19 +20,32 @@ import envoy.schema.User;
*
* @author Leon Hofmeister
* @author Maximilian Käfer
+ * @author Kai S. K. Engelbart
* @since Envoy v0.2-alpha
*/
public class Settings {
+ // Actual settings accessible by the rest of the application
private String username;
private String email;
private boolean enterToSend = true;
- private Map themes = new HashMap<>();
+ private Map themes;
+ private String currentTheme;
- private String currentTheme;
- // private Image profilePic;
- private static Settings settings;
- private Preferences prefs = Preferences.userNodeForPackage(Settings.class);
+ /**
+ * Required to save the settings.
+ */
+ private Preferences prefs = Preferences.userNodeForPackage(Settings.class);
+
+ /**
+ * User-defined themes are stored inside this file.
+ */
+ private File themeFile = new File("themes.ser");
+
+ /**
+ * Singleton instance of this class.
+ */
+ private static Settings settings = new Settings();
/**
* The way to instantiate the settings.
@@ -35,7 +53,7 @@ public class Settings {
*
* @since Envoy v0.2-alpha
*/
- private Settings() {}
+ private Settings() { load(); }
/**
* This method is used to ensure that there is only one instance of Settings.
@@ -43,54 +61,44 @@ public class Settings {
* @return the instance of Settings
* @since Envoy v0.2-alpha
*/
- public static Settings getInstance() {
- if (settings == null) {
- settings = new Settings();
- settings.load();
+ public static Settings getInstance() { return settings; }
+
+ @SuppressWarnings("unchecked")
+ private void load() {
+ setUsername(prefs.get("username", ""));
+ setEmail(prefs.get("email", ""));
+ setEnterToSend(prefs.getBoolean("enterToSend", true));
+ setCurrentTheme(prefs.get("theme", "dark"));
+
+ // Load themes from theme file
+ try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(themeFile))) {
+ Object obj = in.readObject();
+ if(obj instanceof HashMap) themes = (Map) obj;
+ } catch (IOException | ClassNotFoundException e) {
+ themes = new HashMap<>();
+ e.printStackTrace();
}
- return settings;
+
+ // Load standard themes not defined in the themes file
+ themes.put("dark",
+ new Theme("dark", Color.black, Color.darkGray, Color.white, Color.blue, Color.white, Color.orange, Color.blue, Color.white,
+ Color.white));
+ themes.put("light",
+ new Theme("light", new Color(235, 235, 235), Color.white, Color.white, Color.darkGray, Color.black, Color.orange, Color.darkGray,
+ Color.black, Color.black));
}
- public void load() {
- settings.setUsername(prefs.get("username", ""));
- settings.setEmail(prefs.get("email", ""));
- settings.setEnterToSend(prefs.getBoolean("enterToSend", true));
- // currentTheme = "dark"; Activate once if NullPointerException on currentTheme
- // and change theme to dark or white in Settings
- settings.setCurrentTheme(prefs.get("theme", "dark"));
- }
-
- public void save() {
- prefs.put("username", settings.getUsername());
- prefs.put("email", settings.getEmail());
+ public void save() throws IOException{
+ prefs.put("username", getUsername());
+ prefs.put("email", getEmail());
prefs.put("theme", currentTheme);
- System.out.println(currentTheme);
- prefs.putBoolean("enterToSend", settings.isEnterToSend());
- // TODO: override themes map
-
- }
-
- public void firstSave(User user) {
-
- // TODO: load themes
-
- settings.getThemes()
- .put("dark",
- new Theme("dark", Color.black, Color.darkGray, Color.white, Color.blue, Color.white, Color.orange,
- Color.blue, Color.white, Color.white));
- settings.getThemes()
- .put("light",
- new Theme("light", new Color(235, 235, 235), Color.white, Color.white, Color.darkGray, Color.black,
- Color.orange, Color.darkGray, Color.black, Color.black));
-
-
-
-
-
- prefs.put("username", user.getName());
- // prefs.put("email", user.getEmail());
- // prefs.putBoolean("darkMode", true);
- // prefs.putBoolean("enterToSend", true);
+ prefs.putBoolean("enterToSend", isEnterToSend());
+
+ // Save themes to theme file
+ themeFile.createNewFile();
+ try(ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(themeFile))) {
+ out.writeObject(themes);
+ }
}
public void addNewThemeToMap(Theme theme) {
@@ -103,13 +111,13 @@ public class Settings {
public void setCurrentTheme(String themeName) { currentTheme = themeName; }
/**
- * @return the username
+ * @return the user name
* @since Envoy v0.2-alpha
*/
public String getUsername() { return username; }
/**
- * @param username the username to set
+ * @param username the user name to set
* @since Envoy v0.2-alpha
*/
public void setUsername(String username) { this.username = username; }
@@ -145,18 +153,4 @@ public class Settings {
public Map getThemes() { return themes; }
public void setThemes(Map themes) { this.themes = themes; }
-
- // /**
- // * @return the profilePic
- // * @since Envoy v0.2-alpha
- // */
- // public Image getProfilePic() { return profilePic; }
- //
- // /**
- // * @param profilePic the profilePic to set
- // * @since Envoy v0.1-alpha
- // */
- // public void setProfilePic(Image profilePic) { this.profilePic = profilePic; }
-
-
-}
+}
\ No newline at end of file
diff --git a/src/main/java/envoy/client/ui/ChatWindow.java b/src/main/java/envoy/client/ui/ChatWindow.java
index e0ea09b..d074711 100644
--- a/src/main/java/envoy/client/ui/ChatWindow.java
+++ b/src/main/java/envoy/client/ui/ChatWindow.java
@@ -81,6 +81,7 @@ public class ChatWindow extends JFrame {
public void windowClosing(WindowEvent e) {
try {
localDB.saveToLocalDB();
+ Settings.getInstance().save();
} catch (IOException e1) {
e1.printStackTrace();
System.err.println("Could not save localDB");
diff --git a/src/main/java/envoy/client/ui/SettingsScreen.java b/src/main/java/envoy/client/ui/SettingsScreen.java
index 80d4927..a003972 100644
--- a/src/main/java/envoy/client/ui/SettingsScreen.java
+++ b/src/main/java/envoy/client/ui/SettingsScreen.java
@@ -36,6 +36,7 @@ import envoy.client.Settings;
*
* @author Leon Hofmeister
* @author Maximilian Käfer
+ * @author Kai S. K. Engelbart
*/
public class SettingsScreen extends JDialog {
@@ -62,10 +63,10 @@ public class SettingsScreen extends JDialog {
private JButton cancelButton = new JButton("Cancel");
private static int space = 5;
- private boolean colorChanged = false;
+ private boolean colorChanged = false;
+ private Theme temporaryTheme;
- private Theme temporaryTheme;
- private static SettingsScreen settingsScreen;
+ private static SettingsScreen settingsScreen;
// TODO: Add a JPanel with all the Information necessary:
// change (Picture,Username, Email, Password) and toggle(light/dark mode,
@@ -78,8 +79,6 @@ public class SettingsScreen extends JDialog {
* @since Envoy v0.1-alpha
*/
public static void open() {
-
- // UIColors.getInstance(Settings.getInstance().isDarkMode());
settingsScreen = new SettingsScreen();
settingsScreen.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
settingsScreen.setModal(true);
@@ -87,7 +86,7 @@ public class SettingsScreen extends JDialog {
}
/**
- * Builds the settings screen.
+ * Builds the settings screen.
*
* @since Envoy v0.1-alpha
*/
@@ -101,9 +100,9 @@ public class SettingsScreen extends JDialog {
createNewThemeButton.setEnabled(false);
- temporaryTheme = new Theme("temporaryTheme",
- Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()));
- // ContentPane------------------------------------------------------
+ temporaryTheme = new Theme("temporaryTheme", Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()));
+
+ // Content pane
GridBagLayout gbl_contentPanel = new GridBagLayout();
gbl_contentPanel.columnWidths = new int[] { 1, 1 };
@@ -155,7 +154,7 @@ public class SettingsScreen extends JDialog {
contentPanel.add(options, gbc_optionsList);
- // ThemeContent ---
+ // Theme content
gbc_themeContent = new GridBagConstraints();
gbc_themeContent.fill = GridBagConstraints.BOTH;
@@ -166,8 +165,6 @@ public class SettingsScreen extends JDialog {
GridBagLayout gbl_themeLayout = new GridBagLayout();
- // themeContent.setSelectionForeground(theme.getUserNameColor());
- // themeContent.setSelectionBackground(theme.getSelectionColor());
themeContent.setForeground(theme.getUserNameColor());
themeContent.setBackground(theme.getCellColor());
@@ -181,7 +178,6 @@ public class SettingsScreen extends JDialog {
themes.setBackground(theme.getUserNameColor());
themes.setForeground(theme.getBackgroundColor());
themes.setSelectedItem(Settings.getInstance().getCurrentTheme());
- // themes.setBorder(null);
themes.addItemListener(new ItemListener() {
@@ -191,7 +187,6 @@ public class SettingsScreen extends JDialog {
System.out.println(selectedValue);
selectedTheme = Settings.getInstance().getThemes().get(selectedValue);
}
-
});
GridBagConstraints gbc_themes = new GridBagConstraints();
@@ -206,24 +201,9 @@ public class SettingsScreen extends JDialog {
colorsPanel.setLayout((LayoutManager) new BoxLayout(colorsPanel, BoxLayout.Y_AXIS));
colorsPanel.setAlignmentX(Component.LEFT_ALIGNMENT);
+ buildCustomizeElement(new JPanel(), new JButton(), new JTextPane(), theme, theme.getBackgroundColor(), "Background", 1);
+ buildCustomizeElement(new JPanel(), new JButton(), new JTextPane(), theme, theme.getCellColor(), "Cells", 2);
buildCustomizeElement(new JPanel(),
-
- new JButton(),
- new JTextPane(),
- theme,
- theme.getBackgroundColor(),
- "Background",
- 1);
- buildCustomizeElement(new JPanel(),
-
- new JButton(),
- new JTextPane(),
- theme,
- theme.getCellColor(),
- "Cells",
- 2);
- buildCustomizeElement(new JPanel(),
-
new JButton(),
new JTextPane(),
theme,
@@ -231,53 +211,17 @@ public class SettingsScreen extends JDialog {
"Interactable Foreground",
3);
buildCustomizeElement(new JPanel(),
-
new JButton(),
new JTextPane(),
theme,
theme.getInteractableBackgroundColor(),
"Interactable Background",
4);
- buildCustomizeElement(new JPanel(),
-
- new JButton(),
- new JTextPane(),
- theme,
- theme.getMessageColorChat(),
- "Messages Chat",
- 5);
- buildCustomizeElement(new JPanel(),
-
- new JButton(),
- new JTextPane(),
- theme,
- theme.getDateColorChat(),
- "Date Chat",
- 6);
- buildCustomizeElement(new JPanel(),
-
- new JButton(),
- new JTextPane(),
- theme,
- theme.getSelectionColor(),
- "Selection",
- 7);
- buildCustomizeElement(new JPanel(),
-
- new JButton(),
- new JTextPane(),
- theme,
- theme.getTypingMessageColor(),
- "Typing Message",
- 8);
- buildCustomizeElement(new JPanel(),
-
- new JButton(),
- new JTextPane(),
- theme,
- theme.getUserNameColor(),
- "User Names",
- 9);
+ buildCustomizeElement(new JPanel(), new JButton(), new JTextPane(), theme, theme.getMessageColorChat(), "Messages Chat", 5);
+ buildCustomizeElement(new JPanel(), new JButton(), new JTextPane(), theme, theme.getDateColorChat(), "Date Chat", 6);
+ buildCustomizeElement(new JPanel(), new JButton(), new JTextPane(), theme, theme.getSelectionColor(), "Selection", 7);
+ buildCustomizeElement(new JPanel(), new JButton(), new JTextPane(), theme, theme.getTypingMessageColor(), "Typing Message", 8);
+ buildCustomizeElement(new JPanel(), new JButton(), new JTextPane(), theme, theme.getUserNameColor(), "User Names", 9);
GridBagConstraints gbc_colorsPanel = new GridBagConstraints();
gbc_colorsPanel.fill = GridBagConstraints.HORIZONTAL;
@@ -298,16 +242,14 @@ public class SettingsScreen extends JDialog {
String s = JOptionPane.showInputDialog("Enter a name for the new theme");
System.out.println(s);
Settings.getInstance()
- .addNewThemeToMap(new Theme(s, temporaryTheme.getBackgroundColor(),
- temporaryTheme.getCellColor(), temporaryTheme.getInteractableForegroundColor(),
- temporaryTheme.getInteractableBackgroundColor(), temporaryTheme.getMessageColorChat(),
- temporaryTheme.getDateColorChat(), temporaryTheme.getSelectionColor(),
+ .addNewThemeToMap(new Theme(s, temporaryTheme.getBackgroundColor(), temporaryTheme.getCellColor(),
+ temporaryTheme.getInteractableForegroundColor(), temporaryTheme.getInteractableBackgroundColor(),
+ temporaryTheme.getMessageColorChat(), temporaryTheme.getDateColorChat(), temporaryTheme.getSelectionColor(),
temporaryTheme.getTypingMessageColor(), temporaryTheme.getUserNameColor()));
themeArray = Arrays.copyOf(themeArray, themeArray.length + 1);
themeArray[themeArray.length - 1] = Settings.getInstance().getThemes().get(s).getThemeName();
- temporaryTheme = new Theme("temporaryTheme",
- Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()));
+ temporaryTheme = new Theme("temporaryTheme", Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()));
createNewThemeButton.setEnabled(false);
themes.addItem(themeArray[themeArray.length - 1]);
@@ -421,27 +363,18 @@ public class SettingsScreen extends JDialog {
}
- public void updateColorVariables(String key) {
+ private void updateColorVariables(String key) {
Theme theme = Settings.getInstance().getThemes().get(key);
temporaryTheme = new Theme("temporaryTheme",
Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getBackgroundColor(),
Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getCellColor(),
- Settings.getInstance()
- .getThemes()
- .get(Settings.getInstance().getCurrentTheme())
- .getInteractableForegroundColor(),
- Settings.getInstance()
- .getThemes()
- .get(Settings.getInstance().getCurrentTheme())
- .getInteractableBackgroundColor(),
+ Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getInteractableForegroundColor(),
+ Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getInteractableBackgroundColor(),
Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getMessageColorChat(),
Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getDateColorChat(),
Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getSelectionColor(),
- Settings.getInstance()
- .getThemes()
- .get(Settings.getInstance().getCurrentTheme())
- .getTypingMessageColor(),
+ Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getTypingMessageColor(),
Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getUserNameColor());
colorsPanel.removeAll();
@@ -526,10 +459,9 @@ public class SettingsScreen extends JDialog {
colorsPanel.add(createNewThemeButton, gbc_createNewTheme);
}
- public void setContent(JPanel content, GridBagConstraints layout) { contentPanel.add(content, layout); }
+ private void setContent(JPanel content, GridBagConstraints layout) { contentPanel.add(content, layout); }
- public void buildCustomizeElement(JPanel panel, JButton button, JTextPane textPane, Theme theme, Color color,
- String name, int yIndex) {
+ private void buildCustomizeElement(JPanel panel, JButton button, JTextPane textPane, Theme theme, Color color, String name, int yIndex) {
textPane.setFont(new Font("Arial", Font.PLAIN, 14));
textPane.setBackground(theme.getBackgroundColor());
textPane.setForeground(theme.getUserNameColor());
diff --git a/src/main/java/envoy/client/ui/Startup.java b/src/main/java/envoy/client/ui/Startup.java
index 2781a8a..f940191 100644
--- a/src/main/java/envoy/client/ui/Startup.java
+++ b/src/main/java/envoy/client/ui/Startup.java
@@ -21,6 +21,7 @@ import envoy.exception.EnvoyException;
*
* @author Leon Hofmeister
* @author Maximilian Käfer
+ * @author Kai S. K. Engelbart
* @since Envoy v0.1-alpha
*/
public class Startup {
@@ -61,7 +62,7 @@ public class Startup {
"Local DB error",
JOptionPane.WARNING_MESSAGE);
}
- Settings.getInstance().firstSave(client.getSender());
+ Settings.getInstance().setUsername(userName);
EventQueue.invokeLater(() -> {
try {