Created packages ui.renderer and ui.primary
This commit is contained in:
		| @@ -7,7 +7,7 @@ import java.util.function.Consumer; | ||||
|  | ||||
| import javax.swing.JComponent; | ||||
|  | ||||
| import envoy.client.ui.PrimaryToggleSwitch; | ||||
| import envoy.client.ui.primary.PrimaryToggleSwitch; | ||||
|  | ||||
| /** | ||||
|  * Encapsulates a persistent value that is directly or indirectly mutable by the | ||||
|   | ||||
| @@ -20,6 +20,12 @@ import envoy.client.net.Client; | ||||
| import envoy.client.net.WriteProxy; | ||||
| import envoy.client.ui.list.ComponentList; | ||||
| import envoy.client.ui.list.ComponentListModel; | ||||
| import envoy.client.ui.primary.PrimaryButton; | ||||
| import envoy.client.ui.primary.PrimaryScrollPane; | ||||
| import envoy.client.ui.primary.PrimaryTextArea; | ||||
| import envoy.client.ui.renderer.ContactsSearchRenderer; | ||||
| import envoy.client.ui.renderer.MessageListRenderer; | ||||
| import envoy.client.ui.renderer.UserListRenderer; | ||||
| import envoy.client.ui.settings.SettingsScreen; | ||||
| import envoy.data.Message; | ||||
| import envoy.data.Message.MessageStatus; | ||||
| @@ -110,7 +116,15 @@ public class ChatWindow extends JFrame { | ||||
| 		contentPane.setLayout(gbl_contentPane); | ||||
|  | ||||
| 		messageList.setBorder(new EmptyBorder(space, space, space, space)); | ||||
| 		messageList.addMouseListener(new MouseAdapter() { | ||||
|  | ||||
| 			@Override | ||||
| 			public void mouseClicked(MouseEvent e) { | ||||
| 				if (e.isPopupTrigger()) { | ||||
|  | ||||
| 				} | ||||
| 			} | ||||
| 		}); | ||||
| 		scrollPane.setViewportView(messageList); | ||||
| 		scrollPane.addComponentListener(new ComponentAdapter() { | ||||
|  | ||||
|   | ||||
| @@ -16,6 +16,7 @@ import javax.swing.border.EmptyBorder; | ||||
| import envoy.client.data.*; | ||||
| import envoy.client.event.HandshakeSuccessfulEvent; | ||||
| import envoy.client.net.Client; | ||||
| import envoy.client.ui.primary.PrimaryButton; | ||||
| import envoy.data.LoginCredentials; | ||||
| import envoy.data.Message; | ||||
| import envoy.data.User; | ||||
|   | ||||
| @@ -1,63 +1,63 @@ | ||||
| package envoy.client.ui; | ||||
| 
 | ||||
| import java.awt.Graphics; | ||||
| 
 | ||||
| import javax.swing.JButton; | ||||
| 
 | ||||
| /** | ||||
|  * Project: <strong>envoy-client</strong><br> | ||||
|  * File: <strong>PrimaryButton.javaEvent.java</strong><br> | ||||
|  * Created: <strong>07.12.2019</strong><br> | ||||
|  * | ||||
|  * @author Kai S. K. Engelbart | ||||
|  * @author Maximilian Käfer | ||||
|  * @since Envoy v0.2-alpha | ||||
|  */ | ||||
| public class PrimaryButton extends JButton { | ||||
| 
 | ||||
| 	private static final long serialVersionUID = 3662266120667728364L; | ||||
| 
 | ||||
| 	private int arcSize; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Creates a primary button | ||||
| 	 * | ||||
| 	 * @param title the title of the button | ||||
| 	 * @since Envoy 0.2-alpha | ||||
| 	 */ | ||||
| 	public PrimaryButton(String title) { this(title, 6); } | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Creates a primary button | ||||
| 	 * | ||||
| 	 * @param title   the title of the button | ||||
| 	 * @param arcSize the size of the arc used to draw the round button edges | ||||
| 	 * @since Envoy 0.2-alpha | ||||
| 	 */ | ||||
| 	public PrimaryButton(String title, int arcSize) { | ||||
| 		super(title); | ||||
| 		setBorderPainted(false); | ||||
| 		setFocusPainted(false); | ||||
| 		setContentAreaFilled(false); | ||||
| 		this.arcSize = arcSize; | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	protected void paintComponent(Graphics g) { | ||||
| 		g.setColor(getBackground()); | ||||
| 		g.fillRoundRect(0, 0, getWidth(), getHeight(), arcSize, arcSize); | ||||
| 		super.paintComponent(g); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @return the arcSize | ||||
| 	 * @since Envoy 0.2-alpha | ||||
| 	 */ | ||||
| 	public int getArcSize() { return arcSize; } | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param arcSize the arcSize to set | ||||
| 	 * @since Envoy 0.2-alpha | ||||
| 	 */ | ||||
| 	public void setArcSize(int arcSize) { this.arcSize = arcSize; } | ||||
| } | ||||
| package envoy.client.ui.primary; | ||||
| 
 | ||||
| import java.awt.Graphics; | ||||
| 
 | ||||
| import javax.swing.JButton; | ||||
| 
 | ||||
| /** | ||||
|  * Project: <strong>envoy-client</strong><br> | ||||
|  * File: <strong>PrimaryButton.javaEvent.java</strong><br> | ||||
|  * Created: <strong>07.12.2019</strong><br> | ||||
|  * | ||||
|  * @author Kai S. K. Engelbart | ||||
|  * @author Maximilian Käfer | ||||
|  * @since Envoy v0.2-alpha | ||||
|  */ | ||||
| public class PrimaryButton extends JButton { | ||||
| 
 | ||||
| 	private static final long serialVersionUID = 3662266120667728364L; | ||||
| 
 | ||||
| 	private int arcSize; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Creates a primary button | ||||
| 	 * | ||||
| 	 * @param title the title of the button | ||||
| 	 * @since Envoy 0.2-alpha | ||||
| 	 */ | ||||
| 	public PrimaryButton(String title) { this(title, 6); } | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Creates a primary button | ||||
| 	 * | ||||
| 	 * @param title   the title of the button | ||||
| 	 * @param arcSize the size of the arc used to draw the round button edges | ||||
| 	 * @since Envoy 0.2-alpha | ||||
| 	 */ | ||||
| 	public PrimaryButton(String title, int arcSize) { | ||||
| 		super(title); | ||||
| 		setBorderPainted(false); | ||||
| 		setFocusPainted(false); | ||||
| 		setContentAreaFilled(false); | ||||
| 		this.arcSize = arcSize; | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	protected void paintComponent(Graphics g) { | ||||
| 		g.setColor(getBackground()); | ||||
| 		g.fillRoundRect(0, 0, getWidth(), getHeight(), arcSize, arcSize); | ||||
| 		super.paintComponent(g); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @return the arcSize | ||||
| 	 * @since Envoy 0.2-alpha | ||||
| 	 */ | ||||
| 	public int getArcSize() { return arcSize; } | ||||
| 
 | ||||
| 	/** | ||||
| 	 * @param arcSize the arcSize to set | ||||
| 	 * @since Envoy 0.2-alpha | ||||
| 	 */ | ||||
| 	public void setArcSize(int arcSize) { this.arcSize = arcSize; } | ||||
| } | ||||
| @@ -1,4 +1,4 @@ | ||||
| package envoy.client.ui; | ||||
| package envoy.client.ui.primary; | ||||
| 
 | ||||
| import java.awt.Color; | ||||
| import java.awt.Dimension; | ||||
| @@ -13,6 +13,7 @@ import javax.swing.JScrollBar; | ||||
| import javax.swing.plaf.basic.BasicScrollBarUI; | ||||
| 
 | ||||
| import envoy.client.data.Settings; | ||||
| import envoy.client.ui.Theme; | ||||
| 
 | ||||
| /** | ||||
|  * Project: <strong>envoy-client</strong><br> | ||||
| @@ -1,7 +1,9 @@ | ||||
| package envoy.client.ui; | ||||
| package envoy.client.ui.primary; | ||||
| 
 | ||||
| import javax.swing.JScrollPane; | ||||
| 
 | ||||
| import envoy.client.ui.Theme; | ||||
| 
 | ||||
| /** | ||||
|  * Project: <strong>envoy-client</strong><br> | ||||
|  * File: <strong>PrimaryScrollPane.java</strong><br> | ||||
| @@ -1,4 +1,4 @@ | ||||
| package envoy.client.ui; | ||||
| package envoy.client.ui.primary; | ||||
| 
 | ||||
| import java.awt.Font; | ||||
| import java.awt.Graphics; | ||||
| @@ -1,57 +1,58 @@ | ||||
| package envoy.client.ui; | ||||
| 
 | ||||
| import java.awt.Dimension; | ||||
| import java.awt.Graphics; | ||||
| 
 | ||||
| import javax.swing.JButton; | ||||
| 
 | ||||
| import envoy.client.data.Settings; | ||||
| import envoy.client.data.SettingsItem; | ||||
| 
 | ||||
| /** | ||||
|  * This component can be used to toggle between two options. This will change | ||||
|  * the state of a {@code boolean} {@link SettingsItem}.<br> | ||||
|  * <br> | ||||
|  * Project: <strong>envoy-client</strong><br> | ||||
|  * File: <strong>PrimaryToggleSwitch.java</strong><br> | ||||
|  * Created: <strong>21 Dec 2019</strong><br> | ||||
|  * | ||||
|  * @author Maximilian Käfer | ||||
|  * @author Kai S. K. Engelbart | ||||
|  * @since Envoy v0.3-alpha | ||||
|  */ | ||||
| public class PrimaryToggleSwitch extends JButton { | ||||
| 
 | ||||
| 	private boolean state; | ||||
| 
 | ||||
| 	private static final long serialVersionUID = -721155303106833184L; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Initializes a {@link PrimaryToggleSwitch}. | ||||
| 	 * | ||||
| 	 * @param settingsItem the {@link SettingsItem} that is controlled by this | ||||
| 	 *                     {@link PrimaryToggleSwitch} | ||||
| 	 * @since Envoy v0.3-alpha | ||||
| 	 */ | ||||
| 	public PrimaryToggleSwitch(SettingsItem<Boolean> settingsItem) { | ||||
| 		setPreferredSize(new Dimension(50, 25)); | ||||
| 		setMinimumSize(new Dimension(50, 25)); | ||||
| 		setMaximumSize(new Dimension(50, 25)); | ||||
| 
 | ||||
| 		setBorderPainted(false); | ||||
| 		setFocusPainted(false); | ||||
| 		setContentAreaFilled(false); | ||||
| 
 | ||||
| 		state = settingsItem.get(); | ||||
| 		addActionListener((evt) -> { state = !state; settingsItem.set(state); revalidate(); repaint(); }); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public void paintComponent(Graphics g) { | ||||
| 		g.setColor(state ? Color.GREEN : Color.LIGHT_GRAY); | ||||
| 		g.fillRoundRect(0, 0, getWidth(), getHeight(), 25, 25); | ||||
| 
 | ||||
| 		g.setColor(Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getInteractableBackgroundColor()); | ||||
| 		g.fillRoundRect(state ? 25 : 0, 0, 25, 25, 25, 25); | ||||
| 	} | ||||
| } | ||||
| package envoy.client.ui.primary; | ||||
| 
 | ||||
| import java.awt.Dimension; | ||||
| import java.awt.Graphics; | ||||
| 
 | ||||
| import javax.swing.JButton; | ||||
| 
 | ||||
| import envoy.client.data.Settings; | ||||
| import envoy.client.data.SettingsItem; | ||||
| import envoy.client.ui.Color; | ||||
| 
 | ||||
| /** | ||||
|  * This component can be used to toggle between two options. This will change | ||||
|  * the state of a {@code boolean} {@link SettingsItem}.<br> | ||||
|  * <br> | ||||
|  * Project: <strong>envoy-client</strong><br> | ||||
|  * File: <strong>PrimaryToggleSwitch.java</strong><br> | ||||
|  * Created: <strong>21 Dec 2019</strong><br> | ||||
|  * | ||||
|  * @author Maximilian Käfer | ||||
|  * @author Kai S. K. Engelbart | ||||
|  * @since Envoy v0.3-alpha | ||||
|  */ | ||||
| public class PrimaryToggleSwitch extends JButton { | ||||
| 
 | ||||
| 	private boolean state; | ||||
| 
 | ||||
| 	private static final long serialVersionUID = -721155303106833184L; | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Initializes a {@link PrimaryToggleSwitch}. | ||||
| 	 * | ||||
| 	 * @param settingsItem the {@link SettingsItem} that is controlled by this | ||||
| 	 *                     {@link PrimaryToggleSwitch} | ||||
| 	 * @since Envoy v0.3-alpha | ||||
| 	 */ | ||||
| 	public PrimaryToggleSwitch(SettingsItem<Boolean> settingsItem) { | ||||
| 		setPreferredSize(new Dimension(50, 25)); | ||||
| 		setMinimumSize(new Dimension(50, 25)); | ||||
| 		setMaximumSize(new Dimension(50, 25)); | ||||
| 
 | ||||
| 		setBorderPainted(false); | ||||
| 		setFocusPainted(false); | ||||
| 		setContentAreaFilled(false); | ||||
| 
 | ||||
| 		state = settingsItem.get(); | ||||
| 		addActionListener((evt) -> { state = !state; settingsItem.set(state); revalidate(); repaint(); }); | ||||
| 	} | ||||
| 
 | ||||
| 	@Override | ||||
| 	public void paintComponent(Graphics g) { | ||||
| 		g.setColor(state ? Color.GREEN : Color.LIGHT_GRAY); | ||||
| 		g.fillRoundRect(0, 0, getWidth(), getHeight(), 25, 25); | ||||
| 
 | ||||
| 		g.setColor(Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getInteractableBackgroundColor()); | ||||
| 		g.fillRoundRect(state ? 25 : 0, 0, 25, 25, 25, 25); | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										17
									
								
								src/main/java/envoy/client/ui/primary/package-info.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/main/java/envoy/client/ui/primary/package-info.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| /** | ||||
|  * This package defines all "primary" components that were defined specifically | ||||
|  * for the visual improvement of Envoy. However, they can still be used in | ||||
|  * general for other projects.<br> | ||||
|  * Primary elements are supposed to provide the main functionality of a UI | ||||
|  * component.<br> | ||||
|  * <br> | ||||
|  * Project: <strong>envoy-client</strong><br> | ||||
|  * File: <strong>package-info.java</strong><br> | ||||
|  * Created: <strong>14 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.primary; | ||||
| @@ -1,4 +1,4 @@ | ||||
| package envoy.client.ui; | ||||
| package envoy.client.ui.renderer; | ||||
| 
 | ||||
| import java.awt.Component; | ||||
| import java.awt.Dimension; | ||||
| @@ -8,8 +8,10 @@ import javax.swing.*; | ||||
| 
 | ||||
| import envoy.client.data.Settings; | ||||
| import envoy.client.event.SendEvent; | ||||
| import envoy.client.ui.Color; | ||||
| import envoy.client.ui.list.ComponentList; | ||||
| import envoy.client.ui.list.ComponentListCellRenderer; | ||||
| import envoy.client.ui.primary.PrimaryButton; | ||||
| import envoy.data.User; | ||||
| import envoy.event.ContactOperationEvent; | ||||
| import envoy.event.EventBus; | ||||
| @@ -1,15 +1,21 @@ | ||||
| package envoy.client.ui; | ||||
| package envoy.client.ui.renderer; | ||||
| 
 | ||||
| import java.awt.BorderLayout; | ||||
| import java.awt.Font; | ||||
| import java.awt.image.BufferedImage; | ||||
| import java.io.IOException; | ||||
| import java.text.SimpleDateFormat; | ||||
| import java.util.EnumMap; | ||||
| 
 | ||||
| import javax.imageio.ImageIO; | ||||
| import javax.swing.*; | ||||
| 
 | ||||
| import envoy.client.data.Settings; | ||||
| import envoy.client.ui.Color; | ||||
| import envoy.client.ui.Theme; | ||||
| import envoy.client.ui.list.ComponentList; | ||||
| import envoy.client.ui.list.ComponentListCellRenderer; | ||||
| import envoy.data.Message; | ||||
| import envoy.data.Message.MessageStatus; | ||||
| 
 | ||||
| /** | ||||
|  * Defines how a message is displayed.<br> | ||||
| @@ -25,12 +31,23 @@ import envoy.data.Message; | ||||
|  */ | ||||
| public class MessageListRenderer implements ComponentListCellRenderer<Message> { | ||||
| 
 | ||||
| 	private static final EnumMap<MessageStatus, BufferedImage> statusIcons = new EnumMap<>(MessageStatus.class); | ||||
| 
 | ||||
| 	static { | ||||
| 		for (MessageStatus ms : MessageStatus.values()) | ||||
| 			try { | ||||
| 				statusIcons.put(ms, ImageIO.read(MessageListRenderer.class.getResourceAsStream(ms.toString().toLowerCase() + "_icon.png"))); | ||||
| 			} catch (IOException e) { | ||||
| 				e.printStackTrace(); | ||||
| 			} | ||||
| 	} | ||||
| 
 | ||||
| 	private JTextArea messageTextArea; | ||||
| 
 | ||||
| 	@Override | ||||
| 	public JPanel getListCellComponent(ComponentList<? extends Message> list, Message value, boolean isSelected) { | ||||
| 		final JPanel panel = new JPanel(); | ||||
| 		panel.setLayout(new BorderLayout()); | ||||
| 		panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); | ||||
| 		final Theme theme = Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()); | ||||
| 
 | ||||
| 		// Panel background | ||||
| @@ -47,7 +64,17 @@ public class MessageListRenderer implements ComponentListCellRenderer<Message> { | ||||
| 		// Set the date color to be the value of DateColorChat | ||||
| 		dateLabel.setForeground(theme.getDateColor()); | ||||
| 
 | ||||
| 		panel.add(dateLabel, BorderLayout.NORTH); | ||||
| 		panel.add(dateLabel); | ||||
| 
 | ||||
| 		if (value.isForwarded()) try { | ||||
| 			var forwardLabel = new JLabel("Forwarded", new ImageIcon(ClassLoader.getSystemResourceAsStream(null).readAllBytes()), | ||||
| 					SwingConstants.CENTER); | ||||
| 			forwardLabel.setBackground(panel.getBackground()); | ||||
| 			forwardLabel.setForeground(Color.lightGray); | ||||
| 			panel.add(forwardLabel); | ||||
| 		} catch (IOException e) { | ||||
| 			e.printStackTrace(); | ||||
| 		} | ||||
| 
 | ||||
| 		// The JTextArea that displays the text content of a message and its status | ||||
| 		messageTextArea = new JTextArea(text + System.getProperty("line.separator")); | ||||
| @@ -58,7 +85,7 @@ public class MessageListRenderer implements ComponentListCellRenderer<Message> { | ||||
| 		messageTextArea.setBackground(panel.getBackground()); | ||||
| 		messageTextArea.setEditable(false); | ||||
| 
 | ||||
| 		panel.add(messageTextArea, BorderLayout.CENTER); | ||||
| 		panel.add(messageTextArea); | ||||
| 
 | ||||
| 		JLabel statusLabel = new JLabel(state); | ||||
| 		statusLabel.setFont(new Font("Arial", Font.BOLD, 14)); | ||||
| @@ -83,7 +110,7 @@ public class MessageListRenderer implements ComponentListCellRenderer<Message> { | ||||
| 		statusLabel.setForeground(statusColor); | ||||
| 		statusLabel.setBackground(panel.getBackground()); | ||||
| 
 | ||||
| 		panel.add(statusLabel, BorderLayout.SOUTH); | ||||
| 		panel.add(statusLabel); | ||||
| 
 | ||||
| 		// Define some space to the messages below | ||||
| 		panel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(), BorderFactory.createEtchedBorder())); | ||||
| @@ -1,4 +1,4 @@ | ||||
| package envoy.client.ui; | ||||
| package envoy.client.ui.renderer; | ||||
| 
 | ||||
| import java.awt.Component; | ||||
| import java.awt.Dimension; | ||||
							
								
								
									
										14
									
								
								src/main/java/envoy/client/ui/renderer/package-info.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/main/java/envoy/client/ui/renderer/package-info.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| /** | ||||
|  * This package contains all Envoy-specific renderers for lists that store an | ||||
|  * arbitrary number of JComponents.<br> | ||||
|  * <br> | ||||
|  * Project: <strong>envoy-client</strong><br> | ||||
|  * File: <strong>package-info.java</strong><br> | ||||
|  * Created: <strong>14 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.renderer; | ||||
| @@ -1,228 +1,228 @@ | ||||
| package envoy.client.ui.settings; | ||||
|  | ||||
| import java.awt.*; | ||||
| import java.util.function.Consumer; | ||||
|  | ||||
| import javax.swing.JDialog; | ||||
| import javax.swing.JPanel; | ||||
| import javax.swing.JTextPane; | ||||
|  | ||||
| import envoy.client.data.Settings; | ||||
| import envoy.client.ui.PrimaryButton; | ||||
| import envoy.client.ui.PrimaryTextArea; | ||||
| import envoy.client.ui.Theme; | ||||
|  | ||||
| /** | ||||
|  * Displays window where you can choose a name for the new {@link Theme}. | ||||
|  * <br> | ||||
|  * Project: <strong>envoy-client</strong><br> | ||||
|  * File: <strong>NewThemeScreen.java</strong><br> | ||||
|  * Created: <strong>26 Dec 2019</strong><br> | ||||
|  * | ||||
|  * @author Maximilian Käfer | ||||
|  * @since Envoy v0.3-alpha | ||||
|  */ | ||||
| public class NewThemeScreen extends JDialog { | ||||
|  | ||||
| 	private final JPanel	standardPanel		= new JPanel(); | ||||
| 	private final JPanel	secondaryPanel		= new JPanel(); | ||||
| 	private JTextPane		text				= new JTextPane(); | ||||
| 	private PrimaryTextArea	nameEnterTextArea	= new PrimaryTextArea(4); | ||||
| 	private PrimaryButton	confirmButton		= new PrimaryButton("Confirm"); | ||||
|  | ||||
| 	private JTextPane		errorText	= new JTextPane(); | ||||
| 	private PrimaryButton	otherName	= new PrimaryButton("Other Name"); | ||||
| 	private PrimaryButton	overwrite	= new PrimaryButton("Overwrite"); | ||||
|  | ||||
| 	private final Consumer<String> newThemeAction, modifyThemeAction; | ||||
|  | ||||
| 	private static final long serialVersionUID = 2369985550946300976L; | ||||
|  | ||||
| 	/** | ||||
| 	 * Creates a window, where you can choose a name for a new {@link Theme}. <br> | ||||
| 	 * There are two versions of this Window. The first one is responsible for | ||||
| 	 * choosing the name, the second one appears, if the name already exists. | ||||
| 	 * | ||||
| 	 * @param parent            the dialog is launched with its location relative to | ||||
| 	 *                          this {@link SettingsScreen} | ||||
| 	 * @param newThemeAction    is executed when a new theme name is entered | ||||
| 	 * @param modifyThemeAction is executed when an existing theme name is entered | ||||
| 	 *                          and confirmed | ||||
| 	 * @since Envoy v0.3-alpha | ||||
| 	 */ | ||||
| 	public NewThemeScreen(SettingsScreen parent, Consumer<String> newThemeAction, Consumer<String> modifyThemeAction) { | ||||
| 		this.newThemeAction		= newThemeAction; | ||||
| 		this.modifyThemeAction	= modifyThemeAction; | ||||
|  | ||||
| 		setLocationRelativeTo(parent); | ||||
| 		setTitle("New Theme"); | ||||
| 		setModal(true); | ||||
|  | ||||
| 		setDimensions(true); | ||||
| 		setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); | ||||
|  | ||||
| 		Theme theme = Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()); | ||||
|  | ||||
| 		getContentPane().setLayout(new BorderLayout()); | ||||
| 		standardPanel.setBackground(theme.getBackgroundColor()); | ||||
| 		secondaryPanel.setBackground(theme.getBackgroundColor()); | ||||
| 		loadStandardContent(theme); | ||||
| 	} | ||||
|  | ||||
| 	private void setDimensions(boolean isStandard) { | ||||
| 		Dimension size = isStandard ? new Dimension(300, 170) : new Dimension(300, 225); | ||||
| 		setPreferredSize(size); | ||||
| 		setMinimumSize(size); | ||||
| 		setMaximumSize(size); | ||||
| 	} | ||||
|  | ||||
| 	private void loadStandardContent(Theme theme) { | ||||
| 		getContentPane().removeAll(); | ||||
|  | ||||
| 		// ContentPane | ||||
| 		GridBagLayout gbl_contentPanel = new GridBagLayout(); | ||||
|  | ||||
| 		gbl_contentPanel.columnWidths	= new int[] { 1, 1 }; | ||||
| 		gbl_contentPanel.rowHeights		= new int[] { 1, 1, 1 }; | ||||
| 		gbl_contentPanel.columnWeights	= new double[] { 1, 1 }; | ||||
| 		gbl_contentPanel.rowWeights		= new double[] { 1, 1, 1 }; | ||||
|  | ||||
| 		getContentPane().add(standardPanel, BorderLayout.CENTER); | ||||
| 		standardPanel.setLayout(gbl_contentPanel); | ||||
|  | ||||
| 		// text.setFont(new Font()); | ||||
| 		text.setText("Please enter a name for the new Theme"); | ||||
| 		text.setAlignmentX(CENTER_ALIGNMENT); | ||||
| 		text.setBackground(theme.getCellColor()); | ||||
| 		text.setForeground(theme.getUserNameColor()); | ||||
| 		text.setEditable(false); | ||||
|  | ||||
| 		GridBagConstraints gbc_text = new GridBagConstraints(); | ||||
| 		gbc_text.fill		= GridBagConstraints.HORIZONTAL; | ||||
| 		gbc_text.gridx		= 0; | ||||
| 		gbc_text.gridy		= 0; | ||||
| 		gbc_text.gridwidth	= 2; | ||||
| 		gbc_text.insets		= new Insets(5, 5, 5, 5); | ||||
|  | ||||
| 		standardPanel.add(text, gbc_text); | ||||
|  | ||||
| 		nameEnterTextArea.setBackground(theme.getCellColor()); | ||||
| 		nameEnterTextArea.setForeground(theme.getTypingMessageColor()); | ||||
| 		nameEnterTextArea.setText(""); | ||||
| 		nameEnterTextArea.setEditable(true); | ||||
|  | ||||
| 		GridBagConstraints gbc_input = new GridBagConstraints(); | ||||
| 		gbc_input.fill		= GridBagConstraints.HORIZONTAL; | ||||
| 		gbc_input.gridx		= 0; | ||||
| 		gbc_input.gridy		= 1; | ||||
| 		gbc_input.gridwidth	= 2; | ||||
| 		gbc_input.insets	= new Insets(5, 5, 5, 5); | ||||
|  | ||||
| 		standardPanel.add(nameEnterTextArea, gbc_input); | ||||
|  | ||||
| 		confirmButton.setBackground(theme.getInteractableBackgroundColor()); | ||||
| 		confirmButton.setForeground(theme.getInteractableForegroundColor()); | ||||
|  | ||||
| 		GridBagConstraints gbc_confirmButton = new GridBagConstraints(); | ||||
| 		gbc_confirmButton.gridx		= 0; | ||||
| 		gbc_confirmButton.gridy		= 2; | ||||
| 		gbc_confirmButton.gridwidth	= 2; | ||||
| 		gbc_confirmButton.insets	= new Insets(5, 5, 5, 5); | ||||
|  | ||||
| 		standardPanel.add(confirmButton, gbc_confirmButton); | ||||
|  | ||||
| 		confirmButton.addActionListener((evt) -> { | ||||
| 			if (!nameEnterTextArea.getText().isEmpty()) if (Settings.getInstance().getThemes().containsKey(nameEnterTextArea.getText())) { | ||||
| 				// load other panel | ||||
| 				setDimensions(false); | ||||
| 				loadSecondaryPage(theme); | ||||
| 			} else { | ||||
| 				newThemeAction.accept(nameEnterTextArea.getText()); | ||||
| 				dispose(); | ||||
| 			} | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	private void loadSecondaryPage(Theme theme) { | ||||
| 		// ContentPane | ||||
| 		getContentPane().removeAll(); | ||||
|  | ||||
| 		GridBagLayout gbl_secondaryPanel = new GridBagLayout(); | ||||
|  | ||||
| 		gbl_secondaryPanel.columnWidths		= new int[] { 1, 1 }; | ||||
| 		gbl_secondaryPanel.rowHeights		= new int[] { 1, 1, 1, 1 }; | ||||
| 		gbl_secondaryPanel.columnWeights	= new double[] { 1, 1 }; | ||||
| 		gbl_secondaryPanel.rowWeights		= new double[] { 1, 1, 1, 1 }; | ||||
|  | ||||
| 		getContentPane().add(secondaryPanel, BorderLayout.CENTER); | ||||
| 		secondaryPanel.setLayout(gbl_secondaryPanel); | ||||
|  | ||||
| 		// text.setFont(new Font()); | ||||
| 		text.setText("Please enter a name for the new Theme"); | ||||
| 		text.setAlignmentX(CENTER_ALIGNMENT); | ||||
| 		text.setBackground(theme.getCellColor()); | ||||
| 		text.setForeground(theme.getUserNameColor()); | ||||
| 		text.setEditable(false); | ||||
|  | ||||
| 		GridBagConstraints gbc_text = new GridBagConstraints(); | ||||
| 		gbc_text.fill		= GridBagConstraints.HORIZONTAL; | ||||
| 		gbc_text.gridx		= 0; | ||||
| 		gbc_text.gridy		= 0; | ||||
| 		gbc_text.gridwidth	= 2; | ||||
| 		gbc_text.insets		= new Insets(5, 5, 5, 5); | ||||
|  | ||||
| 		secondaryPanel.add(text, gbc_text); | ||||
|  | ||||
| 		nameEnterTextArea.setBackground(theme.getCellColor()); | ||||
| 		nameEnterTextArea.setForeground(theme.getTypingMessageColor()); | ||||
| 		nameEnterTextArea.setEditable(false); | ||||
|  | ||||
| 		GridBagConstraints gbc_input = new GridBagConstraints(); | ||||
| 		gbc_input.fill		= GridBagConstraints.HORIZONTAL; | ||||
| 		gbc_input.gridx		= 0; | ||||
| 		gbc_input.gridy		= 1; | ||||
| 		gbc_input.gridwidth	= 2; | ||||
| 		gbc_input.insets	= new Insets(5, 5, 5, 5); | ||||
|  | ||||
| 		secondaryPanel.add(nameEnterTextArea, gbc_input); | ||||
|  | ||||
| 		errorText.setText("The name does already exist. Choose another one or overwrite the old theme."); | ||||
| 		errorText.setAlignmentX(CENTER_ALIGNMENT); | ||||
| 		errorText.setBackground(theme.getCellColor()); | ||||
| 		errorText.setForeground(theme.getUserNameColor()); | ||||
| 		errorText.setEditable(false); | ||||
|  | ||||
| 		GridBagConstraints gbc_errorText = new GridBagConstraints(); | ||||
| 		gbc_errorText.fill		= GridBagConstraints.HORIZONTAL; | ||||
| 		gbc_errorText.gridx		= 0; | ||||
| 		gbc_errorText.gridy		= 2; | ||||
| 		gbc_errorText.gridwidth	= 2; | ||||
| 		gbc_errorText.insets	= new Insets(5, 5, 5, 5); | ||||
|  | ||||
| 		secondaryPanel.add(errorText, gbc_errorText); | ||||
|  | ||||
| 		otherName.setBackground(theme.getInteractableBackgroundColor()); | ||||
| 		otherName.setForeground(theme.getInteractableForegroundColor()); | ||||
|  | ||||
| 		GridBagConstraints gbc_otherName = new GridBagConstraints(); | ||||
| 		gbc_otherName.gridx		= 0; | ||||
| 		gbc_otherName.gridy		= 3; | ||||
| 		gbc_otherName.insets	= new Insets(5, 5, 5, 5); | ||||
|  | ||||
| 		secondaryPanel.add(otherName, gbc_otherName); | ||||
|  | ||||
| 		overwrite.setBackground(theme.getInteractableBackgroundColor()); | ||||
| 		overwrite.setForeground(theme.getInteractableForegroundColor()); | ||||
|  | ||||
| 		GridBagConstraints gbc_overwrite = new GridBagConstraints(); | ||||
| 		gbc_overwrite.gridx		= 1; | ||||
| 		gbc_overwrite.gridy		= 3; | ||||
| 		gbc_overwrite.insets	= new Insets(5, 5, 5, 5); | ||||
|  | ||||
| 		secondaryPanel.add(overwrite, gbc_overwrite); | ||||
|  | ||||
| 		otherName.addActionListener((evt) -> { setDimensions(true); loadStandardContent(theme); }); | ||||
|  | ||||
| 		overwrite.addActionListener((evt) -> { modifyThemeAction.accept(nameEnterTextArea.getText()); dispose(); }); | ||||
| 	} | ||||
| } | ||||
| package envoy.client.ui.settings; | ||||
|  | ||||
| import java.awt.*; | ||||
| import java.util.function.Consumer; | ||||
|  | ||||
| import javax.swing.JDialog; | ||||
| import javax.swing.JPanel; | ||||
| import javax.swing.JTextPane; | ||||
|  | ||||
| import envoy.client.data.Settings; | ||||
| import envoy.client.ui.Theme; | ||||
| import envoy.client.ui.primary.PrimaryButton; | ||||
| import envoy.client.ui.primary.PrimaryTextArea; | ||||
|  | ||||
| /** | ||||
|  * Displays window where you can choose a name for the new {@link Theme}. | ||||
|  * <br> | ||||
|  * Project: <strong>envoy-client</strong><br> | ||||
|  * File: <strong>NewThemeScreen.java</strong><br> | ||||
|  * Created: <strong>26 Dec 2019</strong><br> | ||||
|  * | ||||
|  * @author Maximilian Käfer | ||||
|  * @since Envoy v0.3-alpha | ||||
|  */ | ||||
| public class NewThemeScreen extends JDialog { | ||||
|  | ||||
| 	private final JPanel	standardPanel		= new JPanel(); | ||||
| 	private final JPanel	secondaryPanel		= new JPanel(); | ||||
| 	private JTextPane		text				= new JTextPane(); | ||||
| 	private PrimaryTextArea	nameEnterTextArea	= new PrimaryTextArea(4); | ||||
| 	private PrimaryButton	confirmButton		= new PrimaryButton("Confirm"); | ||||
|  | ||||
| 	private JTextPane		errorText	= new JTextPane(); | ||||
| 	private PrimaryButton	otherName	= new PrimaryButton("Other Name"); | ||||
| 	private PrimaryButton	overwrite	= new PrimaryButton("Overwrite"); | ||||
|  | ||||
| 	private final Consumer<String> newThemeAction, modifyThemeAction; | ||||
|  | ||||
| 	private static final long serialVersionUID = 2369985550946300976L; | ||||
|  | ||||
| 	/** | ||||
| 	 * Creates a window, where you can choose a name for a new {@link Theme}. <br> | ||||
| 	 * There are two versions of this Window. The first one is responsible for | ||||
| 	 * choosing the name, the second one appears, if the name already exists. | ||||
| 	 * | ||||
| 	 * @param parent            the dialog is launched with its location relative to | ||||
| 	 *                          this {@link SettingsScreen} | ||||
| 	 * @param newThemeAction    is executed when a new theme name is entered | ||||
| 	 * @param modifyThemeAction is executed when an existing theme name is entered | ||||
| 	 *                          and confirmed | ||||
| 	 * @since Envoy v0.3-alpha | ||||
| 	 */ | ||||
| 	public NewThemeScreen(SettingsScreen parent, Consumer<String> newThemeAction, Consumer<String> modifyThemeAction) { | ||||
| 		this.newThemeAction		= newThemeAction; | ||||
| 		this.modifyThemeAction	= modifyThemeAction; | ||||
|  | ||||
| 		setLocationRelativeTo(parent); | ||||
| 		setTitle("New Theme"); | ||||
| 		setModal(true); | ||||
|  | ||||
| 		setDimensions(true); | ||||
| 		setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); | ||||
|  | ||||
| 		Theme theme = Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()); | ||||
|  | ||||
| 		getContentPane().setLayout(new BorderLayout()); | ||||
| 		standardPanel.setBackground(theme.getBackgroundColor()); | ||||
| 		secondaryPanel.setBackground(theme.getBackgroundColor()); | ||||
| 		loadStandardContent(theme); | ||||
| 	} | ||||
|  | ||||
| 	private void setDimensions(boolean isStandard) { | ||||
| 		Dimension size = isStandard ? new Dimension(300, 170) : new Dimension(300, 225); | ||||
| 		setPreferredSize(size); | ||||
| 		setMinimumSize(size); | ||||
| 		setMaximumSize(size); | ||||
| 	} | ||||
|  | ||||
| 	private void loadStandardContent(Theme theme) { | ||||
| 		getContentPane().removeAll(); | ||||
|  | ||||
| 		// ContentPane | ||||
| 		GridBagLayout gbl_contentPanel = new GridBagLayout(); | ||||
|  | ||||
| 		gbl_contentPanel.columnWidths	= new int[] { 1, 1 }; | ||||
| 		gbl_contentPanel.rowHeights		= new int[] { 1, 1, 1 }; | ||||
| 		gbl_contentPanel.columnWeights	= new double[] { 1, 1 }; | ||||
| 		gbl_contentPanel.rowWeights		= new double[] { 1, 1, 1 }; | ||||
|  | ||||
| 		getContentPane().add(standardPanel, BorderLayout.CENTER); | ||||
| 		standardPanel.setLayout(gbl_contentPanel); | ||||
|  | ||||
| 		// text.setFont(new Font()); | ||||
| 		text.setText("Please enter a name for the new Theme"); | ||||
| 		text.setAlignmentX(CENTER_ALIGNMENT); | ||||
| 		text.setBackground(theme.getCellColor()); | ||||
| 		text.setForeground(theme.getUserNameColor()); | ||||
| 		text.setEditable(false); | ||||
|  | ||||
| 		GridBagConstraints gbc_text = new GridBagConstraints(); | ||||
| 		gbc_text.fill		= GridBagConstraints.HORIZONTAL; | ||||
| 		gbc_text.gridx		= 0; | ||||
| 		gbc_text.gridy		= 0; | ||||
| 		gbc_text.gridwidth	= 2; | ||||
| 		gbc_text.insets		= new Insets(5, 5, 5, 5); | ||||
|  | ||||
| 		standardPanel.add(text, gbc_text); | ||||
|  | ||||
| 		nameEnterTextArea.setBackground(theme.getCellColor()); | ||||
| 		nameEnterTextArea.setForeground(theme.getTypingMessageColor()); | ||||
| 		nameEnterTextArea.setText(""); | ||||
| 		nameEnterTextArea.setEditable(true); | ||||
|  | ||||
| 		GridBagConstraints gbc_input = new GridBagConstraints(); | ||||
| 		gbc_input.fill		= GridBagConstraints.HORIZONTAL; | ||||
| 		gbc_input.gridx		= 0; | ||||
| 		gbc_input.gridy		= 1; | ||||
| 		gbc_input.gridwidth	= 2; | ||||
| 		gbc_input.insets	= new Insets(5, 5, 5, 5); | ||||
|  | ||||
| 		standardPanel.add(nameEnterTextArea, gbc_input); | ||||
|  | ||||
| 		confirmButton.setBackground(theme.getInteractableBackgroundColor()); | ||||
| 		confirmButton.setForeground(theme.getInteractableForegroundColor()); | ||||
|  | ||||
| 		GridBagConstraints gbc_confirmButton = new GridBagConstraints(); | ||||
| 		gbc_confirmButton.gridx		= 0; | ||||
| 		gbc_confirmButton.gridy		= 2; | ||||
| 		gbc_confirmButton.gridwidth	= 2; | ||||
| 		gbc_confirmButton.insets	= new Insets(5, 5, 5, 5); | ||||
|  | ||||
| 		standardPanel.add(confirmButton, gbc_confirmButton); | ||||
|  | ||||
| 		confirmButton.addActionListener((evt) -> { | ||||
| 			if (!nameEnterTextArea.getText().isEmpty()) if (Settings.getInstance().getThemes().containsKey(nameEnterTextArea.getText())) { | ||||
| 				// load other panel | ||||
| 				setDimensions(false); | ||||
| 				loadSecondaryPage(theme); | ||||
| 			} else { | ||||
| 				newThemeAction.accept(nameEnterTextArea.getText()); | ||||
| 				dispose(); | ||||
| 			} | ||||
| 		}); | ||||
| 	} | ||||
|  | ||||
| 	private void loadSecondaryPage(Theme theme) { | ||||
| 		// ContentPane | ||||
| 		getContentPane().removeAll(); | ||||
|  | ||||
| 		GridBagLayout gbl_secondaryPanel = new GridBagLayout(); | ||||
|  | ||||
| 		gbl_secondaryPanel.columnWidths		= new int[] { 1, 1 }; | ||||
| 		gbl_secondaryPanel.rowHeights		= new int[] { 1, 1, 1, 1 }; | ||||
| 		gbl_secondaryPanel.columnWeights	= new double[] { 1, 1 }; | ||||
| 		gbl_secondaryPanel.rowWeights		= new double[] { 1, 1, 1, 1 }; | ||||
|  | ||||
| 		getContentPane().add(secondaryPanel, BorderLayout.CENTER); | ||||
| 		secondaryPanel.setLayout(gbl_secondaryPanel); | ||||
|  | ||||
| 		// text.setFont(new Font()); | ||||
| 		text.setText("Please enter a name for the new Theme"); | ||||
| 		text.setAlignmentX(CENTER_ALIGNMENT); | ||||
| 		text.setBackground(theme.getCellColor()); | ||||
| 		text.setForeground(theme.getUserNameColor()); | ||||
| 		text.setEditable(false); | ||||
|  | ||||
| 		GridBagConstraints gbc_text = new GridBagConstraints(); | ||||
| 		gbc_text.fill		= GridBagConstraints.HORIZONTAL; | ||||
| 		gbc_text.gridx		= 0; | ||||
| 		gbc_text.gridy		= 0; | ||||
| 		gbc_text.gridwidth	= 2; | ||||
| 		gbc_text.insets		= new Insets(5, 5, 5, 5); | ||||
|  | ||||
| 		secondaryPanel.add(text, gbc_text); | ||||
|  | ||||
| 		nameEnterTextArea.setBackground(theme.getCellColor()); | ||||
| 		nameEnterTextArea.setForeground(theme.getTypingMessageColor()); | ||||
| 		nameEnterTextArea.setEditable(false); | ||||
|  | ||||
| 		GridBagConstraints gbc_input = new GridBagConstraints(); | ||||
| 		gbc_input.fill		= GridBagConstraints.HORIZONTAL; | ||||
| 		gbc_input.gridx		= 0; | ||||
| 		gbc_input.gridy		= 1; | ||||
| 		gbc_input.gridwidth	= 2; | ||||
| 		gbc_input.insets	= new Insets(5, 5, 5, 5); | ||||
|  | ||||
| 		secondaryPanel.add(nameEnterTextArea, gbc_input); | ||||
|  | ||||
| 		errorText.setText("The name does already exist. Choose another one or overwrite the old theme."); | ||||
| 		errorText.setAlignmentX(CENTER_ALIGNMENT); | ||||
| 		errorText.setBackground(theme.getCellColor()); | ||||
| 		errorText.setForeground(theme.getUserNameColor()); | ||||
| 		errorText.setEditable(false); | ||||
|  | ||||
| 		GridBagConstraints gbc_errorText = new GridBagConstraints(); | ||||
| 		gbc_errorText.fill		= GridBagConstraints.HORIZONTAL; | ||||
| 		gbc_errorText.gridx		= 0; | ||||
| 		gbc_errorText.gridy		= 2; | ||||
| 		gbc_errorText.gridwidth	= 2; | ||||
| 		gbc_errorText.insets	= new Insets(5, 5, 5, 5); | ||||
|  | ||||
| 		secondaryPanel.add(errorText, gbc_errorText); | ||||
|  | ||||
| 		otherName.setBackground(theme.getInteractableBackgroundColor()); | ||||
| 		otherName.setForeground(theme.getInteractableForegroundColor()); | ||||
|  | ||||
| 		GridBagConstraints gbc_otherName = new GridBagConstraints(); | ||||
| 		gbc_otherName.gridx		= 0; | ||||
| 		gbc_otherName.gridy		= 3; | ||||
| 		gbc_otherName.insets	= new Insets(5, 5, 5, 5); | ||||
|  | ||||
| 		secondaryPanel.add(otherName, gbc_otherName); | ||||
|  | ||||
| 		overwrite.setBackground(theme.getInteractableBackgroundColor()); | ||||
| 		overwrite.setForeground(theme.getInteractableForegroundColor()); | ||||
|  | ||||
| 		GridBagConstraints gbc_overwrite = new GridBagConstraints(); | ||||
| 		gbc_overwrite.gridx		= 1; | ||||
| 		gbc_overwrite.gridy		= 3; | ||||
| 		gbc_overwrite.insets	= new Insets(5, 5, 5, 5); | ||||
|  | ||||
| 		secondaryPanel.add(overwrite, gbc_overwrite); | ||||
|  | ||||
| 		otherName.addActionListener((evt) -> { setDimensions(true); loadStandardContent(theme); }); | ||||
|  | ||||
| 		overwrite.addActionListener((evt) -> { modifyThemeAction.accept(nameEnterTextArea.getText()); dispose(); }); | ||||
| 	} | ||||
| } | ||||
|   | ||||
| @@ -11,8 +11,8 @@ import javax.swing.*; | ||||
|  | ||||
| import envoy.client.data.Settings; | ||||
| import envoy.client.event.ThemeChangeEvent; | ||||
| import envoy.client.ui.PrimaryButton; | ||||
| import envoy.client.ui.Theme; | ||||
| import envoy.client.ui.primary.PrimaryButton; | ||||
| import envoy.event.EventBus; | ||||
| import envoy.util.EnvoyLog; | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 delvh
					delvh