package com.opendoorlogistics.studio.components.map;
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.ComponentExecutionApi;
import com.opendoorlogistics.api.components.ODLComponent;
import com.opendoorlogistics.api.components.PredefinedTags;
import com.opendoorlogistics.api.scripts.ScriptAdapter;
import com.opendoorlogistics.api.scripts.ScriptAdapterTable;
import com.opendoorlogistics.api.scripts.ScriptInputTables;
import com.opendoorlogistics.api.scripts.ScriptOption;
import com.opendoorlogistics.api.scripts.ScriptTemplatesBuilder;
import com.opendoorlogistics.api.scripts.ScriptTemplatesBuilder.BuildScriptCallback;
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.core.scripts.ScriptConstants;
import com.opendoorlogistics.core.scripts.execution.adapters.vls.ExtraFields;
import com.opendoorlogistics.core.scripts.execution.adapters.vls.Layer;
import com.opendoorlogistics.core.scripts.execution.adapters.vls.Style;
import com.opendoorlogistics.core.scripts.execution.adapters.vls.VLSBuilder;
import com.opendoorlogistics.core.scripts.execution.adapters.vls.View;
import com.opendoorlogistics.core.tables.utils.TableUtils;
import com.opendoorlogistics.core.utils.strings.Strings;
import com.opendoorlogistics.utils.ui.Icons;
/**
* A view-layer-style component is a dummy component which launches a map control fed by a view-layer-style adapter
* @author Phil
*
*/
public class ViewLayerStyleComponent implements ODLComponent {
@Override
public String getId() {
return "com.opendoorlogistics.studio.components.map.view-layer-style";
}
@Override
public String getName() {
return "View, layer and style map";
}
@Override
public ODLDatastore<? extends ODLTableDefinition> getIODsDefinition(ODLApi api, Serializable configuration) {
return VLSBuilder.getVLSTableDefinitions();
}
@Override
public ODLDatastore<? extends ODLTableDefinition> getOutputDsDefinition(ODLApi api, int mode, Serializable configuration) {
return null;
}
@Override
public void execute(ComponentExecutionApi api, int mode, Object configuration, ODLDatastore<? extends ODLTable> ioDs,
ODLDatastoreAlterable<? extends ODLTableAlterable> outputDs) {
throw new UnsupportedOperationException();
}
@Override
public Class<? extends Serializable> getConfigClass() {
return null;
}
@Override
public JPanel createConfigEditorPanel(ComponentConfigurationEditorAPI api, int mode, Serializable config, boolean isFixedIO) {
throw new UnsupportedOperationException();
}
@Override
public long getFlags(ODLApi api, int mode) {
return 0;
}
@Override
public Icon getIcon(ODLApi api, int mode) {
return Icons.loadFromStandardPath("view-layer-style.png");
}
@Override
public boolean isModeSupported(ODLApi api, int mode) {
return false;
}
@Override
public void registerScriptTemplates(ScriptTemplatesBuilder templatesApi) {
String name = "View, layer and style map";
templatesApi.registerTemplate("View-layer-style map", name, "Create a map which is defined by view-layer-style tables",getIODsDefinition(null,null), new BuildScriptCallback() {
@Override
public void buildScript(ScriptOption builder) {
ScriptInputTables inputTables = builder.getInputTables();
// add only the vls table to the adapter
ScriptAdapter mapAdapter = builder.addDataAdapter("VLSInput");
mapAdapter.setAdapterType(ScriptAdapter.ScriptAdapterType.VLS);
for(int i =0 ; i< inputTables.size() ; i++){
ODLTableDefinition src = inputTables.getSourceTable(i);
ODLTableDefinition dest = inputTables.getTargetTable(i);
String dsid = inputTables.getSourceDatastoreId(i);
if(!Strings.equalsStd(dest.getName(), View.TABLE_NAME)
&& !Strings.equalsStd(dest.getName(), Layer.TABLE_NAME)
&& !Strings.equalsStd(dest.getName(), Style.TABLE_NAME)
){
continue;
}
if(src!=null){
mapAdapter.addSourcedTableToAdapter(dsid, src, dest);
}else{
mapAdapter.addSourcelessTable(dest);
}
}
// add the extra fields afterwards as we want this to use embedded data...
ODLTableDefinition extraFieldsDfn = TableUtils.findTable(VLSBuilder.getVLSTableDefinitions(), ExtraFields.TABLE_NAME);
ScriptAdapterTable efAdapter = mapAdapter.addSourcelessTable(extraFieldsDfn);
efAdapter.setSourceTable(ScriptConstants.SCRIPT_EMBEDDED_TABLE_DATA_DS, "");
// now add the instruction which launches the map component, not this component
builder.addInstruction(mapAdapter.getAdapterId(), AbstractMapViewerComponent.COMPONENT_ID, ODLComponent.MODE_DEFAULT,new MapConfig());
}
});
}
}