/******************************************************************************* * Copyright (c) 2012 IBM Corporation 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: * IBM Corporation - initial API and implementation ******************************************************************************/ package org.eclipse.linuxtools.profiling.launch.ui; import java.net.URI; import java.net.URISyntaxException; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IStatus; import org.eclipse.linuxtools.internal.profiling.launch.ProfileLaunchPlugin; import org.eclipse.osgi.util.TextProcessor; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FillLayout; 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.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; /** * @since 2.0 */ public class ResourceSelectorWidget { public enum ResourceType { FILE, DIRECTORY } private static String BROWSE_LABEL = ResourceSelectorWidgetMessages.browseLabelText; private ResourceType resourceType; private Group mainComp; private String sectionLabelText; private Label uriLabel; private Text uriField; private Button browseButton; private FileSystemSelectionArea fileSystemSelectionArea; /** * Open an appropriate directory browser */ private void handleURIBrowseButtonPressed() { String selectedResource = null; String path = getURIText().getText(); FileSystemElement fileSystem = fileSystemSelectionArea.getSelectedFileSystem(); IRemoteResourceSelectorProxy resourceSelector = fileSystem.getSelectorProxy(); if (resourceSelector != null) { switch (resourceType) { case FILE: { URI uri = resourceSelector.selectFile(fileSystem.getScheme(), path, ResourceSelectorWidgetMessages.ResourceSelectorWidget_select + sectionLabelText, browseButton.getShell()); if (uri != null) { selectedResource = uri.toString(); } break; } case DIRECTORY: { URI uri = resourceSelector.selectDirectory(fileSystem.getScheme(), path, ResourceSelectorWidgetMessages.ResourceSelectorWidget_select + sectionLabelText, browseButton.getShell()); if (uri != null) { selectedResource = uri.toString(); } break; } default: ProfileLaunchPlugin.log(IStatus.ERROR, ResourceSelectorWidgetMessages.ResourceSelectorWidget_unrecognized_resourceType); return; } } else { ProfileLaunchPlugin.log(IStatus.ERROR, ResourceSelectorWidgetMessages.ResourceSelectorWidget_getSelectorProxy_returned_null); } if (selectedResource != null) { updateURIField(selectedResource); } } /** * Update the filesystem selector, if possible. * * @param newPath The new path to be set. */ private void updateFilesystemSelector(String newPath) { try { URI selectedURI = new URI(newPath); String scheme = selectedURI.getScheme(); try { if (scheme == null) { fileSystemSelectionArea.setSelectedFileSystem("local"); //$NON-NLS-1$ } else { fileSystemSelectionArea.setSelectedFileSystem(scheme); } } catch (CoreException e) { // Probably an unrecognized scheme. Don't change the setting of // the filesystem selector. } } catch (URISyntaxException e) { // This error can be ignored because we just won't set the // filesystem selector // to a anything } } /** * Update the URI field based on the selected path. * * @param selectedPath The path to be selected. */ private void updateURIField(String selectedPath) { uriField.setText(TextProcessor.process(selectedPath)); updateFilesystemSelector(selectedPath); } /** * Create the file system selection area. * * @param composite Parent composite */ private void createFileSystemSelection(Composite composite) { fileSystemSelectionArea = new FileSystemSelectionArea(); fileSystemSelectionArea.createContents(composite); } /** * Create the area for user entry. * * @param composite Parent composite * @param uriLabelText Label for uri text widget. */ private void createUserEntryArea(Composite composite, String uriLabelText) { // location label GridLayout layout = new GridLayout(); layout.numColumns = 2; layout.marginHeight = 0; layout.marginWidth = 0; composite.setLayout(layout); uriLabel = new Label(composite, SWT.NONE); if (uriLabelText != null) { uriLabel.setText(uriLabelText); } else { uriLabel.setText(ResourceSelectorWidgetMessages.uriLabelText); } // project location entry field uriField = new Text(composite, SWT.BORDER); GridData data = new GridData(GridData.FILL_HORIZONTAL); data.horizontalSpan = 1; uriField.setLayoutData(data); // create a blank space to align the filesystem selector with the path box. new Label(composite, SWT.NONE); Composite browserComp = new Composite(composite, SWT.NONE); FillLayout browserLayout = new FillLayout(SWT.HORIZONTAL); browserComp.setLayout(browserLayout); createFileSystemSelection(browserComp); // browse button browseButton = new Button(browserComp, SWT.PUSH); browseButton.setText(BROWSE_LABEL); browseButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent event) { handleURIBrowseButtonPressed(); } }); uriField.addModifyListener(e -> updateFilesystemSelector(uriField.getText())); } public ResourceSelectorWidget(Composite parent, ResourceType resourceType, int colSpan, String sectionLabelText, String uriLabelText) { this.resourceType = resourceType; this.sectionLabelText = sectionLabelText; mainComp = new Group(parent, SWT.NONE); GridLayout mainLayout = new GridLayout(); mainLayout.numColumns = 5; mainLayout.marginHeight = 0; mainLayout.marginWidth = 0; mainComp.setLayout(mainLayout); GridData gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = colSpan; mainComp.setLayoutData(gd); mainComp.setText(sectionLabelText); createUserEntryArea(mainComp, uriLabelText); } public void setEnabled(boolean enabled) { if (mainComp != null) { mainComp.setEnabled(enabled); } if (uriLabel != null) { uriLabel.setEnabled(enabled); } if (browseButton != null) { browseButton.setEnabled(enabled); } if (uriField != null) { uriField.setEnabled(enabled); } if (fileSystemSelectionArea != null) { fileSystemSelectionArea.setEnabled(enabled); } } public Text getURIText() { return uriField; } }