package com.google.code.joto.ui.filter;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.filechooser.FileNameExtensionFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.code.joto.util.ui.IconUtils;
import com.google.code.joto.util.ui.JButtonUtils;
/**
* simple swing Table Panel containing RecordEventFilter table + detailed viewer/editor
*
*/
public class RecordEventFilterFileTablePanel {
private static Logger log = LoggerFactory.getLogger(RecordEventFilterFileTablePanel.class);
private JPanel panel;
private RecordEventFilterFileTableModel filterFilesTableModel;
private JPanel filterFilesTablePane;
private JPanel filterFilesTableToolbar;
private JScrollPane filterFilesTableScrollPane;
private JTable filterFilesTable;
private JButton editFilterFileButton;
private JButton newFilterFileButton;
private JButton deleteFilterFileButton;
private JButton importFilterFileButton;
private JButton removeFilterFileButton;
private JButton saveAllFilterFilesButton;
private JButton reloaAlldFilterFilesButton;
private RecordEventFilterFilesPreferences preferences = new RecordEventFilterFilesPreferences();
// ------------------------------------------------------------------------
public RecordEventFilterFileTablePanel(RecordEventFilterFileTableModel tableModel) {
this.filterFilesTableModel = tableModel;
initComponents();
}
private void initComponents() {
panel = new JPanel(new BorderLayout());
filterFilesTablePane = new JPanel(new BorderLayout());
filterFilesTable = new JTable(filterFilesTableModel);
filterFilesTableScrollPane = new JScrollPane(filterFilesTable);
filterFilesTablePane.add(filterFilesTableScrollPane, BorderLayout.CENTER);
filterFilesTable.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
openSelectedFilterFileEditors();
}
}
});
panel.add(filterFilesTablePane, BorderLayout.CENTER);
filterFilesTable.setPreferredScrollableViewportSize(new Dimension(600, 200));
{
// toolbar buttons for Add / Remove .. in table
filterFilesTableToolbar = new JPanel(new FlowLayout());
filterFilesTablePane.add(filterFilesTableToolbar, BorderLayout.SOUTH);
editFilterFileButton = JButtonUtils.snew(IconUtils.eclipseGif.get("edit"), "Edit", this, "onEditFilterButton");
filterFilesTableToolbar.add(editFilterFileButton);
newFilterFileButton = JButtonUtils.snew(IconUtils.eclipseGif.get("new"), "New", this, "onNewFilterButton");
filterFilesTableToolbar.add(newFilterFileButton);
deleteFilterFileButton = JButtonUtils.snew(IconUtils.eclipseGif.get("delete"), "Delete", this, "onDeleteFilterButton");
filterFilesTableToolbar.add(deleteFilterFileButton);
importFilterFileButton = JButtonUtils.snew(IconUtils.eclipseGif.get("add"), "Import ...", this, "onImportFilterFileButton");
filterFilesTableToolbar.add(importFilterFileButton);
removeFilterFileButton = JButtonUtils.snew(IconUtils.eclipseGif.get("remove"), "Remove", this, "onRemoveFilterFileButton");
filterFilesTableToolbar.add(removeFilterFileButton);
saveAllFilterFilesButton = JButtonUtils.snew(IconUtils.eclipseGif.get("saveAll"), "Save All Files", this, "onSaveAllFilterFilesButton");
filterFilesTableToolbar.add(saveAllFilterFilesButton);
reloaAlldFilterFilesButton = JButtonUtils.snew(IconUtils.eclipseGif.get("reloadAll"), "Reload All Files", this, "onReloadAllFilterFilesButton");
filterFilesTableToolbar.add(reloaAlldFilterFilesButton);
}
}
// ------------------------------------------------------------------------
public JComponent getJComponent() {
return panel;
}
public RecordEventFilterFilesPreferences getPreferences() {
return preferences;
}
public void setPreferences(RecordEventFilterFilesPreferences p) {
this.preferences = p;
}
private List<RecordEventFilterFile> getSelectedItems() {
List<RecordEventFilterFile> items = new ArrayList<RecordEventFilterFile>();
int[] selectedViewRows = filterFilesTable.getSelectedRows();
if (selectedViewRows != null && selectedViewRows.length != 0) {
for(int viewRow : selectedViewRows) {
int modelRow = viewRow; // no conversion model->view for sort yet?
RecordEventFilterFile item = filterFilesTableModel.getRow(modelRow);
if (item != null) {
items.add(item);
}
}
}
return items;
}
public List<RecordEventFilterFile> loadFilterFiles(File[] filterFiles,
StringBuilder errorsText, List<File> errorFiles) {
List<RecordEventFilterFile> res = new ArrayList<RecordEventFilterFile>();
if (filterFiles != null && filterFiles.length != 0) {
for(File f : filterFiles) {
try {
RecordEventFilterFile filter = loadFilterFile(f);
res.add(filter);
} catch(Exception ex) {
errorsText.append("failed to import file " + f.getAbsolutePath() + " : " + ex.getMessage());
errorFiles.add(f);
}
}
}
return res;
}
public RecordEventFilterFile loadFilterFile(File f) {
RecordEventFilterFile res = new RecordEventFilterFile();
res.setPersistentFile(f);
// RecordEventFilterFileUtils
return res;
}
public void openFilterFileEditor(RecordEventFilterFile filterFile) {
RecordEventFilterFileEditor editor = new RecordEventFilterFileEditor();
editor.setModel(filterFile);
JFrame frame = new JFrame("Edit FilterFile");
frame.getContentPane().add(editor.getJComponent());
frame.pack();
frame.setVisible(true);
}
protected void openSelectedFilterFileEditors() {
List<RecordEventFilterFile> items = getSelectedItems();
for(RecordEventFilterFile item : items) {
openFilterFileEditor(item);
}
}
// UI Callbacks
// ------------------------------------------------------------------------
public void onEditFilterButton(ActionEvent event) {
openSelectedFilterFileEditors();
}
public void onNewFilterButton(ActionEvent event) {
RecordEventFilterFile item = new RecordEventFilterFile();
// generate a new name and file name (?)
filterFilesTableModel.addRow(item);
openFilterFileEditor(item);
}
public void onDeleteFilterButton(ActionEvent event) {
List<RecordEventFilterFile> items = getSelectedItems();
for(RecordEventFilterFile item : items) {
filterFilesTableModel.removeRow(item);
// also delete file (rename as ".old") !
if (item.getPersistentFile() != null && item.getPersistentFile().exists()) {
File destOldFile = new File(item.getPersistentFile().getAbsolutePath() + ".old");
if (destOldFile.exists()) {
destOldFile.delete(); // do not backup old file ?
}
item.getPersistentFile().renameTo(destOldFile);
}
}
}
public void onImportFilterFileButton(ActionEvent event) {
JFileChooser dlg = new JFileChooser();
if (preferences != null) {
File dir = preferences.getBaseDir();
if (dir != null) {
dlg.setCurrentDirectory(dir);
}
String suffix = preferences.getFileSuffix();
if (suffix != null) {
dlg.setFileFilter(new FileNameExtensionFilter("event filters", suffix));
}
}
dlg.setFileSelectionMode(JFileChooser.FILES_ONLY);
dlg.setMultiSelectionEnabled(true);
if (dlg.showDialog(panel, null) == JFileChooser.APPROVE_OPTION) {
File[] filterFiles = dlg.getSelectedFiles();
StringBuilder errorsText = new StringBuilder();
List<File> errorFiles = new ArrayList<File>();
List<RecordEventFilterFile> loaded = loadFilterFiles(filterFiles, errorsText, errorFiles);
filterFilesTableModel.addRows(loaded);
if (!errorFiles.isEmpty()) {
String msg = "Failed to import " + errorFiles.size() + " / " + filterFiles.length
+ " filter file(s):\n"
+ errorsText;
JOptionPane.showMessageDialog(panel, msg, "Failed to import filter file(s)", JOptionPane.WARNING_MESSAGE, null);
}
}
}
public void onRemoveFilterFileButton(ActionEvent event) {
List<RecordEventFilterFile> items = getSelectedItems();
for(RecordEventFilterFile item : items) {
filterFilesTableModel.removeRow(item);
}
}
public void onSaveAllFilterFilesButton(ActionEvent event) {
for(RecordEventFilterFile item : filterFilesTableModel.getRows()) {
File file = item.getPersistentFile();
if (file != null) {
RecordEventFilterFileUtils.saveFilterFile(item);
}
}
}
public void onReloadAllFilterFilesButton(ActionEvent event) {
for(RecordEventFilterFile item : filterFilesTableModel.getRows()) {
File file = item.getPersistentFile();
if (file != null && file.exists()) {
try {
RecordEventFilterFileUtils.loadFilterFile(item);
} catch(Exception ex) {
log.warn("Failed to reload file " + file + ":" + ex.getMessage() + " .. ignore, no rethrow?");
}
} else {
// filter is not persistent .. not reloaded!
}
}
filterFilesTableModel.fireTableDataChanged(); // implicit from PropChangeListener?
}
}