From f7e28e04f66faa054ef572c019f1683c072d3db4 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Thu, 31 Oct 2019 14:14:14 +0000 Subject: [PATCH] add a system status panel --- gui/griffon-app/conf/Config.groovy | 5 ++ .../muwire/gui/SystemStatusController.groovy | 34 ++++++++ .../com/muwire/gui/SystemStatusModel.groovy | 24 ++++++ .../views/com/muwire/gui/MainFrameView.groovy | 1 + .../com/muwire/gui/SystemStatusView.groovy | 83 +++++++++++++++++++ 5 files changed, 147 insertions(+) create mode 100644 gui/griffon-app/controllers/com/muwire/gui/SystemStatusController.groovy create mode 100644 gui/griffon-app/models/com/muwire/gui/SystemStatusModel.groovy create mode 100644 gui/griffon-app/views/com/muwire/gui/SystemStatusView.groovy diff --git a/gui/griffon-app/conf/Config.groovy b/gui/griffon-app/conf/Config.groovy index a0257cde..f6965e9c 100644 --- a/gui/griffon-app/conf/Config.groovy +++ b/gui/griffon-app/conf/Config.groovy @@ -41,6 +41,11 @@ mvcGroups { view = 'com.muwire.gui.I2PStatusView' controller = 'com.muwire.gui.I2PStatusController' } + 'system-status' { + model = 'com.muwire.gui.SystemStatusModel' + view = 'com.muwire.gui.SystemStatusView' + controller = 'com.muwire.gui.SystemStatusController' + } 'trust-list' { model = 'com.muwire.gui.TrustListModel' view = 'com.muwire.gui.TrustListView' diff --git a/gui/griffon-app/controllers/com/muwire/gui/SystemStatusController.groovy b/gui/griffon-app/controllers/com/muwire/gui/SystemStatusController.groovy new file mode 100644 index 00000000..87328c02 --- /dev/null +++ b/gui/griffon-app/controllers/com/muwire/gui/SystemStatusController.groovy @@ -0,0 +1,34 @@ +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 SystemStatusController { + @MVCMember @Nonnull + SystemStatusModel model + @MVCMember @Nonnull + SystemStatusView view + + @ControllerAction + void refresh() { + + long totalRam = Runtime.getRuntime().totalMemory() + long usedRam = totalRam - Runtime.getRuntime().freeMemory() + + model.usedRam = usedRam + model.totalRam = totalRam + model.maxRam = Runtime.getRuntime().maxMemory() + model.javaVendor = System.getProperty("java.vendor") + model.javaVersion = System.getProperty("java.version") + } + + @ControllerAction + void close() { + view.dialog.setVisible(false) + mvcGroup.destroy() + } +} \ No newline at end of file diff --git a/gui/griffon-app/models/com/muwire/gui/SystemStatusModel.groovy b/gui/griffon-app/models/com/muwire/gui/SystemStatusModel.groovy new file mode 100644 index 00000000..f6e68958 --- /dev/null +++ b/gui/griffon-app/models/com/muwire/gui/SystemStatusModel.groovy @@ -0,0 +1,24 @@ +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 SystemStatusModel { + @MVCMember @Nonnull + SystemStatusController controller + + @Observable String javaVendor + @Observable String javaVersion + @Observable long usedRam + @Observable long totalRam + @Observable long maxRam + + void mvcGroupInit(Map args) { + controller.refresh() + } +} \ 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 d52b3fd3..12e6a1eb 100644 --- a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy @@ -100,6 +100,7 @@ class MainFrameView { menuItem("MuWire", actionPerformed : {mvcGroup.createMVCGroup("mu-wire-status")}) MuWireSettings muSettings = application.context.get("muwire-settings") menuItem("I2P", enabled : bind {model.routerPresent}, actionPerformed: {mvcGroup.createMVCGroup("i-2-p-status")}) + menuItem("System", actionPerformed : {mvcGroup.createMVCGroup("system-status")}) } } borderLayout() diff --git a/gui/griffon-app/views/com/muwire/gui/SystemStatusView.groovy b/gui/griffon-app/views/com/muwire/gui/SystemStatusView.groovy new file mode 100644 index 00000000..2b3cf3ac --- /dev/null +++ b/gui/griffon-app/views/com/muwire/gui/SystemStatusView.groovy @@ -0,0 +1,83 @@ +package com.muwire.gui + +import griffon.core.artifact.GriffonView +import griffon.inject.MVCMember +import griffon.metadata.ArtifactProviderFor +import net.i2p.data.DataHelper + +import javax.swing.JDialog +import javax.swing.JPanel +import javax.swing.SwingConstants +import javax.swing.border.TitledBorder + +import java.awt.BorderLayout +import java.awt.GridBagConstraints +import java.awt.event.WindowAdapter +import java.awt.event.WindowEvent + +import javax.annotation.Nonnull + +@ArtifactProviderFor(GriffonView) +class SystemStatusView { + @MVCMember @Nonnull + FactoryBuilderSupport builder + @MVCMember @Nonnull + SystemStatusModel model + + def mainFrame + def dialog + def panel + def buttonsPanel + + void initUI() { + mainFrame = application.windowManager.findWindow("main-frame") + + dialog = new JDialog(mainFrame, "System Status", true) + + panel = builder.panel { + gridBagLayout() + panel(border : titledBorder(title : "Java", border : etchedBorder(), titlePosition : TitledBorder.TOP), + constraints : gbc(gridx : 0, gridy: 0, fill : GridBagConstraints.HORIZONTAL, weightx: 100)) { + gridBagLayout() + label(text : "Vendor ", constraints : gbc(gridx:0, gridy:0, anchor : GridBagConstraints.LINE_START, weightx : 100)) + label(text : bind {model.javaVendor}, constraints : gbc(gridx:1, gridy:0, anchor : GridBagConstraints.LINE_END)) + label(text : "Version", constraints : gbc(gridx:0, gridy:1, anchor : GridBagConstraints.LINE_START, weightx : 100)) + label(text : bind {model.javaVersion}, constraints : gbc(gridx:1, gridy:1, anchor : GridBagConstraints.LINE_END)) + } + panel(border : titledBorder(title : "Memory", border : etchedBorder(), titlePosition : TitledBorder.TOP), + constraints : gbc(gridx : 0, gridy: 1, fill : GridBagConstraints.HORIZONTAL, weightx: 100)) { + gridBagLayout() + label(text : "Used", constraints : gbc(gridx:0, gridy:0, anchor : GridBagConstraints.LINE_START, weightx : 100)) + label(text : bind {DataHelper.formatSize2Decimal(model.usedRam,false)+"B"}, constraints : gbc(gridx:1, gridy:0, anchor : GridBagConstraints.LINE_END)) + label(text : "Total", constraints : gbc(gridx:0, gridy:1, anchor : GridBagConstraints.LINE_START, weightx : 100)) + label(text : bind {DataHelper.formatSize2Decimal(model.totalRam,false)+"B"}, constraints : gbc(gridx:1, gridy:1, anchor : GridBagConstraints.LINE_END)) + label(text : "Max", constraints : gbc(gridx:0, gridy:2, anchor : GridBagConstraints.LINE_START, weightx : 100)) + label(text : bind {DataHelper.formatSize2Decimal(model.maxRam,false)+"B"}, constraints : gbc(gridx:1, gridy:2, anchor : GridBagConstraints.LINE_END)) + } + buttonsPanel = builder.panel { + gridBagLayout() + button(text : "Refresh", constraints: gbc(gridx: 0, gridy: 0), refreshAction) + button(text : "Close", constraints : gbc(gridx : 1, gridy :0), closeAction) + } + } + } + + void mvcGroupInit(Map args) { + JPanel statusPanel = new JPanel() + statusPanel.setLayout(new BorderLayout()) + statusPanel.add(panel, BorderLayout.CENTER) + statusPanel.add(buttonsPanel, BorderLayout.SOUTH) + + dialog.getContentPane().add(statusPanel) + dialog.pack() + dialog.setResizable(false) + 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