/*******************************************************************************
* 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.io.Serializable;
import javax.swing.Icon;
import javax.swing.JPanel;
import com.opendoorlogistics.api.ODLApi;
import com.opendoorlogistics.api.components.ComponentConfigurationEditorAPI;
import com.opendoorlogistics.api.components.ComponentControlLauncherApi;
import com.opendoorlogistics.api.components.ComponentControlLauncherApi.ControlLauncherCallback;
import com.opendoorlogistics.api.components.ComponentExecutionApi;
import com.opendoorlogistics.api.components.ODLComponent;
import com.opendoorlogistics.api.components.PredefinedTags;
import com.opendoorlogistics.api.scripts.ScriptTemplatesBuilder;
import com.opendoorlogistics.api.standardcomponents.ScheduleEditor;
import com.opendoorlogistics.api.tables.ODLDatastore;
import com.opendoorlogistics.api.tables.ODLDatastoreAlterable;
import com.opendoorlogistics.api.tables.ODLTable;
import com.opendoorlogistics.api.tables.ODLTableAlterable;
import com.opendoorlogistics.api.tables.ODLTableDefinition;
import com.opendoorlogistics.api.tables.ODLTableDefinitionAlterable;
import com.opendoorlogistics.api.tables.TableFlags;
import com.opendoorlogistics.components.scheduleeditor.data.beans.ResourceDescription;
import com.opendoorlogistics.components.scheduleeditor.data.beans.ResourceType;
import com.opendoorlogistics.components.scheduleeditor.data.beans.Task;
import com.opendoorlogistics.components.scheduleeditor.data.beans.TaskOrder;
import com.opendoorlogistics.core.tables.beans.BeanMapping;
import com.opendoorlogistics.core.tables.beans.BeanMapping.BeanDatastoreMapping;
import com.opendoorlogistics.core.utils.strings.Strings;
import com.opendoorlogistics.utils.ui.Icons;
public class ScheduleEditorComponent implements ScheduleEditor {
private final BeanDatastoreMapping beanMapping = BeanMapping.buildDatastore(Task.class, ResourceType.class, TaskOrder.class, ResourceDescription.class);
@Override
public String getId() {
return "com.opendoorlogistics.components.scheduleeditor";
}
@Override
public String getName() {
return "Schedule editor";
}
@Override
public ODLDatastore<? extends ODLTableDefinition> getIODsDefinition(ODLApi api, Serializable configuration) {
ODLDatastoreAlterable<? extends ODLTableDefinitionAlterable> ret = beanMapping.getDefinition();
// flag that tables can take extra columns (for display-only)
for (int i = 0; i < ret.getTableCount(); i++) {
ODLTableDefinitionAlterable table = ret.getTableAt(i);
// if(Strings.equalsStd(table.getName(),
// getTableName(EditorTable.RESOURCES))){
// continue;
// }
if (Strings.equalsStd(table.getName(), ResourceDescription.TABLE_NAME)) {
table.setFlags(table.getFlags() | TableFlags.FLAG_IS_OPTIONAL);
continue;
}
if (Strings.equalsStd(table.getName(), ResourceType.TABLE_NAME) == false) {
table.setFlags(table.getFlags() | TableFlags.FLAG_COLUMN_WILDCARD);
}
}
return ret;
}
@Override
public ODLDatastore<? extends ODLTableDefinition> getOutputDsDefinition(ODLApi api, int mode, Serializable configuration) {
// TODO Auto-generated method stub
return null;
}
@Override
public void execute(ComponentExecutionApi api, int mode, Object configuration, final ODLDatastore<? extends ODLTable> ioDs,
ODLDatastoreAlterable<? extends ODLTableAlterable> outputDs) {
ODLTable table = ioDs.getTableAt(ScheduleEditorConstants.TASKS_TABLE_INDEX);
if ((table.getFlags() & TableFlags.UI_SET_INSERT_DELETE_PERMISSION_FLAGS) != TableFlags.UI_SET_INSERT_DELETE_PERMISSION_FLAGS) {
throw new RuntimeException("Cannot edit task-order table." + System.lineSeparator()
+ "Schedule editing is not supported on tables which have been filtered, sorted etc...");
}
api.submitControlLauncher(new ControlLauncherCallback() {
@Override
public void launchControls(ComponentControlLauncherApi launcherApi) {
SchedulesEditorPanel rep = null;
JPanel panel = launcherApi.getRegisteredPanel("schedule-editor");
if (panel != null && SchedulesEditorPanel.class.isInstance(panel)) {
rep = (SchedulesEditorPanel) panel;
} else {
rep = new SchedulesEditorPanel(launcherApi);
launcherApi.registerPanel("schedule-editor",null, rep, true);
}
rep.setData(launcherApi,ioDs);
}
});
}
@Override
public Class<? extends Serializable> getConfigClass() {
// TODO Auto-generated method stub
return null;
}
@Override
public JPanel createConfigEditorPanel(ComponentConfigurationEditorAPI api, int mode, Serializable config, boolean isFixedIO) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getFlags(ODLApi api, int mode) {
return ODLComponent.FLAG_OUTPUT_WINDOWS_ALWAYS_SYNCHRONISED | ODLComponent.FLAG_ALLOW_USER_INTERACTION_WHEN_RUNNING;
}
@Override
public Icon getIcon(ODLApi api, int mode) {
return Icons.loadFromStandardPath("edit-route.png");
}
@Override
public boolean isModeSupported(ODLApi api, int mode) {
return mode == ODLComponent.MODE_DEFAULT;
}
@Override
public void registerScriptTemplates(ScriptTemplatesBuilder templatesApi) {
templatesApi.registerTemplate(getName(), getName(), "Edit vehicle routes", getIODsDefinition(templatesApi.getApi(), null), (Serializable) null);
}
public BeanDatastoreMapping getBeanMapping() {
return beanMapping;
}
@Override
public String getFieldName(EditorTable table, Enum<?> field) {
switch (table) {
case RESOURCE_TYPES:
switch ((ResourceTypeField) field) {
case ID:
return PredefinedTags.ID;
case NAME:
return PredefinedTags.NAME;
case RESOURCE_COUNT:
return "resource-count";
}
break;
case TASKS:
switch ((TaskField) field) {
case ID:
return PredefinedTags.ID;
case NAME:
return PredefinedTags.NAME;
}
break;
case TASK_ORDER:
switch ((OrderField) field) {
case TASK_ID:
return "task-id";
case RESOURCE_ID:
return "resource-id";
case COLOUR:
return "colour";
}
break;
case RESOURCE_DESCRIPTIONS:
switch ((ResourceDescriptionField) field) {
case RESOURCE_ID:
return "resource-id";
case DESCRIPTION:
return "description";
}
}
return null;
}
@Override
public String getTableName(EditorTable table) {
switch (table) {
case RESOURCE_TYPES:
return ResourceType.TABLE_NAME;
case TASKS:
return Task.TABLE_NAME;
case TASK_ORDER:
return TaskOrder.TABLE_NAME;
case RESOURCE_DESCRIPTIONS:
return ResourceDescription.TABLE_NAME;
}
return null;
}
}