mirror of https://github.com/zlatinb/muwire
show results per sender
parent
fcde917d08
commit
3de2f872bb
|
@ -24,7 +24,7 @@ class SearchTabController {
|
||||||
private def selectedResult() {
|
private def selectedResult() {
|
||||||
int row = view.resultsTable.getSelectedRow()
|
int row = view.resultsTable.getSelectedRow()
|
||||||
if (row == -1)
|
if (row == -1)
|
||||||
return
|
return null
|
||||||
def sortEvt = view.lastSortEvent
|
def sortEvt = view.lastSortEvent
|
||||||
if (sortEvt != null) {
|
if (sortEvt != null) {
|
||||||
row = view.resultsTable.rowSorter.convertRowIndexToModel(row)
|
row = view.resultsTable.rowSorter.convertRowIndexToModel(row)
|
||||||
|
|
|
@ -5,6 +5,7 @@ import javax.inject.Inject
|
||||||
import javax.swing.JTable
|
import javax.swing.JTable
|
||||||
|
|
||||||
import com.muwire.core.Core
|
import com.muwire.core.Core
|
||||||
|
import com.muwire.core.Persona
|
||||||
import com.muwire.core.search.UIResultEvent
|
import com.muwire.core.search.UIResultEvent
|
||||||
|
|
||||||
import griffon.core.artifact.GriffonModel
|
import griffon.core.artifact.GriffonModel
|
||||||
|
@ -24,9 +25,11 @@ class SearchTabModel {
|
||||||
Core core
|
Core core
|
||||||
UISettings uiSettings
|
UISettings uiSettings
|
||||||
String uuid
|
String uuid
|
||||||
|
def senders = []
|
||||||
def results = []
|
def results = []
|
||||||
def hashBucket = [:]
|
def hashBucket = [:]
|
||||||
def sourcesBucket = [:]
|
def sourcesBucket = [:]
|
||||||
|
def sendersBucket = new LinkedHashMap<>()
|
||||||
|
|
||||||
|
|
||||||
void mvcGroupInit(Map<String, String> args) {
|
void mvcGroupInit(Map<String, String> args) {
|
||||||
|
@ -51,6 +54,15 @@ class SearchTabModel {
|
||||||
}
|
}
|
||||||
bucket << e
|
bucket << e
|
||||||
|
|
||||||
|
def senderBucket = sendersBucket.get(e.sender)
|
||||||
|
if (senderBucket == null) {
|
||||||
|
senderBucket = []
|
||||||
|
sendersBucket[e.sender] = senderBucket
|
||||||
|
senders.clear()
|
||||||
|
senders.addAll(sendersBucket.keySet())
|
||||||
|
}
|
||||||
|
senderBucket << e
|
||||||
|
|
||||||
Set sourceBucket = sourcesBucket.get(e.infohash)
|
Set sourceBucket = sourcesBucket.get(e.infohash)
|
||||||
if (sourceBucket == null) {
|
if (sourceBucket == null) {
|
||||||
sourceBucket = new HashSet()
|
sourceBucket = new HashSet()
|
||||||
|
@ -58,8 +70,7 @@ class SearchTabModel {
|
||||||
}
|
}
|
||||||
sourceBucket.addAll(e.sources)
|
sourceBucket.addAll(e.sources)
|
||||||
|
|
||||||
results << e
|
JTable table = builder.getVariable("senders-table")
|
||||||
JTable table = builder.getVariable("results-table")
|
|
||||||
table.model.fireTableDataChanged()
|
table.model.fireTableDataChanged()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -76,6 +87,14 @@ class SearchTabModel {
|
||||||
hashBucket[it.infohash] = bucket
|
hashBucket[it.infohash] = bucket
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def senderBucket = sendersBucket.get(it.sender)
|
||||||
|
if (senderBucket == null) {
|
||||||
|
senderBucket = []
|
||||||
|
sendersBucket[it.sender] = senderBucket
|
||||||
|
senders.clear()
|
||||||
|
senders.addAll(sendersBucket.keySet())
|
||||||
|
}
|
||||||
|
|
||||||
Set sourceBucket = sourcesBucket.get(it.infohash)
|
Set sourceBucket = sourcesBucket.get(it.infohash)
|
||||||
if (sourceBucket == null) {
|
if (sourceBucket == null) {
|
||||||
sourceBucket = new HashSet()
|
sourceBucket = new HashSet()
|
||||||
|
@ -84,9 +103,9 @@ class SearchTabModel {
|
||||||
sourceBucket.addAll(it.sources)
|
sourceBucket.addAll(it.sources)
|
||||||
|
|
||||||
bucket << it
|
bucket << it
|
||||||
results << it
|
senderBucket << it
|
||||||
}
|
}
|
||||||
JTable table = builder.getVariable("results-table")
|
JTable table = builder.getVariable("senders-table")
|
||||||
table.model.fireTableDataChanged()
|
table.model.fireTableDataChanged()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@ import javax.swing.ListSelectionModel
|
||||||
import javax.swing.SwingConstants
|
import javax.swing.SwingConstants
|
||||||
import javax.swing.table.DefaultTableCellRenderer
|
import javax.swing.table.DefaultTableCellRenderer
|
||||||
|
|
||||||
|
import com.muwire.core.Persona
|
||||||
import com.muwire.core.util.DataUtil
|
import com.muwire.core.util.DataUtil
|
||||||
|
|
||||||
import java.awt.BorderLayout
|
import java.awt.BorderLayout
|
||||||
|
@ -37,32 +38,50 @@ class SearchTabView {
|
||||||
def pane
|
def pane
|
||||||
def parent
|
def parent
|
||||||
def searchTerms
|
def searchTerms
|
||||||
|
def sendersTable
|
||||||
|
def lastSendersSortEvent
|
||||||
def resultsTable
|
def resultsTable
|
||||||
def lastSortEvent
|
def lastSortEvent
|
||||||
|
|
||||||
void initUI() {
|
void initUI() {
|
||||||
builder.with {
|
builder.with {
|
||||||
def resultsTable
|
def resultsTable
|
||||||
|
def sendersTable
|
||||||
def pane = panel {
|
def pane = panel {
|
||||||
borderLayout()
|
gridLayout(rows : 2, cols: 1)
|
||||||
scrollPane (constraints : BorderLayout.CENTER) {
|
panel {
|
||||||
resultsTable = table(id : "results-table", autoCreateRowSorter : true) {
|
borderLayout()
|
||||||
tableModel(list: model.results) {
|
scrollPane (constraints : BorderLayout.CENTER) {
|
||||||
closureColumn(header: "Name", preferredWidth: 350, type: String, read : {row -> row.name.replace('<','_')})
|
sendersTable = table(id : "senders-table", autoCreateRowSorter : true) {
|
||||||
closureColumn(header: "Size", preferredWidth: 20, type: Long, read : {row -> row.size})
|
tableModel(list : model.senders) {
|
||||||
closureColumn(header: "Direct Sources", preferredWidth: 50, type : Integer, read : { row -> model.hashBucket[row.infohash].size()})
|
closureColumn(header : "Sender", type: String, read : {row -> row.getHumanReadableName()})
|
||||||
closureColumn(header: "Possible Sources", preferredWidth : 50, type : Integer, read : {row -> model.sourcesBucket[row.infohash].size()})
|
closureColumn(header : "Results", type: Integer, read : {row -> model.sendersBucket[row].size()})
|
||||||
closureColumn(header: "Sender", preferredWidth: 170, type: String, read : {row -> row.sender.getHumanReadableName()})
|
closureColumn(header : "Trust", type: String, read : { row ->
|
||||||
closureColumn(header: "Trust", preferredWidth: 50, type: String, read : {row ->
|
model.core.trustService.getLevel(row.destination).toString()
|
||||||
model.core.trustService.getLevel(row.sender.destination).toString()
|
})
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
panel(constraints : BorderLayout.SOUTH) {
|
||||||
|
button(text : "Trust", enabled: bind {model.trustButtonsEnabled }, trustAction)
|
||||||
|
button(text : "Distrust", enabled : bind {model.trustButtonsEnabled}, distrustAction)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
panel(constraints : BorderLayout.SOUTH) {
|
panel {
|
||||||
button(text : "Download", enabled : bind {model.downloadActionEnabled}, downloadAction)
|
borderLayout()
|
||||||
button(text : "Trust", enabled: bind {model.trustButtonsEnabled }, trustAction)
|
scrollPane (constraints : BorderLayout.CENTER) {
|
||||||
button(text : "Distrust", enabled : bind {model.trustButtonsEnabled}, distrustAction)
|
resultsTable = table(id : "results-table", autoCreateRowSorter : true) {
|
||||||
|
tableModel(list: model.results) {
|
||||||
|
closureColumn(header: "Name", preferredWidth: 350, type: String, read : {row -> row.name.replace('<','_')})
|
||||||
|
closureColumn(header: "Size", preferredWidth: 20, type: Long, read : {row -> row.size})
|
||||||
|
closureColumn(header: "Direct Sources", preferredWidth: 50, type : Integer, read : { row -> model.hashBucket[row.infohash].size()})
|
||||||
|
closureColumn(header: "Possible Sources", preferredWidth : 50, type : Integer, read : {row -> model.sourcesBucket[row.infohash].size()})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
panel(constraints : BorderLayout.SOUTH) {
|
||||||
|
button(text : "Download", enabled : bind {model.downloadActionEnabled}, downloadAction)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,6 +90,7 @@ class SearchTabView {
|
||||||
this.pane.putClientProperty("results-table",resultsTable)
|
this.pane.putClientProperty("results-table",resultsTable)
|
||||||
|
|
||||||
this.resultsTable = resultsTable
|
this.resultsTable = resultsTable
|
||||||
|
this.sendersTable = sendersTable
|
||||||
|
|
||||||
def selectionModel = resultsTable.getSelectionModel()
|
def selectionModel = resultsTable.getSelectionModel()
|
||||||
selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION)
|
selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION)
|
||||||
|
@ -109,9 +129,7 @@ class SearchTabView {
|
||||||
|
|
||||||
def centerRenderer = new DefaultTableCellRenderer()
|
def centerRenderer = new DefaultTableCellRenderer()
|
||||||
centerRenderer.setHorizontalAlignment(JLabel.CENTER)
|
centerRenderer.setHorizontalAlignment(JLabel.CENTER)
|
||||||
resultsTable.columnModel.getColumn(1).setCellRenderer(centerRenderer)
|
|
||||||
resultsTable.setDefaultRenderer(Integer.class,centerRenderer)
|
resultsTable.setDefaultRenderer(Integer.class,centerRenderer)
|
||||||
resultsTable.columnModel.getColumn(4).setCellRenderer(centerRenderer)
|
|
||||||
|
|
||||||
resultsTable.columnModel.getColumn(1).setCellRenderer(new SizeRenderer())
|
resultsTable.columnModel.getColumn(1).setCellRenderer(new SizeRenderer())
|
||||||
|
|
||||||
|
@ -134,6 +152,27 @@ class SearchTabView {
|
||||||
showPopupMenu(e)
|
showPopupMenu(e)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// senders table
|
||||||
|
sendersTable.setDefaultRenderer(Integer.class, centerRenderer)
|
||||||
|
sendersTable.rowSorter.addRowSorterListener({evt -> lastSendersSortEvent = evt})
|
||||||
|
sendersTable.rowSorter.setSortsOnUpdates(true)
|
||||||
|
def selectionModel = sendersTable.getSelectionModel()
|
||||||
|
selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION)
|
||||||
|
selectionModel.addListSelectionListener({
|
||||||
|
int row = selectedSenderRow()
|
||||||
|
if (row < 0) {
|
||||||
|
model.trustButtonsEnabled = false
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
model.trustButtonsEnabled = true
|
||||||
|
model.results.clear()
|
||||||
|
Persona p = model.senders[row]
|
||||||
|
model.results.addAll(model.sendersBucket[p])
|
||||||
|
resultsTable.model.fireTableDataChanged()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def closeTab = {
|
def closeTab = {
|
||||||
|
@ -168,4 +207,13 @@ class SearchTabView {
|
||||||
def clipboard = Toolkit.getDefaultToolkit().getSystemClipboard()
|
def clipboard = Toolkit.getDefaultToolkit().getSystemClipboard()
|
||||||
clipboard.setContents(selection, null)
|
clipboard.setContents(selection, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int selectedSenderRow() {
|
||||||
|
int row = sendersTable.getSelectedRow()
|
||||||
|
if (row < 0)
|
||||||
|
return -1
|
||||||
|
if (lastSendersSortEvent != null)
|
||||||
|
row = sendersTable.rowSorter.convertRowIndexToModel(row)
|
||||||
|
row
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue