wip on grouping by file

This commit is contained in:
Zlatin Balevsky
2019-11-08 17:33:41 +00:00
parent cc9b384907
commit db84d8e5bf
3 changed files with 247 additions and 125 deletions

View File

@@ -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)
}
}

View File

@@ -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()
} }
} }
} }

View File

@@ -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()
}
} }