½ÇÇà Ãë¼Ò °¡´É ¿ÀÆÛ·¹À̼Ç

Workbench¿¡ Á¶Ä¡¸¦ Á¦°øÇÏ´Â ¿©·¯ °¡Áö ¸¹Àº ¹æ¹ýÀ» º¸¾ÒÁö¸¸ Á¶Ä¡ÀÇ run() ¸Þ¼Òµå ±¸Çö¿¡ ÃÊÁ¡À» µÎÁö ¾Ê¾Ò½À´Ï´Ù. ¸Þ¼ÒµåÀÇ ±¸Á¶´Â Áú¹®¿¡ µû¸¥ ƯÁ¤ Á¶Ä¡¿¡ µû¶ó ´Ù¸£Áö¸¸, Äڵ带 ½ÇÇà Ãë¼Ò °¡´É ¿ÀÆÛ·¹À̼ÇÀ¸·Î ±¸¼ºÇϸé Á¶Ä¡°¡ Ç÷§Æû ½ÇÇà Ãë¼Ò ¹× Àç½ÇÇà Áö¿ø¿¡ Âü¿©ÇÒ ¼ö ÀÖ½À´Ï´Ù.

Ç÷§ÆûÀº org.eclipse.core.commands.operations ÆÐŰÁö¿¡¼­ ½ÇÇà Ãë¼Ò °¡´É ¿ÀÆÛ·¹ÀÌ¼Ç ÇÁ·¹ÀÓ¿öÅ©¸¦ Á¦°øÇÕ´Ï´Ù. Äڵ带 run() ¸Þ¼Òµå ¾È¿¡ ±¸ÇöÇÏ¿© IUndoableOperationÀ» ÀÛ¼ºÇÔÀ¸·Î½á ½ÇÇà Ãë¼Ò ¹× Àç½ÇÇà¿¡ ÇØ´ç ¿ÀÆÛ·¹À̼ÇÀ» »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿ÀÆÛ·¹À̼ÇÀ» »ç¿ëÇϵµ·Ï Á¶Ä¡¸¦ º¯È¯ÇÏ´Â °ÍÀº °£´ÜÇϸç, ½ÇÇà Ãë¼Ò ¹× Àç½ÇÇà µ¿ÀÛ ÀÚü¸¦ ±¸ÇöÇÏ´Â °Í°ú´Â º°°³ÀÔ´Ï´Ù.

½ÇÇà Ãë¼Ò °¡´É ¿ÀÆÛ·¹ÀÌ¼Ç ¾²±â

¾ÆÁÖ °£´ÜÇÑ ¿¹Á¦ºÎÅÍ ½ÃÀÛÇÕ´Ï´Ù. readme ¿¹Á¦ Ç÷¯±×Àο¡¼­ Á¦°øµÇ´Â °£´ÜÇÑ ViewActionDelegate¸¦ ´Ù½Ã È£ÃâÇϽʽÿÀ. È£ÃâµÉ ¶§ Á¶Ä¡´Â ´Ü¼øÈ÷ ½ÇÇàµÇ¾úÀ½À» ¹ßÇ¥ÇÏ´Â ´ëÈ­ »óÀÚ¸¦ ½ÇÇàÇÕ´Ï´Ù.

public void run(org.eclipse.jface.action.IAction action) {
	MessageDialog.openInformation(view.getSite().getShell(),
		MessageUtil.getString("Readme_Editor"),  
		MessageUtil.getString("View_Action_executed")); 
}
¿ÀÆÛ·¹ÀÌ¼Ç »ç¿ë ½Ã, run ¸Þ¼Òµå°¡ run ¸Þ¼Òµå¿¡¼­ ÀÌÀü¿¡ ¼öÇàÇÑ ÀÛ¾÷À» ¼öÇàÇÏ´Â ¿ÀÆÛ·¹À̼ÇÀ» ÀÛ¼ºÇϸç, ½ÇÇà Ãë¼Ò ¹× Àç½ÇÇà¿¡ ´ëÇØ ±â¾ïÇÒ ¼ö ÀÖµµ·Ï ¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮°¡ ¿ÀÆÛ·¹À̼ÇÀ» ½ÇÇàÇϵµ·Ï ¿äûÇÒ Ã¥ÀÓÀÌ ÀÖ½À´Ï´Ù.
public void run(org.eclipse.jface.action.IAction action) {
	IUndoableOperation operation = new ReadmeOperation(
		view.getSite().getShell()); 
	...
	operationHistory.execute(operation, null, null);
}
¿ÀÆÛ·¹À̼ÇÀº run ¸Þ¼ÒµåÀÇ ÀÌÀü µ¿ÀÛÀ» Æ÷ÇÔÇÒ »Ó ¾Æ´Ï¶ó ¿ÀÆÛ·¹À̼ǿ¡ ´ëÇÑ ½ÇÇà Ãë¼Ò ¹× Àç½ÇÇ൵ Æ÷ÇÔÇÕ´Ï´Ù.
class ReadmeOperation extends AbstractOperation {
	Shell shell;
	public ReadmeOperation(Shell shell) {
		super("Readme Operation");
		this.shell = shell;
	}
	public IStatus execute(IProgressMonitor monitor, IAdaptable info) {
		MessageDialog.openInformation(shell,
		MessageUtil.getString("Readme_Editor"),  
		MessageUtil.getString("View_Action_executed")); 
		return Status.OK_STATUS;
	}
	public IStatus undo(IProgressMonitor monitor, IAdaptable info) {
		MessageDialog.openInformation(shell,
		MessageUtil.getString("Readme_Editor"),  
			"Undoing view action");   
		return Status.OK_STATUS;
	}
	public IStatus redo(IProgressMonitor monitor, IAdaptable info) {
		MessageDialog.openInformation(shell,
		MessageUtil.getString("Readme_Editor"),  
			"Redoing view action");   
		return Status.OK_STATUS;
	}
}

