/*
* 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.preferences;
import de.huxhorn.lilith.swing.Icons;
import de.huxhorn.sulky.swing.Windows;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.HashMap;
import java.util.Map;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JToolBar;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SourcesPanel
extends JPanel
{
private static final long serialVersionUID = -1430756927138063766L;
final Logger logger = LoggerFactory.getLogger(SourcesPanel.class);
private JTable sourceNameTable;
private SourceNameTableModel sourceNameTableModel;
private EditSourceNameAction editSourceNameAction;
private RemoveSourceNameAction removeSourceNameAction;
private EditSourceNameDialog editSourceNameDialog;
private PreferencesDialog preferencesDialog;
public SourcesPanel(PreferencesDialog preferencesDialog)
{
this.preferencesDialog = preferencesDialog;
createUI();
}
private void createUI()
{
setLayout(new BorderLayout());
editSourceNameDialog = new EditSourceNameDialog(preferencesDialog);
Map<String, String> sourceNames = new HashMap<>();
sourceNameTableModel = new SourceNameTableModel(sourceNames);
sourceNameTable = new JTable(sourceNameTableModel);
sourceNameTable.setAutoCreateRowSorter(true);
sourceNameTable.addMouseListener(new SourceNameTableMouseListener());
JScrollPane sourceNameTableScrollPane = new JScrollPane(sourceNameTable);
JPanel sourceNamesPanel = new JPanel(new GridLayout(1, 1));
sourceNamesPanel.add(sourceNameTableScrollPane, BorderLayout.CENTER);
JToolBar sourceNamesToolbar = new JToolBar();
sourceNamesToolbar.setFloatable(false);
ListSelectionModel sourceNameRowSelectionModel = sourceNameTable.getSelectionModel();
sourceNameRowSelectionModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
sourceNameRowSelectionModel.addListSelectionListener(new SourceNameTableRowSelectionListener());
AddSourceNameAction addSourceNameAction = new AddSourceNameAction();
editSourceNameAction = new EditSourceNameAction();
removeSourceNameAction = new RemoveSourceNameAction();
JButton addSourceNameButton = new JButton(addSourceNameAction);
JButton editSourceNameButton = new JButton(editSourceNameAction);
JButton removeSourceNameButton = new JButton(removeSourceNameAction);
sourceNamesToolbar.add(addSourceNameButton);
sourceNamesToolbar.add(editSourceNameButton);
sourceNamesToolbar.add(removeSourceNameButton);
add(sourceNamesToolbar, BorderLayout.NORTH);
add(sourceNamesPanel, BorderLayout.CENTER);
}
public void initUI()
{
Map<String, String> sourceNames = preferencesDialog.getSourceNames();
sourceNameTableModel.setData(sourceNames);
updateSourceNames();
}
public void updateSourceNames()
{
int selectedRow = sourceNameTable.getSelectedRow();
if(logger.isDebugEnabled()) logger.debug("selectedRow={}", selectedRow);
// no need to call convert since we only want to know if selected or not.
editSourceNameAction.setEnabled(selectedRow != -1);
removeSourceNameAction.setEnabled(selectedRow != -1);
}
public void editSourceName(final String sourceIdentifier)
{
Map<String, String> data = sourceNameTableModel.getData();
if(data.containsKey(sourceIdentifier))
{
editSourceName(sourceIdentifier, false);
}
else
{
editSourceName(sourceIdentifier, true);
}
}
public void editSourceName(final String sourceIdentifier, boolean add)
{
Map<String, String> data = sourceNameTableModel.getData();
String sourceName = data.get(sourceIdentifier);
if(sourceName == null)
{
sourceName = "";
}
editSourceNameDialog.setSourceIdentifier(sourceIdentifier);
editSourceNameDialog.setSourceName(sourceName);
editSourceNameDialog.setAdding(add);
Windows.showWindow(editSourceNameDialog, preferencesDialog, true);
if(!editSourceNameDialog.isCanceled())
{
String newIdentifier = editSourceNameDialog.getSourceIdentifier();
newIdentifier = newIdentifier.trim();
sourceName = editSourceNameDialog.getSourceName();
sourceName = sourceName.trim();
preferencesDialog.setSourceName(sourceIdentifier, newIdentifier, sourceName);
}
}
private int convertSourceNameRow(int row)
{
return sourceNameTable.convertRowIndexToModel(row);
}
private class SourceNameTableRowSelectionListener
implements ListSelectionListener
{
public void valueChanged(ListSelectionEvent e)
{
updateSourceNames();
}
}
private class AddSourceNameAction
extends AbstractAction
{
private static final long serialVersionUID = 2159800920473132058L;
AddSourceNameAction()
{
super("Add");
putValue(Action.SMALL_ICON, Icons.ADD_16_ICON);
putValue(Action.SHORT_DESCRIPTION, "Add a new Source Name.");
}
public void actionPerformed(ActionEvent e)
{
if(logger.isDebugEnabled()) logger.debug("Add");
editSourceName("", true);
}
}
private class EditSourceNameAction
extends AbstractAction
{
private static final long serialVersionUID = -6686916429941183752L;
EditSourceNameAction()
{
super("Edit");
putValue(Action.SMALL_ICON, Icons.ADD_16_ICON);
putValue(Action.SHORT_DESCRIPTION, "Edit a Source Name.");
}
public void actionPerformed(ActionEvent e)
{
if(logger.isDebugEnabled()) logger.debug("Edit");
int row = sourceNameTable.getSelectedRow();
if(row >= 0)
{
row = convertSourceNameRow(row);
String sourceIdentifier = (String) sourceNameTableModel
.getValueAt(row, SourceNameTableModel.SOURCE_IDENTIFIER_COLUMN);
editSourceName(sourceIdentifier, false);
}
}
}
private class RemoveSourceNameAction
extends AbstractAction
{
private static final long serialVersionUID = -4376772972629739348L;
RemoveSourceNameAction()
{
super("Remove");
putValue(Action.SMALL_ICON, Icons.REMOVE_16_ICON);
putValue(Action.SHORT_DESCRIPTION, "Remove the selected Source Name.");
}
public void actionPerformed(ActionEvent e)
{
if(logger.isDebugEnabled()) logger.debug("Remove");
int row = sourceNameTable.getSelectedRow();
if(row >= 0)
{
// this removes the row...
row = convertSourceNameRow(row);
sourceNameTableModel.setValueAt("", row, 0);
}
}
}
private class SourceNameTableMouseListener
implements MouseListener
{
private final Logger logger = LoggerFactory.getLogger(SourceNameTableMouseListener.class);
SourceNameTableMouseListener()
{
}
public void mouseClicked(MouseEvent evt)
{
if(evt.getClickCount() >= 2 && evt.getButton() == MouseEvent.BUTTON1)
{
Point p = evt.getPoint();
int row = sourceNameTable.rowAtPoint(p);
row = convertSourceNameRow(row);
if(logger.isDebugEnabled()) logger.debug("Source-Name-Row: {}", row);
if(row >= 0)
{
String source = (String) sourceNameTableModel
.getValueAt(row, SourceNameTableModel.SOURCE_IDENTIFIER_COLUMN);
if(source == null)
{
source = "";
}
editSourceName(source, false);
if(logger.isInfoEnabled()) logger.info("After show...");
}
}
else if(evt.isPopupTrigger())
{
showPopup(evt);
}
}
/**
* @param evt the mouse event
* @noinspection UNUSED_SYMBOL,UnusedDeclaration
*/
private void showPopup(MouseEvent evt)
{
}
public void mousePressed(MouseEvent evt)
{
if(evt.isPopupTrigger())
{
showPopup(evt);
}
}
public void mouseReleased(MouseEvent evt)
{
if(evt.isPopupTrigger())
{
showPopup(evt);
}
}
public void mouseEntered(MouseEvent e)
{
}
public void mouseExited(MouseEvent e)
{
}
}
}