xiaoxia 8 years ago
parent
commit
a5e30ec973
  1. 432
      designer_form/src/com/fr/design/mainframe/ComponentTree.java

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

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