帆软报表设计器源代码。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

293 lines
8.0 KiB

package com.fine.component.popup;
import javax.swing.JLayeredPane;
import javax.swing.JRootPane;
import javax.swing.SwingUtilities;
import java.awt.CardLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Window;
import java.awt.event.MouseAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
/**
* 遮罩功能: 遮罩面板管理器
*
* @author Levy.Xie
* @since 12.0
* Created on 2024/12/12
*/
public class GlassPopupManager {
private static GlassPopupManager instance;
protected WindowSnapshots windowSnapshots;
protected JLayeredPane layerPane;
protected Container contentPane;
private GlassPopupManager() {
init();
}
private void init() {
layerPane = new JLayeredPane();
layerPane.setLayout(new CardLayout());
}
/**
* 添加并显示弹窗组件
*
* @param component 组件
* @param name 组件名
*/
protected void addAndShowPopup(GlassPaneChild component, String name) {
GlassPopup popup = new GlassPopup(this, component);
instance.layerPane.applyComponentOrientation(instance.contentPane.getComponentOrientation());
popup.applyComponentOrientation(instance.contentPane.getComponentOrientation());
if (name != null) {
popup.setName(name);
}
layerPane.setLayer(popup, JLayeredPane.DRAG_LAYER);
layerPane.add(popup, 0);
popup.setVisible(true);
popup.setShowPopup(true);
if (!layerPane.isVisible()) {
layerPane.setVisible(true);
}
layerPane.grabFocus();
}
private void updateLayout() {
for (Component com : layerPane.getComponents()) {
com.revalidate();
}
}
/**
* 设置遮罩父窗口
*
* @param container 遮罩父容器
*/
public static void install(Container container) {
instance = new GlassPopupManager();
Window window;
if (container instanceof Window) {
window = (Window) container;
} else {
window = SwingUtilities.getWindowAncestor(container);
}
instance.windowSnapshots = new WindowSnapshots(window);
window.addWindowStateListener(new WindowAdapter() {
@Override
public void windowStateChanged(WindowEvent e) {
SwingUtilities.invokeLater(() -> {
instance.updateLayout();
});
}
});
JRootPane rootPane = SwingUtilities.getRootPane(container);
instance.contentPane = rootPane.getContentPane();
rootPane.setGlassPane(instance.layerPane);
}
/**
* 显示组件
*
* @param component 组件
* @param name 组件名
*/
public static void showPopup(GlassPaneChild component, String name) {
if (component.getMouseListeners().length == 0) {
component.addMouseListener(new MouseAdapter() {
});
}
instance.addAndShowPopup(component, name);
}
/**
* 显示组件
*
* @param component 组件
*/
public static void showPopup(GlassPaneChild component) {
showPopup(component, null);
}
/**
* 压栈放入弹窗组件
*
* @param component 组件
* @param name 组件名
*/
public static void push(GlassPaneChild component, String name) {
for (Component com : instance.layerPane.getComponents()) {
if (com.getName() != null && com.getName().equals(name)) {
if (com instanceof GlassPopup) {
GlassPopup popup = (GlassPopup) com;
popup.getComponentLayer().pushComponent(component);
break;
}
}
}
}
/**
* 出栈弹出弹窗组件
*
* @param name 组件名
*/
public static void pop(String name) {
for (Component com : instance.layerPane.getComponents()) {
if (com.getName() != null && com.getName().equals(name)) {
if (com instanceof GlassPopup) {
GlassPopup popup = (GlassPopup) com;
popup.getComponentLayer().popComponent();
break;
}
}
}
}
/**
* 出栈弹出弹窗组件
*
* @param component 组件
*/
public static void pop(Component component) {
for (Component com : instance.layerPane.getComponents()) {
if (com instanceof GlassPopup) {
GlassPopup popup = (GlassPopup) com;
if (popup.getComponent() == component) {
popup.getComponentLayer().popComponent();
}
}
}
}
/**
* 基于序号关闭弹窗组件
*
* @param index 序号
*/
public static void closePopup(int index) {
index = instance.layerPane.getComponentCount() - 1 - index;
if (index >= 0 && index < instance.layerPane.getComponentCount()) {
if (instance.layerPane.getComponent(index) instanceof GlassPopup) {
GlassPopup popup = (GlassPopup) instance.layerPane.getComponent(index);
popup.setShowPopup(false);
}
}
}
/**
* 基于名称关闭组件
*
* @param name 组件名称
*/
public static void closePopup(String name) {
for (Component com : instance.layerPane.getComponents()) {
if (com.getName() != null && com.getName().equals(name)) {
if (com instanceof GlassPopup) {
GlassPopup popup = (GlassPopup) com;
popup.setShowPopup(false);
}
}
}
}
/**
* 关闭组件
*
* @param component 组件
*/
public static void closePopup(Component component) {
for (Component com : instance.layerPane.getComponents()) {
if (com instanceof GlassPopup) {
GlassPopup popup = (GlassPopup) com;
if (popup.getComponent() == component) {
popup.setShowPopup(false);
}
}
}
}
/**
* 关闭最后一个组件
*/
public static void closePopupLast() {
closePopup(getPopupCount() - 1);
}
/**
* 关闭全部组件
*/
public static void closePopupAll() {
for (Component com : instance.layerPane.getComponents()) {
if (com instanceof GlassPopup) {
GlassPopup popup = (GlassPopup) com;
popup.setShowPopup(false);
}
}
}
/**
* 基于组件名判断组件是否显示
*
* @param name 组件名
* @return 是否显示
*/
public static boolean isShowing(String name) {
boolean act = false;
for (Component com : instance.layerPane.getComponents()) {
if (com.getName() != null && com.getName().equals(name)) {
act = true;
break;
}
}
return act;
}
/**
* 判断组件是否显示
*
* @param component 组件
* @return 是否显示
*/
public static boolean isShowing(Component component) {
boolean act = false;
for (Component com : instance.layerPane.getComponents()) {
if (com instanceof GlassPopup) {
GlassPopup popup = (GlassPopup) com;
if (popup.getComponent() == component) {
act = true;
break;
}
}
}
return act;
}
/**
* 获取弹窗组件数量
*
* @return 弹窗数量
*/
public static int getPopupCount() {
return instance.layerPane.getComponentCount();
}
/**
* 移除组件
*
* @param popup 弹窗组件
*/
protected synchronized void removePopup(Component popup) {
layerPane.remove(popup);
if (layerPane.getComponentCount() == 0) {
layerPane.setVisible(false);
}
}
}