mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2026-02-12 06:57:13 -06:00
TabbedPane: scroll button implemented; do not hover tab if it is disabled
This commit is contained in:
@@ -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 );
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 ----
|
||||||
|
|||||||
Reference in New Issue
Block a user