´Ü¼ø Á¶Ä¡ÀÇ °æ¿ì, ¸ðµç ³ÊÆ® ¹× º¼Æ® ÀÛ¾÷À» ¿ÀÆÛ·¹ÀÌ¼Ç Å¬·¡½º·Î À̵¿ÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ °æ¿ì, ÀÌÀü Á¶Ä¡ Ŭ·¡½º¸¦ ¸Å°³º¯¼öÈ­µÈ ´ÜÀÏ Á¶Ä¡ Ŭ·¡½º·Î Á¢´Â °ÍÀÌ ÀûÀýÇÒ ¼ö ÀÖ½À´Ï´Ù. Á¶Ä¡´Â ´ÜÁö ½ÇÇàÇÒ ½Ã°£ÀÌ µÇ¸é Á¦°øµÈ ¿ÀÆÛ·¹À̼ÇÀ» ½ÇÇàÇÕ´Ï´Ù. ÀÌ´Â ÀÀ¿ëÇÁ·Î±×·¥ µðÀÚÀÎ °áÁ¤ÀÔ´Ï´Ù.

Á¶Ä¡°¡ ¸¶¹ý»ç¸¦ ½ÇÇàÇÒ ¶§ ¿ÀÆÛ·¹À̼ÇÀº ÀϹÝÀûÀ¸·Î ¸¶¹ý»çÀÇ performFinish() ¸Þ¼Òµå³ª ¸¶¹ý»ç ÆäÀÌÁöÀÇ finish() ¸Þ¼ÒµåÀÇ ºÎºÐÀ¸·Î ÀÛ¼ºµË´Ï´Ù. ¿ÀÆÛ·¹À̼ÇÀ» »ç¿ëÇϱâ À§ÇØ finish ¸Þ¼Òµå¸¦ º¯È¯ÇÏ´Â °ÍÀº run ¸Þ¼Òµå º¯È¯°ú ºñ½ÁÇÕ´Ï´Ù. ÀÌ ¸Þ¼Òµå°¡ ÀÌÀü¿¡ ÀζóÀÎÀ¸·Î ¼öÇàµÈ ÀÛ¾÷À» ¼öÇàÇÏ´Â ¿ÀÆÛ·¹ÀÌ¼Ç ÀÛ¼º ¹× ½ÇÇàÀ» Ã¥ÀÓÁý´Ï´Ù.

¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮

Áö±Ý±îÁö ¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮¸¦ ½ÇÁ¦·Î ¼³¸íÇÏÁö ¾Ê°í »ç¿ëÇß½À´Ï´Ù. ¿¹Á¦ ¿ÀÆÛ·¹À̼ÇÀ» ÀÛ¼ºÇÏ´Â Äڵ带 ´Ù½Ã º¸½Ê½Ã¿À.

public void run(org.eclipse.jface.action.IAction action) {
	IUndoableOperation operation = new ReadmeOperation(
		view.getSite().getShell()); 
	...
	operationHistory.execute(operation, null, null);
}
¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮¶õ ¹«¾ùÀԴϱî? IOperationHistory´Â ¸ðµç ½ÇÇà Ãë¼Ò °¡´É ¿ÀÆÛ·¹À̼ÇÀÇ ÃßÀûÇÏ´Â ¿ÀºêÁ§Æ®¿¡ ´ëÇÑ ÀÎÅÍÆäÀ̽º¸¦ Á¤ÀÇÇÕ´Ï´Ù. ¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮°¡ ¿ÀÆÛ·¹À̼ÇÀ» ½ÇÇàÇÒ ¶§ ¸ÕÀú ¿ÀÆÛ·¹À̼ÇÀ» ½ÇÇàÇÑ ÈÄ À̸¦ ½ÇÇà Ãë¼Ò È÷½ºÅ丮¿¡ Ãß°¡ÇÕ´Ï´Ù. ¿ÀÆÛ·¹À̼ÇÀ» ½ÇÇà Ãë¼Ò ¹× Àç½ÇÇàÇÏ·Á´Â Ŭ¶óÀÌ¾ðÆ®´Â IOperationHistory ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇÏ¿© ÇØ´ç ÀÛ¾÷À» ¼öÇàÇÕ´Ï´Ù.

ÀÀ¿ëÇÁ·Î±×·¥ÀÌ »ç¿ëÇÏ´Â ¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮´Â ¿©·¯ °¡Áö ¹æ¹ýÀ¸·Î °Ë»öÇÒ ¼ö ÀÖ½À´Ï´Ù. °¡Àå °£´ÜÇÑ ¹æ¹ýÀº OperationHistoryFactory¸¦ »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù.

IOperationHistory operationHistory = OperationHistoryFactory.getOperationHistory();

¶ÇÇÑ Workbench¸¦ »ç¿ëÇÏ¿© ¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮¸¦ °Ë»öÇÒ ¼öµµ ÀÖ½À´Ï´Ù. Workbench´Â ±âº» ¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮¸¦ ±¸¼ºÇÏ¸ç ¶ÇÇÑ À̸¦ ¾×¼¼½ºÇϱâ À§ÇÑ ÇÁ·ÎÅäÄÝÀ» Á¦°øÇÕ´Ï´Ù. ´ÙÀ½ ½º´ÏÆêÀº Workbench¿¡¼­ ¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮¸¦ ¾ò´Â ¹æ¹ýÀ» º¸¿©ÁÝ´Ï´Ù.

IWorkbench workbench = view.getSite().getWorkbenchWindow().getWorkbench();
IOperationHistory operationHistory = workbench.getOperationSupport().getOperationHistory();
¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮¸¦ ¾òÀº ÈÄ À̸¦ »ç¿ëÇÏ¿© ½ÇÇà Ãë¼Ò ¶Ç´Â Àç½ÇÇà È÷½ºÅ丮¸¦ Á¶È¸Çϰųª ½ÇÇà Ãë¼Ò ¶Ç´Â Àç½ÇÇà¿¡ ´ëÇÑ ¼±»ó¿¡¼­ ´ÙÀ½ÀÌ ¾î¶² ¿ÀÆÛ·¹À̼ÇÀÎÁö È®ÀÎÇϰųª ƯÁ¤ ¿ÀÆÛ·¹À̼ÇÀ» ½ÇÇà Ãë¼Ò ¶Ç´Â Àç½ÇÇàÇÒ ¼ö ÀÖ½À´Ï´Ù. Ŭ¶óÀÌ¾ðÆ®´Â È÷½ºÅ丮¿¡ ´ëÇÑ º¯°æ¿¡ °üÇÑ ¾Ë¸²À» ¹Þ±â À§ÇØ IOperationHistoryListener¸¦ Ãß°¡ÇÒ ¼ö ÀÖ½À´Ï´Ù. ±âŸ ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇÏ¿© Ŭ¶óÀÌ¾ðÆ®°¡ È÷½ºÅ丮¿¡ ´ëÇÑ ÇѰ踦 ¼³Á¤Çϰųª ƯÁ¤ ¿ÀÆÛ·¹À̼ǿ¡ ´ëÇÑ º¯°æ¿¡ ´ëÇØ ¸®½º³Ê¿¡ ¾Ë¸± ¼ö ÀÖ½À´Ï´Ù. ÇÁ·ÎÅäÄÝÀ» »ó¼¼È÷ ¾Ë¾Æº¸±â Àü¿¡ ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®¸¦ ÀÌÇØÇØ¾ß ÇÕ´Ï´Ù.

