aboutsummaryrefslogtreecommitdiffstats
path: root/src/net/java/sip/communicator/impl/osdependent/systemtray/SystemTray.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/java/sip/communicator/impl/osdependent/systemtray/SystemTray.java')
-rw-r--r--src/net/java/sip/communicator/impl/osdependent/systemtray/SystemTray.java156
1 files changed, 156 insertions, 0 deletions
diff --git a/src/net/java/sip/communicator/impl/osdependent/systemtray/SystemTray.java b/src/net/java/sip/communicator/impl/osdependent/systemtray/SystemTray.java
new file mode 100644
index 0000000..818d1e7
--- /dev/null
+++ b/src/net/java/sip/communicator/impl/osdependent/systemtray/SystemTray.java
@@ -0,0 +1,156 @@
+/*
+ * Jitsi, the OpenSource Java VoIP and Instant Messaging client.
+ *
+ * Copyright @ 2015 Atlassian Pty Ltd
+ *
+ * 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 net.java.sip.communicator.impl.osdependent.systemtray;
+
+import java.awt.*;
+
+import javax.swing.*;
+
+import org.jitsi.util.*;
+
+import net.java.sip.communicator.impl.osdependent.*;
+import net.java.sip.communicator.impl.osdependent.systemtray.appindicator.*;
+import net.java.sip.communicator.impl.osdependent.systemtray.awt.*;
+import net.java.sip.communicator.service.systray.*;
+import net.java.sip.communicator.util.Logger;
+
+/**
+ * Base class for all wrappers of <tt>SystemTray</tt> implementations.
+ */
+public abstract class SystemTray
+{
+ private static final Logger logger = Logger.getLogger(SystemTray.class);
+ private static SystemTray systemTray;
+ private static final String DISABLED_TRAY_MODE = "disabled";
+
+ /**
+ * Gets or creates the supported <tt>SystemTray</tt> implementations.
+ * @return a <tt>SystemTray</tt> implementation for the current platform.
+ */
+ public final static SystemTray getSystemTray()
+ {
+ if (systemTray == null)
+ {
+ String mode = getSystemTrayMode();
+ logger.info("Tray for " + mode + " requested");
+ switch (mode)
+ {
+ case DISABLED_TRAY_MODE:
+ return null;
+ case "native":
+ if (java.awt.SystemTray.isSupported())
+ {
+ systemTray = new AWTSystemTray();
+ }
+
+ break;
+ case "appindicator":
+ try
+ {
+ systemTray = new AppIndicatorTray(true);
+ }
+ catch(Exception ex)
+ {
+ logger.error("AppIndicator tray not available", ex);
+ }
+ break;
+ case "appindicator_static":
+ try
+ {
+ systemTray = new AppIndicatorTray(false);
+ }
+ catch(Exception ex)
+ {
+ logger.error("AppIndicator tray not available", ex);
+ }
+
+ break;
+ }
+
+ if (systemTray == null)
+ {
+ OsDependentActivator.getConfigurationService()
+ .setProperty(SystrayService.PNMAE_TRAY_MODE, "disabled");
+ }
+ }
+
+ return systemTray;
+ }
+
+ public static String getSystemTrayMode()
+ {
+ String defaultTrayMode = DISABLED_TRAY_MODE;
+ if (GraphicsEnvironment.isHeadless())
+ {
+ return DISABLED_TRAY_MODE;
+ }
+
+ // setting from cmd-line: request to disable tray in case it failed
+ if (Boolean.getBoolean("disable-tray"))
+ {
+ OsDependentActivator.getConfigurationService().setProperty(
+ SystrayService.PNMAE_TRAY_MODE, DISABLED_TRAY_MODE);
+ }
+
+ if (OSUtils.IS_WINDOWS || OSUtils.IS_MAC)
+ {
+ defaultTrayMode = "native";
+ }
+
+ return OsDependentActivator.getConfigurationService()
+ .getString(SystrayService.PNMAE_TRAY_MODE, defaultTrayMode);
+ }
+
+ /**
+ * Adds a <tt>TrayIcon</tt> to this system tray implementation.
+ *
+ * @param trayIcon the <tt>TrayIcon</tt> to add
+ */
+ public abstract void addTrayIcon(TrayIcon trayIcon);
+
+ /**
+ * Creates an implementation specific <tt>TrayIcon</tt> that can later be
+ * added with {@link #addTrayIcon(TrayIcon)}.
+ *
+ * @param image the <tt>Image</tt> to be used
+ * @param tooltip the string to be used as tooltip text; if the value is
+ * <tt>null</tt> no tooltip is shown
+ * @param popup the menu to be used for the tray icon's popup menu; if the
+ * value is <tt>null</tt> no popup menu is shown
+ * @return a <tt>TrayIcon</tt> instance for this <tt>SystemTray</tt>
+ * implementation.
+ */
+ public abstract TrayIcon createTrayIcon(ImageIcon icon, String tooltip,
+ Object popup);
+
+ /**
+ * Determines if the popup menu for the icon is to be a Swing
+ * <tt>JPopupMenu</tt> or an AWT <tt>PopupMenu</tt>
+ *
+ * @return <tt>true</tt> for a <tt>JPopupMenu</tt>, <tt>false</tt> for a
+ * <tt>PopupMenu</tt>
+ */
+ public abstract boolean useSwingPopupMenu();
+
+ /**
+ * Determines if the tray icon supports dynamic menus.
+ *
+ * @return True if the menu can be changed while running, false otherwise.
+ */
+ public abstract boolean supportsDynamicMenu();
+}