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.

184 lines
5.8 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;
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;
}
}