package org.netbeans.gradle.project.util;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseMotionAdapter;
import java.util.concurrent.TimeUnit;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import org.jtrim.cancel.CancellationController;
import org.jtrim.property.swing.DelayedGlassPane;
import org.jtrim.property.swing.GlassPaneFactory;
import org.jtrim.utils.ExceptionHelper;
import static org.jtrim.property.swing.AutoDisplayState.*;
public final class GlassPanes {
private static final Color LOADING_PANEL_BASE_BCKG = Color.GRAY;
private static final Color LOADING_PANEL_BCKG = toTransparent(LOADING_PANEL_BASE_BCKG);
private static void registerInputBlockers(Component component) {
component.addMouseListener(new MouseAdapter() { });
component.addMouseMotionListener(new MouseMotionAdapter() { });
component.addMouseWheelListener(new MouseAdapter() { });
component.addKeyListener(new KeyAdapter() { });
}
public static GlassPaneFactory loadingPanel(
final String loadingCaption,
final CancellationController cancelTask) {
ExceptionHelper.checkNotNullArgument(loadingCaption, "loadingCaption");
return new GlassPaneFactory() {
@Override
public JPanel createGlassPane() {
JPanel result = new JPanel(new GridBagLayout());
registerInputBlockers(result);
result.setBackground(LOADING_PANEL_BCKG);
result.setOpaque(false);
TextWithCancelPanel panel = new TextWithCancelPanel(loadingCaption, cancelTask);
panel.setOpaque(true);
panel.setBackground(LOADING_PANEL_BASE_BCKG);
JLabel loadingLabel = panel.getPanelTextComponent();
Font font = loadingLabel.getFont().deriveFont(24.0f);
loadingLabel.setBackground(LOADING_PANEL_BCKG);
loadingLabel.setFont(font);
loadingLabel.setHorizontalAlignment(SwingConstants.CENTER);
loadingLabel.setHorizontalTextPosition(SwingConstants.CENTER);
loadingLabel.setVerticalTextPosition(SwingConstants.CENTER);
result.add(panel, new GridBagConstraints());
return result;
}
};
}
public static DelayedGlassPane delayGlassPane(GlassPaneFactory mainGlassPane) {
return new DelayedGlassPane(invisibleGlassPane(), mainGlassPane, 200, TimeUnit.MILLISECONDS);
}
public static GlassPaneFactory loadingPanel(String loadingCaption) {
return loadingPanel(loadingCaption, null);
}
public static DelayedGlassPane delayedLoadingPanel(String loadingCaption, CancellationController cancelTask) {
ExceptionHelper.checkNotNullArgument(cancelTask, "cancelTask");
return delayGlassPane(loadingPanel(loadingCaption, cancelTask));
}
public static DelayedGlassPane delayedLoadingPanel(String loadingCaption) {
return delayGlassPane(loadingPanel(loadingCaption, null));
}
private static Color toTransparent(Color color) {
int transparency = 0x80;
return new Color((color.getRGB() & 0x00FF_FFFF) | (transparency << 24), true);
}
private GlassPanes() {
throw new AssertionError();
}
}