/*
* Copyright (C) 2014-2015 ULYSSIS VZW
*
* This file is part of i++.
*
* i++ is free software: you can redistribute it and/or modify
* it under the terms of version 3 of the GNU Affero General Public License
* as published by the Free Software Foundation. No other versions apply.
*
* 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
package org.ulyssis.ipp.ui.widgets;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import org.ulyssis.ipp.status.StatusMessage;
import org.ulyssis.ipp.ui.UIApplication;
import org.ulyssis.ipp.ui.state.SharedState;
import eu.webtoolkit.jwt.ItemDataRole;
import eu.webtoolkit.jwt.Orientation;
import eu.webtoolkit.jwt.WAbstractTableModel;
import eu.webtoolkit.jwt.WContainerWidget;
import eu.webtoolkit.jwt.WLength;
import eu.webtoolkit.jwt.WModelIndex;
import eu.webtoolkit.jwt.WString;
import eu.webtoolkit.jwt.WTableView;
import eu.webtoolkit.jwt.WTemplate;
import eu.webtoolkit.jwt.WWidget;
public final class LogPanel extends CollapsablePanel {
private final WTemplate barContent;
private final WTableView log;
private final SharedState sharedState;
private final MessageTable messageTable;
private static final class MessageTable extends WAbstractTableModel {
private final List<StatusMessage> messages = new ArrayList<>();
private final List<Instant> messageTimes = new ArrayList<>();
public void addMessage(Instant instant, StatusMessage message) {
beginInsertRows(null, 0, 0);
messages.add(message);
messageTimes.add(instant);
endInsertRows();
}
@Override
public int getColumnCount(WModelIndex parent) {
return 3;
}
@Override
public int getRowCount(WModelIndex parent) {
return messages.size();
}
@Override
public Object getData(WModelIndex index, int role) {
if (index.getColumn() >= 3)
return null;
if (index.getRow() >= messages.size())
return null;
if (role != ItemDataRole.DisplayRole)
return null;
int i = messages.size() - index.getRow() - 1;
if (index.getColumn() == 0) {
// TODO: Not just Europe/Brussels!
return LocalDateTime.ofInstant(messageTimes.get(i), ZoneId.systemDefault()).toString(); // TODO: Formatting?
} else if (index.getColumn() == 1) {
return messages.get(i).getType().toString();
} else if (index.getColumn() == 2) {
return messages.get(i).getDetails();
}
return null;
}
@Override
public Object getHeaderData(int section, Orientation orientation, int role) {
if (orientation == Orientation.Horizontal && role == ItemDataRole.DisplayRole) {
if (section == 0) {
return "Time";
} else if (section == 1) {
return "Type";
} else if (section == 2) {
return "Details";
}
}
return super.getHeaderData(section, orientation, role);
}
}
public LogPanel() {
this(null);
}
public LogPanel(WContainerWidget parent) {
super(parent);
UIApplication app = UIApplication.getInstance();
sharedState = app.getSharedState();
barContent = new WTemplate(WString.tr("log-panel-bar"));
barContent.addStyleClass("log-panel-bar");
log = new WTableView();
log.addStyleClass("log-panel-log");
log.setHeight(new WLength(200));
log.setColumnWidth(0, new WLength(200));
log.setColumnWidth(2, new WLength(600));
messageTable = new MessageTable();
log.setModel(messageTable);
log.setSortingEnabled(false);
barContent.bindEmpty("message-time");
barContent.bindEmpty("message-type");
barContent.bindEmpty("message");
addStyleClass("log-panel");
sharedState.addStatusListener(app, statusListener);
}
private final Consumer<StatusMessage> statusListener = this::onNewStatus;
private void onNewStatus(StatusMessage message) {
if (message.getType() != StatusMessage.MessageType.NEW_SNAPSHOT) {
Instant now = Instant.now();
messageTable.addMessage(now, message);
barContent.bindString("message-time", LocalDateTime.ofInstant(now, ZoneId.systemDefault()).toString());
barContent.bindString("message-type", message.getType().toString());
barContent.bindString("message", message.getDetails());
}
}
@Override
protected WWidget barContentWidget() {
return barContent;
}
@Override
protected WWidget contentWidget() {
return log;
}
}