//
//  ScrollView.m
//  traceWrite
//
//  Created by 今井 彰彦 on 2011/12/12.
//  Copyright (c) 2011 AIG-Soft. All rights reserved.
//

#import "ScrollView.h"

@implementation ScrollView

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

// sizeはzoom=1の時の値
-(void)initWithArea:(CGSize)size delegate:(id)delegate_ ftategaki:(BOOL)ftategaki_
{
	printSelf();
	nslog(@"contentSize=%f,%f",size.width,size.height);
	nslog(@"self.frame.size=%f,%f",self.frame.size.width,self.frame.size.height);
	// オリジナルサイズを記録する
	orgSize=size;	
	// 全体領域サイズを設定する(初期化)
	super.contentSize=size;
	// デリゲートの設定
	self.delegate=delegate_;
	//
	ftategaki=ftategaki_;
}

-(void)resetContentSize
{
	nslog(@"resetContentSize=%f,%f",orgSize.width,orgSize.height);
	super.contentSize=orgSize;
}

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

-(NSInteger)indexSet:(NSArray *)viewArray
{
	printSelf();
	// ビューを入れ替えるために、ビューの番号を得る
	_index=0;
	NSEnumerator *emu=[viewArray objectEnumerator];
	UIView *view;
	while (view=[emu nextObject]) {
	//	nslog(@"view(%d)=%@",_index,view);
		if (view==self) {
	//		nslog(@"scrollView._index=%d",_index);
			break;
		}
		_index++;
	}
	return _index;
}

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

// Homeスクロールポイントの設定
// zoom対応
-(void)homeScrollPoint:(CGSize)size
{
	printSelfs(@"width=%f",size.width);
	CGPoint point;
	if (ftategaki) { // 縦書き時
		point.x=size.width*self.zoomScale-self.frame.size.width; // frame=実表示領域サイズ；これはズームにかかわらず一定
	//	nslog(@"areaSize.width=%f,frame.size.width=%f",size.width*self.zoomScale,self.frame.size.width);
		if (point.x<0) point.x=0; // 画面内に収まるときは0固定
	} else { // 横書き時
		point.x=0;
	}
	point.y=0; // yは常に0
	
	nslog(@"Home point=%f,%f",point.x,point.y);
	super.contentOffset=point;
}

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

// ズームのiOSのバグ回避
-(void)contentSizeRecalcAtZoom:(CGFloat)zoom
{
	printSelfs(@"Zoom=%f",zoom);
	CGSize size=orgSize;
	size.width *=zoom;
	size.height*=zoom;
	super.contentSize=size;
	nslog(@"contentSize=%f*%f",size.width,size.height);
}

// ズームのiOSのバグ回避
-(void)contentSizeRecalc
{
	float zoom=self.zoomScale;
	[self contentSizeRecalcAtZoom:zoom];
	[self setNeedsDisplay]; // 再表示
}

// ズームのiOSのバグ回避
-(void)contentSizeRecalcWithZoom:(CGFloat)zoom
{
	printSelfs(@"Zoom=%f",zoom);
	super.zoomScale=zoom; // Zoomを有効にする;デリゲートの呼び出し
	[self contentSizeRecalcAtZoom:zoom];
}

//----------------------------------------------------------------------------
// .contentOffsetのオーバーライド
// これがズーム対応の肝
//----------------------------------------------------------------------------
// これがあると落ちるので削除；Genshoのズームでは必要なし
#if 0
-(CGPoint)getContentOffset
{
	float zoom=super.zoomScale;
	CGPoint offset=super.contentOffset;
	nslog(@"ScrollView.getContentOffset:zoom=%f:ズーム中座標(%f,%f)",zoom,offset.x,offset.y);
	offset.x/=zoom;
	offset.y/=zoom;
	nslog(@"内部座標(%f,%f)",offset.x,offset.y);
	return (offset); // 内部座標を返す
}

// 内部座標を実座標に変換して設定する
-(void)setContentOffset:(CGPoint)contentOffset
{
	printSelf();
	float zoom=super.zoomScale;
	nslog(@"zoom=%f:内部座標(%f,%f)",zoom,contentOffset.x,contentOffset.y);
	contentOffset.x*=zoom;
	contentOffset.y*=zoom;
	nslog(@"表示座標(%f,%f)",contentOffset.x,contentOffset.y);
	super.contentOffset=contentOffset;
}

// 元の値を返す
-(CGPoint)getContentOffset0
{
	printSelf();
	return (super.contentOffset);
}

-(void)setContentOffset0:(CGPoint)contentOffset
{
	printSelf();
	super.contentOffset=contentOffset;
}
#endif

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

// ズーム中の中心座標を計算
-(CGPoint)getZoomCenter
{
	printSelf();
	CGSize  size  =self.frame.size;		// 表示領域サイズ(これはズームでは変化しない)
	CGPoint	point =self.contentOffset;	// スクロール位置
	CGPoint center={point.x+size.width/2,point.y+size.height/2}; // 表示域中央座標
	// ズームを解除した時の中心座標に変換
	float zoom=self.zoomScale;
	center.x/=zoom;
	center.y/=zoom;
	nslog(@"center=%f,%f/zoom=%f",center.x,center.y,zoom);
	//
	point.x=center.x-size.width/2;
	point.y=center.y-size.height/2; // スクロール位置
	return (point);
}

// スクロール位置を合わせる
-(CGPoint)setContentOffsetWithPoint:(CGPoint)point
{
	printSelf();
	nslog(@"%f,%f",point.x,point.y);
	CGSize size=self.frame.size; // 表示領域サイズ(これはズームでは変化しない)
//	nslog(@" frame.size=%f,%f",size.width,size.height);
//	nslog(@"contentSize=%f,%f",super.contentSize.width,super.contentSize.height);
	if (point.x+size.width >=super.contentSize.width ) point.x=super.contentSize.width -size.width;
	if (point.y+size.height>=super.contentSize.height) point.y=super.contentSize.height-size.height;
	if (point.x<0) point.x=0;
	if (point.y<0) point.y=0;
//	nslog(@"point=%f,%f",point.x,point.y);
	self.contentOffset=point;
	return (point);
}

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

@end
