diff --git a/gui/griffon-app/views/com/muwire/gui/CertificateControlView.groovy b/gui/griffon-app/views/com/muwire/gui/CertificateControlView.groovy index c7f2e7c7..a34fa9f4 100644 --- a/gui/griffon-app/views/com/muwire/gui/CertificateControlView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/CertificateControlView.groovy @@ -56,7 +56,7 @@ class CertificateControlView { scrollPane { usersTable = table(autoCreateRowSorter : true, rowHeight : rowHeight) { tableModel(list : model.users) { - closureColumn(header : trans("ISSUER"), type : String, read : {it.getHumanReadableName()}) + closureColumn(header : trans("ISSUER"), type : Persona, read : {it}) } } } @@ -79,6 +79,8 @@ class CertificateControlView { } void mvcGroupInit(Map args) { + usersTable.setDefaultRenderer(Persona.class, new PersonaCellRenderer()) + usersTable.rowSorter.setComparator(0, new PersonaComparator()) usersTable.rowSorter.addRowSorterListener({evt -> lastUsersSortEvent = evt}) def selectionModel = usersTable.getSelectionModel() selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION) diff --git a/gui/griffon-app/views/com/muwire/gui/ChatRoomView.groovy b/gui/griffon-app/views/com/muwire/gui/ChatRoomView.groovy index 2e0c1ad1..24514a5e 100644 --- a/gui/griffon-app/views/com/muwire/gui/ChatRoomView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/ChatRoomView.groovy @@ -77,7 +77,7 @@ class ChatRoomView { scrollPane { membersTable = table(autoCreateRowSorter : true, rowHeight : rowHeight) { tableModel(list : model.members) { - closureColumn(header : trans("NAME"), preferredWidth: 100, type: String, read : {it.getHumanReadableName()}) + closureColumn(header : trans("NAME"), preferredWidth: 100, type: Persona, read : {it}) closureColumn(header : trans("TRUST_STATUS"), preferredWidth: 30, type : String, read : {trans(model.core.trustService.getLevel(it.destination).name())}) } } @@ -124,6 +124,8 @@ class ChatRoomView { if (membersTable != null) { + membersTable.setDefaultRenderer(Persona.class, new PersonaCellRenderer()) + membersTable.rowSorter.setComparator(0, new PersonaComparator()) membersTable.rowSorter.addRowSorterListener({evt -> lastMembersTableSortEvent = evt}) membersTable.rowSorter.setSortsOnUpdates(true) membersTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION) diff --git a/gui/griffon-app/views/com/muwire/gui/CollectionTabView.groovy b/gui/griffon-app/views/com/muwire/gui/CollectionTabView.groovy index e5056003..38f6405a 100644 --- a/gui/griffon-app/views/com/muwire/gui/CollectionTabView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/CollectionTabView.groovy @@ -1,5 +1,7 @@ package com.muwire.gui +import com.muwire.core.Persona + import javax.swing.AbstractAction import javax.swing.Action import javax.swing.JComponent @@ -76,7 +78,7 @@ class CollectionTabView { collectionsTable = table(id: "collections-table", autoCreateRowSorter : true, rowHeight : rowHeight) { tableModel(list : model.collections) { closureColumn(header: trans("NAME"), preferredWidth: 200, type : String, read : {HTMLSanitizer.sanitize(it.name)}) - closureColumn(header: trans("AUTHOR"), preferredWidth: 200, type : String, read : {it.author.getHumanReadableName()}) + closureColumn(header: trans("AUTHOR"), preferredWidth: 200, type : Persona, read : {it.author}) closureColumn(header: trans("COLLECTION_TOTAL_FILES"), preferredWidth: 20, type: Integer, read : {it.numFiles()}) closureColumn(header: trans("COLLECTION_TOTAL_SIZE"), preferredWidth: 20, type: Long, read : {it.totalSize()}) closureColumn(header: trans("COMMENT"), preferredWidth: 20, type: Boolean, read: {it.comment != ""}) @@ -224,10 +226,12 @@ class CollectionTabView { def centerRenderer = new DefaultTableCellRenderer() centerRenderer.setHorizontalAlignment(JLabel.CENTER) collectionsTable.setDefaultRenderer(Integer.class, centerRenderer) + collectionsTable.setDefaultRenderer(Persona.class, new PersonaCellRenderer()) collectionsTable.columnModel.getColumn(3).setCellRenderer(new SizeRenderer()) collectionsTable.columnModel.getColumn(5).setCellRenderer(new DateRenderer()) + collectionsTable.rowSorter.setComparator(1, new PersonaComparator()) collectionsTable.rowSorter.addRowSorterListener({evt -> lastCollectionsTableSortEvent = evt}) collectionsTable.rowSorter.setSortsOnUpdates(true) diff --git a/gui/griffon-app/views/com/muwire/gui/CollectionsToolView.groovy b/gui/griffon-app/views/com/muwire/gui/CollectionsToolView.groovy index d4d2ec13..7c22b721 100644 --- a/gui/griffon-app/views/com/muwire/gui/CollectionsToolView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/CollectionsToolView.groovy @@ -1,5 +1,7 @@ package com.muwire.gui +import com.muwire.core.Persona + import static com.muwire.gui.Translator.trans import java.awt.BorderLayout @@ -56,7 +58,7 @@ class CollectionsToolView { scrollPane(constraints : BorderLayout.CENTER) { hitsTable = table(autoCreateRowSorter : true, rowHeight : rowHeight) { tableModel(list : model.hits) { - closureColumn(header : trans("SEARCHER"), preferredWidth : 100, type : String, read : {it.searcher.getHumanReadableName()}) + closureColumn(header : trans("SEARCHER"), preferredWidth : 100, type : Persona, read : {it.searcher}) closureColumn(header : trans("TIMESTAMP"), preferredWidth : 100, type : Long, read : {it.timestamp}) } } @@ -70,6 +72,8 @@ class CollectionsToolView { void mvcGroupInit(Map args) { // hits table hitsTable.setDefaultRenderer(Long.class, new DateRenderer()) + hitsTable.setDefaultRenderer(Persona.class, new PersonaCellRenderer()) + hitsTable.rowSorter.setComparator(0, new PersonaComparator()) dialog.getContentPane().add(mainPanel) dialog.pack() diff --git a/gui/griffon-app/views/com/muwire/gui/ContentPanelView.groovy b/gui/griffon-app/views/com/muwire/gui/ContentPanelView.groovy index 714339f0..065b3990 100644 --- a/gui/griffon-app/views/com/muwire/gui/ContentPanelView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/ContentPanelView.groovy @@ -1,5 +1,6 @@ package com.muwire.gui +import com.muwire.core.Persona import griffon.core.artifact.GriffonView import static com.muwire.gui.Translator.trans import griffon.inject.MVCMember @@ -71,7 +72,7 @@ class ContentPanelView { scrollPane(constraints : BorderLayout.CENTER) { hitsTable = table(id : "hits-table", autoCreateRowSorter : true, rowHeight : rowHeight) { tableModel(list : model.hits) { - closureColumn(header : trans("SEARCHER"), type : String, read : {row -> row.persona.getHumanReadableName()}) + closureColumn(header : trans("SEARCHER"), type : Persona, read : { row -> row.persona}) closureColumn(header : trans("KEYWORDS"), type : String, read : {row -> HTMLSanitizer.sanitize(row.keywords.join(" "))}) closureColumn(header : trans("DATE"), type : String, read : {row -> String.valueOf(new Date(row.timestamp))}) } @@ -128,7 +129,9 @@ class ContentPanelView { } } }) - + + hitsTable.setDefaultRenderer(Persona.class, new PersonaCellRenderer()) + hitsTable.rowSorter.setComparator(0, new PersonaComparator()) hitsTable.rowSorter.addRowSorterListener({evt -> lastHitsSortEvent = evt}) hitsTable.rowSorter.setSortsOnUpdates(true) selectionModel = hitsTable.getSelectionModel() diff --git a/gui/griffon-app/views/com/muwire/gui/FetchCertificatesView.groovy b/gui/griffon-app/views/com/muwire/gui/FetchCertificatesView.groovy index b46f0a60..ae63ffcb 100644 --- a/gui/griffon-app/views/com/muwire/gui/FetchCertificatesView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/FetchCertificatesView.groovy @@ -1,5 +1,6 @@ package com.muwire.gui +import com.muwire.core.Persona import griffon.core.artifact.GriffonView import static com.muwire.gui.Translator.trans import griffon.inject.MVCMember @@ -52,7 +53,7 @@ class FetchCertificatesView { scrollPane(constraints : BorderLayout.CENTER) { certsTable = table(autoCreateRowSorter : true, rowHeight : rowHeight) { tableModel(list : model.certificates) { - closureColumn(header : trans("ISSUER"), preferredWidth : 200, type : String, read : {it.issuer.getHumanReadableName()}) + closureColumn(header : trans("ISSUER"), preferredWidth : 200, type : Persona, read : {it.issuer}) closureColumn(header : trans("TRUST_STATUS"), preferredWidth: 50, type : String, read : {trans(controller.core.trustService.getLevel(it.issuer.destination).name())}) closureColumn(header : trans("NAME"), preferredWidth : 200, type: String, read : {HTMLSanitizer.sanitize(it.name.name.toString())}) closureColumn(header : trans("ISSUED"), preferredWidth : 100, type : String, read : { @@ -70,6 +71,8 @@ class FetchCertificatesView { } } + certsTable.setDefaultRenderer(Persona.class, new PersonaCellRenderer()) + certsTable.rowSorter.setComparator(0, new PersonaComparator()) certsTable.rowSorter.addRowSorterListener({evt -> lastSortEvent = evt}) certsTable.rowSorter.setSortsOnUpdates(true) diff --git a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy index 51a995bf..7d50094d 100644 --- a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy @@ -1,5 +1,6 @@ package com.muwire.gui +import com.muwire.core.Persona import com.muwire.core.messenger.MWMessage import com.muwire.core.messenger.Messenger import com.muwire.core.messenger.UIMessageMovedEvent @@ -435,8 +436,8 @@ class MainFrameView { int percent = row.uploader.getProgress() trans("PERCENT_OF_PIECE", percent) }) - closureColumn(header : trans("DOWNLOADER"), type : String, read : { row -> - row.uploader.getDownloader() + closureColumn(header : trans("DOWNLOADER"), type : Persona, read : { row -> + row.uploader.getDownloaderPersona() }) closureColumn(header : trans("REMOTE_PIECES"), type : String, read : { row -> int pieces = row.uploader.getTotalPieces() @@ -478,7 +479,7 @@ class MainFrameView { dragEnabled : true, transferHandler : collectionsTransferHandler) { tableModel(list : model.localCollections) { closureColumn(header : trans("NAME"), preferredWidth : 100, type : String, read : {HTMLSanitizer.sanitize(it.name)}) - closureColumn(header : trans("AUTHOR"), preferredWidth : 100, type : String, read : {it.author.getHumanReadableName()}) + closureColumn(header : trans("AUTHOR"), preferredWidth : 100, type : Persona, read : {it.author}) closureColumn(header : trans("FILES"), preferredWidth: 10, type : Integer, read : {it.numFiles()}) closureColumn(header : trans("SIZE"), preferredWidth : 10, type : Long, read : {it.totalSize()}) closureColumn(header : trans("COMMENT"), preferredWidth : 10, type : Boolean, read : {it.comment != ""}) @@ -556,12 +557,8 @@ class MainFrameView { closureColumn(header : trans("KEYWORDS"), type : String, read : { HTMLSanitizer.sanitize(it.search) }) - closureColumn(header : trans("FROM"), type : String, read : { - if (it.originator != null) { - return it.originator.getHumanReadableName() - } else { - return it.replyTo.toBase32() - } + closureColumn(header : trans("FROM"), type : Persona, read : { + it.originator }) closureColumn(header : trans("COUNT"), type : String, read : { it.count.toString() @@ -586,7 +583,7 @@ class MainFrameView { scrollPane(constraints : BorderLayout.CENTER) { table(id : "feeds-table", autoCreateRowSorter : true, rowHeight : rowHeight) { tableModel(list : model.feeds) { - closureColumn(header : trans("PUBLISHER"), preferredWidth: 350, type : String, read : {it.getPublisher().getHumanReadableName()}) + closureColumn(header : trans("PUBLISHER"), preferredWidth: 350, type : Persona, read : {it.getPublisher()}) closureColumn(header : trans("FILES"), preferredWidth: 10, type : Integer, read : {model.core.feedManager.getFeedItems(it.getPublisher()).size()}) closureColumn(header : trans("LAST_UPDATED"), type : Long, read : {it.getLastUpdated()}) closureColumn(header : trans("STATUS"), preferredWidth: 10, type : String, read : {trans(it.getStatus().name())}) @@ -651,7 +648,7 @@ class MainFrameView { table(id: "contacts-table", autoCreateRowSorter: true, rowHeight: rowHeight, dragEnabled: true, transferHandler: new PersonaTransferHandler()) { tableModel(list: model.contacts) { - closureColumn(header: trans("CONTACTS"), preferredWidth: 250, type: String, read: { it.persona.getHumanReadableName() }) + closureColumn(header: trans("CONTACTS"), preferredWidth: 250, type: Persona, read: { it.persona }) closureColumn(header: trans("REASON"), preferredWidth: 450, type: String, read: { it.reason }) closureColumn(header: trans("TRUST_STATUS"), preferredWidth: 60, type: String, read: { row -> trans(model.core.trustService.getLevel(row.persona.destination).name()) @@ -691,7 +688,7 @@ class MainFrameView { scrollPane(constraints : BorderLayout.CENTER) { table(id : "subscription-table", autoCreateRowSorter : true, rowHeight : rowHeight) { tableModel(list : model.subscriptions) { - closureColumn(header : trans("NAME"), preferredWidth: 200, type: String, read : {it.persona.getHumanReadableName()}) + closureColumn(header : trans("NAME"), preferredWidth: 200, type: Persona, read : {it.persona}) closureColumn(header : trans("TRUSTED"), preferredWidth : 20, type: Integer, read : {it.good.size()}) closureColumn(header : trans("DISTRUSTED"), preferredWidth: 20, type: Integer, read : {it.bad.size()}) closureColumn(header : trans("STATUS"), preferredWidth: 30, type: String, read : {trans(it.status.name())}) @@ -1065,10 +1062,14 @@ class MainFrameView { // collections table + def personaRenderer = new PersonaCellRenderer() + def personaComparator = new PersonaComparator() collectionsTable.setDefaultRenderer(Integer.class, centerRenderer) + collectionsTable.setDefaultRenderer(Persona.class, personaRenderer) collectionsTable.columnModel.getColumn(3).setCellRenderer(new SizeRenderer()) collectionsTable.columnModel.getColumn(6).setCellRenderer(new DateRenderer()) + collectionsTable.rowSorter.setComparator(1, personaComparator) collectionsTable.rowSorter.addRowSorterListener({ evt -> lastCollectionSortEvent = evt }) selectionModel = collectionsTable.getSelectionModel() @@ -1135,8 +1136,10 @@ class MainFrameView { }) // uploadsTable - def uploadsTable = builder.getVariable("uploads-table") + JTable uploadsTable = builder.getVariable("uploads-table") + uploadsTable.setDefaultRenderer(Persona.class, personaRenderer) + uploadsTable.rowSorter.setComparator(2, personaComparator) uploadsTable.rowSorter.addRowSorterListener({ evt -> lastUploadsSortEvent = evt }) uploadsTable.rowSorter.setSortsOnUpdates(true) @@ -1155,7 +1158,8 @@ class MainFrameView { }) // searches table - def searchesTable = builder.getVariable("searches-table") + JTable searchesTable = builder.getVariable("searches-table") + searchesTable.setDefaultRenderer(Persona.class, personaRenderer) JPopupMenu searchTableMenu = new JPopupMenu() JMenuItem copySearchToClipboard = new JMenuItem(trans("COPY_SEARCH_TO_CLIPBOARD")) @@ -1184,9 +1188,11 @@ class MainFrameView { }) // feeds table - def feedsTable = builder.getVariable("feeds-table") + JTable feedsTable = builder.getVariable("feeds-table") feedsTable.rowSorter.addRowSorterListener({ evt -> lastFeedsSortEvent = evt }) feedsTable.rowSorter.setSortsOnUpdates(true) + feedsTable.rowSorter.setComparator(0, personaComparator) + feedsTable.setDefaultRenderer(Persona.class, personaRenderer) feedsTable.setDefaultRenderer(Integer.class, centerRenderer) feedsTable.setDefaultRenderer(Long.class, new DateRenderer()) selectionModel = feedsTable.getSelectionModel() @@ -1277,10 +1283,12 @@ class MainFrameView { }) // subscription table - def subscriptionTable = builder.getVariable("subscription-table") + JTable subscriptionTable = builder.getVariable("subscription-table") subscriptionTable.setDefaultRenderer(Integer.class, centerRenderer) + subscriptionTable.setDefaultRenderer(Persona.class, personaRenderer) subscriptionTable.rowSorter.addRowSorterListener({ evt -> lastContactsSubscriptionSortEvent = evt }) subscriptionTable.rowSorter.setSortsOnUpdates(true) + subscriptionTable.rowSorter.setComparator(0, personaComparator) selectionModel = subscriptionTable.getSelectionModel() selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION) selectionModel.addListSelectionListener({ @@ -1313,7 +1321,9 @@ class MainFrameView { subscriptionTable.setDefaultRenderer(Long.class, new DateRenderer()) // contacts table - def contactsTable = builder.getVariable("contacts-table") + JTable contactsTable = builder.getVariable("contacts-table") + contactsTable.setDefaultRenderer(Persona.class, personaRenderer) + contactsTable.rowSorter.setComparator(0, personaComparator) contactsTable.rowSorter.addRowSorterListener({ evt -> lastContactsSortEvent = evt }) contactsTable.rowSorter.setSortsOnUpdates(true) selectionModel = contactsTable.getSelectionModel() diff --git a/gui/griffon-app/views/com/muwire/gui/MessageFolderView.groovy b/gui/griffon-app/views/com/muwire/gui/MessageFolderView.groovy index 91243fc4..605ee4fb 100644 --- a/gui/griffon-app/views/com/muwire/gui/MessageFolderView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/MessageFolderView.groovy @@ -1,5 +1,6 @@ package com.muwire.gui +import com.muwire.core.Persona import com.muwire.core.collections.FileCollection import com.muwire.core.messenger.MWMessage import com.muwire.core.messenger.MWMessageAttachment @@ -59,7 +60,7 @@ class MessageFolderView { dragEnabled: true, transferHandler: new MessageExportTransferHandler()) { if (!model.outgoing) { tableModel(list: model.messageHeaders) { - closureColumn(header: trans("SENDER"), preferredWidth: 200, type: String, read: { it.message.sender.getHumanReadableName() }) + closureColumn(header: trans("SENDER"), preferredWidth: 200, type: Persona, read: { it.message.sender }) closureColumn(header: trans("SUBJECT"), preferredWidth: 300, type: String, read: { HTMLSanitizer.sanitize(it.message.subject) }) closureColumn(header: trans("RECIPIENTS"), preferredWidth: 20, type: Integer, read: { it.message.recipients.size() }) closureColumn(header: trans("DATE"), preferredWidth: 50, type: Long, read: { it.message.timestamp }) @@ -68,7 +69,14 @@ class MessageFolderView { } else { tableModel(list : model.messageHeaders) { closureColumn(header: trans("RECIPIENTS"), preferredWidth: 400, type: String, read : { - it.message.recipients.stream().map({it.getHumanReadableName()}).collect(Collectors.joining(",")) + StringBuilder sb = new StringBuilder() + sb.append("") + String collected = it.message.recipients.stream(). + map(PersonaCellRenderer::htmlize). + collect(Collectors.joining(",")) + sb.append(collected) + sb.append("") + return sb.toString() }) closureColumn(header: trans("SUBJECT"), preferredWidth: 300, type: String, read: { it.message.subject }) closureColumn(header: trans("DATE"), preferredWidth: 50, type: Long, read: { it.message.timestamp }) @@ -182,9 +190,12 @@ class MessageFolderView { void mvcGroupInit(Map args) { def centerRenderer = new DefaultTableCellRenderer() centerRenderer.setHorizontalAlignment(JLabel.CENTER) - + + messageHeaderTable.setDefaultRenderer(Persona.class, new PersonaCellRenderer()) messageHeaderTable.setDefaultRenderer(Integer.class, centerRenderer) messageHeaderTable.setDefaultRenderer(Long.class, new DateRenderer()) + if (!model.outgoing) + messageHeaderTable.rowSorter.setComparator(0, new PersonaComparator()) messageHeaderTable.rowSorter.addRowSorterListener({evt -> lastMessageHeaderTableSortEvent = evt}) messageHeaderTable.rowSorter.setSortsOnUpdates(true) def sortKey = new RowSorter.SortKey(model.outgoing ? 2 : 3, SortOrder.ASCENDING) diff --git a/gui/griffon-app/views/com/muwire/gui/NewMessageView.groovy b/gui/griffon-app/views/com/muwire/gui/NewMessageView.groovy index 0e0a42c9..929da6ba 100644 --- a/gui/griffon-app/views/com/muwire/gui/NewMessageView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/NewMessageView.groovy @@ -270,7 +270,7 @@ class NewMessageView { } public String toString() { - persona.getHumanReadableName() + "" + PersonaCellRenderer.htmlize(persona) + "" } } } \ No newline at end of file diff --git a/gui/griffon-app/views/com/muwire/gui/SearchTabView.groovy b/gui/griffon-app/views/com/muwire/gui/SearchTabView.groovy index 68721ec6..1bc43ba3 100644 --- a/gui/griffon-app/views/com/muwire/gui/SearchTabView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/SearchTabView.groovy @@ -95,7 +95,7 @@ class SearchTabView { scrollPane (constraints : BorderLayout.CENTER) { sendersTable = table(id : "senders-table", autoCreateRowSorter : true, rowHeight : rowHeight) { tableModel(list : model.senders) { - closureColumn(header : trans("SENDER"), preferredWidth : 500, type: String, read : { SenderBucket row -> row.sender.getHumanReadableName()}) + closureColumn(header : trans("SENDER"), preferredWidth : 500, type: Persona, read : { SenderBucket row -> row.sender}) closureColumn(header : trans("RESULTS"), preferredWidth : 20, type: Integer, read : {SenderBucket row -> row.results.size()}) closureColumn(header : trans("BROWSE"), preferredWidth : 20, type: Boolean, read : {SenderBucket row -> row.results[0].browse}) closureColumn(header : trans("COLLECTIONS"), preferredWidth : 20, type: Boolean, read : {SenderBucket row -> row.results[0].browseCollections}) @@ -394,8 +394,12 @@ class SearchTabView { }) // senders table + def personaRenderer = new PersonaCellRenderer() + def personaComparator = new PersonaComparator() sendersTable.addMouseListener(sendersMouseListener) sendersTable.setDefaultRenderer(Integer.class, centerRenderer) + sendersTable.setDefaultRenderer(Persona.class, personaRenderer) + sendersTable.rowSorter.setComparator(0, personaComparator) sendersTable.rowSorter.addRowSorterListener({evt -> lastSendersSortEvent = evt}) sendersTable.rowSorter.setSortsOnUpdates(true) selectionModel = sendersTable.getSelectionModel() diff --git a/gui/griffon-app/views/com/muwire/gui/SharedFileView.groovy b/gui/griffon-app/views/com/muwire/gui/SharedFileView.groovy index d0fd4693..165973da 100644 --- a/gui/griffon-app/views/com/muwire/gui/SharedFileView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/SharedFileView.groovy @@ -1,5 +1,6 @@ package com.muwire.gui +import com.muwire.core.Persona import griffon.core.artifact.GriffonView import static com.muwire.gui.Translator.trans import griffon.inject.MVCMember @@ -52,7 +53,7 @@ class SharedFileView { scrollPane(constraints : BorderLayout.CENTER) { searchersTable = table(autoCreateRowSorter : true, rowHeight : rowHeight) { tableModel(list : model.searchers) { - closureColumn(header : trans("SEARCHER"), type : String, read : {it.searcher?.getHumanReadableName()}) + closureColumn(header : trans("SEARCHER"), type : Persona, read : {it.searcher}) closureColumn(header : trans("QUERY"), type : String, read : {HTMLSanitizer.sanitize(it.query)}) closureColumn(header : trans("TIMESTAMP"), type : Long, read : {it.timestamp}) } @@ -76,7 +77,7 @@ class SharedFileView { scrollPane(constraints : BorderLayout.CENTER) { certificatesTable = table(autoCreateRowSorter : true, rowHeight : rowHeight) { tableModel(list : model.certificates) { - closureColumn(header : trans("ISSUER"), type:String, read : {it.issuer.getHumanReadableName()}) + closureColumn(header : trans("ISSUER"), type: Persona, read : {it.issuer}) closureColumn(header : trans("FILE_NAME"), type : String, read : {HTMLSanitizer.sanitize(it.name.name)}) closureColumn(header : trans("COMMENT"), type : Boolean, read : {it.comment != null}) closureColumn(header : trans("TIMESTAMP"), type : Long, read : {it.timestamp}) @@ -90,7 +91,12 @@ class SharedFileView { } void mvcGroupInit(Map args) { + + def personaRenderer = new PersonaCellRenderer() + def personaComparator = new PersonaComparator() + certificatesTable.setDefaultRenderer(Persona.class, personaRenderer) + certificatesTable.rowSorter.setComparator(0, personaComparator) certificatesTable.rowSorter.addRowSorterListener({evt -> lastCertificateSortEvent = evt}) def selectionModel = certificatesTable.getSelectionModel() selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION) @@ -113,6 +119,8 @@ class SharedFileView { certificatesTable.setDefaultRenderer(Long.class, new DateRenderer()) + searchersTable.rowSorter.setComparator(0, personaComparator) + searchersTable.setDefaultRenderer(Persona.class, personaRenderer) searchersTable.setDefaultRenderer(Long.class, new DateRenderer()) def tabbedPane = new JTabbedPane() diff --git a/gui/griffon-app/views/com/muwire/gui/TrustListView.groovy b/gui/griffon-app/views/com/muwire/gui/TrustListView.groovy index 21adac03..20847ae8 100644 --- a/gui/griffon-app/views/com/muwire/gui/TrustListView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/TrustListView.groovy @@ -1,8 +1,12 @@ package com.muwire.gui +import com.muwire.core.Persona import griffon.core.artifact.GriffonView import griffon.inject.MVCMember import griffon.metadata.ArtifactProviderFor + +import javax.swing.JTable + import static com.muwire.gui.Translator.trans import javax.swing.JDialog import javax.swing.ListSelectionModel @@ -49,7 +53,7 @@ class TrustListView { scrollPane (constraints : BorderLayout.CENTER){ table(id : "trusted-table", autoCreateRowSorter : true, rowHeight : rowHeight) { tableModel(list : model.trusted) { - closureColumn(header: trans("TRUSTED_USERS"), type : String, read : {it.persona.getHumanReadableName()}) + closureColumn(header: trans("TRUSTED_USERS"), type : Persona, read : {it.persona}) closureColumn(header: trans("REASON"), type : String, read : {HTMLSanitizer.sanitize(it.reason)}) closureColumn(header: trans("YOUR_TRUST"), type : String, read : {trans(model.trustService.getLevel(it.persona.destination).name())}) } @@ -66,7 +70,7 @@ class TrustListView { scrollPane (constraints : BorderLayout.CENTER ){ table(id : "distrusted-table", autoCreateRowSorter : true, rowHeight : rowHeight) { tableModel(list : model.distrusted) { - closureColumn(header: trans("DISTRUSTED_USERS"), type : String, read : {it.persona.getHumanReadableName()}) + closureColumn(header: trans("DISTRUSTED_USERS"), type : Persona, read : {it.persona}) closureColumn(header: trans("REASON"), type:String, read : {HTMLSanitizer.sanitize(it.reason)}) closureColumn(header: trans("YOUR_TRUST"), type : String, read : {trans(model.trustService.getLevel(it.persona.destination).name())}) } @@ -83,13 +87,20 @@ class TrustListView { } void mvcGroupInit(Map args) { + + def personaRenderer = new PersonaCellRenderer() + def personaComparator = new PersonaComparator() - def trustedTable = builder.getVariable("trusted-table") + JTable trustedTable = builder.getVariable("trusted-table") + trustedTable.setDefaultRenderer(Persona.class, personaRenderer) + trustedTable.rowSorter.setComparator(0, personaComparator) trustedTable.rowSorter.addRowSorterListener({evt -> sortEvents["trusted-table"] = evt}) trustedTable.rowSorter.setSortsOnUpdates(true) trustedTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION) - def distrustedTable = builder.getVariable("distrusted-table") + JTable distrustedTable = builder.getVariable("distrusted-table") + distrustedTable.setDefaultRenderer(Persona.class, personaRenderer) + distrustedTable.rowSorter.setComparator(0, personaComparator) distrustedTable.rowSorter.addRowSorterListener({evt -> sortEvents["distrusted-table"] = evt}) distrustedTable.rowSorter.setSortsOnUpdates(true) distrustedTable.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION) diff --git a/gui/griffon-app/views/com/muwire/gui/chat/ChatFavoritesView.groovy b/gui/griffon-app/views/com/muwire/gui/chat/ChatFavoritesView.groovy index 0694be3a..fd24d325 100644 --- a/gui/griffon-app/views/com/muwire/gui/chat/ChatFavoritesView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/chat/ChatFavoritesView.groovy @@ -1,5 +1,8 @@ package com.muwire.gui.chat +import com.muwire.core.Persona +import com.muwire.gui.PersonaCellRenderer +import com.muwire.gui.PersonaComparator import griffon.core.artifact.GriffonView import griffon.inject.MVCMember import griffon.metadata.ArtifactProviderFor @@ -42,8 +45,8 @@ class ChatFavoritesView { scrollPane(constraints : BorderLayout.CENTER) { favoritesTable = table(autoCreateRowSorter : true, rowHeight : rowHeight) { tableModel(list: model.chatFavorites.favorites) { - closureColumn(header: trans("SERVER"), type: String, - read : {ChatFavorite cf -> cf.address.getHumanReadableName()}) + closureColumn(header: trans("SERVER"), type: Persona, + read : {ChatFavorite cf -> cf.address}) closureColumn(header: trans("CHAT_SERVERS_STARTUP_CONNECT"), preferredWidth: 50, type: Boolean, read : {ChatFavorite cf -> cf.autoConnect}, @@ -83,6 +86,8 @@ class ChatFavoritesView { void mvcGroupInit(Map args) { + favoritesTable.setDefaultRenderer(Persona.class, new PersonaCellRenderer()) + favoritesTable.rowSorter.setComparator(0, new PersonaComparator()) favoritesTable.selectionModel.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION) window.addWindowListener( new WindowAdapter() { diff --git a/gui/griffon-app/views/com/muwire/gui/resultdetails/CertificateTabView.groovy b/gui/griffon-app/views/com/muwire/gui/resultdetails/CertificateTabView.groovy index 3cbf846b..070d0ac1 100644 --- a/gui/griffon-app/views/com/muwire/gui/resultdetails/CertificateTabView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/resultdetails/CertificateTabView.groovy @@ -1,8 +1,11 @@ package com.muwire.gui.resultdetails +import com.muwire.core.Persona import com.muwire.core.filecert.Certificate import com.muwire.gui.DateRenderer import com.muwire.gui.HTMLSanitizer +import com.muwire.gui.PersonaCellRenderer +import com.muwire.gui.PersonaComparator import griffon.core.artifact.GriffonView import griffon.inject.MVCMember import griffon.metadata.ArtifactProviderFor @@ -43,8 +46,8 @@ class CertificateTabView { scrollPane(constraints: BorderLayout.CENTER) { certsTable = table(autoCreateRowSorter: true, rowHeight: rowHeight) { tableModel(list: model.certificates) { - closureColumn(header: trans("ISSUER"), preferredWidth: 150, type:String, - read:{it.issuer.getHumanReadableName()}) + closureColumn(header: trans("ISSUER"), preferredWidth: 150, type: Persona, + read:{it.issuer}) closureColumn(header: trans("TRUST_STATUS"), preferredWidth: 30, type:String, read:{trans(model.core.trustService.getLevel(it.issuer.destination).name())}) closureColumn(header: trans("NAME"), preferredWidth: 450, @@ -65,7 +68,9 @@ class CertificateTabView { } void mvcGroupInit(Map args) { + certsTable.setDefaultRenderer(Persona.class, new PersonaCellRenderer()) certsTable.setDefaultRenderer(Long.class, new DateRenderer()) + certsTable.rowSorter.setComparator(0, new PersonaComparator()) certsTable.rowSorter.setSortsOnUpdates(true) def selectionModel = certsTable.getSelectionModel() diff --git a/gui/griffon-app/views/com/muwire/gui/resultdetails/MiniCollectionTabView.groovy b/gui/griffon-app/views/com/muwire/gui/resultdetails/MiniCollectionTabView.groovy index ae558bae..92239712 100644 --- a/gui/griffon-app/views/com/muwire/gui/resultdetails/MiniCollectionTabView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/resultdetails/MiniCollectionTabView.groovy @@ -1,8 +1,11 @@ package com.muwire.gui.resultdetails +import com.muwire.core.Persona import com.muwire.core.collections.FileCollection import com.muwire.gui.DateRenderer import com.muwire.gui.HTMLSanitizer +import com.muwire.gui.PersonaCellRenderer +import com.muwire.gui.PersonaComparator import com.muwire.gui.SizeRenderer import griffon.core.artifact.GriffonView import griffon.inject.MVCMember @@ -44,7 +47,7 @@ class MiniCollectionTabView { collectionsTable = table(autoCreateRowSorter: true, rowHeight: rowHeight) { tableModel(list : model.collections) { closureColumn(header: trans("NAME"), preferredWidth: 300, type : String, read : { HTMLSanitizer.sanitize(it.name)}) - closureColumn(header: trans("AUTHOR"), preferredWidth: 200, type : String, read : {it.author.getHumanReadableName()}) + closureColumn(header: trans("AUTHOR"), preferredWidth: 200, type : Persona, read : {it.author}) closureColumn(header: trans("COLLECTION_TOTAL_FILES"), preferredWidth: 20, type: Integer, read : {it.numFiles()}) closureColumn(header: trans("COLLECTION_TOTAL_SIZE"), preferredWidth: 20, type: Long, read : {it.totalSize()}) closureColumn(header: trans("COMMENT"), preferredWidth: 20, type: Boolean, read: {it.comment != ""}) @@ -61,8 +64,10 @@ class MiniCollectionTabView { } void mvcGroupInit(Map args) { + collectionsTable.setDefaultRenderer(Persona.class, new PersonaCellRenderer()) collectionsTable.columnModel.getColumn(3).setCellRenderer(new SizeRenderer()) collectionsTable.columnModel.getColumn(5).setCellRenderer(new DateRenderer()) + collectionsTable.rowSorter.setComparator(1, new PersonaComparator()) collectionsTable.rowSorter.setSortsOnUpdates(true) def selectionModel = collectionsTable.getSelectionModel() selectionModel.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION) diff --git a/gui/griffon-app/views/com/muwire/gui/resultdetails/ResultDetailsFrameView.groovy b/gui/griffon-app/views/com/muwire/gui/resultdetails/ResultDetailsFrameView.groovy index e8f740bb..0b37db4a 100644 --- a/gui/griffon-app/views/com/muwire/gui/resultdetails/ResultDetailsFrameView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/resultdetails/ResultDetailsFrameView.groovy @@ -1,10 +1,14 @@ package com.muwire.gui.resultdetails +import com.muwire.core.Persona +import com.muwire.gui.PersonaCellRenderer +import com.muwire.gui.PersonaComparator import griffon.core.GriffonApplication import net.i2p.data.Destination import javax.inject.Inject import javax.swing.JPanel +import javax.swing.JTable import javax.swing.border.Border import java.awt.BorderLayout import java.awt.Dimension @@ -81,9 +85,9 @@ class ResultDetailsFrameView { constraints: gbc(gridx: 0, gridy: gridy++, fill: GridBagConstraints.BOTH, weightx: 100, weighty: 100)) { gridLayout(rows: 1, cols: 1) scrollPane { - table(autoCreateRowSorter: true, rowHeight: rowHeight) { + table(id: "senders-table", autoCreateRowSorter: true, rowHeight: rowHeight) { tableModel(list: model.senders.toList()) { - closureColumn(header: trans("SENDER"), read: { it.getHumanReadableName() }) + closureColumn(header: trans("SENDER"), type: Persona, read: { it }) closureColumn(header: trans("TRUST_NOUN"), read: { Destination destination = it.destination trans(model.core.trustService.getLevel(destination).name()) @@ -117,6 +121,11 @@ class ResultDetailsFrameView { } void mvcGroupInit(Map args) { + if (model.senders.size() > 1) { + JTable sendersTable = builder.getVariable("senders-table") + sendersTable.setDefaultRenderer(Persona.class, new PersonaCellRenderer()) + sendersTable.rowSorter.setComparator(0, new PersonaComparator()) + } if (certificatesPanel != null) { String mvcId = mvcGroup.mvcId + "_certificates" def params = [:] diff --git a/gui/griffon-app/views/com/muwire/gui/resultdetails/ResultDetailsTabsView.groovy b/gui/griffon-app/views/com/muwire/gui/resultdetails/ResultDetailsTabsView.groovy index d723aa4b..201fe7b9 100644 --- a/gui/griffon-app/views/com/muwire/gui/resultdetails/ResultDetailsTabsView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/resultdetails/ResultDetailsTabsView.groovy @@ -3,6 +3,8 @@ package com.muwire.gui.resultdetails import com.muwire.core.Persona import com.muwire.core.search.UIResultEvent import com.muwire.gui.HTMLSanitizer +import com.muwire.gui.PersonaCellRenderer +import com.muwire.gui.PersonaComparator import com.muwire.gui.resultdetails.ResultListCellRenderer import griffon.core.artifact.GriffonView import griffon.core.mvc.MVCGroup @@ -61,7 +63,7 @@ class ResultDetailsTabsView { scrollPane(constraints: BorderLayout.CENTER) { sendersTable = table(autoCreateRowSorter : true, rowHeight : rowHeight) { tableModel(list: model.results) { - closureColumn(header: trans("SENDER"), preferredWidth: 150, type: String, read : {it.sender.getHumanReadableName()}) + closureColumn(header: trans("SENDER"), preferredWidth: 150, type: Persona, read : {it.sender}) closureColumn(header: trans("TRUST_STATUS"), preferredWidth: 30, type:String, read : { trans(model.core.trustService.getLevel(it.sender.destination).name()) }) @@ -166,6 +168,8 @@ class ResultDetailsTabsView { void mvcGroupInit(Map args) { // all senders table + sendersTable.setDefaultRenderer(Persona.class, new PersonaCellRenderer()) + sendersTable.rowSorter.setComparator(0, new PersonaComparator()) def selectionModel = sendersTable.getSelectionModel() selectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION) selectionModel.addListSelectionListener({ diff --git a/gui/src/main/groovy/com/muwire/gui/PersonaCellRenderer.groovy b/gui/src/main/groovy/com/muwire/gui/PersonaCellRenderer.groovy new file mode 100644 index 00000000..1c416929 --- /dev/null +++ b/gui/src/main/groovy/com/muwire/gui/PersonaCellRenderer.groovy @@ -0,0 +1,33 @@ +package com.muwire.gui + +import com.muwire.core.Persona + +import javax.swing.JTable +import javax.swing.table.DefaultTableCellRenderer +import java.awt.Component + +class PersonaCellRenderer extends DefaultTableCellRenderer { + + @Override + Component getTableCellRendererComponent(JTable table, Object value, + boolean isSelected, boolean hasFocus, int row, int column) { + super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column) + Persona persona = (Persona) value + setText("${htmlize(persona)}") + if (isSelected) { + setForeground(table.getSelectionForeground()) + setBackground(table.getSelectionBackground()) + } else { + setForeground(table.getForeground()) + setBackground(table.getBackground()) + } + this + } + + static String htmlize(Persona persona) { + int atIdx = persona.getHumanReadableName().indexOf("@") + String nickname = persona.getHumanReadableName().substring(0, atIdx) + String hashPart = persona.getHumanReadableName().substring(atIdx) + "$nickname$hashPart" + } +} diff --git a/gui/src/main/groovy/com/muwire/gui/PersonaComparator.groovy b/gui/src/main/groovy/com/muwire/gui/PersonaComparator.groovy new file mode 100644 index 00000000..18e3aa5b --- /dev/null +++ b/gui/src/main/groovy/com/muwire/gui/PersonaComparator.groovy @@ -0,0 +1,10 @@ +package com.muwire.gui + +import com.muwire.core.Persona + +class PersonaComparator implements Comparator{ + @Override + int compare(Persona a, Persona b) { + return String.compare(a.getHumanReadableName(), b.getHumanReadableName()) + } +} diff --git a/gui/src/main/groovy/com/muwire/gui/resultdetails/ResultListCellRenderer.groovy b/gui/src/main/groovy/com/muwire/gui/resultdetails/ResultListCellRenderer.groovy index 7892a6e5..e70c9e45 100644 --- a/gui/src/main/groovy/com/muwire/gui/resultdetails/ResultListCellRenderer.groovy +++ b/gui/src/main/groovy/com/muwire/gui/resultdetails/ResultListCellRenderer.groovy @@ -1,6 +1,7 @@ package com.muwire.gui.resultdetails import com.muwire.core.search.UIResultEvent +import com.muwire.gui.PersonaCellRenderer import javax.swing.JLabel import javax.swing.JList @@ -13,7 +14,8 @@ class ResultListCellRenderer implements ListCellRenderer{ UIResultEvent value, int index, boolean isSelected, boolean cellHasFocus) { JLabel rv = new JLabel() - rv.setText(value.sender.getHumanReadableName()) + String text = "" + PersonaCellRenderer.htmlize(value.sender) + "" + rv.setText(text) if (!isSelected) { rv.setForeground(list.getForeground()) rv.setBackground(list.getSelectionBackground())