diff --git a/src/main/java/envoy/client/LocalDB.java b/src/main/java/envoy/client/LocalDB.java
index 8af3094..a07ba8b 100644
--- a/src/main/java/envoy/client/LocalDB.java
+++ b/src/main/java/envoy/client/LocalDB.java
@@ -1,374 +1,304 @@
-package envoy.client;
-
-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.time.Instant;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.logging.Logger;
-
-import javax.xml.datatype.DatatypeConfigurationException;
-import javax.xml.datatype.DatatypeFactory;
-
-import envoy.exception.EnvoyException;
-import envoy.schema.Message;
-import envoy.schema.Message.Metadata.MessageState;
-import envoy.schema.ObjectFactory;
-import envoy.schema.Sync;
-import envoy.schema.User;
-
-/**
- * Project: envoy-client
- * File: LocalDB.java
- * Created: 27.10.2019
- *
- * @author Kai S. K. Engelbart
- * @author Maximilian Käfer
- * @since Envoy v0.1-alpha
- */
-public class LocalDB {
- private File localDB;
- private User sender;
- private List chats = new ArrayList<>();
- private ObjectFactory objectFactory = new ObjectFactory();
- private DatatypeFactory datatypeFactory;
-
- private static final Logger logger = Logger.getLogger(LocalDB.class.getSimpleName());
-
- /**
- * Constructs an empty local database.
- *
- * @param client the user that is logged in with this client
- * @since Envoy v0.1-alpha
- **/
-
- public LocalDB(User sender) {
- this.sender = sender;
- try {
- datatypeFactory = DatatypeFactory.newInstance();
- } catch (DatatypeConfigurationException e) {
- e.printStackTrace();
- }
- }
-
-
- /**
- * Initializes the local database and fills it with values
- * if the user has already sent or received messages.
- *
- * @param localDBDir the directory where we wish to save/load the database from.
- * @throws EnvoyException if the directory selected is not an actual directory.
- * @since Envoy v0.1-alpha
- **/
- public void initializeDBFile(File localDBDir) throws EnvoyException {
- if (localDBDir.exists() && !localDBDir.isDirectory()) throw new EnvoyException(
- String.format("LocalDBDir '%s' is not a directory!", localDBDir.getAbsolutePath()));
- localDB = new File(localDBDir, sender.getID() + ".db");
- if (localDB.exists()) loadFromLocalDB();
- }
-
- /**
- * Saves the database into a file for future use.
- *
- * @throws IOException if something went wrong during saving
- * @since Envoy v0.1-alpha
- **/
- public void saveToLocalDB() {
- try {
- localDB.getParentFile().mkdirs();
- localDB.createNewFile();
- } catch (IOException e) {
- e.printStackTrace();
- logger.warning("unable to save the messages");
- }
- try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(localDB))) {
- out.writeObject(chats);
- } catch (IOException ex) {
- ex.printStackTrace();
- logger.warning("unable to save the messages");
- }
- }
-
- /**
- * Loads all chats saved by Envoy for the client user.
- *
- * @throws EnvoyException if something fails while loading.
- * @since Envoy v0.1-alpha
- **/
- @SuppressWarnings("unchecked")
- private void loadFromLocalDB() throws EnvoyException {
- try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(localDB))) {
- Object obj = in.readObject();
- if (obj instanceof ArrayList>) chats = (ArrayList) obj;
- } catch (ClassNotFoundException | IOException e) {
- throw new EnvoyException(e);
- }
- }
-
- /**
- * Creates a {@link Message} object serializable to XML.
- *
- * @param textContent The content (text) of the message
- * @return prepared {@link Message} object
- */
- public Message createMessage(String textContent, User recipient) {
- Message.Metadata metaData = objectFactory.createMessageMetadata();
- metaData.setSender(sender.getID());
- metaData.setRecipient(recipient.getID());
- metaData.setState(MessageState.WAITING);
- metaData.setDate(datatypeFactory.newXMLGregorianCalendar(Instant.now().toString()));
-
- Message.Content content = objectFactory.createMessageContent();
- content.setType("text");
- content.setText(textContent);
-
- Message message = objectFactory.createMessage();
- message.setMetadata(metaData);
- message.getContent().add(content);
-
- return message;
- }
-
- private Sync unreadMessagesSync = objectFactory.createSync();
- public Sync sync = objectFactory.createSync();
- public Sync readMessages = objectFactory.createSync();
-
- public Sync fillSync(long userId) {
-
- addWaitingMessagesToSync();
-
- getSentStateMessagesFromLocalDB();
- for (int i = 0; i < readMessages.getMessages().size(); i++) {
- sync.getMessages().add(readMessages.getMessages().get(i));
- }
- readMessages.getMessages().clear();
-
- logger.info(String.format("Filled sync with %d messages.", sync.getMessages().size()));
- return sync;
- }
-
- public void applySync(Sync returnSync) {
- for (int i = 0; i < returnSync.getMessages().size(); i++) {
- if (returnSync.getMessages().get(i).getMetadata().getMessageId() != 0
- && returnSync.getMessages().get(i).getMetadata().getState() == MessageState.SENT) {
- // Update Local Messages with State WAITING (add Message ID and change State to
- // SENT)
- for (int j = 0; j < sync.getMessages().size(); j++) {
- if (j == i) {
- sync.getMessages()
- .get(j)
- .getMetadata()
- .setMessageId(returnSync.getMessages().get(j).getMetadata().getMessageId());
- sync.getMessages()
- .get(j)
- .getMetadata()
- .setState(returnSync.getMessages().get(j).getMetadata().getState());
- }
-
- }
-
- }
- if (returnSync.getMessages().get(i).getMetadata().getMessageId() != 0
- && returnSync.getMessages().get(i).getMetadata().getSender() != 0
- && returnSync.getMessages().get(i).getMetadata().getState() == MessageState.RECEIVED) {
- // these are the unread Messages from the server
- unreadMessagesSync.getMessages().add(returnSync.getMessages().get(i));
-
- }
-
- if (returnSync.getMessages().get(i).getMetadata().getMessageId() != 0
- && returnSync.getMessages().get(i).getMetadata().getSender() == 0
- && returnSync.getMessages().get(i).getMetadata().getState() == MessageState.RECEIVED) {
- // Update Messages in localDB to state RECEIVED
- for (int j = 0; j < getChats().size(); j++) {
- if (getChats().get(j)
- .getRecipient()
- .getID() == returnSync.getMessages().get(i).getMetadata().getRecipient()) {
- for (int k = 0; k < getChats().get(j).getModel().getSize(); k++) {
- if (getChats().get(j).getModel().get(k).getMetadata().getMessageId() == returnSync
- .getMessages()
- .get(i)
- .getMetadata()
- .getMessageId()) {
- // Update Message in LocalDB
- getChats().get(j)
- .getModel()
- .get(k)
- .getMetadata()
- .setState(returnSync.getMessages().get(j).getMetadata().getState());
- }
- }
- }
- }
-
- }
-
- if (returnSync.getMessages().get(i).getMetadata().getMessageId() != 0
- && returnSync.getMessages().get(i).getMetadata().getState() == MessageState.READ) {
- // Update local Messages to state READ
- logger.info("Message with ID: " + returnSync.getMessages().get(i).getMetadata().getMessageId()
- + "was initialized to be set to READ in localDB.");
- for (int j = 0; j < getChats().size(); j++) {
- if (getChats().get(j)
- .getRecipient()
- .getID() == returnSync.getMessages().get(i).getMetadata().getRecipient()) {
- logger.info("Chat with: " + getChats().get(j).getRecipient().getID() + "was selected.");
- for (int k = 0; k < getChats().get(j).getModel().getSize(); k++) {
- if (getChats().get(j).getModel().get(k).getMetadata().getMessageId() == returnSync
- .getMessages()
- .get(i)
- .getMetadata()
- .getMessageId()) {
- logger.info("Message with ID: "
- + getChats().get(j).getModel().get(k).getMetadata().getMessageId()
- + "was selected.");
- getChats().get(j)
- .getModel()
- .get(k)
- .getMetadata()
- .setState(returnSync.getMessages().get(i).getMetadata().getState());
- logger.info("Message State is now: "
- + getChats().get(j).getModel().get(k).getMetadata().getState().toString());
- }
- }
- }
- }
-
- }
- }
-
- // Updating UserStatus of all users in LocalDB
- for (int j = 0; j < returnSync.getUsers().size(); j++) {
- for (int k = 0; k < getChats().size(); k++) {
- if (getChats().get(k).getRecipient().getID() == returnSync.getUsers().get(j).getID()) {
-
- getChats().get(k).getRecipient().setStatus(returnSync.getUsers().get(j).getStatus());
- logger.info(getChats().get(k).getRecipient().getStatus().toString());
- }
- }
- }
-
- sync.getMessages().clear();
- sync.getUsers().clear();
-
- }
-
- /**
- * Adds a message to the "sync" Sync object.
- *
- * @param message
- * @since Envoy v0.1-alpha
- */
- public void addMessageToSync(Message message) { sync.getMessages().add(message); }
-
- /**
- * Adds a user to the {@code sync} {@link Sync} object.
- *
- * @param user
- * @since Envoy v0.1-alpha
- */
- public void addUserToSync(User user) { sync.getUsers().add(user); }
-
- /**
- * Adds the unread messages returned from the server in the latest sync to the
- * right chats in the LocalDB.
- *
- * @param localDB
- * @since Envoy v0.1-alpha
- */
- public void addUnreadMessagesToLocalDB() {
- Sync unreadMessages = unreadMessagesSync;
- for (int i = 0; i < unreadMessages.getMessages().size(); i++)
- for (int j = 0; j < getChats().size(); j++)
- if (getChats().get(j)
- .getRecipient()
- .getID() == unreadMessages.getMessages().get(i).getMetadata().getSender()) {
- getChats().get(j).appendMessage(unreadMessages.getMessages().get(i));
- }
- }
-
- /**
- * Gets all messages with state SENT from the LocalDB and adds them to the
- * "sync" Sync object.
- *
- * @param localDB
- * @since Envoy v0.1-alpha
- */
- public void getSentStateMessagesFromLocalDB() {
- for (int i = 0; i < getChats().size(); i++) {
- for (int j = 0; j < getChats().get(i).getModel().getSize(); j++) {
- if (getChats().get(i).getModel().get(j).getMetadata().getState() == MessageState.SENT) {
- addMessageToSync(getChats().get(i).getModel().get(j));
- }
- }
- }
- }
-
- /**
- * Changes all messages with State RECEIVED of a specific chat to State READ.
- *
- * Adds these Messages to the {@code readMessages} {@link Sync} object.
- *
- * @param currentChat
- * @since Envoy v0.1-alpha
- */
- public void setMessagesToRead(Chat currentChat) {
- for (int i = currentChat.getModel().size() - 1; i >= 0; --i)
- if (currentChat.getModel().get(i).getMetadata().getRecipient() != currentChat.getRecipient().getID())
- if (currentChat.getModel().get(i).getMetadata().getState() == MessageState.RECEIVED) {
- currentChat.getModel().get(i).getMetadata().setState(MessageState.READ);
- readMessages.getMessages().add(currentChat.getModel().get(i));
- } else break;
- }
-
- /**
- * Adds a message with State WAITING to a specific chat in the LocalDB.
- *
- * @param message
- * @param currentChat
- * @since Envoy v0.1-alpha
- */
- public void addWaitingMessageToLocalDB(Message message, Chat currentChat) { currentChat.appendMessage(message); }
-
- /**
- * Adds all messages with State WAITING from the {@link LocalDB} to the Sync.
- *
- * @param localDB
- * @since Envoy v0.1-alpha
- */
- public void addWaitingMessagesToSync() {
- for (int i = 0; i < getChats().size(); i++) {
- for (int j = 0; j < getChats().get(i).getModel().getSize(); j++) {
- if (getChats().get(i).getModel().get(j).getMetadata().getState() == MessageState.WAITING) {
- // addMessageToSync(localDB.getChats().get(i).getModel().get(j));
- logger.info("Got Waiting Message");
- sync.getMessages().add(0, getChats().get(i).getModel().get(j));
- }
- }
- }
- }
-
- /**
- * Clears the {@code unreadMessagesSync} {@link Sync} object.
- *
- * @since Envoy v0.1-alpha
- */
- public void clearUnreadMessagesSync() { unreadMessagesSync.getMessages().clear(); }
-
- /**
- * @return all saves {@link Chat} objects that list the client user as the
- * client
- * @since Envoy v0.1-alpha
- **/
- public List getChats() { return chats; }
-
- /**
- * @return the User who initialised the local Database
- * @since Envoy v0.1-alpha
- */
- public User getUser() { return sender; }
-}
+package envoy.client;
+
+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.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.logging.Logger;
+
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
+
+import envoy.exception.EnvoyException;
+import envoy.schema.Message;
+import envoy.schema.Message.Metadata.MessageState;
+import envoy.schema.ObjectFactory;
+import envoy.schema.Sync;
+import envoy.schema.User;
+
+/**
+ * Project: envoy-client
+ * File: LocalDB.java
+ * Created: 27.10.2019
+ *
+ * @author Kai S. K. Engelbart
+ * @author Maximilian Käfer
+ * @since Envoy v0.1-alpha
+ */
+public class LocalDB {
+
+ private File localDB;
+ private User sender;
+ private List chats = new ArrayList<>();
+ private ObjectFactory objectFactory = new ObjectFactory();
+ private DatatypeFactory datatypeFactory;
+
+ private static final Logger logger = Logger.getLogger(LocalDB.class.getSimpleName());
+
+ private Sync unreadMessagesSync = objectFactory.createSync();
+ private Sync sync = objectFactory.createSync();
+ private Sync readMessages = objectFactory.createSync();
+
+ /**
+ * Constructs an empty local database.
+ *
+ * @param client the user that is logged in with this client
+ * @since Envoy v0.1-alpha
+ */
+
+ public LocalDB(User sender) {
+ this.sender = sender;
+ try {
+ datatypeFactory = DatatypeFactory.newInstance();
+ } catch (DatatypeConfigurationException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Initializes the local database and fills it with values
+ * if the user has already sent or received messages.
+ *
+ * @param localDBDir the directory where we wish to save/load the database from.
+ * @throws EnvoyException if the directory selected is not an actual directory.
+ * @since Envoy v0.1-alpha
+ */
+ public void initializeDBFile(File localDBDir) throws EnvoyException {
+ if (localDBDir.exists() && !localDBDir.isDirectory())
+ throw new EnvoyException(String.format("LocalDBDir '%s' is not a directory!", localDBDir.getAbsolutePath()));
+ localDB = new File(localDBDir, sender.getID() + ".db");
+ if (localDB.exists()) loadFromLocalDB();
+ }
+
+ /**
+ * Saves the database into a file for future use.
+ *
+ * @throws IOException if something went wrong during saving
+ * @since Envoy v0.1-alpha
+ */
+ public void saveToLocalDB() {
+ try {
+ localDB.getParentFile().mkdirs();
+ localDB.createNewFile();
+ } catch (IOException e) {
+ e.printStackTrace();
+ logger.warning("unable to save the messages");
+ }
+ try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(localDB))) {
+ out.writeObject(chats);
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ logger.warning("unable to save the messages");
+ }
+ }
+
+ /**
+ * Loads all chats saved by Envoy for the client user.
+ *
+ * @throws EnvoyException if something fails while loading.
+ * @since Envoy v0.1-alpha
+ */
+ @SuppressWarnings("unchecked")
+ private void loadFromLocalDB() throws EnvoyException {
+ try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(localDB))) {
+ Object obj = in.readObject();
+ if (obj instanceof ArrayList>) chats = (ArrayList) obj;
+ } catch (ClassNotFoundException | IOException e) {
+ throw new EnvoyException(e);
+ }
+ }
+
+ /**
+ * Creates a {@link Message} object serializable to XML.
+ *
+ * @param textContent The content (text) of the message
+ * @return prepared {@link Message} object
+ */
+ public Message createMessage(String textContent, User recipient) {
+ Message.Metadata metaData = objectFactory.createMessageMetadata();
+ metaData.setSender(sender.getID());
+ metaData.setRecipient(recipient.getID());
+ metaData.setState(MessageState.WAITING);
+ metaData.setDate(datatypeFactory.newXMLGregorianCalendar(Instant.now().toString()));
+
+ Message.Content content = objectFactory.createMessageContent();
+ content.setType("text");
+ content.setText(textContent);
+
+ Message message = objectFactory.createMessage();
+ message.setMetadata(metaData);
+ message.getContent().add(content);
+
+ return message;
+ }
+
+ public Sync fillSync(long userId) {
+ addWaitingMessagesToSync();
+
+ sync.getMessages().addAll(readMessages.getMessages());
+ readMessages.getMessages().clear();
+
+ logger.info(String.format("Filled sync with %d messages.", sync.getMessages().size()));
+ return sync;
+ }
+
+ public void applySync(Sync returnSync) {
+ for (int i = 0; i < returnSync.getMessages().size(); i++) {
+ if (returnSync.getMessages().get(i).getMetadata().getMessageId() != 0
+ && returnSync.getMessages().get(i).getMetadata().getState() == MessageState.SENT) {
+ // Update Local Messages with State WAITING (add Message ID and change State to
+ // SENT)
+ for (int j = 0; j < sync.getMessages().size(); j++) {
+ if (j == i) {
+ sync.getMessages().get(j).getMetadata().setMessageId(returnSync.getMessages().get(j).getMetadata().getMessageId());
+ sync.getMessages().get(j).getMetadata().setState(returnSync.getMessages().get(j).getMetadata().getState());
+ }
+ }
+ }
+ if (returnSync.getMessages().get(i).getMetadata().getMessageId() != 0 && returnSync.getMessages().get(i).getMetadata().getSender() != 0
+ && returnSync.getMessages().get(i).getMetadata().getState() == MessageState.RECEIVED) {
+ // these are the unread Messages from the server
+ unreadMessagesSync.getMessages().add(returnSync.getMessages().get(i));
+ }
+
+ if (returnSync.getMessages().get(i).getMetadata().getMessageId() != 0 && returnSync.getMessages().get(i).getMetadata().getSender() == 0
+ && returnSync.getMessages().get(i).getMetadata().getState() == MessageState.RECEIVED) {
+ // Update Messages in localDB to state RECEIVED
+ for (int j = 0; j < getChats().size(); j++) {
+ if (getChats().get(j).getRecipient().getID() == returnSync.getMessages().get(i).getMetadata().getRecipient()) {
+ for (int k = 0; k < getChats().get(j).getModel().getSize(); k++) {
+ if (getChats().get(j).getModel().get(k).getMetadata().getMessageId() == returnSync.getMessages()
+ .get(i)
+ .getMetadata()
+ .getMessageId()) {
+ // Update Message in LocalDB
+ getChats().get(j).getModel().get(k).getMetadata().setState(returnSync.getMessages().get(j).getMetadata().getState());
+ }
+ }
+ }
+ }
+
+ }
+
+ if (returnSync.getMessages().get(i).getMetadata().getMessageId() != 0
+ && returnSync.getMessages().get(i).getMetadata().getState() == MessageState.READ) {
+ // Update local Messages to state READ
+ logger.info("Message with ID: " + returnSync.getMessages().get(i).getMetadata().getMessageId()
+ + "was initialized to be set to READ in localDB.");
+ for (int j = 0; j < getChats().size(); j++) {
+ if (getChats().get(j)
+ .getRecipient()
+ .getID() == returnSync.getMessages().get(i).getMetadata().getRecipient()) {
+ logger.info("Chat with: " + getChats().get(j).getRecipient().getID() + "was selected.");
+ for (int k = 0; k < getChats().get(j).getModel().getSize(); k++) {
+ if (getChats().get(j).getModel().get(k).getMetadata().getMessageId() == returnSync.getMessages()
+ .get(i)
+ .getMetadata()
+ .getMessageId()) {
+ logger.info("Message with ID: "
+ + getChats().get(j).getModel().get(k).getMetadata().getMessageId()
+ + "was selected.");
+ getChats().get(j)
+ .getModel()
+ .get(k)
+ .getMetadata()
+ .setState(returnSync.getMessages().get(i).getMetadata().getState());
+ logger.info("Message State is now: "
+ + getChats().get(j).getModel().get(k).getMetadata().getState().toString());
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Updating UserStatus of all users in LocalDB
+ for (int j = 0; j < returnSync.getUsers().size(); j++) {
+ for (int k = 0; k < getChats().size(); k++) {
+ if (getChats().get(k).getRecipient().getID() == returnSync.getUsers().get(j).getID()) {
+
+ getChats().get(k).getRecipient().setStatus(returnSync.getUsers().get(j).getStatus());
+ logger.info(getChats().get(k).getRecipient().getStatus().toString());
+ }
+ }
+ }
+
+ sync.getMessages().clear();
+ sync.getUsers().clear();
+ }
+
+ /**
+ * Adds the unread messages returned from the server in the latest sync to the
+ * right chats in the LocalDB.
+ *
+ * @param localDB
+ * @since Envoy v0.1-alpha
+ */
+ public void addUnreadMessagesToLocalDB() {
+ Sync unreadMessages = unreadMessagesSync;
+ for (int i = 0; i < unreadMessages.getMessages().size(); i++)
+ for (int j = 0; j < getChats().size(); j++)
+ if (getChats().get(j).getRecipient().getID() == unreadMessages.getMessages().get(i).getMetadata().getSender()) {
+ getChats().get(j).appendMessage(unreadMessages.getMessages().get(i));
+ }
+ }
+
+ /**
+ * Changes all messages with state {@code RECEIVED} of a specific chat to state
+ * {@code READ}.
+ *
+ * Adds these messages to the {@code readMessages} {@link Sync} object.
+ *
+ * @param currentChat
+ * @since Envoy v0.1-alpha
+ */
+ public void setMessagesToRead(Chat currentChat) {
+ for (int i = currentChat.getModel().size() - 1; i >= 0; --i)
+ if (currentChat.getModel().get(i).getMetadata().getRecipient() != currentChat.getRecipient().getID())
+ if (currentChat.getModel().get(i).getMetadata().getState() == MessageState.RECEIVED) {
+ currentChat.getModel().get(i).getMetadata().setState(MessageState.READ);
+ readMessages.getMessages().add(currentChat.getModel().get(i));
+ } else break;
+ }
+
+ /**
+ * Adds all messages with state {@code WAITING} from the {@link LocalDB} to the
+ * {@link Sync} object.
+ *
+ * @since Envoy v0.1-alpha
+ */
+ private void addWaitingMessagesToSync() {
+ for (Chat chat : getChats())
+ for (int i = 0; i < chat.getModel().size(); i++)
+ if (chat.getModel().get(i).getMetadata().getState() == MessageState.WAITING) {
+ // addMessageToSync(localDB.getChats().get(i).getModel().get(j));
+ logger.info("Got Waiting Message");
+ sync.getMessages().add(chat.getModel().get(i));
+ }
+ }
+
+ /**
+ * Clears the {@code unreadMessagesSync} {@link Sync} object.
+ *
+ * @since Envoy v0.1-alpha
+ */
+ public void clearUnreadMessagesSync() { unreadMessagesSync.getMessages().clear(); }
+
+ /**
+ * @return all saves {@link Chat} objects that list the client user as the
+ * client
+ * @since Envoy v0.1-alpha
+ **/
+ public List getChats() { return chats; }
+
+ /**
+ * @return the {@link User} who initialized the local database
+ * @since Envoy v0.1-alpha
+ */
+ public User getUser() { return sender; }
+}
diff --git a/src/main/java/envoy/client/ui/ChatWindow.java b/src/main/java/envoy/client/ui/ChatWindow.java
index c6fce27..39a907f 100644
--- a/src/main/java/envoy/client/ui/ChatWindow.java
+++ b/src/main/java/envoy/client/ui/ChatWindow.java
@@ -226,7 +226,7 @@ public class ChatWindow extends JFrame {
.get();
// Set all unread messages in the chat to read
- if (currentChat != null) { localDB.setMessagesToRead(currentChat); }
+ readCurrentChat();
client.setRecipient(user);
@@ -272,7 +272,7 @@ public class ChatWindow extends JFrame {
// Create and send message object
final Message message = localDB.createMessage(messageEnterTextArea.getText(), currentChat.getRecipient());
- localDB.addWaitingMessageToLocalDB(message, currentChat);
+ currentChat.appendMessage(message);
messageList.setModel(currentChat.getModel());
// Clear text field
@@ -309,7 +309,8 @@ public class ChatWindow extends JFrame {
}
/**
- * Updates the data model and the ui every x seconds.
+ * Updates the data model and the UI repeatedly after a certain amount of
+ * time.
*
* @param timeout the amount of time that passes between two requests sent to
* the server
@@ -322,9 +323,14 @@ public class ChatWindow extends JFrame {
// Synchronize
localDB.applySync(
client.sendSync(client.getSender().getID(), localDB.fillSync(client.getSender().getID())));
+
+ // Process unread messages
localDB.addUnreadMessagesToLocalDB();
localDB.clearUnreadMessagesSync();
+ // Mark unread messages as read when they are in the current chat
+ readCurrentChat();
+
// Update UI
SwingUtilities
.invokeLater(() -> { updateUserStates(); contentPane.revalidate(); contentPane.repaint(); });
@@ -338,4 +344,9 @@ public class ChatWindow extends JFrame {
if (userList.getModel().getElementAt(i).getID() == localDB.getChats().get(j).getRecipient().getID())
userList.getModel().getElementAt(i).setStatus(localDB.getChats().get(j).getRecipient().getStatus());
}
-}
\ No newline at end of file
+
+ /**
+ * Marks messages in the current chat as {@code READ}.
+ */
+ private void readCurrentChat() { if (currentChat != null) { localDB.setMessagesToRead(currentChat); } }
+}