|
|
|
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;
|
|
|
|
|
|
|
|
// lastNode用来保存最新一个操作过的树节点
|
|
|
|
private MyTree lastNode;
|
|
|
|
private boolean rootVisible;
|
|
|
|
|
|
|
|
private MyComponentTree componentTree;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 事件编辑容器
|
|
|
|
*/
|
|
|
|
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;
|
|
|
|
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() {
|
|
|
|
setLayout(FRGUIPaneFactory.createBorderLayout());
|
|
|
|
setBorder(BorderFactory.createEmptyBorder(4, 8, 4, 8));
|
|
|
|
initRightPane();
|
|
|
|
// SplitPane
|
|
|
|
JSplitPane mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, getLeftPane(), rightPane);
|
|
|
|
mainSplitPane.setBorder(BorderFactory.createLineBorder(GUICoreUtils.getTitleLineBorderColor()));
|
|
|
|
mainSplitPane.setOneTouchExpandable(true);
|
|
|
|
|
|
|
|
add(mainSplitPane, BorderLayout.CENTER);
|
|
|
|
mainSplitPane.setDividerLocation(180);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 当切换sheet/tab时触发,更新组件树,右边为默认的空提示
|
|
|
|
*/
|
|
|
|
public void refreshUI() {
|
|
|
|
componentTree.refreshTree();
|
|
|
|
refreshRightPane(emptyLabel);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 初始化右边的面板,默认是一个空提示
|
|
|
|
*/
|
|
|
|
private void initRightPane() {
|
|
|
|
rightPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
|
|
|
|
eventPane = new WidgetEventPaneNoPop(null);
|
|
|
|
eventPane.setBorder(BorderFactory.createEmptyBorder());
|
|
|
|
emptyLabel = new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Plugin_Event_Manager_Config_Right_Tip"));
|
|
|
|
emptyLabel.setHorizontalAlignment(SwingConstants.CENTER);
|
|
|
|
rightPane.add(emptyLabel, BorderLayout.CENTER);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 刷新右边的面板,可能生成一个空提示,也可能生成一个事件编辑面板
|
|
|
|
*
|
|
|
|
* @param component
|
|
|
|
*/
|
|
|
|
private void refreshRightPane(Component component) {
|
|
|
|
rightPane.removeAll();
|
|
|
|
rightPane.repaint();
|
|
|
|
rightPane.add(component, BorderLayout.CENTER);
|
|
|
|
rightPane.revalidate();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 创建左边的面板,里面放组件树
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
private JPanel getLeftPane() {
|
|
|
|
JPanel leftPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
|
|
|
|
// 存放组件树
|
|
|
|
JPanel leftContentPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
|
|
|
|
initLeftContentPane(leftContentPane);
|
|
|
|
leftPane.add(leftContentPane, BorderLayout.CENTER);
|
|
|
|
// 左上方文字
|
|
|
|
JPanel leftTopPane = getLeftTopPane();
|
|
|
|
leftTopPane.setBorder(BorderFactory.createEmptyBorder(0, 5, 5, 0));
|
|
|
|
leftPane.add(leftTopPane, BorderLayout.NORTH);
|
|
|
|
return leftPane;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 初始化组件树父面板
|
|
|
|
* @param leftContentPane
|
|
|
|
*/
|
|
|
|
private void initLeftContentPane(JPanel leftContentPane) {
|
|
|
|
componentTree = new MyComponentTree(this, rootVisible);
|
|
|
|
UIScrollPane scrollPane = new UIScrollPane(componentTree);
|
|
|
|
leftContentPane.add(scrollPane, BorderLayout.CENTER);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 创建左上方的文字提示
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
private JPanel getLeftTopPane() {
|
|
|
|
JPanel leftTopPane = FRGUIPaneFactory.createBorderLayout_S_Pane();
|
|
|
|
leftTopPane.add(FRWidgetFactory.createLineWrapLabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Plugin_Event_Manager_Config_Left_Title")), BorderLayout.CENTER);
|
|
|
|
return leftTopPane;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
protected String title4PopupWindow() {
|
|
|
|
return com.fr.design.i18n.Toolkit.i18nText("Fine-Plugin_Event_Manager_Config_Title");
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 树节点的点击响应事件
|
|
|
|
* @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);
|
|
|
|
eventPane.populate(widget);
|
|
|
|
} else {
|
|
|
|
// 否则右侧为空提示
|
|
|
|
refreshRightPane(emptyLabel);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 更新事件的方法,基本上需要更新的地方都最终会到这个方法来
|
|
|
|
*/
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 判断树节点是否有事件
|
|
|
|
*
|
|
|
|
* @param myTree
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
private boolean hasEvent(MyTree myTree) {
|
|
|
|
if (myTree != null && myTree.getData() instanceof MyWidget) {
|
|
|
|
return ((MyWidget) myTree.getData()).isHasEvent();
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|