changeset 828:a03d6e46b29d

Tweak popup menues review-thread: http://icedtea.classpath.org/pipermail/thermostat/2012-November/004076.html reviewed-by: jerboaa
author Mario Torre <neugens.limasoftware@gmail.com>
date Mon, 10 Dec 2012 12:34:30 +0100
parents 518cc2809bd2
children 4a2c3aa5742e
files client/swing/src/main/java/com/redhat/thermostat/client/swing/MainWindow.java client/swing/src/main/java/com/redhat/thermostat/client/swing/components/HeaderPanel.java client/swing/src/main/java/com/redhat/thermostat/client/swing/components/ThermostatPopupMenu.java client/swing/src/main/java/com/redhat/thermostat/client/swing/components/TranslucencyUtils.java client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/Main.java
diffstat 5 files changed, 149 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/client/swing/src/main/java/com/redhat/thermostat/client/swing/MainWindow.java	Fri Dec 07 17:31:35 2012 -0500
+++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/MainWindow.java	Mon Dec 10 12:34:30 2012 +0100
@@ -103,6 +103,7 @@
 import com.redhat.thermostat.client.swing.components.EdtHelper;
 import com.redhat.thermostat.client.swing.components.HtmlTextBuilder;
 import com.redhat.thermostat.client.swing.components.StatusBar;
+import com.redhat.thermostat.client.swing.components.ThermostatPopupMenu;
 import com.redhat.thermostat.client.swing.internal.MainView;
 import com.redhat.thermostat.client.swing.internal.components.DecoratedDefaultMutableTreeNode;
 import com.redhat.thermostat.client.swing.views.SearchFieldSwingView;
@@ -326,7 +327,7 @@
 
     private ActionNotifier<Action> actionNotifier = new ActionNotifier<>(this);
 
-    private JPopupMenu vmContextMenu;
+    private ThermostatPopupMenu vmContextMenu;
     private StatusBar statusBar;
     
     private final DefaultMutableTreeNode publishedRoot =
@@ -501,7 +502,7 @@
     }
 
     private void registerContextActionListener(JTree agentVmTree2) {
-        vmContextMenu = new JPopupMenu();
+        vmContextMenu = new ThermostatPopupMenu();
         agentVmTree2.addMouseListener(new MouseAdapter() {
             @Override
             public void mousePressed(MouseEvent e) {
--- a/client/swing/src/main/java/com/redhat/thermostat/client/swing/components/HeaderPanel.java	Fri Dec 07 17:31:35 2012 -0500
+++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/components/HeaderPanel.java	Mon Dec 10 12:34:30 2012 +0100
@@ -179,7 +179,7 @@
         hasButtons = true;
     }
     
-    class PreferencesPopup extends JPopupMenu {
+    class PreferencesPopup extends ThermostatPopupMenu {
         JMenuItem preferencesMenu;
         public PreferencesPopup() {
             // TODO: localize
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/components/ThermostatPopupMenu.java	Mon Dec 10 12:34:30 2012 +0100
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2012 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.client.swing.components;
+
+import java.awt.Window;
+
+import javax.swing.JPopupMenu;
+import javax.swing.SwingUtilities;
+
+@SuppressWarnings("serial")
+public class ThermostatPopupMenu extends JPopupMenu {
+    
+    @Override
+    public void setVisible(boolean visible) {
+        
+        if (TranslucencyUtils.TRANSLUCENT && !visible) {
+            setTranslucencyLevel(TranslucencyUtils.OPAQUE);
+        }
+        
+        super.setVisible(visible);
+        
+        if (TranslucencyUtils.TRANSLUCENT && visible) {
+            setTranslucencyLevel(TranslucencyUtils.TRANSPARENCY);
+        }
+    }
+    
+    private void setTranslucencyLevel(float level) {
+        try {
+            Window ourWindow = SwingUtilities.getWindowAncestor(this);
+            ourWindow.setOpacity(level);
+            
+        } catch (Throwable ignore) {}
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/components/TranslucencyUtils.java	Mon Dec 10 12:34:30 2012 +0100
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2012 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.client.swing.components;
+
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.GraphicsDevice.WindowTranslucency;
+
+class TranslucencyUtils {
+    public static final boolean TRANSLUCENT;
+    public static final float TRANSPARENCY;
+    public static final float OPAQUE = 1.0f;
+
+    static {
+        ThermostatPopupMenu.setDefaultLightWeightPopupEnabled(false);
+
+        boolean translucent = !Boolean.getBoolean("com.redhat.thermostat.popup.opaque");
+        if (translucent) {
+            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
+            GraphicsDevice gd = ge.getDefaultScreenDevice();
+            translucent = gd.isWindowTranslucencySupported(WindowTranslucency.PERPIXEL_TRANSLUCENT);
+        }
+        
+        float transparency = 0.90f;
+        String transparencyProp = System.getProperty("com.redhat.thermostat.popup.transparency");
+        if (transparencyProp != null) {
+            try {
+                transparency = Float.parseFloat(transparencyProp);
+                if (transparency > 1 || transparency < 0) {
+                    translucent = false;
+                }
+            } catch (Throwable ignore) {}
+        }
+        
+        TRANSLUCENT = translucent;
+        TRANSPARENCY = transparency;
+    }
+}
--- a/client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/Main.java	Fri Dec 07 17:31:35 2012 -0500
+++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/Main.java	Mon Dec 10 12:34:30 2012 +0100
@@ -121,8 +121,12 @@
                     }
                 }
 
+                // Thermostat JPopupMenu instances should all be
+                // ThermostatPopupmenu, so this is redundant, but done in case
+                // some client code doesn't use the internal popup
+                JPopupMenu.setDefaultLightWeightPopupEnabled(false);
+                
                 // TODO: move them in an appropriate place
-                JPopupMenu.setDefaultLightWeightPopupEnabled(false);
                 UIManager.getDefaults().put("OptionPane.buttonOrientation", SwingConstants.RIGHT);
                 UIManager.getDefaults().put("OptionPane.isYesLast", true);
                 UIManager.getDefaults().put("OptionPane.sameSizeButtons", true);