diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java index 8d5bcd7ed219..ed9994c6017f 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/CompoundRendererConfigurable.java @@ -27,19 +27,16 @@ import com.intellij.debugger.ui.JavaDebuggerSupport; import com.intellij.debugger.ui.tree.render.*; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.UnnamedConfigurable; import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.util.Pair; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiType; +import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.ui.AnActionButton; -import com.intellij.ui.AnActionButtonRunnable; -import com.intellij.ui.TableUtil; -import com.intellij.ui.ToolbarDecorator; +import com.intellij.ui.*; import com.intellij.ui.table.JBTable; +import com.intellij.util.Function; import com.intellij.util.ui.AbstractTableCellEditor; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.Nullable; @@ -61,7 +58,7 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable { private CompoundReferenceRenderer myRenderer; private CompoundReferenceRenderer myOriginalRenderer; private Project myProject; - private TextFieldWithBrowseButton myClassNameField; + private ClassNameEditorWithBrowseButton myClassNameField; private JRadioButton myRbDefaultLabel; private JRadioButton myRbExpressionLabel; private JRadioButton myRbDefaultChildrenRenderer; @@ -133,7 +130,7 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable { myRbListChildrenRenderer.addItemListener(updateListener); myRbExpressionChildrenRenderer.addItemListener(updateListener); - myClassNameField = new TextFieldWithBrowseButton(new ActionListener() { + myClassNameField = new ClassNameEditorWithBrowseButton(new ActionListener() { public void actionPerformed(ActionEvent e) { PsiClass psiClass = DebuggerUtils.getInstance() .chooseClassDialog(DebuggerBundle.message("title.compound.renderer.configurable.choose.renderer.reference.type"), myProject); @@ -143,8 +140,8 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable { updateContext(qName); } } - }); - myClassNameField.getTextField().addFocusListener(new FocusAdapter() { + }, myProject); + myClassNameField.getEditorTextField().addFocusListener(new FocusAdapter() { public void focusLost(FocusEvent e) { final String qName = myClassNameField.getText(); updateContext(qName); @@ -515,4 +512,20 @@ public class CompoundRendererConfigurable implements UnnamedConfigurable { } } } + + private static class ClassNameEditorWithBrowseButton extends ReferenceEditorWithBrowseButton { + private ClassNameEditorWithBrowseButton(ActionListener browseActionListener, final Project project) { + super(browseActionListener, project, + new Function() { + @Override + public Document fun(String s) { + PsiPackage defaultPackage = JavaPsiFacade.getInstance(project).findPackage(""); + final JavaCodeFragment fragment = + JavaCodeFragmentFactory.getInstance(project).createReferenceCodeFragment(s, defaultPackage, true, true); + fragment.setVisibilityChecker(JavaCodeFragment.VisibilityChecker.EVERYTHING_VISIBLE); + return PsiDocumentManager.getInstance(project).getDocument(fragment); + } + }, ""); + } + } } diff --git a/platform/platform-impl/src/com/intellij/ui/EditorTextField.java b/platform/platform-impl/src/com/intellij/ui/EditorTextField.java index 7fed54da5db5..6664c2ea345a 100644 --- a/platform/platform-impl/src/com/intellij/ui/EditorTextField.java +++ b/platform/platform-impl/src/com/intellij/ui/EditorTextField.java @@ -62,7 +62,7 @@ import java.util.List; * @author max */ public class EditorTextField extends NonOpaquePanel implements DocumentListener, TextComponent, DataProvider, - DocumentBasedComponent { + DocumentBasedComponent, FocusListener { private static final Logger LOG = Logger.getInstance("#com.intellij.ui.EditorTextField"); public static final Key SUPPLEMENTARY_KEY = Key.create("Supplementary"); @@ -73,6 +73,7 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, private Component myNextFocusable = null; private boolean myWholeTextSelected = false; private final List myDocumentListeners = ContainerUtil.createLockFreeCopyOnWriteList(); + private final List myFocusListeners = ContainerUtil.createLockFreeCopyOnWriteList(); private boolean myIsListenerInstalled = false; private boolean myIsViewer; private boolean myIsSupplementary; @@ -119,7 +120,7 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, // todo[dsl,max] setFocusable(true); // dsl: this is a weird way of doing things.... - addFocusListener(new FocusListener() { + super.addFocusListener(new FocusListener() { @Override public void focusGained(FocusEvent e) { requestFocus(); @@ -321,6 +322,9 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, } remove(editor.getComponent()); + + editor.getContentComponent().removeFocusListener(this); + final Application application = ApplicationManager.getApplication(); final Runnable runnable = new Runnable() { @Override @@ -522,6 +526,7 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, editor.putUserData(SUPPLEMENTARY_KEY, myIsSupplementary); editor.getContentComponent().setFocusCycleRoot(false); + editor.getContentComponent().addFocusListener(this); editor.setPlaceholder(myHintText); @@ -746,6 +751,30 @@ public class EditorTextField extends NonOpaquePanel implements DocumentListener, return myEditor == null ? this : myEditor.getContentComponent(); } + @Override + public synchronized void addFocusListener(FocusListener l) { + myFocusListeners.add(l); + } + + @Override + public synchronized void removeFocusListener(FocusListener l) { + myFocusListeners.remove(l); + } + + @Override + public void focusGained(FocusEvent e) { + for (FocusListener listener : myFocusListeners) { + listener.focusGained(e); + } + } + + @Override + public void focusLost(FocusEvent e) { + for (FocusListener listener : myFocusListeners) { + listener.focusLost(e); + } + } + @Override public Object getData(String dataId) { if (myEditor != null && myEditor.isRendererMode()) return null;