forked from FR-Global/plugin-event-manager
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.
120 lines
4.3 KiB
120 lines
4.3 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; |
|
|
|
@Override |
|
protected void initData(FormDesigner target) { |
|
tree = new MyTree(); |
|
Component root = target.getTopContainer(); |
|
traversalComponent(root); |
|
filterWidget(tree); |
|
} |
|
|
|
@Override |
|
protected void createComponents(JPanel container) { |
|
container.setLayout(FRGUIPaneFactory.createBorderLayout()); |
|
eventConfigPane = new EventConfigPane(tree, true); |
|
container.add(eventConfigPane, BorderLayout.CENTER); |
|
} |
|
|
|
/** |
|
* 当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; |
|
} |
|
|
|
}
|
|
|