diff --git a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java
index 93b66cc8de45..409391093572 100644
--- a/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java
+++ b/java/java-impl/src/com/intellij/psi/impl/source/codeStyle/JavaCodeStyleManagerImpl.java
@@ -680,7 +680,10 @@ public class JavaCodeStyleManagerImpl extends JavaCodeStyleManager {
}
if (method != null) {
- method = (PsiMethod)method.getNavigationElement();
+ final PsiElement navElement = method.getNavigationElement();
+ if (navElement instanceof PsiMethod) {
+ method = (PsiMethod)navElement;
+ }
PsiExpression[] expressions = list.getExpressions();
int index = -1;
for (int i = 0; i < expressions.length; i++) {
diff --git a/platform/icons/src/ide/upDown.png b/platform/icons/src/ide/upDown.png
new file mode 100644
index 000000000000..7ad17b8b9af1
Binary files /dev/null and b/platform/icons/src/ide/upDown.png differ
diff --git a/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateDialog.form b/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateDialog.form
index a76fc2cd1564..ea5041d0e3e2 100644
--- a/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateDialog.form
+++ b/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateDialog.form
@@ -1,9 +1,9 @@
diff --git a/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateDialog.java b/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateDialog.java
index e2751a8f25c4..74362b084edc 100644
--- a/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateDialog.java
+++ b/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateDialog.java
@@ -16,19 +16,26 @@
package com.intellij.ide.actions;
+import com.intellij.ide.ui.UISettings;
+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.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.Trinity;
import com.intellij.psi.PsiElement;
-import com.intellij.util.IncorrectOperationException;
import com.intellij.ui.ComboboxSpeedSearch;
+import com.intellij.util.Icons;
+import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.*;
import java.awt.*;
+import java.awt.event.KeyEvent;
/**
* @author peter
@@ -38,6 +45,7 @@ public class CreateFileFromTemplateDialog extends DialogWrapper {
private JTextField myNameField;
private JComboBox myKindCombo;
private JPanel myPanel;
+ private JLabel myUpDownHint;
private ElementCreator myCreator;
@@ -69,6 +77,30 @@ public class CreateFileFromTemplateDialog extends DialogWrapper {
}
};
+ 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;
+
+ final int size = myKindCombo.getModel().getSize();
+ int next = myKindCombo.getSelectedIndex() + delta;
+ if (next < 0 || next >= size) {
+ if (!UISettings.getInstance().CYCLE_SCROLLING) {
+ return;
+ }
+ next = (next + size) % size;
+ }
+ myKindCombo.setSelectedIndex(next);
+ }
+ }
+ };
+ final KeyboardShortcut up = new KeyboardShortcut(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), null);
+ final KeyboardShortcut down = new KeyboardShortcut(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), null);
+ arrow.registerCustomShortcutSet(new CustomShortcutSet(up, down), myNameField);
+
+ myUpDownHint.setIcon(Icons.UP_DOWN_ARROWS);
init();
}
diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java
index 46a6d1938e52..07d3a4f4baf8 100644
--- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java
+++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java
@@ -780,8 +780,14 @@ public class AbstractTreeUi {
}
private boolean _update(NodeDescriptor nodeDescriptor) {
- nodeDescriptor.setUpdateCount(nodeDescriptor.getUpdateCount() + 1);
- return getBuilder().updateNodeDescriptor(nodeDescriptor);
+ try {
+ nodeDescriptor.setUpdateCount(nodeDescriptor.getUpdateCount() + 1);
+ return getBuilder().updateNodeDescriptor(nodeDescriptor);
+ }
+ catch (IndexNotReadyException e) {
+ warnOnIndexNotReady();
+ return false;
+ }
}
private void assertIsDispatchThread() {
@@ -1283,10 +1289,7 @@ public class AbstractTreeUi {
passOne = getTreeStructure().getChildElements(element);
}
catch (IndexNotReadyException e) {
- if (!myWasEverIndexNotReady) {
- myWasEverIndexNotReady = true;
- LOG.warn("Tree is not dumb-mode-aware; treeBuilder=" + getBuilder() + " treeStructure=" + getTreeStructure());
- }
+ warnOnIndexNotReady();
return ArrayUtil.EMPTY_OBJECT_ARRAY;
}
@@ -1315,6 +1318,13 @@ public class AbstractTreeUi {
return passOne;
}
+ private void warnOnIndexNotReady() {
+ if (!myWasEverIndexNotReady) {
+ myWasEverIndexNotReady = true;
+ LOG.warn("Tree is not dumb-mode-aware; treeBuilder=" + getBuilder() + " treeStructure=" + getTreeStructure());
+ }
+ }
+
private void updateNodesToInsert(final ArrayList nodesToInsert,
TreeUpdatePass pass,
boolean canSmartExpand,
diff --git a/platform/platform-api/src/com/intellij/util/Icons.java b/platform/platform-api/src/com/intellij/util/Icons.java
index 2fcee910bf7c..2efee2fc533b 100644
--- a/platform/platform-api/src/com/intellij/util/Icons.java
+++ b/platform/platform-api/src/com/intellij/util/Icons.java
@@ -124,4 +124,6 @@ public abstract class Icons {
public static final Icon CONTENT_ROOT_ICON_OPEN = IconLoader.getIcon("/nodes/ModuleOpen.png");
public static final Icon CONTENT_ROOT_ICON_CLOSED = IconLoader.getIcon("/nodes/ModuleClosed.png");
+
+ public static final Icon UP_DOWN_ARROWS = IconLoader.getIcon("/ide/upDown.png");
}
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/dynamic/elements/DPropertyElement.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/dynamic/elements/DPropertyElement.java
index f4016bba1968..cccb839152cf 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/dynamic/elements/DPropertyElement.java
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/annotator/intentions/dynamic/elements/DPropertyElement.java
@@ -15,10 +15,7 @@
*/
package org.jetbrains.plugins.groovy.annotator.intentions.dynamic.elements;
-import com.intellij.psi.PsiElement;
-import com.intellij.psi.PsiManager;
-import com.intellij.psi.PsiModifier;
-import com.intellij.psi.PsiVariable;
+import com.intellij.psi.*;
import com.intellij.util.IncorrectOperationException;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.annotator.intentions.dynamic.DynamicManager;
@@ -57,7 +54,11 @@ public class DPropertyElement extends DItemElement {
if (isStatic != null && isStatic.booleanValue()) {
hashSet.add(PsiModifier.STATIC);
}
- myPsi = new GrDynamicImplicitProperty(manager, getName(), getType(), containingClassName, new LightModifierList(manager, hashSet), null) {
+ String type = getType();
+ if (type == null) {
+ type = CommonClassNames.JAVA_LANG_OBJECT;
+ }
+ myPsi = new GrDynamicImplicitProperty(manager, getName(), type, containingClassName, new LightModifierList(manager, hashSet), null) {
@Override
public PsiElement setName(@NotNull String name) throws IncorrectOperationException {
DynamicManager.getInstance(getProject()).replaceDynamicPropertyName(containingClassName, getName(), name);
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrDynamicImplicitProperty.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrDynamicImplicitProperty.java
index 481fea866cd8..0cc09c7d6f7e 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrDynamicImplicitProperty.java
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrDynamicImplicitProperty.java
@@ -49,7 +49,7 @@ public class GrDynamicImplicitProperty extends GrImplicitVariableImpl implements
private final Project myProject;
private final PsiElement myNavigationalElement;
- public GrDynamicImplicitProperty(PsiManager manager, @NonNls String name, @NonNls String type, String containingClassName,
+ public GrDynamicImplicitProperty(PsiManager manager, @NonNls String name, @NonNls @NotNull String type, String containingClassName,
LightModifierList modifierList, PsiElement navigationalElement) {
super(modifierList, manager, name, type, navigationalElement);
myContainingClassName = containingClassName;
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrImplicitVariableImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrImplicitVariableImpl.java
index b11ef8129d86..0d711532a21e 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrImplicitVariableImpl.java
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/synthetic/GrImplicitVariableImpl.java
@@ -23,7 +23,7 @@ public class GrImplicitVariableImpl extends LightVariableBase implements GrImpli
myInnerModifierList = modifierList != null ? modifierList : myModifierList;
}
- public GrImplicitVariableImpl(PsiModifierList modifierList, PsiManager manager, @NonNls String name, @NonNls String type, PsiElement referenceExpression) {
+ public GrImplicitVariableImpl(PsiModifierList modifierList, PsiManager manager, @NonNls String name, @NonNls @NotNull String type, PsiElement referenceExpression) {
this(modifierList, manager, null, JavaPsiFacade.getElementFactory(manager.getProject()).
createTypeFromText(type, referenceExpression), false, referenceExpression);
myNameIdentifier = new GrLightIdentifier(myManager, name);
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfigurationType.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfigurationType.java
index 1747038d7d00..bbbce7d9eb4b 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfigurationType.java
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfigurationType.java
@@ -22,6 +22,7 @@ import com.intellij.execution.configurations.ConfigurationTypeUtil;
import com.intellij.execution.configurations.RunConfiguration;
import com.intellij.execution.configurations.RunConfigurationModule;
import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
@@ -70,7 +71,22 @@ public class GroovyScriptRunConfigurationType implements LocatableConfigurationT
}
public boolean isConfigurationByLocation(RunConfiguration configuration, Location location) {
- return false;
+ final String path = ((GroovyScriptRunConfiguration)configuration).scriptPath;
+ if (path == null) {
+ return false;
+ }
+
+ final PsiFile file = location.getPsiElement().getContainingFile();
+ if (file == null) {
+ return false;
+ }
+
+ final VirtualFile vfile = file.getVirtualFile();
+ if (vfile == null) {
+ return false;
+ }
+
+ return FileUtil.toSystemIndependentName(path).equals(vfile.getPath());
}
private RunnerAndConfigurationSettings createConfiguration(final PsiClass aClass) {