summaryrefslogblamecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod/gui/control/ImageListViewer.java
blob: 02927ab234cb9d1aa424dd6cca33774e881f4eb9 (plain) (tree)
1
2
3
4
5
6
7
8
9






                                       

                                              








                               
                                       


                                          
                               
                                                      
                                              

                                                       
                                                                
                                                 
                                                                  


                                                  
                                                 




                                             
                                                                                     



                                                  





                                                                                                                                              
 

































                                                                                                                                                





                                                     
                                                 



                                         
                                          



                                    
                                  

                                                            
 



                                                           
                                                                  


                                                                                       
                                                          




                                                 


                                              
                                                                            
                               
                                                                                          


















                                                                                          










                                                                                                                          















                                                                                  

























                                                                                                  
                 


                                                                                                          





















                                                                                                      
                                           



                                  
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;
	}

}