diff options
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.java | 104 |
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; |