/*
* *****************************************************************************
* Copyright (C) 2014-2024 Dennis Sheirer
*
* 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
* ****************************************************************************
*/
package io.github.dsheirer.gui.viewer;
import io.github.dsheirer.channel.state.DecoderStateEvent;
import io.github.dsheirer.module.decode.event.DecodeEventSnapshot;
import javafx.scene.control.Label;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
/**
* JavaFX message package details viewer
*/
public class MessagePackageViewer extends VBox
{
private Label mMessageLabel;
private TableView mDecoderStateEventTableView;
private TableView mDecodeEventTableView;
private IdentifierCollectionViewer mIdentifierCollectionViewer;
private IdentifierCollectionViewer mAudioSegmentIdCollectionViewer;
private ChannelStartProcessingRequestViewer mChannelStartProcessingRequestViewer;
/**
* Constructs an instance
*/
public MessagePackageViewer()
{
GridPane gridPane = new GridPane();
gridPane.setHgap(5);
gridPane.setVgap(5);
Label messageLabel = new Label("Message:");
gridPane.add(messageLabel, 0, 0);
GridPane.setHgrow(getMessageLabel(), Priority.ALWAYS);
gridPane.add(getMessageLabel(), 1, 0);
gridPane.add(new Label("Decoder State Events"), 0, 1);
getDecoderStateEventTableView().setPrefHeight(120);
GridPane.setHgrow(getDecoderStateEventTableView(), Priority.NEVER);
gridPane.add(getDecoderStateEventTableView(), 0, 2);
gridPane.add(new Label("Decode Events"), 1, 1);
getDecodeEventTableView().setPrefHeight(120);
GridPane.setHgrow(getDecodeEventTableView(), Priority.ALWAYS);
gridPane.add(getDecodeEventTableView(), 1, 2);
TabPane tabPane = new TabPane();
Tab startTab = new Tab("Channel Start Processing Request");
startTab.setContent(getChannelStartProcessingRequestViewer());
Tab audioTab = new Tab("Audio Segment");
audioTab.setContent(getAudioSegmentIdCollectionViewer());
tabPane.getTabs().addAll(audioTab, startTab);
gridPane.add(tabPane, 0, 4);
getIdentifierCollectionViewer().setPrefHeight(120);
gridPane.add(new Label("Selected Decode Event Identifiers"), 1, 3);
gridPane.add(getIdentifierCollectionViewer(), 1, 4);
getChildren().add(gridPane);
}
public void set(MessagePackage messagePackage)
{
getMessageLabel().setText(null);
getDecoderStateEventTableView().getItems().clear();
getDecodeEventTableView().getItems().clear();
getChannelStartProcessingRequestViewer().set(null);
if(messagePackage != null)
{
String message = messagePackage.toString();
if(message.length() > 40)
{
message = message.substring(0, 40) + "...";
}
getMessageLabel().setText(message);
getDecoderStateEventTableView().getItems().addAll(messagePackage.getDecoderStateEvents());
getDecodeEventTableView().getItems().addAll(messagePackage.getDecodeEvents());
getChannelStartProcessingRequestViewer().set(messagePackage.getChannelStartProcessingRequest());
if(getDecodeEventTableView().getItems().size() > 0)
{
getDecodeEventTableView().getSelectionModel().select(0);
}
if(messagePackage.getAudioSegment() != null)
{
getAudioSegmentIdCollectionViewer().set(messagePackage.getAudioSegment().getIdentifierCollection());
}
else
{
getAudioSegmentIdCollectionViewer().set(null);
}
}
}
private IdentifierCollectionViewer getIdentifierCollectionViewer()
{
if(mIdentifierCollectionViewer == null)
{
mIdentifierCollectionViewer = new IdentifierCollectionViewer();
}
return mIdentifierCollectionViewer;
}
private IdentifierCollectionViewer getAudioSegmentIdCollectionViewer()
{
if(mAudioSegmentIdCollectionViewer == null)
{
mAudioSegmentIdCollectionViewer = new IdentifierCollectionViewer();
}
return mAudioSegmentIdCollectionViewer;
}
private Label getMessageLabel()
{
if(mMessageLabel == null)
{
mMessageLabel = new Label();
mMessageLabel.setMaxWidth(Double.MAX_VALUE);
}
return mMessageLabel;
}
public TableView getDecoderStateEventTableView()
{
if(mDecoderStateEventTableView == null)
{
mDecoderStateEventTableView = new TableView<>();
TableColumn timeslotColumn = new TableColumn();
timeslotColumn.setPrefWidth(110);
timeslotColumn.setText("Timeslot");
timeslotColumn.setCellValueFactory(new PropertyValueFactory<>("timeslot"));
TableColumn stateColumn = new TableColumn();
stateColumn.setPrefWidth(110);
stateColumn.setText("State");
stateColumn.setCellValueFactory(new PropertyValueFactory<>("state"));
TableColumn eventColumn = new TableColumn();
eventColumn.setPrefWidth(110);
eventColumn.setText("Event");
eventColumn.setCellValueFactory(new PropertyValueFactory<>("event"));
TableColumn frequencyColumn = new TableColumn();
frequencyColumn.setPrefWidth(110);
frequencyColumn.setText("Frequency");
frequencyColumn.setCellValueFactory(new PropertyValueFactory<>("frequency"));
mDecoderStateEventTableView.getColumns().addAll(timeslotColumn, stateColumn, eventColumn, frequencyColumn);
}
return mDecoderStateEventTableView;
}
private TableView getDecodeEventTableView()
{
if(mDecodeEventTableView == null)
{
mDecodeEventTableView = new TableView<>();
mDecodeEventTableView.setMaxWidth(Double.MAX_VALUE);
TableColumn startTimeColumn = new TableColumn();
startTimeColumn.setPrefWidth(110);
startTimeColumn.setText("Start");
startTimeColumn.setCellValueFactory(new PropertyValueFactory<>("timeStart"));
TableColumn durationColumn = new TableColumn();
durationColumn.setPrefWidth(110);
durationColumn.setText("Duration");
durationColumn.setCellValueFactory(new PropertyValueFactory<>("duration"));
TableColumn typeColumn = new TableColumn();
typeColumn.setPrefWidth(130);
typeColumn.setText("Type");
typeColumn.setCellValueFactory(new PropertyValueFactory<>("eventType"));
TableColumn channelDescriptorColumn = new TableColumn();
channelDescriptorColumn.setPrefWidth(110);
channelDescriptorColumn.setText("Channel");
channelDescriptorColumn.setCellValueFactory(new PropertyValueFactory<>("channelDescriptor"));
TableColumn frequencyColumn = new TableColumn();
frequencyColumn.setPrefWidth(110);
frequencyColumn.setText("Frequency");
frequencyColumn.setCellValueFactory(new PropertyValueFactory<>("frequency"));
TableColumn hashcodeColumn = new TableColumn();
hashcodeColumn.setPrefWidth(100);
hashcodeColumn.setText("Hash ID");
hashcodeColumn.setCellValueFactory(new PropertyValueFactory<>("originalHashCode"));
TableColumn detailsColumn = new TableColumn();
detailsColumn.setPrefWidth(500);
detailsColumn.setText("Details");
detailsColumn.setCellValueFactory(new PropertyValueFactory<>("details"));
mDecodeEventTableView.getColumns().addAll(startTimeColumn, durationColumn, typeColumn, channelDescriptorColumn,
frequencyColumn, hashcodeColumn, detailsColumn);
mDecodeEventTableView.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) ->
{
if(newValue != null)
{
getIdentifierCollectionViewer().set(newValue.getIdentifierCollection());
}
else
{
getIdentifierCollectionViewer().set(null);
}
});
}
return mDecodeEventTableView;
}
private ChannelStartProcessingRequestViewer getChannelStartProcessingRequestViewer()
{
if(mChannelStartProcessingRequestViewer == null)
{
mChannelStartProcessingRequestViewer = new ChannelStartProcessingRequestViewer();
}
return mChannelStartProcessingRequestViewer;
}
}