/* * Copyright 2000-2009 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.openapi.ui.impl; import com.intellij.icons.AllIcons; import org.jdesktop.swingx.graphics.GraphicsUtilities; import org.jdesktop.swingx.graphics.ShadowRenderer; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; /** * @author spleaner * @author Konstantin Bulenkov */ public class ShadowBorderPainter { private static final Icon TOP = AllIcons.Ide.Shadow.Top; private static final Icon TOP_RIGHT = AllIcons.Ide.Shadow.Top_right; private static final Icon RIGHT = AllIcons.Ide.Shadow.Right; private static final Icon BOTTOM_RIGHT = AllIcons.Ide.Shadow.Bottom_right; private static final Icon BOTTOM = AllIcons.Ide.Shadow.Bottom; private static final Icon BOTTOM_LEFT = AllIcons.Ide.Shadow.Bottom_left; private static final Icon LEFT = AllIcons.Ide.Shadow.Left; private static final Icon TOP_LEFT = AllIcons.Ide.Shadow.Top_left; public static final int SIDE_SIZE = 35; public static final int TOP_SIZE = 20; public static final int BOTTOM_SIZE = 49; private static final Icon POPUP_TOP = AllIcons.Ide.Shadow.Popup.Top; private static final Icon POPUP_TOP_RIGHT = AllIcons.Ide.Shadow.Popup.Top_right; private static final Icon POPUP_RIGHT = AllIcons.Ide.Shadow.Popup.Right; private static final Icon POPUP_BOTTOM_RIGHT = AllIcons.Ide.Shadow.Popup.Bottom_right; private static final Icon POPUP_BOTTOM = AllIcons.Ide.Shadow.Popup.Bottom; private static final Icon POPUP_BOTTOM_LEFT = AllIcons.Ide.Shadow.Popup.Bottom_left; private static final Icon POPUP_LEFT = AllIcons.Ide.Shadow.Popup.Left; private static final Icon POPUP_TOP_LEFT = AllIcons.Ide.Shadow.Popup.Top_left; public static final int POPUP_SIDE_SIZE = 7; public static final int POPUP_TOP_SIZE = 4; public static final int POPUP_BOTTOM_SIZE = 10; private ShadowBorderPainter() { } public static BufferedImage createShadow(final JComponent c, final int width, final int height, boolean isPopup) { final GraphicsConfiguration graphicsConfiguration = GraphicsEnvironment.getLocalGraphicsEnvironment(). getDefaultScreenDevice().getDefaultConfiguration(); final BufferedImage image = graphicsConfiguration.createCompatibleImage(width, height, Transparency.TRANSLUCENT); final Graphics2D g = image.createGraphics(); final Icon topLeft = isPopup ? POPUP_TOP_LEFT : TOP_LEFT; final Icon topRight = isPopup ? POPUP_TOP_RIGHT : TOP_RIGHT; final Icon bottom = isPopup ? POPUP_BOTTOM : BOTTOM; final Icon top = isPopup ? POPUP_TOP : TOP; final Icon bottomRight = isPopup ? POPUP_BOTTOM_RIGHT : BOTTOM_RIGHT; final Icon bottomLeft = isPopup ? POPUP_BOTTOM_LEFT : BOTTOM_LEFT; final Icon left = isPopup ? POPUP_LEFT : LEFT; final Icon right = isPopup ? POPUP_RIGHT : RIGHT; final int sideSize = isPopup ? POPUP_SIDE_SIZE : SIDE_SIZE; final int bottomSize = isPopup ? POPUP_BOTTOM_SIZE : BOTTOM_SIZE; topLeft.paintIcon(c, g, 0, 0); topRight.paintIcon(c, g, width - topRight.getIconWidth(), 0); bottomRight.paintIcon(c, g, width - bottomRight.getIconWidth(), height - bottomRight.getIconHeight()); bottomLeft.paintIcon(c, g, 0, height - bottomLeft.getIconHeight()); for (int _x = topLeft.getIconWidth(); _x < width - topRight.getIconWidth(); _x++) { top.paintIcon(c, g, _x, 0); } for (int _x = bottomLeft.getIconWidth(); _x < width - bottomLeft.getIconWidth(); _x++) { bottom.paintIcon(c, g, _x, height - bottomSize); } for (int _y = topLeft.getIconHeight(); _y < height - bottomLeft.getIconHeight(); _y++) { left.paintIcon(c, g, 0, _y); } for (int _y = topRight.getIconHeight(); _y < height - bottomRight.getIconHeight(); _y++) { right.paintIcon(c, g, width - sideSize, _y); } g.setColor(new Color(0, 0, 0, 30)); g.drawRect(SIDE_SIZE - 1, TOP_SIZE - 1, width - SIDE_SIZE * 2 + 1, height - TOP_SIZE - BOTTOM_SIZE + 1); g.dispose(); return image; } public static BufferedImage createShadow(final JComponent c, final int width, final int height) { return createShadow(c, width, height, false); } public static BufferedImage createPopupShadow(final JComponent c, final int width, final int height) { return createShadow(c, width, height, true); } public static Shadow createShadow(Image source, int x, int y, boolean paintSource, int shadowSize) { int size = shadowSize; final float w = source.getWidth(null); final float h = source.getHeight(null); float ratio = w / h; float deltaX = size; float deltaY = size / ratio; final Image scaled = source.getScaledInstance((int)(w + deltaX), (int)(h + deltaY), Image.SCALE_SMOOTH); final BufferedImage s = GraphicsUtilities.createCompatibleTranslucentImage(scaled.getWidth(null), scaled.getHeight(null)); final Graphics2D graphics = (Graphics2D)s.getGraphics(); graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); graphics.drawImage(scaled, 0, 0, null); final BufferedImage shadow = new ShadowRenderer(size, .25f, Color.black).createShadow(s); if (paintSource) { final Graphics imgG = shadow.getGraphics(); final double d = size * 0.5; imgG.drawImage(source, (int)(size + d), (int)(size + d / ratio), null); } return new Shadow(shadow, x - size - 5, y - size + 2); } public static class Shadow { int x; int y; Image image; public Shadow(Image image, int x, int y) { this.x = x; this.y = y; this.image = image; } public int getX() { return x; } public int getY() { return y; } public Image getImage() { return image; } } }