summaryrefslogblamecommitdiffstats
path: root/dozentenmodul/src/main/java/org/openslx/dozmod/gui/configurator/LdapFilterConfigurator.java
blob: 08fd52da1031f264b813fcc2622abc7256b98b31 (plain) (tree)
1
2
3
4
5
6
7
8
9
                                            





                                     
                         
                      
                     


                                 










                                                
                                                                

                                                    
                                                                   



                                                                   
                                                     







                                                                                            














                                                                                                     
                                                                                





                                                                                        




                                                                                                                

                                                                     



















                                                                                                                     
                                                                                                     
                                                                                                          
                                


                                                                                               
                                                                 



                                                                                                                       

                                                                                            
                                                                                                 
                                                                 
                                 
                                                      
                                                                   







                                                                    
                                                                                             



                                                        
                                                                                                                  
                                                                         

                                                                                                                            
                                                                                                                  


                                                             
                                                                           





                                                                                                                               
                                   









                                              
                                                                         
                                    
                                                   






                                                                            

         
                                                                                      

                                     
                                                                         
                                                                    
                                                                                   

                                              


                                                                                             
                         
                 
                                                               

















                                                                                                            

                                                                           
                                              

         




















                                                                                                                         
                                                                                            









                                                                                          
                                                                                  
                                                                                                    

                                                          
                                                                                         



                                                                                  
                                                    
                                                                          






                                                                            
package org.openslx.dozmod.gui.configurator;

import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.ChangeListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;

import org.apache.log4j.Logger;
import org.openslx.bwlp.thrift.iface.LdapFilter;
import org.openslx.dozmod.gui.Gui;
import org.openslx.dozmod.gui.changemonitor.DialogChangeMonitor;
import org.openslx.dozmod.gui.control.QLabel;
import org.openslx.dozmod.gui.control.WordWrapLabel;
import org.openslx.dozmod.gui.control.table.CheckListTable.Wrapper;
import org.openslx.dozmod.gui.control.table.LectureLdapFilterTable;
import org.openslx.dozmod.gui.control.table.QScrollPane;
import org.openslx.dozmod.gui.helper.GridManager;
import org.openslx.dozmod.gui.helper.MessageType;
import org.openslx.dozmod.thrift.cache.MetaDataCache;

/**
 * Widget for network share configuration of lectures
 */
public class LdapFilterConfigurator extends LdapFilterConfiguratorLayout {

	private static final long serialVersionUID = -3336605759245603655L;
	private final static Logger LOGGER = Logger.getLogger(LdapFilterConfigurator.class);

