返信機能を実装する -その1-

返信機能を実装します。
Treeから返信したいメッセージをクリックして選択すると返信ボタンがアクティブになり、
ボタンを押すと入力フォームが現れてくる仕様で行きたいと思います。


まずはサーバ側の実装から。
返信元のメッセージのプライマリキーと、返信メッセージの内容が引数です。

MessageService.java(抜粋)

/**
 * parentMessageに返信するメッセージを投稿します。
 */
public MessageBean insertResMessage(int parentPk, MessageBean bean) throws Exception {
	System.out.println("insertResMessage INVOKED parentPk = " + parentPk);
	DataContext context = Configuration.getSharedConfiguration().getDomain().createDataContext();
	//親メッセージをフェッチ
	Message parent = (Message) DataObjectUtils.objectForPK(context, Message.class, parentPk);
	//返信メッセージを挿入
	Message newMessage = (Message) context.createAndRegisterNewObject(Message.class);
	newMessage.setDataFromBean(bean);
	//親メッセージに返信メッセージを子供としてぶらさげる
	parent.addToChildren(newMessage);
	//親メッセージの修正日をセットし直す
	parent.setModificationDate(new Date());
	context.commitChanges(Level.INFO);

	return newMessage.getMessageBean();
}


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

bbx.mxml(抜粋)

function insertResMessage_result(event):Void {
	currentMessage = event.result;
}
<mx:method name="insertResMessage" result="insertResMessage_result(event)" fault="handleFault(event)"/>


返信できるメッセージは親メッセージのみにします。つまり、返信に返信を付ける事ができない様にします。
これを実装するためには、親メッセージが選択されている時のみ、返信ボタンがアクティブになる様にします。


選択されているメッセージが返信できる、できないの判断をどうやって行うか、いろいろ方法はあると思いますが、単純にTreeにバインドされているXMLのchild属性を見る事にします。(っていうか、最初からそうしようと思ったんですけど。)
返信ボタンのアクティブ化のタイミングはTreeのメッセージがクリックされた時なので、前回実装したhandleTreeChangeイベントハンドラにその処理を付け足せばOKです。

bbx.mxml(抜粋)

//Treeがクリックされた時に呼ばれるメソッド
function handleTreeChange(event):Void {
	var pk = event.target.selectedItem.attributes.data;
	remote.getMessageByPk(parseInt(pk));
	statusLabel.text = event.target.selectedItem.attributes.toolTip;
	if (event.target.selectedItem.attributes.child == "false") {
		resButton.enabled = true;
	} else {
		resButton.enabled = false;
	}
}

そういえば最初のモックアップには返信ボタンを付けていなかったので、ボタンの部分を下記の様にします。

bbx.mxml(抜粋)

<!--  ボタン  -->
<mx:HBox horizontalAlign="right" widthFlex="1"
	marginTop="5" marginBottom="5" marginLeft="15" 
	marginRight="15" borderStyle="none" >
	<mx:Button id="resButton"  label="返信する" click=""/>
	<mx:Spacer width="50"/>
	<mx:Button label="削除"/>
	<mx:Button label="新規スレッドを立てる" click="openSubmitWindow()"/>
</mx:HBox>