Format för Clipboard-data

Flash Player 10 och senare, Adobe AIR 1.0 och senare

Clipboard-formaten beskriver vilka data som placeras i ett Clipboard-objekt. Flash Player eller AIR översätter automatiskt standarddataformaten mellan ActionScript-datatyper och systemets urklippsformat. Programobjekt kan dessutom överföras inom och mellan ActionScript-baserade program med hjälp av programdefinierade format.

Ett Clipboard-objekt kan innehålla representationer av samma information i olika format. Ett Clipboard-objekt som till exempel representerar en Sprite kan omfatta ett referensformat som ska användas i samma program, ett serialiserat format som ska användas av ett annat program som kör Flash Player eller AIR, ett bitmappsformat som ska användas i en bildredigerare och ett fillisteformat, kanske med fördröjd återgivning för kodning av en PNG-fil, för att kopiera och dra en representation av denna Sprite till filsystemet.

Standarddataformat

Konstanterna som definierar standardformatnamnen finns i klassen ClipboardFormats:

Konstant

Beskrivning

TEXT_FORMAT

Textformatdata översätts till och från ActionScript-klassen String.

HTML_FORMAT

Text med HTML-kod.

RICH_TEXT_FORMAT

RTF-data översätts till och från ActionScript-klassen ByteArray. RTF-koden varken tolkas eller översätts på något sätt.

BITMAP_FORMAT

(Enbart AIR) Bitmappsdata översätts till och från ActionScript-klassen BitmapData.

FILE_LIST_FORMAT

(Enbart AIR) Data i fillisteformat översätts till och från en array med ActionScript File-objekt.

URL_FORMAT

(Enbart AIR) URL-formatdata översätts till och från ActionScript-klassen String.

När du vill kopiera och klistra in data som svar på en copy -, cut - eller paste -händelse i HTML-innehåll i ett AIR-program måste MIME-typer användas i stället för ClipboardFormat-strängar. Giltiga MIME-typer för data är:

MIME-typ

Beskrivning

Text

”text/plain”

URL

”text/uri-list”

Bitmapp

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

Fillista

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

Obs! RTF-data är inte tillgängliga från egenskapen clipboardData för händelseobjektet som skickas som ett resultat av en paste -händelse i HTML-innehåll.

Egna dataformat

Du kan använda programdefinierade anpassade format om du vill överföra objekt som referenser eller som serialiserade objekt. Referenser är bara giltiga inom samma program. Serialiserade objekt kan överföras mellan program, men kan bara användas med objekt som förblir giltiga vid serialisering och deserialisering. Objekt kan vanligtvis serialiseras om egenskaperna är enkla typer eller serialiserbara objekt.

Om du vill lägga till ett serialiserat objekt i ett Clipboard-objekt ställer du in parametern serializable true när du anropar metoden Clipboard.setData() . Formatnamnet kan vara något av standardformaten eller en godtycklig sträng som definieras i programmet.

Överföringslägen

När ett objekt skrivs till Urklipp med hjälp av ett anpassat dataformat, kan objektdata läsas från Urklipp antingen som en referens eller som en serialiserad kopia av det ursprungliga objektet. Det finns fyra överföringslägen som avgör om objekten överförs som referenser eller som serialiserade kopior:

Överföringsläge

Beskrivning

ClipboardTransferModes.ORIGINAL_ONLY

Enbart en referens returneras. Om ingen referens finns, returneras ett null-värde.

ClipboardTransferModes.ORIGINAL_PREFFERED

En referens returneras, om en sådan finns. Annars returneras en serialiserad kopia.

ClipboardTransferModes.CLONE_ONLY

Enbart en serialiserad kopia returneras. Om ingen serialiserad kopia finns returneras ett null-värde.

ClipboardTransferModes.CLONE_PREFFERED

En serialiserad kopia returneras, om en sådan finns. Annars returneras en referens.

Läsa och skriva anpassade dataformat

När ett objekt skrivs till Urklipp kan du använda valfri sträng som inte börjar med något av de reserverade prefixen air: eller flash: för parametern format . Använd samma sträng som formatet som ska läsa objektet. I följande exempel visas hur objekt läses och skrivs till Urklipp:

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

Om du vill extrahera ett serialiserat objekt från urklippsobjektet (efter en åtgärd av typen släppa eller klistra in) använder du samma formatnamn och överföringsläget CLONE_ONLY eller CLONE_PREFFERED .

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

En referens läggs alltid till i objektet Clipboard. Om du vill extrahera referensen från urklippsobjektet (efter en åtgärd av typen släppa eller klistra in), i stället för en serialiserad kopia, använder du överföringsläget ORIGINAL_ONLY eller ORIGINAL_PREFFERED :

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

Referenserna är bara giltiga om Clipboard-objektet härstammar från det aktuella programmet. Använd överföringsläget ORIGINAL_PREFFERED om du vill få tillgång till referensen när den är tillgänglig och till den serialiserade klonen när referensen inte är tillgänglig.

Fördröjd återgivning

Om det tar mycket datorkraft att skapa ett dataformat, kan du använda fördröjd återgivning genom att ange en funktion som tillhandahåller data på begäran. Funktionen anropas bara om en mottagare av en släpp- eller klistra in-åtgärd begär data i det fördröjda formatet.

Återgivningsfunktionen läggs till i ett Clipboard-objekt med hjälp av metoden setDataHandler() . Funktionen måste returnera data i lämpligt format. Om du till exempel anropar setDataHandler(ClipboardFormat.TEXT_FORMAT, writeText) måste funktionen writeText() returnera en sträng.

Om ett dataformat av samma typ läggs till i ett Clipboard-objekt med metoden setData() , prioriteras dessa data över den fördröjda versionen (återgivningsfunktionen anropas aldrig). Återgivningsfunktionen anropas eventuellt inte igen om samma urklippsdata hämtas en andra gång.

Obs! I Mac OS X fungerar fördröjd återgivning bara med anpassade dataformat. Med standarddataformat anropas återgivningsfunktionen omedelbart.

Klistra in text med funktionen för fördröjd återgivning

I följande exempel visas hur du implementerar en funktion för fördröjd återgivning.

När användaren klickar på knappen Kopiera, raderas systemets Urklipp så att inga data finns kvar från föregående urklippsåtgärder. Metoden setDataHandler() ställer sedan in funktionen renderData() som urklippsåtergivning.

När användaren väljer kommandot Klistra in på snabbmenyn i måltextfältet får programmet tillgång till urklipp och ställer in måltexten. Eftersom textdataformatet i Urklipp har ställts in med en funktion i stället för en sträng, anropar Urklipp funktionen renderData() . Funktionen renderData() returnerar texten i källtexten, som sedan tilldelas måltexten.

Observera, att om du redigerar källtexten innan du trycker på knappen Klistra in, återspeglas redigeringen i den inklistrade texten även om redigeringen görs efter att knappen Kopiera trycks ned. Detta beror på att återgivningsfunktionen inte kopierar källtexten förrän knappen Klistra in trycks ned. (När fördröjd återgivning används i ett riktigt program, kanske du bör lagra eller skydda källdata på något sätt för att undvika det här problemet.)

Flash-exempel

 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-exempel

<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>