클립보드 데이터 형식

Flash Player 10 이상, Adobe AIR 1.0 이상

클립보드 형식은 Clipboard 객체에 있는 데이터를 설명합니다. Flash Player 또는 AIR에서는 ActionScript 데이터 형식과 시스템 클립보드 형식 간에 표준 데이터 형식을 자동으로 변환합니다. 또한 ActionScript 기반 응용 프로그램 내에서와 ActionScript 기반 용 프로그램 간에 응용 프로그램 정의 형식을 사용하여 응용 프로그램 객체를 전송할 수 있습니다.

Clipboard 객체에는 같은 정보를 다른 형식으로 표현한 내용이 포함될 수 있습니다. 예를 들어 스프라이트를 나타내는 Clipboard 객체에는 동일한 응용 프로그램 내에서 사용하기 위한 참조 형식, Flash Player 또는 AIR에서 실행되는 다른 응용 프로그램에서 사용하기 위한 직렬화된 형식, 이미지 편집기에서 사용하기 위한 비트맵 형식 및 파일 목록 형식이 포함될 수 있으며 스프라이트 표현을 파일 시스템에 복사 또는 드래그하기 위한 PNG 파일 인코딩용 지연 렌더링도 포함될 수 있습니다.

표준 데이터 형식

표준 형식 이름을 정의하는 상수는 ClipboardFormats 클래스에서 제공됩니다.

상수

설명

TEXT_FORMAT

텍스트 형식 데이터와 ActionScript String 클래스는 서로 변환됩니다.

HTML_FORMAT

HTML 마크업이 있는 텍스트입니다.

RICH_TEXT_FORMAT

서식 있는 텍스트 데이터와 ActionScript ByteArray 클래스는 서로 변환됩니다. RTF 마크업은 어떤 식으로든 해석되거나 변환되지 않습니다.

BITMAP_FORMAT

(AIR만 해당) 비트맵 형식 데이터는 ActionScript BitmapData 클래스로 변환하거나 그 반대로 변환할 수 있습니다.

FILE_LIST_FORMAT

(AIR만 해당) 파일 목록 형식 데이터는 ActionScript File 객체의 배열로 변환하거나 그 반대로 변환할 수 있습니다.

URL_FORMAT

(AIR만 해당) URL 형식 데이터는 ActionScript String 클래스로 변환하거나 그 반대로 변환할 수 있습니다.

AIR 응용 프로그램에서 호스팅되는 HTML 내용에서 copy, cut 또는 paste 이벤트에 응답하여 데이터를 복사하고 붙여넣을 때 ClipboardFormat 문자열 대신 MIME 유형을 사용해야 합니다. 유효한 데이터 MIME 유형은 다음과 같습니다.

MIME 유형

설명

텍스트

"text/plain"

URL

"text/uri-list"

비트맵

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

파일 목록

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

참고: 서식 있는 포맷의 데이터는 HTML 내용 내에서 paste 이벤트의 결과로 전달된 이벤트 객체의 clipboardData 속성에서 사용할 수 없습니다.

사용자 정의 데이터 형식

응용 프로그램에서 정의한 사용자 정의 형식을 사용하여 객체를 참조 또는 직렬화된 복사본으로 전송할 수 있습니다. 참조는 같은 응용 프로그램 안에서만 유효합니다. 직렬화된 객체는 응용 프로그램 간에 전송할 수 있지만 직렬화되고 역직렬화되었을 때 유효한 상태로 있는 객체에서만 사용할 수 있습니다. 대개 객체의 속성이 간단한 유형이거나 직렬화된 객체인 경우 객체를 직렬화할 수 있습니다.

Clipboard 객체에 직렬화된 객체를 추가하려면 Clipboard.setData() 메서드를 호출할 때 serializable 매개 변수를 true로 설정합니다. 형식 이름은 표준 형식 중 하나이거나 응용 프로그램에서 정의된 임의의 문자열일 수 있습니다.

전송 모드

사용자 정의 데이터 형식을 사용하여 클립보드에 객체를 쓸 경우 클립보드에서 해당 객체 데이터를 읽을 때는 참조나 원본 객체의 직렬화된 복사본으로 읽을 수 있습니다. AIR는 객체를 참조 또는 직렬화된 복사본으로 전송할 지 여부를 결정하는 4개의 전송 모드를 정의합니다.

