/**
* 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 javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
public class SeqTraceView extends VBox {
private final TableView<SeqTraceLog> table;
public SeqTraceView(ObservableList<SeqTraceLog> seqTraceLogs) {
table = new TableView<SeqTraceLog>();
table.setOnMouseClicked(this::onTraceClicked);
table.setMaxHeight(Integer.MAX_VALUE);
VBox.setVgrow(table, Priority.ALWAYS);
setupTableColumns();
getChildren().add(table);
seqTraceLogs.addListener(this::traceLogsChanged);
}
@SuppressWarnings("unchecked")
private void setupTableColumns() {
TableColumn<SeqTraceLog, String> msgType, serial, from, to, message, timestamp;
msgType = new TableColumn<>("Msg Type");
msgType.setCellValueFactory(new PropertyValueFactory<>("msgType"));
timestamp = new TableColumn<>("Timestamp");
timestamp.setCellValueFactory(new PropertyValueFactory<>("timestamp"));
timestamp.setPrefWidth(150d);
serial = new TableColumn<>("Serial");
serial.setCellValueFactory(new PropertyValueFactory<>("serial"));
from = new TableColumn<>("From");
from.setCellValueFactory(new PropertyValueFactory<>("from"));
to = new TableColumn<>("To");
to.setCellValueFactory(new PropertyValueFactory<>("to"));
// the message column should take the remaining space
// TODO http://stackoverflow.com/questions/30288558/make-the-last-column-in-a-javafx-tableview-take-the-remaining-space
message = new TableColumn<>("Message");
message.setCellValueFactory(new PropertyValueFactory<>("message"));
message.setPrefWidth(700d);
table.getColumns().addAll(msgType, timestamp, serial, from, to, message);
}
private void traceLogsChanged(ListChangeListener.Change<? extends SeqTraceLog> e) {
while(e.next()) {
for (SeqTraceLog trace : e.getAddedSubList()) {
table.getItems().add(trace);
}
}
}
private void onTraceClicked(MouseEvent me) {
if(me.getButton().equals(MouseButton.PRIMARY)) {
if(me.getClickCount() == 2) {
SeqTraceLog selectedItem = table.getSelectionModel().getSelectedItem();
if(selectedItem != null) {
showTraceTermView(selectedItem);
}
}
}
}
private void showTraceTermView(final SeqTraceLog seqTraceLog) {
TermTreeView argTermsTreeView;
argTermsTreeView = newTermTreeView();
argTermsTreeView.populateFromTerm(seqTraceLog.getMessage());
ErlyBerly.showPane("Seq Trace", ErlyBerly.wrapInPane(argTermsTreeView));
}
private TermTreeView newTermTreeView() {
TermTreeView termTreeView;
termTreeView = new TermTreeView();
termTreeView.setMaxHeight(Integer.MAX_VALUE);
VBox.setVgrow(termTreeView, Priority.ALWAYS);
return termTreeView;
}
}