xiaoxia 8 years ago
parent
commit
5a77fe8ee6
  1. 434
      designer_form/src/com/fr/design/mainframe/ComponentTree.java

434
designer_form/src/com/fr/design/mainframe/ComponentTree.java

@ -1,255 +1,303 @@
package com.fr.design.mainframe; package com.fr.design.mainframe.widget;
import java.awt.Component; /**
import java.awt.event.MouseAdapter; * Created by xiaxiang on 2016/9/30.
import java.awt.event.MouseEvent; */
import java.util.ArrayList; import java.awt.*;
import java.awt.event.*;
import javax.swing.DropMode; import javax.swing.*;
import javax.swing.JPopupMenu; import javax.swing.plaf.*;
import javax.swing.JTree; import javax.swing.plaf.basic.*;
import javax.swing.tree.TreePath; import javax.swing.plaf.metal.*;
import javax.swing.tree.TreeSelectionModel; import javax.swing.tree.*;
import com.fr.design.constants.UIConstants; import com.fr.design.designer.beans.*;
import com.fr.design.designer.beans.AdapterBus;
import com.fr.design.designer.beans.ComponentAdapter;
import com.fr.design.designer.beans.events.DesignerEditListener; import com.fr.design.designer.beans.events.DesignerEditListener;
import com.fr.design.designer.beans.events.DesignerEvent; import com.fr.design.designer.beans.events.DesignerEvent;
import com.fr.design.designer.creator.*; import com.fr.design.designer.creator.XCreator;
import com.fr.design.designer.treeview.ComponentTreeCellRenderer; import com.fr.design.gui.icontainer.UIScrollPane;
import com.fr.design.designer.treeview.ComponentTreeModel; import com.fr.design.mainframe.ComponentTree;
import com.fr.stable.StringUtils; import com.sun.java.swing.plaf.motif.*;
import com.sun.java.swing.plaf.windows.*;
public class ComponentTree extends JTree {
/**
private FormDesigner designer; * 控件树下拉列表框
private ComponentTreeModel model; */
public class UITreeComboBox extends JComboBox{
public ComponentTree(FormDesigner designer) { /**
this.designer = designer; * 显示用的树
this.setBackground(UIConstants.NORMAL_BACKGROUND); */
setRootVisible(true); private ComponentTree tree;
setCellRenderer(new ComponentTreeCellRenderer());
getSelectionModel().setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION); public UITreeComboBox(ComponentTree componentTree){
this.setDragEnabled(false); this.setTree(componentTree);
this.setDropMode(DropMode.ON_OR_INSERT); tree.getDesigner().addDesignerEditListener(new TreeComboBoxDesignerEditAdapter());
this.setTransferHandler(new TreeTransferHandler()); // for(int i=0; i<tree.getRowCount(); i++)
this.refreshTreeRoot(); // {
addTreeSelectionListener(designer); // tree.expandRow(i);
// this.addMouseListener(new MouseAdapter() {
//
// @Override
// public void mouseClicked(MouseEvent e) {
// if (e.isPopupTrigger()) {
// popupMenu(e);
// }
// }
//
// @Override
// public void mousePressed(MouseEvent e) {
// if (e.isPopupTrigger()) {
// popupMenu(e);
// }
// }
//
// @Override
// public void mouseReleased(MouseEvent e) {
// if (e.isPopupTrigger()) {
// popupMenu(e);
// }
// } // }
// }); setPreferredSize(new Dimension(200, 20));
setEditable(true);
}
public FormDesigner getDesigner() {
return designer;
} }
/** /**
* 构造函数 * 设置树
* * @param tree ComponentTree
* @param designer 设计界面组件
* @param model 构造JTree的model
*/ */
public ComponentTree(FormDesigner designer,ComponentTreeModel model) { public void setTree(ComponentTree tree){
this(designer); this.tree = tree;
this.setModel(model); if(tree != null){
this.setSelectedItem(tree.getSelectionPath());
this.setRenderer(new UITreeComboBoxRenderer());
}
this.updateUI();
} }
/** /**
* 是否可编辑 * 取得树
* @param path 树路径 * @return JTree
* @return 是则返回true
*/ */
@Override public ComponentTree getTree(){
public boolean isPathEditable(TreePath path) { return tree;
Object object = path.getLastPathComponent();
if (object == designer.getRootComponent()) {
return false;
}
return super.isPathEditable(path);
} }
/** /**
* 将值转换为文本 * 设置当前选择的树路径
* @param value * @param o Object
* @param selected 是否选中
* @param expanded 扩展
* @param leaf 是否叶子
* @param row
* @param hasFocus 是否焦点
*
* @return 返回文本
*/ */
@Override public void setSelectedItem(Object o){
public String convertValueToText(Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { tree.setSelectionPath((TreePath)o);
if (value != null && value instanceof XCreator) { getModel().setSelectedItem(o);
return ((XCreator) value).toData().getWidgetName(); }
public void updateUI(){
ComboBoxUI cui = (ComboBoxUI)UIManager.getUI(this);
if(cui instanceof MetalComboBoxUI){
cui = new MetalJTreeComboBoxUI();
} else if(cui instanceof MotifComboBoxUI){
cui = new MotifJTreeComboBoxUI();
} else { } else {
return super.convertValueToText(value, selected, expanded, leaf, row, hasFocus); cui = new WindowsJTreeComboBoxUI();
} }
setUI(cui);
} }
public void setAndScrollSelectionPath(TreePath treepath) { // UI Inner classes -- one for each supported Look and Feel
setSelectionPath(treepath); class MetalJTreeComboBoxUI extends MetalComboBoxUI{
scrollPathToVisible(treepath); protected ComboPopup createPopup() {
return new TreePopup(comboBox);
}
}
class WindowsJTreeComboBoxUI extends WindowsComboBoxUI{
protected ComboPopup createPopup() {
return new TreePopup(comboBox);
}
}
class MotifJTreeComboBoxUI extends MotifComboBoxUI{
protected ComboPopup createPopup() {
return new TreePopup(comboBox);
}
} }
// private void popupMenu(MouseEvent e) {
// TreePath path = this.getSelectionPath();
// if (path == null) {
// return;
// }
// Component component = (Component) path.getLastPathComponent();
// if (!(component instanceof XCreator)) {
// return;
// }
// ComponentAdapter adapter = AdapterBus.getComponentAdapter(designer, (XCreator) component);
// JPopupMenu menu = adapter.getContextPopupMenu(e);
// menu.show(this, e.getX(), e.getY());
// }
/** /**
* 刷新 * <p>Title: UITreeComboBoxRenderer</p>
* <p>Description: 树形结构而来的DefaultListCellRenderer </p>
*/ */
public void refreshUI() { class UITreeComboBoxRenderer extends DefaultListCellRenderer {
updateUI(); public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus){
if(tree != null && tree.getSelectedTreePath().length > 0){
TreePath path = tree.getSelectedTreePath()[0];
tree.setAndScrollSelectionPath(path);
Object node = path.getLastPathComponent();
value = node;
TreeCellRenderer r = tree.getCellRenderer();
JLabel lb = (JLabel)r.getTreeCellRendererComponent(
tree, value, isSelected, false, false, index,
cellHasFocus);
return lb;
}
return super.getListCellRendererComponent(list, value, index,
isSelected, cellHasFocus);
}
} }
private class TreeComboBoxDesignerEditAdapter implements DesignerEditListener {
@Override
public void fireCreatorModified(DesignerEvent evt) {
if (evt.getCreatorEventID() == DesignerEvent.CREATOR_SELECTED) {
TreePath[] paths = tree.getSelectedTreePath();
if (tree != null && paths.length > 0) {
tree.setAndScrollSelectionPath(paths[0]);
setSelectedItem(paths[0]);
MenuSelectionManager.defaultManager().clearSelectedPath();
}
} else if (evt.getCreatorEventID() == DesignerEvent.CREATOR_PASTED) {
tree.refreshUI();
TreePath[] paths = tree.getSelectedTreePath();
if (tree != null && paths.length > 0) {
tree.setAndScrollSelectionPath(paths[0]);
setSelectedItem(paths[0]);
MenuSelectionManager.defaultManager().clearSelectedPath();
}
} else if (evt.getCreatorEventID() == DesignerEvent.CREATOR_CUTED) {
tree.refreshUI();
setSelectedItem(null);
MenuSelectionManager.defaultManager().clearSelectedPath();
} else {
tree.refreshUI();
repaint();
}
public TreePath[] getSelectedTreePath() { }
XCreator[] creators = designer.getSelectionModel().getSelection().getSelectedCreators();
TreePath[] paths = new TreePath[creators.length];
for (int i = 0; i < paths.length; i++) { @Override
paths[i] = buildTreePath(creators[i]); public boolean equals(Object o) {
return o.getClass() == this.getClass();
} }
return paths;
} }
/**
* 测试
*/
// public static void main(String args[]){
// JFrame frame = new JFrame("UITreeComboBox");
// final UITreeComboBox box = new UITreeComboBox(new ComponentTree(new FormDesigner()));
// box.setPreferredSize(new Dimension(300, 28));
// frame.getContentPane().add(box);
// frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// frame.pack();
// frame.setVisible(true);
// }
}
/**
* <p>Title: UITreeComboBox</p>
* <p>Description: TreePopup</p>
*/
class TreePopup extends JPopupMenu implements ComboPopup{
protected UITreeComboBox comboBox;
protected JScrollPane scrollPane;
protected MouseMotionListener mouseMotionListener;
protected MouseListener mouseListener;
/**
*搜索指定名称的路径
*
* @param text 名称
* @return 树路径
*/
public TreePath[] search(String text) {
if (StringUtils.isNotEmpty(text)) {
text = text.toLowerCase();
}
ArrayList<XCreator> searchList = new ArrayList<XCreator>();
XLayoutContainer root = designer.getRootComponent();
searchFormRoot(root, searchList, text);
TreePath[] paths = new TreePath[searchList.size()];
for (int i = 0; i < paths.length; i++) { public void popupMenu(MouseEvent e) {
paths[i] = buildTreePath(searchList.get(i)); TreePath path = comboBox.getTree().getSelectionPath();
if (path == null) {
return;
} }
if(paths.length > 0) { Component component = (Component) path.getLastPathComponent();
setAndScrollSelectionPath(paths[0]); if (!(component instanceof XCreator)) {
} else { return;
setSelectionPath();
} }
return paths; com.fr.design.designer.beans.ComponentAdapter adapter = AdapterBus.getComponentAdapter(comboBox.getTree().getDesigner(), (XCreator) component);
JPopupMenu menu = adapter.getContextPopupMenu(e);
menu.show(comboBox, e.getX(), e.getY());
} }
public TreePopup(JComboBox comboBox){
private void setSelectionPath(){ this.comboBox = (UITreeComboBox)comboBox;
setLayout(new BorderLayout());
/** setLightWeightPopupEnabled(comboBox.isLightWeightPopupEnabled());
* 不让传null参数所以只有自己定义 JTree tree = this.comboBox.getTree();
*/ if(tree != null){
super.setSelectionPath(null); scrollPane = new UIScrollPane(tree);
clearSelection(); scrollPane.setBorder(BorderFactory.createEmptyBorder(0,2,0,0));
add(scrollPane, BorderLayout.CENTER);
}
} }
private void searchFormRoot(XLayoutContainer container, ArrayList<XCreator> searchList, String text) { public void show() {
if (StringUtils.isEmpty(text)) { updatePopup();
return; show(comboBox, 0, comboBox.getHeight());
comboBox.getTree().requestFocus();
} }
for (int i = 0, size = container.getXCreatorCount(); i < size; i++) {
XCreator creator = container.getXCreator(i); public void hide(){
String xName = creator.toData().getWidgetName(); setVisible(false);
if (xName.toLowerCase().contains(text)) { comboBox.firePropertyChange("popupVisible", true, false);
searchList.add(creator);
} }
if (creator instanceof XLayoutContainer) {
searchFormRoot((XLayoutContainer) creator, searchList, text); protected JList list = new JList();
public JList getList(){
return list;
} }
public MouseMotionListener getMouseMotionListener(){
if(mouseMotionListener == null){
mouseMotionListener = new MouseMotionAdapter(){};
} }
return mouseMotionListener;
} }
/** public KeyListener getKeyListener(){
* 触发 return null;
*/
public void fireTreeChanged() {
designer.refreshDesignerUI();
} }
public void uninstallingUI(){}
/** /**
* 刷新 * Implementation of ComboPopup.getMouseListener().
*
* @return a <code>MouseListener</code> or null
* @see ComboPopup#getMouseListener
*/ */
public void refreshTreeRoot() { public MouseListener getMouseListener(){
model = new ComponentTreeModel(designer, designer.getTopContainer()); if(mouseListener == null){
setModel(model); mouseListener = new InvocationMouseHandler();
setDragEnabled(false); }
setDropMode(DropMode.ON_OR_INSERT); return mouseListener;
setTransferHandler(new TreeTransferHandler());
repaint();
} }
private TreePath buildTreePath(Component comp) { protected void togglePopup(){
ArrayList<Component> path = new ArrayList<Component>(); if(isVisible()){
Component parent = comp; hide();
} else{
show();
}
}
protected void updatePopup(){
setPreferredSize(new Dimension(comboBox.getSize().width, 200));
Object selectedObj = comboBox.getSelectedItem();
if(selectedObj != null){
TreePath tp = (TreePath)selectedObj;
((UITreeComboBox)comboBox).getTree().setSelectionPath(tp);
}
}
while (parent != null) { protected class InvocationMouseHandler extends MouseAdapter{
XCreator creator = (XCreator) parent; public void mousePressed(MouseEvent e){
path.add(0, parent); if(!SwingUtilities.isLeftMouseButton(e) || !comboBox.isEnabled()){
if (creator != comp ) { return;
creator.notShowInComponentTree(path); }
if(comboBox.isEditable()){
Component comp = comboBox.getEditor().getEditorComponent();
if((!(comp instanceof JComponent)) ||
((JComponent)comp).isRequestFocusEnabled()){
comp.requestFocus();
}
} else if(comboBox.isRequestFocusEnabled()){
comboBox.requestFocus();
} }
//绝对布局作为body的时候不显示自适应布局父层 togglePopup();
if (((XCreator) parent).acceptType(XWAbsoluteBodyLayout.class) }
&& (parent.getParent() != null)
&& ((XCreator)parent.getParent()).acceptType(XWFitLayout.class)){ public void mouseClicked (MouseEvent e){
parent = parent.getParent().getParent(); if (e.isMetaDown()) {
continue; popupMenu(e);
} else {
return;
} }
parent = parent.getParent();
} }
Object[] components = path.toArray();
return new TreePath(components);
} }
} }
Loading…
Cancel
Save