/*
* Copyright 2004 - 2008 Christian Sprajc. All rights reserved.
*
* This file is part of PowerFolder.
*
* PowerFolder is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation.
*
* PowerFolder is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PowerFolder. If not, see <http://www.gnu.org/licenses/>.
*
* $Id$
*/
package de.dal33t.powerfolder.ui;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collection;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import com.jgoodies.forms.builder.PanelBuilder;
import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import de.dal33t.powerfolder.Controller;
import de.dal33t.powerfolder.Member;
import de.dal33t.powerfolder.disk.Folder;
import de.dal33t.powerfolder.disk.FolderRepository;
import de.dal33t.powerfolder.event.FolderRepositoryEvent;
import de.dal33t.powerfolder.event.FolderRepositoryListener;
import de.dal33t.powerfolder.event.NodeManagerAdapter;
import de.dal33t.powerfolder.event.NodeManagerEvent;
import de.dal33t.powerfolder.net.NodeManager;
import de.dal33t.powerfolder.util.Format;
import de.dal33t.powerfolder.util.Translation;
/**
* Displays some network statistics and file statistics.
*
* @author <A HREF="mailto:schaatser@powerfolder.com">Jan van Oosterom</A>
* @version $Revision: 1.8 $
*/
public class NetworkStatisticsPanel extends PFUIComponent {
private JPanel panel;
private JPanel networkStatsPanel;
private JLabel connectedUsers;
private JLabel onlineUsers;
private JLabel knownUsers;
private JLabel publicFolderCount;
private JLabel localFolderCount;
private JLabel publicFoldersSize;
private JLabel localFoldersSize;
private JLabel numberOfPublicFiles;
private JLabel numberOfLocalFiles;
private JLabel reconnectionQueueSize;
private JButton updateButton;
public NetworkStatisticsPanel(Controller controller) {
super(controller);
}
/** returns this ui component, creates it if not available * */
public Component getUIComponent() {
if (panel == null) {
initComponents();
FormLayout layout = new FormLayout("fill:pref:grow",
"fill:pref:grow, pref, pref");
PanelBuilder builder = new PanelBuilder(layout);
CellConstraints cc = new CellConstraints();
builder.add(networkStatsPanel, cc.xy(1, 1));
// builder.addSeparator(null, cc.xy(1, 2));
// builder.add(toolbar, cc.xy(1, 3));
panel = builder.getPanel();
}
update();
return panel;
}
public String getTitle() {
return Translation.getTranslation("network.statistics.title");
}
private void initComponents() {
NodeManager nodeManager = getController().getNodeManager();
// nodeManager.addNodeManagerListener(new MyNodeManagerListener());
FolderRepository repo = getController().getFolderRepository();
// repo.addFolderRepositoryListener(new MyFolderRepositoryListener());
connectedUsers = new JLabel();
onlineUsers = new JLabel();
knownUsers = new JLabel();
publicFolderCount = new JLabel();
localFolderCount = new JLabel();
publicFoldersSize = new JLabel();
localFoldersSize = new JLabel();
numberOfLocalFiles = new JLabel();
numberOfPublicFiles = new JLabel();
reconnectionQueueSize = new JLabel();
updateButton = new JButton(Translation.getTranslation("general.update"));
updateButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
update();
}
});
FormLayout layout = new FormLayout(
"pref, 3dlu, pref",
"pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 3dlu, pref, 6dlu, pref");
PanelBuilder builder = new PanelBuilder(layout);
CellConstraints cc = new CellConstraints();
int row = 1;
builder.add(new JLabel(Translation
.getTranslation("network_statistics_panel.connected_computers")),
cc.xy(1, row));
builder.add(connectedUsers, cc.xy(3, row));
row += 2;
builder.add(new JLabel(Translation
.getTranslation("network_statistics_panel.online_computers")), cc
.xy(1, row));
builder.add(onlineUsers, cc.xy(3, row));
row += 2;
builder.add(new JLabel(Translation
.getTranslation("network_statistics_panel.known_computers")), cc
.xy(1, row));
builder.add(knownUsers, cc.xy(3, row));
row += 2;
builder
.add(
new JLabel(
Translation
.getTranslation("network_statistics_panel.reconnection_queue_size")),
cc.xy(1, row));
builder.add(reconnectionQueueSize, cc.xy(3, row));
row += 2;
builder.add(new JLabel(Translation
.getTranslation("network_statistics_panel.local_folder_count")), cc
.xy(1, row));
builder.add(localFolderCount, cc.xy(3, row));
row += 2;
builder.add(new JLabel(Translation
.getTranslation("network_statistics_panel.number_of_local_files")),
cc.xy(1, row));
builder.add(numberOfLocalFiles, cc.xy(3, row));
row += 2;
builder.add(new JLabel(Translation
.getTranslation("network_statistics_panel.local_folders_size")), cc
.xy(1, row));
builder.add(localFoldersSize, cc.xy(3, row));
row += 2;
builder.add(new JLabel(Translation
.getTranslation("network_statistics_panel.public_folder_count")),
cc.xy(1, row));
builder.add(publicFolderCount, cc.xy(3, row));
row += 2;
builder
.add(
new JLabel(
Translation
.getTranslation("network_statistics_panel.number_of_public_files")),
cc.xy(1, row));
builder.add(numberOfPublicFiles, cc.xy(3, row));
row += 2;
builder.add(new JLabel(Translation
.getTranslation("network_statistics_panel.public_folders_size")),
cc.xy(1, row));
builder.add(publicFoldersSize, cc.xy(3, row));
row += 2;
builder.add(updateButton, cc.xy(3, row));
networkStatsPanel = builder.getPanel();
}
private void update() {
int connected = getController().getNodeManager().countConnectedNodes();
int sConnected = getController().getNodeManager()
.countConnectedSupernodes();
int online = getController().getNodeManager().countOnlineNodes();
int sOnline = getController().getNodeManager().countOnlineSupernodes();
int known = getController().getNodeManager().getNodesAsCollection()
.size();
int sKnown = getController().getNodeManager().countSupernodes();
int nDontConnect = 0;
int nDirectConnect = 0;
for (Member node : getController().getNodeManager()
.getNodesAsCollection())
{
if (node.isDontConnect()) {
nDontConnect++;
}
if (node.isUnableToConnect()) {
nDirectConnect++;
}
}
connectedUsers.setText(connected + " (" + sConnected + ") X: "
+ nDirectConnect + " R: " + nDontConnect + ' ');
onlineUsers.setText(online + " (" + sOnline + ')');
knownUsers.setText(known + " (" + sKnown + ')');
reconnectionQueueSize.setText(""
+ getController().getReconnectManager().countReconnectionQueue());
FolderRepository repo = getController().getFolderRepository();
// List list = repo.getUnjoinedFoldersList();
// for (int i = 0; i < list.size(); i++) {
// FolderInfo folderInfo = (FolderInfo) list.get(i);
// totalUnjoinedBytes += folderInfo.bytesTotal;
// totalUnjoinedFiles += folderInfo.filesCount;
// }
Collection<Folder> folders = repo.getFolders();
long totalJoinedFiles = 0;
long totalJoinedBytes = 0;
for (Folder folder : folders) {
totalJoinedFiles += folder.getKnownItemCount();
totalJoinedBytes += folder.getStatistic().getSize(
getController().getMySelf());
}
long totalUnjoinedBytes = 0;
publicFoldersSize.setText(Format.formatBytes(totalUnjoinedBytes));
localFoldersSize.setText(Format.formatBytes(totalJoinedBytes));
long totalUnjoinedFiles = 0;
numberOfPublicFiles.setText(Format.formatLong(totalUnjoinedFiles));
numberOfLocalFiles.setText(Format.formatLong(totalJoinedFiles));
// int publicFolders = list.size();
int localFolders = repo.getFoldersCount();
publicFolderCount.setText("n/a");
localFolderCount.setText(localFolders + "");
}
private class MyNodeManagerListener extends NodeManagerAdapter {
public void nodeAdded(NodeManagerEvent e) {
update();
}
public void nodeConnected(NodeManagerEvent e) {
update();
}
public void nodeDisconnected(NodeManagerEvent e) {
update();
}
public void nodeRemoved(NodeManagerEvent e) {
update();
}
public boolean fireInEventDispatchThread() {
return true;
}
}
private class MyFolderRepositoryListener implements
FolderRepositoryListener
{
public void folderCreated(FolderRepositoryEvent e) {
update();
}
public void folderRemoved(FolderRepositoryEvent e) {
update();
}
public void maintenanceFinished(FolderRepositoryEvent e) {
update();
}
public void maintenanceStarted(FolderRepositoryEvent e) {
update();
}
public boolean fireInEventDispatchThread() {
return true;
}
}
}