/*
* Copyright 2007 - 2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.sf.jailer.ui.databrowser;
import java.awt.Color;
import java.awt.Font;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.RowSorter;
import javax.swing.ScrollPaneConstants;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.TableModel;
import net.sf.jailer.datamodel.Column;
import net.sf.jailer.datamodel.DataModel;
import net.sf.jailer.datamodel.RowIdSupport;
import net.sf.jailer.datamodel.Table;
/**
* Row Details View.
*
* @author Ralf Wisser
*/
@SuppressWarnings("serial")
public abstract class DetailsView extends javax.swing.JPanel {
private final Table table;
private final List<Row> rows;
private final RowSorter<? extends TableModel> rowSorter;
private final RowIdSupport rowIdSupport;
/** Creates new form DetailsView
* @param rowSorter
*/
public DetailsView(List<Row> rows, int size, DataModel dataModel, Table table, int rowIndex, RowSorter<? extends TableModel> rowSorter, boolean showSpinner, RowIdSupport rowIdSupport) {
this.table = table;
this.rows = rows;
this.rowSorter = rowSorter;
this.rowIdSupport = rowIdSupport;
initComponents();
if (rowSorter != null) {
rowIndex = rowSorter.convertRowIndexToView(rowIndex);
}
final SpinnerNumberModel model = new SpinnerNumberModel(rowIndex + 1, 1, size, -1);
rowSpinner.setModel(model);
rowSpinner.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
setCurrentRow((Integer) model.getValue() - 1, true);
}
});
if (!showSpinner) {
jLabel1.setVisible(false);
rowSpinner.setVisible(false);
// jScrollPane1.setBorder(null);
jScrollPane1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
jScrollPane1.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
}
setCurrentRow(rowIndex, showSpinner);
}
private final Font font = new JLabel().getFont();
private final Font nonbold = new Font(font.getName(), font.getStyle() & ~Font.BOLD, font.getSize());
private final Font italic = new Font(font.getName(), font.getStyle() & ~Font.BOLD | Font.ITALIC, font.getSize());
private final Color BG1 = new Color(255, 255, 255);
private final Color BG2 = new Color(230, 255, 255);
private final Color FG1 = new Color(155, 0, 0);
public void setBorderColor(Color color) {
jScrollPane1.setBorder(BorderFactory.createEtchedBorder(color, Color.GRAY));
}
private void setCurrentRow(int row, boolean selectableFields) {
jPanel1.removeAll();
int i = 0;
java.awt.GridBagConstraints gridBagConstraints;
List<Column> columns = rowIdSupport.getColumns(table);
while (i < columns.size()) {
Column c = columns.get(i);
JLabel l = new JLabel();
l.setText(" " + c.name + " ");
l.setFont(nonbold);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 0;
gridBagConstraints.weighty = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = i;
jPanel1.add(l, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weighty = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1;
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = i;
Object v = rows.get(rowSorter != null? rowSorter.convertRowIndexToModel(row) : row).values[i];
if (selectableFields) {
JTextField f = new JTextField();
f.setText(v == null? "" : v.toString());
f.setEnabled(v != null);
f.setEditable(false);
jPanel1.add(f, gridBagConstraints);
} else {
JLabel f = new JLabel();
f.setText((v == null? "null" : v.toString()) + " ");
f.setFont(v == null? italic : nonbold);
if (v == null) {
f.setForeground(Color.GRAY);
}
jPanel1.add(f, gridBagConstraints);
f.setBackground(i % 2 == 0? BG1 : BG2);
l.setBackground(i % 2 == 0? BG1 : BG2);
f.setOpaque(true);
l.setOpaque(true);
if (rowIdSupport.getPrimaryKey(table) != null && rowIdSupport.getPrimaryKey(table).getColumns().contains(c)) {
l.setForeground(FG1);
} else {
l.setForeground(Color.BLUE);
}
}
// l = new JLabel();
// l.setText(" ");
// gridBagConstraints = new java.awt.GridBagConstraints();
// gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
// gridBagConstraints.weightx = 1.0;
// gridBagConstraints.gridx = 2;
// gridBagConstraints.gridy = i;
// gridBagConstraints.fill = GridBagConstraints.BOTH;
// jPanel1.add(l, gridBagConstraints);
++i;
}
if (selectableFields) {
JLabel l = new JLabel();
l.setText(" ");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 0;
gridBagConstraints.weighty = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = i;
jPanel1.add(l, gridBagConstraints);
}
invalidate();
validate();
setSize(getWidth() - 1, getHeight() - 1);
setSize(getWidth() + 1, getHeight() + 1);
onRowChanged((row));
}
protected abstract void onRowChanged(int row);
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
jLabel1 = new javax.swing.JLabel();
rowSpinner = new javax.swing.JSpinner();
jScrollPane1 = new javax.swing.JScrollPane();
jPanel1 = new javax.swing.JPanel();
jLabel2 = new javax.swing.JLabel();
jTextField1 = new javax.swing.JTextField();
setLayout(new java.awt.GridBagLayout());
jLabel1.setText(" Row ");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
add(jLabel1, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
add(rowSpinner, gridBagConstraints);
jPanel1.setLayout(new java.awt.GridBagLayout());
jLabel2.setText("jLabel2");
jPanel1.add(jLabel2, new java.awt.GridBagConstraints());
jTextField1.setText("jTextField1");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
jPanel1.add(jTextField1, gridBagConstraints);
jScrollPane1.setViewportView(jPanel1);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
add(jScrollPane1, gridBagConstraints);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JPanel jPanel1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JTextField jTextField1;
private javax.swing.JSpinner rowSpinner;
// End of variables declaration//GEN-END:variables
}