package com.vci.client.portal.Formdesign; import java.awt.AlphaComposite; import java.awt.Component; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.awt.dnd.DnDConstants; import java.awt.dnd.DragGestureEvent; import java.awt.dnd.DragGestureListener; import java.awt.dnd.DragSource; import java.awt.dnd.DragSourceDragEvent; import java.awt.dnd.DragSourceDropEvent; import java.awt.dnd.DragSourceEvent; import java.awt.dnd.DragSourceListener; import java.awt.dnd.DropTargetDragEvent; import java.awt.dnd.DropTargetDropEvent; import java.awt.dnd.DropTargetEvent; import java.awt.dnd.DropTargetListener; import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import javax.swing.JLabel; import javax.swing.JTree; import javax.swing.event.TreeExpansionEvent; import javax.swing.event.TreeExpansionListener; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import com.vci.client.omd.btm.wrapper.BtmItemWrapper; import com.vci.client.omd.linktype.LinkTypeWrapper; import com.vci.client.omd.provider.ApProvider; import com.vci.client.omd.provider.BtmProvider; import com.vci.client.omd.provider.LinkTypeProvider; import com.vci.client.portal.Formdesign.object.MTransferable; import com.vci.client.ui.swing.VCISwingUtil; import com.vci.client.ui.tree.VCIBaseTreeModel; import com.vci.client.ui.tree.VCIBaseTreeNode; import com.vci.corba.common.VCIError; import com.vci.corba.omd.atm.AttribItem; import com.vci.corba.omd.ltm.LinkType; import com.vci.omd.constants.SystemAttribute; import com.vci.omd.objects.OtherInfo; class DragTree extends JTree implements DragGestureListener, DragSourceListener, DropTargetListener { /** * 业务对象名称 */ private String btName; /** * */ private static final long serialVersionUID = 1L; BufferedImage ghostImage; private Rectangle2D ghostRect = new Rectangle2D.Float(); private Point ptOffset = new Point(); private Point lastPoint = new Point(); private TreePath lastPath; // private Timer hoverTimer; // FileNode sourceNode; VCIBaseTreeNode sourceNode; private Object selectTreeNodeobject; public DragTree(Object object, String btName) { this.btName = btName; this.selectTreeNodeobject = object; DragSource dragSource = DragSource.getDefaultDragSource(); dragSource.createDefaultDragGestureRecognizer(this, // component where // drag originates DnDConstants.ACTION_COPY_OR_MOVE, // actions this); // drag gesture recognizer try { if (selectTreeNodeobject instanceof BtmItemWrapper) { setModel(createTreeModel()); } else if (selectTreeNodeobject instanceof LinkTypeWrapper) { setModel(createLinktypeTreeModel()); } } catch (VCIError e) { e.printStackTrace(); } addTreeExpansionListener(new TreeExpansionListener() { public void treeCollapsed(TreeExpansionEvent e) { } public void treeExpanded(TreeExpansionEvent e) { TreePath path = e.getPath(); if (path != null) { // FileNode node = (FileNode) path.getLastPathComponent(); VCIBaseTreeNode node = (VCIBaseTreeNode) path.getLastPathComponent(); // if (!node.isExplored()) { // DefaultTreeModel model = (DefaultTreeModel) getModel(); // node.explore(); // model.nodeStructureChanged(node); // } } } }); this.setCellRenderer(new DefaultTreeCellRenderer() { public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); TreePath tp = tree.getPathForRow(row); if (tp != null) { VCIBaseTreeNode node = (VCIBaseTreeNode) tp.getLastPathComponent(); if (node.isLeaf()) { Object obj = node.getObj(); if (obj != null && obj instanceof AttributeNode) { AttributeNode anode = (AttributeNode)obj; if (anode.isSys()) setIcon(VCISwingUtil.createImageIcon("sysattribute.png")); else setIcon(VCISwingUtil.createImageIcon("attribute.png")); } else setIcon(VCISwingUtil.createImageIcon("attribute.png")); } // Object obj = node.getObj(); // if (obj instanceof AttribItem){ // setIcon(VCISwingUtil.createImageIcon("attribute.png")); // } } return this; } }); super.setScrollsOnExpand(true); } public void dragGestureRecognized(DragGestureEvent e) { // drag anything ... TreePath path = getLeadSelectionPath(); if (path == null) return; VCIBaseTreeNode node = (VCIBaseTreeNode) path.getLastPathComponent(); sourceNode = node; // Work out the offset of the drag point from the TreePath bounding // rectangle origin Rectangle raPath = getPathBounds(path); Point ptDragOrigin = e.getDragOrigin(); ptOffset.setLocation(ptDragOrigin.x - raPath.x, ptDragOrigin.y - raPath.y); // Get the cell renderer (which is a JLabel) for the path being dragged int row = this.getRowForLocation(ptDragOrigin.x, ptDragOrigin.y); JLabel lbl = (JLabel) getCellRenderer().getTreeCellRendererComponent(this, // tree path.getLastPathComponent(), // value false, // isSelected (dont want a colored background) isExpanded(path), // isExpanded getModel().isLeaf(path.getLastPathComponent()), // isLeaf row, // row (not important for rendering) false // hasFocus (dont want a focus rectangle) ); lbl.setSize((int) raPath.getWidth(), (int) raPath.getHeight()); // <-- // The // layout // manager // would // normally // do // this // Get a buffered image of the selection for dragging a ghost image this.ghostImage = new BufferedImage((int) raPath.getWidth(), (int) raPath.getHeight(), BufferedImage.TYPE_INT_ARGB_PRE); Graphics2D g2 = ghostImage.createGraphics(); // Ask the cell renderer to paint itself into the BufferedImage g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, 0.5f)); // Make the image ghostlike lbl.paint(g2); g2.dispose(); // this.getGraphics().drawImage(ghostImage, e.getDragOrigin().x, // e.getDragOrigin().y, this); // e.startDrag( // null, // cursor // ghostImage, new Point(5, 5), // new StringSelection(getFilename()), // transferable // this); // drag source listener e.startDrag(DragSource.DefaultMoveDrop, getAttrItem(), this); } public void dragDropEnd(DragSourceDropEvent e) { ghostImage = null; sourceNode = null; } public void dragEnter(DragSourceDragEvent e) { } public void dragExit(DragSourceEvent e) { if (!DragSource.isDragImageSupported()) { repaint(ghostRect.getBounds()); } } public void dragOver(DragSourceDragEvent e) { } public void dropActionChanged(DragSourceDragEvent e) { } /** * 获取业务类型属性信息 * * @return */ public MTransferable getAttrItem() { TreePath path = getLeadSelectionPath(); VCIBaseTreeNode node = (VCIBaseTreeNode) path.getLastPathComponent(); Object obj = node.getObj(); // if (obj instanceof AttributeNode) { // obj = (AttributeNode) obj; // } // else if (obj instanceof SysAttribute) { // obj = ((SysAttribute)obj).getAttrItem(); // } // else if (obj instanceof String) { // obj = (String) obj; // } MTransferable mt = new MTransferable(obj); return mt; } private DefaultTreeModel createTreeModel() throws VCIError { AttribItem[] btAbItems = BtmProvider.getInstance().getBtAbItems(btName); // String[] sysAbItems = BtmProvider.getInstance().getSysAbItems(); AttribItem[] sysAbItems = BtmProvider.getInstance().getSysAttribItems(); VCIBaseTreeNode rootNode = new VCIBaseTreeNode("【" + btName + "】属性信息", "root"); VCIBaseTreeModel treeModel = new VCIBaseTreeModel(rootNode); String nodeName; for (int i = 0; i < btAbItems.length; i++) { AttribItem item = btAbItems[i]; nodeName = item.name.toLowerCase(); addNode(rootNode, new VCIBaseTreeNode(nodeName, new AttributeNode(nodeName, item, false))); } for (int i = 0; i < sysAbItems.length; i++) { AttribItem item = sysAbItems[i]; nodeName = item.name.toLowerCase(); addNode(rootNode, new VCIBaseTreeNode(nodeName, new AttributeNode(nodeName, item, true))); } rootNode.setExpand(true); return new DefaultTreeModel(rootNode); } private void addNode(VCIBaseTreeNode pNode, VCIBaseTreeNode node) { if (pNode.getPath().length >= 4) { return; } pNode.add(node); if (node.getPath().length >= 4) { node.setLeaf(true); return; } Object obj = node.getObj(); //String abName = (String) node.getUserObject(); AttribItem abItem = null; String abName = ""; if (obj instanceof AttributeNode) { abItem = ((AttributeNode)obj).getAttrItem(); abName = ((AttributeNode)obj).getName(); } else if (obj instanceof AttribItem) { abItem = (AttribItem)obj; abName = abItem.name; } else if (obj instanceof String) { abName = (String)obj; } if (abItem == null) return; // 取node上的最后一个属性名 if (abName.contains(".")) { abName = abName.substring(abName.lastIndexOf(".") + 1); } if (abName.equals("f_oid") || abName.equals("t_oid")) { return; } if (SystemAttribute.sysAttList().contains(abName.toUpperCase())) { node.setLeaf(true); return; } // AttribItem abItem = (AttribItem) node.getObj();// ApProvider.getInstance().getAbItemByName(abName); // abItem = APClient.getService().getAttribItemByName(abName); String other = abItem.other; // String btmName = ApProvider.getInstance().getOtherValueByType(other, BTM); OtherInfo otherInfo = OtherInfo.getOtherInfoByText(other); int refFlag = otherInfo.getRefFlag(); String refTypeName = otherInfo.getRefTypeName(); String nodeName; if (refFlag != -1) { // 参照业务类型 if (refFlag == 0) { // pName: 为参照属性名加上路径 String pName = node.getUserObject() + "."; String[] abNames = BtmProvider.getAbNames(refTypeName); for (int i = 0; i < abNames.length; i++) { String abName1 = abNames[i]; AttribItem aitem = ApProvider.getAbItemByName(abName1); nodeName = pName + abName1; addNode(node, new VCIBaseTreeNode(nodeName, new AttributeNode(nodeName, aitem, false))); } // 系统属性ID,NAME,DESCRIPTION AttribItem[] sysAbItems = BtmProvider.getInstance().getSysAttribItems(); for (int i = 0; i < sysAbItems.length; i++) { AttribItem item = sysAbItems[i]; nodeName = pName + item.name; addNode(node, new VCIBaseTreeNode(nodeName, new AttributeNode(nodeName, item, true))); } // 参照链接类型 } else if (refFlag == 1) { // pName: 为参照属性名加上路径 String pName = node.getUserObject() + "."; LinkType link = null; try { link = LinkTypeProvider.getInstance().getLinkTypeByName(refTypeName); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Throwable e) { // TODO Auto-generated catch block e.printStackTrace(); } if (link != null) { String[] abNames = LinkTypeProvider.getInstance().getAbNames(link); for (int i = 0; i < abNames.length; i++) { String abName1 = abNames[i]; AttribItem item = ApProvider.getAbItemByName(abName1); nodeName = pName + item.name; addNode(node, new VCIBaseTreeNode(pName + abName1, new AttributeNode(nodeName, item, false))); } // 系统属性ID,NAME,DESCRIPTION AttribItem[] sysAbItems = LinkTypeProvider.getInstance().getSysAttribItems(); for (int i = 0; i < SystemAttribute.losysAttList().size(); i++) { AttribItem item = sysAbItems[i]; nodeName = pName + item.name; addNode(node, new VCIBaseTreeNode(nodeName, new AttributeNode(nodeName, item, true))); } } } } else { node.setLeaf(true); } } private DefaultTreeModel createLinktypeTreeModel() { VCIBaseTreeNode rootNode = new VCIBaseTreeNode("属性信息", "root"); try { LinkType linkType = LinkTypeProvider.getInstance().getLinkTypeByName(btName); AttribItem[] abItems = ApProvider.getAttribItemsByNames(LinkTypeProvider.getInstance().getAbNames(linkType)); //String[] sysAbItems = LinkTypeProvider.getInstance().getSysAbItems(); VCIBaseTreeModel treeModel = new VCIBaseTreeModel(rootNode); for (int i = 0; i < abItems.length; i++) { String nodeName = abItems[i].name.toLowerCase(); addNode(rootNode, new VCIBaseTreeNode(nodeName, new AttributeNode(nodeName, abItems[i], false))); } AttribItem[] sysAbItems = LinkTypeProvider.getInstance().getSysAttribItems(); for (int i = 0; i < sysAbItems.length; i++) { AttribItem item = sysAbItems[i]; addNode(rootNode, new VCIBaseTreeNode(item.name, new AttributeNode(item.name, item, true))); } } catch (Exception e) { e.printStackTrace(); } catch (Throwable e) { e.printStackTrace(); } rootNode.setExpand(true); return new DefaultTreeModel(rootNode); } public void dragEnter(DropTargetDragEvent dtde) { } public void dragOver(DropTargetDragEvent dtde) { Point pt = dtde.getLocation(); if (pt.equals(lastPoint)) { return; } if (ghostImage != null) { Graphics2D g2 = (Graphics2D) getGraphics(); // If a drag image is not supported by the platform, then draw my // own drag image if (!DragSource.isDragImageSupported()) { paintImmediately(ghostRect.getBounds()); // Rub out the last // ghost image and cue // line // And remember where we are about to draw the new ghost image ghostRect.setRect(pt.x - ptOffset.x, pt.y - ptOffset.y, ghostImage.getWidth(), ghostImage.getHeight()); g2.drawImage((ghostImage), AffineTransform.getTranslateInstance(ghostRect.getX(), ghostRect.getY()), null); } } TreePath path = getClosestPathForLocation(pt.x, pt.y); if (!(path == lastPath)) { lastPath = path; // hoverTimer.restart(); } } public void dropActionChanged(DropTargetDragEvent dtde) { } public void drop(DropTargetDropEvent e) { } private void cp(File src, File dest) throws IOException { if (src.isDirectory()) { if (!dest.exists()) { boolean ret = dest.mkdir(); if (ret == false) return; } File[] fs = src.listFiles(); for (int i = 0; i < fs.length; i++) { cp(fs[i], new File(dest, fs[i].getName())); } return; } byte[] buf = new byte[1024]; FileInputStream in = new FileInputStream(src); FileOutputStream out = new FileOutputStream(dest); int len; try { while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } } finally { in.close(); out.close(); } } public void dragExit(DropTargetEvent dte) { } } class AttributeNode implements java.io.Serializable { /** * */ private static final long serialVersionUID = 1L; private String _name = ""; private AttribItem _aItem; private boolean _isSys = false; public AttributeNode(String name, AttribItem item, boolean isSys) { _name = name; _aItem = item; _isSys = isSys; } public String getName() { return _name; } public AttribItem getAttrItem() { return _aItem; } public boolean isSys() { return _isSys; } } // //class FileNode extends DefaultMutableTreeNode { // private boolean explored = false; // // public FileNode(File file) { // setUserObject(file); // } // // public boolean getAllowsChildren() { // return isDirectory(); // } // // public boolean isLeaf() { // return !isDirectory(); // } // // public File getFile() { // return (File) getUserObject(); // } // // public boolean isExplored() { // return explored; // } // // public boolean isDirectory() { // File file = getFile(); // return file.isDirectory(); // } // // public String toString() { // File file = (File) getUserObject(); // String filename = file.toString(); // int index = filename.lastIndexOf(File.separator); // // return (index != -1 && index != filename.length() - 1) ? filename.substring(index + 1) : filename; // } // // public void explore() { // if (!isDirectory()) // return; // // if (!isExplored()) { // File file = getFile(); // File[] children = file.listFiles(); // // for (int i = 0; i < children.length; ++i) { // if (children[i].isDirectory()) // add(new FileNode(children[i])); // } // for (int i = 0; i < children.length; ++i) { // if (!children[i].isDirectory()) // add(new FileNode(children[i])); // } // explored = true; // } // } // // public void reexplore() { // this.removeAllChildren(); // explored = false; // explore(); // } //}