/* * Copyright 2000-2010 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.intellij.ui.mac; import javax.swing.*; import javax.swing.plaf.ComponentUI; import javax.swing.plaf.basic.BasicPopupMenuUI; import java.awt.*; import java.awt.event.MouseEvent; public class MacPopupMenuUI extends BasicPopupMenuUI { static Stroke THREE_PIXEL_STROKE = new BasicStroke(3F); public MacPopupMenuUI() { } public static ComponentUI createUI(final JComponent c) { return new MacPopupMenuUI(); } public boolean isPopupTrigger(final MouseEvent event) { return event.isPopupTrigger(); } @Override public void installUI(JComponent c) { super.installUI(c); } public void paint(final Graphics g, final JComponent jcomponent) { if (!(g instanceof Graphics2D)) { super.paint(g, jcomponent); return; } Graphics2D graphics2d = (Graphics2D)g.create(); Rectangle rectangle = popupMenu.getBounds(); paintRoundRect(graphics2d, rectangle); clipEdges(graphics2d, rectangle); graphics2d.dispose(); super.paint(g, jcomponent); } private static void paintRoundRect(Graphics2D graphics2d, Rectangle rectangle) { graphics2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); graphics2d.setComposite(AlphaComposite.Clear); graphics2d.setStroke(THREE_PIXEL_STROKE); graphics2d.drawRoundRect(-2, -2, rectangle.width + 3, rectangle.height + 3, 12, 12); } protected void clipEdges(Graphics2D graphics2d, Rectangle rectangle) { Component component = popupMenu.getInvoker(); if (!(component instanceof JMenu)) return; Rectangle rectangle1 = component.getBounds(); rectangle1.setLocation(component.getLocationOnScreen()); rectangle.setLocation(popupMenu.getLocationOnScreen()); Point point = new Point((int)rectangle1.getCenterX(), (int)rectangle1.getCenterY()); if (rectangle.contains(point)) return; graphics2d.setComposite(AlphaComposite.SrcOver); graphics2d.setColor(popupMenu.getBackground()); Point point1 = new Point((int)rectangle.getCenterX(), (int)rectangle.getCenterY()); boolean flag = point.y <= point1.y; if (rectangle1.x + rectangle1.width < rectangle.x + 10) { if (flag) { graphics2d.fillRect(-2, -2, 8, 8); return; } else { graphics2d.fillRect(-2, rectangle.height - 6, 8, 8); return; } } if (rectangle.x + rectangle.width < rectangle1.x + 10) { if (flag) { graphics2d.fillRect(rectangle.width - 6, -2, 8, 8); return; } else { graphics2d.fillRect(rectangle.width - 6, rectangle.height - 6, 8, 8); return; } } if (rectangle1.y + rectangle1.height < rectangle.y + 10) { graphics2d.fillRect(-2, -2, rectangle.width + 4, 8); } } }