blob: 3fb524b8a309826132925e07fd4d32bb2a764f67 [file] [log] [blame]
/*
* Copyright (c) 2012, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.dart.tools.ui.actions;
import com.google.dart.tools.core.DartCore;
import com.google.dart.tools.core.internal.builder.ScanCallbackProvider;
import com.google.dart.tools.ui.DartToolsPlugin;
import com.google.dart.tools.ui.DartUI;
import com.google.dart.tools.ui.instrumentation.UIInstrumentationBuilder;
import com.google.dart.tools.ui.internal.dialogs.DialogMessages;
import com.google.dart.tools.ui.internal.util.DirectoryVerification;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceProxy;
import org.eclipse.core.resources.IResourceProxyVisitor;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.osgi.util.TextProcessor;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.actions.ActionFactory.IWorkbenchAction;
import java.io.File;
import java.io.IOException;
/**
* Opens the "Open..." dialog.
*/
public class OpenExternalFolderDialogAction extends InstrumentedAction implements IWorkbenchAction {
/**
* A visitor that checks for the build directory and marks it as derived.
*/
class BuildDirectoryFinder implements IResourceProxyVisitor {
@Override
public boolean visit(IResourceProxy proxy) throws CoreException {
if (proxy.getType() == IResource.FOLDER) {
if (proxy.getName().equals(DartCore.BUILD_DIRECTORY_NAME)) {
IFolder folder = (IFolder) proxy.requestResource();
if (DartCore.isBuildDirectory(folder)) {
folder.setDerived(true, null);
try {
DartCore.addToIgnores(folder);
} catch (IOException e) {
}
}
return false;
}
return true;
}
return true;
}
}
private static final String ACTION_ID = "com.google.dart.tools.ui.folder.open"; //$NON-NLS-1$
private final IWorkbenchWindow window;
public static final String DIALOGSTORE_LAST_DIR = DartUI.class.getPackage().getName()
+ ".last.dir"; //$NON-NLS-1$
public OpenExternalFolderDialogAction(IWorkbenchWindow window) {
this.window = window;
setText(ActionMessages.OpenExistingFolderWizardAction_text);
setDescription(ActionMessages.OpenExistingFolderWizardAction_description);
setToolTipText(ActionMessages.OpenExistingFolderWizardAction_tooltip);
setId(ACTION_ID);
}
@Override
public void dispose() {
}
@Override
public void doRun(Event event, UIInstrumentationBuilder instrumentation) {
IDialogSettings dialogSettings = DartToolsPlugin.getDefault().getDialogSettings();
DirectoryDialog dialog = new DirectoryDialog(window.getShell(), SWT.SHEET);
dialog.setText(DialogMessages.OpenFolderDialog_title);
dialog.setMessage(DialogMessages.OpenFolderDialog_dialogMessage);
dialog.setFilterPath(dialogSettings.get(OpenExternalFolderDialogAction.DIALOGSTORE_LAST_DIR));
String directory = dialog.open();
if (directory == null) {
instrumentation.metric("OpenExternalFolderDialog", "Cancelled");
return;
}
instrumentation.metric("OpenExternalFolderDialog", "OK");
directory = TextProcessor.process(directory);
if (directory.startsWith("~")) {
String home = System.getProperty("user.home");
directory = new File(new File(home), directory.substring(1)).toString();
}
instrumentation.data("OpenExternalFolder", directory);
File directoryFile = new File(directory);
if (!DirectoryVerification.validateOpenDirectoryLocation(window.getShell(), directoryFile)) {
instrumentation.metric("DirectoryValidation", "Failed");
return;
}
dialogSettings.put(OpenExternalFolderDialogAction.DIALOGSTORE_LAST_DIR, directory);
CreateAndRevealProjectAction createAction = new CreateAndRevealProjectAction(window, directory);
createAction.run();
IProject project = createAction.getProject();
// TODO: project can be null; this indicates that we didn't do any work when the user hit OK.
// This should be communicated to the user.
if (project != null) {
instrumentation.metric("ProjectCreation", "Success");
String projectName = project.getName();
instrumentation.data("ProjectName", projectName);
// show analysis progress dialog for open folder
ScanCallbackProvider.setNewProjectName(projectName);
try {
project.accept(new BuildDirectoryFinder(), IResource.DEPTH_INFINITE);
} catch (CoreException e) {
DartCore.logError(e);
}
}
}
}