From 64a548abbaaa9eab338967f0c697c5063d68b61c Mon Sep 17 00:00:00 2001 From: Steven Barclay Date: Mon, 25 Nov 2019 02:56:33 +0000 Subject: [PATCH] Fix #3662: Malformed trade chat & dispute speech bubbles Prevent the 'arrow' of a message bubble from being sporadically anchored to the wrong side - appearing on the left instead of the right hand side of the bubble. This is due to the same ListCell object being reused by JavaFX for different bubbles as the user scrolls up and down the chat pane, which requires that the anchors of each arrow be properly cleared between ListCell.updateItem(..) calls. To this end, move the block of AnchorPane.clearConstraints(..) calls to the beginning of the updateItem(..) method, as the apparent assumption that 'updateItem(item, empty = true)' will always be called to clear the given ListCell before reusing it as a new bubble turns out to be wrong. --- .../bisq/desktop/main/shared/ChatView.java | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/desktop/src/main/java/bisq/desktop/main/shared/ChatView.java b/desktop/src/main/java/bisq/desktop/main/shared/ChatView.java index e0000be6dd6..985872e4225 100644 --- a/desktop/src/main/java/bisq/desktop/main/shared/ChatView.java +++ b/desktop/src/main/java/bisq/desktop/main/shared/ChatView.java @@ -297,7 +297,7 @@ public ListCell call(ListView list) { } @Override - public void updateItem(ChatMessage message, boolean empty) { + protected void updateItem(ChatMessage message, boolean empty) { super.updateItem(message, empty); if (message != null && !empty) { copyIcon.setOnMouseClicked(e -> Utilities.copyToClipboard(messageLabel.getText())); @@ -312,6 +312,14 @@ public void updateItem(ChatMessage message, boolean empty) { messageAnchorPane.prefWidthProperty() .bind(messageListView.widthProperty().subtract(padding + GUIUtil.getScrollbarWidth(messageListView))); + AnchorPane.clearConstraints(bg); + AnchorPane.clearConstraints(headerLabel); + AnchorPane.clearConstraints(arrow); + AnchorPane.clearConstraints(messageLabel); + AnchorPane.clearConstraints(copyIcon); + AnchorPane.clearConstraints(statusHBox); + AnchorPane.clearConstraints(attachmentsBox); + AnchorPane.setTopAnchor(bg, 15d); AnchorPane.setBottomAnchor(bg, bottomBorder); AnchorPane.setTopAnchor(headerLabel, 0d); @@ -381,7 +389,6 @@ public void updateItem(ChatMessage message, boolean empty) { AnchorPane.setRightAnchor(copyIcon, padding); AnchorPane.setLeftAnchor(attachmentsBox, padding); AnchorPane.setRightAnchor(attachmentsBox, padding); - AnchorPane.clearConstraints(statusHBox); AnchorPane.setLeftAnchor(statusHBox, padding); } else if (senderIsTrader) { AnchorPane.setLeftAnchor(headerLabel, padding + arrowWidth); @@ -393,19 +400,17 @@ public void updateItem(ChatMessage message, boolean empty) { AnchorPane.setRightAnchor(copyIcon, padding); AnchorPane.setLeftAnchor(attachmentsBox, padding + arrowWidth); AnchorPane.setRightAnchor(attachmentsBox, padding); - AnchorPane.clearConstraints(statusHBox); AnchorPane.setRightAnchor(statusHBox, padding); } else { AnchorPane.setRightAnchor(headerLabel, padding + arrowWidth); - AnchorPane.setLeftAnchor(bg, border); AnchorPane.setRightAnchor(bg, border + arrowWidth); + AnchorPane.setLeftAnchor(bg, border); AnchorPane.setRightAnchor(arrow, border); AnchorPane.setLeftAnchor(messageLabel, padding); AnchorPane.setRightAnchor(messageLabel, msgLabelPaddingRight + arrowWidth); AnchorPane.setRightAnchor(copyIcon, padding + arrowWidth); AnchorPane.setLeftAnchor(attachmentsBox, padding); AnchorPane.setRightAnchor(attachmentsBox, padding + arrowWidth); - AnchorPane.clearConstraints(statusHBox); AnchorPane.setLeftAnchor(statusHBox, padding); } AnchorPane.setBottomAnchor(statusHBox, 7d); @@ -453,14 +458,6 @@ public void updateItem(ChatMessage message, boolean empty) { messageAnchorPane.prefWidthProperty().unbind(); - AnchorPane.clearConstraints(bg); - AnchorPane.clearConstraints(headerLabel); - AnchorPane.clearConstraints(arrow); - AnchorPane.clearConstraints(messageLabel); - AnchorPane.clearConstraints(copyIcon); - AnchorPane.clearConstraints(statusHBox); - AnchorPane.clearConstraints(attachmentsBox); - copyIcon.setOnMouseClicked(null); messageLabel.setOnMouseClicked(null); setGraphic(null);