/** * <p>Copyright: Copyright (c) 2009</p> * <p>Company: �������ӹɷ����޹�˾</p> */ package com.hundsun.ares.studio.ui.editor.actions; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import org.eclipse.emf.common.command.Command; import org.eclipse.emf.common.command.CompoundCommand; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.edit.command.MoveCommand; import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.jface.viewers.ColumnViewer; /** * �ƶ������ϻ������� * @author liaogc */ public abstract class ColumnViewerMoveBuestAction extends ColumnViewerAction{ private boolean moveTop; /** * @param viewer * @param editingDomain */ protected ColumnViewerMoveBuestAction(ColumnViewer viewer, EditingDomain editingDomain, boolean moveTop) { super(viewer, editingDomain); this.moveTop = moveTop; } /** * @return the owner */ protected abstract EObject getOwner(); /** * @return the reference */ protected abstract EReference getReference(); /** * * @param objects * @return */ protected boolean isCommonContainer(EObject[] objects) { Collection collection = (Collection) getOwner().eGet(getReference()); for (EObject eObject : objects) { if (!collection.contains(eObject)) { return false; } } return true; } @Override protected Command createCommand() { if (getOwner() == null || getReference() == null) { return null; } List<Object> selectedObjects = getSelectedObjects(); if (selectedObjects.isEmpty()) { return null; } // EObject owner = objects[0].eContainer(); // EReference reference = objects[0].eContainmentFeature(); final EList<Object> list = (EList<Object>) getOwner().eGet(getReference()); // ģ��������б� List<Object> tmpList = new ArrayList<Object>(list); // sort(tmpList,selectedObjects); // ǿת��ǰ���ж��Ƿ�EObject���� for (Object obj : selectedObjects) { if (!(obj instanceof EObject)) return null; } EObject[] objects = selectedObjects.toArray(new EObject[selectedObjects.size()]); if (!isCommonContainer(objects)) { return null; } boolean needChanged = false; if (moveTop) { if(0 == tmpList.indexOf(objects[0])){ //��һ��ѡ�ж������ǵ�һ�� return null; } for (int i = 0; i < objects.length; i++) { int index = tmpList.indexOf(objects[i]); Collections.swap(tmpList, index, i); needChanged = true; } } else { if((tmpList.size() - 1) == tmpList.indexOf(objects[objects.length - 1])){ //���һ��ѡ�ж����������һ�� return null; } int i = objects.length - 1; int j = 1; for (; i > -1 ; i--) { int index = tmpList.indexOf(objects[i]); if(tmpList.size()-j>0){ Collections.swap(tmpList, index, tmpList.size()-j); needChanged = true; j++; } } } // ���˳���ޱ仯����Ҫִ������ if (!needChanged) { return null; } CompoundCommand command = new CompoundCommand(getText()); if (moveTop) { //���ƺ����ƴ���һ��,����ʱҪ���ƶ��������Ǹ�������ʱҪ���ƶ�������� for (Object object : selectedObjects) { command.append(MoveCommand.create(getEditingDomain(), getOwner(), getReference(), object, tmpList.indexOf(object))); } }else{ for (int i = (selectedObjects.size() -1); i > -1 ; i--) { Object object = selectedObjects.get(i); command.append(MoveCommand.create(getEditingDomain(), getOwner(), getReference(), object, tmpList.indexOf(object))); } } return command.unwrap(); } }