FixedColumnTable.java

1
package com.jsql.view.swing.table;
2
3
import javax.swing.*;
4
import javax.swing.event.ChangeEvent;
5
import javax.swing.event.ChangeListener;
6
import javax.swing.table.DefaultTableModel;
7
import javax.swing.table.TableColumn;
8
import javax.swing.table.TableColumnModel;
9
import java.beans.PropertyChangeEvent;
10
import java.beans.PropertyChangeListener;
11
12
/**
13
 *  Prevent the specified number of columns from scrolling horizontally in
14
 *  the scroll pane. The table must already exist in the scroll pane.
15
 *
16
 *  The functionality is accomplished by creating a second JTable (fixed)
17
 *  that will share the TableModel and SelectionModel of the main table.
18
 *  This table will be used as the row header of the scroll pane.
19
 *
20
 *  The fixed table created can be accessed by using the getFixedTable()
21
 *  method. will be returned from this method. It will allow you to:
22
 *
23
 *  You can change the model of the main table and the change will be
24
 *  reflected in the fixed model. However, you cannot change the structure
25
 *  of the model.
26
 */
27
public class FixedColumnTable implements ChangeListener, PropertyChangeListener {
28
    
29
    private JTable mainTable;
30
    private JTable fixedTable;
31
    private JScrollPane scrollPane;
32
33
    /**
34
     *  Specify the number of columns to be fixed and the scroll pane
35
     *  containing the table.
36
     */
37
    public void fixColumnSize(int fixedColumns, JScrollPane scrollPane) {
38
        this.scrollPane = scrollPane;
39
40
        this.mainTable = (JTable) scrollPane.getViewport().getView();
41 1 1. fixColumnSize : removed call to javax/swing/JTable::setAutoCreateColumnsFromModel → NO_COVERAGE
        this.mainTable.setAutoCreateColumnsFromModel(false);
42 1 1. fixColumnSize : removed call to javax/swing/JTable::addPropertyChangeListener → NO_COVERAGE
        this.mainTable.addPropertyChangeListener(this);
43
44
        //  Use the existing table to create a new table sharing
45
        //  the DataModel and ListSelectionModel
46
        this.fixedTable = new JTable() {
47
            @Override
48
            public boolean isCellEditable(int row,int column) {
49 1 1. isCellEditable : replaced boolean return with true for com/jsql/view/swing/table/FixedColumnTable$1::isCellEditable → NO_COVERAGE
                return false;
50
            }
51
        };
52
        
53 1 1. fixColumnSize : removed call to javax/swing/JTable::setAutoCreateColumnsFromModel → NO_COVERAGE
        this.fixedTable.setAutoCreateColumnsFromModel(false);
54
        
55
        final DefaultTableModel modelFixedTable = new DefaultTableModel() {
56
            @Override
57
            public int getColumnCount() {
58 1 1. getColumnCount : replaced int return with 0 for com/jsql/view/swing/table/FixedColumnTable$2::getColumnCount → NO_COVERAGE
                return 2;
59
            }
60
            @Override
61
            public boolean isCellEditable(int row, int col) {
62 1 1. isCellEditable : replaced boolean return with true for com/jsql/view/swing/table/FixedColumnTable$2::isCellEditable → NO_COVERAGE
                return false;
63
            }
64
            @Override
65
            public int getRowCount() {
66 1 1. getRowCount : replaced int return with 0 for com/jsql/view/swing/table/FixedColumnTable$2::getRowCount → NO_COVERAGE
                return FixedColumnTable.this.mainTable.getRowCount();
67
            }
68
            @Override
69
            public Class<?> getColumnClass(int colNum) {
70
                Class<?> columnClass;
71 1 1. getColumnClass : negated conditional → NO_COVERAGE
                if (colNum == 0) {
72
                    columnClass = String.class;
73
                } else {
74
                    columnClass = super.getColumnClass(colNum);
75
                }
76 1 1. getColumnClass : replaced return value with null for com/jsql/view/swing/table/FixedColumnTable$2::getColumnClass → NO_COVERAGE
                return columnClass;
77
            }
78
        };
79
        
80 1 1. fixColumnSize : removed call to javax/swing/JTable::setModel → NO_COVERAGE
        this.fixedTable.setModel(modelFixedTable);
81 1 1. fixColumnSize : removed call to javax/swing/JTable::setSelectionModel → NO_COVERAGE
        this.fixedTable.setSelectionModel(this.mainTable.getSelectionModel());
82
        
83 1 1. fixColumnSize : removed call to javax/swing/JTable::setRowHeight → NO_COVERAGE
        this.fixedTable.setRowHeight(20);
84 1 1. fixColumnSize : removed call to javax/swing/JTable::setFocusable → NO_COVERAGE
        this.fixedTable.setFocusable(false);
85 1 1. fixColumnSize : removed call to javax/swing/table/JTableHeader::setReorderingAllowed → NO_COVERAGE
        this.fixedTable.getTableHeader().setReorderingAllowed(false);
86
        
87
        //  Remove the fixed columns from the main table
88
        //  and add them to the fixed table
89
        TableColumnModel columnModel = this.mainTable.getColumnModel();
90 2 1. fixColumnSize : negated conditional → NO_COVERAGE
2. fixColumnSize : changed conditional boundary → NO_COVERAGE
        for (var i = 0 ; i < fixedColumns ; i++) {
91
            TableColumn column = columnModel.getColumn(i);
92 1 1. fixColumnSize : removed call to javax/swing/table/TableColumn::setMinWidth → NO_COVERAGE
            column.setMinWidth(0);
93 1 1. fixColumnSize : removed call to javax/swing/table/TableColumn::setMaxWidth → NO_COVERAGE
            column.setMaxWidth(0);
94 1 1. fixColumnSize : removed call to javax/swing/table/TableColumnModel::addColumn → NO_COVERAGE
            this.fixedTable.getColumnModel().addColumn(new TableColumn(i));
95
        }
96
97 1 1. fixColumnSize : removed call to javax/swing/table/TableColumn::setCellRenderer → NO_COVERAGE
        this.fixedTable.getColumnModel().getColumn(0).setCellRenderer(new RowHeaderRenderer());
98 1 1. fixColumnSize : removed call to javax/swing/table/TableColumn::setResizable → NO_COVERAGE
        this.fixedTable.getColumnModel().getColumn(0).setResizable(false);
99 1 1. fixColumnSize : removed call to javax/swing/table/TableColumn::setPreferredWidth → NO_COVERAGE
        this.fixedTable.getColumnModel().getColumn(0).setPreferredWidth(38);
100 1 1. fixColumnSize : removed call to javax/swing/table/TableColumn::setCellRenderer → NO_COVERAGE
        this.fixedTable.getColumnModel().getColumn(1).setCellRenderer(new RowHeaderRenderer());
101 1 1. fixColumnSize : removed call to javax/swing/table/TableColumn::setResizable → NO_COVERAGE
        this.fixedTable.getColumnModel().getColumn(1).setResizable(false);
102 1 1. fixColumnSize : removed call to javax/swing/table/TableColumn::setPreferredWidth → NO_COVERAGE
        this.fixedTable.getColumnModel().getColumn(1).setPreferredWidth(38);
103
104 1 1. fixColumnSize : removed call to javax/swing/RowSorter::addRowSorterListener → NO_COVERAGE
        this.mainTable.getRowSorter().addRowSorterListener(rowSorterEvent -> {
105 1 1. lambda$fixColumnSize$0 : removed call to javax/swing/table/DefaultTableModel::fireTableDataChanged → NO_COVERAGE
            modelFixedTable.fireTableDataChanged();
106
            // Copy data from hidden column in main table
107 2 1. lambda$fixColumnSize$0 : negated conditional → NO_COVERAGE
2. lambda$fixColumnSize$0 : changed conditional boundary → NO_COVERAGE
            for (var i = 0; i < this.mainTable.getRowCount() ; i++) {
108 1 1. lambda$fixColumnSize$0 : removed call to javax/swing/JTable::setValueAt → NO_COVERAGE
                this.fixedTable.setValueAt(this.mainTable.getValueAt(i, 0), i, 0);
109 1 1. lambda$fixColumnSize$0 : removed call to javax/swing/JTable::setValueAt → NO_COVERAGE
                this.fixedTable.setValueAt(this.mainTable.getValueAt(i, 1), i, 1);
110
            }
111
        });
112
        
113 1 1. fixColumnSize : removed call to javax/swing/ListSelectionModel::addListSelectionListener → NO_COVERAGE
        this.mainTable.getSelectionModel().addListSelectionListener(listSelectionEvent ->
114 2 1. lambda$fixColumnSize$1 : Replaced integer subtraction with addition → NO_COVERAGE
2. lambda$fixColumnSize$1 : removed call to javax/swing/table/DefaultTableModel::fireTableRowsUpdated → NO_COVERAGE
            modelFixedTable.fireTableRowsUpdated(0, modelFixedTable.getRowCount() - 1)
115
        );
116
        
117
        // Copy data from first column of main table to fixed column
118 2 1. fixColumnSize : changed conditional boundary → NO_COVERAGE
2. fixColumnSize : negated conditional → NO_COVERAGE
        for (var i = 0 ; i < this.mainTable.getRowCount() ; i++) {
119 1 1. fixColumnSize : removed call to javax/swing/JTable::setValueAt → NO_COVERAGE
            this.fixedTable.setValueAt(this.mainTable.getValueAt(i, 0), i, 0);
120 1 1. fixColumnSize : removed call to javax/swing/JTable::setValueAt → NO_COVERAGE
            this.fixedTable.setValueAt(this.mainTable.getValueAt(i, 1), i, 1);
121
        }
122
        
123
        //  Add the fixed table to the scroll pane
124 1 1. fixColumnSize : removed call to javax/swing/JTable::setPreferredScrollableViewportSize → NO_COVERAGE
        this.fixedTable.setPreferredScrollableViewportSize(this.fixedTable.getPreferredSize());
125 1 1. fixColumnSize : removed call to javax/swing/JScrollPane::setRowHeaderView → NO_COVERAGE
        scrollPane.setRowHeaderView(this.fixedTable);
126 1 1. fixColumnSize : removed call to javax/swing/JScrollPane::setCorner → NO_COVERAGE
        scrollPane.setCorner(ScrollPaneConstants.UPPER_LEFT_CORNER, this.fixedTable.getTableHeader());
127
128
        // Synchronize scrolling of the row header with the main table
129 1 1. fixColumnSize : removed call to javax/swing/JViewport::addChangeListener → NO_COVERAGE
        scrollPane.getRowHeader().addChangeListener(this);
130
    }
131
132
    /**
133
     * Implement the ChangeListener
134
     */
135
    @Override
136
    public void stateChanged(ChangeEvent e) {
137
        //  Sync the scroll pane scrollbar with the row header
138
        JViewport viewport = (JViewport) e.getSource();
139 1 1. stateChanged : removed call to javax/swing/JScrollBar::setValue → NO_COVERAGE
        this.scrollPane.getVerticalScrollBar().setValue(viewport.getViewPosition().y);
140
    }
141
    
142
    /**
143
     * Implement the PropertyChangeListener
144
     */
145
    @Override
146
    public void propertyChange(PropertyChangeEvent e) {
147
        //  Keep the fixed table in sync with the main table
148 1 1. propertyChange : negated conditional → NO_COVERAGE
        if ("selectionModel".equals(e.getPropertyName())) {
149 1 1. propertyChange : removed call to javax/swing/JTable::setSelectionModel → NO_COVERAGE
            this.fixedTable.setSelectionModel(this.mainTable.getSelectionModel());
150
        }
151
152 1 1. propertyChange : negated conditional → NO_COVERAGE
        if ("model".equals(e.getPropertyName())) {
153 1 1. propertyChange : removed call to javax/swing/JTable::setModel → NO_COVERAGE
            this.fixedTable.setModel(this.mainTable.getModel());
154
        }
155
    }
156
}

