diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/inspections/AssignMnemonicFix.java b/plugins/ui-designer/src/com/intellij/uiDesigner/inspections/AssignMnemonicFix.java index 5199f93a0c2e..8c8480115a68 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/inspections/AssignMnemonicFix.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/inspections/AssignMnemonicFix.java @@ -25,7 +25,6 @@ import com.intellij.uiDesigner.designSurface.GuiEditor; import com.intellij.uiDesigner.lw.IComponent; import com.intellij.uiDesigner.lw.IProperty; import com.intellij.uiDesigner.lw.StringDescriptor; -import com.intellij.uiDesigner.propertyInspector.editors.string.StringEditorDialog; import com.intellij.uiDesigner.propertyInspector.properties.IntroStringProperty; import com.intellij.uiDesigner.quickFixes.QuickFix; import com.intellij.uiDesigner.radComponents.RadComponent; @@ -54,19 +53,7 @@ public class AssignMnemonicFix extends QuickFix { if (!myEditor.ensureEditable()) { return; } - IntroStringProperty prop = (IntroStringProperty) textProperty; - if (descriptor.getBundleName() == null) { - prop.setValueEx(myComponent, StringDescriptor.create(result)); - } - else { - final String newKeyName = StringEditorDialog.saveModifiedPropertyValue(myEditor.getModule(), descriptor, - myEditor.getStringDescriptorLocale(), result, - myEditor.getPsiFile()); - if (newKeyName != null) { - prop.setValueEx(myComponent, new StringDescriptor(descriptor.getBundleName(), newKeyName)); - } - } - myEditor.refreshAndSave(false); + FormInspectionUtil.updateStringPropertyValue(myEditor, myComponent, (IntroStringProperty)textProperty, descriptor, result); } } diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/inspections/FormInspectionUtil.java b/plugins/ui-designer/src/com/intellij/uiDesigner/inspections/FormInspectionUtil.java index 213a66bea6be..714424870c96 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/inspections/FormInspectionUtil.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/inspections/FormInspectionUtil.java @@ -23,9 +23,12 @@ import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.InheritanceUtil; import com.intellij.uiDesigner.StringDescriptorManager; import com.intellij.uiDesigner.SwingProperties; +import com.intellij.uiDesigner.designSurface.GuiEditor; import com.intellij.uiDesigner.lw.IComponent; import com.intellij.uiDesigner.lw.IProperty; import com.intellij.uiDesigner.lw.StringDescriptor; +import com.intellij.uiDesigner.propertyInspector.editors.string.StringEditorDialog; +import com.intellij.uiDesigner.propertyInspector.properties.IntroStringProperty; import com.intellij.uiDesigner.radComponents.RadComponent; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -83,4 +86,23 @@ public class FormInspectionUtil { } return null; } + + public static void updateStringPropertyValue(GuiEditor editor, + RadComponent component, + IntroStringProperty prop, + StringDescriptor descriptor, + String result) { + if (descriptor.getBundleName() == null) { + prop.setValueEx(component, StringDescriptor.create(result)); + } + else { + final String newKeyName = StringEditorDialog.saveModifiedPropertyValue(editor.getModule(), descriptor, + editor.getStringDescriptorLocale(), result, + editor.getPsiFile()); + if (newKeyName != null) { + prop.setValueEx(component, new StringDescriptor(descriptor.getBundleName(), newKeyName)); + } + } + editor.refreshAndSave(false); + } } diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/inspections/FormSpellCheckingInspection.java b/plugins/ui-designer/src/com/intellij/uiDesigner/inspections/FormSpellCheckingInspection.java index 011634a59876..571d0ea91cb8 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/inspections/FormSpellCheckingInspection.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/inspections/FormSpellCheckingInspection.java @@ -16,14 +16,26 @@ package com.intellij.uiDesigner.inspections; import com.intellij.openapi.module.Module; +import com.intellij.openapi.ui.popup.JBPopupFactory; +import com.intellij.openapi.ui.popup.ListPopup; +import com.intellij.openapi.ui.popup.ListPopupStep; +import com.intellij.openapi.ui.popup.PopupStep; +import com.intellij.openapi.ui.popup.util.BaseListPopupStep; import com.intellij.openapi.util.TextRange; import com.intellij.spellchecker.SpellCheckerManager; import com.intellij.spellchecker.inspections.PlainTextSplitter; +import com.intellij.uiDesigner.designSurface.GuiEditor; import com.intellij.uiDesigner.lw.IComponent; import com.intellij.uiDesigner.lw.IProperty; import com.intellij.uiDesigner.lw.StringDescriptor; +import com.intellij.uiDesigner.propertyInspector.properties.IntroStringProperty; +import com.intellij.uiDesigner.quickFixes.PopupQuickFix; +import com.intellij.uiDesigner.quickFixes.QuickFix; +import com.intellij.uiDesigner.radComponents.RadComponent; import com.intellij.util.Consumer; +import java.util.List; + /** * @author yole */ @@ -38,7 +50,7 @@ public class FormSpellCheckingInspection extends StringDescriptorInspection { protected void checkStringDescriptor(Module module, final IComponent component, final IProperty prop, - StringDescriptor descriptor, + final StringDescriptor descriptor, final FormErrorCollector collector) { final String value = descriptor.getResolvedValue(); if (value == null) { @@ -50,7 +62,34 @@ public class FormSpellCheckingInspection extends StringDescriptorInspection { public void consume(TextRange textRange) { String word = textRange.substring(value); if (manager.hasProblem(word)) { - collector.addError(getID(), component, prop, "Typo in word '" + word + "'", null); + final List suggestions = manager.getSuggestions(value); + EditorQuickFixProvider quickFixProvider = null; + if (suggestions.size() > 0 && prop instanceof IntroStringProperty) { + quickFixProvider = new EditorQuickFixProvider() { + @Override + public QuickFix createQuickFix(final GuiEditor editor, final RadComponent component) { + return new PopupQuickFix(editor, "Change to...", component) { + @Override + public void run() { + ListPopup popup = JBPopupFactory.getInstance().createListPopup(getPopupStep()); + popup.showUnderneathOf(component.getDelegee()); + } + + @Override + public ListPopupStep getPopupStep() { + return new BaseListPopupStep("Select Replacement", suggestions) { + @Override + public PopupStep onChosen(String selectedValue, boolean finalChoice) { + FormInspectionUtil.updateStringPropertyValue(editor, component, (IntroStringProperty) prop, descriptor, selectedValue); + return FINAL_CHOICE; + } + }; + } + }; + } + }; + } + collector.addError(getID(), component, prop, "Typo in word '" + word + "'", quickFixProvider); } } }); diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/quickFixes/PopupQuickFix.java b/plugins/ui-designer/src/com/intellij/uiDesigner/quickFixes/PopupQuickFix.java new file mode 100644 index 000000000000..ba1c56b1cf2d --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/quickFixes/PopupQuickFix.java @@ -0,0 +1,33 @@ +/* + * 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.uiDesigner.quickFixes; + +import com.intellij.openapi.ui.popup.PopupStep; +import com.intellij.uiDesigner.designSurface.GuiEditor; +import com.intellij.uiDesigner.radComponents.RadComponent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author yole + */ +public abstract class PopupQuickFix extends QuickFix { + public PopupQuickFix(@NotNull final GuiEditor editor, @NotNull final String name, @Nullable RadComponent component) { + super(editor, name, component); + } + + public abstract PopupStep getPopupStep(); +} diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/quickFixes/QuickFixManager.java b/plugins/ui-designer/src/com/intellij/uiDesigner/quickFixes/QuickFixManager.java index 3f26f67d58f3..4d504122abaa 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/quickFixes/QuickFixManager.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/quickFixes/QuickFixManager.java @@ -272,6 +272,9 @@ public abstract class QuickFixManager { } public PopupStep onChosen(final ErrorWithFix selectedValue, final boolean finalChoice) { + if (selectedValue.second instanceof PopupQuickFix) { + return ((PopupQuickFix) selectedValue.second).getPopupStep(); + } if (finalChoice || !myShowSuppresses) { return doFinalStep(new Runnable() { public void run() { @@ -284,7 +287,7 @@ public abstract class QuickFixManager { }); } if (selectedValue.first.getInspectionId() != null && selectedValue.second.getComponent() != null && - !(selectedValue.second instanceof SuppressFix)) { + !(selectedValue.second instanceof SuppressFix)) { ArrayList suppressList = new ArrayList(); buildSuppressFixes(selectedValue.first, suppressList, false); return new QuickFixPopupStep(suppressList, false); @@ -293,8 +296,8 @@ public abstract class QuickFixManager { } public boolean hasSubstep(final ErrorWithFix selectedValue) { - return myShowSuppresses && selectedValue.first.getInspectionId() != null && selectedValue.second.getComponent() != null && - !(selectedValue.second instanceof SuppressFix); + return (myShowSuppresses && selectedValue.first.getInspectionId() != null && selectedValue.second.getComponent() != null && + !(selectedValue.second instanceof SuppressFix)) || selectedValue.second instanceof PopupQuickFix; } @Override public boolean isAutoSelectionEnabled() {