package {
import flash.desktop.*;
import flash.display.*;
import flash.events.*;
import flash.filesystem.*;
import flash.geom.*;
import flash.net.*;
import flash.text.*;
//ドラッグ&ドロップ
[SWF(width=240, height=240, backgroundColor=0xFFFFFF)]
public class DragDropEx extends Sprite {
[Embed(source='text.gif')]
private var TEXT:Class;
[Embed(source='sample.gif')]
private var SAMPLE:Class;
private var lblDrag:TextField;//ドラッグラベル
private var imgDrag:Sprite; //ドラッグイメージ
private var lblDrop:TextField;//ドロップラベル
//コンストラクタ
public function DragDropEx() {
//ドラッグラベルの生成
lblDrag = makeLabel(
"ドラッグ可能なテキストフィールド",
10, 10, 220, 30);
lblDrag.addEventListener(
MouseEvent.MOUSE_DOWN, onMouseDown);
addChild(lblDrag);
//ドラッグイメージの生成
imgDrag = new Sprite();
imgDrag.x = 10;
imgDrag.y = 50;
imgDrag.addChild(new SAMPLE());
imgDrag.addEventListener(
MouseEvent.MOUSE_DOWN, onMouseDown);
addChild(imgDrag);
//ドロップラベルの生成
lblDrop = makeLabel(
"ドロップ可能なテキストフィールド",
10, 130, 220, 100);
lblDrop.addEventListener(
NativeDragEvent.NATIVE_DRAG_ENTER, onDragEnter);
lblDrop.addEventListener(
NativeDragEvent.NATIVE_DRAG_DROP, onDragDrop);
addChild(lblDrop);
}
//ラベルの生成
private function makeLabel(text:String,
x:int, y:int, w:int, h:int):TextField {
var label:TextField = new TextField();
label.text = text;
label.x = x;
label.y = y;
label.width = w;
label.height = h;
label.background = true;
label.border = true;
return label;
}
//マウスダウンイベントの処理
private function onMouseDown(evt:MouseEvent):void {
var bmp:BitmapData;
//クリップボードの生成
var cb:Clipboard = new Clipboard();
//ラベルのドラッグ
if (evt.target == lblDrag) {
bmp = Bitmap(new TEXT()).bitmapData;
cb.setData(ClipboardFormats.TEXT_FORMAT, lblDrag.text);
doDragStart(cb, bmp);
}
//イメージのドラッグ
if (evt.target == imgDrag) {
bmp = Bitmap(imgDrag.getChildAt(0)).bitmapData;
cb.setData(ClipboardFormats.BITMAP_FORMAT, bmp);
doDragStart(cb, bmp);
}
}
//ドラッグ開始
private function doDragStart(cb:Clipboard, bmp:BitmapData):void {
//オフセット
var offset:Point = new Point( -bmp.width / 2, -bmp.height / 2);
//ドラッグオプション
var options:NativeDragOptions = new NativeDragOptions();
options.allowLink=true;
//ドラッグ開始
NativeDragManager.doDrag(this, cb, bmp, offset, options);
}
//ドラッグエンターイベントの処理
public function onDragEnter(evt:NativeDragEvent):void {
//クリップボードの取得
var cb:Clipboard = evt.clipboard;
//ドラッグ可能かどうかのチェック
if (cb.hasFormat(ClipboardFormats.TEXT_FORMAT) ||
cb.hasFormat(ClipboardFormats.URL_FORMAT) ||
cb.hasFormat(ClipboardFormats.BITMAP_FORMAT) ||
cb.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)) {
//ドロップの許可
NativeDragManager.acceptDragDrop(lblDrop);
}
}
//ドラッグ&ドロップイベントの処理
public function onDragDrop(evt:NativeDragEvent):void {
//クリップボードの取得
var cb:Clipboard = evt.clipboard;
//テキストのドロップ
if (cb.hasFormat(ClipboardFormats.TEXT_FORMAT)) {
lblDrop.text = "テキストのドロップ\n" + getCbText(cb);
}
//URLのドロップ
else if (cb.hasFormat(ClipboardFormats.URL_FORMAT)) {
lblDrop.text = "URLのドロップ\n" + getCbText(cb);
}
//ビットマップのドロップ
else if (cb.hasFormat(ClipboardFormats.BITMAP_FORMAT)) {
var bmp:Bitmap = getCbBitmap(cb);
lblDrop.text = "ビットマップのドロップ\n" + bmp.width + "x" + bmp.height;
}
//ファイルリストのドロップ
else if(cb.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)) {
var files:Array = getCbFileList(cb);
lblDrop.text="ファイルリストのドロップ\n";
for each (var file:File in files) {
lblDrop.appendText(file.nativePath+"\n");
}
}
}
//クリップボードテキストの取得
private function getCbText(cb:Clipboard):String {
return String(cb.getData(ClipboardFormats.TEXT_FORMAT));
}
//ビットマップの取得
private function getCbBitmap(cb:Clipboard):Bitmap {
return new Bitmap(cb.getData(
ClipboardFormats.BITMAP_FORMAT) as BitmapData);
}
//ファイルリストの取得
private function getCbFileList(cb:Clipboard):Array {
return cb.getData(
ClipboardFormats.FILE_LIST_FORMAT) as Array;
}
}
}
|