mirror of
https://github.com/SKCraft/Launcher.git
synced 2024-11-27 12:46:22 +01:00
Merge pull request #82 from seebs/master
Avoid pathological failure mode when trimming lines.
This commit is contained in:
commit
40555cce59
@ -111,22 +111,30 @@ public class MessageLog extends JPanel {
|
||||
* @param line line
|
||||
* @param attributes attribute set, or null for none
|
||||
*/
|
||||
public void log(String line, AttributeSet attributes) {
|
||||
public void log(final String line, AttributeSet attributes) {
|
||||
final Document d = document;
|
||||
final JTextComponent t = textComponent;
|
||||
if (colorEnabled) {
|
||||
if (line.startsWith("(!!)")) {
|
||||
attributes = highlightedAttributes;
|
||||
}
|
||||
}
|
||||
final AttributeSet a = attributes;
|
||||
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
int offset = document.getLength();
|
||||
document.insertString(offset, line,
|
||||
(attributes != null && colorEnabled) ? attributes : defaultAttributes);
|
||||
textComponent.setCaretPosition(document.getLength());
|
||||
int offset = d.getLength();
|
||||
d.insertString(offset, line,
|
||||
(a != null && colorEnabled) ? a : defaultAttributes);
|
||||
t.setCaretPosition(d.getLength());
|
||||
} catch (BadLocationException ble) {
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an output stream that can be written to.
|
||||
|
@ -21,6 +21,7 @@ import javax.swing.text.Element;
|
||||
public class LimitLinesDocumentListener implements DocumentListener {
|
||||
private int maximumLines;
|
||||
private boolean isRemoveFromStart;
|
||||
private volatile boolean isRemoving;
|
||||
|
||||
/**
|
||||
* Specify the number of lines to be stored in the Document. Extra lines
|
||||
@ -34,6 +35,7 @@ public class LimitLinesDocumentListener implements DocumentListener {
|
||||
boolean isRemoveFromStart) {
|
||||
setLimitLines(maximumLines);
|
||||
this.isRemoveFromStart = isRemoveFromStart;
|
||||
this.isRemoving = false;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -54,6 +56,8 @@ public class LimitLinesDocumentListener implements DocumentListener {
|
||||
// Changes to the Document can not be done within the listener
|
||||
// so we need to add the processing to the end of the EDT
|
||||
|
||||
if (!this.isRemoving) {
|
||||
this.isRemoving = true;
|
||||
SwingUtilities.invokeLater(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
@ -61,6 +65,7 @@ public class LimitLinesDocumentListener implements DocumentListener {
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeUpdate(DocumentEvent e) {
|
||||
@ -74,20 +79,25 @@ public class LimitLinesDocumentListener implements DocumentListener {
|
||||
// The root Element of the Document will tell us the total number
|
||||
// of line in the Document.
|
||||
|
||||
try {
|
||||
Document document = e.getDocument();
|
||||
Element root = document.getDefaultRootElement();
|
||||
int excess = root.getElementCount() - maximumLines;
|
||||
|
||||
while (root.getElementCount() > maximumLines) {
|
||||
if (excess > 0) {
|
||||
if (isRemoveFromStart) {
|
||||
removeFromStart(document, root);
|
||||
removeFromStart(document, root, excess);
|
||||
} else {
|
||||
removeFromEnd(document, root);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
this.isRemoving = false;
|
||||
}
|
||||
}
|
||||
|
||||
private void removeFromStart(Document document, Element root) {
|
||||
Element line = root.getElement(0);
|
||||
private void removeFromStart(Document document, Element root, int excess) {
|
||||
Element line = root.getElement(excess - 1);
|
||||
int end = line.getEndOffset();
|
||||
|
||||
try {
|
||||
@ -101,9 +111,9 @@ public class LimitLinesDocumentListener implements DocumentListener {
|
||||
// We use start minus 1 to make sure we remove the newline
|
||||
// character of the previous line
|
||||
|
||||
Element line = root.getElement(root.getElementCount() - 1);
|
||||
Element line = root.getElement(maximumLines);
|
||||
int start = line.getStartOffset();
|
||||
int end = line.getEndOffset();
|
||||
int end = root.getEndOffset();
|
||||
|
||||
try {
|
||||
document.remove(start - 1, end - start);
|
||||
|
Loading…
Reference in New Issue
Block a user