⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jfoperationmodifydecorate.java

📁 用Java开发的、实现类似Visio功能的应用程序源码
💻 JAVA
字号:
/**
 *    $Id:JFOperationModifyDecorate.java $
 *
 *    Copyright 2004 ~ 2005  JingFei International Cooperation LTD. All rights reserved. *
 */
package com.jfimagine.jfgraph.shape.action;


import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Comparator;
import java.util.Collections;

import com.jfimagine.jfgraph.geom.JFPoint;
import com.jfimagine.jfgraph.shape.base.AbstractObject;
import com.jfimagine.jfgraph.shape.base.AbstractShape;
import com.jfimagine.jfgraph.shape.base.ObjectList;

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



/**
 *  Class JFOperationModifyDecorate is used to record a modify decorative property operation.
 *  we used an abstract class here to store some original decorative objects, e.g., fontFormat,lineFormat
 */
public abstract class JFOperationModifyDecorate extends JFOperation{


	private static final int   OBJTYPE_SINGLE	=1;
	private static final int   OBJTYPE_GROUP	=2;

	protected class ModifyDecorate{
	
		/** object id 
	 	*/
		private int m_objectId	=0;
		public int getObjectId(){
			return m_objectId;
		}
		public void setObjectId(int objectId){
			m_objectId	=objectId;
		}


		/** object type, single or group 
	 	*/
		private int m_objectType =0;
		public int getObjectType(){
			return m_objectType;
		}
		public void setObjectType(int objectType){
			m_objectType	=objectType;
		}

		/** current decorative object.
		 */
		private AbstractObject m_decorateObj	=null;
		public AbstractObject getDecorateObject(){
			return m_decorateObj;
		}
		public void setDecorateObject(AbstractObject decorateObj){
			m_decorateObj	=decorateObj;
		}


		/** if object type is OBJTYPE_GROUP, recursively store 
	 	*  sub decorative property list here.
	 	*/
		private List m_decorateList	=new ArrayList();
		public List getDecorateList(){
			return m_decorateList;
		}
	
		public ModifyDecorate(AbstractObject obj,AbstractObject decorateObj){
			m_objectId	=obj.getObjectId();
			if (obj instanceof JFGroup)
				m_objectType	=OBJTYPE_GROUP;
			else
				m_objectType	=OBJTYPE_SINGLE;
		
			try{
				m_decorateObj	=(AbstractObject)decorateObj.clone();
			}catch(Exception e){
			}
		}
	}


	/** an decorate list to be modified.*/
	protected List m_decorateList	=new ArrayList();
	/** a new decorative property assigned*/
	protected AbstractObject m_newDecorate=null;


	/** set a modify decorate list by an abstractObject list **/
	protected void setModifyDecorateList(List objList){
		setModifyDecorateList(objList,m_decorateList);
	}

	/** set a modify decorate list by an abstractObject list **/
	protected void setModifyDecorateList(List objList, List modifyDecorateList){
		Iterator it	=objList.iterator();
		while (it!=null && it.hasNext()){ 
			//get a decorative property from current object.
			AbstractShape aShape	=(AbstractShape)it.next();
			AbstractObject decorate =getDecorate(aShape);
			if (decorate!=null){
				ModifyDecorate modifyDecorate	=new ModifyDecorate(aShape,decorate);
				modifyDecorateList.add(modifyDecorate); 
				if (aShape instanceof JFGroup){
					JFGroup g	=(JFGroup)aShape;
					//recursively get decorative properties from group's sub list.
					setModifyDecorateList(g.getList().getList(),modifyDecorate.getDecorateList());
				}
			}
		}
		
	}
        
        /** to find each decorate object(arrow,etc.) from a list, then restore them into each object.
	 *  @param decorateList A ModifyDecorate object list.
	 */
	protected  void restoreDecorate(List decorateList){
		if (decorateList==null || decorateList.size()==0)
			return;
			
		Iterator it	=decorateList.iterator();
		while (it!=null && it.hasNext()){
			Object obj	=it.next();
			if (obj instanceof ModifyDecorate){
				//restore decorative property from current ModifyDecorate object.
				ModifyDecorate modifyDecorate =(ModifyDecorate)obj;
				int objectId	=modifyDecorate.getObjectId();
				int objectType	=modifyDecorate.getObjectType();
				AbstractObject decorate=modifyDecorate.getDecorateObject();

				AbstractObject aObj	=getObject(objectId,false);
				if (aObj!=null){
					setDecorate(aObj,decorate); 	
					if (objectType==OBJTYPE_GROUP){
						//recursively restore decorative properties from current modify decorate object's sub decorate list.
						restoreDecorate(modifyDecorate.getDecorateList());
					}
				}
			}	
		}
		
	}


        /** redo decorate change, this action can simply apply the top level objects in list.
         *  all the sub-objects' decorate will automatically change.
         *
	 *  @param decorateList A ModifyDecorate object list.
	 */
	protected  void redoDecorate(List decorateList){
		if (decorateList==null || decorateList.size()==0)
			return;
		
		if (m_newDecorate==null)
			return;
			
		Iterator it	=decorateList.iterator();
		while (it!=null && it.hasNext()){
			Object obj	=it.next();
			if (obj instanceof ModifyDecorate){
				//redo decorative property change.
				ModifyDecorate modifyDecorate =(ModifyDecorate)obj;
				int objectId	=modifyDecorate.getObjectId();
				AbstractObject aObj	=getObject(objectId,false);
				if (aObj!=null){
					setDecorate(aObj,m_newDecorate); 	
				}
			}	
		}
	}

	
	/**Get a specified decorative property from an object*/
	protected abstract AbstractObject getDecorate(AbstractObject obj);
	/**Set a new decorative property to an object*/
	protected abstract void setDecorate(AbstractObject obj,AbstractObject decorate);
	
        
        //get current top-level object list in m_decorateList.
	protected List getCurrentObjectList(){
		//return a selection of objects.
		List ret	=new ArrayList();
		Iterator it	=m_decorateList.iterator();
		while (it!=null && it.hasNext()){
			ModifyDecorate modifyDecorate =(ModifyDecorate)it.next();
			int objectId	=modifyDecorate.getObjectId();
			
			AbstractObject obj=getObject(objectId,false);
			if (obj!=null){
				ret.add(obj);
			}
		}

		return ret;
	}



	/** undo this operation 
	 *  @return new objects selected
	 */
	public List undo(){
		//restore decorate first.
		restoreDecorate(m_decorateList);
		return getCurrentObjectList();
	}


	/** redo this operation
	 *  @return new objects selected
	 */
	public List redo(){    
		//redo decorate change by m_newDecorate.
		redoDecorate(m_decorateList);

		return getCurrentObjectList();
	}




	
}

⌨️ 快捷键说明

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