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