Added ThemeChangeEvent, improved EventHandler declaration
This commit is contained in:
parent
f6bd6ab754
commit
396686bfdc
@ -1,8 +1,8 @@
|
|||||||
package envoy.client.event;
|
package envoy.client.event;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Project: <strong>envoy-clientChess</strong><br>
|
* Project: <strong>envoy-client</strong><br>
|
||||||
* File: <strong>Event.javaEvent.java</strong><br>
|
* File: <strong>Event.java</strong><br>
|
||||||
* Created: <strong>04.12.2019</strong><br>
|
* Created: <strong>04.12.2019</strong><br>
|
||||||
*
|
*
|
||||||
* @author Kai S. K. Engelbart
|
* @author Kai S. K. Engelbart
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
package envoy.client.event;
|
package envoy.client.event;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class handles events by allowing {@link EventHandler} object to register
|
* This class handles events by allowing {@link EventHandler} object to register
|
||||||
@ -10,7 +11,8 @@ import java.util.List;
|
|||||||
* bus.<br>
|
* bus.<br>
|
||||||
* <br>
|
* <br>
|
||||||
* The event bus is a singleton and can be used across the entire application to
|
* The event bus is a singleton and can be used across the entire application to
|
||||||
* guarantee the propagation of events.
|
* guarantee the propagation of events.<br>
|
||||||
|
*
|
||||||
* Project: <strong>envoy-client</strong><br>
|
* Project: <strong>envoy-client</strong><br>
|
||||||
* File: <strong>EventBus.java</strong><br>
|
* File: <strong>EventBus.java</strong><br>
|
||||||
* Created: <strong>04.12.2019</strong><br>
|
* Created: <strong>04.12.2019</strong><br>
|
||||||
@ -22,9 +24,10 @@ public class EventBus {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Contains all {@link EventHandler} instances registered at this
|
* Contains all {@link EventHandler} instances registered at this
|
||||||
* {@link EventBus}.
|
* {@link EventBus} as values mapped to by their supported {@link Event}
|
||||||
|
* classes.
|
||||||
*/
|
*/
|
||||||
private List<EventHandler> handlers = new ArrayList<>();
|
private Map<Class<? extends Event<?>>, List<EventHandler>> handlers = new HashMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The singleton instance of this {@link EventBus} that is used across the
|
* The singleton instance of this {@link EventBus} that is used across the
|
||||||
@ -46,13 +49,17 @@ public class EventBus {
|
|||||||
public static EventBus getInstance() { return eventBus; }
|
public static EventBus getInstance() { return eventBus; }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Registers a list of {@link EventHandler} objects to be notified when a
|
* Registers an {@link EventHandler} to be notified when a
|
||||||
* {@link Event} is dispatched that they are subscribed to.
|
* {@link Event} of a certain type is dispatched.
|
||||||
*
|
*
|
||||||
* @param handlers the {@link EventHandler} objects to register
|
* @param eventClass the class which the {@link EventHandler} is subscribed to
|
||||||
|
* @param handler the {@link EventHandler} to register
|
||||||
* @since Envoy v0.2-alpha
|
* @since Envoy v0.2-alpha
|
||||||
*/
|
*/
|
||||||
public void register(EventHandler... handlers) { this.handlers.addAll(Arrays.asList(handlers)); }
|
public void register(Class<? extends Event<?>> eventClass, EventHandler handler) {
|
||||||
|
if (!handlers.containsKey(eventClass)) handlers.put(eventClass, new ArrayList<>());
|
||||||
|
handlers.get(eventClass).add(handler);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Dispatches a {@link Event} to every {@link EventHandler} subscribed to it.
|
* Dispatches a {@link Event} to every {@link EventHandler} subscribed to it.
|
||||||
@ -60,12 +67,15 @@ public class EventBus {
|
|||||||
* @param event the {@link Event} to dispatch
|
* @param event the {@link Event} to dispatch
|
||||||
* @since Envoy v0.2-alpha
|
* @since Envoy v0.2-alpha
|
||||||
*/
|
*/
|
||||||
public void dispatch(Event<?> event) { handlers.stream().filter(h -> h.supports().contains(event.getClass())).forEach(h -> h.handle(event)); }
|
public void dispatch(Event<?> event) {
|
||||||
|
handlers.keySet().stream().filter(event.getClass()::isAssignableFrom).map(handlers::get).flatMap(List::stream).forEach(h -> h.handle(event));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return a list of all {@link EventHandler} instances currently registered at
|
* @return a map of all {@link EventHandler} instances currently registered at
|
||||||
* this {@link EventBus}
|
* this {@link EventBus} with the {@link Event} classes they are
|
||||||
|
* subscribed to as keys
|
||||||
* @since Envoy v0.2-alpha
|
* @since Envoy v0.2-alpha
|
||||||
*/
|
*/
|
||||||
public List<EventHandler> getHandlers() { return handlers; }
|
public Map<Class<? extends Event<?>>, List<EventHandler>> getHandlers() { return handlers; }
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
package envoy.client.event;
|
package envoy.client.event;
|
||||||
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Project: <strong>envoy-clientChess</strong><br>
|
* Project: <strong>envoy-clientChess</strong><br>
|
||||||
* File: <strong>EventHandler.javaEvent.java</strong><br>
|
* File: <strong>EventHandler.javaEvent.java</strong><br>
|
||||||
@ -17,9 +15,4 @@ public interface EventHandler {
|
|||||||
* @param event The event dispatched by the event bus, only of supported type
|
* @param event The event dispatched by the event bus, only of supported type
|
||||||
*/
|
*/
|
||||||
void handle(Event<?> event);
|
void handle(Event<?> event);
|
||||||
|
|
||||||
/**
|
|
||||||
* @return A set of classes this class is supposed to handle in events
|
|
||||||
*/
|
|
||||||
Set<Class<? extends Event<?>>> supports();
|
|
||||||
}
|
}
|
||||||
|
20
src/main/java/envoy/client/event/ThemeChangeEvent.java
Normal file
20
src/main/java/envoy/client/event/ThemeChangeEvent.java
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
package envoy.client.event;
|
||||||
|
|
||||||
|
import envoy.client.ui.Theme;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Project: <strong>envoy-client</strong><br>
|
||||||
|
* File: <strong>ThemeChangeEvent.java</strong><br>
|
||||||
|
* Created: <strong>15 Dec 2019</strong><br>
|
||||||
|
*
|
||||||
|
* @author Kai S. K. Engelbart
|
||||||
|
*/
|
||||||
|
public class ThemeChangeEvent implements Event<Theme> {
|
||||||
|
|
||||||
|
private final Theme theme;
|
||||||
|
|
||||||
|
public ThemeChangeEvent(Theme theme) { this.theme = theme; }
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Theme get() { return theme; }
|
||||||
|
}
|
@ -30,6 +30,8 @@ import envoy.client.Client;
|
|||||||
import envoy.client.Config;
|
import envoy.client.Config;
|
||||||
import envoy.client.LocalDB;
|
import envoy.client.LocalDB;
|
||||||
import envoy.client.Settings;
|
import envoy.client.Settings;
|
||||||
|
import envoy.client.event.EventBus;
|
||||||
|
import envoy.client.event.ThemeChangeEvent;
|
||||||
import envoy.schema.Message;
|
import envoy.schema.Message;
|
||||||
import envoy.schema.User;
|
import envoy.schema.User;
|
||||||
|
|
||||||
@ -166,7 +168,6 @@ public class ChatWindow extends JFrame {
|
|||||||
settingsButton.addActionListener((evt) -> {
|
settingsButton.addActionListener((evt) -> {
|
||||||
try {
|
try {
|
||||||
SettingsScreen.open();
|
SettingsScreen.open();
|
||||||
changeChatWindowColors(Settings.getInstance().getCurrentTheme());
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
SettingsScreen.open();
|
SettingsScreen.open();
|
||||||
logger.log(Level.WARNING, "An error occured while opening the settings screen", e);
|
logger.log(Level.WARNING, "An error occured while opening the settings screen", e);
|
||||||
@ -220,11 +221,13 @@ public class ChatWindow extends JFrame {
|
|||||||
gbc_userList.anchor = GridBagConstraints.PAGE_START;
|
gbc_userList.anchor = GridBagConstraints.PAGE_START;
|
||||||
gbc_userList.insets = new Insets(space, space, space, space);
|
gbc_userList.insets = new Insets(space, space, space, space);
|
||||||
|
|
||||||
changeChatWindowColors(Settings.getInstance().getCurrentTheme());
|
changeChatWindowColors(Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()));
|
||||||
|
|
||||||
contentPane.add(userList, gbc_userList);
|
contentPane.add(userList, gbc_userList);
|
||||||
contentPane.revalidate();
|
contentPane.revalidate();
|
||||||
|
|
||||||
|
EventBus.getInstance().register(ThemeChangeEvent.class, (evt) -> changeChatWindowColors((Theme) evt.get()));
|
||||||
|
|
||||||
loadUsersAndChats();
|
loadUsersAndChats();
|
||||||
|
|
||||||
if (client.isOnline()) startSyncThread(Config.getInstance().getSyncTimeout());
|
if (client.isOnline()) startSyncThread(Config.getInstance().getSyncTimeout());
|
||||||
@ -237,9 +240,7 @@ public class ChatWindow extends JFrame {
|
|||||||
*
|
*
|
||||||
* @since Envoy v0.1-alpha
|
* @since Envoy v0.1-alpha
|
||||||
*/
|
*/
|
||||||
public void changeChatWindowColors(String key) {
|
private void changeChatWindowColors(Theme theme) {
|
||||||
Theme theme = Settings.getInstance().getThemes().get(key);
|
|
||||||
|
|
||||||
// contentPane
|
// contentPane
|
||||||
contentPane.setBackground(theme.getBackgroundColor());
|
contentPane.setBackground(theme.getBackgroundColor());
|
||||||
contentPane.setForeground(theme.getUserNameColor());
|
contentPane.setForeground(theme.getUserNameColor());
|
||||||
|
@ -27,6 +27,8 @@ import javax.swing.ListSelectionModel;
|
|||||||
|
|
||||||
import envoy.client.LocalDB;
|
import envoy.client.LocalDB;
|
||||||
import envoy.client.Settings;
|
import envoy.client.Settings;
|
||||||
|
import envoy.client.event.EventBus;
|
||||||
|
import envoy.client.event.ThemeChangeEvent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class provides the GUI to change the user specific settings.
|
* This class provides the GUI to change the user specific settings.
|
||||||
@ -45,12 +47,12 @@ public class SettingsScreen extends JDialog {
|
|||||||
private final JPanel contentPanel = new JPanel();
|
private final JPanel contentPanel = new JPanel();
|
||||||
|
|
||||||
private DefaultListModel<String> optionsListModel = new DefaultListModel<>();
|
private DefaultListModel<String> optionsListModel = new DefaultListModel<>();
|
||||||
private final JList<String> options = new JList<String>();
|
private final JList<String> options = new JList<>();
|
||||||
private JPanel buttonPane = new JPanel();
|
private JPanel buttonPane = new JPanel();
|
||||||
|
|
||||||
private JPanel themeContent = new JPanel();
|
private JPanel themeContent = new JPanel();
|
||||||
private String[] themeArray = Settings.getInstance().getThemes().keySet().toArray(new String[0]);
|
private String[] themeArray = Settings.getInstance().getThemes().keySet().toArray(new String[0]);
|
||||||
private JComboBox<String> themes = new JComboBox<String>(themeArray);
|
private JComboBox<String> themes = new JComboBox<>(themeArray);
|
||||||
|
|
||||||
private GridBagConstraints gbc_themeContent = new GridBagConstraints();
|
private GridBagConstraints gbc_themeContent = new GridBagConstraints();
|
||||||
|
|
||||||
@ -63,7 +65,6 @@ public class SettingsScreen extends JDialog {
|
|||||||
private JButton cancelButton = new JButton("Cancel");
|
private JButton cancelButton = new JButton("Cancel");
|
||||||
private static int space = 5;
|
private static int space = 5;
|
||||||
|
|
||||||
private boolean colorChanged = false;
|
|
||||||
private Theme temporaryTheme;
|
private Theme temporaryTheme;
|
||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(LocalDB.class.getSimpleName());
|
private static final Logger logger = Logger.getLogger(LocalDB.class.getSimpleName());
|
||||||
@ -296,9 +297,10 @@ public class SettingsScreen extends JDialog {
|
|||||||
Settings.getInstance().setCurrentTheme(selectedTheme.getThemeName());
|
Settings.getInstance().setCurrentTheme(selectedTheme.getThemeName());
|
||||||
System.out.println(selectedTheme.getThemeName());
|
System.out.println(selectedTheme.getThemeName());
|
||||||
|
|
||||||
changeSettingsScreenColors(Settings.getInstance().getCurrentTheme());
|
final Theme currentTheme = Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme());
|
||||||
updateColorVariables(Settings.getInstance().getCurrentTheme());
|
changeSettingsScreenColors(currentTheme);
|
||||||
|
updateColorVariables(currentTheme);
|
||||||
|
EventBus.getInstance().dispatch(new ThemeChangeEvent(currentTheme));
|
||||||
Settings.getInstance().save();
|
Settings.getInstance().save();
|
||||||
|
|
||||||
revalidate();
|
revalidate();
|
||||||
@ -310,11 +312,10 @@ public class SettingsScreen extends JDialog {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
changeSettingsScreenColors(Settings.getInstance().getCurrentTheme());
|
changeSettingsScreenColors(Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void changeSettingsScreenColors(String key) {
|
private void changeSettingsScreenColors(Theme theme) {
|
||||||
Theme theme = Settings.getInstance().getThemes().get(key);
|
|
||||||
// whole JDialog
|
// whole JDialog
|
||||||
setBackground(theme.getBackgroundColor());
|
setBackground(theme.getBackgroundColor());
|
||||||
// contentPanel
|
// contentPanel
|
||||||
@ -345,19 +346,8 @@ public class SettingsScreen extends JDialog {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateColorVariables(String key) {
|
private void updateColorVariables(Theme theme) {
|
||||||
Theme theme = Settings.getInstance().getThemes().get(key);
|
temporaryTheme = new Theme("temporaryTheme", theme);
|
||||||
|
|
||||||
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()).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()).getUserNameColor());
|
|
||||||
|
|
||||||
colorsPanel.removeAll();
|
colorsPanel.removeAll();
|
||||||
|
|
||||||
@ -462,7 +452,6 @@ public class SettingsScreen extends JDialog {
|
|||||||
// TODO: When Theme changed in same settings screen, color variable doesnt
|
// TODO: When Theme changed in same settings screen, color variable doesnt
|
||||||
// update.
|
// update.
|
||||||
temporaryTheme.setColor(yIndex, newColor);
|
temporaryTheme.setColor(yIndex, newColor);
|
||||||
colorChanged = true;
|
|
||||||
createNewThemeButton.setEnabled(true);
|
createNewThemeButton.setEnabled(true);
|
||||||
}
|
}
|
||||||
button.setBackground(newColor);
|
button.setBackground(newColor);
|
||||||
@ -481,8 +470,5 @@ public class SettingsScreen extends JDialog {
|
|||||||
colorsPanel.add(panel);
|
colorsPanel.add(panel);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Color getInvertedColor(Color color) {
|
private Color getInvertedColor(Color color) { return new Color(255 - color.getRed(), 255 - color.getGreen(), 255 - color.getBlue()); }
|
||||||
return new Color(255 - color.getRed(), 255 - color.getGreen(), 255 - color.getBlue());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -11,12 +11,8 @@ import java.awt.TrayIcon.MessageType;
|
|||||||
import java.awt.Window;
|
import java.awt.Window;
|
||||||
import java.awt.event.WindowAdapter;
|
import java.awt.event.WindowAdapter;
|
||||||
import java.awt.event.WindowEvent;
|
import java.awt.event.WindowEvent;
|
||||||
import java.util.HashSet;
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import envoy.client.event.Event;
|
|
||||||
import envoy.client.event.EventBus;
|
import envoy.client.event.EventBus;
|
||||||
import envoy.client.event.EventHandler;
|
|
||||||
import envoy.client.event.MessageCreationEvent;
|
import envoy.client.event.MessageCreationEvent;
|
||||||
import envoy.exception.EnvoyException;
|
import envoy.exception.EnvoyException;
|
||||||
import envoy.schema.Message;
|
import envoy.schema.Message;
|
||||||
@ -29,7 +25,7 @@ import envoy.schema.Message;
|
|||||||
* @author Kai S. K. Engelbart
|
* @author Kai S. K. Engelbart
|
||||||
* @since Envoy v0.2-alpha
|
* @since Envoy v0.2-alpha
|
||||||
*/
|
*/
|
||||||
public class StatusTrayIcon implements EventHandler {
|
public class StatusTrayIcon {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The {@link TrayIcon} provided by the System Tray API for controlling the
|
* The {@link TrayIcon} provided by the System Tray API for controlling the
|
||||||
@ -85,7 +81,10 @@ public class StatusTrayIcon implements EventHandler {
|
|||||||
trayIcon.addActionListener((evt) -> { focusTarget.setVisible(true); focusTarget.requestFocus(); });
|
trayIcon.addActionListener((evt) -> { focusTarget.setVisible(true); focusTarget.requestFocus(); });
|
||||||
|
|
||||||
// Start processing message events
|
// Start processing message events
|
||||||
EventBus.getInstance().register(this);
|
EventBus.getInstance().register(MessageCreationEvent.class, (evt) -> {
|
||||||
|
if (displayMessages)
|
||||||
|
trayIcon.displayMessage("New message received", ((MessageCreationEvent) evt).get().getContent().get(0).getText(), MessageType.INFO);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -102,31 +101,4 @@ public class StatusTrayIcon implements EventHandler {
|
|||||||
throw new EnvoyException("Could not attach Envoy tray icon to system tray.", e);
|
throw new EnvoyException("Could not attach Envoy tray icon to system tray.", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Notifies the user of a message by displaying a pop-up every time a new
|
|
||||||
* message is received.
|
|
||||||
*
|
|
||||||
* @since Envoy v0.2-alpha
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void handle(Event<?> event) {
|
|
||||||
System.out.println("Message received. Displaying message: " + displayMessages);
|
|
||||||
if (displayMessages)
|
|
||||||
trayIcon.displayMessage("New message received", ((MessageCreationEvent) event).get().getContent().get(0).getText(), MessageType.INFO);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The {@link StatusTrayIcon} only reacts to {@link MessageCreationEvent}
|
|
||||||
* instances which signify newly received messages.
|
|
||||||
*
|
|
||||||
* @return A set with the single element {@code MessageCreationEvent.class}
|
|
||||||
* @since Envoy v0.2-alpha
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public Set<Class<? extends Event<?>>> supports() {
|
|
||||||
Set<Class<? extends Event<?>>> supportedEvents = new HashSet<>();
|
|
||||||
supportedEvents.add(MessageCreationEvent.class);
|
|
||||||
return supportedEvents;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user