quickfix for typos in form files (IDEA-65713)

This commit is contained in:
Dmitry Jemerov
2011-10-13 12:33:04 +02:00
parent 2514847a09
commit 926a86a2e4
5 changed files with 103 additions and 19 deletions
@@ -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);
}
}
@@ -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);
}
}
@@ -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<String> 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<String>(editor, "Change to...", component) {
@Override
public void run() {
ListPopup popup = JBPopupFactory.getInstance().createListPopup(getPopupStep());
popup.showUnderneathOf(component.getDelegee());
}
@Override
public ListPopupStep<String> getPopupStep() {
return new BaseListPopupStep<String>("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);
}
}
});
@@ -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<T> extends QuickFix {
public PopupQuickFix(@NotNull final GuiEditor editor, @NotNull final String name, @Nullable RadComponent component) {
super(editor, name, component);
}
public abstract PopupStep<T> getPopupStep();
}
@@ -272,6 +272,9 @@ public abstract class QuickFixManager <T extends JComponent>{
}
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 <T extends JComponent>{
});
}
if (selectedValue.first.getInspectionId() != null && selectedValue.second.getComponent() != null &&
!(selectedValue.second instanceof SuppressFix)) {
!(selectedValue.second instanceof SuppressFix)) {
ArrayList<ErrorWithFix> suppressList = new ArrayList<ErrorWithFix>();
buildSuppressFixes(selectedValue.first, suppressList, false);
return new QuickFixPopupStep(suppressList, false);
@@ -293,8 +296,8 @@ public abstract class QuickFixManager <T extends JComponent>{
}
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() {