package jp.djakartaTrap.progression.commands
/**
* Progression 4
*
* @author Copyright (C) 2007-2010 taka:nium.jp, All Rights Reserved.
* @version 4.0.1 Public Beta 1.3
* @see http://progression.jp/
*
* Progression Software is released under the Progression Software License:
* http://progression.jp/ja/overview/license
*
* Progression Libraries is released under the MIT License:
* http://www.opensource.org/licenses/mit-license.php
*/
{
import flash.display.DisplayObject;
import flash.events.Event;
import jp.nium.core.ns.nium_internal;
import jp.nium.display.ExMovieClip;
import jp.progression.casts.CastObject;
import jp.progression.commands.Command;
import jp.progression.events.ExecuteErrorEvent;
import jp.progression.events.ExecuteEvent;
import jp.progression.executors.ExecutorObject;
/**
* DoExecutor クラスは、指定された対象の ExecutorObject を実行するコマンドクラスです。
*
*
* @example
* // DoExecutor インスタンスを作成する
* var com:DoExecutor = new DoExecutor();
*
* // コマンドを実行する
* com.execute();
*
*/
public class DoExecutor2 extends Command {
public function get executorTarget():* { return _executorTarget; }
public function set executorTarget(value:*):void { _executorTarget = value;}
private var _executorTarget:*;
private var _executableRef:*;
/**
* 実行したい ExecutorObject インスタンスを取得または設定します。
* コマンド実行中に値を変更しても、処理に対して反映されません。
*
*/
public function get executor():ExecutorObject { return _executor; }
public function set executor( value:ExecutorObject ):void { _executor = value; }
private var _executor:ExecutorObject;
/**
* ExecutorObject に登録された対象に対して送出するトリガーイベントを取得または設定します。
* コマンド実行中に値を変更しても、処理に対して反映されません。
*
*/
public function get event():Event { return _event; }
public function set event( value:Event ):void { _event = value; }
private var _event:Event;
/**
* 新しい DoExecutor インスタンスを作成します。
* Creates a new DoExecutor object.
*
* @param executor
* 実行したい ExecutorObject です。
*
* @param event
* ExecutorObject に登録された対象に対して送出するトリガーイベントです。
*
* @param initObject
* 設定したいプロパティを含んだオブジェクトです。
*
*/
public function DoExecutor2( executableRefOrId:*, event:Event, initObject:Object = null ) {
// 引数を設定する
//_executor = executor;
_executorTarget = executableRefOrId;
_event = event;
// スーパークラスを初期化する
super( _executeFunction, _interruptFunction, initObject );
}
/**
* 実行されるコマンドの実装です。
*/
private function _executeFunction():void {
//IExecutableを実装している対象を取得する
_executableRef = _getExecutableRef(_executorTarget);
//存在すれば
if (_executableRef) {
_executor = _executableRef.executor as ExecutorObject;
//対象がExecutorObjectをもっていれば
if (_executor) {
//すでに実行中なら、中断する
if (_executor.state > 0) _executor.interrupt();
}
// イベントリスナーを登録する
_executor.addEventListener( ExecuteEvent.EXECUTE_COMPLETE, _executeComplete );
_executor.addEventListener( ExecuteEvent.EXECUTE_INTERRUPT, _executeInterrupt );
_executor.addEventListener( ExecuteErrorEvent.EXECUTE_ERROR, _error );
// 実行する
_executor.execute( _event, super.extra );
return;
}
//処理を終了する
super.executeComplete();
}
/**
* @private
*/
internal function _getObjectRef( source:* ):DisplayObject {
switch ( true ) {
case source is CastObject : { return CastObject( source ).target; }
case source is DisplayObject : { return DisplayObject( source ); }
case source is String : { return ExMovieClip.nium_internal::$collection.getInstanceById( source ) as DisplayObject; }
}
return null;
}
/**
*
*/
private function _getExecutableRef( source:* ):* {
if ( source is CastObject ) { return source; }
source = _getObjectRef( source );
if ( "executor" in source ) { return source; }
return null;
}
/**
* 中断実行されるコマンドの実装です。
*/
private function _interruptFunction():void {
// 実行中であれば
if ( _executor.state > 0 ) {
// 実行する
_executor.interrupt();
}
else {
// イベントリスナーを解除する
_removeExecutorListeners();
}
}
/**
* CommandExecutor のイベントリスナーを解除します。
*/
private function _removeExecutorListeners():void {
if ( _executor ) {
// イベントリスナーを解除する
_executor.removeEventListener( ExecuteEvent.EXECUTE_COMPLETE, _executeComplete );
_executor.removeEventListener( ExecuteEvent.EXECUTE_INTERRUPT, _executeInterrupt );
_executor.removeEventListener( ExecuteErrorEvent.EXECUTE_ERROR, _error );
}
}
/**
* DoExecutor インスタンスのコピーを作成して、各プロパティの値を元のプロパティの値と一致するように設定します。
* Duplicates an instance of an DoExecutor subclass.
*
* @return
* 元のオブジェクトと同じプロパティ値を含む新しい DoExecutor インスタンスです。
* A new DoExecutor object that is identical to the original.
*/
override public function clone():Command {
return new DoExecutor2( _executorTarget, _event, this );
}
/**
* 処理が完了した場合に送出されます。
*/
private function _executeComplete( e:ExecuteEvent ):void {
// イベントリスナーを解除する
_removeExecutorListeners();
// 処理を終了する
super.executeComplete();
}
/**
* 処理が中断された場合に送出されます。
*/
private function _executeInterrupt( e:ExecuteEvent ):void {
// イベントリスナーを解除する
_removeExecutorListeners();
}
/**
* 処理の途中でエラーが発生した場合に送出されます。
*/
private function _error( e:ExecuteErrorEvent ):void {
super.throwError( this, e.errorObject );
}
}
}