forked from FR-Global/plugin-event-manager
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
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; |
|
} |
|
|
|
}
|
|
|