Java tutorial
/******************************************************************************* * Copyright (c) 2009 Berthold Daum. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Berthold Daum - initial API and implementation *******************************************************************************/ package com.bdaum.zoom.net.ui.internal.preferences; import java.util.List; import org.eclipse.core.net.proxy.IProxyData; import org.eclipse.core.net.proxy.IProxyService; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; 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.events.VerifyEvent; import org.eclipse.swt.events.VerifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbench; import com.bdaum.zoom.css.ZColumnLabelProvider; import com.bdaum.zoom.net.core.ftp.FtpAccount; import com.bdaum.zoom.net.ui.internal.HelpContextIds; import com.bdaum.zoom.net.ui.internal.NetActivator; import com.bdaum.zoom.ui.internal.UiUtilities; import com.bdaum.zoom.ui.internal.ZViewerComparator; import com.bdaum.zoom.ui.internal.dialogs.EditFtpDialog; import com.bdaum.zoom.ui.internal.widgets.RadioButtonGroup; import com.bdaum.zoom.ui.preferences.AbstractPreferencePage; import com.bdaum.zoom.ui.widgets.CGroup; import com.bdaum.zoom.ui.widgets.NumericControl; @SuppressWarnings("restriction") public class InternetPreferencePage extends AbstractPreferencePage { private IProxyService proxyService; private Text portField; private Text proxyField; private NumericControl timeoutField; private List<FtpAccount> ftpAccounts; private TableViewer ftpViewer; private Button editButton; private Button removeButton; private RadioButtonGroup proxyGroup; private Composite configGroup; public InternetPreferencePage() { setDescription(Messages.InternetPreferencePage_Common_Internet_settings); } /* * (non-Javadoc) * * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench) */ @Override public void init(IWorkbench wb) { this.workbench = wb; setPreferenceStore(NetActivator.getDefault().getPreferenceStore()); proxyService = NetActivator.getDefault().getProxyService(); } @Override public void dispose() { NetActivator.getDefault().ungetProxyService(proxyService); } @Override protected void createPageContents(Composite composite) { setHelp(HelpContextIds.INTERNET_PREFERENCE_PAGE); createTabFolder(composite, "Internet"); //$NON-NLS-1$ UiUtilities.createTabItem(tabFolder, Messages.InternetPreferencePage_http_ftp, Messages.InternetPreferencePage_http_tooltip).setControl(createHttpGroup(tabFolder)); createExtensions(tabFolder, "com.bdaum.zoom.net.preferences.InternetPreferencePage"); //$NON-NLS-1$ fillValues(); initTabFolder(0); } private Control createHttpGroup(Composite parent) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); composite.setLayout(new GridLayout(1, false)); createProxyGroup(composite); createTimeoutGroup(composite); createFtpGroup(composite); return composite; } private void createFtpGroup(Composite parent) { CGroup group = UiUtilities.createGroup(parent, 2, Messages.InternetPreferencePage_ftp_accounts); ftpViewer = new TableViewer(group, SWT.V_SCROLL | SWT.SINGLE | SWT.BORDER); ftpViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); ftpViewer.setContentProvider(ArrayContentProvider.getInstance()); ftpViewer.setLabelProvider(new ZColumnLabelProvider() { @Override public String getText(Object element) { if (element instanceof FtpAccount) return ((FtpAccount) element).getName(); return element.toString(); } }); ftpViewer.setComparator(ZViewerComparator.INSTANCE); Composite buttonGroup = new Composite(group, SWT.NONE); buttonGroup.setLayoutData(new GridData(SWT.END, SWT.FILL, false, true)); buttonGroup.setLayout(new GridLayout(1, false)); Button newButton = createPushButton(buttonGroup, Messages.InternetPreferencePage_new, Messages.InternetPreferencePage_new_tooltip); newButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { EditFtpDialog dialog = new EditFtpDialog(getShell(), new FtpAccount(), false, null); if (dialog.open() == Window.OK) { FtpAccount result = dialog.getResult(); ftpAccounts.add(result); ftpViewer.setInput(ftpAccounts); ftpViewer.setSelection(new StructuredSelection(result)); } } }); editButton = createPushButton(buttonGroup, Messages.InternetPreferencePage_edit, Messages.InternetPreferencePage_edit_tooltip); editButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { IStructuredSelection selection = ftpViewer.getStructuredSelection(); Object firstElement = selection.getFirstElement(); if (firstElement instanceof FtpAccount) { EditFtpDialog dialog = new EditFtpDialog(getShell(), (FtpAccount) firstElement, false, null); if (dialog.open() == Window.OK) { ftpViewer.update(dialog.getResult(), null); } } } }); removeButton = createPushButton(buttonGroup, Messages.InternetPreferencePage_remove, Messages.InternetPreferencePage_remove_tooltip); removeButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { Object firstElement = ftpViewer.getStructuredSelection().getFirstElement(); if (firstElement instanceof FtpAccount) { int i = ftpAccounts.indexOf(firstElement); FtpAccount sibling = (i < ftpAccounts.size() - 1) ? ftpAccounts.get(i + 1) : (i > 0) ? ftpAccounts.get(i - 1) : null; ftpAccounts.remove(i); ftpViewer.setInput(ftpAccounts); if (sibling != null) ftpViewer.setSelection(new StructuredSelection(sibling)); } } }); ftpViewer.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { updateButtons(); } }); updateButtons(); } @Override protected void doUpdateButtons() { boolean enabled = !ftpViewer.getSelection().isEmpty(); editButton.setEnabled(enabled); removeButton.setEnabled(enabled); } private static Button createPushButton(Composite parent, String lab, String tooltip) { Button button = new Button(parent, SWT.PUSH); button.setText(lab); button.setToolTipText(tooltip); return button; } @SuppressWarnings("unused") private void createProxyGroup(Composite parent) { CGroup group = UiUtilities.createGroup(parent, 2, Messages.InternetPreferencePage_http_proxy); proxyGroup = new RadioButtonGroup(group, null, SWT.NONE, Messages.InternetPreferencePage_System_proxy_config, Messages.InternetPreferencePage_Direct_connection, Messages.InternetPreferencePage_Manual_config); proxyGroup.addListener(new Listener() { @Override public void handleEvent(Event event) { updateFields(); if (proxyField.getEnabled()) proxyField.setFocus(); } }); new Label(group, SWT.NONE); configGroup = createConfigGroup(group); } @Override protected void fillValues() { if (proxyService == null) { proxyGroup.setSelection(1); proxyGroup.setEnabled(false); } else { proxyGroup.setEnabled(0, proxyService.hasSystemProxies()); proxyGroup.setSelection( proxyService.isProxiesEnabled() ? proxyService.isSystemProxiesEnabled() ? 0 : 2 : 1); IProxyData proxyData = proxyService.getProxyData(IProxyData.HTTP_PROXY_TYPE); if (proxyData != null) { proxyField.setText(safeValue(proxyData.getHost())); int port = proxyData.getPort(); portField.setText(port < 0 ? "" : String.valueOf(port)); //$NON-NLS-1$ } } int timeout = getPreferenceStore().getInt(PreferenceConstants.TIMEOUT); timeoutField.setSelection(timeout); if (ftpAccounts == null) { ftpAccounts = FtpAccount.getAllAccounts(); ftpViewer.setInput(ftpAccounts); } updateFields(); } private static String safeValue(String text) { return text == null ? "" : text; //$NON-NLS-1$ } private void updateFields() { configGroup.setVisible(proxyGroup.getSelection() == 2); } private Composite createConfigGroup(Composite comp) { Composite grp = new Composite(comp, SWT.NONE); GridData data = new GridData(GridData.FILL_HORIZONTAL); data.horizontalIndent = 15; grp.setLayoutData(data); grp.setLayout(new GridLayout(4, false)); new Label(grp, SWT.NONE).setText(Messages.InternetPreferencePage_HTTP_Proxy); proxyField = new Text(grp, SWT.BORDER); proxyField.setLayoutData(new GridData(150, SWT.DEFAULT)); new Label(grp, SWT.NONE).setText(Messages.InternetPreferencePage_Port); portField = new Text(grp, SWT.BORDER); portField.setLayoutData(new GridData(50, SWT.DEFAULT)); portField.addVerifyListener(new VerifyListener() { public void verifyText(VerifyEvent e) { for (int i = 0; i < e.text.length(); i++) if (!Character.isDigit(e.text.charAt(i))) { e.doit = false; break; } } }); return grp; } private void createTimeoutGroup(Composite comp) { CGroup grp = UiUtilities.createGroup(comp, 2, Messages.InternetPreferencePage_connection_timeout); new Label(grp, SWT.NONE).setText(Messages.InternetPreferencePage_Timeout); timeoutField = new NumericControl(grp, SWT.NONE); timeoutField.setMinimum(1); timeoutField.setMaximum(120); } @Override protected void doPerformDefaults() { getPreferenceStore().setValue(PreferenceConstants.TIMEOUT, getPreferenceStore().getDefaultInt(PreferenceConstants.TIMEOUT)); } @Override protected void doPerformOk() { if (proxyService != null) { int selection = proxyGroup.getSelection(); if (selection == 2) { proxyService.setProxiesEnabled(true); proxyService.setSystemProxiesEnabled(false); IProxyData proxyData = proxyService.getProxyData(IProxyData.HTTP_PROXY_TYPE); if (proxyData != null) { String text = proxyField.getText(); proxyData.setHost(text.isEmpty() ? null : text); text = portField.getText(); proxyData.setPort(text.isEmpty() ? -1 : Integer.parseInt(text)); try { proxyService.setProxyData(new IProxyData[] { proxyData }); } catch (CoreException e) { NetActivator.getDefault().logError(Messages.InternetPreferencePage_error_setting_proxy, e); } } } else if (selection == 0) { proxyService.setProxiesEnabled(true); proxyService.setSystemProxiesEnabled(true); } else { proxyService.setProxiesEnabled(false); proxyService.setSystemProxiesEnabled(false); } } getPreferenceStore().setValue(PreferenceConstants.TIMEOUT, timeoutField.getSelection()); FtpAccount.saveAccounts(ftpAccounts); } }