Formati di dati degli Appunti

Flash Player 10 e versioni successive, Adobe AIR 1.0 e versioni successive

I formati di dati descrivono i dati collocati in un oggetto Clipboard. Flash Player e AIR convertono automaticamente i formati di dati standard nel passaggio tra i tipi di dati ActionScript e i formati degli appunti di sistema. Inoltre, gli oggetti dell'applicazione possono essere trasferiti all'interno dell'applicazione stessa o tra diverse applicazioni ActionScript utilizzando i formati definiti per l'applicazione.

Un oggetto Clipboard può contenere rappresentazioni delle stesse informazioni in formati diversi. Un oggetto Clipboard rappresentante uno Sprite, ad esempio, può comprendere un formato di riferimento da utilizzare nella stessa applicazione, un formato serializzato da utilizzare in un'altra applicazione in esecuzione in Flash Player o AIR, un formato bitmap da utilizzare in un editor di immagini e un formato elenco di file, eventualmente con un rendering differito per la codifica di un file PNG, per la copia o il trascinamento di una rappresentazione dello Sprite all'interno del file system.

Formati di dati standard

Le costanti che definiscono i nomi in formato standard sono fornite nella classe ClipboardFormats:

Costante

Descrizione

TEXT_FORMAT

I dati in formato testo vengono tradotti in e dalla classe String di ActionScript.

HTML_FORMAT

Testo con codice HTML.

RICH_TEXT_FORMAT

I dati in formato RTF vengono tradotti in e dalla classe ByteArray di ActionScript. Il codice RTF non viene interpretato o tradotto in alcun modo.

BITMAP_FORMAT

(Solo per AIR) I dati in formato bitmap vengono convertiti da e verso la classe BitmapData di ActionScript.

FILE_LIST_FORMAT

(Solo per AIR) I dati in formato elenco file vengono convertiti da e verso un array di oggetti File di ActionScript.

URL_FORMAT

(Solo per AIR) I dati in formato URL vengono convertiti da e verso la classe String di ActionScript.

Quando si copiano e si incollano dati in risposta a un evento copy , cut o paste nel contenuto HTML che risiede in un'applicazione AIR, è necessario utilizzare tipi MIME in luogo delle stringhe ClipboardFormat. I tipi di dati MIME validi sono:

Tipo MIME

Descrizione

Testo

"text/plain"

URL

"text/uri-list"

Bitmap

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

Elenco file

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

Nota: i dati in formato RTF (Rich text format) non sono resi disponibili dalla proprietà clipboardData dell'oggetto evento inviato come risultato di un evento paste all'interno di contenuto HTML.

Formati di dati personalizzati

È possibile utilizzare formati personalizzati definiti dall'applicazione per trasferire oggetti come riferimenti o copie serializzate. I riferimenti sono validi solo all'interno dell'applicazione di origine. Gli oggetti serializzati possono essere trasferiti tra le applicazioni, tuttavia è possibile utilizzarli solo con oggetti che restano validi quando vengono serializzati e deserializzati. Solitamente, è possibile serializzare gli oggetti se le relative proprietà sono tipi semplici o oggetti serializzabili.

Per aggiungere un oggetto serializzato a un oggetto Clipboard, impostate il parametro serializable su true quando chiamate il metodo Clipboard.setData() . Il nome del formato può essere uno dei formati standard oppure una stringa arbitraria definita dall'applicazione.

Modalità di trasferimento

Quando un oggetto viene scritto negli Appunti utilizzando un formato di dati personalizzato, i dati dell'oggetto possono essere letti dagli Appunti come riferimento oppure come copia serializzata dell'oggetto originale. AIR definisce quattro modalità di trasferimento che determinano se gli oggetti vengono trasferiti come riferimenti o come copie serializzate:

Modalità di trasferimento

Descrizione

ClipboardTransferModes.ORIGINAL_ONLY

Viene restituito solo un riferimento. Se non è disponibile alcun riferimento, viene restituito un valore null.

ClipboardTransferModes.ORIGINAL_PREFFERED

