Merged current working status of f/icon_util into f/forward__messages
* added ContextMenu * added ContactsChooserDialog
This commit is contained in:
		
							
								
								
									
										184
									
								
								src/main/java/envoy/client/ui/ContextMenu.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								src/main/java/envoy/client/ui/ContextMenu.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,184 @@ | ||||
| package envoy.client.ui; | ||||
|  | ||||
| import java.awt.Component; | ||||
| import java.awt.event.ActionListener; | ||||
| import java.awt.event.MouseAdapter; | ||||
| import java.awt.event.MouseEvent; | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
|  | ||||
| import javax.swing.*; | ||||
|  | ||||
| /** | ||||
|  * This class defines a menu that will be automatically called if | ||||
|  * {@link MouseEvent#isPopupTrigger()} returns true for the parent component. | ||||
|  * The user has the possibility to directly add actions to be performed when | ||||
|  * clicking on the element with the selected String. Additionally, for each | ||||
|  * element an {@link Icon} can be added, but it must not be. | ||||
|  * If the key(text) of an element starts with one of the predefined values, a | ||||
|  * special component will be called: either a {@link JRadioButtonMenuItem}, a | ||||
|  * {@link JCheckBoxMenuItem} or a {@link JMenu} will be created.<br> | ||||
|  * <br> | ||||
|  * Project: <strong>envoy-client</strong><br> | ||||
|  * File: <strong>ContextMenu.java</strong><br> | ||||
|  * Created: <strong>17 Mar 2020</strong><br> | ||||
|  * | ||||
|  * @author Leon Hofmeister | ||||
|  * @since Envoy v0.1-beta | ||||
|  */ | ||||
| public class ContextMenu extends JPopupMenu { | ||||
|  | ||||
| 	private static final long serialVersionUID = 2177146471226992104L; | ||||
|  | ||||
| 	/** | ||||
| 	 * If a key starts with this String, a {@link JCheckBoxMenuItem} will be created | ||||
| 	 */ | ||||
| 	public static final String	checkboxMenuItem	= "ChBoMI"; | ||||
| 	/** | ||||
| 	 * If a key starts with this String, a {@link JRadioButtonMenuItem} will be | ||||
| 	 * created | ||||
| 	 */ | ||||
| 	public static final String	radioButtonMenuItem	= "RaBuMI"; | ||||
| 	/** | ||||
| 	 * If a key starts with this String, a {@link JMenu} will be created | ||||
| 	 */ | ||||
| 	public static final String	subMenuItem			= "SubMI"; | ||||
|  | ||||
| 	private Map<String, ActionListener>	items	= new HashMap<>(); | ||||
| 	private Map<String, Icon>			icons	= new HashMap<>(); | ||||
|  | ||||
| 	private ButtonGroup	radioButtonGroup	= new ButtonGroup(); | ||||
| 	private boolean		built				= false; | ||||
| 	private boolean		visible				= false; | ||||
|  | ||||
| 	/** | ||||
| 	 * @since Envoy v0.1-beta | ||||
| 	 */ | ||||
| 	public ContextMenu() {} | ||||
|  | ||||
| 	/** | ||||
| 	 * @param label            the string that a UI may use to display as a title | ||||
| 	 *                         for the pop-up menu | ||||
| 	 * @param parent           the component which will call this | ||||
| 	 *                         {@link ContextMenu} | ||||
| 	 * @param itemsWithActions a map of all strings to be displayed with according | ||||
| 	 *                         actions | ||||
| 	 * @param itemIcons        the icons to be displayed before a name, if wanted. | ||||
| 	 *                         Only keys in here will have an Icon displayed. More | ||||
| 	 *                         precisely, all keys here not included in the first | ||||
| 	 *                         map will be thrown out. | ||||
| 	 * @since Envoy v0.1-beta | ||||
| 	 */ | ||||
| 	public ContextMenu(String label, Component parent, Map<String, ActionListener> itemsWithActions, Map<String, Icon> itemIcons) { | ||||
| 		super(label); | ||||
| 		setInvoker(parent); | ||||
| 		this.items	= (itemsWithActions != null) ? itemsWithActions : items; | ||||
| 		this.icons	= (itemIcons != null) ? itemIcons : icons; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Prepares the PopupMenu to be displayed. Should only be used once all map | ||||
| 	 * values have been set. | ||||
| 	 * | ||||
| 	 * @return this instance of {@link ContextMenu} to allow chaining behind the | ||||
| 	 *         constructor | ||||
| 	 * @since Envoy v0.1-beta | ||||
| 	 */ | ||||
| 	public ContextMenu build() { | ||||
| 		items.forEach((text, action) -> { | ||||
| 			// case radio button wanted | ||||
| 			if (text.startsWith(radioButtonMenuItem)) { | ||||
| 				var item = new JRadioButtonMenuItem(text.substring(radioButtonMenuItem.length()), icons.containsKey(text) ? icons.get(text) : null); | ||||
| 				item.addActionListener(action); | ||||
| 				radioButtonGroup.add(item); | ||||
| 				add(item); | ||||
| 				// case check box wanted | ||||
| 			} else if (text.startsWith(checkboxMenuItem)) { | ||||
| 				var item = new JCheckBoxMenuItem(text.substring(checkboxMenuItem.length()), icons.containsKey(text) ? icons.get(text) : null); | ||||
| 				item.addActionListener(action); | ||||
| 				add(item); | ||||
| 				// case sub-menu wanted | ||||
| 			} else if (text.startsWith(subMenuItem)) { | ||||
| 				var item = new JMenu(text.substring(subMenuItem.length())); | ||||
| 				item.addActionListener(action); | ||||
| 				add(item); | ||||
| 			} else { | ||||
| 				// normal JMenuItem wanted | ||||
| 				var item = new JMenuItem(text, icons.containsKey(text) ? icons.get(text) : null); | ||||
| 				item.addActionListener(action); | ||||
| 				add(item); | ||||
| 			} | ||||
| 		}); | ||||
| 		getInvoker().addMouseListener(getShowingListener()); | ||||
| 		built = true; | ||||
| 		return this; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @param label the string that a UI may use to display as a title for the | ||||
| 	 *              pop-up menu. | ||||
| 	 * @since Envoy v0.1-beta | ||||
| 	 */ | ||||
| 	public ContextMenu(String label) { super(label); } | ||||
|  | ||||
| 	private MouseAdapter getShowingListener() { | ||||
| 		return new MouseAdapter() { | ||||
|  | ||||
| 			@Override | ||||
| 			public void mouseClicked(MouseEvent e) { action(e); } | ||||
|  | ||||
| 			@Override | ||||
| 			public void mousePressed(MouseEvent e) { action(e); } | ||||
|  | ||||
| 			@Override | ||||
| 			public void mouseReleased(MouseEvent e) { action(e); } | ||||
|  | ||||
| 			private void action(MouseEvent e) { | ||||
| 				if (!built) build(); | ||||
| 				if (e.isPopupTrigger()) { | ||||
| 					show(e.getComponent(), e.getX(), e.getY()); | ||||
| 					// hides the menu if already visible | ||||
| 					visible = !visible; | ||||
| 					setVisible(visible); | ||||
|  | ||||
| 				} | ||||
| 			} | ||||
| 		}; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Removes all subcomponents of this menu. | ||||
| 	 * | ||||
| 	 * @since Envoy v0.1-beta | ||||
| 	 */ | ||||
| 	public void clear() { | ||||
| 		removeAll(); | ||||
| 		items	= new HashMap<>(); | ||||
| 		icons	= new HashMap<>(); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @return the items | ||||
| 	 * @since Envoy v0.1-beta | ||||
| 	 */ | ||||
| 	public Map<String, ActionListener> getItems() { return items; } | ||||
|  | ||||
| 	/** | ||||
| 	 * @param items the items with the displayed text and the according action to | ||||
| 	 *              take once called | ||||
| 	 * @since Envoy v0.1-beta | ||||
| 	 */ | ||||
| 	public void setItems(Map<String, ActionListener> items) { this.items = items; } | ||||
|  | ||||
| 	/** | ||||
| 	 * @return the icons | ||||
| 	 * @since Envoy v0.1-beta | ||||
| 	 */ | ||||
| 	public Map<String, Icon> getIcons() { return icons; } | ||||
|  | ||||
| 	/** | ||||
| 	 * @param icons the icons to set | ||||
| 	 * @since Envoy v0.1-beta | ||||
| 	 */ | ||||
| 	public void setIcons(Map<String, Icon> icons) { this.icons = icons; } | ||||
| } | ||||
| @@ -15,6 +15,8 @@ import javax.swing.SwingUtilities; | ||||
| import envoy.client.data.*; | ||||
| import envoy.client.net.Client; | ||||
| import envoy.client.net.WriteProxy; | ||||
| import envoy.client.ui.container.ChatWindow; | ||||
| import envoy.client.ui.container.LoginDialog; | ||||
| import envoy.data.Config; | ||||
| import envoy.data.Message; | ||||
| import envoy.data.User.UserStatus; | ||||
|   | ||||
| @@ -1,8 +1,12 @@ | ||||
| package envoy.client.ui; | ||||
| package envoy.client.ui.container; | ||||
| 
 | ||||
| import java.awt.*; | ||||
| import java.awt.datatransfer.StringSelection; | ||||
| import java.awt.event.*; | ||||
| import java.io.IOException; | ||||
| import java.util.Collection; | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
| import java.util.logging.Level; | ||||
| import java.util.logging.Logger; | ||||
| 
 | ||||
| @@ -18,13 +22,13 @@ import envoy.client.event.MessageCreationEvent; | ||||
| import envoy.client.event.ThemeChangeEvent; | ||||
| import envoy.client.net.Client; | ||||
| import envoy.client.net.WriteProxy; | ||||
| import envoy.client.ui.Theme; | ||||
| import envoy.client.ui.list.ComponentList; | ||||
| import envoy.client.ui.list.ComponentListModel; | ||||
| import envoy.client.ui.primary.PrimaryButton; | ||||
| import envoy.client.ui.primary.PrimaryScrollPane; | ||||
| import envoy.client.ui.primary.PrimaryTextArea; | ||||
| import envoy.client.ui.renderer.ContactsSearchRenderer; | ||||
| import envoy.client.ui.renderer.MessageListRenderer; | ||||
| import envoy.client.ui.renderer.UserListRenderer; | ||||
| import envoy.client.ui.settings.SettingsScreen; | ||||
| import envoy.data.Message; | ||||
| @@ -103,7 +107,6 @@ public class ChatWindow extends JFrame { | ||||
| 	public ChatWindow() { | ||||
| 		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | ||||
| 		setBounds(100, 100, 600, 800); | ||||
| 		setMinimumSize(new Dimension(400, 300)); | ||||
| 		setTitle("Envoy"); | ||||
| 		setLocationRelativeTo(null); | ||||
| 		setIconImage(Toolkit.getDefaultToolkit().createImage(getClass().getClassLoader().getResource("envoy_logo.png"))); | ||||
| @@ -123,19 +126,39 @@ public class ChatWindow extends JFrame { | ||||
| 			@Override | ||||
| 			public void mouseClicked(MouseEvent e) { | ||||
| 				if (e.isPopupTrigger()) { | ||||
| 					contextMenu = new JPopupMenu("message options"); | ||||
| 					Map<String, ActionListener> commands = new HashMap<>() { | ||||
| 
 | ||||
| 						private static final long serialVersionUID = -2755235774946990126L; | ||||
| 
 | ||||
| 						{ | ||||
| 							put("forward selected message", | ||||
| 									evt -> forwardMessageToMultipleUsers(messageList.getSelected().get(0), | ||||
| 											ContactsChooserDialog | ||||
| 												.showForwardingDialog("Forward selected message to", messageList.getSelected().get(0), client))); | ||||
| 							put("copy", evt -> { | ||||
| 								// TODO should be enhanced to allow also copying of message attachments, | ||||
| 								// especially pictures | ||||
| 								StringSelection copy = new StringSelection(messageList.getSelected().get(0).getText()); | ||||
| 								Toolkit.getDefaultToolkit().getSystemClipboard().setContents(copy, copy); | ||||
| 							}); | ||||
| 							// TODO insert implementation to edit and delete messages | ||||
| 							put("delete", evt -> {}); | ||||
| 							put("edit", evt -> {}); | ||||
| 							put("quote", evt -> {}); | ||||
| 						} | ||||
| 					}; | ||||
| 					commands.forEach((name, action) -> { var item = new JMenuItem(name); item.addActionListener(action); contextMenu.add(item); }); | ||||
| 					contextMenu.show(e.getComponent(), e.getX(), e.getY()); | ||||
| 				} | ||||
| 			} | ||||
| 		}); | ||||
| 		scrollPane.setViewportView(messageList); | ||||
| 		scrollPane.addComponentListener(new ComponentAdapter() { | ||||
| 
 | ||||
| 			// Update list elements when scroll pane (and thus list) is resized | ||||
| 			// updates list elements when list is resized | ||||
| 			@Override | ||||
| 			public void componentResized(ComponentEvent e) { | ||||
| 				messageList.setMaximumSize(new Dimension(scrollPane.getWidth(), Integer.MAX_VALUE)); | ||||
| 				messageList.synchronizeModel(); | ||||
| 			} | ||||
| 			public void componentResized(ComponentEvent e) { messageList.synchronizeModel(); } | ||||
| 		}); | ||||
| 		scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); | ||||
| 
 | ||||
| @@ -538,6 +561,15 @@ public class ChatWindow extends JFrame { | ||||
| 		sendMessage(new MessageBuilder(msg, recipient.getId(), localDb.getIdGenerator()).build()); | ||||
| 	} | ||||
| 
 | ||||
| 	private void forwardMessageToMultipleUsers(Message message, Collection<User> recipients) { | ||||
| 		recipients.forEach(recipient -> forwardMessage(message, recipient)); | ||||
| 	} | ||||
| 
 | ||||
| 	@SuppressWarnings("unused") | ||||
| 	private void forwardMultipleMessagesToMultipleUsers(Collection<Message> messages, Collection<User> recipients) { | ||||
| 		messages.forEach(message -> forwardMessageToMultipleUsers(message, recipients)); | ||||
| 	} | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Sends a {@link Message} to the server. | ||||
| 	 * | ||||
| @@ -612,8 +644,6 @@ public class ChatWindow extends JFrame { | ||||
| 		this.localDb	= localDb; | ||||
| 		this.writeProxy	= writeProxy; | ||||
| 
 | ||||
| 		messageList.setRenderer(new MessageListRenderer(client.getSender().getId())); | ||||
| 
 | ||||
| 		// Load users and chats | ||||
| 		new Thread(() -> { | ||||
| 			localDb.getUsers().values().forEach(user -> { | ||||
| @@ -0,0 +1,125 @@ | ||||
| package envoy.client.ui.container; | ||||
|  | ||||
| import java.awt.BorderLayout; | ||||
| import java.awt.event.ActionListener; | ||||
| import java.awt.event.KeyEvent; | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
|  | ||||
| import javax.swing.JButton; | ||||
| import javax.swing.JDialog; | ||||
| import javax.swing.JPanel; | ||||
| import javax.swing.border.EmptyBorder; | ||||
|  | ||||
| import envoy.client.data.Settings; | ||||
| import envoy.client.net.Client; | ||||
| import envoy.client.ui.Theme; | ||||
| import envoy.client.ui.list.ComponentList; | ||||
| import envoy.client.ui.list.ComponentListModel; | ||||
| import envoy.client.ui.renderer.MessageListRenderer; | ||||
| import envoy.client.ui.renderer.UserComponentListRenderer; | ||||
| import envoy.data.Message; | ||||
| import envoy.data.User; | ||||
|  | ||||
| /** | ||||
|  * This class defines a dialog to choose contacts from.<br> | ||||
|  * <br> | ||||
|  * Project: <strong>envoy-client</strong><br> | ||||
|  * File: <strong>ContactsChooserDialog.java</strong><br> | ||||
|  * Created: <strong>15 Mar 2020</strong><br> | ||||
|  * | ||||
|  * @author Leon Hofmeister | ||||
|  * @since Envoy v0.1-beta | ||||
|  */ | ||||
| public class ContactsChooserDialog extends JDialog { | ||||
|  | ||||
| 	private static final long serialVersionUID = -5774558118579032256L; | ||||
|  | ||||
| 	private ComponentList<User>	contactList		= new ComponentList<>(new UserComponentListRenderer()); | ||||
| 	private JButton				okButton		= new JButton("Ok"); | ||||
| 	private JButton				cancelButton	= new JButton("Cancel"); | ||||
|  | ||||
| 	private final Theme theme = Settings.getInstance().getTheme(Settings.getInstance().getCurrentTheme()); | ||||
|  | ||||
| 	private final JPanel contentPanel = new JPanel(); | ||||
|  | ||||
| 	/** | ||||
| 	 * Shows a modal contacts-chooser dialog and blocks until the | ||||
| 	 * dialog is hidden. If the user presses the "OK" button, then | ||||
| 	 * this method hides/disposes the dialog and returns the selected element (has | ||||
| 	 * yet | ||||
| 	 * to be casted back to its original type due to the limitations of Generics in | ||||
| 	 * Java). | ||||
| 	 * If the user presses the "Cancel" button or closes the dialog without | ||||
| 	 * pressing "OK", then this method disposes the dialog and returns an empty | ||||
| 	 * <code>ArrayList</code>. | ||||
| 	 * | ||||
| 	 * @param title   the title of the dialog | ||||
| 	 * @param message the {@link Message} to display on top of the Dialog | ||||
| 	 * @param client  the client whose contacts should be displayed | ||||
| 	 * @return the selected Element (yet has to be casted to the wanted type due to | ||||
| 	 *         the Generics limitations in Java) | ||||
| 	 * @since Envoy v0.1-beta | ||||
| 	 */ | ||||
| 	public static List<User> showForwardingDialog(String title, Message message, Client client) { | ||||
| 		ContactsChooserDialog dialog = new ContactsChooserDialog(); | ||||
| 		dialog.setTitle(title); | ||||
| 		dialog.setDefaultCloseOperation(DISPOSE_ON_CLOSE); | ||||
| 		dialog.addCancelButtonActionListener(e -> dialog.dispose()); | ||||
| 		dialog.getContentPanel() | ||||
| 			.add(new MessageListRenderer(client.getSender().getId()).getListCellComponent(null, message, false), BorderLayout.NORTH); | ||||
| 		List<User> results = new ArrayList<>(); | ||||
| 		dialog.addOkButtonActionListener(e -> { results.addAll(dialog.getContactList().getSelected()); dialog.dispose(); }); | ||||
| 		ComponentListModel<User> contactListModel = dialog.getContactList().getModel(); | ||||
| 		client.getContacts().getContacts().forEach(user -> contactListModel.add(user)); | ||||
| 		dialog.setVisible(true); | ||||
| 		dialog.repaint(); | ||||
| 		dialog.revalidate(); | ||||
| 		return results.size() > 0 ? results : null; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @since Envoy v0.1-beta | ||||
| 	 */ | ||||
| 	private ContactsChooserDialog() { | ||||
| 		contactList.enableMultipleSelection(); | ||||
| 		// setBounds(100, 100, 450, 300); | ||||
| 		setModal(true); | ||||
| 		getContentPane().setLayout(new BorderLayout()); | ||||
| 		setBackground(theme.getBackgroundColor()); | ||||
| 		setForeground(theme.getMessageTextColor()); | ||||
| 		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); | ||||
| 		getContentPane().add(contentPanel, BorderLayout.CENTER); | ||||
| 		contentPanel.setLayout(new BorderLayout(0, 0)); | ||||
| 		contentPanel.add(contactList, BorderLayout.CENTER); | ||||
| 		{ | ||||
| 			JPanel buttonPane = new JPanel(); | ||||
| 			getContentPane().add(buttonPane, BorderLayout.SOUTH); | ||||
| 			{ | ||||
| 				JButton okButton = new JButton("OK"); | ||||
| 				okButton.setMnemonic(KeyEvent.VK_ENTER); | ||||
| 				okButton.setActionCommand("OK"); | ||||
| 				buttonPane.setLayout(new BorderLayout(0, 0)); | ||||
| 				buttonPane.add(okButton, BorderLayout.EAST); | ||||
| 				getRootPane().setDefaultButton(okButton); | ||||
| 			} | ||||
| 			{ | ||||
| 				JButton cancelButton = new JButton("Cancel"); | ||||
| 				cancelButton.setActionCommand("Cancel"); | ||||
| 				buttonPane.add(cancelButton, BorderLayout.WEST); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * @return the underlying {@link ComponentList} | ||||
| 	 * @since Envoy v0.1-beta | ||||
| 	 */ | ||||
| 	private ComponentList<User> getContactList() { return contactList; } | ||||
|  | ||||
| 	private void addOkButtonActionListener(ActionListener l) { okButton.addActionListener(l); } | ||||
|  | ||||
| 	private void addCancelButtonActionListener(ActionListener l) { cancelButton.addActionListener(l); } | ||||
|  | ||||
| 	private JPanel getContentPanel() { return contentPanel; } | ||||
| } | ||||
| @@ -1,4 +1,4 @@ | ||||
| package envoy.client.ui; | ||||
| package envoy.client.ui.container; | ||||
| 
 | ||||
| import java.awt.*; | ||||
| import java.awt.event.ItemEvent; | ||||
| @@ -16,6 +16,7 @@ import javax.swing.border.EmptyBorder; | ||||
| import envoy.client.data.*; | ||||
| import envoy.client.event.HandshakeSuccessfulEvent; | ||||
| import envoy.client.net.Client; | ||||
| import envoy.client.ui.Theme; | ||||
| import envoy.client.ui.primary.PrimaryButton; | ||||
| import envoy.data.LoginCredentials; | ||||
| import envoy.data.Message; | ||||
							
								
								
									
										13
									
								
								src/main/java/envoy/client/ui/container/package-info.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/main/java/envoy/client/ui/container/package-info.java
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| /** | ||||
|  * This package contains all graphical Containers, like Dialogs and Frames.<br> | ||||
|  * <br> | ||||
|  * Project: <strong>envoy-client</strong><br> | ||||
|  * File: <strong>package-info.java</strong><br> | ||||
|  * Created: <strong>16 Mar 2020</strong><br> | ||||
|  * | ||||
|  * @author Leon Hofmeister | ||||
|  * @author Kai S. K. Engelbart | ||||
|  * @author Maximilian Käfer | ||||
|  * @since Envoy v0.1-beta | ||||
|  */ | ||||
| package envoy.client.ui.container; | ||||
| @@ -108,6 +108,10 @@ public class ComponentList<E> extends JPanel { | ||||
| 	 * @since Envoy v0.1-beta | ||||
| 	 */ | ||||
| 	private void add(E elem, int index, boolean isSelected) { | ||||
| 		if (isSelected && !multipleSelectionEnabled) { | ||||
| 			clearSelections(); | ||||
| 			currentSelections.add(index); | ||||
| 		} | ||||
| 		final JComponent component = renderer.getListCellComponent(this, elem, isSelected); | ||||
| 		component.addMouseListener(getSelectionListener(index)); | ||||
| 		add(component, index); | ||||
| @@ -169,7 +173,7 @@ public class ComponentList<E> extends JPanel { | ||||
| 	 * @since Envoy v0.1-beta | ||||
| 	 */ | ||||
| 	private void clearSelections() { | ||||
| 		currentSelections.forEach(index2 -> updateSelection(index2, false)); | ||||
| 		currentSelections.forEach(index -> updateSelection(index, false)); | ||||
| 		currentSelections.clear(); | ||||
| 	} | ||||
|  | ||||
| @@ -224,7 +228,10 @@ public class ComponentList<E> extends JPanel { | ||||
| 	 *                                 the component list | ||||
| 	 * @since Envoy v0.1-beta | ||||
| 	 */ | ||||
| 	public void setMultipleSelectionEnabled(boolean multipleSelectionEnabled) { this.multipleSelectionEnabled = multipleSelectionEnabled; } | ||||
| 	public void setMultipleSelectionEnabled(boolean multipleSelectionEnabled) { | ||||
| 		this.multipleSelectionEnabled = multipleSelectionEnabled; | ||||
| 		if (!multipleSelectionEnabled) clearSelections(); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * Enables the selection of multiple elements. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 delvh
					delvh