//
//  UIActivityIndicatorView+show : アクティビティインジケーターを表示する
//

#import "UIActivityIndicatorView+show.h"

@implementation UIActivityIndicatorView (show)

/// @brief ActivityIndicatorをviewど真ん中に表示するよう設定する
/// @param view 乗せるビュー
/// @param style インジケーターの形状
-(void)centering:(UIView *)view style:(UIActivityIndicatorViewStyle)style
{
	[self centering:view style:style fbackground:NO];
}

/// @brief ActivityIndicatorをviewど真ん中に表示するよう設定する；背景付き
/// @param view 乗せるビュー
/// @param style インジケーターの形状
/// @param fbackground 背景をつけるかどうか；YES=背景をつける , NO=付けない
-(void)centering:(UIView *)view style:(UIActivityIndicatorViewStyle)style fbackground:(BOOL)fbackground
{
	CGRect vframe=view.frame;
	CGRect frame;
	// indicatorはviewの上に載せる=view内の座標で指定する必要がある
	// インジケーターのサイズ;縦横同じ
	nslog(@"view=%@,style=%d/$%x,fbackground=%d",view,(int)style,(int)style,fbackground);
	switch (style) {
		case UIActivityIndicatorViewStyleWhiteLarge:
			frame.size.width =
			frame.size.height=40;
			break;
		case UIActivityIndicatorViewStyleWhite:
		case UIActivityIndicatorViewStyleGray:
			frame.size.width =
			frame.size.height=37;
			break;
			
	}
	frame.origin.x=vframe.size.width /2-frame.size.width /2;
	frame.origin.y=vframe.size.height/2-frame.size.height/2;
	nslog(@"frame=%@",NSStringFromCGRect(frame));
	self.frame=frame;
	nslog(@"view.frame=%@",NSStringFromCGRect(view.frame));
	nslog(@"indicator.frame=%@",NSStringFromCGRect(self.frame));
	// これを呼び出す側の処理内でアニメーションが実行中の場合、ここで+[CATransaction synchronize] called within transactionの警告が出る
	// アニメーションをメインスレッドで多重に実行できないための警告である。
	// とりあえずほっておいても害はない様子
	[view addSubview:self]; // 少なくともここで初期表示が出るはず
	if (fbackground) {
		// indicatorの消去で一緒に消すため、indicatorの上に追加する
		frame.origin.x=0;
		frame.origin.y=0;
		UIView *backVw=[[UIView alloc]initWithFrame:frame];
		backVw.layer.cornerRadius=5; // ちょっと角を丸める
		switch (style) {
			case UIActivityIndicatorViewStyleWhiteLarge:
			case UIActivityIndicatorViewStyleWhite:
				backVw.backgroundColor=[[UIColor blackColor]colorWithAlphaComponent:0.6];
				break;
			case UIActivityIndicatorViewStyleGray:
				// Grayの背景付きはちょっと見にくいかもしれない。要検討だが、現状良い配色組み合わせが見つかっていない。
				backVw.backgroundColor=[[UIColor whiteColor]colorWithAlphaComponent:0.75];
				break;
		}
		[self addSubview:backVw];
		// しかしそれは背景なので後ろにする
		[self sendSubviewToBack:backVw];
	}
	[self startAnimating];
	
	// UIActivityIndicatorViewはRunLoopに戻らないと表示されないので、一瞬戻す
	NSDate *dt=[[NSDate alloc ]initWithTimeIntervalSinceNow:0.0];
	[[NSRunLoop currentRunLoop]runUntilDate:dt];
}

/// @brief ActivityIndicatorをViewど真ん中に表示する
/// @param view 乗せるビュー
/// @param style インジケーターの形状
+(UIActivityIndicatorView *)show:(UIView *)view style:(UIActivityIndicatorViewStyle)style
{
	return [self show:view style:style fbackground:NO];
}

/// @brief ActivityIndicatorをViewど真ん中に表示する;背景付き
/// @param view 乗せるビュー
/// @param style インジケーターの形状
/// @param fbackground 背景をつけるかどうか；YES=背景をつける , NO=付けない
+(UIActivityIndicatorView *)show:(UIView *)view style:(UIActivityIndicatorViewStyle)style fbackground:(BOOL)fbackground
{
	UIActivityIndicatorView *indicator=[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:style];
	if (indicator!=nil) {
		// インジケーターはviewど真ん中に出す
		[indicator centering:view style:style fbackground:fbackground];
	}
	return(indicator);
}

/// @brief ActivityIndicatorをすぐ消す
-(void)dismiss
{
	[self stopAnimating]; // これでインジケーターも消えてしまう
	[self removeFromSuperview]; // 外す
}

/// @brief ActivityIndicatorを消す(アニメーション付き)
/// @param duration アニメーション速度
/// @param delay アニメーションを開始するまでの遅延時間(秒)
/// @discussion メインスレッドで実行しなければならない
-(void)dismiss:(NSTimeInterval)duration delay:(NSTimeInterval)delay
{
//	nslog(@"isMainThread=%d/isMultiThreaded=%d",[NSThread isMainThread],[NSThread isMultiThreaded]);
	[UIView animateWithDuration:duration
						  delay:delay
						options:UIViewAnimationOptionCurveLinear
					 animations:^{
						 self.alpha	= 0.0;
					 }
					 completion:^(BOOL finished) {
						 [self dismiss];
					 }
	 ];
}


@end
