blob: 2e5781e36abcdfe61e4a4a0df6ae7d87ec6c048e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2017 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* yyyymmdd bug Email and other contact information
* -------- -------- -----------------------------------------------------------
* 20060217 127138 pmoogk@ca.ibm.com - Peter Moogk
* 20070201 154100 pmoogk@ca.ibm.com - Peter Moogk, Port internet code from WTP to Eclipse base.
*******************************************************************************/
package org.eclipse.ui.internal.net;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.internal.net.ProxySelector;
import org.eclipse.core.internal.net.StringUtil;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.fieldassist.ControlDecoration;
import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
import org.eclipse.jface.viewers.*;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
/**
* This class is the Composite that consists of controls for proxy bypass hosts
* and is used by ProxyPreferencesPage.
*/
public class NonProxyHostsComposite extends Composite {
private Label hostsLabel;
CheckboxTableViewer hostsViewer;
private Button addButton;
private Button editButton;
private Button removeButton;
protected String currentProvider;
private ArrayList<ProxyBypassData> bypassHosts = new ArrayList<>();
NonProxyHostsComposite(Composite parent, int style) {
super(parent, style);
createWidgets();
}
protected void createWidgets() {
setLayout(new GridLayout(2, false));
hostsLabel = new Label(this, SWT.NONE);
hostsLabel.setText(NetUIMessages.ProxyPreferencePage_12);
hostsLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false,
2, 1));
Table hostsTable = new Table(this, SWT.BORDER | SWT.V_SCROLL
| SWT.H_SCROLL | SWT.MULTI | SWT.FULL_SELECTION | SWT.CHECK);
hostsTable.setHeaderVisible(true);
hostsTable.setLinesVisible(true);
hostsTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true,
1, 3));
hostsViewer = new CheckboxTableViewer(hostsTable);
NonProxyHostsLabelProvider labelProvider = new NonProxyHostsLabelProvider();
NonProxyHostsContentProvider contentProvider = new NonProxyHostsContentProvider();
labelProvider.createColumns(hostsViewer);
hostsViewer.setContentProvider(contentProvider);
hostsViewer.setLabelProvider(labelProvider);
TableLayout tableLayout = new TableLayout();
tableLayout.addColumnData(new ColumnPixelData(24));
tableLayout.addColumnData(new ColumnWeightData(50, 50, true));
tableLayout.addColumnData(new ColumnWeightData(50, 50, true));
hostsTable.setLayout(tableLayout);
addButton = createButton(NetUIMessages.ProxyPreferencePage_15);
editButton = createButton(NetUIMessages.ProxyPreferencePage_16);
removeButton = createButton(NetUIMessages.ProxyPreferencePage_17);
hostsViewer
.addSelectionChangedListener(event -> enableButtons());
hostsViewer.addCheckStateListener(event -> setProvider(currentProvider));
hostsViewer.addDoubleClickListener(event -> editSelection());
addButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
addHost();
}
});
editButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
editSelection();
}
});
removeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
removeSelection();
}
});
initializeValues();
enableButtons();
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
hostsViewer.getTable().setEnabled(enabled);
enableButtons();
}
protected void enableButtons() {
boolean enabled = getEnabled();
if (enabled) {
boolean editable = isSelectionEditable();
addButton.setEnabled(true);
editButton.setEnabled(editable);
removeButton.setEnabled(editable);
} else {
addButton.setEnabled(false);
editButton.setEnabled(false);
removeButton.setEnabled(false);
}
}
private boolean isSelectionEditable() {
IStructuredSelection selection = hostsViewer.getStructuredSelection();
Iterator<?> iterator = selection.iterator();
boolean editable = iterator.hasNext();
while (iterator.hasNext()) {
String provider = ((ProxyBypassData) iterator.next()).getSource();
if (!ProxySelector.canSetBypassHosts(provider)) {
editable = false;
}
}
return editable;
}
protected void addHost() {
String hosts[] = promptForHost(null);
if (hosts != null) {
for (String host : hosts) {
bypassHosts.add(0, new ProxyBypassData(host, getEditableProvider()));
}
hostsViewer.refresh();
setProvider(currentProvider);
}
}
private String getEditableProvider() {
String providers[] = ProxySelector.getProviders();
for (String provider : providers) {
if (ProxySelector.canSetBypassHosts(provider)) {
return provider;
}
}
return null;
}
protected void removeSelection() {
IStructuredSelection selection = hostsViewer
.getStructuredSelection();
Iterator<?> it = selection.iterator();
while (it.hasNext()) {
ProxyBypassData data = (ProxyBypassData) it.next();
bypassHosts.remove(data);
}
hostsViewer.refresh();
}
protected void editSelection() {
if (!isSelectionEditable()) {
return;
}
IStructuredSelection selection = hostsViewer.getStructuredSelection();
@SuppressWarnings("unchecked")
String selectedHosts = getStringList(selection.iterator());
String hosts[] = promptForHost(selectedHosts);
if (hosts != null) {
Object[] selectedItems = selection.toArray();
for (int i = 0; i < selectedItems.length; i++) {
ProxyBypassData data = (ProxyBypassData) selectedItems[i];
data.setHost(hosts[i]);
}
hostsViewer.refresh();
}
}
String getStringList(Iterator<ProxyBypassData> iterator) {
StringBuilder buffer = new StringBuilder();
if (iterator.hasNext()) {
ProxyBypassData data = iterator.next();
buffer.append(data.getHost());
}
while (iterator.hasNext()) {
buffer.append(';');
ProxyBypassData data = iterator.next();
buffer.append(data.getHost());
}
return buffer.toString();
}
private String[] promptForHost(String selectedHosts) {
InputDialog dialog = new InputDialog(getShell(),
NetUIMessages.ProxyBypassDialog_0,
NetUIMessages.ProxyBypassDialog_1, selectedHosts, null) {
private ControlDecoration decorator;
@Override
protected Control createDialogArea(Composite parent) {
Control createDialogArea = super.createDialogArea(parent);
decorator = new ControlDecoration(getText(), SWT.TOP | SWT.LEFT);
decorator.setDescriptionText(NetUIMessages.ProxyBypassDialog_2);
decorator.setImage(FieldDecorationRegistry.getDefault()
.getFieldDecoration(
FieldDecorationRegistry.DEC_INFORMATION)
.getImage());
return createDialogArea;
}
@Override
public boolean close() {
decorator.dispose();
return super.close();
}
};
int result = dialog.open();
if (result != Window.CANCEL) {
String value = dialog.getValue();
String hosts[] = StringUtil.split(value, new String[] { ";", "|" }); //$NON-NLS-1$ //$NON-NLS-2$
ArrayList<String> filtered = new ArrayList<>();
for (String host : hosts) {
if (host.length() != 0) {
filtered.add(host);
}
}
return filtered.toArray(new String[0]);
}
return null;
}
private Button createButton(String message) {
Button button = new Button(this, SWT.PUSH);
button.setText(message);
button.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
return button;
}
public void initializeValues() {
String providers[] = ProxySelector.getProviders();
for (String provider : providers) {
bypassHosts.addAll(getProxyBypassData(provider));
}
hostsViewer.setInput(bypassHosts);
setProvider(ProxySelector.getDefaultProvider());
}
public void setProvider(String item) {
if (item == null) {
item = currentProvider;
} else {
currentProvider = item;
}
ArrayList<ProxyBypassData> selected = new ArrayList<>();
Iterator<ProxyBypassData> it = bypassHosts.iterator();
while (it.hasNext()) {
ProxyBypassData data = it.next();
if (data.getSource().equalsIgnoreCase(item)) {
selected.add(data);
}
}
hostsViewer
.setCheckedElements(selected.toArray(new ProxyBypassData[0]));
}
public void performApply() {
String provider = getEditableProvider();
Iterator<ProxyBypassData> it = bypassHosts.iterator();
ArrayList<String> hosts = new ArrayList<>();
while (it.hasNext()) {
ProxyBypassData data = it.next();
if (data.getSource().equals(provider)) {
hosts.add(data.getHost());
}
}
String data[] = hosts.toArray(new String[0]);
ProxySelector.setBypassHosts(provider, data);
}
public void refresh() {
ArrayList<ProxyBypassData> natives = new ArrayList<>();
String provider = getEditableProvider();
Iterator<ProxyBypassData> it = bypassHosts.iterator();
while (it.hasNext()) {
ProxyBypassData data = it.next();
if (!data.getSource().equals(provider)) {
natives.add(data);
}
}
bypassHosts.removeAll(natives);
String providers[] = ProxySelector.getProviders();
for (String p : providers) {
if (!p.equals(provider)) {
bypassHosts.addAll(getProxyBypassData(p));
}
}
hostsViewer.refresh();
setProvider(currentProvider);
}
private List<ProxyBypassData> getProxyBypassData(String provider) {
List<ProxyBypassData> bypassProxyData = new ArrayList<>();
String[] hosts = ProxySelector.getBypassHosts(provider);
for (int j = 0; hosts != null && j < hosts.length; j++) {
ProxyBypassData data = new ProxyBypassData(hosts[j], provider);
bypassProxyData.add(data);
}
return bypassProxyData;
}
}