From 1fbb1e7932a8fdfc852f9acd5941bbfea40daf96 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Mon, 11 Nov 2019 16:35:15 +0000 Subject: [PATCH] add chat pane and associated components --- gui/griffon-app/conf/Config.groovy | 10 +++ .../com/muwire/gui/ChatRoomController.groovy | 17 +++++ .../muwire/gui/ChatServerController.groovy | 17 +++++ .../com/muwire/gui/MainFrameController.groovy | 24 +++++++ .../com/muwire/gui/ChatRoomModel.groovy | 14 ++++ .../com/muwire/gui/ChatServerModel.groovy | 21 ++++++ .../com/muwire/gui/MainFrameModel.groovy | 5 ++ .../views/com/muwire/gui/ChatRoomView.groovy | 61 +++++++++++++++++ .../com/muwire/gui/ChatServerView.groovy | 65 +++++++++++++++++++ .../views/com/muwire/gui/MainFrameView.groovy | 26 ++++++++ 10 files changed, 260 insertions(+) create mode 100644 gui/griffon-app/controllers/com/muwire/gui/ChatRoomController.groovy create mode 100644 gui/griffon-app/controllers/com/muwire/gui/ChatServerController.groovy create mode 100644 gui/griffon-app/models/com/muwire/gui/ChatRoomModel.groovy create mode 100644 gui/griffon-app/models/com/muwire/gui/ChatServerModel.groovy create mode 100644 gui/griffon-app/views/com/muwire/gui/ChatRoomView.groovy create mode 100644 gui/griffon-app/views/com/muwire/gui/ChatServerView.groovy diff --git a/gui/griffon-app/conf/Config.groovy b/gui/griffon-app/conf/Config.groovy index b99a2191..148e54e8 100644 --- a/gui/griffon-app/conf/Config.groovy +++ b/gui/griffon-app/conf/Config.groovy @@ -111,4 +111,14 @@ mvcGroups { view = "com.muwire.gui.DownloadPreviewView" controller = "com.muwire.gui.DownloadPreviewController" } + 'chat-server' { + model = 'com.muwire.gui.ChatServerModel' + view = 'com.muwire.gui.ChatServerView' + controller = 'com.muwire.gui.ChatServerController' + } + 'chat-room' { + model = 'com.muwire.gui.ChatRoomModel' + view = 'com.muwire.gui.ChatRoomView' + controller = 'com.muwire.gui.ChatRoomController' + } } diff --git a/gui/griffon-app/controllers/com/muwire/gui/ChatRoomController.groovy b/gui/griffon-app/controllers/com/muwire/gui/ChatRoomController.groovy new file mode 100644 index 00000000..952e5882 --- /dev/null +++ b/gui/griffon-app/controllers/com/muwire/gui/ChatRoomController.groovy @@ -0,0 +1,17 @@ +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 ChatRoomController { + @MVCMember @Nonnull + ChatRoomModel model + + @ControllerAction + void say() { + } +} \ No newline at end of file diff --git a/gui/griffon-app/controllers/com/muwire/gui/ChatServerController.groovy b/gui/griffon-app/controllers/com/muwire/gui/ChatServerController.groovy new file mode 100644 index 00000000..195df6ed --- /dev/null +++ b/gui/griffon-app/controllers/com/muwire/gui/ChatServerController.groovy @@ -0,0 +1,17 @@ +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 ChatServerController { + @MVCMember @Nonnull + ChatServerModel model + + @ControllerAction + void disconnect() { + } +} \ No newline at end of file diff --git a/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy b/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy index ec049d5e..69dfd8a2 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/MainFrameController.groovy @@ -420,7 +420,31 @@ class MainFrameController { Desktop.getDesktop().open(selected[0].file.getParentFile()) } catch (Exception ignored) {} } + + @ControllerAction + void startChatServer() { + model.core.chatServer.start() + model.chatServerRunning = true + + if (!mvcGroup.getChildrenGroups().containsKey("local-chat-server")) { + def params = [:] + params['core'] = model.core + params['host'] = model.core.me + mvcGroup.createMVCGroup("chat-server","local-chat-server", params) + } + } + + @ControllerAction + void stopChatServer() { + model.core.chatServer.stop() + model.chatServerRunning = false + } + @ControllerAction + void connectChatServer() { + + } + void saveMuWireSettings() { core.saveMuSettings() } diff --git a/gui/griffon-app/models/com/muwire/gui/ChatRoomModel.groovy b/gui/griffon-app/models/com/muwire/gui/ChatRoomModel.groovy new file mode 100644 index 00000000..fc379429 --- /dev/null +++ b/gui/griffon-app/models/com/muwire/gui/ChatRoomModel.groovy @@ -0,0 +1,14 @@ +package com.muwire.gui + +import com.muwire.core.Core + +import griffon.core.artifact.GriffonModel +import griffon.transform.Observable +import griffon.metadata.ArtifactProviderFor + +@ArtifactProviderFor(GriffonModel) +class ChatRoomModel { + Core core + String tabName + String room +} \ No newline at end of file diff --git a/gui/griffon-app/models/com/muwire/gui/ChatServerModel.groovy b/gui/griffon-app/models/com/muwire/gui/ChatServerModel.groovy new file mode 100644 index 00000000..4e65dadc --- /dev/null +++ b/gui/griffon-app/models/com/muwire/gui/ChatServerModel.groovy @@ -0,0 +1,21 @@ +package com.muwire.gui + +import com.muwire.core.Core +import com.muwire.core.Persona + +import griffon.core.artifact.GriffonModel +import griffon.transform.Observable +import griffon.metadata.ArtifactProviderFor + +@ArtifactProviderFor(GriffonModel) +class ChatServerModel { + Persona host + Core core + + @Observable boolean disconnectActionEnabled + + + void mvcGroupInit(Map params) { + disconnectActionEnabled = host != core.me // can't disconnect from myself + } +} \ No newline at end of file diff --git a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy index 258e432b..421d7477 100644 --- a/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/MainFrameModel.groovy @@ -117,6 +117,9 @@ class MainFrameModel { @Observable boolean uploadsPaneButtonEnabled @Observable boolean monitorPaneButtonEnabled @Observable boolean trustPaneButtonEnabled + @Observable boolean chatPaneButtonEnabled + + @Observable boolean chatServerRunning @Observable Downloader downloader @@ -218,6 +221,8 @@ class MainFrameModel { core.eventBus.publish(new ContentControlEvent(term : it, regex: true, add: true)) } + chatServerRunning = core.chatServer.running.get() + timer.schedule({ if (core.shutdown.get()) return diff --git a/gui/griffon-app/views/com/muwire/gui/ChatRoomView.groovy b/gui/griffon-app/views/com/muwire/gui/ChatRoomView.groovy new file mode 100644 index 00000000..a051d5d5 --- /dev/null +++ b/gui/griffon-app/views/com/muwire/gui/ChatRoomView.groovy @@ -0,0 +1,61 @@ +package com.muwire.gui + +import griffon.core.artifact.GriffonView +import griffon.inject.MVCMember +import griffon.metadata.ArtifactProviderFor +import javax.swing.SwingConstants + +import java.awt.BorderLayout + +import javax.annotation.Nonnull + +@ArtifactProviderFor(GriffonView) +class ChatRoomView { + @MVCMember @Nonnull + FactoryBuilderSupport builder + @MVCMember @Nonnull + ChatRoomModel model + @MVCMember @Nonnull + ChatRoomController controller + + def pane + def parent + + void initUI() { + pane = builder.panel { + borderLayout() + panel(constraints : BorderLayout.CENTER) { + textArea(editable : false) + } + panel(constraints : BorderLayout.SOUTH) { + borderLayout() + textField(actionPerformed : {controller.say()}, constraints : BorderLayout.CENTER) + button(text : "Say", constraints : BorderLayout.EAST, sayAction) + } + } + } + + void mvcGroupInit(Map args) { + parent = mvcGroup.parentGroup.view.builder.getVariable(model.tabName) + parent.addTab(model.room, pane) + + int index = parent.indexOfComponent(pane) + parent.setSelectedIndex(index) + + def tabPanel = builder.panel { + borderLayout() + panel (constraints : BorderLayout.CENTER) { + label(text : model.room) + } + button(icon : imageIcon("/close_tab.png"), preferredSize: [20, 20], constraints : BorderLayout.EAST, + actionPerformed : closeTab ) + } + parent.setTabComponentAt(index, tabPanel) + } + + def closeTab = { + int index = parent.indexOfComponent(pane) + parent.removeTabAt(index) + mvcGroup.destroy() + } +} \ No newline at end of file diff --git a/gui/griffon-app/views/com/muwire/gui/ChatServerView.groovy b/gui/griffon-app/views/com/muwire/gui/ChatServerView.groovy new file mode 100644 index 00000000..85b53570 --- /dev/null +++ b/gui/griffon-app/views/com/muwire/gui/ChatServerView.groovy @@ -0,0 +1,65 @@ +package com.muwire.gui + +import griffon.core.artifact.GriffonView +import griffon.inject.MVCMember +import griffon.metadata.ArtifactProviderFor +import javax.swing.SwingConstants + +import java.awt.BorderLayout + +import javax.annotation.Nonnull + +@ArtifactProviderFor(GriffonView) +class ChatServerView { + @MVCMember @Nonnull + FactoryBuilderSupport builder + @MVCMember @Nonnull + ChatServerModel model + + def pane + def parent + + void initUI() { + pane = builder.panel { + borderLayout() + tabbedPane(id : model.host.getHumanReadableName()+"-chat-rooms", constraints : BorderLayout.CENTER) + panel(constraints : BorderLayout.SOUTH) { + button(text : "Disconnect", enabled : bind {model.disconnectActionEnabled}, disconnectAction) + } + } + } + + void mvcGroupInit(Map args) { + parent = mvcGroup.parentGroup.view.builder.getVariable("chat-tabs") + parent.addTab(model.host.getHumanReadableName(), pane) + + int index = parent.indexOfComponent(pane) + parent.setSelectedIndex(index) + + def tabPanel + builder.with { + tabPanel = panel { + borderLayout() + panel (constraints : BorderLayout.CENTER) { + String text = model.host == model.core.me ? "Local Server" : model.host.getHumanReadableName() + label(text : text) + } + button(icon : imageIcon("/close_tab.png"), preferredSize: [20, 20], constraints : BorderLayout.EAST, + actionPerformed : closeTab ) + } + } + parent.setTabComponentAt(index, tabPanel) + + def params = [:] + params['core'] = model.core + params['tabName'] = model.host.getHumanReadableName() + "-chat-rooms" + params['room'] = 'Console' + mvcGroup.createMVCGroup("chat-room","Console", params) + } + + def closeTab = { + int index = parent.indexOfComponent(pane) + parent.removeTabAt(index) + mvcGroup.destroy() + } +} \ 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 0c6966f3..b1821783 100644 --- a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy @@ -142,6 +142,7 @@ class MainFrameView { if (settings.showMonitor) button(text: "Monitor", enabled: bind{model.monitorPaneButtonEnabled},actionPerformed : showMonitorWindow) button(text: "Trust", enabled:bind{model.trustPaneButtonEnabled},actionPerformed : showTrustWindow) + button(text: "Chat", enabled : bind{model.chatPaneButtonEnabled}, actionPerformed : showChatWindow) } panel(id: "top-panel", constraints: BorderLayout.CENTER) { cardLayout() @@ -475,6 +476,15 @@ class MainFrameView { } } } + panel(constraints : "chat window") { + borderLayout() + tabbedPane(id : "chat-tabs", constraints : BorderLayout.CENTER) + panel(constraints : BorderLayout.SOUTH) { + button(text : "Start Chat Server", enabled : bind {!model.chatServerRunning}, startChatServerAction) + button(text : "Stop Chat Server", enabled : bind {model.chatServerRunning}, stopChatServerAction) + button(text : "Connect To Remote Server", connectChatServerAction) + } + } } panel (border: etchedBorder(), constraints : BorderLayout.SOUTH) { borderLayout() @@ -986,6 +996,7 @@ class MainFrameView { model.uploadsPaneButtonEnabled = true model.monitorPaneButtonEnabled = true model.trustPaneButtonEnabled = true + model.chatPaneButtonEnabled = true } def showDownloadsWindow = { @@ -996,6 +1007,7 @@ class MainFrameView { model.uploadsPaneButtonEnabled = true model.monitorPaneButtonEnabled = true model.trustPaneButtonEnabled = true + model.chatPaneButtonEnabled = true } def showUploadsWindow = { @@ -1006,6 +1018,7 @@ class MainFrameView { model.uploadsPaneButtonEnabled = false model.monitorPaneButtonEnabled = true model.trustPaneButtonEnabled = true + model.chatPaneButtonEnabled = true } def showMonitorWindow = { @@ -1016,6 +1029,7 @@ class MainFrameView { model.uploadsPaneButtonEnabled = true model.monitorPaneButtonEnabled = false model.trustPaneButtonEnabled = true + model.chatPaneButtonEnabled = true } def showTrustWindow = { @@ -1026,6 +1040,18 @@ class MainFrameView { model.uploadsPaneButtonEnabled = true model.monitorPaneButtonEnabled = true model.trustPaneButtonEnabled = false + model.chatPaneButtonEnabled = true + } + + def showChatWindow = { + def cardsPanel = builder.getVariable("cards-panel") + cardsPanel.getLayout().show(cardsPanel, "chat window") + model.searchesPaneButtonEnabled = true + model.downloadsPaneButtonEnabled = true + model.uploadsPaneButtonEnabled = true + model.monitorPaneButtonEnabled = true + model.trustPaneButtonEnabled = true + model.chatPaneButtonEnabled = false } def showSharedFilesTable = {