properties: recreate RB-editors when property file added to resource bundle IDEA-153377

This commit is contained in:
Dmitry Batkovich
2016-07-19 16:47:29 +03:00
parent 67b5916b7b
commit 4c992eddb7
5 changed files with 25 additions and 15 deletions
@@ -15,6 +15,7 @@
*/
package com.intellij.lang.properties;
import com.intellij.lang.properties.editor.ResourceBundleAsVirtualFile;
import com.intellij.lang.properties.psi.PropertiesFile;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.PersistentStateComponent;
@@ -22,13 +23,13 @@ import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.NotNullLazyValue;
import com.intellij.openapi.util.NullableComputable;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.util.Function;
import com.intellij.util.SmartList;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.NotNull;
@@ -216,6 +217,7 @@ public class ResourceBundleManager implements PersistentStateComponent<ResourceB
public void dissociateResourceBundle(final @NotNull ResourceBundle resourceBundle) {
closeResourceBundleEditors(resourceBundle);
if (resourceBundle instanceof CustomResourceBundle) {
final CustomResourceBundleState state =
getCustomResourceBundleState(resourceBundle.getDefaultPropertiesFile().getVirtualFile());
@@ -237,6 +239,11 @@ public class ResourceBundleManager implements PersistentStateComponent<ResourceB
.add(new CustomResourceBundleState().addAll(ContainerUtil.map(propertiesFiles, file -> file.getVirtualFile().getUrl())).setBaseName(baseName));
}
public ResourceBundle combineToResourceBundleAndGet(final @NotNull List<PropertiesFile> propertiesFiles, final String baseName) {
combineToResourceBundle(propertiesFiles, baseName);
return propertiesFiles.get(0).getResourceBundle();
}
@Nullable
public CustomResourceBundle getCustomResourceBundle(final @NotNull PropertiesFile file) {
final VirtualFile virtualFile = file.getVirtualFile();
@@ -279,4 +286,12 @@ public class ResourceBundleManager implements PersistentStateComponent<ResourceB
public void loadState(ResourceBundleManagerState state) {
myState = state.removeNonExistentFiles();
}
private static void closeResourceBundleEditors(@NotNull ResourceBundle resourceBundle) {
final FileEditorManager fileEditorManager = FileEditorManager.getInstance(resourceBundle.getProject());
fileEditorManager.closeFile(new ResourceBundleAsVirtualFile(resourceBundle));
for (final PropertiesFile propertiesFile : resourceBundle.getPropertiesFiles()) {
fileEditorManager.closeFile(propertiesFile.getVirtualFile());
}
}
}
@@ -79,8 +79,7 @@ public class CombinePropertiesFilesAction extends AnAction {
resourceBundleManager.dissociateResourceBundle(resourceBundle);
}
resourceBundleManager.combineToResourceBundle(propertiesFiles, newBaseName);
final ResourceBundle resourceBundle = propertiesFiles.get(0).getResourceBundle();
final ResourceBundle resourceBundle = resourceBundleManager.combineToResourceBundleAndGet(propertiesFiles, newBaseName);
FileEditorManager.getInstance(project).openFile(new ResourceBundleAsVirtualFile(resourceBundle), true);
ProjectView.getInstance(project).refresh();
}
@@ -22,12 +22,10 @@ import com.intellij.ide.util.treeView.AbstractTreeBuilder;
import com.intellij.lang.properties.PropertiesImplUtil;
import com.intellij.lang.properties.ResourceBundle;
import com.intellij.lang.properties.ResourceBundleManager;
import com.intellij.lang.properties.editor.ResourceBundleAsVirtualFile;
import com.intellij.lang.properties.psi.PropertiesFile;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.LangDataKeys;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
@@ -76,12 +74,9 @@ public class DissociateResourceBundleAction extends AnAction {
}
public static void dissociate(final Collection<ResourceBundle> resourceBundles, final Project project) {
final FileEditorManager fileEditorManager = FileEditorManager.getInstance(project);
final Set<PsiFileSystemItem> toUpdateInProjectView = new HashSet<PsiFileSystemItem>();
for (ResourceBundle resourceBundle : resourceBundles) {
fileEditorManager.closeFile(new ResourceBundleAsVirtualFile(resourceBundle));
for (final PropertiesFile propertiesFile : resourceBundle.getPropertiesFiles()) {
fileEditorManager.closeFile(propertiesFile.getVirtualFile());
PsiDirectory containingDirectory = propertiesFile.getContainingFile().getContainingDirectory();
if (containingDirectory != null) {
toUpdateInProjectView.add(containingDirectory);
@@ -29,12 +29,9 @@ import com.intellij.ide.projectView.impl.nodes.PsiFileNode;
import com.intellij.ide.util.treeView.AbstractTreeNode;
import com.intellij.ide.util.treeView.ValidateableNode;
import com.intellij.lang.properties.*;
import com.intellij.lang.properties.ResourceBundle;
import com.intellij.lang.properties.editor.ResourceBundleAsVirtualFile;
import com.intellij.lang.properties.editor.ResourceBundleEditor;
import com.intellij.lang.properties.psi.PropertiesFile;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.fileEditor.FileEditor;
import com.intellij.openapi.fileEditor.FileEditorManager;
import com.intellij.openapi.fileEditor.OpenFileDescriptor;
import com.intellij.openapi.fileTypes.StdFileTypes;
@@ -50,8 +47,10 @@ import org.jetbrains.annotations.Nullable;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeNode;
import java.util.*;
import java.util.stream.Stream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
public class ResourceBundleNode extends ProjectViewNode<ResourceBundle> implements ValidateableNode, DropTargetNode {
public ResourceBundleNode(Project project, ResourceBundle resourceBundle, final ViewSettings settings) {
@@ -165,9 +164,11 @@ public class ResourceBundleNode extends ProjectViewNode<ResourceBundle> implemen
toAddInResourceBundle.addAll(resourceBundle.getPropertiesFiles());
final String baseName = resourceBundle.getBaseName();
final FileEditorManager fileEditorManager = FileEditorManager.getInstance(getProject());
fileEditorManager.closeFile(new ResourceBundleAsVirtualFile(resourceBundle));
resourceBundleManager.dissociateResourceBundle(resourceBundle);
resourceBundleManager.combineToResourceBundle(toAddInResourceBundle, baseName);
final ResourceBundle updatedBundle = resourceBundleManager.combineToResourceBundleAndGet(toAddInResourceBundle, baseName);
FileEditorManager.getInstance(myProject).openFile(new ResourceBundleAsVirtualFile(updatedBundle), true);
ProjectView.getInstance(myProject).refresh();
}