summaryrefslogtreecommitdiff
path: root/plugins/properties/src/com/intellij/lang/properties/editor/ResourceBundleEditor.java
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/properties/src/com/intellij/lang/properties/editor/ResourceBundleEditor.java')
-rw-r--r--plugins/properties/src/com/intellij/lang/properties/editor/ResourceBundleEditor.java104
1 files changed, 68 insertions, 36 deletions
diff --git a/plugins/properties/src/com/intellij/lang/properties/editor/ResourceBundleEditor.java b/plugins/properties/src/com/intellij/lang/properties/editor/ResourceBundleEditor.java
index 5abeb70cf985..0176aa38fc6e 100644
--- a/plugins/properties/src/com/intellij/lang/properties/editor/ResourceBundleEditor.java
+++ b/plugins/properties/src/com/intellij/lang/properties/editor/ResourceBundleEditor.java
@@ -36,6 +36,7 @@ import com.intellij.openapi.actionSystem.DataProvider;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.command.CommandProcessor;
import com.intellij.openapi.command.WriteCommandAction;
+import com.intellij.openapi.command.undo.UndoConstants;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.*;
import com.intellij.openapi.editor.colors.EditorColorsManager;
@@ -68,7 +69,8 @@ import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import javax.swing.border.TitledBorder;
-import javax.swing.event.*;
+import javax.swing.event.TreeSelectionEvent;
+import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;
import java.awt.*;
@@ -100,8 +102,8 @@ public class ResourceBundleEditor extends UserDataHolderBase implements FileEdit
private VirtualFileListener myVfsListener;
private Editor mySelectedEditor;
- public ResourceBundleEditor(Project project, ResourceBundle resourceBundle) {
- myProject = project;
+ public ResourceBundleEditor(@NotNull ResourceBundle resourceBundle) {
+ myProject = resourceBundle.getProject();
final JPanel splitPanel = new JPanel();
myValuesPanel = new JPanel();
@@ -116,7 +118,7 @@ public class ResourceBundleEditor extends UserDataHolderBase implements FileEdit
splitPanel.add(splitter, BorderLayout.CENTER);
myResourceBundle = resourceBundle;
- myStructureViewComponent = new ResourceBundleStructureViewComponent(project, myResourceBundle, this);
+ myStructureViewComponent = new ResourceBundleStructureViewComponent(myResourceBundle, this);
myStructureViewPanel.setLayout(new BorderLayout());
myStructureViewPanel.add(myStructureViewComponent, BorderLayout.CENTER);
@@ -128,9 +130,18 @@ public class ResourceBundleEditor extends UserDataHolderBase implements FileEdit
public void valueChanged(TreeSelectionEvent e) {
// filter out temp unselect/select events
if (getSelectedPropertyName() == null) return;
- if (!Comparing.strEqual(selectedPropertyName, getSelectedPropertyName())
- || !Comparing.equal(selectedPropertiesFile, getSelectedPropertiesFile()))
- {
+ if (!Comparing.strEqual(selectedPropertyName, getSelectedPropertyName()) ||
+ !Comparing.equal(selectedPropertiesFile, getSelectedPropertiesFile())) {
+
+ if (e.getOldLeadSelectionPath() != null) {
+ for (Map.Entry<PropertiesFile, Editor> entry : myEditors.entrySet()) {
+ if (entry.getValue() == mySelectedEditor) {
+ writeEditorPropertyValue(mySelectedEditor, entry.getKey(), selectedPropertyName);
+ break;
+ }
+ }
+ }
+
selectedPropertyName = getSelectedPropertyName();
selectedPropertiesFile = getSelectedPropertiesFile();
selectionChanged();
@@ -151,7 +162,7 @@ public class ResourceBundleEditor extends UserDataHolderBase implements FileEdit
}
myDataProviderPanel = new DataProviderPanel(splitPanel);
- project.getMessageBus().connect(project).subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileEditorManagerAdapter() {
+ myProject.getMessageBus().connect(myProject).subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, new FileEditorManagerAdapter() {
@Override
public void selectionChanged(@NotNull FileEditorManagerEvent event) {
onSelectionChanged(event);
@@ -159,6 +170,10 @@ public class ResourceBundleEditor extends UserDataHolderBase implements FileEdit
});
}
+ public ResourceBundle getResourceBundle() {
+ return myResourceBundle;
+ }
+
private void onSelectionChanged(@NotNull FileEditorManagerEvent event) {
// Ignore events which don't target current editor.
FileEditor oldEditor = event.getOldEditor();
@@ -192,6 +207,9 @@ public class ResourceBundleEditor extends UserDataHolderBase implements FileEdit
}
private void setStructureViewSelection(@NotNull final String propertyName) {
+ if (myStructureViewComponent.isDisposed()) {
+ return;
+ }
JTree tree = myStructureViewComponent.getTree();
if (tree == null) {
return;
@@ -262,17 +280,24 @@ public class ResourceBundleEditor extends UserDataHolderBase implements FileEdit
@Nullable
private static String getNodeValue(@NotNull DefaultMutableTreeNode node) {
+ final ResourceBundleEditorViewElement element = getSelectedElement(node);
+ return element instanceof ResourceBundlePropertyStructureViewElement ? ((ResourceBundlePropertyStructureViewElement)element).getValue()
+ : null;
+ }
+
+ @Nullable
+ private static ResourceBundleEditorViewElement getSelectedElement(@NotNull DefaultMutableTreeNode node) {
Object userObject = node.getUserObject();
if (!(userObject instanceof AbstractTreeNode)) return null;
Object value = ((AbstractTreeNode)userObject).getValue();
- return value instanceof ResourceBundlePropertyStructureViewElement ? ((ResourceBundlePropertyStructureViewElement)value).getValue()
- : null;
+ return value instanceof ResourceBundleEditorViewElement ? (ResourceBundleEditorViewElement) value : null;
}
- private void writeEditorPropertyValue(final Editor editor, final PropertiesFile propertiesFile) {
+ private void writeEditorPropertyValue(final Editor editor, final PropertiesFile propertiesFile, final @Nullable String propertyName) {
final String currentValue = editor.getDocument().getText();
- final String selectedProperty = getSelectedPropertyName();
- assert selectedProperty != null;
+ final String currentSelectedProperty = propertyName == null ? getSelectedPropertyName() : propertyName;
+
+ assert currentSelectedProperty != null;
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
@@ -280,10 +305,10 @@ public class ResourceBundleEditor extends UserDataHolderBase implements FileEdit
WriteCommandAction.runWriteCommandAction(myProject, new Runnable() {
@Override
public void run() {
- final IProperty property = propertiesFile.findPropertyByKey(selectedProperty);
+ final IProperty property = propertiesFile.findPropertyByKey(currentSelectedProperty);
try {
if (property == null) {
- propertiesFile.addProperty(selectedProperty, currentValue);
+ propertiesFile.addProperty(currentSelectedProperty, currentValue);
}
else {
property.setValue(currentValue);
@@ -314,16 +339,26 @@ public class ResourceBundleEditor extends UserDataHolderBase implements FileEdit
}, VALUES);
myValuesPanel.add(myNoPropertySelectedPanel, NO_PROPERTY_SELECTED);
- List<PropertiesFile> propertiesFiles = myResourceBundle.getPropertiesFiles(myProject);
+ List<PropertiesFile> propertiesFiles = myResourceBundle.getPropertiesFiles();
GridBagConstraints gc = new GridBagConstraints(0, 0, 0, 0, 0, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
new Insets(5, 5, 5, 5), 0, 0);
releaseAllEditors();
myTitledPanels.clear();
int y = 0;
+ Editor previousEditor = null;
+ Editor firstEditor = null;
for (final PropertiesFile propertiesFile : propertiesFiles) {
final Editor editor = createEditor();
final Editor oldEditor = myEditors.put(propertiesFile, editor);
+ if (firstEditor == null) {
+ firstEditor = editor;
+ }
+ if (previousEditor != null) {
+ editor.putUserData(ChooseSubsequentPropertyValueEditorAction.PREV_EDITOR_KEY, previousEditor);
+ previousEditor.putUserData(ChooseSubsequentPropertyValueEditorAction.NEXT_EDITOR_KEY, editor);
+ }
+ previousEditor = editor;
if (oldEditor != null) {
EditorFactory.getInstance().releaseEditor(oldEditor);
}
@@ -335,9 +370,10 @@ public class ResourceBundleEditor extends UserDataHolderBase implements FileEdit
@Override
public void focusLost(final Editor eventEditor) {
- writeEditorPropertyValue(editor, propertiesFile);
+ writeEditorPropertyValue(editor, propertiesFile, null);
}
});
+ editor.getDocument().putUserData(UndoConstants.DONT_RECORD_UNDO, Boolean.TRUE);
gc.gridx = 0;
gc.gridy = y++;
gc.gridheight = 1;
@@ -375,6 +411,10 @@ public class ResourceBundleEditor extends UserDataHolderBase implements FileEdit
valuesPanelComponent.add(comp, gc);
}
+ if (previousEditor != null) {
+ previousEditor.putUserData(ChooseSubsequentPropertyValueEditorAction.NEXT_EDITOR_KEY, firstEditor);
+ firstEditor.putUserData(ChooseSubsequentPropertyValueEditorAction.PREV_EDITOR_KEY, previousEditor);
+ }
gc.gridx = 0;
gc.gridy = y;
@@ -524,7 +564,7 @@ public class ResourceBundleEditor extends UserDataHolderBase implements FileEdit
}
@Nullable
- private String getSelectedPropertyName() {
+ public String getSelectedPropertyName() {
JTree tree = myStructureViewComponent.getTree();
if (tree == null) return null;
TreePath selected = tree.getSelectionModel().getSelectionPath();
@@ -532,6 +572,15 @@ public class ResourceBundleEditor extends UserDataHolderBase implements FileEdit
return getNodeValue((DefaultMutableTreeNode)selected.getLastPathComponent());
}
+ @Nullable
+ public ResourceBundleEditorViewElement getSelectedElement() {
+ JTree tree = myStructureViewComponent.getTree();
+ if (tree == null) return null;
+ TreePath selected = tree.getSelectionModel().getSelectionPath();
+ if (selected == null) return null;
+ return getSelectedElement((DefaultMutableTreeNode)selected.getLastPathComponent());
+ }
+
@Override
@NotNull
public JComponent getComponent() {
@@ -673,7 +722,7 @@ public class ResourceBundleEditor extends UserDataHolderBase implements FileEdit
if (mySelectedEditor != null) {
for (final Map.Entry<PropertiesFile, Editor> entry : myEditors.entrySet()) {
if (mySelectedEditor.equals(entry.getValue())) {
- writeEditorPropertyValue(mySelectedEditor, entry.getKey());
+ writeEditorPropertyValue(mySelectedEditor, entry.getKey(), null);
}
}
}
@@ -693,23 +742,6 @@ public class ResourceBundleEditor extends UserDataHolderBase implements FileEdit
myEditors.clear();
}
- /**
- * Renames target property if the one is available.
- * <p/>
- * <b>Note:</b> is assumed to be called under {@link WriteAction write action}.
- *
- * @param oldName old property name
- * @param newName new property name
- */
- public void renameProperty(@NotNull String oldName, @NotNull String newName) {
- for (PropertiesFile properties : myResourceBundle.getPropertiesFiles(myProject)) {
- IProperty property = properties.findPropertyByKey(oldName);
- if (property != null) {
- property.setName(newName);
- }
- }
- }
-
public static class ResourceBundleEditorState implements FileEditorState {
private final String myPropertyName;