diff --git a/core/src/main/groovy/com/muwire/core/hostcache/HostCache.groovy b/core/src/main/groovy/com/muwire/core/hostcache/HostCache.groovy index d59e1a37..a19f014a 100644 --- a/core/src/main/groovy/com/muwire/core/hostcache/HostCache.groovy +++ b/core/src/main/groovy/com/muwire/core/hostcache/HostCache.groovy @@ -105,6 +105,22 @@ class HostCache extends Service { Collections.shuffle(rv) rv[0..n-1] } + + int countFailingHosts() { + List rv = new ArrayList<>(hosts.keySet()) + rv.retainAll { + hosts[it].isFailed() + } + rv.size() + } + + int countHopelessHosts() { + List rv = new ArrayList<>(hosts.keySet()) + rv.retainAll { + hosts[it].isHopeless() + } + rv.size() + } void load() { if (storage.exists()) { diff --git a/gui/griffon-app/controllers/com/muwire/gui/MuWireStatusController.groovy b/gui/griffon-app/controllers/com/muwire/gui/MuWireStatusController.groovy index 9c7dca0c..3a9a3026 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/MuWireStatusController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/MuWireStatusController.groovy @@ -31,6 +31,9 @@ class MuWireStatusController { model.outgoingConnections = outgoing model.knownHosts = core.hostCache.hosts.size() + model.failingHosts = core.hostCache.countFailingHosts() + model.hopelessHosts = core.hostCache.countHopelessHosts() + model.sharedFiles = core.fileManager.fileToSharedFile.size() diff --git a/gui/griffon-app/models/com/muwire/gui/MuWireStatusModel.groovy b/gui/griffon-app/models/com/muwire/gui/MuWireStatusModel.groovy index 6d9516ae..68b7004e 100644 --- a/gui/griffon-app/models/com/muwire/gui/MuWireStatusModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/MuWireStatusModel.groovy @@ -16,6 +16,8 @@ class MuWireStatusModel { @Observable int incomingConnections @Observable int outgoingConnections @Observable int knownHosts + @Observable int failingHosts + @Observable int hopelessHosts @Observable int sharedFiles @Observable int downloads diff --git a/gui/griffon-app/views/com/muwire/gui/MuWireStatusView.groovy b/gui/griffon-app/views/com/muwire/gui/MuWireStatusView.groovy index c6a10da1..6e13a96b 100644 --- a/gui/griffon-app/views/com/muwire/gui/MuWireStatusView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/MuWireStatusView.groovy @@ -7,10 +7,12 @@ import griffon.metadata.ArtifactProviderFor import javax.swing.JDialog import javax.swing.JPanel import javax.swing.SwingConstants +import javax.swing.border.TitledBorder import com.muwire.core.Core import java.awt.BorderLayout +import java.awt.GridBagConstraints import java.awt.event.WindowAdapter import java.awt.event.WindowEvent @@ -35,16 +37,32 @@ class MuWireStatusView { panel = builder.panel { gridBagLayout() - label(text : "Incoming connections", constraints : gbc(gridx:0, gridy:0)) - label(text : bind {model.incomingConnections}, constraints : gbc(gridx:1, gridy:0)) - label(text : "Outgoing connections", constraints : gbc(gridx:0, gridy:1)) - label(text : bind {model.outgoingConnections}, constraints : gbc(gridx:1, gridy:1)) - label(text : "Known hosts", constraints : gbc(gridx:0, gridy:2)) - label(text : bind {model.knownHosts}, constraints : gbc(gridx:1, gridy:2)) - label(text : "Shared files", constraints : gbc(gridx:0, gridy:3)) - label(text : bind {model.sharedFiles}, constraints : gbc(gridx:1, gridy:3)) - label(text : "Downloads", constraints : gbc(gridx:0, gridy:4)) - label(text : bind {model.downloads}, constraints : gbc(gridx:1, gridy:4)) + panel(border : titledBorder(title : "Connections", border : etchedBorder(), titlePosition : TitledBorder.TOP), + constraints : gbc(gridx : 0, gridy: 0, fill : GridBagConstraints.HORIZONTAL, weightx: 100)) { + gridBagLayout() + label(text : "Incoming", constraints : gbc(gridx:0, gridy:0, anchor : GridBagConstraints.LINE_START, weightx : 100)) + label(text : bind {model.incomingConnections}, constraints : gbc(gridx:1, gridy:0, anchor : GridBagConstraints.LINE_END)) + label(text : "Outgoing", constraints : gbc(gridx:0, gridy:1, anchor : GridBagConstraints.LINE_START, weightx : 100)) + label(text : bind {model.outgoingConnections}, constraints : gbc(gridx:1, gridy:1, anchor : GridBagConstraints.LINE_END)) + } + panel(border : titledBorder(title : "Hosts", border : etchedBorder(), titlePosition : TitledBorder.TOP), + constraints : gbc(gridx : 0, gridy : 1, fill : GridBagConstraints.HORIZONTAL, weightx: 100)) { + gridBagLayout() + label(text : "Known", constraints : gbc(gridx:0, gridy:0, anchor : GridBagConstraints.LINE_START, weightx : 100)) + label(text : bind {model.knownHosts}, constraints : gbc(gridx:1, gridy:0, anchor : GridBagConstraints.LINE_END)) + label(text : "Failing", constraints : gbc(gridx:0, gridy:1, anchor : GridBagConstraints.LINE_START, weightx : 100)) + label(text : bind {model.failingHosts}, constraints : gbc(gridx:1, gridy:1, anchor : GridBagConstraints.LINE_END)) + label(text : "Hopeless", constraints : gbc(gridx:0, gridy:2, anchor : GridBagConstraints.LINE_START, weightx : 100)) + label(text : bind {model.hopelessHosts}, constraints : gbc(gridx:1, gridy:2, anchor : GridBagConstraints.LINE_END)) + } + panel(border : titledBorder(title : "Files", border : etchedBorder(), titlePosition : TitledBorder.TOP), + constraints : gbc(gridx : 0, gridy : 2, fill : GridBagConstraints.HORIZONTAL, weightx: 100)) { + gridBagLayout() + label(text : "Shared", constraints : gbc(gridx:0, gridy:0, anchor : GridBagConstraints.LINE_START, weightx : 100)) + label(text : bind {model.sharedFiles}, constraints : gbc(gridx:1, gridy:0, anchor : GridBagConstraints.LINE_END)) + label(text : "Downloading", constraints : gbc(gridx:0, gridy:1, anchor : GridBagConstraints.LINE_START, weightx : 100)) + label(text : bind {model.downloads}, constraints : gbc(gridx:1, gridy:1, anchor : GridBagConstraints.LINE_END)) + } } buttonsPanel = builder.panel { gridBagLayout() @@ -60,7 +78,8 @@ class MuWireStatusView { statusPanel.add(buttonsPanel, BorderLayout.SOUTH) dialog.getContentPane().add(statusPanel) - dialog.pack() + dialog.setSize(200,300) + dialog.setResizable(false) dialog.setLocationRelativeTo(mainFrame) dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE) dialog.addWindowListener(new WindowAdapter() {