ipebase.as
来自「QS我也没用过」· AS 代码 · 共 315 行
AS
315 行
package qs.ipeControls.classes
{
import mx.core.UIComponent;
import mx.controls.Label;
import mx.controls.TextInput;
import flash.events.TextEvent;
import flash.events.Event;
import mx.events.EffectEvent;
import mx.core.IDataRenderer;
import qs.ipeControls.classes.FlipBitmap;
import mx.managers.IFocusManagerComponent;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.display.DisplayObject;
import flash.events.MouseEvent;
import flash.display.Bitmap;
import flash.geom.Point;
import flash.display.Sprite;
import qs.ipeControls.IEditable;
import flash.events.FocusEvent;
[Event(name="dataChange", type="mx.events.FlexEvent")]
public class IPEBase extends UIComponent implements IDataRenderer, IFocusManagerComponent, IEditable
{
private var _nonEditableControl:UIComponent;
private var _editableControl:UIComponent;
private var _editable:Boolean = false;
private var _changing:Boolean = false;
public var tilt:Boolean = true;
public var commitOnEnter:Boolean = false;
public var commitOnBlur:Boolean = false;
public var editOnEnter:Boolean = false;
public var editOnClick:Boolean = false;
private var _editButton:EditButton;
private var _enableIcon:Boolean = false;
private var _showIcon:Boolean = false;
// ---- constructor ----------------------------------------------------------------------------------
public function IPEBase():void
{
super();
tabChildren = true;
focusEnabled = true;
addEventListener(KeyboardEvent.KEY_DOWN,watchKey);
addEventListener(MouseEvent.MOUSE_DOWN,mouseHandler);
addEventListener(FocusEvent.FOCUS_OUT,commitOnBlurHandler);
}
// -- whether to show the edit icon ----------------------------------------------------------------------------------
public function set showIcon(value:Boolean):void
{
if(value == _showIcon)
return;
_showIcon = value;
updateEditButton();
invalidateSize();
}
public function get showIcon():Boolean { return _showIcon; }
public function set enableIcon(value:Boolean):void
{
if(value == _enableIcon)
return;
if(_enableIcon)
_editButton.removeEventListener(MouseEvent.CLICK,iconClickHandler);
_enableIcon = value;
updateEditButton();
if(_enableIcon)
_editButton.addEventListener(MouseEvent.CLICK,iconClickHandler);
invalidateSize();
}
public function get enableIcon():Boolean { return _enableIcon; }
// -- whether to show the edit icon ----------------------------------------------------------------------------------
public function set focusReadOnlyEnabled(value:Boolean):void
{
_nonEditableControl.focusEnabled = focusEnabled = value;
}
public function get focusReadOnlyEnabled():Boolean { return _nonEditableControl.focusEnabled; }
//--- the editable version ----------------------------------------------------------------------------------
protected function set editableControl(value:UIComponent):void
{
if(_editableControl != null)
removeChild(_editableControl);
_editableControl = value;
_editableControl.styleName = this;
addChild(_editableControl);
_editableControl.visible = _editable;
facadeEvents(_editableControl,"dataChange");
_editableControl.addEventListener(FocusEvent.FOCUS_OUT,commitOnBlurHandler);
invalidateDisplayList();
}
protected function get editableControl():UIComponent { return _editableControl; }
//--- the non-editable version ----------------------------------------------------------------------------------
protected function set nonEditableControl(value:UIComponent):void
{
if(_nonEditableControl != null)
removeChild(_nonEditableControl);
_nonEditableControl= value;
_nonEditableControl.styleName = this;
addChild(_nonEditableControl);
_nonEditableControl.visible = !_editable;
_nonEditableControl.focusEnabled = focusEnabled;
}
protected function get nonEditableControl():UIComponent { return _nonEditableControl; }
//-- support for using it as an inline renderer
[Bindable("dataChange")]
public function get data():Object {
return (_editableControl is IDataRenderer)? IDataRenderer(_editableControl).data:null
}
public function set data(value:Object):void {
if(_nonEditableControl is IDataRenderer)
IDataRenderer(_nonEditableControl).data = value;
if(_editableControl is IDataRenderer)
IDataRenderer(_editableControl).data = value;
}
//-- event handlers ----------------------------------------------------------------------------------
private function commitOnBlurHandler(e:FocusEvent):void
{
if(editable && commitOnBlur && (e.relatedObject == null || !contains(e.relatedObject)))
{
editable = false;
}
}
private function mouseHandler(e:MouseEvent):void
{
if(editOnClick == false)
return;
if(_enableIcon)
{
if(_editButton.contains(DisplayObject(e.target)))
return;
}
if(_editable)
return;
setEditable(true,true);
}
protected function watchKey(e:KeyboardEvent):void
{
if(e.keyCode == Keyboard.ENTER)
{
if( _editable == false && editOnEnter)
{
editable = !editable;
}
else if (_editable == true && commitOnEnter)
{
editable = !editable;
}
}
}
private function iconClickHandler(e:Event):void
{
setEditable(!editable,true);
}
// ---- editable ----------------------------------------------------------------------------------
public function set editable(value:Boolean):void
{
var focus:IFocusManagerComponent = focusManager.getFocus();
var takeFocus:Boolean = false;
if(_editable)
{
commitEditedValue();
takeFocus = (focus == this || focus == _editableControl)
}
else
{
takeFocus = (focus == this || focusManager.getFocus() == _nonEditableControl);
}
setEditable(value,takeFocus);
}
protected function setEditable(value:Boolean, takeFocus:Boolean):void
{
if(value == _editable)
return;
_editable = value;
tabEnabled = !_editable;
_nonEditableControl.visible = false;
_editableControl.visible = false;
_changing = true;
updateEditButton();
var bmp:FlipBitmap = new FlipBitmap(_editable? _nonEditableControl:_editableControl,_editable? _editableControl:_nonEditableControl);
var that:IPEBase = this;
bmp.addEventListener("complete",function(e:Event):void {
removeChild(bmp);
_nonEditableControl.visible = !_editable;
_editableControl.visible = _editable;
if(takeFocus)
{
if (_editable && (_editableControl is IFocusManagerComponent))
focusManager.setFocus(IFocusManagerComponent(_editableControl));
else
focusManager.setFocus(that);
}
_changing = false;
}
);
addChildAt(bmp,0);
bmp.duration = 450;
bmp.tilt = tilt;
bmp.play();
}
public function get editable():Boolean { return _editable; }
// --- editing status ----------------------------------------------------------------------------------
private function updateEditButton():void
{
if(_showIcon || _enableIcon)
{
if(_editButton == null)
{
_editButton = new EditButton();
_editButton.focusEnabled = false;
_editButton.toggle = true;
addChild(_editButton);
}
_editButton.selected = _editable;
_editButton.enabled = _enableIcon;
}
else
{
if(_editButton != null)
{
removeChild(_editButton);
_editButton = null;
}
}
invalidateSize();
}
// ---- defined by subclasses ----------------------------------------------------------------------------------
protected function commitEditedValue():void
{
}
// ---- layout and measurement ----------------------------------------------------------------------------------
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void
{
var gap:Number = (_editButton == null)? 0:4;
var iconWidth:Number = (_editButton == null)? 0:_editButton.measuredWidth;
var controlWidth:Number = unscaledWidth - iconWidth - gap;
_nonEditableControl.setActualSize(controlWidth*_nonEditableControl.scaleX,unscaledHeight*_nonEditableControl.scaleY);
_editableControl.setActualSize(controlWidth*_editableControl.scaleX,unscaledHeight*_editableControl.scaleY);
_nonEditableControl.move(iconWidth + gap,unscaledHeight/2 - unscaledHeight*_nonEditableControl.scaleY/2);
_editableControl.move(iconWidth + gap,unscaledHeight/2 - unscaledHeight*_editableControl.scaleY/2);
if(_editButton != null)
{
_editButton.y = 0;
_editButton.setActualSize(_editButton.measuredWidth,_editButton.measuredHeight);
}
}
override protected function measure():void
{
var gap:Number = (_editButton == null)? 0:4;
var iconWidth:Number = (_editButton == null)? 0:_editButton.measuredWidth;
var iconHeight:Number = (_editButton == null)? 0:_editButton.measuredHeight;
var controlWidth:Number = unscaledWidth - iconWidth - gap;
measuredWidth = gap + iconWidth + Math.max(_nonEditableControl.measuredWidth,_editableControl.measuredWidth);
measuredHeight = Math.max(iconHeight,Math.max(_nonEditableControl.measuredHeight,_editableControl.measuredHeight));
measuredMinWidth = gap + iconWidth + Math.max(_nonEditableControl.measuredMinWidth,_editableControl.measuredMinWidth);
measuredMinHeight = Math.max(iconHeight,Math.max(_nonEditableControl.measuredMinHeight,_editableControl.measuredMinHeight));
}
// --- utility function to facade events from the children
protected function facadeEvents(target:UIComponent,...events):void
{
for(var i:int = 0;i<events.length;i++)
{
target.addEventListener(events[i],redispatchHandler);
}
}
protected function redispatchHandler(e:Event):void
{
dispatchEvent(e.clone());
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?