1 /*
2  * File    : ConfigPanel*.java
3  * Created : 11 mar. 2004
4  * By      : TuxPaper
5  *
6  * Copyright (C) Azureus Software, Inc, All Rights Reserved.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details ( see the LICENSE file ).
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  */
22 
23 package org.gudy.azureus2.ui.swt.views.configsections;
24 
25 import org.eclipse.swt.SWT;
26 import org.eclipse.swt.graphics.Image;
27 import org.eclipse.swt.layout.GridData;
28 import org.eclipse.swt.layout.GridLayout;
29 import org.eclipse.swt.widgets.Composite;
30 import org.eclipse.swt.widgets.Control;
31 import org.eclipse.swt.widgets.Event;
32 import org.eclipse.swt.widgets.Group;
33 import org.eclipse.swt.widgets.Label;
34 import org.eclipse.swt.widgets.Listener;
35 
36 import org.gudy.azureus2.plugins.ui.config.ConfigSection;
37 import org.gudy.azureus2.ui.swt.components.LinkLabel;
38 import org.gudy.azureus2.ui.swt.config.*;
39 import org.gudy.azureus2.ui.swt.plugins.UISWTConfigSection;
40 import org.gudy.azureus2.ui.swt.shells.CoreWaiterSWT;
41 import org.gudy.azureus2.ui.swt.Messages;
42 import org.gudy.azureus2.ui.swt.Utils;
43 import org.gudy.azureus2.core3.config.COConfigurationManager;
44 import org.gudy.azureus2.core3.config.impl.TransferSpeedValidator;
45 import org.gudy.azureus2.core3.internat.MessageText;
46 
47 import com.aelitis.azureus.core.AzureusCore;
48 import com.aelitis.azureus.core.AzureusCoreRunningListener;
49 import com.aelitis.azureus.ui.swt.imageloader.ImageLoader;
50 
51 public class ConfigSectionTransfer implements UISWTConfigSection {
52 
ConfigSectionTransfer()53 	public ConfigSectionTransfer() {
54 	}
55 
configSectionGetParentSection()56 	public String configSectionGetParentSection() {
57 		return ConfigSection.SECTION_ROOT;
58 	}
59 
configSectionGetName()60 	public String configSectionGetName() {
61 		return ConfigSection.SECTION_TRANSFER;
62 	}
63 
configSectionSave()64 	public void configSectionSave() {
65 	}
66 
configSectionDelete()67 	public void configSectionDelete() {
68 		ImageLoader imageLoader = ImageLoader.getInstance();
69 		imageLoader.releaseImage("subitem");
70 	}
71 
maxUserMode()72 	public int maxUserMode() {
73 		return 2;
74 	}
75 
76 
configSectionCreate(final Composite parent)77 	public Composite configSectionCreate(final Composite parent) {
78 		GridData gridData;
79 		GridLayout layout;
80 		Label label;
81 
82 		Composite cSection = new Composite(parent, SWT.NULL);
83 		gridData = new GridData(GridData.VERTICAL_ALIGN_FILL
84 				| GridData.HORIZONTAL_ALIGN_FILL);
85 		Utils.setLayoutData(cSection, gridData);
86 		layout = new GridLayout();
87 		layout.numColumns = 2;
88 		layout.marginHeight = 0;
89 		cSection.setLayout(layout);
90 
91 		int userMode = COConfigurationManager.getIntParameter("User Mode");
92 
93 		//  store the initial d/l speed so we can do something sensible later
94 		final int[] manual_max_download_speed = { COConfigurationManager
95 				.getIntParameter("Max Download Speed KBs") };
96 
97 		//  max upload speed
98 		gridData = new GridData();
99 		label = new Label(cSection, SWT.NULL);
100 		Utils.setLayoutData(label, gridData);
101 		Messages.setLanguageText(label, "ConfigView.label.maxuploadspeed");
102 
103 		gridData = new GridData();
104 		final IntParameter paramMaxUploadSpeed = new IntParameter(cSection,
105 				"Max Upload Speed KBs", 0, Integer.MAX_VALUE );
106 		paramMaxUploadSpeed.setLayoutData(gridData);
107 
108 		//  max upload speed when seeding
109 		final Composite cMaxUploadSpeedOptionsArea = new Composite(cSection, SWT.NULL);
110 		layout = new GridLayout();
111 		layout.numColumns = 3;
112 		layout.marginWidth = 0;
113 		layout.marginHeight = 0;
114 		cMaxUploadSpeedOptionsArea.setLayout(layout);
115 		gridData = new GridData();
116 		gridData.horizontalIndent = 15;
117 		gridData.horizontalSpan = 2;
118 		Utils.setLayoutData(cMaxUploadSpeedOptionsArea, gridData);
119 
120 		ImageLoader imageLoader = ImageLoader.getInstance();
121 		Image img = imageLoader.getImage("subitem");
122 
123 		label = new Label(cMaxUploadSpeedOptionsArea, SWT.NULL);
124 		img.setBackground(label.getBackground());
125 		gridData = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
126 		Utils.setLayoutData(label, gridData);
127 		label.setImage(img);
128 
129 		gridData = new GridData();
130 		final BooleanParameter enable_seeding_rate = new BooleanParameter(
131 				cMaxUploadSpeedOptionsArea, "enable.seedingonly.upload.rate",
132 				"ConfigView.label.maxuploadspeedseeding");
133 		enable_seeding_rate.setLayoutData(gridData);
134 
135 		gridData = new GridData();
136 		final IntParameter paramMaxUploadSpeedSeeding = new IntParameter(
137 				cMaxUploadSpeedOptionsArea, "Max Upload Speed Seeding KBs", 0, Integer.MAX_VALUE );
138 		paramMaxUploadSpeedSeeding.setLayoutData(gridData);
139 		enable_seeding_rate
140 				.setAdditionalActionPerformer(new ChangeSelectionActionPerformer(
141 						paramMaxUploadSpeedSeeding.getControl()));
142 
143 		if (userMode < 2) {
144 			// wiki link
145 
146 			Composite cWiki = new Composite(cSection, SWT.COLOR_GRAY);
147 			gridData = new GridData(GridData.VERTICAL_ALIGN_FILL
148 					| GridData.HORIZONTAL_ALIGN_FILL);
149 			gridData.horizontalSpan = 2;
150 			Utils.setLayoutData(cWiki, gridData);
151 			layout = new GridLayout();
152 			layout.numColumns = 4;
153 			layout.marginHeight = 0;
154 			cWiki.setLayout(layout);
155 
156 			gridData = new GridData();
157 			gridData.horizontalIndent = 6;
158 			gridData.horizontalSpan = 2;
159 			label = new Label(cWiki, SWT.NULL);
160 			Utils.setLayoutData(label, gridData);
161 			label.setText(MessageText.getString("Utils.link.visit") + ":");
162 
163 			gridData = new GridData();
164 			gridData.horizontalIndent = 10;
165 			gridData.horizontalSpan = 2;
166 			new LinkLabel(cWiki, gridData, "ConfigView.section.transfer.speeds.wiki",
167 					"http://wiki.vuze.com/w/Good_settings");
168 		}
169 
170 		if ( userMode > 1 ){
171 
172 			gridData = new GridData();
173 			label = new Label(cSection, SWT.NULL);
174 			Utils.setLayoutData(label, gridData);
175 			Messages.setLanguageText(label, "ConfigView.label.maxuploadswhenbusymin" );
176 
177 			gridData = new GridData();
178 			new IntParameter(cSection, "max.uploads.when.busy.inc.min.secs", 0, Integer.MAX_VALUE ).setLayoutData(gridData);
179 		}
180 
181 		// max download speed
182 		gridData = new GridData();
183 		label = new Label(cSection, SWT.NULL);
184 		Utils.setLayoutData(label, gridData);
185 		Messages.setLanguageText(label, "ConfigView.label.maxdownloadspeed");
186 
187 		gridData = new GridData();
188 		final IntParameter paramMaxDownSpeed = new IntParameter(cSection,
189 				"Max Download Speed KBs", 0, Integer.MAX_VALUE );
190 		paramMaxDownSpeed.setLayoutData(gridData);
191 
192 			// max upload/download limit dependencies
193 
194 		Listener l = new Listener() {
195 
196 			public void handleEvent(Event event) {
197 				boolean disableAuto = false;
198 				boolean disableAutoSeeding = false;
199 
200 				if(enable_seeding_rate.isSelected())
201 				{
202 					disableAutoSeeding = event.widget == paramMaxUploadSpeedSeeding.getControl();
203 					disableAuto = event.widget == paramMaxDownSpeed.getControl() || event.widget == paramMaxUploadSpeed.getControl();
204 				} else
205 				{
206 					disableAuto = true;
207 					disableAutoSeeding = true;
208 				}
209 
210 
211 				if(disableAuto)
212 					COConfigurationManager.setParameter(TransferSpeedValidator.AUTO_UPLOAD_ENABLED_CONFIGKEY, false);
213 				if(disableAutoSeeding)
214 					COConfigurationManager.setParameter(TransferSpeedValidator.AUTO_UPLOAD_SEEDING_ENABLED_CONFIGKEY, false);
215 			}
216 		};
217 
218 		paramMaxDownSpeed.getControl().addListener(SWT.Selection, l);
219 		paramMaxUploadSpeed.getControl().addListener(SWT.Selection, l);
220 		paramMaxUploadSpeedSeeding.getControl().addListener(SWT.Selection, l);
221 
222 
223 		paramMaxUploadSpeed.addChangeListener(new ParameterChangeAdapter() {
224 			ParameterChangeAdapter me = this;
225 
226 			public void parameterChanged(Parameter p, boolean internal) {
227 				CoreWaiterSWT.waitForCoreRunning(new AzureusCoreRunningListener() {
228 
229 					public void azureusCoreRunning(AzureusCore core) {
230 						if (paramMaxUploadSpeed.isDisposed()) {
231 							paramMaxUploadSpeed.removeChangeListener(me);
232 							return;
233 						}
234 
235 						// we don't want to police these limits when auto-speed is running as
236 						// they screw things up bigtime
237 
238 						if (TransferSpeedValidator.isAutoSpeedActive(core.getGlobalManager())) {
239 
240 							return;
241 						}
242 
243 						int up_val = paramMaxUploadSpeed.getValue();
244 						int down_val = paramMaxDownSpeed.getValue();
245 
246 						if (up_val != 0
247 								&& up_val < COConfigurationManager.CONFIG_DEFAULT_MIN_MAX_UPLOAD_SPEED) {
248 
249 							if ((down_val == 0) || down_val > (up_val * 2)) {
250 
251 								paramMaxDownSpeed.setValue(up_val * 2);
252 							}
253 						} else {
254 
255 							if (down_val != manual_max_download_speed[0]) {
256 
257 								paramMaxDownSpeed.setValue(manual_max_download_speed[0]);
258 							}
259 						}
260 					}
261 
262 				});
263 			};
264 		});
265 
266 		paramMaxDownSpeed.addChangeListener(new ParameterChangeAdapter() {
267 			ParameterChangeAdapter me = this;
268 
269 			public void parameterChanged(Parameter p, boolean internal) {
270 				CoreWaiterSWT.waitForCoreRunning(new AzureusCoreRunningListener() {
271 
272 					public void azureusCoreRunning(AzureusCore core) {
273 						if (paramMaxDownSpeed.isDisposed()) {
274 							paramMaxDownSpeed.removeChangeListener(me);
275 							return;
276 						}
277 
278 						// we don't want to police these limits when auto-speed is running as
279 						// they screw things up bigtime
280 
281 						if (TransferSpeedValidator.isAutoSpeedActive(core.getGlobalManager())) {
282 
283 							return;
284 						}
285 
286 						int up_val = paramMaxUploadSpeed.getValue();
287 						int down_val = paramMaxDownSpeed.getValue();
288 
289 						manual_max_download_speed[0] = down_val;
290 
291 						if (up_val < COConfigurationManager.CONFIG_DEFAULT_MIN_MAX_UPLOAD_SPEED) {
292 
293 							if (up_val != 0 && up_val < (down_val * 2)) {
294 
295 								paramMaxUploadSpeed.setValue((down_val + 1) / 2);
296 
297 							} else if (down_val == 0) {
298 
299 								paramMaxUploadSpeed.setValue(0);
300 							}
301 						}
302 					}
303 				});
304 			}
305 		});
306 
307 		if (userMode > 0) {
308 
309 				// bias upload to incomplete
310 
311 			BooleanParameter bias_upload = new BooleanParameter(
312 					cSection,
313 					"Bias Upload Enable",
314 					"ConfigView.label.xfer.bias_up" );
315 			gridData = new GridData();
316 			gridData.horizontalSpan = 2;
317 			bias_upload.setLayoutData(gridData);
318 
319 
320 			final Composite bias_slack_area = new Composite(cSection, SWT.NULL);
321 			layout = new GridLayout();
322 			layout.numColumns = 3;
323 			layout.marginWidth = 0;
324 			layout.marginHeight = 0;
325 			bias_slack_area.setLayout(layout);
326 			gridData = new GridData();
327 			gridData.horizontalIndent = 15;
328 			gridData.horizontalSpan = 2;
329 			Utils.setLayoutData(bias_slack_area, gridData);
330 
331 			label = new Label(bias_slack_area, SWT.NULL);
332 			gridData = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
333 			Utils.setLayoutData(label, gridData);
334 			label.setImage(img);
335 
336 			label = new Label(bias_slack_area, SWT.NULL);
337 			Messages.setLanguageText(label, "ConfigView.label.xfer.bias_slack");
338 
339 			IntParameter bias_slack = new IntParameter(
340 					bias_slack_area, "Bias Upload Slack KBs", 1, Integer.MAX_VALUE );
341 
342 
343 			final Composite bias_unlimited_area = new Composite(cSection, SWT.NULL);
344 			layout = new GridLayout();
345 			layout.numColumns = 2;
346 			layout.marginWidth = 0;
347 			layout.marginHeight = 0;
348 			bias_unlimited_area.setLayout(layout);
349 			gridData = new GridData();
350 			gridData.horizontalIndent = 15;
351 			gridData.horizontalSpan = 2;
352 			Utils.setLayoutData(bias_unlimited_area, gridData);
353 
354 			label = new Label(bias_unlimited_area, SWT.NULL);
355 			gridData = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
356 			Utils.setLayoutData(label, gridData);
357 			label.setImage(img);
358 
359 
360 			BooleanParameter bias_no_limit = new BooleanParameter(
361 					bias_unlimited_area,
362 					"Bias Upload Handle No Limit",
363 					"ConfigView.label.xfer.bias_no_limit" );
364 
365 			bias_upload.setAdditionalActionPerformer(
366 					new ChangeSelectionActionPerformer(
367 					new Parameter[]{ bias_slack, bias_no_limit} ));
368 		}
369 
370 		if (userMode > 0) {
371 
372 				// AUTO GROUP
373 
374 			Group auto_group = new Group(cSection, SWT.NULL);
375 
376 			Messages.setLanguageText(auto_group, "group.auto");
377 
378 			GridLayout auto_layout = new GridLayout();
379 
380 			auto_layout.numColumns = 2;
381 
382 			auto_group.setLayout(auto_layout);
383 
384 			gridData = new GridData(GridData.FILL_HORIZONTAL);
385 			gridData.horizontalSpan = 2;
386 			Utils.setLayoutData(auto_group, gridData);
387 
388 			BooleanParameter auto_adjust = new BooleanParameter(
389 					auto_group,
390 					"Auto Adjust Transfer Defaults",
391 					"ConfigView.label.autoadjust" );
392 
393 			gridData = new GridData();
394 			gridData.horizontalSpan = 2;
395 
396 			auto_adjust.setLayoutData( gridData );
397 
398 			// max uploads
399 			gridData = new GridData();
400 			label = new Label(auto_group, SWT.NULL);
401 			Utils.setLayoutData(label, gridData);
402 			Messages.setLanguageText(label, "ConfigView.label.maxuploads");
403 
404 			gridData = new GridData();
405 			IntParameter paramMaxUploads = new IntParameter(auto_group, "Max Uploads",
406 					2, Integer.MAX_VALUE );
407 			paramMaxUploads.setLayoutData(gridData);
408 
409 				// max uploads when seeding
410 
411 			final Composite cMaxUploadsOptionsArea = new Composite(auto_group, SWT.NULL);
412 			layout = new GridLayout();
413 			layout.numColumns = 3;
414 			layout.marginWidth = 0;
415 			layout.marginHeight = 0;
416 			cMaxUploadsOptionsArea.setLayout(layout);
417 			gridData = new GridData();
418 			gridData.horizontalIndent = 15;
419 			gridData.horizontalSpan = 2;
420 			Utils.setLayoutData(cMaxUploadsOptionsArea, gridData);
421 			label = new Label(cMaxUploadsOptionsArea, SWT.NULL);
422 			img.setBackground(label.getBackground());
423 			gridData = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
424 			Utils.setLayoutData(label, gridData);
425 			label.setImage(img);
426 
427 			gridData = new GridData();
428 			BooleanParameter enable_seeding_uploads = new BooleanParameter(
429 					cMaxUploadsOptionsArea, "enable.seedingonly.maxuploads",
430 					"ConfigView.label.maxuploadsseeding");
431 			enable_seeding_uploads.setLayoutData(gridData);
432 
433 			gridData = new GridData();
434 			final IntParameter paramMaxUploadsSeeding = new IntParameter(
435 					cMaxUploadsOptionsArea, "Max Uploads Seeding", 2, Integer.MAX_VALUE );
436 			paramMaxUploadsSeeding.setLayoutData(gridData);
437 
438 
439 
440 			////
441 
442 			gridData = new GridData();
443 			label = new Label(auto_group, SWT.NULL);
444 			Utils.setLayoutData(label, gridData);
445 			Messages.setLanguageText(label, "ConfigView.label.max_peers_per_torrent");
446 
447 			gridData = new GridData();
448 			IntParameter paramMaxClients = new IntParameter(auto_group,
449 					"Max.Peer.Connections.Per.Torrent");
450 			paramMaxClients.setLayoutData(gridData);
451 
452 
453 			/////
454 
455 				// max peers when seeding
456 
457 			final Composite cMaxPeersOptionsArea = new Composite(auto_group, SWT.NULL);
458 			layout = new GridLayout();
459 			layout.numColumns = 3;
460 			layout.marginWidth = 0;
461 			layout.marginHeight = 0;
462 			cMaxPeersOptionsArea.setLayout(layout);
463 			gridData = new GridData();
464 			gridData.horizontalIndent = 15;
465 			gridData.horizontalSpan = 2;
466 			Utils.setLayoutData(cMaxPeersOptionsArea, gridData);
467 			label = new Label(cMaxPeersOptionsArea, SWT.NULL);
468 			img.setBackground(label.getBackground());
469 			gridData = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
470 			Utils.setLayoutData(label, gridData);
471 			label.setImage(img);
472 
473 			gridData = new GridData();
474 			BooleanParameter enable_max_peers_seeding = new BooleanParameter(
475 					cMaxPeersOptionsArea, "Max.Peer.Connections.Per.Torrent.When.Seeding.Enable",
476 					"ConfigView.label.maxuploadsseeding");
477 			enable_max_peers_seeding.setLayoutData(gridData);
478 
479 			gridData = new GridData();
480 			final IntParameter paramMaxPeersSeeding = new IntParameter(
481 					cMaxPeersOptionsArea, "Max.Peer.Connections.Per.Torrent.When.Seeding", 0, Integer.MAX_VALUE );
482 			paramMaxPeersSeeding.setLayoutData(gridData);
483 
484 			/////
485 
486 			gridData = new GridData();
487 			label = new Label(auto_group, SWT.NULL);
488 			Utils.setLayoutData(label, gridData);
489 			Messages.setLanguageText(label, "ConfigView.label.max_peers_total");
490 
491 			gridData = new GridData();
492 			IntParameter paramMaxClientsTotal = new IntParameter(auto_group,
493 					"Max.Peer.Connections.Total");
494 			paramMaxClientsTotal.setLayoutData(gridData);
495 
496 			gridData = new GridData();
497 			label = new Label(auto_group, SWT.NULL);
498 			Utils.setLayoutData(label, gridData);
499 			Messages.setLanguageText(label, "ConfigView.label.maxseedspertorrent");
500 
501 			gridData = new GridData();
502 			IntParameter max_seeds_per_torrent = new IntParameter(auto_group,"Max Seeds Per Torrent");
503 			max_seeds_per_torrent.setLayoutData(gridData);
504 
505 			final Parameter[] parameters = {
506 					paramMaxUploads, enable_seeding_uploads, paramMaxUploadsSeeding,
507 					paramMaxClients, enable_max_peers_seeding, paramMaxPeersSeeding,
508 					paramMaxClientsTotal, max_seeds_per_torrent,
509 			};
510 
511 		    IAdditionalActionPerformer f_enabler =
512 		        new GenericActionPerformer( new Control[0])
513 		    	{
514 		        	public void
515 		        	performAction()
516 		        	{
517 		        		boolean auto = COConfigurationManager.getBooleanParameter( "Auto Adjust Transfer Defaults" );
518 
519 		        		for ( Parameter p: parameters ){
520 
521 		        			Control[] c = p.getControls();
522 
523 		        			for ( Control x: c ){
524 
525 		        				x.setEnabled( !auto );
526 		        			}
527 		        		}
528 
529 		        		if ( !auto ){
530 
531 		        			paramMaxUploadsSeeding.getControl().setEnabled( COConfigurationManager.getBooleanParameter( "enable.seedingonly.maxuploads" ));
532 
533 		        			paramMaxPeersSeeding.getControl().setEnabled(  COConfigurationManager.getBooleanParameter( "Max.Peer.Connections.Per.Torrent.When.Seeding.Enable" ));
534 		        		}
535 		        	}
536 		        };
537 
538 		    f_enabler.performAction();
539 
540 			enable_seeding_uploads.setAdditionalActionPerformer( f_enabler );
541 			enable_max_peers_seeding.setAdditionalActionPerformer( f_enabler );
542 			auto_adjust.setAdditionalActionPerformer( f_enabler );
543 
544 
545 				// NON PUBLIC PEERS GROUP
546 
547 			Group npp_group = new Group(cSection, SWT.NULL);
548 
549 			Messages.setLanguageText(npp_group, "label.non.public.peers");
550 
551 			GridLayout npp_layout = new GridLayout();
552 
553 			npp_layout.numColumns = 2;
554 
555 			npp_group.setLayout(npp_layout);
556 
557 			gridData = new GridData(GridData.FILL_HORIZONTAL);
558 			gridData.horizontalSpan = 2;
559 			Utils.setLayoutData(npp_group, gridData);
560 
561 			label = new Label(npp_group, SWT.NULL);
562 			Messages.setLanguageText(label, "ConfigView.label.npp.slots");
563 
564 			IntParameter npp_upload_slots = new IntParameter(npp_group,"Non-Public Peer Extra Slots Per Torrent",0,Integer.MAX_VALUE);
565 
566 			label = new Label(npp_group, SWT.NULL);
567 			Messages.setLanguageText(label, "ConfigView.label.npp.connections");
568 
569 			IntParameter npp_connections = new IntParameter(npp_group,"Non-Public Peer Extra Connections Per Torrent",0,Integer.MAX_VALUE);
570 
571 				// END NON PUBLIC PEERS GROUP
572 
573 			gridData = new GridData();
574 			gridData.horizontalSpan = 2;
575 			BooleanParameter useReqLimiting = new BooleanParameter(cSection, "Use Request Limiting",
576 				"ConfigView.label.userequestlimiting");
577 			useReqLimiting.setLayoutData(gridData);
578 
579 			gridData = new GridData();
580 			gridData.horizontalSpan = 2;
581 			BooleanParameter useReqLimitingPrios = new BooleanParameter(cSection, "Use Request Limiting Priorities",
582 				"ConfigView.label.userequestlimitingpriorities");
583 			useReqLimitingPrios.setLayoutData(gridData);
584 			useReqLimiting.setAdditionalActionPerformer(new ChangeSelectionActionPerformer(
585 					useReqLimitingPrios.getControl()));
586 
587 				// up limits include protocol
588 
589 			gridData = new GridData();
590 			gridData.horizontalSpan = 2;
591 			BooleanParameter upIncludesProt = new BooleanParameter(cSection,
592 					"Up Rate Limits Include Protocol", "ConfigView.label.up.includes.prot");
593 			upIncludesProt.setLayoutData(gridData);
594 
595 				// down limits include protocol
596 
597 			gridData = new GridData();
598 			gridData.horizontalSpan = 2;
599 			BooleanParameter downIncludesProt = new BooleanParameter(cSection,
600 					"Down Rate Limits Include Protocol", "ConfigView.label.down.includes.prot");
601 			downIncludesProt.setLayoutData(gridData);
602 
603 				// same IP
604 
605 			gridData = new GridData();
606 			gridData.horizontalSpan = 2;
607 			BooleanParameter allowSameIP = new BooleanParameter(cSection,
608 					"Allow Same IP Peers", "ConfigView.label.allowsameip");
609 			allowSameIP.setLayoutData(gridData);
610 
611 			// lazy bit field
612 			gridData = new GridData();
613 			gridData.horizontalSpan = 2;
614 			BooleanParameter lazybf = new BooleanParameter(cSection,
615 					"Use Lazy Bitfield", "ConfigView.label.lazybitfield");
616 			lazybf.setLayoutData(gridData);
617 
618 			// don't declare completion
619 
620 			if (userMode > 1) {
621 				gridData = new GridData();
622 				gridData.horizontalSpan = 2;
623 				BooleanParameter hap = new BooleanParameter(cSection,
624 						"peercontrol.hide.piece", "ConfigView.label.hap");
625 				hap.setLayoutData(gridData);
626 
627 				gridData = new GridData();
628 				gridData.horizontalSpan = 2;
629 				BooleanParameter hapds = new BooleanParameter(cSection,
630 						"peercontrol.hide.piece.ds", "ConfigView.label.hapds");
631 				hapds.setLayoutData(gridData);
632 
633 				hap.setAdditionalActionPerformer(new ChangeSelectionActionPerformer(
634 						hapds.getControl()));
635 
636 			}
637 
638 			// prioritise first/last pieces
639 			gridData = new GridData();
640 			gridData.horizontalSpan = 2;
641 			BooleanParameter firstPiece = new BooleanParameter(cSection,
642 					"Prioritize First Piece",
643 					"ConfigView.label.prioritizefirstpiece");
644 			firstPiece.setLayoutData(gridData);
645 
646 			// Further prioritize High priority files according to % complete and size of file
647 			gridData = new GridData();
648 			gridData.horizontalSpan = 2;
649 			BooleanParameter mostCompletedFiles = new BooleanParameter(cSection,
650 					"Prioritize Most Completed Files",
651 					"ConfigView.label.prioritizemostcompletedfiles");
652 			mostCompletedFiles.setLayoutData(gridData);
653 
654 			// ignore ports
655 
656 			Composite cMiniArea = new Composite(cSection, SWT.NULL);
657 			layout = new GridLayout();
658 			layout.numColumns = 2;
659 			layout.marginHeight = 0;
660 			layout.marginWidth = 0;
661 			cMiniArea.setLayout(layout);
662 			gridData = new GridData(GridData.FILL_HORIZONTAL);
663 			gridData.horizontalSpan = 2;
664 			Utils.setLayoutData(cMiniArea, gridData);
665 
666 			gridData = new GridData();
667 			label = new Label(cMiniArea, SWT.NULL);
668 			Utils.setLayoutData(label, gridData);
669 			Messages.setLanguageText(label,
670 					"ConfigView.label.transfer.ignorepeerports");
671 
672 			gridData = new GridData();
673 			gridData.widthHint = 125;
674 			StringParameter ignore_ports = new StringParameter(cMiniArea,
675 					"Ignore.peer.ports", "0");
676 			ignore_ports.setLayoutData(gridData);
677 		}
678 
679 		return cSection;
680 	}
681 }
682