Форматы данных Clipboard

Flash Player 10 и более поздних версий, Adobe AIR 1.0 и более поздних версий

Форматы Clipboard описывают данные, помещенные в объект Clipboard. Проигрыватель Flash Player и среда AIR автоматически переводят типы данных ActionScript и форматы данных буфера обмена в стандартные форматы данных. Кроме того, объекты приложения можно переносить между приложениями, созданными на базе ActionScript, и внутри них с помощью форматов, определенных в приложении.

Объект Clipboard может содержать представления одной и той же информации в разных форматах. Например, объект Clipboard, представляющий экземпляр Sprite, может включать формат ссылки для использования в том же приложении, сериализованный формат для использования другим приложением, выполняемым в проигрывателе Flash Player или среде AIR, формат растрового изображения для использования графическим редактором и формат списка файлов, возможно, с отложенной визуализацией для кодирования файла PNG, чтобы копировать или перетаскивать представление объекта Sprite в файловой системе.

Стандартные форматы данных

Константы, определяющие названия стандартных форматов, содержатся в классе ClipboardFormats:

Константа

Описание

TEXT_FORMAT

Данные в текстовом формате переводятся в класс String языка ActionScript и обратно.

HTML_FORMAT

Текст с HTML-разметкой.

RICH_TEXT_FORMAT

Данные в формате RTF переводятся в класс ByteArray языка ActionScript и обратно. RTF-разметка не прерывается и не переводится.

BITMAP_FORMAT

(только для AIR) Данные в формате растрового изображения преобразуются в класс ActionScript BitmapData и обратно.

FILE_LIST_FORMAT

(только для AIR) Данные в формате списка файлов преобразуются в массив объектов ActionScript File и обратно.

URL_FORMAT

(только для AIR) Данные в формате URL преобразуются в класс ActionScript String и обратно.

При копировании и вставке данных в ответ на событие copy , cut или paste в HTML-содержимом, размещенном в приложении AIR, вместо строк ClipboardFormat следует использовать MIME-типы. Ниже перечислены поддерживаемые MIME-типы данных:

Тип MIME

Описание

Текст

«text/plain»;

URL-адрес

«text/uri-list»;

Растровое изображение

«image/x-vnd.adobe.air.bitmap»;

Список файлов

«application/x-vnd.adobe.air.file-list».

Примечание. Доступ к данным в формате RTF нельзя получить из свойства clipboardData объекта события в результате события paste в HTML-содержимом.

Заказные форматы данных

Пользовательские форматы приложения могут использоваться для передачи объектов в виде ссылок или сериализованных копий. Ссылки действуют только в пределах одного и того же приложения. Сериализованные объекты могут передаваться между приложениями, но использовать их можно только с объектами, которые остаются действительными в результате сериализации и десериализации. Как правило, объекты поддаются сериализации, если их свойства либо относятся к простому типу, либо являются сериализованными объектами.

Для добавления сериализованного объекта к объекту Clipboard при вызове метода Clipboard.setData() параметр serializable должен быть равен true . Именем формата может быть одно из стандартных названий или строка, произвольно заданная приложением.

Режимы передачи

Когда объект записывается в буфер обмена с использованием пользовательского формата данных, данные объекта могут считываться из буфера как ссылка или как сериализованная копия исходного объекта. Определено четыре режима передачи, в соответствии с которыми объекты переносятся как ссылки либо как сериализованные копии.

Режим передачи

Описание

ClipboardTransferModes.ORIGINAL_ONLY

Возвращается только ссылка. Если ссылки нет, возвращается значение null.

ClipboardTransferModes.ORIGINAL_PREFFERED

Возвращается ссылка (при наличии). В остальных случаях возвращается сериализованная копия.

ClipboardTransferModes.CLONE_ONLY

Возвращается только сериализованная копия. Если сериализованная копия недоступна, возвращается нулевое значение.

ClipboardTransferModes.CLONE_PREFFERED

Возвращается сериализованная копия (при наличии). В остальных случаях возвращается ссылка.

Чтение и запись данных в заказных форматах

При записи объекта в буфер обмена можно использовать любую строку, которая не начинается с зарезервированных префиксов air: или flash: для параметра format . Для чтения объекта используйте в качестве формата ту же строку. В примерах ниже показано, как считывать и записывать объекты в буфер обмена.

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

Чтобы извлечь сериализованный объект из объекта Clipboard (после операции перетаскивания или вставки), используйте то же имя формата и режимы передачи CLONE_ONLY или CLONE_PREFFERED .

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

К объекту Clipboard всегда добавляется ссылка. Для извлечения из объекта буфера обмена ссылки, а не сериализованной копии (после операции drop или paste) используйте режимы передачи ORIGINAL_ONLY или ORIGINAL_PREFFERED :

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

Ссылки действительны, только если источником объекта Clipboard является текущее приложение. Используйте режим передачи ORIGINAL_PREFFERED , чтобы получить ссылку, если она имеется, или сериализованную копию, если она недоступна.

Отложенная визуализация

Если создание формата затратно с точки зрения вычислительных ресурсов, можно использовать отложенную визуализацию: для этого необходима функция, предоставляющая данные по запросу. Эта функция вызывается, только если получатель операции перетаскивания или вставки запрашивает данные в отложенном формате.

Функция визуализации добавляется к объекту Clipboard с помощью метода setDataHandler() . Функция должна возвращать данные в подходящем формате. Например, при вызове метода setDataHandler(ClipboardFormat.TEXT_FORMAT, writeText) функция writeText() должна возвращать строку.

Если к объекту Clipboard с помощью метода setData() добавляются данные в таком же формате, эти данные будут иметь приоритет перед отложенными данными (функция визуализации не будет вызвана). При повторном доступе к данным буфера обмена функция визуализации может быть вызвана, а может и не быть вызвана.

Примечание. В ОС Mac OS X отложенная визуализация поддерживается только для пользовательских форматов данных. Для стандартных форматов данных функция визуализации вызывается немедленно.

Вставка текста с помощью функции отложенной визуализации

В примере ниже показано, как выполнять отложенную визуализацию.

Когда пользователь нажимает кнопку Copy (Копировать), приложение освобождает системный буфер обмена, чтобы удалить данные, оставшиеся после предыдущих операций с буфером обмена. Затем метод setDataHandler() задает функцию renderData() в качестве визуализатора буфера обмена.

Когда пользователь выбирает команду Paste (Вставить) из контекстного меню целевого текстового поля, приложение обращается к буферу обмена и задает целевой текст. Так как текстовый формат данных в буфере обмена задан с использованием функции, а не строки, буфер обмена вызывает функцию 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>