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.

215 lines
6.7 KiB

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;
}
}