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 + -
显示快捷键?