Added custom list cells for the user and message list views
This commit is contained in:
		| @@ -1,15 +1,9 @@ | ||||
| package envoy.client; | ||||
|  | ||||
| import java.awt.EventQueue; | ||||
| import java.util.logging.Logger; | ||||
|  | ||||
| import javax.swing.JFrame; | ||||
|  | ||||
| import envoy.client.data.Settings; | ||||
| import envoy.client.ui.StatusTrayIcon; | ||||
| import envoy.client.ui.container.ChatWindow; | ||||
| import envoy.data.Config; | ||||
| import envoy.exception.EnvoyException; | ||||
| import envoy.util.EnvoyLog; | ||||
|  | ||||
| /** | ||||
| @@ -42,30 +36,29 @@ public class Startup { | ||||
| 	 */ | ||||
| 	public static void main(String[] args) { | ||||
| 		// Display ChatWindow and StatusTrayIcon | ||||
| 		EventQueue.invokeLater(() -> { | ||||
| 			try { | ||||
| 				chatWindow.initContent(client, localDB, writeProxy); | ||||
|  | ||||
| 				// Relay unread messages from cache | ||||
| 				if (cache != null && client.isOnline()) cache.relay(); | ||||
|  | ||||
| 				try { | ||||
| 					new StatusTrayIcon(chatWindow).show(); | ||||
|  | ||||
| 					// If the tray icon is supported and corresponding settings is set, hide the | ||||
| 					// chat window on close | ||||
| 					Settings.getInstance() | ||||
| 						.getItems() | ||||
| 						.get("onCloseMode") | ||||
| 						.setChangeHandler((onCloseMode) -> chatWindow | ||||
| 							.setDefaultCloseOperation((Boolean) onCloseMode ? JFrame.HIDE_ON_CLOSE : JFrame.EXIT_ON_CLOSE)); | ||||
| 				} catch (EnvoyException e) { | ||||
| 					logger.warning("The StatusTrayIcon is not supported on this platform!"); | ||||
| 				} | ||||
| 			} catch (Exception e) { | ||||
| 				e.printStackTrace(); | ||||
| 			} | ||||
| 		}); | ||||
| 		// EventQueue.invokeLater(() -> { | ||||
| 		// try { | ||||
| 		// chatWindow.initContent(client, localDB, writeProxy); | ||||
| 		// | ||||
| 		// | ||||
| 		// try { | ||||
| 		// new StatusTrayIcon(chatWindow).show(); | ||||
| 		// | ||||
| 		// // If the tray icon is supported and corresponding settings is set, hide the | ||||
| 		// // chat window on close | ||||
| 		// Settings.getInstance() | ||||
| 		// .getItems() | ||||
| 		// .get("onCloseMode") | ||||
| 		// .setChangeHandler((onCloseMode) -> chatWindow | ||||
| 		// .setDefaultCloseOperation((Boolean) onCloseMode ? JFrame.HIDE_ON_CLOSE : | ||||
| 		// JFrame.EXIT_ON_CLOSE)); | ||||
| 		// } catch (EnvoyException e) { | ||||
| 		// logger.warning("The StatusTrayIcon is not supported on this platform!"); | ||||
| 		// } | ||||
| 		// } catch (Exception e) { | ||||
| 		// e.printStackTrace(); | ||||
| 		// } | ||||
| 		// }); | ||||
|  | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -8,22 +8,37 @@ | ||||
| <?import javafx.scene.layout.GridPane?> | ||||
| <?import javafx.scene.layout.RowConstraints?> | ||||
|  | ||||
| <GridPane id="recipientLabel" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="envoy.client.ui.ChatSceneController"> | ||||
| <GridPane id="recipientLabel" maxHeight="-Infinity" | ||||
| 	maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" | ||||
| 	prefHeight="400.0" prefWidth="600.0" | ||||
| 	xmlns="http://javafx.com/javafx/11.0.1" | ||||
| 	xmlns:fx="http://javafx.com/fxml/1" | ||||
| 	fx:controller="envoy.client.ui.ChatSceneController"> | ||||
| 	<columnConstraints> | ||||
| 		<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> | ||||
| 		<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" /> | ||||
| 		<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" | ||||
| 			prefWidth="100.0" /> | ||||
| 		<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" | ||||
| 			prefWidth="100.0" /> | ||||
| 	</columnConstraints> | ||||
| 	<rowConstraints> | ||||
| 		<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> | ||||
| 		<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> | ||||
| 		<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" /> | ||||
| 		<RowConstraints minHeight="10.0" prefHeight="30.0" | ||||
| 			vgrow="SOMETIMES" /> | ||||
| 		<RowConstraints minHeight="10.0" prefHeight="30.0" | ||||
| 			vgrow="SOMETIMES" /> | ||||
| 		<RowConstraints minHeight="10.0" prefHeight="30.0" | ||||
| 			vgrow="SOMETIMES" /> | ||||
| 	</rowConstraints> | ||||
| 	<children> | ||||
| 		<ListView id="userList" prefHeight="211.0" prefWidth="300.0" GridPane.rowIndex="1" /> | ||||
| 		<ListView fx:id="userList" prefHeight="211.0" prefWidth="300.0" | ||||
| 			GridPane.rowIndex="1" /> | ||||
| 		<Label text="Label" /> | ||||
| 		<Button id="settingsButton" mnemonicParsing="false" text="Settings" GridPane.columnIndex="1" /> | ||||
| 		<ListView id="messageList" prefHeight="257.0" prefWidth="300.0" GridPane.columnIndex="1" GridPane.rowIndex="1" /> | ||||
| 		<Button id="postButton" mnemonicParsing="false" text="Post" GridPane.columnIndex="1" GridPane.rowIndex="2" /> | ||||
|       <TextArea prefHeight="200.0" prefWidth="200.0" GridPane.rowIndex="2" /> | ||||
| 		<Button id="settingsButton" mnemonicParsing="false" | ||||
| 			text="Settings" GridPane.columnIndex="1" /> | ||||
| 		<ListView fx:id="messageList" prefHeight="257.0" | ||||
| 			prefWidth="300.0" GridPane.columnIndex="1" GridPane.rowIndex="1" /> | ||||
| 		<Button id="postButton" mnemonicParsing="false" text="Post" | ||||
| 			GridPane.columnIndex="1" GridPane.rowIndex="2" /> | ||||
| 		<TextArea prefHeight="200.0" prefWidth="200.0" | ||||
| 			GridPane.rowIndex="2" /> | ||||
| 	</children> | ||||
| </GridPane> | ||||
|   | ||||
| @@ -5,6 +5,7 @@ import java.util.logging.Logger; | ||||
| import envoy.util.EnvoyLog; | ||||
| import javafx.event.ActionEvent; | ||||
| import javafx.fxml.FXML; | ||||
| import javafx.scene.control.ListView; | ||||
|  | ||||
| /** | ||||
|  * Project: <strong>envoy-client</strong><br> | ||||
| @@ -16,8 +17,20 @@ import javafx.fxml.FXML; | ||||
|  */ | ||||
| public final class ChatSceneController { | ||||
|  | ||||
| 	@FXML | ||||
| 	private ListView messageList; | ||||
|  | ||||
| 	@FXML | ||||
| 	private ListView userList; | ||||
|  | ||||
| 	private static final Logger logger = EnvoyLog.getLogger(ChatSceneController.class); | ||||
|  | ||||
| 	@FXML | ||||
| 	public void initialize() { | ||||
| 		messageList.setCellFactory(listView -> new MessageListCell()); | ||||
| 		userList.setCellFactory(listView -> new UserListCell()); | ||||
| 	} | ||||
|  | ||||
| 	@FXML | ||||
| 	public void postButtonClicked(ActionEvent e) { | ||||
| 		logger.info("Post Button clicked."); | ||||
|   | ||||
							
								
								
									
										26
									
								
								src/main/java/envoy/client/ui/MessageListCell.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/main/java/envoy/client/ui/MessageListCell.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| package envoy.client.ui; | ||||
|  | ||||
| import envoy.data.Message; | ||||
| import javafx.scene.control.Label; | ||||
| import javafx.scene.control.ListCell; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Project: <strong>envoy-client</strong><br> | ||||
|  * File: <strong>MessageListCell.java</strong><br> | ||||
|  * Created: <strong>28.03.2020</strong><br> | ||||
|  *  | ||||
|  * @author Kai S. K. Engelbart | ||||
|  * @since Envoy Client v0.1-beta | ||||
|  */ | ||||
| public class MessageListCell extends ListCell<Message> { | ||||
|  | ||||
| 	/** | ||||
| 	 * {@inheritDoc} | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	protected void updateItem(Message message, boolean empty) { | ||||
| 		super.updateItem(message, empty); | ||||
| 		if (!empty && message != null) { setGraphic(new Label(message.getText())); } | ||||
| 	} | ||||
| } | ||||
| @@ -1,21 +1,12 @@ | ||||
| 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.Logger; | ||||
|  | ||||
| import javax.swing.JOptionPane; | ||||
|  | ||||
| import envoy.client.data.*; | ||||
| import envoy.client.net.Client; | ||||
| import envoy.client.net.WriteProxy; | ||||
| import envoy.client.ui.container.LoginDialog; | ||||
| import envoy.data.Message; | ||||
| import envoy.data.User.UserStatus; | ||||
| import envoy.exception.EnvoyException; | ||||
| import envoy.util.EnvoyLog; | ||||
| import javafx.application.Application; | ||||
| import javafx.fxml.FXMLLoader; | ||||
| @@ -37,6 +28,7 @@ public final class Startup extends Application { | ||||
| 	private LocalDB		localDB; | ||||
| 	private Client		client; | ||||
| 	private WriteProxy	writeProxy; | ||||
| 	private Cache<Message>	cache; | ||||
|  | ||||
| 	private static final ClientConfig	config	= ClientConfig.getInstance(); | ||||
| 	private static final Logger			logger	= EnvoyLog.getLogger(Startup.class); | ||||
| @@ -46,81 +38,87 @@ public final class Startup extends Application { | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	public void init() throws Exception { | ||||
| 		try { | ||||
| 			// Load the configuration from client.properties first | ||||
| 			Properties properties = new Properties(); | ||||
| 			properties.load(Startup.class.getClassLoader().getResourceAsStream("client.properties")); | ||||
| 			config.load(properties); | ||||
|  | ||||
| 			// Override configuration values with command line arguments | ||||
| 			String[] args = (String[]) getParameters().getRaw().toArray(); | ||||
| 			if (args.length > 0) config.load(args); | ||||
|  | ||||
| 			// Check if all mandatory configuration values have been initialized | ||||
| 			if (!config.isInitialized()) throw new EnvoyException("Configuration is not fully initialized"); | ||||
| 		} catch (Exception e) { | ||||
| 			JOptionPane.showMessageDialog(null, "Error loading configuration values:\n" + e, "Configuration error", JOptionPane.ERROR_MESSAGE); | ||||
| 			e.printStackTrace(); | ||||
| 			System.exit(1); | ||||
| 		} | ||||
|  | ||||
| 		// Setup logger for the envoy package | ||||
| 		EnvoyLog.initialize(config); | ||||
| 		EnvoyLog.attach("envoy"); | ||||
| 		EnvoyLog.setFileLevelBarrier(config.getFileLevelBarrier()); | ||||
| 		EnvoyLog.setConsoleLevelBarrier(config.getConsoleLevelBarrier()); | ||||
|  | ||||
| 		// Initialize the local database | ||||
| 		if (config.isIgnoreLocalDB()) { | ||||
| 			localDB = new TransientLocalDB(); | ||||
| 			JOptionPane.showMessageDialog(null, | ||||
| 					"Ignoring local database.\nMessages will not be saved!", | ||||
| 					"Local database warning", | ||||
| 					JOptionPane.WARNING_MESSAGE); | ||||
| 		} else try { | ||||
| 			localDB = new PersistentLocalDB(new File(config.getHomeDirectory(), config.getLocalDB().getPath())); | ||||
| 		} catch (IOException e3) { | ||||
| 			logger.log(Level.SEVERE, "Could not initialize local database", e3); | ||||
| 			JOptionPane.showMessageDialog(null, "Could not initialize local database!\n" + e3, "Local database error", JOptionPane.ERROR_MESSAGE); | ||||
| 			System.exit(1); | ||||
| 			return; | ||||
| 		} | ||||
|  | ||||
| 		// Initialize client and unread message cache | ||||
| 		Client			client	= new Client(); | ||||
| 		Cache<Message>	cache	= new Cache<>(); | ||||
|  | ||||
| 		// Try to connect to the server | ||||
| 		new LoginDialog(client, localDB, cache); | ||||
|  | ||||
| 		// Set client user in local database | ||||
| 		localDB.setUser(client.getSender()); | ||||
|  | ||||
| 		// Initialize chats in local database | ||||
| 		try { | ||||
| 			localDB.initializeUserStorage(); | ||||
| 			localDB.loadUserData(); | ||||
| 		} catch (FileNotFoundException e) { | ||||
| 			// The local database file has not yet been created, probably first login | ||||
| 		} catch (Exception e) { | ||||
| 			e.printStackTrace(); | ||||
| 			JOptionPane.showMessageDialog(null, | ||||
| 					"Error while loading local database: " + e + "\nChats will not be stored locally.", | ||||
| 					"Local DB error", | ||||
| 					JOptionPane.WARNING_MESSAGE); | ||||
| 		} | ||||
|  | ||||
| 		// Initialize write proxy | ||||
| 		writeProxy = client.createWriteProxy(localDB); | ||||
|  | ||||
| 		if (client.isOnline()) { | ||||
|  | ||||
| 			// Save all users to the local database and flush cache | ||||
| 			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)); | ||||
| 		// try { | ||||
| 		// // Load the configuration from client.properties first | ||||
| 		// Properties properties = new Properties(); | ||||
| 		// properties.load(Startup.class.getClassLoader().getResourceAsStream("client.properties")); | ||||
| 		// config.load(properties); | ||||
| 		// | ||||
| 		// // Override configuration values with command line arguments | ||||
| 		// String[] args = getParameters().getRaw().toArray(new String[0]); | ||||
| 		// if (args.length > 0) config.load(args); | ||||
| 		// | ||||
| 		// // Check if all mandatory configuration values have been initialized | ||||
| 		// if (!config.isInitialized()) throw new EnvoyException("Configuration is not | ||||
| 		// fully initialized"); | ||||
| 		// } catch (Exception e) { | ||||
| 		// JOptionPane.showMessageDialog(null, "Error loading configuration values:\n" + | ||||
| 		// e, "Configuration error", JOptionPane.ERROR_MESSAGE); | ||||
| 		// e.printStackTrace(); | ||||
| 		// System.exit(1); | ||||
| 		// } | ||||
| 		// | ||||
| 		// // Setup logger for the envoy package | ||||
| 		// EnvoyLog.initialize(config); | ||||
| 		// EnvoyLog.attach("envoy"); | ||||
| 		// EnvoyLog.setFileLevelBarrier(config.getFileLevelBarrier()); | ||||
| 		// EnvoyLog.setConsoleLevelBarrier(config.getConsoleLevelBarrier()); | ||||
| 		// | ||||
| 		// // Initialize the local database | ||||
| 		// if (config.isIgnoreLocalDB()) { | ||||
| 		// localDB = new TransientLocalDB(); | ||||
| 		// JOptionPane.showMessageDialog(null, | ||||
| 		// "Ignoring local database.\nMessages will not be saved!", | ||||
| 		// "Local database warning", | ||||
| 		// JOptionPane.WARNING_MESSAGE); | ||||
| 		// } else try { | ||||
| 		// localDB = new PersistentLocalDB(new File(config.getHomeDirectory(), | ||||
| 		// config.getLocalDB().getPath())); | ||||
| 		// } catch (IOException e3) { | ||||
| 		// logger.log(Level.SEVERE, "Could not initialize local database", e3); | ||||
| 		// JOptionPane.showMessageDialog(null, "Could not initialize local database!\n" | ||||
| 		// + e3, "Local database error", JOptionPane.ERROR_MESSAGE); | ||||
| 		// System.exit(1); | ||||
| 		// return; | ||||
| 		// } | ||||
| 		// | ||||
| 		// // Initialize client and unread message cache | ||||
| 		// client = new Client(); | ||||
| 		// cache = new Cache<>(); | ||||
| 		// | ||||
| 		// // Try to connect to the server | ||||
| 		// new LoginDialog(client, localDB, cache); | ||||
| 		// | ||||
| 		// // Set client user in local database | ||||
| 		// localDB.setUser(client.getSender()); | ||||
| 		// | ||||
| 		// // Initialize chats in local database | ||||
| 		// try { | ||||
| 		// localDB.initializeUserStorage(); | ||||
| 		// localDB.loadUserData(); | ||||
| 		// } catch (FileNotFoundException e) { | ||||
| 		// // The local database file has not yet been created, probably first login | ||||
| 		// } catch (Exception e) { | ||||
| 		// e.printStackTrace(); | ||||
| 		// JOptionPane.showMessageDialog(null, | ||||
| 		// "Error while loading local database: " + e + "\nChats will not be stored | ||||
| 		// locally.", | ||||
| 		// "Local DB error", | ||||
| 		// JOptionPane.WARNING_MESSAGE); | ||||
| 		// } | ||||
| 		// | ||||
| 		// // Initialize write proxy | ||||
| 		// writeProxy = client.createWriteProxy(localDB); | ||||
| 		// | ||||
| 		// if (client.isOnline()) { | ||||
| 		// | ||||
| 		// // Save all users to the local database and flush cache | ||||
| 		// 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)); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| @@ -137,6 +135,9 @@ public final class Startup extends Application { | ||||
| 		stage.getIcons().add(new Image(getClass().getResourceAsStream("/icons/envoy_logo.png"))); | ||||
| 		stage.setScene(chatScene); | ||||
| 		stage.show(); | ||||
|  | ||||
| 		// Relay unread messages from cache | ||||
| 		if (cache != null && client.isOnline()) cache.relay(); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
|   | ||||
							
								
								
									
										26
									
								
								src/main/java/envoy/client/ui/UserListCell.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/main/java/envoy/client/ui/UserListCell.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | ||||
| package envoy.client.ui; | ||||
|  | ||||
| import envoy.data.User; | ||||
| import javafx.scene.control.ListCell; | ||||
|  | ||||
| /** | ||||
|  * Project: <strong>envoy-client</strong><br> | ||||
|  * File: <strong>UserListCell.java</strong><br> | ||||
|  * Created: <strong>28.03.2020</strong><br> | ||||
|  *  | ||||
|  * @author Kai S. K. Engelbart | ||||
|  * @since Envoy Client v0.1-beta | ||||
|  */ | ||||
| public class UserListCell extends ListCell<User> { | ||||
|  | ||||
| 	/** | ||||
| 	 * {@inheritDoc} | ||||
| 	 */ | ||||
| 	@Override | ||||
| 	protected void updateItem(User user, boolean empty) { | ||||
| 		super.updateItem(user, empty); | ||||
| 		if (!empty && user != null) { | ||||
|  | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user