ModalText ÄÄÆÛ³ÍÆ®ÀÇ ÀÛ¼º

´ÙÀ½ÀÇ Äڵ忹¿¡¼­´Â, ModalText ÄÄÆÛ³ÍÆ®ÀÇ class Á¤ÀǸ¦ ±¸ÇöÇϰí ÀÖ½À´Ï´Ù. ModalText ÄÄÆÛ³ÍÆ®´Â,Button ÄÁÆ®·Ñ°ú TextArea ÄÁÆ®·ÑÀ» Æ÷ÇÔÇÑ º¹ÇÕ ÄÄÆÛ³ÍÆ®ÀÔ´Ï´Ù. ´ÙÀ½ÀÇ ±×¸²Àº, ÀÌ ÄÁÆ®·ÑÀÇ ±×¸²ÀÔ´Ï´Ù.



ÀÌ ÄÁÆ®·ÑÀº, ´ÙÀ½ÀÇ ¼Ó¼ºÀ» °¡Áý´Ï´Ù.

´ÙÀ½ÀÇ MXML ÆÄÀÏÀÇ ¿¹¿¡¼­´Â, ModalText ÄÁÆ®·ÑÀ» »ç¿ëÇØ textPlacement properties ¸¦ left ·Î ¼³Á¤ÇØ ÀÖ½À´Ï´Ù.

<? xml version="1. 0"? >
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:MyComp="mycomponents. *">

    <MyComp:ModalText textPlacement="left"/>

</mx:Application>

´ÙÀ½ÀÇ ¿¹ÀÇ °°°Ô,placementChanged À̺¥Æ®¸¦ ó¸®ÇØ,ModalText.textPlacement properties ¸¦ º¯°æÇϴ ŸÀ̹ÖÀ» °áÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù.

    <mx:Script>
        <! [CDATA[
            import flash.events.Event;
    
            private function placementChangedListener(event:Event) :void {
                myEvent.text="placementChanged event occurred. ";
            }
        ]]>
    </mx:Script>

    <MyComp:ModalText textPlacement="left" 
placementChanged="placementChangedListener(event) ;"/> <mx:TextArea id="myEvent"/>

´ÙÀ½ÀÇ ¿¹´Â, ÀÌ ÄÁÆ®·ÑÀ» Á¤ÀÇÇϰí ÀÖ´Â "ModalText.as" ÆÄÀÏÀÔ´Ï´Ù.

