selectsameaction.java

来自「mywork是rcp开发的很好的例子」· Java 代码 · 共 67 行

JAVA
67
字号
package net.sf.freenote.action;

import java.util.ArrayList;
import java.util.List;

import net.sf.freenote.FreeNoteConstants;
import net.sf.freenote.parts.ShapeEditPart;

import org.eclipse.gef.EditPart;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
import org.eclipse.gef.ui.actions.SelectionAction;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.IWorkbenchPart;

/**
 * 选择Model类型相同的形体
 * @author levin
 * @since 2008-2-23 下午01:22:43
 */
public class SelectSameAction extends SelectionAction {
	
	public SelectSameAction(IWorkbenchPart part) {
		super(part);
		setText("Select Same");
		setToolTipText("批量选择类型相同的形体");
		setId(FreeNoteConstants.SELECT_SAME);
	}

	@Override
	protected boolean calculateEnabled() {
		//选中一个时
		if(getSelectedObjects().size() == 1)
			return true;
		return false;
	}

	@Override
	public void run() {
		GraphicalViewer viewer = (GraphicalViewer)getWorkbenchPart().getAdapter(GraphicalViewer.class);
		if (viewer != null){
			//取第一个形体的类型
			Class clazz=((EditPart)getSelectedObjects().get(0)).getModel().getClass();
			List<AbstractGraphicalEditPart> list=new ArrayList<AbstractGraphicalEditPart>();
			visit((AbstractGraphicalEditPart) viewer.getContents(),list,clazz);
			viewer.setSelection(new StructuredSelection(list));
		}	
	}

	//递归判断是否为指定类型的editpart
	private void visit(AbstractGraphicalEditPart parent, List<AbstractGraphicalEditPart> list, Class clazz) {
		for(Object o: parent.getChildren()){
			visit((AbstractGraphicalEditPart) o,list,clazz);
		}
		//遍历连线
		for(Object o: parent.getSourceConnections()){
			visit((AbstractGraphicalEditPart) o,list,clazz);
		}
		for(Object o: parent.getTargetConnections()){
			visit((AbstractGraphicalEditPart) o,list,clazz);
		}
		
		if(parent.getModel().getClass() == clazz)
			list.add(parent);
	}
}

⌨️ 快捷键说明

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