Skip to content

Commit 1e640b9

Browse files
committed
Offer to open/show existing project from Smart Import wizard
1 parent ef70250 commit 1e640b9

3 files changed

Lines changed: 109 additions & 7 deletions

File tree

bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/DataTransferMessages.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,14 @@ public class DataTransferMessages extends NLS {
197197
public static String SmartImportProposals_hideExistingProjects;
198198
public static String SmartImportProposals_inspecitionCanceled;
199199
public static String SmartImportProposals_errorWhileInspecting;
200+
public static String SmartImportProposals_projectAlreadyOpen_title;
201+
public static String SmartImportProposals_projectAlreadyOpen_message;
202+
public static String SmartImportProposals_projectAlreadyClosed_title;
203+
public static String SmartImportProposals_projectAlreadyClosed_message;
204+
public static String SmartImportProposals_showInProjectExplorer;
205+
public static String SmartImportProposals_openProject;
206+
public static String SmartImportProposals_openProjectFailed;
207+
public static String SmartImportProposals_openFailed;
200208

201209
public static String SmartImportReport_importedProjects;
202210
public static String SmartImportReport_importedProjectsWithCount;

bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/SmartImportRootWizardPage.java

Lines changed: 93 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,15 @@
3434
import org.eclipse.core.resources.IProject;
3535
import org.eclipse.core.resources.ResourcesPlugin;
3636
import org.eclipse.core.runtime.Assert;
37+
import org.eclipse.core.runtime.CoreException;
3738
import org.eclipse.core.runtime.IPath;
3839
import org.eclipse.core.runtime.IProgressMonitor;
3940
import org.eclipse.core.runtime.IStatus;
4041
import org.eclipse.core.runtime.Status;
4142
import org.eclipse.core.runtime.jobs.IJobChangeEvent;
4243
import org.eclipse.core.runtime.jobs.Job;
4344
import org.eclipse.core.runtime.jobs.JobChangeAdapter;
45+
import org.eclipse.jface.dialogs.IDialogConstants;
4446
import org.eclipse.jface.dialogs.IDialogSettings;
4547
import org.eclipse.jface.dialogs.MessageDialog;
4648
import org.eclipse.jface.fieldassist.ControlDecoration;
@@ -62,6 +64,7 @@
6264
import org.eclipse.jface.viewers.ViewerFilter;
6365
import org.eclipse.jface.wizard.IWizard;
6466
import org.eclipse.jface.wizard.ProgressMonitorPart;
67+
import org.eclipse.jface.wizard.WizardDialog;
6568
import org.eclipse.jface.wizard.WizardPage;
6669
import org.eclipse.osgi.util.NLS;
6770
import org.eclipse.swt.SWT;
@@ -88,7 +91,11 @@
8891
import org.eclipse.swt.widgets.ToolItem;
8992
import org.eclipse.swt.widgets.TreeColumn;
9093
import org.eclipse.swt.widgets.TreeItem;
94+
import org.eclipse.ui.IPageLayout;
95+
import org.eclipse.ui.IViewPart;
96+
import org.eclipse.ui.IWorkbenchWindow;
9197
import org.eclipse.ui.IWorkingSet;
98+
import org.eclipse.ui.PartInitException;
9299
import org.eclipse.ui.PlatformUI;
93100
import org.eclipse.ui.dialogs.FilteredTree;
94101
import org.eclipse.ui.dialogs.PatternFilter;
@@ -100,6 +107,7 @@
100107
import org.eclipse.ui.internal.progress.ProgressManager.JobMonitor;
101108
import org.eclipse.ui.internal.registry.WorkingSetDescriptor;
102109
import org.eclipse.ui.internal.registry.WorkingSetRegistry;
110+
import org.eclipse.ui.part.ISetSelectionTarget;
103111
import org.eclipse.ui.statushandlers.StatusManager;
104112
import org.eclipse.ui.wizards.datatransfer.ProjectConfigurator;
105113
import org.osgi.framework.FrameworkUtil;
@@ -607,14 +615,21 @@ public boolean isChecked(Object element) {
607615
}
608616
});
609617
tree.addCheckStateListener(event -> {
610-
if (isExistingProject((File) event.getElement()) || isExistingProjectName((File) event.getElement())) {
611-
tree.setChecked(event.getElement(), false);
618+
File file = (File) event.getElement();
619+
IProject existingProject = findExistingProject(file);
620+
if (existingProject != null) {
621+
tree.setChecked(file, false);
622+
promptAlreadyImportedProject(file, existingProject);
623+
return;
624+
}
625+
if (isExistingProjectName(file)) {
626+
tree.setChecked(file, false);
612627
return;
613628
}
614629
if (event.getChecked()) {
615-
SmartImportRootWizardPage.this.directoriesToImport.add((File) event.getElement());
630+
SmartImportRootWizardPage.this.directoriesToImport.add(file);
616631
} else {
617-
SmartImportRootWizardPage.this.directoriesToImport.remove(event.getElement());
632+
SmartImportRootWizardPage.this.directoriesToImport.remove(file);
618633
}
619634
proposalsSelectionChanged();
620635
});
@@ -787,21 +802,92 @@ private String getValue(String s) {
787802
}
788803

789804
}
790-
protected boolean isExistingProject(File element) {
805+
806+
protected IProject findExistingProject(File element) {
791807
for (IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects()) {
792808
IPath location = project.getLocation();
793809
if (location != null && element.equals(location.toFile())) {
794-
return true;
810+
return project;
795811
}
796812
}
797-
return false;
813+
return null;
814+
}
815+
816+
protected boolean isExistingProject(File element) {
817+
return findExistingProject(element) != null;
798818
}
799819

800820
protected boolean isExistingProjectName(File element) {
801821
String name = element.getName();
802822
return !name.isEmpty() && ResourcesPlugin.getWorkspace().getRoot().getProject(name).exists();
803823
}
804824

825+
private void promptAlreadyImportedProject(File file, IProject project) {
826+
tree.setSelection(new StructuredSelection(file), true);
827+
boolean isOpen = project.isOpen();
828+
String title = isOpen ? DataTransferMessages.SmartImportProposals_projectAlreadyOpen_title
829+
: DataTransferMessages.SmartImportProposals_projectAlreadyClosed_title;
830+
String message = NLS.bind(isOpen ? DataTransferMessages.SmartImportProposals_projectAlreadyOpen_message
831+
: DataTransferMessages.SmartImportProposals_projectAlreadyClosed_message, project.getName());
832+
String actionLabel = isOpen ? DataTransferMessages.SmartImportProposals_showInProjectExplorer
833+
: DataTransferMessages.SmartImportProposals_openProject;
834+
835+
MessageDialog dialog = new MessageDialog(getShell(), title, null, message, MessageDialog.QUESTION,
836+
new String[] { actionLabel, IDialogConstants.CANCEL_LABEL }, 0);
837+
if (dialog.open() == 0) {
838+
if (isOpen) {
839+
showProjectInExplorer(project);
840+
} else {
841+
openProject(project);
842+
}
843+
if (tree.getCheckedElements().length == 0) {
844+
getContainer().getShell().getDisplay().asyncExec(() -> {
845+
if (getContainer() instanceof WizardDialog wizardDialog) {
846+
wizardDialog.close();
847+
}
848+
});
849+
}
850+
}
851+
}
852+
853+
private void openProject(IProject project) {
854+
try {
855+
getContainer().run(true, true, monitor -> {
856+
try {
857+
project.open(monitor);
858+
} catch (CoreException e) {
859+
throw new InvocationTargetException(e);
860+
}
861+
});
862+
} catch (InvocationTargetException | InterruptedException e) {
863+
StatusManager
864+
.getManager().handle(
865+
new Status(IStatus.ERROR, IDEWorkbenchPlugin.IDE_WORKBENCH,
866+
NLS.bind(DataTransferMessages.SmartImportProposals_openProjectFailed,
867+
project.getName()),
868+
e.getCause() != null ? e.getCause() : e),
869+
StatusManager.LOG | StatusManager.SHOW);
870+
return;
871+
}
872+
showProjectInExplorer(project);
873+
}
874+
875+
private void showProjectInExplorer(IProject project) {
876+
IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
877+
if (window == null || window.getActivePage() == null) {
878+
return;
879+
}
880+
try {
881+
IViewPart view = window.getActivePage().showView(IPageLayout.ID_PROJECT_EXPLORER);
882+
if (view instanceof ISetSelectionTarget target) {
883+
target.selectReveal(new StructuredSelection(project));
884+
}
885+
} catch (PartInitException e) {
886+
StatusManager.getManager().handle(new Status(IStatus.ERROR, IDEWorkbenchPlugin.IDE_WORKBENCH,
887+
DataTransferMessages.SmartImportProposals_openFailed, e), StatusManager.LOG);
888+
}
889+
}
890+
805891
protected void validatePage() {
806892
// reset error message
807893
setErrorMessage(null);

bundles/org.eclipse.ui.ide/src/org/eclipse/ui/internal/wizards/datatransfer/messages.properties

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,14 @@ SmartImportProposals_importAs=Import as
200200
SmartImportProposals_hideExistingProjects=&Hide already open projects
201201
SmartImportProposals_inspecitionCanceled=Inspeciton canceled
202202
SmartImportProposals_errorWhileInspecting=Error while inspecting: {0}
203+
SmartImportProposals_projectAlreadyOpen_title=Project Already Open
204+
SmartImportProposals_projectAlreadyOpen_message=The project ''{0}'' is already open in the workspace.
205+
SmartImportProposals_projectAlreadyClosed_title=Project Already Exists (Closed)
206+
SmartImportProposals_projectAlreadyClosed_message=The project ''{0}'' already exists in the workspace but is currently closed.
207+
SmartImportProposals_showInProjectExplorer=&Show In Project Explorer
208+
SmartImportProposals_openProject=&Open Project
209+
SmartImportProposals_openProjectFailed=Failed to open project ''{0}''
210+
SmartImportProposals_openFailed=Unable to open project in Explorer view
203211
SmartImportJob_detectAndConfigureProjects=Detecting and configuring nested projects
204212
SmartImportJob_configuringSelectedDirectories=Configuring selected directories
205213
SmartImportJob_configuring=Configuring project {0}

0 commit comments

Comments
 (0)