001package jmri.jmrit.roster.swing; 002 003import java.awt.FlowLayout; 004import java.awt.event.ActionEvent; 005import java.awt.event.ActionListener; 006import java.beans.PropertyChangeEvent; 007import java.beans.PropertyChangeListener; 008import javax.swing.JPanel; 009import jmri.jmrit.roster.RosterEntry; 010import jmri.jmrit.roster.RosterEntrySelector; 011import jmri.jmrit.roster.rostergroup.RosterGroupSelector; 012 013/** 014 * 015 * @author Randall Wood 016 */ 017public class RosterEntrySelectorPanel extends JPanel implements RosterEntrySelector, RosterGroupSelector { 018 019 private RosterEntryComboBox entryCombo; 020 private RosterGroupComboBox groupCombo; 021 private boolean isHighlightingOnly = false; 022 023 public RosterEntrySelectorPanel() { 024 this(null, null); 025 } 026 027 public RosterEntrySelectorPanel(RosterEntry re, String rg) { 028 super(); 029 this.setLayout(new FlowLayout()); 030 this.entryCombo = new RosterEntryComboBox(rg); 031 if (re != null) { 032 this.entryCombo.setSelectedItem(re.titleString()); 033 } 034 this.groupCombo = new RosterGroupComboBox(rg); 035 this.add(groupCombo); 036 this.add(entryCombo); 037 038 this.groupCombo.addActionListener(new ActionListener() { 039 040 @Override 041 public void actionPerformed(ActionEvent ae) { 042 entryCombo.update(getSelectedRosterGroup()); 043 } 044 045 }); 046 047 this.entryCombo.addPropertyChangeListener(new PropertyChangeListener() { 048 049 @Override 050 public void propertyChange(PropertyChangeEvent pce) { 051 052 if (pce.getPropertyName().equals(RosterEntrySelector.SELECTED_ROSTER_ENTRIES)) { 053 if (isHighlightingOnly) { 054 fireHighlightedRosterEntriesPropertyChange(pce.getOldValue(), pce.getNewValue()); 055 return; 056 } 057 fireSelectedRosterEntriesPropertyChange(pce.getOldValue(), pce.getNewValue()); 058 } 059 } 060 }); 061 } 062 063 protected void fireSelectedRosterEntriesPropertyChange(Object oldValue, Object newValue) { 064 this.firePropertyChange(RosterEntrySelector.SELECTED_ROSTER_ENTRIES, oldValue, newValue); 065 } 066 067 protected void fireHighlightedRosterEntriesPropertyChange(Object oldValue, Object newValue) { 068 this.firePropertyChange(RosterEntrySelector.HIGHLIGHTED_ROSTER_ENTRIES, oldValue, newValue); 069 } 070 071 @Override 072 public RosterEntry[] getSelectedRosterEntries() { 073 return entryCombo.getSelectedRosterEntries(); 074 } 075 076 public void setSelectedRosterEntry() { 077 entryCombo.setSelectedItem(entryCombo.getSelectedItem()); 078 } 079 080 public void setSelectedRosterEntry(RosterEntry re) { 081 entryCombo.setSelectedItem(re); 082 } 083 084 public void setSelectedRosterEntryAndGroup(RosterEntry re, String rg) { 085 this.setSelectedRosterEntry(re); 086 this.setSelectedRosterGroup(rg); 087 } 088 089 @Override 090 public String getSelectedRosterGroup() { 091 return groupCombo.getSelectedRosterGroup(); 092 } 093 094 public void setSelectedRosterGroup(String rg) { 095 groupCombo.update(rg); 096 } 097 098 public RosterEntryComboBox getRosterEntryComboBox() { 099 return entryCombo; 100 } 101 102 public RosterGroupComboBox getRosterGroupComboBox() { 103 return groupCombo; 104 } 105 106 @Override 107 public void setEnabled(boolean enabled) { 108 this.entryCombo.setEnabled(enabled); 109 this.groupCombo.setEnabled(enabled); 110 } 111 112 @Override 113 public boolean isEnabled() { 114 return this.entryCombo.isEnabled(); 115 } 116 117 public String getNonSelectedItem() { 118 return this.entryCombo.getNonSelectedItem(); 119 } 120 121 public void setNonSelectedItem(String itemText) { 122 this.entryCombo.setNonSelectedItem(itemText); 123 } 124 125 public int getRosterListSelectedIndex() { 126 return this.entryCombo.getSelectedIndex(); 127 } 128 129 /** 130 * Set the roster entry combo box selected index, no event will be fired to listeners. 131 * If required, entry has to be validated afterwardsby calling setSelectedRosterEntry() 132 * Used to set the selected roster entry from external controls without firing property change events. 133 * 134 * @param index the index to select in the roster entry combo box 135 */ 136 public void setRosterListSelectedIndex(int index) { 137 if (index < 0 || index >= this.entryCombo.getItemCount()) { 138 return; 139 } 140 isHighlightingOnly = true; 141 this.entryCombo.setSelectedIndex(index); 142 isHighlightingOnly = false; 143 } 144 145}