All Downloads are FREE. Search and download functionalities are using the official Maven repository.

czsem.netgraph.util.AddRemoveListsManager Maven / Gradle / Ivy

package czsem.netgraph.util;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Enumeration;
import java.util.List;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.ListModel;
import javax.swing.WindowConstants;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;

import thirdparty.ListAction;
import czsem.fs.depcfg.DependencySettings;


public class AddRemoveListsManager extends Container {
	private static final long serialVersionUID = -5447255357679644238L;
	private static final int defaultInset = 5;
	private static final Insets defaultInsets = new Insets(defaultInset, defaultInset, defaultInset, defaultInset);

	public static void main(String[] args) throws Exception {
		JFrame fr = new JFrame(AddRemoveListsManager.class.getName());
	    fr.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
	
		
	    AddRemoveListsManager qd = new AddRemoveListsManager<>();
		qd.initComponents();
		
		qd.addLeftModelSynchronization(DependencySettings.getSelected().getDependencyNames());
		qd.addRightModelSynchronization(DependencySettings.getAvailable().getDependencyNames());
		
		fr.add(qd);
		
		fr.pack();
		fr.setVisible(true);

	}


	private JList listRight;
	private JList listLeft;
	private DefaultListModel modelRight;
	private DefaultListModel modelLeft;

	private ListDataSynchronizer syncRight;
	private ListDataSynchronizer syncLeft;

	public static void addMiddleButton(Container panel, String caption, ActionListener actionListener){
		JButton b = new JButton(caption);
		b.addActionListener(actionListener);
		b.setAlignmentX(0.5f);
		panel.add(b);
		panel.add(Box.createRigidArea(new Dimension(0, 10)));
	}

	public JList createList(ListModel model, Action actionEvent) {
		JList listRet = new JList<>(model);
		new ListAction(listRet, actionEvent);
		listRet.setPreferredSize(new Dimension(100, 50));
		return listRet;
	}

	protected void addListLabel(String textLabel, int gridx){
		GridBagConstraints c = new GridBagConstraints();
		c.gridx = gridx;
		c.gridy = 0;
		c.weighty = 0;
		c.weightx = 0;
		c.anchor = GridBagConstraints.SOUTHWEST;
		c.insets = new Insets(defaultInset, defaultInset, 0, 0);
		add(new JLabel(textLabel), c);		
	}
	protected void addList(Component listComponenet, int gridx){
		GridBagConstraints c = new GridBagConstraints();
		c.gridx = gridx;
		c.gridy = 1;
		c.fill = GridBagConstraints.BOTH;
		c.weightx = 1;
		c.weighty = 1;
		c.insets = defaultInsets;
		add(listComponenet, c);
	}
	
