/* * 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.ide.StartupProgress; import com.intellij.openapi.application.ex.ApplicationInfoEx; import com.intellij.openapi.application.impl.ApplicationInfoImpl; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.SystemInfo; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.util.List; /** * To customize your IDE splash go to YourIdeNameApplicationInfo.xml and find * section corresponding to IDE logo. It should look like: *
* <logo url="/idea_logo.png" textcolor="919191" progressColor="264db5" progressY="235"/> *
*where url
is path to your splash image
*
textColor
is HEX representation of text color for user name
*
progressColor
is progress bar color
*
progressY
is Y coordinate of the progress bar
*
progressTailIcon
is a path to flame effect icon
*
* @author Konstantin Bulenkov
*/
public class Splash extends JDialog implements StartupProgress {
@Nullable public static Rectangle BOUNDS;
private final Icon myImage;
private int myProgressHeight = 2;
private Color myProgressColor = null;
private int myProgressY;
private float myProgress;
private boolean mySplashIsVisible;
private int myProgressLastPosition = 0;
private final JLabel myLabel;
private Icon myProgressTail;
public Splash(String imageName, final Color textColor) {
super((Frame)null, false);
setUndecorated(true);
if (!(SystemInfo.isLinux && SystemInfo.isJavaVersionAtLeast("1.7"))) {
setResizable(false);
}
setFocusableWindowState(false);
Icon originalImage = IconLoader.getIcon(imageName);
myImage = new SplashImage(originalImage, textColor);
myLabel = new JLabel(myImage) {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
mySplashIsVisible = true;
myProgressLastPosition = 0;
paintProgress(g);
}
};
Container contentPane = getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(myLabel, BorderLayout.CENTER);
Dimension size = getPreferredSize();
setSize(size);
pack();
setLocationInTheCenterOfScreen();
}
private void setLocationInTheCenterOfScreen() {
Rectangle deviceBounds = getGraphicsConfiguration().getBounds();
setLocation((deviceBounds.width - getWidth()) / 2, (deviceBounds.height - getHeight()) / 2);
}
public Splash(ApplicationInfoEx info) {
this(info.getSplashImageUrl(), info.getSplashTextColor());
if (info instanceof ApplicationInfoImpl) {
final ApplicationInfoImpl appInfo = (ApplicationInfoImpl)info;
myProgressHeight = 2;
myProgressColor = appInfo.getProgressColor();
myProgressY = appInfo.getProgressY();
myProgressTail = appInfo.getProgressTailIcon();
}
}
@SuppressWarnings("deprecation")
public void show() {
super.show();
toFront();
//noinspection AssignmentToStaticFieldFromInstanceMethod
BOUNDS = getBounds();
//Sometimes this causes deadlock in EDT
// http://bugs.sun.com/view_bug.do?bug_id=6724890
//
//myLabel.paintImmediately(0, 0, myImage.getIconWidth(), myImage.getIconHeight());
}
@Override
public void showProgress(String message, float progress) {
if (getProgressColor() == null) return;
//myMessage = message;
myProgress = progress;
myLabel.paintImmediately(0, 0, myImage.getIconWidth(), myImage.getIconHeight());
}
private void paintProgress(Graphics g) {
final Color color = getProgressColor();
if (color == null) return;
if (!mySplashIsVisible) {
myImage.paintIcon(this, g, 0, 0);
mySplashIsVisible = true;
}
final int progressWidth = (int)((myImage.getIconWidth() - 2) * myProgress);
final int width = progressWidth - myProgressLastPosition;
g.setColor(color);
g.fillRect(1, getProgressY(), width, getProgressHeight());
if (myProgressTail != null) {
myProgressTail.paintIcon(this, g, width - (myProgressTail.getIconWidth()/2), getProgressY() - (myProgressTail.getIconHeight() - getProgressHeight())/2);
}
myProgressLastPosition = progressWidth;
}
private int getProgressHeight() {
return myProgressHeight;
}
private Color getProgressColor() {
return myProgressColor;
}
private int getProgressY() {
return myProgressY;
}
public static boolean showLicenseeInfo(Graphics g, int x, int y, final int height, final Color textColor) {
if (ApplicationInfoImpl.getShadowInstance().showLicenseeInfo()) {
final LicensingFacade provider = LicensingFacade.getInstance();
if (provider != null) {
UIUtil.applyRenderingHints(g);
g.setFont(new Font(UIUtil.ARIAL_FONT_NAME, Font.BOLD, SystemInfo.isUnix ? 10 : 11));
g.setColor(textColor);
final String licensedToMessage = provider.getLicensedToMessage();
final List