package com.fr.plugin.event.manager.ui; import com.fr.design.designer.creator.XCreator; import com.fr.design.designer.creator.XLayoutContainer; import com.fr.design.designer.creator.XWAbsoluteBodyLayout; import com.fr.design.designer.creator.XWFitLayout; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.FormDesigner; import com.fr.plugin.event.manager.data.MyTree; import com.fr.plugin.event.manager.data.MyWidget; import javax.swing.JPanel; import java.awt.BorderLayout; import java.awt.Component; /** * 决策报表下的事件管理器面板 * @author Joe * Created by Joe on 12/11/2020 */ public class FormEventManagerPane extends EventManagerPane { // 组件树 private MyTree tree; private final int ABSOLUTE_AS_BODY_NOT_FOUND = -1; /** * 先调用super.initComponents(),执行initData() * 之后tree已经被初始化了 * * @param container */ @Override protected void initComponents(JPanel container) { super.initComponents(container); container.setLayout(FRGUIPaneFactory.createBorderLayout()); eventConfigPane = new EventConfigPane(tree, true); container.add(eventConfigPane, BorderLayout.CENTER); } @Override public void initData(FormDesigner target) { tree = new MyTree(); Component root = target.getTopContainer(); traversalComponent(root); filterWidget(tree); } /** * 当initComponents执行完后调用 */ @Override public void complete() { // do nothing } /** * 遍历生成组件树 * @param root */ private void traversalComponent(Component root) { if (root instanceof XLayoutContainer) { MyWidget rootWidget = new MyWidget((XLayoutContainer) root); // form节点本身 if (rootWidget.getWidget().getListenerSize() > 0) { rootWidget.setHasEvent(true); } tree.setData(rootWidget); for (int i = 0; i < tree.getElementsIndex().size(); i++) { MyTree myTree = tree.getElementsIndex().get(i); XCreator myCreator = ((MyWidget) myTree.getData()).getCreator(); if (!myCreator.isComponentTreeLeaf()) { // 非叶子节点 XLayoutContainer xLayout = (XLayoutContainer) myCreator; for (int j = 0; j < xLayout.getShowXCreatorCount(); j++) { XCreator creator = xLayout.getXCreator(j); int absoluteBodyIndex = getAbsoluteBodyIndex(creator); MyWidget myWidget; // 绝对布局作为body的时候不显示自适应布局父层 if (absoluteBodyIndex > ABSOLUTE_AS_BODY_NOT_FOUND) { myWidget = new MyWidget((XCreator) creator.getComponent(absoluteBodyIndex)); } else { myWidget = new MyWidget(creator.getXCreator()); } if (myWidget.getWidget().getListenerSize() > 0) { myWidget.setHasEvent(true); } myTree.addChild(myWidget); } } } } } /** * 从底向上,如果节点的控件没有事件,就把它删除 * 保留有事件的叶子节点 和 它们的父节点 * * @param tree */ private void filterWidget(MyTree tree) { for (int i = tree.getElementsIndex().size() - 1; i >= 0; i--) { MyTree tempTree = tree.getElementsIndex().get(i); if (tempTree.isLeaf() && tempTree.getData() instanceof MyWidget) { if (!((MyWidget) tempTree.getData()).isHasEvent()) { tree.removeChild(tempTree); } } } } private int getAbsoluteBodyIndex(XCreator xCreator) { //绝对布局作为body,父层是自适应布局,找到绝对布局位于父层的index int index = ABSOLUTE_AS_BODY_NOT_FOUND; if (xCreator.acceptType(XWFitLayout.class)) { XWFitLayout bodyFitLayout = (XWFitLayout) xCreator; for (int i = 0; i < bodyFitLayout.getXCreatorCount(); i++) { //类型是绝对布局并且还是body if (bodyFitLayout.getXCreator(i).acceptType(XWAbsoluteBodyLayout.class)) { index = i; } } } return index; } }