/**
* <p>Copyright: Copyright 2010</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.ui.grid.tree;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.operations.AbstractOperation;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.viewers.TreePath;
import com.hundsun.ares.studio.core.model.ICreateInstance;
/**
* �ɳ���������������item����
* @author maxh
*
*/
public class GridTreeAddItemOperation extends AbstractOperation {
GridTreeViewerExComponent component;
TreePath[] paths;
List addItems;
List realItems = new ArrayList();;
int index = 0;
public GridTreeAddItemOperation(String label,GridTreeViewerExComponent component,TreePath[] paths,List addItems) {
super(label);
this.component = component;
this.paths = paths;
this.addItems = addItems;
}
@Override
public IStatus execute(IProgressMonitor monitor, IAdaptable info)
throws ExecutionException {
List input;
if(component.getInput() instanceof List){
input = (List)component.getInput();
}else{
return Status.CANCEL_STATUS;
}
if(paths.length == 0){
return Status.CANCEL_STATUS;
}
TreePath parentPath = paths[0].getParentPath();
if (parentPath == TreePath.EMPTY) {
index = input.indexOf(paths[0].getLastSegment());
if (index == -1) {
index = input.size();
}
for (Object obj : addItems) {
Object realItem;
if(obj instanceof ICreateInstance){
realItem = ((ICreateInstance)obj).getNewInstance();
}else{
realItem = obj;
}
input.add(index, realItem);
realItems.add(realItem);
}
} else {
List<Object> lst = (List<Object>)component.getChildrenMap().get(parentPath.getLastSegment());
index = lst.indexOf(paths[0].getLastSegment());
if (index == -1) {
index = lst.size();
}
for (Object obj : addItems) {
Object realItem;
if(obj instanceof ICreateInstance){
realItem = ((ICreateInstance)obj).getNewInstance();
}else{
realItem = obj;
}
lst.add(index, realItem);
realItems.add(realItem);
}
}
component.getViewer().getGrid().setRedraw(false);
component.getViewer().refresh();
component.getViewer().getGrid().setRedraw(true);
component.getDirty().setValue(true);
return Status.OK_STATUS;
}
@Override
public IStatus redo(IProgressMonitor monitor, IAdaptable info)
throws ExecutionException {
return execute(monitor, info);
}
@Override
public IStatus undo(IProgressMonitor monitor, IAdaptable info)
throws ExecutionException {
List input;
if(component.getInput() instanceof List){
input = (List)component.getInput();
}else{
return Status.CANCEL_STATUS;
}
if(paths.length == 0){
return Status.CANCEL_STATUS;
}
TreePath parentPath = paths[0].getParentPath();
if (parentPath == TreePath.EMPTY) {
for (Object obj : realItems) {
input.remove(obj);
}
} else {
List<Object> lst = (List<Object>)component.getChildrenMap().get(parentPath.getLastSegment());
for (Object obj : realItems) {
lst.remove(obj);
}
}
component.getViewer().getGrid().setRedraw(false);
component.getViewer().refresh();
component.getViewer().getGrid().setRedraw(true);
component.getDirty().setValue(true);
return Status.OK_STATUS;
}
}