½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®

¿ÀÆÛ·¹À̼ÇÀº ÀÛ¼ºµÉ ¶§ ¿ø·¡ ¿ÀÆÛ·¹À̼ÇÀÌ ¼öÇàµÈ »ç¿ëÀÚ ÄÁÅØ½ºÆ®¸¦ ±â¼úÇÏ´Â ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®°¡ ÁöÁ¤µË´Ï´Ù. ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®´Â ÀϹÝÀûÀ¸·Î ½ÇÇà Ãë¼Ò °¡´É ¿ÀÆÛ·¹À̼ÇÀ» ½ÃÀÛÇÑ º¸±â ¶Ç´Â ÆíÁý±â¿¡ Á¾¼ÓµË´Ï´Ù. ¿¹¸¦ µé¾î, ÆíÁý±â ³»¿¡¼­ ¼öÇàµÈ º¯°æ»çÇ×Àº Á¾Á¾ ÆíÁý±â¿¡¸¸ ÇØ´çµË´Ï´Ù. ÀÌ °æ¿ì, ÆíÁý±â´Â ÀÚüÀÇ °íÀ¯ÇÑ ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®¸¦ ÀÛ¼ºÇϰí ÀÌ ÄÁÅØ½ºÆ®¸¦ ¿ÀÆÛ·¹À̼ǿ¡ ÁöÁ¤ÇØ¾ß ÇÕ´Ï´Ù. ±×·¯¸é È÷½ºÅ丮¿¡ Ãß°¡µË´Ï´Ù. ÀÌ ¹æ¹ý¿¡¼­ ÆíÁý±â¿¡¼­ ¼öÇàµÈ ¸ðµç ¿ÀÆÛ·¹À̼ÇÀº ·ÎÄ÷Π°£ÁÖµÇ°í ¹Ý °³ÀοëÀÔ´Ï´Ù. °øÀ¯ ¸ðµ¨¿¡ ´ëÇØ ÀÛµ¿ÇÏ´Â º¸±â ¹× ÆíÁý±â´Â Á¾Á¾ Á¶ÀÛÇϰí ÀÖ´Â ¸ðµ¨¿¡ °ü·ÃµÈ ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®¸¦ »ç¿ëÇÕ´Ï´Ù. º¸´Ù ÀϹÝÀûÀÎ ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®¸¦ »ç¿ëÇϸé ÇϳªÀÇ º¸±â ¶Ç´Â ÆíÁý±â¿¡¼­ ¼öÇàµÈ ¿ÀÆÛ·¹À̼ÇÀÌ µ¿ÀÏÇÑ ¸ðµ¨¿¡ ÀÛµ¿ÇÏ´Â ´Ù¸¥ º¸±â ¶Ç´Â ÆíÁý±â¿¡¼­ÀÇ ½ÇÇà Ãë¼Ò¿¡ »ç¿ë °¡´ÉÇÒ ¼ö ÀÖ½À´Ï´Ù.

½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®´Â »ó´ëÀûÀ¸·Î µ¿ÀÛÀÌ ´Ü¼øÇÕ´Ï´Ù. IUndoContext¿¡ ´ëÇÑ ÇÁ·ÎÅäÄÝÀº ¾ÆÁÖ ÀÛ½À´Ï´Ù. ÄÁÅØ½ºÆ®ÀÇ ÁÖ ¿ªÇÒÀº ƯÁ¤ ¿ÀÆÛ·¹À̼ÇÀ» ´Ù¸¥ ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®¿¡¼­ ÀÛ¼ºµÇ´Â ¿ÀÆÛ·¹À̼ǰú ±¸º°Çϱâ À§ÇØ ÇØ´ç ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®¿¡ ¼ÓÇÏ´Â °ÍÀ¸·Î "ű×"ÇÏ´Â °ÍÀÔ´Ï´Ù. ±×·¯¸é ¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮°¡ ½ÇÇàµÈ ¸ðµç ½ÇÇà Ãë¼Ò °¡´É ¿ÀÆÛ·¹À̼ÇÀÇ ±Û·Î¹ú È÷½ºÅ丮¸¦ ÃßÀûÇÒ ¼ö ÀÖÀ¸¸ç, º¸±â¿Í ÆíÁý±â°¡ ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®¸¦ »ç¿ëÇÏ¿© ƯÁ¤ ½ÃÁ¡¿¡ ´ëÇØ È÷½ºÅ丮¸¦ ÇÊÅ͸µÇÒ ¼ö ÀÖ½À´Ï´Ù.

½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®´Â ½ÇÇà Ãë¼Ò °¡´É ¿ÀÆÛ·¹À̼ÇÀ» ÀÛ¼ºÇÏ´Â Ç÷¯±×Àο¡ ÀÇÇØ ÀÛ¼ºµÇ°Å³ª ¶Ç´Â API¸¦ ÅëÇØ ¾×¼¼½ºµÉ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î Workbench´Â Workbench ÀüüÀÇ ¿ÀÆÛ·¹À̼ǿ¡ »ç¿ëÇÒ ¼ö ÀÖ´Â ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®¿¡ ´ëÇÑ ¾×¼¼½º¸¦ Á¦°øÇÕ´Ï´Ù. ¾î¶² ¹æ¹ýÀ¸·Î ¾òµçÁö °£¿¡ ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®´Â ¿ÀÆÛ·¹À̼ÇÀÌ ÀÛ¼ºµÉ ¶§ ÁöÁ¤µÇ¾î¾ß ÇÕ´Ï´Ù. ´ÙÀ½ ½º´ÏÆêÀº readme Ç÷¯±×ÀÎÀÇ ViewActionDelegate°¡ Workbench ÀüüÀÇ ÄÁÅØ½ºÆ®¸¦ ±×ÀÇ ¿ÀÆÛ·¹À̼ǿ¡ ÁöÁ¤ÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁÝ´Ï´Ù.

