Merge branch 'db/javac-ast'
[idea/community.git] / platform / platform-impl / src / com / intellij / ui / plaf / gtk / GtkMenuItemUI.java
1 /*
2  * Copyright 2000-2013 JetBrains s.r.o.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16 package com.intellij.ui.plaf.gtk;
17
18 import com.intellij.openapi.actionSystem.impl.ActionMenuItem;
19 import com.intellij.util.ui.EmptyIcon;
20 import com.intellij.util.ui.UIUtil;
21
22 import javax.swing.*;
23 import javax.swing.plaf.MenuItemUI;
24 import javax.swing.plaf.basic.BasicMenuItemUI;
25 import javax.swing.plaf.synth.SynthContext;
26 import java.awt.*;
27
28 public class GtkMenuItemUI extends BasicMenuItemUI {
29   private static Icon myCachedCheckIcon = null;
30
31   private final BasicMenuItemUI myOriginalUI;
32   private JCheckBoxMenuItem myHiddenItem;
33
34   public GtkMenuItemUI(final MenuItemUI originalUI) {
35     assert isUiAcceptable(originalUI) : originalUI;
36     myOriginalUI = (BasicMenuItemUI)originalUI;
37   }
38
39   public static boolean isUiAcceptable(final MenuItemUI ui) {
40     return ui instanceof BasicMenuItemUI && GtkPaintingUtil.isSynthUI(ui);
41   }
42
43   @Override
44   public void installUI(final JComponent c) {
45     super.installUI(c);
46
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);
52   }
53
54   @Override
55   public void uninstallUI(final JComponent c) {
56     super.uninstallUI(c);
57
58     myOriginalUI.uninstallUI(myHiddenItem);
59     myHiddenItem = null;
60     resetCachedCheckIcon();
61   }
62
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");
67     }
68     return myCachedCheckIcon;
69   }
70
71   private boolean isCheckBoxItem() {
72     return menuItem instanceof ActionMenuItem && ((ActionMenuItem)menuItem).isToggleable();
73   }
74
75   private static void resetCachedCheckIcon() {
76     myCachedCheckIcon = null;
77   }
78
79   @Override
80   public void update(final Graphics g, final JComponent c) {
81     myHiddenItem.setSelected(menuItem.isSelected());
82
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;
88     }
89     if (checkIcon != null && !(checkIcon instanceof IconWrapper) && !(checkIcon instanceof EmptyIcon)) {
90       checkIcon = new IconWrapper(checkIcon, myOriginalUI);
91     }
92
93     super.update(g, c);
94   }
95
96   @Override
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);
100       return;
101     }
102     super.paintText(g, menuItem, textRect, text);
103   }
104 }