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 c9ad1cf1..63431537 100644 --- a/core/src/main/groovy/com/muwire/core/messenger/MessageLoadedEvent.groovy +++ b/core/src/main/groovy/com/muwire/core/messenger/MessageLoadedEvent.groovy @@ -4,6 +4,6 @@ import com.muwire.core.Event class MessageLoadedEvent extends Event { MWMessage message - int folder + String 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 b254e995..059979a3 100644 --- a/core/src/main/groovy/com/muwire/core/messenger/Messenger.groovy +++ b/core/src/main/groovy/com/muwire/core/messenger/Messenger.groovy @@ -23,17 +23,24 @@ import net.i2p.data.Base64 @Log class Messenger { - public final static int INBOX = 0 - public final static int OUTBOX = 1 - public final static int SENT = 2 + public final static String INBOX = "inbox" + public final static String OUTBOX = "outbox" + public final static String SENT = "sent" + private static final Set RESERVED_FOLDERS = new HashSet<>() + static { + RESERVED_FOLDERS.add(INBOX) + RESERVED_FOLDERS.add(OUTBOX) + RESERVED_FOLDERS.add(SENT) + } private static final int MAX_IN_PROCESS = 4 private final EventBus eventBus - private final File inbox, outbox, sent + private final Map folders = new HashMap<>() private final I2PConnector connector private final MuWireSettings settings + private final Map> messages = new HashMap<>() private final Set inboxMessages = new LinkedHashSet<>() private final Set outboxMessages = new LinkedHashSet<>() private final Set sentMessages = new LinkedHashSet<>() @@ -52,26 +59,32 @@ class Messenger { private long lastSendTime - public Messenger(EventBus eventBus, File home, I2PConnector connector, MuWireSettings settings) { + Messenger(EventBus eventBus, File home, I2PConnector connector, MuWireSettings settings) { this.eventBus = eventBus this.connector = connector this.settings = settings File messages = new File(home, "messages") - inbox = new File(messages, "inbox") - outbox = new File(messages, "outbox") - sent = new File(messages, "sent") - - inbox.mkdirs() - outbox.mkdirs() - sent.mkdirs() + folders.put(INBOX, new File(messages, INBOX)) + folders.put(OUTBOX, new File(messages, OUTBOX)) + folders.put(SENT, new File(messages, SENT)) + + folders.values().each {it.mkdirs()} + + this.messages.put(folders[INBOX], inboxMessages) + this.messages.put(folders[OUTBOX], outboxMessages) + this.messages.put(folders[SENT], sentMessages) } - public void onUILoadedEvent(UILoadedEvent e) { + Set getFolderNames() { + folders.keySet() + } + + void onUILoadedEvent(UILoadedEvent e) { diskIO.execute({load()} as Runnable) } - public void stop() { + void stop() { diskIO.shutdown() netIO.shutdown() timer.cancel() @@ -79,14 +92,20 @@ class Messenger { private void load() { log.info("loading messages") - loadFolder(inbox, inboxMessages, INBOX) - loadFolder(outbox, outboxMessages, OUTBOX) - loadFolder(sent, sentMessages, SENT) + folders.each {name, file -> + log.info("loading message folder $name") + Set set = messages.get(file) + if (set == null) { + set = new LinkedHashSet<>() + messages.put(file, set) + } + loadFolder(file, set, name) + } log.info("loaded messages") timer.schedule({send()} as TimerTask, 1000, 1000) } - private void loadFolder(File file, Set dest, int folder) { + private void loadFolder(File file, Set dest, String folder) { Files.walk(file.toPath()) .filter({it.getFileName().toString().endsWith(".mwmessage")}) .forEach { Path path -> diff --git a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy index 7e52699a..a5664411 100644 --- a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy @@ -117,10 +117,12 @@ class MainFrameModel { def feeds = [] def feedItems = [] - def messageFolders = [trans("INBOX"), trans("OUTBOX"), trans("SENT")] + def messageFolders = [Messenger.INBOX, Messenger.OUTBOX, Messenger.SENT] + def messageFolderTx = messageFolders.collect {trans(it.toUpperCase())} + List messageHeaders = new ArrayList<>() - Map> messageHeadersMap = new HashMap<>() - int folderIdx + Map> messageHeadersMap = new HashMap<>() + String folderIdx List messageAttachments = new ArrayList<>() MessageNotificator messageNotificator @@ -213,9 +215,9 @@ class MainFrameModel { treeRoot = new DefaultMutableTreeNode() sharedTree = new DefaultTreeModel(treeRoot) - messageHeadersMap.put(0, new LinkedHashSet<>()) - messageHeadersMap.put(1, new LinkedHashSet<>()) - messageHeadersMap.put(2, new LinkedHashSet<>()) + messageHeadersMap.put(Messenger.INBOX, new LinkedHashSet<>()) + messageHeadersMap.put(Messenger.OUTBOX, new LinkedHashSet<>()) + messageHeadersMap.put(Messenger.SENT, new LinkedHashSet<>()) Timer timer = new Timer("download-pumper", true) timer.schedule({ diff --git a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy index 82a0e972..166f737f 100644 --- a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy @@ -648,7 +648,7 @@ class MainFrameView { gridLayout(rows : 1, cols : 1) splitPane(orientation : JSplitPane.HORIZONTAL_SPLIT, continuousLayout : true, dividerLocation : 100) { panel { - list(id : "message-folders-list", items:model.messageFolders) + list(id : "message-folders-list", items:model.messageFolderTx) } panel { gridLayout(rows :1, cols : 1) @@ -1254,9 +1254,9 @@ class MainFrameView { int index = messageFolderList.getSelectedIndex() if (index < 0) index = 0 - model.folderIdx = index + model.folderIdx = model.messageFolders[index] model.messageHeaders.clear() - model.messageHeaders.addAll(model.messageHeadersMap.get(index)) + model.messageHeaders.addAll(model.messageHeadersMap.get(model.folderIdx)) messageHeaderTable.model.fireTableDataChanged() })