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.

127 lines
4.5 KiB

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<FormDesigner> {
// 组件树
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;
}
}