From 89405a6cd110a9e4cb11aef7d1e425be3135383e Mon Sep 17 00:00:00 2001 From: nathan Date: Mon, 10 Oct 2016 11:07:01 +0200 Subject: [PATCH] Cleaned heirarchy, fixed shutdown methods --- .../systemTray/swing/_AppIndicatorTray.java | 12 +-- .../systemTray/swing/_GtkStatusIconTray.java | 13 +-- src/dorkbox/systemTray/swing/_SwingTray.java | 18 ++-- src/dorkbox/systemTray/swing/_Tray.java | 84 ------------------- 4 files changed, 24 insertions(+), 103 deletions(-) delete mode 100644 src/dorkbox/systemTray/swing/_Tray.java diff --git a/src/dorkbox/systemTray/swing/_AppIndicatorTray.java b/src/dorkbox/systemTray/swing/_AppIndicatorTray.java index c80a6b2..337846d 100644 --- a/src/dorkbox/systemTray/swing/_AppIndicatorTray.java +++ b/src/dorkbox/systemTray/swing/_AppIndicatorTray.java @@ -80,7 +80,7 @@ import dorkbox.util.SwingUtil; * http://bazaar.launchpad.net/~ubuntu-desktop/ido/gtk3/files */ public -class _AppIndicatorTray extends _Tray { +class _AppIndicatorTray extends MenuImpl { private volatile AppIndicatorInstanceStruct appIndicator; private boolean isActive = false; private final Runnable popupRunnable; @@ -107,11 +107,12 @@ class _AppIndicatorTray extends _Tray { _AppIndicatorTray(final SystemTray systemTray) { super(systemTray,null, new TrayPopup()); - if (SystemTray.FORCE_TRAY_TYPE == SystemTray.TYPE_GTK_STATUSICON) { - // if we force GTK type system tray, don't attempt to load AppIndicator libs - throw new IllegalArgumentException("Unable to start AppIndicator Tray if 'SystemTray.FORCE_TRAY_TYPE' is set to GtkStatusIcon"); + if (SystemTray.FORCE_TRAY_TYPE != 0 && SystemTray.FORCE_TRAY_TYPE != SystemTray.TYPE_APP_INDICATOR) { + throw new IllegalArgumentException("Unable to start AppIndicator Tray if 'SystemTray.FORCE_TRAY_TYPE' does not match"); } + ImageUtils.determineIconSize(); + TrayPopup popupMenu = (TrayPopup) _native; popupMenu.pack(); popupMenu.setFocusable(true); @@ -218,7 +219,8 @@ class _AppIndicatorTray extends _Tray { Gtk.shutdownGui(); // uses EDT - super.remove(); + clear(); + remove(); } } diff --git a/src/dorkbox/systemTray/swing/_GtkStatusIconTray.java b/src/dorkbox/systemTray/swing/_GtkStatusIconTray.java index f04de23..3368a25 100644 --- a/src/dorkbox/systemTray/swing/_GtkStatusIconTray.java +++ b/src/dorkbox/systemTray/swing/_GtkStatusIconTray.java @@ -32,6 +32,7 @@ import dorkbox.systemTray.linux.jna.GEventCallback; import dorkbox.systemTray.linux.jna.GdkEventButton; import dorkbox.systemTray.linux.jna.Gobject; import dorkbox.systemTray.linux.jna.Gtk; +import dorkbox.systemTray.util.ImageUtils; /** * Class for handling all system tray interactions via GTK. @@ -40,7 +41,7 @@ import dorkbox.systemTray.linux.jna.Gtk; * swing menu popup INSTEAD of GTK menu popups. The "golden standard" is our swing menu popup, since we have 100% control over it. */ public -class _GtkStatusIconTray extends _Tray { +class _GtkStatusIconTray extends MenuImpl { private volatile Pointer trayIcon; // http://code.metager.de/source/xref/gnome/Platform/gtk%2B/gtk/deprecated/gtkstatusicon.c @@ -62,11 +63,12 @@ class _GtkStatusIconTray extends _Tray { _GtkStatusIconTray(final SystemTray systemTray) { super(systemTray, null, new TrayPopup()); - if (SystemTray.FORCE_TRAY_TYPE == SystemTray.TYPE_APP_INDICATOR) { - // if we force GTK type system tray, don't attempt to load AppIndicator libs - throw new IllegalArgumentException("Unable to start GtkStatusIcon if 'SystemTray.FORCE_TRAY_TYPE' is set to AppIndicator"); + if (SystemTray.FORCE_TRAY_TYPE != 0 && SystemTray.FORCE_TRAY_TYPE != SystemTray.TYPE_GTK_STATUSICON) { + throw new IllegalArgumentException("Unable to start GtkStatusIcon if 'SystemTray.FORCE_TRAY_TYPE' does not match"); } + ImageUtils.determineIconSize(); + JPopupMenu popupMenu = (JPopupMenu) _native; popupMenu.pack(); popupMenu.setFocusable(true); @@ -169,7 +171,8 @@ class _GtkStatusIconTray extends _Tray { Gtk.shutdownGui(); // uses EDT - super.remove(); + clear(); + remove(); } } diff --git a/src/dorkbox/systemTray/swing/_SwingTray.java b/src/dorkbox/systemTray/swing/_SwingTray.java index 483db21..d6d089c 100644 --- a/src/dorkbox/systemTray/swing/_SwingTray.java +++ b/src/dorkbox/systemTray/swing/_SwingTray.java @@ -26,7 +26,7 @@ import java.io.File; import javax.swing.ImageIcon; import javax.swing.JPopupMenu; -import dorkbox.systemTray.Entry; +import dorkbox.systemTray.util.ImageUtils; /** * Class for handling all system tray interaction, via SWING. @@ -38,7 +38,7 @@ import dorkbox.systemTray.Entry; */ @SuppressWarnings({"SynchronizationOnLocalVariableOrMethodParameter", "WeakerAccess"}) public -class _SwingTray extends _Tray { +class _SwingTray extends MenuImpl { private volatile SystemTray tray; private volatile TrayIcon trayIcon; @@ -50,6 +50,12 @@ class _SwingTray extends _Tray { _SwingTray(final dorkbox.systemTray.SystemTray systemTray) { super(systemTray, null, new TrayPopup()); + if (dorkbox.systemTray.SystemTray.FORCE_TRAY_TYPE != 0 && dorkbox.systemTray.SystemTray.FORCE_TRAY_TYPE != dorkbox.systemTray.SystemTray.TYPE_SWING) { + throw new IllegalArgumentException("Unable to start Swing SystemTray if 'SystemTray.FORCE_TRAY_TYPE' does not match"); + } + + ImageUtils.determineIconSize(); + _SwingTray.this.tray = SystemTray.getSystemTray(); } @@ -61,13 +67,7 @@ class _SwingTray extends _Tray { void run() { tray.remove(trayIcon); - synchronized (menuEntries) { - for (Entry entry : menuEntries) { - entry.remove(); - } - menuEntries.clear(); - } - + clear(); remove(); } }); diff --git a/src/dorkbox/systemTray/swing/_Tray.java b/src/dorkbox/systemTray/swing/_Tray.java deleted file mode 100644 index 41f72df..0000000 --- a/src/dorkbox/systemTray/swing/_Tray.java +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2016 dorkbox, llc - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package dorkbox.systemTray.swing; - -import javax.swing.JComponent; - -import dorkbox.systemTray.Entry; -import dorkbox.systemTray.Menu; -import dorkbox.systemTray.SystemTray; -import dorkbox.systemTray.util.ImageUtils; - -public abstract -class _Tray extends MenuImpl { - /** - * Called in the EDT - */ - _Tray(final SystemTray systemTray, final Menu parent, final JComponent _native) { - super(systemTray, parent, _native); - - ImageUtils.determineIconSize(); - } - - public - String getStatus() { - synchronized (menuEntries) { - Entry entry = menuEntries.get(0); - if (entry instanceof EntryStatus) { - return entry.getText(); - } - } - - return null; - } - - public - void setStatus(final String statusText) { - final MenuImpl _this = this; - dispatchAndWait(new Runnable() { - @Override - public - void run() { - synchronized (menuEntries) { - // status is ALWAYS at 0 index... - EntryImpl menuEntry = null; - if (!menuEntries.isEmpty()) { - menuEntry = (EntryImpl) menuEntries.get(0); - } - - if (menuEntry instanceof EntryStatus) { - // set the text or delete... - - if (statusText == null) { - // delete - remove(menuEntry); - } - else { - // set text - menuEntry.setText(statusText); - } - - } else { - // create a new one - menuEntry = new EntryStatus(_this, statusText); - // status is ALWAYS at 0 index... - menuEntries.add(0, menuEntry); - } - } - } - }); - } -}