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}