전송 모드

설명

ClipboardTransferModes.ORIGINAL_ONLY

참조만 반환됩니다. 참조를 사용할 수 없는 경우 null 값이 반환됩니다.

ClipboardTransferModes.ORIGINAL_PREFFERED

가능한 경우 참조가 반환됩니다. 그렇지 않은 경우에는 직렬화된 복사본이 반환됩니다.

ClipboardTransferModes.CLONE_ONLY

직렬화된 복사본만 반환됩니다. 직렬화된 복사본을 사용할 수 없으면 null 값이 반환됩니다.

ClipboardTransferModes.CLONE_PREFFERED

가능한 경우 직렬화된 복사본이 반환됩니다. 그렇지 않은 경우 참조가 반환됩니다.

사용자 정의 데이터 형식 읽기 및 쓰기

클립보드에 객체를 쓸 때 format 매개 변수에는 예약된 접두어인 air: 또는 flash:로 시작하지 않는 모든 문자열을 이용할 수 있습니다. 객체를 읽을 형식과 같은 문자열을 사용합니다. 다음 예제에서는 객체를 클립보드에 읽고 쓰는 방법에 대해 설명합니다.

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 객체에 추가됩니다. 드롭 또는 붙여넣기 작업 후에 Clipboard 객체에서 참조를 추출하려면 직렬화된 복사본 대신 ORIGINAL_ONLY 또는 ORIGINAL_PREFFERED 전송 모드를 사용합니다.

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

Clipboard 객체가 현재 응용 프로그램에서 발생한 경우에만 참조가 유효합니다. ORIGINAL_PREFFERED 전송 모드를 사용하여 참조가 사용 가능할 때 참조에 액세스하고 참조가 사용 가능하지 않을 때 직렬화된 클론에 액세스합니다.

지연된 렌더링

데이터 형식 만들기가 계산상으로 광범위한 경우 요청한 데이터를 제공하는 함수를 제공하여 지연된 렌더링을 사용할 수 있습니다. 드롭 또는 붙여넣기 작업의 받는 사람이 지연된 형식의 데이터를 요청하는 경우에만 이 함수가 호출됩니다.

렌더링 함수는 setDataHandler() 메서드를 사용하여 Clipboard 객체에 추가됩니다. 이 함수는 적절한 형식의 데이터를 반환해야 합니다. 예를 들어 setDataHandler(ClipboardFormat.TEXT_FORMAT, writeText)를 호출한 경우 writeText() 함수가 문자열을 반환해야 합니다.

Clipboard 객체에 동일한 유형의 데이터 형식이 setData() 메서드를 사용하여 추가되어 있는 경우에는 지연 버전보다 해당 데이터가 우선하므로 렌더링 함수가 호출되지 않습니다. 같은 클립보드 데이터에 두 번째 액세스하는 경우 렌더링 함수가 다시 호출될 수도 있고 호출되지 않을 수도 있습니다.

참고: Mac OS X의 경우 지연 렌더링은 사용자 정의 데이터 형식에 대해서만 작동합니다. 표준 데이터 형식의 경우에는 렌더링 함수가 즉시 호출됩니다.

지연된 렌더링 함수를 사용하여 텍스트 붙여넣기

다음 예제에서는 지연된 렌더링 함수를 구현하는 방법에 대해 설명합니다.

사용자가 복사 버튼을 누르면 응용 프로그램에서는 이전 클립보드 작업에서 복사된 데이터가 남아 있지 않도록 시스템 클립보드를 지웁니다. 그런 다음 setDataHandler() 메서드가 renderData() 함수를 클립보드 렌더러로 설정합니다.

사용자가 대상 텍스트 필드의 컨텍스트 메뉴에서 붙여넣기 명령을 선택하면 응용 프로그램에서는 클립보드에 액세스하여 대상 텍스트를 설정합니다. 문자열 대신 함수를 사용하여 클립보드의 텍스트 데이터 형식을 설정한 후에는 클립보드에서 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>