Formaty danych Clipboard

Flash Player 10 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

Formaty Clipboard opisują dane umieszczone w obiekcie Clipboard. Program Flash Player lub AIR automatycznie tłumaczy standardowe formaty danych między typami danych ActionScript a formatami w schowku systemowym. Ponadto obiekty aplikacji mogą być przenoszone w obrębie aplikacji oraz pomiędzy aplikacjami bazującymi na języku ActionScript przy użyciu formatów zdefiniowanych dla aplikacji.

Obiekt Clipboard może zawierać reprezentacje tej samej informacji w różnych formatach. Na przykład: obiekt Clipboard reprezentujący ikonkę może zawierać format odwołania do użytku z tą samą aplikacją, serializowany format do użytku z inną aplikacją działającą w programie Flash Player lub środowisku AIR, format bitmapy używany przez edytor obrazów, a także format listy plików — być może z odroczonym renderowaniem w celu kodowania plików PNG — przeznaczony do kopiowania lub przeciągania reprezentacji ikonki do systemu plików.

Standardowe formaty danych

W klasie ClipboardFormats zostały uwzględnione stałe definiujące nazwy standardowych formatów:

Stała

Opis

TEXT_FORMAT

Dane formatu tekstowego są tłumaczone na oraz z klasy ActionScript String.

HTML_FORMAT

Tekst ze znacznikiem HTML.

RICH_TEXT_FORMAT

Dane formatu tekstu wzbogaconego są tłumaczone na oraz z klasy ActionScript ByteArray. Znacznik RTF nie jest interpretowany ani tłumaczony w żaden sposób.

BITMAP_FORMAT

(Tylko AIR) Dane w formacie bitmapy są tłumaczone na/z klasę/klasy BitmapData języka ActionScript.

FILE_LIST_FORMAT

(Tylko AIR) Dane w formacie listy plików są tłumaczone na/z tablicę/tablicy obiektów File języka ActionScript.

URL_FORMAT

(Tylko AIR) Dane w formacie URL są tłumaczone na/z klasę/klasy String języka ActionScript.

Podczas kopiowania i wklejania danych w odpowiedzi na zdarzenie copy , cut lub paste w treści HTML znajdującej się w aplikacji AIR, należy skorzystać z typów MIME zamiast z ciągów ClipboardFormat. Poprawne typy danych MIME:

Typ MIME

Opis

Tekst

"text/plain"

URL

"text/uri-list"

Bitmapa

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

Lista plików

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

Uwaga: Dane formatu tekstu wzbogaconego nie są dostępne z właściwości clipboardData obiektu zdarzenia wywołanego w wyniku zdarzenia paste w treści HTML.

Niestandardowe formaty danych

Za pomocą niestandardowych formatów danych zdefiniowanych w aplikacji można przesyłać obiekty jako odniesienia lub serializowane kopie. Odniesienia są poprawne tylko w tej samej aplikacji. Obiekty serializowane mogą być przeniesione pomiędzy aplikacjami, ale można ich używać wyłącznie z obiektami, które pozostaną poprawne po serializowaniu i anulowaniu serializowania. Obiekty mogą być zazwyczaj serializowane, jeśli ich właściwości są typu prostego lub stanowią obiekty podlegające serializacji.

W celu dodania obiektu serializowanego do obiektu Clipboard należy ustawić dla parametru serializable wartość true podczas wywoływania metody Clipboard.setData() . Nazwa formatu może stanowić jeden ze standardowych formatów lub być przypadkowym ciągiem zdefiniowanym w aplikacji.

Tryby przenoszenia

W przypadku obiektu zapisanego w schowku w niestandardowym formacie danych dane obiektu można odczytać ze schowka jako odwołanie lub jako serializowaną kopię obiektu oryginalnego. Są cztery tryby przenoszenia określające, czy obiekty są przenoszone jako odniesienia czy kopie serializowane.

Tryb przenoszenia

Opis

ClipboardTransferModes.ORIGINAL_ONLY

Zwracane jest wyłącznie odniesienie. Jeśli odniesienie nie jest dostępne, zwracana jest wartość null.

ClipboardTransferModes.ORIGINAL_PREFFERED

Zwracane jest odniesienie (jeśli jest dostępne). W przeciwnym razie zwracana jest serializowana kopia.

ClipboardTransferModes.CLONE_ONLY

Zwracana jest wyłącznie kopia serializowana. Jeśli kopia serializowana nie jest dostępna, zwracana jest wartość null.

