/******************************************************************************* * Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://robocode.sourceforge.net/license/epl-v10.html * * Contributors: * Mathew A. Nelson * - Initial API and implementation *******************************************************************************/ package net.sf.robocode.ui.util; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.Element; import javax.swing.text.PlainDocument; import java.awt.*; /** * @author Mathew A. Nelson (original) */ @SuppressWarnings("serial") public class LimitedDocument extends PlainDocument { int maxRows = Integer.MAX_VALUE; int maxCols = Integer.MAX_VALUE; public LimitedDocument() { super(); } public LimitedDocument(int maxRows, int maxCols) { super(); this.maxRows = maxRows; this.maxCols = maxCols; } @Override public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { Element rootElement = getDefaultRootElement(); int i = str.indexOf("\n"); int newlines = 0; while (i < str.length() && i >= 0) { newlines++; i = str.indexOf("\n", i + 1); } int currentLines = rootElement.getElementCount(); if (newlines > 0 && currentLines + newlines > maxRows) { Toolkit.getDefaultToolkit().beep(); return; } int lineIndex = rootElement.getElementIndex(offs); boolean done = false; int carry = rootElement.getElement(lineIndex).getEndOffset() - offs - 1; int lineStart = 0; while (!done) { int lineEnd = str.indexOf("\n", lineStart); if (lineEnd == -1 || lineEnd == str.length()) { if (lineStart == 0) { carry = 0; lineEnd = str.length(); } else { lineEnd = str.length() + carry; } done = true; } int lineLen = lineEnd - lineStart; // Increment for last line... int currentLen; if (!done && lineStart > 0) { currentLen = 0; } else { if (done && lineStart > 0) { lineIndex++; } Element currentLine = rootElement.getElement(lineIndex); if (currentLine != null) { currentLen = currentLine.getEndOffset() - currentLine.getStartOffset(); } else { currentLen = 1; } if (lineStart == 0) { currentLen -= carry; } } if (lineLen + currentLen > maxCols + 1) { Toolkit.getDefaultToolkit().beep(); return; } lineStart = lineEnd + 1; } super.insertString(offs, str, a); } }