From e9003cd7ab80b4cf704fb987641a8934ea391635 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Thu, 10 Aug 2017 12:26:20 +0200 Subject: [PATCH 1/6] Find/Replace: display on top of the related Editor If the editor is focused, acquire alwaysOnTop capabilities but drop them as soon as both the editor and the dialog are out of focus --- .../cc/arduino/view/findreplace/FindReplace.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/src/cc/arduino/view/findreplace/FindReplace.java b/app/src/cc/arduino/view/findreplace/FindReplace.java index 6af1f397bdb..d6656daf99b 100644 --- a/app/src/cc/arduino/view/findreplace/FindReplace.java +++ b/app/src/cc/arduino/view/findreplace/FindReplace.java @@ -73,10 +73,24 @@ public FindReplace(Editor editor, Map state) { Base.setIcon(this); + editor.addWindowListener(new WindowAdapter() { + public void windowActivated(WindowEvent e) { + findField.requestFocusInWindow(); + findField.selectAll(); + setAlwaysOnTop(true); + } + public void windowDeactivated(WindowEvent e) { + setAlwaysOnTop(false); + } + }); + addWindowListener(new WindowAdapter() { public void windowActivated(WindowEvent e) { findField.requestFocusInWindow(); findField.selectAll(); + setAlwaysOnTop(true); + } + public void windowDeactivated(WindowEvent e) { } }); From bd8b12abb59826dbd11d489207b8c7b659257875 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Thu, 10 Aug 2017 12:29:32 +0200 Subject: [PATCH 2/6] [EXPERIMENTAL/BROKEN] try to implement partial transparency As implemented in Notepad++, a partially transparent search/replace window could make it easier to interact with the editor (particularly in fullscreen contexts, when the "always on top" window could hide the search results). Unfortunately, Java can only apply the transparency to undecorated window, so it's a no-go. Java gurus, please come to the rescue :D --- .../arduino/view/findreplace/FindReplace.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/app/src/cc/arduino/view/findreplace/FindReplace.java b/app/src/cc/arduino/view/findreplace/FindReplace.java index d6656daf99b..bffb51b6a92 100644 --- a/app/src/cc/arduino/view/findreplace/FindReplace.java +++ b/app/src/cc/arduino/view/findreplace/FindReplace.java @@ -40,6 +40,7 @@ import java.util.HashMap; import java.util.Map; +import static java.awt.GraphicsDevice.WindowTranslucency.*; import static processing.app.I18n.tr; public class FindReplace extends javax.swing.JFrame { @@ -55,6 +56,7 @@ public class FindReplace extends javax.swing.JFrame { public FindReplace(Editor editor, Map state) { this.editor = editor; + isTranslucencySupported(); initComponents(); if (OSUtils.isMacOS()) { @@ -78,6 +80,10 @@ public void windowActivated(WindowEvent e) { findField.requestFocusInWindow(); findField.selectAll(); setAlwaysOnTop(true); + if (useTranslucency) { + // Window is decorated, so tranparency doesn't work :( + //setOpacity(0.7f); + } } public void windowDeactivated(WindowEvent e) { setAlwaysOnTop(false); @@ -89,6 +95,10 @@ public void windowActivated(WindowEvent e) { findField.requestFocusInWindow(); findField.selectAll(); setAlwaysOnTop(true); + if (useTranslucency) { + // Window is decorated, so tranparency doesn't work :( + //setOpacity(1.0f); + } } public void windowDeactivated(WindowEvent e) { } @@ -104,6 +114,15 @@ public void setVisible(boolean b) { super.setVisible(b); } + private boolean useTranslucency; + + private void isTranslucencySupported() { + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice gd = ge.getDefaultScreenDevice(); + //If translucent windows aren't supported, exit. + useTranslucency = gd.isWindowTranslucencySupported(TRANSLUCENT); + } + private Map findDialogState() { Map state = new HashMap<>(); state.put(FIND_TEXT, findField.getText()); From 449c99a2f5acad99d57c0207c890142920e2a1b6 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Thu, 10 Aug 2017 14:30:49 +0200 Subject: [PATCH 3/6] Add copy/paste contextual menu to Firnd/replace text fields Fixes #4883 --- .../arduino/view/findreplace/FindReplace.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/app/src/cc/arduino/view/findreplace/FindReplace.java b/app/src/cc/arduino/view/findreplace/FindReplace.java index bffb51b6a92..237114d4a3f 100644 --- a/app/src/cc/arduino/view/findreplace/FindReplace.java +++ b/app/src/cc/arduino/view/findreplace/FindReplace.java @@ -37,6 +37,9 @@ import java.awt.*; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import javax.swing.JPopupMenu; +import javax.swing.Action; +import javax.swing.text.DefaultEditorKit; import java.util.HashMap; import java.util.Map; @@ -194,6 +197,22 @@ private void initComponents() { searchAllFilesBox.setText(tr("Search all Sketch Tabs")); + JPopupMenu menu = new JPopupMenu(); + Action cut = new DefaultEditorKit.CutAction(); + cut.putValue(Action.NAME, tr("Cut")); + menu.add( cut ); + + Action copy = new DefaultEditorKit.CopyAction(); + copy.putValue(Action.NAME, tr("Copy")); + menu.add( copy ); + + Action paste = new DefaultEditorKit.PasteAction(); + paste.putValue(Action.NAME, tr("Paste")); + menu.add( paste ); + + findField.setComponentPopupMenu( menu ); + replaceField.setComponentPopupMenu( menu ); + findButton.setText(tr("Find")); findButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { From ce70d66095a38f4bb6ef1c5d35a93d8f44745e5f Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 9 Oct 2017 17:12:29 +0200 Subject: [PATCH 4/6] Fix find/replace focus on Windows Probably this approach could be adopted by all OSes with a little care on the window lifecycle. --- .../cc/arduino/view/findreplace/FindReplace.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/src/cc/arduino/view/findreplace/FindReplace.java b/app/src/cc/arduino/view/findreplace/FindReplace.java index 237114d4a3f..5952298d526 100644 --- a/app/src/cc/arduino/view/findreplace/FindReplace.java +++ b/app/src/cc/arduino/view/findreplace/FindReplace.java @@ -62,6 +62,10 @@ public FindReplace(Editor editor, Map state) { isTranslucencySupported(); initComponents(); + if (OSUtils.isWindows()) { + setAutoRequestFocus(false); + } + if (OSUtils.isMacOS()) { buttonsContainer.removeAll(); buttonsContainer.add(replaceAllButton); @@ -80,6 +84,10 @@ public FindReplace(Editor editor, Map state) { editor.addWindowListener(new WindowAdapter() { public void windowActivated(WindowEvent e) { + if (OSUtils.isWindows()) { + toFront(); + return; + } findField.requestFocusInWindow(); findField.selectAll(); setAlwaysOnTop(true); @@ -89,12 +97,18 @@ public void windowActivated(WindowEvent e) { } } public void windowDeactivated(WindowEvent e) { + if (OSUtils.isWindows()) { + return; + } setAlwaysOnTop(false); } }); addWindowListener(new WindowAdapter() { public void windowActivated(WindowEvent e) { + if (OSUtils.isWindows()) { + return; + } findField.requestFocusInWindow(); findField.selectAll(); setAlwaysOnTop(true); From 71418caa4bef460824d792c409fa178fb5b10f66 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Mon, 15 Jan 2018 14:28:32 +0100 Subject: [PATCH 5/6] [Find/Replace][Win] grab focus when just opened Solves https://github.com/arduino/Arduino/issues/6951#issuecomment-351995084 --- .../cc/arduino/view/findreplace/FindReplace.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/src/cc/arduino/view/findreplace/FindReplace.java b/app/src/cc/arduino/view/findreplace/FindReplace.java index 5952298d526..433a5faec1b 100644 --- a/app/src/cc/arduino/view/findreplace/FindReplace.java +++ b/app/src/cc/arduino/view/findreplace/FindReplace.java @@ -62,10 +62,6 @@ public FindReplace(Editor editor, Map state) { isTranslucencySupported(); initComponents(); - if (OSUtils.isWindows()) { - setAutoRequestFocus(false); - } - if (OSUtils.isMacOS()) { buttonsContainer.removeAll(); buttonsContainer.add(replaceAllButton); @@ -76,6 +72,9 @@ public FindReplace(Editor editor, Map state) { } Base.registerWindowCloseKeys(getRootPane(), e -> { + if (OSUtils.isWindows()) { + setAutoRequestFocus(true); + } setVisible(false); Base.FIND_DIALOG_STATE = findDialogState(); }); @@ -86,6 +85,7 @@ public FindReplace(Editor editor, Map state) { public void windowActivated(WindowEvent e) { if (OSUtils.isWindows()) { toFront(); + setAutoRequestFocus(false); return; } findField.requestFocusInWindow(); @@ -128,6 +128,11 @@ public void windowDeactivated(WindowEvent e) { public void setVisible(boolean b) { getRootPane().setDefaultButton(findButton); + if (OSUtils.isWindows()) { + // means we are restoring the window visibility + setAutoRequestFocus(true); + } + super.setVisible(b); } From 1d2c8fa9afaeef8581c30f7af821495270874f41 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Sat, 27 Jan 2018 00:22:40 +0100 Subject: [PATCH 6/6] Use Windows method for all OS --- .../arduino/view/findreplace/FindReplace.java | 38 +++---------------- 1 file changed, 5 insertions(+), 33 deletions(-) diff --git a/app/src/cc/arduino/view/findreplace/FindReplace.java b/app/src/cc/arduino/view/findreplace/FindReplace.java index 433a5faec1b..988dc6f5a69 100644 --- a/app/src/cc/arduino/view/findreplace/FindReplace.java +++ b/app/src/cc/arduino/view/findreplace/FindReplace.java @@ -72,9 +72,7 @@ public FindReplace(Editor editor, Map state) { } Base.registerWindowCloseKeys(getRootPane(), e -> { - if (OSUtils.isWindows()) { - setAutoRequestFocus(true); - } + setAutoRequestFocus(true); setVisible(false); Base.FIND_DIALOG_STATE = findDialogState(); }); @@ -83,39 +81,17 @@ public FindReplace(Editor editor, Map state) { editor.addWindowListener(new WindowAdapter() { public void windowActivated(WindowEvent e) { - if (OSUtils.isWindows()) { - toFront(); - setAutoRequestFocus(false); - return; - } - findField.requestFocusInWindow(); - findField.selectAll(); - setAlwaysOnTop(true); - if (useTranslucency) { - // Window is decorated, so tranparency doesn't work :( - //setOpacity(0.7f); - } + toFront(); + setAutoRequestFocus(false); } public void windowDeactivated(WindowEvent e) { - if (OSUtils.isWindows()) { return; - } - setAlwaysOnTop(false); } }); addWindowListener(new WindowAdapter() { public void windowActivated(WindowEvent e) { - if (OSUtils.isWindows()) { return; - } - findField.requestFocusInWindow(); - findField.selectAll(); - setAlwaysOnTop(true); - if (useTranslucency) { - // Window is decorated, so tranparency doesn't work :( - //setOpacity(1.0f); - } } public void windowDeactivated(WindowEvent e) { } @@ -127,12 +103,8 @@ public void windowDeactivated(WindowEvent e) { @Override public void setVisible(boolean b) { getRootPane().setDefaultButton(findButton); - - if (OSUtils.isWindows()) { - // means we are restoring the window visibility - setAutoRequestFocus(true); - } - + // means we are restoring the window visibility + setAutoRequestFocus(true); super.setVisible(b); }