/*
* Lilith - a log event viewer.
* Copyright (C) 2007-2015 Joern Huxhorn
*
* 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 de.huxhorn.lilith.swing.taskmanager.table;
import de.huxhorn.lilith.swing.TextPreprocessor;
import de.huxhorn.sulky.tasks.Task;
import de.huxhorn.sulky.tasks.TaskManager;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.util.Map;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class TaskTable<T>
extends JTable
{
private static final long serialVersionUID = -7788744990458100395L;
private final Logger logger = LoggerFactory.getLogger(TaskTable.class);
private TaskTableModel<T> taskTableModel;
public TaskTable(TaskManager<T> taskManager)
{
super();
taskTableModel = new TaskTableModel<>(taskManager);
// must be added before setting model to table
taskTableModel.addTableModelListener(new SelectFirstListener());
setModel(taskTableModel);
setColumnModel(new TaskTableColumnModel());
setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
setAutoCreateRowSorter(true);
}
public void setPaused(boolean paused)
{
taskTableModel.setPaused(paused);
if(!paused)
{
selectFirstTask();
}
}
/**
* Selects first task if no task was previously selected.
*/
private void selectFirstTask()
{
if(getSelectedRow() < 0 && getRowCount() > 0)
{
selectRow(0);
}
}
public TaskTableModel<T> getTaskTableModel()
{
return taskTableModel;
}
public Task<T> getTaskAt(Point p, boolean select)
{
int row = rowAtPoint(p);
if(row > -1)
{
row = convertRowIndexToModel(row);
Task<T> result = taskTableModel.getValueAt(row);
if(result != null && select)
{
selectRow(row);
}
return result;
}
return null;
}
public void selectRow(int row)
{
if(row >= 0 && row < getRowCount())
{
if(logger.isDebugEnabled()) logger.debug("Selecting row {}.", row);
getSelectionModel().setSelectionInterval(0, row);
// scrollpane adjustment
scrollRectToVisible(getCellRect(row, 0, true));
}
}
@SuppressWarnings("NullableProblems")
@Override
public String getToolTipText(MouseEvent event)
{
if(event == null)
{
return null;
}
Task<T> task = getTaskAt(event.getPoint(), false);
if(task != null)
{
StringBuilder result = new StringBuilder();
result.append("<html><body>");
result.append("<p>").append(task.getName()).append(" (ID=").append(task.getId()).append(")</p>");
String description = task.getDescription();
if(description != null)
{
result.append("<p>").append(TextPreprocessor.wrapWithPre(TextPreprocessor.cropTextBlock(description))).append("</p>");
}
Map<String, String> metaData = task.getMetaData();
if(metaData != null && metaData.size() > 0)
{
result.append("<table border=\"1\">");
result.append("<tr><th>Key</th><th>Value</th></tr>");
for(Map.Entry<String, String> current : metaData.entrySet())
{
result.append("<tr>");
result.append("<td>");
result.append(TextPreprocessor.cropToSingleLine(current.getKey()));
result.append("</td>");
result.append("<td>");
result.append(TextPreprocessor.cropToSingleLine(current.getValue()));
result.append("</td>");
result.append("</tr>");
}
result.append("</table>");
}
result.append("</body></html>");
return result.toString();
}
return null;
}
private class SelectFirstListener
implements TableModelListener
{
public void tableChanged(TableModelEvent tableModelEvent)
{
selectFirstTask();
}
}
}