/* * Copyright 2003-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 jetbrains.mps.nodeEditor.cells.contextAssistant; import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.JBColor; import com.intellij.util.ui.UIUtil; import jetbrains.mps.nodeEditor.EditorSettings; import sun.swing.SwingUtilities2; import javax.swing.AbstractButton; import javax.swing.BorderFactory; import javax.swing.InputMap; import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.KeyStroke; import javax.swing.border.AbstractBorder; import javax.swing.border.Border; import javax.swing.plaf.ButtonUI; import javax.swing.plaf.basic.BasicButtonUI; import java.awt.Color; import java.awt.Component; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Insets; import java.awt.Rectangle; class ButtonCustomizations { private static final ButtonUI ourButtonUI = createFlatButtonUI(); private static final Border ourButtonBorder = createFlatButtonBorder(); static JButton setupMenuButton(JButton button) { return makeFlat(makeEnterPressButton(button)); } private static JButton makeFlat(JButton button) { button.setUI(ourButtonUI); button.setBorder(ourButtonBorder); button.setFont(EditorSettings.getInstance().getDefaultEditorFont()); button.setForeground(JBColor.foreground()); button.setBackground(JBColor.background()); return button; } private static JButton makeEnterPressButton(JButton button) { InputMap inputMap = button.getInputMap(); inputMap.put(KeyStroke.getKeyStroke("ENTER"), "pressed"); inputMap.put(KeyStroke.getKeyStroke("released ENTER"), "released"); return button; } private static ButtonUI createFlatButtonUI() { return new FlatButtonUI( Colors.plainForeground(), Colors.plainBackground(), Colors.focusedForeground(), Colors.focusedBackground()); } private static Border createFlatButtonBorder() { return BorderFactory.createCompoundBorder( new FlatButtonBorder(Colors.plainBorder(), Colors.focusedBorder()), IdeBorderFactory.createEmptyBorder(0, 4, 0, 4)); } private static class Colors { private static Color plainBorder() { return JBColor.border(); } private static Color plainBackground() { return UIUtil.getListBackground(); } private static Color plainForeground() { return UIUtil.getListForeground(); } private static Color focusedBorder() { return UIUtil.getListSelectionBackground(); } private static Color focusedBackground() { return UIUtil.getListSelectionBackground(); } private static Color focusedForeground() { return UIUtil.getListSelectionForeground(); } private static Color getColor(Component button, Color plain, Color active) { return button.isFocusOwner() || ((AbstractButton) button).getModel().isArmed() ? active : plain; } } private static class FlatButtonBorder extends AbstractBorder { private final Color myPlainColor; private final Color myActiveColor; FlatButtonBorder(Color plainColor, Color activeColor) { myPlainColor = plainColor; myActiveColor = activeColor; } @Override public Insets getBorderInsets(Component c) { return getBorderInsets(c, new Insets(0, 0, 0, 0)); } @Override public Insets getBorderInsets(Component c, Insets insets) { insets.set(1, 1, 1, 1); return insets; } @Override public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { Color oldColor = g.getColor(); g.setColor(getBorderColor(c)); g.drawRect(x, y, width - 1, height - 1); g.setColor(oldColor); } private Color getBorderColor(Component c) { return Colors.getColor(c, myPlainColor, myActiveColor); } } private static class FlatButtonUI extends BasicButtonUI { private final Color myForeground; private final Color myBackground; private final Color myFocusedForeground; private final Color myFocusedBackground; FlatButtonUI(Color foreground, Color background, Color focusedForeground, Color focusedBackground) { myFocusedForeground = focusedForeground; myFocusedBackground = focusedBackground; myForeground = foreground; myBackground = background; } @Override public void update(Graphics g, JComponent c) { g.setColor(getBackground(c)); g.fillRect(0, 0, c.getWidth(),c.getHeight()); paint(g, c); } @Override protected void paintText(Graphics g, AbstractButton b, Rectangle textRect, String text) { FontMetrics fm = SwingUtilities2.getFontMetrics(b, g); int mnemonicIndex = b.getDisplayedMnemonicIndex(); // paint the text normally g.setColor(getForeground(b)); SwingUtilities2.drawStringUnderlineCharAt(b, g, text, mnemonicIndex, textRect.x + getTextShiftOffset(), textRect.y + fm.getAscent() + getTextShiftOffset()); } private Color getForeground(JComponent c) { return Colors.getColor(c, myForeground, myFocusedForeground); } private Color getBackground(JComponent c) { return Colors.getColor(c, myBackground, myFocusedBackground); } } }