📄 jfoperationmodifydecorate.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 + -