クリップボードのデータ形式

Flash Player 10 以降、Adobe AIR 1.0 以降

クリップボードの形式では、Clipboard オブジェクトに配置されるデータについて説明します。Flash Player または AIR は、ActionScript データ型の形式とシステムクリップボード形式間で標準データ形式を自動的に変換します。また、アプリケーションオブジェクトは、アプリケーション定義の形式を使用して ActionScript ベースのアプリケーション内およびアプリケーション間で転送することができます。

Clipboard オブジェクトは、同じ情報の異なる形式での表現を格納できます。例えば、Sprite を表すクリップボードオブジェクトには、ファイルシステムに Sprite の表現をコピーまたはドラッグするために、同一のアプリケーション内で使用する参照形式、Flash Player または AIR で実行される別のアプリケーションが使用する直列化形式、イメージ エディターが使用するビットマップ形式、ファイル リスト形式、さらに、PNG ファイルをエンコードするための遅延レンダリング形式が含まれている可能性があります。

標準データ形式

標準形式名を定義する定数は、ClipboardFormats クラスで提供されています。

定数

説明

TEXT_FORMAT

テキスト形式データは、ActionScript の String クラスとの間で変換されます。

HTML_FORMAT

HTML マークアップを含むテキストです。

RICH_TEXT_FORMAT

リッチテキスト形式データは、ActionScript の ByteArray クラスとの間で変換されます。RTF マークアップはどのような方法でも解釈または変換されません。

BITMAP_FORMAT

(AIR のみ)ビットマップ形式データは、ActionScript の BitmapData クラス間で変換されます。

FILE_LIST_FORMAT

(AIR のみ)ファイルリスト形式データは、ActionScript のファイルオブジェクトの配列間で変換されます。

URL_FORMAT

(AIR のみ)URL 形式データは、ActionScript の String クラス間で変換されます。

AIR アプリケーションでホストされる HTML コンテンツで copy cut または paste イベントに応答してデータをコピーおよびペーストするときは、ClipboardFormat ストリングの代わりに MIME タイプを使用する必要があります。データの有効な MIME タイプは、次のとおりです。

MIME タイプ

説明

テキスト

"text/plain"

URL

"text/uri-list"

ビットマップ

"image/x-vnd.adobe.air.bitmap"

ファイルリスト

"application/x-vnd.adobe.air.file-list"

注意: リッチテキスト形式データは、HTML コンテンツ内の paste イベントの結果として送出されたイベント オブジェクトの clipboardData プロパティから利用することはできません。

カスタムデータ形式

アプリケーション定義のカスタム形式を使用し、参照として、または直列化されたコピーとして、オブジェクトを転送できます。参照は、同じアプリケーション内でのみ有効です。直列化されたオブジェクトは アプリケーション間で転送できますが、直列化および直列化解除しても有効なオブジェクトについてのみ使用できます。通常、プロパティが単純型または直列化可能なオブジェクトの場合は、オブジェクトを直列化できます。

直列化されたオブジェクトを Clipboard オブジェクトに追加するには、serializable パラメーターを true に設定して、 Clipboard.setData() メソッドを呼び出します。形式名としては、いずれかの標準形式、またはアプリケーションで定義されている任意のストリングを使用できます。

転送モード

カスタムデータ形式でクリップボードにオブジェクトを書き込む場合は、元のオブジェクトへの参照またはその直列化コピーとしてオブジェクトデータをクリップボードから読み取ることができます。オブジェクトを参照として転送するか直列化されたコピーとして転送するかを決定する 4 つの転送モードがあります。

転送モード

説明

ClipboardTransferModes.ORIGINAL_ONLY

参照のみが返されます。参照を使用できない場合は、null 値が返されます。

ClipboardTransferModes.ORIGINAL_PREFFERED

使用できる場合は、参照が返されます。参照を使用できない場合は、直列化されたコピーが返されます。

ClipboardTransferModes.CLONE_ONLY

