| /* |
| * Copyright 2000-2014 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; |
| |
| import com.intellij.openapi.application.Application; |
| import com.intellij.openapi.application.ApplicationManager; |
| import com.intellij.openapi.application.ApplicationNamesInfo; |
| import com.intellij.openapi.application.ex.ApplicationInfoEx; |
| import com.intellij.openapi.application.impl.ApplicationInfoImpl; |
| import com.intellij.openapi.diagnostic.Logger; |
| import com.intellij.openapi.project.Project; |
| import com.intellij.openapi.ui.popup.Balloon; |
| import com.intellij.openapi.util.Condition; |
| import com.intellij.openapi.util.SystemInfo; |
| import com.intellij.openapi.util.registry.Registry; |
| import com.intellij.openapi.util.text.StringUtil; |
| import com.intellij.openapi.wm.ToolWindowManager; |
| import com.intellij.util.PlatformUtils; |
| import com.intellij.util.ReflectionUtil; |
| import com.intellij.util.containers.ContainerUtil; |
| import org.jetbrains.annotations.NonNls; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| import javax.swing.*; |
| import java.awt.*; |
| import java.io.File; |
| import java.io.InputStream; |
| import java.net.URL; |
| import java.util.List; |
| import java.util.Locale; |
| |
| /** |
| * @author yole |
| */ |
| public class AppUIUtil { |
| private static final String VENDOR_PREFIX = "jetbrains-"; |
| |
| public static void updateWindowIcon(@NotNull Window window) { |
| window.setIconImages(getAppIconImages()); |
| } |
| |
| @SuppressWarnings({"UnnecessaryFullyQualifiedName", "deprecation"}) |
| private static List<Image> getAppIconImages() { |
| ApplicationInfoEx appInfo = ApplicationInfoImpl.getShadowInstance(); |
| List<Image> images = ContainerUtil.newArrayListWithCapacity(3); |
| |
| if (SystemInfo.isXWindow) { |
| String bigIconUrl = appInfo.getBigIconUrl(); |
| if (bigIconUrl != null) { |
| images.add(com.intellij.util.ImageLoader.loadFromResource(bigIconUrl)); |
| } |
| } |
| |
| images.add(com.intellij.util.ImageLoader.loadFromResource(appInfo.getIconUrl())); |
| images.add(com.intellij.util.ImageLoader.loadFromResource(appInfo.getSmallIconUrl())); |
| |
| return images; |
| } |
| |
| public static void invokeLaterIfProjectAlive(@NotNull final Project project, @NotNull final Runnable runnable) { |
| final Application application = ApplicationManager.getApplication(); |
| if (application.isDispatchThread()) { |
| runnable.run(); |
| } |
| else { |
| application.invokeLater(runnable, new Condition() { |
| @Override |
| public boolean value(Object o) { |
| return !project.isOpen() || project.isDisposed(); |
| } |
| }); |
| } |
| } |
| |
| public static void invokeOnEdt(Runnable runnable) { |
| invokeOnEdt(runnable, null); |
| } |
| |
| public static void invokeOnEdt(Runnable runnable, @Nullable Condition expired) { |
| Application application = ApplicationManager.getApplication(); |
| if (application.isDispatchThread()) { |
| //noinspection unchecked |
| if (expired == null || !expired.value(null)) { |
| runnable.run(); |
| } |
| } |
| else if (expired == null) { |
| application.invokeLater(runnable); |
| } |
| else { |
| application.invokeLater(runnable, expired); |
| } |
| } |
| |
| public static void updateFrameClass() { |
| try { |
| final Toolkit toolkit = Toolkit.getDefaultToolkit(); |
| final Class<? extends Toolkit> aClass = toolkit.getClass(); |
| if ("sun.awt.X11.XToolkit".equals(aClass.getName())) { |
| ReflectionUtil.setField(aClass, toolkit, null, "awtAppClassName", getFrameClass()); |
| } |
| } |
| catch (Exception ignore) { } |
| } |
| |
| public static String getFrameClass() { |
| String name = ApplicationNamesInfo.getInstance().getProductName().toLowerCase(Locale.US); |
| String wmClass = VENDOR_PREFIX + StringUtil.replaceChar(name, ' ', '-'); |
| if ("true".equals(System.getProperty("idea.debug.mode"))) { |
| wmClass += "-debug"; |
| } |
| return PlatformUtils.isCommunityEdition() ? wmClass + "-ce" : wmClass; |
| } |
| |
| public static void registerBundledFonts() { |
| if (Registry.is("ide.register.bundled.fonts")) { |
| registerFont("/fonts/Inconsolata.ttf"); |
| registerFont("/fonts/SourceCodePro-Regular.ttf"); |
| registerFont("/fonts/SourceCodePro-Bold.ttf"); |
| } |
| } |
| |
| private static void registerFont(@NonNls String name) { |
| URL url = AppUIUtil.class.getResource(name); |
| if (url == null) { |
| Logger.getInstance(AppUIUtil.class).warn("Resource missing: " + name); |
| return; |
| } |
| |
| try { |
| InputStream is = url.openStream(); |
| try { |
| Font font = Font.createFont(Font.TRUETYPE_FONT, is); |
| GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(font); |
| } |
| finally { |
| is.close(); |
| } |
| } |
| catch (Throwable t) { |
| Logger.getInstance(AppUIUtil.class).warn("Cannot register font: " + url, t); |
| } |
| } |
| |
| public static void hideToolWindowBalloon(@NotNull final String id, @NotNull final Project project) { |
| invokeLaterIfProjectAlive(project, new Runnable() { |
| @Override |
| public void run() { |
| Balloon balloon = ToolWindowManager.getInstance(project).getToolWindowBalloon(id); |
| if (balloon != null) { |
| balloon.hide(); |
| } |
| } |
| }); |
| } |
| |
| @SuppressWarnings("UnusedDeclaration") |
| @Deprecated |
| /** |
| * to remove in IDEA 14 |
| */ |
| public static JTextField createUndoableTextField() { |
| return GuiUtils.createUndoableTextField(); |
| } |
| |
| private static final int MIN_ICON_SIZE = 32; |
| |
| @Nullable |
| public static String findIcon(final String iconsPath) { |
| final File iconsDir = new File(iconsPath); |
| |
| // 1. look for .svg icon |
| for (String child : iconsDir.list()) { |
| if (child.endsWith(".svg")) { |
| return iconsPath + '/' + child; |
| } |
| } |
| |
| // 2. look for .png icon of max size |
| int max = 0; |
| String iconPath = null; |
| for (String child : iconsDir.list()) { |
| if (!child.endsWith(".png")) continue; |
| final String path = iconsPath + '/' + child; |
| final Icon icon = new ImageIcon(path); |
| final int size = icon.getIconHeight(); |
| if (size >= MIN_ICON_SIZE && size > max && size == icon.getIconWidth()) { |
| max = size; |
| iconPath = path; |
| } |
| } |
| |
| return iconPath; |
| } |
| } |