package myComponents
{ 
    // ÇÊ¿äÇÑ Å¬·¡½º¸¦ ¸ðµÎ ÀоîµéÀδÙ
    import mx.core.UIComponent;
    import mx.controls.Button;
    import mx.controls.TextArea;
    import flash.events.Event;
    import flash.text.TextLineMetrics;

    // ModalText ´Â, ÀÚ½Ä (child) TextArea ÄÁÆ®·ÑÀÇ ÅØ½ºÆ®°¡ º¯°æµÇ¾úÀ» ¶§¿¡
    // change À̺¥Æ®¸¦ ¼ÛÃâ(Dispatch), ModalText ÀÇ ÅØ½ºÆ®  properties °¡
    // ¼³Á¤µÇ¾úÀ» ¶§¿¡ textChanged À̺¥Æ®¸¦ ¼ÛÃâ(Dispatch), ModalText ÀÇ textPlacement  properties °¡
    // º¯°æµÇ¾úÀ» ¶§¿¡ placementChanged À̺¥Æ®¸¦ ¼ÛÃâ(Dispatch)ÇÑ´Ù 
    [Event(name="change", type="flash.events.Event")]
    [Event(name="textChanged", type="flash.events.Event")]
    [Event(name="placementChanged", type="flash.events.Event")]

    /*** UIComponent ¸¦ È®ÀåÇÑ´Ù ***/
    public class ModalText extends UIComponent {

        /*** class constructor¡¡ ¡¡ À» ±¸ÇöÇÑ´Ù ***/
        public function ModalText() {
            super();
        }


        /*** 2 »ìÀÇ ÀÚ½Ä (child) ÄÄÆÛ³ÍÆ®ÀÇ º¯¼ö¸¦ Á¤ÀÇÇÑ´Ù ***/    
        // ÄÄÆÛ³ÍÆ®ÀÇ ¾ÆÀÌÀÇ 2 »ìÀÇ º¯¼ö¸¦ ¼±¾ðÇÑ´Ù
        private var text_mc:TextArea;
        private var mode_mc:Button;

        
        /*** Button ÄÄÆÛ³ÍÆ®°¡ »ç¿ëÇÏ´Â »õ·Î¿î ½ºÅ²À» Æ÷ÇÔÇϴ´٠***/
        // ModalUpSkin, ModalOverSkin, ModalDownSkinYou ¶ó´Â À̸§ÀÇ ½Éº¼À» Æ÷ÇÔÇÑ´Ù
        // SWF ÆÄÀÏÀ» ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù         
        // ½ºÅ²ÀÌ ¾ø´Â °æ¿ì´Â, ´ÙÀ½À¸·ÎºÎÅÍÀÇ ÇàÀ» comment out ÇÑ´Ù
        [Embed(source="Modal2.swf", symbol="upskin")]
        public var modeUpSkinName:Class;
    
        [Embed(source="Modal2.swf", symbol="overskin")]
        public var modeOverSkinName:Class;

        [Embed(source="Modal2.swf", symbol="downskin")]
        public var modeDownSkinName:Class;


        /*** createChildren() ¸Þ¼Òµå¸¦ ±¸ÇöÇÑ´Ù ***/
        // ¾ÆÀ̸¦ ÀÛ¼ºÇϱâ Àü¿¡, ¾ÆÀ̰¡ Á¸ÀçÇÒÁö ¾î¶³Áö¸¦ Å×½ºÆ®ÇÑ´Ù
        // À̰ÍÀº Çʼö´Â ¾Æ´ÏÁö¸¸, ¼­ºê Ŭ·¡½º°¡ ´Ù¸¥ ¾ÆÀ̸¦
        // ÀÛ¼ºÇÒ ¼ö ÀÖµµ·Ï(µíÀÌ) È®ÀÎÇÑ´Ù
        override protected function createChildren() :void {
            super.createChildren();

            // TextArea ÄÁÆ®·ÑÀ» ÀÛ¼ºÇØ, ÃʱâÈ­ÇÑ´Ù        
            if (! text_mc)             {
                text_mc = new TextArea();
                text_mc.explicitWidth = 80;
                text_mc.editable = false;
                text_mc.text= _text;
                text_mc.addEventListener("change", handleChangeEvent);
                addChild(text_mc);
            }

            // Button ÄÁÆ®·ÑÀ» ÀÛ¼ºÇØ, ÃʱâÈ­ÇÑ´Ù        
            if (! mode_mc)             {
                mode_mc = new Button();
                mode_mc.label = "Toggle Editing Mode";
                // ÀÌ¿ëÇÒ ¼ö ÀÖ´Â ½ºÅ²ÀÌ ¾ø´Â °æ¿ì´Â, ´ÙÀ½À¸·ÎºÎÅÍÀÇ ÇàÀ» comment out ÇÑ´Ù
                mode_mc.setStyle('overSkin', modeOverSkinName); 
                mode_mc.setStyle('upSkin', modeUpSkinName); 
                mode_mc.setStyle('downSkin', modeDownSkinName); 
                mode_mc.addEventListener("click", handleClickEvent);
                addChild(mode_mc);
            }
        }
        

        /*** commitProperties() ¸Þ¼Òµå¸¦ ±¸ÇöÇÑ´Ù ***/
        override protected function commitProperties() :void {
            super.commitProperties();
            
            if (bTextChanged) {
                bTextChanged = false;
                text_mc.text = _text;
                invalidateDisplayList();
            }
        }        


        /*** measure() ¸Þ¼Òµå¸¦ ±¸ÇöÇÑ´Ù ***/
        // µðÆúÆ®ÀÇ ÆøÀº ÅØ½ºÆ®¿Í ¹öưÀÇ Å©±â
        // ³ôÀÌ´Â ¹öư¿¡ ÀÇÇØ Á¤ÇØÁø´Ù
        override protected function measure() :void {
            super.measure();

            // Button ÄÁÆ®·ÑÀº ½ºÅ²À» »ç¿ëÇϹǷÎ,
            // Button ÄÁÆ®·ÑÀÇ ÃøÁ¤ Å©±â¸¦ ÃëµæÇÑ´Ù 
            var buttonWidth:Number = mode_mc.getExplicitOrMeasuredWidth();
            var buttonHeight:Number = mode_mc.getExplicitOrMeasuredHeight();

            // µðÆúÆ®Æø°ú ÃÖ¼ÒÆøÀº, TextArea ÄÁÆ®·ÑÀÇ
            // measuredWidth + Button ÄÁÆ®·ÑÀÇ
            // measuredWidth 
            measuredWidth = measuredMinWidth = text_mc.measuredWidth +
buttonWidth; // µðÆúÆ® ³ôÀÌ¿Í ÃÖ¼Ò ³ôÀÌ´Â, TextArea ÄÁÆ®·ÑÀÇ ³ôÀÌÀΰ¡ // Button ÄÁÆ®·ÑÀÇ measuredWidth ÀÇ ÃÄ Å« Æí // + ÅØ½ºÆ®ÀÇ ÁÖÀ§ÀÇ 10 Çȼ¿ÀÇ °æ°è¼± measuredHeight = measuredMinHeight =
Math.max(mode_mc.measuredHeight, buttonHeight) + 10; } /*** updateDisplayList() ¸Þ¼Òµå¸¦ ±¸ÇöÇÑ´Ù ***/ // Button ÄÁÆ®·ÑÀ», label ÅØ½ºÆ®ÀÇ Å©±â // + 10 Çȼ¿ÀÇ °æ°è¼± area·Î ¼³Á¤ÇÑ´Ù // TextArea ÀÇ Å©±â¸¦, ÄÄÆÛ³ÍÆ®ÀÇ ³ª¸ÓÁöÀÇ area·Î ¼³Á¤ÇÑ´Ù // textPlacement properties ÀÇ ¼³Á¤¿¡ ±Ù°ÅÇØ // ¾ÆÀ̸¦ ¹èÄ¡ÇÑ´Ù override protected function updateDisplayList(unscaledWidth:Number,
unscaledHeight:Number) :void { super.updateDisplayList(unscaledWidth, unscaledHeight); // Á¿ìÀÇ °æ°è¼±¿ëÀ¸·Î 1 Çȼ¿À» ´ç°Ü, // Á¿쿡 3 Çȼ¿ÀÇ ¸¶ÁøÀ» »ç¿ëÇÑ´Ù var usableWidth:Number = unscaledWidth - 8; // »óÇÏÀÇ °æ°è¼±¿ëÀ¸·Î 1 Çȼ¿À» ´ç°Ü, // »óÇÏ¿¡ 3 Çȼ¿ÀÇ ¸¶ÁøÀ» »ç¿ëÇÑ´Ù var usableHeight:Number = unscaledHeight - 8; // Button ÄÁÆ®·ÑÀÇ Å©±â¸¦ ÅØ½ºÆ®¿¡ ±Ù°ÅÇØ °è»êÇÑ´Ù var lineMetrics:TextLineMetrics = measureText(mode_mc.label); // 10 Çȼ¿ÀÇ °æ°è¼± area¸¦ ÅØ½ºÆ®ÀÇ ÁÖÀ§¿¡ Ãß°¡ÇÑ´Ù var buttonWidth:Number = lineMetrics.width + 10; var buttonHeight:Number = lineMetrics.height + 10; mode_mc.setActualSize(buttonWidth, buttonHeight); // ÅØ½ºÆ®ÀÇ Å©±â¸¦ °è»êÇÑ´Ù // Button ÄÁÆ®·Ñ°ú TextArea ÄÁÆ®·ÑÀÇ °£°ÝÀ» // 5 Çȼ¿·Î ÇÑ´Ù var textWidth:Number = usableWidth - buttonWidth - 5; var textHeight:Number = usableHeight; text_mc.setActualSize(textWidth, textHeight); // textPlacement properties ¿¡ ±Ù°ÅÇØ ÄÁÆ®·ÑÀ» ¹èÄ¡ÇÑ´Ù if (textPlacement == "left") { text_mc.move(4, 4); mode_mc.move(4 + textWidth + 5, 4); } else { mode_mc.move(4, 4); text_mc.move(4 + buttonWidth + 5, 4); } // ÀÚ½Ä (child) ÄÄÆÛ³ÍÆ®ÀÇ ÁÖÀ§¿¡ ´Ü¼øÇÑ °æ°è¼±À» ¹¦È­ ÇÑ´Ù graphics.lineStyle(1, 0x000000, 1.0); graphics.drawRect(0, 0, unscaledWidth, unscaledHeight); } /*** ¸Þ¼Òµå, properties , metadata¸¦ Ãß°¡ÇÑ´Ù ***/ // properties ÀÇ ÀϹÝÀûÀÎ ÆÐÅÏ¿¡ µû¶ó, »çÀûÀÎ // Ȧ´õ º¯¼ö¸¦ ÁöÁ¤ÇÑ´Ù private var _textPlacement:String = "left"; // textPlacement properties ÀÇ getter/setter ÀÇ Æä¾î¸¦ ÀÛ¼ºÇÑ´Ù public function set textPlacement(p:String) :void { _textPlacement = p; invalidateDisplayList(); dispatchEvent(new Event("placementChanged")); } // textPlacement properties ·Î µ¥ÀÌÅÍ ¹ÙÀεùÀ» Áö¿ø(support)ÇÑ´Ù [Bindable(event="placementChanged")] public function get textPlacement() :String { return _textPlacement; } private var _text:String = "ModalText"; private var bTextChanged:Boolean = false; // text properties ÀÇ getter/setter ÀÇ Æä¾î¸¦ ÀÛ¼ºÇÑ´Ù public function set text(t:String) :void { _text = t; bTextChanged = true; invalidateProperties(); dispatchEvent(new Event("textChanged")); } [Bindable(event="textChanged")] public function get text() :String { return text_mc.text; } // ¾ÆÀÌ¿¡ ÀÇÇØ ¼ÛÃâ(Dispatch)µÈ À̺¥Æ®¸¦ ó¸®ÇÑ´Ù private function handleChangeEvent(eventObj:Event) :void { dispatchEvent(new Event("change")); } // ¾ÆÀÌ¿¡ ÀÇÇØ ¼ÛÃâ(Dispatch)µÈ À̺¥Æ®¸¦ ó¸®ÇÑ´Ù private function handleClickEvent(eventObj:Event) :void { text_mc.editable = ! text_mc.editable; } } }