blob: fd36bd9c4794f39c276339ed7a8f5d06aed3cda2 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You 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 org.apache.geode.sequence;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;
import javax.swing.AbstractListModel;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import org.apache.geode.internal.sequencelog.model.GraphID;
import org.apache.geode.internal.sequencelog.model.GraphSet;
/**
* Created by IntelliJ IDEA. User: dsmith Date: Dec 9, 2010 Time: 3:34:38 PM To change this template
* use File | Settings | File Templates.
*/
public class SelectGraphDialog extends JDialog {
private List<GraphID> selectedIds = new ArrayList<GraphID>();
private Set<SelectionListener> listeners = new HashSet<SelectionListener>();
public SelectGraphDialog(final GraphSet graphs) {
final List<GraphID> ids = new ArrayList<GraphID>(graphs.getMap().keySet());
Collections.sort(ids);
final FilterableListModel listModel = new FilterableListModel(ids);
final JList list = new JList(listModel);
JScrollPane selectGraphPane = new JScrollPane(list);
selectGraphPane.setPreferredSize(new Dimension(500, 500));
JButton apply = new JButton("Apply");
apply.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
selectedIds = (List) Arrays.asList(list.getSelectedValues());
fireSelectionChanged();
setVisible(false);
}
});
JButton cancel = new JButton("Cancel");
cancel.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setVisible(false);
}
});
JPanel buttonPane = new JPanel();
buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS));
buttonPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
buttonPane.add(Box.createHorizontalGlue());
buttonPane.add(apply);
buttonPane.add(cancel);
final JTextField searchField = new JTextField(10);
searchField.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void removeUpdate(DocumentEvent e) {
doUpdate();
}
@Override
public void insertUpdate(DocumentEvent e) {
doUpdate();
}
@Override
public void changedUpdate(DocumentEvent e) {
doUpdate();
}
private void doUpdate() {
listModel.updateFilter(searchField.getText());
}
});
Container contentPane = getContentPane();
contentPane.add(searchField, BorderLayout.PAGE_START);
contentPane.add(selectGraphPane, BorderLayout.CENTER);
contentPane.add(buttonPane, BorderLayout.PAGE_END);
}
private void fireSelectionChanged() {
for (SelectionListener listener : listeners) {
listener.selectionChanged(selectedIds);
}
}
public void addSelectionListener(SelectionListener listener) {
listeners.add(listener);
}
public void removeSelectionListener(SelectionListener listener) {
listeners.remove(listener);
}
/**
* A listener for changes to the graph selections
*/
public static interface SelectionListener {
void selectionChanged(List<GraphID> selectedIds);
}
private static class FilterableListModel extends AbstractListModel {
private final List<?> allElements;
private List<Object> filteredElements;
public FilterableListModel(List<?> elements) {
this.allElements = elements;
this.filteredElements = new ArrayList<Object>(elements);
}
@Override
public int getSize() {
return filteredElements.size();
}
@Override
public Object getElementAt(int index) {
return filteredElements.get(index);
}
public void updateFilter(String filter) {
Pattern pattern = Pattern.compile(filter);
filteredElements = new ArrayList<Object>();
for (Object element : allElements) {
if (pattern.matcher(element.toString()).find()) {
filteredElements.add(element);
}
}
fireContentsChanged(this, 0, filteredElements.size());
}
}
}