/* * Jitsi, the OpenSource Java VoIP and Instant Messaging client. * * Copyright @ 2015 Atlassian Pty Ltd * * 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 net.java.sip.communicator.impl.gui.main.menus; import java.awt.*; import java.awt.image.*; import javax.swing.*; import net.java.sip.communicator.impl.gui.*; import net.java.sip.communicator.impl.gui.utils.*; import net.java.sip.communicator.util.skin.*; /** * Represents a <tt>JMenuBar</tt> with SIP Communicator specific decorations. In * contrast to <tt>SIPCommMenuBar</tt> which doesn't look as a 100% menu bar, * <tt>SIPCommWindowMenuBar</tt> does look that way. * * @author Lubomir Marinov * @author Yana Stamcheva * @author Adam Netocny */ public class SIPCommWindowMenuBar extends JMenuBar implements Skinnable { /** * The <tt>Image</tt> to be drawn as the background of this * <tt>JMenuBar</tt>. */ private Image backgroundImage; /** * Color code for the foreground. */ private String foreground; /** * Initializes a new <tt>SIPCommWindowMenuBar</tt> instance which is to use * a specific foreground given by its id in the resources. * * @param foreground the id of the color resource to use as the foreground * of the new instance */ public SIPCommWindowMenuBar(String foreground) { this.foreground = foreground; loadSkin(); } /** * Determines whether a specific <tt>Image</tt> is transparent and thus does * not need drawing because nothing will be drawn. * * @param image the <tt>Image</tt> to be determined whether it is * transparent and thus does not need drawing * @return <tt>true</tt> if <tt>image</tt> is transparent and thus does not * need drawing; otherwise, <tt>false</tt> */ private static boolean isTransparent(Image image) { if (image instanceof BufferedImage) { BufferedImage bufferedImage = (BufferedImage) image; int width = bufferedImage.getWidth(); /* * Checking big images may be a performance hit so do it for small * ones only. */ if ((-1 < width) && (width < 17)) { int height = bufferedImage.getHeight(); if ((-1 < height) && (height < 17) && (bufferedImage.getTransparency() != Transparency.OPAQUE)) { boolean transparent = true; /* * Checking all pixels may be a performance hit so do it for * some of them only. */ for (int i = 0, min = Math.min(width, height); i < min; i++) { int rgb = bufferedImage.getRGB(i, i); if ((rgb & 0xFF000000) != 0) { transparent = false; break; } } return transparent; } } } return false; } /** * Paints the MENU_BACKGROUND image on the background of this container. * * @param g the <tt>Graphics</tt> object that does the painting */ @Override public void paintComponent(Graphics g) { super.paintComponent(g); if (backgroundImage != null) g.drawImage(backgroundImage, 0, 0, getWidth(), getHeight(), this); } /** * Loads images and colors used in this menu bar. */ public void loadSkin() { backgroundImage = ImageLoader.getImage(ImageLoader.MENU_BACKGROUND); LookAndFeel laf = UIManager.getLookAndFeel(); boolean setForeground = true; if (laf != null) { String lafClassName = laf.getClass().getName(); if (lafClassName.equals(UIManager.getSystemLookAndFeelClassName()) && !lafClassName.equals( UIManager.getCrossPlatformLookAndFeelClassName()) && ((backgroundImage == null) || isTransparent(backgroundImage))) { backgroundImage = null; setForeground = false; } } if (setForeground) { setForeground( new Color(GuiActivator.getResources().getColor(foreground))); } } }