From d31a4c2947df1a7ba65f641878ac8d399e534e3a Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Wed, 3 Feb 2016 22:28:20 +0100 Subject: [PATCH] Add info icon for popups, improve wording for buy/sell offer book/markets --- .../gui/components/HyperlinkWithIcon.java | 38 +++- .../disputes/trader/TraderDisputeView.java | 18 +- .../markets/charts/MarketsChartsView.java | 194 ++++++------------ .../main/offer/offerbook/OfferBookView.java | 30 +-- .../closedtrades/ClosedTradesView.fxml | 2 +- .../closedtrades/ClosedTradesView.java | 15 +- .../failedtrades/FailedTradesView.fxml | 2 +- .../failedtrades/FailedTradesView.java | 19 +- .../portfolio/openoffer/OpenOffersView.java | 13 +- .../pendingtrades/PendingTradesView.java | 16 +- 10 files changed, 151 insertions(+), 196 deletions(-) diff --git a/gui/src/main/java/io/bitsquare/gui/components/HyperlinkWithIcon.java b/gui/src/main/java/io/bitsquare/gui/components/HyperlinkWithIcon.java index 3928403fb6..3b311e3e9a 100644 --- a/gui/src/main/java/io/bitsquare/gui/components/HyperlinkWithIcon.java +++ b/gui/src/main/java/io/bitsquare/gui/components/HyperlinkWithIcon.java @@ -4,29 +4,50 @@ import de.jensd.fx.fontawesome.AwesomeDude; import de.jensd.fx.fontawesome.AwesomeIcon; import javafx.event.ActionEvent; import javafx.event.EventHandler; +import javafx.geometry.Insets; import javafx.scene.control.Hyperlink; import javafx.scene.control.Label; import javafx.scene.control.Tooltip; -import javafx.scene.layout.AnchorPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Pane; +import javafx.scene.layout.Priority; -public class HyperlinkWithIcon extends AnchorPane { +public class HyperlinkWithIcon extends HBox { private final Hyperlink hyperlink; private final Label openLinkIcon; public HyperlinkWithIcon(String text, AwesomeIcon awesomeIcon) { + this(text, awesomeIcon, false); + } + + public HyperlinkWithIcon(String text, boolean isCentered) { + this(text, AwesomeIcon.INFO_SIGN, isCentered); + } + + public HyperlinkWithIcon(String text, AwesomeIcon awesomeIcon, boolean isCentered) { + setSpacing(5); hyperlink = new Hyperlink(text); openLinkIcon = new Label(); - openLinkIcon.setLayoutY(3); openLinkIcon.getStyleClass().add("external-link-icon"); + AwesomeDude.setIcon(openLinkIcon, awesomeIcon); + openLinkIcon.setMinWidth(20); + HBox.setMargin(openLinkIcon, new Insets(awesomeIcon == AwesomeIcon.INFO_SIGN ? 2 : 3, 0, 0, 0)); - AnchorPane.setLeftAnchor(hyperlink, 0.0); - AnchorPane.setRightAnchor(hyperlink, 15.0); - AnchorPane.setRightAnchor(openLinkIcon, 4.0); - AnchorPane.setTopAnchor(openLinkIcon, awesomeIcon == AwesomeIcon.INFO_SIGN ? 2.0 : 3.0); + if (isCentered) { + Pane spacer1 = new Pane(); + spacer1.setMaxWidth(Double.MAX_VALUE); + HBox.setHgrow(spacer1, Priority.ALWAYS); - getChildren().addAll(hyperlink, openLinkIcon); + Pane spacer2 = new Pane(); + spacer2.setMaxWidth(Double.MAX_VALUE); + HBox.setHgrow(spacer2, Priority.ALWAYS); + + getChildren().addAll(spacer1, hyperlink, openLinkIcon, spacer2); + } else { + getChildren().addAll(hyperlink, openLinkIcon); + } } public void setOnAction(EventHandler handler) { @@ -36,6 +57,7 @@ public class HyperlinkWithIcon extends AnchorPane { public void setTooltip(Tooltip tooltip) { hyperlink.setTooltip(tooltip); + // TODO does not use the right style openLinkIcon.setTooltip(tooltip); } } diff --git a/gui/src/main/java/io/bitsquare/gui/main/disputes/trader/TraderDisputeView.java b/gui/src/main/java/io/bitsquare/gui/main/disputes/trader/TraderDisputeView.java index 8b1b02ad0d..cecaca26bf 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/disputes/trader/TraderDisputeView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/disputes/trader/TraderDisputeView.java @@ -27,6 +27,7 @@ import io.bitsquare.common.UserThread; import io.bitsquare.common.crypto.KeyRing; import io.bitsquare.gui.common.view.ActivatableView; import io.bitsquare.gui.common.view.FxmlView; +import io.bitsquare.gui.components.HyperlinkWithIcon; import io.bitsquare.gui.components.TableGroupHeadline; import io.bitsquare.gui.main.disputes.DisputeSummaryPopup; import io.bitsquare.gui.popups.ContractPopup; @@ -588,26 +589,27 @@ public class TraderDisputeView extends ActivatableView { @Override public TableCell call(TableColumn column) { return new TableCell() { - private Hyperlink hyperlink; + private HyperlinkWithIcon field; @Override public void updateItem(final Dispute item, boolean empty) { super.updateItem(item, empty); if (item != null && !empty) { + field = new HyperlinkWithIcon(item.getShortTradeId(), true); Optional tradeOptional = tradeManager.getTradeById(item.getTradeId()); - hyperlink = new Hyperlink(item.getShortTradeId()); if (tradeOptional.isPresent()) { - hyperlink.setMouseTransparent(false); - Tooltip.install(hyperlink, new Tooltip(item.getShortTradeId())); - hyperlink.setOnAction(event -> tradeDetailsPopup.show(tradeOptional.get())); + field.setMouseTransparent(false); + field.setTooltip(new Tooltip("Open popup for details")); + field.setOnAction(event -> tradeDetailsPopup.show(tradeOptional.get())); } else { - hyperlink.setMouseTransparent(true); + field.setMouseTransparent(true); } - setGraphic(hyperlink); + setGraphic(field); } else { setGraphic(null); - setId(null); + if (field != null) + field.setOnAction(null); } } }; diff --git a/gui/src/main/java/io/bitsquare/gui/main/markets/charts/MarketsChartsView.java b/gui/src/main/java/io/bitsquare/gui/main/markets/charts/MarketsChartsView.java index 293b3ff499..f6b2ccfb28 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/markets/charts/MarketsChartsView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/markets/charts/MarketsChartsView.java @@ -19,12 +19,14 @@ package io.bitsquare.gui.main.markets.charts; import io.bitsquare.common.UserThread; import io.bitsquare.common.util.Tuple2; +import io.bitsquare.gui.Navigation; import io.bitsquare.gui.common.view.ActivatableViewAndModel; import io.bitsquare.gui.common.view.FxmlView; -import io.bitsquare.gui.main.markets.statistics.MarketStatisticItem; +import io.bitsquare.gui.main.MainView; +import io.bitsquare.gui.main.offer.BuyOfferView; +import io.bitsquare.gui.main.offer.SellOfferView; import io.bitsquare.gui.main.offer.offerbook.OfferBookListItem; import io.bitsquare.gui.util.BSFormatter; -import io.bitsquare.locale.CurrencyUtil; import io.bitsquare.locale.TradeCurrency; import io.bitsquare.trade.offer.Offer; import javafx.beans.property.ReadOnlyObjectWrapper; @@ -37,6 +39,7 @@ import javafx.scene.chart.AreaChart; import javafx.scene.chart.NumberAxis; import javafx.scene.chart.XYChart; import javafx.scene.control.*; +import javafx.scene.image.ImageView; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.util.Callback; @@ -52,6 +55,7 @@ public class MarketsChartsView extends ActivatableViewAndModel changeListener; + private Navigation navigation; private final BSFormatter formatter; private TableView buyOfferTableView; private TableView sellOfferTableView; @@ -67,8 +71,9 @@ public class MarketsChartsView extends ActivatableViewAndModel updateChartData(); @@ -148,7 +153,7 @@ public class MarketsChartsView extends ActivatableViewAndModel, VBox> getOfferTable(Offer.Direction direction) { - TableView tableView = new TableView(); + TableView tableView = new TableView<>(); // price TableColumn priceColumn = new TableColumn<>(); @@ -156,11 +161,9 @@ public class MarketsChartsView extends ActivatableViewAndModel new ReadOnlyObjectWrapper<>(offer.getValue())); priceColumn.setCellFactory( - new Callback, TableCell>() { + new Callback, TableCell>() { @Override - public TableCell call( - TableColumn column) { + public TableCell call(TableColumn column) { return new TableCell() { @Override public void updateItem(final Offer item, boolean empty) { @@ -181,11 +184,9 @@ public class MarketsChartsView extends ActivatableViewAndModel new ReadOnlyObjectWrapper<>(offer.getValue())); amountColumn.setCellFactory( - new Callback, TableCell>() { + new Callback, TableCell>() { @Override - public TableCell call( - TableColumn column) { + public TableCell call(TableColumn column) { return new TableCell() { @Override public void updateItem(final Offer item, boolean empty) { @@ -206,11 +207,9 @@ public class MarketsChartsView extends ActivatableViewAndModel new ReadOnlyObjectWrapper<>(offer.getValue())); volumeColumn.setCellFactory( - new Callback, TableCell>() { + new Callback, TableCell>() { @Override - public TableCell call( - TableColumn column) { + public TableCell call(TableColumn column) { return new TableCell() { @Override public void updateItem(final Offer item, boolean empty) { @@ -225,12 +224,54 @@ public class MarketsChartsView extends ActivatableViewAndModel selectColumn = new TableColumn<>("I want to:"); + selectColumn.setMinWidth(100); + selectColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue())); + selectColumn.setCellFactory( + new Callback, TableCell>() { + @Override + public TableCell call(TableColumn column) { + return new TableCell() { + final Button button = new Button(); + final ImageView iconView = new ImageView(); + + { + button.setGraphic(iconView); + button.setMinWidth(70); + } + + @Override + public void updateItem(final Offer item, boolean empty) { + super.updateItem(item, empty); + if (item != null && !empty) { + boolean isSellOffer = item.getDirection() == Offer.Direction.SELL; + iconView.setId(isSellOffer ? "image-buy" : "image-sell"); + button.setText(isSellOffer ? "Buy" : "Sell"); + button.setOnAction(e -> { + if (isSellOffer) + navigation.navigateTo(MainView.class, BuyOfferView.class); + else + navigation.navigateTo(MainView.class, SellOfferView.class); + }); + setGraphic(button); + } else { + setGraphic(null); + if (button != null) + button.setOnAction(null); + } + } + }; + } + }); + tableView.getColumns().add(selectColumn); + tableView.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); Label placeholder = new Label("Currently there are no offers available"); placeholder.setWrapText(true); tableView.setPlaceholder(placeholder); - Label titleLabel = new Label(direction.equals(Offer.Direction.BUY) ? "Offers for buy bitcoin (bid)" : "Offers for sell bitcoin (ask)"); + Label titleLabel = new Label(direction.equals(Offer.Direction.BUY) ? "Buy-bitcoin offers (bid)" : "Sell-bitcoin offers (ask)"); titleLabel.setStyle("-fx-font-weight: bold; -fx-font-size: 16; -fx-alignment: center"); UserThread.execute(() -> titleLabel.prefWidthProperty().bind(tableView.widthProperty())); @@ -256,10 +297,10 @@ public class MarketsChartsView extends ActivatableViewAndModel(xAxis, yAxis); areaChart.setAnimated(false); @@ -277,119 +318,4 @@ public class MarketsChartsView extends ActivatableViewAndModel getCurrencyColumn() { - TableColumn column = new TableColumn("Currency") { - { - setMinWidth(100); - } - }; - column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); - column.setCellFactory( - new Callback, TableCell>() { - @Override - public TableCell call( - TableColumn column) { - return new TableCell() { - @Override - public void updateItem(final MarketStatisticItem item, boolean empty) { - super.updateItem(item, empty); - if (item != null && !empty) - setText(CurrencyUtil.getNameByCode(item.currencyCode)); - else - setText(""); - } - }; - } - }); - return column; - } - - private TableColumn getNumberOfOffersColumn() { - TableColumn column = new TableColumn("Total offers") { - { - setMinWidth(100); - } - }; - column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); - column.setCellFactory( - new Callback, TableCell>() { - @Override - public TableCell call( - TableColumn column) { - return new TableCell() { - @Override - public void updateItem(final MarketStatisticItem item, boolean empty) { - super.updateItem(item, empty); - if (item != null && !empty) - setText(String.valueOf(item.numberOfOffers)); - else - setText(""); - } - }; - } - }); - return column; - } - - private TableColumn getTotalAmountColumn() { - TableColumn column = new TableColumn("Total amount (BTC)") { - { - setMinWidth(130); - } - }; - column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); - column.setCellFactory( - new Callback, TableCell>() { - @Override - public TableCell call( - TableColumn column) { - return new TableCell() { - @Override - public void updateItem(final MarketStatisticItem item, boolean empty) { - super.updateItem(item, empty); - if (item != null && !empty) - setText(formatter.formatCoin(item.totalAmount)); - else - setText(""); - } - }; - } - }); - return column; - } - - private TableColumn getSpreadColumn() { - TableColumn column = new TableColumn("Spread") { - { - setMinWidth(130); - } - }; - column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue())); - column.setCellFactory( - new Callback, TableCell>() { - @Override - public TableCell call( - TableColumn column) { - return new TableCell() { - @Override - public void updateItem(final MarketStatisticItem item, boolean empty) { - super.updateItem(item, empty); - if (item != null && !empty && item.spread != null) - setText(formatter.formatFiatWithCode(item.spread)); - else - setText(""); - } - }; - } - }); - return column; - } - - } diff --git a/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java b/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java index b652d5c0de..6a2708ef16 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/offer/offerbook/OfferBookView.java @@ -20,6 +20,7 @@ package io.bitsquare.gui.main.offer.offerbook; import io.bitsquare.gui.Navigation; import io.bitsquare.gui.common.view.ActivatableViewAndModel; import io.bitsquare.gui.common.view.FxmlView; +import io.bitsquare.gui.components.HyperlinkWithIcon; import io.bitsquare.gui.components.TableGroupHeadline; import io.bitsquare.gui.main.MainView; import io.bitsquare.gui.main.account.AccountView; @@ -63,6 +64,7 @@ public class OfferBookView extends ActivatableViewAndModel call(TableColumn column) { return new TableCell() { + private HyperlinkWithIcon field; + @Override public void updateItem(final OfferBookListItem item, boolean empty) { super.updateItem(item, empty); - Hyperlink hyperlink = null; + if (item != null && !empty) { - hyperlink = new Hyperlink(model.getPaymentMethod(item)); - hyperlink.setTooltip(new Tooltip(model.getPaymentMethodToolTip(item))); - hyperlink.setOnAction(event -> offerDetailsPopup.show(item.getOffer())); - setGraphic(hyperlink); + field = new HyperlinkWithIcon(model.getPaymentMethod(item), true); + field.setOnAction(event -> offerDetailsPopup.show(item.getOffer())); + field.setTooltip(new Tooltip(model.getPaymentMethodToolTip(item))); + setGraphic(field); } else { - if (hyperlink != null) { - hyperlink.setText(""); - hyperlink.setTooltip(null); - } setGraphic(null); + if (field != null) + field.setOnAction(null); } } }; @@ -396,7 +399,7 @@ public class OfferBookView extends ActivatableViewAndModel getActionColumn() { - TableColumn column = new TableColumn("") { + TableColumn column = new TableColumn("I want to:") { { setMinWidth(80); setSortable(false); @@ -434,12 +437,9 @@ public class OfferBookView extends ActivatableViewAndModel onShowInfo(isPaymentAccountValidForOffer, hasMatchingArbitrator)); - /* tableRow.setTooltip( - new Tooltip(hasMatchingArbitrator ? "No matching payment account." : "No matching accepted arbitrators."));*/ } } } @@ -472,6 +472,8 @@ public class OfferBookView extends ActivatableViewAndModel - + diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/closedtrades/ClosedTradesView.java b/gui/src/main/java/io/bitsquare/gui/main/portfolio/closedtrades/ClosedTradesView.java index f6ba11ead1..fd081960ae 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/closedtrades/ClosedTradesView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/closedtrades/ClosedTradesView.java @@ -19,6 +19,7 @@ package io.bitsquare.gui.main.portfolio.closedtrades; import io.bitsquare.gui.common.view.ActivatableViewAndModel; import io.bitsquare.gui.common.view.FxmlView; +import io.bitsquare.gui.components.HyperlinkWithIcon; import io.bitsquare.gui.popups.OfferDetailsPopup; import io.bitsquare.gui.popups.TradeDetailsPopup; import io.bitsquare.gui.util.BSFormatter; @@ -83,26 +84,26 @@ public class ClosedTradesView extends ActivatableViewAndModel call(TableColumn column) { return new TableCell() { - private Hyperlink hyperlink; + private HyperlinkWithIcon field; @Override public void updateItem(final ClosedTradableListItem item, boolean empty) { super.updateItem(item, empty); - if (item != null && !empty) { - hyperlink = new Hyperlink(model.getTradeId(item)); - Tooltip.install(hyperlink, new Tooltip(model.getTradeId(item))); - hyperlink.setOnAction(event -> { + field = new HyperlinkWithIcon(model.getTradeId(item), true); + field.setOnAction(event -> { Tradable tradable = item.getTradable(); if (tradable instanceof Trade) tradeDetailsPopup.show((Trade) tradable); else if (tradable instanceof OpenOffer) offerDetailsPopup.show(tradable.getOffer()); }); - setGraphic(hyperlink); + field.setTooltip(new Tooltip("Open popup for details")); + setGraphic(field); } else { setGraphic(null); - setId(null); + if (field != null) + field.setOnAction(null); } } }; diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/failedtrades/FailedTradesView.fxml b/gui/src/main/java/io/bitsquare/gui/main/portfolio/failedtrades/FailedTradesView.fxml index 5b2103add3..de276de16a 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/failedtrades/FailedTradesView.fxml +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/failedtrades/FailedTradesView.fxml @@ -28,7 +28,7 @@ - + diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/failedtrades/FailedTradesView.java b/gui/src/main/java/io/bitsquare/gui/main/portfolio/failedtrades/FailedTradesView.java index 4817544446..0e9a5cfd4c 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/failedtrades/FailedTradesView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/failedtrades/FailedTradesView.java @@ -19,8 +19,8 @@ package io.bitsquare.gui.main.portfolio.failedtrades; import io.bitsquare.gui.common.view.ActivatableViewAndModel; import io.bitsquare.gui.common.view.FxmlView; +import io.bitsquare.gui.components.HyperlinkWithIcon; import io.bitsquare.gui.popups.TradeDetailsPopup; -import io.bitsquare.trade.Trade; import javafx.beans.property.ReadOnlyObjectWrapper; import javafx.fxml.FXML; import javafx.scene.control.*; @@ -74,23 +74,20 @@ public class FailedTradesView extends ActivatableViewAndModel call(TableColumn column) { return new TableCell() { - private Hyperlink hyperlink; + private HyperlinkWithIcon field; @Override public void updateItem(final FailedTradesListItem item, boolean empty) { super.updateItem(item, empty); - if (item != null && !empty) { - hyperlink = new Hyperlink(model.getTradeId(item)); - Tooltip.install(hyperlink, new Tooltip(model.getTradeId(item))); - hyperlink.setOnAction(event -> { - Trade trade = item.getTrade(); - tradeDetailsPopup.show(trade); - }); - setGraphic(hyperlink); + field = new HyperlinkWithIcon(model.getTradeId(item), true); + field.setOnAction(event -> tradeDetailsPopup.show(item.getTrade())); + field.setTooltip(new Tooltip("Open popup for details")); + setGraphic(field); } else { setGraphic(null); - setId(null); + if (field != null) + field.setOnAction(null); } } }; diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/openoffer/OpenOffersView.java b/gui/src/main/java/io/bitsquare/gui/main/portfolio/openoffer/OpenOffersView.java index c692edb12f..61ac29b0da 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/openoffer/OpenOffersView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/openoffer/OpenOffersView.java @@ -20,6 +20,7 @@ package io.bitsquare.gui.main.portfolio.openoffer; import io.bitsquare.gui.Navigation; import io.bitsquare.gui.common.view.ActivatableViewAndModel; import io.bitsquare.gui.common.view.FxmlView; +import io.bitsquare.gui.components.HyperlinkWithIcon; import io.bitsquare.gui.main.MainView; import io.bitsquare.gui.main.funds.FundsView; import io.bitsquare.gui.main.funds.withdrawal.WithdrawalView; @@ -109,19 +110,21 @@ public class OpenOffersView extends ActivatableViewAndModel call(TableColumn column) { return new TableCell() { + private HyperlinkWithIcon field; @Override public void updateItem(final OpenOfferListItem item, boolean empty) { super.updateItem(item, empty); if (item != null && !empty) { - Hyperlink hyperlink = new Hyperlink(model.getTradeId(item)); - Tooltip.install(hyperlink, new Tooltip(model.getTradeId(item))); - hyperlink.setOnAction(event -> offerDetailsPopup.show(item.getOffer())); - setGraphic(hyperlink); + field = new HyperlinkWithIcon(model.getTradeId(item), true); + field.setOnAction(event -> offerDetailsPopup.show(item.getOffer())); + field.setTooltip(new Tooltip("Open popup for details")); + setGraphic(field); } else { setGraphic(null); - setId(null); + if (field != null) + field.setOnAction(null); } } }; diff --git a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesView.java b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesView.java index 5350350fe4..8475d013cf 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesView.java +++ b/gui/src/main/java/io/bitsquare/gui/main/portfolio/pendingtrades/PendingTradesView.java @@ -20,6 +20,7 @@ package io.bitsquare.gui.main.portfolio.pendingtrades; import io.bitsquare.common.UserThread; import io.bitsquare.gui.common.view.ActivatableViewAndModel; import io.bitsquare.gui.common.view.FxmlView; +import io.bitsquare.gui.components.HyperlinkWithIcon; import io.bitsquare.gui.popups.OpenEmergencyTicketPopup; import io.bitsquare.gui.popups.TradeDetailsPopup; import io.bitsquare.trade.Trade; @@ -163,7 +164,7 @@ public class PendingTradesView extends ActivatableViewAndModel call(TableColumn column) { return new TableCell() { - private Hyperlink hyperlink; + private HyperlinkWithIcon field; @Override public void updateItem(final PendingTradesListItem item, boolean empty) { super.updateItem(item, empty); if (item != null && !empty) { - hyperlink = new Hyperlink(model.formatTradeId(item.getId())); - Tooltip.install(hyperlink, new Tooltip(model.formatTradeId(item.getId()))); - hyperlink.setOnAction(event -> tradeDetailsPopup.show(item.getTrade())); - setGraphic(hyperlink); + field = new HyperlinkWithIcon(model.formatTradeId(item.getId()), true); + field.setOnAction(event -> tradeDetailsPopup.show(item.getTrade())); + field.setTooltip(new Tooltip("Open popup for details")); + setGraphic(field); } else { setGraphic(null); - setId(null); + if (field != null) + field.setOnAction(null); } } };