`
defrag_sly
  • 浏览: 129713 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

eclipse中对redo与undo的支持

阅读更多
大家在使用eclipse时,一定对ctrl+z和ctrl+r使用起来感觉比较爽。这个功能的基础是
Org.eclipse.core.commands.operations包的IUndoableOperation可撤销的操作,OperationHistory操作历史记录,IUndoContext撤销上下文目录,OperationHistory负责执行并记录Operation。IUndoContext作为检索operation的key,OperationHistory根据IUndoContext是否匹配来判断该操作是否要执行撤销。通过IUndoContext可以将操作局限到某一层次上进行撤销,例如一个操作仅在一个view/editor内可以撤销,或者一个操作可以在多个view内撤销(jdt的重构功能),或者一个操作可以在所有的范围(workbanch)内撤销。获得可以在所有范围内撤销的IUndoContext:
IOperationHistory operationHistory = workbench.getOperationSupport().getOperationHistory();
	IUndoContext undoContext = workbench.getOperationSupport().getUndoContext();

也可以根据view/editor的含义,实现IUndoContext接口,定义一个有含义的IUndoContext。
对eclipse工作空间(workspace)的操作,eclipse建议使用
IUndoContext workspaceContext = (IUndoContext)ResourcesPlugin.getWorkspace().getAdapter(IUndoContext.class);

获得上下文这样可以协同eclipse提供的插件一起工作(package explorer等等)。

做一个例子。
package org.rufus.operation.sample.views;

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;

public class MYOperation extends AbstractOperation {

	private SampleView part;

	public MYOperation(SampleView part) {
		super("MYOperation");
		this.part = part;
	}

	@Override
	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
			throws ExecutionException {
		part.setDifInput();
		return Status.OK_STATUS;
	}

	@Override
	public IStatus redo(IProgressMonitor monitor, IAdaptable info)
			throws ExecutionException {
		execute(null, null);
		return Status.OK_STATUS;
	}

	@Override
	public IStatus undo(IProgressMonitor monitor, IAdaptable info)
			throws ExecutionException {
		part.setDefaultInput();
		return Status.OK_STATUS;
	}
}

package org.rufus.operation.sample.views;
import org.eclipse.core.commands.operations.IUndoContext;
public class MyUndoContext implements IUndoContext {
	public String getLabel() {
		return "my context";
	}
	public boolean matches(IUndoContext context) {
		//过滤重做操作,只有在SampleView中才可以重做
		return context instanceof MyUndoContext;
	}
}

package org.rufus.operation.sample.views;

import java.util.ArrayList;

import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.operations.IOperationHistory;
import org.eclipse.core.commands.operations.IUndoableOperation;
import org.eclipse.core.commands.operations.OperationHistoryFactory;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.operations.UndoRedoActionGroup;
import org.eclipse.ui.part.DrillDownAdapter;
import org.eclipse.ui.part.ViewPart;


public class SampleView extends ViewPart {
	private TreeViewer viewer;
	private DrillDownAdapter drillDownAdapter;
	class TreeObject implements IAdaptable {
		private String name;
		private TreeParent parent;

		public TreeObject(String name) {
			this.name = name;
		}

		public String getName() {
			return name;
		}

		public void setParent(TreeParent parent) {
			this.parent = parent;
		}

		public TreeParent getParent() {
			return parent;
		}

		public String toString() {
			return getName();
		}

		public Object getAdapter(Class key) {
			return null;
		}
	}

	class TreeParent extends TreeObject {
		private ArrayList children;

		public TreeParent(String name) {
			super(name);
			children = new ArrayList();
		}

		public void addChild(TreeObject child) {
			children.add(child);
			child.setParent(this);
		}

		public void removeChild(TreeObject child) {
			children.remove(child);
			child.setParent(null);
		}

		public TreeObject[] getChildren() {
			return (TreeObject[]) children.toArray(new TreeObject[children
					.size()]);
		}

		public boolean hasChildren() {
			return children.size() > 0;
		}
	}

	private TreeParent invisibleRoot;
	private Action undoable;

	class ViewContentProvider implements IStructuredContentProvider,
			ITreeContentProvider {

		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
		}

		public void dispose() {
		}

		public Object[] getElements(Object parent) {
			if (parent.equals(getViewSite())) {
				if (invisibleRoot == null)
					initialize();
				return getChildren(invisibleRoot);
			}
			return getChildren(parent);
		}

		public Object getParent(Object child) {
			if (child instanceof TreeObject) {
				return ((TreeObject) child).getParent();
			}
			return null;
		}

		public Object[] getChildren(Object parent) {
			if (parent instanceof TreeParent) {
				return ((TreeParent) parent).getChildren();
			}
			return new Object[0];
		}

		public boolean hasChildren(Object parent) {
			if (parent instanceof TreeParent)
				return ((TreeParent) parent).hasChildren();
			return false;
		}		
		private void initialize() {
			TreeParent root = createDefaultInput();
			createTreeRoot(root);
		}
	}

	private void createTreeRoot(TreeParent root) {
		invisibleRoot = new TreeParent("");
		invisibleRoot.addChild(root);
	}

	private TreeParent createDefaultInput() {
		TreeObject to1 = new TreeObject("Leaf 1");
		TreeObject to2 = new TreeObject("Leaf 2");
		TreeObject to3 = new TreeObject("Leaf 3");
		TreeParent p1 = new TreeParent("Parent 1");
		p1.addChild(to1);
		p1.addChild(to2);
		p1.addChild(to3);

		TreeObject to4 = new TreeObject("Leaf 4");
		TreeParent p2 = new TreeParent("Parent 2");
		p2.addChild(to4);

		TreeParent root = new TreeParent("Root");
		root.addChild(p1);
		root.addChild(p2);
		return root;
	}

	private TreeParent createDifInput() {
		TreeObject to1 = new TreeObject("File");
		TreeObject to2 = new TreeObject("File");
		TreeObject to3 = new TreeObject("File");
		TreeParent p1 = new TreeParent("Folder");
		p1.addChild(to1);
		p1.addChild(to2);
		p1.addChild(to3);

		TreeObject to4 = new TreeObject("File");
		TreeParent p2 = new TreeParent("Folder");
		p2.addChild(to4);

		TreeParent root = new TreeParent("Folder");
		root.addChild(p1);
		root.addChild(p2);
		return root;
	}

	class ViewLabelProvider extends LabelProvider {

		public String getText(Object obj) {
			return obj.toString();
		}

		public Image getImage(Object obj) {
			String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
			if (obj instanceof TreeParent)
				imageKey = ISharedImages.IMG_OBJ_FOLDER;
			return PlatformUI.getWorkbench().getSharedImages().getImage(
					imageKey);
		}
	}

	public void setDifInput() {
		this.createTreeRoot(this.createDifInput());
		viewer.setInput(getViewSite());
	}

	public void setDefaultInput() {
		this.createTreeRoot(this.createDefaultInput());
		viewer.setInput(getViewSite());
	}

	/**
	 * The constructor.
	 */
	public SampleView() {
	}

	/**
	 * This is a callback that will allow us to create the viewer and initialize
	 * it.
	 */
	public void createPartControl(Composite parent) {
		viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
		drillDownAdapter = new DrillDownAdapter(viewer);
		viewer.setContentProvider(new ViewContentProvider());
		viewer.setLabelProvider(new ViewLabelProvider());
		viewer.setInput(getViewSite());
		makeActions();
		contributeToActionBars();
	}

	private void contributeToActionBars() {
		IActionBars bars = getViewSite().getActionBars();
		bars.getToolBarManager().add(undoable);
		//在sampleview的site下,创建redoundoaction支持MyUndoContext,
// fillActionBars是将redo,undoaction注册为全局action。当part切换时,
//retargetaction会重新设置相应的全局action handler
		new UndoRedoActionGroup(getSite(), new MyUndoContext(), true)
				.fillActionBars(bars);

	}

	private void makeActions() {
		undoable = new Action() {
			public void run() {
				//创建重做Operation
				IUndoableOperation operation = new MYOperation(SampleView.this);
				IOperationHistory operationHistory = OperationHistoryFactory
						.getOperationHistory();
				//设置特定的UndoContext
				operation.addContext(new MyUndoContext());
				try {
					//运行Operation
					operationHistory.execute(operation, null, null);
				} catch (ExecutionException e) {
					e.printStackTrace();
				}
			}
		};
		undoable.setText("Undoable");
		undoable.setToolTipText("Undoable Action  tooltip");
		undoable.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
				.getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));

	}

	/**
	 * Passing the focus request to the viewer's control.
	 */
	public void setFocus() {
		viewer.getControl().setFocus();
	}
}

点击I后,使用ctrl+z,ctrl+y进行撤销,恢复操作。



  • 大小: 10.6 KB
3
0
分享到:
评论

相关推荐

    Eclipse中英文菜单对照表

    Eclipse是一款广泛使用的开源集成开发环境(IDE),支持多种编程语言,尤其是Java开发。对于初学者来说,掌握Eclipse的各种功能菜单是十分重要的。本文将详细介绍Eclipse中的各种菜单项及其对应的中文含义,帮助初学...

    Eclipse-界面中英文对照 汉化界面与英文界面对照

    2. Edit(编辑)菜单:主要用于编辑代码,提供了代码编辑的基本操作,包括撤销(Undo)、重做(Redo)、剪切(Cut)、复制(Copy)、粘贴(Paste)、查找(Find)、替换(Replace)等。"Expand Selection To"是其中...

    Eclipse SDK Undoable Operation Support

    Eclipse SDK 提供的撤销/重做(Undo/Redo)操作支持是开发环境中不可或缺的功能,它使得开发者能够在代码编辑过程中方便地恢复或撤销错误的操作。这个功能在Eclipse的内核中通过一种称为“Undoable Operations”的...

    Eclipse中文教程

    【Edit】菜单主要涉及到编辑器内的文本操作,如`Undo`和`Redo`实现撤销和重做,`Cut`、`Copy`和`Paste`执行剪切、复制和粘贴,`Delete`删除选中内容,`Select All`全选,以及`Find/Replace`查找和替换功能。...

    emf eclipse

    GEF是Eclipse中的图形编辑框架,常与EMF结合使用,用于创建可拖放、可编辑的图形界面。文件“如何使EMF模型对应的编辑控件能处理Undo&Redo操作”则揭示了一个常见需求,即在模型编辑中实现撤销/重做功能,这是任何...

    Eclipse界面中英文对照.pdf

    Eclipse界面中英文对照 Eclipse是目前最流行的Java集成开发环境(IDE),它提供了丰富的功能和自定义选项,以满足不同的开发需求。了解Eclipse界面的英文对照是非常重要的,因为它可以帮助开发者快速熟悉Eclipse的...

    eclipse菜单解释及中英对照

    本文将详细介绍Eclipse中的主要菜单选项及其功能,并提供中英文对照,帮助初学者更好地理解和使用Eclipse。 #### 二、File(文件)菜单 **File** 菜单提供了与文件相关的操作,包括创建新项目、打开现有项目、保存...

    eclipse快捷键&myeclipse8.0注册码

    Eclipse是一款广泛使用的Java开发集成环境,而MyEclipse是其商业版本,增加了对Web、Java EE和企业级应用的支持。 首先,我们来详细探讨Eclipse的快捷键。在编程世界里,熟练使用快捷键能极大地提高开发效率,减少...

    Eclipseの日本語のコンピュータの語彙

    根据给定文件的信息,我们可以提炼出与"Eclipseの日本語のコンピュータの語彙"相关的IT日语词汇及英日菜单对照知识点。以下是对这些知识点的详细阐述: ### Eclipseの日本語のコンピュータの語彙 #### Eclipse ...

    eclipse快捷键

    7. **撤销与重做(Undo & Redo)**: - `Ctrl+Z`用于撤销上一步操作,而`Ctrl+Y`则用于重做。 8. **选取与移动(Selection)**: - 通过`Ctrl+A`可以快速全选文本,`Alt+Shift+方向键'↑'`和`Alt+Shift+方向键'↓...

    ReDo

    在编程环境中,特别是集成开发环境(IDEs)如Eclipse或IntelliJ IDEA中,"ReDo"功能通常作为用户界面的一部分,便于开发者在编写代码时进行误操作后的修复。 在Java中,可以利用设计模式来实现"ReDo"功能。例如,...

    DBeaver使用说明书.doc

    在 SQL 编辑器中,可以编写 SQL 语句,提供自动补全、redo/undo 等编辑功能。可以通过 set 语句设置参数,如 set mapreduce.job.queuename=root.default;。 连接 Hive DBeaver 带有配置有数据平台的 Hive 和 ...

    个人的总结的Eclipse快捷键集合希望对大家有用

    - **Ctrl+Z / Ctrl+Y (Undo / Redo)**:撤销和重做操作,用于恢复误操作或实验性修改。 通过熟练掌握这些Eclipse快捷键,开发者能够显著提升工作效率,减少重复劳动,更好地专注于代码质量和项目进度。在实际工作中...

    Eclipse 快捷键讲解

    Eclipse支持高度的个性化设置,可以通过菜单中的 `edit->contentAssist->addAlt+/`、`Window->NextEditor->addCtrl+Tab` 等方式来自定义快捷键。此外,还可以通过 `Source->Surround with try/catch Block->Ctrl+...

    myeclipse-eclipse快捷键大全.txt

    ### MyEclipse与Eclipse快捷键大全解析 #### 标题和描述中的知识点解析 **标题:“myeclipse-eclipse快捷键大全”** - **MyEclipse与Eclipse**: 这两个是流行的集成开发环境(IDE),主要用于Java开发。虽然它们在...

    eclipse常用快捷键说明

    Ctrl+Z/Ctrl+Y(Undo/Redo)** - **功能介绍**:撤销/重做。 - **应用场景**:当误操作时,可以使用此快捷键恢复到上一步或重做已撤销的操作。 #### 五、多窗口操作快捷键 **1. Ctrl+F6/Ctrl+Shift+F6(Next ...

    eclipse快捷键大全

    本文将对Eclipse中的常用快捷键进行详细介绍,并结合标题、描述以及部分内容,全面解析这些快捷键的功能与应用场景。 #### 一、代码提示与补全 **ALT+/(Content Assist)** 此快捷键主要用于代码提示和自动补全...

Global site tag (gtag.js) - Google Analytics