削除機能を実装する

残る削除機能を実装します。
Treeから返信したいメッセージをクリックして選択して削除ボタンを押すと、確認ダイアログが出て、実際に削除されるという仕様で行きたいと思います。


まずはサーバ側の実装から。
削除メッセージのプライマリキーが引数です。

MessageService.java(抜粋)

/**
 * PrimaryKeyにより該当するメッセージオブジェクトを削除します。
 */
public void deleteMessageByPk(int pk) throws Exception {
	System.out.println("deleteMessageByPk INVOKED parentPk = " + pk);
	DataContext context = 
		Configuration.getSharedConfiguration().getDomain().createDataContext();
	Message message = (Message) DataObjectUtils.objectForPK(context, Message.class, pk);
	context.deleteObject(message);
	context.commitChanges(Level.INFO);
}


次にクライアント側を実装します。
まずはお決まりのRemoteObjectまわりのセットをします。

bbx.mxml(抜粋)

//リモートのdeleteMessageをコール
function deleteMessage() : Void {
	remote.deleteMessageByPk(currentMessage.pk);
	currentMessage = undefined;
	remote.getSummaryListXML();
}

function deleteMessageByPk_result(event):Void {
	//Do Nothing
}
<mx:method name="deleteMessageByPk" result="deleteMessageByPk_result(event)"
	fault="handleFault(event)"/>


削除ボタンが押された時には確認ダイアログを出すので、SubmitWindowでやった時と同じ様に新たにDeleteAlert.mxmlを作ります。
削除ボタンを押した時の挙動をスクリプトにします。

bbx.mxml(抜粋)

<mx:Button label="削除" click="openDeleteAlert()"/>
//削除確認ウインドウ表示
function openDeleteAlert():Void {
	var userPass = currentMessage.userPass;
	var popUp:DeleteAlert = 
		DeleteAlert(PopUpManager.createPopUp(this,DeleteAlert,true));
	popUp.currentPass = userPass;
	if (currentMessage.child) {
		popUp.isParentMessage = false;
	} else {
		popUp.isParentMessage = true;
	}
}

DeleteAlertにはcurrentPass:StringとisParentMessage:Booleanという変数を持たせます。currentPassはメッセージ投稿時にセットされたパスワードで、isParentMessageは削除対象のメッセージが親メッセージか子メッセージかというフラグです。


DeleteAlert.mxmlは以下の様になりました。

DeleteAlert.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow title="メッセージを削除します" width="400" height="200"
	xmlns:mx="http://www.macromedia.com/2003/mxml" closeButton="false">
	<mx:Script> <![CDATA[
		var NORMAL_WARNING = "メッセージを削除しますがよろしいですか?";
		var PARENT_WARNING = "メッセージを削除しますがよろしいですか?" + 
			newline + "(返信がある場合は全萄鐔?気譴泙后?";
		
		var currentPass:String;
		var isParentMessage:Boolean;
		
		function deleteMessage() {
			if (currentPass == passInput.text) {
				parentDocument.deleteMessage();
				deletePopUp();
			} else {
				alertText.visible=true;
			}
		}
		
		
	]]></mx:Script>
	<mx:VBox marginTop="15" marginBottom="15" marginLeft="15" marginRight="15">
		<mx:Text text="{isParentMessage? PARENT_WARNING:NORMAL_WARNING}"
			styleName="normalStyle" widthFlex="1"/>	
		<mx:Form>
			<mx:FormItem label="削除用パスワード">
				<mx:TextInput id="passInput" width="100" password="true" />
				<mx:Label id="alertText" text="パスワードが違います"
					visible="false" styleName="alertStyle"/>
			</mx:FormItem>
		</mx:Form>
	</mx:VBox>
	<mx:ControlBar horizontalAlign="right">
		<mx:Button id="cancelButton" label="キャンセル" click="deletePopUp()" />
		<mx:Button id="addMessageButton" label="OK" click="deleteMessage()"/>
	</mx:ControlBar>
</mx:TitleWindow>

削除時に気をつけなければならないのが、親メッセージを削除する場合です。親を削除すると、それにぶら下がる返信メッセージの居場所がなくなります。つまり、子メッセージも全て削除しなければおかしな事になりますが、その辺はCayenneにおまかせでOKです。(http://d.hatena.ne.jp/toolkit/20040908を参照)
その他O/Rマッピングを使用していれば似たような機能は必ずあるはずですが、JDBCでがんばっている場合、気をつけなければならない所です・・・


削除パスワードチェックはクライアント側で行っています。このへんもいちいちサーバに聞きに行かなくて良い感じですね。


DeleteAlertはこんなかんじです。


以上をまとめたソースです。

bbs.mxmlを別ウインドウで表示
DeleteAlert.mxmlを別ウインドウで表示


基本的な機能はだいぶ出来上がりました。もう一息です!