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.
215 lines
6.7 KiB
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; |
|
} |
|
|
|
}
|
|
|