|
|
|
package com.fr.plugin.event.manager.ui;
|
|
|
|
|
|
|
|
import com.fr.design.dialog.BasicPane;
|
|
|
|
import com.fr.design.gui.icontainer.UIScrollPane;
|
|
|
|
import com.fr.design.gui.ilable.UILabel;
|
|
|
|
import com.fr.design.layout.FRGUIPaneFactory;
|
|
|
|
import com.fr.design.utils.gui.GUICoreUtils;
|
|
|
|
import com.fr.design.widget.FRWidgetFactory;
|
|
|
|
import com.fr.design.widget.WidgetEventPane;
|
|
|
|
import com.fr.design.widget.WidgetEventPaneNoPop;
|
|
|
|
import com.fr.form.event.Listener;
|
|
|
|
import com.fr.form.ui.Widget;
|
|
|
|
import com.fr.plugin.event.manager.data.MyTree;
|
|
|
|
import com.fr.plugin.event.manager.data.MyWidget;
|
|
|
|
import com.fr.plugin.event.manager.ui.tree.MyComponentTree;
|
|
|
|
|
|
|
|
import javax.swing.BorderFactory;
|
|
|
|
import javax.swing.JPanel;
|
|
|
|
import javax.swing.JSplitPane;
|
|
|
|
import javax.swing.SwingConstants;
|
|
|
|
import javax.swing.event.TreeSelectionEvent;
|
|
|
|
import javax.swing.event.TreeSelectionListener;
|
|
|
|
import java.awt.BorderLayout;
|
|
|
|
import java.awt.Component;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 事件配置面板,左边为组件树,右边为无/事件编辑面板
|
|
|
|
* @author Joe
|
|
|
|
* Created by Joe on 12/11/2020
|
|
|
|
*/
|
|
|
|
public class EventConfigPane extends BasicPane implements TreeSelectionListener {
|
|
|
|
private MyTree tree;
|
|
|
|
private MyTree lastNode;
|
|
|
|
private boolean rootVisible;
|
|
|
|
|
|
|
|
//事件属性容器
|
|
|
|
private JPanel rightPane;
|
|
|
|
private WidgetEventPane eventPane;
|
|
|
|
private UILabel emptyLabel;
|
|
|
|
|
|
|
|
public EventConfigPane(MyTree tree) {
|
|
|
|
this(tree, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
public EventConfigPane(MyTree tree, boolean rootVisible) {
|
|
|
|
this.tree = tree;
|
|
|
|
this.rootVisible = rootVisible;
|
|
|
|
this.initComponentPane();
|
|
|
|
}
|
|
|
|
|
|
|
|
public MyTree getTree() {
|
|
|
|
return tree;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setTree(MyTree tree) {
|
|
|
|
this.tree = tree;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isRootVisible() {
|
|
|
|
return rootVisible;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setRootVisible(boolean rootVisible) {
|
|
|
|
this.rootVisible = rootVisible;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void initComponentPane() {
|
|
|
|
this.setLayout(FRGUIPaneFactory.createBorderLayout());
|
|
|
|
initRightPane();
|
|
|
|
// SplitPane
|
|
|
|
// 增加边框
|
|
|
|
JSplitPane mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, getLeftPane(), rightPane);
|
|
|
|
mainSplitPane.setBorder(BorderFactory.createLineBorder(GUICoreUtils.getTitleLineBorderColor()));
|
|
|
|
mainSplitPane.setOneTouchExpandable(true);
|
|
|
|
|
|
|
|
this.add(mainSplitPane, BorderLayout.CENTER);
|
|
|
|
// todo 考虑是否弹性
|
|
|
|
mainSplitPane.setDividerLocation(230);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void initRightPane() {
|
|
|
|
rightPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
|
|
|
|
rightPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 10));
|
|
|
|
eventPane = new WidgetEventPaneNoPop(null);
|
|
|
|
emptyLabel = new UILabel("当前组件没有设置过事件");
|
|
|
|
emptyLabel.setHorizontalAlignment(SwingConstants.CENTER);
|
|
|
|
rightPane.add(emptyLabel, BorderLayout.CENTER);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void refreshRightPane(Component component) {
|
|
|
|
rightPane.removeAll();
|
|
|
|
rightPane.repaint();
|
|
|
|
rightPane.add(component, BorderLayout.CENTER);
|
|
|
|
rightPane.revalidate();
|
|
|
|
}
|
|
|
|
|
|
|
|
private JPanel getLeftPane() {
|
|
|
|
JPanel leftPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
|
|
|
|
// 存放组件树
|
|
|
|
JPanel leftContentPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
|
|
|
|
initLeftContentPane(leftContentPane);
|
|
|
|
leftPane.add(leftContentPane, BorderLayout.CENTER);
|
|
|
|
// 左上方 items with event
|
|
|
|
JPanel leftTopPane = getLeftTopPane();
|
|
|
|
leftTopPane.setBorder(BorderFactory.createEmptyBorder(0, 6, 6, 0));
|
|
|
|
leftPane.add(leftTopPane, BorderLayout.NORTH);
|
|
|
|
return leftPane;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void initLeftContentPane(JPanel leftContentPane) {
|
|
|
|
MyComponentTree componentTree = new MyComponentTree(tree, EventConfigPane.this, rootVisible);
|
|
|
|
UIScrollPane scrollPane = new UIScrollPane(componentTree);
|
|
|
|
// 把树添加到滚动框中
|
|
|
|
leftContentPane.add(scrollPane, BorderLayout.CENTER);
|
|
|
|
}
|
|
|
|
|
|
|
|
private JPanel getLeftTopPane() {
|
|
|
|
JPanel leftTopPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
|
|
|
|
leftTopPane.add(FRWidgetFactory.createLineWrapLabel("Items with Event"), BorderLayout.CENTER);
|
|
|
|
return leftTopPane;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected String title4PopupWindow() {
|
|
|
|
return "event config";
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 树节点的点击响应事件
|
|
|
|
*
|
|
|
|
* @param e
|
|
|
|
*/
|
|
|
|
@Override
|
|
|
|
public void valueChanged(TreeSelectionEvent e) {
|
|
|
|
// 先更新下事件
|
|
|
|
update();
|
|
|
|
MyComponentTree componentTree = (MyComponentTree) e.getSource();
|
|
|
|
MyTree tree = (MyTree) componentTree.getLastSelectedPathComponent();
|
|
|
|
lastNode = tree;
|
|
|
|
if (hasEvent(tree)) {
|
|
|
|
Widget widget = ((MyWidget) tree.getData()).getWidget();
|
|
|
|
refreshRightPane(eventPane);
|
|
|
|
populate(widget);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
refreshRightPane(emptyLabel);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 判断节点是否是一个含有事件的控件
|
|
|
|
*
|
|
|
|
* @param tree
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
private boolean hasEvent(MyTree tree) {
|
|
|
|
if (tree != null && tree.getData() instanceof MyWidget) {
|
|
|
|
MyWidget myWidget = (MyWidget) tree.getData();
|
|
|
|
if (myWidget != null) {
|
|
|
|
Widget widget = myWidget.getWidget();
|
|
|
|
return widget != null && widget.getListenerSize() > 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void populate(Widget widget) {
|
|
|
|
eventPane.populate(widget);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void update() {
|
|
|
|
if (hasEvent(lastNode)) {
|
|
|
|
Widget lastNodeWidget = ((MyWidget) lastNode.getData()).getWidget();
|
|
|
|
Listener[] listener = eventPane.updateListeners();
|
|
|
|
lastNodeWidget.clearListeners();
|
|
|
|
for (Listener l : listener) {
|
|
|
|
lastNodeWidget.addListener(l);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 退出窗口时清空lastNode
|
|
|
|
lastNode = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|