/**
* erlyberly, erlang trace debugger
* Copyright (C) 2016 Andy Till
*
* 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/>.
*/
package erlyberly;
import com.ericsson.otp.erlang.OtpErlangTuple;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.Label;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.util.Callback;
public class CrashReportView extends TabPane {
private final TermTreeView termTreeView = new TermTreeView();
private final TermTreeView argsTreeView = new TermTreeView();
private final StackTraceView stackTraceView = new StackTraceView();
private final TableView<Object[]> crashInfoTable = new TableView<>();
public CrashReportView() {
VBox.setVgrow(termTreeView, Priority.ALWAYS);
Label label;
label = new Label("Stack Trace");
label.setStyle("-fx-padding: 5; -fx-font-size: 14;");
Tab stackTraceTab, argsTermsTab, termsTab;
termsTab = new Tab("Crash Report Terms");
termsTab.setContent(termTreeView);
argsTermsTab = new Tab("Call Args");
argsTermsTab.setContent(argsTreeView);
stackTraceTab = new Tab("Stack Trace");
stackTraceTab.setContent(new VBox(crashInfoTable, label, stackTraceView));
getTabs().addAll(stackTraceTab, argsTermsTab, termsTab);
}
public void setCrashReport(CrashReport crashReport) {
stackTraceView.populateFromCrashReport(crashReport);
termTreeView.populateFromTerm(crashReport.getProps());
Object[][] crashProps = {
{"Pid", crashReport.getPid() },
{"Reg. Name", crashReport.getRegisteredName() },
{"Error", ErlyBerly.getTermFormatter().exceptionToString(crashReport.getErrorClass(), crashReport.getErrorReason()) },
{"Initial Call", ErlyBerly.getTermFormatter().modFuncArgsToString((OtpErlangTuple) crashReport.getProcessInitialCall()) }};
TableColumn<Object[], Object> keyColumn = new TableColumn<>("Key");
TableColumn<Object[], Object> valueColumn = new TableColumn<>("Value");
keyColumn.setCellValueFactory(new Callback<CellDataFeatures<Object[], Object>, ObservableValue<Object>>() {
@Override
public ObservableValue<Object> call(CellDataFeatures<Object[], Object> p) {
return new SimpleObjectProperty<>((p.getValue()[0]));
}
});
valueColumn.setCellValueFactory(new Callback<CellDataFeatures<Object[], Object>, ObservableValue<Object>>() {
@Override
public ObservableValue<Object> call(CellDataFeatures<Object[], Object> p) {
return new SimpleObjectProperty<>((p.getValue()[1]));
}
});
crashInfoTable.getColumns().add(keyColumn);
crashInfoTable.getColumns().add(valueColumn);
crashInfoTable.getItems().addAll(crashProps);
crashReport.getCallArgs().ifPresent((callArgs) -> {
argsTreeView.populateFromListContents(callArgs);
});
}
}