/* * @(#)TinySplitPaneDivider.java 1.17 01/12/03 Copyright 2002 Sun Microsystems, * Inc. All rights reserved. SUN PROPRIETARY/CONFIDENTIAL. Use is subject to * license terms. .... Thanks a lot to sun for not making this class public .... * I guess they don't want us to create look and feels ... */ package de.muntjak.tinylookandfeel; import java.awt.Color; import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Insets; import java.awt.LayoutManager; import java.awt.Rectangle; import javax.swing.JButton; import javax.swing.JSplitPane; import javax.swing.border.Border; import javax.swing.plaf.basic.BasicSplitPaneDivider; import javax.swing.plaf.basic.BasicSplitPaneUI; import javax.swing.plaf.metal.MetalLookAndFeel; /** * Metal's split pane divider * <p> * <strong>Warning:</strong> Serialized objects of this class will not be * compatible with future Swing releases. The current serialization support is * appropriate for short term storage or RMI between applications running the * same version of Swing. As of 1.4, support for long term storage of all * JavaBeans<sup><font size="-2">TM</font></sup> has been added to the * <code>java.beans</code> package. Please see {@link java.beans.XMLEncoder}. * * @version 1.17 12/03/01 * @author Steve Wilson * @author Ralph kar */ @SuppressWarnings ( { "all" } ) class TinySplitPaneDivider extends BasicSplitPaneDivider { private int inset = 2; private Color controlColor = MetalLookAndFeel.getControl (); private Color primaryControlColor = MetalLookAndFeel.getPrimaryControl (); public TinySplitPaneDivider ( BasicSplitPaneUI ui ) { super ( ui ); setLayout ( new MetalDividerLayout () ); } public void paint ( Graphics g ) { g.setColor ( controlColor ); Rectangle clip = g.getClipBounds (); Insets insets = getInsets (); g.fillRect ( clip.x, clip.y, clip.width, clip.height ); Dimension size = getSize (); size.width -= inset * 2; size.height -= inset * 2; int drawX = inset; int drawY = inset; if ( insets != null ) { size.width -= ( insets.left + insets.right ); size.height -= ( insets.top + insets.bottom ); drawX += insets.left; drawY += insets.top; } super.paint ( g ); } /** * Creates and return an instance of JButton that can be used to collapse the * left component in the metal split pane. */ protected JButton createLeftOneTouchButton () { JButton b = new JButton () { public void setBorder ( Border b ) { } public void paint ( Graphics g ) { JSplitPane splitPane = getSplitPaneFromSuper (); // changed this in 1.3 if ( splitPane != null ) { int oneTouchSize = getOneTouchSizeFromSuper (); int orientation = getOrientationFromSuper (); // Fill the background first ... g.setColor ( Theme.backColor [ Theme.style ].getColor () ); g.fillRect ( 0, 0, this.getWidth (), this.getHeight () ); // use scrollArrowColor as button color g.setColor ( Theme.scrollArrowColor [ Theme.style ].getColor () ); if ( orientation == JSplitPane.VERTICAL_SPLIT ) { g.drawLine ( 2, 1, 3, 1 ); g.drawLine ( 1, 2, 4, 2 ); g.drawLine ( 0, 3, 5, 3 ); } else { // HORIZONTAL_SPLIT g.drawLine ( 1, 2, 1, 3 ); g.drawLine ( 2, 1, 2, 4 ); g.drawLine ( 3, 0, 3, 5 ); } } } // Don't want the button to participate in focus traversable. public boolean isFocusTraversable () { return false; } }; b.setRequestFocusEnabled ( false ); b.setCursor ( Cursor.getPredefinedCursor ( Cursor.DEFAULT_CURSOR ) ); b.setFocusPainted ( false ); b.setBorderPainted ( false ); return b; } /** * Creates and return an instance of JButton that can be used to collapse the * right component in the metal split pane. */ protected JButton createRightOneTouchButton () { JButton b = new JButton () { public void setBorder ( Border border ) { } public void paint ( Graphics g ) { JSplitPane splitPane = getSplitPaneFromSuper (); // changed this in 1.3 if ( splitPane != null ) { int oneTouchSize = getOneTouchSizeFromSuper (); int orientation = getOrientationFromSuper (); // Fill the background first ... g.setColor ( Theme.backColor [ Theme.style ].getColor () ); g.fillRect ( 0, 0, this.getWidth (), this.getHeight () ); // use scrollArrowColor as button color g.setColor ( Theme.scrollArrowColor [ Theme.style ].getColor () ); if ( orientation == JSplitPane.VERTICAL_SPLIT ) { g.drawLine ( 2, 3, 3, 3 ); g.drawLine ( 1, 2, 4, 2 ); g.drawLine ( 0, 1, 5, 1 ); } else { // HORIZONTAL_SPLIT g.drawLine ( 3, 2, 3, 3 ); g.drawLine ( 2, 1, 2, 4 ); g.drawLine ( 1, 0, 1, 5 ); } } } // Don't want the button to participate in focus traversable. public boolean isFocusTraversable () { return false; } }; b.setCursor ( Cursor.getPredefinedCursor ( Cursor.DEFAULT_CURSOR ) ); b.setFocusPainted ( false ); b.setBorderPainted ( false ); b.setRequestFocusEnabled ( false ); return b; } /** * Used to layout a TinySplitPaneDivider. Layout for the divider involves * appropriately moving the left/right buttons around. * <p> * This inner class is marked "public" due to a compiler bug. This * class should be treated as a "protected" inner class. Instantiate * it only within subclasses of TinySplitPaneDivider. */ public class MetalDividerLayout implements LayoutManager { public void layoutContainer ( Container c ) { JButton leftButton = getLeftButtonFromSuper (); JButton rightButton = getRightButtonFromSuper (); JSplitPane splitPane = getSplitPaneFromSuper (); int orientation = getOrientationFromSuper (); int oneTouchSize = getOneTouchSizeFromSuper (); int oneTouchOffset = getOneTouchOffsetFromSuper (); Insets insets = getInsets (); // This layout differs from the one used in BasicSplitPaneDivider. // It does not center justify the oneTouchExpadable buttons. // This was necessary in order to meet the spec of the Metal // splitpane divider. if ( leftButton != null && rightButton != null && c == TinySplitPaneDivider.this ) { if ( splitPane.isOneTouchExpandable () ) { if ( orientation == JSplitPane.VERTICAL_SPLIT ) { int extraY = ( insets != null ) ? insets.top : 0; int blockSize = getDividerSize (); if ( insets != null ) { blockSize -= ( insets.top + insets.bottom ); } blockSize = Math.min ( blockSize, oneTouchSize ); leftButton.setBounds ( oneTouchOffset, extraY, blockSize * 2, blockSize ); rightButton.setBounds ( oneTouchOffset + oneTouchSize * 2, extraY, blockSize * 2, blockSize ); } else { int blockSize = getDividerSize (); int extraX = ( insets != null ) ? insets.left : 0; if ( insets != null ) { blockSize -= ( insets.left + insets.right ); } blockSize = Math.min ( blockSize, oneTouchSize ); leftButton.setBounds ( extraX, oneTouchOffset, blockSize, blockSize * 2 ); rightButton.setBounds ( extraX, oneTouchOffset + oneTouchSize * 2, blockSize, blockSize * 2 ); } } else { leftButton.setBounds ( -5, -5, 1, 1 ); rightButton.setBounds ( -5, -5, 1, 1 ); } } } public Dimension minimumLayoutSize ( Container c ) { return new Dimension ( 0, 0 ); } public Dimension preferredLayoutSize ( Container c ) { return new Dimension ( 0, 0 ); } public void removeLayoutComponent ( Component c ) { } public void addLayoutComponent ( String string, Component c ) { } } /* * The following methods only exist in order to be able to access protected * members in the superclass, because these are otherwise not available in any * inner class. */ int getOneTouchSizeFromSuper () { return super.ONE_TOUCH_SIZE; } int getOneTouchOffsetFromSuper () { return super.ONE_TOUCH_OFFSET; } int getOrientationFromSuper () { return super.orientation; } JSplitPane getSplitPaneFromSuper () { return super.splitPane; } JButton getLeftButtonFromSuper () { return super.leftButton; } JButton getRightButtonFromSuper () { return super.rightButton; } }