Konstantin Bulenkov
8 years ago
2 changed files with 251 additions and 0 deletions
@ -0,0 +1,247 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2000-2016 JetBrains s.r.o. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
|
||||||
|
package com.bulenkov.darcula.ui; |
||||||
|
|
||||||
|
import com.bulenkov.iconloader.util.ColorUtil; |
||||||
|
import com.bulenkov.iconloader.util.GraphicsConfig; |
||||||
|
import com.bulenkov.iconloader.util.GraphicsUtil; |
||||||
|
import com.intellij.util.ui.JBUI; |
||||||
|
import org.jetbrains.annotations.NotNull; |
||||||
|
|
||||||
|
import javax.swing.*; |
||||||
|
import javax.swing.plaf.ComponentUI; |
||||||
|
import javax.swing.plaf.basic.BasicSliderUI; |
||||||
|
import java.awt.*; |
||||||
|
import java.awt.geom.Area; |
||||||
|
import java.awt.geom.Rectangle2D; |
||||||
|
import java.awt.geom.RoundRectangle2D; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Konstantin Bulenkov |
||||||
|
*/ |
||||||
|
public class DarculaSliderUI extends BasicSliderUI { |
||||||
|
public DarculaSliderUI(JSlider b) { |
||||||
|
super(b); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@SuppressWarnings({"MethodOverridesStaticMethodOfSuperclass", "UnusedDeclaration"}) |
||||||
|
public static ComponentUI createUI(JComponent c) { |
||||||
|
return new DarculaSliderUI((JSlider) c); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void paintFocus(Graphics g) { |
||||||
|
super.paintFocus(g); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void paintTrack(Graphics g2d) { |
||||||
|
Graphics2D g = (Graphics2D) g2d; |
||||||
|
Rectangle trackBounds = trackRect; |
||||||
|
final int arc = JBUI.scale(5); |
||||||
|
int trackSize = JBUI.scale(5); |
||||||
|
final GraphicsConfig config = GraphicsUtil.setupAAPainting(g); |
||||||
|
final Color bg = ColorUtil.fromHex("2b2b2b"); |
||||||
|
final Color selection = slider.isEnabled() ? getSelectedTrackColor() : getDisabledTickColor(); |
||||||
|
if (slider.getOrientation() == JSlider.HORIZONTAL) { |
||||||
|
int cy = (trackBounds.height / 2) - trackSize / 2; |
||||||
|
int cw = trackBounds.width; |
||||||
|
final Area shape = new Area(new RoundRectangle2D.Double(0, 0, cw, trackSize, arc, arc)); |
||||||
|
g.translate(trackBounds.x, trackBounds.y + cy); |
||||||
|
g.setColor(bg); |
||||||
|
g.fill(shape); |
||||||
|
int x = thumbRect.x; |
||||||
|
shape.intersect(new Area(new Rectangle2D.Double(0, 0, x, trackSize))); |
||||||
|
g.setColor(selection); |
||||||
|
g.fill(shape); |
||||||
|
g.translate(-trackBounds.x, -(trackBounds.y + cy)); |
||||||
|
} else { |
||||||
|
int cx = (trackBounds.width / 2) - trackSize / 2; |
||||||
|
int ch = trackBounds.height; |
||||||
|
g.translate(trackBounds.x + cx, trackBounds.y); |
||||||
|
g.setColor(bg); |
||||||
|
g.fillRoundRect(0, 0, trackSize, ch, arc, arc); |
||||||
|
g.translate(-(trackBounds.x + cx), -trackBounds.y); |
||||||
|
} |
||||||
|
config.restore(); |
||||||
|
} |
||||||
|
|
||||||
|
@NotNull |
||||||
|
protected Color getSelectedTrackColor() { |
||||||
|
return ColorUtil.fromHex("888888"); |
||||||
|
} |
||||||
|
|
||||||
|
@NotNull |
||||||
|
protected Color getDisabledTickColor() { |
||||||
|
return ColorUtil.fromHex("555555"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void paintTicks(Graphics g) { |
||||||
|
super.paintTicks(g); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void paintMinorTickForHorizSlider(Graphics g, Rectangle tickBounds, int x) { |
||||||
|
checkDisabled(g); |
||||||
|
super.paintMinorTickForHorizSlider(g, tickBounds, x); |
||||||
|
} |
||||||
|
|
||||||
|
private void checkDisabled(Graphics g) { |
||||||
|
if (!slider.isEnabled()) { |
||||||
|
g.setColor(getDisabledTickColor()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void paintMajorTickForHorizSlider(Graphics g, Rectangle tickBounds, int x) { |
||||||
|
checkDisabled(g); |
||||||
|
super.paintMajorTickForHorizSlider(g, tickBounds, x); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void paintMinorTickForVertSlider(Graphics g, Rectangle tickBounds, int y) { |
||||||
|
checkDisabled(g); |
||||||
|
super.paintMinorTickForVertSlider(g, tickBounds, y); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void paintMajorTickForVertSlider(Graphics g, Rectangle tickBounds, int y) { |
||||||
|
checkDisabled(g); |
||||||
|
super.paintMajorTickForVertSlider(g, tickBounds, y); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void paintLabels(Graphics g) { |
||||||
|
checkDisabled(g); |
||||||
|
super.paintLabels(g); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void paintHorizontalLabel(Graphics g, int value, Component label) { |
||||||
|
checkDisabled(g); |
||||||
|
super.paintHorizontalLabel(g, value, label); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void paintVerticalLabel(Graphics g, int value, Component label) { |
||||||
|
checkDisabled(g); |
||||||
|
super.paintVerticalLabel(g, value, label); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void paintThumb(Graphics g) { |
||||||
|
final GraphicsConfig config = GraphicsUtil.setupAAPainting(g); |
||||||
|
Rectangle knobBounds = thumbRect; |
||||||
|
int w = knobBounds.width; |
||||||
|
int h = knobBounds.height; |
||||||
|
|
||||||
|
g.translate(knobBounds.x, knobBounds.y); |
||||||
|
|
||||||
|
if ( slider.isEnabled() ) { |
||||||
|
g.setColor(slider.getBackground()); |
||||||
|
} |
||||||
|
else { |
||||||
|
g.setColor(slider.getBackground().darker()); |
||||||
|
} |
||||||
|
|
||||||
|
Boolean paintThumbArrowShape = |
||||||
|
(Boolean)slider.getClientProperty("Slider.paintThumbArrowShape"); |
||||||
|
|
||||||
|
if ((!slider.getPaintTicks() && paintThumbArrowShape == null) || |
||||||
|
paintThumbArrowShape == Boolean.FALSE) { |
||||||
|
|
||||||
|
// "plain" version
|
||||||
|
final RoundRectangle2D.Double thumb = new RoundRectangle2D.Double(0, 0, w, h, JBUI.scale(6), JBUI.scale(6)); |
||||||
|
final RoundRectangle2D.Double innerThumb = new RoundRectangle2D.Double(1, 1, w-2, h-2, JBUI.scale(6)-2, JBUI.scale(6)-2); |
||||||
|
g.setColor(ColorUtil.fromHex("555555")); |
||||||
|
((Graphics2D) g).fill(thumb); |
||||||
|
g.setColor(slider.isEnabled() ? getSelectedTrackColor() : getDisabledTickColor()); |
||||||
|
((Graphics2D) g).fill(innerThumb); |
||||||
|
} |
||||||
|
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.getComponentOrientation().isLeftToRight()) { |
||||||
|
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); |
||||||
|
config.restore(); |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue