From 5831b06842de7922a416af9a54bb87211b06fbc1 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Tue, 26 Nov 2019 09:43:53 +0000 Subject: [PATCH] chat room monitor tool --- gui/griffon-app/conf/Config.groovy | 5 ++ .../muwire/gui/ChatMonitorController.groovy | 13 ++++ .../com/muwire/gui/ChatMonitorModel.groovy | 46 +++++++++++++ .../com/muwire/gui/ChatMonitorView.groovy | 67 +++++++++++++++++++ .../views/com/muwire/gui/MainFrameView.groovy | 7 ++ .../com/muwire/gui/ChatNotificator.groovy | 7 ++ 6 files changed, 145 insertions(+) create mode 100644 gui/griffon-app/controllers/com/muwire/gui/ChatMonitorController.groovy create mode 100644 gui/griffon-app/models/com/muwire/gui/ChatMonitorModel.groovy create mode 100644 gui/griffon-app/views/com/muwire/gui/ChatMonitorView.groovy diff --git a/gui/griffon-app/conf/Config.groovy b/gui/griffon-app/conf/Config.groovy index 148e54e8..53af343d 100644 --- a/gui/griffon-app/conf/Config.groovy +++ b/gui/griffon-app/conf/Config.groovy @@ -121,4 +121,9 @@ mvcGroups { view = 'com.muwire.gui.ChatRoomView' controller = 'com.muwire.gui.ChatRoomController' } + 'chat-monitor' { + model = 'com.muwire.gui.ChatMonitorModel' + view = 'com.muwire.gui.ChatMonitorView' + controller = 'com.muwire.gui.ChatMonitorController' + } } diff --git a/gui/griffon-app/controllers/com/muwire/gui/ChatMonitorController.groovy b/gui/griffon-app/controllers/com/muwire/gui/ChatMonitorController.groovy new file mode 100644 index 00000000..a37ef85a --- /dev/null +++ b/gui/griffon-app/controllers/com/muwire/gui/ChatMonitorController.groovy @@ -0,0 +1,13 @@ +package com.muwire.gui + +import griffon.core.artifact.GriffonController +import griffon.core.controller.ControllerAction +import griffon.inject.MVCMember +import griffon.metadata.ArtifactProviderFor +import javax.annotation.Nonnull + +@ArtifactProviderFor(GriffonController) +class ChatMonitorController { + @MVCMember @Nonnull + ChatMonitorModel model +} \ No newline at end of file diff --git a/gui/griffon-app/models/com/muwire/gui/ChatMonitorModel.groovy b/gui/griffon-app/models/com/muwire/gui/ChatMonitorModel.groovy new file mode 100644 index 00000000..2f96e5e5 --- /dev/null +++ b/gui/griffon-app/models/com/muwire/gui/ChatMonitorModel.groovy @@ -0,0 +1,46 @@ +package com.muwire.gui + +import javax.annotation.Nonnull + +import griffon.core.artifact.GriffonModel +import griffon.inject.MVCMember +import griffon.transform.Observable +import griffon.metadata.ArtifactProviderFor + +@ArtifactProviderFor(GriffonModel) +class ChatMonitorModel implements ChatNotificator.Listener { + @MVCMember @Nonnull + ChatMonitorView view + + ChatNotificator chatNotificator + def rooms = [] + + void mvcGroupInit(Map args) { + chatNotificator.listener = this + } + + void mvcGroupDestroy() { + chatNotificator.listener = null + } + + public void update() { + rooms.clear() + chatNotificator.roomsWithMessages.each { room, count -> + int dash = room.indexOf('-') + String server = room.substring(0, dash) + String roomName = room.substring(dash + 1) + rooms.add(new ChatRoomEntry(server, roomName, count)) + } + view.updateView() + } + + private static class ChatRoomEntry { + private final String server, room + private final int count + ChatRoomEntry(String server, String room, int count) { + this.server = server + this.room = room + this.count = count + } + } +} \ No newline at end of file diff --git a/gui/griffon-app/views/com/muwire/gui/ChatMonitorView.groovy b/gui/griffon-app/views/com/muwire/gui/ChatMonitorView.groovy new file mode 100644 index 00000000..4ba75398 --- /dev/null +++ b/gui/griffon-app/views/com/muwire/gui/ChatMonitorView.groovy @@ -0,0 +1,67 @@ +package com.muwire.gui + +import griffon.core.artifact.GriffonView +import griffon.inject.MVCMember +import griffon.metadata.ArtifactProviderFor + +import javax.swing.JDialog +import javax.swing.SwingConstants + +import java.awt.BorderLayout +import java.awt.event.WindowAdapter +import java.awt.event.WindowEvent + +import javax.annotation.Nonnull + +@ArtifactProviderFor(GriffonView) +class ChatMonitorView { + @MVCMember @Nonnull + FactoryBuilderSupport builder + @MVCMember @Nonnull + ChatMonitorModel model + + def mainFrame + def dialog + def panel + def roomsTable + + void initUI() { + mainFrame = application.windowManager.findWindow("main-frame") + int rowHeight = application.context.getAsInt("row-height") + dialog = new JDialog(mainFrame, "Chat Monitor", false) + dialog.setResizable(true) + + panel = builder.panel { + borderLayout() + panel(constraints : BorderLayout.NORTH) { + label("Chat rooms with unread messages") + } + scrollPane(constraints : BorderLayout.CENTER) { + roomsTable = table(autoCreateRowSorter : true, rowHeight : rowHeight) { + tableModel(list : model.rooms) { + closureColumn(header : "Server", type: String, read : {it.server}) + closureColumn(header : "Room", type : String, read : {it.room}) + closureColumn(header : "Messages", type : Integer, read : {it.count}) + } + } + } + } + } + + void updateView() { + roomsTable.model.fireTableDataChanged() + } + + void mvcGroupInit(Map args) { + dialog.getContentPane().add(panel) + dialog.pack() + dialog.setLocationRelativeTo(mainFrame) + dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE) + dialog.addWindowListener(new WindowAdapter() { + public void windowClosed(WindowEvent e) { + mvcGroup.destroy() + } + }) + dialog.show() + } +} \ 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 6beda9fc..b5808229 100644 --- a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy @@ -131,6 +131,13 @@ class MainFrameView { env['core'] = model.core mvcGroup.createMVCGroup("certificate-control",env) }) + menuItem("Chat Room Monitor", actionPerformed : { + if (!mvcGroup.getChildrenGroups().containsKey("chat-monitor")) { + def env = [:] + env['chatNotificator'] = chatNotificator + mvcGroup.createMVCGroup("chat-monitor","chat-monitor",env) + } + }) } } borderLayout() diff --git a/gui/src/main/groovy/com/muwire/gui/ChatNotificator.groovy b/gui/src/main/groovy/com/muwire/gui/ChatNotificator.groovy index e98c5b2a..a16f3472 100644 --- a/gui/src/main/groovy/com/muwire/gui/ChatNotificator.groovy +++ b/gui/src/main/groovy/com/muwire/gui/ChatNotificator.groovy @@ -10,6 +10,10 @@ import griffon.core.mvc.MVCGroupManager class ChatNotificator { + public static interface Listener { + void update() + } + private final MVCGroupManager groupManager private boolean chatInFocus @@ -18,6 +22,8 @@ class ChatNotificator { private final Map roomsWithMessages = new HashMap<>() + private Listener listener + ChatNotificator(MVCGroupManager groupManager) { this.groupManager = groupManager } @@ -83,6 +89,7 @@ class ChatNotificator { } private void updateBadge() { + listener?.update() if (!Taskbar.isTaskbarSupported()) return def taskBar = Taskbar.getTaskbar()