2010年7月26日月曜日

GEF を使った RCP アプリケーション:(5)UNDO/REDO 機能の追加

エディタを操作して、ページ定義内の項目定義の位置を変更することができるようになりました。今度は、それらの操作に対する UNDO/REDO 機能を追加します。

最初に、エディタでツールバーを追加します。そして、ツールバーに、UNDOおよびREDO アクションボタンを追加します。
エディタにツールバーを追加するために、ActionBarContributor を拡張した SampleEditorActionBarContributor クラスを作成して、buildActions() と contributeToToolBar() メソッドを次のように編集します。
public class SampleEditorActionBarContributor extends ActionBarContributor {
   @Override
   protected void buildActions() {
       addRetargetAction(new UndoRetargetAction());
       addRetargetAction(new RedoRetargetAction());
   }
  ...
   @Override
   public void contributeToToolBar(IToolBarManager toolBarManager) {
       toolBarManager.add(getAction(ActionFactory.UNDO.getId()));
       toolBarManager.add(getAction(ActionFactory.REDO.getId()));
   }
  ...
}

plugin.xml を編集して、拡張タブで、SampleGraphicalEditor の contributorClass として、上記のクラスを指定します。
<extension point="org.eclipse.ui.editors">
  <editor
      class="gef.sample.editors.SampleGraphicalEditor"
      contributorClass="gef.sample.SampleEditorActionBarContributor"
      default="false"
      icon="icons/file_obj.gif"
      id="gef.sample.samplegraphicaleditor"
      name="用紙定義">
  </editor>
</extension>

レイアウト変更コマンド(ItemDefChangeLayoutCommand) を修正して、UNDO/REDO 機能を追加します。
public class ItemDefChangeLayoutCommand extends AbstractLayoutCommand {
  ...
   private Rectangle oldLayout;
  ...
   public void setModel(Object model) {
       this.model = (ItemDef) model;
       //元のレイアウトを保存する
       this.oldLayout = ((ItemDef)model).getLayout();
   }
  
   @Override
   public void undo() {
       this.model.setLayout(this.oldLayout);
   }
}

REDO 機能は、スーパークラスの Command クラスで定義されている redo() メソッドをそのまま使用します。

アプリケーションを実行して、移動、UNDO/REDO を確かめます。



エディタをオープンすると、UNDO/REDO ボタンが表示されます。 そして、項目定義を移動すると、UNDO ボタンが有効になります。

0 件のコメント: