package org.jtheque.views.impl.windows;
import org.jtheque.events.Event;
import org.jtheque.events.EventService;
import org.jtheque.i18n.LanguageService;
import org.jtheque.ui.Model;
import org.jtheque.ui.utils.builders.I18nPanelBuilder;
import org.jtheque.ui.utils.builders.PanelBuilder;
import org.jtheque.ui.components.filthy.Filthy;
import org.jtheque.ui.utils.models.SimpleListModel;
import org.jtheque.ui.utils.windows.dialogs.SwingFilthyBuildedDialogView;
import org.jtheque.utils.ui.GridBagUtils;
import org.jtheque.views.impl.models.EventsTableModel;
import org.jdesktop.swingx.JXTable;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.Insets;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Locale;
/*
* Copyright JTheque (Baptiste Wicht)
*
* 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.
*/
/**
* A log view implementation.
*
* @author Baptiste Wicht
*/
public final class EventView extends SwingFilthyBuildedDialogView<Model> implements ListSelectionListener, ItemListener, org.jtheque.views.windows.EventView {
private JXTable tableEvents;
private EventsTableModel eventsModel;
private JLabel labelTitle;
private JLabel labelLog;
private JLabel labelSource;
private JLabel labelLevel;
private JLabel labelDate;
private JLabel labelTime;
private JTextArea areaDetails;
private final DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy", Locale.getDefault());
private final DateFormat timeFormat = new SimpleDateFormat("HH:mm:ss,SSS", Locale.getDefault());
private static final int DEFAULT_WIDTH = 600;
private static final int DEFAULT_HEIGHT = 450;
@Override
protected void initView() {
setTitleKey("log.view.title");
setResizable(false);
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
}
@Override
protected void buildView(I18nPanelBuilder builder) {
builder.setDefaultInsets(new Insets(4, 4, 4, 4));
builder.addI18nLabel("log.view.log", builder.gbcSet(0, 0, GridBagUtils.NONE, GridBagUtils.LINE_END));
builder.addComboBox(new SimpleListModel<String>(getService(EventService.class).getEventLogs()), Filthy.newListRenderer(),
builder.gbcSet(1, 0, GridBagUtils.HORIZONTAL, GridBagUtils.LINE_START, 1.0, 0.0)).addItemListener(this);
eventsModel = new EventsTableModel(getService(EventService.class), getService(LanguageService.class));
eventsModel.setHeaders(new String[]{
getMessage("log.view.level"),
getMessage("log.view.date"),
getMessage("log.view.time"),
getMessage("log.view.source"),
getMessage("log.view.title")});
tableEvents = (JXTable) builder.addScrolledTable(eventsModel, builder.gbcSet(0, 1, GridBagUtils.BOTH, GridBagUtils.LINE_START, 2, 1, 1.0, 0.67));
tableEvents.getSelectionModel().addListSelectionListener(this);
tableEvents.setVisibleRowCount(8);
createInfosPanel(builder);
builder.addButton(getAction("log.view.actions.update"),
builder.gbcSet(1, 3, GridBagUtils.NONE, GridBagUtils.LINE_END));
}
/**
* Create the panel to display the informations of an event.
*
* @param parent The parent builder.
*/
private void createInfosPanel(I18nPanelBuilder parent) {
I18nPanelBuilder builder = parent.addPanel(parent.gbcSet(0, 2, GridBagUtils.BOTH, GridBagUtils.LINE_START, 2, 1, 1.0, 0.33));
builder.setI18nTitleBorder("log.view.details");
addLabels(builder);
addFieldLabels(builder);
}
/**
* Add all the fields.
*
* @param builder The frame builder.
*/
private void addFieldLabels(PanelBuilder builder) {
labelTitle = builder.addLabel(builder.gbcSet(0, 0, GridBagUtils.NONE, GridBagUtils.BASELINE_LEADING, 4, 1));
labelLog = builder.addLabel(builder.gbcSet(1, 1, GridBagUtils.HORIZONTAL, GridBagUtils.BASELINE_LEADING, 0.5, 0.0));
labelSource = builder.addLabel(builder.gbcSet(1, 2, GridBagUtils.HORIZONTAL, GridBagUtils.BASELINE_LEADING, 0.5, 0.0));
labelLevel = builder.addLabel(builder.gbcSet(1, 3, GridBagUtils.HORIZONTAL, GridBagUtils.BASELINE_LEADING, 0.5, 0.0));
labelDate = builder.addLabel(builder.gbcSet(3, 1, GridBagUtils.HORIZONTAL, GridBagUtils.BASELINE_LEADING, 0.5, 0.0));
labelTime = builder.addLabel(builder.gbcSet(3, 2, GridBagUtils.HORIZONTAL, GridBagUtils.BASELINE_LEADING, 0.5, 0.0));
areaDetails = new JTextArea();
areaDetails.setRows(3);
builder.addScrolled(areaDetails, builder.gbcSet(0, 5, GridBagUtils.BOTH, GridBagUtils.LINE_START, 4, 1, 1.0, 1.0));
}
/**
* Add all the labels.
*
* @param builder The frame builder.
*/
private static void addLabels(I18nPanelBuilder builder) {
builder.addI18nLabel("log.view.log", PanelBuilder.BOLD, builder.gbcSet(0, 1, GridBagUtils.NONE, GridBagUtils.BASELINE_TRAILING));
builder.addI18nLabel("log.view.source", PanelBuilder.BOLD, builder.gbcSet(0, 2, GridBagUtils.NONE, GridBagUtils.BASELINE_TRAILING));
builder.addI18nLabel("log.view.level", PanelBuilder.BOLD, builder.gbcSet(0, 3, GridBagUtils.NONE, GridBagUtils.BASELINE_TRAILING));
builder.addI18nLabel("log.view.date", PanelBuilder.BOLD, builder.gbcSet(2, 1, GridBagUtils.NONE, GridBagUtils.BASELINE_TRAILING));
builder.addI18nLabel("log.view.time", PanelBuilder.BOLD, builder.gbcSet(2, 2, GridBagUtils.NONE, GridBagUtils.BASELINE_TRAILING));
builder.addI18nLabel("log.view.details", builder.gbcSet(0, 4, GridBagUtils.NONE, GridBagUtils.BASELINE_LEADING, 4, 1));
}
@Override
public void valueChanged(ListSelectionEvent e) {
if (tableEvents.getSelectedRowCount() > 0) {
Event event = eventsModel.getValueAt(tableEvents.getSelectedRow());
labelTitle.setText(getMessage(event.getTitleKey()));
labelLog.setText(event.getLog());
labelSource.setText(event.getSource());
labelLevel.setText(getMessage(event.getLevel().getKey()));
labelDate.setText(dateFormat.format(event.getDate()));
labelTime.setText(timeFormat.format(event.getDate()));
areaDetails.setText(getMessage(event.getDetailsKey()));
}
}
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
eventsModel.setLog((String) e.getItem());
}
}
}