From 78be2e01a7f4f224cd7075c4ac2a3837f217155e Mon Sep 17 00:00:00 2001 From: CyB3RC0nN0R Date: Sat, 7 Dec 2019 11:48:41 +0100 Subject: [PATCH] Implemented theme serialization to a file --- .gitignore | 3 +- src/main/java/envoy/client/Settings.java | 130 +++++++++--------- src/main/java/envoy/client/ui/ChatWindow.java | 1 + .../java/envoy/client/ui/SettingsScreen.java | 120 ++++------------ src/main/java/envoy/client/ui/Startup.java | 3 +- 5 files changed, 93 insertions(+), 164 deletions(-) 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 {