package com.constellio.app.modules.robots.ui.pages; import static com.constellio.app.ui.i18n.i18n.$; import java.util.List; import com.constellio.app.modules.robots.model.wrappers.Robot; import com.constellio.app.modules.robots.ui.components.actionParameters.DynamicParametersField; import com.constellio.app.modules.robots.ui.components.criteria.AdvancedSearchCriteriaField; import com.constellio.app.services.factories.AppLayerFactory; import com.constellio.app.services.factories.ConstellioFactories; import com.constellio.app.ui.application.ConstellioUI; import com.constellio.app.ui.entities.MetadataVO; import com.constellio.app.ui.entities.RecordVO; import com.constellio.app.ui.framework.components.MetadataFieldFactory; import com.constellio.app.ui.framework.components.OverridingMetadataFieldFactory; import com.constellio.app.ui.framework.components.OverridingMetadataFieldFactory.Choice; import com.constellio.app.ui.framework.components.RecordForm; import com.constellio.app.ui.pages.base.BaseViewImpl; import com.constellio.app.ui.pages.search.criteria.CriterionFactory; import com.constellio.model.frameworks.validation.ValidationException; import com.vaadin.data.Property.ValueChangeEvent; import com.vaadin.data.Property.ValueChangeListener; import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent; import com.vaadin.ui.Button.ClickEvent; import com.vaadin.ui.Button.ClickListener; import com.vaadin.ui.ComboBox; import com.vaadin.ui.Component; import com.vaadin.ui.Field; public class AddEditRobotViewImpl extends BaseViewImpl implements AddEditRobotView { private final AddEditRobotPresenter presenter; private RobotForm form; private RecordVO robot; public AddEditRobotViewImpl() { this.presenter = new AddEditRobotPresenter(this); } @Override protected void initBeforeCreateComponents(ViewChangeEvent event) { super.initBeforeCreateComponents(event); robot = presenter.forParams(event.getParameters()).getRobot(); } @Override protected String getTitle() { return $(presenter.isAddMode() ? "AddEditRobotView.addViewTitle" : "AddEditRobotView.editViewTitle"); } @Override protected Component buildMainComponent(ViewChangeEvent event) { form = new RobotForm(robot); prepareSchemaFilterField(form.getSchemaFilterField()); prepareActionField(form.getActionField()); prepareActionParametersField(form.getActionParametersField()); prepareAutoExecuteField(form.getAutoExecuteField()); return form; } private void prepareSchemaFilterField(final Field<String> schemaFilter) { schemaFilter.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { presenter.schemaFilterSelected(schemaFilter.getValue()); } }); schemaFilter.setEnabled(presenter.canEditSchemaFilter()); } private void prepareActionField(final ComboBox action) { action.addValueChangeListener(new ValueChangeListener() { @Override public void valueChange(ValueChangeEvent event) { presenter.actionSelected((String) action.getValue()); } }); } private void prepareActionParametersField(DynamicParametersField parameters) { boolean enabled = presenter.requiresActionParameters(); parameters.setEnabled(enabled); parameters.setRequired(enabled); } private void prepareAutoExecuteField(Field<?> autoExecute) { autoExecute.setVisible(presenter.canAutoExecute()); } @Override protected ClickListener getBackButtonClickListener() { return new ClickListener() { @Override public void buttonClick(ClickEvent event) { presenter.backButtonClicked(robot); } }; } @Override public void setCriteriaSchema(String schemaType) { form.getSearchCriteriaField().setSchemaType(schemaType); } @Override public void addEmptyCriterion() { form.getSearchCriteriaField().addEmptyCriterion(); } @Override public void setAvailableActions(List<Choice> choices) { ComboBox box = form.getActionField(); box.removeAllItems(); for (Choice choice : choices) { box.addItem(choice.getValue()); box.setItemCaption(choice.getValue(), choice.getCaption()); } } @Override public void setActionParametersFieldEnabled(boolean enabled) { form.getActionParametersField().setEnabled(enabled); form.getActionParametersField().setRequired(enabled); } @Override public void resetActionParameters(RecordVO record) { form.getActionParametersField().resetWithRecord(record); } public class RobotForm extends RecordForm { public RobotForm(RecordVO record) { super(record, new RobotMetadataFieldFactory(presenter)); } @Override protected void saveButtonClick(RecordVO viewObject) throws ValidationException { presenter.saveButtonClicked(viewObject); } @Override protected void cancelButtonClick(RecordVO viewObject) { presenter.backButtonClicked(viewObject); } @SuppressWarnings("unchecked") public Field<String> getSchemaFilterField() { return (Field<String>) getField(Robot.SCHEMA_FILTER); } @SuppressWarnings("unchecked") public AdvancedSearchCriteriaField getSearchCriteriaField() { return (AdvancedSearchCriteriaField) getField(Robot.SEARCH_CRITERIA); } public ComboBox getActionField() { return (ComboBox) getField(Robot.ACTION); } public Field<?> getAutoExecuteField() { return getField(Robot.AUTO_EXECUTE); } public DynamicParametersField getActionParametersField() { return (DynamicParametersField) getField(Robot.ACTION_PARAMETERS); } } public static class RobotMetadataFieldFactory extends OverridingMetadataFieldFactory<AddEditRobotPresenter> { public RobotMetadataFieldFactory(AddEditRobotPresenter presenter) { super(presenter); } @Override protected Field<?> newSingleValueField(MetadataVO metadata) { if (Robot.ACTION_PARAMETERS.equals(metadata.getLocalCode())) { DynamicParametersField field = new DynamicParametersField(presenter); postBuild(field, metadata); return field; } return super.newSingleValueField(metadata); } @Override protected Field<?> newMultipleValueField(MetadataVO metadata) { if (isCriteria(metadata)) { AdvancedSearchCriteriaField field = new AdvancedSearchCriteriaField(presenter) .setSchemaType(presenter.getSchemaFilter()); postBuild(field, metadata); return field; } return super.newMultipleValueField(metadata); } private boolean isCriteria(MetadataVO metadata) { return metadata.getStructureFactory() != null && metadata.getStructureFactory() instanceof CriterionFactory; } } }