blob: c8f6df3c75e9ccc3ac3b7f137512f68bd030cdc2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 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
*******************************************************************************/
package org.eclipse.ui.internal.net;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.internal.net.ProxyData;
import org.eclipse.core.internal.net.ProxySelector;
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 the controls for proxy entries
* and is used by ProxyPreferencesPage.
*/
public class ProxyEntriesComposite extends Composite {
private Label entriesLabel;
private CheckboxTableViewer entriesViewer;
// private Button addButton;
private Button editButton;
private Button removeButton;
protected String currentProvider;
private ArrayList<ProxyData> proxyEntries = new ArrayList<>();
ProxyEntriesComposite(Composite parent, int style) {
super(parent, style);
createWidgets();
}
protected void createWidgets() {
setLayout(new GridLayout(2, false));
entriesLabel = new Label(this, SWT.NONE);
entriesLabel.setText(NetUIMessages.ProxyPreferencePage_1);
entriesLabel.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER,
false, false, 2, 1));
Table entriesTable = new Table(this, SWT.BORDER | SWT.V_SCROLL
| SWT.H_SCROLL | SWT.MULTI | SWT.FULL_SELECTION | SWT.CHECK);
entriesTable.setHeaderVisible(true);
entriesTable.setLinesVisible(true);
entriesTable.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true,
1, 3));
entriesViewer = new CheckboxTableViewer(entriesTable);
ProxyEntriesLabelProvider labelProvider = new ProxyEntriesLabelProvider();
ProxyEntriesContentProvider contentProvider = new ProxyEntriesContentProvider();
labelProvider.createColumns(entriesViewer);
entriesViewer.setContentProvider(contentProvider);
entriesViewer.setLabelProvider(labelProvider);
TableLayout tableLayout = new TableLayout();
tableLayout.addColumnData(new ColumnPixelData(24));
tableLayout.addColumnData(new ColumnWeightData(20, 50, true));
tableLayout.addColumnData(new ColumnWeightData(50, 50, true));
tableLayout.addColumnData(new ColumnWeightData(20, 50, true));
tableLayout.addColumnData(new ColumnWeightData(20, 50, true));
tableLayout.addColumnData(new ColumnWeightData(20, 50, true));
tableLayout.addColumnData(new ColumnWeightData(50, 50, true));
tableLayout.addColumnData(new ColumnWeightData(50, 50, true));
entriesTable.setLayout(tableLayout);
// addButton = createButton(NetUIMessages.ProxyPreferencePage_9);
editButton = createButton(NetUIMessages.ProxyPreferencePage_10);
removeButton = createButton(NetUIMessages.ProxyPreferencePage_11);
entriesViewer
.addSelectionChangedListener(event -> enableButtons());
entriesViewer.addCheckStateListener(event -> setProvider(currentProvider));
entriesViewer.addDoubleClickListener(event -> editSelection());
// addButton.addSelectionListener(new SelectionAdapter() {
// public void widgetSelected(SelectionEvent e) {
// addEntry();
// }
// });
editButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
editSelection();
}
});
removeButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
removeSelection();
}
});
initializeValues();
enableButtons();
}
protected void enableButtons() {
boolean enabled = getEnabled();
if (enabled) {
// addButton.setEnabled(true);
editButton.setEnabled(isSelectionEditable());
removeButton.setEnabled(isSelectionRemovable());
} else {
// addButton.setEnabled(false);
editButton.setEnabled(false);
removeButton.setEnabled(false);
}
}
private boolean isSelectionEditable() {
IStructuredSelection selection = entriesViewer.getStructuredSelection();
return isSelectionRemovable() && selection.size() == 1;
}
private boolean isSelectionRemovable() {
IStructuredSelection selection = entriesViewer.getStructuredSelection();
Iterator<?> iterator = selection.iterator();
boolean editable = iterator.hasNext();
while (iterator.hasNext()) {
String provider = ((ProxyData) iterator.next()).getSource();
if (!ProxySelector.canSetProxyData(provider)) {
editable = false;
}
}
return editable;
}
protected void addEntry() {
Iterator<ProxyData> it = proxyEntries.iterator();
ArrayList<String> added = new ArrayList<>();
String editableProvider = getEditableProvider();
while (it.hasNext()) {
ProxyData data = it.next();
if (data.getSource().equalsIgnoreCase(editableProvider)) {
added.add(data.getType());
}
}
String addedArray[] = added.toArray(new String[0]);
ProxyData data = promptForEntry(null, addedArray,
NetUIMessages.ProxyEntryDialog_0);
if (data != null) {
data.setSource(editableProvider);
proxyEntries.add(0, data);
entriesViewer.refresh();
}
}
private String getEditableProvider() {
String providers[] = ProxySelector.getProviders();
for (String provider : providers) {
if (ProxySelector.canSetProxyData(provider)) {
return provider;
}
}
return null;
}
private ProxyData promptForEntry(ProxyData entry, String[] addedArray,
String title) {
ProxyEntryDialog dialog = new ProxyEntryDialog(getShell(), entry,
addedArray, title);
int result = dialog.open();
if (result != Window.CANCEL) {
return dialog.getValue();
}
return null;
}
protected void editSelection() {
if (!isSelectionRemovable()) {
return;
}
Iterator<?> itsel = entriesViewer.getStructuredSelection().iterator();
ProxyData toEdit = null;
if (itsel.hasNext()) {
toEdit = ((ProxyData) itsel.next());
} else {
return;
}
Iterator<ProxyData> it = proxyEntries.iterator();
ArrayList<String> added = new ArrayList<>();
String editableProvider = getEditableProvider();
while (it.hasNext()) {
ProxyData data = it.next();
if (data.getSource().equalsIgnoreCase(editableProvider)) {
if (data.getType() != toEdit.getType()) {
added.add(data.getType());
}
}
}
String addedArray[] = added.toArray(new String[0]);
ProxyData data = promptForEntry(toEdit, addedArray,
NetUIMessages.ProxyEntryDialog_1);
if (data != null) {
entriesViewer.refresh();
}
}
protected void removeSelection() {
IStructuredSelection selection = entriesViewer.getStructuredSelection();
Iterator<?> it = selection.iterator();
while (it.hasNext()) {
ProxyData data = (ProxyData) it.next();
data.setHost(""); //$NON-NLS-1$
data.setPort(-1);
data.setUserid(null);
data.setPassword(null);
}
entriesViewer.refresh();
}
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) {
proxyEntries.addAll(getProxyData(provider));
}
entriesViewer.setInput(proxyEntries);
setProvider(ProxySelector.getDefaultProvider());
}
public void setProvider(String item) {
if (item == null) {
item = currentProvider;
} else {
currentProvider = item;
}
ArrayList<ProxyData> checked = new ArrayList<>();
Iterator<ProxyData> it = proxyEntries.iterator();
while (it.hasNext()) {
ProxyData data = it.next();
if (data.getSource().equalsIgnoreCase(item)) {
checked.add(data);
}
}
entriesViewer.setCheckedElements(checked.toArray(new ProxyData[0]));
}
public void performApply() {
String provider = getEditableProvider();
Iterator<ProxyData> it = proxyEntries.iterator();
ArrayList<ProxyData> proxies = new ArrayList<>();
while (it.hasNext()) {
ProxyData data = it.next();
if (data.getSource().equals(provider)) {
proxies.add(data);
}
}
ProxyData data[] = proxies.toArray(new ProxyData[0]);
ProxySelector.setProxyData(provider, data);
}
public void refresh() {
String provider = getEditableProvider();
Iterator<ProxyData> it = proxyEntries.iterator();
ArrayList<ProxyData> natives = new ArrayList<>();
while (it.hasNext()) {
ProxyData data = it.next();
if (!data.getSource().equals(provider)) {
natives.add(data);
}
}
proxyEntries.removeAll(natives);
String[] providers = ProxySelector.getProviders();
for (String p : providers) {
if (!p.equals(provider)) {
proxyEntries.addAll(getProxyData(p));
}
}
entriesViewer.refresh();
setProvider(currentProvider);
}
private List<ProxyData> getProxyData(String provider) {
List<ProxyData> proxyDatas = new ArrayList<>();
ProxyData[] entries = ProxySelector.getProxyData(provider);
for (ProxyData entry : entries) {
entry.setSource(provider);
proxyDatas.add(entry);
}
return proxyDatas;
}
}