package com.vci.client.ui.table; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import javax.swing.DefaultCellEditor; import javax.swing.JCheckBox; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.event.CellEditorListener; import javax.swing.event.ChangeEvent; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.JTableHeader; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; import javax.swing.table.TableColumn; import javax.swing.table.TableColumnModel; public class TableCheckboxManager { public static final int SELECT_PART = 0; public static final int SELECT_ALL = 1; public static final int SELECT_NONE = 2; private boolean[] tableCheck = new boolean[0]; private IndexJCheckBox[] templetBox = new IndexJCheckBox[] { new IndexJCheckBox((String) null, false), new IndexJCheckBox((String) null, true) }; private JTable table; private JCheckBox headerCheckBox; private int checkStata = -1; private Map selectedIndexMap = new HashMap(); private int tableCheckedCount = 0; private boolean fireChanged = true; private int headerCheckBoxColumn = 0; private int checkBoxColumn = 0; private static final int DFAULT_MAX_WIDTH = 23; private static final int DFAULT_MIN_WIDTH = 23; private static final int DFAULT_PREFERRED_WIDTH = 23; private int maxWidth = DFAULT_MAX_WIDTH; private int minWidth = DFAULT_MIN_WIDTH; private int preferredWidth = DFAULT_PREFERRED_WIDTH; private IndexJCheckBox editorCheckBox = new IndexJCheckBox(); private MouseListener nowMouseListen = null; private ActionListener actionChange = new ActionListener() { public void actionPerformed(ActionEvent e) { clickCheckBox(table.getEditingRow()); checkedChanged2(table.getEditingRow()); } }; private void setTableModelFireTableDataChanged(){ table.getModel().addTableModelListener(new TableModelListener(){ public void tableChanged(TableModelEvent e) { clearSelect(); } }); } public void close() { clear(); table = null; } private void clear() { tableCheck = new boolean[0]; // @jve:decl-index=0: table = null; headerCheckBox = null; checkStata = -1; selectedIndexMap = new HashMap(); tableCheckedCount = 0; fireChanged = true; // addCheckBox = null; headerCheckBoxColumn = 0; checkBoxColumn = 0; removeSet(); } public void setCheckBoxColumn(int col) { checkBoxColumn = col; if (table != null) { setColumnAttributes(); } } public void setSelected(int[] indexs) { for (int i = 0; i < indexs.length; i++) { tableCheck[indexs[i]] = true; tableCheckedCount++; } updateStata(); table.revalidate(); table.repaint(); } private void setColumnAttributes() { TableColumn tc = table.getColumnModel().getColumn(checkBoxColumn); tc.setPreferredWidth(preferredWidth); tc.setMaxWidth(maxWidth); tc.setMinWidth(minWidth); tc.setCellRenderer(getCheckBoxsCellRenderer()); tc.setCellEditor(getCheckBoxsCellEditor(true)); } private void addTableMouseListener() { nowMouseListen = new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent e) { if (e.getButton() != java.awt.event.MouseEvent.BUTTON1) return; if (e.getClickCount() == 1) { int selectRow = TableCheckboxManager.this.table .getSelectedRow(); if (selectRow > -1) { int col = TableCheckboxManager.this.table .columnAtPoint(e.getPoint()); if (col != -1 && col == checkBoxColumn) { clickCheckBox(selectRow); checkedChanged(selectRow); table.revalidate(); table.repaint(); } } } } /** * Invoked when the mouse exits a component. */ public void mouseExited(MouseEvent e) { } }; table.addMouseListener(nowMouseListen); } public TableCheckboxManager() { } public TableCheckboxManager(JTable table) { this.table = table; addTableMouseListener(); setColumnAttributes(); setTableModelFireTableDataChanged(); } public TableCheckboxManager(List checkBoxs) { saveCheckBoxListStata(checkBoxs); } public TableCheckboxManager(JTable table, List checkBoxs) { this(table); saveCheckBoxListStata(checkBoxs); } private void saveCheckBoxListStata(List checkBoxs) { tableCheck = new boolean[checkBoxs.size()]; for (int i = 0; i < checkBoxs.size(); i++) { tableCheck[i] = checkBoxs.get(i).isSelected(); } } public void setTable(JTable table) { clear(); boolean addMouseLisen = false; if (this.table != table) { addMouseLisen = true; } if (addMouseLisen) { this.table = table; addTableMouseListener(); setColumnAttributes(); } } public void removeSet() { if (table != null) { table.removeMouseListener(nowMouseListen); TableColumn tc = table.getColumnModel().getColumn(checkBoxColumn); tc.setCellRenderer(null); tc.setCellEditor(null); } } public JCheckBox getCheckBox(int i) { return templetBox[tableCheck[i] ? 1 : 0]; } public boolean isSelected(int i) { return tableCheck[i]; } public int size() { return tableCheck.length; } public void clearCheckBoxList() { createCheckBoxList(); } public void createCheckBoxList() { tableCheck = new boolean[0]; selectedIndexMap = new HashMap(); tableCheckedCount = 0; checkStata = -1; selectLogicCheckBoxChecked(true); } public void resetCheckBox(int size) { createCheckBoxList(); addCheckBoxs(size); checkStata--; selectLogicCheckBoxChecked(true); } // public List getCheckBoxList() { // return tableCheck; // } // public void setCheckBoxList(List checkBoxList) { // tableCheck = checkBoxList; // } public JTable getTable() { return this.table; } { initCheckBox(); } public void initCheckBox() { for (int i = 0; i < templetBox.length; i++) { // templetBox[i].addChangeListener(checkChange); templetBox[i].setVisible(true); } editorCheckBox.addActionListener(actionChange); editorCheckBox.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if (table.getEditingRow() > 0 && table.getEditingRow() < tableCheck.length) { editorCheckBox.setSelected(tableCheck[table.getEditingRow()]); } } }); } public void addCheckBoxs(int size) { tableCheck = new boolean[size]; // addTableMouseListener(); // setColumnAttributes(); } public void setHeaderShowCheckbox(int col) { headerCheckBoxColumn = col; final JTableHeader jh = table.getTableHeader(); TableColumnModel headerColumnMode = jh.getColumnModel(); headerColumnMode.getColumn(0).setHeaderRenderer( new TableHeaderRenderer(getHeaderCheckBox())); jh.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent e) { int column; if ((column = jh.columnAtPoint(e.getPoint())) != -1) { TableColumn tc = table.getColumnModel().getColumn( checkBoxColumn); tc.getCellEditor().cancelCellEditing(); if (column == headerCheckBoxColumn) { selectLogicCheckBoxChecked(true); jh.repaint(); } } } }); } private void selectLogicCheckBoxChecked(boolean seleteSaveTable) { checkStata++; if (checkStata == 3) { checkStata = 0; } switch (checkStata) { case SELECT_PART: getHeaderCheckBox().setSelected(true); getHeaderCheckBox().setEnabled(false); if (seleteSaveTable) { seletedCheckBoxCheck(); } break; case SELECT_ALL: getHeaderCheckBox().setSelected(true); getHeaderCheckBox().setEnabled(true); if (seleteSaveTable) { selectAllTable(true); } break; case SELECT_NONE: getHeaderCheckBox().setSelected(false); getHeaderCheckBox().setEnabled(true); if (seleteSaveTable) { selectAllTable(false); } break; } table.getTableHeader().repaint(); } private void checkedChanged(int index) { if (fireChanged && !table.isEditing()) { changeStata(index); } } private void checkedChanged2(int index) { if (table.isEditing()) { changeStata(index); } } private void changeStata(int index) { if (checkStata == SELECT_NONE) { selectedIndexMap = new HashMap(); } if (checkStata == SELECT_ALL) { selectedIndexMap = new HashMap(); for (int i = 0; i < tableCheck.length; i++) { selectedIndexMap.put(i, null); } } if (tableCheck[index]) { tableCheckedCount++; selectedIndexMap.put(index, null); } else { tableCheckedCount--; selectedIndexMap.remove(index); } updateStata(); } private void updateStata() { int changedStata = 0; if (tableCheckedCount != 0) { if (tableCheckedCount == tableCheck.length) { changedStata = SELECT_ALL; } else { changedStata = SELECT_PART; } } else { changedStata = SELECT_NONE; } if (changedStata != checkStata) { changedStata--; checkStata = changedStata; selectLogicCheckBoxChecked(false); table.getTableHeader().repaint(); } } private void selectAllTable(boolean check) { fireChanged = false; //byte nowCheckStata = (byte) (check ? 1 : 0); for (int i = 0; i < tableCheck.length; i++) { tableCheck[i] = check; } if (check) { tableCheckedCount = tableCheck.length; } else { tableCheckedCount = 0; } table.revalidate(); table.repaint(); fireChanged = true; } private JCheckBox getHeaderCheckBox() { if (headerCheckBox == null) { headerCheckBox = new JCheckBox(); headerCheckBox.setBorderPainted(true); } return headerCheckBox; } private void clickCheckBox(int i) { if (tableCheck != null) { tableCheck[i] = !tableCheck[i]; } } protected class TableHeaderRenderer implements TableCellRenderer { private JCheckBox renderCheckBoxs; public TableHeaderRenderer(JCheckBox tableCheck) { renderCheckBoxs = tableCheck; } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { renderCheckBoxs.setBorderPainted(true); renderCheckBoxs.setBorder(UIManager.getBorder("TableHeader.cellBorder")); return renderCheckBoxs; } } private void seletedCheckBoxCheck() { fireChanged = false; tableCheckedCount = 0; Set keys = selectedIndexMap.keySet(); int checkIndex = 0; for (Iterator keyItr = keys.iterator(); keyItr.hasNext();) { checkIndex = keyItr.next(); if (tableCheck.length > checkIndex) { tableCheck[checkIndex] = true; tableCheckedCount++; } } if (tableCheckedCount == 0) { selectLogicCheckBoxChecked(true); } else if (tableCheck.length > 0 && tableCheckedCount == tableCheck.length) { selectLogicCheckBoxChecked(false); } table.revalidate(); table.repaint(); fireChanged = true; } public void changeCheckBoxStata(int... stata) { for (int i = 0; i < stata.length; i++) { checkStata = stata[i] - 1; selectLogicCheckBoxChecked(true); if (checkStata == stata[i]) { break; } } } public void clearAndChangeCheckBoxStata(int... stata) { clearSelect(); changeCheckBoxStata(stata); } public void clearSelect() { selectAllTable(false); getHeaderCheckBox().setSelected(false); getHeaderCheckBox().setEnabled(true); table.revalidate(); table.repaint(); updateStata(); } public void setSelectedCheckIndexs(List selectedInx) { selectedIndexMap = new HashMap(); for (int i = 0; i < selectedInx.size(); i++) { selectedIndexMap.put(selectedInx.get(i), null); } } public TableCellEditor getCheckBoxsCellEditor(boolean addListener) { TableCellEditor tce = new CheckBoxsCellEditor(); if (addListener) tce.addCellEditorListener(new CheckBoxCellEditorListener()); return tce; } public TableCellRenderer getCheckBoxsCellRenderer() { return new CheckBoxsRenderer(); } class CheckBoxsCellEditor extends DefaultCellEditor { /** * */ private static final long serialVersionUID = -1875319868682535006L; public CheckBoxsCellEditor() { super(new JTextField()); } public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { return editorCheckBox; } } protected class CheckBoxsRenderer implements TableCellRenderer { public CheckBoxsRenderer() { } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (row < tableCheck.length) { return (Component) templetBox[tableCheck[row] ? 1 : 0]; } return null; } } private class IndexJCheckBox extends JCheckBox { public IndexJCheckBox(String text, boolean selected) { super(text, selected); } public IndexJCheckBox() { super(); } /** * */ private static final long serialVersionUID = 1L; private int index = 0; public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } } public Set getSelectedIndexSet(VCIBaseTableModel baseTableModel) { switch (checkStata) { case SELECT_PART: return selectedIndexMap.keySet(); case SELECT_ALL: HashSet allItem = new HashSet(); for (int i = 0; i < baseTableModel.list.size(); i++) { allItem.add(i); } return allItem; case SELECT_NONE: return new HashSet(); } return new HashSet(); } class CheckBoxCellEditorListener implements CellEditorListener { int row; int col; public void editingStopped(ChangeEvent e) { table.revalidate(); table.repaint(); // editorCheckBox // .setSelected(tableCheck[table.getEditingRow()] == 0 ? false // : true); // editorCheckBox.setIndex(table.getEditingRow()); } public void editingCanceled(ChangeEvent e) { table.revalidate(); table.repaint(); } } public void removeAllSelectedIndex() { selectedIndexMap = new HashMap(); tableCheckedCount = 0; updateStata(); } public Integer[] getSortedSelectedIndexs(VCIBaseTableModel baseTableModel) { Set selectIndex = getSelectedIndexSet(baseTableModel); Integer[] indexs = new Integer[selectIndex.size()]; indexs = selectIndex.toArray(indexs); Arrays.sort(indexs); return indexs; } public void removeAllSelectedIndexAndCheckBox(VCIBaseTableModel baseTableModel) { Integer[] indexs = getSortedSelectedIndexs(baseTableModel); tableCheck = new boolean[tableCheck.length - indexs.length]; } public void removeAllSelectedIndexAndCheckBox(Integer[] indexs) { tableCheck = new boolean[tableCheck.length - indexs.length]; for (int i = indexs.length - 1; i >= 0; i--) { selectedIndexMap.remove(indexs[i]); } tableCheckedCount = selectedIndexMap.size(); updateStata(); } /** * maxWidth * @return maxWidth */ public int getMaxWidth() { return maxWidth; } /** * maxWidth * @param maxWidth maxWidth */ public void setMaxWidth(int maxWidth) { this.maxWidth = maxWidth; } /** * minWidth * @return minWidth */ public int getMinWidth() { return minWidth; } /** * minWidth * @param minWidth minWidth */ public void setMinWidth(int minWidth) { this.minWidth = minWidth; } /** * preferredWidth * @return preferredWidth */ public int getPreferredWidth() { return preferredWidth; } /** * preferredWidth * @param preferredWidth preferredWidth */ public void setPreferredWidth(int preferredWidth) { this.preferredWidth = preferredWidth; } }