You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
6.0 KiB
200 lines
6.0 KiB
/* |
|
* Copyright 2000-2013 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.*; |
|
|
|
import javax.swing.*; |
|
import javax.swing.border.Border; |
|
import javax.swing.border.CompoundBorder; |
|
import javax.swing.border.EmptyBorder; |
|
import javax.swing.plaf.ComponentUI; |
|
import javax.swing.plaf.UIResource; |
|
import javax.swing.plaf.basic.BasicArrowButton; |
|
import javax.swing.plaf.basic.BasicSpinnerUI; |
|
import java.awt.*; |
|
import java.awt.event.FocusAdapter; |
|
import java.awt.event.FocusEvent; |
|
|
|
/** |
|
* @author Konstantin Bulenkov |
|
*/ |
|
public class DarculaSpinnerUI extends BasicSpinnerUI { |
|
private FocusAdapter myFocusListener = new FocusAdapter() { |
|
@Override |
|
public void focusGained(FocusEvent e) { |
|
spinner.repaint(); |
|
} |
|
|
|
@Override |
|
public void focusLost(FocusEvent e) { |
|
spinner.repaint(); |
|
} |
|
}; |
|
|
|
@SuppressWarnings({"MethodOverridesStaticMethodOfSuperclass", "UnusedDeclaration"}) |
|
public static ComponentUI createUI(JComponent c) { |
|
return new DarculaSpinnerUI(); |
|
} |
|
|
|
@Override |
|
protected void replaceEditor(JComponent oldEditor, JComponent newEditor) { |
|
super.replaceEditor(oldEditor, newEditor); |
|
if (oldEditor != null) { |
|
oldEditor.getComponents()[0].removeFocusListener(myFocusListener); |
|
} |
|
if (newEditor != null) { |
|
newEditor.getComponents()[0].addFocusListener(myFocusListener); |
|
} |
|
} |
|
|
|
@Override |
|
protected JComponent createEditor() { |
|
final JComponent editor = super.createEditor(); |
|
editor.getComponents()[0].addFocusListener(myFocusListener); |
|
return editor; |
|
} |
|
|
|
@Override |
|
public void paint(Graphics g, JComponent c) { |
|
super.paint(g, c); |
|
final Border border = spinner.getBorder(); |
|
if (border != null) { |
|
border.paintBorder(c, g, 0, 0, spinner.getWidth(), spinner.getHeight()); |
|
} |
|
} |
|
|
|
@Override |
|
protected Component createPreviousButton() { |
|
JButton button = createArrow(SwingConstants.SOUTH); |
|
button.setName("Spinner.previousButton"); |
|
button.setBorder(new EmptyBorder(1, 1, 1, 1)); |
|
installPreviousButtonListeners(button); |
|
return button; |
|
} |
|
|
|
@Override |
|
protected Component createNextButton() { |
|
JButton button = createArrow(SwingConstants.NORTH); |
|
button.setName("Spinner.nextButton"); |
|
button.setBorder(new EmptyBorder(1, 1, 1, 1)); |
|
installNextButtonListeners(button); |
|
return button; |
|
} |
|
|
|
|
|
@Override |
|
protected LayoutManager createLayout() { |
|
return new LayoutManagerDelegate(super.createLayout()) { |
|
@Override |
|
public void layoutContainer(Container parent) { |
|
super.layoutContainer(parent); |
|
final JComponent editor = spinner.getEditor(); |
|
if (editor != null) { |
|
final Rectangle bounds = editor.getBounds(); |
|
editor.setBounds(bounds.x, bounds.y, bounds.width - 6, bounds.height); |
|
} |
|
} |
|
}; |
|
} |
|
|
|
private JButton createArrow(int direction) { |
|
final Color shadow = UIUtil.getPanelBackground(); |
|
final Color enabledColor = new DoubleColor(Gray._255, UIUtil.getLabelForeground()); |
|
final Color disabledColor = new DoubleColor(Gray._200, UIUtil.getLabelForeground().darker()); |
|
JButton b = new BasicArrowButton(direction, shadow, shadow, enabledColor, shadow) { |
|
@Override |
|
public void paint(Graphics g) { |
|
int y = direction == NORTH ? getHeight() - 6 : 2; |
|
paintTriangle(g, (getWidth() - 8)/2 - 1, y, 0, direction, DarculaSpinnerUI.this.spinner.isEnabled()); |
|
} |
|
|
|
@Override |
|
public boolean isOpaque() { |
|
return false; |
|
} |
|
|
|
@Override |
|
public void paintTriangle(Graphics g, int x, int y, int size, int direction, boolean isEnabled) { |
|
final GraphicsConfig config = GraphicsUtil.setupAAPainting(g); |
|
int mid; |
|
final int w = 8; |
|
final int h = 6; |
|
mid = w / 2; |
|
|
|
g.setColor(isEnabled ? enabledColor : disabledColor); |
|
|
|
g.translate(x, y); |
|
switch (direction) { |
|
case SOUTH: |
|
g.fillPolygon(new int[]{0, w, mid}, new int[]{1, 1, h}, 3); |
|
break; |
|
case NORTH: |
|
g.fillPolygon(new int[]{0, w, mid}, new int[]{h - 1, h - 1, 0}, 3); |
|
break; |
|
case WEST: |
|
case EAST: |
|
} |
|
g.translate(-x, -y); |
|
config.restore(); |
|
} |
|
}; |
|
Border buttonBorder = UIManager.getBorder("Spinner.arrowButtonBorder"); |
|
if (buttonBorder instanceof UIResource) { |
|
// Wrap the border to avoid having the UIResource be replaced by |
|
// the ButtonUI. This is the opposite of using BorderUIResource. |
|
b.setBorder(new CompoundBorder(buttonBorder, null)); |
|
} |
|
else { |
|
b.setBorder(buttonBorder); |
|
} |
|
b.setInheritsPopupMenu(true); |
|
return b; |
|
} |
|
|
|
static class LayoutManagerDelegate implements LayoutManager { |
|
protected final LayoutManager myDelegate; |
|
|
|
LayoutManagerDelegate(LayoutManager delegate) { |
|
myDelegate = delegate; |
|
} |
|
|
|
@Override |
|
public void addLayoutComponent(String name, Component comp) { |
|
myDelegate.addLayoutComponent(name, comp); |
|
} |
|
|
|
@Override |
|
public void removeLayoutComponent(Component comp) { |
|
myDelegate.removeLayoutComponent(comp); |
|
} |
|
|
|
@Override |
|
public Dimension preferredLayoutSize(Container parent) { |
|
return myDelegate.preferredLayoutSize(parent); |
|
} |
|
|
|
@Override |
|
public Dimension minimumLayoutSize(Container parent) { |
|
return myDelegate.minimumLayoutSize(parent); |
|
} |
|
|
|
@Override |
|
public void layoutContainer(Container parent) { |
|
myDelegate.layoutContainer(parent); |
|
} |
|
} |
|
}
|
|
|