package net.sourceforge.squirrel_sql.client.session.mainpanel.overview.datascale;
public class StringCalculator implements Calculator<String>
{
private CharRange _charRange;
public StringCalculator(CharRange charRange)
{
_charRange = charRange;
}
/**
* @return min if no value exisits between min and max
*/
public String getMid(String min, String max)
{
String dist = getDist(min, max);
String halfDist = getHalf(dist);
String ret = add(min, halfDist);
return ret;
}
private String add(String min, String halfDist)
{
StringBuffer bufHalfDist = new StringBuffer(halfDist);
int len = bufHalfDist.length();
StringBuffer bufRet;
if (null == min)
{
bufRet = new StringBuffer();
}
else
{
bufRet = new StringBuffer(min);
}
minCharUpToLen(bufRet, len);
bufRet.reverse();
bufHalfDist.reverse();
boolean einsImSinn = false;
for (int i = 0; i < len; i++)
{
char sumChar = (char) (bufRet.charAt(i) + bufHalfDist.charAt(i));
if(einsImSinn)
{
++sumChar;
einsImSinn = false;
}
if(sumChar > _charRange.getMaxChar())
{
einsImSinn = true;
sumChar = (char) (sumChar - _charRange.getRange());
}
bufRet.setCharAt(i, sumChar);
}
return bufRet.reverse().toString();
}
private String getHalf(String dist)
{
StringBuffer bufDist = new StringBuffer(dist);
StringBuffer bufHalfDist = new StringBuffer(bufDist.length());
for (int i = 0; i < bufDist.length(); i++)
{
char c = bufDist.charAt(i);
bufHalfDist.append((char) (c / 2));
if(1 == c % 2 && i + 1 < bufDist.length())
{
bufDist.setCharAt(i +1 , (char) (bufDist.charAt(i+1) + _charRange.getRange()));
}
}
return bufHalfDist.toString();
}
private String getDist(String min, String max)
{
int len = Math.max(getLen(min), getLen(max));
StringBuffer bufMin = new StringBuffer();
StringBuffer bufMax = new StringBuffer();
if(null != min)
{
bufMin.append(min);
}
if(null != max)
{
bufMax.append(max);
}
minCharUpToLen(bufMin, len);
minCharUpToLen(bufMax, len);
bufMin.reverse();
bufMax.reverse();
StringBuffer bufDist = new StringBuffer(len);
for (int i = 0; i < len; i++)
{
char cMax = bufMax.charAt(i);
char cMin = bufMin.charAt(i);
if(cMax >= cMin)
{
bufDist.append( (char)((cMax - cMin)) );
}
else
{
bufDist.append( (char)(( (cMax + _charRange.getRange()) - cMin)) );
bufMin.setCharAt(i+1, (char) (bufMin.charAt(i+1) + 1));
}
}
return bufDist.reverse().toString();
}
private int getLen(String s)
{
if(null == s)
{
return 0;
}
return s.length();
}
private void minCharUpToLen(StringBuffer toInit, int len)
{
for (int i = toInit.length(); i < len; i++)
{
toInit.append(_charRange.getMinChar());
}
}
}