Viene restituito un riferimento, se disponibile. Altrimenti, viene restituita una copia serializzata.

ClipboardTransferModes.CLONE_ONLY

Viene restituita solo una copia serializzata. Se non è disponibile alcuna copia serializzata, viene restituito un valore null.

ClipboardTransferModes.CLONE_PREFFERED

Viene restituita una copia serializzata, se disponibile. Altrimenti, viene restituito un riferimento.

Lettura e scrittura di formati di dati personalizzati

Per la scrittura di un oggetto negli Appunti, potete utilizzare qualsiasi stringa che non inizia con i prefissi riservati air: o flash: per il parametro format . Utilizzate la stessa stringa come formato per leggere l'oggetto. Nell'esempio seguente viene illustrato come leggere e scrivere oggetti negli Appunti:

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

Per estrarre un oggetto serializzato dagli Appunti dopo un'operazione di rilascio o di incolla, utilizzate lo stesso nome formato e le modalità di trasferimento CLONE_ONLY o CLONE_PREFFERED .

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

Viene sempre aggiunto un riferimento all'oggetto Clipboard. Per estrarre il riferimento dall'oggetto Clipboard dopo un'operazione di trascinamento o di incolla, invece della copia serializzata, utilizzate le modalità di trasferimento ORIGINAL_ONLY o ORIGINAL_PREFFERED :

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

I riferimenti sono validi solo se l'oggetto Clipboard ha origine nell'applicazione corrente. Se il riferimento è disponibile, per accedervi utilizzate la modalità di trasferimento ORIGINAL_PREFFERED ; in caso contrario, utilizzate il clone serializzato.

Rendering differito

Se a livello di calcolo la creazione di un formato di dati risulta un'operazione costosa, è possibile utilizzare il rendering differito mediante una funzione che fornisce i dati a richiesta. La funzione viene chiamata solo se un ricevitore dell'operazione di rilascio o di incolla richiede i dati in formato differito.

La funzione di rendering viene aggiunta a un oggetto Clipboard mediante il metodo setDataHandler() . La funzione deve restituire i dati nel formato adatto. Ad esempio, se è stata effettuata la chiamata a setDataHandler(ClipboardFormat.TEXT_FORMAT, writeText) , la funzione writeText() dovrà restituire una stringa.

Se un formato dati dello stesso tipo viene aggiunto a un oggetto Clipboard con il metodo setData() , tali dati avranno la precedenza sulla versione differita (la funzione di rendering non viene chiamata). La funzione di rendering potrebbe essere richiamata o meno se si accede agli stessi Appunti una seconda volta.

Nota: in Mac OS X, il rendering differito funziona solo con formati di dati personalizzati. Con i formati di dati standard, la funzione di rendering viene chiamata immediatamente.

Incollare testo utilizzando una funzione di rendering differito

Nell'esempio illustrato di seguito viene mostrato come implementare una funzione di rendering differito.

Quando l'utente fa clic sul pulsante Copia, l'applicazione svuota gli appunti di sistema per assicurarsi che non rimanga alcun dato di una precedente operazione sugli appunti. Il metodo setDataHandler() , quindi, imposta la funzione renderData() come renderer degli Appunti.

Quando l'utente seleziona il comando Incolla dal menu di scelta rapida del campo di testo di destinazione, l'applicazione accede agli appunti e imposta il testo di destinazione. Poiché il formato di dati del testo sugli appunti è stato impostato con una funzione anziché con una stringa, gli appunti chiamano la funzione renderData() . La funzione renderData() restituirà quindi il testo nel testo di origine, che viene quindi assegnato al testo di destinazione.

Si noti che se si modifica il testo di origine prima di premere il pulsante Paste, la modifica verrà applicata nel testo incollato, anche se si verifica dopo che è stato premuto il pulsante di copia. La ragione è che la funzione di rendering non consente di copiare il testo di origine fino a quando non viene premuto il pulsante per incollare. Per impedire tale problema, quando si utilizza il rendering differito in un'applicazione reale è possibile archiviare o proteggere i dati di origine in qualche modo.

Esempio 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; 
            } 
        } 
    } 
}

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