wip on grouping by file
This commit is contained in:
@@ -27,119 +27,109 @@ class SearchTabController {
|
|||||||
Core core
|
Core core
|
||||||
|
|
||||||
private def selectedResults() {
|
private def selectedResults() {
|
||||||
int[] rows = view.resultsTable.getSelectedRows()
|
if (model.groupedByFile) {
|
||||||
if (rows.length == 0)
|
return [view.getSelectedResult()]
|
||||||
return null
|
} else {
|
||||||
def sortEvt = view.lastSortEvent
|
int[] rows = view.resultsTable.getSelectedRows()
|
||||||
if (sortEvt != null) {
|
if (rows.length == 0)
|
||||||
for (int i = 0; i < rows.length; i++) {
|
return null
|
||||||
rows[i] = view.resultsTable.rowSorter.convertRowIndexToModel(rows[i])
|
def sortEvt = view.lastSortEvent
|
||||||
|
if (sortEvt != null) {
|
||||||
|
for (int i = 0; i < rows.length; i++) {
|
||||||
|
rows[i] = view.resultsTable.rowSorter.convertRowIndexToModel(rows[i])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
List<UIResultEvent> results = new ArrayList<>()
|
||||||
|
rows.each { results.add(model.results[it]) }
|
||||||
|
return results
|
||||||
}
|
}
|
||||||
List<UIResultEvent> results = new ArrayList<>()
|
}
|
||||||
rows.each { results.add(model.results[it]) }
|
|
||||||
results
|
@ControllerAction
|
||||||
|
void download() {
|
||||||
|
def results = selectedResults()
|
||||||
|
if (results == null)
|
||||||
|
return
|
||||||
|
|
||||||
|
results.removeAll {
|
||||||
|
!mvcGroup.parentGroup.model.canDownload(it.infohash)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ControllerAction
|
results.each { result ->
|
||||||
void download() {
|
def file = new File(application.context.get("muwire-settings").downloadLocation, result.name)
|
||||||
def results = selectedResults()
|
|
||||||
if (results == null)
|
|
||||||
return
|
|
||||||
|
|
||||||
results.removeAll {
|
def resultsBucket = model.hashBucket[result.infohash]
|
||||||
!mvcGroup.parentGroup.model.canDownload(it.infohash)
|
def sources = model.sourcesBucket[result.infohash]
|
||||||
}
|
|
||||||
|
|
||||||
results.each { result ->
|
core.eventBus.publish(new UIDownloadEvent(result : resultsBucket, sources: sources,
|
||||||
def file = new File(application.context.get("muwire-settings").downloadLocation, result.name)
|
target : file, sequential : view.sequentialDownload()))
|
||||||
|
}
|
||||||
|
mvcGroup.parentGroup.view.showDownloadsWindow.call()
|
||||||
|
}
|
||||||
|
|
||||||
def resultsBucket = model.hashBucket[result.infohash]
|
@ControllerAction
|
||||||
def sources = model.sourcesBucket[result.infohash]
|
void trust() {
|
||||||
|
def sender = view.selectedSender()
|
||||||
|
if (sender == null)
|
||||||
|
return
|
||||||
|
String reason = JOptionPane.showInputDialog("Enter reason (optional)")
|
||||||
|
core.eventBus.publish( new TrustEvent(persona : sender, level : TrustLevel.TRUSTED, reason : reason))
|
||||||
|
}
|
||||||
|
|
||||||
core.eventBus.publish(new UIDownloadEvent(result : resultsBucket, sources: sources,
|
@ControllerAction
|
||||||
target : file, sequential : view.sequentialDownloadCheckbox.model.isSelected()))
|
void distrust() {
|
||||||
}
|
def sender = view.selectedSender()
|
||||||
mvcGroup.parentGroup.view.showDownloadsWindow.call()
|
if (sender == null)
|
||||||
}
|
return
|
||||||
|
String reason = JOptionPane.showInputDialog("Enter reason (optional)")
|
||||||
|
core.eventBus.publish( new TrustEvent(persona : sender, level : TrustLevel.DISTRUSTED, reason : reason))
|
||||||
|
}
|
||||||
|
|
||||||
@ControllerAction
|
@ControllerAction
|
||||||
void trust() {
|
void neutral() {
|
||||||
int row = view.selectedSenderRow()
|
def sender = view.selectedSender()
|
||||||
if (row < 0)
|
if (sender == null)
|
||||||
return
|
return
|
||||||
String reason = JOptionPane.showInputDialog("Enter reason (optional)")
|
core.eventBus.publish( new TrustEvent(persona : sender, level : TrustLevel.NEUTRAL))
|
||||||
def sender = model.senders[row]
|
}
|
||||||
core.eventBus.publish( new TrustEvent(persona : sender, level : TrustLevel.TRUSTED, reason : reason))
|
|
||||||
}
|
|
||||||
|
|
||||||
@ControllerAction
|
@ControllerAction
|
||||||
void distrust() {
|
void browse() {
|
||||||
int row = view.selectedSenderRow()
|
def sender = view.selectedSender()
|
||||||
if (row < 0)
|
if (sender == null)
|
||||||
return
|
return
|
||||||
String reason = JOptionPane.showInputDialog("Enter reason (optional)")
|
|
||||||
def sender = model.senders[row]
|
|
||||||
core.eventBus.publish( new TrustEvent(persona : sender, level : TrustLevel.DISTRUSTED, reason : reason))
|
|
||||||
}
|
|
||||||
|
|
||||||
@ControllerAction
|
String groupId = sender.getHumanReadableName()
|
||||||
void neutral() {
|
Map<String,Object> params = new HashMap<>()
|
||||||
int row = view.selectedSenderRow()
|
params['host'] = sender
|
||||||
if (row < 0)
|
params['core'] = core
|
||||||
return
|
|
||||||
def sender = model.senders[row]
|
mvcGroup.createMVCGroup("browse", groupId, params)
|
||||||
core.eventBus.publish( new TrustEvent(persona : sender, level : TrustLevel.NEUTRAL))
|
}
|
||||||
}
|
|
||||||
|
@ControllerAction
|
||||||
@ControllerAction
|
void showComment() {
|
||||||
void browse() {
|
UIResultEvent event = view.getSelectedResult()
|
||||||
int selectedSender = view.selectedSenderRow()
|
if (event == null || event.comment == null)
|
||||||
if (selectedSender < 0)
|
return
|
||||||
return
|
|
||||||
Persona sender = model.senders[selectedSender]
|
String groupId = Base64.encode(event.infohash.getRoot())
|
||||||
|
Map<String,Object> params = new HashMap<>()
|
||||||
String groupId = sender.getHumanReadableName()
|
params['text'] = event.comment
|
||||||
Map<String,Object> params = new HashMap<>()
|
params['name'] = event.name
|
||||||
params['host'] = sender
|
|
||||||
params['core'] = core
|
mvcGroup.createMVCGroup("show-comment", groupId, params)
|
||||||
|
}
|
||||||
mvcGroup.createMVCGroup("browse", groupId, params)
|
|
||||||
}
|
@ControllerAction
|
||||||
|
void viewCertificates() {
|
||||||
@ControllerAction
|
UIResultEvent event = view.getSelectedResult()
|
||||||
void showComment() {
|
if (event == null || event.certificates <= 0)
|
||||||
int[] selectedRows = view.resultsTable.getSelectedRows()
|
return
|
||||||
if (selectedRows.length != 1)
|
|
||||||
return
|
def params = [:]
|
||||||
if (view.lastSortEvent != null)
|
params['result'] = event
|
||||||
selectedRows[0] = view.resultsTable.rowSorter.convertRowIndexToModel(selectedRows[0])
|
params['core'] = core
|
||||||
UIResultEvent event = model.results[selectedRows[0]]
|
mvcGroup.createMVCGroup("fetch-certificates", params)
|
||||||
if (event.comment == null)
|
}
|
||||||
return
|
}
|
||||||
|
|
||||||
String groupId = Base64.encode(event.infohash.getRoot())
|
|
||||||
Map<String,Object> params = new HashMap<>()
|
|
||||||
params['text'] = event.comment
|
|
||||||
params['name'] = event.name
|
|
||||||
|
|
||||||
mvcGroup.createMVCGroup("show-comment", groupId, params)
|
|
||||||
}
|
|
||||||
|
|
||||||
@ControllerAction
|
|
||||||
void viewCertificates() {
|
|
||||||
int[] selectedRows = view.resultsTable.getSelectedRows()
|
|
||||||
if (selectedRows.length != 1)
|
|
||||||
return
|
|
||||||
if (view.lastSortEvent != null)
|
|
||||||
selectedRows[0] = view.resultsTable.rowSorter.convertRowIndexToModel(selectedRows[0])
|
|
||||||
UIResultEvent event = model.results[selectedRows[0]]
|
|
||||||
if (event.certificates <= 0)
|
|
||||||
return
|
|
||||||
|
|
||||||
def params = [:]
|
|
||||||
params['result'] = event
|
|
||||||
params['core'] = core
|
|
||||||
mvcGroup.createMVCGroup("fetch-certificates", params)
|
|
||||||
}
|
|
||||||
}
|
|
@@ -35,6 +35,9 @@ class SearchTabModel {
|
|||||||
def sourcesBucket = [:]
|
def sourcesBucket = [:]
|
||||||
def sendersBucket = new LinkedHashMap<>()
|
def sendersBucket = new LinkedHashMap<>()
|
||||||
|
|
||||||
|
def results2 = []
|
||||||
|
def senders2 = []
|
||||||
|
|
||||||
|
|
||||||
void mvcGroupInit(Map<String, String> args) {
|
void mvcGroupInit(Map<String, String> args) {
|
||||||
core = mvcGroup.parentGroup.model.core
|
core = mvcGroup.parentGroup.model.core
|
||||||
@@ -108,9 +111,14 @@ class SearchTabModel {
|
|||||||
|
|
||||||
bucket << it
|
bucket << it
|
||||||
senderBucket << it
|
senderBucket << it
|
||||||
|
|
||||||
|
results2.clear()
|
||||||
|
results2.addAll(hashBucket.keySet())
|
||||||
}
|
}
|
||||||
JTable table = builder.getVariable("senders-table")
|
JTable table = builder.getVariable("senders-table")
|
||||||
table.model.fireTableDataChanged()
|
table.model.fireTableDataChanged()
|
||||||
|
table = builder.getVariable("results-table2")
|
||||||
|
table.model.fireTableDataChanged()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -17,6 +17,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.InfoHash
|
||||||
import com.muwire.core.Persona
|
import com.muwire.core.Persona
|
||||||
import com.muwire.core.search.UIResultEvent
|
import com.muwire.core.search.UIResultEvent
|
||||||
import com.muwire.core.util.DataUtil
|
import com.muwire.core.util.DataUtil
|
||||||
@@ -42,19 +43,20 @@ class SearchTabView {
|
|||||||
def pane
|
def pane
|
||||||
def parent
|
def parent
|
||||||
def searchTerms
|
def searchTerms
|
||||||
def sendersTable
|
def sendersTable, sendersTable2
|
||||||
def lastSendersSortEvent
|
def lastSendersSortEvent
|
||||||
def resultsTable
|
def resultsTable, resultsTable2
|
||||||
def lastSortEvent
|
def lastSortEvent
|
||||||
|
def lastResults2SortEvent, lastSenders2SortEvent
|
||||||
def sequentialDownloadCheckbox
|
def sequentialDownloadCheckbox
|
||||||
def sequentialDownloadCheckbox2
|
def sequentialDownloadCheckbox2
|
||||||
|
|
||||||
void initUI() {
|
void initUI() {
|
||||||
int rowHeight = application.context.get("row-height")
|
int rowHeight = application.context.get("row-height")
|
||||||
builder.with {
|
builder.with {
|
||||||
def resultsTable
|
def resultsTable, resultsTable2
|
||||||
def sendersTable
|
def sendersTable, sendersTable2
|
||||||
def sequentialDownloadCheckbox
|
def sequentialDownloadCheckbox, sequentialDownloadCheckbox2
|
||||||
def pane = panel {
|
def pane = panel {
|
||||||
borderLayout()
|
borderLayout()
|
||||||
panel (id : "results-panel", constraints : BorderLayout.CENTER) {
|
panel (id : "results-panel", constraints : BorderLayout.CENTER) {
|
||||||
@@ -121,7 +123,37 @@ class SearchTabView {
|
|||||||
panel {
|
panel {
|
||||||
borderLayout()
|
borderLayout()
|
||||||
scrollPane(constraints : BorderLayout.CENTER) {
|
scrollPane(constraints : BorderLayout.CENTER) {
|
||||||
|
resultsTable2 = table(id : "results-table2", autoCreateRowSorter : true, rowHeight : rowHeight) {
|
||||||
|
tableModel(list : model.results2) {
|
||||||
|
closureColumn(header : "Name", preferredWidth : 350, type : String, read : {
|
||||||
|
model.hashBucket[it].first().name.replace('<', '_')
|
||||||
|
})
|
||||||
|
closureColumn(header : "Size", preferredWidth : 20, type : Long, read : {
|
||||||
|
model.hashBucket[it].first().size
|
||||||
|
})
|
||||||
|
closureColumn(header : "Direct Sources", preferredWidth : 20, type : Integer, read : {
|
||||||
|
model.hashBucket[it].size()
|
||||||
|
})
|
||||||
|
closureColumn(header : "Possible Sources", preferredWidth : 20, type : Integer , read : {
|
||||||
|
model.sourcesBucket[it].size()
|
||||||
|
})
|
||||||
|
closureColumn(header : "Comments", preferredWidth : 20, type : Integer, read : {
|
||||||
|
int count = 0
|
||||||
|
model.hashBucket[it].each {
|
||||||
|
if (it.comment != null)
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
count
|
||||||
|
})
|
||||||
|
closureColumn(header : "Certificates", preferredWidth : 20, type : Integer, read : {
|
||||||
|
int count = 0
|
||||||
|
model.hashBucket[it].each {
|
||||||
|
count += it.certificates
|
||||||
|
}
|
||||||
|
count
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
panel (constraints : BorderLayout.SOUTH) {
|
panel (constraints : BorderLayout.SOUTH) {
|
||||||
gridLayout(rows :1, cols : 3)
|
gridLayout(rows :1, cols : 3)
|
||||||
@@ -139,7 +171,16 @@ class SearchTabView {
|
|||||||
panel {
|
panel {
|
||||||
borderLayout()
|
borderLayout()
|
||||||
scrollPane(constraints : BorderLayout.CENTER) {
|
scrollPane(constraints : BorderLayout.CENTER) {
|
||||||
|
sendersTable2 = table(id : "senders-table2", autoCreateRowSorter : true, rowHeight : rowHeight) {
|
||||||
|
tableModel(list : model.senders2) {
|
||||||
|
closureColumn(header : "Sender", preferredWidth : 350, type : String, read : {it.sender.getHumanReadableName()})
|
||||||
|
closureColumn(header : "Browse", preferredWidth : 20, type : Boolean, read : {it.browse})
|
||||||
|
closureColumn(header : "Certificates", preferredWidth : 20, type: Integer, read : {it.certificates})
|
||||||
|
closureColumn(header : "Trust", preferredWidth : 50, type : String, read : {
|
||||||
|
model.core.trustService.getLevel(it.sender.destination).toString()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
panel (constraints : BorderLayout.SOUTH) {
|
panel (constraints : BorderLayout.SOUTH) {
|
||||||
gridLayout(rows : 1, cols : 2)
|
gridLayout(rows : 1, cols : 2)
|
||||||
@@ -172,7 +213,10 @@ class SearchTabView {
|
|||||||
|
|
||||||
this.resultsTable = resultsTable
|
this.resultsTable = resultsTable
|
||||||
this.sendersTable = sendersTable
|
this.sendersTable = sendersTable
|
||||||
|
this.resultsTable2 = resultsTable2
|
||||||
|
this.sendersTable2 = sendersTable2
|
||||||
this.sequentialDownloadCheckbox = sequentialDownloadCheckbox
|
this.sequentialDownloadCheckbox = sequentialDownloadCheckbox
|
||||||
|
this.sequentialDownloadCheckbox2 = sequentialDownloadCheckbox2
|
||||||
|
|
||||||
def selectionModel = resultsTable.getSelectionModel()
|
def selectionModel = resultsTable.getSelectionModel()
|
||||||
selectionModel.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION)
|
selectionModel.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION)
|
||||||
@@ -277,6 +321,50 @@ class SearchTabView {
|
|||||||
resultsTable.model.fireTableDataChanged()
|
resultsTable.model.fireTableDataChanged()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// results table 2
|
||||||
|
resultsTable2.setDefaultRenderer(Integer.class,centerRenderer)
|
||||||
|
resultsTable2.columnModel.getColumn(1).setCellRenderer(new SizeRenderer())
|
||||||
|
resultsTable2.rowSorter.addRowSorterListener({evt -> lastResults2SortEvent = evt})
|
||||||
|
resultsTable2.rowSorter.setSortsOnUpdates(true)
|
||||||
|
selectionModel = resultsTable2.getSelectionModel()
|
||||||
|
selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION)
|
||||||
|
selectionModel.addListSelectionListener({
|
||||||
|
UIResultEvent e = getSelectedResult()
|
||||||
|
if (e == null) {
|
||||||
|
model.trustButtonsEnabled = false
|
||||||
|
model.browseActionEnabled = false
|
||||||
|
model.viewCertificatesActionEnabled = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
model.downloadActionEnabled = true
|
||||||
|
def results = model.hashBucket[e.infohash]
|
||||||
|
model.senders2.clear()
|
||||||
|
model.senders2.addAll(results)
|
||||||
|
sendersTable2.model.fireTableDataChanged()
|
||||||
|
})
|
||||||
|
|
||||||
|
// TODO: add download right-click action
|
||||||
|
|
||||||
|
// senders table 2
|
||||||
|
sendersTable2.setDefaultRenderer(Integer.class, centerRenderer)
|
||||||
|
sendersTable2.rowSorter.addRowSorterListener({ evt -> lastSenders2SortEvent = evt})
|
||||||
|
sendersTable2.rowSorter.setSortsOnUpdates(true)
|
||||||
|
selectionModel = sendersTable2.getSelectionModel()
|
||||||
|
selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION)
|
||||||
|
selectionModel.addListSelectionListener({
|
||||||
|
int row = selectedSenderRow()
|
||||||
|
if (row < 0) {
|
||||||
|
model.browseActionEnabled = false
|
||||||
|
model.viewCertificatesActionEnabled = false
|
||||||
|
model.trustButtonsEnabled = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
model.browseActionEnabled = model.senders2[row].browse
|
||||||
|
model.trustButtonsEnabled = true
|
||||||
|
model.viewCertificatesActionEnabled = model.senders2[row].certificates > 0
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
showSenderGrouping.call()
|
showSenderGrouping.call()
|
||||||
}
|
}
|
||||||
@@ -325,14 +413,24 @@ class SearchTabView {
|
|||||||
menu.show(e.getComponent(), e.getX(), e.getY())
|
menu.show(e.getComponent(), e.getX(), e.getY())
|
||||||
}
|
}
|
||||||
|
|
||||||
private UIResultEvent getSelectedResult() {
|
UIResultEvent getSelectedResult() {
|
||||||
int[] selectedRows = resultsTable.getSelectedRows()
|
if (model.groupedByFile) {
|
||||||
if (selectedRows.length != 1)
|
int selectedRow = resultsTable2.getSelectedRow()
|
||||||
return null
|
if (selectedRow < 0)
|
||||||
int selected = selectedRows[0]
|
return null
|
||||||
if (lastSortEvent != null)
|
if (lastResults2SortEvent != null)
|
||||||
selected = resultsTable.rowSorter.convertRowIndexToModel(selected)
|
selectedRow = resultsTable2.rowSorter.convertRowIndexToModel(selectedRow)
|
||||||
model.results[selected]
|
InfoHash infohash = model.results2[selectedRow]
|
||||||
|
return model.hashBucket[infohash].first()
|
||||||
|
} else {
|
||||||
|
int[] selectedRows = resultsTable.getSelectedRows()
|
||||||
|
if (selectedRows.length != 1)
|
||||||
|
return null
|
||||||
|
int selected = selectedRows[0]
|
||||||
|
if (lastSortEvent != null)
|
||||||
|
selected = resultsTable.rowSorter.convertRowIndexToModel(selected)
|
||||||
|
return model.results[selected]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def copyHashToClipboard() {
|
def copyHashToClipboard() {
|
||||||
@@ -355,12 +453,31 @@ class SearchTabView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int selectedSenderRow() {
|
int selectedSenderRow() {
|
||||||
int row = sendersTable.getSelectedRow()
|
if (model.groupedByFile) {
|
||||||
|
int row = sendersTable2.getSelectedRow()
|
||||||
|
if (row < 0)
|
||||||
|
return row
|
||||||
|
if (lastSenders2SortEvent != null)
|
||||||
|
row = sendersTable2.rowSorter.convertRowIndexToModel(row)
|
||||||
|
return row
|
||||||
|
} else {
|
||||||
|
int row = sendersTable.getSelectedRow()
|
||||||
|
if (row < 0)
|
||||||
|
return -1
|
||||||
|
if (lastSendersSortEvent != null)
|
||||||
|
row = sendersTable.rowSorter.convertRowIndexToModel(row)
|
||||||
|
return row
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Persona selectedSender() {
|
||||||
|
int row = selectedSenderRow()
|
||||||
if (row < 0)
|
if (row < 0)
|
||||||
return -1
|
return null
|
||||||
if (lastSendersSortEvent != null)
|
if (model.groupedByFile)
|
||||||
row = sendersTable.rowSorter.convertRowIndexToModel(row)
|
return model.senders2[row].sender
|
||||||
row
|
else
|
||||||
|
return model.senders[row]
|
||||||
}
|
}
|
||||||
|
|
||||||
def showSenderGrouping = {
|
def showSenderGrouping = {
|
||||||
@@ -374,4 +491,11 @@ class SearchTabView {
|
|||||||
def cardsPanel = builder.getVariable("results-panel")
|
def cardsPanel = builder.getVariable("results-panel")
|
||||||
cardsPanel.getLayout().show(cardsPanel, "grouped-by-file")
|
cardsPanel.getLayout().show(cardsPanel, "grouped-by-file")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean sequentialDownload() {
|
||||||
|
if (model.groupedByFile)
|
||||||
|
return sequentialDownloadCheckbox2.model.isSelected()
|
||||||
|
else
|
||||||
|
return sequentialDownloadCheckbox.model.isSelected()
|
||||||
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user