/******************************************************************************* * Copyright (c) 2013 Intel 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: * Intel - Initial API and implementation *******************************************************************************/ package org.yocto.bc.ui.wizards.install; import java.net.URI; import org.eclipse.core.filesystem.URIUtil; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.operation.IRunnableContext; import org.eclipse.ptp.rdt.ui.wizards.RemoteProjectContentsLocationArea; import org.eclipse.ptp.remote.core.IRemoteFileManager; 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.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.internal.ide.IDEWorkbenchMessages; import org.eclipse.ui.internal.ide.dialogs.IDEResourceInfoUtils; import java.net.URI; import org.eclipse.core.filesystem.URIUtil; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.operation.IRunnableContext; import org.eclipse.ptp.rdt.ui.messages.Messages; //import org.eclipse.ptp.rdt.ui.serviceproviders.RemoteBuildServiceProvider; //import org.eclipse.ptp.rdt.core.serviceproviders. import org.eclipse.ptp.remote.core.IRemoteConnection; import org.eclipse.ptp.remote.core.IRemoteFileManager; import org.eclipse.ptp.remote.core.IRemoteServices; import org.eclipse.ptp.remote.ui.IRemoteUIConnectionManager; import org.eclipse.ptp.remote.ui.IRemoteUIConstants; import org.eclipse.ptp.remote.ui.IRemoteUIFileManager; import org.eclipse.ptp.remote.ui.IRemoteUIServices; import org.eclipse.ptp.remote.ui.RemoteUIServices; import org.eclipse.ptp.remote.ui.widgets.RemoteConnectionWidget; 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.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.internal.ide.IDEWorkbenchMessages; import org.eclipse.ui.internal.ide.dialogs.IDEResourceInfoUtils; public class BBCRemoteProjectContentsLocationArea { /** * IErrorMessageReporter is an interface for type that allow message * reporting. * */ public interface IErrorMessageReporter { /** * Report the error message * * @param errorMessage * String or null. If the errorMessage is null * then clear any error state. * @param infoOnly * the message is an informational message, but the dialog * cannot continue * */ public void reportError(String errorMessage, boolean infoOnly); } private static final String FILE_SCHEME = "file"; //$NON-NLS-1$ private IProject fExistingProject; private final IErrorMessageReporter fErrorReporter; private final IRunnableContext fContext; //private RemoteBuildServiceProvider fProvider; private IRemoteConnection fSelectedConnection; private String fProjectName = IDEResourceInfoUtils.EMPTY_STRING; private Button fBrowseButton; private Text fLocationText; private RemoteConnectionWidget fRemoteConnectionWidget; // public RemoteProjectContentsLocationArea(IServiceProvider provider, // Composite composite) { // if(provider instanceof RemoteBuildServiceProvider) // fProvider = (RemoteBuildServiceProvider) provider; // else // throw new IllegalArgumentException(); // should never happen // createContents(composite); // } /** * @since 3.1 */ public BBCRemoteProjectContentsLocationArea(IErrorMessageReporter reporter, Composite composite, IRunnableContext context) { fErrorReporter = reporter; fContext = context; createContents(composite); } /** * Check if the entry in the widget location is valid. If it is valid return * null. Otherwise return a string that indicates the problem. * * @return String */ public String checkValidLocation() { String locationFieldContents = fLocationText.getText(); if (locationFieldContents.length() == 0) { return IDEWorkbenchMessages.WizardNewProjectCreationPage_projectLocationEmpty; } URI newPath = getProjectLocationURI(); if (newPath == null) { return IDEWorkbenchMessages.ProjectLocationSelectionDialog_locationError; } if (fExistingProject != null) { URI projectPath = fExistingProject.getLocationURI(); if (projectPath != null && URIUtil.equals(projectPath, newPath)) { return IDEWorkbenchMessages.ProjectLocationSelectionDialog_locationIsSelf; } } return null; } /** * Return the browse button. Usually referenced in order to set the layout * data for a dialog. * * @return Button */ public Button[] getButtons() { return new Button[] { fBrowseButton, fRemoteConnectionWidget.getButton() }; } /** * Returns the name of the selected connection. */ public IRemoteConnection getConnection() { return fSelectedConnection; } /** * Return the location for the project. * * @return String */ public String getProjectLocation() { return fLocationText.getText(); } /** * Get the URI for the location field if possible. * * @return URI or null if it is not valid. */ public URI getProjectLocationURI() { if (fSelectedConnection == null) return null; return fSelectedConnection.getRemoteServices().getFileManager(fSelectedConnection).toURI(fLocationText.getText()); } public IRemoteConnection getRemoteConnection() { return fSelectedConnection; } public IRemoteServices getRemoteServices() { if (fSelectedConnection != null) return fSelectedConnection.getRemoteServices(); return null; } /** * Return whether or not we are currently showing the default location for * the project. * * @return boolean */ public boolean isDefault() { // return useDefaultsButton.getSelection(); return false; } /** * Set the project to base the contents off of. * * @param existingProject */ public void setExistingProject(IProject existingProject) { fProjectName = existingProject.getName(); fExistingProject = existingProject; } /** * Set the text to the default or clear it if not using the defaults. * * @param newName * the name of the project to use. If null use the * existing project name. */ public void updateProjectName(String newName) { fProjectName = newName; if (isDefault()) { fLocationText.setText(getDefaultPathDisplayString()); } } /** * Attempt to open a connection. */ private void checkConnection() { IRemoteUIConnectionManager mgr = getUIConnectionManager(); if (mgr != null) { mgr.openConnectionWithProgress(fRemoteConnectionWidget.getShell(), fContext, fSelectedConnection); } } /** * Return the path we are going to display. If it is a file URI then remove * the file prefix. * * Only do this if the connection is open. Otherwise we will attempt to * connect to the first machine in the list, which is annoying. * * @return String */ private String getDefaultPathDisplayString() { if (getRemoteConnection() != null && getRemoteConnection().isOpen()) { IRemoteFileManager fileMgr = fSelectedConnection.getRemoteServices().getFileManager(getRemoteConnection()); URI defaultURI = fileMgr.toURI(getRemoteConnection().getWorkingDirectory()); // Handle files specially. Assume a file if there is no project to // query if (defaultURI != null && defaultURI.getScheme().equals(FILE_SCHEME)) { return Platform.getLocation().append(fProjectName).toOSString(); } if (defaultURI == null) { return ""; //$NON-NLS-1$ } return new Path(defaultURI.getPath()).append(fProjectName).toOSString(); } return ""; //$NON-NLS-1$ } /** * @return */ private IRemoteUIConnectionManager getUIConnectionManager() { IRemoteUIConnectionManager connectionManager = RemoteUIServices.getRemoteUIServices(fSelectedConnection.getRemoteServices()) .getUIConnectionManager(); return connectionManager; } private void handleConnectionSelected() { fSelectedConnection = fRemoteConnectionWidget.getConnection(); fLocationText.setText(getDefaultPathDisplayString()); } protected Control createContents(Composite parent) { Group container = new Group(parent, SWT.SHADOW_ETCHED_IN); GridLayout layout = new GridLayout(); layout.numColumns = 3; container.setLayout(layout); GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); container.setLayoutData(gd); fRemoteConnectionWidget = new RemoteConnectionWidget(container, SWT.NONE, null, RemoteConnectionWidget.FLAG_FORCE_PROVIDER_SELECTION, null); gd = new GridData(); gd.horizontalSpan = 3; fRemoteConnectionWidget.setLayoutData(gd); fRemoteConnectionWidget.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { handleConnectionSelected(); } }); Label locationLabel = new Label(container, SWT.LEFT); locationLabel.setText(Messages.getString("RemoteProjectContentsLocationArea.3")); //$NON-NLS-1$ fLocationText = new Text(container, SWT.SINGLE | SWT.BORDER); gd = new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan = 1; gd.grabExcessHorizontalSpace = true; gd.widthHint = 250; fLocationText.setLayoutData(gd); fLocationText.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { fErrorReporter.reportError(checkValidLocation(), false); } }); // new connection button fBrowseButton = new Button(container, SWT.PUSH); fBrowseButton.setText(Messages.getString("RemoteProjectContentsLocationArea.4")); //$NON-NLS-1$ fBrowseButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (fSelectedConnection != null) { checkConnection(); if (fSelectedConnection.isOpen()) { IRemoteUIServices remoteUIServices = RemoteUIServices.getRemoteUIServices(fSelectedConnection.getRemoteServices()); if (remoteUIServices != null) { IRemoteUIFileManager fileMgr = remoteUIServices.getUIFileManager(); if (fileMgr != null) { fileMgr.setConnection(fSelectedConnection); String correctPath = fLocationText.getText(); String selectedPath = fileMgr.browseDirectory( fLocationText.getShell(), Messages.getString("RemoteProjectContentsLocationArea.5", fSelectedConnection.getName()), correctPath, IRemoteUIConstants.NONE); //$NON-NLS-1$ if (selectedPath != null) { fLocationText.setText(selectedPath); } } } } } } }); return container; } /* * (non-Javadoc) * * @see org.eclipse.jface.dialogs.Dialog#okPressed() */ protected void okPressed() { // set the connection //fProvider.setRemoteToolsConnection(fSelectedConnection); } }