📄 mainstatusbar.java
字号:
/*
* Created on Mar 20, 2006 6:40:14 PM
* Copyright (C) 2006 Aelitis, All Rights Reserved.
*
* This program 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; either version 2
* of the License, or (at your option) any later version.
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* AELITIS, SAS au capital de 46,603.30 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*/
package org.gudy.azureus2.ui.swt.mainwindow;
import java.text.NumberFormat;
import java.util.ArrayList;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.StackLayout;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.config.ParameterListener;
import org.gudy.azureus2.core3.config.impl.TransferSpeedValidator;
import org.gudy.azureus2.core3.global.GlobalManager;
import org.gudy.azureus2.core3.global.GlobalManagerStats;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.ipfilter.IpFilter;
import org.gudy.azureus2.core3.stats.transfer.OverallStats;
import org.gudy.azureus2.core3.stats.transfer.StatsFactory;
import org.gudy.azureus2.core3.util.AEMonitor;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.Constants;
import org.gudy.azureus2.core3.util.DisplayFormatters;
import org.gudy.azureus2.ui.swt.BlockedIpsWindow;
import org.gudy.azureus2.ui.swt.ImageRepository;
import org.gudy.azureus2.ui.swt.Messages;
import org.gudy.azureus2.ui.swt.Utils;
import org.gudy.azureus2.ui.swt.update.UpdateProgressWindow;
import org.gudy.azureus2.ui.swt.update.UpdateWindow;
import com.aelitis.azureus.core.AzureusCore;
import com.aelitis.azureus.core.AzureusCoreFactory;
import com.aelitis.azureus.core.dht.DHT;
import com.aelitis.azureus.core.networkmanager.NetworkManager;
import com.aelitis.azureus.plugins.dht.DHTPlugin;
import com.aelitis.azureus.ui.UIFunctions;
import com.aelitis.azureus.ui.UIFunctionsManager;
import org.gudy.azureus2.plugins.PluginInterface;
import org.gudy.azureus2.plugins.PluginManager;
import org.gudy.azureus2.plugins.network.ConnectionManager;
import org.gudy.azureus2.plugins.ui.config.ConfigSection;
import org.gudy.azureus2.plugins.update.*;
/**
* Moved from MainWindow and GUIUpdater
*/
public class MainStatusBar {
/**
* Warning status icon identifier
*/
private static final String STATUS_ICON_WARN = "sb_warning";
private AEMonitor this_mon = new AEMonitor("MainStatusBar");
private ArrayList update_stack = new ArrayList();
private UpdateWindow updateWindow;
private Composite statusBar;
private Composite statusArea;
private StackLayout layoutStatusArea;
private CLabel statusText;
private String statusTextKey = "";
private String statusImageKey = null;
private Composite statusUpdate;
private Label statusUpdateLabel;
private ProgressBar statusUpdateProgressBar;
private CLabel ipBlocked;
private CLabel srStatus;
private CLabel natStatus;
private CLabel dhtStatus;
private CLabel statusDown;
private CLabel statusUp;
private Display display;
// For Refresh..
private long last_sr_ratio = -1;
private int last_sr_status = -1;
private int lastNATstatus = -1;
private int lastDHTstatus = -1;
private long lastDHTcount = -1;
private NumberFormat numberFormat;
private OverallStats overall_stats;
private ConnectionManager connection_manager;
private DHTPlugin dhtPlugin;
private GlobalManager globalManager;
private AzureusCore azureusCore;
private UIFunctions uiFunctions;
/**
*
*/
public MainStatusBar() {
numberFormat = NumberFormat.getInstance();
overall_stats = StatsFactory.getStats();
PluginManager pm = AzureusCoreFactory.getSingleton().getPluginManager();
connection_manager = pm.getDefaultPluginInterface().getConnectionManager();
PluginInterface dht_pi = pm.getPluginInterfaceByClass(DHTPlugin.class);
if (dht_pi != null) {
dhtPlugin = (DHTPlugin) dht_pi.getPlugin();
}
}
/**
*
* @return composite holiding the statusbar
*/
public Composite initStatusBar(final AzureusCore core, final GlobalManager globalManager,
Display display, final Composite parent)
{
this.display = display;
this.globalManager = globalManager;
this.azureusCore = core;
this.uiFunctions = UIFunctionsManager.getUIFunctions();
FormData formData;
//final int borderFlag = (Constants.isOSX) ? SWT.SHADOW_NONE : SWT.SHADOW_IN;
final int borderFlag = SWT.SHADOW_NONE;
statusBar = new Composite(parent, SWT.NONE);
GridLayout layout_status = new GridLayout();
layout_status.numColumns = 7;
layout_status.horizontalSpacing = 0;
layout_status.verticalSpacing = 0;
layout_status.marginHeight = 0;
if (Constants.isOSX) {
// OSX has a resize widget on the bottom right. It's about 15px wide.
try {
layout_status.marginRight = 15;
} catch (NoSuchFieldError e) {
// Pre SWT 3.1
layout_status.marginWidth = 15;
}
} else {
layout_status.marginWidth = 0;
}
statusBar.setLayout(layout_status);
GridData gridData;
//Composite with StackLayout
statusArea = new Composite(statusBar, SWT.NONE);
gridData = new GridData(GridData.FILL_BOTH);
statusArea.setLayoutData(gridData);
layoutStatusArea = new StackLayout();
statusArea.setLayout(layoutStatusArea);
//Either the Status Text
statusText = new CLabel(statusArea, borderFlag);
gridData = new GridData(GridData.FILL_HORIZONTAL
| GridData.VERTICAL_ALIGN_FILL);
statusText.setLayoutData(gridData);
// This is the highest image displayed on the statusbar
Image image = ImageRepository.getImage(STATUS_ICON_WARN);
int imageHeight = (image == null) ? 20 : image.getBounds().height;
GC gc = new GC(statusText);
// add 6, because CLabel forces a 3 pixel indent
int height = Math.max(imageHeight, gc.getFontMetrics().getHeight()) + 6;
gc.dispose();
formData = new FormData();
formData.height = height;
formData.bottom = new FormAttachment(100, 0); // 2 params for Pre SWT 3.0
formData.left = new FormAttachment(0, 0); // 2 params for Pre SWT 3.0
formData.right = new FormAttachment(100, 0); // 2 params for Pre SWT 3.0
statusBar.setLayoutData(formData);
Listener listener = new Listener() {
public void handleEvent(Event e) {
if (updateWindow != null) {
updateWindow.show();
}
}
};
statusText.addListener(SWT.MouseUp, listener);
statusText.addListener(SWT.MouseDoubleClick, listener);
//Or a composite with a label, a progressBar and a button
statusUpdate = new Composite(statusArea, SWT.NULL);
gridData = new GridData(GridData.FILL_HORIZONTAL
| GridData.VERTICAL_ALIGN_FILL);
statusUpdate.setLayoutData(gridData);
GridLayout layoutStatusUpdate = new GridLayout(2, false);
layoutStatusUpdate.marginHeight = 0;
layoutStatusUpdate.marginWidth = 0;
statusUpdate.setLayout(layoutStatusUpdate);
statusUpdateLabel = new Label(statusUpdate, SWT.NULL);
gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
statusUpdateLabel.setLayoutData(gridData);
Messages.setLanguageText(statusUpdateLabel,
"MainWindow.statusText.checking");
Messages.setLanguageText(statusUpdateLabel,
"MainWindow.status.update.tooltip");
statusUpdateLabel.addMouseListener(new MouseAdapter() {
public void mouseDoubleClick(MouseEvent arg0) {
showUpdateProgressWindow();
}
});
final int progressFlag = (Constants.isOSX) ? SWT.INDETERMINATE
: SWT.HORIZONTAL;
statusUpdateProgressBar = new ProgressBar(statusUpdate, progressFlag);
gridData = new GridData(GridData.FILL_BOTH);
statusUpdateProgressBar.setLayoutData(gridData);
Messages.setLanguageText(statusUpdateProgressBar,
"MainWindow.status.update.tooltip");
statusUpdateProgressBar.addMouseListener(new MouseAdapter() {
public void mouseDoubleClick(MouseEvent arg0) {
showUpdateProgressWindow();
}
});
layoutStatusArea.topControl = statusText;
statusBar.layout();
srStatus = new CLabelPadding(statusBar, borderFlag);
srStatus.setText(MessageText.getString("SpeedView.stats.ratio"));
COConfigurationManager.addAndFireParameterListener("Status Area Show SR",
new ParameterListener() {
public void parameterChanged(String parameterName) {
srStatus.setVisible(COConfigurationManager.getBooleanParameter(
parameterName));
statusBar.layout();
}
});
natStatus = new CLabelPadding(statusBar, borderFlag);
natStatus.setText("");
COConfigurationManager.addAndFireParameterListener("Status Area Show NAT",
new ParameterListener() {
public void parameterChanged(String parameterName) {
natStatus.setVisible(COConfigurationManager.getBooleanParameter(
parameterName));
statusBar.layout();
}
});
dhtStatus = new CLabelPadding(statusBar, borderFlag);
dhtStatus.setText("");
dhtStatus.setToolTipText(MessageText
.getString("MainWindow.dht.status.tooltip"));
COConfigurationManager.addAndFireParameterListener("Status Area Show DDB",
new ParameterListener() {
public void parameterChanged(String parameterName) {
dhtStatus.setVisible(COConfigurationManager.getBooleanParameter(
parameterName));
statusBar.layout();
}
});
ipBlocked = new CLabelPadding(statusBar, borderFlag);
ipBlocked.setText("{} IPs:"); //$NON-NLS-1$
Messages.setLanguageText(ipBlocked, "MainWindow.IPs.tooltip");
ipBlocked.addMouseListener(new MouseAdapter() {
public void mouseDoubleClick(MouseEvent arg0) {
BlockedIpsWindow.showBlockedIps(azureusCore, parent.getShell());
}
});
COConfigurationManager.addAndFireParameterListener("Status Area Show IPF",
new ParameterListener() {
public void parameterChanged(String parameterName) {
ipBlocked.setVisible(COConfigurationManager.getBooleanParameter( parameterName));
statusBar.layout();
}
});
statusDown = new CLabelPadding(statusBar, borderFlag);
statusDown.setImage(ImageRepository.getImage("down"));
statusDown
.setText(/*MessageText.getString("ConfigView.download.abbreviated") +*/"n/a");
Messages.setLanguageText(statusDown,
"MainWindow.status.updowndetails.tooltip");
Listener lStats = new Listener() {
public void handleEvent(Event e) {
uiFunctions.showStats();
}
};
statusUp = new CLabelPadding(statusBar, borderFlag);
statusUp.setImage(ImageRepository.getImage("up"));
statusUp
.setText(/*MessageText.getString("ConfigView.upload.abbreviated") +*/"n/a");
Messages.setLanguageText(statusUp,
"MainWindow.status.updowndetails.tooltip");
statusDown.addListener(SWT.MouseDoubleClick, lStats);
statusUp.addListener(SWT.MouseDoubleClick, lStats);
Listener lDHT = new Listener() {
public void handleEvent(Event e) {
uiFunctions.showStatsDHT();
}
};
dhtStatus.addListener(SWT.MouseDoubleClick, lDHT);
Listener lSR = new Listener() {
public void handleEvent(Event e) {
uiFunctions.showStatsTransfers();
OverallStats stats = StatsFactory.getStats();
long ratio = (1000 * stats.getUploadedBytes() / (stats
.getDownloadedBytes() + 1));
if (ratio < 900) {
Utils
.launch(Constants.AZUREUS_WIKI + "Share_Ratio");
}
}
};
srStatus.addListener(SWT.MouseDoubleClick, lSR);
Listener lNAT = new Listener() {
public void handleEvent(Event e) {
uiFunctions.showConfig(ConfigSection.SECTION_CONNECTION);
if (azureusCore.getPluginManager().getDefaultPluginInterface()
.getConnectionManager().getNATStatus() != ConnectionManager.NAT_OK) {
Utils
.launch(Constants.AZUREUS_WIKI + "NAT_problem");
}
}
};
natStatus.addListener(SWT.MouseDoubleClick, lNAT);
// Status Bar Menu construction
final Menu menuUpSpeed = new Menu(statusBar.getShell(), SWT.POP_UP);
menuUpSpeed.addListener(SWT.Show, new Listener() {
public void handleEvent(Event e) {
SelectableSpeedMenu.generateMenuItems(menuUpSpeed, core, globalManager,
true);
}
});
statusUp.setMenu(menuUpSpeed);
final Menu menuDownSpeed = new Menu(statusBar.getShell(), SWT.POP_UP);
menuDownSpeed.addListener(SWT.Show, new Listener() {
public void handleEvent(Event e) {
SelectableSpeedMenu.generateMenuItems(menuDownSpeed, core,
globalManager, false);
}
});
statusDown.setMenu(menuDownSpeed);
addUpdateListener();
return statusBar;
}
/**
*
* @param keyedSentence
*/
public void setStatusText(String keyedSentence) {
this.statusTextKey = keyedSentence == null ? "" : keyedSentence;
statusImageKey = null;
if (statusTextKey.length() == 0) { // reset
if (Constants.isCVSVersion()) {
statusTextKey = "MainWindow.status.unofficialversion ("
+ Constants.AZUREUS_VERSION + ")";
statusImageKey = STATUS_ICON_WARN;
} else if (!Constants.isOSX) { //don't show official version numbers for OSX L&F
statusTextKey = Constants.AZUREUS_NAME + " "
+ Constants.AZUREUS_VERSION;
}
}
updateStatusText();
}
/**
*
*
*/
public void updateStatusText() {
if (display == null || display.isDisposed())
return;
final String text;
if (updateWindow != null) {
text = "MainWindow.updateavail";
} else {
text = this.statusTextKey;
}
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
if (statusText != null && !statusText.isDisposed()) {
statusText.setText(MessageText.getStringForSentence(text));
statusText.setImage((statusImageKey == null) ? null : ImageRepository
.getImage(statusImageKey));
}
}
});
}
/**
*
*
*/
public void refreshStatusText() {
if (statusText != null && !statusText.isDisposed())
statusText.update();
}
/**
*
* @param updateWindow
*/
public void setUpdateNeeded(UpdateWindow updateWindow) {
this.updateWindow = updateWindow;
if (updateWindow != null) {
statusText.setCursor(Cursors.handCursor);
statusText.setForeground(Colors.colorWarning);
updateStatusText();
} else {
statusText.setCursor(null);
statusText.setForeground(null);
updateStatusText();
}
}
private void addUpdateListener() {
azureusCore.getPluginManager().getDefaultPluginInterface()
.getUpdateManager().addListener(new UpdateManagerListener() {
public void checkInstanceCreated(UpdateCheckInstance instance) {
new updateStatusChanger(instance);
}
});
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -