package org.korsakow.ide.ui.laf; import java.awt.Dimension; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.geom.RoundRectangle2D; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JSlider; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicSliderUI; import org.korsakow.ide.util.UIResourceManager; public class KorsakowSliderUI extends BasicSliderUI { public static final String SCROLL_INCREMENT = "scrollIncrement"; private static Icon thumbIcon; public static ComponentUI createUI(JComponent b) { return new KorsakowSliderUI((JSlider)b); } public KorsakowSliderUI(JSlider b) { super(b); if (thumbIcon == null){ thumbIcon = UIResourceManager.getIcon("laf/slider_thumb.png"); } } @Override public void installUI(JComponent c) { super.installUI(c); } @Override protected Dimension getThumbSize() { return new Dimension(thumbIcon.getIconWidth(), thumbIcon.getIconHeight()); } @Override public Dimension getMaximumSize(JComponent c) { Dimension d = super.getMaximumSize(c); if ( slider.getOrientation() == JSlider.HORIZONTAL ) { d.height = 15; if (slider.getPaintTicks()) { d.height += getHeightOfTallestLabel(); } } else { d.width = 15; if (slider.getPaintTicks()) d.width += getWidthOfWidestLabel(); } return d; } @Override public Dimension getMinimumHorizontalSize() { return getPreferredHorizontalSize(); } public Dimension getMinimumVersicalSize() { return getPreferredVerticalSize(); } @Override public Dimension getPreferredHorizontalSize() { Dimension d = super.getPreferredHorizontalSize(); d.height = 15; return d; } @Override public Dimension getPreferredVerticalSize() { Dimension d = super.getPreferredVerticalSize(); d.width = 15; return d; } @Override public Dimension getPreferredSize(JComponent c) { recalculateIfInsetsChanged(); Dimension d; if ( slider.getOrientation() == JSlider.VERTICAL ) { d = new Dimension(getPreferredVerticalSize()); d.width += tickRect.width + labelRect.width; } else { d = new Dimension(getPreferredHorizontalSize()); d.height += tickRect.height + labelRect.height; } d.width += insetCache.left + insetCache.right; d.height += insetCache.top + insetCache.bottom; return d; } @Override public void paintThumb(Graphics g) { thumbIcon.paintIcon(slider, g, thumbRect.x, thumbRect.y); } @Override public void paintTrack(Graphics g) { Graphics2D g2 = (Graphics2D)g; int cx, cy, cw, ch; int pad; Rectangle trackBounds = trackRect; if ( slider.getOrientation() == JSlider.HORIZONTAL ) { pad = 0; cx = 0; ch = 5; cy = (trackBounds.height-ch) / 2; cw = trackBounds.width; GradientPaint paint = new GradientPaint(0, 0, KorsakowLafUtil.createColorRGB(0xffffff), 0, trackBounds.height/2, KorsakowLafUtil.createColorRGB(0xc9c9c9), true); g2.setPaint(paint); g2.fillRect(0, 0, slider.getWidth(), slider.getHeight()); g.translate(trackBounds.x, trackBounds.y); paint = new GradientPaint(0, 0, KorsakowLafUtil.createColorRGB(0xd6d6d6), 0, ch, KorsakowLafUtil.createColorRGB(0x717171), true); RoundRectangle2D rect = new RoundRectangle2D.Float(cx+pad, cy, cw-pad*2, ch, 3, 3); g2.setPaint(paint); g2.fill(rect); g.translate(-trackBounds.x, -(trackBounds.y)); } else { pad = 0; cw = 5; cx = (trackBounds.width-cw) / 2; cy = 0; ch = trackBounds.height; GradientPaint paint = new GradientPaint(0, 0, KorsakowLafUtil.createColorRGB(0xffffff), trackBounds.width/2, 0, KorsakowLafUtil.createColorRGB(0xc9c9c9), true); g2.setPaint(paint); g2.fill(trackBounds); g.translate(trackBounds.x, trackBounds.y); paint = new GradientPaint(0, 0, KorsakowLafUtil.createColorRGB(0xd6d6d6), cw, 0, KorsakowLafUtil.createColorRGB(0x717171), true); RoundRectangle2D rect = new RoundRectangle2D.Float(cx, cy+pad, cw, ch-pad*2, 3, 3); g2.setPaint(paint); g2.fill(rect); g.translate(-(trackBounds.x), -trackBounds.y); } } @Override public void scrollByBlock(int direction) { synchronized(slider) { int oldValue = slider.getValue(); Integer blockIncrement = null; if ( slider.getClientProperty( SCROLL_INCREMENT ) != null ) { try { blockIncrement = Integer.parseInt( String.valueOf( slider.getClientProperty( SCROLL_INCREMENT ) ) ); } catch ( NumberFormatException e ) { ; // } } if ( blockIncrement == null ) { blockIncrement = (slider.getMaximum() - slider.getMinimum()) / 10; if (blockIncrement <= 0 && slider.getMaximum() > slider.getMinimum()) { blockIncrement = 1; } } int delta = blockIncrement * ((direction > 0) ? POSITIVE_SCROLL : NEGATIVE_SCROLL); slider.setValue(oldValue + delta); } } @Override public void scrollByUnit(int direction) { scrollByBlock( direction ); } }