mirror of
https://github.com/bisq-network/bisq.git
synced 2025-02-24 23:18:17 +01:00
Merge pull request #4923 from chimp1984/fix-sorting-of-table-columns
Fix sorting of table columns
This commit is contained in:
commit
09b253e155
14 changed files with 190 additions and 129 deletions
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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<>() {
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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())));
|
||||
|
||||
|
|
|
@ -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"/>
|
||||
|
|
|
@ -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
|
|||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue