changeset 1829:3f37d769e279

Add close button to OverlayPanel Reviewed-by: jerboaa, neugens Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2015-October/016611.html PR2659
author Andrew Azores <aazores@redhat.com>
date Fri, 09 Oct 2015 10:13:26 -0400
parents ad647f3e243e
children 237257431e93
files client/swing/src/main/java/com/redhat/thermostat/client/swing/components/OverlayPanel.java vm-heap-analysis/client-swing/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/swing/internal/HeapSwingView.java
diffstat 2 files changed, 88 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/client/swing/src/main/java/com/redhat/thermostat/client/swing/components/OverlayPanel.java	Fri Oct 09 10:02:46 2015 -0400
+++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/components/OverlayPanel.java	Fri Oct 09 10:13:26 2015 -0400
@@ -37,6 +37,7 @@
 package com.redhat.thermostat.client.swing.components;
 
 import java.awt.BorderLayout;
+import java.awt.Color;
 import java.awt.Component;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
@@ -44,15 +45,20 @@
 import java.awt.Rectangle;
 import java.awt.RenderingHints;
 import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
 import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
 import java.awt.event.MouseMotionAdapter;
 import java.awt.geom.Area;
 import java.awt.geom.GeneralPath;
 import java.awt.image.BufferedImage;
 
 import javax.swing.AbstractAction;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
 import javax.swing.JComponent;
 import javax.swing.JPanel;
 import javax.swing.KeyStroke;
@@ -76,13 +82,18 @@
  */
 @SuppressWarnings("serial")
 public class OverlayPanel extends JPanel {
-    
+
+    private static final char CLOSE_ICON_ID = '\uf00d';
+    private static final char CLOSE_HOVERSTATE_ICON_ID = '\uf057';
+    private static final Color TRANSPARENT = new Color(0, 0, 0, 0);
     private JPanel content;
     private JPanel titlePane;
+    private JButton closeButton;
 
     private ShadowLabel overlayTitle;
     
     private boolean displayArrow;
+    private boolean showCloseButton;
     
     /**
      * Creates a new {@link OverlayPanel}, with an arrow facing upward.
@@ -96,26 +107,44 @@
      * arrow if {@code displayArrow} is {@code true}.
      */
     public OverlayPanel(LocalizedString title, boolean displayArrow) {
-        
+        this(title, displayArrow, false);
+    }
+
+    public OverlayPanel(LocalizedString title, boolean displayArrow, boolean showCloseButton) {
         this.displayArrow = displayArrow;
+        this.showCloseButton = showCloseButton;
         
         setOpaque(false);
         setBorder(new OverlayBorder());
         setLayout(new BorderLayout(0, 10));
         
         setName(OverlayPanel.class.getName());
-        
+
         titlePane = new JPanel();
+        titlePane.setLayout(new BoxLayout(titlePane, BoxLayout.LINE_AXIS));
         titlePane.setOpaque(true);
 
         overlayTitle = new ShadowLabel(title);
-        
+
         titlePane.setBorder(new TitleBorder());
         titlePane.setBackground(Palette.ROYAL_BLUE.getColor());
         overlayTitle.setForeground(Palette.WHITE.getColor());
 
+        closeButton = new JButton();
+        closeButton.setIcon(getCloseButtonInvisibleIcon());
+        closeButton.setBackground(TRANSPARENT);
+
+        if (showCloseButton) {
+            titlePane.add(closeButton);
+        }
+        titlePane.add(Box.createHorizontalGlue());
         titlePane.add(overlayTitle);
-        
+        titlePane.add(Box.createHorizontalGlue());
+        if (showCloseButton) {
+            Component closeButtonPlaceholder = Box.createRigidArea(closeButton.getPreferredSize());
+            titlePane.add(closeButtonPlaceholder);
+        }
+
         content = new JPanel();
         content.setOpaque(false);
         
@@ -129,13 +158,39 @@
         
         installListeners();
     }
+
+    private FontAwesomeIcon getCloseButtonHoverStateIcon() {
+        return getCloseButtonIcon(CLOSE_HOVERSTATE_ICON_ID, overlayTitle.getForeground());
+    }
+
+    private FontAwesomeIcon getCloseButtonVisibleIcon() {
+        return getCloseButtonIcon(CLOSE_ICON_ID, overlayTitle.getForeground());
+    }
+
+    private FontAwesomeIcon getCloseButtonInvisibleIcon() {
+        return getCloseButtonIcon(CLOSE_ICON_ID, titlePane.getBackground());
+    }
+
+    private FontAwesomeIcon getCloseButtonIcon(char iconId, Color color) {
+        return new FontAwesomeIcon(iconId, (int) (overlayTitle.getPreferredSize().getHeight() * 0.6), color);
+    }
     
     private void installListeners() {
-        
+        CloseButtonVisibilityListener closeButtonVisibilityListener = new CloseButtonVisibilityListener();
+        titlePane.addMouseListener(closeButtonVisibilityListener);
+        closeButton.addMouseListener(closeButtonVisibilityListener);
+        closeButton.addMouseListener(new CloseButtonBackgroundColorListener());
+
         // filter events, we don't want them to reach components through us
-        addMouseListener(new MouseAdapter() {});
-        addMouseMotionListener(new MouseMotionAdapter() {});
+        addMouseMotionListener(new MouseMotionAdapter() {
+        });
         addKeyListener(new KeyAdapter() {});
+        closeButton.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent actionEvent) {
+                setOverlayVisible(false);
+            }
+        });
         setFocusTraversalKeysEnabled(false);
 
         final int NO_MODIFIERS = 0;
@@ -318,5 +373,29 @@
             return insets;
         }
     }
+
+    private class CloseButtonVisibilityListener extends MouseAdapter {
+        @Override
+        public void mouseEntered(MouseEvent e) {
+            closeButton.setIcon(getCloseButtonVisibleIcon());
+        }
+
+        @Override
+        public void mouseExited(MouseEvent e) {
+            closeButton.setIcon(getCloseButtonInvisibleIcon());
+        }
+    }
+
+    private class CloseButtonBackgroundColorListener extends MouseAdapter {
+        @Override
+        public void mouseEntered(MouseEvent e) {
+            closeButton.setIcon(getCloseButtonHoverStateIcon());
+        }
+
+        @Override
+        public void mouseExited(MouseEvent e) {
+            closeButton.setIcon(getCloseButtonVisibleIcon());
+        }
+    }
 }
 
--- a/vm-heap-analysis/client-swing/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/swing/internal/HeapSwingView.java	Fri Oct 09 10:02:46 2015 -0400
+++ b/vm-heap-analysis/client-swing/src/main/java/com/redhat/thermostat/vm/heap/analysis/client/swing/internal/HeapSwingView.java	Fri Oct 09 10:13:26 2015 -0400
@@ -138,7 +138,7 @@
         stack = new JPanel();
         stack.setLayout(new OverlayLayout(stack));
         
-        overlay = new OverlayPanel(translator.localize(LocaleResources.DUMPS_LIST));
+        overlay = new OverlayPanel(translator.localize(LocaleResources.DUMPS_LIST), true, true);
         stack.add(overlay);
         stack.add(stats);
         stats.setOpaque(false);