public void run(org.eclipse.jface.action.IAction action) {
	IUndoableOperation operation = new ReadmeOperation(
		view.getSite().getShell()); 
	IWorkbench workbench = view.getSite().getWorkbenchWindow().getWorkbench();
	IOperationHistory operationHistory = workbench.getOperationSupport().getOperationHistory();
	IUndoContext undoContext = workbench.getOperationSupport().getUndoContext();
	operation.addContext(undoContext);
	operationHistory.execute(operation, null, null);
}

½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®¸¦ »ç¿ëÇÏ´Â ÀÌÀ¯´Â ¹«¾ùÀԴϱî? °³º° º¸±â ¹× ÆíÁý±â¿¡ ´ëÇØ º°µµÀÇ ¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮¸¦ »ç¿ëÇÏÁö ¾Ê´Â ÀÌÀ¯´Â ¹«¾ùÀԴϱî? °³º° ¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮 »ç¿ëÀº ¸ðµç ƯÁ¤ º¸±â ¶Ç´Â ÆíÁý±â°¡ °íÀ¯ÇÑ °³ÀÎ¿ë ½ÇÇà Ãë¼Ò È÷½ºÅ丮¸¦ À¯Áöº¸¼öÇÏ°í ½ÇÇà Ãë¼Ò°¡ ÀÀ¿ëÇÁ·Î±×·¥¿¡¼­ ±Û·Î¹ú Àǹ̰¡ ¾ø´Ù°í °¡Á¤ÇÕ´Ï´Ù. À̰ÍÀº ÀϺΠÀÀ¿ëÇÁ·Î±×·¥¿¡ ´ëÇØ ÀûÇÕÇÒ ¼ö ÀÖÀ¸¸ç, ÀÌ·± °æ¿ì °¢ º¸±â³ª ÆíÁý±â°¡ °íÀ¯ÇÑ °³º° ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®¸¦ ÀÛ¼ºÇØ¾ß ÇÕ´Ï´Ù. ´Ù¸¥ ÀÀ¿ëÇÁ·Î±×·¥Àº ¿ÀÆÛ·¹À̼ÇÀÌ ½ÃÀÛÇÑ º¸±â³ª ÆíÁý±â¿Í »ó°ü ¾øÀÌ ¸ðµç »ç¿ëÀÚ ¿ÀÆÛ·¹À̼ǿ¡ Àû¿ëµÇ´Â ±Û·Î¹ú ½ÇÇà Ãë¼Ò¸¦ ±¸ÇöÇϱ⠿øÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ °æ¿ì¿¡´Â Workbench ÄÁÅØ½ºÆ®°¡ È÷½ºÅ丮¿¡ ¿ÀÆÛ·¹À̼ÇÀ» Ãß°¡ÇÏ´Â ¸ðµç Ç÷¯±×Àο¡ ÀÇÇØ »ç¿ëµÇ¾î¾ß ÇÕ´Ï´Ù.

´õ º¹ÀâÇÑ ÀÀ¿ëÇÁ·Î±×·¥¿¡¼­´Â ½ÇÇà Ãë¼Ò°¡ ¿ÏÀüÈ÷ ·ÎÄÃÀ̰ųª ¿ÏÀüÈ÷ ±Û·Î¹úÀÌÁö ¾Ê½À´Ï´Ù. ´ë½Å, ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ® »çÀ̸¦ ³Ñ³ªµå´Â ÄÁÅØ½ºÆ®°¡ ÀÖ½À´Ï´Ù. À̰ÍÀº ¿ÀÆÛ·¹À̼ǿ¡ º¹¼ö ÄÁÅØ½ºÆ®¸¦ ÁöÁ¤ÇÏ¿© ´Þ¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î IDE Workbench º¸±â°¡ ¸ðµç ÀÛ¾÷°ø°£À» Á¶ÀÛÇϰí ÀÛ¾÷°ø°£À» ±×ÀÇ ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®·Î °£ÁÖÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÛ¾÷°ø°£ÀÇ Æ¯Á¤ ÀÚ¿ø¿¡ ´ëÇØ ¿­¸° ÆíÁý±â´Â ±×ÀÇ ¿ÀÆÛ·¹À̼ÇÀ» ´ëºÎºÐ ·ÎÄ÷Π°£ÁÖÇÒ ¼ö ÀÖ½À´Ï´Ù. ±×·¯³ª ÆíÁý±â ¾È¿¡¼­ ¼öÇàµÇ´Â ¿ÀÆÛ·¹À̼ÇÀº »ç½Ç»ó ƯÁ¤ ÀÚ¿ø°ú ÀÛ¾÷°ø°£ Àüü¿¡ ¸ðµÎ ¿µÇâÀ» ÁÙ ¼ö ÀÖ½À´Ï´Ù. (ÀÌ ÄÉÀ̽ºÀÇ ÁÁÀº ¿¹Á¦´Â JDT ¸®ÆÑÅ丵 Áö¿øÀ¸·Î, Java ¿ä¼Ò¿¡ ´ëÇÑ ±¸Á¶Àû º¯°æÀÌ ¼Ò½º ÆÄÀÏÀ» ÆíÁýÇÏ´Â Áß¿¡ ¹ß»ýÇϵµ·Ï Çã¿ëÇÕ´Ï´Ù.) ÀÌ·¯ÇÑ °æ¿ì¿¡´Â ÀÛ¾÷°ø°£À» Á¶ÀÛÇÏ´Â º¸±â»Ó ¾Æ´Ï¶ó, ÆíÁý±â ÀÚü¿¡¼­ ½ÇÇà Ãë¼Ò¸¦ ¼öÇàÇÒ ¼ö ÀÖµµ·Ï ¿ÀÆÛ·¹À̼ǿ¡µµ ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®¸¦ Ãß°¡ÇÒ ¼ö ÀÖ´Â °ÍÀÌ À¯¿ëÇÕ´Ï´Ù.

