From 1a7eaaf8b2208e04ec4d19c369f1ea277ac35f75 Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Thu, 31 Mar 2016 18:49:44 +0200 Subject: [PATCH 1/2] Fix always-on-top notification popup --- .../contributions/ContributionsSelfCheck.java | 30 +++++++++++++++++-- .../cc/arduino/view/NotificationPopup.java | 1 - 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/app/src/cc/arduino/contributions/ContributionsSelfCheck.java b/app/src/cc/arduino/contributions/ContributionsSelfCheck.java index 1031effc3..d933b8797 100644 --- a/app/src/cc/arduino/contributions/ContributionsSelfCheck.java +++ b/app/src/cc/arduino/contributions/ContributionsSelfCheck.java @@ -36,10 +36,14 @@ import cc.arduino.contributions.packages.filters.UpdatablePlatformPredicate; import cc.arduino.view.NotificationPopup; import processing.app.Base; import processing.app.BaseNoGui; +import processing.app.Editor; import processing.app.I18n; import javax.swing.*; import javax.swing.event.HyperlinkListener; + +import java.awt.event.WindowEvent; +import java.awt.event.WindowFocusListener; import java.util.TimerTask; import static processing.app.I18n.tr; @@ -95,8 +99,30 @@ public class ContributionsSelfCheck extends TimerTask { } SwingUtilities.invokeLater(() -> { - notificationPopup = new NotificationPopup(base.getActiveEditor(), hyperlinkListener, text); - notificationPopup.setVisible(true); + Editor ed = base.getActiveEditor(); + notificationPopup = new NotificationPopup(ed, hyperlinkListener, text); + if (ed.isFocused()) { + notificationPopup.setVisible(true); + return; + } + + // If the IDE is not focused wait until it is focused again to + // display the notification, this avoids the annoying side effect + // to "steal" the focus from another application. + WindowFocusListener wfl = new WindowFocusListener() { + @Override + public void windowLostFocus(WindowEvent evt) { + } + + @Override + public void windowGainedFocus(WindowEvent evt) { + notificationPopup.setVisible(true); + for (Editor e : base.getEditors()) + e.removeWindowFocusListener(this); + } + }; + for (Editor e : base.getEditors()) + e.addWindowFocusListener(wfl); }); } diff --git a/app/src/cc/arduino/view/NotificationPopup.java b/app/src/cc/arduino/view/NotificationPopup.java index f5dfc717e..b3b636b60 100644 --- a/app/src/cc/arduino/view/NotificationPopup.java +++ b/app/src/cc/arduino/view/NotificationPopup.java @@ -61,7 +61,6 @@ public class NotificationPopup extends JDialog { super(parent, false); setLayout(new FlowLayout()); setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - setAlwaysOnTop(true); setUndecorated(true); setResizable(false); From 8d7ee63c70e7b6d2cddaa741b05decfda0bd78ab Mon Sep 17 00:00:00 2001 From: Cristian Maglie Date: Mon, 4 Apr 2016 13:30:42 +0200 Subject: [PATCH 2/2] Autoclose notification popup after 10 seconds. --- .../contributions/ContributionsSelfCheck.java | 4 ++-- app/src/cc/arduino/view/NotificationPopup.java | 16 ++++++++++++++++ arduino-core/src/cc/arduino/Constants.java | 2 +- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/app/src/cc/arduino/contributions/ContributionsSelfCheck.java b/app/src/cc/arduino/contributions/ContributionsSelfCheck.java index d933b8797..39bef3427 100644 --- a/app/src/cc/arduino/contributions/ContributionsSelfCheck.java +++ b/app/src/cc/arduino/contributions/ContributionsSelfCheck.java @@ -102,7 +102,7 @@ public class ContributionsSelfCheck extends TimerTask { Editor ed = base.getActiveEditor(); notificationPopup = new NotificationPopup(ed, hyperlinkListener, text); if (ed.isFocused()) { - notificationPopup.setVisible(true); + notificationPopup.begin(); return; } @@ -116,7 +116,7 @@ public class ContributionsSelfCheck extends TimerTask { @Override public void windowGainedFocus(WindowEvent evt) { - notificationPopup.setVisible(true); + notificationPopup.begin(); for (Editor e : base.getEditors()) e.removeWindowFocusListener(this); } diff --git a/app/src/cc/arduino/view/NotificationPopup.java b/app/src/cc/arduino/view/NotificationPopup.java index b3b636b60..87a8e3650 100644 --- a/app/src/cc/arduino/view/NotificationPopup.java +++ b/app/src/cc/arduino/view/NotificationPopup.java @@ -42,6 +42,8 @@ import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import java.util.Timer; +import java.util.TimerTask; import javax.swing.ImageIcon; import javax.swing.JButton; @@ -52,10 +54,13 @@ import javax.swing.WindowConstants; import javax.swing.border.LineBorder; import javax.swing.event.HyperlinkListener; +import cc.arduino.Constants; import processing.app.Theme; public class NotificationPopup extends JDialog { + private Timer autoCloseTimer = new Timer(false); + public NotificationPopup(Frame parent, HyperlinkListener hyperlinkListener, String message) { super(parent, false); @@ -130,6 +135,17 @@ public class NotificationPopup extends JDialog { } public void close() { + autoCloseTimer.cancel(); dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)); } + + public void begin() { + autoCloseTimer.schedule(new TimerTask() { + @Override + public void run() { + close(); + } + }, Constants.NOTIFICATION_POPUP_AUTOCLOSE_DELAY); + setVisible(true); + } } diff --git a/arduino-core/src/cc/arduino/Constants.java b/arduino-core/src/cc/arduino/Constants.java index 6cc47c83a..3c90abe7d 100644 --- a/arduino-core/src/cc/arduino/Constants.java +++ b/arduino-core/src/cc/arduino/Constants.java @@ -44,7 +44,7 @@ public class Constants { public static final String LIBRARY_DEVELOPMENT_FLAG_FILE = ".development"; public static final long BOARDS_LIBS_UPDATABLE_CHECK_START_PERIOD = 60000; - public static final int NOTIFICATION_POPUP_AUTOCLOSE_DELAY = 10000; + public static final long NOTIFICATION_POPUP_AUTOCLOSE_DELAY = 10000; public static final String PROXY_TYPE_NONE = "none"; public static final String PROXY_TYPE_AUTO = "auto";