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,6 +27,9 @@ class SearchTabController {
Core core Core core
private def selectedResults() { private def selectedResults() {
if (model.groupedByFile) {
return [view.getSelectedResult()]
} else {
int[] rows = view.resultsTable.getSelectedRows() int[] rows = view.resultsTable.getSelectedRows()
if (rows.length == 0) if (rows.length == 0)
return null return null
@@ -38,7 +41,8 @@ class SearchTabController {
} }
List<UIResultEvent> results = new ArrayList<>() List<UIResultEvent> results = new ArrayList<>()
rows.each { results.add(model.results[it]) } rows.each { results.add(model.results[it]) }
results return results
}
} }
@ControllerAction @ControllerAction
@@ -58,46 +62,42 @@ class SearchTabController {
def sources = model.sourcesBucket[result.infohash] def sources = model.sourcesBucket[result.infohash]
core.eventBus.publish(new UIDownloadEvent(result : resultsBucket, sources: sources, core.eventBus.publish(new UIDownloadEvent(result : resultsBucket, sources: sources,
target : file, sequential : view.sequentialDownloadCheckbox.model.isSelected())) target : file, sequential : view.sequentialDownload()))
} }
mvcGroup.parentGroup.view.showDownloadsWindow.call() mvcGroup.parentGroup.view.showDownloadsWindow.call()
} }
@ControllerAction @ControllerAction
void trust() { void trust() {
int row = view.selectedSenderRow() def sender = view.selectedSender()
if (row < 0) if (sender == null)
return return
String reason = JOptionPane.showInputDialog("Enter reason (optional)") String reason = JOptionPane.showInputDialog("Enter reason (optional)")
def sender = model.senders[row]
core.eventBus.publish( new TrustEvent(persona : sender, level : TrustLevel.TRUSTED, reason : reason)) core.eventBus.publish( new TrustEvent(persona : sender, level : TrustLevel.TRUSTED, reason : reason))
} }
@ControllerAction @ControllerAction
void distrust() { void distrust() {
int row = view.selectedSenderRow() def sender = view.selectedSender()
if (row < 0) if (sender == null)
return return
String reason = JOptionPane.showInputDialog("Enter reason (optional)") String reason = JOptionPane.showInputDialog("Enter reason (optional)")
def sender = model.senders[row]
core.eventBus.publish( new TrustEvent(persona : sender, level : TrustLevel.DISTRUSTED, reason : reason)) core.eventBus.publish( new TrustEvent(persona : sender, level : TrustLevel.DISTRUSTED, reason : reason))
} }
@ControllerAction @ControllerAction
void neutral() { void neutral() {
int row = view.selectedSenderRow() def sender = view.selectedSender()
if (row < 0) if (sender == null)
return return
def sender = model.senders[row]
core.eventBus.publish( new TrustEvent(persona : sender, level : TrustLevel.NEUTRAL)) core.eventBus.publish( new TrustEvent(persona : sender, level : TrustLevel.NEUTRAL))
} }
@ControllerAction @ControllerAction
void browse() { void browse() {
int selectedSender = view.selectedSenderRow() def sender = view.selectedSender()
if (selectedSender < 0) if (sender == null)
return return
Persona sender = model.senders[selectedSender]
String groupId = sender.getHumanReadableName() String groupId = sender.getHumanReadableName()
Map<String,Object> params = new HashMap<>() Map<String,Object> params = new HashMap<>()
@@ -109,13 +109,8 @@ class SearchTabController {
@ControllerAction @ControllerAction
void showComment() { void showComment() {
int[] selectedRows = view.resultsTable.getSelectedRows() UIResultEvent event = view.getSelectedResult()
if (selectedRows.length != 1) if (event == null || event.comment == null)
return
if (view.lastSortEvent != null)
selectedRows[0] = view.resultsTable.rowSorter.convertRowIndexToModel(selectedRows[0])
UIResultEvent event = model.results[selectedRows[0]]
if (event.comment == null)
return return
String groupId = Base64.encode(event.infohash.getRoot()) String groupId = Base64.encode(event.infohash.getRoot())
@@ -128,13 +123,8 @@ class SearchTabController {
@ControllerAction @ControllerAction
void viewCertificates() { void viewCertificates() {
int[] selectedRows = view.resultsTable.getSelectedRows() UIResultEvent event = view.getSelectedResult()
if (selectedRows.length != 1) if (event == null || event.certificates <= 0)
return
if (view.lastSortEvent != null)
selectedRows[0] = view.resultsTable.rowSorter.convertRowIndexToModel(selectedRows[0])
UIResultEvent event = model.results[selectedRows[0]]
if (event.certificates <= 0)
return return
def params = [:] def 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)
@@ -278,6 +322,50 @@ class SearchTabView {
} }
}) })
// 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() {
if (model.groupedByFile) {
int selectedRow = resultsTable2.getSelectedRow()
if (selectedRow < 0)
return null
if (lastResults2SortEvent != null)
selectedRow = resultsTable2.rowSorter.convertRowIndexToModel(selectedRow)
InfoHash infohash = model.results2[selectedRow]
return model.hashBucket[infohash].first()
} else {
int[] selectedRows = resultsTable.getSelectedRows() int[] selectedRows = resultsTable.getSelectedRows()
if (selectedRows.length != 1) if (selectedRows.length != 1)
return null return null
int selected = selectedRows[0] int selected = selectedRows[0]
if (lastSortEvent != null) if (lastSortEvent != null)
selected = resultsTable.rowSorter.convertRowIndexToModel(selected) selected = resultsTable.rowSorter.convertRowIndexToModel(selected)
model.results[selected] return model.results[selected]
}
} }
def copyHashToClipboard() { def copyHashToClipboard() {
@@ -355,12 +453,31 @@ class SearchTabView {
} }
int selectedSenderRow() { int selectedSenderRow() {
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() int row = sendersTable.getSelectedRow()
if (row < 0) if (row < 0)
return -1 return -1
if (lastSendersSortEvent != null) if (lastSendersSortEvent != null)
row = sendersTable.rowSorter.convertRowIndexToModel(row) row = sendersTable.rowSorter.convertRowIndexToModel(row)
row return row
}
}
Persona selectedSender() {
int row = selectedSenderRow()
if (row < 0)
return null
if (model.groupedByFile)
return model.senders2[row].sender
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()
}
} }