package com.vci.client.ui.swing.components.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;
/**
*
*
Title:
* Description:
* Copyright: Copyright (c) 2012
* Company: VCI
* @author xchao
* @time 2012-5-10
* @version 1.0
*/
public class VCIJTableCheckBoxManager implements IVCIJTableBaseCheckManager {
private byte[] tableCheck = new byte[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 responseCheckListener(ActionEvent ae){
VCIJTableCheckListener[] checkListeners = tablePanel.getListeners(VCIJTableCheckListener.class);
if(checkListeners != null){
for (int i = 0; i < checkListeners.length; i++) {
}
}
}
private void setTableModelFireTableDataChanged(){
table.getModel().addTableModelListener(new TableModelListener(){
public void tableChanged(TableModelEvent e) {
clearSelect();
}
});
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#close()
*/
@Override
public void close() {
clear();
table = null;
}
private void clear() {
tableCheck = new byte[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();
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#setCheckBoxColumn(int)
*/
@Override
public void setCheckBoxColumn(int col) {
checkBoxColumn = col;
if (table != null) {
setColumnAttributes();
}
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#setSelected(int[])
*/
@Override
public void setSelected(int[] indexs) {
for (int i = 0; i < indexs.length; i++) {
tableCheck[indexs[i]] = 1;
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() == 2) {
int selectRow = VCIJTableCheckBoxManager.this.table
.getSelectedRow();
if (selectRow > -1) {
int col = VCIJTableCheckBoxManager.this.table
.columnAtPoint(e.getPoint());
if (col != -1) {
doubleclickedRow(selectRow);
}
}
} else if (e.getClickCount() == 1) {
int selectRow = VCIJTableCheckBoxManager.this.table
.getSelectedRow();
if (selectRow > -1) {
int col = VCIJTableCheckBoxManager.this.table
.columnAtPoint(e.getPoint());
if (col != -1 && col == checkBoxColumn) {
// add by xchao 2012.08.20
// 放开 clickedRow(selectRow) 将导致,点击列头的CheckBox时,需要单击两次才能实现选择中效果
// 估计是与table添加了鼠标单击事件导致的,将其注释掉时,效果与预期一致,因此注释了此行
//clickedRow(selectRow);
// add by xchao 2012.08.20
}
}
}
}
/**
* Invoked when the mouse exits a component.
*/
public void mouseExited(MouseEvent e) {
}
};
table.addMouseListener(nowMouseListen);
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#clickedRow(int)
*/
@Override
public void clickedRow(int rowIndex){
clickCheckBox(rowIndex);
checkedChanged(rowIndex);
table.revalidate();
table.repaint();
}
//*****************************
public void doubleclickedRow(int rowIndex){
doubleclickCheckBox(rowIndex);
checkedChanged(rowIndex);
table.revalidate();
table.repaint();
}
//******************************
protected VCIJTablePanel> tablePanel = null;
public VCIJTableCheckBoxManager(VCIJTablePanel> tablePanel, JTable table) {
this.tablePanel = tablePanel;
this.table = table;
addTableMouseListener();
setColumnAttributes();
setTableModelFireTableDataChanged();
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#removeSet()
*/
@Override
public void removeSet() {
if (table != null) {
table.removeMouseListener(nowMouseListen);
TableColumn tc = table.getColumnModel().getColumn(checkBoxColumn);
tc.setCellRenderer(null);
tc.setCellEditor(null);
}
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#getCheckBox(int)
*/
public JCheckBox getCheckBox(int i) {
return templetBox[tableCheck[i]];
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#isSelected(int)
*/
@Override
public boolean isSelected(int i) {
return tableCheck[i] == 0 ? false : true;
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#size()
*/
@Override
public int size() {
return tableCheck.length;
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#clearCheckBoxList()
*/
@Override
public void clearCheckBoxList() {
createCheckBoxList();
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#createCheckBoxList()
*/
@Override
public void createCheckBoxList() {
tableCheck = new byte[0];
selectedIndexMap = new HashMap();
tableCheckedCount = 0;
checkStata = -1;
selectLogicCheckBoxChecked(true);
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#resetCheckBox(int)
*/
@Override
public void resetCheckBox(int size) {
createCheckBoxList();
addCheckBoxs(size);
checkStata--;
selectLogicCheckBoxChecked(true);
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#getTable()
*/
@Override
public JTable getTable() {
return this.table;
}
{
initCheckBox();
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#initCheckBox()
*/
@Override
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()] == 0 ? false
: true);
}
}
});
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#addCheckBoxs(int)
*/
@Override
public void addCheckBoxs(int size) {
tableCheck = new byte[size];
selectedIndexMap.clear();
// addTableMouseListener();
// setColumnAttributes();
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#setHeaderShowCheckbox(int)
*/
@Override
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] == 1) {
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] = nowCheckStata;
}
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);
headerCheckBox.setBorder(UIManager.getBorder("TableHeader.cellBorder"));
headerCheckBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
responseCheckListener(e);
}
});
}
return headerCheckBox;
}
private void clickCheckBox(int i) {
if (tableCheck != null) {
tableCheck[i] = (byte) (tableCheck[i] == 0 ? 1 : 0);
}
}
//****************************
private void doubleclickCheckBox(int i) {
if (tableCheck != null) {
tableCheck[i] = 0;
}
}
//*******************************
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.setHorizontalAlignment(SwingConstants.CENTER);// 表头标签剧中
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] = 1;
tableCheckedCount++;
}
}
if (tableCheckedCount == 0) {
selectLogicCheckBoxChecked(true);
} else if (tableCheck.length > 0
&& tableCheckedCount == tableCheck.length) {
selectLogicCheckBoxChecked(false);
}
table.revalidate();
table.repaint();
fireChanged = true;
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#changeCheckBoxStata(int)
*/
@Override
public void changeCheckBoxStata(int... stata) {
for (int i = 0; i < stata.length; i++) {
checkStata = stata[i] - 1;
selectLogicCheckBoxChecked(true);
if (checkStata == stata[i]) {
break;
}
}
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#clearAndChangeCheckBoxStata(int)
*/
@Override
public void clearAndChangeCheckBoxStata(int... stata) {
clearSelect();
changeCheckBoxStata(stata);
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#clearSelect()
*/
@Override
public void clearSelect() {
selectAllTable(false);
getHeaderCheckBox().setSelected(false);
getHeaderCheckBox().setEnabled(true);
table.revalidate();
table.repaint();
updateStata();
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#setSelectedCheckIndexs(java.util.List)
*/
@Override
public void setSelectedCheckIndexs(List selectedInx) {
selectedIndexMap = new HashMap();
for (int i = 0; i < selectedInx.size(); i++) {
selectedIndexMap.put(selectedInx.get(i), null);
}
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#getCheckBoxsCellEditor(boolean)
*/
@Override
public TableCellEditor getCheckBoxsCellEditor(boolean addListener) {
TableCellEditor tce = new CheckBoxsCellEditor();
if (addListener)
tce.addCellEditorListener(new CheckBoxCellEditorListener());
return tce;
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#getCheckBoxsCellRenderer()
*/
@Override
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) {
JCheckBox comp = (JCheckBox) templetBox[tableCheck[row]];
//comp.setBackground(table.getBackground());
comp.setOpaque(false);
comp.setHorizontalAlignment(SwingConstants.CENTER);// 表头标签剧中
return (Component) comp;//templetBox[tableCheck[row]];
}
return null;
}
}
private class IndexJCheckBox extends JCheckBox {
public IndexJCheckBox(String text, boolean selected) {
super(text, selected);
}
public IndexJCheckBox() {
super("", false);
}
/**
*
*/
private static final long serialVersionUID = 1L;
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#getSelectedIndexsSet()
*/
@Override
public Set getSelectedIndexsSet(){
return getSelectedIndexsSet(tablePanel.getTableModel());
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#getSelectedIndexsSet(com.vci.base.ui.swing.components.table.VCIJTableModel)
*/
@Override
@Deprecated
public Set getSelectedIndexsSet(VCIJTableModel> baseTableModel){
Set set = new HashSet();
switch (checkStata) {
case SELECT_PART:
set = selectedIndexMap.keySet();
break;
case SELECT_ALL:
HashSet allItem = new HashSet();
for (int i = 0; i < baseTableModel.getList().size(); i++) {
allItem.add(i);
}
set = allItem;
break;
case SELECT_NONE:
set = new HashSet();
break;
}
return set;
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#getSelectedIndexs()
*/
@Override
public int[] getSelectedIndexs() {
return getSelectedIndexs(tablePanel.getTableModel());
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#getSelectedIndexs(com.vci.base.ui.swing.components.table.VCIJTableModel)
*/
@Override
@Deprecated
public int[] getSelectedIndexs(VCIJTableModel> baseTableModel) {
Set set = getSelectedIndexsSet(baseTableModel);
Integer[] ints = new Integer[set.size()];
ints = set.toArray(ints);
Arrays.sort(ints);
int[] res = new int[ints.length];
for (int i = 0; i < res.length; i++) {
res[i] = ints[i].intValue();
}
return res;
}
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();
}
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#removeAllSelectedIndex()
*/
@Override
public void removeAllSelectedIndex() {
selectedIndexMap = new HashMap();
tableCheckedCount = 0;
updateStata();
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#removeAllSelectedIndexAndCheckBox(com.vci.base.ui.swing.components.table.VCIJTableModel)
*/
@Override
@SuppressWarnings("rawtypes")
public void removeAllSelectedIndexAndCheckBox(VCIJTableModel baseTableModel) {
int[] indexs = getSelectedIndexs(baseTableModel);
tableCheck = new byte[tableCheck.length - indexs.length];
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#removeAllSelectedIndexAndCheckBox(java.lang.Integer[])
*/
@Override
public void removeAllSelectedIndexAndCheckBox(Integer[] indexs) {
tableCheck = new byte[tableCheck.length - indexs.length];
for (int i = indexs.length - 1; i >= 0; i--) {
selectedIndexMap.remove(indexs[i]);
}
tableCheckedCount = selectedIndexMap.size();
updateStata();
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#getMaxWidth()
*/
@Override
public int getMaxWidth() {
return maxWidth;
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#setMaxWidth(int)
*/
@Override
public void setMaxWidth(int maxWidth) {
this.maxWidth = maxWidth;
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#getMinWidth()
*/
@Override
public int getMinWidth() {
return minWidth;
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#setMinWidth(int)
*/
@Override
public void setMinWidth(int minWidth) {
this.minWidth = minWidth;
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#getPreferredWidth()
*/
@Override
public int getPreferredWidth() {
return preferredWidth;
}
/* (non-Javadoc)
* @see com.vci.base.ui.swing.components.table.IVCIJTableBaseCheckManager#setPreferredWidth(int)
*/
@Override
public void setPreferredWidth(int preferredWidth) {
this.preferredWidth = preferredWidth;
}
}