2 * Copyright 2000-2013 JetBrains s.r.o.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package com.intellij.ui.plaf.gtk;
18 import com.intellij.openapi.actionSystem.impl.ActionMenuItem;
19 import com.intellij.util.ui.EmptyIcon;
20 import com.intellij.util.ui.UIUtil;
23 import javax.swing.plaf.MenuItemUI;
24 import javax.swing.plaf.basic.BasicMenuItemUI;
25 import javax.swing.plaf.synth.SynthContext;
28 public class GtkMenuItemUI extends BasicMenuItemUI {
29 private static Icon myCachedCheckIcon = null;
31 private final BasicMenuItemUI myOriginalUI;
32 private JCheckBoxMenuItem myHiddenItem;
34 public GtkMenuItemUI(final MenuItemUI originalUI) {
35 assert isUiAcceptable(originalUI) : originalUI;
36 myOriginalUI = (BasicMenuItemUI)originalUI;
39 public static boolean isUiAcceptable(final MenuItemUI ui) {
40 return ui instanceof BasicMenuItemUI && GtkPaintingUtil.isSynthUI(ui);
44 public void installUI(final JComponent c) {
47 myHiddenItem = new JCheckBoxMenuItem();
48 myOriginalUI.installUI(myHiddenItem);
49 menuItem.setBorder(myHiddenItem.getBorder());
50 final Icon icon = getCheckIconFromContext(myOriginalUI, myHiddenItem);
51 checkIcon = isCheckBoxItem() ? icon : EmptyIcon.create(icon);
55 public void uninstallUI(final JComponent c) {
58 myOriginalUI.uninstallUI(myHiddenItem);
60 resetCachedCheckIcon();
63 private static Icon getCheckIconFromContext(final BasicMenuItemUI originalUI, final JCheckBoxMenuItem item) {
64 if (myCachedCheckIcon == null) {
65 final SynthContext context = GtkPaintingUtil.getSynthContext(originalUI, item);
66 myCachedCheckIcon = context.getStyle().getIcon(context, "CheckBoxMenuItem.checkIcon");
68 return myCachedCheckIcon;
71 private boolean isCheckBoxItem() {
72 return menuItem instanceof ActionMenuItem && ((ActionMenuItem)menuItem).isToggleable();
75 private static void resetCachedCheckIcon() {
76 myCachedCheckIcon = null;
80 public void update(final Graphics g, final JComponent c) {
81 myHiddenItem.setSelected(menuItem.isSelected());
83 if (UIUtil.isMurrineBasedTheme()) {
84 acceleratorFont = menuItem.getFont();
85 final Color fg = GtkPaintingUtil.getForeground(myOriginalUI, menuItem);
86 acceleratorForeground = UIUtil.mix(fg, menuItem.getBackground(), menuItem.isSelected() ? 0.4 : 0.2);
87 disabledForeground = fg;
89 if (checkIcon != null && !(checkIcon instanceof IconWrapper) && !(checkIcon instanceof EmptyIcon)) {
90 checkIcon = new IconWrapper(checkIcon, myOriginalUI);
97 protected void paintText(final Graphics g, final JMenuItem menuItem, final Rectangle textRect, final String text) {
98 if (!menuItem.isEnabled() && UIUtil.isMurrineBasedTheme()) {
99 GtkPaintingUtil.paintDisabledText(myOriginalUI, g, menuItem, textRect, text);
102 super.paintText(g, menuItem, textRect, text);