private int [] calculateScanPoint()	{	// returns line/column
		if (scanPoint != null)	// use buffered scan pointer when possible, as line/column requests always are coupled
			return scanPoint;
			
		int diff = getReadColumn() - getUnreadLength();
		if (diff >= 0)
			return scanPoint = new int[] { getReadLine(), diff };
		
		for (int i = lineLengths.size() - 1; i >= 0; i--)	{	// loop back all lines
			int len = ((Integer) lineLengths.get(i)).intValue();
			diff += len;
			if (diff >= 0)
				return scanPoint = new int[] { i + 1, diff };
		}
		throw new IllegalStateException("Something went wrong when calculating scan point: "+diff);
	}