Files
secondo/UserInterfaces/InteractiveQueryEditor/ui/console/ConsolePane.java
2026-01-23 17:03:45 +08:00

117 lines
4.3 KiB
Java

//This file is part of SECONDO.
//Copyright (C) 2004, University in Hagen, Department of Computer Science,
//Database Systems for New Applications.
//SECONDO is free software; you can redistribute it and/or modify
//it under the terms of the GNU General Public License as published by
//the Free Software Foundation; either version 2 of the License, or
//(at your option) any later version.
//SECONDO is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//GNU General Public License for more details.
//You should have received a copy of the GNU General Public License
//along with SECONDO; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package ui.console;
import java.awt.Color;
import javax.swing.JTextPane;
import javax.swing.text.AbstractDocument;
import javax.swing.text.BadLocationException;
import javax.swing.text.Element;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import util.common.UITools;
import util.common.UpdateHandler;
/**
* Implementation of a custom command line by extending a {@link JTextPane}
* @author D.Merle
*/
public class ConsolePane extends JTextPane implements UpdateHandler {
private final SimpleAttributeSet standardTextAttribute;
public ConsolePane() {
super();
final ConsoleDocument document = new ConsoleDocument();
setStyledDocument(document);
standardTextAttribute = new SimpleAttributeSet();
StyleConstants.setBackground(standardTextAttribute, Color.WHITE);
StyleConstants.setForeground(standardTextAttribute, Color.BLACK);
StyleConstants.setFontFamily(standardTextAttribute, "Monospaced");
StyleConstants.setFontSize(standardTextAttribute, (int)(12*UITools.calculateUIScaling()));
setBackground(Color.WHITE);
setForeground(Color.BLACK);
setCaretColor(Color.BLACK);
document.setDocumentFilter(new ConsoleDocumentFilter(10000));
setNavigationFilter(new ConsoleNavigationFilter(document));
}
public void replaceLastLine(final String text) {
final ConsoleDocument doc = (ConsoleDocument)getDocument();
final Element root = getDocument().getDefaultRootElement();
final Element lastLine = root.getElement(root.getElementCount() -1);
try {
doc.replace(lastLine.getStartOffset() + doc.getPrompt().length(), lastLine.getEndOffset() - lastLine.getStartOffset() - doc.getPrompt().length() - 1, text, standardTextAttribute);
} catch (final BadLocationException e) {
e.printStackTrace();
}
}
public void appendString(final String text) {
final ConsoleDocument doc = (ConsoleDocument)getDocument();
final Element root = getDocument().getDefaultRootElement();
final Element lastLine = root.getElement(root.getElementCount() -1);
try {
doc.insertString(lastLine.getEndOffset() - 1, doc.getPrompt() + text, standardTextAttribute);
} catch (final BadLocationException e) {
e.printStackTrace();
}
setCaretPosition(getDocument().getLength());
}
public void appendTextBeforePrompt(final String text) {
final ConsoleDocument doc = (ConsoleDocument)getDocument();
final Element root = getDocument().getDefaultRootElement();
final Element insertAt = root.getElement(root.getElementCount() -1);
try {
doc.insertString(insertAt.getStartOffset(), text, standardTextAttribute);
} catch (final BadLocationException e) {
e.printStackTrace();
}
}
public void setPrompt(final String prompt) {
((ConsoleDocument)getDocument()).setPrompt(prompt);
appendString("");
}
public String getLineFromEndOfDocument(final int subtract) {
final ConsoleDocument doc = (ConsoleDocument)getDocument();
final Element root = getDocument().getDefaultRootElement();
final Element lastLine = root.getElement(root.getElementCount() - subtract);
try {
return doc.getText(lastLine.getStartOffset() + doc.getPrompt().length(), lastLine.getEndOffset() - lastLine.getStartOffset() - doc.getPrompt().length() - 1);
} catch (final BadLocationException e) {
e.printStackTrace();
return "";
}
}
public void addDocumentFilterInterceptor(final ConsoleDocumentFilterInterceptor interceptor) {
((ConsoleDocumentFilter)((AbstractDocument)getDocument()).getDocumentFilter()).setInterceptor(interceptor);
}
@Override
public void handleUpdate(final String text) {
appendTextBeforePrompt(text);
}
}