From 92b616a58b92320c690c2ec80467c45fa06433d4 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Thu, 5 Nov 2020 18:45:57 +0000 Subject: [PATCH] unread status column --- .../main/groovy/com/muwire/core/Core.groovy | 2 + .../core/messenger/MessageLoadedEvent.groovy | 1 + .../muwire/core/messenger/Messenger.groovy | 26 +++++++++++-- .../core/messenger/UIMessageReadEvent.groovy | 7 ++++ .../com/muwire/gui/MainFrameController.groovy | 16 ++++++-- gui/griffon-app/i18n/messages.properties | 1 + .../com/muwire/gui/MainFrameModel.groovy | 38 ++++++++++++++----- .../views/com/muwire/gui/MainFrameView.groovy | 14 ++++--- 8 files changed, 84 insertions(+), 21 deletions(-) create mode 100644 core/src/main/groovy/com/muwire/core/messenger/UIMessageReadEvent.groovy diff --git a/core/src/main/groovy/com/muwire/core/Core.groovy b/core/src/main/groovy/com/muwire/core/Core.groovy index c76977da..2e36e82a 100644 --- a/core/src/main/groovy/com/muwire/core/Core.groovy +++ b/core/src/main/groovy/com/muwire/core/Core.groovy @@ -84,6 +84,7 @@ import com.muwire.core.messenger.Messenger import com.muwire.core.messenger.UIDownloadAttachmentEvent import com.muwire.core.messenger.UIMessageDeleteEvent import com.muwire.core.messenger.UIMessageEvent +import com.muwire.core.messenger.UIMessageReadEvent import com.muwire.core.search.BrowseManager import com.muwire.core.search.QueryEvent import com.muwire.core.search.ResponderCache @@ -495,6 +496,7 @@ public class Core { register(MessageReceivedEvent.class, messenger) register(UIMessageEvent.class, messenger) register(UIMessageDeleteEvent.class, messenger) + register(UIMessageReadEvent.class, messenger) } } diff --git a/core/src/main/groovy/com/muwire/core/messenger/MessageLoadedEvent.groovy b/core/src/main/groovy/com/muwire/core/messenger/MessageLoadedEvent.groovy index 5851a6b1..c9ad1cf1 100644 --- a/core/src/main/groovy/com/muwire/core/messenger/MessageLoadedEvent.groovy +++ b/core/src/main/groovy/com/muwire/core/messenger/MessageLoadedEvent.groovy @@ -5,4 +5,5 @@ import com.muwire.core.Event class MessageLoadedEvent extends Event { MWMessage message int folder + boolean unread } diff --git a/core/src/main/groovy/com/muwire/core/messenger/Messenger.groovy b/core/src/main/groovy/com/muwire/core/messenger/Messenger.groovy index 4d8b7f19..7737c4d8 100644 --- a/core/src/main/groovy/com/muwire/core/messenger/Messenger.groovy +++ b/core/src/main/groovy/com/muwire/core/messenger/Messenger.groovy @@ -96,7 +96,8 @@ class Messenger { message = new MWMessage(it) } addMessage(message, dest) - eventBus.publish(new MessageLoadedEvent(message : message, folder : folder)) + File unread = new File(file, deriveUnread(message)) + eventBus.publish(new MessageLoadedEvent(message : message, folder : folder, unread : unread.exists())) } } @@ -109,6 +110,13 @@ class Messenger { diskIO.execute({persist(e.message, outbox)}) } + synchronized void onUIMessageReadEvent(UIMessageReadEvent e) { + diskIO.execute({ + File unread = new File(inbox, deriveUnread(e.message)) + unread.delete() + }) + } + private void persist(MWMessage message, File folder) { File f = new File(folder, deriveName(message)) f.withOutputStream { @@ -126,8 +134,16 @@ class Messenger { } private static String deriveName(MWMessage message) { + namePrefix(message) + ".mwmessage" + } + + private static String deriveUnread(MWMessage message) { + namePrefix(message) + ".unread" + } + + private static String namePrefix(MWMessage message) { String ih = Base64.encode(message.getInfoHash().getRoot()) - "${ih}_${message.sender.getHumanReadableName()}_${message.timestamp}.mwmessage" + "${ih}_${message.sender.getHumanReadableName()}_${message.timestamp}" } private synchronized void send() { @@ -165,7 +181,11 @@ class Messenger { public synchronized void onMessageReceivedEvent(MessageReceivedEvent e) { inboxMessages.add(e.message) - diskIO.execute({persist(e.message, inbox)}) + diskIO.execute({ + File unread = new File(inbox, deriveUnread(e.message)) + unread.createNewFile() + persist(e.message, inbox) + }) } private boolean deliverTo(MWMessage message, Persona recipient) { diff --git a/core/src/main/groovy/com/muwire/core/messenger/UIMessageReadEvent.groovy b/core/src/main/groovy/com/muwire/core/messenger/UIMessageReadEvent.groovy new file mode 100644 index 00000000..7242cbb8 --- /dev/null +++ b/core/src/main/groovy/com/muwire/core/messenger/UIMessageReadEvent.groovy @@ -0,0 +1,7 @@ +package com.muwire.core.messenger + +import com.muwire.core.Event + +class UIMessageReadEvent extends Event { + MWMessage message +} diff --git a/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy b/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy index 84773842..c2f9d348 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy @@ -8,6 +8,7 @@ import griffon.metadata.ArtifactProviderFor import net.i2p.crypto.DSAEngine import net.i2p.data.Base64 import net.i2p.data.Signature +import net.i2p.data.i2cp.MessageStatusMessage import java.awt.Desktop import java.awt.Toolkit @@ -47,6 +48,7 @@ import com.muwire.core.messenger.MWMessage import com.muwire.core.messenger.MWMessageAttachment import com.muwire.core.messenger.UIDownloadAttachmentEvent import com.muwire.core.messenger.UIMessageDeleteEvent +import com.muwire.core.messenger.UIMessageReadEvent import com.muwire.core.search.QueryEvent import com.muwire.core.search.SearchEvent import com.muwire.core.trust.RemoteTrustList @@ -57,6 +59,7 @@ import com.muwire.core.trust.TrustSubscriptionEvent import com.muwire.core.upload.HashListUploader import com.muwire.core.upload.Uploader import com.muwire.core.util.DataUtil +import com.muwire.gui.MainFrameModel.MWMessageStatus @ArtifactProviderFor(GriffonController) class MainFrameController { @@ -794,7 +797,7 @@ class MainFrameController { int row = view.selectedMessageHeader() if (row < 0) return - MWMessage msg = model.messageHeaders.get(row) + MWMessage msg = model.messageHeaders.get(row).message def params = [:] params.reply = msg @@ -808,7 +811,7 @@ class MainFrameController { int row = view.selectedMessageHeader() if (row < 0) return - MWMessage msg = model.messageHeaders.get(row) + MWMessage msg = model.messageHeaders.get(row).message Set all = new HashSet<>() all.add(msg.sender) @@ -826,7 +829,7 @@ class MainFrameController { int row = view.selectedMessageHeader() if (row < 0) return - MWMessage msg = model.messageHeaders.get(row) + MWMessage msg = model.messageHeaders.get(row).message model.deleteMessage(msg) core.eventBus.publish(new UIMessageDeleteEvent(message : msg, folder : model.folderIdx)) } @@ -879,12 +882,17 @@ class MainFrameController { doDownloadAttachments(model.messageAttachments) } + void markMessageRead(MWMessageStatus status) { + status.status = false + model.core.eventBus.publish(new UIMessageReadEvent(message : status.message)) + } + private void doDownloadAttachments(List attachments) { int messageRow = view.selectedMessageHeader() if (messageRow < 0) return - MWMessage message = model.messageHeaders.get(messageRow) + MWMessage message = model.messageHeaders.get(messageRow).message attachments.each { if (it instanceof MWMessageAttachment) core.eventBus.publish(new UIDownloadAttachmentEvent(attachment : it, sender : message.sender)) diff --git a/gui/griffon-app/i18n/messages.properties b/gui/griffon-app/i18n/messages.properties index 30d1760c..687931a1 100644 --- a/gui/griffon-app/i18n/messages.properties +++ b/gui/griffon-app/i18n/messages.properties @@ -586,6 +586,7 @@ DOWNLOAD_ALL=Download All COLLECTION=Collection ## New message window +UNREAD=Unread RECIPIENTS=Recipients RECIPIENTS_TITLE=Drag and drop recipients from your contacts SEND=Send diff --git a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy index d3f1520b..8864d5af 100644 --- a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy @@ -118,8 +118,8 @@ class MainFrameModel { def feedItems = [] def messageFolders = [trans("INBOX"), trans("OUTBOX"), trans("SENT")] - List messageHeaders = new ArrayList<>() - Map> messageHeadersMap = new HashMap<>() + List messageHeaders = new ArrayList<>() + Map> messageHeadersMap = new HashMap<>() int folderIdx List messageAttachments = new ArrayList<>() @@ -833,7 +833,7 @@ class MainFrameModel { } void addToOutbox(MWMessage message) { - messageHeadersMap.get(Messenger.OUTBOX).add(message) + messageHeadersMap.get(Messenger.OUTBOX).add(new MWMessageStatus(message, false)) if (folderIdx == Messenger.OUTBOX) { messageHeaders.clear() messageHeaders.addAll(messageHeadersMap.get(Messenger.OUTBOX)) @@ -843,7 +843,7 @@ class MainFrameModel { void onMessageLoadedEvent(MessageLoadedEvent e) { runInsideUIAsync { - messageHeadersMap.get(e.folder).add(e.message) + messageHeadersMap.get(e.folder).add(new MWMessageStatus(e.message, e.unread)) if (e.folder == folderIdx) { messageHeaders.clear() messageHeaders.addAll(messageHeadersMap.get(folderIdx)) @@ -854,7 +854,7 @@ class MainFrameModel { void onMessageReceivedEvent(MessageReceivedEvent e) { runInsideUIAsync { - messageHeadersMap.get(Messenger.INBOX).add(e.message) + messageHeadersMap.get(Messenger.INBOX).add(new MWMessageStatus(e.message, true)) if (folderIdx == Messenger.INBOX) { messageHeaders.clear() messageHeaders.addAll(messageHeadersMap.get(Messenger.INBOX)) @@ -865,8 +865,9 @@ class MainFrameModel { void onMessageSentEvent(MessageSentEvent e) { runInsideUIAsync { - messageHeadersMap.get(Messenger.OUTBOX).remove(e.message) - messageHeadersMap.get(Messenger.SENT).add(e.message) + MWMessageStatus status = new MWMessageStatus(e.message, false) + messageHeadersMap.get(Messenger.OUTBOX).remove(status) + messageHeadersMap.get(Messenger.SENT).add(status) if (folderIdx != Messenger.INBOX) { messageHeaders.clear() messageHeaders.addAll(messageHeadersMap.get(folderIdx)) @@ -876,10 +877,29 @@ class MainFrameModel { } void deleteMessage(MWMessage message) { - messageHeadersMap.get(folderIdx).remove(message) - messageHeaders.remove(message) + MWMessageStatus status = new MWMessageStatus(message, false) + messageHeadersMap.get(folderIdx).remove(status) + messageHeaders.remove(status) view.messageHeaderTable.model.fireTableDataChanged() view.messageBody.setText("") view.messageSplitPane.setDividerLocation(1.0d) } + + static class MWMessageStatus { + private final MWMessage message + private boolean status + MWMessageStatus(MWMessage message, boolean status) { + this.message = message + this.status = status + } + + public int hashCode() { + message.hashCode() + } + + public boolean equals(Object o) { + MWMessageStatus other = (MWMessageStatus) o + message.equals(other.message) + } + } } \ No newline at end of file diff --git a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy index 8a859aea..a52db37b 100644 --- a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy @@ -57,6 +57,7 @@ import com.muwire.core.messenger.MWMessage import com.muwire.core.messenger.MWMessageAttachment import com.muwire.core.trust.RemoteTrustList import com.muwire.core.upload.Uploader +import com.muwire.gui.MainFrameModel.MWMessageStatus import java.awt.BorderLayout import java.awt.CardLayout @@ -692,10 +693,11 @@ class MainFrameView { scrollPane { table(id : "message-header-table", autoCreateRowSorter : true, rowHeight : rowHeight) { tableModel(list : model.messageHeaders) { - closureColumn(header : trans("SENDER"), preferredWidth:200, type : String, read : {it.sender.getHumanReadableName()}) - closureColumn(header : trans("SUBJECT"), preferredWidth:300, type: String, read : {it.subject}) - closureColumn(header : trans("RECIPIENTS"), preferredWidth: 20, type:Integer, read : {it.recipients.size()}) - closureColumn(header : trans("DATE"), preferredWidth : 50, type : Long, read : {it.timestamp}) + closureColumn(header : trans("SENDER"), preferredWidth:200, type : String, read : {it.message.sender.getHumanReadableName()}) + closureColumn(header : trans("SUBJECT"), preferredWidth:300, type: String, read : {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}) + closureColumn(header : trans("UNREAD"), preferredWidth : 20, type : Boolean, read : {it.status}) } } } @@ -1319,7 +1321,9 @@ class MainFrameView { messageBody.setText("") model.messageRecipientList = "" } else { - MWMessage selected = model.messageHeaders.getAt(selectedRow) + MWMessageStatus selectedStatus = model.messageHeaders.getAt(selectedRow) + controller.markMessageRead(selectedStatus) + MWMessage selected = selectedStatus.message messageBody.setText(selected.body) model.messageButtonsEnabled = true model.messageRecipientList = String.join(",", selected.recipients.collect {it.getHumanReadableName()})