Implemented settings object and cleaned up ChatWindow
Improvements: * Settings were implemented * Light theme support was implemented * The readability of ChatWindow got improved
This commit is contained in:
		@@ -63,6 +63,7 @@ public class Config {
 | 
			
		||||
				case "--localDB":
 | 
			
		||||
				case "-db":
 | 
			
		||||
					localDB = new File(args[++i]);
 | 
			
		||||
					break;
 | 
			
		||||
			}
 | 
			
		||||
		if (localDB == null) localDB = new File(".\\localDB");
 | 
			
		||||
		if (syncTimeout == 0) syncTimeout = 1000;
 | 
			
		||||
@@ -116,12 +117,23 @@ public class Config {
 | 
			
		||||
	 * Changes the default local database.
 | 
			
		||||
	 * Exclusively intended for development purposes.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param the file containing the local database
 | 
			
		||||
	 * @param localDB the file containing the local database
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 **/
 | 
			
		||||
	public void setLocalDB(File localDB) { this.localDB = localDB; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @return the current time (milliseconds) that is waited between Syncs
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public int getSyncTimeout() { return syncTimeout; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param syncTimeout sets the time (milliseconds) during which Sync waits
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void setSyncTimeout(int syncTimeout) { this.syncTimeout = syncTimeout; }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -30,8 +30,10 @@ import envoy.schema.User;
 | 
			
		||||
 * @since Envoy v0.1-alpha
 | 
			
		||||
 */
 | 
			
		||||
public class LocalDB {
 | 
			
		||||
 | 
			
		||||
	private File			localDB;
 | 
			
		||||
	private User			sender;
 | 
			
		||||
	private final long		id;
 | 
			
		||||
	private List<Chat>		chats			= new ArrayList<>();
 | 
			
		||||
	private ObjectFactory	objectFactory	= new ObjectFactory();
 | 
			
		||||
	private DatatypeFactory	datatypeFactory;
 | 
			
		||||
@@ -39,12 +41,13 @@ public class LocalDB {
 | 
			
		||||
	/**
 | 
			
		||||
	 * Constructs an empty local database.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param client the user that is logged in with this client
 | 
			
		||||
	 * @param sender the user that is logged in with this client
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 **/
 | 
			
		||||
 | 
			
		||||
	public LocalDB(User sender) {
 | 
			
		||||
		this.sender = sender;
 | 
			
		||||
		this.sender	= sender;
 | 
			
		||||
		id			= sender.getID();
 | 
			
		||||
		try {
 | 
			
		||||
			datatypeFactory = DatatypeFactory.newInstance();
 | 
			
		||||
		} catch (DatatypeConfigurationException e) {
 | 
			
		||||
@@ -52,7 +55,6 @@ public class LocalDB {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Initializes the local database and fills it with values
 | 
			
		||||
	 * if the user has already sent or received messages.
 | 
			
		||||
@@ -64,14 +66,16 @@ public class LocalDB {
 | 
			
		||||
	public void initializeDBFile(File localDBDir) throws EnvoyException {
 | 
			
		||||
		if (localDBDir.exists() && !localDBDir.isDirectory()) throw new EnvoyException(
 | 
			
		||||
				String.format("LocalDBDir '%s' is not a directory!", localDBDir.getAbsolutePath()));
 | 
			
		||||
		localDB = new File(localDBDir, sender.getID() + ".db");
 | 
			
		||||
		localDB = new File(localDBDir, id + ".db");
 | 
			
		||||
		if (localDB.exists()) loadFromLocalDB();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Saves the database into a file for future use.
 | 
			
		||||
	 * Saves the database into a file for future use.<br>
 | 
			
		||||
	 * It is theoretically possible to fail due to unknown causes.<br>
 | 
			
		||||
	 * In such a case, every message sent/ received during that session will be
 | 
			
		||||
	 * lost.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @throws IOException if something went wrong during saving
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 **/
 | 
			
		||||
	public void saveToLocalDB() {
 | 
			
		||||
@@ -110,12 +114,13 @@ public class LocalDB {
 | 
			
		||||
	 * Creates a {@link Message} object serializable to XML.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param textContent The content (text) of the message
 | 
			
		||||
	 * @param recipientID self explanatory
 | 
			
		||||
	 * @return prepared {@link Message} object
 | 
			
		||||
	 */
 | 
			
		||||
	public Message createMessage(String textContent, User recipient) {
 | 
			
		||||
	public Message createMessage(String textContent, long recipientID) {
 | 
			
		||||
		Message.Metadata metaData = objectFactory.createMessageMetadata();
 | 
			
		||||
		metaData.setSender(sender.getID());
 | 
			
		||||
		metaData.setRecipient(recipient.getID());
 | 
			
		||||
		metaData.setRecipient(recipientID);
 | 
			
		||||
		metaData.setState(MessageState.WAITING);
 | 
			
		||||
		metaData.setDate(datatypeFactory.newXMLGregorianCalendar(Instant.now().toString()));
 | 
			
		||||
 | 
			
		||||
@@ -257,7 +262,7 @@ public class LocalDB {
 | 
			
		||||
	/**
 | 
			
		||||
	 * Adds a message to the "sync" Sync object.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param message
 | 
			
		||||
	 * @param message the message to send
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void addMessageToSync(Message message) { sync.getMessages().add(message); }
 | 
			
		||||
@@ -274,7 +279,6 @@ public class LocalDB {
 | 
			
		||||
	 * Adds the unread messages returned from the server in the latest sync to the
 | 
			
		||||
	 * right chats in the LocalDB.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param localDB
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void addUnreadMessagesToLocalDB() {
 | 
			
		||||
@@ -292,7 +296,6 @@ public class LocalDB {
 | 
			
		||||
	 * Gets all messages with state SENT from the LocalDB and adds them to the
 | 
			
		||||
	 * "sync" Sync object.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param localDB
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void getSentStateMessagesFromLocalDB() {
 | 
			
		||||
@@ -310,7 +313,7 @@ public class LocalDB {
 | 
			
		||||
	 * <br>
 | 
			
		||||
	 * Adds these Messages to the {@code readMessages} {@link Sync} object.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param currentChat
 | 
			
		||||
	 * @param currentChat the chat that was just opened
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void setMessagesToRead(Chat currentChat) {
 | 
			
		||||
@@ -325,8 +328,8 @@ public class LocalDB {
 | 
			
		||||
	/**
 | 
			
		||||
	 * Adds a message with State WAITING to a specific chat in the LocalDB.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param message
 | 
			
		||||
	 * @param currentChat
 | 
			
		||||
	 * @param message     the message that is not yet received by the other user
 | 
			
		||||
	 * @param currentChat the chat that is currently open
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void addWaitingMessageToLocalDB(Message message, Chat currentChat) { currentChat.appendMessage(message); }
 | 
			
		||||
@@ -334,7 +337,6 @@ public class LocalDB {
 | 
			
		||||
	/**
 | 
			
		||||
	 * Adds all messages with State WAITING from the {@link LocalDB} to the Sync.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param localDB
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void addWaitingMessagesToSync() {
 | 
			
		||||
@@ -368,4 +370,11 @@ public class LocalDB {
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public User getUser() { return sender; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return the id of the client. Used as shortcut for quicker information
 | 
			
		||||
	 *         retrieval
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public long getId() { return id; }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										129
									
								
								src/main/java/envoy/client/Settings.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								src/main/java/envoy/client/Settings.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,129 @@
 | 
			
		||||
package envoy.client;
 | 
			
		||||
 | 
			
		||||
import java.util.prefs.Preferences;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Project: <strong>envoy-client</strong><br>
 | 
			
		||||
 * File: <strong>Settings.java</strong><br>
 | 
			
		||||
 * Created: <strong>11 Nov 2019</strong><br>
 | 
			
		||||
 * 
 | 
			
		||||
 * @author Leon Hofmeister
 | 
			
		||||
 * @since Envoy v0.2-alpha
 | 
			
		||||
 */
 | 
			
		||||
public class Settings {
 | 
			
		||||
 | 
			
		||||
	private String	username;
 | 
			
		||||
	private String	email;
 | 
			
		||||
	private boolean	enterToSend	= true;
 | 
			
		||||
	private boolean	darkMode	= true;
 | 
			
		||||
	// private Image profilePic;
 | 
			
		||||
	private static Settings	settings;
 | 
			
		||||
	private Preferences		prefs	= Preferences.userNodeForPackage(Settings.class);
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * The way to instantiate the settings.
 | 
			
		||||
	 * Is set to private to deny other instances of that object.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	private Settings() {}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * This method is used to ensure that there is only one instance of Settings.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @return the instance of Settings
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public static Settings getInstance() {
 | 
			
		||||
		if (settings == null) {
 | 
			
		||||
			settings = new Settings();
 | 
			
		||||
		}
 | 
			
		||||
		settings.load();
 | 
			
		||||
		return settings;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void load() {
 | 
			
		||||
		settings.setUsername(prefs.get("username", ""));
 | 
			
		||||
		settings.setEmail(prefs.get("email", ""));
 | 
			
		||||
		settings.setDarkMode(prefs.getBoolean("darkMode", true));
 | 
			
		||||
		settings.setEnterToSend(prefs.getBoolean("enterToSend", true));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public void save() {
 | 
			
		||||
		prefs.put("username", settings.getUsername());
 | 
			
		||||
		prefs.put("email", settings.getEmail());
 | 
			
		||||
		prefs.putBoolean("darkMode", settings.isDarkMode());
 | 
			
		||||
		prefs.putBoolean("enterToSend", settings.isEnterToSend());
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return the username
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public String getUsername() { return username; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param username the username to set
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void setUsername(String username) { this.username = username; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return the email associated with that user.
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public String getEmail() { return email; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param email the email to set
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void setEmail(String email) { this.email = email; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return true, if "enter" suffices to send a message, else it has to be "ctrl"
 | 
			
		||||
	 *         + "enter"
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public boolean isEnterToSend() { return enterToSend; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Change mode of posting a message via Keystroke.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param enterToSend if true, "enter" suffices to send a message, <br>
 | 
			
		||||
	 *                    else it has to be "ctrl" + "enter"
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void setEnterToSend(boolean enterToSend) { this.enterToSend = enterToSend; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Describes whether the Envoy GUI should be displayed in dark mode or not.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @return true, if dark mode display is currently set, else the light theme
 | 
			
		||||
	 *         will be displayed
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public boolean isDarkMode() { return darkMode; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Change display mode of Envoy GUI.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param darkMode true, if dark mode display is currently set, <br>
 | 
			
		||||
	 *                 else the light theme will be displayed
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void setDarkMode(boolean darkMode) { this.darkMode = darkMode; }
 | 
			
		||||
 | 
			
		||||
	// /**
 | 
			
		||||
	// * @return the profilePic
 | 
			
		||||
	// * @since Envoy v0.2-alpha
 | 
			
		||||
	// */
 | 
			
		||||
	// public Image getProfilePic() { return profilePic; }
 | 
			
		||||
	//
 | 
			
		||||
	// /**
 | 
			
		||||
	// * @param profilePic the profilePic to set
 | 
			
		||||
	// * @since Envoy v0.1-alpha
 | 
			
		||||
	// */
 | 
			
		||||
	// public void setProfilePic(Image profilePic) { this.profilePic = profilePic; }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
package envoy.client.ui;
 | 
			
		||||
 | 
			
		||||
import java.awt.Color;
 | 
			
		||||
import java.awt.ComponentOrientation;
 | 
			
		||||
import java.awt.Font;
 | 
			
		||||
import java.awt.GridBagConstraints;
 | 
			
		||||
@@ -29,6 +28,7 @@ import envoy.client.Chat;
 | 
			
		||||
import envoy.client.Client;
 | 
			
		||||
import envoy.client.Config;
 | 
			
		||||
import envoy.client.LocalDB;
 | 
			
		||||
import envoy.client.Settings;
 | 
			
		||||
import envoy.schema.Message;
 | 
			
		||||
import envoy.schema.Sync;
 | 
			
		||||
import envoy.schema.User;
 | 
			
		||||
@@ -47,19 +47,30 @@ public class ChatWindow extends JFrame {
 | 
			
		||||
 | 
			
		||||
	private static final long serialVersionUID = 6865098428255463649L;
 | 
			
		||||
 | 
			
		||||
	private JPanel contentPane = new JPanel();
 | 
			
		||||
	// user specific objects
 | 
			
		||||
	private Client		client;
 | 
			
		||||
	private LocalDB		localDB;
 | 
			
		||||
	private Settings	settings;
 | 
			
		||||
	// used colors in Envoy
 | 
			
		||||
	private UIColors uiColors = UIColors.getInstance(true);
 | 
			
		||||
	// GUI components
 | 
			
		||||
	private JPanel			contentPane				= new JPanel();
 | 
			
		||||
	private JTextArea		messageEnterTextArea	= new JTextArea();
 | 
			
		||||
	private JList<User>		userList				= new JList<>();
 | 
			
		||||
	private Chat			currentChat;
 | 
			
		||||
	private JList<Message>	messageList				= new JList<>();
 | 
			
		||||
	private JScrollPane		scrollPane				= new JScrollPane();
 | 
			
		||||
	private JTextPane		textPane				= new JTextPane();
 | 
			
		||||
	// private JCheckBox jCbChangeMode;
 | 
			
		||||
	private JButton	postButton = new JButton();
 | 
			
		||||
	private JButton	settingsButton = new JButton();
 | 
			
		||||
 | 
			
		||||
	private Client	client;
 | 
			
		||||
	private LocalDB	localDB;
 | 
			
		||||
	private static int space = 4;
 | 
			
		||||
 | 
			
		||||
	private JList<User>	userList	= new JList<>();
 | 
			
		||||
	private Chat		currentChat;
 | 
			
		||||
 | 
			
		||||
	private JTextArea messageEnterTextArea;
 | 
			
		||||
 | 
			
		||||
	public ChatWindow(Client client, LocalDB localDB) {
 | 
			
		||||
	public ChatWindow(Client client, LocalDB localDB, Settings setting) {
 | 
			
		||||
		this.client		= client;
 | 
			
		||||
		this.localDB	= localDB;
 | 
			
		||||
		this.settings	= setting;
 | 
			
		||||
 | 
			
		||||
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 | 
			
		||||
		setBounds(100, 100, 600, 800);
 | 
			
		||||
@@ -73,9 +84,7 @@ public class ChatWindow extends JFrame {
 | 
			
		||||
			public void windowClosing(WindowEvent e) { localDB.saveToLocalDB(); }
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		contentPane.setBackground(new Color(0, 0, 0));
 | 
			
		||||
		contentPane.setForeground(Color.white);
 | 
			
		||||
		contentPane.setBorder(new EmptyBorder(0, 5, 0, 0));
 | 
			
		||||
		contentPane.setBorder(new EmptyBorder(space, space, space, space));
 | 
			
		||||
		setContentPane(contentPane);
 | 
			
		||||
		GridBagLayout gbl_contentPane = new GridBagLayout();
 | 
			
		||||
		gbl_contentPane.columnWidths	= new int[] { 1, 1, 1 };
 | 
			
		||||
@@ -84,25 +93,16 @@ public class ChatWindow extends JFrame {
 | 
			
		||||
		gbl_contentPane.rowWeights		= new double[] { 0.05, 1.0, 0.07 };
 | 
			
		||||
		contentPane.setLayout(gbl_contentPane);
 | 
			
		||||
 | 
			
		||||
		JList<Message> messageList = new JList<>();
 | 
			
		||||
		messageList.setCellRenderer(new MessageListRenderer());
 | 
			
		||||
 | 
			
		||||
		messageList.setFocusTraversalKeysEnabled(false);
 | 
			
		||||
		messageList.setSelectionForeground(new Color(255, 255, 255));
 | 
			
		||||
		messageList.setSelectionBackground(new Color(102, 0, 153));
 | 
			
		||||
		messageList.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);
 | 
			
		||||
		messageList.setForeground(new Color(255, 255, 255));
 | 
			
		||||
		messageList.setBackground(new Color(51, 51, 51));
 | 
			
		||||
 | 
			
		||||
		DefaultListModel<Message> messageListModel = new DefaultListModel<>();
 | 
			
		||||
		messageList.setModel(messageListModel);
 | 
			
		||||
		messageList.setFont(new Font("Arial", Font.PLAIN, 17));
 | 
			
		||||
		messageList.setFixedCellHeight(60);
 | 
			
		||||
		messageList.setBorder(new EmptyBorder(5, 5, 5, 5));
 | 
			
		||||
		messageList.setBorder(new EmptyBorder(space, space, space, space));
 | 
			
		||||
 | 
			
		||||
		JScrollPane scrollPane = new JScrollPane();
 | 
			
		||||
		scrollPane.setForeground(new Color(0, 0, 0));
 | 
			
		||||
		scrollPane.setBackground(new Color(51, 51, 51));
 | 
			
		||||
		scrollPane.setViewportView(messageList);
 | 
			
		||||
		scrollPane.setBorder(null);
 | 
			
		||||
 | 
			
		||||
@@ -112,18 +112,17 @@ public class ChatWindow extends JFrame {
 | 
			
		||||
		gbc_scrollPane.gridx		= 1;
 | 
			
		||||
		gbc_scrollPane.gridy		= 1;
 | 
			
		||||
 | 
			
		||||
		gbc_scrollPane.insets = new Insets(0, 10, 10, 10);
 | 
			
		||||
		gbc_scrollPane.insets = new Insets(space, space, space, space);
 | 
			
		||||
 | 
			
		||||
		contentPane.add(scrollPane, gbc_scrollPane);
 | 
			
		||||
 | 
			
		||||
		// Message enter field
 | 
			
		||||
		messageEnterTextArea = new JTextArea();
 | 
			
		||||
		messageEnterTextArea.addKeyListener(new KeyAdapter() {
 | 
			
		||||
 | 
			
		||||
			@Override
 | 
			
		||||
			public void keyReleased(KeyEvent e) {
 | 
			
		||||
 | 
			
		||||
				if (e.getKeyCode() == KeyEvent.VK_ENTER && ((SettingsScreen.enterToSend && e.getModifiersEx() == 0)
 | 
			
		||||
				if (e.getKeyCode() == KeyEvent.VK_ENTER && ((settings.isEnterToSend() && e.getModifiersEx() == 0)
 | 
			
		||||
						|| (e.getModifiersEx() == KeyEvent.CTRL_DOWN_MASK))) {
 | 
			
		||||
 | 
			
		||||
					postMessage(messageList);
 | 
			
		||||
@@ -133,44 +132,34 @@ public class ChatWindow extends JFrame {
 | 
			
		||||
		});
 | 
			
		||||
		// Checks for changed Message
 | 
			
		||||
		messageEnterTextArea.setWrapStyleWord(true);
 | 
			
		||||
		messageEnterTextArea.setCaretColor(new Color(255, 255, 255));
 | 
			
		||||
		messageEnterTextArea.setForeground(new Color(255, 255, 255));
 | 
			
		||||
		messageEnterTextArea.setBackground(new Color(51, 51, 51));
 | 
			
		||||
		messageEnterTextArea.setLineWrap(true);
 | 
			
		||||
		messageEnterTextArea.setBorder(null);
 | 
			
		||||
		messageEnterTextArea.setFont(new Font("Arial", Font.PLAIN, 17));
 | 
			
		||||
		messageEnterTextArea.setBorder(new EmptyBorder(5, 5, 5, 5));
 | 
			
		||||
		messageEnterTextArea.setBorder(new EmptyBorder(space, space, space, space));
 | 
			
		||||
 | 
			
		||||
		GridBagConstraints gbc_messageEnterTextfield = new GridBagConstraints();
 | 
			
		||||
		gbc_messageEnterTextfield.fill	= GridBagConstraints.BOTH;
 | 
			
		||||
		gbc_messageEnterTextfield.gridx	= 1;
 | 
			
		||||
		gbc_messageEnterTextfield.gridy	= 2;
 | 
			
		||||
 | 
			
		||||
		gbc_messageEnterTextfield.insets = new Insets(10, 10, 10, 10);
 | 
			
		||||
		gbc_messageEnterTextfield.insets = new Insets(space, space, space, space);
 | 
			
		||||
 | 
			
		||||
		contentPane.add(messageEnterTextArea, gbc_messageEnterTextfield);
 | 
			
		||||
 | 
			
		||||
		// Post Button
 | 
			
		||||
		JButton postButton = new JButton("Post");
 | 
			
		||||
		postButton.setForeground(new Color(255, 255, 255));
 | 
			
		||||
		postButton.setBackground(new Color(102, 51, 153));
 | 
			
		||||
		postButton.setBorderPainted(false);
 | 
			
		||||
 | 
			
		||||
		GridBagConstraints gbc_moveSelectionPostButton = new GridBagConstraints();
 | 
			
		||||
 | 
			
		||||
		gbc_moveSelectionPostButton.fill	= GridBagConstraints.BOTH;
 | 
			
		||||
		gbc_moveSelectionPostButton.gridx	= 2;
 | 
			
		||||
		gbc_moveSelectionPostButton.gridy	= 2;
 | 
			
		||||
 | 
			
		||||
		gbc_moveSelectionPostButton.insets = new Insets(10, 10, 10, 10);
 | 
			
		||||
		gbc_moveSelectionPostButton.insets = new Insets(space, space, space, space);
 | 
			
		||||
 | 
			
		||||
		postButton.addActionListener((evt) -> { postMessage(messageList); });
 | 
			
		||||
		contentPane.add(postButton, gbc_moveSelectionPostButton);
 | 
			
		||||
 | 
			
		||||
		// Settings Button
 | 
			
		||||
		JButton settingsButton = new JButton("Settings");
 | 
			
		||||
		settingsButton.setForeground(new Color(255, 255, 255));
 | 
			
		||||
		settingsButton.setBackground(new Color(102, 51, 153));
 | 
			
		||||
		settingsButton.setBorderPainted(false);
 | 
			
		||||
 | 
			
		||||
		GridBagConstraints gbc_moveSelectionSettingsButton = new GridBagConstraints();
 | 
			
		||||
@@ -179,13 +168,12 @@ public class ChatWindow extends JFrame {
 | 
			
		||||
		gbc_moveSelectionSettingsButton.gridx	= 2;
 | 
			
		||||
		gbc_moveSelectionSettingsButton.gridy	= 0;
 | 
			
		||||
 | 
			
		||||
		gbc_moveSelectionSettingsButton.insets = new Insets(10, 10, 10, 10);
 | 
			
		||||
		gbc_moveSelectionSettingsButton.insets = new Insets(space, space, space, space);
 | 
			
		||||
 | 
			
		||||
		settingsButton.addActionListener((evt) -> {
 | 
			
		||||
			try {
 | 
			
		||||
				SettingsScreen.open(localDB.getUser().getName());
 | 
			
		||||
			} catch (Exception e) {
 | 
			
		||||
				SettingsScreen.open();
 | 
			
		||||
			} catch (Exception e) {
 | 
			
		||||
				System.err.println("An error occured while opening the settings screen: " + e);
 | 
			
		||||
				e.printStackTrace();
 | 
			
		||||
			}
 | 
			
		||||
@@ -193,10 +181,6 @@ public class ChatWindow extends JFrame {
 | 
			
		||||
		contentPane.add(settingsButton, gbc_moveSelectionSettingsButton);
 | 
			
		||||
 | 
			
		||||
		// Partner name display
 | 
			
		||||
		JTextPane textPane = new JTextPane();
 | 
			
		||||
		textPane.setBackground(new Color(0, 0, 0));
 | 
			
		||||
		textPane.setForeground(new Color(255, 255, 255));
 | 
			
		||||
 | 
			
		||||
		textPane.setFont(new Font("Arial", Font.PLAIN, 20));
 | 
			
		||||
 | 
			
		||||
		GridBagConstraints gbc_partnerName = new GridBagConstraints();
 | 
			
		||||
@@ -204,7 +188,7 @@ public class ChatWindow extends JFrame {
 | 
			
		||||
		gbc_partnerName.gridx	= 1;
 | 
			
		||||
		gbc_partnerName.gridy	= 0;
 | 
			
		||||
 | 
			
		||||
		gbc_partnerName.insets = new Insets(0, 10, 0, 10);
 | 
			
		||||
		gbc_partnerName.insets = new Insets(space, space, space, space);
 | 
			
		||||
		contentPane.add(textPane, gbc_partnerName);
 | 
			
		||||
 | 
			
		||||
		userList.setCellRenderer(new UserListRenderer());
 | 
			
		||||
@@ -234,19 +218,17 @@ public class ChatWindow extends JFrame {
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		userList.setSelectionForeground(new Color(255, 255, 255));
 | 
			
		||||
		userList.setSelectionBackground(new Color(102, 0, 153));
 | 
			
		||||
		userList.setForeground(new Color(255, 255, 255));
 | 
			
		||||
		userList.setBackground(new Color(51, 51, 51));
 | 
			
		||||
		userList.setFont(new Font("Arial", Font.PLAIN, 17));
 | 
			
		||||
		userList.setBorder(new EmptyBorder(5, 5, 5, 5));
 | 
			
		||||
		userList.setBorder(new EmptyBorder(space, space, space, space));
 | 
			
		||||
 | 
			
		||||
		GridBagConstraints gbc_userList = new GridBagConstraints();
 | 
			
		||||
		gbc_userList.fill	= GridBagConstraints.VERTICAL;
 | 
			
		||||
		gbc_userList.gridx	= 0;
 | 
			
		||||
		gbc_userList.gridy	= 1;
 | 
			
		||||
		gbc_userList.anchor	= GridBagConstraints.PAGE_START;
 | 
			
		||||
		gbc_userList.insets	= new Insets(0, 0, 10, 0);
 | 
			
		||||
		gbc_userList.insets	= new Insets(space, space, space, space);
 | 
			
		||||
 | 
			
		||||
		changeChatWindowColors();
 | 
			
		||||
		
 | 
			
		||||
		contentPane.add(userList, gbc_userList);
 | 
			
		||||
		contentPane.revalidate();
 | 
			
		||||
@@ -257,6 +239,46 @@ public class ChatWindow extends JFrame {
 | 
			
		||||
		contentPane.revalidate();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Used to immediately reload the ChatWindow when settings were changed.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void changeChatWindowColors() {
 | 
			
		||||
		uiColors.setDisplayMode(settings.isDarkMode());
 | 
			
		||||
 | 
			
		||||
		// contentPane
 | 
			
		||||
		contentPane.setBackground(uiColors.getBackgroundColor());
 | 
			
		||||
		contentPane.setForeground(uiColors.getTextColor());
 | 
			
		||||
		// messageList
 | 
			
		||||
		messageList.setSelectionForeground(uiColors.getTextColor());
 | 
			
		||||
		messageList.setSelectionBackground(uiColors.getSpecialUseColor());
 | 
			
		||||
		messageList.setForeground(uiColors.getTextColor());
 | 
			
		||||
		messageList.setBackground(uiColors.getUserInteractionColor());
 | 
			
		||||
		// scrollPane
 | 
			
		||||
		scrollPane.setForeground(uiColors.getBackgroundColor());
 | 
			
		||||
		scrollPane.setBackground(uiColors.getUserInteractionColor());
 | 
			
		||||
		// messageEnterTextArea
 | 
			
		||||
		messageEnterTextArea.setCaretColor(uiColors.getTextColor());
 | 
			
		||||
		messageEnterTextArea.setForeground(uiColors.getTextColor());
 | 
			
		||||
		messageEnterTextArea.setBackground(uiColors.getUserInteractionColor());
 | 
			
		||||
		// postButton
 | 
			
		||||
		postButton.setForeground(uiColors.getTextColor());
 | 
			
		||||
		postButton.setBackground(uiColors.getSpecialUseColor());
 | 
			
		||||
		// settingsButton
 | 
			
		||||
		settingsButton.setForeground(uiColors.getTextColor());
 | 
			
		||||
		settingsButton.setBackground(uiColors.getSpecialUseColor());
 | 
			
		||||
		// textPane
 | 
			
		||||
		textPane.setBackground(uiColors.getBackgroundColor());
 | 
			
		||||
		textPane.setForeground(uiColors.getTextColor());
 | 
			
		||||
		// userList
 | 
			
		||||
		userList.setSelectionForeground(uiColors.getTextColor());
 | 
			
		||||
		userList.setSelectionBackground(uiColors.getSpecialUseColor());
 | 
			
		||||
		userList.setForeground(uiColors.getTextColor());
 | 
			
		||||
		userList.setBackground(uiColors.getUserInteractionColor());
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	private void postMessage(JList<Message> messageList) {
 | 
			
		||||
		if (!client.hasRecipient()) {
 | 
			
		||||
			JOptionPane.showMessageDialog(this,
 | 
			
		||||
@@ -268,7 +290,7 @@ public class ChatWindow extends JFrame {
 | 
			
		||||
		if (!messageEnterTextArea.getText().isEmpty()) try {
 | 
			
		||||
 | 
			
		||||
			// Create and send message object
 | 
			
		||||
			final Message message = localDB.createMessage(messageEnterTextArea.getText(), currentChat.getRecipient());
 | 
			
		||||
			final Message message = localDB.createMessage(messageEnterTextArea.getText(), currentChat.getRecipient().getID());
 | 
			
		||||
			localDB.addWaitingMessageToLocalDB(message, currentChat);
 | 
			
		||||
			messageList.setModel(currentChat.getModel());
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,15 +1,22 @@
 | 
			
		||||
package envoy.client.ui;
 | 
			
		||||
 | 
			
		||||
import java.awt.BorderLayout;
 | 
			
		||||
import java.awt.Color;
 | 
			
		||||
import java.awt.FlowLayout;
 | 
			
		||||
import java.awt.GridBagConstraints;
 | 
			
		||||
import java.awt.GridBagLayout;
 | 
			
		||||
import java.awt.Insets;
 | 
			
		||||
 | 
			
		||||
import javax.swing.JButton;
 | 
			
		||||
import javax.swing.JDialog;
 | 
			
		||||
import javax.swing.JOptionPane;//TODO: temporary
 | 
			
		||||
import javax.swing.JPanel;
 | 
			
		||||
import javax.swing.border.EmptyBorder;
 | 
			
		||||
 | 
			
		||||
import envoy.client.Settings;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This class provides the GUI to change the user specific settings.
 | 
			
		||||
 * 
 | 
			
		||||
 * Project: <strong>envoy-client</strong><br>
 | 
			
		||||
 * File: <strong>SettingsScreen.java</strong><br>
 | 
			
		||||
 * Created: <strong>31 Oct 2019</strong><br>
 | 
			
		||||
@@ -18,139 +25,109 @@ import javax.swing.border.EmptyBorder;
 | 
			
		||||
 */
 | 
			
		||||
public class SettingsScreen extends JDialog {
 | 
			
		||||
 | 
			
		||||
	private static final long	serialVersionUID	= -4476913491263077107L;
 | 
			
		||||
	private final JPanel		contentPanel		= new JPanel();
 | 
			
		||||
	public static boolean		enterToSend			= true;
 | 
			
		||||
	private static final long		serialVersionUID	= -4476913491263077107L;
 | 
			
		||||
	private final JPanel			contentPanel		= new JPanel();
 | 
			
		||||
	private JPanel					buttonPane			= new JPanel();
 | 
			
		||||
	private JButton					okButton			= new JButton("Save");
 | 
			
		||||
	private JButton					cancelButton		= new JButton("Cancel");
 | 
			
		||||
	private static Settings			settings;
 | 
			
		||||
	private static UIColors			uiColors;
 | 
			
		||||
	private static int				space				= 5;
 | 
			
		||||
	private static SettingsScreen	settingsScreen;
 | 
			
		||||
 | 
			
		||||
	// TODO: Add a JPanel with all the Information necessary:
 | 
			
		||||
	// change (Picture,Username, Email, Password) and toggle(light/dark mode,
 | 
			
		||||
	// "ctrl+enter"/"enter"
 | 
			
		||||
	// to send a message directly)
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Open the Settings screen.
 | 
			
		||||
	 * Only suited for Dev/Error mode.
 | 
			
		||||
	 * Avoid usage.
 | 
			
		||||
	 * Opens the settings screen.<br>
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public static void open() { open(new SettingsScreen()); }
 | 
			
		||||
	public static void open() {
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Opens the Settings screen.<br>
 | 
			
		||||
	 * Use preferably since everyone is already initialised.<br>
 | 
			
		||||
	 * It personalises the screen more.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param username The name of the User
 | 
			
		||||
	 * @param Email    The Email that is associated with that Account
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public static void open(String username) {// , String Email) {AUSKLAMMERN, WENN ANMELDUNG PER
 | 
			
		||||
												// EMAIL IMPLEMENTIERT IST!
 | 
			
		||||
		open(new SettingsScreen(username));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	public static void open(SettingsScreen dialog) {
 | 
			
		||||
		dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
 | 
			
		||||
		dialog.setModal(true);
 | 
			
		||||
		dialog.setVisible(true);
 | 
			
		||||
		settings = Settings.getInstance();
 | 
			
		||||
		uiColors.setDisplayMode(settings.isDarkMode());
 | 
			
		||||
		settingsScreen = new SettingsScreen();
 | 
			
		||||
		settingsScreen.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
 | 
			
		||||
		settingsScreen.setModal(true);
 | 
			
		||||
		settingsScreen.setVisible(true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Builds the Settings screen.<br>
 | 
			
		||||
	 * Use only as Dev/Error Mode.<br>
 | 
			
		||||
	 * Avoid usage.
 | 
			
		||||
	 * Builds the settings screen.<br>
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public SettingsScreen() {
 | 
			
		||||
		setBackground(Color.BLACK);
 | 
			
		||||
	private SettingsScreen() {
 | 
			
		||||
 | 
			
		||||
		setBounds(100, 100, 450, 300);
 | 
			
		||||
		getContentPane().setLayout(new BorderLayout());
 | 
			
		||||
		contentPanel.setBackground(Color.BLACK);
 | 
			
		||||
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
 | 
			
		||||
		getContentPane().add(contentPanel, BorderLayout.CENTER);
 | 
			
		||||
		contentPanel.setLayout(new BorderLayout(0, 0));
 | 
			
		||||
		{
 | 
			
		||||
			JPanel buttonPane = new JPanel();
 | 
			
		||||
			buttonPane.setBackground(Color.BLACK);
 | 
			
		||||
			getContentPane().add(buttonPane, BorderLayout.SOUTH);
 | 
			
		||||
			buttonPane.setLayout(new BorderLayout(0, 0));
 | 
			
		||||
			{
 | 
			
		||||
				JButton okButton = new JButton("Save");
 | 
			
		||||
				okButton.setActionCommand("OK");
 | 
			
		||||
				buttonPane.add(okButton, BorderLayout.EAST);
 | 
			
		||||
				getRootPane().setDefaultButton(okButton);
 | 
			
		||||
				okButton.addActionListener((evt) -> {
 | 
			
		||||
					// Hier später die Daten abspeichern, wenn Datenmodell implementiert ist
 | 
			
		||||
					dispose();
 | 
			
		||||
				});
 | 
			
		||||
			}
 | 
			
		||||
			{
 | 
			
		||||
				JButton cancelButton = new JButton("Cancel");
 | 
			
		||||
				cancelButton.setActionCommand("Cancel");
 | 
			
		||||
				buttonPane.add(cancelButton, BorderLayout.WEST);
 | 
			
		||||
 | 
			
		||||
				cancelButton.addActionListener((evt) -> { dispose(); });
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Builds the Settings screen.<br>
 | 
			
		||||
	 * Use preferreably since everyone is already initialised.<br>
 | 
			
		||||
	 * It personalises the screen more.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param Username The name of the User
 | 
			
		||||
	 * @param Email    The Email that is associated with that Account
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public SettingsScreen(String Username) {// , String Email, String hashedPwd) {AUSKLAMMERN, WENN ANMELDUNG PER EMAIL
 | 
			
		||||
											// IMPLEMENTIERT IST!
 | 
			
		||||
		setBackground(Color.BLACK);
 | 
			
		||||
		setBounds(100, 100, 450, 300);
 | 
			
		||||
		getContentPane().setLayout(new BorderLayout());
 | 
			
		||||
		contentPanel.setBackground(Color.BLACK);
 | 
			
		||||
		contentPanel.setLayout(new FlowLayout());
 | 
			
		||||
		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
 | 
			
		||||
		contentPanel.setBorder(new EmptyBorder(space, space, space, space));
 | 
			
		||||
		getContentPane().add(contentPanel, BorderLayout.CENTER);
 | 
			
		||||
		{
 | 
			
		||||
			JPanel buttonPane = new JPanel();
 | 
			
		||||
			buttonPane.setBackground(Color.BLACK);
 | 
			
		||||
			getContentPane().add(buttonPane, BorderLayout.SOUTH);
 | 
			
		||||
			buttonPane.setLayout(new BorderLayout(0, 0));
 | 
			
		||||
			GridBagLayout gbl_buttonPane = new GridBagLayout();
 | 
			
		||||
			gbl_buttonPane.columnWidths		= new int[] { 100, 250, 100, 0 };
 | 
			
		||||
			gbl_buttonPane.rowHeights		= new int[] { 25, 0 };
 | 
			
		||||
			gbl_buttonPane.columnWeights	= new double[] { 0.0, 0.0, 0.0, Double.MIN_VALUE };
 | 
			
		||||
			gbl_buttonPane.rowWeights		= new double[] { 0.0, Double.MIN_VALUE };
 | 
			
		||||
			buttonPane.setLayout(gbl_buttonPane);
 | 
			
		||||
			{
 | 
			
		||||
				JButton okButton = new JButton("Save");
 | 
			
		||||
				okButton.setActionCommand("OK");
 | 
			
		||||
				buttonPane.add(okButton, BorderLayout.EAST);
 | 
			
		||||
				getRootPane().setDefaultButton(okButton);
 | 
			
		||||
				okButton.addActionListener((evt) -> {
 | 
			
		||||
					// Hier später die Daten abspeichern, wenn Datenmodell implementiert ist
 | 
			
		||||
					dispose();
 | 
			
		||||
				});
 | 
			
		||||
			}
 | 
			
		||||
			{
 | 
			
		||||
				JButton cancelButton = new JButton("Cancel");
 | 
			
		||||
				cancelButton.setActionCommand("Cancel");
 | 
			
		||||
				buttonPane.add(cancelButton, BorderLayout.WEST);
 | 
			
		||||
				GridBagConstraints gbc_cancelButton = new GridBagConstraints();
 | 
			
		||||
				gbc_cancelButton.anchor	= GridBagConstraints.NORTHWEST;
 | 
			
		||||
				gbc_cancelButton.insets	= new Insets(space, space, space, space);
 | 
			
		||||
				gbc_cancelButton.gridx	= 0;
 | 
			
		||||
				gbc_cancelButton.gridy	= 0;
 | 
			
		||||
				buttonPane.add(cancelButton, gbc_cancelButton);
 | 
			
		||||
 | 
			
		||||
				cancelButton.addActionListener((evt) -> { dispose(); });
 | 
			
		||||
			}
 | 
			
		||||
			{
 | 
			
		||||
				okButton.setActionCommand("OK");
 | 
			
		||||
				GridBagConstraints gbc_okButton = new GridBagConstraints();
 | 
			
		||||
				gbc_okButton.anchor	= GridBagConstraints.NORTHEAST;
 | 
			
		||||
				gbc_okButton.fill	= GridBagConstraints.EAST;
 | 
			
		||||
				gbc_okButton.insets	= new Insets(space, space, space, space);
 | 
			
		||||
				gbc_okButton.gridx	= 2;
 | 
			
		||||
				gbc_okButton.gridy	= 0;
 | 
			
		||||
				buttonPane.add(okButton, gbc_okButton);
 | 
			
		||||
				getRootPane().setDefaultButton(okButton);
 | 
			
		||||
				okButton.addActionListener((evt) -> {
 | 
			
		||||
					try {
 | 
			
		||||
						settings.setUsername(settings.getUsername());// still temporary value
 | 
			
		||||
						settings.setEmail(settings.getEmail());// still temporary value
 | 
			
		||||
						settings.setDarkMode(false);// TODO temporary values while no UI is implemented
 | 
			
		||||
						settings.setEnterToSend(settings.isEnterToSend());// still temporary value
 | 
			
		||||
						settings.save();
 | 
			
		||||
					} catch (Exception e) {
 | 
			
		||||
						System.err.println("Something went wrong when changing the setting");
 | 
			
		||||
						settingsScreen.dispose();
 | 
			
		||||
					}
 | 
			
		||||
					JOptionPane.showConfirmDialog(settingsScreen, "Successfully changed settings");
 | 
			
		||||
				});
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		changeSettingsScreenColors();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return true if Enter should be used to send a message instead of ctrl+enter
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public static boolean isEnterToSend() { return enterToSend; }
 | 
			
		||||
	private void changeSettingsScreenColors() {
 | 
			
		||||
		// whole JDialog
 | 
			
		||||
		setBackground(uiColors.getBackgroundColor());
 | 
			
		||||
		// contentPanel
 | 
			
		||||
		contentPanel.setBackground(uiColors.getBackgroundColor());
 | 
			
		||||
		// buttonPane
 | 
			
		||||
		buttonPane.setBackground(uiColors.getBackgroundColor());
 | 
			
		||||
		// cancelButton
 | 
			
		||||
		cancelButton.setBackground(uiColors.getSpecialUseColor());
 | 
			
		||||
		cancelButton.setForeground(uiColors.getTextColor());
 | 
			
		||||
		// okButton
 | 
			
		||||
		okButton.setBackground(uiColors.getSpecialUseColor());
 | 
			
		||||
		okButton.setForeground(uiColors.getTextColor());
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param enterToSend <br>
 | 
			
		||||
	 *                    toggles whether a message should be sent via
 | 
			
		||||
	 *                    <br>
 | 
			
		||||
	 *                    buttonpress "enter" or "ctrl"+"enter"
 | 
			
		||||
	 * @since Envoy v0.1-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public static void setEnterToSend(boolean enterForSend) { enterToSend = enterForSend; }
 | 
			
		||||
	// TODO: Should be changed to private, but later to avoid warnings
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,7 @@ import javax.swing.JOptionPane;
 | 
			
		||||
import envoy.client.Client;
 | 
			
		||||
import envoy.client.Config;
 | 
			
		||||
import envoy.client.LocalDB;
 | 
			
		||||
import envoy.client.Settings;
 | 
			
		||||
import envoy.exception.EnvoyException;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -60,10 +61,11 @@ public class Startup {
 | 
			
		||||
					"Local DB error",
 | 
			
		||||
					JOptionPane.WARNING_MESSAGE);
 | 
			
		||||
		}
 | 
			
		||||
		Settings settings = Settings.getInstance();//TODO delete line
 | 
			
		||||
 | 
			
		||||
		EventQueue.invokeLater(() -> {
 | 
			
		||||
			try {
 | 
			
		||||
				ChatWindow frame = new ChatWindow(client, localDB);
 | 
			
		||||
				ChatWindow frame = new ChatWindow(client, localDB, settings);
 | 
			
		||||
				frame.setVisible(true);
 | 
			
		||||
			} catch (Exception e) {
 | 
			
		||||
				e.printStackTrace();
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										158
									
								
								src/main/java/envoy/client/ui/UIColors.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										158
									
								
								src/main/java/envoy/client/ui/UIColors.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,158 @@
 | 
			
		||||
package envoy.client.ui;
 | 
			
		||||
 | 
			
		||||
import java.awt.Color;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * This class stores the colors that are used in Envoy.
 | 
			
		||||
 * <br>
 | 
			
		||||
 * <br>
 | 
			
		||||
 * Project: <strong>envoy-client</strong><br>
 | 
			
		||||
 * File: <strong>EnvoyColors.java</strong><br>
 | 
			
		||||
 * Created: <strong>16 Nov 2019</strong><br>
 | 
			
		||||
 * 
 | 
			
		||||
 * @author Leon Hofmeister
 | 
			
		||||
 * @since Envoy v0.2-alpha
 | 
			
		||||
 */
 | 
			
		||||
public class UIColors {
 | 
			
		||||
 | 
			
		||||
	private UIColors() {}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * This color is used for the general background where no other elements
 | 
			
		||||
	 * overlap.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	private Color backgroundColor;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * This color is used as background for all areas where a user can interact with
 | 
			
		||||
	 * Envoy.
 | 
			
		||||
	 * (i.e. a JTextArea or JList)
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
 | 
			
		||||
	private Color userInteractionColor;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * This color is used for any areas that need special attention.
 | 
			
		||||
	 * (i.e. highlighting a selected list column or a button background)
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	private Color specialUseColor;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * This color is the color in which text will be displayed.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	private Color textColor;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * This object ensures that only one {@link UIColors} object exists.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	private static UIColors uIColors;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * This method is used to ensure that there is only one instance of EnvoyColors.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param darkMode default value how envoyColors should be displayed
 | 
			
		||||
	 * @return the instance of EnvoyColors
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public static UIColors getInstance(boolean darkMode) {
 | 
			
		||||
		if (uIColors == null) { uIColors = new UIColors(); }
 | 
			
		||||
		uIColors.setDisplayMode(darkMode);
 | 
			
		||||
		return uIColors;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Used to change the appearance of Envoy.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @param darkMode if true, Envoy will be displayed in dark mode else it will
 | 
			
		||||
	 *                 use bright mode
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void setDisplayMode(boolean darkMode) {
 | 
			
		||||
		if (darkMode) {
 | 
			
		||||
			uIColors.setBackgroundColor(Color.black); // TODO: other color suggestions?
 | 
			
		||||
			uIColors.setUserInteractionColor(Color.darkGray); // temporary
 | 
			
		||||
			uIColors.setSpecialUseColor(Color.blue); // temporary
 | 
			
		||||
			uIColors.setTextColor(Color.white); // temporary
 | 
			
		||||
 | 
			
		||||
		} else {
 | 
			
		||||
			uIColors.setBackgroundColor(Color.white); // temporary
 | 
			
		||||
			uIColors.setUserInteractionColor(Color.lightGray); // temporary
 | 
			
		||||
			uIColors.setSpecialUseColor(Color.green); // temporary
 | 
			
		||||
			uIColors.setTextColor(Color.black); // temporary
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return the {@link UIColors#backgroundColor}
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public Color getBackgroundColor() { return backgroundColor; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param backgroundColor the new {@link UIColors#backgroundColor}
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void setBackgroundColor(Color backgroundColor) { this.backgroundColor = backgroundColor; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return the {@link UIColors#userInteractionColor}
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public Color getUserInteractionColor() { return userInteractionColor; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param userInteractionColor the new {@link UIColors#userInteractionColor}
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void setUserInteractionColor(Color userInteractionColor) {
 | 
			
		||||
		this.userInteractionColor = userInteractionColor;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return the {@link UIColors#specialUseColor}
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public Color getSpecialUseColor() { return specialUseColor; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param specialUseColor the new {@link UIColors#specialUseColor}
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void setSpecialUseColor(Color specialUseColor) { this.specialUseColor = specialUseColor; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return the {@link UIColors#textColor}
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public Color getTextColor() { return textColor; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param textColor the new {@link UIColors#textColor}
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public void setTextColor(Color textColor) { this.textColor = textColor; }
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * @return the {@link UIColors#uIColors}
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public static UIColors getEnvoyColors() { return uIColors; }
 | 
			
		||||
 | 
			
		||||
	@Deprecated
 | 
			
		||||
	/**
 | 
			
		||||
	 * @param envoyColors the new {@link EnvoyColors#envoyColors}
 | 
			
		||||
	 * @since Envoy v0.2-alpha
 | 
			
		||||
	 */
 | 
			
		||||
	public static void setEnvoyColors(UIColors uIColors) { UIColors.uIColors = uIColors; }
 | 
			
		||||
}
 | 
			
		||||
@@ -56,6 +56,12 @@ public class UserListRenderer extends JLabel implements ListCellRenderer<User> {
 | 
			
		||||
						status,
 | 
			
		||||
						name));
 | 
			
		||||
				break;
 | 
			
		||||
			case AFK:
 | 
			
		||||
				break;
 | 
			
		||||
			case DO_NOT_DISTURB:
 | 
			
		||||
				break;
 | 
			
		||||
			default:
 | 
			
		||||
				break;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user