ÀÌÁ¦ ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®°¡ ¾î¶² ¿ªÇÒÀ» ÇÏ´ÂÁö ÀÌÇØÇßÀ¸¹Ç·Î, IOperationHistory¿¡ ´ëÇÑ ÇÁ·ÎÅäÄÝÀ» ´Ù½Ã Á¶»çÇÒ ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½ ½º´ÏÆêÀº ÀϺΠÄÁÅØ½ºÆ®¿¡ ½ÇÇà Ãë¼Ò¸¦ ¼öÇàÇÏ´Â µ¥ »ç¿ëµË´Ï´Ù.

IOperationHistory operationHistory = workbench.getOperationSupport().getOperationHistory();
         try {
	IStatus status = operationHistory.undo(myContext, progressMonitor, someInfo);
} catch (ExecutionException e) {
	// handle the exception 
}
È÷½ºÅ丮´Â ÁÖ¾îÁø ÄÁÅØ½ºÆ®¸¦ °®°í ±× ÀÚü¸¦ ½ÇÇà Ãë¼ÒÇϵµ·Ï ¿äûÇÏ´Â °¡Àå ÃÖ±Ù¿¡ ¼öÇàµÈ ¿ÀÆÛ·¹À̼ÇÀ» ¾ò½À´Ï´Ù. ±âŸ ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇÏ¿© ÄÁÅØ½ºÆ®¿¡ ´ëÇÑ Àüü ½ÇÇà Ãë¼Ò ¶Ç´Â Àç½ÇÇà È÷½ºÅ丮¸¦ °¡Á®¿À°Å³ª ƯÁ¤ ÄÁÅØ½ºÆ®¿¡¼­ ½ÇÇà Ãë¼Ò ¶Ç´Â Àç½ÇÇàµÉ ¿ÀÆÛ·¹À̼ÇÀ» ãÀ» ¼ö ÀÖ½À´Ï´Ù. ´ÙÀ½ ½º´ÏÆêÀº ƯÁ¤ ÄÁÅØ½ºÆ®¿¡¼­ ½ÇÇà Ãë¼ÒµÉ ¿ÀÆÛ·¹À̼ǿ¡ ´ëÇÑ ·¹À̺íÀ» ¾ò½À´Ï´Ù.
IOperationHistory operationHistory = workbench.getOperationSupport().getOperationHistory();
String label = history.getUndoOperation(myContext).getLabel();

±Û·Î¹ú ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ® IOperationHistory.GLOBAL_UNDO_CONTEXT¸¦ »ç¿ëÇÏ¿© ±Û·Î¹ú ½ÇÇà Ãë¼Ò È÷½ºÅ丮¸¦ ÂüÁ¶ÇÒ ¼ö ÀÖ½À´Ï´Ù. Áï, ƯÁ¤ ÄÁÅØ½ºÆ®¿¡ °ü°è¾øÀÌ È÷½ºÅ丮ÀÇ ¸ðµç ¿ÀÆÛ·¹À̼ÇÀ» ÂüÁ¶ÇÕ´Ï´Ù. ´ÙÀ½ ½º´ÏÆêÀº ±Û·Î¹ú ½ÇÇà Ãë¼Ò È÷½ºÅ丮¸¦ È®º¸ÇÕ´Ï´Ù.

IOperationHistory operationHistory = workbench.getOperationSupport().getOperationHistory();
IUndoableOperation [] undoHistory = operationHistory.getUndoHistory(IOperationHistory.GLOBAL_UNDO_CONTEXT);

¿ÀÆÛ·¹À̼ÇÀÌ ¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮 ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇÏ¿© ½ÇÇà, ½ÇÇà Ãë¼Ò ¶Ç´Â ´Ù½Ã ½ÇÇàµÉ ¶§¸¶´Ù Ŭ¶óÀÌ¾ðÆ®°¡ ¿ÀÆÛ·¹ÀÌ¼Ç ¼öÇà¿¡ ÇÊ¿äÇÒ ¼ö ÀÖ´Â ÁøÇà ¸ð´ÏÅÍ ¹× Ãß°¡ UI Á¤º¸¸¦ Á¦°øÇÒ ¼ö ÀÖ½À´Ï´Ù. ÀÌ Á¤º¸´Â ¿ÀÆÛ·¹ÀÌ¼Ç ÀÚü¿¡ Àü´ÞµË´Ï´Ù. ¿ø·¡ ¿¹Á¦¿¡¼­ readme Á¶Ä¡´Â ´ëÈ­ »óÀÚ¸¦ ¿©´Â µ¥ »ç¿ëÇÒ ¼ö ÀÖ´Â ½© ¸Å°³º¯¼ö·Î ¿ÀÆÛ·¹À̼ÇÀ» ±¸¼ºÇß½À´Ï´Ù. ½©À» ¿ÀÆÛ·¹À̼ǿ¡ ÀúÀåÇÏ´Â ´ë½Å, ´õ ÁÁÀº ¹æ¹ýÀº ¿ÀÆÛ·¹À̼ÇÀ» ½ÇÇàÇÏ´Â µ¥ ÇÊ¿äÇÑ ¸ðµç UI Á¤º¸¸¦ Á¦°øÇÏ´Â execute, undo ¹× redo ¸Þ¼Òµå¿¡ ¸Å°³º¯¼ö¸¦ Àü´ÞÇÏ´Â °ÍÀÔ´Ï´Ù. ÀÌµé ¸Å°³º¯¼ö´Â ¿ÀÆÛ·¹ÀÌ¼Ç ÀÚü¿¡ Àü´ÞµË´Ï´Ù.

public void run(org.eclipse.jface.action.IAction action) {
	IUndoableOperation operation = new ReadmeOperation();
	...
	operationHistory.execute(operation, null, infoAdapter);
}
infoAdapter´Â ÃÖ¼ÒÇÑ ´ëÈ­ »óÀÚ¸¦ ½ÇÇàÇÒ ¶§ »ç¿ëµÉ ¼ö ÀÖ´Â ½©À» Á¦°øÇÒ ¼ö ÀÖ´Â IAdaptableÀÔ´Ï´Ù. º» ¿¹Á¦ ¿ÀÆÛ·¹À̼ÇÀº ÀÌ ¸Å°³º¯¼ö¸¦ ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÕ´Ï´Ù.
	public IStatus execute(IProgressMonitor monitor, IAdaptable info) {
		if (info != null) {
			Shell shell = (Shell)info.getAdapter(Shell.class);
			if (shell != null) {
		MessageDialog.openInformation(shell,
		MessageUtil.getString("Readme_Editor"),  
		MessageUtil.getString("View_Action_executed")); 
            return Status.OK_STATUS;
		}
	}
		// do something else...
}

