/*******************************************************************************
* Copyright (c) 2014 Open Door Logistics (www.opendoorlogistics.com)
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at http://www.gnu.org/licenses/lgpl.txt
******************************************************************************/
package com.opendoorlogistics.components.scheduleeditor;
import java.awt.Color;
import java.awt.Component;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.DropMode;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;
import com.opendoorlogistics.api.ODLApi;
import com.opendoorlogistics.api.components.PredefinedTags;
import com.opendoorlogistics.api.standardcomponents.ScheduleEditor.EditorTable;
import com.opendoorlogistics.api.tables.ODLColumnType;
import com.opendoorlogistics.components.scheduleeditor.data.EditorData;
import com.opendoorlogistics.components.scheduleeditor.data.beans.Task;
import com.opendoorlogistics.components.scheduleeditor.data.beans.TaskOrder;
import com.opendoorlogistics.core.utils.strings.Strings;
public class TasksTable extends JTable {
private final String vehicleId;
private final boolean isSchedule;
private Task[] data;
private final TaskTransferHandler transferHandler;
private final ODLApi api;
private boolean tableModelInitialised = false;
TasksTable(String vehicleId, TaskMover stopMover, ODLApi api) {
this.vehicleId = vehicleId;
this.transferHandler = new TaskTransferHandler(stopMover);
this.isSchedule = Strings.equalsStd(vehicleId, ScheduleEditorConstants.UNLOADED_VEHICLE) == false;
this.api = api;
getSelectionModel().setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
setTransferHandler(transferHandler);
setDropMode(DropMode.INSERT_ROWS);
setDragEnabled(true);
setFillsViewportHeight(true);
// setAutoCreateRowSorter(true);
setRowSorter(null);
}
void setData(final EditorData editorData) {
this.data = editorData.getTasksByResource(vehicleId);
final DisplayFields displayFields;
if (isSchedule) {
displayFields = editorData.getDisplayFields(EditorTable.TASK_ORDER);
} else {
displayFields = editorData.getDisplayFields(EditorTable.TASKS);
}
final int nbStdCols = isSchedule ? 3 : 2;
final int nd = displayFields.size();
final int nc = nbStdCols + nd;
final ArrayList<String> columnNames = new ArrayList<>();
if (isSchedule) {
columnNames.add("#");
}
columnNames.add("ID");
columnNames.add("Name");
for (int i = 0; i < nd; i++) {
columnNames.add(displayFields.getFieldName(i));
}
setModel(new AbstractTableModel() {
@Override
public String getColumnName(int column) {
return columnNames.get(column);
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if (rowIndex < 0 || rowIndex >= data.length) {
return null;
}
Task stop = data[rowIndex];
if (isSchedule && columnIndex == 0) {
return rowIndex + 1;
}
if ((isSchedule && columnIndex == 1) || (!isSchedule && columnIndex == 0)) {
return stop.getId();
}
if ((isSchedule && columnIndex == 2) || (!isSchedule && columnIndex == 1)) {
return stop.getName();
}
Object value = null;
if (isSchedule) {
// use the stop order table
TaskOrder order = editorData.getTaskOrderById(stop.getId());
if (order != null) {
value = displayFields.getFieldValue(order.getGlobalRowId(), columnIndex - nbStdCols);
}
} else {
// use the stop table...
value = displayFields.getFieldValue(stop.getGlobalRowId(), columnIndex - nbStdCols);
}
if (value != null) {
return api.values().convertValue(value, ODLColumnType.STRING);
}
return null;
}
@Override
public int getRowCount() {
return data.length;
}
@Override
public int getColumnCount() {
return nc;
}
});
final Color altColour = new Color(0.95f, 0.95f, 0.95f);
setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component ret = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if(!isSelected){
ret.setBackground(row%2==0 ? Color.WHITE: altColour);
if(isSchedule){
if (row >= 0 && row < data.length) {
Task stop = data[row];
TaskOrder order = editorData.getTaskOrderById(stop.getId());
if(order!=null && order.getColor()!=null){
ret.setBackground(order.getColor());
}
}
}
}
return ret;
}
});
// make sequence number column small the first time table is shown
if (!tableModelInitialised) {
tableModelInitialised = true;
if (isSchedule) {
getColumnModel().getColumn(0).setMaxWidth(40);
}
setAutoCreateColumnsFromModel(false);
}
}
public String getStopId(int index) {
return data[index].getId();
}
public String getVehicleId() {
return vehicleId;
}
/**
* Disable drag selection - see
* https://community.oracle.com/thread/1351319?start=0&tstart=0
*/
@Override
protected void processMouseEvent(MouseEvent e) {
if (e.getID() == MouseEvent.MOUSE_PRESSED && SwingUtilities.isLeftMouseButton(e) && !e.isShiftDown() && !e.isControlDown()) {
Point pt = e.getPoint();
int row = rowAtPoint(pt);
int col = columnAtPoint(pt);
if (row >= 0 && col >= 0 && !super.isCellSelected(row, col))
changeSelection(row, col, false, false);
}
super.processMouseEvent(e);
}
}