/*
* Copyright 2016 MovingBlocks
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.terasology.launcher.log;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.util.Callback;
import java.text.DateFormat;
import java.util.Date;
/**
* Appends to a log view.
*/
public class LogViewAppender extends AppenderBase<ILoggingEvent> {
private final TableView<ILoggingEvent> view;
private final ObservableList<ILoggingEvent> data;
public LogViewAppender(TableView<ILoggingEvent> newView) {
this.view = newView;
view.setEditable(false);
data = FXCollections.observableArrayList();
view.setItems(data);
TableColumn<ILoggingEvent, Date> timestampCol = new TableColumn<>("Timestamp");
timestampCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ILoggingEvent, Date>, ObservableValue<Date>>() {
@Override
public ObservableValue<Date> call(CellDataFeatures<ILoggingEvent, Date> item) {
return new ReadOnlyObjectWrapper<>(new Date(item.getValue().getTimeStamp()));
}
});
view.getColumns().add(timestampCol);
TableColumn<ILoggingEvent, Level> levelCol = new TableColumn<>("Level");
levelCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ILoggingEvent, Level>, ObservableValue<Level>>() {
@Override
public ObservableValue<Level> call(CellDataFeatures<ILoggingEvent, Level> item) {
return new ReadOnlyObjectWrapper<>(item.getValue().getLevel());
}
});
view.getColumns().add(levelCol);
timestampCol.setCellFactory(new Callback<TableColumn<ILoggingEvent, Date>, TableCell<ILoggingEvent, Date>>() {
@Override
public TableCell<ILoggingEvent, Date> call(TableColumn<ILoggingEvent, Date> param) {
return new TableCell<ILoggingEvent, Date>() {
private DateFormat df = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.MEDIUM);
@Override
protected void updateItem(Date item, boolean empty) {
super.updateItem(item, empty);
if (!empty) {
setText(df.format(item));
} else {
setText(null);
}
}
};
}
});
TableColumn<ILoggingEvent, String> messageCol = new TableColumn<>("Message");
messageCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ILoggingEvent, String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(CellDataFeatures<ILoggingEvent, String> item) {
return new ReadOnlyObjectWrapper<>(item.getValue().getFormattedMessage());
}
});
view.getColumns().add(messageCol);
}
@Override
public void start() {
super.start();
}
@Override
public void append(ILoggingEvent event) {
data.add(event);
}
}