package com.bao.lc.site.s3.gui; import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.TitledBorder; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.bao.lc.ResMgr; import com.bao.lc.site.s3.TdUtils; @SuppressWarnings("serial") public class SelectPanel extends JPanel implements ValueBean<List> { private static Log log = LogFactory.getLog(SelectPanel.class); private List<?> rawData = null; private List<Integer> checkedList = null; private List selData = new ArrayList(); private List currValue = null; private JPanel selectedItemPanel = null; private JTextField selectedField = null; private JPanel optionsPanel = null; private List<JCheckBox> checkboxs = null; private JButton selectAllBtn = null; private JButton unselectAllBtn = null; private JPanel confirmBtnPanel = null; private JButton okBtn = null; private JButton closeBtn = null; public SelectPanel(List<?> dataList, List<Integer> checkedList) { this.rawData = dataList; this.checkedList = checkedList; initGUI(); addListeners(); initData(); } private void initGUI() { initSelectedItemPanel(); initOptionsPanel(); initConfirmBtnPanel(); this.setLayout(new BorderLayout()); this.add(selectedItemPanel, BorderLayout.NORTH); this.add(optionsPanel, BorderLayout.CENTER); this.add(confirmBtnPanel, BorderLayout.SOUTH); } private void initSelectedItemPanel() { selectedField = new JTextField(); selectedField.setEditable(false); selectedItemPanel = new JPanel(); selectedItemPanel.setLayout(new GridBagLayout()); JLabel selItemsLabel = new JLabel(ResMgr.getString("td.selected_items")); selectedItemPanel.add(selItemsLabel, new GridBagConstraints(0, 0, 1, 1, 0.0, 1.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(2, 5, 3, 5), 0, 0)); selectedItemPanel .add(selectedField, new GridBagConstraints(1, 0, 1, 1, 1.0, 1.0, GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(2, 10, 3, 10), 0, 0)); selectedItemPanel.setBorder(new TitledBorder(ResMgr.getString("td.selected_items"))); } private void initOptionsPanel() { JPanel checkboxPanel = new JPanel(); checkboxPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 7, 7)); checkboxs = new ArrayList<JCheckBox>(rawData.size()); for(Object option : rawData) { String text = option.toString(); JCheckBox checkbox = new JCheckBox(text); checkboxPanel.add(checkbox); checkboxs.add(checkbox); } JPanel selectBtnPanel = new JPanel(); selectAllBtn = new JButton(ResMgr.getString("td.select_all")); unselectAllBtn = new JButton(ResMgr.getString("td.unselect_all")); selectBtnPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 7, 7)); selectBtnPanel.add(selectAllBtn); selectBtnPanel.add(unselectAllBtn); optionsPanel = new JPanel(); optionsPanel.setLayout(new BorderLayout()); optionsPanel.add(selectBtnPanel, BorderLayout.NORTH); optionsPanel.add(checkboxPanel, BorderLayout.CENTER); optionsPanel.setBorder(new TitledBorder(ResMgr.getString("td.options"))); } private void initConfirmBtnPanel() { okBtn = new JButton(ResMgr.getString("td.ok")); closeBtn = new JButton(ResMgr.getString("td.close")); confirmBtnPanel = new JPanel(); confirmBtnPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 7, 7)); confirmBtnPanel.add(okBtn); confirmBtnPanel.add(closeBtn); } private void addListeners() { for(int i = 0, size = checkboxs.size(); i < size; i++) { final int index = i; final JCheckBox checkbox = checkboxs.get(i); checkbox.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(checkbox.isSelected()) { selData.add(rawData.get(index)); } else { selData.remove(rawData.get(index)); } updateSelectedField(); } }); } selectAllBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { for(int i = 0, size = checkboxs.size(); i < size; i++) { final JCheckBox checkbox = checkboxs.get(i); if(!checkbox.isSelected()) { checkbox.setSelected(true); selData.add(rawData.get(i)); } } updateSelectedField(); } }); unselectAllBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { selData.clear(); for(int i = 0, size = checkboxs.size(); i < size; i++) { final JCheckBox checkbox = checkboxs.get(i); checkbox.setSelected(false); } updateSelectedField(); } }); okBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { List newValue = new ArrayList(selData.size()); newValue.addAll(selData); setValue(newValue); } }); closeBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { setValue(null); } }); } private void initData() { if(checkedList != null) { for(int i : checkedList) { if(i < 0 || i >= checkboxs.size()) { log.error("checkedList contains invalid index: " + i); continue; } checkboxs.get(i).setSelected(true); selData.add(rawData.get(i)); } updateSelectedField(); } } private void updateSelectedField() { //Then update the model data to field of the view if(selData.isEmpty()) { selectedField.setText(""); return; } selectedField.setText(TdUtils.toString(selData, ",")); } @Override public void setValue(List newValue) { List oldValue = currValue; currValue = newValue; firePropertyChange(VALUE_PROPERTY, oldValue, currValue); } @Override public List getValue() { return currValue; } }