blob: 079947cb7fe8532e0543f0745415beb8f0f023fd [file] [log] [blame]
/*
* 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;
/**
* User: spLeaner
*/
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);
}
}
}