void (Module module, final IComponent component, final IProperty prop, final StringDescriptor descriptor, final FormErrorCollector collector) { final String value = descriptor.getResolvedValue(); if (value == null) { return; } final SpellCheckerManager manager = SpellCheckerManager.getInstance(module.getProject()); PlainTextSplitter.getInstance().split(value, TextRange.allOf(value), textRange -> { final String word = textRange.substring(value); if (manager.hasProblem(word)) { final List<String> suggestions = manager.getSuggestions(word); if (!suggestions.isEmpty() && prop instanceof IntroStringProperty) { EditorQuickFixProvider changeToProvider = (editor, component1) -> new PopupQuickFix<String>(editor, UIDesignerBundle.message("inspection.editor.quick.fix.name"), component1) { @Override public void run() { ListPopup popup = JBPopupFactory.getInstance().createListPopup(getPopupStep()); popup.showUnderneathOf(component1.getDelegee()); } @Override public ListPopupStep<String> getPopupStep() { return new BaseListPopupStep<>(UIDesignerBundle.message("popup.title.select.replacement"), suggestions) { @Override public PopupStep onChosen(String selectedValue, boolean finalChoice) { FormInspectionUtil.updateStringPropertyValue(editor, component1, (IntroStringProperty)prop, descriptor, selectedValue); return FINAL_CHOICE; } }; } }; EditorQuickFixProvider acceptProvider = (editor, component1) -> new QuickFix(editor, UIDesignerBundle.message("intention.name.save.to.dictionary", word), component1) { @Override public void run() { manager.acceptWordAsCorrect(word, editor.getProject()); } }; collector.addError(getID(), component, prop, UIDesignerBundle.message("inspection.message.typo.in.word", word), changeToProvider, acceptProvider); } else { collector.addError(getID(), component, prop, UIDesignerBundle.message("inspection.message.typo.in.word", word)); } } }); }