196 lines
5.1 KiB
Java
196 lines
5.1 KiB
Java
package client.components.formEntry;
|
|
|
|
import client.modules.spellChecker.KnownData;
|
|
import client.persistence.Cell;
|
|
import client.persistence.ImageState;
|
|
|
|
import javax.swing.*;
|
|
import java.awt.*;
|
|
import java.awt.event.FocusEvent;
|
|
import java.awt.event.FocusListener;
|
|
|
|
public class FormTable extends JPanel {
|
|
|
|
private String[] fieldNames;
|
|
private String[][] values;
|
|
|
|
private boolean updatingCell;
|
|
|
|
private ImageState imageState;
|
|
|
|
private int currentRow;
|
|
private boolean deactivated = false;
|
|
|
|
public FormTable(ImageState imageState) {
|
|
|
|
this.imageState = imageState;
|
|
|
|
this.fieldNames = this.imageState.getColumnNames();
|
|
this.values = this.imageState.getModel();
|
|
|
|
this.currentRow = 0;
|
|
|
|
setupView();
|
|
}
|
|
|
|
private void setupView() {
|
|
this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
|
|
|
|
currentRow = 0;
|
|
|
|
initForm();
|
|
|
|
}
|
|
|
|
private void initForm() {
|
|
for(int i = 0; i < fieldNames.length; i++) {
|
|
String labelString = fieldNames[i];
|
|
String textFieldString = values[currentRow][i];
|
|
|
|
JPanel formContainer = new JPanel();
|
|
|
|
JLabel label = new JLabel(labelString);
|
|
label.setPreferredSize(new Dimension(100,30));
|
|
formContainer.add(label, BorderLayout.WEST);
|
|
|
|
JTextField textField = new JTextField(textFieldString);
|
|
textField.addFocusListener(generateFocusListener(textField, i));
|
|
textField.setPreferredSize(new Dimension(150, 30));
|
|
|
|
if(hasSuggestion(textField.getText(), i)) {
|
|
textField.setBackground(Color.RED);
|
|
}
|
|
|
|
formContainer.add(textField, BorderLayout.CENTER);
|
|
|
|
this.add(formContainer);
|
|
}
|
|
}
|
|
|
|
public void updateCurrentCell(JTextField textField, int index) {
|
|
if(updatingCell || deactivated) return;
|
|
|
|
Cell cell = new Cell();
|
|
cell.setRecord(currentRow);
|
|
cell.setField(index);
|
|
|
|
updatingCell = true;
|
|
imageState.setSelectedCell(cell);
|
|
updatingCell = false;
|
|
}
|
|
|
|
public void updateCellValue(JTextField textField, int index) {
|
|
if(updatingCell || deactivated) return;
|
|
|
|
Cell cell = new Cell();
|
|
cell.setRecord(currentRow);
|
|
cell.setField(index);
|
|
|
|
values[currentRow][index] = textField.getText();
|
|
|
|
if(hasSuggestion(textField.getText(), index)) {
|
|
textField.setBackground(Color.RED);
|
|
} else {
|
|
textField.setBackground(Color.WHITE);
|
|
}
|
|
|
|
updatingCell = true;
|
|
imageState.setValue(cell, textField.getText());
|
|
updatingCell = false;
|
|
}
|
|
|
|
public boolean hasSuggestion(String value, int column) {
|
|
if(value.equals("")) return false;
|
|
KnownData knownData = imageState.getKnownDataValues().get(column);
|
|
|
|
String[] words = knownData.getWordArray();
|
|
|
|
for(String val : words) {
|
|
if(val.toLowerCase().equals(value.toLowerCase())) return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
private FocusListener generateFocusListener(final JTextField textField, final int index) {
|
|
return new FocusListener() {
|
|
@Override
|
|
public void focusGained(FocusEvent e) {
|
|
updateCurrentCell(textField, index);
|
|
}
|
|
|
|
@Override
|
|
public void focusLost(FocusEvent e) {
|
|
updateCellValue(textField, index);
|
|
}
|
|
};
|
|
}
|
|
|
|
private void updateView() {
|
|
if(deactivated) return;
|
|
|
|
updatingCell = true;
|
|
for(int i = 0; i < this.getComponents().length; i++) {
|
|
JPanel formSet = (JPanel)this.getComponent(i);
|
|
JTextField form = (JTextField)formSet.getComponent(1);
|
|
form.setText(values[currentRow][i]);
|
|
|
|
if(hasSuggestion(form.getText(), i)) {
|
|
form.setBackground(Color.RED);
|
|
} else {
|
|
form.setBackground(Color.WHITE);
|
|
}
|
|
}
|
|
updatingCell = false;
|
|
}
|
|
|
|
public void setValue(String newValue, int row, int column) {
|
|
if(updatingCell || deactivated) return;
|
|
|
|
this.updateView();
|
|
this.repaint();
|
|
}
|
|
|
|
public void setCurrentCell(int row, int column) {
|
|
if(updatingCell || deactivated) return;
|
|
|
|
this.currentRow = row;
|
|
|
|
this.updateView();
|
|
this.repaint();
|
|
|
|
this.setFocus(column);
|
|
}
|
|
|
|
public void setCurrentCellForce() {
|
|
if(deactivated) return;
|
|
|
|
final Cell cell = imageState.getSelectedCell();
|
|
SwingUtilities.invokeLater(new Runnable() {
|
|
public void run() {
|
|
setFocus(cell.getField());
|
|
}
|
|
});
|
|
}
|
|
|
|
public void setFocus(int columnField) {
|
|
if(deactivated) return;
|
|
|
|
// offset is x - 1, cause start at 0.
|
|
int column = columnField;
|
|
|
|
if(values.length == 0) return;
|
|
|
|
// get the column textField and request focus
|
|
JPanel formList = (JPanel)this.getComponent(column);
|
|
final JTextField form = (JTextField)formList.getComponent(1);
|
|
|
|
form.requestFocus();
|
|
}
|
|
|
|
public void setDeactivated(boolean deactivated) {
|
|
this.deactivated = deactivated;
|
|
}
|
|
|
|
}
|