facebook twitter hatena line email

Flash/datagrid/ダブルクリックでアイテム変更

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
package app.model.logic 
{
  // データグリッドイベント
  import mx.events.DataGridEvent;
  // 時間取得
  import flash.utils.getTimer;
  
  /**
   * DataGridダブルクリック判定ロジック
   * 
   * @example
   *  // ダブルクリック判定ロジッククラス
   *  import app.model.logic.DoubleClickValidateLogic;
   *  addEventListener(DataGridEvent.ITEM_EDIT_END, itemEditBeginningDataGrid);
   *   // データグリッドアイテム編集中イベント
   *   public function itemEditBeginningDataGrid(event:DataGridEvent):void
   *   {
   *     // ダブルクリック判定に満たない時
   *     if (!_doubleClickValidateLogic.execValidate(event)) {
   *       // 編集させない
   *       event.preventDefault();
   *     }
   *   }
   * @see    http://f0000.nonip.info/wiki/work/index.php?flash%2Fdatagrid%2F%E3%83%80%E3%83%96%E3%83%AB%E3%82%AF%E3%83%AA%E3%83%83%E3%82%AF%E3%81%A7%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E5%A4%89%E6%9B%B4
   * @see    http://d.hatena.ne.jp/fits/20081120/1227187959
   */
  public class DoubleClickDataGridValidateLogic
  {
    // ダブルクリックと判断する有効時間(ミリ秒)
    private const DOUBLE_CLICK_TIME:uint = 300;
    // 一つ前のクリックイベント
    private var _oldEvent:DataGridEvent;
    // 一つ前のクリックタイム
    private var _oldTime:int;
    
    /**
     * constructor
     */
    public function DoubleClickDataGridValidateLogic() 
    {
    }
    /**
     * 判定実行
     * 
     * @param  event
     * @return  true:ダブルクリック, false:それ以外
     */ 
    public function execValidate(event:DataGridEvent):Boolean
    {
      // 現在の時間を設定
      var nowTime:int = getTimer();
      var result:Boolean = (
        _oldEvent != null && 
        event.columnIndex == _oldEvent.columnIndex &&
        event.rowIndex == _oldEvent.rowIndex &&
        (nowTime - _oldTime) <= DOUBLE_CLICK_TIME
      );
      // 今回のイベントを保存
      _oldEvent = (result)? null: event;
      // 今回のタイムスタンプを保存
      _oldTime = nowTime;
      return result;
    }
  }
}