bcv-vf/src/main/java/the/bytecode/club/bytecodeviewer/gui/components/JFrameConsolePrintStream.java
2021-07-11 09:41:33 -07:00

138 lines
3.9 KiB
Java

package the.bytecode.club.bytecodeviewer.gui.components;
import the.bytecode.club.bytecodeviewer.Constants;
import javax.swing.*;
import java.io.PrintStream;
import static the.bytecode.club.bytecodeviewer.Constants.nl;
/***************************************************************************
* Bytecode Viewer (BCV) - Java & Android Reverse Engineering Suite *
* Copyright (C) 2014 Kalen 'Konloch' Kinloch - http://bytecodeviewer.com *
* *
* This program 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 3 of the License, or *
* (at your option) any later version. *
* *
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>. *
***************************************************************************/
/**
* A swing console that can print out from PrintStreams
*
* @author Konloch
* @since 6/25/2021
*/
public class JFrameConsolePrintStream extends JFrameConsole
{
private final JTextAreaOutputStream textAreaOutputStreamOut;
private final JTextAreaOutputStream textAreaOutputStreamErr;
private Thread updateThread;
private boolean finished;
private long lastUpdate = 0;
public JFrameConsolePrintStream(String title)
{
super(title);
textAreaOutputStreamOut = new JTextAreaOutputStream(getTextArea(), System.out);
textAreaOutputStreamErr = new JTextAreaOutputStream(getTextArea(), System.err);
System.setOut(new PrintStream(textAreaOutputStreamOut));
System.setErr(new PrintStream(textAreaOutputStreamErr));
}
@Override
public void setVisible(boolean b)
{
super.setVisible(b);
if(b && updateThread == null)
{
updateThread = new Thread(() ->
{
while (isVisible() && !finished)
{
update();
try {
Thread.sleep(10);
} catch (InterruptedException e) { }
}
lastUpdate = 0;
update();
}, "Lazy Console Update");
updateThread.start();
}
}
public void finished()
{
finished = true;
System.setErr(Constants.ERR);
System.setOut(Constants.OUT);
}
public JTextAreaOutputStream getTextAreaOutputStreamErr()
{
return textAreaOutputStreamErr;
}
public JTextAreaOutputStream getTextAreaOutputStreamOut()
{
return textAreaOutputStreamOut;
}
private void update()
{
if(System.currentTimeMillis()-lastUpdate <= 50)
return;
lastUpdate = System.currentTimeMillis();
//update only if required
if(textAreaOutputStreamErr.noUpdateRequired() && textAreaOutputStreamOut.noUpdateRequired())
return;
SwingUtilities.invokeLater(()->
{
//print output to the pane
textAreaOutputStreamOut.update();
//print error to the pane
textAreaOutputStreamErr.update();
//reformat the pane
String content = getTextArea().getText();
if(content.contains("File `"))
{
String[] test = content.split("\r?\n");
StringBuilder replace = new StringBuilder();
for (String s : test)
{
if (s.startsWith("File '"))
{
String[] split = s.split("'");
String start = split[0] + "'" + split[1] + "', ";
s = s.substring(start.length());
}
replace.append(s).append(nl);
}
setText(replace.toString());
}
});
}
}