Mutations

41

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/JTable::setAutoCreateColumnsFromModel → NO_COVERAGE

42

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/JTable::addPropertyChangeListener → NO_COVERAGE

49

1.1
Location : isCellEditable
Killed by : none
replaced boolean return with true for com/jsql/view/swing/table/FixedColumnTable$1::isCellEditable → NO_COVERAGE

53

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/JTable::setAutoCreateColumnsFromModel → NO_COVERAGE

58

1.1
Location : getColumnCount
Killed by : none
replaced int return with 0 for com/jsql/view/swing/table/FixedColumnTable$2::getColumnCount → NO_COVERAGE

62

1.1
Location : isCellEditable
Killed by : none
replaced boolean return with true for com/jsql/view/swing/table/FixedColumnTable$2::isCellEditable → NO_COVERAGE

66

1.1
Location : getRowCount
Killed by : none
replaced int return with 0 for com/jsql/view/swing/table/FixedColumnTable$2::getRowCount → NO_COVERAGE

71

1.1
Location : getColumnClass
Killed by : none
negated conditional → NO_COVERAGE

76

1.1
Location : getColumnClass
Killed by : none
replaced return value with null for com/jsql/view/swing/table/FixedColumnTable$2::getColumnClass → NO_COVERAGE

80

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/JTable::setModel → NO_COVERAGE

