package org.gudy.azureus2.ui.swt.views.configsections; import org.gudy.azureus2.ui.swt.plugins.UISWTConfigSection; import org.gudy.azureus2.ui.swt.views.stats.TransferStatsView; import org.gudy.azureus2.ui.swt.config.*; import org.gudy.azureus2.ui.swt.Messages; import org.gudy.azureus2.ui.swt.Utils; import org.gudy.azureus2.ui.swt.mainwindow.Cursors; import org.gudy.azureus2.ui.swt.mainwindow.Colors; import org.gudy.azureus2.plugins.ui.config.ConfigSection; import org.gudy.azureus2.core3.config.COConfigurationManager; import org.gudy.azureus2.core3.config.impl.TransferSpeedValidator; import org.gudy.azureus2.core3.internat.MessageText; import org.gudy.azureus2.core3.util.DisplayFormatters; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseAdapter; import org.eclipse.swt.events.MouseEvent; import com.aelitis.azureus.core.AzureusCoreFactory; import com.aelitis.azureus.core.speedmanager.SpeedManager; import com.aelitis.azureus.core.speedmanager.SpeedManagerLimitEstimate; import com.aelitis.azureus.core.speedmanager.SpeedManagerListener; import com.aelitis.azureus.core.speedmanager.impl.SpeedManagerImpl; /** * Created on Jun 13, 2007 * Created by Alan Snyder * Copyright (C) 2007 Aelitis, All Rights Reserved. * <p/> * 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. * <p/> * AELITIS, SAS au capital de 63.529,40 euros * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France. */ public class ConfigSectionTransferAutoSpeedSelect implements UISWTConfigSection { private final String CFG_PREFIX = "ConfigView.section.transfer.autospeed."; StringListParameter versionList; BooleanParameter enableAutoSpeed; BooleanParameter enableAutoSpeedWhileSeeding; /** * Returns section you want your configuration panel to be under. * See SECTION_* constants. To add a subsection to your own ConfigSection, * return the configSectionGetName result of your parent.<br> */ public String configSectionGetParentSection() { return ConfigSection.SECTION_TRANSFER; } /** * In order for the plugin to display its section correctly, a key in the * Plugin language file will need to contain * <TT>ConfigView.section.<i><configSectionGetName() result></i>=The Section name.</TT><br> * * @return The name of the configuration section */ public String configSectionGetName() { return "transfer.select"; } /** * User selected Save. * All saving of non-plugin tabs have been completed, as well as * saving of plugins that implement org.gudy.azureus2.plugins.ui.config * parameters. */ public void configSectionSave() { } /** * Config view is closing */ public void configSectionDelete() { } public int maxUserMode() { return 0; } /** * Create your own configuration panel here. It can be anything that inherits * from SWT's Composite class. * Please be mindfull of small screen resolutions * * @param parent The parent of your configuration panel * @return your configuration panel */ public Composite configSectionCreate(final Composite parent) { GridData gridData; Composite cSection = new Composite(parent, SWT.NULL); gridData = new GridData(GridData.VERTICAL_ALIGN_FILL|GridData.HORIZONTAL_ALIGN_FILL); cSection.setLayoutData(gridData); GridLayout subPanel = new GridLayout(); subPanel.numColumns = 3; cSection.setLayout(subPanel); //V1, V2 ... drop down. //enable auto-speed beta /////////////////////////////////// // AutoSpeed Beta mode group /////////////////////////////////// //Beta-mode grouping. Group modeGroup = new Group(cSection, SWT.NULL); Messages.setLanguageText(modeGroup,"ConfigTransferAutoSpeed.algorithm.selector"); GridLayout modeLayout = new GridLayout(); modeLayout.numColumns = 3; modeGroup.setLayout(modeLayout); gridData = new GridData(GridData.FILL_HORIZONTAL); modeGroup.setLayoutData(gridData); //Need a drop down to select which method will be used. Label label = new Label(modeGroup, SWT.NULL); Messages.setLanguageText(label,"ConfigTransferAutoSpeed.algorithm"); gridData = new GridData(); gridData.widthHint = 50; label.setLayoutData(gridData); String AutoSpeedClassic = MessageText.getString("ConfigTransferAutoSpeed.auto.speed.classic"); String AutoSpeedBeta = MessageText.getString("ConfigTransferAutoSpeed.auto.speed.beta"); String[] modeNames = { AutoSpeedClassic, AutoSpeedBeta }; String[] modes = { "1", "2", }; //versionList = new StringListParameter(modeGroup, // SpeedManagerImpl.CONFIG_VERSION_STR, // "1", // modeNames,modes,true); versionList = new StringListParameter(modeGroup,SpeedManagerImpl.CONFIG_VERSION_STR, modeNames, modes); long verNum = COConfigurationManager.getLongParameter( SpeedManagerImpl.CONFIG_VERSION ); if( verNum==1 ){ //SpeedManagerAlgorithmProviderV1 versionList.setValue(modes[0]); }else if( verNum==2 ){ //SpeedManagerAlgorithmProviderV2 versionList.setValue(modes[1]); }else{ //Default is currently version ...V1. versionList.setValue(modes[0]); //ToDo: log this condition. } versionList.addChangeListener( new ConvertToLongChangeListener() ); //spacer Label spacer = new Label(modeGroup, SWT.NULL); gridData = new GridData(); gridData.horizontalSpan=3; spacer.setLayoutData(gridData); //To enable the beta. gridData = new GridData(); gridData.horizontalIndent = 20; gridData.horizontalSpan = 2; enableAutoSpeed = new BooleanParameter(modeGroup, TransferSpeedValidator.AUTO_UPLOAD_ENABLED_CONFIGKEY,CFG_PREFIX+"enableauto"); enableAutoSpeed.setLayoutData(gridData); //enableAutoSpeed.addChangeListener( new GroupModeChangeListener() ); spacer = new Label(modeGroup, SWT.NULL); //AutoSpeed while seeding enabled. enableAutoSpeedWhileSeeding = new BooleanParameter(modeGroup, "Auto Upload Speed Seeding Enabled",CFG_PREFIX+"enableautoseeding"); gridData = new GridData(); gridData.horizontalIndent = 20; gridData.horizontalSpan = 2; enableAutoSpeedWhileSeeding.setLayoutData(gridData); enableAutoSpeed.setAdditionalActionPerformer( new ChangeSelectionActionPerformer( enableAutoSpeedWhileSeeding.getControls(), true )); spacer = new Label(modeGroup, SWT.NULL); spacer = new Label(cSection, SWT.NULL); gridData = new GridData(); gridData.horizontalSpan=3; spacer.setLayoutData(gridData); // NETWORK GROUP Group networkGroup = new Group(cSection, SWT.NULL); //networkGroup.addControlListener(new Utils.LabelWrapControlListener()); Messages.setLanguageText(networkGroup,CFG_PREFIX+"networks"); GridLayout networksLayout = new GridLayout(); networksLayout.numColumns = 5; networkGroup.setLayout(networksLayout); gridData = new GridData(GridData.FILL_HORIZONTAL); networkGroup.setLayoutData(gridData); // asn label = new Label(networkGroup, SWT.NULL); Messages.setLanguageText(label,"SpeedView.stats.asn"); final Label asn_label = new Label(networkGroup, SWT.NULL); gridData = new GridData(); gridData.horizontalSpan = 4; gridData.grabExcessHorizontalSpace = true; asn_label.setLayoutData(gridData); // up cap label = new Label(networkGroup, SWT.NULL); Messages.setLanguageText(label,"SpeedView.stats.estupcap"); gridData = new GridData(); gridData.horizontalIndent = 20; label.setLayoutData(gridData); final Label up_cap = new Label(networkGroup, SWT.NULL); gridData = new GridData(GridData.FILL_HORIZONTAL); gridData.horizontalSpan = 4; up_cap.setLayoutData(gridData); // down cap label = new Label(networkGroup, SWT.NULL); Messages.setLanguageText(label,"SpeedView.stats.estdowncap"); gridData = new GridData(); gridData.horizontalIndent = 20; label.setLayoutData(gridData); final Label down_cap = new Label(networkGroup, SWT.NULL); gridData = new GridData(GridData.FILL_HORIZONTAL); gridData.horizontalSpan = 4; down_cap.setLayoutData(gridData); final SpeedManager sm = AzureusCoreFactory.getSingleton().getSpeedManager(); final TransferStatsView.limitToTextHelper limit_to_text = new TransferStatsView.limitToTextHelper(); asn_label.setText( sm.getASN()); up_cap.setText( limit_to_text.getLimitText( sm.getEstimatedUploadCapacityBytesPerSec())); down_cap.setText( limit_to_text.getLimitText( sm.getEstimatedDownloadCapacityBytesPerSec())); // space spacer = new Label(networkGroup, SWT.NULL); gridData = new GridData(); gridData.horizontalSpan=5; spacer.setLayoutData(gridData); // info Label info_label = new Label(networkGroup, SWT.WRAP ); Messages.setLanguageText( info_label, CFG_PREFIX + "network.info", new String[]{ DisplayFormatters.getRateUnit( DisplayFormatters.UNIT_KB )}); info_label.setLayoutData(Utils.getWrappableLabelGridData(5, 0)); // up set label = new Label(networkGroup, SWT.NULL); Messages.setLanguageText(label,"SpeedView.stats.estupcap"); gridData = new GridData(); gridData.horizontalIndent = 20; label.setLayoutData(gridData); String co_up = "AutoSpeed Network Upload Speed (temp)"; String co_up_type = "AutoSpeed Network Upload Speed Type (temp)"; SpeedManagerLimitEstimate up_lim = sm.getEstimatedUploadCapacityBytesPerSec(); COConfigurationManager.setParameter( co_up, up_lim.getBytesPerSec()/1024 ); COConfigurationManager.setParameter( co_up_type, limit_to_text.getSettableType( up_lim )); final IntParameter max_upload = new IntParameter(networkGroup, co_up ); final Label upload_bits = new Label(networkGroup, SWT.NULL); gridData = new GridData(); gridData.widthHint = 80; upload_bits.setLayoutData(gridData); upload_bits.setText(getMBitLimit(limit_to_text,(up_lim.getBytesPerSec()/1024)*1024)); final StringListParameter max_upload_type = new StringListParameter(networkGroup, co_up_type, limit_to_text.getSettableTypes(),limit_to_text.getSettableTypes() ); max_upload_type.addChangeListener( new ParameterChangeAdapter() { public void parameterChanged( Parameter p, boolean caused_internally ) { if ( max_upload_type.isDisposed()){ return; } float type = limit_to_text.textToType( max_upload_type.getValue()); SpeedManagerLimitEstimate existing = sm.getEstimatedUploadCapacityBytesPerSec(); if ( existing.getEstimateType() != type ){ sm.setEstimatedUploadCapacityBytesPerSec( existing.getBytesPerSec(), type ); } } }); max_upload.addChangeListener( new ParameterChangeAdapter() { public void parameterChanged( Parameter p, boolean caused_internally ) { if ( max_upload.isDisposed()){ return; } int value = max_upload.getValue() * 1024; SpeedManagerLimitEstimate existing = sm.getEstimatedUploadCapacityBytesPerSec(); if ( existing.getBytesPerSec() != value ){ sm.setEstimatedUploadCapacityBytesPerSec( value, existing.getEstimateType()); } } }); label = new Label(networkGroup, SWT.NULL); // down set label = new Label(networkGroup, SWT.NULL); Messages.setLanguageText(label,"SpeedView.stats.estdowncap"); gridData = new GridData(); gridData.horizontalIndent = 20; label.setLayoutData(gridData); SpeedManagerLimitEstimate down_lim = sm.getEstimatedDownloadCapacityBytesPerSec(); String co_down = "AutoSpeed Network Download Speed (temp)"; String co_down_type = "AutoSpeed Network Download Speed Type (temp)"; COConfigurationManager.setParameter( co_down, down_lim.getBytesPerSec()/1024 ); COConfigurationManager.setParameter( co_down_type, limit_to_text.getSettableType( down_lim )); final IntParameter max_download = new IntParameter(networkGroup, co_down ); final Label download_bits = new Label(networkGroup, SWT.NULL); gridData = new GridData(); gridData.widthHint = 80; download_bits.setLayoutData(gridData); download_bits.setText(getMBitLimit(limit_to_text,(down_lim.getBytesPerSec()/1024)*1024)); final StringListParameter max_download_type = new StringListParameter(networkGroup, co_down_type, limit_to_text.getSettableTypes(),limit_to_text.getSettableTypes() ); max_download_type.addChangeListener( new ParameterChangeAdapter() { public void parameterChanged( Parameter p, boolean caused_internally ) { if ( max_download_type.isDisposed()){ return; } float type = limit_to_text.textToType( max_download_type.getValue()); SpeedManagerLimitEstimate existing = sm.getEstimatedDownloadCapacityBytesPerSec(); if ( existing.getEstimateType() != type ){ sm.setEstimatedDownloadCapacityBytesPerSec( existing.getBytesPerSec(), type ); } } }); max_download.addChangeListener( new ParameterChangeAdapter() { public void parameterChanged( Parameter p, boolean caused_internally ) { if ( max_download.isDisposed()){ return; } int value = max_download.getValue() * 1024; SpeedManagerLimitEstimate existing = sm.getEstimatedDownloadCapacityBytesPerSec(); if ( existing.getBytesPerSec() != value ){ sm.setEstimatedDownloadCapacityBytesPerSec( value, existing.getEstimateType()); } } }); label = new Label(networkGroup, SWT.NULL); // reset Label reset_label = new Label(networkGroup, SWT.NULL ); Messages.setLanguageText(reset_label, CFG_PREFIX + "resetnetwork"); Button reset_button = new Button(networkGroup, SWT.PUSH); Messages.setLanguageText(reset_button, CFG_PREFIX + "reset.button" ); reset_button.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { sm.reset(); } }); sm.addListener( new SpeedManagerListener() { private final SpeedManagerListener listener = this; public void propertyChanged( final int property ) { Utils.execSWTThread( new Runnable() { public void run() { if ( asn_label.isDisposed()){ sm.removeListener( listener ); }else{ if ( property == SpeedManagerListener.PR_ASN ){ asn_label.setText( sm.getASN()); }else if ( property == SpeedManagerListener.PR_UP_CAPACITY ){ SpeedManagerLimitEstimate limit = sm.getEstimatedUploadCapacityBytesPerSec(); up_cap.setText( limit_to_text.getLimitText( limit )); upload_bits.setText(getMBitLimit(limit_to_text, limit.getBytesPerSec())); max_upload.setValue( limit.getBytesPerSec()/1024 ); max_upload_type.setValue( limit_to_text.getSettableType( limit )); }else if ( property == SpeedManagerListener.PR_DOWN_CAPACITY ){ SpeedManagerLimitEstimate limit = sm.getEstimatedDownloadCapacityBytesPerSec(); down_cap.setText( limit_to_text.getLimitText( limit )); download_bits.setText(getMBitLimit(limit_to_text, limit.getBytesPerSec())); max_download.setValue( limit.getBytesPerSec()/1024 ); max_download_type.setValue( limit_to_text.getSettableType( limit )); } } } }); } }); //Add listeners to disable setting when needed. //spacer spacer = new Label(cSection, SWT.NULL); gridData = new GridData(); gridData.horizontalSpan=3; spacer.setLayoutData(gridData); ///////////////////////////////////////// //Add group to link to Azureus Wiki page. ///////////////////////////////////////// Group azWiki = new Group(cSection, SWT.WRAP); gridData = new GridData(); gridData.widthHint = 350; azWiki.setLayoutData(gridData); GridLayout layout = new GridLayout(); layout.numColumns = 1; layout.marginHeight = 1; azWiki.setLayout(layout); azWiki.setText(MessageText.getString("Utils.link.visit")); final Label linkLabel = new Label(azWiki, SWT.NULL); linkLabel.setText( "Azureus Wiki AutoSpeed (beta)" ); linkLabel.setData("http://azureus.aelitis.com/wiki/index.php/Auto_Speed"); linkLabel.setCursor(Cursors.handCursor); linkLabel.setForeground(Colors.blue); gridData = new GridData(); gridData.horizontalIndent = 10; linkLabel.setLayoutData( gridData ); linkLabel.addMouseListener(new MouseAdapter() { public void mouseDoubleClick(MouseEvent arg0) { Utils.launch((String) ((Label) arg0.widget).getData()); } public void mouseUp(MouseEvent arg0) { Utils.launch((String) ((Label) arg0.widget).getData()); } }); return cSection; }//configSectionCreate class ConvertToLongChangeListener implements ParameterChangeListener{ public void parameterChanged(Parameter p, boolean caused_internally) { try{ //StringList doesn't work with Long parameters, so need to convert here. String str = COConfigurationManager.getStringParameter(SpeedManagerImpl.CONFIG_VERSION_STR); long asLong = Long.parseLong( str ); COConfigurationManager.setParameter(SpeedManagerImpl.CONFIG_VERSION, asLong ); }catch(Throwable t){ //ToDo: log an error. COConfigurationManager.setParameter(SpeedManagerImpl.CONFIG_VERSION, 1); } } /** * An int parameter is about to change. * <p/> * Not called when parameter set via COConfigurationManager.setParameter * * @param p - * @param toValue - */ public void intParameterChanging(Parameter p, int toValue) { } /** * A boolean parameter is about to change. * <p/> * Not called when parameter set via COConfigurationManager.setParameter * * @param p - * @param toValue - */ public void booleanParameterChanging(Parameter p, boolean toValue) { } /** * A String parameter is about to change. * <p/> * Not called when parameter set via COConfigurationManager.setParameter * * @param p - * @param toValue - */ public void stringParameterChanging(Parameter p, String toValue) { } /** * A double/float parameter is about to change. * <p/> * Not called when parameter set via COConfigurationManager.setParameter * * @param owner - * @param toValue - */ public void floatParameterChanging(Parameter owner, double toValue) { } } protected String getMBitLimit( TransferStatsView.limitToTextHelper helper, long value ) { return("("+(value==0?helper.getUnlimited():DisplayFormatters.formatByteCountToBitsPerSec( value ))+")" ); } }