Java tutorial
/**************************************************************************** * * Copyright (c) 2010-2011, EBM WebSourcing * * This source code is available under agreement available at * http://www.petalslink.com/legal/licenses/petals-studio * * You should have received a copy of the agreement along with this program. * If not, write to EBM WebSourcing (4, rue Amelie - 31200 Toulouse, France). * *****************************************************************************/ package org.eclipse.bpel.common.wsdl.wizards; import java.io.File; import java.net.URI; import java.util.ArrayList; import org.eclipse.bpel.common.wsdl.helpers.UriAndUrlHelper; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.Assert; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.PlatformObject; 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.TreeViewer; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; 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.FileDialog; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; /** * A wizard page to import a resource in the workspace. * @author Vincent Zurczak - EBM WebSourcing * FIXME: is there an existing page we could reuse? */ public class UriResourceImportWizardPage extends WizardPage { private URI uri; private IContainer outputContainer; private boolean complete = false; private String initialUri; private final String shortName; private final String[] filterNames, filterExtensions; /** * Constructor. * @param selection * @param shortName * @param filterNames * @param filterExtensions */ public UriResourceImportWizardPage(IStructuredSelection selection, String shortName, String[] filterNames, String[] filterExtensions) { super("Import Page"); this.shortName = shortName; this.filterNames = filterNames; this.filterExtensions = filterExtensions; if (!selection.isEmpty()) { Object o = selection.getFirstElement(); IResource res = (IResource) getAdapter(o, IResource.class); if (res instanceof IContainer) this.outputContainer = (IContainer) res; else if (res != null) this.outputContainer = res.getParent(); } } /* * (non-Javadoc) * @see org.eclipse.jface.dialogs.IDialogPage * #createControl(org.eclipse.swt.widgets.Composite) */ @Override public void createControl(Composite parent) { Composite container = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(2, false); container.setLayout(layout); container.setLayoutData(new GridData(GridData.FILL_BOTH)); // WSDL field Label l = new Label(container, SWT.NONE); l.setText(this.shortName + " URI:"); GridData layoutData = new GridData(); layoutData.verticalIndent = 6; layoutData.horizontalSpan = 2; l.setLayoutData(layoutData); final Text text = new Text(container, SWT.BORDER | SWT.SINGLE); text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); text.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { String uri = text.getText(); if (uri.trim().length() == 0) return; try { UriResourceImportWizardPage.this.uri = UriAndUrlHelper.urlToUri(uri); } catch (Exception e1) { UriResourceImportWizardPage.this.uri = null; } validate(); } }); if (this.initialUri != null) text.setText(this.initialUri); Button b = new Button(container, SWT.PUSH); b.setText("Browse..."); b.addSelectionListener(new SelectionAdapter() { @Override public void widgetDefaultSelected(SelectionEvent e) { widgetSelected(e); } @Override public void widgetSelected(SelectionEvent e) { FileDialog dlg = new FileDialog(text.getShell(), SWT.SINGLE); dlg.setFilterNames(UriResourceImportWizardPage.this.filterNames); dlg.setFilterExtensions(UriResourceImportWizardPage.this.filterExtensions); String path = dlg.open(); if (path != null) { String uri = new File(path).toURI().toString(); text.setText(uri); text.setSelection(uri.length()); text.setFocus(); } } }); // Container selection l = new Label(container, SWT.NONE); l.setText("Select the container in which the " + this.shortName + " will be imported."); layoutData = new GridData(); layoutData.verticalIndent = 10; layoutData.horizontalSpan = 2; l.setLayoutData(layoutData); TreeViewer viewer = new TreeViewer(container, SWT.SINGLE | SWT.V_SCROLL | SWT.V_SCROLL | SWT.BORDER); layoutData = new GridData(GridData.FILL_BOTH); layoutData.heightHint = 200; layoutData.horizontalSpan = 2; viewer.getTree().setLayoutData(layoutData); viewer.setLabelProvider(new WorkbenchLabelProvider()); viewer.setContentProvider(new WorkbenchContentProvider() { @Override public Object[] getChildren(Object o) { if (o instanceof IContainer) { IResource[] members; try { members = ((IContainer) o).members(); } catch (Exception e) { return new Object[0]; } ArrayList<IResource> results = new ArrayList<IResource>(); for (IResource member : members) { if (member instanceof IContainer) results.add(member); } return results.toArray(); } return new Object[0]; } }); // Set page input IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); viewer.setInput(root); if (this.outputContainer != null) { viewer.setSelection(new StructuredSelection(this.outputContainer), true); viewer.expandToLevel(this.outputContainer, 1); viewer.reveal(this.outputContainer.getProject()); } viewer.addSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection s = (IStructuredSelection) event.getSelection(); if (!s.isEmpty()) UriResourceImportWizardPage.this.outputContainer = (IContainer) s.getFirstElement(); else UriResourceImportWizardPage.this.outputContainer = null; validate(); } }); text.setFocus(); setControl(container); } /** * Validates the page entries. */ private void validate() { if (this.uri == null) { setErrorMessage("The " + this.shortName + "'s URI is invalid."); setPageComplete(false); return; } if ("file".equals(this.uri.getScheme()) && !new File(this.uri).exists()) { setErrorMessage("This URI points to a file that does not exist."); setPageComplete(false); return; } if (this.outputContainer == null) { setErrorMessage("You must select the destination container."); setPageComplete(false); return; } setErrorMessage(null); setPageComplete(true); } /* * (non-Javadoc) * @see org.eclipse.jface.wizard.WizardPage * #isPageComplete() */ @Override public boolean isPageComplete() { return this.complete; } /* * (non-Javadoc) * @see org.eclipse.jface.wizard.WizardPage * #setPageComplete(boolean) */ @Override public void setPageComplete(boolean complete) { this.complete = complete; super.setPageComplete(complete); } /** * @return the outputContainer */ public IContainer getOutputContainer() { return this.outputContainer; } /** * @return the uri */ public URI getUriToImport() { return this.uri; } /** * @param initialUri the initial URI to set */ public void setInitialUri(String initialUri) { this.initialUri = initialUri; } /** * Gets the appropriate adapter. * @param sourceObject * @param adapterType * @return */ public static Object getAdapter(Object sourceObject, Class<?> adapterType) { Assert.isNotNull(adapterType); if (sourceObject == null) { return null; } if (adapterType.isInstance(sourceObject)) { return sourceObject; } if (sourceObject instanceof IAdaptable) { IAdaptable adaptable = (IAdaptable) sourceObject; Object result = adaptable.getAdapter(adapterType); if (result != null) { // Sanity-check Assert.isTrue(adapterType.isInstance(result)); return result; } } if (!(sourceObject instanceof PlatformObject)) { Object result = Platform.getAdapterManager().getAdapter(sourceObject, adapterType); if (result != null) { return result; } } return null; } }