Implemented advanced UI
This commit is contained in:
		| @@ -53,6 +53,19 @@ public class ChatWindow extends JFrame { | |||||||
| 	private PrimaryButton			postButton				= new PrimaryButton("Post"); | 	private PrimaryButton			postButton				= new PrimaryButton("Post"); | ||||||
| 	private PrimaryButton			settingsButton			= new PrimaryButton("Settings"); | 	private PrimaryButton			settingsButton			= new PrimaryButton("Settings"); | ||||||
|  |  | ||||||
|  | 	// Contacts Header | ||||||
|  | 	private JPanel		contactsHeader	= new JPanel(); | ||||||
|  | 	private JTextPane	contactsDisplay	= new JTextPane(); | ||||||
|  | 	private PrimaryButton	addContact		= new PrimaryButton("+"); | ||||||
|  |  | ||||||
|  | 	// Search Contacts | ||||||
|  | 	private JPanel searchPane = new JPanel(); | ||||||
|  | 	private PrimaryButton	cancelButton	= new PrimaryButton("x"); | ||||||
|  | 	private PrimaryTextArea	searchField		= new PrimaryTextArea(space); | ||||||
|  | 	private PrimaryScrollPane	possibleContacts	= new PrimaryScrollPane(); | ||||||
|  | 	private ComponentList<User>	contactList;									// TODO Implement data rendering model as already done with the | ||||||
|  | 																				// messages | ||||||
|  |  | ||||||
| 	private static final Logger logger = EnvoyLog.getLogger(ChatWindow.class.getSimpleName()); | 	private static final Logger logger = EnvoyLog.getLogger(ChatWindow.class.getSimpleName()); | ||||||
|  |  | ||||||
| 	// GUI component spacing | 	// GUI component spacing | ||||||
| @@ -78,9 +91,9 @@ public class ChatWindow extends JFrame { | |||||||
| 		setContentPane(contentPane); | 		setContentPane(contentPane); | ||||||
| 		GridBagLayout gbl_contentPane = new GridBagLayout(); | 		GridBagLayout gbl_contentPane = new GridBagLayout(); | ||||||
| 		gbl_contentPane.columnWidths	= new int[] { 1, 1, 1 }; | 		gbl_contentPane.columnWidths	= new int[] { 1, 1, 1 }; | ||||||
| 		gbl_contentPane.rowHeights		= new int[] { 1, 1, 1 }; | 		gbl_contentPane.rowHeights		= new int[] { 1, 1, 1, 1 }; | ||||||
| 		gbl_contentPane.columnWeights	= new double[] { 0.3, 1.0, 0.1 }; | 		gbl_contentPane.columnWeights	= new double[] { 0.3, 1.0, 0.1 }; | ||||||
| 		gbl_contentPane.rowWeights		= new double[] { 0.05, 1.0, 0.07 }; | 		gbl_contentPane.rowWeights		= new double[] { 0.03, 0.001, 1.0, 0.005 }; | ||||||
| 		contentPane.setLayout(gbl_contentPane); | 		contentPane.setLayout(gbl_contentPane); | ||||||
|  |  | ||||||
| 		// TODO: messageList.setFocusTraversalKeysEnabled(false); | 		// TODO: messageList.setFocusTraversalKeysEnabled(false); | ||||||
| @@ -95,11 +108,13 @@ public class ChatWindow extends JFrame { | |||||||
| 		GridBagConstraints gbc_scrollPane = new GridBagConstraints(); | 		GridBagConstraints gbc_scrollPane = new GridBagConstraints(); | ||||||
| 		gbc_scrollPane.fill			= GridBagConstraints.BOTH; | 		gbc_scrollPane.fill			= GridBagConstraints.BOTH; | ||||||
| 		gbc_scrollPane.gridwidth	= 2; | 		gbc_scrollPane.gridwidth	= 2; | ||||||
|  | 		gbc_scrollPane.gridheight	= 2; | ||||||
| 		gbc_scrollPane.gridx		= 1; | 		gbc_scrollPane.gridx		= 1; | ||||||
| 		gbc_scrollPane.gridy		= 1; | 		gbc_scrollPane.gridy		= 1; | ||||||
|  |  | ||||||
| 		gbc_scrollPane.insets = insets; | 		gbc_scrollPane.insets = insets; | ||||||
| 		contentPane.add(scrollPane, gbc_scrollPane); |  | ||||||
|  | 		drawChatBox(gbc_scrollPane); | ||||||
|  |  | ||||||
| 		// Message enter field | 		// Message enter field | ||||||
| 		messageEnterTextArea.addKeyListener(new KeyAdapter() { | 		messageEnterTextArea.addKeyListener(new KeyAdapter() { | ||||||
| @@ -115,7 +130,7 @@ public class ChatWindow extends JFrame { | |||||||
| 		GridBagConstraints gbc_messageEnterTextfield = new GridBagConstraints(); | 		GridBagConstraints gbc_messageEnterTextfield = new GridBagConstraints(); | ||||||
| 		gbc_messageEnterTextfield.fill	= GridBagConstraints.BOTH; | 		gbc_messageEnterTextfield.fill	= GridBagConstraints.BOTH; | ||||||
| 		gbc_messageEnterTextfield.gridx	= 1; | 		gbc_messageEnterTextfield.gridx	= 1; | ||||||
| 		gbc_messageEnterTextfield.gridy	= 2; | 		gbc_messageEnterTextfield.gridy	= 3; | ||||||
|  |  | ||||||
| 		gbc_messageEnterTextfield.insets = insets; | 		gbc_messageEnterTextfield.insets = insets; | ||||||
|  |  | ||||||
| @@ -126,7 +141,7 @@ public class ChatWindow extends JFrame { | |||||||
|  |  | ||||||
| 		gbc_moveSelectionPostButton.fill	= GridBagConstraints.BOTH; | 		gbc_moveSelectionPostButton.fill	= GridBagConstraints.BOTH; | ||||||
| 		gbc_moveSelectionPostButton.gridx	= 2; | 		gbc_moveSelectionPostButton.gridx	= 2; | ||||||
| 		gbc_moveSelectionPostButton.gridy	= 2; | 		gbc_moveSelectionPostButton.gridy	= 3; | ||||||
|  |  | ||||||
| 		gbc_moveSelectionPostButton.insets = insets; | 		gbc_moveSelectionPostButton.insets = insets; | ||||||
|  |  | ||||||
| @@ -172,22 +187,27 @@ public class ChatWindow extends JFrame { | |||||||
| 				final JList<User>	selectedUserList	= (JList<User>) listSelectionEvent.getSource(); | 				final JList<User>	selectedUserList	= (JList<User>) listSelectionEvent.getSource(); | ||||||
| 				final User			user				= selectedUserList.getSelectedValue(); | 				final User			user				= selectedUserList.getSelectedValue(); | ||||||
|  |  | ||||||
| 				// Select current chat | 				for (int i = 0; i < contentPane.getComponents().length; i++) { | ||||||
| 				currentChat = localDb.getChats().stream().filter(chat -> chat.getRecipient().getId() == user.getId()).findFirst().get(); | 					if (contentPane.getComponent(i).equals(searchPane)) { drawChatBox(gbc_scrollPane); } | ||||||
|  | 				} | ||||||
|  | 				if (user != null) { | ||||||
|  | 					// Select current chat | ||||||
|  | 					currentChat = localDb.getChats().stream().filter(chat -> chat.getRecipient().getId() == user.getId()).findFirst().get(); | ||||||
|  |  | ||||||
| 				// Read current chat | 					// Read current chat | ||||||
| 				readCurrentChat(); | 					readCurrentChat(); | ||||||
|  |  | ||||||
| 				// Set chat title | 					// Set chat title | ||||||
| 				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(); | ||||||
| 				revalidate(); | 					revalidate(); | ||||||
| 				repaint(); | 					repaint(); | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 		}); | 		}); | ||||||
|  |  | ||||||
| @@ -197,15 +217,104 @@ public class ChatWindow extends JFrame { | |||||||
| 		GridBagConstraints gbc_userList = new GridBagConstraints(); | 		GridBagConstraints gbc_userList = new GridBagConstraints(); | ||||||
| 		gbc_userList.fill	= GridBagConstraints.VERTICAL; | 		gbc_userList.fill	= GridBagConstraints.VERTICAL; | ||||||
| 		gbc_userList.gridx	= 0; | 		gbc_userList.gridx	= 0; | ||||||
| 		gbc_userList.gridy	= 1; | 		gbc_userList.gridy	= 2; | ||||||
| 		gbc_userList.anchor	= GridBagConstraints.PAGE_START; | 		gbc_userList.anchor	= GridBagConstraints.PAGE_START; | ||||||
| 		gbc_userList.insets	= insets; | 		gbc_userList.insets	= insets; | ||||||
|  |  | ||||||
| 		applyTheme(Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme())); |  | ||||||
|  |  | ||||||
| 		contentPane.add(userList, gbc_userList); | 		contentPane.add(userList, gbc_userList); | ||||||
| 		contentPane.revalidate(); | 		contentPane.revalidate(); | ||||||
|  |  | ||||||
|  | 		// Contacts Search | ||||||
|  | 		GridBagConstraints gbc_searchPane = new GridBagConstraints(); | ||||||
|  | 		gbc_searchPane.fill			= GridBagConstraints.BOTH; | ||||||
|  | 		gbc_searchPane.gridwidth	= 2; | ||||||
|  | 		gbc_searchPane.gridheight	= 2; | ||||||
|  | 		gbc_searchPane.gridx		= 1; | ||||||
|  | 		gbc_searchPane.gridy		= 1; | ||||||
|  |  | ||||||
|  | 		gbc_searchPane.insets = insets; | ||||||
|  |  | ||||||
|  | 		GridBagLayout gbl_contactsSearch = new GridBagLayout(); | ||||||
|  | 		gbl_contactsSearch.columnWidths		= new int[] { 1, 1 }; | ||||||
|  | 		gbl_contactsSearch.rowHeights		= new int[] { 1, 1 }; | ||||||
|  | 		gbl_contactsSearch.columnWeights	= new double[] { 1, 0.1 }; | ||||||
|  | 		gbl_contactsSearch.rowWeights		= new double[] { 0.001, 1 }; | ||||||
|  | 		searchPane.setLayout(gbl_contactsSearch); | ||||||
|  |  | ||||||
|  | 		GridBagConstraints gbc_searchField = new GridBagConstraints(); | ||||||
|  | 		gbc_searchField.fill	= GridBagConstraints.BOTH; | ||||||
|  | 		gbc_searchField.gridx	= 0; | ||||||
|  | 		gbc_searchField.gridy	= 0; | ||||||
|  | 		gbc_searchField.insets	= new Insets(7, 4, 4, 4); | ||||||
|  | 		 | ||||||
|  | 		searchPane.add(searchField, gbc_searchField); | ||||||
|  | 		 | ||||||
|  | 		GridBagConstraints gbc_cancelButton = new GridBagConstraints(); | ||||||
|  | 		gbc_cancelButton.fill	= GridBagConstraints.BOTH; | ||||||
|  | 		gbc_cancelButton.gridx	= 1; | ||||||
|  | 		gbc_cancelButton.gridy	= 0; | ||||||
|  | 		gbc_cancelButton.insets	= new Insets(7, 4, 4, 4); | ||||||
|  |  | ||||||
|  | 		cancelButton.addActionListener((evt) -> { drawChatBox(gbc_scrollPane); }); | ||||||
|  |  | ||||||
|  | 		searchPane.add(cancelButton, gbc_cancelButton); | ||||||
|  |  | ||||||
|  | 		possibleContacts.setViewportView(contactList); | ||||||
|  |  | ||||||
|  | 		GridBagConstraints gbc_possibleContacts = new GridBagConstraints(); | ||||||
|  | 		gbc_possibleContacts.fill		= GridBagConstraints.BOTH; | ||||||
|  | 		gbc_possibleContacts.gridwidth	= 2; | ||||||
|  | 		gbc_possibleContacts.gridx		= 0; | ||||||
|  | 		gbc_possibleContacts.gridy		= 1; | ||||||
|  |  | ||||||
|  | 		gbc_possibleContacts.insets = insets; | ||||||
|  | 		 | ||||||
|  | 		searchPane.add(possibleContacts, gbc_possibleContacts); | ||||||
|  |  | ||||||
|  | 		// Contacts Header | ||||||
|  |  | ||||||
|  | 		GridBagConstraints gbc_contactsHeader = new GridBagConstraints(); | ||||||
|  | 		gbc_contactsHeader.fill		= GridBagConstraints.BOTH; | ||||||
|  | 		gbc_contactsHeader.gridx	= 0; | ||||||
|  | 		gbc_contactsHeader.gridy	= 1; | ||||||
|  | 		gbc_contactsHeader.insets	= insets; | ||||||
|  |  | ||||||
|  | 		GridBagLayout gbl_contactHeader = new GridBagLayout(); | ||||||
|  | 		gbl_contactHeader.columnWidths	= new int[] { 1, 1 }; | ||||||
|  | 		gbl_contactHeader.rowHeights	= new int[] { 1 }; | ||||||
|  | 		gbl_contactHeader.columnWeights	= new double[] { 1, 1 }; | ||||||
|  | 		gbl_contactHeader.rowWeights	= new double[] { 1 }; | ||||||
|  | 		contactsHeader.setLayout(gbl_contactHeader); | ||||||
|  |  | ||||||
|  | 		contactsDisplay.setEditable(false); | ||||||
|  | 		contactsDisplay.setFont(new Font("Arial", Font.PLAIN, 12)); | ||||||
|  | 		contactsDisplay.setText("Contacts"); | ||||||
|  |  | ||||||
|  | 		GridBagConstraints gbc_contactsDisplay = new GridBagConstraints(); | ||||||
|  | 		gbc_contactsDisplay.fill	= GridBagConstraints.BOTH; | ||||||
|  | 		gbc_contactsDisplay.gridx	= 0; | ||||||
|  | 		gbc_contactsDisplay.gridy	= 0; | ||||||
|  |  | ||||||
|  | 		contactsHeader.add(contactsDisplay, gbc_contactsDisplay); | ||||||
|  |  | ||||||
|  | 		addContact.setFont(new Font("Arial", Font.PLAIN, 15)); | ||||||
|  |  | ||||||
|  | 		GridBagConstraints gbc_addContact = new GridBagConstraints(); | ||||||
|  | 		gbc_addContact.fill		= GridBagConstraints.BOTH; | ||||||
|  | 		gbc_addContact.gridx	= 1; | ||||||
|  | 		gbc_addContact.gridy	= 0; | ||||||
|  | 		gbc_addContact.insets	= insets; | ||||||
|  | 		 | ||||||
|  | 		addContact.addActionListener((evt) -> { drawContactSearch(gbc_searchPane); }); | ||||||
|  |  | ||||||
|  | 		contactsHeader.add(addContact, gbc_addContact); | ||||||
|  |  | ||||||
|  | 		applyTheme(Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme())); | ||||||
|  |  | ||||||
|  | 		contentPane.add(contactsHeader, gbc_contactsHeader); | ||||||
|  | 		contentPane.revalidate(); | ||||||
|  |  | ||||||
| 		// Listen to theme changes | 		// Listen to theme changes | ||||||
| 		EventBus.getInstance().register(ThemeChangeEvent.class, (evt) -> applyTheme((Theme) evt.get())); | 		EventBus.getInstance().register(ThemeChangeEvent.class, (evt) -> applyTheme((Theme) evt.get())); | ||||||
|  |  | ||||||
| @@ -285,6 +394,22 @@ public class ChatWindow extends JFrame { | |||||||
| 		userList.setSelectionBackground(theme.getSelectionColor()); | 		userList.setSelectionBackground(theme.getSelectionColor()); | ||||||
| 		userList.setForeground(theme.getUserNameColor()); | 		userList.setForeground(theme.getUserNameColor()); | ||||||
| 		userList.setBackground(theme.getCellColor()); | 		userList.setBackground(theme.getCellColor()); | ||||||
|  | 		// contacts header | ||||||
|  | 		contactsHeader.setBackground(theme.getCellColor()); | ||||||
|  | 		contactsDisplay.setBackground(theme.getCellColor()); | ||||||
|  | 		contactsDisplay.setForeground(theme.getUserNameColor()); | ||||||
|  | 		addContact.setBackground(theme.getInteractableBackgroundColor()); | ||||||
|  | 		addContact.setForeground(theme.getInteractableForegroundColor()); | ||||||
|  | 		// SearchPane | ||||||
|  | 		searchPane.setBackground(theme.getCellColor()); | ||||||
|  | 		searchField.setBackground(theme.getBackgroundColor()); | ||||||
|  | 		searchField.setForeground(theme.getUserNameColor()); | ||||||
|  | 		cancelButton.setBackground(theme.getInteractableBackgroundColor()); | ||||||
|  | 		cancelButton.setForeground(theme.getInteractableForegroundColor()); | ||||||
|  | 		// TODO: Uncomment if renderer is implemented | ||||||
|  | 		// contactList.setForeground(theme.getMessageColorChat()); | ||||||
|  | 		// contactList.setBackground(theme.getCellColor()); | ||||||
|  | 		possibleContacts.applyTheme(theme); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	private void postMessage() { | 	private void postMessage() { | ||||||
| @@ -352,6 +477,25 @@ public class ChatWindow extends JFrame { | |||||||
| 			logger.log(Level.WARNING, "Couldn't notify server about message status change", e); | 			logger.log(Level.WARNING, "Couldn't notify server about message status change", e); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | 	private void drawChatBox(GridBagConstraints gbc_scrollPane) { | ||||||
|  | 		contentPane.remove(searchPane); | ||||||
|  | 		contentPane.add(scrollPane, gbc_scrollPane); | ||||||
|  | 		contentPane.revalidate(); | ||||||
|  | 		contentPane.repaint(); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	private void drawContactSearch(GridBagConstraints gbc_searchPane) { | ||||||
|  | 		currentChat = null; | ||||||
|  | 		userList.removeSelectionInterval(0, userList.getModel().getSize() - 1); | ||||||
|  | 		messageList.setModel(null); | ||||||
|  | 		textPane.setText(""); | ||||||
|  | 		contentPane.remove(scrollPane); | ||||||
|  | 		contentPane.add(searchPane, gbc_searchPane); | ||||||
|  | 		contentPane.revalidate(); | ||||||
|  | 		contentPane.repaint(); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
| 	 * Sets the {@link Client} used by this {@link ChatWindow}. | 	 * Sets the {@link Client} used by this {@link ChatWindow}. | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| package envoy.client.ui; | package envoy.client.ui; | ||||||
|  |  | ||||||
| import java.awt.Component; | import java.awt.Component; | ||||||
|  | import java.awt.Dimension; | ||||||
|  |  | ||||||
| import javax.swing.JLabel; | import javax.swing.JLabel; | ||||||
| import javax.swing.JList; | import javax.swing.JList; | ||||||
| @@ -41,6 +42,8 @@ public class UserListRenderer extends JLabel implements ListCellRenderer<User> { | |||||||
| 		final String		name	= value.getName(); | 		final String		name	= value.getName(); | ||||||
| 		final UserStatus	status	= value.getStatus(); | 		final UserStatus	status	= value.getStatus(); | ||||||
|  |  | ||||||
|  | 		this.setPreferredSize(new Dimension(100, 35)); | ||||||
|  |  | ||||||
| 		// Getting the UserNameColor of the current theme | 		// Getting the UserNameColor of the current theme | ||||||
| 		String textColor = null; | 		String textColor = null; | ||||||
| 		textColor = Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getUserNameColor().toHex(); | 		textColor = Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getUserNameColor().toHex(); | ||||||
|   | |||||||
| @@ -62,8 +62,10 @@ public class ComponentList<E> extends JPanel { | |||||||
|  |  | ||||||
| 		// Synchronize with new model | 		// Synchronize with new model | ||||||
| 		this.model = model; | 		this.model = model; | ||||||
| 		this.model.setComponentList(this); | 		if (model != null) { | ||||||
| 		synchronizeModel(); | 			this.model.setComponentList(this); | ||||||
|  | 			synchronizeModel(); | ||||||
|  | 		} else removeAll(); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	/** | 	/** | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 DieGurke
					DieGurke