Merge pull request #4923 from chimp1984/fix-sorting-of-table-columns

Fix sorting of table columns
This commit is contained in:
Christoph Atteneder 2020-12-09 09:12:17 +01:00 committed by GitHub
commit 09b253e155
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 190 additions and 129 deletions

View file

@ -169,7 +169,6 @@ public class BondsView extends ActivatableView<GridPane, Void> {
column = new AutoTooltipTableColumn<>(Res.get("shared.amountWithCur", "BSQ"));
column.setMinWidth(80);
column.getStyleClass().add("first-column");
column.setComparator(Comparator.comparingLong(v -> v.getBond().getAmount()));
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
column.setCellFactory(new Callback<>() {
@Override
@ -191,7 +190,6 @@ public class BondsView extends ActivatableView<GridPane, Void> {
column = new AutoTooltipTableColumn<>(Res.get("dao.bond.table.column.lockTime"));
column.setMinWidth(40);
column.setComparator(Comparator.comparingInt(v -> v.getBond().getLockTime()));
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
column.setCellFactory(new Callback<>() {
@Override
@ -294,7 +292,6 @@ public class BondsView extends ActivatableView<GridPane, Void> {
column = new AutoTooltipTableColumn<>(Res.get("dao.bond.table.column.lockupDate"));
column.setMinWidth(140);
column.setComparator(Comparator.comparingLong(v -> v.getBond().getLockupDate()));
column.setCellValueFactory((item) -> new ReadOnlyObjectWrapper<>(item.getValue()));
column.setCellFactory(new Callback<>() {
@Override

View file

@ -170,6 +170,10 @@ public class ProposalsListItem {
}
}
public String getProposalTypeAsString() {
return Res.get("dao.proposal.type." + proposal.getType().name());
}
private String getNext(IconButtonType iconButtonType) {
switch (iconButtonType) {
case ACCEPT:

View file

@ -786,7 +786,7 @@ public class ProposalsView extends ActivatableView<GridPane, Void> implements Bs
public void updateItem(final ProposalsListItem item, boolean empty) {
super.updateItem(item, empty);
if (item != null && !empty) {
final Proposal proposal = item.getProposal();
Proposal proposal = item.getProposal();
field = new HyperlinkWithIcon(proposal.getLink());
field.setOnAction(event -> GUIUtil.openWebPage(proposal.getLink()));
field.setTooltip(new Tooltip(proposal.getLink()));
@ -800,7 +800,7 @@ public class ProposalsView extends ActivatableView<GridPane, Void> implements Bs
};
}
});
column.setComparator(Comparator.comparing(o -> o.getProposal().getTxId()));
column.setComparator(Comparator.comparing(o -> o.getProposal().getLink()));
tableView.getColumns().add(column);
@ -817,14 +817,14 @@ public class ProposalsView extends ActivatableView<GridPane, Void> implements Bs
public void updateItem(final ProposalsListItem item, boolean empty) {
super.updateItem(item, empty);
if (item != null)
setText(Res.get("dao.proposal.type." + item.getProposal().getType().name()));
setText(item.getProposalTypeAsString());
else
setText("");
}
};
}
});
column.setComparator(Comparator.comparing(o2 -> o2.getProposal().getName()));
column.setComparator(Comparator.comparing(ProposalsListItem::getProposalTypeAsString));
tableView.getColumns().add(column);
@ -886,6 +886,7 @@ public class ProposalsView extends ActivatableView<GridPane, Void> implements Bs
};
}
});
column.setComparator(Comparator.comparing(item -> ((ProposalsListItem.IconButtonType) item.getIconButton().getUserData()).getTitle()));
tableView.getColumns().add(column);
lastColumn = column;
}

View file

