jfclipboard.java

来自「用Java开发的、实现类似Visio功能的应用程序源码」· Java 代码 · 共 262 行

JAVA
262
字号

/**
 *    $Id:JFClipboard.java $
 *
 *    Copyright 2004 ~ 2005  JingFei International Cooperation LTD. All rights reserved. *
 */
package com.jfimagine.jfgraph.transfer;

import java.util.Iterator;

import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Toolkit;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.datatransfer.StringSelection;
import java.io.IOException;

import com.jfimagine.jfgraph.shape.base.ObjectList;
import com.jfimagine.jfgraph.shape.base.AbstractObject;
import com.jfimagine.jfgraph.shape.base.AbstractShape;
import com.jfimagine.jfgraph.shape.base.Port;
import com.jfimagine.jfgraph.shape.base.PortList;
import com.jfimagine.jfgraph.shape.base.JFVersion;

import com.jfimagine.jfgraph.shape.union.JFGroup;
import com.jfimagine.jfgraph.shape.union.JFPage;
import com.jfimagine.jfgraph.shape.union.JFLayer;
import com.jfimagine.jfgraph.shape.rectangle.JFImage;

import com.jfimagine.jfdom.Document;
import com.jfimagine.jfdom.Element;
import com.jfimagine.jfdom.XMLOutput;
import com.jfimagine.jfdom.XMLInput;

import com.jfimagine.utils.log.*;
  
 /**
 * JFClipboard class.  A class used to process copy/paste/cut actions.
 *
 * @author     CookieMaker    
 *
 * @version $Revision: 1.00 $
 */  
public class JFClipboard {

    /**  A XML string tag represents the JFClipboard data    */
    public  static final String	 XML_JFCLIPBOARD	="JFClipboard";

    /**an internal log utility*/
    private static JFLogger m_logger	=JFLogManager.getLogger("com.jfimagine.jfgraph.transfer.JFClipboard");


    // If a string is on the system clipboard, this method returns it;
    // otherwise it returns null.
    private static String getClipboard() {
        Transferable t = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);
    
