Fixed horizontal message placement

This commit contains potentially unstable changes to ComponentList. If
the ListCellRenderer is not set, the class might behave in an unexpected
way.
This commit is contained in:
Kai S. K. Engelbart 2020-03-17 10:08:58 +01:00
parent 6a2cb38bd2
commit ba222deec9
3 changed files with 29 additions and 7 deletions

View File

@ -65,7 +65,7 @@ public class ChatWindow extends JFrame {
private PrimaryTextArea messageEnterTextArea = new PrimaryTextArea(space); private PrimaryTextArea messageEnterTextArea = new PrimaryTextArea(space);
private JList<User> userList = new JList<>(); private JList<User> userList = new JList<>();
private DefaultListModel<User> userListModel = new DefaultListModel<>(); private DefaultListModel<User> userListModel = new DefaultListModel<>();
private ComponentList<Message> messageList = new ComponentList<>(new MessageListRenderer()); private ComponentList<Message> messageList = new ComponentList<>();
private PrimaryScrollPane scrollPane = new PrimaryScrollPane(); private PrimaryScrollPane scrollPane = new PrimaryScrollPane();
private JTextPane textPane = new JTextPane(); private JTextPane textPane = new JTextPane();
private PrimaryButton postButton = new PrimaryButton("Post"); private PrimaryButton postButton = new PrimaryButton("Post");
@ -614,6 +614,8 @@ public class ChatWindow extends JFrame {
this.localDb = localDb; this.localDb = localDb;
this.writeProxy = writeProxy; this.writeProxy = writeProxy;
messageList.setRenderer(new MessageListRenderer(client.getSender().getId()));
// Load users and chats // Load users and chats
new Thread(() -> { new Thread(() -> {
localDb.getUsers().values().forEach(user -> { localDb.getUsers().values().forEach(user -> {

View File

@ -31,6 +31,8 @@ public class ComponentList<E> extends JPanel {
private static final long serialVersionUID = 1759644503942876737L; private static final long serialVersionUID = 1759644503942876737L;
public ComponentList() { setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); }
/** /**
* Creates an instance of {@link ComponentList}. * Creates an instance of {@link ComponentList}.
* *
@ -39,8 +41,8 @@ public class ComponentList<E> extends JPanel {
* @since Envoy v0.3-alpha * @since Envoy v0.3-alpha
*/ */
public ComponentList(ComponentListCellRenderer<E> renderer) { public ComponentList(ComponentListCellRenderer<E> renderer) {
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); this();
this.renderer = renderer; setRenderer(renderer);
} }
/** /**
@ -199,6 +201,18 @@ public class ComponentList<E> extends JPanel {
*/ */
public ComponentListModel<E> getModel() { return model; } public ComponentListModel<E> getModel() { return model; }
/**
* @return the renderer
* @since Envoy v0.1-beta
*/
public ComponentListCellRenderer<E> getRenderer() { return renderer; }
/**
* @param renderer the renderer to set
* @since Envoy v0.1-beta
*/
public void setRenderer(ComponentListCellRenderer<E> renderer) { this.renderer = renderer; }
/** /**
* @return the multipleSelectionEnabled * @return the multipleSelectionEnabled
* @since Envoy v0.1-beta * @since Envoy v0.1-beta

View File

@ -41,6 +41,10 @@ public class MessageListRenderer implements ComponentListCellRenderer<Message> {
} }
} }
private final long senderId;
public MessageListRenderer(long senderId) { this.senderId = senderId; }
// TODO: Handle message attachments // TODO: Handle message attachments
@Override @Override
@ -86,7 +90,7 @@ public class MessageListRenderer implements ComponentListCellRenderer<Message> {
// var frc = new FontRenderContext(new AffineTransform(), true, true); // var frc = new FontRenderContext(new AffineTransform(), true, true);
// messageTextArea.setSize(Math.min(list.getWidth() - padding, (int) // messageTextArea.setSize(Math.min(list.getWidth() - padding, (int)
// font.getStringBounds(message.getText(), frc).getWidth()), 10); // font.getStringBounds(message.getText(), frc).getWidth()), 10);
messageTextArea.setSize(list.getWidth() - padding, 10); messageTextArea.setSize(list.getWidth() - padding - 16, 10);
var gbc_messageTextArea = new GridBagConstraints(); var gbc_messageTextArea = new GridBagConstraints();
gbc_messageTextArea.fill = GridBagConstraints.HORIZONTAL; gbc_messageTextArea.fill = GridBagConstraints.HORIZONTAL;
@ -98,7 +102,7 @@ public class MessageListRenderer implements ComponentListCellRenderer<Message> {
var statusLabel = new JLabel(statusIcons.get(message.getStatus())); var statusLabel = new JLabel(statusIcons.get(message.getStatus()));
var gbc_statusLabel = new GridBagConstraints(); var gbc_statusLabel = new GridBagConstraints();
gbc_statusLabel.fill = GridBagConstraints.BOTH; // gbc_statusLabel.fill = GridBagConstraints.BOTH;
gbc_statusLabel.gridx = 1; gbc_statusLabel.gridx = 1;
gbc_statusLabel.gridy = 1; gbc_statusLabel.gridy = 1;
panel.add(statusLabel, gbc_statusLabel); panel.add(statusLabel, gbc_statusLabel);
@ -118,7 +122,9 @@ public class MessageListRenderer implements ComponentListCellRenderer<Message> {
} }
// Define an etched border and some space to the messages below // Define an etched border and some space to the messages below
panel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(0, 0, 20, padding), BorderFactory.createEtchedBorder())); var ours = senderId == message.getSenderId();
panel.setBorder(BorderFactory.createCompoundBorder(BorderFactory.createEmptyBorder(0, ours ? padding : 0, 10, ours ? 0 : padding),
BorderFactory.createEtchedBorder()));
var size = new Dimension(list.getWidth(), panel.getPreferredSize().height); var size = new Dimension(list.getWidth(), panel.getPreferredSize().height);