sclass NotifyingStringBufferRotator implements Runnable { NotifyingStringBuffer buf; IF0 getMaxChars; *(NotifyingStringBuffer *buf, IF0 *getMaxChars) {} run { Int max = callF(getMaxChars); if (max == null || buf.length() <= max) ret; try { int newLength = max/2; int ofs = buf.length()-newLength; S newString = buf.substring(ofs); buf.setLength(0); buf.append("[...] ").append(newString); } catch (Exception e) { buf.setLength(0); } buf.trimToSize(); } } svoid makeNotifyingStringBufferRotate(NotifyingStringBuffer buf, IF0 getMaxChars) { if (hasElementWithClassShortNamed('NotifyingStringBufferRotator, buf.onChange)) ret; buf.onChange(new NotifyingStringBufferRotator(buf, getMaxChars)); }