school/cs240/record-indexer/src/client/components/imagePanel/ImageTable.java

148 lines
4.1 KiB
Java

package client.components.imagePanel;
import client.components.imagePanel.ImageCell;
import client.persistence.Cell;
import client.persistence.ImageState;
import client.persistence.ImageStateListener;
import client.persistence.SyncContext;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
public class ImageTable {
private int recordsPerImage;
private int firstYCoord;
private int recordHeight;
private int columnCount;
private ArrayList<Integer> fieldXValues;
private ArrayList<Integer> fieldWidthValues;
private ImageCell[][] model;
private Rectangle2D.Double tableBoundaries;
private boolean highlightsEnabled;
private ImageCell currentSelected;
private ImageState imageState;
private boolean deactivated = false;
public ImageTable(ImageState imageState) {
this.imageState = imageState;
this.recordsPerImage = imageState.getRecordsPerImage();
this.firstYCoord = imageState.getFirstYCoord();
this.recordHeight = imageState.getRecordHeight();
this.columnCount = imageState.getColumnCount();
this.fieldXValues = imageState.getFieldXValues();
this.fieldWidthValues = imageState.getFieldWidthValues();
// Note we go [y][x]
model = new ImageCell[recordsPerImage][columnCount];
highlightsEnabled = imageState.getSettings().isImageHighlights();
if(!imageState.isHasImage()) return;
generateModel();
generateTableBoundaries();
}
private void generateModel() {
for(int y = 0; y < recordsPerImage; y++) {
for(int x = 0; x < columnCount; x++) {
Rectangle2D.Double rect = new Rectangle2D.Double();
int rectY = firstYCoord + (y * recordHeight); // y starts at 0.
int rectX = fieldXValues.get(x);
int width = fieldWidthValues.get(x);
int height = recordHeight;
rect.setRect(rectX, rectY, width, height);
model[y][x] = new ImageCell(rect);
}
}
}
public void paint(Graphics2D g2) {
for(int y = 0; y < recordsPerImage; y++) {
for(int x = 0; x < columnCount; x++) {
ImageCell imageCell = model[y][x];
if(imageCell == currentSelected && highlightsEnabled) {
model[y][x].paint(g2, true);
} else {
model[y][x].paint(g2, false);
}
}
}
}
public void contains(int worldX, int worldY) {
// Make sure in table boundaries first.
if(!tableBoundaries.contains(worldX, worldY)) {
return;
}
for(int y = 0; y < recordsPerImage; y++) {
for(int x = 0; x < columnCount; x++) {
ImageCell imageCell = model[y][x];
if(imageCell.contains(worldX, worldY)) {
this.currentSelected = imageCell;
setCurrentCell(x, y);
Cell cell = new Cell();
cell.setField(x);
cell.setRecord(y);
this.imageState.setSelectedCell(cell);
}
}
}
}
public void setCurrentCell(int x, int y) {
if(model.length == 0 || deactivated) return;
this.currentSelected = model[y][x];
}
private void generateTableBoundaries() {
int y = firstYCoord;
int x = fieldXValues.get(0);
int width = 0;
for(int fw : fieldWidthValues) {
width += fw;
}
int height = recordsPerImage * recordHeight;
tableBoundaries = new Rectangle2D.Double(x, y, width, height);
}
public void enableHighlights(boolean value) {
this.highlightsEnabled = value;
imageState.getSettings().setImageHighlights(value);
}
public boolean isHighlightsEnabled() {
return highlightsEnabled;
}
public void setDeactivated(boolean deactivated) {
this.deactivated = deactivated;
}
public boolean isDeactivated() {
return deactivated;
}
}