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 @@
- + - + @@ -28,7 +28,7 @@ - + @@ -42,6 +42,14 @@ + + + + + + + + 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) {