2011年5月23日月曜日

eclipselink を使う :(7)データの追加/更新/削除

追加/更新/削除コマンドの定義
UIプラグインから、連絡先データの追加、更新、削除を行うため、plugin.xml で以下のコマンドを追加します。
   <extension
         point="org.eclipse.ui.commands">
      <command
            defaultHandler="com.itrane.mycontact.ui.handlers.ContactCreateHandler"
            id="com.itrane.mycontact.ContactCreateCommand"
            name="新規連絡先">
      </command>
      <command
            defaultHandler="com.itrane.mycontact.ui.handlers.ContactDeleteHandler"
            id="com.itrane.mycontact.ContactDeleteCommand"
            name="連絡先削除">
      </command>
      <command
            defaultHandler="com.itrane.mycontact.ui.handlers.ContactEditHandler"
            id="com.itrane.mycontact.ContactEditCommand"
            name="連絡先修正">
      </command>
   </extension>


ポップアップメニューの定義
上記コマンドを実行するポップアップメニューも追加します。
   <extension
         point="org.eclipse.ui.menus">
      <menuContribution
            allPopups="false"
            locationURI="popup:com.itrane.mycontact.ContactView">
         <command
               commandId="com.itrane.mycontact.ContactCreateCommand"
               icon="icons/new_wiz.gif"
               label="新規(&amp;N)"
               style="push">
         </command>
         <command
               commandId="com.itrane.mycontact.ContactEditCommand"
               label="編集(&amp;O)"
               style="push">
         </command>
         <command
               commandId="com.itrane.mycontact.ContactDeleteCommand"
               icon="icons/delete_obj.gif"
               label="削除(&amp;D)"
               style="push">
         </command>
      </menuContribution>
   </extension>


ポップアップメニューの表示
連絡先ビュー(ContactView)でポップアップメニューを有効にするために、以下のメソッドを追加して、createPartControl() メソッドで呼び出します:
    private void hookContextMenu() {
        MenuManager menuMgr = new MenuManager("#PopupMenu");
        menuMgr.setRemoveAllWhenShown(true);
        Menu menu = menuMgr.createContextMenu(viewer.getControl());
        viewer.getControl().setMenu(menu);
        getSite().registerContextMenu(menuMgr, viewer);
    }


これで、連絡先ビューでポップアップメニューが表示されます:


ハンドラの作成
メニューの各コマンドに対応するハンドラーを記述します。これはテスト用なので、テストプラグインで作成したのと同じようなものにしました。
新規連絡先ハンドラー(ContactCreateHandler):
public class ContactCreateHandler extends AbstractHandler implements IHandler {
    
    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException {
        //実際はここで、エディタ等をオープンして、ユーザーに新規データを入力させる
        // 住所と電話番号を持つ連絡先の追加
        Contact contact = new Contact();
        contact.setId(11L);
        contact.setSimei("追加氏名");
        contact.setYomi("ついかしめい");

        Address a1 = new Address(contact, "3334444", "東京都", "千代田区", "番地", "",
                "mail3", "web3", "勤務先");
        Address a2 = new Address(contact, "4445555", "東京都", "渋谷区", "番地", "",
                "mail4", "web4", "自宅");
        Phone p1 = new Phone(contact, "00311112222", "勤務先");
        Phone p2 = new Phone(contact, "00322222222", "自宅");
        Phone p3 = new Phone(contact, "00333332222", "携帯");

        //実際は、エディタ終了時、保存ボタン押下時に入力データを追加する
        ContactHome contactHome = DBActivator.getDefault().getContactHome();
        try {
            contactHome.addAndCommit(contact, new Address[] { a1, a2 },
                    new Phone[] { p1, p2, p3 });
        } catch (Exception e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
        return null;
    }

}


連絡先修正ハンドラー(ContactEditHandler):
public class ContactEditHandler extends AbstractHandler implements IHandler {

    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException {
        ISelection selection = HandlerUtil.getCurrentSelection(event);
        if (selection instanceof IStructuredSelection) {
            Contact contact = (Contact) ((IStructuredSelection) selection)
                    .getFirstElement();
            
            //実際は選択された連絡先をエディタ等で編集
            contact.setSimei("氏名1変更");

            //実際は、エディタ終了時、保存ボタン押下時に入力データを追加する
            ContactHome contactHome = DBActivator.getDefault().getContactHome();
            try {
                contactHome.updateAndCommit(contact);
            } catch (Exception e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            }
        }
        return null;
    }
}

連絡先削除ハンドラー(ContactDeleteHandler):
public class ContactDeleteHandler extends AbstractHandler implements IHandler {

    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException {
        ISelection selection = HandlerUtil.getCurrentSelection(event);
        if (selection instanceof IStructuredSelection) {
            Contact contact = (Contact) ((IStructuredSelection) selection)
                    .getFirstElement();
            ContactHome contactHome = DBActivator.getDefault().getContactHome();
            try {
                contactHome.removeAndCommit(contact);
            } catch (Exception e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            }
        }
        return null;
    }
}


アプリケーションを起動して、ポップアップメニューから、各コマンドを呼び出して、新規/修正/削除機能を確認します。ContactHome の add() メソッドによりデータの追加が成功すると、登録されたプロパティチェンジリスナー(ContactView のコンテンツプロバイダー)が呼ばれ結果がテーブルビューアに反映されます。更新処理、削除処理の場合も同様です。

0 件のコメント: