Konstantin Bulenkov
11 years ago
5 changed files with 381 additions and 0 deletions
@ -0,0 +1,77 @@
|
||||
/* |
||||
* Copyright 2000-2014 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.GraphicsConfig; |
||||
import com.bulenkov.iconloader.util.Gray; |
||||
import com.bulenkov.iconloader.util.UIUtil; |
||||
import sun.swing.MenuItemLayoutHelper; |
||||
|
||||
import javax.swing.*; |
||||
import javax.swing.plaf.ComponentUI; |
||||
import java.awt.*; |
||||
|
||||
/** |
||||
* @author Konstantin Bulenkov |
||||
*/ |
||||
public class DarculaCheckBoxMenuItemUI extends DarculaMenuItemUIBase { |
||||
|
||||
@SuppressWarnings({"MethodOverridesStaticMethodOfSuperclass", "UnusedDeclaration"}) |
||||
public static ComponentUI createUI(JComponent c) { |
||||
return new DarculaCheckBoxMenuItemUI(); |
||||
} |
||||
|
||||
protected String getPropertyPrefix() { |
||||
return "CheckBoxMenuItem"; |
||||
} |
||||
|
||||
@Override |
||||
protected void paintCheckIcon(Graphics g2, MenuItemLayoutHelper lh, MenuItemLayoutHelper.LayoutResult lr, Color holdc, Color foreground) { |
||||
Graphics2D g = (Graphics2D) g2; |
||||
final GraphicsConfig config = new GraphicsConfig(g); |
||||
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
||||
g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT); |
||||
|
||||
g.translate(lr.getCheckRect().x+2, lr.getCheckRect().y+2); |
||||
|
||||
final int sz = 13; |
||||
g.setPaint(new GradientPaint(sz / 2, 1, Gray._110, sz / 2, sz, Gray._95)); |
||||
g.fillRoundRect(0, 0, sz, sz - 1 , 4, 4); |
||||
|
||||
g.setPaint(new GradientPaint(sz / 2, 1, Gray._120.withAlpha(0x5a), sz / 2, sz, Gray._105.withAlpha(90))); |
||||
g.drawRoundRect(0, (UIUtil.isUnderDarcula() ? 1 : 0), sz, sz - 1, 4, 4); |
||||
|
||||
g.setPaint(Gray._40.withAlpha(180)); |
||||
g.drawRoundRect(0, 0, sz, sz - 1, 4, 4); |
||||
|
||||
|
||||
if (lh.getMenuItem().isSelected()) { |
||||
g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE); |
||||
g.setStroke(new BasicStroke(2.0f, BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND)); |
||||
g.setPaint(Gray._30); |
||||
g.drawLine(4, 7, 7, 10); |
||||
g.drawLine(7, 10, sz, 2); |
||||
g.setPaint(Gray._170); |
||||
g.drawLine(4, 5, 7, 8); |
||||
g.drawLine(7, 8, sz, 0); |
||||
} |
||||
|
||||
g.translate(-lr.getCheckRect().x-2, -lr.getCheckRect().y-2); |
||||
config.restore(); |
||||
g.setColor(foreground); |
||||
} |
||||
} |
@ -0,0 +1,209 @@
|
||||
/* |
||||
* Copyright 2000-2014 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 sun.swing.MenuItemLayoutHelper; |
||||
import sun.swing.SwingUtilities2; |
||||
|
||||
import javax.swing.*; |
||||
import javax.swing.plaf.ComponentUI; |
||||
import javax.swing.plaf.basic.BasicMenuItemUI; |
||||
import java.awt.*; |
||||
import java.awt.event.MouseEvent; |
||||
|
||||
/** |
||||
* @author Konstantin Bulenkov |
||||
*/ |
||||
public class DarculaMenuItemUIBase extends BasicMenuItemUI { |
||||
@SuppressWarnings({"MethodOverridesStaticMethodOfSuperclass", "UnusedDeclaration"}) |
||||
public static ComponentUI createUI(JComponent c) { |
||||
return new DarculaMenuItemUIBase(); |
||||
} |
||||
|
||||
public void processMouseEvent(JMenuItem item, MouseEvent e, MenuElement path[], MenuSelectionManager manager) { |
||||
Point p = e.getPoint(); |
||||
if (p.x >= 0 && p.x < item.getWidth() && |
||||
p.y >= 0 && p.y < item.getHeight()) { |
||||
if (e.getID() == MouseEvent.MOUSE_RELEASED) { |
||||
manager.clearSelectedPath(); |
||||
item.doClick(0); |
||||
item.setArmed(false); |
||||
} else |
||||
manager.setSelectedPath(path); |
||||
} else if (item.getModel().isArmed()) { |
||||
MenuElement newPath[] = new MenuElement[path.length - 1]; |
||||
int i, c; |
||||
for (i = 0, c = path.length - 1; i < c; i++) |
||||
newPath[i] = path[i]; |
||||
manager.setSelectedPath(newPath); |
||||
} |
||||
} |
||||
|
||||
protected void paintMenuItem(Graphics g, JComponent c, |
||||
Icon checkIcon, Icon arrowIcon, |
||||
Color background, Color foreground, |
||||
int defaultTextIconGap) { |
||||
// Save original graphics font and color
|
||||
Font holdf = g.getFont(); |
||||
Color holdc = g.getColor(); |
||||
|
||||
JMenuItem mi = (JMenuItem) c; |
||||
g.setFont(mi.getFont()); |
||||
|
||||
Rectangle viewRect = new Rectangle(0, 0, mi.getWidth(), mi.getHeight()); |
||||
applyInsets(viewRect, mi.getInsets()); |
||||
|
||||
MenuItemLayoutHelper lh = new MenuItemLayoutHelper(mi, checkIcon, |
||||
arrowIcon, viewRect, defaultTextIconGap, acceleratorDelimiter, |
||||
mi.getComponentOrientation().isLeftToRight(), mi.getFont(), |
||||
acceleratorFont, MenuItemLayoutHelper.useCheckAndArrow(menuItem), |
||||
getPropertyPrefix()); |
||||
MenuItemLayoutHelper.LayoutResult lr = lh.layoutMenuItem(); |
||||
|
||||
paintBackground(g, mi, background); |
||||
paintCheckIcon(g, lh, lr, holdc, foreground); |
||||
paintIcon(g, lh, lr, holdc); |
||||
g.setColor(foreground); |
||||
paintText(g, lh, lr); |
||||
paintAccText(g, lh, lr); |
||||
paintArrowIcon(g, lh, lr, foreground); |
||||
|
||||
// Restore original graphics font and color
|
||||
g.setColor(holdc); |
||||
g.setFont(holdf); |
||||
} |
||||
|
||||
protected void paintIcon(Graphics g, MenuItemLayoutHelper lh, |
||||
MenuItemLayoutHelper.LayoutResult lr, Color holdc) { |
||||
if (lh.getIcon() != null) { |
||||
Icon icon; |
||||
ButtonModel model = lh.getMenuItem().getModel(); |
||||
if (!model.isEnabled()) { |
||||
icon = lh.getMenuItem().getDisabledIcon(); |
||||
} else if (model.isPressed() && model.isArmed()) { |
||||
icon = lh.getMenuItem().getPressedIcon(); |
||||
if (icon == null) { |
||||
// Use default icon
|
||||
icon = lh.getMenuItem().getIcon(); |
||||
} |
||||
} else { |
||||
icon = lh.getMenuItem().getIcon(); |
||||
} |
||||
|
||||
if (icon != null) { |
||||
icon.paintIcon(lh.getMenuItem(), g, lr.getIconRect().x, |
||||
lr.getIconRect().y); |
||||
g.setColor(holdc); |
||||
} |
||||
} |
||||
} |
||||
|
||||
protected void paintCheckIcon(Graphics g, MenuItemLayoutHelper lh, |
||||
MenuItemLayoutHelper.LayoutResult lr, |
||||
Color holdc, Color foreground) { |
||||
if (lh.getCheckIcon() != null) { |
||||
ButtonModel model = lh.getMenuItem().getModel(); |
||||
if (model.isArmed() || (lh.getMenuItem() instanceof JMenu |
||||
&& model.isSelected())) { |
||||
g.setColor(foreground); |
||||
} else { |
||||
g.setColor(holdc); |
||||
} |
||||
if (lh.useCheckAndArrow()) { |
||||
lh.getCheckIcon().paintIcon(lh.getMenuItem(), g, |
||||
lr.getCheckRect().x, lr.getCheckRect().y); |
||||
} |
||||
g.setColor(holdc); |
||||
} |
||||
} |
||||
|
||||
protected void paintAccText(Graphics g, MenuItemLayoutHelper lh, |
||||
MenuItemLayoutHelper.LayoutResult lr) { |
||||
if (!lh.getAccText().equals("")) { |
||||
ButtonModel model = lh.getMenuItem().getModel(); |
||||
g.setFont(lh.getAccFontMetrics().getFont()); |
||||
if (!model.isEnabled()) { |
||||
// *** paint the accText disabled
|
||||
if (disabledForeground != null) { |
||||
g.setColor(disabledForeground); |
||||
SwingUtilities2.drawString(lh.getMenuItem(), g, |
||||
lh.getAccText(), lr.getAccRect().x, |
||||
lr.getAccRect().y + lh.getAccFontMetrics().getAscent()); |
||||
} else { |
||||
g.setColor(lh.getMenuItem().getBackground().brighter()); |
||||
SwingUtilities2.drawString(lh.getMenuItem(), g, |
||||
lh.getAccText(), lr.getAccRect().x, |
||||
lr.getAccRect().y + lh.getAccFontMetrics().getAscent()); |
||||
g.setColor(lh.getMenuItem().getBackground().darker()); |
||||
SwingUtilities2.drawString(lh.getMenuItem(), g, |
||||
lh.getAccText(), lr.getAccRect().x - 1, |
||||
lr.getAccRect().y + lh.getFontMetrics().getAscent() - 1); |
||||
} |
||||
} else { |
||||
// *** paint the accText normally
|
||||
if (model.isArmed() |
||||
|| (lh.getMenuItem() instanceof JMenu |
||||
&& model.isSelected())) { |
||||
g.setColor(acceleratorSelectionForeground); |
||||
} else { |
||||
g.setColor(acceleratorForeground); |
||||
} |
||||
SwingUtilities2.drawString(lh.getMenuItem(), g, lh.getAccText(), |
||||
lr.getAccRect().x, lr.getAccRect().y + |
||||
lh.getAccFontMetrics().getAscent()); |
||||
} |
||||
} |
||||
} |
||||
|
||||
protected void paintText(Graphics g, MenuItemLayoutHelper lh, |
||||
MenuItemLayoutHelper.LayoutResult lr) { |
||||
if (!lh.getText().equals("")) { |
||||
if (lh.getHtmlView() != null) { |
||||
// Text is HTML
|
||||
lh.getHtmlView().paint(g, lr.getTextRect()); |
||||
} else { |
||||
// Text isn't HTML
|
||||
paintText(g, lh.getMenuItem(), lr.getTextRect(), lh.getText()); |
||||
} |
||||
} |
||||
} |
||||
|
||||
protected void paintArrowIcon(Graphics g, MenuItemLayoutHelper lh, |
||||
MenuItemLayoutHelper.LayoutResult lr, |
||||
Color foreground) { |
||||
if (lh.getArrowIcon() != null) { |
||||
ButtonModel model = lh.getMenuItem().getModel(); |
||||
if (model.isArmed() || (lh.getMenuItem() instanceof JMenu |
||||
&& model.isSelected())) { |
||||
g.setColor(foreground); |
||||
} |
||||
if (lh.useCheckAndArrow()) { |
||||
lh.getArrowIcon().paintIcon(lh.getMenuItem(), g, |
||||
lr.getArrowRect().x, lr.getArrowRect().y); |
||||
} |
||||
} |
||||
} |
||||
|
||||
protected void applyInsets(Rectangle rect, Insets insets) { |
||||
if(insets != null) { |
||||
rect.x += insets.left; |
||||
rect.y += insets.top; |
||||
rect.width -= (insets.right + rect.x); |
||||
rect.height -= (insets.bottom + rect.y); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,86 @@
|
||||
/* |
||||
* Copyright 2000-2014 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.Gray; |
||||
import sun.swing.MenuItemLayoutHelper; |
||||
|
||||
import javax.swing.*; |
||||
import javax.swing.plaf.ComponentUI; |
||||
import java.awt.*; |
||||
|
||||
/** |
||||
* @author Konstantin Bulenkov |
||||
*/ |
||||
public class DarculaRadioButtonMenuItemUI extends DarculaMenuItemUIBase { |
||||
@SuppressWarnings({"MethodOverridesStaticMethodOfSuperclass", "UnusedDeclaration"}) |
||||
public static ComponentUI createUI(JComponent c) { |
||||
return new DarculaRadioButtonMenuItemUI(); |
||||
} |
||||
|
||||
protected String getPropertyPrefix() { |
||||
return "RadioButtonMenuItem"; |
||||
} |
||||
|
||||
@Override |
||||
protected void paintCheckIcon(Graphics g2, MenuItemLayoutHelper lh, MenuItemLayoutHelper.LayoutResult lr, Color holdc, Color foreground) { |
||||
Graphics2D g = (Graphics2D) g2; |
||||
final GraphicsConfig config = new GraphicsConfig(g); |
||||
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); |
||||
g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT); |
||||
|
||||
g.translate(lr.getCheckRect().x+1, lr.getCheckRect().y+1); |
||||
|
||||
int rad = 5; |
||||
|
||||
final int x = 0; |
||||
final int y = 0; |
||||
final int w = 13; |
||||
final int h = 13; |
||||
|
||||
g.translate(x, y); |
||||
|
||||
//setup AA for lines
|
||||
Color bg = lh.getMenuItem().getBackground(); |
||||
g.setPaint(new GradientPaint(0, 0, ColorUtil.shift(bg, 1.5), |
||||
0, 16, ColorUtil.shift(bg, 1.2))); |
||||
|
||||
g.fillOval(0, 1, w - 1, h - 1); |
||||
|
||||
g.setPaint(new GradientPaint(w / 2, 1, Gray._160.withAlpha(90), w / 2, h, Gray._100.withAlpha(90))); |
||||
g.drawOval(0, 2, w - 1, h - 1); |
||||
|
||||
g.setPaint(Gray._40.withAlpha(200)); |
||||
g.drawOval(0, 1, w - 1, h - 1); |
||||
|
||||
if (lh.getMenuItem().isSelected()) { |
||||
final boolean enabled = lh.getMenuItem().isEnabled(); |
||||
g.setColor(UIManager.getColor(enabled ? "RadioButton.darcula.selectionEnabledShadowColor" : "RadioButton.darcula.selectionDisabledShadowColor")); |
||||
g.fillOval((w - rad)/2 , h/2 , rad, rad); |
||||
g.setColor(UIManager.getColor(enabled ? "RadioButton.darcula.selectionEnabledColor" : "RadioButton.darcula.selectionDisabledColor")); |
||||
g.fillOval((w - rad)/2 , h/2 - 1, rad, rad); |
||||
} |
||||
config.restore(); |
||||
g.translate(-x, -y); |
||||
|
||||
|
||||
g.translate(-lr.getCheckRect().x-1, -lr.getCheckRect().y-1); |
||||
config.restore(); |
||||
} |
||||
} |
Loading…
Reference in new issue