//
//  ScrollView.m
//  X-BASIC'
//
//  Created by AIG-Soft on 2012/08/31.
//  Copyright (c) 2012 AIG-Soft. All rights reserved.
//

#import "ScrollView.h"
#import "libs.h"

@implementation ScrollView

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

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

-(void)resetContentSize
{
	printSize(@"resetContentSize",orgSize);
	super.contentSize=orgSize;
}

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

-(void)homeScrollPoint
// Homeスクロールポイントの設定
// zoom対応
{
	printSelf();
	CGPoint point;
	point.x=0;
	point.y=0; // yは常に0
	
	printPoint(@"Home point",point);
	super.contentOffset=point;
}

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

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

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

-(void)contentSizeRecalcWithZoom:(CGFloat)zoom
// ズームのiOSのバグ回避
{
	printSelfs(@"%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
// 内部座標を実座標に変換して設定する
{
	float zoom=super.zoomScale;
	nslog(@"ScrollView.setContentOffset: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
// スクロール位置を合わせる
{
	printPoint(@"setContentOffsetWithPoint",point);
	CGSize size=self.frame.size; // 表示領域サイズ(これはズームでは変化しない)
//	printSize(@" frame.size",size);
//	printSize(@"contentSize",super.contentSize);
	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;
//	printPoint(@"point",point);
	self.contentOffset=point;
	return (point);
}

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

@end
