001 /* 002 * Copyright 2002-2008 the original author or authors. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 005 * use this file except in compliance with the License. You may obtain a copy of 006 * the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 013 * License for the specific language governing permissions and limitations under 014 * the License. 015 */ 016 package org.springframework.richclient.selection.dialog; 017 018 import java.awt.Window; 019 import java.awt.event.MouseAdapter; 020 import java.awt.event.MouseEvent; 021 import java.util.List; 022 023 import javax.swing.JComponent; 024 import javax.swing.JList; 025 import javax.swing.JScrollPane; 026 import javax.swing.ListCellRenderer; 027 import javax.swing.ListSelectionModel; 028 import javax.swing.event.ListSelectionEvent; 029 import javax.swing.event.ListSelectionListener; 030 031 import org.springframework.util.Assert; 032 033 import ca.odell.glazedlists.EventList; 034 import ca.odell.glazedlists.GlazedLists; 035 import ca.odell.glazedlists.swing.EventListModel; 036 037 /** 038 * A <code>ListSelectionDialog</code> can be used to select an item from a 039 * list. 040 * 041 * @author Peter De Bruycker 042 */ 043 public class ListSelectionDialog extends AbstractSelectionDialog { 044 045 private ListCellRenderer renderer; 046 047 private JList list; 048 049 private EventList items; 050 051 public ListSelectionDialog(String title, List items) { 052 this(title, null, GlazedLists.eventList(items)); 053 } 054 055 public ListSelectionDialog(String title, Window parent, List items) { 056 this(title, parent, GlazedLists.eventList(items)); 057 } 058 059 public ListSelectionDialog(String title, Window parent, EventList items) { 060 super(title, parent); 061 this.items = items; 062 } 063 064 public void setRenderer(ListCellRenderer renderer) { 065 Assert.notNull(renderer, "Renderer cannot be null."); 066 Assert.isTrue(!isControlCreated(), "Install the renderer before the control is created."); 067 068 this.renderer = renderer; 069 } 070 071 protected JComponent createSelectionComponent() { 072 list = getComponentFactory().createList(); 073 list.setModel(new EventListModel(items)); 074 075 list.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 076 077 list.addListSelectionListener(new ListSelectionListener() { 078 079 private int lastIndex = -1; 080 081 public void valueChanged(ListSelectionEvent e) { 082 if (e.getValueIsAdjusting()) { 083 return; 084 } 085 086 if (list.getSelectionModel().isSelectionEmpty() && lastIndex > -1) { 087 if (list.getModel().getSize() > 0) { 088 list.setSelectedIndex(lastIndex); 089 return; 090 } 091 } 092 093 setFinishEnabled(!list.getSelectionModel().isSelectionEmpty()); 094 lastIndex = list.getSelectedIndex(); 095 } 096 }); 097 098 list.addMouseListener(new MouseAdapter() { 099 public void mouseClicked(MouseEvent e) { 100 if (e.getClickCount() == 2) { 101 getFinishCommand().execute(); 102 } 103 } 104 }); 105 106 if (renderer != null) { 107 list.setCellRenderer(renderer); 108 } 109 110 setFinishEnabled(false); 111 112 if (!items.isEmpty()) { 113 list.setSelectedIndex(0); 114 } 115 116 return new JScrollPane(list); 117 } 118 119 protected Object getSelectedObject() { 120 return items.get(list.getSelectedIndex()); 121 } 122 123 protected final JList getList() { 124 return list; 125 } 126 }