Added user and message loading and message posting
This commit is contained in:
		@@ -2,9 +2,10 @@ package envoy.client.data;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import java.io.IOException;
 | 
					import java.io.IOException;
 | 
				
			||||||
import java.io.Serializable;
 | 
					import java.io.Serializable;
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import envoy.client.net.WriteProxy;
 | 
					import envoy.client.net.WriteProxy;
 | 
				
			||||||
import envoy.client.ui.list.Model;
 | 
					 | 
				
			||||||
import envoy.data.Message;
 | 
					import envoy.data.Message;
 | 
				
			||||||
import envoy.data.Message.MessageStatus;
 | 
					import envoy.data.Message.MessageStatus;
 | 
				
			||||||
import envoy.data.User;
 | 
					import envoy.data.User;
 | 
				
			||||||
@@ -23,12 +24,12 @@ import envoy.event.MessageStatusChangeEvent;
 | 
				
			|||||||
 * @author Kai S. K. Engelbart
 | 
					 * @author Kai S. K. Engelbart
 | 
				
			||||||
 * @since Envoy Client v0.1-alpha
 | 
					 * @since Envoy Client v0.1-alpha
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
public class Chat implements Serializable {
 | 
					public final class Chat implements Serializable {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private static final long serialVersionUID = 0L;
 | 
						private final User			recipient;
 | 
				
			||||||
 | 
						private final List<Message>	messages	= new ArrayList<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private final User				recipient;
 | 
						private static final long serialVersionUID = 1L;
 | 
				
			||||||
	private final Model<Message>	model	= new Model<>();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Provides the list of messages that the recipient receives.<br>
 | 
						 * Provides the list of messages that the recipient receives.<br>
 | 
				
