Java tutorial
/* * Copyright (c) 2010 Eclipse Team Etceteras Project and others. * 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: * - Michael Pellaton: initial implementation */ package ch.netcetera.eclipse.workspaceconfig.ui; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; 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.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; import org.eclipse.swt.widgets.Text; import ch.netcetera.eclipse.common.text.ITextAccessor; import ch.netcetera.eclipse.common.validator.UriInputValidator; import ch.netcetera.eclipse.workspaceconfig.ui.preferences.ConfigurationUtil; /** * The one and only page of the {@link RemotePreferencesImportWizard}. */ public class RemotePreferencesImportPage extends WizardPage { private final UriInputValidator uriValidator = new UriInputValidator(Collections.<String>emptyList(), "", WorkspaceConfigurationUIPlugin.getDefault()); private Text urlText; private Table table; private ITextAccessor textAccessor; private TableColumn tableColumn; /** * Default constructor. */ protected RemotePreferencesImportPage() { this("remotePreferencesImportPage"); } /** * Constructor. * * @param pageName the page name */ protected RemotePreferencesImportPage(String pageName) { super(pageName); this.textAccessor = WorkspaceConfigurationUIPlugin.getDefault(); setTitle(this.textAccessor.getText("import.wizard.title")); setDescription(this.textAccessor.getText("import.wizard.description")); } /** {@inheritDoc} */ @Override public void createControl(Composite parent) { initializeDialogUnits(parent); Composite composite = new Composite(parent, SWT.NULL); composite.setLayout(new GridLayout()); composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL)); // first option: direct URL input Button directImportRadioButton = new Button(composite, SWT.RADIO); directImportRadioButton.setText(this.textAccessor.getText("import.wizard.fromurl")); directImportRadioButton.addSelectionListener(new SelectionAdapter() { /** {@inheritDoc} */ @Override public void widgetSelected(SelectionEvent e) { super.widgetSelected(e); RemotePreferencesImportPage.this.table.setEnabled(false); RemotePreferencesImportPage.this.urlText.setEnabled(true); validateUrl(); } }); this.urlText = new Text(composite, SWT.BORDER); this.urlText.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL)); this.urlText.setEnabled(false); this.urlText.addKeyListener(new KeyAdapter() { /** {@inheritDoc} */ @Override public void keyReleased(KeyEvent e) { super.keyReleased(e); validateUrl(); } }); // second option: list of configured URLs Button importConfiguredRadioButton = new Button(composite, SWT.RADIO); importConfiguredRadioButton.setText(this.textAccessor.getText("import.wizard.fromlist")); importConfiguredRadioButton.setSelection(true); importConfiguredRadioButton.addSelectionListener(new SelectionAdapter() { /** {@inheritDoc} */ @Override public void widgetSelected(SelectionEvent e) { super.widgetSelected(e); RemotePreferencesImportPage.this.table.setEnabled(true); RemotePreferencesImportPage.this.urlText.setEnabled(false); validateTableSelection(); } }); this.table = new Table(composite, SWT.BORDER | SWT.CHECK); GridData tgd = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_BOTH); tgd.heightHint = 200; this.table.setLayoutData(tgd); this.table.addSelectionListener(new SelectionAdapter() { /** {@inheritDoc} */ @Override public void widgetSelected(SelectionEvent e) { super.widgetSelected(e); validateTableSelection(); } }); tableColumn = new TableColumn(this.table, SWT.LEFT); table.addControlListener(new ControlAdapter() { @Override public void controlResized(ControlEvent e) { resiseTableColumnWidth(); } }); loadTableItems(); setControl(composite); Dialog.applyDialogFont(composite); calculatePageComplete(); } /** * Calculates the single table column's with so that it always fills the entire table width. * 40 pixels are subtracted for the space the checkbox and vertical scroll bar may take. This * value was found by testing on different platforms and might be wrong in some cases. However, * it's an educated guess and being off a bit does not render the UI unusable. */ private void resiseTableColumnWidth() { tableColumn.setWidth(table.getSize().x - 40); } /** * Validates the contents of the URL text field to be a valid URL. */ void validateUrl() { String url = RemotePreferencesImportPage.this.urlText.getText(); String message = this.uriValidator.isValid(url); setErrorMessage(message); calculatePageComplete(); } /** * Validates that at least one table item is checked. */ void validateTableSelection() { setErrorMessage(null); if (getCheckedTableItemsAsString().isEmpty()) { setErrorMessage(this.textAccessor.getText("import.wizard.error.selectone")); } calculatePageComplete(); } /** * Finds out whether this wizard page is in a state that allows finishing the wizard. */ private void calculatePageComplete() { boolean urlTextOk = !this.urlText.isEnabled() || !this.urlText.getText().isEmpty(); boolean hasError = getErrorMessage() != null; setPageComplete(!hasError && urlTextOk); } /** * Loads the URLs configured in the preferences and adds them to the table. */ private void loadTableItems() { for (String url : ConfigurationUtil.getEpfUrls()) { TableItem item = new TableItem(this.table, SWT.NONE); item.setText(url); item.setChecked(true); } } /** * Gets the list of URLs that need to be imported when this wizard page finishes. * <p> * In case the user opted to enter an url, the list contains the entered URL as * sole item. In case the user opted to select from the configured URLs, all * checked URLs are returned. * </p> * * @return the list of URLs that need to be imported */ List<String> getImportUrlList() { if (this.urlText.isEnabled()) { return Collections.singletonList(this.urlText.getText().trim()); } return getCheckedTableItemsAsString(); } /** * Finds out whether system variable substitutions shall be performed during the import. * * @return {@code true} if variable substitutions shall be performed and {@code false} otherwise */ boolean doVariableSubstitution() { return this.table.isEnabled(); } /** * Gets a list containing all URLs belonging to checked items of the table. * * @return a list containing all URLs belonging to checked items of the table */ private List<String> getCheckedTableItemsAsString() { List<String> checkedTableItems = new ArrayList<String>(); for (TableItem tableItem : this.table.getItems()) { if (tableItem.getChecked()) { checkedTableItems.add(tableItem.getText()); } } return checkedTableItems; } }