直列化されたコピーのみが返されます。直列化されたコピーを使用できない場合は、null 値が返されます。

ClipboardTransferModes.CLONE_PREFFERED

使用できる場合は、直列化されたコピーが返されます。直列化されたコピーを使用できない場合は、参照が返されます。

カスタムデータ形式の読み取りと書き込み

クリップボードにオブジェクトを書き込むときの形式パラメータとして、予約された接頭辞である air: または flash: で始まらない任意のストリングを使用できます。 そのオブジェクトを読み取るには、形式として同じストリングを使用します。次の例では、クリップボードにオブジェクトを読み書きする方法を示します。

public function createClipboardObject(object:Object):Clipboard{ 
    var transfer:Clipboard = Clipboard.generalClipboard; 
    transfer.setData("object", object, true); 
} 

クリップボードオブジェクトから直列化オブジェクトを抽出する(ドロップまたはペースト操作後)には、同じ形式名および CLONE_ONLY または CLONE_PREFFERED 転送モードを使用します。

var transfer:Object = clipboard.getData("object", ClipboardTransferMode.CLONE_ONLY); 

参照は、Clipboard オブジェクトに常に追加されます。(ドロップ操作またはペースト操作の後で)直列化されたコピーの代わりに参照をクリップボードオブジェクトから抽出するには、 ORIGINAL_ONLY または ORIGINAL_PREFFERED 転送モードを使用します。

var transferredObject:Object =  
    clipboard.getData("object", ClipboardTransferMode.ORIGINAL_ONLY); 

参照は、Clipboard オブジェクトが現在のアプリケーションから発生している場合にのみ有効です。参照が使用できるときには参照にアクセスし、参照が使用できないときには直列化されたクローンにアクセスするには、 ORIGINAL_PREFFERED 転送モードを使用します。

遅延レンダリング

データ形式の作成に大量の処理が必要になる場合は、必要に応じてデータを提供する関数を用意することで、遅延レンダリングを使用できます。この関数は、ドロップ操作またはペースト操作の受け取り側が遅延された形式でデータを要求する場合にのみ呼び出されます。

レンダリング関数を Clipboard オブジェクトに追加するには、 setDataHandler() メソッドを使用します。この関数は、適切な形式でデータを返す必要があります。例えば、 setDataHandler(ClipboardFormat.TEXT_FORMAT, writeText) を呼び出した場合、 writeText() 関数はストリングを返す必要があります。

同じ型のデータ形式が setData() メソッドで Clipboard オブジェクトに追加された場合は、そのデータが遅延バージョンより優先されます(レンダリング関数は呼び出されません)。同じクリップボードデータが 2 回目にアクセスされるときは、レンダリング関数が再び呼び出される場合と、呼び出されない場合があります。

注意: Mac OS X では、遅延レンダリングは、カスタムデータ形式でのみ機能します。標準データ形式では、レンダリング関数は直ちに呼び出されます。

遅延レンダリング関数を使用したテキストのペースト

次の例では、遅延レンダリング関数の実装方法を示します。

ユーザーが「コピー」ボタンを押すと、アプリケーションによってシステムクリップボードがクリアされ、前のクリップボード操作のデータが消去されます。次に、 setDataHandler() メソッドがクリップボードレンダラーとして renderData() 関数を設定します。

目的のテキストフィールドのコンテキストメニューから「ペースト」コマンドを選択すると、アプリケーションはクリップボードにアクセスして、目的のテキストを設定します。クリップボードのテキストデータ形式はストリングではなく関数を使用して設定されるので、クリップボードは renderData() 関数を呼び出します。 renderData() 関数はテキストをソーステキストで返し、それがペースト先のテキストに割り当てられます。

「ペースト」ボタンをクリックする前にソーステキストを編集した場合、「コピー」ボタンをクリックした後で編集を行ったとしても、ペーストされるテキストに編集が反映されます。これは、「ペースト」ボタンがクリックされてから、レンダリング関数がソーステキストをコピーするからです(実際のアプリケーションで遅延レンダリングを使用するときは、このような問題を防ぐため、ソースデータを何らかの方法で保存または保護することが必要になる場合があります)。