			||||||
@@ -39,14 +40,6 @@ public class Chat implements Serializable {
 | 
				
			|||||||
	 */
 | 
						 */
 | 
				
			||||||
	public Chat(User recipient) { this.recipient = recipient; }
 | 
						public Chat(User recipient) { this.recipient = recipient; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
					 | 
				
			||||||
	 * Appends a message to the bottom of this chat
 | 
					 | 
				
			||||||
	 *
 | 
					 | 
				
			||||||
	 * @param message the message to append
 | 
					 | 
				
			||||||
	 * @since Envoy Client v0.1-alpha
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	public void appendMessage(Message message) { model.add(message); }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Sets the status of all chat messages received from the recipient to
 | 
						 * Sets the status of all chat messages received from the recipient to
 | 
				
			||||||
	 * {@code READ} starting from the bottom and stopping once a read message is
 | 
						 * {@code READ} starting from the bottom and stopping once a read message is
 | 
				
			||||||
@@ -59,8 +52,8 @@ public class Chat implements Serializable {
 | 
				
			|||||||
	 * @since Envoy Client v0.3-alpha
 | 
						 * @since Envoy Client v0.3-alpha
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public void read(WriteProxy writeProxy) throws IOException {
 | 
						public void read(WriteProxy writeProxy) throws IOException {
 | 
				
			||||||
		for (int i = model.size() - 1; i >= 0; --i) {
 | 
							for (int i = messages.size() - 1; i >= 0; --i) {
 | 
				
			||||||
			final Message m = model.get(i);
 | 
								final Message m = messages.get(i);
 | 
				
			||||||
			if (m.getSenderID() == recipient.getID()) if (m.getStatus() == MessageStatus.READ) break;
 | 
								if (m.getSenderID() == recipient.getID()) if (m.getStatus() == MessageStatus.READ) break;
 | 
				
			||||||
			else {
 | 
								else {
 | 
				
			||||||
				m.setStatus(MessageStatus.READ);
 | 
									m.setStatus(MessageStatus.READ);
 | 
				
			||||||
@@ -74,13 +67,13 @@ public class Chat implements Serializable {
 | 
				
			|||||||
	 *         the status {@code READ}
 | 
						 *         the status {@code READ}
 | 
				
			||||||
	 * @since Envoy Client v0.3-alpha
 | 
						 * @since Envoy Client v0.3-alpha
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public boolean isUnread() { return !model.isEmpty() && model.get(model.size() - 1).getStatus() != MessageStatus.READ; }
 | 
						public boolean isUnread() { return !messages.isEmpty() && messages.get(messages.size() - 1).getStatus() != MessageStatus.READ; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * @return all messages in the current chat
 | 
						 * @return all messages in the current chat
 | 
				
			||||||
	 * @since Envoy Client v0.1-alpha
 | 
						 * @since Envoy Client v0.1-beta
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public Model<Message> getModel() { return model; }
 | 
						public List<Message> getMessages() { return messages; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * @return the recipient of a message
 | 
						 * @return the recipient of a message
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -154,7 +154,7 @@ public abstract class LocalDB {
 | 
				
			|||||||
	 */
 | 
						 */
 | 
				
			||||||
	public Message getMessage(long id) {
 | 
						public Message getMessage(long id) {
 | 
				
			||||||
		for (Chat c : chats)
 | 
							for (Chat c : chats)
 | 
				
			||||||
			for (Message m : c.getModel())
 | 
								for (Message m : c.getMessages())
 | 
				
			||||||
				if (m.getID() == id) return m;
 | 
									if (m.getID() == id) return m;
 | 
				
			||||||
		return null;
 | 
							return null;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,16 +29,20 @@
 | 
				
			|||||||
			vgrow="SOMETIMES" />
 | 
								vgrow="SOMETIMES" />
 | 
				
			||||||
	</rowConstraints>
 | 
						</rowConstraints>
 | 
				
			||||||
	<children>
 | 
						<children>
 | 
				
			||||||
		<ListView fx:id="userList" prefHeight="211.0" prefWidth="300.0"
 | 
							<ListView fx:id="userList" prefHeight="211.0"
 | 
				
			||||||
			GridPane.rowIndex="1" />
 | 
								prefWidth="300.0" GridPane.rowIndex="1"
 | 
				
			||||||
		<Label text="Label" />
 | 
								onMouseClicked="#userListClicked" />
 | 
				
			||||||
		<Button id="settingsButton" mnemonicParsing="false"
 | 
							<Label text="Select a contact to chat with" fx:id="contactLabel" />
 | 
				
			||||||
			text="Settings" GridPane.columnIndex="1" />
 | 
							<Button fx:id="settingsButton" mnemonicParsing="false"
 | 
				
			||||||
 | 
								text="Settings" GridPane.columnIndex="1"
 | 
				
			||||||
 | 
								onAction="#settingsButtonClicked" />
 | 
				
			||||||
		<ListView fx:id="messageList" prefHeight="257.0"
 | 
							<ListView fx:id="messageList" prefHeight="257.0"
 | 
				
			||||||
			prefWidth="300.0" GridPane.columnIndex="1" GridPane.rowIndex="1" />
 | 
								prefWidth="300.0" GridPane.columnIndex="1" GridPane.rowIndex="1" />
 | 
				
			||||||
		<Button id="postButton" mnemonicParsing="false" text="Post"
 | 
							<Button fx:id="postButton" mnemonicParsing="false" text="Post"
 | 
				
			||||||
			GridPane.columnIndex="1" GridPane.rowIndex="2" />
 | 
								GridPane.columnIndex="1" GridPane.rowIndex="2"
 | 
				
			||||||
		<TextArea prefHeight="200.0" prefWidth="200.0"
 | 
								onAction="#postButtonClicked" disable="true" />
 | 
				
			||||||
			GridPane.rowIndex="2" />
 | 
							<TextArea fx:id="messageTextArea" prefHeight="200.0"
 | 
				
			||||||
 | 
								prefWidth="200.0" GridPane.rowIndex="2"
 | 
				
			||||||
 | 
								onKeyReleased="#messageTextUpdated" />
 | 
				
			||||||
	</children>
 | 
						</children>
 | 
				
			||||||
</GridPane>
 | 
					</GridPane>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,11 +1,22 @@
 | 
				
			|||||||
package envoy.client.ui;
 | 
					package envoy.client.ui;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					import java.util.logging.Level;
 | 
				
			||||||
import java.util.logging.Logger;
 | 
					import java.util.logging.Logger;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import envoy.client.data.Chat;
 | 
				
			||||||
 | 
					import envoy.client.data.LocalDB;
 | 
				
			||||||
 | 
					import envoy.client.net.Client;
 | 
				
			||||||
 | 
					import envoy.client.net.WriteProxy;
 | 
				
			||||||
 | 
					import envoy.data.Message;
 | 
				
			||||||
 | 
					import envoy.data.MessageBuilder;
 | 
				
			||||||
 | 
					import envoy.data.User;
 | 
				
			||||||
import envoy.util.EnvoyLog;
 | 
					import envoy.util.EnvoyLog;
 | 
				
			||||||
import javafx.event.ActionEvent;
 | 
					import javafx.collections.FXCollections;
 | 
				
			||||||
import javafx.fxml.FXML;
 | 
					import javafx.fxml.FXML;
 | 
				
			||||||
import javafx.scene.control.ListView;
 | 
					import javafx.scene.control.*;
 | 
				
			||||||
 | 
					import javafx.scene.input.KeyCode;
 | 
				
			||||||
 | 
					import javafx.scene.input.KeyEvent;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Project: <strong>envoy-client</strong><br>
 | 
					 * Project: <strong>envoy-client</strong><br>
 | 
				
			||||||
@@ -18,26 +29,121 @@ import javafx.scene.control.ListView;
 | 
				
			|||||||
public final class ChatSceneController {
 | 
					public final class ChatSceneController {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@FXML
 | 
						@FXML
 | 
				
			||||||
	private ListView messageList;
 | 
						private Label contactLabel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@FXML
 | 
						@FXML
 | 
				
			||||||
	private ListView userList;
 | 
						private ListView<Message> messageList;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@FXML
 | 
				
			||||||
 | 
						private ListView<User> userList;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@FXML
 | 
				
			||||||
 | 
						private Button postButton;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@FXML
 | 
				
			||||||
 | 
						private Button settingsButton;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@FXML
 | 
				
			||||||
 | 
						private TextArea messageTextArea;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private LocalDB		localDB;
 | 
				
			||||||
 | 
						private Client		client;
 | 
				
			||||||
 | 
						private WriteProxy	writeProxy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						private Chat currentChat;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private static final Logger logger = EnvoyLog.getLogger(ChatSceneController.class);
 | 
						private static final Logger logger = EnvoyLog.getLogger(ChatSceneController.class);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@FXML
 | 
						@FXML
 | 
				
			||||||
	public void initialize() {
 | 
						private void initialize() {
 | 
				
			||||||
		messageList.setCellFactory(listView -> new MessageListCell());
 | 
							messageList.setCellFactory(listView -> new MessageListCell());
 | 
				
			||||||
		userList.setCellFactory(listView -> new UserListCell());
 | 
							userList.setCellFactory(listView -> new UserListCell());
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@FXML
 | 
						void initializeData(LocalDB localDB, Client client, WriteProxy writeProxy) {
 | 
				
			||||||
	public void postButtonClicked(ActionEvent e) {
 | 
							this.localDB	= localDB;
 | 
				
			||||||
		logger.info("Post Button clicked.");
 | 
							this.client		= client;
 | 
				
			||||||
 | 
							this.writeProxy	= writeProxy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// TODO: handle offline mode
 | 
				
			||||||
 | 
							userList.getItems().addAll(client.getContacts().getContacts());
 | 
				
			||||||
 | 
							// userList.getItems().addAll(localDB.getChats().stream().map(Chat::getRecipient).collect(Collectors.toList()));
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	@FXML
 | 
						@FXML
 | 
				
			||||||
	public void settingsButtonClicked(ActionEvent e) {
 | 
						private void userListClicked() {
 | 
				
			||||||
		logger.info("Settings Button clicked.");
 | 
							final User user = userList.getSelectionModel().getSelectedItem();
 | 
				
			||||||
 | 
							if (user != null && (currentChat == null || user != currentChat.getRecipient())) {
 | 
				
			||||||
 | 
								contactLabel.setText(user.getName());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Swap observable list
 | 
				
			||||||
 | 
								if (currentChat != null) {
 | 
				
			||||||
 | 
									currentChat.getMessages().clear();
 | 
				
			||||||
 | 
									currentChat.getMessages().addAll(messageList.getItems());
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// LEON: JFC <===> JAVA FRIED CHICKEN <=/=> Java Foundation Classes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Load the chat or create a new one and add it to the LocalDB
 | 
				
			||||||
 | 
								currentChat = localDB.getChats()
 | 
				
			||||||
 | 
									.stream()
 | 
				
			||||||
 | 
									.filter(c -> c.getRecipient() == user)
 | 
				
			||||||
 | 
									.findAny()
 | 
				
			||||||
 | 
									.orElseGet(() -> { var chat = new Chat(user); localDB.getChats().add(chat); return chat; });
 | 
				
			||||||
 | 
								messageList.setItems(FXCollections.observableArrayList(currentChat.getMessages()));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@FXML
 | 
				
			||||||
 | 
						private void postButtonClicked() { postMessage(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@FXML
 | 
				
			||||||
 | 
						private void settingsButtonClicked() { logger.info("Settings Button clicked."); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						@FXML
 | 
				
			||||||
 | 
						private void messageTextUpdated(KeyEvent e) {
 | 
				
			||||||
 | 
							if (e.getCode() == KeyCode.ENTER) postMessage();
 | 
				
			||||||
 | 
							else postButton.setDisable(messageTextArea.getText().isBlank());
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Sends a new message to the server based on the text entered in the
 | 
				
			||||||
 | 
						 * messageTextArea.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @since Envoy Client v0.1-beta
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private void postMessage() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Create and send message
 | 
				
			||||||
 | 
							sendMessage(new MessageBuilder(localDB.getUser().getID(), currentChat.getRecipient().getID(), localDB.getIDGenerator())
 | 
				
			||||||
 | 
								.setText(messageTextArea.getText().strip())
 | 
				
			||||||
 | 
								.build());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Clear text field and disable post button
 | 
				
			||||||
 | 
							messageTextArea.setText("");
 | 
				
			||||||
 | 
							postButton.setDisable(true);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Sends a message to the server.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * @param message the message to send
 | 
				
			||||||
 | 
						 * @since Envoy Client v0.1-beta
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						private void sendMessage(Message message) {
 | 
				
			||||||
 | 
							try {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Send message
 | 
				
			||||||
 | 
								writeProxy.writeMessage(message);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Add message to LocalDB and update UI
 | 
				
			||||||
 | 
								messageList.getItems().add(message);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								// Request a new ID generator if all IDs were used
 | 
				
			||||||
 | 
								if (!localDB.getIDGenerator().hasNext()) client.requestIdGenerator();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							} catch (IOException e) {
 | 
				
			||||||
 | 
								logger.log(Level.SEVERE, "Error sending message", e);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,6 +21,7 @@ public class MessageListCell extends ListCell<Message> {
 | 
				
			|||||||
	@Override
 | 
						@Override
 | 
				
			||||||
	protected void updateItem(Message message, boolean empty) {
 | 
						protected void updateItem(Message message, boolean empty) {
 | 
				
			||||||
		super.updateItem(message, empty);
 | 
							super.updateItem(message, empty);
 | 
				
			||||||
		if (!empty && message != null) { setGraphic(new Label(message.getText())); }
 | 
							if (!empty && message != null) setGraphic(new Label(message.getText()));
 | 
				
			||||||
 | 
							else setGraphic(null);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +1,21 @@
 | 
				
			|||||||
package envoy.client.ui;
 | 
					package envoy.client.ui;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.File;
 | 
				
			||||||
 | 
					import java.io.FileNotFoundException;
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					import java.util.Properties;
 | 
				
			||||||
import java.util.logging.Level;
 | 
					import java.util.logging.Level;
 | 
				
			||||||
import java.util.logging.Logger;
 | 
					import java.util.logging.Logger;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import javax.swing.JOptionPane;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import envoy.client.data.*;
 | 
					import envoy.client.data.*;
 | 
				
			||||||
import envoy.client.net.Client;
 | 
					import envoy.client.net.Client;
 | 
				
			||||||
import envoy.client.net.WriteProxy;
 | 
					import envoy.client.net.WriteProxy;
 | 
				
			||||||
 | 
					import envoy.client.ui.container.LoginDialog;
 | 
				
			||||||
import envoy.data.Message;
 | 
					import envoy.data.Message;
 | 
				
			||||||
 | 
					import envoy.data.User.UserStatus;
 | 
				
			||||||
 | 
					import envoy.exception.EnvoyException;
 | 
				
			||||||
import envoy.util.EnvoyLog;
 | 
					import envoy.util.EnvoyLog;
 | 
				
			||||||
import javafx.application.Application;
 | 
					import javafx.application.Application;
 | 
				
			||||||
import javafx.fxml.FXMLLoader;
 | 
					import javafx.fxml.FXMLLoader;
 | 
				
			||||||
@@ -25,9 +34,9 @@ import javafx.stage.Stage;
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
public final class Startup extends Application {
 | 
					public final class Startup extends Application {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private LocalDB		localDB;
 | 
						private LocalDB			localDB;
 | 
				
			||||||
	private Client		client;
 | 
						private Client			client;
 | 
				
			||||||
	private WriteProxy	writeProxy;
 | 
						private WriteProxy		writeProxy;
 | 
				
			||||||
	private Cache<Message>	cache;
 | 
						private Cache<Message>	cache;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	private static final ClientConfig	config	= ClientConfig.getInstance();
 | 
						private static final ClientConfig	config	= ClientConfig.getInstance();
 | 
				
			||||||
@@ -38,87 +47,81 @@ public final class Startup extends Application {
 | 
				
			|||||||
	 */
 | 
						 */
 | 
				
			||||||
	@Override
 | 
						@Override
 | 
				
			||||||
	public void init() throws Exception {
 | 
						public void init() throws Exception {
 | 
				
			||||||
		// try {
 | 
							try {
 | 
				
			||||||
		// // Load the configuration from client.properties first
 | 
								// Load the configuration from client.properties first
 | 
				
			||||||
		// Properties properties = new Properties();
 | 
								Properties properties = new Properties();
 | 
				
			||||||
		// properties.load(Startup.class.getClassLoader().getResourceAsStream("client.properties"));
 | 
								properties.load(Startup.class.getClassLoader().getResourceAsStream("client.properties"));
 | 
				
			||||||
		// config.load(properties);
 | 
								config.load(properties);
 | 
				
			||||||
		//
 | 
					
 | 
				
			||||||
		// // Override configuration values with command line arguments
 | 
								// Override configuration values with command line arguments
 | 
				
			||||||
		// String[] args = getParameters().getRaw().toArray(new String[0]);
 | 
								String[] args = getParameters().getRaw().toArray(new String[0]);
 | 
				
			||||||
		// if (args.length > 0) config.load(args);
 | 
								if (args.length > 0) config.load(args);
 | 
				
			||||||
		//
 | 
					
 | 
				
			||||||
		// // Check if all mandatory configuration values have been initialized
 | 
								// Check if all mandatory configuration values have been initialized
 | 
				
			||||||
		// if (!config.isInitialized()) throw new EnvoyException("Configuration is not
 | 
								if (!config.isInitialized()) throw new EnvoyException("Configuration is not fully initialized");
 | 
				
			||||||
		// fully initialized");
 | 
							} catch (Exception e) {
 | 
				
			||||||
		// } catch (Exception e) {
 | 
								JOptionPane.showMessageDialog(null, "Error loading configuration values:\n" + e, "Configuration error", JOptionPane.ERROR_MESSAGE);
 | 
				
			||||||
		// JOptionPane.showMessageDialog(null, "Error loading configuration values:\n" +
 | 
								e.printStackTrace();
 | 
				
			||||||
		// e, "Configuration error", JOptionPane.ERROR_MESSAGE);
 | 
								System.exit(1);
 | 
				
			||||||
		// e.printStackTrace();
 | 
							}
 | 
				
			||||||
		// System.exit(1);
 | 
					
 | 
				
			||||||
		// }
 | 
							// Setup logger for the envoy package
 | 
				
			||||||
		//
 | 
							EnvoyLog.initialize(config);
 | 
				
			||||||
		// // Setup logger for the envoy package
 | 
							EnvoyLog.attach("envoy");
 | 
				
			||||||
		// EnvoyLog.initialize(config);
 | 
							EnvoyLog.setFileLevelBarrier(config.getFileLevelBarrier());
 | 
				
			||||||
		// EnvoyLog.attach("envoy");
 | 
							EnvoyLog.setConsoleLevelBarrier(config.getConsoleLevelBarrier());
 | 
				
			||||||
		// EnvoyLog.setFileLevelBarrier(config.getFileLevelBarrier());
 | 
					
 | 
				
			||||||
		// EnvoyLog.setConsoleLevelBarrier(config.getConsoleLevelBarrier());
 | 
							// Initialize the local database
 | 
				
			||||||
		//
 | 
							if (config.isIgnoreLocalDB()) {
 | 
				
			||||||
		// // Initialize the local database
 | 
								localDB = new TransientLocalDB();
 | 
				
			||||||
		// if (config.isIgnoreLocalDB()) {
 | 
								JOptionPane.showMessageDialog(null,
 | 
				
			||||||
		// localDB = new TransientLocalDB();
 | 
										"Ignoring local database.\nMessages will not be saved!",
 | 
				
			||||||
		// JOptionPane.showMessageDialog(null,
 | 
										"Local database warning",
 | 
				
			||||||
		// "Ignoring local database.\nMessages will not be saved!",
 | 
										JOptionPane.WARNING_MESSAGE);
 | 
				
			||||||
		// "Local database warning",
 | 
							} else try {
 | 
				
			||||||
		// JOptionPane.WARNING_MESSAGE);
 | 
								localDB = new PersistentLocalDB(new File(config.getHomeDirectory(), config.getLocalDB().getPath()));
 | 
				
			||||||
		// } else try {
 | 
							} catch (IOException e3) {
 | 
				
			||||||
		// localDB = new PersistentLocalDB(new File(config.getHomeDirectory(),
 | 
								logger.log(Level.SEVERE, "Could not initialize local database", e3);
 | 
				
			||||||
		// config.getLocalDB().getPath()));
 | 
								JOptionPane.showMessageDialog(null, "Could not initialize local database!\n" + e3, "Local database error", JOptionPane.ERROR_MESSAGE);
 | 
				
			||||||
		// } catch (IOException e3) {
 | 
								System.exit(1);
 | 
				
			||||||
		// logger.log(Level.SEVERE, "Could not initialize local database", e3);
 | 
								return;
 | 
				
			||||||
		// JOptionPane.showMessageDialog(null, "Could not initialize local database!\n"
 | 
							}
 | 
				
			||||||
		// + e3, "Local database error", JOptionPane.ERROR_MESSAGE);
 | 
					
 | 
				
			||||||
		// System.exit(1);
 | 
							// Initialize client and unread message cache
 | 
				
			||||||
		// return;
 | 
							client	= new Client();
 | 
				
			||||||
		// }
 | 
							cache	= new Cache<>();
 | 
				
			||||||
		//
 | 
					
 | 
				
			||||||
		// // Initialize client and unread message cache
 | 
							// Try to connect to the server
 | 
				
			||||||
		// client = new Client();
 | 
							new LoginDialog(client, localDB, cache);
 | 
				
			||||||
		// cache = new Cache<>();
 | 
					
 | 
				
			||||||
		//
 | 
							// Set client user in local database
 | 
				
			||||||
		// // Try to connect to the server
 | 
							localDB.setUser(client.getSender());
 | 
				
			||||||
		// new LoginDialog(client, localDB, cache);
 | 
					
 | 
				
			||||||
		//
 | 
							// Initialize chats in local database
 | 
				
			||||||
		// // Set client user in local database
 | 
							try {
 | 
				
			||||||
		// localDB.setUser(client.getSender());
 | 
								localDB.initializeUserStorage();
 | 
				
			||||||
		//
 | 
								localDB.loadUserData();
 | 
				
			||||||
		// // Initialize chats in local database
 | 
							} catch (FileNotFoundException e) {
 | 
				
			||||||
		// try {
 | 
								// The local database file has not yet been created, probably first login
 | 
				
			||||||
		// localDB.initializeUserStorage();
 | 
							} catch (Exception e) {
 | 
				
			||||||
		// localDB.loadUserData();
 | 
								e.printStackTrace();
 | 
				
			||||||
		// } catch (FileNotFoundException e) {
 | 
								JOptionPane.showMessageDialog(null,
 | 
				
			||||||
		// // The local database file has not yet been created, probably first login
 | 
										"Error while loading local database: " + e + "\nChats will not be stored locally.",
 | 
				
			||||||
		// } catch (Exception e) {
 | 
										"Local DB error",
 | 
				
			||||||
		// e.printStackTrace();
 | 
										JOptionPane.WARNING_MESSAGE);
 | 
				
			||||||
		// JOptionPane.showMessageDialog(null,
 | 
							}
 | 
				
			||||||
		// "Error while loading local database: " + e + "\nChats will not be stored
 | 
					
 | 
				
			||||||
		// locally.",
 | 
							// Initialize write proxy
 | 
				
			||||||
		// "Local DB error",
 | 
							writeProxy = client.createWriteProxy(localDB);
 | 
				
			||||||
		// JOptionPane.WARNING_MESSAGE);
 | 
					
 | 
				
			||||||
		// }
 | 
							if (client.isOnline()) {
 | 
				
			||||||
		//
 | 
					
 | 
				
			||||||
		// // Initialize write proxy
 | 
								// Save all users to the local database and flush cache
 | 
				
			||||||
		// writeProxy = client.createWriteProxy(localDB);
 | 
								localDB.setUsers(client.getUsers());
 | 
				
			||||||
		//
 | 
								writeProxy.flushCache();
 | 
				
			||||||
		// if (client.isOnline()) {
 | 
							} else
 | 
				
			||||||
		//
 | 
								// Set all contacts to offline mode
 | 
				
			||||||
		// // Save all users to the local database and flush cache
 | 
								localDB.getUsers().values().stream().filter(u -> u != localDB.getUser()).forEach(u -> u.setStatus(UserStatus.OFFLINE));
 | 
				
			||||||
		// localDB.setUsers(client.getUsers());
 | 
					 | 
				
			||||||
		// writeProxy.flushCache();
 | 
					 | 
				
			||||||
		// } else
 | 
					 | 
				
			||||||
		// // Set all contacts to offline mode
 | 
					 | 
				
			||||||
		// localDB.getUsers().values().stream().filter(u -> u !=
 | 
					 | 
				
			||||||
		// localDB.getUser()).forEach(u -> u.setStatus(UserStatus.OFFLINE));
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
@@ -134,6 +137,8 @@ public final class Startup extends Application {
 | 
				
			|||||||
		stage.setTitle("Envoy");
 | 
							stage.setTitle("Envoy");
 | 
				
			||||||
		stage.getIcons().add(new Image(getClass().getResourceAsStream("/icons/envoy_logo.png")));
 | 
							stage.getIcons().add(new Image(getClass().getResourceAsStream("/icons/envoy_logo.png")));
 | 
				
			||||||
		stage.setScene(chatScene);
 | 
							stage.setScene(chatScene);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							loader.<ChatSceneController>getController().initializeData(localDB, client, writeProxy);
 | 
				
			||||||
		stage.show();
 | 
							stage.show();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Relay unread messages from cache
 | 
							// Relay unread messages from cache
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,7 +1,9 @@
 | 
				
			|||||||
package envoy.client.ui;
 | 
					package envoy.client.ui;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import envoy.data.User;
 | 
					import envoy.data.User;
 | 
				
			||||||
 | 
					import javafx.scene.control.Label;
 | 
				
			||||||
import javafx.scene.control.ListCell;
 | 
					import javafx.scene.control.ListCell;
 | 
				
			||||||
 | 
					import javafx.scene.layout.VBox;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Project: <strong>envoy-client</strong><br>
 | 
					 * Project: <strong>envoy-client</strong><br>
 | 
				
			||||||
@@ -20,7 +22,9 @@ public class UserListCell extends ListCell<User> {
 | 
				
			|||||||
	protected void updateItem(User user, boolean empty) {
 | 
						protected void updateItem(User user, boolean empty) {
 | 
				
			||||||
		super.updateItem(user, empty);
 | 
							super.updateItem(user, empty);
 | 
				
			||||||
		if (!empty && user != null) {
 | 
							if (!empty && user != null) {
 | 
				
			||||||
 | 
								final Label	name	= new Label(user.getName());
 | 
				
			||||||
 | 
								final Label	status	= new Label(user.getStatus().toString());
 | 
				
			||||||
 | 
								setGraphic(new VBox(name, status));
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -259,7 +259,7 @@ public class ChatWindow extends JFrame {
 | 
				
			|||||||
					textPane.setText(currentChat.getRecipient().getName());
 | 
										textPane.setText(currentChat.getRecipient().getName());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					// Update model and scroll down
 | 
										// Update model and scroll down
 | 
				
			||||||
					messageList.setModel(currentChat.getModel());
 | 
										// messageList.setModel(currentChat.getModel());
 | 
				
			||||||
					scrollPane.setChatOpened(true);
 | 
										scrollPane.setChatOpened(true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					messageList.synchronizeModel();
 | 
										messageList.synchronizeModel();
 | 
				
			||||||
@@ -413,7 +413,7 @@ public class ChatWindow extends JFrame {
 | 
				
			|||||||
		EventBus.getInstance().register(MessageCreationEvent.class, evt -> {
 | 
							EventBus.getInstance().register(MessageCreationEvent.class, evt -> {
 | 
				
			||||||
			Message	message	= evt.get();
 | 
								Message	message	= evt.get();
 | 
				
			||||||
			Chat	chat	= localDB.getChats().stream().filter(c -> c.getRecipient().getID() == message.getSenderID()).findFirst().get();
 | 
								Chat	chat	= localDB.getChats().stream().filter(c -> c.getRecipient().getID() == message.getSenderID()).findFirst().get();
 | 
				
			||||||
			chat.appendMessage(message);
 | 
								// chat.appendMessage(message);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Read message and update UI if in current chat
 | 
								// Read message and update UI if in current chat
 | 
				
			||||||
			if (chat == currentChat) readCurrentChat();
 | 
								if (chat == currentChat) readCurrentChat();
 | 
				
			||||||
@@ -428,18 +428,18 @@ public class ChatWindow extends JFrame {
 | 
				
			|||||||
			final MessageStatus	status	= evt.get();
 | 
								final MessageStatus	status	= evt.get();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			for (Chat c : localDB.getChats())
 | 
								for (Chat c : localDB.getChats())
 | 
				
			||||||
				for (Message m : c.getModel())
 | 
									// for (Message m : c.getModel())
 | 
				
			||||||
					if (m.getID() == id) {
 | 
									// if (m.getID() == id) {
 | 
				
			||||||
 | 
									//
 | 
				
			||||||
						// Update message status
 | 
									// // Update message status
 | 
				
			||||||
						m.setStatus(status);
 | 
									// m.setStatus(status);
 | 
				
			||||||
 | 
									//
 | 
				
			||||||
						// Update model and scroll down if current chat
 | 
									// // Update model and scroll down if current chat
 | 
				
			||||||
						if (c == currentChat) {
 | 
									// if (c == currentChat) {
 | 
				
			||||||
							messageList.setModel(currentChat.getModel());
 | 
									// messageList.setModel(currentChat.getModel());
 | 
				
			||||||
							scrollPane.setChatOpened(true);
 | 
									// scrollPane.setChatOpened(true);
 | 
				
			||||||
						} else messageList.synchronizeModel();
 | 
									// } else messageList.synchronizeModel();
 | 
				
			||||||
					}
 | 
									// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			revalidate();
 | 
								revalidate();
 | 
				
			||||||
			repaint();
 | 
								repaint();
 | 
				
			||||||
@@ -584,7 +584,7 @@ public class ChatWindow extends JFrame {
 | 
				
			|||||||
			writeProxy.writeMessage(message);
 | 
								writeProxy.writeMessage(message);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Add message to PersistentLocalDB and update UI
 | 
								// Add message to PersistentLocalDB and update UI
 | 
				
			||||||
			currentChat.appendMessage(message);
 | 
								// currentChat.appendMessage(message);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			// Update UI
 | 
								// Update UI
 | 
				
			||||||
			revalidate();
 | 
								revalidate();
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user