diff --git a/src/main/java/envoy/client/data/Settings.java b/src/main/java/envoy/client/data/Settings.java index 4e36369..3b1718c 100644 --- a/src/main/java/envoy/client/data/Settings.java +++ b/src/main/java/envoy/client/data/Settings.java @@ -6,8 +6,6 @@ import java.util.HashMap; import java.util.Map; import java.util.prefs.Preferences; -import envoy.client.ui.Color; -import envoy.client.ui.Theme; import envoy.util.SerializationUtils; /** @@ -28,18 +26,12 @@ public class Settings { // Actual settings accessible by the rest of the application private Map> items; - private Map themes; /** * Settings are stored in this file. */ private static final File settingsFile = new File(ClientConfig.getInstance().getHomeDirectory(), "settings.ser"); - /** - * User-defined themes are stored inside this file. - */ - private static final File themeFile = new File(ClientConfig.getInstance().getHomeDirectory(), "themes.ser"); - /** * Singleton instance of this class. */ @@ -59,22 +51,6 @@ public class Settings { items = new HashMap<>(); } supplementDefaults(); - - // Load themes from theme file - try { - themes = SerializationUtils.read(themeFile, HashMap.class); - } catch (ClassNotFoundException | IOException e1) { - themes = new HashMap<>(); - setCurrentTheme("dark"); - } - - // Load standard themes not defined in the themes file - themes.put("dark", - new Theme("dark", Color.black, Color.darkGray, Color.white, new Color(165, 60, 232), 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)); } /** @@ -95,9 +71,6 @@ public class Settings { // Save settings to settings file SerializationUtils.write(settingsFile, items); - - // Save themes to theme file - SerializationUtils.write(themeFile, themes); } private void supplementDefaults() { @@ -107,40 +80,19 @@ public class Settings { } /** - * Adds new theme to the theme map. - * - * @param theme the {@link Theme} to add - * @since Envoy Client v0.2-alpha - */ - public void addNewThemeToMap(Theme theme) { getThemes().put(theme.getThemeName(), theme); } - - /** - * @return the name of the currently active {@link Theme} + * @return the name of the currently active theme * @since Envoy Client v0.2-alpha */ public String getCurrentThemeName() { return (String) items.get("currentTheme").get(); } /** - * @return the currently active {@link Theme} - * @since Envoy Client v0.1-beta - */ - public Theme getCurrentTheme() { return getTheme(getCurrentThemeName()); } - - /** - * Sets the name of the current {@link Theme}. + * Sets the name of the current theme. * * @param themeName the name to set * @since Envoy Client v0.2-alpha */ public void setCurrentTheme(String themeName) { ((SettingsItem) items.get("currentTheme")).set(themeName); } - /** - * @return whether the current {@link Theme} is one of the default themes. - * Currently checks for dark and light theme. - * @since Envoy Client v0.1-beta - */ - public boolean isUsingDefaultTheme() { return getCurrentThemeName().equals("dark") || getCurrentThemeName().equals("light"); } - /** * @return {@code true}, if pressing the {@code Enter} key suffices to send a * message. Otherwise it has to be pressed in conjunction with the @@ -182,25 +134,4 @@ public class Settings { * @param items the items to set */ public void setItems(Map> items) { this.items = items; } - - /** - * @return a {@code Map} of all themes with their names as keys - * @since Envoy Client v0.2-alpha - */ - public Map getThemes() { return themes; } - - /** - * Sets the {@code Map} of all themes with their names as keys - * - * @param themes the theme map to set - * @since Envoy Client v0.2-alpha - */ - public void setThemes(Map themes) { this.themes = themes; } - - /** - * @param themeName the name of the {@link Theme} to get - * @return the {@link Theme} with the specified name - * @since Envoy Client v0.3-alpha - */ - public Theme getTheme(String themeName) { return themes.get(themeName); } } diff --git a/src/main/java/envoy/client/data/SettingsItem.java b/src/main/java/envoy/client/data/SettingsItem.java index 98a562d..8638c05 100644 --- a/src/main/java/envoy/client/data/SettingsItem.java +++ b/src/main/java/envoy/client/data/SettingsItem.java @@ -22,7 +22,7 @@ public class SettingsItem implements Serializable { private T value; private String userFriendlyName, description; - private transient Consumer changeHandler; + private transient Consumer changeHandler; private static final long serialVersionUID = 1L; diff --git a/src/main/java/envoy/client/event/ThemeChangeEvent.java b/src/main/java/envoy/client/event/ThemeChangeEvent.java index 0967fc0..572476b 100644 --- a/src/main/java/envoy/client/event/ThemeChangeEvent.java +++ b/src/main/java/envoy/client/event/ThemeChangeEvent.java @@ -1,6 +1,5 @@ package envoy.client.event; -import envoy.client.ui.Theme; import envoy.event.Event; /** @@ -11,16 +10,16 @@ import envoy.event.Event; * @author Kai S. K. Engelbart * @since Envoy Client v0.2-alpha */ -public class ThemeChangeEvent extends Event { +public class ThemeChangeEvent extends Event { private static final long serialVersionUID = 0L; /** * Initializes a {@link ThemeChangeEvent} conveying information about the change - * of the {@link Theme} currently in use + * of the theme currently in use. * - * @param theme the new currently used {@link Theme} object + * @param theme the name of the new theme * @since Envoy Client v0.2-alpha */ - public ThemeChangeEvent(Theme theme) { super(theme); } + public ThemeChangeEvent(String theme) { super(theme); } } diff --git a/src/main/java/envoy/client/ui/Color.java b/src/main/java/envoy/client/ui/Color.java deleted file mode 100644 index da58bbb..0000000 --- a/src/main/java/envoy/client/ui/Color.java +++ /dev/null @@ -1,114 +0,0 @@ -package envoy.client.ui; - -import java.awt.color.ColorSpace; - -/** - * This class further develops {@link java.awt.Color} by adding extra methods - * and more default colors. - * - * Project: envoy-client
- * File: Color.java
- * Created: 23.12.2019
- * - * @author Kai S. K. Engelbart - * @since Envoy Client v0.3-alpha - */ -@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 = 0L; - - public Color(java.awt.Color other) { this(other.getRGB()); } - - 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 - * @since Envoy Client v0.3-alpha - */ - public Color invert() { return new Color(255 - getRed(), 255 - getGreen(), 255 - getBlue()); } - - /** - * @return the hex value of this {@link Color} - * @since Envoy Client v0.3-alpha - */ - public String toHex() { return String.format("#%02x%02x%02x", getRed(), getGreen(), getBlue()); } -} diff --git a/src/main/java/envoy/client/ui/ContextMenu.java b/src/main/java/envoy/client/ui/ContextMenu.java deleted file mode 100644 index 64e3abb..0000000 --- a/src/main/java/envoy/client/ui/ContextMenu.java +++ /dev/null @@ -1,198 +0,0 @@ -package envoy.client.ui; - -import java.awt.Component; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.HashMap; -import java.util.Map; - -import javax.swing.*; - -/** - * This class defines a menu that will be automatically called if - * {@link MouseEvent#isPopupTrigger()} returns true for the parent component. - * The user has the possibility to directly add actions to be performed when - * clicking on the element with the selected String. Additionally, for each - * element an {@link Icon} can be added, but it must not be. - * If the key(text) of an element starts with one of the predefined values, a - * special component will be called: either a {@link JRadioButtonMenuItem}, a - * {@link JCheckBoxMenuItem} or a {@link JMenu} will be created.
- *
- * Project: envoy-client
- * File: ContextMenu.java
- * Created: 17 Mar 2020
- * - * @author Leon Hofmeister - * @since Envoy Client v0.1-beta - */ -public class ContextMenu extends JPopupMenu { - - private static final long serialVersionUID = 0L; - - /** - * If a key starts with this String, a {@link JCheckBoxMenuItem} will be created - */ - public static final String checkboxMenuItem = "ChBoMI"; - /** - * If a key starts with this String, a {@link JRadioButtonMenuItem} will be - * created - */ - public static final String radioButtonMenuItem = "RaBuMI"; - /** - * If a key starts with this String, a {@link JMenu} will be created - */ - public static final String subMenuItem = "SubMI"; - - private Map items = new HashMap<>(); - private Map icons = new HashMap<>(); - private Map mnemonics = new HashMap<>(); - - private ButtonGroup radioButtonGroup = new ButtonGroup(); - private boolean built = false; - - /** - * @param parent the component which will call this - * {@link ContextMenu} - * @since Envoy Client v0.1-beta - */ - public ContextMenu(Component parent) { setInvoker(parent); } - - /** - * @param label the string that a UI may use to display as a title - * for the pop-up menu - * @param parent the component which will call this - * {@link ContextMenu} - * @param itemsWithActions a map of all strings to be displayed with according - * actions - * @param itemIcons the icons to be displayed before a name, if wanted. - * Only keys in here will have an Icon displayed. More - * precisely, all keys here not included in the first - * map will be thrown out. - * @param itemMnemonics the keyboard shortcuts that need to be pressed to - * automatically execute the {@link JMenuItem} with the - * given text - * @since Envoy Client v0.1-beta - */ - public ContextMenu(String label, Component parent, Map itemsWithActions, Map itemIcons, - Map itemMnemonics) { - super(label); - setInvoker(parent); - this.items = (itemsWithActions != null) ? itemsWithActions : items; - this.icons = (itemIcons != null) ? itemIcons : icons; - this.mnemonics = (itemMnemonics != null) ? itemMnemonics : mnemonics; - } - - /** - * Prepares the PopupMenu to be displayed. Should only be used once all map - * values have been set. - * - * @return this instance of {@link ContextMenu} to allow chaining behind the - * constructor - * @since Envoy Client v0.1-beta - */ - public ContextMenu build() { - items.forEach((text, action) -> { - // case radio button wanted - AbstractButton item; - if (text.startsWith(radioButtonMenuItem)) { - item = new JRadioButtonMenuItem(text.substring(radioButtonMenuItem.length()), icons.containsKey(text) ? icons.get(text) : null); - radioButtonGroup.add(item); - // case check box wanted - } else if (text.startsWith(checkboxMenuItem)) - item = new JCheckBoxMenuItem(text.substring(checkboxMenuItem.length()), icons.containsKey(text) ? icons.get(text) : null); - // case sub-menu wanted - else if (text.startsWith(subMenuItem)) item = new JMenu(text.substring(subMenuItem.length())); - else // normal JMenuItem wanted - item = new JMenuItem(text, icons.containsKey(text) ? icons.get(text) : null); - item.addActionListener(action); - if (mnemonics.containsKey(text)) item.setMnemonic(mnemonics.get(text)); - add(item); - }); - if (getInvoker() != null) { - getInvoker().addMouseListener(getShowingListener()); - built = true; - } - return this; - } - - /** - * @param label the string that a UI may use to display as a title for the - * pop-up menu. - * @since Envoy Client v0.1-beta - */ - public ContextMenu(String label) { super(label); } - - private MouseAdapter getShowingListener() { - return new MouseAdapter() { - - @Override - public void mouseClicked(MouseEvent e) { action(e); } - - @Override - public void mousePressed(MouseEvent e) { action(e); } - - @Override - public void mouseReleased(MouseEvent e) { action(e); } - - private void action(MouseEvent e) { - if (!built) build(); - if (e.isPopupTrigger()) // hides the menu if already visible - if (!isVisible()) show(e.getComponent(), e.getX(), e.getY()); - else setVisible(false); - } - }; - } - - /** - * Removes all subcomponents of this menu. - * - * @since Envoy Client v0.1-beta - */ - public void clear() { - removeAll(); - items = new HashMap<>(); - icons = new HashMap<>(); - mnemonics = new HashMap<>(); - } - - /** - * @return the items - * @since Envoy Client v0.1-beta - */ - public Map getItems() { return items; } - - /** - * @param items the items with the displayed text and the according action to - * take once called - * @since Envoy Client v0.1-beta - */ - public void setItems(Map items) { this.items = items; } - - /** - * @return the icons - * @since Envoy Client v0.1-beta - */ - public Map getIcons() { return icons; } - - /** - * @param icons the icons to set - * @since Envoy Client v0.1-beta - */ - public void setIcons(Map icons) { this.icons = icons; } - - /** - * @return the mnemonics (the keyboard shortcuts that automatically execute the - * command for a {@link JMenuItem} with corresponding text) - * @since Envoy Client v0.1-beta - */ - public Map getMnemonics() { return mnemonics; } - - /** - * @param mnemonics the keyboard shortcuts that need to be pressed to - * automatically execute the {@link JMenuItem} with the given - * text - * @since Envoy Client v0.1-beta - */ - public void setMnemonics(Map mnemonics) { this.mnemonics = mnemonics; } -} diff --git a/src/main/java/envoy/client/ui/SceneContext.java b/src/main/java/envoy/client/ui/SceneContext.java index d261000..3149b4d 100644 --- a/src/main/java/envoy/client/ui/SceneContext.java +++ b/src/main/java/envoy/client/ui/SceneContext.java @@ -15,8 +15,11 @@ import envoy.event.EventBus; /** * Manages a stack of scenes. The most recently added scene is displayed inside * a stage. When a scene is removed from the stack, its predecessor is - * displayed.
- *
+ * displayed. + *

+ * When a scene is loaded, the style sheet for the current theme is applied to + * it. + *

* Project: envoy-client
* File: SceneContext.java
* Created: 06.06.2020
@@ -89,7 +92,7 @@ public final class SceneContext { private void applyCSS() { if (!sceneStack.isEmpty()) { final var styleSheets = stage.getScene().getStylesheets(); - final var themeCSS = "/css/" + (settings.isUsingDefaultTheme() ? settings.getCurrentThemeName() : "custom") + ".css"; + final var themeCSS = "/css/" + settings.getCurrentThemeName() + ".css"; styleSheets.clear(); styleSheets.addAll(getClass().getResource("/css/base.css").toExternalForm(), getClass().getResource(themeCSS).toExternalForm()); } diff --git a/src/main/java/envoy/client/ui/Theme.java b/src/main/java/envoy/client/ui/Theme.java deleted file mode 100755 index 7c4bb79..0000000 --- a/src/main/java/envoy/client/ui/Theme.java +++ /dev/null @@ -1,146 +0,0 @@ -package envoy.client.ui; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -/** - * Project: envoy-client
- * File: Theme.java
- * Created: 23 Nov 2019
- * - * @author Maximilian Käfer - * @since Envoy Client v0.2-alpha - */ -public class Theme implements Serializable { - - private static final long serialVersionUID = 0L; - - private String themeName; - private Map colors = new HashMap<>(); - - /** - * Initializes a {@link Theme} with all colors relevant to the application GUI. - * - * @param themeName the name of the {@link Theme} - * @param backgroundColor the background color - * @param cellColor the cell color - * @param interactableForegroundColor the color of interactable foreground UI - * elements - * @param interactableBackgroundColor the color of interactable background UI - * elements - * @param textColor the color normal text should be displayed - * in - * @param dateColorChat the color of chat message metadata - * @param selectionColor the section color - * @param typingMessageColor the color of currently typed messages - * @param userNameColor the color of user names - * @since Envoy Client v0.2-alpha - */ - public Theme(String themeName, Color backgroundColor, Color cellColor, Color interactableForegroundColor, Color interactableBackgroundColor, - Color textColor, Color dateColorChat, Color selectionColor, Color typingMessageColor, Color userNameColor) { - - this.themeName = themeName; - - colors.put("backgroundColor", backgroundColor); - colors.put("cellColor", cellColor); - colors.put("interactableForegroundColor", interactableForegroundColor); - colors.put("interactableBackgroundColor", interactableBackgroundColor); - colors.put("textColor", textColor); - colors.put("dateColorChat", dateColorChat); - colors.put("selectionColor", selectionColor); - colors.put("typingMessageColor", typingMessageColor); - colors.put("userNameColor", userNameColor); - } - - /** - * Initializes a {@link Theme} by copying all parameters except for the name - * from another {@link Theme} instance. - * - * @param name the name of the {@link Theme} - * @param other the {@link Theme} to copy - * @since Envoy Client v0.2-alpha - */ - public Theme(String name, Theme other) { - themeName = name; - colors.putAll(other.colors); - } - - /** - * @return a {@code Map} of all colors defined for this theme - * with their names as keys - * @since Envoy Client v0.2-alpha - */ - public Map getColors() { return colors; } - - /** - * @return name of the theme - * @since Envoy Client v0.2-alpha - */ - public String getThemeName() { return themeName; } - - /** - * @return interactableForegroundColor - * @since Envoy Client v0.2-alpha - */ - public Color getInteractableForegroundColor() { return colors.get("interactableForegroundColor"); } - - /** - * @return the {@link Color} in which the text content of a message should be - * displayed - * @since Envoy Client v0.2-alpha - */ - public Color getTextColor() { return colors.get("textColor"); } - - /** - * @return the {@link Color} in which the creation date of a message should be - * displayed - * @since Envoy Client v0.2-alpha - */ - public Color getDateColor() { return colors.get("dateColorChat"); } - - /** - * @return selectionColor - * @since Envoy Client v0.2-alpha - */ - public Color getSelectionColor() { return colors.get("selectionColor"); } - - /** - * @return typingMessageColor - * @since Envoy Client v0.2-alpha - */ - public Color getTypingMessageColor() { return colors.get("typingMessageColor"); } - - /** - * @return backgroundColor - * @since Envoy Client v0.2-alpha - */ - public Color getBackgroundColor() { return colors.get("backgroundColor"); } - - /** - * @return cellColor - * @since Envoy Client v0.2-alpha - */ - public Color getCellColor() { return colors.get("cellColor"); } - - /** - * @return interactableBackgroundColor - * @since Envoy Client v0.2-alpha - */ - public Color getInteractableBackgroundColor() { return colors.get("interactableBackgroundColor"); } - - /** - * @return userNameColor - * @since Envoy Client v0.2-alpha - */ - public Color getUserNameColor() { return colors.get("userNameColor"); } - - /** - * Sets the a specific {@link Color} in this theme to a new {@link Color} - * - * @param colorName the name of the {@link Color} to set - * @param newColor the new {@link Color} to be set - * @since Envoy 0.2-alpha - */ - public void setColor(String colorName, Color newColor) { colors.put(colorName, newColor); } -} diff --git a/src/main/resources/css/custom.css b/src/main/resources/css/custom.css deleted file mode 100644 index e69de29..0000000