001package arcommon.ui.component;
002
003import java.awt.Insets;
004import java.awt.event.ActionEvent;
005import java.awt.event.ActionListener;
006
007import javax.swing.JButton;
008import javax.swing.JList;
009import javax.swing.JPanel;
010import javax.swing.JTable;
011import javax.swing.event.ListDataEvent;
012import javax.swing.event.ListDataListener;
013import javax.swing.event.ListSelectionEvent;
014import javax.swing.event.ListSelectionListener;
015import javax.swing.event.TableModelEvent;
016import javax.swing.event.TableModelListener;
017
018import arcommon.ui.other.GUIUtil;
019
020public abstract class CreateUpdateDeleteButtonBarJComponent extends JPanel {
021    
022    private JButton createButton;
023    private JButton updateJButton;
024    private JButton deleteJButton;
025    
026    private JTable table;
027    private JList<?> list;
028    private MyJList mylist;
029
030    public CreateUpdateDeleteButtonBarJComponent() {
031        this(null);
032    }
033    
034    public CreateUpdateDeleteButtonBarJComponent(Insets insets) {
035        this(null, null, null, null);
036    }
037    
038    public CreateUpdateDeleteButtonBarJComponent(String createLabel, String updateLabel, String deleteLabel) {
039        this(null, createLabel, updateLabel, deleteLabel);
040    }
041    
042    public CreateUpdateDeleteButtonBarJComponent(Insets insets, String createLabel, String updateLabel, String deleteLabel) {
043        createButton = new JButton(createLabel != null ? createLabel : "Create...");
044        add(createButton);
045        if (insets != null) {
046            createButton.setMargin(insets);
047        }
048        createButton.addActionListener(
049            new ActionListener() {
050                public void actionPerformed(ActionEvent e) {
051                    createPressed();
052                }
053            }
054        );
055    
056        updateJButton = new JButton(updateLabel != null ? updateLabel : "Update...");
057        add(updateJButton);
058        updateJButton.setEnabled(false);
059        if (insets != null) {
060            updateJButton.setMargin(insets);
061        }
062        updateJButton.addActionListener(
063            new ActionListener() {
064                public void actionPerformed(ActionEvent e) {
065                    updatePressed();
066                }
067            }
068        );
069        
070        deleteJButton = new JButton(deleteLabel != null ? deleteLabel : "Delete");
071        add(deleteJButton);
072        deleteJButton.setEnabled(false);
073        if (insets != null) {
074            deleteJButton.setMargin(insets);
075        }
076        deleteJButton.addActionListener(
077            new ActionListener() {
078                public void actionPerformed(ActionEvent e) {
079                    deletePressed();
080                }
081            }
082        );
083        
084        GUIUtil.makePanelChangeSizeOnTooManyComponents(this);
085        
086        updateEnabled(false);
087    }
088    
089    public void connectJList(final JList<?> plist) {
090        list = plist;
091        list.addListSelectionListener(new ListSelectionListener() {
092            public void valueChanged(ListSelectionEvent e) {
093                updateEnabledFromList();
094            }
095        });
096        list.getModel().addListDataListener(new ListDataListener() {
097            @Override
098            public void intervalAdded(ListDataEvent e) {
099                updateEnabledFromList();
100            }
101
102            @Override
103            public void intervalRemoved(ListDataEvent e) {
104                updateEnabledFromList();
105            }
106
107            @Override
108            public void contentsChanged(ListDataEvent e) {
109                updateEnabledFromList();
110            }
111        });
112    }
113    
114    public void connectJList(final MyJList plist) {
115        mylist = plist;
116        mylist.addListSelectionListener(new ListSelectionListener() {
117            public void valueChanged(ListSelectionEvent e) {
118                updateEnabledFromMyList();
119            }
120        });
121        mylist.getModel().addListDataListener(new ListDataListener() {
122            @Override
123            public void intervalAdded(ListDataEvent e) {
124                updateEnabledFromMyList();
125            }
126
127            @Override
128            public void intervalRemoved(ListDataEvent e) {
129                updateEnabledFromMyList();
130            }
131
132            @Override
133            public void contentsChanged(ListDataEvent e) {
134                updateEnabledFromMyList();
135            }
136        });
137    }
138    
139    public void connectJTable(MyJTable pmyJTable) {
140        connectJTable(pmyJTable.getTable());
141    }
142    
143    public void connectJTable(JTable ptable) {
144        table = ptable;
145        
146        table.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
147            public void valueChanged(ListSelectionEvent e) {
148                if (e.getValueIsAdjusting()) {
149                    return ;
150                }
151
152                updateEnabledFromTable();
153            }
154        });
155        
156        table.getModel().addTableModelListener(new TableModelListener() {
157            public void tableChanged(TableModelEvent e) {
158                updateEnabledFromTable();
159            }
160        });
161    }
162    
163    public void setEnabled(boolean enabled) {
164        createButton.setEnabled(enabled);
165        if (enabled) {
166            if (table != null) {
167                updateEnabledFromTable();
168            } else if (list != null) {
169                updateEnabledFromList();
170            } else if (mylist != null) {
171                updateEnabledFromMyList();
172            }
173        } else {
174            updateEnabled(false);
175        }
176    }
177    
178    private void updateEnabledFromTable() {
179        int selectedIndex = table.getSelectedRow();
180        int rowCount = table.getModel().getRowCount();
181        if (rowCount == 0) { // HACK: For some odd reason getSelectedRow() can be != -1 when getRowCount() == 0
182            selectedIndex = -1;
183        }
184        boolean enabled = selectedIndex != -1;
185        updateEnabled(enabled);
186    }
187    
188    private void updateEnabledFromList() {
189        int selectedIndex = list.getSelectedIndex();
190        boolean enabled = selectedIndex != -1;
191        updateEnabled(enabled);
192    }
193    
194    private void updateEnabledFromMyList() {
195        int selectedIndex = mylist.getSelectedIndex();
196        boolean enabled = selectedIndex != -1;
197        updateEnabled(enabled);
198    }
199    
200    private void updateEnabled(boolean enabled) {
201        updateJButton.setEnabled(enabled);
202        deleteJButton.setEnabled(enabled);
203    }
204    
205    public abstract void createPressed();
206    
207    public abstract void updatePressed();
208    
209    public abstract void deletePressed();
210    
211    private static final long serialVersionUID = -9207637761823940281L;
212}