- 追加された行はこの色です。
- 削除された行はこの色です。
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
[[Eclipseプラグイン開発>Eclipse/プラグイン開発のTIPS集/GooglePlugin/ドラッグアンドドロップを実装する]]では「さあいよいよドラッグアンドドロップに挑戦してみるかー」という感じだったのですが、Flexではすごい簡単でした。
ポイントは
-ドラッグ側で、
<mx:DataGrid id="datagrid" dataProvider="{myArrayOfObjects.hogeModel}" dragEnabled="true">
などとドラッグ可能であることを宣言する
-ドロップ側で
<mx:DataGrid id="datagrid1" dragEnter="doDragEnter(event)" dragDrop="doDragDrop(event)">
などとドラッグで入ってきたとき(dragEnter)、ドロップされたとき(dragDrop)、の処理を実装する
ってことですね。dragEnter,dragDropそれぞれのActionScriptは以下のようにしてみました。
<mx:Script>
<![CDATA[
// ドラッグしてウィジェットに入ったときに呼ばれるメソッド。
function doDragEnter(event):Void {
// allow drop
event.handled=true; <- ドロップしていいよ
// event.targetはドロップされる側のウィジェット。
// set action to copy
// event.action=DragManager.COPY;
}
// ドロップしたときに呼ばれるメソッド。
function doDragDrop(event):Void {
/*
event.dragSource.dataForFormat("items") returns
an array of dragged data items
*/
var items = event.dragSource.dataForFormat("items");
// for convenience, set var for drop target
var dest = event.target;
// event.targetはドロップされる側のウィジェット。
// copy the item target's dataProvider
dest.addItem(items[0]); // ドロップされるDataGridにDragSorceで選択したモノを追加。
datagrid.removeItemAt(datagrid.selectedIndex);//逆に元のDataGridから削除。
}
]]>
</mx:Script>
ドラッグ中
#ref(01.png)
ドロップ後
#ref(02.png)
ソースは結局以下の通り:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml">
<!-- Objectの配列の定義 -->
<mx:Model id="myArrayOfObjects" source="hogeData.xml"/>
<!-- Objectの配列の定義 以上 -->
<mx:Script>
<![CDATA[
// ドラッグしてウィジェットに入ったときに呼ばれるメソッド。
function doDragEnter(event):Void {
// allow drop
event.handled=true; <- ドロップしていいよ
// event.targetはドロップされる側のウィジェット。
// set action to copy
// event.action=DragManager.COPY;
}
// ドロップしたときに呼ばれるメソッド。
function doDragDrop(event):Void {
/*
event.dragSource.dataForFormat("items") returns
an array of dragged data items
*/
var items = event.dragSource.dataForFormat("items");
// for convenience, set var for drop target
var dest = event.target;
// event.targetはドロップされる側のウィジェット。
// copy the item target's dataProvider
dest.addItem(items[0]); // ドロップされるDataGridにDragSorceで選択したモノを追加。
datagrid.removeItemAt(datagrid.selectedIndex);//逆に元のDataGridから削除。
}
]]>
</mx:Script>
<mx:HBox>
<mx:Panel title="DataGrid">
<mx:HBox>
<mx:DataGrid id="datagrid" dataProvider="{myArrayOfObjects.hogeModel}" dragEnabled="true">
<!-- さっきの配列をBind -->
<mx:columns>
<mx:Array>
<mx:DataGridColumn headerText="Label" columnName="label" />
<mx:DataGridColumn headerText="Volume" columnName="volume" />
<mx:DataGridColumn headerText="Revenue" columnName="revenue" />
</mx:Array>
</mx:columns>
</mx:DataGrid>
<mx:DataGrid id="datagrid1" dragEnter="doDragEnter(event)" dragDrop="doDragDrop(event)">
<!-- さっきの配列をBind -->
<mx:columns>
<mx:Array>
<mx:DataGridColumn headerText="Label" columnName="label" />
<mx:DataGridColumn headerText="Volume" columnName="volume" />
<mx:DataGridColumn headerText="Revenue" columnName="revenue" />
</mx:Array>
</mx:columns>
</mx:DataGrid>
</mx:HBox>
<mx:ControlBar>
<mx:Label text="You chose:{datagrid.selectedItem.label}"/>
</mx:ControlBar>
</mx:Panel>
</mx:HBox>
</mx:Application>
いやあ、Flex、やばいです。データモデルに対するウィジェットの感応度が高いというか、最初からわかってて作ってるというか。いままでEclipseRCPがリッチクライアントの最右翼と思ってたんですけど、Flexもかなりきてますね。
ちなみに、DataGridからアイテムを削除したり、追加したりどうやんのかなあ、選択しているアイテムのIndexはどう取得するのかなあとか、いわゆるJavaDoc的なモノはすでに日本語化されているモノがあります。このドキュメントの整備度(?)も、きてます。。マクロメディ(つうかAdobe)ア、Flexは本気だな。。
[[Flex ActionScript および MXML API リファレンスガイド(DataGrid):http://www.macromedia.com/support/documentation/jp/flex/1_5/asdocs_jp/index.html?mx/containers/Container.html]]
----
この記事は
#vote(おもしろかった[7],そうでもない[4])
#vote(おもしろかった[46],そうでもない[11])
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}