½ÇÇà Ãë¼Ò ¹× Àç½ÇÇà Á¶Ä¡ Çڵ鷯

Ç÷§ÆûÀº ƯÁ¤ ÄÁÅØ½ºÆ®¿¡ ´ëÇØ ½ÇÇà Ãë¼Ò ¹× Àç½ÇÇà Áö¿øÀ» Á¦°øÇϱâ À§ÇØ º¸±â ¹× ÆíÁý±â¿¡¼­ ±¸¼ºÇÒ ¼ö Àִ ǥÁØ ½ÇÇà Ãë¼Ò ¹× Àç½ÇÇà ´ë»ó ÀçÁöÁ¤ °¡´É Á¶Ä¡ Çڵ鷯¸¦ Á¦°øÇÕ´Ï´Ù. ÀÌ Á¶Ä¡ Çڵ鷯°¡ ÀÛ¼ºµÉ ¶§ ÄÁÅØ½ºÆ®°¡ ÁöÁ¤µÇ¹Ç·Î ¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮°¡ ÇØ´ç ƯÁ¤ º¸±â¿¡ ÀûÇÕÇÑ ¹æ¹ýÀ¸·Î ÇÊÅ͸µµË´Ï´Ù. Á¶Ä¡ Çڵ鷯´Â ÀǽÉÀÌ °¡´Â ÇöÀç ¿ÀÆÛ·¹À̼ÇÀ» Ç¥½ÃÇϱâ À§ÇØ ½ÇÇà Ãë¼Ò ¹× Àç½ÇÇà ·¹À̺íÀ» °»½ÅÇÏ¸ç ¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮¿¡ ÁøÇà ¸ð´ÏÅÍ ¹× UI Á¤º¸¸¦ Á¦°øÇÏ°í ¼±ÅÃÀûÀ¸·Î ÇöÀç ¿ÀÆÛ·¹À̼ÇÀÌ ¿Ã¹Ù¸£Áö ¾ÊÀ» ¶§ È÷½ºÅ丮¸¦ Á¦°ÅÇÕ´Ï´Ù. Á¶Ä¡ Çڵ鷯¸¦ ÀÛ¼ºÇϰí À̵éÀ» ±Û·Î¹ú ½ÇÇà Ãë¼Ò ¹× Àç½ÇÇà Á¶Ä¡¿¡ ÁöÁ¤ÇÏ´Â Á¶Ä¡ ±×·ìÀÌ ÆíÀÇ»ó Á¦°øµË´Ï´Ù.

new UndoRedoActionGroup(this.getSite(), undoContext, true);
¸¶Áö¸· ¸Å°³º¯¼ö´Â ½ÇÇà Ãë¼Ò ¹× Àç½ÇÇà¿¡ ´ëÇØ ÇöÀç »ç¿ë °¡´ÉÇÑ ¿ÀÆÛ·¹À̼ÇÀÌ ¿Ã¹Ù¸£Áö ¾ÊÀ» ¶§ ÁöÁ¤µÈ ÄÁÅØ½ºÆ®¿¡ ´ëÇÑ ½ÇÇà Ãë¼Ò ¹× Àç½ÇÇà È÷½ºÅ丮°¡ Æó±âµÇ¾î¾ß ÇÏ´ÂÁö ¿©ºÎ¸¦ Ç¥½ÃÇÏ´Â ºÎ¿ïÀÔ´Ï´Ù. ÀÌ ¸Å°³º¯¼öÀÇ ¼³Á¤Àº Á¦°øµÇ´Â ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ® ¹× ÇØ´ç ÄÁÅØ½ºÆ®°¡ ÀÖ´Â ¿ÀÆÛ·¹À̼ÇÀÌ »ç¿ëÇÏ´Â À¯È¿¼º °ËÁõ Àü·«¿¡ °ü°èµË´Ï´Ù.

ÀÀ¿ëÇÁ·Î±×·¥ ½ÇÇà Ãë¼Ò ¸ðµ¨

¾Õ¿¡¼­ ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®¸¦ »ç¿ëÇÏ¿© ¿©·¯ °¡Áö Á¾·ùÀÇ ÀÀ¿ëÇÁ·Î±×·¥ ½ÇÇà Ãë¼Ò ¸ðµ¨À» ±¸ÇöÇÏ´Â ¹æ¹ýÀ» º¸¾Ò½À´Ï´Ù. ¿ÀÆÛ·¹À̼ǿ¡ Çϳª ÀÌ»óÀÇ ÄÁÅØ½ºÆ®¸¦ ÁöÁ¤ÇÏ´Â ±â´ÉÀº ÀÀ¿ëÇÁ·Î±×·¥ÀÌ °¢ º¸±â ¶Ç´Â ÆíÁý±â¿¡ ¿ÏÀüÈ÷ ·ÎÄÃÀ̰ųª, ¿ÏÀüÈ÷ ¸ðµç Ç÷¯±×ÀÎ »çÀÌ¿¡ ±Û·Î¹úÀ̰ųª ±× »çÀÌÀÇ ¸ðµ¨ÀÎ ½ÇÇà Ãë¼Ò Àü·«À» ±¸ÇöÇÒ ¼ö ÀÖ°Ô ÇÕ´Ï´Ù. ½ÇÇà Ãë¼Ò ¹× Àç½ÇÇà°ú °ü·ÃµÈ ¶Ç ´Ù¸¥ µðÀÚÀÎ ÀÇ»ç°áÁ¤Àº ÀÓÀÇÀÇ ¿ÀÆÛ·¹À̼ÇÀÌ Ç×»ó ½ÇÇà Ãë¼Ò ¶Ç´Â Àç½ÇÇàµÉ ¼ö ÀÖ´ÂÁö ¾Æ´Ï¸é ¸ðµ¨ÀÌ ¿ÏÀüÈ÷ ¼±ÇüÀ̾ °¡Àå ÃÖ±ÙÀÇ ¿ÀÆÛ·¹À̼Ǹ¸ÀÌ ½ÇÇà Ãë¼Ò ¹× Àç½ÇÇà¿¡ ´ëÇØ °í·ÁµÇ´ÂÁö ¿©ºÎÀÔ´Ï´Ù.