@ -596,7 +596,7 @@ public class VoteResultView extends ActivatableView<GridPane, Void> implements D
};
}
});
column.setComparator(Comparator.comparing(CycleListItem::getNumProposals));
column.setComparator(Comparator.comparing(CycleListItem::getNumVotesAsString));
votesTableView.getColumns().add(column);
column = new AutoTooltipTableColumn<>(Res.get("dao.results.cycles.table.header.voteWeight"));
@ -619,7 +619,7 @@ public class VoteResultView extends ActivatableView<GridPane, Void> implements D
};
}
});
column.setComparator(Comparator.comparing(CycleListItem::getNumProposals));
column.setComparator(Comparator.comparing(CycleListItem::getMeritAndStake));
votesTableView.getColumns().add(column);
column = new AutoTooltipTableColumn<>(Res.get("dao.results.cycles.table.header.issuance"));
@ -643,7 +643,7 @@ public class VoteResultView extends ActivatableView<GridPane, Void> implements D
};
}
});
column.setComparator(Comparator.comparing(CycleListItem::getNumProposals));
column.setComparator(Comparator.comparing(CycleListItem::getIssuance));
votesTableView.getColumns().add(column);
}
@ -676,7 +676,7 @@ public class VoteResultView extends ActivatableView<GridPane, Void> implements D
};
}
});
column.setComparator(Comparator.comparing(o3 -> o3.getProposal().getCreationDateAsDate()));
column.setComparator(Comparator.comparing(item -> item.getProposal().getCreationDateAsDate()));
column.setSortType(TableColumn.SortType.DESCENDING);
votesTableView.getColumns().add(column);
votesTableView.getSortOrder().add(column);
@ -721,7 +721,7 @@ public class VoteResultView extends ActivatableView<GridPane, Void> implements D
};
}
});
column.setComparator(Comparator.comparing((evaluatedProposal -> evaluatedProposal.getProposal().getName().toLowerCase())));
column.setComparator(Comparator.comparing((item -> item.getProposalOwnerName() + item.getProposal().getLink())));
votesTableView.getColumns().add(column);
@ -745,7 +745,7 @@ public class VoteResultView extends ActivatableView<GridPane, Void> implements D
};
}
});
column.setComparator(Comparator.comparing(o2 -> o2.getProposal().getType().getDisplayName()));
column.setComparator(Comparator.comparing(o2 -> o2.getProposal().getType().getShortDisplayName()));
votesTableView.getColumns().add(column);
@ -770,7 +770,7 @@ public class VoteResultView extends ActivatableView<GridPane, Void> implements D
}
});
// We sort by issued amount
column.setComparator(Comparator.comparing(ProposalListItem::getIssuedAmount));
column.setComparator(Comparator.comparing(ProposalListItem::getDetails));
votesTableView.getColumns().add(column);

View file

