From a613a244f48206a69b17c00c0721cf56bbb6e04d Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Fri, 13 Aug 2021 19:11:03 +0200 Subject: [PATCH] InternalFrame: double-click on icon in internal frame title bar now closes the internal frame (issue #374) --- CHANGELOG.md | 9 +++++- .../ui/FlatInternalFrameTitlePane.java | 14 +++++++++ .../flatlaf/ui/FlatInternalFrameUI.java | 30 +++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5746d5b2..43edd683 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,20 @@ FlatLaf Change Log ================== +## 1.6-SNAPSHOT + +#### New features and improvements + +- InternalFrame: Double-click on icon in internal frame title bar now closes the + internal frame. (issue #374) + + ## 1.5 #### New features and improvements - SwingX: Added search and clear icons to `JXSearchField`. (issue #359) - #### Fixed bugs - Button and TextComponent: Do not apply minimum width/height if margins are diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameTitlePane.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameTitlePane.java index 3e4f7c1a..a8be1e2f 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameTitlePane.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameTitlePane.java @@ -21,6 +21,7 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.LayoutManager; +import java.awt.Rectangle; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.BorderFactory; @@ -146,6 +147,19 @@ public class FlatInternalFrameTitlePane closeButton.setVisible( frame.isClosable() ); } + Rectangle getFrameIconBounds() { + Icon icon = titleLabel.getIcon(); + if( icon == null ) + return null; + + int iconWidth = icon.getIconWidth(); + int iconHeight = icon.getIconHeight(); + boolean leftToRight = titleLabel.getComponentOrientation().isLeftToRight(); + int x = titleLabel.getX() + (leftToRight ? 0 : (titleLabel.getWidth() - iconWidth)); + int y = titleLabel.getY() + ((titleLabel.getHeight() - iconHeight) / 2); + return new Rectangle( x, y, iconWidth, iconHeight ); + } + /** * Does nothing because FlatLaf internal frames do not have system menus. */ diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java index efc3bfaf..ef7c6125 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatInternalFrameUI.java @@ -22,10 +22,13 @@ import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Insets; +import java.awt.Rectangle; +import java.awt.event.MouseEvent; import javax.swing.JComponent; import javax.swing.JInternalFrame; import javax.swing.LookAndFeel; import javax.swing.UIManager; +import javax.swing.event.MouseInputAdapter; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicInternalFrameUI; @@ -122,6 +125,11 @@ public class FlatInternalFrameUI return new FlatWindowResizer.InternalFrameResizer( frame, this::getDesktopManager ); } + @Override + protected MouseInputAdapter createBorderListener( JInternalFrame w ) { + return new FlatBorderListener(); + } + //---- class FlatInternalFrameBorder -------------------------------------- public static class FlatInternalFrameBorder @@ -195,4 +203,26 @@ public class FlatInternalFrameUI } } } + + //---- class FlatBorderListener ------------------------------------------- + + protected class FlatBorderListener + extends BorderListener + { + @Override + public void mouseClicked( MouseEvent e ) { + if( e.getClickCount() == 2 && !frame.isIcon() && + e.getSource() instanceof FlatInternalFrameTitlePane ) + { + Rectangle iconBounds = ((FlatInternalFrameTitlePane)e.getSource()).getFrameIconBounds(); + if( iconBounds != null && iconBounds.contains( e.getX(), e.getY() ) ) { + if( frame.isClosable() ) + frame.doDefaultCloseAction(); + return; + } + } + + super.mouseClicked( e ); + } + } }