package {
import flash.desktop.*;
import flash.display.*;
import flash.events.*;
import flash.filesystem.*;
import flash.geom.*;
import flash.net.*;
import flash.text.*;
//ドラッグ&ドロップ
public class DragDropEx extends Sprite {
[Embed(source='text.gif')]
private var TextImage:Class;
[Embed(source='sample.gif')]
private var SampleImage:Class;
private var dragTextField:TextField;//ドラッグテキストフィールド
private var dragImage:Sprite; //ドラッグイメージ
private var dropTextField:TextField;//ドラッグテキストフィールド
//コンストラクタ
public function DragDropEx() {
//ドラッグテキストフィールドの生成
dragTextField=makeTextField(
"ドラッグ可能なテキストフィールド",
5,5,230,20,0xFFFFFF);
dragTextField.addEventListener(
MouseEvent.MOUSE_DOWN,onDragStart);
addChild(dragTextField);
//ドラッグイメージの生成
dragImage=new Sprite();
dragImage.x=10;
dragImage.y=40;
dragImage.addChild(new SampleImage());
dragImage.addEventListener(
MouseEvent.MOUSE_DOWN,onDragStart);
addChild(dragImage);
//ドロップテキストフィールドの生成
dropTextField=makeTextField(
"ドロップ可能なテキストフィールド",
5,115,230,120,0xFFFFFF);
dropTextField.addEventListener(
NativeDragEvent.NATIVE_DRAG_ENTER,onDragEnter);
dropTextField.addEventListener(
NativeDragEvent.NATIVE_DRAG_DROP,onDragDrop);
addChild(dropTextField);
}
//テキストフィールドの生成
private function makeTextField(text:String,
x:int,y:int,width:int,height:int,color:int):TextField {
var textField:TextField=new TextField();
textField.text=text;
textField.x=x;
textField.y=y;
textField.width=width;
textField.height=height;
textField.background=true;
textField.backgroundColor=color;
return textField;
}
//ドラッグ開始イベントの処理
private function onDragStart(evt:MouseEvent):void {
var image :BitmapData;
var offset:Point;
var bitmap:Bitmap;
//クリップボードオブジェクトの生成
var cb:Clipboard=new Clipboard();
//ドラッグテキストフィールドのデータ指定
if (evt.target==dragTextField) {
cb.setData(ClipboardFormats.TEXT_FORMAT,dragTextField.text);
image=Bitmap(new TextImage()).bitmapData;
offset=new Point(-image.width/2,-image.height/2);
}
//ドラッグイメージのデータ指定
if (evt.target==dragImage) {
bitmap=Bitmap(dragImage.getChildAt(0));
cb.setData(ClipboardFormats.BITMAP_FORMAT,bitmap.bitmapData);
image =bitmap.bitmapData;
offset=new Point(-image.width/2,-image.height/2);
}
//ドラッグオプションの生成
var options:NativeDragOptions=new NativeDragOptions();
options.allowLink=true;
//ドラッグの開始処理
NativeDragManager.doDrag(this,cb,image,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(dropTextField);
}
}
//ドラッグドロップイベントの処理
public function onDragDrop(evt:NativeDragEvent):void {
//クリップボードの取得
var cb:Clipboard=evt.clipboard;
//テキストのドロップ
if (cb.hasFormat(ClipboardFormats.TEXT_FORMAT)) {
dropTextField.text="テキストのドロップ\n"+
String(cb.getData(ClipboardFormats.TEXT_FORMAT));
}
//URLのドロップ
else if (cb.hasFormat(ClipboardFormats.URL_FORMAT)) {
dropTextField.text="URLのドロップ\n"+
String(cb.getData(ClipboardFormats.TEXT_FORMAT));
}
//ビットマップのドロップ
else if (cb.hasFormat(ClipboardFormats.BITMAP_FORMAT)) {
var bitmap:Bitmap=new Bitmap(cb.getData(
ClipboardFormats.BITMAP_FORMAT) as BitmapData);
dropTextField.text="ビットマップのドロップ\n"+
bitmap.width+"x"+bitmap.height;
}
//ファイルリストのドロップ
else if(cb.hasFormat(ClipboardFormats.FILE_LIST_FORMAT)) {
var dropfiles:Array=cb.getData(
ClipboardFormats.FILE_LIST_FORMAT) as Array;
dropTextField.text="ファイルリストのドロップ\n";
for each (var file:File in dropfiles) {
dropTextField.appendText(file.nativePath+"\n");
}
}
}
}
}
|