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:
parent
e07c8ecaf7
commit
8c55f67eb0
@ -1,4 +1,4 @@
|
|||||||
package envoy.client.ui;
|
package envoy.client;
|
||||||
|
|
||||||
import java.awt.EventQueue;
|
import java.awt.EventQueue;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@ -15,6 +15,7 @@ import javax.swing.SwingUtilities;
|
|||||||
import envoy.client.data.*;
|
import envoy.client.data.*;
|
||||||
import envoy.client.net.Client;
|
import envoy.client.net.Client;
|
||||||
import envoy.client.net.WriteProxy;
|
import envoy.client.net.WriteProxy;
|
||||||
|
import envoy.client.ui.StatusTrayIcon;
|
||||||
import envoy.client.ui.container.ChatWindow;
|
import envoy.client.ui.container.ChatWindow;
|
||||||
import envoy.client.ui.container.LoginDialog;
|
import envoy.client.ui.container.LoginDialog;
|
||||||
import envoy.data.Config;
|
import envoy.data.Config;
|
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
|
* elements
|
||||||
* @param interactableBackgroundColor the color of interactable background UI
|
* @param interactableBackgroundColor the color of interactable background UI
|
||||||
* elements
|
* 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 dateColorChat the color of chat message metadata
|
||||||
* @param selectionColor the section color
|
* @param selectionColor the section color
|
||||||
* @param typingMessageColor the color of currently typed messages
|
* @param typingMessageColor the color of currently typed messages
|
||||||
@ -37,7 +38,7 @@ public class Theme implements Serializable {
|
|||||||
* @since Envoy v0.2-alpha
|
* @since Envoy v0.2-alpha
|
||||||
*/
|
*/
|
||||||
public Theme(String themeName, Color backgroundColor, Color cellColor, Color interactableForegroundColor, Color interactableBackgroundColor,
|
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;
|
this.themeName = themeName;
|
||||||
|
|
||||||
@ -45,7 +46,7 @@ public class Theme implements Serializable {
|
|||||||
colors.put("cellColor", cellColor);
|
colors.put("cellColor", cellColor);
|
||||||
colors.put("interactableForegroundColor", interactableForegroundColor);
|
colors.put("interactableForegroundColor", interactableForegroundColor);
|
||||||
colors.put("interactableBackgroundColor", interactableBackgroundColor);
|
colors.put("interactableBackgroundColor", interactableBackgroundColor);
|
||||||
colors.put("messageColorChat", messageColorChat);
|
colors.put("textColor", textColor);
|
||||||
colors.put("dateColorChat", dateColorChat);
|
colors.put("dateColorChat", dateColorChat);
|
||||||
colors.put("selectionColor", selectionColor);
|
colors.put("selectionColor", selectionColor);
|
||||||
colors.put("typingMessageColor", typingMessageColor);
|
colors.put("typingMessageColor", typingMessageColor);
|
||||||
@ -89,7 +90,7 @@ public class Theme implements Serializable {
|
|||||||
* displayed
|
* displayed
|
||||||
* @since Envoy v0.2-alpha
|
* @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
|
* @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.event.ThemeChangeEvent;
|
||||||
import envoy.client.net.Client;
|
import envoy.client.net.Client;
|
||||||
import envoy.client.net.WriteProxy;
|
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;
|
||||||
import envoy.client.ui.list.ComponentList.SelectionMode;
|
import envoy.client.ui.list.ComponentList.SelectionMode;
|
||||||
import envoy.client.ui.list.Model;
|
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.PrimaryButton;
|
||||||
import envoy.client.ui.primary.PrimaryScrollPane;
|
import envoy.client.ui.primary.PrimaryScrollPane;
|
||||||
import envoy.client.ui.primary.PrimaryTextArea;
|
import envoy.client.ui.primary.PrimaryTextArea;
|
||||||
@ -490,7 +492,7 @@ public class ChatWindow extends JFrame {
|
|||||||
contentPane.setBackground(theme.getBackgroundColor());
|
contentPane.setBackground(theme.getBackgroundColor());
|
||||||
contentPane.setForeground(theme.getUserNameColor());
|
contentPane.setForeground(theme.getUserNameColor());
|
||||||
// messageList
|
// messageList
|
||||||
messageList.setForeground(theme.getMessageTextColor());
|
messageList.setForeground(theme.getTextColor());
|
||||||
messageList.setBackground(theme.getCellColor());
|
messageList.setBackground(theme.getCellColor());
|
||||||
// scrollPane
|
// scrollPane
|
||||||
scrollPane.applyTheme(theme);
|
scrollPane.applyTheme(theme);
|
||||||
@ -525,7 +527,7 @@ public class ChatWindow extends JFrame {
|
|||||||
searchField.setForeground(theme.getUserNameColor());
|
searchField.setForeground(theme.getUserNameColor());
|
||||||
cancelButton.setBackground(theme.getInteractableBackgroundColor());
|
cancelButton.setBackground(theme.getInteractableBackgroundColor());
|
||||||
cancelButton.setForeground(theme.getInteractableForegroundColor());
|
cancelButton.setForeground(theme.getInteractableForegroundColor());
|
||||||
contactList.setForeground(theme.getMessageTextColor());
|
contactList.setForeground(theme.getTextColor());
|
||||||
contactList.setBackground(theme.getCellColor());
|
contactList.setBackground(theme.getCellColor());
|
||||||
scrollForPossibleContacts.applyTheme(theme);
|
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);
|
JOptionPane.showMessageDialog(this, "Please select a recipient!", "Cannot send message", JOptionPane.INFORMATION_MESSAGE);
|
||||||
return;
|
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
|
// Create message
|
||||||
final Message message = new MessageBuilder(localDb.getUser().getId(), currentChat.getRecipient().getId(), localDb.getIdGenerator())
|
final Message message = new MessageBuilder(localDb.getUser().getId(), currentChat.getRecipient().getId(), localDb.getIdGenerator())
|
||||||
.setText(messageEnterTextArea.getText())
|
.setText(text)
|
||||||
.build();
|
.build();
|
||||||
sendMessage(message);
|
sendMessage(message);
|
||||||
// Clear text field
|
// 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.data.Settings;
|
||||||
import envoy.client.net.Client;
|
import envoy.client.net.Client;
|
||||||
import envoy.client.ui.Theme;
|
import envoy.client.ui.Theme;
|
||||||
import envoy.client.ui.UserComponent;
|
|
||||||
import envoy.client.ui.list.ComponentList;
|
import envoy.client.ui.list.ComponentList;
|
||||||
import envoy.client.ui.list.ComponentList.SelectionMode;
|
import envoy.client.ui.list.ComponentList.SelectionMode;
|
||||||
import envoy.client.ui.list.Model;
|
import envoy.client.ui.list.Model;
|
||||||
@ -35,7 +34,7 @@ public class ContactsChooserDialog extends JDialog {
|
|||||||
|
|
||||||
private static final long serialVersionUID = -5774558118579032256L;
|
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 okButton = new JButton("Ok");
|
||||||
private JButton cancelButton = new JButton("Cancel");
|
private JButton cancelButton = new JButton("Cancel");
|
||||||
|
|
||||||
@ -77,7 +76,7 @@ public class ContactsChooserDialog extends JDialog {
|
|||||||
dialog.setVisible(true);
|
dialog.setVisible(true);
|
||||||
dialog.repaint();
|
dialog.repaint();
|
||||||
dialog.revalidate();
|
dialog.revalidate();
|
||||||
return results;
|
return results.size() > 0 ? results : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -85,12 +84,11 @@ public class ContactsChooserDialog extends JDialog {
|
|||||||
*/
|
*/
|
||||||
private ContactsChooserDialog() {
|
private ContactsChooserDialog() {
|
||||||
contactList.setSelectionMode(SelectionMode.MULTIPLE);
|
contactList.setSelectionMode(SelectionMode.MULTIPLE);
|
||||||
contactList
|
// setBounds(100, 100, 450, 300);
|
||||||
.setSelectionHandler((user, comp, isSelected) -> comp.setBackground(isSelected ? theme.getSelectionColor() : theme.getCellColor()));
|
|
||||||
setModal(true);
|
setModal(true);
|
||||||
getContentPane().setLayout(new BorderLayout());
|
getContentPane().setLayout(new BorderLayout());
|
||||||
setBackground(theme.getBackgroundColor());
|
setBackground(theme.getBackgroundColor());
|
||||||
setForeground(theme.getMessageTextColor());
|
setForeground(theme.getTextColor());
|
||||||
contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
|
contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
|
||||||
getContentPane().add(contentPanel, BorderLayout.CENTER);
|
getContentPane().add(contentPanel, BorderLayout.CENTER);
|
||||||
contentPanel.setLayout(new BorderLayout(0, 0));
|
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>
|
* Created: <strong>21.03.2020</strong>
|
||||||
*
|
*
|
||||||
* @author Kai S. K. Engelbart
|
* @author Kai S. K. Engelbart
|
||||||
|
* @param <E> the type of the underlying {@link ComponentList}
|
||||||
* @since Envoy v0.1-beta
|
* @since Envoy v0.1-beta
|
||||||
*/
|
*/
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package envoy.client.ui;
|
package envoy.client.ui.list_component;
|
||||||
|
|
||||||
import java.awt.Component;
|
import java.awt.Component;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
@ -26,6 +26,11 @@ public class ContactSearchComponent extends JComponent {
|
|||||||
|
|
||||||
private static final long serialVersionUID = 3166795412575239455L;
|
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) {
|
public ContactSearchComponent(ComponentList<? extends User> list, User user) {
|
||||||
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
|
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
|
||||||
|
|
||||||
@ -33,7 +38,7 @@ public class ContactSearchComponent extends JComponent {
|
|||||||
setForeground(list.getForeground());
|
setForeground(list.getForeground());
|
||||||
|
|
||||||
JLabel display = new JLabel(user.getName());
|
JLabel display = new JLabel(user.getName());
|
||||||
display.setForeground(Settings.getInstance().getCurrentTheme().getMessageTextColor());
|
display.setForeground(Settings.getInstance().getCurrentTheme().getTextColor());
|
||||||
display.setAlignmentX(Component.LEFT_ALIGNMENT);
|
display.setAlignmentX(Component.LEFT_ALIGNMENT);
|
||||||
display.setAlignmentY(Component.CENTER_ALIGNMENT);
|
display.setAlignmentY(Component.CENTER_ALIGNMENT);
|
||||||
display.setFont(new Font("Arial", Font.PLAIN, 16));
|
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.awt.*;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -7,10 +7,14 @@ import java.util.EnumMap;
|
|||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
|
|
||||||
|
import envoy.client.data.Chat;
|
||||||
import envoy.client.data.Settings;
|
import envoy.client.data.Settings;
|
||||||
|
import envoy.client.ui.Color;
|
||||||
|
import envoy.client.ui.IconUtil;
|
||||||
import envoy.client.ui.list.ComponentList;
|
import envoy.client.ui.list.ComponentList;
|
||||||
import envoy.data.Message;
|
import envoy.data.Message;
|
||||||
import envoy.data.Message.MessageStatus;
|
import envoy.data.Message.MessageStatus;
|
||||||
|
import envoy.data.User;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Project: <strong>envoy-client</strong>
|
* 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) {
|
public MessageComponent(ComponentList<? extends Message> list, Message message, long senderId) {
|
||||||
this(list.getMaximumSize().width, message, senderId);
|
var width = list.getMaximumSize().width;
|
||||||
}
|
|
||||||
|
|
||||||
public MessageComponent(int width, Message message, long senderId) {
|
|
||||||
final var theme = Settings.getInstance().getCurrentTheme();
|
final var theme = Settings.getInstance().getCurrentTheme();
|
||||||
final int padding = (int) (width * 0.35);
|
final int padding = (int) (width * 0.35);
|
||||||
|
|
||||||
@ -70,7 +78,7 @@ public class MessageComponent extends JPanel {
|
|||||||
var messageTextArea = new JTextArea(message.getText());
|
var messageTextArea = new JTextArea(message.getText());
|
||||||
messageTextArea.setLineWrap(true);
|
messageTextArea.setLineWrap(true);
|
||||||
messageTextArea.setWrapStyleWord(true);
|
messageTextArea.setWrapStyleWord(true);
|
||||||
messageTextArea.setForeground(theme.getMessageTextColor());
|
messageTextArea.setForeground(theme.getTextColor());
|
||||||
messageTextArea.setAlignmentX(0.5f);
|
messageTextArea.setAlignmentX(0.5f);
|
||||||
messageTextArea.setBackground(theme.getCellColor());
|
messageTextArea.setBackground(theme.getCellColor());
|
||||||
messageTextArea.setEditable(false);
|
messageTextArea.setEditable(false);
|
||||||
@ -107,8 +115,7 @@ public class MessageComponent extends JPanel {
|
|||||||
|
|
||||||
// Define an etched border and some space to the messages below
|
// Define an etched border and some space to the messages below
|
||||||
var ours = senderId == message.getSenderId();
|
var ours = senderId == message.getSenderId();
|
||||||
setBorder(BorderFactory.createCompoundBorder(
|
setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(0, ours ? padding : 10, 10, ours ? 0 : padding),
|
||||||
BorderFactory.createEmptyBorder(0, ours ? padding : 10, 10, ours ? 0 : padding),
|
|
||||||
BorderFactory.createEtchedBorder()));
|
BorderFactory.createEtchedBorder()));
|
||||||
|
|
||||||
var size = new Dimension(width - 50, getPreferredSize().height);
|
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.BorderLayout;
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
@ -7,11 +7,14 @@ import javax.swing.JComponent;
|
|||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
|
|
||||||
import envoy.client.data.Settings;
|
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;
|
||||||
import envoy.data.User.UserStatus;
|
import envoy.data.User.UserStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Displays a {@link User}.<br>
|
||||||
|
* <br>
|
||||||
* Project: <strong>envoy-client</strong>
|
* Project: <strong>envoy-client</strong>
|
||||||
* File: <strong>UserComponent.java</strong>
|
* File: <strong>UserComponent.java</strong>
|
||||||
* Created: <strong>21.03.2020</strong>
|
* Created: <strong>21.03.2020</strong>
|
||||||
@ -23,7 +26,11 @@ public class UserComponent extends JComponent {
|
|||||||
|
|
||||||
private static final long serialVersionUID = 8450602172939729585L;
|
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();
|
final Theme theme = Settings.getInstance().getCurrentTheme();
|
||||||
|
|
||||||
setLayout(new BorderLayout());
|
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;
|
9
src/main/java/envoy/client/ui/settings/ThemeCustomizationPanel.java
Normal file → Executable file
9
src/main/java/envoy/client/ui/settings/ThemeCustomizationPanel.java
Normal file → Executable file
@ -38,7 +38,6 @@ public class ThemeCustomizationPanel extends SettingsPanel {
|
|||||||
|
|
||||||
private final Insets insets = new Insets(5, 5, 5, 5);
|
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 Logger logger = EnvoyLog.getLogger(ThemeCustomizationPanel.class);
|
||||||
private static final long serialVersionUID = -8697897390666456624L;
|
private static final long serialVersionUID = -8697897390666456624L;
|
||||||
|
|
||||||
@ -53,7 +52,7 @@ public class ThemeCustomizationPanel extends SettingsPanel {
|
|||||||
*/
|
*/
|
||||||
public ThemeCustomizationPanel(SettingsScreen parent) {
|
public ThemeCustomizationPanel(SettingsScreen parent) {
|
||||||
super(parent);
|
super(parent);
|
||||||
temporaryTheme = new Theme("temporaryTheme", settings.getCurrentTheme());
|
temporaryTheme = new Theme("temporaryTheme", Settings.getInstance().getCurrentTheme());
|
||||||
|
|
||||||
GridBagLayout gbl_themeLayout = new GridBagLayout();
|
GridBagLayout gbl_themeLayout = new GridBagLayout();
|
||||||
|
|
||||||
@ -64,7 +63,7 @@ public class ThemeCustomizationPanel extends SettingsPanel {
|
|||||||
|
|
||||||
setLayout(gbl_themeLayout);
|
setLayout(gbl_themeLayout);
|
||||||
|
|
||||||
themes.setSelectedItem(settings.getCurrentTheme());
|
themes.setSelectedItem(Settings.getInstance().getCurrentTheme());
|
||||||
|
|
||||||
GridBagConstraints gbc_themes = new GridBagConstraints();
|
GridBagConstraints gbc_themes = new GridBagConstraints();
|
||||||
gbc_themes.fill = GridBagConstraints.HORIZONTAL;
|
gbc_themes.fill = GridBagConstraints.HORIZONTAL;
|
||||||
@ -84,7 +83,7 @@ public class ThemeCustomizationPanel extends SettingsPanel {
|
|||||||
|
|
||||||
colorsPanel.setLayout(gbl_colorCustomizations);
|
colorsPanel.setLayout(gbl_colorCustomizations);
|
||||||
|
|
||||||
Theme theme = settings.getCurrentTheme();
|
Theme theme = Settings.getInstance().getCurrentTheme();
|
||||||
buildCustomizeElements(theme);
|
buildCustomizeElements(theme);
|
||||||
|
|
||||||
GridBagConstraints gbc_colorsPanel = new GridBagConstraints();
|
GridBagConstraints gbc_colorsPanel = new GridBagConstraints();
|
||||||
@ -174,7 +173,7 @@ public class ThemeCustomizationPanel extends SettingsPanel {
|
|||||||
buildCustomizeElement(theme, theme.getCellColor(), "Cells", "cellColor", 2);
|
buildCustomizeElement(theme, theme.getCellColor(), "Cells", "cellColor", 2);
|
||||||
buildCustomizeElement(theme, theme.getInteractableForegroundColor(), "Interactable Foreground", "interactableForegroundColor", 3);
|
buildCustomizeElement(theme, theme.getInteractableForegroundColor(), "Interactable Foreground", "interactableForegroundColor", 3);
|
||||||
buildCustomizeElement(theme, theme.getInteractableBackgroundColor(), "Interactable Background", "interactableBackgroundColor", 4);
|
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.getDateColor(), "Date Chat", "dateColorChat", 6);
|
||||||
buildCustomizeElement(theme, theme.getSelectionColor(), "Selection", "selectionColor", 7);
|
buildCustomizeElement(theme, theme.getSelectionColor(), "Selection", "selectionColor", 7);
|
||||||
buildCustomizeElement(theme, theme.getTypingMessageColor(), "Typing Message", "typingMessageColor", 8);
|
buildCustomizeElement(theme, theme.getTypingMessageColor(), "Typing Message", "typingMessageColor", 8);
|
||||||
|
Reference in New Issue
Block a user