diff --git a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/FilesModel.groovy b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/FilesModel.groovy index 3db8bf76..75d2e1ac 100644 --- a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/FilesModel.groovy +++ b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/FilesModel.groovy @@ -78,4 +78,32 @@ class FilesModel { model.addRow(new SharedFileWrapper(it), DataHelper.formatSize2(size, false)+"B", comment, certified, hits, downloaders) } } + + private void sort(SortType type) { + Comparator chosen + switch(type) { + case SortType.NAME_ASC : chosen = NAME_ASC; break + case SortType.NAME_DESC : chosen = NAME_DESC; break + case SortType.SIZE_ASC : chosen = SIZE_ASC; break + case SortType.SIZE_DESC : chosen = SIZE_DESC; break + } + + Collections.sort(sharedFiles, chosen) + } + + private static final Comparator NAME_ASC = new Comparator() { + public int compare(SharedFile a, SharedFile b) { + a.getFile().getName().compareTo(b.getFile().getName()) + } + } + + private static final Comparator NAME_DESC = NAME_ASC.reversed() + + private static final Comparator SIZE_ASC = new Comparator() { + public int compare(SharedFile a, SharedFile b) { + Long.compare(a.getCachedLength(), b.getCachedLength()) + } + } + + private static final Comparator SIZE_DESC = SIZE_ASC.reversed() } diff --git a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/FilesView.groovy b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/FilesView.groovy index ff60c777..f7cf6e78 100644 --- a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/FilesView.groovy +++ b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/FilesView.groovy @@ -51,17 +51,19 @@ class FilesView extends BasicWindow { contentPanel.addComponent(table, layoutData) Panel buttonsPanel = new Panel() - buttonsPanel.setLayoutManager(new GridLayout(4)) + buttonsPanel.setLayoutManager(new GridLayout(5)) Button shareFile = new Button("Share File", {shareFile()}) Button shareDirectory = new Button("Share Directory", {shareDirectory()}) Button unshareDirectory = new Button("Unshare Directory",{unshareDirectory()}) + Button sort = new Button("Sort...",{sort()}) Button close = new Button("Close", {close()}) buttonsPanel.with { addComponent(shareFile, layoutData) addComponent(shareDirectory, layoutData) addComponent(unshareDirectory, layoutData) + addComponent(sort, layoutData) addComponent(close, layoutData) } @@ -134,4 +136,11 @@ class FilesView extends BasicWindow { core.eventBus.publish(new DirectoryUnsharedEvent(directory : directory)) MessageDialog.showMessageDialog(textGUI, "Directory Unshared", directory.getName()+" has been unshared", MessageDialogButton.OK) } + + private void sort() { + SortPrompt prompt = new SortPrompt(textGUI) + SortType type = prompt.prompt() + if (type != null) + model.sort(type) + } } diff --git a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/SortPrompt.groovy b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/SortPrompt.groovy new file mode 100644 index 00000000..4d75a774 --- /dev/null +++ b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/SortPrompt.groovy @@ -0,0 +1,57 @@ +package com.muwire.clilanterna + +import com.googlecode.lanterna.gui2.BasicWindow +import com.googlecode.lanterna.gui2.Button +import com.googlecode.lanterna.gui2.GridLayout +import com.googlecode.lanterna.gui2.GridLayout.Alignment +import com.googlecode.lanterna.gui2.LayoutData +import com.googlecode.lanterna.gui2.Panel +import com.googlecode.lanterna.gui2.TextGUI +import com.googlecode.lanterna.gui2.Window + +class SortPrompt extends BasicWindow { + private final TextGUI textGUI + private SortType type + SortPrompt(TextGUI textGUI) { + super("Select what to sort by") + this.textGUI = textGUI + } + + SortType prompt() { + setHints([Window.Hint.CENTERED]) + Panel contentPanel = new Panel() + contentPanel.setLayoutManager(new GridLayout(5)) + + LayoutData layoutData = GridLayout.createLayoutData(Alignment.CENTER, Alignment.CENTER) + + Button nameAsc = new Button("Name (ascending)",{ + type = SortType.NAME_ASC + close() + }) + Button nameDesc = new Button("Name (descending)",{ + type = SortType.NAME_DESC + close() + }) + Button sizeAsc = new Button("Size (ascending)",{ + type = SortType.SIZE_ASC + close() + }) + Button sizeDesc = new Button("Size (descending)",{ + type = SortType.SIZE_DESC + close() + }) + Button close = new Button("Cancel",{close()}) + + contentPanel.with { + addComponent(nameAsc, layoutData) + addComponent(nameDesc, layoutData) + addComponent(sizeAsc, layoutData) + addComponent(sizeDesc, layoutData) + addComponent(close, layoutData) + } + + setComponent(contentPanel) + textGUI.addWindowAndWait(this) + type + } +} diff --git a/cli-lanterna/src/main/groovy/com/muwire/clilanterna/SortType.java b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/SortType.java new file mode 100644 index 00000000..40cb3eea --- /dev/null +++ b/cli-lanterna/src/main/groovy/com/muwire/clilanterna/SortType.java @@ -0,0 +1,5 @@ +package com.muwire.clilanterna; + +public enum SortType { + NAME_ASC,NAME_DESC,SIZE_ASC,SIZE_DESC +}