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