/******************************************************************************* * Copyright (c) 2016 Weasis Team and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Nicolas Roduit - initial API and implementation *******************************************************************************/ package org.weasis.core.ui.util; import java.awt.AlphaComposite; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Window; import javax.swing.JComponent; import javax.swing.RootPaneContainer; import javax.swing.Timer; import org.jdesktop.jxlayer.JXLayer; import org.jdesktop.jxlayer.plaf.AbstractLayerUI; import org.weasis.core.api.gui.util.JMVUtils; import org.weasis.core.api.gui.util.WinUtil; @SuppressWarnings("serial") public class ColorLayerUI extends AbstractLayerUI<JComponent> { protected static final float MAX_ALPHA = 0.75f; private final RootPaneContainer parent; protected final JXLayer<JComponent> xlayer; protected volatile float alpha; public ColorLayerUI(final JXLayer<JComponent> comp, RootPaneContainer parent) { if (parent == null || comp == null) { throw new IllegalArgumentException(); } this.parent = parent; this.xlayer = comp; } public static ColorLayerUI createTransparentLayerUI(RootPaneContainer parent) { if (parent != null) { JXLayer<JComponent> layer = new JXLayer(parent.getContentPane()); final ColorLayerUI ui = new ColorLayerUI(layer, parent); layer.setUI(ui); parent.setContentPane(layer); ui.showUI(); return ui; } return null; } public static ColorLayerUI createTransparentLayerUI(Component parent) { if (parent != null) { return createTransparentLayerUI(WinUtil.getRootPaneContainer(parent)); } return null; } public static void showCenterScreen(Window window, ColorLayerUI layer) { Container container = getContentPane(layer); if (container == null) { JMVUtils.showCenterScreen(window); } else { Dimension sSize = container.getSize(); Dimension wSize = window.getSize(); Point p = container.getLocationOnScreen(); window.setLocation(p.x + ((sSize.width - wSize.width) / 2), p.y + ((sSize.height - wSize.height) / 2)); window.setVisible(true); layer.hideUI(); } } @Override protected void paintLayer(final Graphics2D g, final JXLayer<? extends JComponent> comp) { super.paintLayer(g, this.xlayer); g.setColor(comp.getBackground()); g.setComposite(AlphaComposite.SrcOver.derive(alpha * MAX_ALPHA)); g.fillRect(0, 0, comp.getWidth(), comp.getHeight()); } public synchronized void showUI() { this.alpha = 0.0f; final Timer timer = new Timer(3, null); timer.setRepeats(true); timer.addActionListener(e -> { alpha = Math.min(alpha + 0.1f, 1.0F); if (alpha >= 1.0) { timer.stop(); } xlayer.repaint(); }); this.xlayer.repaint(); timer.start(); } public synchronized void hideUI() { this.alpha = 1.0f; final Timer timer = new Timer(3, null); timer.setRepeats(true); timer.addActionListener(e -> { alpha = Math.max(alpha - 0.1f, 0.0F); if (alpha <= 0.0) { timer.stop(); parent.setContentPane(xlayer.getView()); return; } xlayer.repaint(); }); this.xlayer.repaint(); timer.start(); } public JXLayer<JComponent> getXlayer() { return xlayer; } public static Container getContentPane(ColorLayerUI layer) { if (layer != null && layer.parent != null) { return layer.parent.getRootPane(); } return null; } }