//
//  Yoko2Yoko.m : 横書き・縦書き両用
//  traceWrite
//
//  Created by 今井 彰彦 on 2012/02/21.
//  Copyright (c) 2012 AIG-Soft. All rights reserved.
//
// zoom対応は、基本外部で行うこと

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

@implementation Yoko2Yoko

//----------------------------------------------------------------------------
// メソッド
//----------------------------------------------------------------------------

// 横処理
// text    : 元横書き文字列
// charMax : 横最大文字数
-(void)yoko2Yoko:(NSString *)text charMax:(NSInteger)charMax;
{
	printSelf();
	nslog(@"元=%@/charMax=%d",text,(int)charMax);

	// Pass1
	NSInteger charMaxR=Pass1(text,charMax); // 実際の横最大行数<=charMax	
	
	self.ttext=[[NSMutableString alloc]init];
	
	// Pass2
	nslog(@"Pass2:横1行分の文字群をNSMutableStringに格納し、その1行分をNSMutableArrayに入れる");
	NSInteger lines=0; // 行数
	NSInteger i=0;
	while (i<[text length]) {
		NSMutableString *str=[[NSMutableString alloc]init]; // 1行分のワークを確保
		[self.lineStr addObject:str]; // ここで記録されるのは先頭アドレス(内容ではない)
		// 1行分の処理
		i=Pass2main(text,charMaxR,i,str);
		[str   appendString:CRLF]; // 改行を加える
		[self.ttext appendString:str];
	//	nslog(@"横1行文(%2d)=%@<",lines,str);
		//
		lines++;
	} // while
	nslog(@"lines=%d",(int)lines);
	//
	// 終了処理
	nslog(@"終了処理");
	self.tketas=charMaxR;	// 結果の横文字数(桁数)
	self.tlines=lines;		// 結果の行数
	nslog(@"yketas=%d/ylines=%d",(int)self.tketas,(int)self.tlines);
	//
	nslog(@"yoko2Yate:結果\n%@",self.ttext);
	//
	// 現在ttextは使ってないので、省メモリのため解放する
#if 1
	self.ttext=nil;
#endif
}

// 横でもスクロールエリアは同じ
// ただしスクロール方法は違う
//----------------------------------------------------------------------------

-(BOOL)isYLeftSpace:(NSInteger)keta line:(NSInteger)line
// 指定行の列以降がスペースかどうか調べる＋最終桁なら改行
{
	printSelf();
	nslog(@"%d,%d",(int)keta,(int)line);
	BOOL ret=YES; // とりあえず残り全部全角スペースの印
	if (keta<self.tketas) {
		// 指定行
		NSMutableString *line1=self.lineStr[line];
		for (;keta<self.tketas;keta++) {
			// 指定桁
			NSString *c=[line1 substringWithRange:NSMakeRange(keta,1)];
			nslog(@"(%d,%d)=%@",(int)keta,(int)line,c);
			//
			if (![c isEqualToString:ZSPC]) {
				// 全角スペース以外がある
				ret=NO;
				break;
			}
		}
	} // else 最終桁以上になるので改行
	return ret;
}

//----------------------------------------------------------------------------
// 横書き用

-(NSInteger)isYCharYcheck:(NSInteger)y scrollView:(ScrollView *)scrollView
{
	return [super isCharYcheck:y scrollView:scrollView ftategaki:NO];
}

-(NSInteger)isYCharXcheck:(NSInteger)x scrollView:(ScrollView *)scrollView point:(CGPoint)point
{
	NSInteger ret= [super isCharXcheck:x scrollView:scrollView];
	if (ret==CHAR_IN_VIEW) {
		nslog(@"x半文字移動");
		CGFloat gx=self.offset.x+x*self.spSize.width;
		nslog(@"x=%d/gx=%f~%f/point.x=%f",(int)x,gx,gx+self.spSize.width-1,point.x);
		if (point.x>=gx+self.spSize.width*1/3) {
			// 右2/3
			nslog(@"右移動");
			self.pointx=scrollView.contentOffset.x+self.spSize.width; // 画面内にあるときは、文字分だけ右に移動
			nslog(@"pointx+scrollView.frame.size.width=%f/scrollView.contentSize.width=%f"
				  ,self.pointx+scrollView.frame.size.width,scrollView.contentSize.width);

			if (self.pointx+scrollView.frame.size.width>scrollView.contentSize.width) {
				// これ以上右にはいけない
				self.pointx=scrollView.contentSize.width-scrollView.frame.size.width;
			}
			ret=CHAR_IN_VIEWR;
		} else {
			// 左1/3
			nslog(@"左移動");
			self.pointx=scrollView.contentOffset.x-self.spSize.width/2; // 画面内にあるときは、文字の半分だけ右に移動
			if (self.pointx<0) self.pointx=0;
			ret=CHAR_IN_VIEWL;
		}
	}
	return (ret);
}

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

@end
