Merge pull request #73 from informatik-ag-ngl/b/fast_startup
Loading ChatWindow in parallel to Client and LocalDB
This commit is contained in:
commit
73167370b6
@ -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<User> selectedUserList = (JList<User>) 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,29 @@ 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
|
||||
* @since Envoy v0.2-alpha
|
||||
*/
|
||||
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
|
||||
* @since Envoy v0.2-alpha
|
||||
*/
|
||||
public void setLocalDB(LocalDB localDB) {
|
||||
this.localDB = localDB;
|
||||
loadUsersAndChats();
|
||||
if (client != null && client.isOnline()) startSyncThread(Config.getInstance().getSyncTimeout());
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
@ -15,7 +16,7 @@ import envoy.exception.EnvoyException;
|
||||
import envoy.schema.User;
|
||||
|
||||
/**
|
||||
* Starts the Envoy client and prompts the user to enter their name.
|
||||
* Starts the Envoy client and prompts the user to enter their name.<br>
|
||||
* <br>
|
||||
* Project: <strong>envoy-client</strong><br>
|
||||
* File: <strong>Startup.java</strong><br>
|
||||
@ -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();
|
||||
|
Reference in New Issue
Block a user