package org.openslx.dozmod.gui.control;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.UIManager;
import javax.swing.border.TitledBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.apache.log4j.Logger;
import org.openslx.bwlp.thrift.iface.ImageSummaryRead;
import org.openslx.bwlp.thrift.iface.UserInfo;
import org.openslx.dozmod.gui.Gui;
import org.openslx.dozmod.gui.control.table.ImageTable;
import org.openslx.dozmod.gui.control.table.ListTable.ListModel;
import org.openslx.dozmod.gui.helper.GridManager;
import org.openslx.dozmod.gui.window.layout.ImageListWindowLayout;
import org.openslx.dozmod.permissions.ImagePerms;
import org.openslx.dozmod.thrift.Session;
import org.openslx.dozmod.thrift.cache.ImageCache;
import org.openslx.dozmod.thrift.cache.UserCache;
import org.openslx.util.QuickTimer;
import org.openslx.util.QuickTimer.Task;
@SuppressWarnings("serial")
public class ImageListViewer extends JLabel {
private final static Logger LOGGER = Logger.getLogger(ImageListViewer.class);
protected JTextField searchTextField;
protected ImageTable imageTable;
protected JComboBox<FilterType> filterCbo;
private final RowFilter<ListModel<ImageSummaryRead>, Integer> filterEditable = new RowFilter<ListModel<ImageSummaryRead>, Integer>() {
@Override
public boolean include(Entry<? extends ListModel<ImageSummaryRead>, ? extends Integer> entry) {
return ImagePerms.canEdit(imageTable.getModelRow(entry.getIdentifier()));
}
};
private final RowFilter<ListModel<ImageSummaryRead>, Integer> filterTemplate = new RowFilter<ListModel<ImageSummaryRead>, Integer>() {
public boolean include(Entry<? extends ListModel<ImageSummaryRead>, ? extends Integer> entry) {
return imageTable.getModelRow(entry.getIdentifier()).isTemplate;
}
};
private final RowFilter<ListModel<ImageSummaryRead>, Integer> filterOwn = new RowFilter<ListModel<ImageSummaryRead>, Integer>() {
public boolean include(Entry<? extends ListModel<ImageSummaryRead>, ? extends Integer> entry) {
return imageTable.getModelRow(entry.getIdentifier()).ownerId.equals(Session.getUserId());
}
};
private Pattern searchFieldPattern = null;
private final RowFilter<ListModel<ImageSummaryRead>, Integer> filterSearchTerm = new RowFilter<ListModel<ImageSummaryRead>, Integer>() {
public boolean include(Entry<? extends ListModel<ImageSummaryRead>, ? extends Integer> entry) {
ImageSummaryRead image = imageTable.getModelRow(entry.getIdentifier());
if (searchFieldPattern.matcher(image.imageName).find())
return true;
UserInfo user = UserCache.find(image.ownerId);
if (user == null)
return false;
if (searchFieldPattern.matcher(user.firstName).find())
return true;
if (searchFieldPattern.matcher(user.lastName).find())
return true;
if (searchFieldPattern.matcher(user.eMail).find())
return true;
return false;
}
};
protected static enum FilterType {
ALL("Alle anzeigen"),
OWN("Nur eigene Anzeigen"),
EDITABLE("Nur editierbare anzeigen"),
TEMPLATES("Nur Vorlagen zeigen");
private final String name;
private FilterType(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
public ImageListViewer() {
super();
GridManager grid = new GridManager(this, 1);
// --------------------------------------
// the panel for the table and search field
// the search field and filter combo box
JPanel filterPanel = new JPanel();
filterPanel.setBorder(new TitledBorder("Suchen"));
filterPanel.setLayout(new BoxLayout(filterPanel, BoxLayout.LINE_AXIS));
searchTextField = new JTextField();
filterCbo = new JComboBox<FilterType>();
for (FilterType s : FilterType.values()) {
filterCbo.addItem(s);
}
filterPanel.add(searchTextField);
filterPanel.add(filterCbo);
// the actual table
imageTable = new ImageTable();
grid.add(filterPanel).fill(true, false).expand(true, false);
grid.nextRow();
grid.add(new JScrollPane(imageTable)).fill(true, true).expand(true, true);
grid.finish(false);
/**
* ActionListeners
*/
// filter the objects in the table depending on the search field
searchTextField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
changedUpdate(e);
}
@Override
public void insertUpdate(DocumentEvent e) {
changedUpdate(e);
}
@Override
public void changedUpdate(DocumentEvent e) {
String str = searchTextField.getText();
if (str == null || str.isEmpty()) {
searchFieldPattern = null;
} else {
try {
searchFieldPattern = Pattern.compile(str, Pattern.CASE_INSENSITIVE);
searchTextField.setForeground(UIManager.getColor("TextField.foreground"));
} catch (PatternSyntaxException ex) {
searchTextField.setForeground(Color.RED);
}
}
applyFilterOnTable();
}
});
filterCbo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
applyFilterOnTable();
}
});
}
/**
* Filters the image list according to the filter text entered by the user
*/
private void applyFilterOnTable() {
// List for filters
List<RowFilter<ListModel<ImageSummaryRead>, Integer>> filters = new ArrayList<>();
// string for text in filter text field
if (searchFieldPattern != null) {
filters.add(filterSearchTerm);
}
FilterType filterType = (FilterType) filterCbo.getSelectedItem();
switch (filterType) {
case ALL:
// no additional filters
break;
case OWN:
// filter for owner
filters.add(filterOwn);
break;
case EDITABLE:
// filter for editable
filters.add(filterEditable);
break;
case TEMPLATES:
// show only templates
filters.add(filterTemplate);
default:
break;
}
// for using multiple filters
RowFilter<ListModel<ImageSummaryRead>, Integer> andFilters = RowFilter.andFilter(filters);
imageTable.getRowSorter().setRowFilter(andFilters);
}
/**
* Refreshes the image list in the table
*
* @param forceRefresh true to force a refresh, false to use the cached list
*/
public void refreshList(final boolean forceRefresh, int delay) {
QuickTimer.scheduleOnce(new Task() {
@Override
public void fire() {
final List<ImageSummaryRead> imageList = ImageCache.get(forceRefresh);
Gui.asyncExec(new Runnable() {
@Override
public void run() {
imageTable.setData(imageList, true);
}
});
}
}, delay);
}
public ImageTable getImageTable() {
return imageTable;
}
}