package com.google.code.joto.ui.conv;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComponent;
import com.google.code.joto.eventrecorder.RecordEventData;
import com.google.code.joto.eventrecorder.RecordEventSummary;
import com.google.code.joto.eventrecorder.processor.RecordEventsProcessor;
import com.google.code.joto.eventrecorder.processor.RecordEventsProcessorFactory;
import com.google.code.joto.util.ui.ScrolledTextPane;
/**
* a TextPanel (with ScrolledPane and misc toolbars),
* for displaying list of RecordEvent as text
*
*/
public class RecordEventsConverterTextPanel {
private RecordEventsProcessorFactory<PrintStream> converterFactory;
private ScrolledTextPane textPane;
protected List<RecordEventData> eventDataList;
protected boolean needRecalc = false;
//-------------------------------------------------------------------------
public RecordEventsConverterTextPanel(RecordEventsProcessorFactory<PrintStream> converterFactory) {
this.converterFactory = converterFactory;
textPane = new ScrolledTextPane();
JButton recalcButton = new JButton("calc");
recalcButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
recalc();
}
});
textPane.addToolbarComp(recalcButton);
textPane.getJComponent().addComponentListener(new ComponentAdapter() {
@Override
public void componentShown(ComponentEvent e) {
if (needRecalc) {
recalc();
}
}
});
}
//-------------------------------------------------------------------------
public JComponent getJComponent() {
return textPane.getJComponent();
}
public void setRecordEventDataList(List<RecordEventData> eventDataList) {
this.eventDataList = eventDataList;
if (textPane.getJComponent().isVisible()) {
recalc();
} else {
needRecalc = true;
}
}
protected void recalc() {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
PrintStream out = new PrintStream(buffer);
try {
RecordEventsProcessor converter = converterFactory.create(out);
for(RecordEventData eventData : eventDataList) {
RecordEventSummary event = eventData.getEventSummary();
Object eventObjectData = eventData.getObjectData();
converter.processEvent(event, eventObjectData);
}
} catch(Exception ex) {
out.println();
out.print("Failed to convert RecordEvent(s) to text!\n");
ex.printStackTrace(out);
}
out.flush();
String textResult = buffer.toString();
textPane.setText(textResult);
}
}