sábado, 28 de maio de 2011

TextArea com atalho para Desfazer e Refazer

Por padrão o componente TextArea do Flex não possui função de desfazer e refazer, com isso resolvi implementar estas duas funções.

Para testar é só digitar um texto, e pressionar Ctrl+Z para desfazer e Ctrl+Y para refazer.

*download do fonte: botão direito "View Source"

Código Fonte:
/*############################################################*/
/*                                                            */
/*   Powered by: Samuel Facchinello                           */
/*   http://desenvolvendoemflex.blogspot.com/                 */
/*                                                            */
/*############################################################*/
package com.blogspot.desenvolvendoemflex.utils {
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    
    import mx.collections.ArrayCollection;
    import mx.controls.Alert;
    import mx.controls.TextArea;
    
    /**
     *
     * @author SAMUEL FACCHINELLO
     * @site http://desenvolvendoemflex.blogspot.com/
     */
    public class TextAreaWithUndo extends TextArea {
        
        /**
         * Variable of control position Undo or Redo
         * */
        [Bindable]
        private var _position:int = -1;
        
        public function get position():int {
            return _position;
        }
        
        /**
         * Variable that stores all typed letters
         * */
        [Bindable]
        private var _array:ArrayCollection = new ArrayCollection();
        
        public function get array():ArrayCollection {
            return _array;
        }
        
        /**
         * Constructor
         *
         */
        public function TextAreaWithUndo() {
            super();
            //add value default
            addValue("");
            
            //add Event on KeyDown
            addEventListener(KeyboardEvent.KEY_DOWN, myKeyDown);
        }
        
        /**
         * Function with KeyDown
         * @param eventObj: KeyboardEvent
         *
         */
        private function myKeyDown(eventObj:KeyboardEvent):void {
            // Was Ctrl key pressed?
            if (eventObj.ctrlKey) {
                var valueReturn:String = null;
                
                switch (eventObj.keyCode) {
                    
                    case 90: // Was Ctrl-Z pressed?  
                        valueReturn = returnPrevisionValue();
                        break;
                    
                    case 89: // Was Ctrl-Y pressed?  
                        valueReturn = returnNextValue();
                        break;
                    
                    default:
                        break;
                }
                
                //if return exist
                if (valueReturn!=null) {
                    //set text with return functions
                    text = valueReturn;
                    
                    //select last _position in TextArea
                    setSelection(text.length, text.length);
                }
            } else {
                //only adds to the list if any of these characters.
                //list from here: http://help.adobe.com/en_US/AS2LCR/Flash_10.0/help.html?content=00000520.html
                if ((eventObj.keyCode>=65&&eventObj.keyCode<=90)||(eventObj.keyCode>=48&&eventObj.keyCode<=57)||(eventObj.keyCode>=96&&eventObj.keyCode<=111)||(eventObj.keyCode>=186&&eventObj.keyCode<=222)) {
                    addValue(text);
                }
            }
        }
        
        /**
         * Function that adds the letters in the array
         * @param value: propertie "text" of TextArea
         *
         */
        private function addValue(value:String):void {
            //it was press Ctrl + Z ever, and was entered some value, clears the values ​​of the position in which this forward
            if (_array.length>0&&_array.length-1>_position) {
                for (var i:int = _array.length-1; i>_position; i--) {
                    _array.removeItemAt(i);
                }
            }
            
            //if the value is being added is equal to the last added, not added!
            if (_array.length>0) {
                if (value==_array.getItemAt(_array.length-1)) {
                    return;
                }
            }
            
            _array.addItem(value);
            _position++;
        }
        
        /**
         * triggered when press Ctrl + Y
         * @return : Returns the next value from the list according to position
         *
         */
        private function returnNextValue():String {
            if (_position+1>=0&&_position+1<_array.length) {
                _position++;
                return _array.getItemAt(_position) as String;
            }
            
            return null;
        }
        
        /**
         * triggered when press Ctrl + Z
         * @return : Returns the Prevision value from the list according to position
         *
         */
        private function returnPrevisionValue():String {
            if (_position-1>=0) {
                _position--;
                return _array.getItemAt(_position) as String;
            }
            
            return null;
        }
    }
}

Adicionei este componente ao Google Code, pode ser visto aqui: http://code.google.com/p/textarea-with-undo/

Qualquer elogio, dúvida, sugestão ou melhoria para o componente, deixe um comentário!!

Abraço, até a próxima.



*Tradução para o inglês com o Google Translate. :)

Nenhum comentário:

Postar um comentário