/** * Copyright 2011 Intuit Inc. All Rights Reserved */ package com.intuit.tank.tools.debugger; /* * #%L * Intuit Tank Agent Debugger * %% * Copyright (C) 2011 - 2015 Intuit Inc. * %% * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * #L% */ import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Frame; import java.awt.GridLayout; import java.awt.Rectangle; 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.Arrays; import java.util.Collections; import java.util.List; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.apache.commons.lang3.StringUtils; /** * ScriptSelectDialog * * @author dangleton * */ public class SelectDialog<SELECTION_TYPE extends Object> extends JDialog { private static final long serialVersionUID = 1L; private JTextField filterField; private JList list; private JButton okBT; private SELECTION_TYPE selectedObject; private SELECTION_TYPE[] selectedObjects; private List<SELECTION_TYPE> items; private long timeClicked; /** * @param arg0 */ public SelectDialog(Frame f, List<SELECTION_TYPE> items, String itemType) { this(f, items, itemType, true); } /** * @param arg0 */ public SelectDialog(Frame f, List<SELECTION_TYPE> items, String itemType, boolean singleSelection) { super(f, true); setLayout(new BorderLayout()); this.items = items; filterField = new JTextField(); filterField.addKeyListener(new KeyHandler()); list = new JList(items.toArray()); list.setSelectionMode(singleSelection ? ListSelectionModel.SINGLE_SELECTION : ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); list.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent e) { okBT.setEnabled(list.getSelectedIndex() != -1); } }); list.addMouseListener(new MouseAdapter() { /** * @{inheritDoc */ @Override public void mouseClicked(MouseEvent e) { if (e.getClickCount() == 2) { select(); } } }); JPanel labelPanel = new JPanel(new GridLayout(singleSelection ? 1 : 2, 1, 0, 5)); labelPanel.add(new JLabel("Select a " + itemType + ".")); if (!singleSelection) { String key = System.getProperty("os.name").toLowerCase().indexOf("mac") != -1 ? "⌘" : "control"; System.out.println(key); labelPanel.add(new JLabel("Hold down the " + key + " key to select multiple " + itemType + ".")); } add(labelPanel, BorderLayout.NORTH); JScrollPane sp = new JScrollPane(list); JPanel centerPanel = new JPanel(new BorderLayout()); centerPanel.add(filterField, BorderLayout.NORTH); centerPanel.add(sp, BorderLayout.CENTER); add(centerPanel, BorderLayout.CENTER); add(createButtonPanel(), BorderLayout.SOUTH); setSize(new Dimension(400, 500)); setBounds(new Rectangle(getSize())); setPreferredSize(getSize()); WindowUtil.centerOnParent(this); } /** * @return the selectedScript */ public SELECTION_TYPE getSelectedObject() { return selectedObject; } /** * @return the selectedScript */ public List<SELECTION_TYPE> getSelectedObjects() { if (selectedObjects != null) { return (List<SELECTION_TYPE>) Arrays.asList(selectedObjects); } return Collections.emptyList(); } public void filter(final long timeValue) { new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(200); if (timeValue == timeClicked) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { List<SELECTION_TYPE> filtered = new ArrayList<SELECTION_TYPE>(); for (SELECTION_TYPE obj : items) { if (StringUtils.isBlank(filterField.getText()) || StringUtils.containsIgnoreCase(obj.toString(), filterField.getText() .trim())) { filtered.add(obj); } } list.setListData(filtered.toArray()); list.repaint(); } }); } else { System.out.println("skipping..."); } } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } /** * @{inheritDoc */ @Override public void setVisible(boolean b) { if (b) { selectedObject = null; selectedObjects = null; } super.setVisible(b); } /** * @return */ private Component createButtonPanel() { JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEADING, 10, 5)); JButton cancelBT = new JButton("Cancel"); cancelBT.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { setVisible(false); } }); okBT = new JButton("Ok"); okBT.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { select(); } }); panel.add(okBT); panel.add(cancelBT); return panel; } /** * */ @SuppressWarnings("unchecked") private void select() { selectedObject = (SELECTION_TYPE) list.getSelectedValue(); selectedObjects = (SELECTION_TYPE[]) list.getSelectedValues(); if (selectedObject != null) { setVisible(false); } } class KeyHandler extends KeyAdapter { public void keyPressed(KeyEvent evt) { if (evt.getKeyCode() == KeyEvent.VK_ESCAPE) { setVisible(false); } } @Override public void keyTyped(KeyEvent arg0) { timeClicked = System.currentTimeMillis(); filter(timeClicked); } } }