IOperationHistory´Â Çã¿ëµÇ´Â »çÇ×À» ÆÇº°ÇÏ´Â °ÍÀ» °³º° ±¸Çö¿¡ ¸Ã±â´Â À¯¿¬ÇÑ ½ÇÇà Ãë¼Ò ¸ðµ¨À» Çã¿ëÇÏ´Â ÇÁ·ÎÅäÄÝÀ» Á¤ÀÇÇÕ´Ï´Ù. Áö±Ý±îÁö º» ½ÇÇà Ãë¼Ò ¹× Àç½ÇÇà ÇÁ·ÎÅäÄÝÀº ƯÁ¤ ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®¿¡¼­ ½ÇÇà Ãë¼Ò ¹× Àç½ÇÇà¿¡ »ç¿ë °¡´ÉÇÑ ÇϳªÀÇ ³»ÀçµÈ ¿ÀÆÛ·¹À̼ÇÀÌ ÀÖ´Ù°í °¡Á¤ÇÕ´Ï´Ù. Ŭ¶óÀÌ¾ðÆ®°¡ È÷½ºÅ丮¿¡¼­ÀÇ À§Ä¡¿Í »ó°ü ¾øÀÌ Æ¯Á¤ ¿ÀÆÛ·¹À̼ÇÀ» ½ÇÇàÇÒ ¼ö ÀÖ°Ô ÇÏ´Â Ãß°¡ ÇÁ·ÎÅäÄÝÀÌ Á¦°øµË´Ï´Ù. ÀÀ¿ëÇÁ·Î±×·¥¿¡ ÀûÇÕÇÑ ¸ðµ¨À» ±¸ÇöÇÒ ¼ö ÀÖµµ·Ï ¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮¸¦ ±¸¼ºÇÒ ¼ö ÀÖ½À´Ï´Ù. À̰ÍÀº ¿ÀÆÛ·¹À̼ÇÀÌ ½ÇÇà Ãë¼Ò ¶Ç´Â Àç½ÇÇàµÇ±â Àü¿¡ ¸ðµç ½ÇÇà Ãë¼Ò ¶Ç´Â Àç½ÇÇà ¿äûÀ» »çÀü¿¡ ½ÂÀÎÇÏ´Â µ¥ »ç¿ëµÇ´Â ÀÎÅÍÆäÀ̽ºÀ¸·Î ¿Ï·áµË´Ï´Ù.

¿ÀÆÛ·¹ÀÌ¼Ç ½ÂÀÎÀÚ

IOperationApprover´Â ƯÁ¤ ¿ÀÆÛ·¹À̼ǿ¡ ´ëÇÑ ½ÇÇà Ãë¼Ò ¹× Àç½ÇÇàÀ» ½ÂÀÎÇÏ´Â ÇÁ·ÎÅäÄÝÀ» Á¦°øÇÕ´Ï´Ù. ¿ÀÆÛ·¹ÀÌ¼Ç ½ÂÀÎÀÚ´Â ¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮¿¡ ¼³Ä¡µË´Ï´Ù. ƯÁ¤ ¿ÀÆÛ·¹ÀÌ¼Ç ½ÂÀÎÀÚ´Â ´Ù½Ã ¸ðµç ¿ÀÆÛ·¹À̼ÇÀÇ À¯È¿¼ºÀ» È®ÀÎÇϰųª, ƯÁ¤ ÄÁÅØ½ºÆ®ÀÇ ¿ÀÆÛ·¹À̼ÇÀ» È®ÀÎÇϰųª, »ç¿ëÀÚ¿¡°Ô ¿ÀÆÛ·¹À̼ǿ¡¼­ ¿¹»óÇÏÁö ¸øÇÑ »óŰ¡ ¹ß°ßµÈ °æ¿ì¸¦ ¹¯´Â ÇÁ·ÒÇÁÆ®¸¦ Ç¥½ÃÇÕ´Ï´Ù. ´ÙÀ½ ½º´ÏÆêÀº ÀÀ¿ëÇÁ·Î±×·¥ÀÌ ¸ðµç ¿ÀÆÛ·¹À̼ǿ¡ ´ëÇØ ¼±Çü ½ÇÇà Ãë¼Ò ¸ðµ¨À» °­Á¦ ½ÇÇàÇϵµ·Ï ¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮¸¦ ±¸¼ºÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» º¸¿©ÁÝ´Ï´Ù.
IOperationHistory history = OperationHistoryFactory.getOperationHistory();

// set an approver on the history that will disallow any undo that is not the most recent operation
history.addOperationApprover(new LinearUndoEnforcer());

ÀÌ °æ¿ì¿¡ ÇÁ·¹ÀÓ¿öÅ©°¡ Á¦°øÇÏ´Â ¿ÀÆÛ·¹ÀÌ¼Ç ½ÂÀÎÀÚÀÎ LinearUndoEnforcer°¡ È÷½ºÅ丮¿¡ ¼³Ä¡µË´Ï´Ù. ÀÌ´Â ¸ðµç ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®¿¡¼­ °¡Àå ÃÖ±Ù¿¡ ¼öÇàµÇ°Å³ª ½ÇÇà Ãë¼ÒµÈ ¿ÀÆÛ·¹À̼ÇÀÌ ¾Æ´Ñ ¿ÀÆÛ·¹À̼ÇÀÇ ½ÇÇà Ãë¼Ò³ª ´Ù½Ã ½ÇÇàÀ» ¹æÁöÇϱâ À§Çؼ­ÀÔ´Ï´Ù.

