diff --git a/designer_form/src/com/fr/design/mainframe/ComponentTree.java b/designer_form/src/com/fr/design/mainframe/ComponentTree.java index fb0586a69..0a268610e 100644 --- a/designer_form/src/com/fr/design/mainframe/ComponentTree.java +++ b/designer_form/src/com/fr/design/mainframe/ComponentTree.java @@ -40,7 +40,7 @@ public class ComponentTree extends JTree { TreePath[] paths = getSelectedTreePath(); addTreeSelectionListener(designer); setSelectionPaths(paths); - + designer.addDesignerEditListener(new TreeDesignerEditAdapter()); this.addMouseListener(new MouseAdapter() { @@ -68,15 +68,19 @@ public class ComponentTree extends JTree { setEditable(true); } + public FormDesigner getDesigner() { + return designer; + } + /** * 构造函数 - * + * * @param designer 设计界面组件 * @param model 构造JTree的model */ public ComponentTree(FormDesigner designer,ComponentTreeModel model) { - this(designer); - this.setModel(model); + this(designer); + this.setModel(model); } @@ -96,17 +100,17 @@ public class ComponentTree extends JTree { return super.isPathEditable(path); } - /** - * 将值转换为文本 - * @param value 值 - * @param selected 是否选中 - * @param expanded 扩展 - * @param leaf 是否叶子 - * @param row 行 - * @param hasFocus 是否焦点 - * - * @return 返回文本 - */ + /** + * 将值转换为文本 + * @param value 值 + * @param selected 是否选中 + * @param expanded 扩展 + * @param leaf 是否叶子 + * @param row 行 + * @param hasFocus 是否焦点 + * + * @return 返回文本 + */ @Override public String convertValueToText(Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { if (value != null && value instanceof XCreator) { @@ -115,25 +119,25 @@ public class ComponentTree extends JTree { return super.convertValueToText(value, selected, expanded, leaf, row, hasFocus); } } - + public void setAndScrollSelectionPath(TreePath treepath) { - setSelectionPath(treepath); - scrollPathToVisible(treepath); + setSelectionPath(treepath); + scrollPathToVisible(treepath); + } + + 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()); } - - 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()); - } /** * 刷新 @@ -145,51 +149,51 @@ public class ComponentTree extends JTree { - - 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; - } - - private class TreeDesignerEditAdapter implements DesignerEditListener { - - @Override - public void fireCreatorModified(DesignerEvent evt) { - if (evt.getCreatorEventID() == DesignerEvent.CREATOR_SELECTED) { - TreePath[] paths = getSelectedTreePath(); - - if (paths.length == 1) { - setAndScrollSelectionPath(paths[0]); - } else { - setSelectionPaths(paths); - } - } else if(evt.getCreatorEventID() == DesignerEvent.CREATOR_PASTED) { - ComponentTree.this.refreshUI(); - TreePath[] paths = getSelectedTreePath(); - - if (paths.length == 1) { - setAndScrollSelectionPath(paths[0]); - } else { - setSelectionPaths(paths); - } - ComponentTree.this.repaint(); - - } else { - ComponentTree.this.refreshUI(); - ComponentTree.this.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; + } + + private class TreeDesignerEditAdapter implements DesignerEditListener { + + @Override + public void fireCreatorModified(DesignerEvent evt) { + if (evt.getCreatorEventID() == DesignerEvent.CREATOR_SELECTED) { + TreePath[] paths = getSelectedTreePath(); + + if (paths.length == 1) { + setAndScrollSelectionPath(paths[0]); + } else { + setSelectionPaths(paths); + } + } else if(evt.getCreatorEventID() == DesignerEvent.CREATOR_PASTED) { + ComponentTree.this.refreshUI(); + TreePath[] paths = getSelectedTreePath(); + + if (paths.length == 1) { + setAndScrollSelectionPath(paths[0]); + } else { + setSelectionPaths(paths); + } + ComponentTree.this.repaint(); + + } else { + ComponentTree.this.refreshUI(); + ComponentTree.this.repaint(); + } + } + + @Override + public boolean equals(Object o) { + return o.getClass() == this.getClass(); + } + } /** @@ -211,11 +215,11 @@ public class ComponentTree extends JTree { paths[i] = buildTreePath(searchList.get(i)); } if(paths.length > 0) { - setAndScrollSelectionPath(paths[0]); + setAndScrollSelectionPath(paths[0]); } else { - setSelectionPath(); + setSelectionPath(); } - return paths; + return paths; } @@ -248,7 +252,7 @@ public class ComponentTree extends JTree { * 触发 */ public void fireTreeChanged() { - designer.refreshDesignerUI(); + designer.refreshDesignerUI(); } /** @@ -267,14 +271,14 @@ public class ComponentTree extends JTree { ArrayList path = new ArrayList(); Component parent = comp; - while (parent != null) { - XCreator creator = (XCreator) parent; - path.add(0, parent); - if (creator != comp ) { - creator.notShowInComponentTree(path); - } - parent = parent.getParent(); - } + while (parent != null) { + XCreator creator = (XCreator) parent; + path.add(0, parent); + if (creator != comp ) { + creator.notShowInComponentTree(path); + } + parent = parent.getParent(); + } Object[] components = path.toArray(); return new TreePath(components); } diff --git a/designer_form/src/com/fr/design/mainframe/ShareWidgetButton.java b/designer_form/src/com/fr/design/mainframe/ShareWidgetButton.java new file mode 100644 index 000000000..3054bea32 --- /dev/null +++ b/designer_form/src/com/fr/design/mainframe/ShareWidgetButton.java @@ -0,0 +1,192 @@ +package com.fr.design.mainframe; + +import com.fr.base.BaseUtils; +import com.fr.design.designer.creator.XCreator; +import com.fr.design.designer.creator.XCreatorUtils; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.form.share.ShareLoader; +import com.fr.form.ui.ElCaseBindInfo; +import com.fr.form.ui.Widget; +import com.fr.general.ComparatorUtils; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.awt.dnd.*; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.Serializable; + +/** + * Coder: zack + * Date: 2016/10/9 + * Time: 16:14 + */ +public class ShareWidgetButton extends JPanel implements MouseListener, MouseMotionListener, Serializable { + private ElCaseBindInfo bindInfo; + private MouseEvent lastPressEvent; + + public ShareWidgetButton(ElCaseBindInfo bindInfo) { + this.bindInfo = bindInfo; + initUI(); + this.setBorder(BorderFactory.createEmptyBorder(0,0,0,0)); + this.addMouseListener(this); + this.addMouseMotionListener(this); + new DragAndDropDragGestureListener(this, DnDConstants.ACTION_COPY_OR_MOVE); + } + + + private void initUI() { + this.setBackground(Color.WHITE); + this.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); + setPreferredSize(new Dimension(110, 70)); + setLayout(FRGUIPaneFactory.createBorderLayout()); + ImagePanel imagePanel = new ImagePanel((BufferedImage) bindInfo.getCover()); + + this.add(imagePanel, BorderLayout.NORTH); + JPanel panel = new JPanel(); + UILabel label = new UILabel(bindInfo.getName(), SwingConstants.HORIZONTAL); + panel.setBackground(new Color(184, 220, 242)); + panel.add(label); + this.add(panel, BorderLayout.SOUTH); + } + + private class ImagePanel extends JPanel { + + private BufferedImage image; + + public ImagePanel(BufferedImage image) { + this.image = image; + this.setPreferredSize(new Dimension(110, 50)); + } + + @Override + public void paintComponent(Graphics g) { + g.drawImage(image, 0, 0, 110, 70, null); + } + + } + + public ElCaseBindInfo getBindInfo() { + return bindInfo; + } + + public void setBindInfo(ElCaseBindInfo bindInfo) { + this.bindInfo = bindInfo; + } + + @Override + public void mouseClicked(MouseEvent e) { + + } + + @Override + public void mousePressed(MouseEvent e) { + lastPressEvent = e; + } + + @Override + public void mouseReleased(MouseEvent e) { + + } + + @Override + public void mouseEntered(MouseEvent e) { + + } + + @Override + public void mouseExited(MouseEvent e) { + + } + + @Override + public void mouseDragged(MouseEvent e) { + if (BaseUtils.isAuthorityEditing()) { + return; + } + if (lastPressEvent == null) { + return; + } + Object source = e.getSource(); + Widget creatorSource = null; + String shareId = StringUtils.EMPTY; + if (source instanceof ShareWidgetButton) { + ShareWidgetButton no = (ShareWidgetButton) e.getSource(); + if (no == null) { + return; + } + shareId = no.getBindInfo().getId(); + creatorSource = ShareLoader.getLoader().getElCaseEditorById(shareId); + } + if (creatorSource != null) { + XCreator xCreator = XCreatorUtils.createXCreator(creatorSource); + xCreator.setShareId(shareId); + WidgetToolBarPane.getTarget().startDraggingBean(xCreator); + lastPressEvent = null; + this.setBorder(null); + } + } + + @Override + public void mouseMoved(MouseEvent e) { + + } + + public class DragAndDropDragGestureListener extends DragSourceAdapter implements DragGestureListener { + private DragSource source; + + public DragAndDropDragGestureListener(ShareWidgetButton tt, int actions) { + source = new DragSource(); + source.createDefaultDragGestureRecognizer(tt, actions, this); + } + + public void dragGestureRecognized(DragGestureEvent dge) { + ShareWidgetButton shareWidgetButton = (ShareWidgetButton) dge.getComponent(); + if (shareWidgetButton != null) { + Widget widget = ShareLoader.getLoader().getElCaseEditorById(shareWidgetButton.getBindInfo().getId()); + DragAndDropTransferable dragAndDropTransferable = new DragAndDropTransferable(widget); + dge.startDrag(DragSource.DefaultCopyDrop, dragAndDropTransferable, this); + } + } + + @Override + public void dragEnter(DragSourceDragEvent dragSourceDragEvent) { + + } + } + + public class DragAndDropTransferable implements Transferable { + private Widget widget; + + public DragAndDropTransferable(Widget widget) { + this.widget = widget; + } + + DataFlavor[] flavors = {new DataFlavor(Widget.class, "Widget")}; + + public DataFlavor[] getTransferDataFlavors() { + return flavors; + } + + public boolean isDataFlavorSupported(DataFlavor flavor) { + for (DataFlavor df : flavors) { + if (ComparatorUtils.equals(df, flavor)) { + return true; + } + } + return false; + } + + public Object getTransferData(DataFlavor df) throws UnsupportedFlavorException, IOException { + return widget; + } + } +} diff --git a/designer_form/src/com/fr/design/mainframe/ShareWidgetPane.java b/designer_form/src/com/fr/design/mainframe/ShareWidgetPane.java new file mode 100644 index 000000000..79f15b364 --- /dev/null +++ b/designer_form/src/com/fr/design/mainframe/ShareWidgetPane.java @@ -0,0 +1,29 @@ +package com.fr.design.mainframe; + + +import com.fr.form.ui.ElCaseBindInfo; + + +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; + + +/** + * Created by xiaxiang on 2016/10/10. + */ +public class ShareWidgetPane extends JPanel { + public ShareWidgetPane(ArrayList elCaseBindInfoList) { + this.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));// 设置面板的边框 ,距离上、左、下、右 的距离 + int rowCount = (elCaseBindInfoList.size() + 1)/2; + this.setLayout(new GridLayout(rowCount, 2, 10, 10)); + for (ElCaseBindInfo rbModuleInfo : elCaseBindInfoList) { + ShareWidgetButton widgetButton = new ShareWidgetButton(rbModuleInfo); + this.add(widgetButton); + } + if (elCaseBindInfoList.size() == 1) { + this.add(new JPanel()); + } + + } +} diff --git a/designer_form/src/com/fr/design/mainframe/widget/UITreeComboBox.java b/designer_form/src/com/fr/design/mainframe/widget/UITreeComboBox.java new file mode 100644 index 000000000..7f55ddeaf --- /dev/null +++ b/designer_form/src/com/fr/design/mainframe/widget/UITreeComboBox.java @@ -0,0 +1,291 @@ +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.*; +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.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(value != null){ + TreePath path = (TreePath)value; + 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 || evt.getCreatorEventID() == DesignerEvent.CREATOR_PASTED) { + TreePath[] paths = tree.getSelectedTreePath(); + + if (paths.length == 1) { + tree.setAndScrollSelectionPath(paths[0]); + } else { + tree.setSelectionPaths(paths); + } + setSelectedItem(paths[0]); + MenuSelectionManager.defaultManager().clearSelectedPath(); + } else { + return; + } + + } + + @Override + public boolean equals(Object o) { + return o.getClass() == this.getClass(); + } + } + + /** + * 测试 + */ +// 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; + } + 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; + setBorder(BorderFactory.createLineBorder(Color.black)); + setLayout(new BorderLayout()); + setLightWeightPopupEnabled(comboBox.isLightWeightPopupEnabled()); + JTree tree = this.comboBox.getTree(); + if(tree != null){ + scrollPane = new JScrollPane(tree); + scrollPane.setBorder(null); + add(scrollPane, BorderLayout.CENTER); + } + } + + public void show(){ + updatePopup(); + show(comboBox, 0, comboBox.getHeight()); + comboBox.getTree().requestFocus(); + } + + public void hide(){ + setVisible(false); + comboBox.firePropertyChange("popupVisible", true, false); + } + + 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 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); + } + } + + 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(); + } + togglePopup(); + } + + public void mouseClicked (MouseEvent e){ + if (e.isMetaDown()) { + popupMenu(e); + } else { + return; + } + } + } + + + +}