Flash の例

 package {  
    import flash.desktop.Clipboard; 
    import flash.desktop.ClipboardFormats; 
    import flash.desktop.ClipboardTransferMode; 
    import flash.display.Sprite; 
    import flash.text.TextField; 
    import flash.text.TextFormat; 
    import flash.text.TextFieldType; 
    import flash.events.MouseEvent; 
    import flash.events.Event; 
    public class DeferredRenderingExample extends Sprite  
    {  
         private var sourceTextField:TextField; 
        private var destination:TextField; 
        private var copyText:TextField; 
        public function DeferredRenderingExample():void 
        { 
            sourceTextField = createTextField(10, 10, 380, 90); 
            sourceTextField.text = "Neque porro quisquam est qui dolorem " 
                + "ipsum quia dolor sit amet, consectetur, adipisci velit."; 
                 
            copyText = createTextField(10, 110, 35, 20); 
            copyText.htmlText = "<a href='#'>Copy</a>"; 
            copyText.addEventListener(MouseEvent.CLICK, onCopy); 
 
            destination = createTextField(10, 145, 380, 90); 
            destination.addEventListener(Event.PASTE, onPaste); 
        } 
        private function createTextField(x:Number, y:Number, width:Number, 
                        height:Number):TextField 
        { 
            var newTxt:TextField = new TextField(); 
            newTxt.x = x; 
            newTxt.y = y; 
            newTxt.height = height; 
            newTxt.width = width; 
            newTxt.border = true; 
            newTxt.multiline = true; 
            newTxt.wordWrap = true; 
            newTxt.type = TextFieldType.INPUT; 
            addChild(newTxt); 
            return newTxt; 
        } 
        public function onCopy(event:MouseEvent):void 
        { 
            Clipboard.generalClipboard.clear(); 
            Clipboard.generalClipboard.setDataHandler(ClipboardFormats.TEXT_FORMAT, 
                            renderData); 
        } 
        public function onPaste(event:Event):void 
        { 
            sourceTextField.text = 
            Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT).toString; 
        } 
        public function renderData():String 
        { 
            trace("Rendering data"); 
            var sourceStr:String = sourceTextField.text; 
            if (sourceTextField.selectionEndIndex > 
                     sourceTextField.selectionBeginIndex) 
            { 
                return sourceStr.substring(sourceTextField.selectionBeginIndex, 
                                    sourceTextField.selectionEndIndex); 
            } 
            else 
            { 
                return sourceStr; 
            } 
        } 
    } 
}

Flex の例

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" width="326" height="330" applicationComplete="init()"> 
    <mx:Script> 
    <![CDATA[ 
    import flash.desktop.Clipboard; 
    import flash.desktop.ClipboardFormats; 
     
    public function init():void 
    { 
        destination.addEventListener("paste", doPaste); 
    } 
 
    public function doCopy():void 
    { 
        Clipboard.generalClipboard.clear(); 
        Clipboard.generalClipboard.setDataHandler(ClipboardFormats.TEXT_FORMAT, renderData); 
    } 
    public function doPaste(event:Event):void 
    { 
        destination.text = Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT).toString; 
    } 
     
    public function renderData():String{ 
        trace("Rendering data"); 
        return source.text; 
    } 
    ]]> 
    </mx:Script> 
    <mx:Label x="10" y="10" text="Source"/> 
    <mx:TextArea id="source" x="10" y="36" width="300" height="100"> 
        <mx:text>Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit.</mx:text> 
    </mx:TextArea> 
    <mx:Label x="10" y="181" text="Destination"/> 
    <mx:TextArea id="destination"  x="12" y="207" width="300" height="100"/> 
    <mx:Button click="doCopy();" x="91" y="156" label="Copy"/> 
</mx:Application>