	@SuppressWarnings("unchecked")
	protected E createModelObjectFromString(String str) {
		return (E) str;
	}
	
	
	@SuppressWarnings("serial")
	public void initComponents() {
		setLayout(new GridBagLayout());
		
		listRight = createList(modelRight = new DefaultListModel<>(), new AbstractAction() {
			@Override
			public void actionPerformed(ActionEvent e) { commandAdd(); }});

		listLeft = createList(modelLeft = new DefaultListModel<>(), new AbstractAction() {
			@Override
			public void actionPerformed(ActionEvent e) {commandRemove();}}); 
		
		
		addListLabel("Selected:", 0);
		addList(listLeft, 0);
		
		//Add button
		JPanel panelRight = new JPanel(new BorderLayout());
		JPanel panelAdd = new JPanel(new BorderLayout());
		
		panelRight.add(listRight, BorderLayout.CENTER);
		panelRight.add(panelAdd, BorderLayout.SOUTH);
		addListLabel("Available:", 2);
		addList(panelRight, 2);

		final JTextField textFieldAdd = new JTextField();
		panelAdd.add(textFieldAdd, BorderLayout.CENTER);
		JButton buttonAdd = new JButton("Add");
		buttonAdd.setMargin(new Insets(1, 1, 1, 1));
		buttonAdd.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				addTextToRightList(createModelObjectFromString(textFieldAdd.getText()));
			}
		});
		panelAdd.add(buttonAdd, BorderLayout.EAST);
		
		//Middle Buttons
		GridBagConstraints c = new GridBagConstraints();
		c.gridx = 1;
		c.gridy = 0;
		c.gridheight = 2;
		c.insets = defaultInsets;
		JPanel panelMiddle = new JPanel();
		panelMiddle.setLayout(new BoxLayout(panelMiddle, BoxLayout.Y_AXIS));
		
		addMiddleButton(panelMiddle, "<", new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) { commandAdd(); }});
		addMiddleButton(panelMiddle, ">", new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) { commandRemove(); }});
		addMiddleButton(panelMiddle, "<<", new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) { commandAddAll(); }});
		addMiddleButton(panelMiddle, ">>", new ActionListener() {;
		@Override
		public void actionPerformed(ActionEvent e) { commandRemoveAll(); }});
		add(panelMiddle, c);
		
		
		
	}

	protected void commandRemoveAll() {
		moveAllElements(listLeft, listRight);
	}

	protected void commandAddAll() {
		moveAllElements(listRight, listLeft);
	}

	public void moveAllElements(JList removeFrom, JList addTo) {
		for (int i = 0, size = removeFrom.getModel().getSize(); i < size; i++) {
			moveElement(removeFrom, addTo, removeFrom.getModel().getElementAt(0));
		}
	}

	public void moveSelectedElement(JList removeFrom, JList addTo) {
		E sel = removeFrom.getSelectedValue();
		if (sel == null) return;
		moveElement(removeFrom, addTo, sel);
	}

	public void moveElement(JList removeFrom, JList addTo, E value) {
		((DefaultListModel) removeFrom.getModel()).removeElement(value);
		((DefaultListModel) addTo.getModel()).addElement(value);		
	}

	
	protected void commandRemove() {
		moveSelectedElement(listLeft, listRight);
	}

	protected void commandAdd() {
		moveSelectedElement(listRight, listLeft);
	}

	protected void addTextToRightList(E text) {
		if (modelRight.contains(text)) {
			modelRight.removeElement(text);
		}
		if (modelLeft.contains(text)) {
			modelLeft.removeElement(text);
		}
		modelRight.addElement(text);		
	}
	
	public void addLeftModelSynchronization(List orig) {
		syncLeft = addModelSynchronization(modelLeft, orig);
	}

	public void addRightModelSynchronization(List orig) {
		syncRight = addModelSynchronization(modelRight, orig);
	}

	public ListDataSynchronizer addModelSynchronization(DefaultListModel model, List orig) {
		ListDataSynchronizer sync = new ListDataSynchronizer<>(orig, model);
		model.addListDataListener(sync);
		return sync;
	}

	
	public static class ListDataSynchronizer implements ListDataListener {
		protected ListDataSynchronizer(List origin, DefaultListModel model) {
			this.origin = origin;
			this.model = model;
		}
		private List origin;
		private DefaultListModel model;
		
		private boolean runningSynchronizeToModel = false;

		
		public void synchronizeToOrig() {
			if (runningSynchronizeToModel) return;
			
			origin.clear();
			
			//@SuppressWarnings({ "unchecked", "rawtypes" })
			//Collection list = (Collection) Arrays.asList(model.toArray());
			//set.addAll(list);
			
			for (Enumeration enumeration = model.elements(); enumeration.hasMoreElements(); ) {
				E e = enumeration.nextElement();
				origin.add(e);
			}
		}

		public void synchronizeToModel() {
			runningSynchronizeToModel = true;

			model.clear();
			for (E s : origin) {
				model.addElement(s);
			}
			
			runningSynchronizeToModel = false;
		}
		
		@Override
		public void intervalRemoved(ListDataEvent e) {synchronizeToOrig();}			
		@Override
		public void intervalAdded(ListDataEvent e) {synchronizeToOrig();}			
		@Override
		public void contentsChanged(ListDataEvent e) {synchronizeToOrig();}
		
	}

	public void synchronizeModels() {
		syncLeft.synchronizeToModel();
		syncRight.synchronizeToModel();
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy