diff --git a/.idea/libraries/Guava.xml b/.idea/libraries/Guava.xml index fe0defcc233e..3024d55693eb 100644 --- a/.idea/libraries/Guava.xml +++ b/.idea/libraries/Guava.xml @@ -1,11 +1,11 @@ - + - + \ No newline at end of file diff --git a/build/scripts/libLicenses.gant b/build/scripts/libLicenses.gant index 7b39c5d561a9..54de9a1663c2 100644 --- a/build/scripts/libLicenses.gant +++ b/build/scripts/libLicenses.gant @@ -150,7 +150,7 @@ libraryLicense(name: "Apache Lucene", libraryName: "lucene-core-2.4.1.jar", vers libraryLicense(name: "Automaton", libraryName: "automaton.jar", version: "1.11", license: "BSD", url: "http://www.brics.dk/automaton/", licenseUrl: "http://www.opensource.org/licenses/bsd-license.php") libraryLicense(name: "DTDParser", version: "1.13", license: "LGPL", url: "http://sourceforge.net/projects/dtdparser/", licenseUrl: "http://www.opensource.org/licenses/lgpl-2.1") libraryLicense(name: "Ganymed", version: "bundled with SVNKit", libraryName: "svnkit.jar", license: "BSD", url: "http://www.ganymed.ethz.ch/ssh2/", licenseUrl: "http://www.ganymed.ethz.ch/ssh2/LICENSE.txt") -libraryLicense(name: "Guava", version: "R6", license: "Apache 2.0", url: "http://code.google.com/p/guava-libraries/", licenseUrl: "http://ant.apache.org/license.html") +libraryLicense(name: "Guava", version: "R8", license: "Apache 2.0", url: "http://code.google.com/p/guava-libraries/", licenseUrl: "http://ant.apache.org/license.html") libraryLicense(name: "Gradle API", libraryName: "gradle-open-api-0.8.jar", version: "0.8", license: "Apache 2.0", url: "http://www.gradle.org/") libraryLicense(name: "Groovy", version: "1.7.3", license: "Apache 2.0", url: "http://groovy.codehaus.org/") libraryLicense(name: "Gson", libraryName: "gson-1.3.jar", license: "Apache 2.0", url: "http://code.google.com/p/google-gson/") @@ -192,7 +192,7 @@ libraryLicense(name: "XML Commons (xml-apis.jar, resolver.jar)", version: "", li libraryLicense(name: "XMLBeans", libraryName: "XmlBeans", version: "2.3.0", license: "Apache 2.0", url: "http://xmlbeans.apache.org/", licenseUrl: "http://svn.jetbrains.org/idea/Trunk/bundled/WebServices/resources/lib/xmlbeans-2.3.0/xmlbeans.LICENSE") libraryLicense(name: "XML-RPC", libraryName: "XmlRPC", version: "2.0", license: "Apache 2.0", url: "http://ws.apache.org/xmlrpc/xmlrpc2/", licenseUrl: "http://ws.apache.org/xmlrpc/xmlrpc2/license.html") libraryLicense(name: "XStream", version: "1.2.1", license: "BSD", url: "http://xstream.codehaus.org/", licenseUrl: "http://xstream.codehaus.org/license.html") -libraryLicense(name: "YourKit Java Profiler", libraryName: "yjp-controller-api-redist.jar", version: "7.0.2", license: "link (commercial license)", url: "http://yourkit.com/", licenseUrl: "http://www.yourkit.com/purchase/license.html") +libraryLicense(name: "YourKit Java Profiler", libraryName: "yjp-controller-api-redist.jar", version: "8.0.x", license: "link (commercial license)", url: "http://yourkit.com/", licenseUrl: "http://www.yourkit.com/purchase/license.html") jetbrainsLibrary("JPS") jetbrainsLibrary("Maven Embedder") jetbrainsLibrary("tcServiceMessages") \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/psi/impl/smartPointers/ImplicitVariableElementInfoFactory.java b/java/java-impl/src/com/intellij/psi/impl/smartPointers/ImplicitVariableElementInfoFactory.java index 37ee533d4a27..53888a5a2b69 100644 --- a/java/java-impl/src/com/intellij/psi/impl/smartPointers/ImplicitVariableElementInfoFactory.java +++ b/java/java-impl/src/com/intellij/psi/impl/smartPointers/ImplicitVariableElementInfoFactory.java @@ -77,7 +77,7 @@ public class ImplicitVariableElementInfoFactory implements SmartPointerElementIn } @Override - public boolean pointsToTheSameElementAs(SmartPointerElementInfo other) { + public boolean pointsToTheSameElementAs(@NotNull SmartPointerElementInfo other) { if (other instanceof ImplicitVariableInfo) { return myVar == ((ImplicitVariableInfo)other).myVar; } diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java b/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java index a2ab7301809a..1d0f6672106b 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/InplaceIntroduceConstantPopup.java @@ -19,7 +19,13 @@ import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInsight.intention.impl.TypeExpression; import com.intellij.codeInsight.template.impl.TemplateManagerImpl; import com.intellij.codeInsight.template.impl.TemplateState; +import com.intellij.ide.ui.ListCellRendererWrapper; +import com.intellij.ide.ui.UISettings; import com.intellij.ide.util.PropertiesComponent; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.CustomShortcutSet; +import com.intellij.openapi.actionSystem.KeyboardShortcut; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.editor.Editor; @@ -28,6 +34,7 @@ import com.intellij.openapi.editor.ScrollType; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.LanguageLevelProjectExtension; import com.intellij.openapi.util.Computable; +import com.intellij.openapi.wm.ToolWindowManager; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.codeStyle.VariableKind; @@ -42,11 +49,11 @@ import com.intellij.refactoring.ui.TypeSelectorManagerImpl; import com.intellij.refactoring.util.occurences.OccurenceManager; import com.intellij.ui.StateRestoringCheckBox; import com.intellij.ui.TitlePanel; +import com.intellij.util.VisibilityUtil; import javax.swing.*; import java.awt.*; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; +import java.awt.event.*; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashSet; @@ -83,7 +90,7 @@ public class InplaceIntroduceConstantPopup { private JCheckBox myMoveToAnotherClassCb; - private JavaVisibilityPanel myVisibilityPanel; + private JComboBox myVisibilityCombo; private JPanel myWholePanel; @@ -122,31 +129,36 @@ public class InplaceIntroduceConstantPopup { myLocalName = localVariable != null ? localVariable.getName() : null; myWholePanel = new JPanel(new GridBagLayout()); - GridBagConstraints gc = new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0 , 0, 0), 0, 0); + GridBagConstraints gc = new GridBagConstraints(0, 0, 1, 1, 1, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(0, 0 , 0, 0), 0, 0); final TitlePanel titlePanel = new TitlePanel(); titlePanel.setBorder(null); titlePanel.setText(IntroduceConstantHandler.REFACTORING_NAME); - + gc.gridwidth = 2; myWholePanel.add(titlePanel, gc); - gc.insets = new Insets(5, 5, 5, 5); + gc.gridwidth = 1; + gc.gridy = 1; + myWholePanel.add(createLeftPanel(), gc); - myVisibilityPanel = new JavaVisibilityPanel(false, false); - myVisibilityPanel.setVisibility(JavaRefactoringSettings.getInstance().INTRODUCE_CONSTANT_VISIBILITY); - myWholePanel.add(myVisibilityPanel, gc); + gc.gridx = 1; + gc.insets.left = 6; + myWholePanel.add(createRightPanel(), gc); + } + + private JPanel createRightPanel() { + final JPanel right = new JPanel(new GridBagLayout()); + final GridBagConstraints rgc = new GridBagConstraints(0, GridBagConstraints.RELATIVE,1,1,0,0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(1,0,0,0), 0, 0); myReplaceAllCb = new JCheckBox("Replace all occurrences"); myReplaceAllCb.setMnemonic('a'); myReplaceAllCb.setFocusable(false); - myWholePanel.add(myReplaceAllCb, gc); myReplaceAllCb.setVisible(myOccurrences.length > 1); - + right.add(myReplaceAllCb, rgc); myCbDeleteVariable = new StateRestoringCheckBox("Delete variable declaration"); myCbDeleteVariable.setMnemonic('d'); myCbDeleteVariable.setFocusable(false); - myWholePanel.add(myCbDeleteVariable, gc); if (myLocalVariable != null) { if (myReplaceAllCb != null) { myReplaceAllCb.setEnabled(false); @@ -157,15 +169,15 @@ public class InplaceIntroduceConstantPopup { } else { myCbDeleteVariable.setVisible(false); } + right.add(myCbDeleteVariable, rgc); myAnnotateNonNls = new JCheckBox("Annotate field as @NonNls"); myAnnotateNonNls.setMnemonic('f'); myAnnotateNonNls.setFocusable(false); - myWholePanel.add(myAnnotateNonNls, gc); - final PsiManager psiManager = PsiManager.getInstance(myProject); - if ((myTypeSelectorManager.isSuggestedType("java.lang.String") || (myLocalVariable != null && AnnotationUtil.isAnnotated(myLocalVariable, AnnotationUtil.NON_NLS, false)))&& - LanguageLevelProjectExtension.getInstance(psiManager.getProject()).getLanguageLevel().hasEnumKeywordAndAutoboxing() && - JavaPsiFacade.getInstance(psiManager.getProject()).findClass(AnnotationUtil.NON_NLS, myParentClass.getResolveScope()) != null) { + if ((myTypeSelectorManager.isSuggestedType("java.lang.String") || (myLocalVariable != null && AnnotationUtil + .isAnnotated(myLocalVariable, AnnotationUtil.NON_NLS, false)))&& + LanguageLevelProjectExtension.getInstance(myProject).getLanguageLevel().hasEnumKeywordAndAutoboxing() && + JavaPsiFacade.getInstance(myProject).findClass(AnnotationUtil.NON_NLS, myParentClass.getResolveScope()) != null) { final PropertiesComponent component = PropertiesComponent.getInstance(myProject); myAnnotateNonNls.setSelected(component.isTrueValue(IntroduceConstantDialog.NONNLS_SELECTED_PROPERTY)); myAnnotateNonNls.addItemListener(new ItemListener() { @@ -176,13 +188,69 @@ public class InplaceIntroduceConstantPopup { } else { myAnnotateNonNls.setVisible(false); } + right.add(myAnnotateNonNls, rgc); + return right; + } + + private JPanel createLeftPanel() { + final JPanel left = new JPanel(new GridBagLayout()); + final GridBagConstraints lgc = new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5,5,0,0), 0, 0); + + final JLabel label = new JLabel("Visibility:"); + label.setDisplayedMnemonic('V'); + left.add(label, lgc); + myVisibilityCombo = new JComboBox(new String[]{PsiModifier.PUBLIC, PsiModifier.PACKAGE_LOCAL, PsiModifier.PROTECTED, PsiModifier.PRIVATE}); + myVisibilityCombo.setRenderer(new ListCellRendererWrapper(myVisibilityCombo.getRenderer()){ + @Override + public void customize(JList list, String value, int index, boolean selected, boolean hasFocus) { + setText(PsiBundle.visibilityPresentation(value)); + } + }); + label.setLabelFor(myVisibilityCombo); + myVisibilityCombo.setSelectedItem(JavaRefactoringSettings.getInstance().INTRODUCE_CONSTANT_VISIBILITY); + myVisibilityCombo.addKeyListener(new KeyAdapter() { + @Override + public void keyReleased(KeyEvent e) { + if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { + ToolWindowManager.getInstance(myProject).activateEditorComponent(); + } + } + }); + final AnAction arrow = new AnAction() { + @Override + public void actionPerformed(AnActionEvent e) { + if (e.getInputEvent() instanceof KeyEvent) { + final int code = ((KeyEvent)e.getInputEvent()).getKeyCode(); + final int delta = code == KeyEvent.VK_DOWN ? 1 : code == KeyEvent.VK_UP ? -1 : 0; + if (delta == 0) return; + final int size = myVisibilityCombo.getModel().getSize(); + int next = myVisibilityCombo.getSelectedIndex() + delta; + if (next < 0 || next >= size) { + if (!UISettings.getInstance().CYCLE_SCROLLING) { + return; + } + next = (next + size) % size; + } + myVisibilityCombo.setSelectedIndex(next); + } + } + }; + arrow.registerCustomShortcutSet(new CustomShortcutSet(new KeyboardShortcut(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), null), + new KeyboardShortcut(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), null)), myVisibilityCombo); + lgc.gridx = 1; + lgc.insets.top = 2; + lgc.insets.left = 0; + left.add(myVisibilityCombo, lgc); myMoveToAnotherClassCb = new JCheckBox("Move to another class"); myMoveToAnotherClassCb.setMnemonic('m'); myMoveToAnotherClassCb.setFocusable(false); - myWholePanel.add(myMoveToAnotherClassCb, gc); - - + lgc.gridx = 0; + lgc.gridy = 1; + lgc.gridwidth = 2; + lgc.insets.top = 0; + left.add(myMoveToAnotherClassCb, lgc); + return left; } public void performInplaceIntroduce() { @@ -220,7 +288,7 @@ public class InplaceIntroduceConstantPopup { PsiField field = elementFactory.createFieldFromText(psiType.getCanonicalText() + " " + (myConstantName != null ? myConstantName : names[0]) + " = " + myExprText + ";", myParentClass); PsiUtil.setModifierProperty(field, PsiModifier.FINAL, true); PsiUtil.setModifierProperty(field, PsiModifier.STATIC, true); - final String visibility = myVisibilityPanel.getVisibility(); + final String visibility = getSelectedVisibility(); if (visibility != null) { PsiUtil.setModifierProperty(field, visibility, true); } @@ -230,6 +298,10 @@ public class InplaceIntroduceConstantPopup { }); } + private String getSelectedVisibility() { + return (String)myVisibilityCombo.getSelectedItem(); + } + public List getOccurrenceMarkers() { if (myOccurrenceMarkers == null) { myOccurrenceMarkers = new ArrayList(); @@ -301,7 +373,7 @@ public class InplaceIntroduceConstantPopup { @Override protected void saveSettings(PsiVariable psiVariable) { TypeSelectorManagerImpl.typeSelected(psiVariable.getType(), myDefaultParameterTypePointer.getType()); - JavaRefactoringSettings.getInstance().INTRODUCE_CONSTANT_VISIBILITY = myVisibilityPanel.getVisibility(); + JavaRefactoringSettings.getInstance().INTRODUCE_CONSTANT_VISIBILITY = getSelectedVisibility(); } @Override @@ -321,7 +393,7 @@ public class InplaceIntroduceConstantPopup { isReplaceAllOccurrences(), true, true, BaseExpressionToFieldHandler.InitializationPlace.IN_FIELD_DECLARATION, - myVisibilityPanel.getVisibility(), myLocalVariable, + getSelectedVisibility(), myLocalVariable, myFieldTypePointer.getType(), isDeleteVariable(), myParentClass, isAnnotateNonNls(), false); @@ -358,10 +430,16 @@ public class InplaceIntroduceConstantPopup { protected JComponent getComponent() { if (!myInitListeners) { myInitListeners = true; - myVisibilityPanel.addListener(new VisibilityListener(myProject, myEditor){ + final VisibilityListener visibilityListener = new VisibilityListener(myProject, myEditor) { @Override protected String getVisibility() { - return myVisibilityPanel.getVisibility(); + return getSelectedVisibility(); + } + }; + myVisibilityCombo.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + visibilityListener.stateChanged(null); } }); myReplaceAllCb.addItemListener(new ItemListener() { diff --git a/lib/guava-r08.jar b/lib/guava-r08.jar deleted file mode 100644 index d18d0bdae1dc..000000000000 Binary files a/lib/guava-r08.jar and /dev/null differ diff --git a/lib/guava-r09.jar b/lib/guava-r09.jar new file mode 100644 index 000000000000..f8da8b1c1e81 Binary files /dev/null and b/lib/guava-r09.jar differ diff --git a/lib/required_for_dist.txt b/lib/required_for_dist.txt index 1d417dd64189..d16543be9c74 100644 --- a/lib/required_for_dist.txt +++ b/lib/required_for_dist.txt @@ -10,7 +10,7 @@ commons-logging-1.1.1.jar commons-net-2.0-patched.jar dtdparser113.jar groovy-all-1.7.3.jar -guava-r08.jar +guava-r09.jar jaxen-1.1.3.jar jcip-annotations.jar jdom.jar diff --git a/lib/src/guava-src-r08.zip b/lib/src/guava-src-r08.zip deleted file mode 100644 index 3ca29c2d28e6..000000000000 Binary files a/lib/src/guava-src-r08.zip and /dev/null differ diff --git a/lib/src/guava-src-r09.zip b/lib/src/guava-src-r09.zip new file mode 100644 index 000000000000..2bb76991e904 Binary files /dev/null and b/lib/src/guava-src-r09.zip differ diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/OptionTableWithPreviewPanel.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/OptionTableWithPreviewPanel.java index 7a9f35224e6a..97289c509187 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/OptionTableWithPreviewPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/OptionTableWithPreviewPanel.java @@ -21,6 +21,7 @@ import com.intellij.psi.PsiFile; import com.intellij.psi.codeStyle.CodeStyleSettings; import com.intellij.psi.codeStyle.CustomCodeStyleSettings; import com.intellij.ui.ScrollPaneFactory; +import com.intellij.ui.components.editors.JBComboBoxTableCellEditorComponent; import com.intellij.ui.treeStructure.treetable.ListTreeTableModel; import com.intellij.ui.treeStructure.treetable.TreeTable; import com.intellij.ui.treeStructure.treetable.TreeTableCellRenderer; @@ -602,34 +603,32 @@ public abstract class OptionTableWithPreviewPanel extends MultilanguageCodeStyle } } + /** + * @author Konstantin Bulenkov + */ private class MyValueEditor extends AbstractTableCellEditor { - private final JComboBox myComboBox = new JComboBox(); - private final JCheckBox myCheckBox = new JCheckBox(); + private final JCheckBox myBooleanEditor = new JCheckBox(); + private JBComboBoxTableCellEditorComponent myOptionsEditor = new JBComboBoxTableCellEditorComponent(); private Component myCurrentEditor = null; private MyTreeNode myCurrentNode = null; public MyValueEditor() { - ActionListener synchronizer = new ActionListener() { + myBooleanEditor.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (myCurrentNode != null) { myCurrentNode.setValue(getCellEditorValue()); } } - }; - myComboBox.addActionListener(synchronizer); - myCheckBox.addActionListener(synchronizer); - - myComboBox.putClientProperty("JComponent.sizeVariant", "small"); - myComboBox.putClientProperty("JComboBox.isTableCellEditor", Boolean.TRUE); - myCheckBox.putClientProperty("JComponent.sizeVariant", "small"); + }); + myBooleanEditor.putClientProperty("JComponent.sizeVariant", "small"); } public Object getCellEditorValue() { - if (myCurrentEditor == myComboBox) { - return myComboBox.getSelectedItem(); + if (myCurrentEditor == myOptionsEditor) { + return myOptionsEditor.getEditorValue(); } - else if (myCurrentEditor == myCheckBox) { - return myCheckBox.isSelected() ? Boolean.TRUE : Boolean.FALSE; + else if (myCurrentEditor == myBooleanEditor) { + return myBooleanEditor.isSelected() ? Boolean.TRUE : Boolean.FALSE; } return null; @@ -642,27 +641,22 @@ public abstract class OptionTableWithPreviewPanel extends MultilanguageCodeStyle myCurrentNode = null; if (defaultNode instanceof MyTreeNode) { MyTreeNode node = (MyTreeNode)defaultNode; + myCurrentNode = node; if (node.getKey() instanceof BooleanOption) { - myCurrentEditor = myCheckBox; - myCheckBox.setSelected(node.getValue() == Boolean.TRUE); - myCheckBox.setEnabled(node.isEnabled()); + myCurrentEditor = myBooleanEditor; + myBooleanEditor.setSelected(node.getValue() == Boolean.TRUE); + myBooleanEditor.setEnabled(node.isEnabled()); } else { - myCurrentEditor = myComboBox; - myComboBox.removeAllItems(); - SelectionOption key = (SelectionOption)node.getKey(); - String[] values = key.options; - for (String value1 : values) { - myComboBox.addItem(value1); - } - myComboBox.setSelectedItem(node.getValue()); - myComboBox.setEnabled(node.isEnabled()); + myCurrentEditor = myOptionsEditor; + myOptionsEditor.setCell(table, row, column); + myOptionsEditor.setText(String.valueOf(node.getValue())); + myOptionsEditor.setOptions(((SelectionOption)node.getKey()).options); + myOptionsEditor.setDefaultValue(node.getValue()); } - myCurrentNode = node; } myCurrentEditor.setBackground(table.getBackground()); - return myCurrentEditor; } } diff --git a/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java b/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java index fa7477da6cb0..01033af29063 100644 --- a/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java +++ b/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java @@ -51,7 +51,7 @@ import java.util.List; * This class provides basic functionality for running consoles. * It launches external process and handles line input with history */ -public abstract class AbstractConsoleRunnerWithHistory { +public abstract class AbstractConsoleRunnerWithHistory { private final Project myProject; private final String myConsoleTitle; @@ -59,7 +59,7 @@ public abstract class AbstractConsoleRunnerWithHistory { private final CommandLineArgumentsProvider myProvider; private final String myWorkingDir; - private LanguageConsoleViewImpl myConsoleView; + private T myConsoleView; private ConsoleExecuteActionHandler myConsoleExecuteActionHandler; @@ -194,7 +194,7 @@ public abstract class AbstractConsoleRunnerWithHistory { myConsoleView.getConsole().setEditable(false); } - protected abstract LanguageConsoleViewImpl createConsoleView(); + protected abstract T createConsoleView(); @Nullable protected abstract Process createProcess(CommandLineArgumentsProvider provider) throws ExecutionException; @@ -288,7 +288,7 @@ public abstract class AbstractConsoleRunnerWithHistory { } } - public LanguageConsoleViewImpl getConsoleView() { + public T getConsoleView() { return myConsoleView; } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/EditorHeaderToggleAction.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/EditorHeaderToggleAction.java index e8bd445d6f10..a4f246cc2be2 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/EditorHeaderToggleAction.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/EditorHeaderToggleAction.java @@ -27,6 +27,7 @@ public abstract class EditorHeaderToggleAction extends CheckboxAction { public JComponent createCustomComponent(Presentation presentation) { final JComponent customComponent = super.createCustomComponent(presentation); getCheckBox().setFocusable(false); + getCheckBox().setOpaque(false); return customComponent; } diff --git a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/Utils.java b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/Utils.java index f3012fb7222d..b16c3a5c4a2e 100644 --- a/platform/lang-impl/src/com/intellij/find/editorHeaderActions/Utils.java +++ b/platform/lang-impl/src/com/intellij/find/editorHeaderActions/Utils.java @@ -1,9 +1,14 @@ package com.intellij.find.editorHeaderActions; +import com.intellij.openapi.editor.Editor; import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.ui.popup.JBPopupFactory; import com.intellij.openapi.ui.popup.PopupChooserBuilder; import com.intellij.openapi.util.SystemInfo; +import com.intellij.openapi.vfs.ReadonlyStatusHandler; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiDocumentManager; +import com.intellij.psi.PsiFile; import javax.swing.*; import java.awt.*; @@ -61,4 +66,20 @@ public class Utils { } } } + + public static boolean ensureOkToWrite(Editor e) { + final PsiFile psiFile = PsiDocumentManager.getInstance(e.getProject()).getPsiFile(e.getDocument()); + boolean okWritable; + if (psiFile != null) { + final VirtualFile virtualFile = psiFile.getVirtualFile(); + if (virtualFile != null) { + okWritable = ReadonlyStatusHandler.ensureFilesWritable(e.getProject(), virtualFile); + } else { + okWritable = psiFile.isWritable(); + } + } else { + okWritable = e.getDocument().isWritable(); + } + return okWritable; + } } diff --git a/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreviewControllerBase.java b/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreviewControllerBase.java index 098e18e69c8f..5a58b33cb458 100644 --- a/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreviewControllerBase.java +++ b/platform/lang-impl/src/com/intellij/find/impl/livePreview/LivePreviewControllerBase.java @@ -3,6 +3,7 @@ package com.intellij.find.impl.livePreview; import com.intellij.find.FindManager; import com.intellij.find.FindModel; import com.intellij.find.FindUtil; +import com.intellij.find.editorHeaderActions.Utils; import com.intellij.find.impl.FindResultImpl; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; @@ -194,7 +195,7 @@ public class LivePreviewControllerBase implements LivePreview.Delegate, FindUtil @Nullable @Override public TextRange performReplace(final LiveOccurrence occurrence, final String replacement, final Editor editor) { - if (myReplaceDenied) return null; + if (myReplaceDenied || !Utils.ensureOkToWrite(editor)) return null; TextRange range = occurrence.getPrimaryRange(); FindModel findModel = mySearchResults.getFindModel(); TextRange result = null; @@ -216,6 +217,7 @@ public class LivePreviewControllerBase implements LivePreview.Delegate, FindUtil @Override public void performReplaceAll(Editor e) { + if (!Utils.ensureOkToWrite(e)) return; if (mySearchResults.getFindModel() != null) { FindUtil.replace(e.getProject(), e, mySearchResults.getFindModel().isGlobal() ? 0 : mySearchResults.getEditor().getSelectionModel().getSelectionStart(), diff --git a/platform/lang-impl/src/com/intellij/formatting/FormatterImpl.java b/platform/lang-impl/src/com/intellij/formatting/FormatterImpl.java index 3b62ea1fc3ee..8b9ba8442df0 100644 --- a/platform/lang-impl/src/com/intellij/formatting/FormatterImpl.java +++ b/platform/lang-impl/src/com/intellij/formatting/FormatterImpl.java @@ -37,10 +37,8 @@ import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.Deque; import java.util.HashMap; import java.util.Map; -import java.util.concurrent.LinkedBlockingDeque; import java.util.concurrent.atomic.AtomicInteger; public class FormatterImpl extends FormatterEx @@ -52,15 +50,9 @@ public class FormatterImpl extends FormatterEx FormattingModelFactory { private static final Logger LOG = Logger.getInstance("#com.intellij.formatting.FormatterImpl"); - - private enum Source { - EXECUTE_SEQUENTIAL_TASK, GET_WHITESPACE_BEFORE, ADJUST_LINE_INDENT, ADJUST_LINE_INDENTS_FOR_RANGE, FORMAT_AROUND_RANGE, - ADJUST_TEXT_RANGE, ADJUST_TEXT_RANGE_WITH_ADDITIONAL_SETTINGS, RUN_WITH_FORMATTING_DISABLED - } private FormattingProgressIndicatorImpl myProgressIndicator; - private final Deque myDisabledFormattingRequests = new LinkedBlockingDeque(); private final AtomicInteger myIsDisabledCount = new AtomicInteger(); private final IndentImpl NONE_INDENT = new IndentImpl(Indent.Type.NONE, false, false); private final IndentImpl myAbsoluteNoneIndent = new IndentImpl(Indent.Type.NONE, true, false); @@ -218,7 +210,7 @@ public class FormatterImpl extends FormatterEx * @param task task to execute */ private void execute(@NotNull SequentialTask task) { - disableFormatting(Source.EXECUTE_SEQUENTIAL_TASK); + disableFormatting(); Application application = ApplicationManager.getApplication(); if (myProgressIndicator == null || !application.isDispatchThread() || application.isUnitTestMode()) { try { @@ -228,7 +220,7 @@ public class FormatterImpl extends FormatterEx } } finally { - enableFormatting(Source.EXECUTE_SEQUENTIAL_TASK); + enableFormatting(); myProgressIndicator = null; } } @@ -242,7 +234,7 @@ public class FormatterImpl extends FormatterEx public void run() { // Reset current progress indicator. myProgressIndicator = null; - enableFormatting(Source.EXECUTE_SEQUENTIAL_TASK); + enableFormatting(); } }); } @@ -257,7 +249,7 @@ public class FormatterImpl extends FormatterEx final CodeStyleSettings.IndentOptions indentOptions, final TextRange affectedRange, final boolean mayChangeLineFeeds) { - disableFormatting(Source.GET_WHITESPACE_BEFORE); + disableFormatting(); try { final FormatProcessor processor = buildProcessorAndWrapBlocks( model, block, settings, indentOptions, new FormatTextRanges(affectedRange, true) @@ -275,7 +267,7 @@ public class FormatterImpl extends FormatterEx return new IndentInfo(whiteSpace.getLineFeeds(), whiteSpace.getIndentOffset(), whiteSpace.getSpaces()); } finally { - enableFormatting(Source.GET_WHITESPACE_BEFORE); + enableFormatting(); } } @@ -283,7 +275,7 @@ public class FormatterImpl extends FormatterEx final CodeStyleSettings settings, final CodeStyleSettings.IndentOptions indentOptions, final TextRange rangeToAdjust) { - disableFormatting(Source.ADJUST_LINE_INDENTS_FOR_RANGE); + disableFormatting(); try { final FormattingDocumentModel documentModel = model.getDocumentModel(); final Block block = model.getRootBlock(); @@ -303,7 +295,7 @@ public class FormatterImpl extends FormatterEx processor.performModifications(model); } finally { - enableFormatting(Source.ADJUST_LINE_INDENTS_FOR_RANGE); + enableFormatting(); } } @@ -311,7 +303,7 @@ public class FormatterImpl extends FormatterEx final CodeStyleSettings settings, final TextRange textRange, final FileType fileType) { - disableFormatting(Source.FORMAT_AROUND_RANGE); + disableFormatting(); try { final FormattingDocumentModel documentModel = model.getDocumentModel(); final Block block = model.getRootBlock(); @@ -340,7 +332,7 @@ public class FormatterImpl extends FormatterEx processor.performModifications(model); } finally{ - enableFormatting(Source.FORMAT_AROUND_RANGE); + enableFormatting(); } } @@ -349,7 +341,7 @@ public class FormatterImpl extends FormatterEx final CodeStyleSettings.IndentOptions indentOptions, final int offset, final TextRange affectedRange) throws IncorrectOperationException { - disableFormatting(Source.ADJUST_LINE_INDENT); + disableFormatting(); if (model instanceof PsiBasedFormattingModel) { ((PsiBasedFormattingModel)model).canModifyAllWhiteSpaces(); } @@ -370,7 +362,7 @@ public class FormatterImpl extends FormatterEx return adjustLineIndent(offset, documentModel, processor, indentOptions, model, whiteSpace); } finally { - enableFormatting(Source.ADJUST_LINE_INDENT); + enableFormatting(); } } @@ -542,7 +534,7 @@ public class FormatterImpl extends FormatterEx final boolean changeWSBeforeFirstElement, final boolean changeLineFeedsBeforeFirstElement, @Nullable final IndentInfoStorage indentInfoStorage) { - disableFormatting(Source.ADJUST_TEXT_RANGE_WITH_ADDITIONAL_SETTINGS); + disableFormatting(); try { final FormatProcessor processor = buildProcessorAndWrapBlocks( model.getDocumentModel(), model.getRootBlock(), settings, indentOptions, new FormatTextRanges(affectedRange, true) @@ -603,7 +595,7 @@ public class FormatterImpl extends FormatterEx processor.format(model); } finally { - enableFormatting(Source.ADJUST_TEXT_RANGE_WITH_ADDITIONAL_SETTINGS); + enableFormatting(); } } @@ -611,7 +603,7 @@ public class FormatterImpl extends FormatterEx final CodeStyleSettings settings, final CodeStyleSettings.IndentOptions indentOptions, final TextRange affectedRange) { - disableFormatting(Source.ADJUST_TEXT_RANGE); + disableFormatting(); try { final FormatProcessor processor = buildProcessorAndWrapBlocks( model.getDocumentModel(), model.getRootBlock(), settings, indentOptions, new FormatTextRanges(affectedRange, true) @@ -633,7 +625,7 @@ public class FormatterImpl extends FormatterEx processor.format(model); } finally { - enableFormatting(Source.ADJUST_TEXT_RANGE); + enableFormatting(); } } @@ -743,34 +735,24 @@ public class FormatterImpl extends FormatterEx return myIsDisabledCount.get() > 0; } - private void disableFormatting(@NotNull Source requestSource) { + private void disableFormatting() { myIsDisabledCount.incrementAndGet(); - myDisabledFormattingRequests.add(requestSource); } - private void enableFormatting(@NotNull Source requestSource) { - boolean checkSource = true; + private void enableFormatting() { int old = myIsDisabledCount.getAndDecrement(); if (old <= 0) { - checkSource = false; - LOG.error( - "enableFormatting()/disableFormatting() not paired. DisabledLevel = " + old + ", request source: " + myDisabledFormattingRequests - ); - } - Source source = myDisabledFormattingRequests.pollLast(); - if (checkSource && requestSource != source) { - LOG.error("enableFormatting()/disableFormatting() from different sources detected! 'Disable source': " + source - + ", 'enable source': " + requestSource); + LOG.error("enableFormatting()/disableFormatting() not paired. DisabledLevel = " + old); } } public T runWithFormattingDisabled(@NotNull Computable runnable) { - disableFormatting(Source.RUN_WITH_FORMATTING_DISABLED); + disableFormatting(); try { return runnable.compute(); } finally { - enableFormatting(Source.RUN_WITH_FORMATTING_DISABLED); + enableFormatting(); } } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/FileElementInfo.java b/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/FileElementInfo.java index 24fc5e010d83..54412d636905 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/FileElementInfo.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/FileElementInfo.java @@ -69,7 +69,7 @@ class FileElementInfo implements SmartPointerElementInfo { } @Override - public boolean pointsToTheSameElementAs(SmartPointerElementInfo other) { + public boolean pointsToTheSameElementAs(@NotNull SmartPointerElementInfo other) { if (other instanceof FileElementInfo) { return myVirtualFile == ((FileElementInfo)other).myVirtualFile; } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/HardElementInfo.java b/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/HardElementInfo.java index 0573a30cc0bb..50c5ff8b32cd 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/HardElementInfo.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/HardElementInfo.java @@ -65,7 +65,7 @@ class HardElementInfo implements SmartPointerElementInfo { } @Override - public boolean pointsToTheSameElementAs(SmartPointerElementInfo other) { + public boolean pointsToTheSameElementAs(@NotNull SmartPointerElementInfo other) { return Comparing.equal(myElement, other.restoreElement()); } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/InjectedSelfElementInfo.java b/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/InjectedSelfElementInfo.java index 5e9299408f1e..2535d73ebfa0 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/InjectedSelfElementInfo.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/InjectedSelfElementInfo.java @@ -77,4 +77,13 @@ class InjectedSelfElementInfo extends SelfElementInfo { return result.get(); } + + @Override + public boolean pointsToTheSameElementAs(@NotNull SmartPointerElementInfo other) { + if (getClass() != other.getClass()) return false; + if (!super.pointsToTheSameElementAs(other)) return false; + SmartPointerElementInfo myElementInfo = ((SmartPsiElementPointerImpl)myPsiFileRangeInHostElement).getElementInfo(); + SmartPointerElementInfo oElementInfo = ((SmartPsiElementPointerImpl)((InjectedSelfElementInfo)other).myPsiFileRangeInHostElement).getElementInfo(); + return myElementInfo.pointsToTheSameElementAs(oElementInfo); + } } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/SelfElementInfo.java b/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/SelfElementInfo.java index 6ebadcfe8f1d..f347c6b0cd15 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/SelfElementInfo.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/SelfElementInfo.java @@ -254,7 +254,7 @@ public class SelfElementInfo implements SmartPointerElementInfo { } @Override - public boolean pointsToTheSameElementAs(SmartPointerElementInfo other) { + public boolean pointsToTheSameElementAs(@NotNull SmartPointerElementInfo other) { if (other instanceof SelfElementInfo) { return myVirtualFile == ((SelfElementInfo)other).myVirtualFile && myType == ((SelfElementInfo)other).myType diff --git a/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/SmartPointerElementInfo.java b/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/SmartPointerElementInfo.java index 8ef474f6dd1e..ef8b6afda90f 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/SmartPointerElementInfo.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/SmartPointerElementInfo.java @@ -38,7 +38,7 @@ interface SmartPointerElementInfo { void dispose(); int elementHashCode(); // must be immutable - boolean pointsToTheSameElementAs(SmartPointerElementInfo other); + boolean pointsToTheSameElementAs(@NotNull SmartPointerElementInfo other); VirtualFile getVirtualFile(); diff --git a/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/SmartPsiElementPointerImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/SmartPsiElementPointerImpl.java index 4224bd4c6521..7401a1664a07 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/SmartPsiElementPointerImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/smartPointers/SmartPsiElementPointerImpl.java @@ -85,7 +85,7 @@ class SmartPsiElementPointerImpl implements SmartPointerEx if (element != null && !element.isValid()) { element = null; } - if (element == null && myElementInfo != null) { + if (element == null) { element = (E)myElementInfo.restoreElement(); if (element != null && (!element.getClass().equals(myElementClass) || !element.isValid())) { element = null; @@ -168,17 +168,13 @@ class SmartPsiElementPointerImpl implements SmartPointerEx } public void documentAndPsiInSync() { - if (myElementInfo != null) { - myElementInfo.documentAndPsiInSync(); - } + myElementInfo.documentAndPsiInSync(); } @Override public void dispose() { - if (myElementInfo != null) { - myElementInfo.dispose(); - myElement = null; - } + myElementInfo.dispose(); + myElement = null; } @Override @@ -190,6 +186,7 @@ class SmartPsiElementPointerImpl implements SmartPointerEx myElementInfo.fastenBelt(offset); } + @NotNull SmartPointerElementInfo getElementInfo() { return myElementInfo; } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReference.java b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReference.java index 978638d19aa7..0778acf2efb6 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReference.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/impl/providers/FileReference.java @@ -202,7 +202,7 @@ public class FileReference implements FileReferenceOwner, PsiPolyVariantReferenc public boolean execute(PsiFileSystemItem element) { result.add(new PsiElementResolveResult(getOriginalFile(element))); - return false; + return true; } }); } diff --git a/platform/platform-api/src/com/intellij/openapi/fileEditor/FileDocumentManager.java b/platform/platform-api/src/com/intellij/openapi/fileEditor/FileDocumentManager.java index f0181c23c35a..243ad6dd4cfd 100644 --- a/platform/platform-api/src/com/intellij/openapi/fileEditor/FileDocumentManager.java +++ b/platform/platform-api/src/com/intellij/openapi/fileEditor/FileDocumentManager.java @@ -27,6 +27,7 @@ public abstract class FileDocumentManager { return ApplicationManager.getApplication().getComponent(FileDocumentManager.class); } + @Nullable public abstract Document getDocument(@NotNull VirtualFile file); @Nullable diff --git a/platform/platform-api/src/com/intellij/ui/components/JBList.java b/platform/platform-api/src/com/intellij/ui/components/JBList.java index 71f523ac687f..0849651a54ed 100644 --- a/platform/platform-api/src/com/intellij/ui/components/JBList.java +++ b/platform/platform-api/src/com/intellij/ui/components/JBList.java @@ -53,7 +53,7 @@ public class JBList extends JList implements ComponentWithEmptyText, ComponentWi init(); } - private static DefaultListModel createDefaultListModel(Object[] items) { + public static DefaultListModel createDefaultListModel(Object... items) { final DefaultListModel model = new DefaultListModel(); for (Object item : items) { model.add(model.getSize(), item); diff --git a/platform/platform-api/src/com/intellij/ui/components/editors/JBComboBoxTableCellEditorComponent.java b/platform/platform-api/src/com/intellij/ui/components/editors/JBComboBoxTableCellEditorComponent.java new file mode 100644 index 000000000000..f14561de9384 --- /dev/null +++ b/platform/platform-api/src/com/intellij/ui/components/editors/JBComboBoxTableCellEditorComponent.java @@ -0,0 +1,124 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.ui.components.editors; + +import com.intellij.openapi.ui.popup.JBPopupFactory; +import com.intellij.ui.awt.RelativePoint; +import com.intellij.ui.components.JBLabel; +import com.intellij.ui.components.JBList; +import com.intellij.util.Icons; +import com.intellij.util.ui.EmptyIcon; + +import javax.swing.*; +import java.awt.*; + +/** + * Solves rendering problems in JTable components when JComboBox objects are used as cell + * editors components. Known issues of using JComboBox component are the following: + * 1. Ugly view if row height is small enough + * 2. Truncated strings in the combobox popup if column width is less than text value width + * + * @author Konstantin Bulenkov + */ +public class JBComboBoxTableCellEditorComponent extends JBLabel { + private JTable myTable; + private int myRow = 0; + private int myColumn = 0; + private final JBList myList = new JBList(); + private Object[] myOptions = {}; + private Object myValue; + + private ListCellRenderer myRenderer = new DefaultListCellRenderer() { + private Icon myCheckIcon = Icons.CHECK_ICON; + private Icon myEmptyIcon = EmptyIcon.create(Icons.CHECK_ICON.getIconWidth()); + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + final JLabel label = (JLabel)super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + if (value == myValue) { + label.setIcon(myCheckIcon); + } else { + label.setIcon(myEmptyIcon); + } + return label; + } + }; + + public JBComboBoxTableCellEditorComponent() { + } + + public JBComboBoxTableCellEditorComponent(JTable table) { + myTable = table; + } + + public void setTable(JTable table) { + myTable = table; + } + + public void setCell(JTable table, int row, int column) { + setTable(table); + setRow(row); + setColumn(column); + } + + public void setRow(int row) { + myRow = row; + } + + public void setColumn(int column) { + myColumn = column; + } + + public void setOptions(Object... options) { + myOptions = options; + } + + @Override + public void addNotify() { + super.addNotify(); + initAndShowPopup(); + } + + private void initAndShowPopup() { + myList.removeAll(); + final Rectangle rect = myTable.getCellRect(myRow, myColumn, true); + final Point point = new Point(rect.x, rect.y); + myList.setModel(JBList.createDefaultListModel(myOptions)); + if (myRenderer != null) { + myList.setCellRenderer(myRenderer); + } + JBPopupFactory.getInstance() + .createListPopupBuilder(myList) + .setItemChoosenCallback(new Runnable() { + @Override + public void run() { + myValue = myList.getSelectedValue(); + } + }).createPopup() + .show(new RelativePoint(myTable, point)); + } + + public Object getEditorValue() { + return myValue; + } + + public void setRenderer(ListCellRenderer renderer) { + myRenderer = renderer; + } + + public void setDefaultValue(Object value) { + myValue = value; + } +} diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileDocumentManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileDocumentManagerImpl.java index e4dae40553d6..294f15809460 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileDocumentManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/FileDocumentManagerImpl.java @@ -107,6 +107,7 @@ public class FileDocumentManagerImpl extends FileDocumentManager implements Appl public void disposeComponent() { } + @Nullable public Document getDocument(@NotNull final VirtualFile file) { DocumentEx document = (DocumentEx)getCachedDocument(file); if (document == null) { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AbstractShowDiffAction.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AbstractShowDiffAction.java index 1f1ba9523d02..392f1112fdac 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AbstractShowDiffAction.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/actions/AbstractShowDiffAction.java @@ -17,6 +17,7 @@ package com.intellij.openapi.vcs.actions; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.Presentation; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.vcs.AbstractVcs; @@ -89,7 +90,10 @@ public abstract class AbstractShowDiffAction extends AbstractVcsAction{ final Project project = vcsContext.getProject(); final VirtualFile selectedFile = vcsContext.getSelectedFiles()[0]; final FileDocumentManager fileDocumentManager = FileDocumentManager.getInstance(); - fileDocumentManager.saveDocument(fileDocumentManager.getDocument(selectedFile)); + final Document document = fileDocumentManager.getDocument(selectedFile); + if (document != null) { + fileDocumentManager.saveDocument(document); + } final ProjectLevelVcsManager vcsManager = ProjectLevelVcsManager.getInstance(project); final AbstractVcs vcs = vcsManager.getVcsFor(selectedFile); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/PatchFileType.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/PatchFileType.java index c46667b27531..eeb3edf85b69 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/PatchFileType.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/patch/PatchFileType.java @@ -36,11 +36,12 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; public class PatchFileType implements FileType { + public static final String NAME = "PATCH"; @NotNull @NonNls public String getName() { - return "PATCH"; + return NAME; } @NotNull diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ImportIntoShelfAction.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ImportIntoShelfAction.java index 8b185f96e520..a397f535c2bc 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ImportIntoShelfAction.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ImportIntoShelfAction.java @@ -24,7 +24,9 @@ import com.intellij.openapi.fileChooser.FileChooserFactory; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.MessageType; +import com.intellij.openapi.ui.Messages; import com.intellij.openapi.vcs.AbstractVcsHelper; import com.intellij.openapi.vcs.VcsException; import com.intellij.openapi.vcs.ui.VcsBalloonProblemNotifier; @@ -60,28 +62,49 @@ public class ImportIntoShelfAction extends DumbAwareAction { @Override public void consume(final VirtualFile[] virtualFiles) { if (virtualFiles.length == 0) return; - ProgressManager.getInstance().runProcessWithProgressSynchronously(new Runnable() { - @Override - public void run() { - final List exceptions = new ArrayList(); - final List lists = - ShelveChangesManager.getInstance(project).importChangeLists(Arrays.asList(virtualFiles), new Consumer() { - @Override - public void consume(VcsException e) { - exceptions.add(e); - } - }); - if (! lists.isEmpty()) { - ShelvedChangesViewManager.getInstance(project).activateView(lists.get(lists.size() - 1)); + //gatherPatchFiles + final ProgressManager pm = ProgressManager.getInstance(); + final ShelveChangesManager shelveChangesManager = ShelveChangesManager.getInstance(project); + final List asList = Arrays.asList(virtualFiles); + + final List patchTypeFiles = new ArrayList(); + final boolean filesFound = pm.runProcessWithProgressSynchronously(new Runnable() { + @Override + public void run() { + patchTypeFiles.addAll(shelveChangesManager.gatherPatchFiles(asList)); } - if (! exceptions.isEmpty()) { - AbstractVcsHelper.getInstance(project).showErrors(exceptions, "Import patches into shelf"); + }, "Looking for patch files...", true, project); + if (! filesFound || patchTypeFiles.isEmpty()) return; + if (! patchTypeFiles.equals(asList)) { + final int toImport = Messages.showYesNoDialog(project, "Found " + + (patchTypeFiles.size() == 1 + ? "one patch file (" + patchTypeFiles.get(0).getPath() + ")." + : (patchTypeFiles.size() + " patch files.")) + + "\nContinue with import?", "Import patches", Messages.getQuestionIcon()); + if (DialogWrapper.CANCEL_EXIT_CODE == toImport) return; + } + pm.runProcessWithProgressSynchronously(new Runnable() { + @Override + public void run() { + final List exceptions = new ArrayList(); + final List lists = + shelveChangesManager.importChangeLists(patchTypeFiles, new Consumer() { + @Override + public void consume(VcsException e) { + exceptions.add(e); + } + }); + if (!lists.isEmpty()) { + ShelvedChangesViewManager.getInstance(project).activateView(lists.get(lists.size() - 1)); + } + if (!exceptions.isEmpty()) { + AbstractVcsHelper.getInstance(project).showErrors(exceptions, "Import patches into shelf"); + } + if (lists.isEmpty() && exceptions.isEmpty()) { + VcsBalloonProblemNotifier.showOverChangesView(project, "No patches found", MessageType.WARNING); + } } - if (lists.isEmpty() && exceptions.isEmpty()) { - VcsBalloonProblemNotifier.showOverChangesView(project, "No patches found", MessageType.WARNING); - } - } - }, "Import patches into shelf", true, project); + }, "Import patches into shelf", true, project); } }); } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManager.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManager.java index 993647004fa0..97ec0edcd960 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManager.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/shelf/ShelveChangesManager.java @@ -39,8 +39,10 @@ import com.intellij.openapi.util.*; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vcs.*; import com.intellij.openapi.vcs.changes.*; +import com.intellij.openapi.vcs.changes.patch.PatchFileType; import com.intellij.openapi.vcs.changes.patch.PatchNameChecker; import com.intellij.openapi.vcs.changes.ui.RollbackWorker; +import com.intellij.openapi.vcs.impl.VcsFileTypeFactory; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Consumer; import com.intellij.util.PathUtil; @@ -213,17 +215,30 @@ public class ShelveChangesManager implements ProjectComponent, JDOMExternalizabl } } + public List gatherPatchFiles(final Collection files) { + final List result = new ArrayList(); + + final LinkedList filesQueue = new LinkedList(files); + while (! filesQueue.isEmpty()) { + ProgressManager.checkCanceled(); + final VirtualFile file = filesQueue.removeFirst(); + if (file.isDirectory()) { + filesQueue.addAll(Arrays.asList(file.getChildren())); + continue; + } + if (PatchFileType.NAME.equals(file.getFileType().getName())) { + result.add(file); + } + } + + return result; + } + public List importChangeLists(final Collection files, final Consumer exceptionConsumer) { final List result = new ArrayList(files.size()); try { - final LinkedList filesQueue = new LinkedList(files); - while (! filesQueue.isEmpty()) { + for (VirtualFile file : files) { ProgressManager.checkCanceled(); - final VirtualFile file = filesQueue.removeFirst(); - if (file.isDirectory()) { - filesQueue.addAll(Arrays.asList(file.getChildren())); - continue; - } final String description = file.getNameWithoutExtension().replace('_', ' '); final File patchPath = getPatchPath(description); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java index 32fc10ef030d..741a48c58f61 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/completion/GroovyCompletionContributor.java @@ -65,7 +65,6 @@ import java.util.*; import static com.intellij.patterns.PlatformPatterns.psiElement; import static com.intellij.patterns.PsiJavaPatterns.elementType; import static com.intellij.util.containers.CollectionFactory.hashMap; -import static org.jetbrains.plugins.groovy.lang.psi.util.GroovyPropertyUtils.*; /** * @author ilyas @@ -332,17 +331,14 @@ public class GroovyCompletionContributor extends CompletionContributor { } final int invocationCount = parameters.getInvocationCount(); - final boolean secondCompletionInvoked = invocationCount > 1; + final boolean firstCompletionInvoked = invocationCount < 2; final String prefix = result.getPrefixMatcher().getPrefix(); - final boolean skipAccessors = !secondCompletionInvoked && !prefix.startsWith(GET_PREFIX) && - !prefix.startsWith(SET_PREFIX) && - !prefix.startsWith(IS_PREFIX); + final boolean skipAccessors = firstCompletionInvoked && !prefix.startsWith("g") && !prefix.startsWith("s") && !prefix.startsWith("i"); + result.restartCompletionOnPrefixChange("g"); + result.restartCompletionOnPrefixChange("i"); + result.restartCompletionOnPrefixChange("s"); - - result.restartCompletionOnPrefixChange(GET_PREFIX); - result.restartCompletionOnPrefixChange(SET_PREFIX); - result.restartCompletionOnPrefixChange(IS_PREFIX); final Map staticMembers = hashMap(); final PsiElement qualifier = reference.getQualifier(); final PsiType qualifierType = qualifier instanceof GrExpression ? ((GrExpression)qualifier).getType() : null; @@ -372,7 +368,7 @@ public class GroovyCompletionContributor extends CompletionContributor { final boolean autopopup = parameters.getInvocationCount() == 0; //skip default groovy methods - if (!secondCompletionInvoked && + if (firstCompletionInvoked && object instanceof GrGdkMethod && GroovyCompletionUtil.skipDefGroovyMethod((GrGdkMethod)object, substitutor, qualifierType)) { if (!autopopup) { @@ -382,7 +378,7 @@ public class GroovyCompletionContributor extends CompletionContributor { } //skip operator methods - if (!secondCompletionInvoked && + if (firstCompletionInvoked && object instanceof PsiMethod && GroovyCompletionUtil.OPERATOR_METHOD_NAMES.contains(((PsiMethod)object).getName())) { if (!checkForIterator((PsiMethod)object)) { @@ -402,7 +398,7 @@ public class GroovyCompletionContributor extends CompletionContributor { } //skip inaccessible elements - if (!secondCompletionInvoked && resolveResult != null && !resolveResult.isAccessible()) { + if (firstCompletionInvoked && resolveResult != null && !resolveResult.isAccessible()) { if (!autopopup) { showInfo(); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/SwitchStatement.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/SwitchStatement.java index 33656a2a85cc..210910a19667 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/SwitchStatement.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/parser/parsing/statements/SwitchStatement.java @@ -67,11 +67,7 @@ public class SwitchStatement implements GroovyElementTypes { ParserUtils.getToken(builder, mLCURLY); ParserUtils.getToken(builder, mNLS); - while (true) { - if (ParserUtils.getToken(builder, mRCURLY)) { - return; - } - + while (!ParserUtils.getToken(builder, mRCURLY)) { if (builder.getTokenType() != kCASE && builder.getTokenType() != kDEFAULT) { builder.error("case, default or } expected"); ParserUtils.skipCountingBraces(builder, TokenSet.create(kCASE, kDEFAULT, mRCURLY)); @@ -104,8 +100,8 @@ public class SwitchStatement implements GroovyElementTypes { PsiBuilder.Marker label = builder.mark(); builder.advanceLexer(); - if (kCASE.equals(elem)) { - AssignmentExpression.parse(builder, parser, true); + if (kCASE.equals(elem) && !AssignmentExpression.parse(builder, parser)) { + builder.error(GroovyBundle.message("expression.expected")); } ParserUtils.getToken(builder, mCOLON, GroovyBundle.message("colon.expected")); label.done(CASE_LABEL); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrSwitchStatement.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrSwitchStatement.java index d7773c4d1797..ddc2a0a76209 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrSwitchStatement.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/GrSwitchStatement.java @@ -16,14 +16,19 @@ package org.jetbrains.plugins.groovy.lang.psi.api.statements; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; -import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrCondition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.clauses.GrCaseSection; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; /** * @author ilyas */ public interface GrSwitchStatement extends GroovyPsiElement, GrStatement { - GrCondition getCondition(); + @Nullable + GrExpression getCondition(); + + @NotNull GrCaseSection[] getCaseSections(); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/clauses/GrCaseLabel.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/clauses/GrCaseLabel.java index 2f7aeb219198..d736ffb04b6a 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/clauses/GrCaseLabel.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/api/statements/clauses/GrCaseLabel.java @@ -16,10 +16,14 @@ package org.jetbrains.plugins.groovy.lang.psi.api.statements.clauses; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; /** * @author ilyas */ public interface GrCaseLabel extends GroovyPsiElement { + @Nullable + GrExpression getValue(); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrSwitchStatementImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrSwitchStatementImpl.java index b5b5f0e7e72c..af3967d19973 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrSwitchStatementImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/GrSwitchStatementImpl.java @@ -19,9 +19,9 @@ package org.jetbrains.plugins.groovy.lang.psi.impl.statements; import com.intellij.lang.ASTNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; -import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrCondition; import org.jetbrains.plugins.groovy.lang.psi.api.statements.GrSwitchStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.clauses.GrCaseSection; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyPsiElementImpl; /** @@ -41,10 +41,11 @@ public class GrSwitchStatementImpl extends GroovyPsiElementImpl implements GrSwi return "Switch statement"; } - public GrCondition getCondition() { - return findChildByClass(GrCondition.class); + public GrExpression getCondition() { + return findChildByClass(GrExpression.class); } + @NotNull public GrCaseSection[] getCaseSections() { return findChildrenByClass(GrCaseSection.class); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/clauses/GrCaseLabelImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/clauses/GrCaseLabelImpl.java index d99625bc3726..39f3c03fd548 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/clauses/GrCaseLabelImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/statements/clauses/GrCaseLabelImpl.java @@ -20,6 +20,7 @@ import com.intellij.lang.ASTNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.lang.psi.GroovyElementVisitor; import org.jetbrains.plugins.groovy.lang.psi.api.statements.clauses.GrCaseLabel; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.impl.GroovyPsiElementImpl; /** @@ -38,4 +39,9 @@ public class GrCaseLabelImpl extends GroovyPsiElementImpl implements GrCaseLabel public String toString() { return "Case label"; } + + @Override + public GrExpression getValue() { + return findChildByClass(GrExpression.class); + } } \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/CodeBlockGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/CodeBlockGenerator.java index d28e8a386d2f..a7197c918cc3 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/CodeBlockGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/CodeBlockGenerator.java @@ -17,7 +17,10 @@ package org.jetbrains.plugins.groovy.refactoring.convertToJava; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.intellij.psi.*; +import com.intellij.psi.CommonClassNames; +import com.intellij.psi.JavaPsiFacade; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiType; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.groovy.lang.psi.GroovyPsiElement; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrCondition; @@ -32,7 +35,9 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.branch.GrAssertState import org.jetbrains.plugins.groovy.lang.psi.api.statements.branch.GrFlowInterruptingStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.branch.GrReturnStatement; import org.jetbrains.plugins.groovy.lang.psi.api.statements.branch.GrThrowStatement; -import org.jetbrains.plugins.groovy.lang.psi.api.statements.clauses.*; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.clauses.GrForClause; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.clauses.GrForInClause; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.clauses.GrTraditionalForClause; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter; import org.jetbrains.plugins.groovy.lang.psi.api.statements.typedef.GrTypeDefinition; @@ -219,6 +224,7 @@ public class CodeBlockGenerator extends Generator { final StringBuilder builder = new StringBuilder(); final GrForClause clause = forStatement.getClause(); + ExpressionContext forContext = context.extend(); if (clause instanceof GrForInClause) { final GrExpression expression = ((GrForInClause)clause).getIteratedExpression(); final GrVariable declaredVariable = clause.getDeclaredVariable(); @@ -228,7 +234,7 @@ public class CodeBlockGenerator extends Generator { writeVariableWithoutColon(builder, declaredVariable); builder.append(" : "); if (expression != null) { - final ExpressionContext context = this.context.copy(); + final ExpressionContext context = forContext.copy(); expression.accept(new ExpressionGenerator(builder, context)); } builder.append(")"); @@ -244,7 +250,7 @@ public class CodeBlockGenerator extends Generator { writeVariableWithoutColon(partBuilder, (GrParameter)initialization); final GrExpression initializer = ((GrParameter)initialization).getDefaultInitializer(); if (initializer != null) { - final ExpressionContext partContext = context.copy(); + final ExpressionContext partContext = forContext.copy(); initializer.accept(new ExpressionGenerator(partBuilder, partContext)); for (String statement : partContext.myStatements) { builder.append(statement).append(", "); @@ -255,30 +261,28 @@ public class CodeBlockGenerator extends Generator { else { if (initialization != null) { StringBuilder partBuilder = new StringBuilder(); - final ExpressionContext partContext = this.context.copy(); + final ExpressionContext partContext = forContext.copy(); genForPart(builder, initialization, new CodeBlockGenerator(partBuilder, partContext)); } } builder.append(";"); if (condition != null) { - genForPart(builder, condition); + genForPart(builder, condition, forContext.copy()); } builder.append(";"); if (update != null) { - genForPart(builder, update); + genForPart(builder, update, forContext.copy()); } builder.append(")"); } - forStatement.getBody().accept(new CodeBlockGenerator(builder, context)); + forStatement.getBody().accept(new CodeBlockGenerator(builder, forContext)); } - private void genForPart(StringBuilder builder, GrExpression part) { - StringBuilder partBuilder = new StringBuilder(); - final ExpressionContext partContext = this.context.copy(); - genForPart(builder, part, new ExpressionGenerator(partBuilder, partContext)); + private static void genForPart(StringBuilder builder, GrExpression part, final ExpressionContext context) { + genForPart(builder, part, new ExpressionGenerator(new StringBuilder(), context)); } private static void genForPart(StringBuilder builder, GroovyPsiElement part, final Generator visitor) { @@ -299,57 +303,63 @@ public class CodeBlockGenerator extends Generator { @Override public void visitWhileStatement(GrWhileStatement whileStatement) { - //todo + final GrCondition condition = whileStatement.getCondition(); + final GrStatement body = whileStatement.getBody(); + + StringBuilder builder = new StringBuilder(); + builder.append("while ("); + final ExpressionContext copy = context.copy(); + if (condition != null) { + condition.accept(new ExpressionGenerator(builder, copy)); + } + builder.append(" )"); + if (body != null) { + body.accept(new CodeBlockGenerator(builder, copy.extend())); + } + writeStatement(builder, whileStatement, copy); } @Override public void visitSwitchStatement(GrSwitchStatement switchStatement) { - super.visitSwitchStatement(switchStatement); //To change body of overridden methods use File | Settings | File Templates. - } - - @Override - public void visitCaseSection(GrCaseSection caseSection) { - super.visitCaseSection(caseSection); //To change body of overridden methods use File | Settings | File Templates. - } - - @Override - public void visitCaseLabel(GrCaseLabel caseLabel) { - super.visitCaseLabel(caseLabel); //To change body of overridden methods use File | Settings | File Templates. - } - - @Override - public void visitForInClause(GrForInClause forInClause) { - super.visitForInClause(forInClause); //To change body of overridden methods use File | Settings | File Templates. - } - - @Override - public void visitForClause(GrForClause forClause) { - super.visitForClause(forClause); //To change body of overridden methods use File | Settings | File Templates. - } - - @Override - public void visitTraditionalForClause(GrTraditionalForClause forClause) { - super.visitTraditionalForClause(forClause); //To change body of overridden methods use File | Settings | File Templates. + //todo } @Override public void visitTryStatement(GrTryCatchStatement tryCatchStatement) { - super.visitTryStatement(tryCatchStatement); //To change body of overridden methods use File | Settings | File Templates. - } - - @Override - public void visitBlockStatement(GrBlockStatement blockStatement) { - super.visitBlockStatement(blockStatement); //To change body of overridden methods use File | Settings | File Templates. + final GrOpenBlock tryBlock = tryCatchStatement.getTryBlock(); + final GrCatchClause[] catchClauses = tryCatchStatement.getCatchClauses(); + final GrFinallyClause finallyClause = tryCatchStatement.getFinallyClause(); + builder.append("try"); + tryBlock.accept(this); + for (GrCatchClause catchClause : catchClauses) { + catchClause.accept(this); + } + if (finallyClause != null) { + finallyClause.accept(this); + } } @Override public void visitCatchClause(GrCatchClause catchClause) { - super.visitCatchClause(catchClause); //To change body of overridden methods use File | Settings | File Templates. + final GrParameter parameter = catchClause.getParameter(); + builder.append("catch ("); + writeVariableWithoutColon(builder, parameter); + builder.append(") "); + final GrOpenBlock body = catchClause.getBody(); + if (body != null) { + body.accept(this); + } } @Override - public void visitFinallyClause(GrFinallyClause catchClause) { - super.visitFinallyClause(catchClause); //To change body of overridden methods use File | Settings | File Templates. + public void visitFinallyClause(GrFinallyClause finallyClause) { + builder.append("finally "); + finallyClause.getBody().accept(this); + } + + @Override + public void visitBlockStatement(GrBlockStatement blockStatement) { + //todo } @Override @@ -369,13 +379,14 @@ public class CodeBlockGenerator extends Generator { @Override public void visitVariableDeclaration(GrVariableDeclaration variableDeclaration) { - final GrModifierList modifierList = variableDeclaration.getModifierList(); //todo + final GrModifierList modifierList = variableDeclaration.getModifierList(); final GrVariable[] variables = variableDeclaration.getVariables(); - StringBuilder builder=new StringBuilder(); + StringBuilder builder = new StringBuilder(); ExpressionContext expressionContext = context.copy(); final ExpressionGenerator expressionGenerator = new ExpressionGenerator(builder, expressionContext); + if (variableDeclaration.isTuple()) { final GrTupleDeclaration tuple = variableDeclaration.getTupleDeclaration(); final GrExpression tupleInitializer = tuple.getInitializerGroovy(); @@ -384,6 +395,7 @@ public class CodeBlockGenerator extends Generator { for (int i = 0; i < variables.length; i++) { final GrVariable v = variables[i]; final PsiType type = v.getDeclaredType(); + GenerationUtil.writeModifiers(builder, modifierList); GenerationUtil.writeType(builder, type); builder.append(" ").append(v.getName()); if (i < initializers.length) { @@ -396,12 +408,13 @@ public class CodeBlockGenerator extends Generator { else { final PsiType iteratorType = JavaPsiFacade.getElementFactory(context.project).createTypeFromText(CommonClassNames.JAVA_UTIL_ITERATOR, variableDeclaration); - final String iteratorName = GenerationUtil.suggestVarName(iteratorType,variableDeclaration, expressionContext); + final String iteratorName = GenerationUtil.suggestVarName(iteratorType, variableDeclaration, expressionContext); builder.append("final ").append(CommonClassNames.JAVA_UTIL_ITERATOR).append(" ").append(iteratorName).append(" = "); GenerationUtil.invokeMethodByName(tupleInitializer, "iterator", GrExpression.EMPTY_ARRAY, GrNamedArgument.EMPTY_ARRAY, GrClosableBlock.EMPTY_ARRAY, expressionGenerator, variableDeclaration); for (final GrVariable v : variables) { + GenerationUtil.writeModifiers(builder, modifierList); final PsiType type = v.getDeclaredType(); GenerationUtil.writeType(builder, type); builder.append(" ").append(v.getName()); @@ -410,13 +423,12 @@ public class CodeBlockGenerator extends Generator { } } else { + GenerationUtil.writeModifiers(builder, modifierList); final GrTypeElement typeElement = variableDeclaration.getTypeElementGroovy(); PsiType type = typeElement == null ? PsiType.getJavaLangObject(variableDeclaration.getManager(), variableDeclaration.getResolveScope()) : typeElement.getType(); GenerationUtil.writeType(builder, type); - - } writeStatement(builder, variableDeclaration, expressionContext); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionContext.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionContext.java index 1d636c05d448..01a04fa9b598 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionContext.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/ExpressionContext.java @@ -39,4 +39,10 @@ class ExpressionContext { ExpressionContext copy() { return new ExpressionContext(project, myUsedVarNames); } + + ExpressionContext extend() { + final HashSet usedVarNames = new HashSet(); + usedVarNames.addAll(myUsedVarNames); + return new ExpressionContext(project, usedVarNames); + } } \ No newline at end of file diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/GenerationUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/GenerationUtil.java index 4b368a23ea9b..3cca78c1bb92 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/GenerationUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/refactoring/convertToJava/GenerationUtil.java @@ -129,6 +129,10 @@ public class GenerationUtil { argumentListGenerator.generate(null, exprs, namedArgs, closureArgs, psiContext); } + public static boolean writeModifiers(StringBuilder text, PsiModifierList modifierList) { + return writeModifiers(text, modifierList, JAVA_MODIFIERS); + } + public static boolean writeModifiers(StringBuilder text, PsiModifierList modifierList, String[] modifiers) { boolean wasAddedModifiers = false; for (String modifierType : modifiers) { diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy index 29a094846d2b..ef233c91590e 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/completion/GroovyCompletionTest.groovy @@ -657,4 +657,32 @@ return foo()""" checkCompletion "assex", ' ', 'assert x' } + public void testDontShowAccessors() { + assertNull doContainsTest("getFoo", """ +class MyClass { + def foo +} + +def a = new MyClass() +a.""") + } + + private doContainsTest(String itemToCheck, String text) { + myFixture.configureByText "a.groovy", text + + final LookupElement[] completion = myFixture.completeBasic() + return completion.find {println it.lookupString;itemToCheck == it.lookupString} + } + + + public void testShowAccessor() { + assertNotNull doContainsTest("getFoo", """ +class MyClass { + def foo +} + +def a = new MyClass() +a.g +""") + } } \ No newline at end of file diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/StatementsParsingTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/StatementsParsingTest.groovy index 2d4f42bb7635..3e3154d4ebff 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/StatementsParsingTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/parser/StatementsParsingTest.groovy @@ -112,6 +112,7 @@ public class StatementsParsingTest extends GroovyParsingTestCase { public void testSwitch$swit5() throws Throwable { doTest(); } public void testSwitch$swit6() throws Throwable { doTest(); } public void testSwitch$swit7() throws Throwable { doTest(); } + public void testSwitch$swit8() throws Throwable { doTest(); } public void testSyn$syn1() throws Throwable { doTest(); } public void testTop_methods$method1() throws Throwable { doTest(); } public void testTop_methods$method2() throws Throwable { doTest(); } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolvePropertyTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolvePropertyTest.groovy index 26c9eb996910..44146920115f 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolvePropertyTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/resolve/ResolvePropertyTest.groovy @@ -649,7 +649,7 @@ setFoo(2) assertTrue GroovyRefactoringUtil.isLocalVariable(resolved) } - public void testResolveForVarOutsideOfFor() { + public void _testResolveForVarOutsideOfFor() { final PsiElement resolved = resolve("A.groovy") assertInstanceOf resolved, GrParameter } diff --git a/plugins/groovy/testdata/parsing/groovy/statements/switch/swit5.test b/plugins/groovy/testdata/parsing/groovy/statements/switch/swit5.test index caa27773e6a6..fbbcd424a617 100644 --- a/plugins/groovy/testdata/parsing/groovy/statements/switch/swit5.test +++ b/plugins/groovy/testdata/parsing/groovy/statements/switch/swit5.test @@ -18,16 +18,15 @@ Groovy script Case label PsiElement(case)('case') PsiWhiteSpace(' ') - Call expression - Literal - PsiElement(Integer)('1') - PsiWhiteSpace(' ') - Command arguments - Reference expression - PsiElement(identifier)('expr1') + Literal + PsiElement(Integer)('1') PsiErrorElement:':' expected - PsiElement(new line)('\n') + PsiWhiteSpace(' ') + Reference expression + PsiElement(identifier)('expr1') + PsiElement(new line)('\n') + Case section Case label PsiElement(default)('default') PsiElement(:)(':') @@ -40,4 +39,4 @@ Groovy script Literal PsiElement(string)(''abc'') PsiElement(new line)('\n') - PsiElement(})('}') + PsiElement(})('}') \ No newline at end of file diff --git a/plugins/groovy/testdata/parsing/groovy/statements/switch/swit8.test b/plugins/groovy/testdata/parsing/groovy/statements/switch/swit8.test new file mode 100644 index 000000000000..df18edc62102 --- /dev/null +++ b/plugins/groovy/testdata/parsing/groovy/statements/switch/swit8.test @@ -0,0 +1,33 @@ +switch (a) { + case: + print a; +} +----- +Groovy script + Switch statement + PsiElement(switch)('switch') + PsiWhiteSpace(' ') + PsiElement(()('(') + Reference expression + PsiElement(identifier)('a') + PsiElement())(')') + PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n ') + Case section + Case label + PsiElement(case)('case') + PsiErrorElement:Expression expected + + PsiElement(:)(':') + PsiElement(new line)('\n ') + Call expression + Reference expression + PsiElement(identifier)('print') + PsiWhiteSpace(' ') + Command arguments + Reference expression + PsiElement(identifier)('a') + PsiElement(;)(';') + PsiElement(new line)('\n') + PsiElement(})('}') \ No newline at end of file diff --git a/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/while1.groovy b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/while1.groovy new file mode 100644 index 000000000000..be9f67913ed1 --- /dev/null +++ b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/while1.groovy @@ -0,0 +1,2 @@ +def a = 5; +while (a < 20) a-- diff --git a/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/while1.java b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/while1.java new file mode 100644 index 000000000000..cae661e2816f --- /dev/null +++ b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/while1.java @@ -0,0 +1,2 @@ +int a = 5; +while (a < 20) a--; \ No newline at end of file diff --git a/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/while2.groovy b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/while2.groovy new file mode 100644 index 000000000000..860ebeac05b3 --- /dev/null +++ b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/while2.groovy @@ -0,0 +1,2 @@ +def a = 5; +while (![1, 2, 3, 4].find {a > it}) a-- \ No newline at end of file diff --git a/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/while2.java b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/while2.java new file mode 100644 index 000000000000..068c3cc6ae1d --- /dev/null +++ b/plugins/groovy/testdata/refactoring/convertGroovyToJava/codeBlock/while2.java @@ -0,0 +1,11 @@ +int i = 5; +java.util.List list = new java.util.ArrayList(4); +list.add(1); +list.add(2); +list.add(3); +list.add(4); +while (!org.codehaus.groovy.runtime.DefaultGroovyMethods.find(list, new groovy.lang.Closure(this, this) { + boolean doCall(java.lang.Integer it) { + return a.equals(it); + } +})) a--; diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/execution/HgCommandExecutor.java b/plugins/hg4idea/src/org/zmlx/hg4idea/execution/HgCommandExecutor.java index 0c608f735cc6..385e390e8b77 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/execution/HgCommandExecutor.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/execution/HgCommandExecutor.java @@ -134,6 +134,9 @@ public final class HgCommandExecutor { } catch (IOException e) { showError(e); LOG.info("IOException during preparing command", e); + promptServer.stop(); + warningServer.stop(); + passServer.stop(); return null; } cmdLine.addAll(myOptions); diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/execution/ShellCommand.java b/plugins/hg4idea/src/org/zmlx/hg4idea/execution/ShellCommand.java index 592b2b270247..f89df8c18043 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/execution/ShellCommand.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/execution/ShellCommand.java @@ -12,6 +12,8 @@ // limitations under the License. package org.zmlx.hg4idea.execution; +import com.intellij.execution.process.CapturingProcessHandler; +import com.intellij.execution.process.ProcessOutput; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.text.StringUtil; @@ -56,48 +58,19 @@ public final class ShellCommand { processBuilder = processBuilder.directory(new File(dir)); } Process process = processBuilder.start(); - Thread outReaderThread = startReader( - new InputStreamReader(process.getInputStream(), charset), out - ); - Thread errReaderThread = startReader( - new InputStreamReader(process.getErrorStream()), err - ); - process.waitFor(); - int exitValue = process.exitValue(); - outReaderThread.join(); - errReaderThread.join(); + + CapturingProcessHandler processHandler = new CapturingProcessHandler(process); + final ProcessOutput processOutput = processHandler.runProcess(); + + int exitValue = processOutput.getExitCode(); + out.write(processOutput.getStdout()); + err.write(processOutput.getStderr()); return new HgCommandResult(out, err, exitValue ); } catch (IOException e) { throw new ShellCommandException(e); } } - private Thread startReader(final InputStreamReader in, final Writer writer) { - Thread readingThread = new Thread(new Runnable() { - public void run() { - char[] buffer = new char[BUFFER_SIZE]; - int count; - try { - while ((count = in.read(buffer)) > 0) { - writer.write(buffer, 0, count); - } - writer.flush(); - } catch (IOException e) { - LOG.info(e.getMessage()); - } finally { - try { - in.close(); - } - catch (IOException e) { - // ignore - } - } - } - }); - readingThread.start(); - return readingThread; - } - /** * Escapes charactes in the command which will be executed via 'bash -c' - these are standard chars like \n, and some bash specials. * @param source Original string. diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/execution/SocketServer.java b/plugins/hg4idea/src/org/zmlx/hg4idea/execution/SocketServer.java index 9bc32a79315b..2e2df465ec7c 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/execution/SocketServer.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/execution/SocketServer.java @@ -12,64 +12,67 @@ // limitations under the License. package org.zmlx.hg4idea.execution; +import com.intellij.openapi.application.ApplicationManager; + import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketException; +import java.util.concurrent.Future; /** * Common server class that contains the boiler-plate code to set up a server socket. * The actual logic is delegated to the Protocol instance. */ public class SocketServer { - protected Thread serverThread; - protected ServerSocket serverSocket; - private final Protocol protocol; + protected ServerSocket myServerSocket; + private final Protocol myProtocol; + private Future myExecutingFuture; public SocketServer(Protocol protocol) { - this.protocol = protocol; + myProtocol = protocol; } public int start() throws IOException { - serverSocket = new ServerSocket(0); - int port = serverSocket.getLocalPort(); + myServerSocket = new ServerSocket(0); + int port = myServerSocket.getLocalPort(); - serverThread = new Thread("hg4idea prompt server") { + myExecutingFuture = ApplicationManager.getApplication().executeOnPooledThread(new Runnable() { @Override public void run() { try { boolean _continue = true; while (_continue) { - Socket socket = serverSocket.accept(); + Socket socket = myServerSocket.accept(); try { - _continue = protocol.handleConnection(socket); + _continue = myProtocol.handleConnection(socket); } finally { socket.close(); } } - } catch (SocketException e) { + } + catch (SocketException e) { //socket was closed, that's OK - } catch (IOException e) { + } + catch (IOException e) { throw new RuntimeException(e); //TODO implement catch clause } } - }; - serverThread.start(); + }); return port; } public void stop() { - serverThread.interrupt(); + myExecutingFuture.cancel(true); try { - serverSocket.close(); + myServerSocket.close(); } catch (IOException e) { throw new RuntimeException(e); //TODO implement catch clause } - } public static abstract class Protocol { diff --git a/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgHistoryProvider.java b/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgHistoryProvider.java index 7a706efad127..a6690f64f6de 100644 --- a/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgHistoryProvider.java +++ b/plugins/hg4idea/src/org/zmlx/hg4idea/provider/HgHistoryProvider.java @@ -66,7 +66,7 @@ public class HgHistoryProvider implements VcsHistoryProvider { } final List revisions = new ArrayList(); revisions.addAll(getHistory(filePath, vcsRoot, myProject, DEFAULT_LIMIT)); - return createAppendableSession(vcsRoot, revisions); + return createAppendableSession(vcsRoot, revisions, null); } public void reportAppendableHistory(FilePath filePath, final VcsAppendableHistorySessionPartner partner) throws VcsException { @@ -75,7 +75,7 @@ public class HgHistoryProvider implements VcsHistoryProvider { final List history = getHistory(filePath, vcsRoot, myProject, DEFAULT_LIMIT); if (history.size() == 0) return; - final VcsAbstractHistorySession emptySession = createAppendableSession(vcsRoot, Collections.emptyList()); + final VcsAbstractHistorySession emptySession = createAppendableSession(vcsRoot, Collections.emptyList(), null); partner.reportCreatedEmptySession(emptySession); for (HgFileRevision hgFileRevision : history) { @@ -84,8 +84,8 @@ public class HgHistoryProvider implements VcsHistoryProvider { partner.finished(); } - private VcsAbstractHistorySession createAppendableSession(final VirtualFile vcsRoot, List revisions) { - return new VcsAbstractHistorySession(revisions) { + private VcsAbstractHistorySession createAppendableSession(final VirtualFile vcsRoot, List revisions, @Nullable VcsRevisionNumber number) { + return new VcsAbstractHistorySession(revisions, number) { @Nullable protected VcsRevisionNumber calcCurrentRevisionNumber() { return new HgWorkingCopyRevisionsCommand(myProject).firstParent(vcsRoot); @@ -97,7 +97,7 @@ public class HgHistoryProvider implements VcsHistoryProvider { @Override public VcsHistorySession copy() { - return createAppendableSession(vcsRoot, getRevisionList()); + return createAppendableSession(vcsRoot, getRevisionList(), getCurrentRevisionNumber()); } }; } diff --git a/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java b/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java index 6689822ff7a1..60d8004c9ac0 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java +++ b/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java @@ -96,7 +96,8 @@ public class JUnitConfigurable extends SettingsEditor { private JComboBox myForkCb; @NonNls private static final String NONE = "none"; @NonNls private static final String METHOD = "method"; - private static final String[] FORK_MODE_ALL = {NONE, METHOD, "class"}; + @NonNls private static final String KLASS = "class"; + private static final String[] FORK_MODE_ALL = {NONE, METHOD, KLASS}; private static final String[] FORK_MODE = {NONE, METHOD}; public JUnitConfigurable(final Project project) { @@ -203,6 +204,10 @@ public class JUnitConfigurable extends SettingsEditor { } private void changePanel () { + String selectedItem = (String)myForkCb.getSelectedItem(); + if (selectedItem == null) { + selectedItem = NONE; + } if (myAllInPackageButton.isSelected()) { myPackagePanel.setVisible(true); myPattern.setVisible(false); @@ -210,7 +215,7 @@ public class JUnitConfigurable extends SettingsEditor { myMethod.setVisible(false); myForkCb.setEnabled(true); myForkCb.setModel(new DefaultComboBoxModel(FORK_MODE_ALL)); - myForkCb.setSelectedItem(NONE); + myForkCb.setSelectedItem(selectedItem); } else if (myClassButton.isSelected()){ myPackagePanel.setVisible(false); @@ -219,7 +224,7 @@ public class JUnitConfigurable extends SettingsEditor { myMethod.setVisible(false); myForkCb.setEnabled(true); myForkCb.setModel(new DefaultComboBoxModel(FORK_MODE)); - myForkCb.setSelectedItem(NONE); + myForkCb.setSelectedItem(selectedItem != KLASS ? selectedItem : METHOD); } else if (myTestMethodButton.isSelected()){ myPackagePanel.setVisible(false); @@ -235,7 +240,7 @@ public class JUnitConfigurable extends SettingsEditor { myMethod.setVisible(false); myForkCb.setEnabled(true); myForkCb.setModel(new DefaultComboBoxModel(FORK_MODE_ALL)); - myForkCb.setSelectedItem(NONE); + myForkCb.setSelectedItem(selectedItem); } } diff --git a/xml/dom-openapi/src/com/intellij/util/xml/converters/values/NumberValueConverter.java b/xml/dom-openapi/src/com/intellij/util/xml/converters/values/NumberValueConverter.java index 7445d9a1559b..7aa3b9d33aef 100644 --- a/xml/dom-openapi/src/com/intellij/util/xml/converters/values/NumberValueConverter.java +++ b/xml/dom-openapi/src/com/intellij/util/xml/converters/values/NumberValueConverter.java @@ -19,14 +19,17 @@ package com.intellij.util.xml.converters.values; import com.intellij.util.xml.ConvertContext; import com.intellij.util.xml.Converter; import com.intellij.util.xml.DomBundle; +import com.intellij.util.xml.ResolvingConverter; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.math.BigDecimal; import java.math.BigInteger; +import java.util.Collection; +import java.util.Collections; -public class NumberValueConverter extends Converter { +public class NumberValueConverter extends ResolvingConverter { private final Class myNumberClass; private final boolean myAllowEmpty; @@ -57,6 +60,12 @@ public class NumberValueConverter extends Converter { DomBundle.message("value.converter.format.exception", s, myNumberClass.getName()); } + @NotNull + @Override + public Collection getVariants(ConvertContext context) { + return Collections.emptySet(); + } + @Nullable public static Number parseNumber(@NotNull String text, @NotNull Class targetClass) { try {