diff --git a/designer_form/src/com/fr/design/mainframe/ComponentTree.java b/designer_form/src/com/fr/design/mainframe/ComponentTree.java index ab1f2a980f..a3452f602f 100644 --- a/designer_form/src/com/fr/design/mainframe/ComponentTree.java +++ b/designer_form/src/com/fr/design/mainframe/ComponentTree.java @@ -1,303 +1,255 @@ -package com.fr.design.mainframe.widget; - -/** - * Created by xiaxiang on 2016/9/30. - */ -import java.awt.*; -import java.awt.event.*; -import javax.swing.*; -import javax.swing.plaf.*; -import javax.swing.plaf.basic.*; -import javax.swing.plaf.metal.*; -import javax.swing.tree.*; - -import com.fr.design.designer.beans.*; +package com.fr.design.mainframe; + +import java.awt.Component; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.ArrayList; + +import javax.swing.DropMode; +import javax.swing.JPopupMenu; +import javax.swing.JTree; +import javax.swing.tree.TreePath; +import javax.swing.tree.TreeSelectionModel; + +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.DesignerEvent; -import com.fr.design.designer.creator.XCreator; -import com.fr.design.gui.icontainer.UIScrollPane; -import com.fr.design.mainframe.ComponentTree; -import com.sun.java.swing.plaf.motif.*; -import com.sun.java.swing.plaf.windows.*; - -/** - * 控件树下拉列表框 - */ -public class UITreeComboBox extends JComboBox{ - /** - * 显示用的树 - */ - private ComponentTree tree; - - public UITreeComboBox(ComponentTree componentTree){ - this.setTree(componentTree); - tree.getDesigner().addDesignerEditListener(new TreeComboBoxDesignerEditAdapter()); -// for(int i=0; iTitle: UITreeComboBoxRenderer

- *

Description: 树形结构而来的DefaultListCellRenderer

+ * 刷新 */ - class UITreeComboBoxRenderer extends DefaultListCellRenderer { - 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); - } + public void refreshUI() { + updateUI(); } - 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(); - } - } - @Override - public boolean equals(Object o) { - return o.getClass() == this.getClass(); + + public TreePath[] getSelectedTreePath() { + XCreator[] creators = designer.getSelectionModel().getSelection().getSelectedCreators(); + TreePath[] paths = new TreePath[creators.length]; + + for (int i = 0; i < paths.length; i++) { + paths[i] = buildTreePath(creators[i]); } + 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); -// } -} - -/** - *

Title: UITreeComboBox

- *

Description: TreePopup

- */ -class TreePopup extends JPopupMenu implements ComboPopup{ - protected UITreeComboBox comboBox; - 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; + /** + *搜索指定名称的路径 + * + * @param text 名称 + * @return 树路径 + */ + public TreePath[] search(String text) { + if (StringUtils.isNotEmpty(text)) { + text = text.toLowerCase(); } - 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()); - } + ArrayList searchList = new ArrayList(); + XLayoutContainer root = designer.getRootComponent(); + searchFormRoot(root, searchList, text); + TreePath[] paths = new TreePath[searchList.size()]; - 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); + for (int i = 0; i < paths.length; i++) { + paths[i] = buildTreePath(searchList.get(i)); + } + if(paths.length > 0) { + setAndScrollSelectionPath(paths[0]); + } else { + setSelectionPath(); } + return paths; } - public void show() { - updatePopup(); - show(comboBox, 0, comboBox.getHeight()); - comboBox.getTree().requestFocus(); - } - public void hide(){ - setVisible(false); - comboBox.firePropertyChange("popupVisible", true, false); - } + private void setSelectionPath(){ - protected JList list = new JList(); - public JList getList(){ - return list; + /** + * 不让传null参数,所以只有自己定义 + */ + super.setSelectionPath(null); + clearSelection(); } - public MouseMotionListener getMouseMotionListener(){ - if(mouseMotionListener == null){ - mouseMotionListener = new MouseMotionAdapter(){}; + private void searchFormRoot(XLayoutContainer container, ArrayList searchList, String text) { + if (StringUtils.isEmpty(text)) { + return; + } + for (int i = 0, size = container.getXCreatorCount(); i < size; i++) { + XCreator creator = container.getXCreator(i); + String xName = creator.toData().getWidgetName(); + if (xName.toLowerCase().contains(text)) { + searchList.add(creator); + } + if (creator instanceof XLayoutContainer) { + searchFormRoot((XLayoutContainer) creator, searchList, text); + } } - return mouseMotionListener; - } - - public KeyListener getKeyListener(){ - return null; } - public void uninstallingUI(){} - /** - * Implementation of ComboPopup.getMouseListener(). - * - * @return a MouseListener or null - * @see ComboPopup#getMouseListener + * 触发 */ - public MouseListener getMouseListener(){ - if(mouseListener == null){ - mouseListener = new InvocationMouseHandler(); - } - return mouseListener; - } - - protected void togglePopup(){ - if(isVisible()){ - 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); - } + public void fireTreeChanged() { + designer.refreshDesignerUI(); } - protected class InvocationMouseHandler extends MouseAdapter{ - public void mousePressed(MouseEvent e){ - if(!SwingUtilities.isLeftMouseButton(e) || !comboBox.isEnabled()){ - return; - } - if(comboBox.isEditable()){ - Component comp = comboBox.getEditor().getEditorComponent(); - if((!(comp instanceof JComponent)) || - ((JComponent)comp).isRequestFocusEnabled()){ - comp.requestFocus(); - } - } else if(comboBox.isRequestFocusEnabled()){ - comboBox.requestFocus(); + /** + * 刷新 + */ + 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 path = new ArrayList(); + Component parent = comp; + + while (parent != null) { + XCreator creator = (XCreator) parent; + path.add(0, parent); + if (creator != comp ) { + creator.notShowInComponentTree(path); } - togglePopup(); - } - - public void mouseClicked (MouseEvent e){ - if (e.isMetaDown()) { - popupMenu(e); - } else { - return; + //绝对布局作为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); } - - - -} +} \ No newline at end of file