//
//  PenButton.m
//  tegakiMail
//
//	PenButtonという名称になっているが、現在は汎用的に長押し対応のボタン処理に使っている
//
//  Created by 今井 彰彦 on 2011/11/13.
//  Copyright (c) 2011 AIG-Soft. All rights reserved.
//

#import "PenButton.h"
#import "click.h"
#import "libs.h"

@implementation PenButton

// 本当はUILongPressGestureRecognizerを使いたかったが、iOS5以降でしか有効でなく、
// 今のこの時期にiOS5専用にはしにくいので独自実装

//------------------------------------------------------
// 初期化
//------------------------------------------------------

// 他ボタン設定
-(void)setPenButton:(id)target_ shortPressSelector:(SEL)shortPressSelector_ longPressSelector:(SEL)longPressSelector_ duration:(NSTimeInterval)duration_ flongOnly:(BOOL)flongOnly_
{
	printSelfs(@"Duration=%f",duration_);
	//
	_minimumPressDuration=duration_; // 長押し判定時間
	flongOnly=flongOnly_; // 長押しのみ指定
	//
	_penColor=PENCIL_COLOR_BLACK;
	_penWidth=0;
	// 呼び出しメソッド登録
	target				=target_;
	shortPressSelector	=shortPressSelector_;
	longPressSelector	=longPressSelector_;
	//
	timer		=nil;
}

// 通常ペンボタン用設定
-(void)setPenButton:(id)target_ shortPressSelector:(SEL)shortPressSelector_ longPressSelector:(SEL)longPressSelector_ penColor:(NSUInteger)penColor_ penWidth:(CGFloat)penWidth_
{
	nslog(@"setPenButton");
	//
	_minimumPressDuration=0.5; // 長押し判定時間
	//
	_penColor=penColor_;
	_penWidth=penWidth_;
	// 呼び出しメソッド登録
	target				=target_;
	shortPressSelector	=shortPressSelector_;
	longPressSelector	=longPressSelector_;
	//
	timer		=nil;
}

// ペン幅指定付きペンボタン設定
-(void)setPenButton:(id)target_ shortPressSelector:(SEL)shortPressSelector_ longPressSelector:(SEL)longPressSelector_ penColor:(NSUInteger)penColor_ penWidth:(CGFloat)penWidth_
		penWidthMax:(CGFloat)penWidthMax_
		penWidthMin:(CGFloat)penWidthMin_
{
	_penWidthMax=penWidthMax_;
	_penWidthMin=penWidthMin_;
	[self setPenButton:target_ shortPressSelector:shortPressSelector_ longPressSelector:longPressSelector_ penColor:penColor_ penWidth:penWidth_];
}

//------------------------------------------------------

-(void)stop
{
	printSelf();
	if (timer!=nil) {
		[timer invalidate];
		timer=nil;
	}
}

// 時間指定長押し実行の噛ませ処理
-(void)executeLongPress
{
	fcancel=CANCEL_EXECUTE_ENDED; // 実行終了の印:touchesEndedでの実行をキャンセル
	clickSound();
	if (!flongOnly) {
		nslog(@"普通押しも実行");
		[self executePress:0 flong:NO ]; // 普通押しも実行
	}
	nslog(@"長押し実行");
	[self executePress:0 flong:YES]; // 長押し実行
	// repeatなしなので、自動的にinvalidateになる
	timer=nil;
}

// タッチ処理の実行
// flong:YES=長押し実行
-(void)executePress:(NSTimeInterval)tm flong:(BOOL)flong
{
	nslog(@"executePress:tm=%f",tm);
	if (target!=nil) {
		NSNumber *num=[[NSNumber alloc]initWithInteger:_penColor];
		if (flong) {
			// 長押し実行
			if (longPressSelector) {
				nslog(@"長押し処理実行:num=%@",num);
				if (tm==0) {
					nslog(@"即時実行");
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"        // 警告回避のため
					[target performSelector:longPressSelector withObject:num];
#pragma clang diagnostic pop
				} else {
					// 一定時間後実行予約
					nslog(@"一定時間後実行予約:_minimumPressDuration=%f",_minimumPressDuration);
					// 直接実行ではなく、噛ませ処理が間に入る
					// 実実行までの間にtouchesEndedが呼び出されたらキャンセルする
					[self stop];
					timer=[NSTimer scheduledTimerWithTimeInterval:_minimumPressDuration target:self selector:@selector(executeLongPress) userInfo:nil repeats:NO];
				}
			}
		} else {
			// 普通押し実行は省略できない
			nslog(@"普通押し:num=%@",num);
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"        // 警告回避のため
			[target performSelector:shortPressSelector withObject:num];
#pragma clang diagnostic pop
		}
	} // target=nil:実行指定がない
}

//------------------------------------------------------
// タッチ処理
//------------------------------------------------------

-(void)resetButton
// ボタンの選択状態を解除する
{
#ifdef USE_BACKGROUND_COLOR
	// 背景色を戻す
	self.backgroundColor=backColor;
	[backColor release];
#endif
	self.alpha=1.0;
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
	printSelf();
#ifdef DEBUG
	startTime=[[touches anyObject]timestamp];
	nslog(@"startTime=%f",startTime);
#endif
	// 背景を選択色に変更
	self.alpha=0.4;
#ifdef USE_BACKGROUND_COLOR
	// 背景色を保存
	backColor=[self.backgroundColor retain];
	self.backgroundColor=[UIColor whiteColor];
#endif
	fcancel=CANCEL_NONE;
	[self executePress:_minimumPressDuration flong:YES]; // 長押し実行指示
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
	printSelf();
	[self stop]; // タイマーによる長押し実行予約は中止
	if (fcancel!=CANCEL_EXECUTE_ENDED) {
		nslog(@"長押し時間内にここにきた");
		// 長押しキャンセルで普通処理実行にする
		[self stop]; // 長押し実行中止
		clickSound();
		[self executePress:0 flong:NO]; // 普通押し実行指示；これは常時実行
	}
#ifdef DEBUG
	else {
		// 時間経過による実行がなされたのでここでは実行しない
		nslog(@"時間経過による実行がなされたのでここでは実行しない");
	}
#endif
#ifdef DEBUG
//	NSInteger tapCount=[[touches anyObject]tapCount];
//	nslog(@"tapCount=%d",tapCount);
	NSTimeInterval timestamp=[[touches anyObject]timestamp];
	dTime=timestamp-startTime;
	nslog(@"Δtime=%f",dTime);
#endif
	[self resetButton]; // 選択状態解除
}

-(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
	printSelf();
#ifdef DEBUG
	NSTimeInterval timestamp=[[touches anyObject]timestamp];
	dTime=timestamp-startTime;
	nslog(@"Δtime=%f",dTime);
#endif
	[self stop]; // 長押し実行中止
	[self resetButton]; // 選択状態解除
}

//------------------------------------------------------

-(void)dealloc
{
	printSelf();
	[self stop];
}

@end