	public LdapFilterConfigurator() {

		super();

		tblFilters.getModel().addTableModelListener(new TableModelListener() {
			@Override
			public void tableChanged(TableModelEvent e) {
				fireChangeEvent();
			}
		});

		tblFilters.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
			@Override
			public void valueChanged(ListSelectionEvent e) {
				LdapFilter item = tblFilters.getSelectedItem2();
				boolean editable = (item == null || item.filterId == 0);
				txtAttribute.setEditable(editable);
				txtValue.setEditable(editable);
				btnAdd.setEnabled(editable);
				btnDel.setEnabled(editable);
				btnAdd.setText("Ändern");
				if (item == null) {
					clearInputFields();
					return;
				}
				// share from the list is selected: fill bottom form and change "Add" to "Apply"
				txtAttribute.setText(item.attribute);
				txtValue.setText(item.value);
			}
		});

		btnAdd.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// check if we are editing an existing share entry or
				// creating a new one, check for input either way
				LdapFilter input = new LdapFilter();

				input.attribute = txtAttribute.getText();
				if (input.attribute == null || input.attribute.isEmpty()) {
					Gui.showMessageBox("Kein Attribut angegeben", MessageType.ERROR, null, null);
					return;
				}
				input.value = txtValue.getText();
				if (input.value == null) {
					input.value = "";
				}
				
				Wrapper<LdapFilter> newEntry = new Wrapper<LdapFilter>(input, false);
				List<Wrapper<LdapFilter>> oldList = new ArrayList<>(tblFilters.getData());
				
				// either we delete the existing share from the data or we are
				// creating a new one, either way add it to the list and update
				// the table, if its not present already
				if (oldList.contains(newEntry)) {
					Gui.showMessageBox("Eintrag bereits vorhanden", MessageType.ERROR, null, null);
					return;
				}
				// now decide whether to create a new entry or update existing one
				Wrapper<LdapFilter> oldEntry = tblFilters.getSelectedItem();
				if (oldEntry != null && oldList.contains(oldEntry)) {
					// editing existing one, delete it from the internal data
					oldList.remove(oldEntry);
				}
				oldList.add(newEntry);
				tblFilters.setData(oldList, false);
				clearInputFields();
			}
		});

		btnDel.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// try to delete the selected share
				Wrapper<LdapFilter> selection = tblFilters.getSelectedItem();
				if (selection == null) {
					return;
				}
				try {
					List<Wrapper<LdapFilter>> oldList = new ArrayList<>(tblFilters.getData());
					if (!oldList.remove(selection)) {
						// false if it was not found
						LOGGER.error("Could not remove non-existent filter '" + selection.toString()
								+ "' from the table data: " + oldList.toString());
						return;
					}
					// refresh table data
					tblFilters.setData(oldList, false);
				} catch (Exception ex) {
					LOGGER.debug("Failed to remove " + selection.toString() + " from the table data.", ex);
					return;
				}
			}
		});
		clearInputFields();
	}

	private void clearInputFields() {
		btnDel.setEnabled(false);
		txtAttribute.setText(null);
		txtValue.setText(null);
		btnAdd.setText("Hinzufügen");
	}

	public List<LdapFilter> getState() {
		List<Wrapper<LdapFilter>> current = tblFilters.getData();
		if (current == null)
			return new ArrayList<>(0);;
		ArrayList<LdapFilter> ret = new ArrayList<>(current.size());
		for (Wrapper<LdapFilter> item : current) {
			if (item.isChecked() || item.item.filterId == 0) {
				ret.add(item.item);
			}
		}
		return ret;
	}

	public boolean setState(List<LdapFilter> data, List<Integer> predefSelected) {
		if (data == null)
			return false;
		ArrayList<LdapFilter> filterList = new ArrayList<>(data);
		Set<LdapFilter> checked = new HashSet<LdapFilter>();
		List<LdapFilter> predef = MetaDataCache.getPredefinedLdapFilters();
		// Now add remaining filters
		for (LdapFilter pd : predef) {
			filterList.add(pd);
			if (predefSelected != null && predefSelected.contains(pd.filterId)) {
				checked.add(pd);
			}
		}
		tblFilters.setData(filterList, checked, false);
		return true;
	}

	protected List<ChangeListener> listenerList = new ArrayList<>();

	public void addLdapFilterListTableContentConfigurationChangeEventListener(ChangeListener listener) {
		listenerList.add(listener);
	}

	public void removeNetshareConfigurationChangeEventListener(ChangeListener listener) {
		listenerList.remove(listener);
	}

	void fireChangeEvent() {
		for (ChangeListener listener : new ArrayList<>(listenerList)) {
			listener.stateChanged(null);
		}
	}

	public void addToChangeMonitor(DialogChangeMonitor changeMonitor) {
		changeMonitor.add(tblFilters);
	}

}

/**
 * Internal layout class for this widget
 */
class LdapFilterConfiguratorLayout extends JPanel {

	private static final long serialVersionUID = 6479838641542743622L;

	private final static String HELPTEXT = "Geben Sie hier LDAP Filter ein, die die Sichtbarkeit"
			+ " der Veranstaltung abhängig vom angemeldeten Benutzer einschränken. Eine Veranstaltung"
			+ " ist sichtbar, sobald einer der angegebenen Filter zutrifft. Zusätzliche Raumbeschränkungen"
			+ " greifen weiterhin.";

	protected final LectureLdapFilterTable tblFilters = new LectureLdapFilterTable();
	protected final JTextField txtAttribute, txtValue;
	protected final JButton btnAdd, btnDel;

	public LdapFilterConfiguratorLayout() {
		GridManager grid = new GridManager(this, 1, true, new Insets(3, 3, 3, 3));
		// top info panel
		grid.add(new WordWrapLabel(HELPTEXT)).fill(true, false).expand(true, false);
		grid.nextRow();
		// middle filter list
		grid.add(new QScrollPane(tblFilters)).fill(true, true).expand(true, true);
		grid.nextRow();
		
		btnDel = new JButton("Entfernen");
		grid.add(btnDel).anchor(GridBagConstraints.EAST);
		grid.nextRow();

		JPanel pnlNewShare = new JPanel();
		GridManager gridNewFilter = new GridManager(pnlNewShare, 3, true);
		pnlNewShare.setBorder(BorderFactory.createTitledBorder("Eigene Filter definieren"));
		gridNewFilter.add(new QLabel("Attribut"));
		txtAttribute = new JTextField();
		gridNewFilter.add(txtAttribute, 2).fill(true, false).expand(true, false);
		gridNewFilter.nextRow();
		gridNewFilter.add(new QLabel("Wert"));
		txtValue = new JTextField();
		gridNewFilter.add(txtValue).fill(true, false).expand(true, false);
		btnAdd = new JButton("Hinzufügen");
		gridNewFilter.add(btnAdd).anchor(GridBagConstraints.EAST);
		gridNewFilter.nextRow();
		gridNewFilter.finish(false);
		grid.add(pnlNewShare).fill(true, false).expand(true, false);
		grid.nextRow();
		grid.finish(false);
	}
}