        try {
            if (t != null && t.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                String text = (String)t.getTransferData(DataFlavor.stringFlavor);
                return text;
            }
        } catch (UnsupportedFlavorException e) {
        	m_logger.error("getClipboard:"+e);
        } catch (IOException e) {
        	m_logger.error("getClipboard:"+e);
        }
        return null;
    }
    
    // This method writes a string to the system clipboard.
    // otherwise it returns null.
    private static void setClipboard(String str) {
        StringSelection ss = new StringSelection(str);
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(ss, null);
    }
 

    //Copy an object list to clipboard
    public static void copyToClipboard(ObjectList objList){
    	if (objList==null || objList.size()==0){
    		setClipboard("");
    		return;
	}


	try{
		//top element
		Element  drawElement = new Element(XML_JFCLIPBOARD);
		//document
		Document doc = new Document(drawElement);
		//save this page to dom.
		objList.toDOM(drawElement,new JFVersion());

		XMLOutput out	=new XMLOutput();
		String xmlString=out.getDocumentText(doc);

		setClipboard(xmlString);		

	}catch(Exception e){
		m_logger.error("copyToClipboard: "+e);
		setClipboard("");
	}	
    		
    }		

    //Paste an object list from clipboard
    //@param c A necessary component for completely loading images.
    //@param startObjId For add new objects to a page/layer,we need a start new object id for create new objects.
    public static ObjectList pasteFromClipboard(Component c,int startObjId){
	
	String xmlString	=getClipboard();
	if (xmlString==null || xmlString.equals("")){
		return null;
	}
	
	try{   
	 	ObjectList objList	=new ObjectList();
	 	
		XMLInput  input	=new XMLInput();
		Document doc	=input.loadDocumentFromText(xmlString);
		if (doc==null){
        		m_logger.error("pasteFromClipboard : Invalid xml document!");
			return null;
		}

		Element root = doc.getRoot();
		Element listElem = root.getChild(objList.getXMLTag());
		if (listElem==null){
        		m_logger.error("pasteFromClipboard : No necessary xml tag!");
			return null;
		}
		
		objList.fromDOM(listElem,new JFVersion());
		//finish loading process.		
		finishLoading(objList,startObjId);		
                
                //finish loading images
            	if (c!=null)
              		JFImage.finishLoadingImages(objList,c);
              	
              	//a little movement for distinguish original objects and new pasted objects.
              	moveObjects(objList);
              	
		return objList;
	}catch(Exception e){
        	m_logger.error("pasteFromClipboard : "+e);
		return null;
	}
    }		

   //a little movement for distinguish original objects and new pasted objects.
   public static void moveObjects(ObjectList objList){
   	Iterator it	=objList.getList().iterator();
   	while (it!=null && it.hasNext()){
   		AbstractShape shape=(AbstractShape)it.next();
   		shape.moveBy(10,10);
	}
   }


    //finish loading objects.
    public static  void finishLoading(AbstractObject obj,int startObjId){
    	if (obj==null)
    		return;
    	
    	if (obj instanceof JFPage){ 
    		JFPage page		=(JFPage)obj;
    		ObjectList layerList	=page.getLayerList();
    		Iterator it	=layerList.getList().iterator();
    		while (it!=null && it.hasNext()){
    			JFLayer layer	=(JFLayer)it.next();
    			finishLoading(layer.getShapeList(),startObjId);
    		}
    	}else{	
    		ObjectList objList	=new ObjectList();
    		objList.add(obj);
    		finishLoading(objList,startObjId);
    	}
    }

    //finish loading objects.
    public static  void finishLoading(ObjectList objList,int startObjId){
    		//attach real port for all the ports.
    		objList.attachRealPort();
		
		//re-assign object ids		
		int objId	=startObjId;    		
    		Iterator it	=objList.getList().iterator();
    		while (it!=null && it.hasNext()){
    			AbstractObject obj	=(AbstractObject)it.next();
    			objId			=setObjectId(obj,objId);
    		}

    		//re-collect port attached list.
    		it	=objList.getList().iterator();
    		while (it!=null && it.hasNext()){
    			AbstractObject obj	=(AbstractObject)it.next();
    			collectAttachedList(obj);
    		}
    		
    }

    //re-assign a new object id for this object.
    //@return An increased object id for next object.
    private static int setObjectId(AbstractObject obj, int objId){
    		obj.setObjectId(objId++);
    		adjustPortParent(obj);

    		if (obj instanceof JFGroup){
    			JFGroup g=(JFGroup)obj;
			ObjectList objList	=g.getList();
			Iterator it	=objList.getList().iterator();
			while (it!=null && it.hasNext()){
				AbstractObject aObj	=(AbstractObject)it.next();
				objId	=setObjectId(aObj,objId);
			}
    		}
    		return objId;
    }
	
    //adjust a port's parent object, actually adjust port's parent id. 	
    private static void adjustPortParent(AbstractObject obj){
    		if (obj instanceof AbstractShape){
    			AbstractShape shape	=(AbstractShape)obj;
    			PortList portList=(PortList)shape.getPortList();
    			Iterator it	=portList.getList().iterator();
    			while (it!=null && it.hasNext()){
    				Port port	=(Port)it.next();
    				port.setParent(obj);
    			}
    		}
    }  
    
    //collect attached list.
    private static void collectAttachedList(AbstractObject obj){
    	        AbstractShape shape	=(AbstractShape)obj;
    	        PortList portList=(PortList)shape.getPortList();
    	        Iterator it=portList.getList().iterator();
    	        while (it!=null && it.hasNext()){
    	        	Port port	=(Port)it.next();
    			port.collectAttachedList();
    		}
    		
    		if (shape instanceof JFGroup){
    			JFGroup g	=(JFGroup)shape;
    			ObjectList l	=g.getList();
    			Iterator it1	=l.getList().iterator();
    			while (it1!=null && it1.hasNext()){
    				AbstractObject obj1=(AbstractObject)it1.next();
    				collectAttachedList(obj1);
    			}
    		}
    }



}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?