diff --git a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/ResultComparators.groovy b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/ResultComparators.groovy new file mode 100644 index 00000000..5b7ffc1e --- /dev/null +++ b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/ResultComparators.groovy @@ -0,0 +1,21 @@ +package com.muwire.clilanterna + +import com.muwire.core.search.UIResultEvent + +class ResultComparators { + public static final Comparator NAME_ASC = new Comparator() { + public int compare(UIResultEvent a, UIResultEvent b) { + a.name.compareTo(b.name) + } + } + + public static final Comparator NAME_DESC = NAME_ASC.reversed() + + public static final Comparator SIZE_ASC = new Comparator() { + public int compare(UIResultEvent a, UIResultEvent b) { + Long.compare(a.size, b.size) + } + } + + public static final Comparator SIZE_DESC = SIZE_ASC.reversed() +} diff --git a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/ResultsModel.groovy b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/ResultsModel.groovy index d47d7d7a..9d267acf 100644 --- a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/ResultsModel.groovy +++ b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/ResultsModel.groovy @@ -16,7 +16,27 @@ class ResultsModel { ResultsModel(UIResultBatchEvent results) { this.results = results model = new TableModel("Name","Size","Hash","Sources","Comment","Certificates") - results.results.each { + updateModel() + } + + void sort(SortType type) { + Comparator chosen + switch(type) { + case SortType.NAME_ASC : chosen = ResultComparators.NAME_ASC; break + case SortType.NAME_DESC : chosen = ResultComparators.NAME_DESC; break + case SortType.SIZE_ASC : chosen = ResultComparators.SIZE_ASC; break + case SortType.SIZE_DESC : chosen = ResultComparators.SIZE_DESC; break + } + + Arrays.sort(results.results, chosen) + updateModel() + } + + private void updateModel() { + int rowCount = model.getRowCount() + rowCount.times { model.removeRow(0) } + + results.results.each { String size = DataHelper.formatSize2Decimal(it.size, false) + "B" String infoHash = Base64.encode(it.infohash.getRoot()) String sources = String.valueOf(it.sources.size()) diff --git a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/ResultsView.groovy b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/ResultsView.groovy index ceedbde9..143f703c 100644 --- a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/ResultsView.groovy +++ b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/ResultsView.groovy @@ -43,9 +43,14 @@ class ResultsView extends BasicWindow { table.setTableModel(model.model) table.setVisibleRows(terminalSize.getRows()) contentPanel.addComponent(table, GridLayout.createLayoutData(Alignment.CENTER, Alignment.CENTER, true, false)) - + + Panel buttonsPanel = new Panel() + buttonsPanel.setLayoutManager(new GridLayout(2)) + Button sortButton = new Button("Sort...",{sort()}) + buttonsPanel.addComponent(sortButton) Button closeButton = new Button("Close", {close()}) - contentPanel.addComponent(closeButton, GridLayout.createLayoutData(Alignment.CENTER, Alignment.CENTER, true, false)) + buttonsPanel.addComponent(closeButton) + contentPanel.addComponent(buttonsPanel, GridLayout.createLayoutData(Alignment.CENTER, Alignment.CENTER, true, false)) setComponent(contentPanel) closeButton.takeFocus() @@ -109,4 +114,11 @@ class ResultsView extends BasicWindow { ViewCertificatesView view = new ViewCertificatesView(model, textGUI, core, terminalSize) textGUI.addWindowAndWait(view) } + + private void sort() { + SortPrompt prompt = new SortPrompt(textGUI) + SortType type = prompt.prompt() + if (type != null) + model.sort(type) + } }