81

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/JTable::setSelectionModel → NO_COVERAGE

83

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/JTable::setRowHeight → NO_COVERAGE

84

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/JTable::setFocusable → NO_COVERAGE

85

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/table/JTableHeader::setReorderingAllowed → NO_COVERAGE

90

1.1
Location : fixColumnSize
Killed by : none
negated conditional → NO_COVERAGE

2.2
Location : fixColumnSize
Killed by : none
changed conditional boundary → NO_COVERAGE

92

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/table/TableColumn::setMinWidth → NO_COVERAGE

93

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/table/TableColumn::setMaxWidth → NO_COVERAGE

94

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/table/TableColumnModel::addColumn → NO_COVERAGE

97

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/table/TableColumn::setCellRenderer → NO_COVERAGE

98

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/table/TableColumn::setResizable → NO_COVERAGE

99

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/table/TableColumn::setPreferredWidth → NO_COVERAGE

100

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/table/TableColumn::setCellRenderer → NO_COVERAGE

101

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/table/TableColumn::setResizable → NO_COVERAGE

102

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/table/TableColumn::setPreferredWidth → NO_COVERAGE

104

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/RowSorter::addRowSorterListener → NO_COVERAGE

105

1.1
Location : lambda$fixColumnSize$0
Killed by : none
removed call to javax/swing/table/DefaultTableModel::fireTableDataChanged → NO_COVERAGE