@ -256,7 +256,6 @@ public class LockedView extends ActivatableView<VBox, Void> {
if (item != null && !empty) {
Optional<Tradable> tradableOptional = getTradable(item);
AddressEntry addressEntry = item.getAddressEntry();
if (tradableOptional.isPresent()) {
field = new HyperlinkWithIcon(Res.get("funds.locked.locked", item.getTrade().getShortId()),
AwesomeIcon.INFO_SIGN);

View file

@ -42,13 +42,7 @@ import bisq.network.p2p.P2PService;
import bisq.common.util.Utilities;
import org.bitcoinj.core.TransactionConfidence;
import org.bitcoinj.core.listeners.TransactionConfidenceEventListener;
import org.bitcoinj.wallet.listeners.KeyChainEventListener;
import org.bitcoinj.wallet.listeners.ScriptsChangeEventListener;
import org.bitcoinj.wallet.listeners.WalletChangeEventListener;
import org.bitcoinj.wallet.listeners.WalletCoinsReceivedEventListener;
import org.bitcoinj.wallet.listeners.WalletCoinsSentEventListener;
import org.bitcoinj.wallet.listeners.WalletReorganizeEventListener;
import com.googlecode.jcsv.writer.CSVEntryConverter;
@ -155,14 +149,17 @@ public class TransactionsView extends ActivatableView<VBox, Void> {
dateColumn.setComparator(Comparator.comparing(TransactionsListItem::getDate));
detailsColumn.setComparator((o1, o2) -> {
String id1 = o1.getTradable() != null ? o1.getTradable().getId() : o1.getDetails();
String id2 = o2.getTradable() != null ? o2.getTradable().getId() : o2.getDetails();
String id1 = !o1.getDetails().isEmpty() ? o1.getDetails() :
o1.getTradable() != null ? o1.getTradable().getId() : o1.getTxId();
String id2 = !o2.getDetails().isEmpty() ? o2.getDetails() :
o2.getTradable() != null ? o2.getTradable().getId() : o2.getTxId();
return id1.compareTo(id2);
});
addressColumn.setComparator(Comparator.comparing(TransactionsListItem::getAddressString));
addressColumn.setComparator(Comparator.comparing(item -> item.getDirection() + item.getAddressString()));
transactionColumn.setComparator(Comparator.comparing(TransactionsListItem::getTxId));
amountColumn.setComparator(Comparator.comparing(TransactionsListItem::getAmountAsCoin));
confidenceColumn.setComparator(Comparator.comparingDouble(item -> item.getTxConfidenceIndicator().getProgress()));
memoColumn.setComparator(Comparator.comparing(TransactionsListItem::getMemo));
dateColumn.setSortType(TableColumn.SortType.DESCENDING);
tableView.getSortOrder().add(dateColumn);
@ -200,7 +197,7 @@ public class TransactionsView extends ActivatableView<VBox, Void> {
exportButton.setOnAction(event -> {
final ObservableList<TableColumn<TransactionsListItem, ?>> tableColumns = tableView.getColumns();
final int reportColumns = tableColumns.size()-1; // CSV report excludes the last column (an icon)
final int reportColumns = tableColumns.size() - 1; // CSV report excludes the last column (an icon)
CSVEntryConverter<TransactionsListItem> headerConverter = transactionsListItem -> {
String[] columns = new String[reportColumns];
for (int i = 0; i < columns.length; i++)
@ -428,7 +425,6 @@ public class TransactionsView extends ActivatableView<VBox, Void> {
private void setMemoColumnCellFactory() {
memoColumn.setCellValueFactory((addressListItem) ->
new ReadOnlyObjectWrapper<>(addressListItem.getValue()));
memoColumn.setCellFactory(
new Callback<>() {

View file

@ -33,7 +33,6 @@ import bisq.desktop.util.GUIUtil;
import bisq.core.locale.CurrencyUtil;
import bisq.core.locale.Res;
import bisq.core.monetary.Price;
import bisq.core.monetary.Volume;
import bisq.core.trade.statistics.TradeStatistics3;
import bisq.core.util.FormattingUtils;
import bisq.core.util.coin.CoinFormatter;
@ -54,6 +53,7 @@ import com.jfoenix.controls.JFXTabPane;
import javafx.stage.Stage;
import javafx.scene.Node;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.ComboBox;
@ -72,7 +72,6 @@ import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.scene.Node;
import javafx.scene.text.Text;
import javafx.geometry.Insets;
@ -741,7 +740,7 @@ public class TradesChartsView extends ActivatableViewAndModel<VBox, TradesCharts
};
}
});
marketColumn.setComparator(Comparator.comparing(TradeStatistics3ListItem::getDate));
marketColumn.setComparator(Comparator.comparing(TradeStatistics3ListItem::getMarket));
tableView.getColumns().add(marketColumn);
// price
@ -814,11 +813,7 @@ public class TradesChartsView extends ActivatableViewAndModel<VBox, TradesCharts
};
}
});
volumeColumn.setComparator((o1, o2) -> {
final Volume tradeVolume1 = o1.getTradeVolume();
final Volume tradeVolume2 = o2.getTradeVolume();
return tradeVolume1.compareTo(tradeVolume2);
});
volumeColumn.setComparator(Comparator.comparing(TradeStatistics3ListItem::getTradeVolume));
tableView.getColumns().add(volumeColumn);
// paymentMethod

View file

@ -244,14 +244,20 @@ public class OfferBookView extends ActivatableViewAndModel<GridPane, OfferBookVi
priceColumn.setComparator(Comparator.comparing(o -> o.getOffer().getPrice(), Comparator.nullsFirst(Comparator.naturalOrder())));
amountColumn.setComparator(Comparator.comparing(o -> o.getOffer().getMinAmount()));
volumeColumn.setComparator(Comparator.comparing(o -> o.getOffer().getMinVolume(), Comparator.nullsFirst(Comparator.naturalOrder())));
paymentMethodColumn.setComparator(Comparator.comparing(o -> o.getOffer().getPaymentMethod()));
avatarColumn.setComparator(Comparator.comparing(o -> o.getOffer().getOwnerNodeAddress().getFullAddress()));
depositColumn.setComparator(Comparator.comparing(o -> {
var isSellOffer = o.getOffer().getDirection() == OfferPayload.Direction.SELL;
var deposit = isSellOffer ? o.getOffer().getBuyerSecurityDeposit() :
o.getOffer().getSellerSecurityDeposit();
paymentMethodColumn.setComparator(Comparator.comparing(o -> Res.get(o.getOffer().getPaymentMethod().getId())));
avatarColumn.setComparator(Comparator.comparing(o -> model.getNumTrades(o.getOffer())));
depositColumn.setComparator(Comparator.comparing(item -> {
boolean isSellOffer = item.getOffer().getDirection() == OfferPayload.Direction.SELL;
Coin deposit = isSellOffer ?
item.getOffer().getBuyerSecurityDeposit() :
item.getOffer().getSellerSecurityDeposit();
return (deposit == null) ? 0.0 : deposit.getValue() / (double) o.getOffer().getAmount().getValue();
double amountValue = item.getOffer().getAmount().getValue();
if ((deposit == null || amountValue == 0)) {
return 0d;
} else {
return deposit.getValue() / amountValue;
}
}, Comparator.nullsFirst(Comparator.naturalOrder())));

View file

@ -41,10 +41,10 @@
<TableColumn fx:id="deviationColumn" minWidth="70"/>
<TableColumn fx:id="amountColumn" minWidth="110"/>
<TableColumn fx:id="volumeColumn" minWidth="110"/>
<TableColumn fx:id="txFeeColumn" visible="false"/>
<TableColumn fx:id="tradeFeeColumn" visible="false"/>
<TableColumn fx:id="buyerSecurityDepositColumn" visible="false"/>
<TableColumn fx:id="sellerSecurityDepositColumn" visible="false"/>
<TableColumn fx:id="txFeeColumn" visible="false" minWidth="75"/>
<TableColumn fx:id="tradeFeeColumn" visible="false" minWidth="110"/>
<TableColumn fx:id="buyerSecurityDepositColumn" visible="false" minWidth="75"/>
<TableColumn fx:id="sellerSecurityDepositColumn" visible="false" minWidth="75"/>
<TableColumn fx:id="directionColumn" minWidth="70"/>
<TableColumn fx:id="stateColumn" minWidth="80"/>
<TableColumn fx:id="avatarColumn" minWidth="40" maxWidth="40"/>

View file

@ -100,6 +100,7 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
ColumnNames(String text) {
this.text = text;
}
@Override
public String toString() {
return text;
@ -124,12 +125,13 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
AutoTooltipButton exportButton;
private final OfferDetailsWindow offerDetailsWindow;
private Preferences preferences;
private final Preferences preferences;
private final TradeDetailsWindow tradeDetailsWindow;
private final PrivateNotificationManager privateNotificationManager;
private SortedList<ClosedTradableListItem> sortedList;
private FilteredList<ClosedTradableListItem> filteredList;
private ChangeListener<String> filterTextFieldListener;
private ChangeListener<Number> widthListener;
@Inject
public ClosedTradesView(ClosedTradesViewModel model,
@ -146,8 +148,9 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
this.useDevPrivilegeKeys = useDevPrivilegeKeys;
}
@Override
public void initialize() {
@Override
public void initialize() {
widthListener = (observable, oldValue, newValue) -> onWidthChange((double) newValue);
txFeeColumn.setGraphic(new AutoTooltipLabel(ColumnNames.TX_FEE.toString()));
tradeFeeColumn.setGraphic(new AutoTooltipLabel(ColumnNames.TRADE_FEE.toString()));
buyerSecurityDepositColumn.setGraphic(new AutoTooltipLabel(ColumnNames.BUYER_SEC.toString()));
@ -170,10 +173,10 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
setTradeIdColumnCellFactory();
setDirectionColumnCellFactory();
setAmountColumnCellFactory();
setTxFeeColumnCellFactory();
setTradeFeeColumnCellFactory();
setBuyerSecurityDepositColumnCellFactory();
setSellerSecurityDepositColumnCellFactory();
setTxFeeColumnCellFactory();
setTradeFeeColumnCellFactory();
setBuyerSecurityDepositColumnCellFactory();
setSellerSecurityDepositColumnCellFactory();
setPriceColumnCellFactory();
setDeviationColumnCellFactory();
setVolumeColumnCellFactory();
@ -186,24 +189,31 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
dateColumn.setComparator(Comparator.comparing(o -> o.getTradable().getDate()));
directionColumn.setComparator(Comparator.comparing(o -> o.getTradable().getOffer().getDirection()));
marketColumn.setComparator(Comparator.comparing(model::getMarketLabel));
priceColumn.setComparator(nullsFirstComparing(o ->
o instanceof Trade ? ((Trade) o).getTradePrice() : o.getOffer().getPrice()
));
priceColumn.setComparator(Comparator.comparing(model::getPrice, Comparator.nullsFirst(Comparator.naturalOrder())));
deviationColumn.setComparator(Comparator.comparing(o ->
o.getTradable().getOffer().isUseMarketBasedPrice() ? o.getTradable().getOffer().getMarketPriceMargin() : 1,
o.getTradable().getOffer().isUseMarketBasedPrice() ? o.getTradable().getOffer().getMarketPriceMargin() : 1,
Comparator.nullsFirst(Comparator.naturalOrder())));
volumeColumn.setComparator(nullsFirstComparingAsTrade(Trade::getTradeVolume));
amountColumn.setComparator(nullsFirstComparingAsTrade(Trade::getTradeAmount));
avatarColumn.setComparator(nullsFirstComparingAsTrade(o ->
o.getTradingPeerNodeAddress() != null ? o.getTradingPeerNodeAddress().getFullAddress() : null
amountColumn.setComparator(Comparator.comparing(model::getAmount, Comparator.nullsFirst(Comparator.naturalOrder())));
avatarColumn.setComparator(Comparator.comparing(
o -> model.getNumPastTrades(o.getTradable()),
Comparator.nullsFirst(Comparator.naturalOrder())
));
txFeeColumn.setComparator(nullsFirstComparing(o ->
o instanceof Trade ? ((Trade) o).getTxFee() : o.getOffer().getTxFee()
));
tradeFeeColumn.setComparator(nullsFirstComparing(o ->
o instanceof Trade ? ((Trade) o).getTakerFee() : o.getOffer().getMakerFee()
));
txFeeColumn.setComparator(Comparator.comparing(model::getTxFee, Comparator.nullsFirst(Comparator.naturalOrder())));
//
tradeFeeColumn.setComparator(Comparator.comparing(item -> {
String tradeFee = model.getTradeFee(item);
// We want to separate BSQ and BTC fees so we use a prefix
if (item.getTradable().getOffer().isCurrencyForMakerFeeBtc()) {
return "BTC" + tradeFee;
} else {
return "BSQ" + tradeFee;
}
}, Comparator.nullsFirst(Comparator.naturalOrder())));
buyerSecurityDepositColumn.setComparator(nullsFirstComparing(o ->
o.getOffer() != null ? o.getOffer().getBuyerSecurityDeposit() : null
));
@ -225,20 +235,6 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
HBox.setMargin(exportButton, new Insets(0, 10, 0, 0));
}
private static <T extends Comparable<T>> Comparator<ClosedTradableListItem> nullsFirstComparing(Function<Tradable, T> keyExtractor) {
return Comparator.comparing(
o -> o.getTradable() != null ? keyExtractor.apply(o.getTradable()) : null,
Comparator.nullsFirst(Comparator.naturalOrder())
);
}
private static <T extends Comparable<T>> Comparator<ClosedTradableListItem> nullsFirstComparingAsTrade(Function<Trade, T> keyExtractor) {
return Comparator.comparing(
o -> o.getTradable() instanceof Trade ? keyExtractor.apply((Trade) o.getTradable()) : null,
Comparator.nullsFirst(Comparator.naturalOrder())
);
}
@Override
protected void activate() {
filteredList = new FilteredList<>(model.getList());
@ -267,7 +263,7 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
columns[ColumnNames.AMOUNT.ordinal()] = model.getAmount(item);
columns[ColumnNames.VOLUME.ordinal()] = model.getVolume(item);
columns[ColumnNames.TX_FEE.ordinal()] = model.getTxFee(item);
columns[ColumnNames.TRADE_FEE.ordinal()] = model.getMakerFee(item);
columns[ColumnNames.TRADE_FEE.ordinal()] = model.getTradeFee(item);
columns[ColumnNames.BUYER_SEC.ordinal()] = model.getBuyerSecurityDeposit(item);
columns[ColumnNames.SELLER_SEC.ordinal()] = model.getSellerSecurityDeposit(item);
columns[ColumnNames.OFFER_TYPE.ordinal()] = model.getDirectionLabel(item);
@ -281,6 +277,8 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
filterTextField.textProperty().addListener(filterTextFieldListener);
applyFilteredListPredicate(filterTextField.getText());
root.widthProperty().addListener(widthListener);
onWidthChange(root.getWidth());
}
@Override
@ -289,6 +287,29 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
exportButton.setOnAction(null);
filterTextField.textProperty().removeListener(filterTextFieldListener);
root.widthProperty().removeListener(widthListener);
}
private static <T extends Comparable<T>> Comparator<ClosedTradableListItem> nullsFirstComparing(Function<Tradable, T> keyExtractor) {
return Comparator.comparing(
o -> o.getTradable() != null ? keyExtractor.apply(o.getTradable()) : null,
Comparator.nullsFirst(Comparator.naturalOrder())
);
}
private static <T extends Comparable<T>> Comparator<ClosedTradableListItem> nullsFirstComparingAsTrade(Function<Trade, T> keyExtractor) {
return Comparator.comparing(
o -> o.getTradable() instanceof Trade ? keyExtractor.apply((Trade) o.getTradable()) : null,
Comparator.nullsFirst(Comparator.naturalOrder())
);
}
private void onWidthChange(double width) {
log.error("onWidthChange " + width);
txFeeColumn.setVisible(width > 1200);
tradeFeeColumn.setVisible(width > 1300);
buyerSecurityDepositColumn.setVisible(width > 1400);
sellerSecurityDepositColumn.setVisible(width > 1500);
}
private void applyFilteredListPredicate(String filterString) {
@ -554,9 +575,9 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
});
}
private void setTxFeeColumnCellFactory() {
txFeeColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
txFeeColumn.setCellFactory(
private void setTxFeeColumnCellFactory() {
txFeeColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
txFeeColumn.setCellFactory(
new Callback<>() {
@Override
public TableCell<ClosedTradableListItem, ClosedTradableListItem> call(
@ -570,11 +591,11 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
};
}
});
}
}
private void setTradeFeeColumnCellFactory() {
tradeFeeColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
tradeFeeColumn.setCellFactory(
private void setTradeFeeColumnCellFactory() {
tradeFeeColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
tradeFeeColumn.setCellFactory(
new Callback<>() {
@Override
public TableCell<ClosedTradableListItem, ClosedTradableListItem> call(
@ -583,16 +604,16 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
@Override
public void updateItem(final ClosedTradableListItem item, boolean empty) {
super.updateItem(item, empty);
setGraphic(new AutoTooltipLabel(model.getMakerFee(item)));
setGraphic(new AutoTooltipLabel(model.getTradeFee(item)));
}
};
}
});
}
}
private void setBuyerSecurityDepositColumnCellFactory() {
buyerSecurityDepositColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
buyerSecurityDepositColumn.setCellFactory(
private void setBuyerSecurityDepositColumnCellFactory() {
buyerSecurityDepositColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
buyerSecurityDepositColumn.setCellFactory(
new Callback<>() {
@Override
public TableCell<ClosedTradableListItem, ClosedTradableListItem> call(
@ -606,11 +627,11 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
};
}
});
}
}
private void setSellerSecurityDepositColumnCellFactory() {
sellerSecurityDepositColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
sellerSecurityDepositColumn.setCellFactory(
private void setSellerSecurityDepositColumnCellFactory() {
sellerSecurityDepositColumn.setCellValueFactory((offer) -> new ReadOnlyObjectWrapper<>(offer.getValue()));
sellerSecurityDepositColumn.setCellFactory(
new Callback<>() {
@Override
public TableCell<ClosedTradableListItem, ClosedTradableListItem> call(
@ -624,6 +645,6 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
};
}
});
}
}
}

View file

@ -22,14 +22,26 @@ import bisq.desktop.common.model.ViewModel;
import bisq.desktop.util.DisplayUtils;
import bisq.core.account.witness.AccountAgeWitnessService;
import bisq.core.btc.wallet.BsqWalletService;
import bisq.core.btc.wallet.BtcWalletService;
import bisq.core.locale.CurrencyUtil;
import bisq.core.locale.Res;
import bisq.core.offer.Offer;
import bisq.core.offer.OpenOffer;
import bisq.core.trade.Tradable;
import bisq.core.trade.Trade;
import bisq.core.util.FormattingUtils;
import bisq.core.util.coin.BsqFormatter;
import bisq.core.util.coin.CoinFormatter;
import bisq.network.p2p.NodeAddress;
import bisq.common.config.Config;
import org.bitcoinj.core.Address;
import org.bitcoinj.core.Transaction;
import org.bitcoinj.core.TransactionOutput;
import com.google.inject.Inject;
import javax.inject.Named;
@ -39,16 +51,25 @@ import javafx.collections.ObservableList;
import java.util.stream.Collectors;
class ClosedTradesViewModel extends ActivatableWithDataModel<ClosedTradesDataModel> implements ViewModel {
private final CoinFormatter formatter;
private final BtcWalletService btcWalletService;
private final BsqWalletService bsqWalletService;
private final BsqFormatter bsqFormatter;
private final CoinFormatter btcFormatter;
final AccountAgeWitnessService accountAgeWitnessService;
@Inject
public ClosedTradesViewModel(ClosedTradesDataModel dataModel,
AccountAgeWitnessService accountAgeWitnessService,
@Named(FormattingUtils.BTC_FORMATTER_KEY) CoinFormatter formatter) {
BtcWalletService btcWalletService,
BsqWalletService bsqWalletService,
BsqFormatter bsqFormatter,
@Named(FormattingUtils.BTC_FORMATTER_KEY) CoinFormatter btcFormatter) {
super(dataModel);
this.accountAgeWitnessService = accountAgeWitnessService;
this.formatter = formatter;
this.btcWalletService = btcWalletService;
this.bsqWalletService = bsqWalletService;
this.bsqFormatter = bsqFormatter;
this.btcFormatter = btcFormatter;
}
public ObservableList<ClosedTradableListItem> getList() {
@ -61,7 +82,7 @@ class ClosedTradesViewModel extends ActivatableWithDataModel<ClosedTradesDataMod
String getAmount(ClosedTradableListItem item) {
if (item != null && item.getTradable() instanceof Trade)
return formatter.formatCoin(((Trade) item.getTradable()).getTradeAmount());
return btcFormatter.formatCoin(((Trade) item.getTradable()).getTradeAmount());
else if (item != null && item.getTradable() instanceof OpenOffer)
return "-";
else
@ -103,19 +124,39 @@ class ClosedTradesViewModel extends ActivatableWithDataModel<ClosedTradesDataMod
return "";
Tradable tradable = item.getTradable();
if (!wasMyOffer(tradable) && (tradable instanceof Trade))
return formatter.formatCoin(((Trade) tradable).getTxFee());
return btcFormatter.formatCoin(((Trade) tradable).getTxFee());
else
return formatter.formatCoin(tradable.getOffer().getTxFee());
return btcFormatter.formatCoin(tradable.getOffer().getTxFee());
}
String getMakerFee(ClosedTradableListItem item) {
if (item == null)
String getTradeFee(ClosedTradableListItem item) {
if (item == null) {
return "";
}
Tradable tradable = item.getTradable();
if (!wasMyOffer(tradable) && (tradable instanceof Trade))
return formatter.formatCoin(((Trade) tradable).getTakerFee());
else
return formatter.formatCoin(tradable.getOffer().getMakerFee());
Offer offer = tradable.getOffer();
if (!wasMyOffer(tradable) && (tradable instanceof Trade)) {
Trade trade = (Trade) tradable;
Transaction takerFeeTx = btcWalletService.getTransaction(trade.getTakerFeeTxId());
if (takerFeeTx != null && takerFeeTx.getOutputs().size() > 1) {
// First output is fee receiver address. If its a BSQ (change) address of our own wallet its a BSQ fee
TransactionOutput output = takerFeeTx.getOutput(0);
Address address = output.getScriptPubKey().getToAddress(Config.baseCurrencyNetworkParameters());
if (bsqWalletService.getWallet().findKeyFromAddress(address) != null) {
return bsqFormatter.formatCoinWithCode(trade.getTakerFee());
} else {
return btcFormatter.formatCoinWithCode(trade.getTakerFee());
}
} else {
log.warn("takerFeeTx is null or has invalid structure. takerFeeTx={}", takerFeeTx);
return Res.get("shared.na");
}
} else {
CoinFormatter formatter = offer.isCurrencyForMakerFeeBtc() ? btcFormatter : bsqFormatter;
return formatter.formatCoinWithCode(offer.getMakerFee());
}
}
String getBuyerSecurityDeposit(ClosedTradableListItem item) {
@ -123,7 +164,7 @@ class ClosedTradesViewModel extends ActivatableWithDataModel<ClosedTradesDataMod
return "";
Tradable tradable = item.getTradable();
if (tradable.getOffer() != null)
return formatter.formatCoin(tradable.getOffer().getBuyerSecurityDeposit());
return btcFormatter.formatCoin(tradable.getOffer().getBuyerSecurityDeposit());
else
return "";
}
@ -133,7 +174,7 @@ class ClosedTradesViewModel extends ActivatableWithDataModel<ClosedTradesDataMod
return "";
Tradable tradable = item.getTradable();
if (tradable.getOffer() != null)
return formatter.formatCoin(tradable.getOffer().getSellerSecurityDeposit());
return btcFormatter.formatCoin(tradable.getOffer().getSellerSecurityDeposit());
else
return "";
}
@ -194,15 +235,16 @@ class ClosedTradesViewModel extends ActivatableWithDataModel<ClosedTradesDataMod
}
int getNumPastTrades(Tradable tradable) {
//noinspection ConstantConditions
return dataModel.closedTradableManager.getObservableList().stream()
.filter(e -> e instanceof Trade &&
tradable instanceof Trade &&
((Trade) e).getTradingPeerNodeAddress() != null &&
((Trade) tradable).getTradingPeerNodeAddress() != null &&
((Trade) e).getTradingPeerNodeAddress() != null &&
((Trade) tradable).getTradingPeerNodeAddress() != null &&
((Trade) e).getTradingPeerNodeAddress().getFullAddress().equals(((Trade) tradable).getTradingPeerNodeAddress().getFullAddress()))
.filter(candidate -> {
if (!(candidate instanceof Trade) ||
!(tradable instanceof Trade)) return false;
NodeAddress candidateAddress = ((Trade) candidate).getTradingPeerNodeAddress();
NodeAddress tradableAddress = ((Trade) tradable).getTradingPeerNodeAddress();
return candidateAddress != null &&
tradableAddress != null &&
candidateAddress.getFullAddress().equals(tradableAddress.getFullAddress());
})
.collect(Collectors.toSet())
.size();
}

View file

@ -112,7 +112,6 @@ public class FailedTradesView extends ActivatableViewAndModel<VBox, FailedTrades
priceColumn.setComparator(Comparator.comparing(o -> o.getTrade().getTradePrice()));
volumeColumn.setComparator(Comparator.comparing(o -> o.getTrade().getTradeVolume(), Comparator.nullsFirst(Comparator.naturalOrder())));
amountColumn.setComparator(Comparator.comparing(o -> o.getTrade().getTradeAmount(), Comparator.nullsFirst(Comparator.naturalOrder())));
stateColumn.setComparator(Comparator.comparing(model::getState));
marketColumn.setComparator(Comparator.comparing(model::getMarketLabel));

View file

@ -125,7 +125,7 @@ public class OpenOffersView extends ActivatableViewAndModel<VBox, OpenOffersView
Comparator.nullsFirst(Comparator.naturalOrder())));
volumeColumn.setComparator(Comparator.comparing(o -> o.getOffer().getVolume(), Comparator.nullsFirst(Comparator.naturalOrder())));
dateColumn.setComparator(Comparator.comparing(o -> o.getOffer().getDate()));
paymentMethodColumn.setComparator(Comparator.comparing(o -> o.getOffer().getPaymentMethod().getId()));
paymentMethodColumn.setComparator(Comparator.comparing(o -> Res.get(o.getOffer().getPaymentMethod().getId())));
dateColumn.setSortType(TableColumn.SortType.DESCENDING);
tableView.getSortOrder().add(dateColumn);

View file

@ -196,18 +196,19 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
dateColumn.setComparator(Comparator.comparing(o -> o.getTrade().getDate()));
volumeColumn.setComparator(Comparator.comparing(o -> o.getTrade().getTradeVolume(), Comparator.nullsFirst(Comparator.naturalOrder())));
amountColumn.setComparator(Comparator.comparing(o -> o.getTrade().getTradeAmount(), Comparator.nullsFirst(Comparator.naturalOrder())));
priceColumn.setComparator(Comparator.comparing(PendingTradesListItem::getPrice));
priceColumn.setComparator(Comparator.comparing(item -> FormattingUtils.formatPrice(item.getPrice())));
paymentMethodColumn.setComparator(Comparator.comparing(
o -> o.getTrade().getOffer() != null ? o.getTrade().getOffer().getPaymentMethod().getId() : null,
Comparator.nullsFirst(Comparator.naturalOrder())
));
avatarColumn.setComparator(Comparator.comparing(
o -> o.getTrade().getTradingPeerNodeAddress() != null ? o.getTrade().getTradingPeerNodeAddress().getFullAddress() : null,
Comparator.nullsFirst(Comparator.naturalOrder())
));
roleColumn.setComparator(Comparator.comparing(model::getMyRole));
marketColumn.setComparator(Comparator.comparing(model::getMarketLabel));
item -> item.getTrade().getOffer() != null ?
Res.get(item.getTrade().getOffer().getPaymentMethod().getId()) :
null,
Comparator.nullsFirst(Comparator.naturalOrder())));
marketColumn.setComparator(Comparator.comparing(model::getMarketLabel));
roleColumn.setComparator(Comparator.comparing(model::getMyRole));
avatarColumn.setComparator(Comparator.comparing(
o -> model.getNumPastTrades(o.getTrade()),
Comparator.nullsFirst(Comparator.naturalOrder())
));
dateColumn.setSortType(TableColumn.SortType.DESCENDING);
tableView.getSortOrder().add(dateColumn);