/* * Copyright (c) 2013, 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.engine.source.FileBasedSource; import com.google.dart.tools.core.DartCore; import com.google.dart.tools.core.analysis.model.Project; import com.google.dart.tools.ui.DartToolsPlugin; import com.google.dart.tools.ui.instrumentation.UIInstrumentationBuilder; import com.google.dart.tools.ui.internal.filesview.nodes.old.pkgs.DartPackageNode_OLD; import com.google.dart.tools.ui.internal.projects.NewApplicationCreationPage.ProjectType; import com.google.dart.tools.ui.internal.projects.ProjectUtils; import com.google.dart.tools.ui.internal.text.editor.EditorUtility; import org.eclipse.core.filesystem.EFS; import org.eclipse.core.filesystem.IFileStore; import org.eclipse.core.filesystem.IFileSystem; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.ui.IWorkbenchSite; import org.eclipse.ui.IWorkbenchWindow; import java.io.File; import java.lang.reflect.InvocationTargetException; import java.net.URI; /** * Copies the contents of the package selected in the Files View > Installed Packages node and * creates a new application/folder in the users default dart directory. */ public class NewAppFromPackageAction extends InstrumentedSelectionDispatchAction { private IWorkbenchWindow window; public NewAppFromPackageAction(IWorkbenchSite site) { super(site); setText("New Application from package"); setDescription("Create new application with contents of selected pacakge"); window = site.getWorkbenchWindow(); } public void openPackage(final IFileStore packageDir) { try { window.run(true, false, new IRunnableWithProgress() { @Override public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException { copyPackage(packageDir, monitor, window); } }); } catch (InvocationTargetException e) { DartToolsPlugin.log(e); } catch (InterruptedException e) { DartToolsPlugin.log(e); } } @Override protected void doRun(IStructuredSelection selection, Event event, UIInstrumentationBuilder instrumentation) { if (!selection.isEmpty() && selection.getFirstElement() instanceof DartPackageNode_OLD) { DartPackageNode_OLD node = (DartPackageNode_OLD) selection.getFirstElement(); openPackage(node.getFileStore()); } } private void copyPackage(final IFileStore packageDir, final IProgressMonitor monitor, final IWorkbenchWindow window) { String packageName = packageDir.getName(); File potentialDir = new File(DartCore.getUserDefaultDartFolder(), packageName); final File newProjectDir = ProjectUtils.generateUniqueSampleDirFrom( packageName + "_copy", potentialDir); final String newProjectName = newProjectDir.getName(); final IProject newProjectHandle = ResourcesPlugin.getWorkspace().getRoot().getProject( newProjectName); final URI location = newProjectDir.toURI(); final File fileToOpen = new File(newProjectDir, getFilePath(packageName)); IFileSystem fileSystem = EFS.getLocalFileSystem(); final IFileStore destination = fileSystem.fromLocalFile(newProjectDir); Display.getDefault().asyncExec(new Runnable() { @Override public void run() { try { packageDir.copy(destination, 0, monitor); } catch (CoreException e1) { DartToolsPlugin.log(e1); } try { ProjectUtils.createNewProject( newProjectName, newProjectHandle, ProjectType.NONE, location, window, window.getShell()); Project project = DartCore.getProjectManager().getProject(newProjectHandle); IFile resource = (IFile) project.getResource(new FileBasedSource(fileToOpen)); if (resource.exists()) { EditorUtility.openInTextEditor(resource, true); } } catch (CoreException e) { DartToolsPlugin.log(e); } } }); } private String getFilePath(String packageName) { packageName = packageName.substring(0, packageName.indexOf("-")); return "lib/" + packageName + ".dart"; } }