/*
* Copyright 2014 Matthias Bläsing.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.kenai.redminenb.issue;
import com.kenai.redminenb.ui.Defaults;
import com.kenai.redminenb.user.RedmineUser;
import com.kenai.redminenb.util.ListListModel;
import com.kenai.redminenb.util.WatcherComparator;
import com.taskadapter.redmineapi.bean.Watcher;
import com.taskadapter.redmineapi.bean.WatcherFactory;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
import javax.swing.RowFilter;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
public class WatchersEditorFrame extends javax.swing.JPanel {
public WatchersEditorFrame(List<Watcher> currentWatchers, Collection<RedmineUser> users) {
initComponents();
Set<Integer> watcherIds = new HashSet<>();
for(Watcher w: currentWatchers) {
watcherIds.add(w.getId());
}
List<Watcher> potentialWatchers = new ArrayList<>();
for(RedmineUser ru: users) {
if(! watcherIds.contains(ru.getId())) {
Watcher w = WatcherFactory.create(ru.getId());
w.setName(ru.toString());
potentialWatchers.add(w);
}
}
getAvailableUsersModel().addAll(potentialWatchers);
getWatchersModel().addAll(currentWatchers);
availableFilter.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
String filterString = availableFilter.getText();
RowFilter rf = null;
if(! filterString.isEmpty()) {
rf = RowFilter.regexFilter("(?i)(?u)" + Pattern.quote(filterString));
}
availableList.setRowFilter(rf);
}
});
watchersFilter.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
String filterString = watchersFilter.getText();
RowFilter rf = null;
if(! filterString.isEmpty()) {
rf = RowFilter.regexFilter(Pattern.quote(filterString));
}
watchersList.setRowFilter(rf);
}
});
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for(Object watcherObject: availableList.getSelectedValues()) {
addWatcher((Watcher) watcherObject);
}
}
});
removeButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for(Object watcherObject: watchersList.getSelectedValues()) {
removeWatcher((Watcher) watcherObject);
}
}
});
availableList.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
addButton.setEnabled(availableList.getSelectedValues().length > 0);
}
});
watchersList.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
removeButton.setEnabled(watchersList.getSelectedValues().length > 0);
}
});
watchersList.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
int clickIdx = watchersList.locationToIndex(e.getPoint());
Watcher w = (Watcher) watchersList.getElementAt(clickIdx);
removeWatcher(w);
}
}
});
availableList.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
int clickIdx = availableList.locationToIndex(e.getPoint());
Watcher w = (Watcher) availableList.getElementAt(clickIdx);
addWatcher(w);
}
}
});
watchersList.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SPACE) {
for (Object watcherObject : watchersList.getSelectedValues()) {
removeWatcher((Watcher) watcherObject);
}
}
}
});
availableList.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SPACE) {
for (Object watcherObject : availableList.getSelectedValues()) {
addWatcher((Watcher) watcherObject);
}
}
}
});
}
private void removeWatcher(Watcher watcherObject) {
getWatchersModel().remove((Watcher) watcherObject);
getAvailableUsersModel().add((Watcher) watcherObject);
}
private void addWatcher(Watcher watcherObject) {
getWatchersModel().add((Watcher) watcherObject);
getAvailableUsersModel().remove((Watcher) watcherObject);
}
private ListListModel<Watcher> getAvailableUsersModel() {
return (ListListModel<Watcher>) availableList.getModel();
}
private ListListModel<Watcher> getWatchersModel() {
return (ListListModel<Watcher>) watchersList.getModel();
}
public List<Watcher> getWatchers() {
List<Watcher> result = new ArrayList(getWatchersModel().getSize());
result.addAll(getWatchersModel().getElements());
return result;
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
buttonsPanel = new javax.swing.JPanel();
removeButton = new javax.swing.JButton();
addButton = new javax.swing.JButton();
availableUsersPanel = new javax.swing.JPanel();
availableLabel = new javax.swing.JLabel();
availableFilterLabel = new javax.swing.JLabel();
availableListScrollPane = new javax.swing.JScrollPane();
availableList = new org.jdesktop.swingx.JXList();
availableFilter = new javax.swing.JTextField();
watchersPanel = new javax.swing.JPanel();
watchesFilterLabel = new javax.swing.JLabel();
watchersLabel = new javax.swing.JLabel();
watchersFilter = new javax.swing.JTextField();
watchersListScrollPane = new javax.swing.JScrollPane();
watchersList = new org.jdesktop.swingx.JXList();
setLayout(new java.awt.GridBagLayout());
buttonsPanel.setLayout(new java.awt.GridBagLayout());
org.openide.awt.Mnemonics.setLocalizedText(removeButton, org.openide.util.NbBundle.getMessage(WatchersEditorFrame.class, "WatchersEditorFrame.removeButton.text")); // NOI18N
removeButton.setEnabled(false);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10);
buttonsPanel.add(removeButton, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(addButton, org.openide.util.NbBundle.getMessage(WatchersEditorFrame.class, "WatchersEditorFrame.addButton.text")); // NOI18N
addButton.setEnabled(false);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.insets = new java.awt.Insets(10, 10, 10, 10);
buttonsPanel.add(addButton, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
add(buttonsPanel, gridBagConstraints);
availableUsersPanel.setMinimumSize(new java.awt.Dimension(20, 20));
availableUsersPanel.setPreferredSize(new java.awt.Dimension(200, 100));
availableUsersPanel.setLayout(new java.awt.GridBagLayout());
org.openide.awt.Mnemonics.setLocalizedText(availableLabel, org.openide.util.NbBundle.getMessage(WatchersEditorFrame.class, "WatchersEditorFrame.availableLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.weightx = 1.0;
availableUsersPanel.add(availableLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(availableFilterLabel, org.openide.util.NbBundle.getMessage(WatchersEditorFrame.class, "WatchersEditorFrame.availableFilterLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
availableUsersPanel.add(availableFilterLabel, gridBagConstraints);
availableList.setModel(new ListListModel<Watcher>());
availableList.setAutoCreateRowSorter(true);
availableList.setCellRenderer(new Defaults.WatcherLCR());
availableList.setComparator(new WatcherComparator()
);
availableList.setSortOrder(javax.swing.SortOrder.ASCENDING);
availableListScrollPane.setViewportView(availableList);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
availableUsersPanel.add(availableListScrollPane, gridBagConstraints);
availableFilter.setText(org.openide.util.NbBundle.getMessage(WatchersEditorFrame.class, "WatchersEditorFrame.availableFilter.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
availableUsersPanel.add(availableFilter, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
add(availableUsersPanel, gridBagConstraints);
watchersPanel.setMinimumSize(new java.awt.Dimension(20, 20));
watchersPanel.setPreferredSize(new java.awt.Dimension(200, 100));
watchersPanel.setLayout(new java.awt.GridBagLayout());
org.openide.awt.Mnemonics.setLocalizedText(watchesFilterLabel, org.openide.util.NbBundle.getMessage(WatchersEditorFrame.class, "WatchersEditorFrame.watchesFilterLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
watchersPanel.add(watchesFilterLabel, gridBagConstraints);
org.openide.awt.Mnemonics.setLocalizedText(watchersLabel, org.openide.util.NbBundle.getMessage(WatchersEditorFrame.class, "WatchersEditorFrame.watchersLabel.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.weightx = 1.0;
watchersPanel.add(watchersLabel, gridBagConstraints);
watchersFilter.setText(org.openide.util.NbBundle.getMessage(WatchersEditorFrame.class, "WatchersEditorFrame.watchersFilter.text")); // NOI18N
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
watchersPanel.add(watchersFilter, gridBagConstraints);
watchersList.setModel(new ListListModel<Watcher>());
watchersList.setAutoCreateRowSorter(true);
watchersList.setCellRenderer(new Defaults.WatcherLCR());
watchersList.setComparator(new WatcherComparator());
watchersList.setSortOrder(javax.swing.SortOrder.ASCENDING);
watchersListScrollPane.setViewportView(watchersList);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
watchersPanel.add(watchersListScrollPane, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
add(watchersPanel, gridBagConstraints);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton addButton;
private javax.swing.JTextField availableFilter;
private javax.swing.JLabel availableFilterLabel;
private javax.swing.JLabel availableLabel;
private org.jdesktop.swingx.JXList availableList;
private javax.swing.JScrollPane availableListScrollPane;
private javax.swing.JPanel availableUsersPanel;
private javax.swing.JPanel buttonsPanel;
private javax.swing.JButton removeButton;
private javax.swing.JTextField watchersFilter;
private javax.swing.JLabel watchersLabel;
private org.jdesktop.swingx.JXList watchersList;
private javax.swing.JScrollPane watchersListScrollPane;
private javax.swing.JPanel watchersPanel;
private javax.swing.JLabel watchesFilterLabel;
// End of variables declaration//GEN-END:variables
}