# HG changeset patch # User Mario Torre # Date 1487076831 -3600 # Node ID 987a599a8ca5df90eb6f869cf193e27c9e53e2aa # Parent 3e1ccd4a2d51ddb1fea1a0232adfe85196990dc1 More Ui Tweaks review-thread: http://icedtea.classpath.org/pipermail/thermostat/2017-February/022159.html reviewed-by: jkang diff -r 3e1ccd4a2d51 -r 987a599a8ca5 client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/MainWindow.java --- a/client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/MainWindow.java Thu Feb 09 12:28:11 2017 +0100 +++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/MainWindow.java Tue Feb 14 13:53:51 2017 +0100 @@ -56,14 +56,12 @@ import java.io.PrintStream; import java.lang.reflect.InvocationTargetException; import java.nio.file.Files; -import java.nio.file.Paths; import java.util.Collections; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.BorderFactory; -import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; @@ -73,6 +71,9 @@ import javax.swing.SwingUtilities; import javax.swing.tree.TreeNode; +import com.redhat.thermostat.client.swing.UIDefaults; +import com.redhat.thermostat.client.swing.internal.components.ThermostatButton; +import com.redhat.thermostat.client.swing.internal.vmlist.UIDefaultsImpl; import com.redhat.thermostat.client.ui.ContentProvider; import com.redhat.thermostat.shared.config.CommonPaths; import sun.misc.Signal; @@ -387,9 +388,19 @@ installGlobalNavigation(); installSearchField(); } - + private void installGlobalNavigation() { - JButton action = new JButton(translator.localize(LocaleResources.SHOW_ISSUES).getContents()); + + UIDefaults defaults = UIDefaultsImpl.getInstance(); + + ThermostatButton action = new ThermostatButton(translator.localize(LocaleResources.SHOW_ISSUES).getContents()); + action.setForegroundPaint(defaults.getSelectedComponentFGColor()); + action.setBackgroundPaint(defaults.getSelectedComponentBGColor()); + action.setSelectedForegroundPaint(defaults.getSelectedComponentBGColor()); + action.setSelectedBackgroundPaint(defaults.getSelectedComponentFGColor()); + action.setMinimumSize(new Dimension(24, 36)); + action.setPreferredSize(new Dimension(24, 36)); + action.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(ActionEvent e) { diff -r 3e1ccd4a2d51 -r 987a599a8ca5 client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/components/ThermostatButton.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/components/ThermostatButton.java Tue Feb 14 13:53:51 2017 +0100 @@ -0,0 +1,172 @@ +/* + * Copyright 2012-2017 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 + * . + * + * 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.internal.components; + +import com.redhat.thermostat.client.swing.UIDefaults; +import com.redhat.thermostat.client.swing.internal.vmlist.UIDefaultsImpl; + +import javax.swing.AbstractAction; +import javax.swing.Icon; +import javax.swing.JButton; +import javax.swing.Timer; +import java.awt.Paint; +import java.awt.event.ActionEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +public class ThermostatButton extends JButton { + + private float blend; + + private Timer blendTimer; + + private UIDefaults defaults; + + private Paint backgroundPaint; + private Paint selectedBackgroundPaint; + + private Paint foregroundPaint; + private Paint selectedForegroundPaint; + + public ThermostatButton(String text) { + this(text, null); + } + + public ThermostatButton(String text, Icon icon) { + super(text, icon); + } + + @Override + protected void init(String text, Icon icon) { + super.init(text, icon); + setBorderPainted(false); + setFocusPainted(false); + setContentAreaFilled(false); + + setOpaque(false); + + blend = 0.f; + + defaults = new UIDefaultsImpl(); + + blendTimer = new Timer(3, new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + blend += 0.016f; + if (blend > 1) { + blend = 1.f; + blendTimer.stop(); + } + repaint(); + } + }); + blendTimer.setInitialDelay(0); + blendTimer.setRepeats(true); + + setUI(new ThermostatButtonUI()); + + addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + if (blendTimer != null) { + blendTimer.start(); + } + } + + @Override + public void mouseExited(MouseEvent e) { + blend = 0.f; + if (blendTimer != null) { + blendTimer.stop(); + } + } + }); + } + + + public Paint getBackgroundPaint() { + if (backgroundPaint == null) { + backgroundPaint = defaults.getComponentBGColor(); + } + return backgroundPaint; + } + + public void setBackgroundPaint(Paint backgroundPaint) { + this.backgroundPaint = backgroundPaint; + repaint(); + } + + public Paint getSelectedBackgroundPaint() { + if (selectedBackgroundPaint == null) { + selectedBackgroundPaint = defaults.getSelectedComponentBGColor(); + } + return selectedBackgroundPaint; + } + + public void setSelectedBackgroundPaint(Paint selectedBackgroundPaint) { + this.selectedBackgroundPaint = selectedBackgroundPaint; + repaint(); + } + + public Paint getSelectedForegroundPaint() { + if (selectedForegroundPaint == null) { + selectedForegroundPaint = defaults.getSelectedComponentFGColor(); + } + return selectedForegroundPaint; + } + + public void setSelectedForegroundPaint(Paint selectedForegroundPaint) { + this.selectedForegroundPaint = selectedForegroundPaint; + repaint(); + } + + public void setForegroundPaint(Paint foregroundPaint) { + this.foregroundPaint = foregroundPaint; + repaint(); + } + + public Paint getForegroundPaint() { + if (foregroundPaint == null) { + foregroundPaint = defaults.getComponentFGColor(); + } + return foregroundPaint; + } + + float getBlend() { + return blend; + } +} diff -r 3e1ccd4a2d51 -r 987a599a8ca5 client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/components/ThermostatButtonUI.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/components/ThermostatButtonUI.java Tue Feb 14 13:53:51 2017 +0100 @@ -0,0 +1,141 @@ +/* + * Copyright 2012-2017 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 + * . + * + * 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.internal.components; + +import com.redhat.thermostat.client.swing.GraphicsUtils; +import sun.swing.SwingUtilities2; + +import javax.swing.AbstractButton; +import javax.swing.ButtonModel; +import javax.swing.JComponent; +import javax.swing.plaf.metal.MetalButtonUI; +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Paint; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.Shape; + +class ThermostatButtonUI extends MetalButtonUI { + + private GraphicsUtils graphicsUtils = GraphicsUtils.getInstance(); + + private Shape getShape(ThermostatButton button) { + return new Rectangle.Double(0, 0, button.getWidth(), button.getHeight()); + } + + @Override + protected void paintButtonPressed(Graphics g, AbstractButton b) { + ThermostatButton button = (ThermostatButton) b; + + Graphics2D graphics = getGraphics(g); + + Paint paint = button.getSelectedBackgroundPaint(); + graphics.setPaint(paint); + + Shape shape = getShape(button); + graphics.fill(shape); + + graphics.dispose(); + } + + @Override + protected void paintText(Graphics g, AbstractButton b, Rectangle textRect, String text) { + ThermostatButton button = (ThermostatButton) b; + FontMetrics metrics = b.getFontMetrics(b.getFont()); + + Graphics2D graphics = getGraphics(g); + + ButtonModel model = button.getModel(); + Paint paint = null; + if (model.isPressed()) { + paint = button.getSelectedForegroundPaint(); + } else if (model.isRollover()) { + paint = button.getBackgroundPaint(); + } else { + paint = button.getForegroundPaint(); + } + + // FIXME: we should add this to GraphicsUtils + graphics.setPaint(new Color(0f, 0f, 0f, 0.1f)); + SwingUtilities2.drawString(b, graphics, text, textRect.x, + textRect.y + metrics.getAscent() + 1); + graphics.setPaint(paint); + SwingUtilities2.drawString(b, graphics, text, textRect.x, + textRect.y + metrics.getAscent()); + graphics.dispose(); + } + + @Override + public void paint(Graphics g, JComponent c) { + + ThermostatButton button = (ThermostatButton) c; + + ButtonModel model = button.getModel(); + Graphics2D graphics = getGraphics(g); + + Shape shape = getShape(button); + + if (!model.isPressed()) { + Paint paint = button.getBackgroundPaint(); + graphics.setPaint(paint); + + graphics.fill(shape); + + if (model.isRollover()) { + paint = button.getForegroundPaint(); + + graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, button.getBlend())); + graphics.setPaint(paint); + graphics.fill(shape); + } + } + + graphics.dispose(); + + super.paint(g, c); + } + + private Graphics2D getGraphics(Graphics g) { + Graphics2D graphics = graphicsUtils.createAAGraphics(g); + graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + return graphics; + } +} diff -r 3e1ccd4a2d51 -r 987a599a8ca5 client/swing/src/test/java/com/redhat/thermostat/client/swing/internal/components/ThermostatButtonTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/client/swing/src/test/java/com/redhat/thermostat/client/swing/internal/components/ThermostatButtonTest.java Tue Feb 14 13:53:51 2017 +0100 @@ -0,0 +1,91 @@ +/* + * Copyright 2012-2017 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 + * . + * + * 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.internal.components; + +import com.redhat.thermostat.client.ui.Palette; + +import javax.swing.AbstractAction; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.SwingUtilities; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.event.ActionEvent; + +/** + */ +public class ThermostatButtonTest { + + public static void main(String[] args) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + JFrame frame = new JFrame(); + frame.setMinimumSize(new Dimension(500, 500)); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + JPanel pane = new JPanel(new BorderLayout()); + frame.add(pane); + + ThermostatButton button = getButton("default button"); + pane.add(button, BorderLayout.SOUTH); + + frame.setVisible(true); + } + }); + } + + private static ThermostatButton getButton(final String text) { + ThermostatButton button = new ThermostatButton(text); + button.setForegroundPaint(Palette.WHITE.getColor()); + button.setBackgroundPaint(Palette.RED.getColor()); + + button.setSelectedForegroundPaint(Palette.WHITE.getColor()); + button.setSelectedBackgroundPaint(Palette.RED.getColor()); + + button.setMinimumSize(new Dimension(25, 100)); + button.setPreferredSize(new Dimension(25, 36)); + + button.addActionListener(new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + System.err.println(text + ": selected!"); + } + }); + return button; + } +} \ No newline at end of file