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