package jaist.css.covis.util;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.TreeMap;
/**
* マス目に文字列などのデータを結びつけるクラス
*
* ここでは,特に(int,int) -> String を意識して,putメソッドを作成している
* 複数行のテキストトークンを扱えるようにカスタマイズ
*/
public class MyBoxMatrixHolder {
ArrayList<ArrayList<MyBox>> datahash;
ArrayList<MyBox> lastList;
public MyBoxMatrixHolder() {
datahash = new ArrayList<ArrayList<MyBox>>();
lastList = new ArrayList<MyBox>();
datahash.add(lastList);
}
public MyBoxMatrixHolder(ArrayList<MyBox> boxes, double trialWidth){
this();
double t = 0;
for(MyBox b: boxes){
if (trialWidth < (t + b.getWidth())){
addNewLine();
t = 0;
}
lastList.add(b);
t += b.getWidth();
}
}
public void addNewLine(){
lastList = new ArrayList<MyBox>();
datahash.add(lastList);
}
public void add(int y, MyBox val) {
datahash.get(y).add(val);
}
public double getLineLength(int y){
Point2D p = getAllLength(datahash.get(y));
return p.getX();
}
public Point2D getDimension(){
double w = 0;
double h = 0;
for(int i=0;i<datahash.size();i++){
Point2D tempp = getAllLength(datahash.get(i));
if (w < tempp.getX()) w = tempp.getX();
h += tempp.getY();
}
return new Point2D.Double(w,h);
}
/**
* 傾き値(width/height)を返す
* @return
*/
public double getFitRate(){
Point2D p = getDimension();
return (p.getX()/p.getY());
}
public ArrayList<MyBox> get(int y) {
return datahash.get(y);
}
public void removeAll() {
datahash.clear();
}
public String toString(){
StringBuffer sb = new StringBuffer();
for(int i=0;i<datahash.size();i++){
for(MyBox b : datahash.get(i)){
sb.append(b.toString());
}
if (i < (datahash.size()-1)) sb.append("\n");
}
return sb.toString();
}
/**トークンリストの長さを合計して返すだけのメソッド
本当は,Dimension2Dを使いたいが,クラスがないのでPointで代用*/
public static Point2D getAllLength(ArrayList<MyBox> tokenlist){
double length = 0;
double height = 0;
for(MyBox szht:tokenlist) {
length += szht.getWidth();
if (height < szht.getHeight()) height = szht.getHeight();
}
return new Point2D.Double(length,height);
}
public static String getPreferredStringLineBreak(String s, double parentrate){
String src = s.replaceAll("\n", "");
// InputTokenizer it = new InputTokenizer(src);
ArrayList<String> tokens = new InputTokenizer(src).tokens;
ArrayList<MyBox> blist = new ArrayList<MyBox>();
for(String k:tokens){
SimpleZenHanToken szht = new SimpleZenHanToken(k);
blist.add(szht);
}
MyBoxMatrixHolder best = getPreferredHolder(blist, parentrate);
return best.toString();
}
public static MyBoxMatrixHolder getPreferredHolder(ArrayList<MyBox> blist, double parentrate){
TreeMap<Double,MyBoxMatrixHolder> resultRates = new TreeMap<Double,MyBoxMatrixHolder>();
double trialLen = getAllLength(blist).getX();
// double ratediff = Double.MAX_VALUE;
for(int i=0;i<9;i++){
MyBoxMatrixHolder mbmh = new MyBoxMatrixHolder(blist, trialLen);
double fitrate = mbmh.getFitRate();
resultRates.put(Math.abs(parentrate - fitrate), mbmh);
// System.out.println(i+" "+fitrate);
// if (ratediff < Math.abs(parentrate - fitrate)) break;
if (parentrate < fitrate){
trialLen *= 0.75;
} else {
trialLen *= 1.3;
}
// if (Math.abs(trialLen-lastTrialLen)<2.0d) break;
}
for(double d: resultRates.keySet()){
System.out.println(d+" "+resultRates.get(d).toString());
}
ArrayList<MyBoxMatrixHolder> intres = new ArrayList<MyBoxMatrixHolder>(resultRates.values());
return intres.get(0);
}
}