TabbedPane: scroll button implemented; do not hover tab if it is disabled

This commit is contained in:
Karl Tauber
2019-08-28 21:51:52 +02:00
parent c7b0985793
commit 10e91f9db3
2 changed files with 99 additions and 1 deletions

View File

@@ -18,18 +18,25 @@ package com.formdev.flatlaf.ui;
import static com.formdev.flatlaf.util.UIScale.scale; import static com.formdev.flatlaf.util.UIScale.scale;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font; import java.awt.Font;
import java.awt.FontMetrics; import java.awt.FontMetrics;
import java.awt.Graphics; import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets; import java.awt.Insets;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Path2D;
import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import javax.swing.JButton;
import javax.swing.JComponent; import javax.swing.JComponent;
import javax.swing.JTabbedPane; import javax.swing.JTabbedPane;
import javax.swing.UIManager; import javax.swing.UIManager;
import javax.swing.plaf.ComponentUI; import javax.swing.plaf.ComponentUI;
import javax.swing.plaf.UIResource; import javax.swing.plaf.UIResource;
import javax.swing.plaf.basic.BasicArrowButton;
import javax.swing.plaf.basic.BasicTabbedPaneUI; import javax.swing.plaf.basic.BasicTabbedPaneUI;
import javax.swing.text.View; import javax.swing.text.View;
import sun.swing.SwingUtilities2; import sun.swing.SwingUtilities2;
@@ -42,6 +49,7 @@ import sun.swing.SwingUtilities2;
* @uiDefault TabbedPane.font Font * @uiDefault TabbedPane.font Font
* @uiDefault TabbedPane.background Color * @uiDefault TabbedPane.background Color
* @uiDefault TabbedPane.foreground Color * @uiDefault TabbedPane.foreground Color
* @uiDefault TabbedPane.shadow Color used for scroll arrows and cropped line
* @uiDefault TabbedPane.disabledForeground Color * @uiDefault TabbedPane.disabledForeground Color
* @uiDefault TabbedPane.selectedForeground Color * @uiDefault TabbedPane.selectedForeground Color
* @uiDefault TabbedPane.underlineColor Color * @uiDefault TabbedPane.underlineColor Color
@@ -118,6 +126,11 @@ public class FlatTabbedPaneUI
}; };
} }
@Override
protected JButton createScrollButton( int direction ) {
return new ScrollableTabButton( direction );
}
@Override @Override
protected void setRolloverTab( int index ) { protected void setRolloverTab( int index ) {
int oldIndex = getRolloverTab(); int oldIndex = getRolloverTab();
@@ -256,7 +269,7 @@ public class FlatTabbedPaneUI
// paint tab background // paint tab background
boolean enabled = tabPane.isEnabled(); boolean enabled = tabPane.isEnabled();
g.setColor( enabled && getRolloverTab() == tabIndex g.setColor( enabled && tabPane.isEnabledAt( tabIndex ) && getRolloverTab() == tabIndex
? hoverColor ? hoverColor
: (enabled && isSelected && tabPane.hasFocus() : (enabled && isSelected && tabPane.hasFocus()
? focusColor ? focusColor
@@ -327,4 +340,88 @@ public class FlatTabbedPaneUI
private boolean isTopOrBottom( int tabPlacement ) { private boolean isTopOrBottom( int tabPlacement ) {
return tabPlacement == TOP || tabPlacement == BOTTOM; return tabPlacement == TOP || tabPlacement == BOTTOM;
} }
//---- class ScrollableTabButton ------------------------------------------
private class ScrollableTabButton
extends BasicArrowButton
implements UIResource
{
private boolean hover;
public ScrollableTabButton( int direction ) {
super( direction, Color.WHITE, Color.WHITE, Color.WHITE, Color.WHITE );
setOpaque( false );
setBorder( null );
addMouseListener( new MouseAdapter() {
@Override
public void mouseEntered( MouseEvent e ) {
hover = true;
repaint();
}
@Override
public void mouseExited( MouseEvent e ) {
hover = false;
repaint();
}
} );
}
@Override
public Dimension getPreferredSize() {
return scale( super.getPreferredSize() );
}
@Override
public Dimension getMinimumSize() {
return scale( super.getMinimumSize() );
}
@Override
public void paint( Graphics g ) {
Graphics2D g2 = (Graphics2D)g;
FlatUIUtils.setRenderingHints( g2 );
int width = getWidth();
int height = getHeight();
boolean enabled = isEnabled();
// paint hover background
if( enabled && hover ) {
g.setColor( hoverColor );
g.fillRect( 0, 0, width, height );
}
int w = scale( 9 );
int h = scale( 5 );
int x = Math.round( (width - w) / 2f );
int y = Math.round( (height - h) / 2f );
// arrow for SOUTH direction
Path2D arrow = new Path2D.Float();
arrow.moveTo( x, y );
arrow.lineTo( x + w, y );
arrow.lineTo( x + (w / 2f), y + h );
arrow.closePath();
// rotate arrow if necessary
if( direction == WEST ) {
g2.translate( width, 0 );
g2.rotate( Math.toRadians( 90 ) );
} else if( direction == EAST ) {
g2.translate( 0, height );
g2.rotate( Math.toRadians( 270 ) );
} else if( direction == NORTH ) {
g2.translate( width, height );
g2.rotate( Math.toRadians( 180 ) );
}
// paint arrow
g.setColor( enabled ? shadow : disabledForeground );
g2.fill( arrow );
}
}
} }

View File

@@ -135,6 +135,7 @@ TabbedPane.tabAreaInsets=0,0,0,0
TabbedPane.selectedTabPadInsets=0,0,0,0 TabbedPane.selectedTabPadInsets=0,0,0,0
TabbedPane.tabRunOverlay=0 TabbedPane.tabRunOverlay=0
TabbedPane.tabsOverlapBorder=true TabbedPane.tabsOverlapBorder=true
TabbedPane.shadow=@@ComboBox.buttonArrowColor
#---- TextArea ---- #---- TextArea ----