content: package io.github.rowak.nanoleafdesktop.ui.slider;
  
  import java.awt.Color;
  import java.awt.Component;
  import java.awt.Graphics;
  import java.awt.Polygon;
  import java.awt.Rectangle;
  
  import javax.swing.JLabel;
  import javax.swing.JSlider;
  import javax.swing.UIManager;
  import javax.swing.plaf.basic.BasicSliderUI;
  
  public class ModernSliderUI extends BasicSliderUI {
  	
  	private Color thumbColor;
  	
  	public ModernSliderUI(JSlider b) {
  		super(b);
  		thumbColor = Color.GRAY;
  		UIManager.put("Slider.shadow", Color.DARK_GRAY);
  		UIManager.put("Slider.highlight", Color.DARK_GRAY);
  	}
  	
  	@Override
  	protected void paintHorizontalLabel(Graphics g, int value, Component label) {
  		int labelCenter = xPositionForValue(value);
          int labelLeft = labelCenter - (label.getPreferredSize().width / 2);
          g.translate(labelLeft, 0);
          g.setColor(Color.GRAY);
          g.drawString(((JLabel)label).getText(), 0, 5);
          g.translate(-labelLeft, 0);
  	}
  	
  	// Ripped from the paintThumb method in BasicSliderUI
  	@Override
  	public void paintThumb(Graphics g) {
  		Rectangle knobBounds = thumbRect;
          int w = knobBounds.width;
          int h = knobBounds.height;
  
          g.translate(knobBounds.x, knobBounds.y);
  
          if (slider.isEnabled()) {
              g.setColor(thumbColor);
          }
          else {
              g.setColor(thumbColor.darker());
          }
  
          Boolean paintThumbArrowShape =
              (Boolean)slider.getClientProperty("Slider.paintThumbArrowShape");
  
          if ((!slider.getPaintTicks() && paintThumbArrowShape == null) ||
              paintThumbArrowShape == Boolean.FALSE) {
              // "plain" version
              g.fillRect(0, 0, w, h);
  
              g.setColor(Color.black);
              g.drawLine(0, h-1, w-1, h-1);
              g.drawLine(w-1, 0, w-1, h-1);
  
              g.setColor(getHighlightColor());
              g.drawLine(0, 0, 0, h-2);
              g.drawLine(1, 0, w-2, 0);
  
              g.setColor(getShadowColor());
              g.drawLine(1, h-2, w-2, h-2);
              g.drawLine(w-2, 1, w-2, h-3);
          }
          else if (slider.getOrientation() == JSlider.HORIZONTAL) {
              int cw = w / 2;
              g.fillRect(1, 1, w-3, h-1-cw);
              Polygon p = new Polygon();
              p.addPoint(1, h-cw);
              p.addPoint(cw-1, h-1);
              p.addPoint(w-2, h-1-cw);
              g.fillPolygon(p);
  
              g.setColor(getHighlightColor());
              g.drawLine(0, 0, w-2, 0);
              g.drawLine(0, 1, 0, h-1-cw);
              g.drawLine(0, h-cw, cw-1, h-1);
  
              g.setColor(Color.black);
              g.drawLine(w-1, 0, w-1, h-2-cw);
              g.drawLine(w-1, h-1-cw, w-1-cw, h-1);
  
              g.setColor(getShadowColor());
              g.drawLine(w-2, 1, w-2, h-2-cw);
              g.drawLine(w-2, h-1-cw, w-1-cw, h-2);
          }
          else {  // vertical
              int cw = h / 2;
              if ((slider.getOrientation() & 4) != 0) {
                    g.fillRect(1, 1, w-1-cw, h-3);
                    Polygon p = new Polygon();
                    p.addPoint(w-cw-1, 0);
                    p.addPoint(w-1, cw);
                    p.addPoint(w-1-cw, h-2);
                    g.fillPolygon(p);
  
                    g.setColor(getHighlightColor());
                    g.drawLine(0, 0, 0, h - 2);                  // left
                    g.drawLine(1, 0, w-1-cw, 0);                 // top
                    g.drawLine(w-cw-1, 0, w-1, cw);              // top slant
  
                    g.setColor(Color.black);
                    g.drawLine(0, h-1, w-2-cw, h-1);             // bottom
                    g.drawLine(w-1-cw, h-1, w-1, h-1-cw);        // bottom slant
  
                    g.setColor(getShadowColor());
                    g.drawLine(1, h-2, w-2-cw,  h-2 );           // bottom
                    g.drawLine(w-1-cw, h-2, w-2, h-cw-1 );       // bottom slant
              }
              else {
                    g.fillRect(5, 1, w-1-cw, h-3);
                    Polygon p = new Polygon();
                    p.addPoint(cw, 0);
                    p.addPoint(0, cw);
                    p.addPoint(cw, h-2);
                    g.fillPolygon(p);
  
                    g.setColor(getHighlightColor());
                    g.drawLine(cw-1, 0, w-2, 0);             // top
                    g.drawLine(0, cw, cw, 0);                // top slant
  
                    g.setColor(Color.black);
                    g.drawLine(0, h-1-cw, cw, h-1 );         // bottom slant
                    g.drawLine(cw, h-1, w-1, h-1);           // bottom
  
                    g.setColor(getShadowColor());
                    g.drawLine(cw, h-2, w-2,  h-2 );         // bottom
                    g.drawLine(w-1, 1, w-1,  h-2 );          // right
              }
          }
  
          g.translate(-knobBounds.x, -knobBounds.y);
  	}
  }
  