107

1.1
Location : lambda$fixColumnSize$0
Killed by : none
negated conditional → NO_COVERAGE

2.2
Location : lambda$fixColumnSize$0
Killed by : none
changed conditional boundary → NO_COVERAGE

108

1.1
Location : lambda$fixColumnSize$0
Killed by : none
removed call to javax/swing/JTable::setValueAt → NO_COVERAGE

109

1.1
Location : lambda$fixColumnSize$0
Killed by : none
removed call to javax/swing/JTable::setValueAt → NO_COVERAGE

113

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/ListSelectionModel::addListSelectionListener → NO_COVERAGE

114

1.1
Location : lambda$fixColumnSize$1
Killed by : none
Replaced integer subtraction with addition → NO_COVERAGE

2.2
Location : lambda$fixColumnSize$1
Killed by : none
removed call to javax/swing/table/DefaultTableModel::fireTableRowsUpdated → NO_COVERAGE

118

1.1
Location : fixColumnSize
Killed by : none
changed conditional boundary → NO_COVERAGE

2.2
Location : fixColumnSize
Killed by : none
negated conditional → NO_COVERAGE

119

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/JTable::setValueAt → NO_COVERAGE

120

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/JTable::setValueAt → NO_COVERAGE

124

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/JTable::setPreferredScrollableViewportSize → NO_COVERAGE

125

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/JScrollPane::setRowHeaderView → NO_COVERAGE

126

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/JScrollPane::setCorner → NO_COVERAGE

129

1.1
Location : fixColumnSize
Killed by : none
removed call to javax/swing/JViewport::addChangeListener → NO_COVERAGE

139

1.1
Location : stateChanged
Killed by : none
removed call to javax/swing/JScrollBar::setValue → NO_COVERAGE

148

1.1
Location : propertyChange
Killed by : none
negated conditional → NO_COVERAGE

149

1.1
Location : propertyChange
Killed by : none
removed call to javax/swing/JTable::setSelectionModel → NO_COVERAGE

152

1.1
Location : propertyChange
Killed by : none
negated conditional → NO_COVERAGE

153

1.1
Location : propertyChange
Killed by : none
removed call to javax/swing/JTable::setModel → NO_COVERAGE

Active mutators

Tests examined


Report generated by PIT 1.22.1