From 9c03f2dab2576d41ec14f4fa4847bfc90791a195 Mon Sep 17 00:00:00 2001 From: kske Date: Sat, 21 Dec 2019 19:00:29 +0100 Subject: [PATCH] Loading ChatWindow in parallel to Client and LocalDB Fixes #26 --- src/main/java/envoy/client/ui/ChatWindow.java | 44 ++++++++++++------- src/main/java/envoy/client/ui/Startup.java | 15 ++++++- 2 files changed, 42 insertions(+), 17 deletions(-) diff --git a/src/main/java/envoy/client/ui/ChatWindow.java b/src/main/java/envoy/client/ui/ChatWindow.java index eb8ae44..4aae96a 100644 --- a/src/main/java/envoy/client/ui/ChatWindow.java +++ b/src/main/java/envoy/client/ui/ChatWindow.java @@ -54,14 +54,9 @@ public class ChatWindow extends JFrame { * Initializes a {@link JFrame} with UI elements used to send and read messages * to different users. * - * @param client the {@link Client} used to send and receive messages - * @param localDB the {@link LocalDB} used to manage stored messages and users * @since Envoy v0.1-alpha */ - public ChatWindow(Client client, LocalDB localDB) { - this.client = client; - this.localDB = localDB; - + public ChatWindow() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 600, 800); setTitle("Envoy"); @@ -164,7 +159,7 @@ public class ChatWindow extends JFrame { userList.setCellRenderer(new UserListRenderer()); userList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); userList.addListSelectionListener((listSelectionEvent) -> { - if (!listSelectionEvent.getValueIsAdjusting()) { + if (client != null && localDB != null && !listSelectionEvent.getValueIsAdjusting()) { @SuppressWarnings("unchecked") final JList selectedUserList = (JList) listSelectionEvent.getSource(); final User user = selectedUserList.getSelectedValue(); @@ -193,16 +188,12 @@ public class ChatWindow extends JFrame { gbc_userList.anchor = GridBagConstraints.PAGE_START; gbc_userList.insets = new Insets(space, space, space, space); - changeChatWindowColors(Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme())); + applyTheme(Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme())); contentPane.add(userList, gbc_userList); contentPane.revalidate(); - EventBus.getInstance().register(ThemeChangeEvent.class, (evt) -> changeChatWindowColors((Theme) evt.get())); - - loadUsersAndChats(); - - if (client.isOnline()) startSyncThread(Config.getInstance().getSyncTimeout()); + EventBus.getInstance().register(ThemeChangeEvent.class, (evt) -> applyTheme((Theme) evt.get())); contentPane.revalidate(); } @@ -211,9 +202,9 @@ public class ChatWindow extends JFrame { * Used to immediately reload the ChatWindow when settings were changed. * * @param theme the theme to change colors into - * @since Envoy v0.1-alpha + * @since Envoy v0.2-alpha */ - private void changeChatWindowColors(Theme theme) { + private void applyTheme(Theme theme) { // contentPane contentPane.setBackground(theme.getBackgroundColor()); contentPane.setForeground(theme.getUserNameColor()); @@ -334,4 +325,27 @@ public class ChatWindow extends JFrame { * Marks messages in the current chat as {@code READ}. */ private void readCurrentChat() { if (currentChat != null) { localDB.setMessagesToRead(currentChat); } } + + /** + * Sets the {@link Client} used by this {@link ChatWindow}. If the client is + * online, the sync thread is started. + * + * @param client the {@link Client} used to send and receive messages + */ + public void setClient(Client client) { + this.client = client; + if (client.isOnline() && localDB != null) startSyncThread(Config.getInstance().getSyncTimeout()); + } + + /** + * Sets the {@link LocalDB} used by this {@link ChatWindow}. After invoking this + * method, users and chats will be loaded from the database into the GUI. + * + * @param localDB the {@link LocalDB} used to manage stored messages and users + */ + public void setLocalDB(LocalDB localDB) { + this.localDB = localDB; + loadUsersAndChats(); + if (client != null && client.isOnline()) startSyncThread(Config.getInstance().getSyncTimeout()); + } } diff --git a/src/main/java/envoy/client/ui/Startup.java b/src/main/java/envoy/client/ui/Startup.java index db9644a..d4d4a78 100644 --- a/src/main/java/envoy/client/ui/Startup.java +++ b/src/main/java/envoy/client/ui/Startup.java @@ -8,6 +8,7 @@ import java.util.logging.Logger; import javax.swing.JFrame; import javax.swing.JOptionPane; +import javax.swing.SwingUtilities; import envoy.client.*; import envoy.client.util.EnvoyLog; @@ -28,6 +29,8 @@ import envoy.schema.User; */ public class Startup { + private static ChatWindow chatWindow; + private static final Logger logger = EnvoyLog.getLogger(Startup.class.getSimpleName()); /** @@ -44,6 +47,8 @@ public class Startup { public static void main(String[] args) { Config config = Config.getInstance(); + SwingUtilities.invokeLater(() -> chatWindow = new ChatWindow()); + try { // Load the configuration from client.properties first config.load(); @@ -82,6 +87,8 @@ public class Startup { return; } + SwingUtilities.invokeLater(() -> chatWindow.setVisible(true)); + // Acquire the client user (with ID) either from the server or from the local // database, which triggers offline mode Client client = new Client(config); @@ -96,6 +103,10 @@ public class Startup { User clientUser = localDB.getUsers().get(userName); if (clientUser == null) throw new EnvoyException("Could not enter offline mode: user name unknown"); client.setSender(clientUser); + JOptionPane.showMessageDialog(null, + "A connection to the server could not be established. Starting in offline mode.", + "Connection error", + JOptionPane.WARNING_MESSAGE); } catch (Exception e2) { JOptionPane.showMessageDialog(null, e2.toString(), "Client error", JOptionPane.ERROR_MESSAGE); System.exit(1); @@ -125,8 +136,8 @@ public class Startup { EventQueue.invokeLater(() -> { try { - ChatWindow chatWindow = new ChatWindow(client, localDB); - chatWindow.setVisible(true); + chatWindow.setClient(client); + chatWindow.setLocalDB(localDB); try { new StatusTrayIcon(chatWindow).show();