/* * Created on 16-Jan-2006 * Created by Paul Gardner * 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.views; import java.util.*; import java.util.List; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.layout.FormLayout; 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.download.DownloadManager; import org.gudy.azureus2.core3.download.DownloadManagerState; import org.gudy.azureus2.core3.download.DownloadManagerStateAttributeListener; import org.gudy.azureus2.core3.global.GlobalManager; import org.gudy.azureus2.core3.global.GlobalManagerFactory; import org.gudy.azureus2.core3.internat.MessageText; import org.gudy.azureus2.core3.util.*; import org.gudy.azureus2.ui.swt.Messages; import org.gudy.azureus2.ui.swt.Utils; import org.gudy.azureus2.ui.swt.config.ChangeSelectionActionPerformer; import org.gudy.azureus2.ui.swt.config.generic.GenericBooleanParameter; import org.gudy.azureus2.ui.swt.config.generic.GenericIntParameter; import org.gudy.azureus2.ui.swt.config.generic.GenericParameterAdapter; import com.aelitis.azureus.core.AzureusCoreFactory; import com.aelitis.azureus.ui.swt.imageloader.ImageLoader; public class TorrentOptionsView extends AbstractIView implements DownloadManagerStateAttributeListener { private static final String TEXT_PREFIX = "TorrentOptionsView.param."; // adhoc parameters need explicit code to reset default values below private static final String MAX_UPLOAD = "max.upload"; private static final String MAX_DOWNLOAD = "max.download"; private boolean multi_view; private DownloadManager[] managers; private GenericParameterAdapter ds_param_adapter = new downloadStateParameterAdapter(); private GenericParameterAdapter adhoc_param_adapter = new adhocParameterAdapter(); private Map adhoc_parameters = new HashMap(); private Map ds_parameters = new HashMap(); private Composite panel; private Font headerFont; private Composite parent; public TorrentOptionsView() { } /** * @param managers2 */ public TorrentOptionsView(DownloadManager[] managers2) { dataSourceChanged(managers2); } public void initialize( Composite composite) { this.parent = composite; GridLayout layout; // cheap trick to allow datasource changes. Normally we'd just // refill the components with new info, but I didn't write this and // I don't want to waste my time :) [tux] if (panel != null && !panel.isDisposed()) { Utils.disposeComposite(panel, false); } else { panel = new Composite(composite, SWT.NULL); layout = new GridLayout(); layout.marginHeight = 0; layout.marginWidth = 0; layout.numColumns = 1; panel.setLayout(layout); Layout parentLayout = parent.getLayout(); if (parentLayout instanceof FormLayout) { panel.setLayoutData(Utils.getFilledFormData()); } else { panel.setLayoutData(new GridData(GridData.FILL_BOTH)); } } if (managers == null) { return; } int userMode = COConfigurationManager.getIntParameter("User Mode"); // header Composite cHeader = new Composite(panel, SWT.BORDER); GridLayout configLayout = new GridLayout(); configLayout.marginHeight = 3; configLayout.marginWidth = 0; cHeader.setLayout(configLayout); GridData gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER); cHeader.setLayoutData(gridData); Display d = panel.getDisplay(); cHeader.setBackground(d.getSystemColor(SWT.COLOR_LIST_SELECTION)); cHeader.setForeground(d.getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT)); Label lHeader = new Label(cHeader, SWT.NULL); lHeader.setBackground(d.getSystemColor(SWT.COLOR_LIST_SELECTION)); lHeader.setForeground(d.getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT)); FontData[] fontData = lHeader.getFont().getFontData(); fontData[0].setStyle(SWT.BOLD); int fontHeight = (int)(fontData[0].getHeight() * 1.2); fontData[0].setHeight(fontHeight); headerFont = new Font(d, fontData); lHeader.setFont(headerFont); if ( managers.length == 1 ){ lHeader.setText( " " + MessageText.getString( "authenticator.torrent" ) + " : " + managers[0].getDisplayName().replaceAll("&", "&&")); }else{ String str = ""; for (int i=0;i<Math.min( 3, managers.length ); i ++ ){ str += (i==0?"":", ") + managers[i].getDisplayName().replaceAll("&", "&&"); } if ( managers.length > 3 ){ str += "..."; } lHeader.setText( " " + managers.length + " " + MessageText.getString( "ConfigView.section.torrents" ) + " : " + str ); } gridData = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER); lHeader.setLayoutData(gridData); Group gTorrentOptions = new Group(panel, SWT.NULL); Messages.setLanguageText(gTorrentOptions, "ConfigView.section.transfer"); gridData = new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL); gTorrentOptions.setLayoutData(gridData); layout = new GridLayout(); layout.numColumns = 2; gTorrentOptions.setLayout(layout); //Disabled for release. Need to convert from user-specified units to //KB/s before restoring the following line //String k_unit = DisplayFormatters.getRateUnit(DisplayFormatters.UNIT_KB).trim() String k_unit = DisplayFormatters.getRateUnitBase10(DisplayFormatters.UNIT_KB).trim(); // max upload speed Label label = new Label(gTorrentOptions, SWT.NULL); gridData = new GridData(); label.setLayoutData( gridData ); label.setText(k_unit + " " + MessageText.getString( "GeneralView.label.maxuploadspeed.tooltip" )); GenericIntParameter max_upload = new GenericIntParameter( adhoc_param_adapter, gTorrentOptions, MAX_UPLOAD); adhoc_parameters.put( MAX_UPLOAD, max_upload ); gridData = new GridData(); max_upload.setLayoutData(gridData); if ( userMode > 0) { // max upload when busy label = new Label(gTorrentOptions, SWT.NULL); gridData = new GridData(); label.setLayoutData( gridData ); Messages.setLanguageText(label, TEXT_PREFIX + "max.uploads.when.busy"); GenericIntParameter max_upload_when_busy = new GenericIntParameter( ds_param_adapter, gTorrentOptions, DownloadManagerState.PARAM_MAX_UPLOAD_WHEN_BUSY); ds_parameters.put( DownloadManagerState.PARAM_MAX_UPLOAD_WHEN_BUSY, max_upload_when_busy ); gridData = new GridData(); max_upload_when_busy.setLayoutData(gridData); } // max download speed label = new Label(gTorrentOptions, SWT.NULL); gridData = new GridData(); label.setLayoutData( gridData ); label.setText(k_unit + " " + MessageText.getString( "GeneralView.label.maxdownloadspeed.tooltip" )); GenericIntParameter max_download = new GenericIntParameter( adhoc_param_adapter, gTorrentOptions, MAX_DOWNLOAD); adhoc_parameters.put( MAX_DOWNLOAD, max_download ); gridData = new GridData(); max_download.setLayoutData(gridData); // max uploads if (userMode > 0) { label = new Label(gTorrentOptions, SWT.NULL); gridData = new GridData(); label.setLayoutData( gridData ); Messages.setLanguageText(label, TEXT_PREFIX + "max.uploads" ); GenericIntParameter max_uploads = new GenericIntParameter( ds_param_adapter, gTorrentOptions, DownloadManagerState.PARAM_MAX_UPLOADS); ds_parameters.put( DownloadManagerState.PARAM_MAX_UPLOADS, max_uploads ); max_uploads.setMinimumValue(2); gridData = new GridData(); max_uploads.setLayoutData(gridData); // max uploads when seeding enabled final Composite cMaxUploadsOptionsArea = new Composite(gTorrentOptions, SWT.NULL); layout = new GridLayout(); layout.numColumns = 3; layout.marginWidth = 0; layout.marginHeight = 0; cMaxUploadsOptionsArea.setLayout(layout); gridData = new GridData(); gridData.horizontalIndent = 15; gridData.horizontalSpan = 2; cMaxUploadsOptionsArea.setLayoutData(gridData); label = new Label(cMaxUploadsOptionsArea, SWT.NULL); ImageLoader.getInstance().setLabelImage(label, "subitem"); gridData = new GridData(GridData.VERTICAL_ALIGN_BEGINNING); label.setLayoutData(gridData); gridData = new GridData(); GenericBooleanParameter max_uploads_when_seeding_enabled = new GenericBooleanParameter( ds_param_adapter, cMaxUploadsOptionsArea, DownloadManagerState.PARAM_MAX_UPLOADS_WHEN_SEEDING_ENABLED, false, TEXT_PREFIX + "alternative.value.enable"); ds_parameters.put( DownloadManagerState.PARAM_MAX_UPLOADS_WHEN_SEEDING_ENABLED, max_uploads_when_seeding_enabled ); max_uploads_when_seeding_enabled.setLayoutData( gridData ); GenericIntParameter max_uploads_when_seeding = new GenericIntParameter( ds_param_adapter, cMaxUploadsOptionsArea, DownloadManagerState.PARAM_MAX_UPLOADS_WHEN_SEEDING); ds_parameters.put( DownloadManagerState.PARAM_MAX_UPLOADS_WHEN_SEEDING, max_uploads_when_seeding ); gridData = new GridData(); max_uploads_when_seeding.setMinimumValue(2); max_uploads_when_seeding.setLayoutData(gridData); max_uploads_when_seeding_enabled.setAdditionalActionPerformer( new ChangeSelectionActionPerformer( max_uploads_when_seeding.getControl())); // max peers label = new Label(gTorrentOptions, SWT.NULL); gridData = new GridData(); label.setLayoutData( gridData ); Messages.setLanguageText(label, TEXT_PREFIX + "max.peers"); GenericIntParameter max_peers = new GenericIntParameter(ds_param_adapter, gTorrentOptions, DownloadManagerState.PARAM_MAX_PEERS); ds_parameters.put( DownloadManagerState.PARAM_MAX_PEERS, max_peers ); gridData = new GridData(); max_peers.setLayoutData(gridData); // max peers when seeding final Composite cMaxPeersOptionsArea = new Composite(gTorrentOptions, SWT.NULL); layout = new GridLayout(); layout.numColumns = 3; layout.marginWidth = 0; layout.marginHeight = 0; cMaxPeersOptionsArea.setLayout(layout); gridData = new GridData(); gridData.horizontalIndent = 15; gridData.horizontalSpan = 2; cMaxPeersOptionsArea.setLayoutData(gridData); label = new Label(cMaxPeersOptionsArea, SWT.NULL); ImageLoader.getInstance().setLabelImage(label, "subitem"); gridData = new GridData(GridData.VERTICAL_ALIGN_BEGINNING); label.setLayoutData(gridData); gridData = new GridData(); GenericBooleanParameter max_peers_when_seeding_enabled = new GenericBooleanParameter( ds_param_adapter, cMaxPeersOptionsArea, DownloadManagerState.PARAM_MAX_PEERS_WHEN_SEEDING_ENABLED, false, TEXT_PREFIX + "alternative.value.enable"); ds_parameters.put( DownloadManagerState.PARAM_MAX_PEERS_WHEN_SEEDING_ENABLED, max_peers_when_seeding_enabled ); max_peers_when_seeding_enabled.setLayoutData( gridData ); GenericIntParameter max_peers_when_seeding = new GenericIntParameter( ds_param_adapter, cMaxPeersOptionsArea, DownloadManagerState.PARAM_MAX_PEERS_WHEN_SEEDING); ds_parameters.put( DownloadManagerState.PARAM_MAX_PEERS_WHEN_SEEDING, max_peers_when_seeding ); gridData = new GridData(); max_peers_when_seeding.setLayoutData(gridData); max_peers_when_seeding_enabled.setAdditionalActionPerformer( new ChangeSelectionActionPerformer( max_peers_when_seeding.getControl())); // max seeds label = new Label(gTorrentOptions, SWT.NULL); gridData = new GridData(); label.setLayoutData( gridData ); Messages.setLanguageText(label, TEXT_PREFIX + "max.seeds" ); GenericIntParameter max_seeds = new GenericIntParameter( ds_param_adapter, gTorrentOptions, DownloadManagerState.PARAM_MAX_SEEDS); ds_parameters.put( DownloadManagerState.PARAM_MAX_SEEDS, max_seeds ); gridData = new GridData(); max_seeds.setLayoutData(gridData); } Label reset_label = new Label(gTorrentOptions, SWT.NULL ); Messages.setLanguageText(reset_label, TEXT_PREFIX + "reset.to.default"); Button reset_button = new Button(gTorrentOptions, SWT.PUSH); Messages.setLanguageText(reset_button, TEXT_PREFIX + "reset.button" ); reset_button.addListener(SWT.Selection, new Listener() { public void handleEvent(Event event) { setDefaults(); } }); for (int i=0;i<managers.length;i++){ managers[i].getDownloadState().addListener(this, DownloadManagerState.AT_PARAMETERS, DownloadManagerStateAttributeListener.WRITTEN); } panel.layout(true, true); } protected void setDefaults() { Iterator it = ds_parameters.keySet().iterator(); while( it.hasNext()){ String key = (String)it.next(); for (int i=0;i<managers.length;i++){ managers[i].getDownloadState().setParameterDefault( key ); } } it = adhoc_parameters.values().iterator(); while ( it.hasNext()){ Object param = it.next(); if ( param instanceof GenericIntParameter ){ GenericIntParameter int_param = (GenericIntParameter)param; int_param.setValue( 0, true ); }else{ Debug.out( "Unknown parameter type: " + param.getClass()); } } } public void attributeEventOccurred(DownloadManager dm, String attribute_name, int event_type) { final DownloadManagerState state = dm.getDownloadState(); Utils.execSWTThread(new Runnable() { public void run() { Iterator it = ds_parameters.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry)it.next(); String key = (String)entry.getKey(); Object param = entry.getValue(); if (param instanceof GenericIntParameter) { GenericIntParameter int_param = (GenericIntParameter)param; int value = state.getIntParameter( key ); int_param.setValue( value ); } else if (param instanceof GenericBooleanParameter) { GenericBooleanParameter bool_param = (GenericBooleanParameter)param; boolean value = state.getBooleanParameter( key ); bool_param.setSelected( value ); } else { Debug.out( "Unknown parameter type: " + param.getClass()); } } } }, true); } public Composite getComposite() { return panel; } public String getFullTitle() { return MessageText.getString( multi_view?"TorrentOptionsView.multi.title.full":"TorrentOptionsView.title.full"); } public String getData() { return multi_view?"TorrentOptionsView.multi.title.short":"TorrentOptionsView.title.short"; } public void delete() { super.delete(); if ( headerFont != null ){ headerFont.dispose(); } if (managers != null) { for (int i = 0; i < managers.length; i++) { managers[i].getDownloadState().removeListener(this, DownloadManagerState.AT_PARAMETERS, DownloadManagerStateAttributeListener.WRITTEN); } } } protected class adhocParameterAdapter extends GenericParameterAdapter { public int getIntValue( String key ) { return( getIntValue( key, 0 )); } public int getIntValue( String key, int def ) { if ( key == MAX_UPLOAD ){ int result = def; for (int i=0;i<managers.length;i++){ int val = managers[i].getStats().getUploadRateLimitBytesPerSecond()/1024; if ( i==0 ){ result = val; }else if ( result != val ){ return( def ); } } return( result ); }else if ( key == MAX_DOWNLOAD ){ int result = def; for (int i=0;i<managers.length;i++){ int val = managers[i].getStats().getDownloadRateLimitBytesPerSecond()/1024; if ( i==0 ){ result = val; }else if ( result != val ){ return( def ); } } return( result ); }else{ Debug.out( "Unknown key '" + key + "'" ); return(0); } } public void setIntValue( String key, int value ) { if ( key == MAX_UPLOAD ){ for (int i=0;i<managers.length;i++){ DownloadManager manager = managers[i]; if ( value != manager.getStats().getUploadRateLimitBytesPerSecond()/1024){ manager.getStats().setUploadRateLimitBytesPerSecond(value*1024); } } }else if ( key == MAX_DOWNLOAD ){ for (int i=0;i<managers.length;i++){ DownloadManager manager = managers[i]; if ( value != manager.getStats().getDownloadRateLimitBytesPerSecond()/1024){ manager.getStats().setDownloadRateLimitBytesPerSecond(value*1024); } } }else{ Debug.out( "Unknown key '" + key + "'" ); } } } protected class downloadStateParameterAdapter extends GenericParameterAdapter { public int getIntValue( String key ) { return( getIntValue( key, 0 )); } public int getIntValue( String key, int def ) { int result = def; for (int i=0;i<managers.length;i++){ int val = managers[i].getDownloadState().getIntParameter( key ); if ( i==0 ){ result = val; }else if ( result != val ){ return( def ); } } return( result ); } public void setIntValue( String key, int value ) { for (int i=0;i<managers.length;i++){ DownloadManager manager = managers[i]; if ( value != manager.getDownloadState().getIntParameter( key )){ manager.getDownloadState().setIntParameter( key, value ); } } } public boolean getBooleanValue( String key ) { return( getBooleanValue(key,false)); } public boolean getBooleanValue( String key, boolean def ) { boolean result = def; for (int i=0;i<managers.length;i++){ boolean val = managers[i].getDownloadState().getBooleanParameter( key ); if ( i==0 ){ result = val; }else if ( result != val ){ return( def ); } } return( result ); } public void setBooleanValue( String key, boolean value ) { for (int i=0;i<managers.length;i++){ DownloadManager manager = managers[i]; if ( value != manager.getDownloadState().getBooleanParameter( key )){ manager.getDownloadState().setBooleanParameter( key, value ); } } } } // @see org.gudy.azureus2.ui.swt.views.AbstractIView#dataSourceChanged(java.lang.Object) public void dataSourceChanged(Object newDataSource) { if (newDataSource instanceof DownloadManager) { multi_view = false; managers = new DownloadManager[] { (DownloadManager) newDataSource }; } else if (newDataSource instanceof DownloadManager[]) { multi_view = true; managers = (DownloadManager[]) newDataSource; } if (parent != null) { Utils.execSWTThread(new AERunnable() { public void runSupport() { initialize(parent); } }); } } }