diff --git a/pom.xml b/pom.xml index f956370..3f26866 100644 --- a/pom.xml +++ b/pom.xml @@ -109,7 +109,7 @@ netbeans NetBeans - http://netbeans.apidesign.org/maven2/ + https://netbeans.apidesign.org/maven2/ @@ -152,6 +152,11 @@ org-openide-util-lookup RELEASE82 + + org.netbeans.api + org-openide-windows + RELEASE82 + org.netbeans.api org-openide-modules diff --git a/src/main/java/org/chrisle/netbeans/plugins/nbscratchfile/CreateScratchFile.java b/src/main/java/org/chrisle/netbeans/plugins/nbscratchfile/CreateScratchFile.java index b31e074..29af9e1 100644 --- a/src/main/java/org/chrisle/netbeans/plugins/nbscratchfile/CreateScratchFile.java +++ b/src/main/java/org/chrisle/netbeans/plugins/nbscratchfile/CreateScratchFile.java @@ -17,13 +17,13 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import javax.swing.JFrame; import org.chrisle.netbeans.plugins.nbscratchfile.ui.FilterableFileTypeDialog; import org.openide.awt.ActionID; import org.openide.awt.ActionReference; import org.openide.awt.ActionReferences; import org.openide.awt.ActionRegistration; import org.openide.util.NbBundle.Messages; +import org.openide.windows.WindowManager; /** * @@ -43,10 +43,14 @@ }) @Messages("CTL_CreateScratchFile=New Scratch File...") public final class CreateScratchFile implements ActionListener { - private final FilterableFileTypeDialog _dialog = new FilterableFileTypeDialog(new JFrame(), false); + private FilterableFileTypeDialog dialog; @Override public void actionPerformed(ActionEvent e) { - _dialog.showDialog(); + if (dialog == null) { + dialog = new FilterableFileTypeDialog(WindowManager.getDefault().getMainWindow(), false); + } + + dialog.showDialog(); } } diff --git a/src/main/java/org/chrisle/netbeans/plugins/nbscratchfile/ui/FilterableFileTypeDialog.java b/src/main/java/org/chrisle/netbeans/plugins/nbscratchfile/ui/FilterableFileTypeDialog.java index cd339d9..3df397f 100644 --- a/src/main/java/org/chrisle/netbeans/plugins/nbscratchfile/ui/FilterableFileTypeDialog.java +++ b/src/main/java/org/chrisle/netbeans/plugins/nbscratchfile/ui/FilterableFileTypeDialog.java @@ -17,6 +17,7 @@ import java.awt.Color; import java.awt.Component; +import java.awt.EventQueue; import java.awt.Frame; import java.awt.KeyboardFocusManager; import java.awt.event.ActionEvent; @@ -125,13 +126,12 @@ public void keyReleased(KeyEvent e) { super.addWindowFocusListener(new WindowFocusListener() { @Override public void windowGainedFocus(WindowEvent e) { - searchField.setFocusable(true); + searchField.requestFocusInWindow(); } @Override public void windowLostFocus(WindowEvent e) { - FilterableFileTypeDialog.this.setVisible(false); - searchField.setText(""); + EventQueue.invokeLater(FilterableFileTypeDialog.this::closeIfFocusRemainsLost); } }); @@ -156,6 +156,15 @@ public void showDialog() { super.setVisible(true); } + private void closeIfFocusRemainsLost() { + KeyboardFocusManager focusManager = KeyboardFocusManager.getCurrentKeyboardFocusManager(); + + if (isVisible() && !isFocused() && focusManager.getActiveWindow() != this) { + super.setVisible(false); + searchField.setText(""); + } + } + private static boolean languagesFilter(LanguageType lang, String str) { return lang.LanguageName().toLowerCase().contains(str.toLowerCase()); }