Formatos de dados da área de transferência

Flash Player 10 e posterior, Adobe AIR 1.0 e posterior

Os formatos da área de transferência descrevem os dados colocados em um objeto Clipboard. O Flash Player ou o AIR traduz automaticamente os formatos de dados padrão entre tipos de dados do ActionScript e formatos da área de transferência do sistema. Além disso, os objetos do aplicativo podem ser transferidos internamente em ou entre aplicativos com base no ActionScript, usando formatos definidos pelo aplicativo.

Um objeto Clipboard pode conter representações das mesmas informações em diferentes formatos. Por exemplo, um objeto Clipboard representando um Sprite poderia incluir um formato de referência para ser usado no mesmo aplicativo, um formato serializado para ser usado por outro aplicativo em execução no Flash Player ou no AIR, um formato bitmap para ser usado por um editor de imagens e um formato de lista de arquivo, talvez com renderização adiada para codificar um arquivo PNG, para copiar ou arrastar uma representação do Sprite para o sistema de arquivos.

Formatos de dados padrão

As constantes que definem os nomes de formato padrão são fornecidas na classe ClipboardFormats:

Constante

Descrição

TEXT_FORMAT

Dados em formato de texto são traduzidos para e da classe String do ActionScript.

HTML_FORMAT

Texto com marcação HTML.

RICH_TEXT_FORMAT

Dados em RTF são traduzidos para e da classe ByteArray do ActionScript. A marcação RTF não é interpretada ou traduzida de forma alguma.

BITMAP_FORMAT

(somente AIR) Dados em formato bitmap são traduzidos para e da classe BitmapData do ActionScript.

FILE_LIST_FORMAT

(somente AIR) Dados em formato de lista de arquivo são traduzidos para e de uma matriz de objetos File do ActionScript.

URL_FORMAT

(somente AIR) Dados em formato de URL são traduzidos para e a partir da classe String do ActionScript.

Ao copiar e colar dados em resposta a um evento copy , cut ou paste em conteúdo HTML hospedado em um aplicativo do AIR, devem ser usados tipos MIME em vez das sequências de caracteres ClipboardFormat. Os tipos MIME de dados válidos são:

Tipo MIME

Descrição

Texto

"text/plain"

URL

"text/uri-list"

Bitmap

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

Lista de arquivos

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

Nota: Dados RTF não estão disponíveis da propriedade clipboardData do objeto de evento despachado como resultado de um evento paste no conteúdo HTML.

Formatos de dados personalizados

Você pode usar formatos personalizados definidos por aplicativo para transferir objetos como referências ou cópias serializadas. As referências são válidas apenas no mesmo aplicativo. Os objetos serializados podem ser transferidos entre aplicativos, mas só podem ser usados com objetos que permanecem válidos quando serializados e desserializados. Geralmente, objetos podem ser serializados se suas propriedades forem tipos simples ou objetos serializável.

Para adicionar um objeto serializado a um objeto Clipboard, defina o parâmetro serializable como serializable como true ao chamar o método Clipboard.setData() . O nome do formato pode ser um dos formatos padrão ou uma sequência de caracteres arbitrária definida pelo seu aplicativo.

Modos de transferência

Quando um objeto é escrito na área de transferência usando um formato de dados personalizado, os dados do objeto podem ser lidos da área de transferência como referência ou uma cópia serializada do objeto original. Há quatro modos de transferência que determinam se os objetos são transferidos como referências ou como cópias serializadas:

Modo de transferência

Descrição

ClipboardTransferModes.ORIGINAL_ONLY

Apenas uma referência é retornada. Se nenhuma referência estiver disponível, um valor null será retornado.

ClipboardTransferModes.ORIGINAL_PREFFERED

Uma referência é retornada, se disponível. Caso contrário, uma cópia serializada é retornada.

ClipboardTransferModes.CLONE_ONLY

Apenas uma cópia serializada é retornada. Se nenhuma cópia serializada estiver disponível, será retornado um valor null.

ClipboardTransferModes.CLONE_PREFFERED

Uma cópia serializada é retornada, se disponível. Caso contrário, uma referência é retornada.

Leitura e escrita de formatos de dados personalizados

Ao gravar um objeto na área de transferência, você pode usar qualquer sequência de caracteres que não comece com os prefixos reservados air: ou flash: para o parâmetro format . Use a mesma sequência de caracteres do formato para ler o objeto. Os exemplos a seguir ilustram como ler e escrever objetos na área de transferência:

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

Para extrair um objeto serializado do objeto da área de transferência (após uma operação de soltar ou colar), use o mesmo nome de formato e os modos de transferência CLONE_ONLY ou CLONE_PREFFERED .

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

Uma referência é sempre adicionada ao objeto Clipboard. Para extrair a referência do objeto da área de transferência (após uma operação de soltar ou colar), em vez da cópia serializada, use os modos de transferência ORIGINAL_ONLY ou ORIGINAL_PREFFERED :

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

As referências são válidas apenas se o objeto Clipboard se originar do aplicativo atual. Use o modo de transferência ORIGINAL_PREFFERED para acessar a referência quando ela estiver disponível e o clone serializado quando a referência não estiver disponível.

Renderização adiada

Se criar um formato de dados for computacionalmente caro, você poderá usar o processamento adiado fornecendo uma função que forneça os dados em demanda. A função só é chamada se um receptor da operação de soltar ou colar solicitar dados no formato adiado.

A função de processamento é adicionada a um objeto Clipboard usando o método setDataHandler() . A função deve retornar os dados no formato apropriado. Por exemplo, se você chamou setDataHandler(ClipboardFormat.TEXT_FORMAT, writeText) , a função writeText() deverá retornar uma sequência de caracteres.

Se um formato de dados do mesmo tipo for adicionado a um objeto Clipboard com o método setData() , esses dados tem precedência sobre a versão adiada (a função de renderização nunca é chamada). A função de renderização pode ou não ser chamada novamente se os mesmos dados da área de transferência forem acessados uma segunda vez.

Nota: No Mac OS X, a renderização adiada só funciona com formatos de dados personalizados. No caso de formatos de dados padrão, a função de renderização é chamada imediatamente.

Colagem de texto usando uma função de renderização adiada

O exemplo a seguir ilustra como implementar uma função de renderização adiada.

Quando um usuário pressiona o botão Copiar, o aplicativo limpa a área de transferência para garantir que nenhum dado de operações anteriores seja mantido. Em seguida, o método setDataHandler() define a função renderData() como renderizador da área de transferência.

Quando um usuário seleciona o comando Colar no menu de contexto do campo de texto de destino, o aplicativo acessa a área de transferência e define o texto de destino. Como o formato de dados de texto na área de transferência foi definido com uma função em vez de uma string, a área de transferência chama a função renderData() . A função renderData() retorna o texto no texto de origem, que é então atribuído ao texto de destino.

Observe que se você editar o texto de origem antes de pressionar o botão Colar, a edição será refletida no texto colado, mesmo quando a edição ocorrer após o botão de copiar ter sido pressionado. Isso porque a função de processamento não copia o texto de origem até que o botão de colar seja pressionado. (Ao usar o processamento adiado em um aplicativo real, você pode desejar armazenar ou proteger os dados de origem de alguma maneira para impedir esse problema.)

Exemplo de 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; 
            } 
        } 
    } 
}

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