ClipboardTransferModes.CLONE_PREFFERED

Zwracana jest kopia serializowana (jeśli jest dostępna). W przeciwnym razie zwracane jest odniesienie.

Odczytywanie i zapisywanie niestandardowych formatów danych

Zapisując obiekt w schowku, jako parametru format można używać dowolnego ciągu znaków, który nie rozpoczyna się od zarezerwowanych przedrostków air: lub flash: : Ten sam ciąg co dla formatu można wykorzystać do odczytywania obiektu. Następujące przykłady ilustrują sposób odczytywania i zapisywania obiektów do schowka:

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

Aby wyciągnąć obiekt serializowana z obiektu schowka (po upuszczeniu lub wklejeniu), należy użyć tej samej nazwy formatu i trybów przenoszenia CLONE_ONLY lub CLONE_PREFFERED .

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

Odniesienie jest zawsze dodane do obiektu Clipboard. Aby wyciągnąć odniesienie z obiektu schowka (po upuszczeniu lub wklejeniu), zamiast kopii serializowanej należy użyć i trybów przenoszenia ORIGINAL_ONLY lub ORIGINAL_PREFFERED .

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

Odniesienia są poprawne wyłącznie, jeśli obiekt Clipboard pochodzi z bieżącej aplikacji Za pomocą trybu przenoszenia ORIGINAL_PREFFERED można uzyskać dostęp do odniesienia, gdy jest dostępne, i do kopii serializowanej, gdy odniesienie nie jest dostępne.

Opóźnione renderowanie

Jeśli utworzenie formatu danych wymaga wielu obliczeń, można skorzystać z opóźnionego renderowania poprzez zastosowanie funkcji dostarczania danych na żądanie. Ta funkcja jest wywoływana tylko wówczas, gdy odbiorca operacji przeciągania lub wklejania zażąda danych w formacie odroczonym.

Funkcja renderowania zostaje dodana do obiektu Clipboard za pomocą metody setDataHandler() . Funkcja musi zwrócić dane w odpowiednim formacie. Na przykład, po wywołaniu setDataHandler(ClipboardFormat.TEXT_FORMAT, writeText) funkcja writeText() musi zwrócić łańcuch.

Jeśli format danych tego samego typu zostanie dodany do obiektu Clipboard za pomocą metody setData() , te dane będą miały pierwszeństwo przed wersją odroczoną (funkcja renderowania nigdy nie jest wywoływana). Funkcja renderowania może (ale nie musi) być wywołana ponownie, jeśli zostanie uzyskany dostęp do tych samych danych schowka.

Uwaga: W systemie Mac OS X odroczone renderowanie działa tylko z niestandardowymi formatami danych. W przypadku standardowych formatów danych funkcja renderowania jest wywoływana natychmiast.

Wklejanie tekstu za pomocą funkcji opóźnionego renderowania

W następnym przykładzie przedstawiony jest sposób wdrażania funkcji opóźnionego renderowania.

Gdy użytkownik naciśnie przycisk Kopiuj, aplikacja czyści schowek systemowy w celu zapewnienia, że nie zawiera on żadnych danych pozostawionych po poprzednich operacjach schowka. Następnie metoda setDataHandler() ustawia funkcję renderData() jako mechanizm renderujący dla schowka.

Gdy użytkownik wybierze polecenie Wklej z menu kontekstowego docelowego pola tekstowego, wówczas aplikacja uzyskuje dostęp do schowka i ustawia tekst docelowy. Format danych tekstowych w schowku został ustawiony za pomocą funkcji, a nie ciągu znaków, dlatego schowek wywołuje funkcję renderData() . Funkcja renderData() zwraca tekst w tekście źródłowym, który następnie zostanie przypisany do tekstu docelowego.

Należy zwrócić uwagę, że podczas edycji tekstu źródłowego przed naciśnięciem przycisku wklejania, zmiany zostaną odzwierciedlone we wklejonym tekście, nawet jeśli miały miejsce po naciśnięciu przycisku kopiowania. Dzieje się tak, ponieważ funkcja renderowania nie kopiuje tekstu źródłowego do czasu naciśnięcia przycisku wklejania. (Podczas korzystania z opóźnionego renderowania w rzeczywistej aplikacji dane źródłowe można przechowywać lub chronić w taki sam sposób, aby uniknąć tego problemu).

Przykład w środowisku 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; 
            } 
        } 
    } 
}

Przykład w środowisku 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>