¶Ç ´Ù¸¥ ¿ÀÆÛ·¹ÀÌ¼Ç ½ÂÀÎÀÚ LinearUndoViolationUserApprover´Â µ¿ÀÏ »óŸ¦ ¹ß°ßÇÏ°í »ç¿ëÀÚ¿¡°Ô ¿ÀÆÛ·¹À̼ÇÀÌ °è¼ÓµÇµµ·Ï Çã¿ëÇØ¾ß ÇÏ´ÂÁö ¿©ºÎ¸¦ ¹¯´Â ÇÁ·ÒÇÁÆ®¸¦ Ç¥½ÃÇÕ´Ï´Ù. ÀÌ ¿ÀÆÛ·¹ÀÌ¼Ç ½ÂÀÎÀڴ ƯÁ¤ Workbench ÆÄÆ®¿¡ ¼³Ä¡ÇÒ ¼ö ÀÖ½À´Ï´Ù.

IOperationHistory history = OperationHistoryFactory.getOperationHistory();

// set an approver on this part that will prompt the user when the operation is not the most recent.
IOperationApprover approver = new LinearUndoViolationUserApprover(myUndoContext, myWorkbenchPart);
history.addOperationApprover(approver);

Ç÷¯±×ÀÎ °³¹ßÀÚ´Â ÀÀ¿ëÇÁ·Î±×·¥ ƯÁ¤ ½ÇÇà Ãë¼Ò ¸ðµ¨°ú ½ÂÀÎ Àü·«À» ±¸ÇöÇϱâ À§ÇØ ¸¶À½´ë·Î °íÀ¯ÇÑ ¿ÀÆÛ·¹ÀÌ¼Ç ½ÂÀÎÀÚ¸¦ °³¹ßÇÏ°í ¼³Ä¡ÇÒ ¼ö ÀÖ½À´Ï´Ù. Ç÷¯±×Àο¡¼­, Á¶ÀÛÀÇ ½ÇÇà Ãë¼Ò ¹× Àç½ÇÇà»Ó¸¸ ¾Æ´Ï¶ó Á¶ÀÛÀÇ ÃÖÃÊ ½ÇÇà¿¡ ´ëÇÑ ½ÂÀÎÀ» ¿äÃ»ÇØ¾ß ÇÕ´Ï´Ù. ÀÌ·¯ÇÑ °æ¿ì, Á¶ÀÛ ½ÂÀÎÀÚ´Â ¶ÇÇÑ Á¶ÀÛ ½ÇÇàÀ» ½ÂÀÎÇÏ´Â IOperationApprover2¸¦ ±¸ÇöÇØ¾ß ÇÕ´Ï´Ù. Á¶ÀÛÀ» ½ÇÇàÇØ¾ß ÇÏ´Â °æ¿ì, Ç÷§Æû Á¶ÀÛ È÷½ºÅ丮´Â ÀÌ ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â Á¶ÀÛ ½ÂÀÎÀÚÀÇ ½ÂÀÎÀ» ¿äûÇÕ´Ï´Ù.

½ÇÇà Ãë¼Ò ¹× IDE Workbench

¿ÀÆÛ·¹ÀÌ¼Ç È÷½ºÅ丮 ¹× Workbench ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®¿¡ ¾×¼¼½ºÇϱâ À§ÇØ Workbench ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇÏ´Â ÄÚµå ½º´ÏÆêÀ» º¸¾Ò½À´Ï´Ù. À̰ÍÀº Workbench¿¡¼­ ¾òÀ» ¼ö ÀÖ´Â IWorkbenchOperationSupport¸¦ »ç¿ëÇÏ¿© ´Þ¼ºµË´Ï´Ù. Workbench Àü¹ÝÀÇ ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®ÀÇ °³³äÀº »ó´çÈ÷ ÀϹÝÀûÀÔ´Ï´Ù. Workbench ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®°¡ ¾Ï½ÃÇϴ ƯÁ¤ ¹üÀ§°¡ ¹«¾ùÀÎÁö, ¾î¶² º¸±â ¶Ç´Â ÆíÁý±â°¡ ½ÇÇà Ãë¼Ò Áö¿øÀ» Á¦°øÇÒ ¶§ ÇØ´ç Workbench ÄÁÅØ½ºÆ®¸¦ »ç¿ëÇÏ´ÂÁö ÆÇº°ÇÏ´Â °ÍÀº Workbench ÀÀ¿ëÇÁ·Î±×·¥ÀÇ ¸òÀÔ´Ï´Ù.

Eclipse IDE WorkbenchÀÇ °æ¿ì Workbench ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®°¡ IDE Workbench Àüü¿¡ ¿µÇâÀ» ÁÖ´Â ¸ðµç ¿ÀÆÛ·¹À̼ǿ¡ ÁöÁ¤µÇ¾î¾ß ÇÕ´Ï´Ù. ÀÌ ÄÁÅØ½ºÆ®´Â ÀÚ¿ø ³×ºñ°ÔÀÌÅÍ °°Àº ÀÛ¾÷°ø°£À» Á¶ÀÛÇÏ´Â º¸±â¿¡ ÀÇÇØ »ç¿ëµË´Ï´Ù. IDE Workbench´Â Workbench ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®¸¦ ¸®ÅÏÇÏ´Â IUndoContext¿¡ ´ëÇÑ ÀÛ¾÷°ø°£¿¡ ¾î´ðÅ͸¦ ¼³Ä¡ÇÕ´Ï´Ù. ÀÌ ¸ðµ¨ ±â¹Ý µî·ÏÀº ÀÛ¾÷°ø°£À» Á¶ÀÛÇÏ´Â Ç÷¯±×ÀÎÀÌ headlessÀÌ°í ¾î¶² Workbench Ŭ·¡½ºµµ ÂüÁ¶ÇÏÁö ¾ÊÀº °æ¿ì¿¡µµ ÀûÀýÇÑ ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®¸¦ ¾òÀ» ¼ö ÀÖµµ·Ï ÇÕ´Ï´Ù.

// get the operation history
IOperationHistory history = OperationHistoryFactory.getOperationHistory();

// obtain the appropriate undo context for my model
IUndoContext workspaceContext = (IUndoContext)ResourcesPlugin.getWorkspace().getAdapter(IUndoContext.class);
if (workspaceContext != null) {
	// create an operation and assign it the context
}

±âŸ Ç÷¯±×ÀÎÀº ¸ðµ¨ ±â¹Ý ½ÇÇà Ãë¼Ò ÄÁÅØ½ºÆ®¸¦ µî·ÏÇϱâ À§ÇØ ÀÌ µ¿ÀÏÇÑ ±â¹ýÀ» »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ½À´Ï´Ù.