Fixed bug adding a line break when sending via enter
* additionally merged full input of f/enhanced_component_list with the current working state of f/forward_messages: * implemented setting of colors (theming) for ContextMenu * renamed messageTextColor to textColor
This commit is contained in:
		@@ -1,4 +1,4 @@
 | 
			
		||||
package envoy.client.ui;
 | 
			
		||||
package envoy.client;
 | 
			
		||||
 | 
			
		||||
import java.awt.EventQueue;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
@@ -15,6 +15,7 @@ import javax.swing.SwingUtilities;
 | 
			
		||||
import envoy.client.data.*;
 | 
			
		||||
import envoy.client.net.Client;
 | 
			
		||||
import envoy.client.net.WriteProxy;
 | 
			
		||||
import envoy.client.ui.StatusTrayIcon;
 | 
			
		||||
import envoy.client.ui.container.ChatWindow;
 | 
			
		||||
import envoy.client.ui.container.LoginDialog;
 | 
			
		||||
import envoy.data.Config;
 | 
			
		||||
@@ -129,7 +130,7 @@ public class Startup {
 | 
			
		||||
			// Save all users to the local database and flush cache
 | 
			
		||||
			localDb.setUsers(client.getUsers());
 | 
			
		||||
			writeProxy.flushCache();
 | 
			
		||||
		} else 
 | 
			
		||||
		} else
 | 
			
		||||
			// Set all contacts to offline mode
 | 
			
		||||
			localDb.getUsers().values().stream().filter(u -> u != localDb.getUser()).forEach(u -> u.setStatus(UserStatus.OFFLINE));
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										9
									
								
								src/main/java/envoy/client/ui/Theme.java
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										9
									
								
								src/main/java/envoy/client/ui/Theme.java
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							@@ -29,7 +29,8 @@ public class Theme implements Serializable {
 | 
			
		||||
	 *                                    elements
 | 
			
		||||
	 * @param interactableBackgroundColor the color of interactable background UI
 | 
			
		||||
	 *                                    elements
 | 
			
		||||
	 * @param messageColorChat            the color of chat messages
 | 
			
		||||
	 * @param textColor                   the color normal text should be displayed
 | 
			
		||||
	 *                                    in
 | 
			
		||||
	 * @param dateColorChat               the color of chat message metadata
 | 
			
		||||
	 * @param selectionColor              the section color
 | 
			
		||||
	 * @param typingMessageColor          the color of currently typed messages
 | 
			
		||||
@@ -37,7 +38,7 @@ public class Theme implements Serializable {
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public Theme(String themeName, Color backgroundColor, Color cellColor, Color interactableForegroundColor, Color interactableBackgroundColor,
 | 
			
		||||
			Color messageColorChat, Color dateColorChat, Color selectionColor, Color typingMessageColor, Color userNameColor) {
 | 
			
		||||
			Color textColor, Color dateColorChat, Color selectionColor, Color typingMessageColor, Color userNameColor) {
 | 
			
		||||
 | 
			
		||||
		this.themeName = themeName;
 | 
			
		||||
 | 
			
		||||
@@ -45,7 +46,7 @@ public class Theme implements Serializable {
 | 
			
		||||
		colors.put("cellColor", cellColor);
 | 
			
		||||
		colors.put("interactableForegroundColor", interactableForegroundColor);
 | 
			
		||||
		colors.put("interactableBackgroundColor", interactableBackgroundColor);
 | 
			
		||||
		colors.put("messageColorChat", messageColorChat);
 | 
			
		||||
		colors.put("textColor", textColor);
 | 
			
		||||
		colors.put("dateColorChat", dateColorChat);
 | 
			
		||||
		colors.put("selectionColor", selectionColor);
 | 
			
		||||
		colors.put("typingMessageColor", typingMessageColor);
 | 
			
		||||
@@ -89,7 +90,7 @@ public class Theme implements Serializable {
 | 
			
		||||
	 *         displayed
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public Color getMessageTextColor() { return colors.get("messageColorChat"); }
 | 
			
		||||
	public Color getTextColor() { return colors.get("textColor"); }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return the {@link Color} in which the creation date of a message should be
 | 
			
		||||
 
 | 
			
		||||
@@ -22,10 +22,12 @@ import envoy.client.event.MessageCreationEvent;
 | 
			
		||||
import envoy.client.event.ThemeChangeEvent;
 | 
			
		||||
import envoy.client.net.Client;
 | 
			
		||||
import envoy.client.net.WriteProxy;
 | 
			
		||||
import envoy.client.ui.*;
 | 
			
		||||
import envoy.client.ui.Theme;
 | 
			
		||||
import envoy.client.ui.list.ComponentList;
 | 
			
		||||
import envoy.client.ui.list.ComponentList.SelectionMode;
 | 
			
		||||
import envoy.client.ui.list.Model;
 | 
			
		||||
import envoy.client.ui.list_component.ContactSearchComponent;
 | 
			
		||||
import envoy.client.ui.list_component.MessageComponent;
 | 
			
		||||
import envoy.client.ui.primary.PrimaryButton;
 | 
			
		||||
import envoy.client.ui.primary.PrimaryScrollPane;
 | 
			
		||||
import envoy.client.ui.primary.PrimaryTextArea;
 | 
			
		||||
@@ -490,7 +492,7 @@ public class ChatWindow extends JFrame {
 | 
			
		||||
		contentPane.setBackground(theme.getBackgroundColor());
 | 
			
		||||
		contentPane.setForeground(theme.getUserNameColor());
 | 
			
		||||
		// messageList
 | 
			
		||||
		messageList.setForeground(theme.getMessageTextColor());
 | 
			
		||||
		messageList.setForeground(theme.getTextColor());
 | 
			
		||||
		messageList.setBackground(theme.getCellColor());
 | 
			
		||||
		// scrollPane
 | 
			
		||||
		scrollPane.applyTheme(theme);
 | 
			
		||||
@@ -525,7 +527,7 @@ public class ChatWindow extends JFrame {
 | 
			
		||||
		searchField.setForeground(theme.getUserNameColor());
 | 
			
		||||
		cancelButton.setBackground(theme.getInteractableBackgroundColor());
 | 
			
		||||
		cancelButton.setForeground(theme.getInteractableForegroundColor());
 | 
			
		||||
		contactList.setForeground(theme.getMessageTextColor());
 | 
			
		||||
		contactList.setForeground(theme.getTextColor());
 | 
			
		||||
		contactList.setBackground(theme.getCellColor());
 | 
			
		||||
		scrollForPossibleContacts.applyTheme(theme);
 | 
			
		||||
	}
 | 
			
		||||
@@ -540,11 +542,15 @@ public class ChatWindow extends JFrame {
 | 
			
		||||
			JOptionPane.showMessageDialog(this, "Please select a recipient!", "Cannot send message", JOptionPane.INFORMATION_MESSAGE);
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		String text = messageEnterTextArea.getText().trim();
 | 
			
		||||
		if (!text.isEmpty()) checkMessageTextLength();
 | 
			
		||||
		// delete final line break, if present (especially if "Enter" is used to send
 | 
			
		||||
		// the message)
 | 
			
		||||
		if (text.endsWith(System.getProperty("line.separator"))) text = text.substring(0, text.lastIndexOf(System.getProperty("line.separator")));
 | 
			
		||||
 | 
			
		||||
		if (!messageEnterTextArea.getText().isEmpty()) checkMessageTextLength();
 | 
			
		||||
		// Create message
 | 
			
		||||
		final Message message = new MessageBuilder(localDb.getUser().getId(), currentChat.getRecipient().getId(), localDb.getIdGenerator())
 | 
			
		||||
			.setText(messageEnterTextArea.getText())
 | 
			
		||||
			.setText(text)
 | 
			
		||||
			.build();
 | 
			
		||||
		sendMessage(message);
 | 
			
		||||
		// Clear text field
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								src/main/java/envoy/client/ui/container/ContactsChooserDialog.java
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										10
									
								
								src/main/java/envoy/client/ui/container/ContactsChooserDialog.java
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							@@ -14,7 +14,6 @@ import javax.swing.border.EmptyBorder;
 | 
			
		||||
import envoy.client.data.Settings;
 | 
			
		||||
import envoy.client.net.Client;
 | 
			
		||||
import envoy.client.ui.Theme;
 | 
			
		||||
import envoy.client.ui.UserComponent;
 | 
			
		||||
import envoy.client.ui.list.ComponentList;
 | 
			
		||||
import envoy.client.ui.list.ComponentList.SelectionMode;
 | 
			
		||||
import envoy.client.ui.list.Model;
 | 
			
		||||
@@ -35,7 +34,7 @@ public class ContactsChooserDialog extends JDialog {
 | 
			
		||||
 | 
			
		||||
	private static final long serialVersionUID = -5774558118579032256L;
 | 
			
		||||
 | 
			
		||||
	private ComponentList<User>	contactList		= new ComponentList<User>().setRenderer(UserComponent::new);
 | 
			
		||||
	private ComponentList<User>	contactList		= new ComponentList<>();
 | 
			
		||||
	private JButton				okButton		= new JButton("Ok");
 | 
			
		||||
	private JButton				cancelButton	= new JButton("Cancel");
 | 
			
		||||
 | 
			
		||||
@@ -77,7 +76,7 @@ public class ContactsChooserDialog extends JDialog {
 | 
			
		||||
		dialog.setVisible(true);
 | 
			
		||||
		dialog.repaint();
 | 
			
		||||
		dialog.revalidate();
 | 
			
		||||
		return results;
 | 
			
		||||
		return results.size() > 0 ? results : null;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
@@ -85,12 +84,11 @@ public class ContactsChooserDialog extends JDialog {
 | 
			
		||||
	 */
 | 
			
		||||
	private ContactsChooserDialog() {
 | 
			
		||||
		contactList.setSelectionMode(SelectionMode.MULTIPLE);
 | 
			
		||||
		contactList
 | 
			
		||||
			.setSelectionHandler((user, comp, isSelected) -> comp.setBackground(isSelected ? theme.getSelectionColor() : theme.getCellColor()));
 | 
			
		||||
		// setBounds(100, 100, 450, 300);
 | 
			
		||||
		setModal(true);
 | 
			
		||||
		getContentPane().setLayout(new BorderLayout());
 | 
			
		||||
		setBackground(theme.getBackgroundColor());
 | 
			
		||||
		setForeground(theme.getMessageTextColor());
 | 
			
		||||
		setForeground(theme.getTextColor());
 | 
			
		||||
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
 | 
			
		||||
		getContentPane().add(contentPanel, BorderLayout.CENTER);
 | 
			
		||||
		contentPanel.setLayout(new BorderLayout(0, 0));
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										246
									
								
								src/main/java/envoy/client/ui/container/ContextMenu.java
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										246
									
								
								src/main/java/envoy/client/ui/container/ContextMenu.java
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,246 @@
 | 
			
		||||
package envoy.client.ui.container;
 | 
			
		||||
 | 
			
		||||
import java.awt.Color;
 | 
			
		||||
import java.awt.Component;
 | 
			
		||||
import java.awt.event.ActionListener;
 | 
			
		||||
import java.awt.event.MouseAdapter;
 | 
			
		||||
import java.awt.event.MouseEvent;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import javax.swing.*;
 | 
			
		||||
 | 
			
		||||
import envoy.client.ui.Theme;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This class defines a menu that will be automatically called if
 | 
			
		||||
 * {@link MouseEvent#isPopupTrigger()} returns true for the parent component.
 | 
			
		||||
 * The user has the possibility to directly add actions to be performed when
 | 
			
		||||
 * clicking on the element with the selected String. Additionally, for each
 | 
			
		||||
 * element an {@link Icon} can be added, but it must not be.
 | 
			
		||||
 * If the key(text) of an element starts with one of the predefined values, a
 | 
			
		||||
 * special component will be called: either a {@link JRadioButtonMenuItem}, a
 | 
			
		||||
 * {@link JCheckBoxMenuItem} or a {@link JMenu} will be created.<br>
 | 
			
		||||
 * <br>
 | 
			
		||||
 * Project: <strong>envoy-client</strong><br>
 | 
			
		||||
 * File: <strong>ContextMenu.java</strong><br>
 | 
			
		||||
 * Created: <strong>17 Mar 2020</strong><br>
 | 
			
		||||
 *
 | 
			
		||||
 * @author Leon Hofmeister
 | 
			
		||||
 * @since Envoy v0.1-beta
 | 
			
		||||
 */
 | 
			
		||||
public class ContextMenu extends JPopupMenu {
 | 
			
		||||
 | 
			
		||||
	private static final long serialVersionUID = 2177146471226992104L;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * If a key starts with this String, a {@link JCheckBoxMenuItem} will be created
 | 
			
		||||
	 */
 | 
			
		||||
	public static final String	checkboxMenuItem	= "ChBoMI";
 | 
			
		||||
	/**
 | 
			
		||||
	 * If a key starts with this String, a {@link JRadioButtonMenuItem} will be
 | 
			
		||||
	 * created
 | 
			
		||||
	 */
 | 
			
		||||
	public static final String	radioButtonMenuItem	= "RaBuMI";
 | 
			
		||||
	/**
 | 
			
		||||
	 * If a key starts with this String, a {@link JMenu} will be created
 | 
			
		||||
	 */
 | 
			
		||||
	public static final String	subMenuItem			= "SubMI";
 | 
			
		||||
 | 
			
		||||
	private Map<String, ActionListener>	items		= new HashMap<>();
 | 
			
		||||
	private Map<String, Icon>			icons		= new HashMap<>();
 | 
			
		||||
	private Map<String, Integer>		mnemonics	= new HashMap<>();
 | 
			
		||||
 | 
			
		||||
	private ButtonGroup	radioButtonGroup	= new ButtonGroup();
 | 
			
		||||
	private boolean		built				= false;
 | 
			
		||||
	private boolean		visible				= false;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param parent the component which will call this
 | 
			
		||||
	 *               {@link ContextMenu}
 | 
			
		||||
	 * @since Envoy v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public ContextMenu(Component parent) { setInvoker(parent); }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param label            the string that a UI may use to display as a title
 | 
			
		||||
	 *                         for the pop-up menu
 | 
			
		||||
	 * @param parent           the component which will call this
 | 
			
		||||
	 *                         {@link ContextMenu}
 | 
			
		||||
	 * @param itemsWithActions a map of all strings to be displayed with according
 | 
			
		||||
	 *                         actions
 | 
			
		||||
	 * @param itemIcons        the icons to be displayed before a name, if wanted.
 | 
			
		||||
	 *                         Only keys in here will have an Icon displayed. More
 | 
			
		||||
	 *                         precisely, all keys here not included in the first
 | 
			
		||||
	 *                         map will be thrown out.
 | 
			
		||||
	 * @param itemMnemonics    the keyboard shortcuts that need to be pressed to
 | 
			
		||||
	 *                         automatically execute the {@link JMenuItem} with the
 | 
			
		||||
	 *                         given text
 | 
			
		||||
	 * @since Envoy v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public ContextMenu(String label, Component parent, Map<String, ActionListener> itemsWithActions, Map<String, Icon> itemIcons,
 | 
			
		||||
			Map<String, Integer> itemMnemonics) {
 | 
			
		||||
		super(label);
 | 
			
		||||
		setInvoker(parent);
 | 
			
		||||
		this.items		= (itemsWithActions != null) ? itemsWithActions : items;
 | 
			
		||||
		this.icons		= (itemIcons != null) ? itemIcons : icons;
 | 
			
		||||
		this.mnemonics	= (itemMnemonics != null) ? itemMnemonics : mnemonics;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Prepares the PopupMenu to be displayed. Should only be used once all map
 | 
			
		||||
	 * values have been set.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return this instance of {@link ContextMenu} to allow chaining behind the
 | 
			
		||||
	 *         constructor
 | 
			
		||||
	 * @since Envoy v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public ContextMenu build() {
 | 
			
		||||
		items.forEach((text, action) -> {
 | 
			
		||||
			// case radio button wanted
 | 
			
		||||
			AbstractButton item;
 | 
			
		||||
			if (text.startsWith(radioButtonMenuItem)) {
 | 
			
		||||
				item = new JRadioButtonMenuItem(text.substring(radioButtonMenuItem.length()), icons.containsKey(text) ? icons.get(text) : null);
 | 
			
		||||
				radioButtonGroup.add(item);
 | 
			
		||||
				// case check box wanted
 | 
			
		||||
			} else if (text.startsWith(checkboxMenuItem))
 | 
			
		||||
				item = new JCheckBoxMenuItem(text.substring(checkboxMenuItem.length()), icons.containsKey(text) ? icons.get(text) : null);
 | 
			
		||||
			// case sub-menu wanted
 | 
			
		||||
			else if (text.startsWith(subMenuItem)) item = new JMenu(text.substring(subMenuItem.length()));
 | 
			
		||||
			else // normal JMenuItem wanted
 | 
			
		||||
				item = new JMenuItem(text, icons.containsKey(text) ? icons.get(text) : null);
 | 
			
		||||
			item.addActionListener(action);
 | 
			
		||||
			if (mnemonics.containsKey(text)) item.setMnemonic(mnemonics.get(text));
 | 
			
		||||
			add(item);
 | 
			
		||||
		});
 | 
			
		||||
		getInvoker().addMouseListener(getShowingListener());
 | 
			
		||||
		built = true;
 | 
			
		||||
		return this;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param label the string that a UI may use to display as a title for the
 | 
			
		||||
	 *              pop-up menu.
 | 
			
		||||
	 * @since Envoy v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public ContextMenu(String label) { super(label); }
 | 
			
		||||
 | 
			
		||||
	private MouseAdapter getShowingListener() {
 | 
			
		||||
		return new MouseAdapter() {
 | 
			
		||||
 | 
			
		||||
			@Override
 | 
			
		||||
			public void mouseClicked(MouseEvent e) { action(e); }
 | 
			
		||||
 | 
			
		||||
			@Override
 | 
			
		||||
			public void mousePressed(MouseEvent e) { action(e); }
 | 
			
		||||
 | 
			
		||||
			@Override
 | 
			
		||||
			public void mouseReleased(MouseEvent e) { action(e); }
 | 
			
		||||
 | 
			
		||||
			private void action(MouseEvent e) {
 | 
			
		||||
				if (!built) build();
 | 
			
		||||
				if (e.isPopupTrigger()) {
 | 
			
		||||
					// hides the menu if already visible
 | 
			
		||||
					visible = !visible;
 | 
			
		||||
					if (visible) show(e.getComponent(), e.getX(), e.getY());
 | 
			
		||||
					else setVisible(false);
 | 
			
		||||
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		};
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Removes all subcomponents of this menu.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @since Envoy v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public void clear() {
 | 
			
		||||
		removeAll();
 | 
			
		||||
		items		= new HashMap<>();
 | 
			
		||||
		icons		= new HashMap<>();
 | 
			
		||||
		mnemonics	= new HashMap<>();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return the items
 | 
			
		||||
	 * @since Envoy v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public Map<String, ActionListener> getItems() { return items; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param items the items with the displayed text and the according action to
 | 
			
		||||
	 *              take once called
 | 
			
		||||
	 * @since Envoy v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public void setItems(Map<String, ActionListener> items) { this.items = items; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return the icons
 | 
			
		||||
	 * @since Envoy v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public Map<String, Icon> getIcons() { return icons; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param icons the icons to set
 | 
			
		||||
	 * @since Envoy v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public void setIcons(Map<String, Icon> icons) { this.icons = icons; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return the mnemonics (the keyboard shortcuts that automatically execute the
 | 
			
		||||
	 *         command for a {@link JMenuItem} with corresponding text)
 | 
			
		||||
	 * @since Envoy v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public Map<String, Integer> getMnemonics() { return mnemonics; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param mnemonics the keyboard shortcuts that need to be pressed to
 | 
			
		||||
	 *                  automatically execute the {@link JMenuItem} with the given
 | 
			
		||||
	 *                  text
 | 
			
		||||
	 * @since Envoy v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public void setMnemonics(Map<String, Integer> mnemonics) { this.mnemonics = mnemonics; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * {@inheritDoc}<br>
 | 
			
		||||
	 * Additionally sets the foreground of all subcomponents of this
 | 
			
		||||
	 * {@link ContextMenu}.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @since Envoy v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	@Override
 | 
			
		||||
	public void setForeground(Color color) {
 | 
			
		||||
		super.setForeground(color);
 | 
			
		||||
		for (MenuElement element : getSubElements())
 | 
			
		||||
			((Component) element).setForeground(color);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * {@inheritDoc}<br>
 | 
			
		||||
	 * Additionally sets the background of all subcomponents of this
 | 
			
		||||
	 * {@link ContextMenu}.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @since Envoy v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	@Override
 | 
			
		||||
	public void setBackground(Color color) {
 | 
			
		||||
		super.setBackground(color);
 | 
			
		||||
		for (MenuElement element : getSubElements())
 | 
			
		||||
			((Component) element).setBackground(color);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Sets the fore- and background of all elements contained in this
 | 
			
		||||
	 * {@link ContextMenu}
 | 
			
		||||
	 * This method is to be only used by Envoy as {@link Theme} is an
 | 
			
		||||
	 * Envoy-exclusive object.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param theme the theme to use
 | 
			
		||||
	 * @since Envoy v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	protected void applyTheme(Theme theme) {
 | 
			
		||||
		setBackground(theme.getInteractableBackgroundColor());
 | 
			
		||||
		setForeground(theme.getTextColor());
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -10,6 +10,7 @@ import javax.swing.JComponent;
 | 
			
		||||
 * Created: <strong>21.03.2020</strong>
 | 
			
		||||
 *
 | 
			
		||||
 * @author Kai S. K. Engelbart
 | 
			
		||||
 * @param <E> the type of the underlying {@link ComponentList}
 | 
			
		||||
 * @since Envoy v0.1-beta
 | 
			
		||||
 */
 | 
			
		||||
@FunctionalInterface
 | 
			
		||||
@@ -17,9 +18,9 @@ public interface SelectionHandler<E> {
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Notifies the handler about a selection.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param element the selected element
 | 
			
		||||
	 * @param component the selected component
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param element    the selected element
 | 
			
		||||
	 * @param component  the selected component
 | 
			
		||||
	 * @param isSelected contains the selection state
 | 
			
		||||
	 * @since Envoy v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
package envoy.client.ui;
 | 
			
		||||
package envoy.client.ui.list_component;
 | 
			
		||||
 | 
			
		||||
import java.awt.Component;
 | 
			
		||||
import java.awt.Dimension;
 | 
			
		||||
@@ -26,6 +26,11 @@ public class ContactSearchComponent extends JComponent {
 | 
			
		||||
 | 
			
		||||
	private static final long serialVersionUID = 3166795412575239455L;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param list the {@link ComponentList} that is used to display search results
 | 
			
		||||
	 * @param user the {@link User} that appears as a search result
 | 
			
		||||
	 * @since Envoy v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public ContactSearchComponent(ComponentList<? extends User> list, User user) {
 | 
			
		||||
		setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
 | 
			
		||||
 | 
			
		||||
@@ -33,7 +38,7 @@ public class ContactSearchComponent extends JComponent {
 | 
			
		||||
		setForeground(list.getForeground());
 | 
			
		||||
 | 
			
		||||
		JLabel display = new JLabel(user.getName());
 | 
			
		||||
		display.setForeground(Settings.getInstance().getCurrentTheme().getMessageTextColor());
 | 
			
		||||
		display.setForeground(Settings.getInstance().getCurrentTheme().getTextColor());
 | 
			
		||||
		display.setAlignmentX(Component.LEFT_ALIGNMENT);
 | 
			
		||||
		display.setAlignmentY(Component.CENTER_ALIGNMENT);
 | 
			
		||||
		display.setFont(new Font("Arial", Font.PLAIN, 16));
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
package envoy.client.ui;
 | 
			
		||||
package envoy.client.ui.list_component;
 | 
			
		||||
 | 
			
		||||
import java.awt.*;
 | 
			
		||||
import java.io.IOException;
 | 
			
		||||
@@ -7,10 +7,14 @@ import java.util.EnumMap;
 | 
			
		||||
 | 
			
		||||
import javax.swing.*;
 | 
			
		||||
 | 
			
		||||
import envoy.client.data.Chat;
 | 
			
		||||
import envoy.client.data.Settings;
 | 
			
		||||
import envoy.client.ui.Color;
 | 
			
		||||
import envoy.client.ui.IconUtil;
 | 
			
		||||
import envoy.client.ui.list.ComponentList;
 | 
			
		||||
import envoy.data.Message;
 | 
			
		||||
import envoy.data.Message.MessageStatus;
 | 
			
		||||
import envoy.data.User;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Project: <strong>envoy-client</strong>
 | 
			
		||||
@@ -36,11 +40,15 @@ public class MessageComponent extends JPanel {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param list     the {@link ComponentList} that displays this {@link Chat}
 | 
			
		||||
	 * @param message  the {@link Message} to display
 | 
			
		||||
	 * @param senderId the id of the {@link User} who sends messages from this
 | 
			
		||||
	 *                 account
 | 
			
		||||
	 * @since Envoy v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public MessageComponent(ComponentList<? extends Message> list, Message message, long senderId) {
 | 
			
		||||
		this(list.getMaximumSize().width, message, senderId);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public MessageComponent(int width, Message message, long senderId) {
 | 
			
		||||
		var			width	= list.getMaximumSize().width;
 | 
			
		||||
		final var	theme	= Settings.getInstance().getCurrentTheme();
 | 
			
		||||
		final int	padding	= (int) (width * 0.35);
 | 
			
		||||
 | 
			
		||||
@@ -70,7 +78,7 @@ public class MessageComponent extends JPanel {
 | 
			
		||||
		var messageTextArea = new JTextArea(message.getText());
 | 
			
		||||
		messageTextArea.setLineWrap(true);
 | 
			
		||||
		messageTextArea.setWrapStyleWord(true);
 | 
			
		||||
		messageTextArea.setForeground(theme.getMessageTextColor());
 | 
			
		||||
		messageTextArea.setForeground(theme.getTextColor());
 | 
			
		||||
		messageTextArea.setAlignmentX(0.5f);
 | 
			
		||||
		messageTextArea.setBackground(theme.getCellColor());
 | 
			
		||||
		messageTextArea.setEditable(false);
 | 
			
		||||
@@ -107,8 +115,7 @@ public class MessageComponent extends JPanel {
 | 
			
		||||
 | 
			
		||||
		// Define an etched border and some space to the messages below
 | 
			
		||||
		var ours = senderId == message.getSenderId();
 | 
			
		||||
		setBorder(BorderFactory.createCompoundBorder(
 | 
			
		||||
				BorderFactory.createEmptyBorder(0, ours ? padding : 10, 10, ours ? 0 : padding),
 | 
			
		||||
		setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(0, ours ? padding : 10, 10, ours ? 0 : padding),
 | 
			
		||||
				BorderFactory.createEtchedBorder()));
 | 
			
		||||
 | 
			
		||||
		var size = new Dimension(width - 50, getPreferredSize().height);
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
package envoy.client.ui;
 | 
			
		||||
package envoy.client.ui.list_component;
 | 
			
		||||
 | 
			
		||||
import java.awt.BorderLayout;
 | 
			
		||||
import java.awt.Dimension;
 | 
			
		||||
@@ -7,11 +7,14 @@ import javax.swing.JComponent;
 | 
			
		||||
import javax.swing.JLabel;
 | 
			
		||||
 | 
			
		||||
import envoy.client.data.Settings;
 | 
			
		||||
import envoy.client.ui.list.ComponentList;
 | 
			
		||||
import envoy.client.ui.Color;
 | 
			
		||||
import envoy.client.ui.Theme;
 | 
			
		||||
import envoy.data.User;
 | 
			
		||||
import envoy.data.User.UserStatus;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Displays a {@link User}.<br>
 | 
			
		||||
 * <br>
 | 
			
		||||
 * Project: <strong>envoy-client</strong>
 | 
			
		||||
 * File: <strong>UserComponent.java</strong>
 | 
			
		||||
 * Created: <strong>21.03.2020</strong>
 | 
			
		||||
@@ -23,7 +26,11 @@ public class UserComponent extends JComponent {
 | 
			
		||||
 | 
			
		||||
	private static final long serialVersionUID = 8450602172939729585L;
 | 
			
		||||
 | 
			
		||||
	public UserComponent(ComponentList<? extends User> list, User user) {
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param user the {@link User} whose information is displayed
 | 
			
		||||
	 * @since Envoy v0.1-beta
 | 
			
		||||
	 */
 | 
			
		||||
	public UserComponent(User user) {
 | 
			
		||||
		final Theme theme = Settings.getInstance().getCurrentTheme();
 | 
			
		||||
 | 
			
		||||
		setLayout(new BorderLayout());
 | 
			
		||||
@@ -0,0 +1,14 @@
 | 
			
		||||
/**
 | 
			
		||||
 * This package contains swing components that can be displayed by
 | 
			
		||||
 * {@link envoy.client.ui.list.ComponentList}.<br>
 | 
			
		||||
 * <br>
 | 
			
		||||
 * Project: <strong>envoy-client</strong><br>
 | 
			
		||||
 * File: <strong>package-info.java</strong><br>
 | 
			
		||||
 * Created: <strong>21 Mar 2020</strong><br>
 | 
			
		||||
 *
 | 
			
		||||
 * @author Leon Hofmeister
 | 
			
		||||
 * @author Kai S. K. Engelbart
 | 
			
		||||
 * @author Maximilian Käfer
 | 
			
		||||
 * @since Envoy v0.1-beta
 | 
			
		||||
 */
 | 
			
		||||
package envoy.client.ui.list_component;
 | 
			
		||||
							
								
								
									
										13
									
								
								src/main/java/envoy/client/ui/settings/ThemeCustomizationPanel.java
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							
							
						
						
									
										13
									
								
								src/main/java/envoy/client/ui/settings/ThemeCustomizationPanel.java
									
									
									
									
									
										
										
										Normal file → Executable file
									
								
							@@ -38,9 +38,8 @@ public class ThemeCustomizationPanel extends SettingsPanel {
 | 
			
		||||
 | 
			
		||||
	private final Insets insets = new Insets(5, 5, 5, 5);
 | 
			
		||||
 | 
			
		||||
	private static final Settings	settings			= Settings.getInstance();
 | 
			
		||||
	private static final Logger		logger				= EnvoyLog.getLogger(ThemeCustomizationPanel.class);
 | 
			
		||||
	private static final long		serialVersionUID	= -8697897390666456624L;
 | 
			
		||||
	private static final Logger	logger				= EnvoyLog.getLogger(ThemeCustomizationPanel.class);
 | 
			
		||||
	private static final long	serialVersionUID	= -8697897390666456624L;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Initializes a {@link ThemeCustomizationPanel} that enables the user to change
 | 
			
		||||
@@ -53,7 +52,7 @@ public class ThemeCustomizationPanel extends SettingsPanel {
 | 
			
		||||
	 */
 | 
			
		||||
	public ThemeCustomizationPanel(SettingsScreen parent) {
 | 
			
		||||
		super(parent);
 | 
			
		||||
		temporaryTheme = new Theme("temporaryTheme", settings.getCurrentTheme());
 | 
			
		||||
		temporaryTheme = new Theme("temporaryTheme", Settings.getInstance().getCurrentTheme());
 | 
			
		||||
 | 
			
		||||
		GridBagLayout gbl_themeLayout = new GridBagLayout();
 | 
			
		||||
 | 
			
		||||
@@ -64,7 +63,7 @@ public class ThemeCustomizationPanel extends SettingsPanel {
 | 
			
		||||
 | 
			
		||||
		setLayout(gbl_themeLayout);
 | 
			
		||||
 | 
			
		||||
		themes.setSelectedItem(settings.getCurrentTheme());
 | 
			
		||||
		themes.setSelectedItem(Settings.getInstance().getCurrentTheme());
 | 
			
		||||
 | 
			
		||||
		GridBagConstraints gbc_themes = new GridBagConstraints();
 | 
			
		||||
		gbc_themes.fill			= GridBagConstraints.HORIZONTAL;
 | 
			
		||||
@@ -84,7 +83,7 @@ public class ThemeCustomizationPanel extends SettingsPanel {
 | 
			
		||||
 | 
			
		||||
		colorsPanel.setLayout(gbl_colorCustomizations);
 | 
			
		||||
 | 
			
		||||
		Theme theme = settings.getCurrentTheme();
 | 
			
		||||
		Theme theme = Settings.getInstance().getCurrentTheme();
 | 
			
		||||
		buildCustomizeElements(theme);
 | 
			
		||||
 | 
			
		||||
		GridBagConstraints gbc_colorsPanel = new GridBagConstraints();
 | 
			
		||||
@@ -174,7 +173,7 @@ public class ThemeCustomizationPanel extends SettingsPanel {
 | 
			
		||||
		buildCustomizeElement(theme, theme.getCellColor(), "Cells", "cellColor", 2);
 | 
			
		||||
		buildCustomizeElement(theme, theme.getInteractableForegroundColor(), "Interactable Foreground", "interactableForegroundColor", 3);
 | 
			
		||||
		buildCustomizeElement(theme, theme.getInteractableBackgroundColor(), "Interactable Background", "interactableBackgroundColor", 4);
 | 
			
		||||
		buildCustomizeElement(theme, theme.getMessageTextColor(), "Messages Chat", "messageColorChat", 5);
 | 
			
		||||
		buildCustomizeElement(theme, theme.getTextColor(), "Text Color", "textColor", 5);
 | 
			
		||||
		buildCustomizeElement(theme, theme.getDateColor(), "Date Chat", "dateColorChat", 6);
 | 
			
		||||
		buildCustomizeElement(theme, theme.getSelectionColor(), "Selection", "selectionColor", 7);
 | 
			
		||||
		buildCustomizeElement(theme, theme.getTypingMessageColor(), "Typing Message", "typingMessageColor", 8);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user