diff --git a/java/idea-ui/src/com/intellij/ide/actions/ImportModuleAction.java b/java/idea-ui/src/com/intellij/ide/actions/ImportModuleAction.java index f167d90aa371..0aa17824ac31 100644 --- a/java/idea-ui/src/com/intellij/ide/actions/ImportModuleAction.java +++ b/java/idea-ui/src/com/intellij/ide/actions/ImportModuleAction.java @@ -24,6 +24,7 @@ import com.intellij.ide.util.projectWizard.ProjectBuilder; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.openapi.application.TransactionGuard; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.fileChooser.FileChooserDialog; @@ -34,6 +35,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; import com.intellij.openapi.roots.ui.configuration.actions.NewModuleAction; import com.intellij.openapi.ui.Messages; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.projectImport.ProjectImportProvider; @@ -83,9 +85,15 @@ public class ImportModuleAction extends AnAction { } public static List createFromWizard(@Nullable Project project, AbstractProjectWizard wizard) { + Ref> result = Ref.create(); + TransactionGuard.getInstance().submitTransactionAndWait(() -> result.set(doCreateFromWizard(project, wizard))); + return result.get(); + } + + private static List doCreateFromWizard(@Nullable Project project, AbstractProjectWizard wizard) { if (project == null) { Project newProject = NewProjectUtil.createFromWizard(wizard, null); - return newProject == null ? Collections.emptyList() : Arrays.asList(ModuleManager.getInstance(newProject).getModules()); + return newProject == null ? Collections.emptyList() : Arrays.asList(ModuleManager.getInstance(newProject).getModules()); } final ProjectBuilder projectBuilder = wizard.getProjectBuilder(); diff --git a/java/idea-ui/src/com/intellij/ide/actions/NewProjectAction.java b/java/idea-ui/src/com/intellij/ide/actions/NewProjectAction.java index 8c99bb408305..33bd7f825b09 100644 --- a/java/idea-ui/src/com/intellij/ide/actions/NewProjectAction.java +++ b/java/idea-ui/src/com/intellij/ide/actions/NewProjectAction.java @@ -26,6 +26,11 @@ import com.intellij.openapi.wm.impl.welcomeScreen.NewWelcomeScreen; import org.jetbrains.annotations.NotNull; public class NewProjectAction extends AnAction implements DumbAware { + @Override + public boolean startInTransaction() { + return true; + } + public void actionPerformed(AnActionEvent e) { NewProjectWizard wizard = new NewProjectWizard(null, ModulesProvider.EMPTY_MODULES_PROVIDER, null); NewProjectUtil.createNewProject(getEventProject(e), wizard); diff --git a/java/idea-ui/src/com/intellij/ide/actions/ShowStructureSettingsAction.java b/java/idea-ui/src/com/intellij/ide/actions/ShowStructureSettingsAction.java index 2a0de25cb312..e167d2f07a5d 100644 --- a/java/idea-ui/src/com/intellij/ide/actions/ShowStructureSettingsAction.java +++ b/java/idea-ui/src/com/intellij/ide/actions/ShowStructureSettingsAction.java @@ -26,6 +26,12 @@ import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable; import org.jetbrains.annotations.NotNull; public class ShowStructureSettingsAction extends AnAction implements DumbAware { + + @Override + public boolean startInTransaction() { + return true; + } + @Override public void actionPerformed(AnActionEvent e) { Project project = e.getProject(); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java index 13c89f94e2d1..24bdaa5f8ec0 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java @@ -20,7 +20,9 @@ import com.intellij.facet.Facet; import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.application.AccessToken; +import com.intellij.openapi.application.TransactionGuard; import com.intellij.openapi.components.ServiceManager; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.options.BaseConfigurable; @@ -67,6 +69,7 @@ import static com.intellij.openapi.roots.ui.configuration.ProjectStructureConfig public class ProjectStructureConfigurable extends BaseConfigurable implements SearchableConfigurable, Place.Navigator, Configurable.NoMargin, Configurable.NoScroll { + private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable"); public static final DataKey KEY = DataKey.create("ProjectStructureConfiguration"); @@ -309,6 +312,8 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se @Override public void apply() throws ConfigurationException { + LOG.assertTrue(TransactionGuard.getInstance().getContextTransaction() != null, "Project Structure should be shown in a transaction, see AnAction#startInTransaction"); + for (Configurable each : myName2Config) { if (each instanceof BaseStructureConfigurable && each.isModified()) { ((BaseStructureConfigurable)each).checkCanApply(); @@ -331,7 +336,7 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se } myContext.getDaemonAnalyzer().clearCaches(); - SwingUtilities.invokeLater(() -> BuildManager.getInstance().scheduleAutoMake()); + BuildManager.getInstance().scheduleAutoMake(); } @Override @@ -376,10 +381,6 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se } } - public void hideSidePanel() { - mySplitter.getFirstComponent().setVisible(false); - } - @Override public void disposeUIResources() { if (!myUiInitialized) return; @@ -434,7 +435,7 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se if (moduleToSelect != null) { final Module module = ModuleManager.getInstance(myProject).findModuleByName(moduleToSelect); assert module != null; - place = place.putPath(ModuleStructureConfigurable.TREE_OBJECT, module).putPath(ModuleEditor.SELECTED_EDITOR_NAME, editorNameToSelect); + place = place.putPath(MasterDetailsComponent.TREE_OBJECT, module).putPath(ModuleEditor.SELECTED_EDITOR_NAME, editorNameToSelect); } return navigateTo(place, requestFocus); } @@ -444,20 +445,20 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se } public Place createModulePlace(@NotNull Module module) { - return createModulesPlace().putPath(ModuleStructureConfigurable.TREE_OBJECT, module); + return createModulesPlace().putPath(MasterDetailsComponent.TREE_OBJECT, module); } public ActionCallback select(@Nullable final Facet facetToSelect, final boolean requestFocus) { Place place = createModulesPlace(); if (facetToSelect != null) { - place = place.putPath(ModuleStructureConfigurable.TREE_OBJECT, facetToSelect); + place = place.putPath(MasterDetailsComponent.TREE_OBJECT, facetToSelect); } return navigateTo(place, requestFocus); } public ActionCallback select(@NotNull Sdk sdk, final boolean requestFocus) { Place place = createPlaceFor(myJdkListConfig); - place.putPath(BaseStructureConfigurable.TREE_NAME, sdk.getName()); + place.putPath(MasterDetailsComponent.TREE_NAME, sdk.getName()); return navigateTo(place, requestFocus); } @@ -473,7 +474,7 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se public Place createProjectOrGlobalLibraryPlace(Library library) { Place place = createPlaceFor(getConfigurableFor(library)); - place.putPath(BaseStructureConfigurable.TREE_NAME, library.getName()); + place.putPath(MasterDetailsComponent.TREE_NAME, library.getName()); return place; } @@ -485,7 +486,7 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se public Place createArtifactPlace(Artifact artifact) { Place place = createPlaceFor(myArtifactsStructureConfigurable); if (artifact != null) { - place.putPath(BaseStructureConfigurable.TREE_NAME, artifact.getName()); + place.putPath(MasterDetailsComponent.TREE_NAME, artifact.getName()); } return place; } @@ -496,7 +497,7 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se return selectOrderEntry(libraryOrderEntry.getOwnerModule(), libraryOrderEntry); } Place place = createPlaceFor(getConfigurableFor(lib)); - place.putPath(BaseStructureConfigurable.TREE_NAME, libraryOrderEntry.getLibraryName()); + place.putPath(MasterDetailsComponent.TREE_NAME, libraryOrderEntry.getLibraryName()); return navigateTo(place, requestFocus); } @@ -600,14 +601,6 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se return myJdkListConfig; } - public ProjectLibrariesConfigurable getProjectLibrariesConfig() { - return myProjectLibrariesConfig; - } - - public GlobalLibrariesConfigurable getGlobalLibrariesConfig() { - return myGlobalLibrariesConfig; - } - public ModuleStructureConfigurable getModulesConfig() { return myModulesConfig; } diff --git a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsDialog.java b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsDialog.java index 95ec4d9d9e80..f1692ae57ac6 100644 --- a/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsDialog.java +++ b/platform/platform-impl/src/com/intellij/openapi/options/newEditor/SettingsDialog.java @@ -18,6 +18,7 @@ package com.intellij.openapi.options.newEditor; import com.intellij.CommonBundle; import com.intellij.openapi.actionSystem.DataProvider; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.TransactionGuard; import com.intellij.openapi.help.HelpManager; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurableGroup; @@ -74,7 +75,9 @@ public class SettingsDialog extends DialogWrapper implements DataProvider { @Override public void show() { - DumbService.allowStartingDumbModeInside(DumbModePermission.MAY_START_BACKGROUND, () -> super.show()); + TransactionGuard.getInstance().submitTransactionAndWait( + () -> DumbService.allowStartingDumbModeInside(DumbModePermission.MAY_START_BACKGROUND, () -> + super.show())); }