List of usage examples for org.apache.wicket.ajax.form OnChangeAjaxBehavior OnChangeAjaxBehavior
public OnChangeAjaxBehavior()
From source file:org.hippoecm.frontend.plugins.console.menu.property.PropertyDialog.java
License:Apache License
public PropertyDialog(IModelReference<Node> modelReference) { this.modelReference = modelReference; final IModel<Node> model = modelReference.getModel(); getParent().add(CssClass.append("property-dialog")); // list defined properties for automatic completion choiceModel = new LoadableDetachableModel<Map<String, List<PropertyDefinition>>>() { protected Map<String, List<PropertyDefinition>> load() { Map<String, List<PropertyDefinition>> choices = new HashMap<>(); Node node = model.getObject(); try { NodeType pnt = node.getPrimaryNodeType(); for (PropertyDefinition pd : pnt.getPropertyDefinitions()) { List<PropertyDefinition> list = choices.get(pd.getName()); if (list == null) { list = new ArrayList<>(5); }// w w w . j av a 2 s.c o m list.add(pd); choices.put(pd.getName(), list); } for (NodeType nt : node.getMixinNodeTypes()) { for (PropertyDefinition pd : nt.getPropertyDefinitions()) { List<PropertyDefinition> list = choices.get(pd.getName()); if (list == null) { list = new ArrayList<>(5); } list.add(pd); choices.put(pd.getName(), list); } } // remove already set properties from suggestions: final Set<String> properties = new HashSet<>(choices.keySet()); for (String property : properties) { if (!isResidual(property) && node.hasProperty(property)) { choices.remove(property); } } } catch (RepositoryException e) { log.warn("Unable to populate autocomplete list for property names", e); } return choices; } }; // checkbox for property ismultiple final CheckBox checkBox = new CheckBox("isMultiple", new Model<Boolean>() { @Override public void setObject(Boolean multiple) { PropertyDialog.this.isMultiple = multiple; } @Override public Boolean getObject() { if (PropertyDialog.this.name != null) { List<PropertyDefinition> propdefs = choiceModel.getObject().get(PropertyDialog.this.name); if (propdefs != null) { for (PropertyDefinition pd : propdefs) { if (PropertyType.nameFromValue(pd.getRequiredType()).equals(type)) { // somehow need to set isMultiple here, otherwise it doesn't get picked up... PropertyDialog.this.isMultiple = pd.isMultiple(); return pd.isMultiple(); } } } } return PropertyDialog.this.isMultiple; } }); checkBox.setOutputMarkupId(true); add(checkBox); // dropdown for property type final DropDownChoice<String> ddChoice = new DropDownChoice<String>("types") { @Override public List<? extends String> getChoices() { if (PropertyDialog.this.name != null) { List<PropertyDefinition> propdefs = choiceModel.getObject().get(PropertyDialog.this.name); if (propdefs != null) { List<String> result = new ArrayList<>(propdefs.size()); for (PropertyDefinition pd : propdefs) { result.add(PropertyType.nameFromValue(pd.getRequiredType())); } return result; } } return ALL_TYPES; } }; ddChoice.setModel(new Model<String>() { @Override public void setObject(String object) { type = object; } @Override public String getObject() { List<? extends String> choices = ddChoice.getChoices(); if (choices.size() == 1) { type = choices.iterator().next(); } return type; } }); ddChoice.setRequired(true); ddChoice.setOutputMarkupId(true); ddChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") { @Override protected void onUpdate(AjaxRequestTarget target) { } }); add(ddChoice); values = new LinkedList<>(); values.add(""); final WebMarkupContainer valuesContainer = new WebMarkupContainer("valuesContainer"); valuesContainer.setOutputMarkupId(true); add(valuesContainer); valuesContainer.add(new ListView<String>("values", values) { @Override protected void populateItem(final ListItem<String> item) { final TextField textField = new TextField<>("val", item.getModel()); textField.add(new OnChangeAjaxBehavior() { @Override protected void onUpdate(final AjaxRequestTarget target) { } }); item.add(textField); if (focusOnLatestValue && item.getIndex() == (values.size() - 1)) { AjaxRequestTarget ajax = RequestCycle.get().find(AjaxRequestTarget.class); if (ajax != null) { ajax.focusComponent(textField); } focusOnLatestValue = false; } final AjaxLink deleteLink = new AjaxLink("removeLink") { @Override public void onClick(final AjaxRequestTarget target) { values.remove(item.getIndex()); target.add(valuesContainer); } @Override public boolean isVisible() { return super.isVisible() && item.getIndex() > 0; } }; deleteLink.add(TitleAttribute.set(getString("property.value.remove"))); deleteLink.add(new InputBehavior(new KeyType[] { KeyType.Enter }, EventType.click) { @Override protected String getTarget() { return "'" + deleteLink.getMarkupId() + "'"; } }); item.add(deleteLink); } }); final AjaxLink addLink = new AjaxLink("addLink") { @Override public void onClick(final AjaxRequestTarget target) { values.add(""); target.add(valuesContainer); focusOnLatestValue = true; } @Override public boolean isVisible() { return isMultiple; } }; addLink.add(TitleAttribute.set(getString("property.value.add"))); addLink.add(new InputBehavior(new KeyType[] { KeyType.Enter }, EventType.click) { @Override protected String getTarget() { return "'" + addLink.getMarkupId() + "'"; } }); valuesContainer.add(addLink); checkBox.add(new AjaxFormComponentUpdatingBehavior("onchange") { @Override protected void onUpdate(AjaxRequestTarget target) { target.add(valuesContainer); if (!isMultiple && values.size() > 1) { String first = values.get(0); values.clear(); values.add(first); } } }); // text field for property name AutoCompleteSettings settings = new AutoCompleteSettings(); settings.setAdjustInputWidth(false); settings.setUseSmartPositioning(true); settings.setShowCompleteListOnFocusGain(true); settings.setShowListOnEmptyInput(true); // Setting a max height will trigger a correct recalculation of the height when the list of items is filtered settings.setMaxHeightInPx(400); final TextField<String> nameField = new AutoCompleteTextFieldWidget<String>("name", PropertyModel.of(this, "name"), settings) { @Override protected Iterator<String> getChoices(String input) { List<String> result = new ArrayList<>(); for (String propName : choiceModel.getObject().keySet()) { if (propName.contains(input)) { result.add(propName); } } return result.iterator(); } @Override protected void onUpdate(final AjaxRequestTarget target) { super.onUpdate(target); target.add(ddChoice); target.add(checkBox); target.add(valuesContainer); focusOnLatestValue = true; } }; nameField.setRequired(true); add(nameField); setFocus(nameField); }
From source file:org.hippoecm.frontend.widgets.AjaxUpdatingWidget.java
License:Apache License
/** * Adds an ajax updating form component// w ww . j a v a 2s . c om */ protected void addFormField(final FormComponent<T> component) { add(formComponent = component); component.setOutputMarkupId(true); if (throttleDelay == null) { component.add(new AjaxFormComponentUpdatingBehavior("onChange") { @Override protected void onUpdate(AjaxRequestTarget target) { AjaxUpdatingWidget.this.onUpdate(target); } }); } else { component.add(new OnChangeAjaxBehavior() { @Override protected void updateAjaxAttributes(final AjaxRequestAttributes attributes) { super.updateAjaxAttributes(attributes); attributes .setThrottlingSettings(new ThrottlingSettings(component.getMarkupId(), throttleDelay)); } @Override protected void onUpdate(AjaxRequestTarget target) { AjaxUpdatingWidget.this.onUpdate(target); } }); } }
From source file:org.hippoecm.frontend.widgets.NameUriField.java
License:Apache License
private FormComponent<String> createNameComponent() { final FormComponent<String> newNameComponent = new TextField<>("name", nameModel); newNameComponent.setRequired(true);//w w w . j a v a2 s .c o m newNameComponent.add(new OnChangeAjaxBehavior() { @Override protected void onUpdate(final AjaxRequestTarget target) { if (!urlIsEditable) { // the value of the url field is controlled by the name value, redraw when name changes target.add(urlComponent); } } @Override protected void updateAjaxAttributes(final AjaxRequestAttributes attributes) { super.updateAjaxAttributes(attributes); attributes.setChannel(ajaxChannel); attributes .setThrottlingSettings(new ThrottlingSettings(getPath(), NAME_COMPONENT_THROTTLE_DURATION)); } }); newNameComponent.setOutputMarkupId(true); return newNameComponent; }
From source file:org.jaulp.wicket.dialogs.ajax.modal.BaseModalPanel.java
License:Apache License
/** * Instantiates a new base modal panel.//w ww .j a v a 2 s.c o m * * @param id * the id * @param model * the model */ public BaseModalPanel(final String id, final CompoundPropertyModel<T> model) { super(id); final Form<T> form = new Form<>("form", model); form.setOutputMarkupId(true); form.clearInput(); add(form); final TextArea<String> note = new TextArea<>("messageContent"); note.clearInput(); // IT IS VERY IMPORTANT TO SET THE OUTPUTMARKUPID TO TRUE... note.setOutputMarkupId(true); note.add(new OnChangeAjaxBehavior() { /** * The serialVersionUID. */ private static final long serialVersionUID = 1L; @Override public void onUpdate(final AjaxRequestTarget target) { // Do nothing... } }); form.add(note); final AjaxButton close = new AjaxButton("cancelButton") { /** * The serialVersionUID. */ private static final long serialVersionUID = 1L; @Override public void onSubmit(final AjaxRequestTarget target, final Form<?> form) { target.add(note); onCancel(target); } @SuppressWarnings("unused") public <E extends EventObject> void send(final IEventSink sink, final Broadcast broadcast, final E payload) { // TODO Auto-generated method stub } @Override protected void onError(AjaxRequestTarget target, Form<?> form) { // TODO Auto-generated method stub } }; form.add(close); final AjaxButton selectionButton = new AjaxButton("okButton") { /** * The serialVersionUID. */ private static final long serialVersionUID = 1L; @Override protected void onSubmit(final AjaxRequestTarget target, final Form<?> form) { final T obj = model.getObject(); onSelect(target, obj); } @SuppressWarnings("unused") public <E extends EventObject> void send(IEventSink sink, Broadcast broadcast, E payload) { // TODO Auto-generated method stub } @Override protected void onError(AjaxRequestTarget target, Form<?> form) { // TODO Auto-generated method stub } }; form.add(selectionButton); }
From source file:org.laughingpanda.kansanpankki.accounts.AccountsView.java
License:Apache License
@Override protected void populateItem(Item<Account> item) { final IModel<Account> model = new Model<Account>(item.getModelObject()); AjaxLink<Account> accountLink = new AjaxLink<Account>("accountLink", model) { @Override/*from w w w . j av a2 s .c o m*/ public void onClick(AjaxRequestTarget target) { setResponsePage(new AccountPage(getModel(), getPage())); } }; accountLink.add(new Label("accountId", item.getDefaultModelObjectAsString())); item.add(new Label("balance", model.getObject().getBalance().toString())); item.add(accountLink); final PossibleTargetAccounts targetAccounts = new PossibleTargetAccounts(model); item.add(targetAccounts); final TextField<Integer> amountToTransfer = new TextField<Integer>("amountToTransfer", new Model<Integer>()) { @Override public boolean isEnabled() { return !(model.getObject()).isEmpty(); } // Wicket uses disabled="disabled" attribute for disabled text fields // However, WebDriver checks disabled state by checking if there is // fields having disabled attribute set to "true" @Override protected void onDisabled(ComponentTag tag) { tag.put("disabled", "true"); } }; amountToTransfer.setType(Integer.class); amountToTransfer.add(new OnChangeAjaxBehavior() { @Override protected void onUpdate(AjaxRequestTarget target) { if (amountToTransfer.getModelObject() == null) { targetAccounts.setVisible(false); } else { targetAccounts.setVisible(true); targetAccounts.setAmountToTransfer(Money.euros(amountToTransfer.getModelObject())); } target.addComponent(targetAccounts); } }); item.add(amountToTransfer); }
From source file:org.lbogdanov.poker.web.page.MySessionsPage.java
License:Apache License
/** * Creates a new instance of <code>MySessionsPage</code> page. *//* w ww . j av a 2 s . co m*/ @SuppressWarnings("unchecked") public MySessionsPage() { final SessionsProvider dataProvider = new SessionsProvider(); dataProvider.setSort("created", SortOrder.DESCENDING); // default sort: created, desc List<AbstractColumn<Session, String>> columns = Arrays.asList(new Column("session.name", "name", "name") { @Override public void populateItem(Item<ICellPopulator<Session>> item, String compId, IModel<Session> model) { Session session = model.getObject(); PageParameters params = new PageParameters().add("code", session.getCode()); Link<?> go = new BookmarkablePageLink<Void>("goto", SessionPage.class, params); go.add(new BodylessLabel("name", session.getName())); item.add(new Fragment(compId, "nameLink", MySessionsPage.this).add(go)); } }, new Column("session.description", null, "description"), new Column("session.created", "created", "created") { @Override @SuppressWarnings("rawtypes") public IModel<Object> getDataModel(IModel<Session> rowModel) { Date created = (Date) super.getDataModel(rowModel).getObject(); String formatted = DateFormat .getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, getLocale()) .format(created); return new Model(formatted); } }, new Column("session.author", "author", "author"), new AbstractColumn<Session, String>(new ResourceModel("session.actions")) { @Override public void populateItem(Item<ICellPopulator<Session>> item, String compId, IModel<Session> model) { Link<?> delete = new AjaxFallbackLink<Session>("delete", model) { @Override public void onClick(AjaxRequestTarget target) { sessionService.delete(getModelObject()); dataProvider.invalidate(); if (target != null) { target.add(sessionsTable); } } @Override protected void updateAjaxAttributes(AjaxRequestAttributes attributes) { super.updateAjaxAttributes(attributes); AjaxCallListener listener = new AjaxCallListener(); listener.onPrecondition("return Poker.confirm(attrs.c);"); attributes.getAjaxCallListeners().add(listener); } }; item.add(new Fragment(compId, "actions", MySessionsPage.this).add(delete)); } @Override public String getCssClass() { return "actions"; } }); sessionsTable = new DataTable<Session, String>("sessions", columns, dataProvider, ITEMS_PER_PAGE.get(0)); sessionsTable.addTopToolbar(new AjaxFallbackHeadersToolbar<String>(sessionsTable, dataProvider) { @Override protected WebMarkupContainer newSortableHeader(String borderId, String property, ISortStateLocator<String> locator) { return new AjaxFallbackOrderByBorder<String>(borderId, property, locator, getAjaxCallListener()) { @Override protected void onAjaxClick(AjaxRequestTarget target) { target.add(getTable()); } @Override protected void onSortChanged() { dataProvider.invalidate(); getTable().setCurrentPage(0); } }; } }); sessionsTable.addBottomToolbar(new AjaxNavigationToolbar(sessionsTable) { @Override protected PagingNavigator newPagingNavigator(String navigatorId, final DataTable<?, ?> table) { return new BootstrapPagingNavigator(navigatorId, table) { @Override protected void onAjaxEvent(AjaxRequestTarget target) { target.add(table); } }; } }); sessionsTable.addBottomToolbar(new NoRecordsToolbar(sessionsTable)); TextField<?> sessionName = new TextField<String>("sessionName", PropertyModel.<String>of(dataProvider, "sessionName")); sessionName.add(new OnChangeAjaxBehavior() { @Override protected void onUpdate(AjaxRequestTarget target) { dataProvider.invalidate(); target.add(sessionsTable); } @Override protected void updateAjaxAttributes(AjaxRequestAttributes attributes) { super.updateAjaxAttributes(attributes); ThrottlingSettings throttling = new ThrottlingSettings("sessionName", Duration.milliseconds(300), true); attributes.setThrottlingSettings(throttling); } }); DropDownChoice<?> pageSize = new DropDownChoice<Long>("pageSize", PropertyModel.<Long>of(sessionsTable, "itemsPerPage"), ITEMS_PER_PAGE); pageSize.add(new OnChangeAjaxBehavior() { @Override protected void onUpdate(AjaxRequestTarget target) { dataProvider.invalidate(); target.add(sessionsTable); } }); add(sessionsTable.setOutputMarkupId(true), sessionName, pageSize); }
From source file:org.obiba.onyx.jade.core.wicket.workstation.ExperimentalConditionForm.java
License:Open Source License
public void addDropDown() { if (experimentalConditionLogs == null) experimentalConditionLogs = new ArrayList<ExperimentalConditionLog>(); if (experimentalConditionLogs.size() >= 1) selectedExperimentalConditionLog = experimentalConditionLogs.get(0); WebMarkupContainer selectCalibrationId = new WebMarkupContainer("selectCalibrationId"); final DropDownChoice<ExperimentalConditionLog> experimentalConditionLogChoice = new DropDownChoice<ExperimentalConditionLog>( "experimentalConditionLogChoice", new PropertyModel<ExperimentalConditionLog>(this, "selectedExperimentalConditionLog"), experimentalConditionLogs, new ChoiceRenderer<ExperimentalConditionLog>() { private static final long serialVersionUID = 1L; @Override/*from ww w .j a v a2s . c om*/ public Object getDisplayValue(ExperimentalConditionLog object) { return new SpringStringResourceModel(object.getName(), object.getName()).getString(); } @Override public String getIdValue(ExperimentalConditionLog object, int index) { return object.getName(); } }); experimentalConditionLogChoice.add(new OnChangeAjaxBehavior() { private static final long serialVersionUID = 1L; @Override protected void onUpdate(AjaxRequestTarget target) { addComponents(); formParent.replaceWith(oldFormParent); formParent = oldFormParent; target.addComponent(formParent); } }); selectCalibrationId.addOrReplace(experimentalConditionLogChoice); addOrReplace(selectCalibrationId); if (experimentalConditionLogs.size() <= 1) selectCalibrationId.setVisible(false); }
From source file:org.obiba.onyx.jade.core.wicket.workstation.ExperimentalConditionHistoryPanel.java
License:Open Source License
public ExperimentalConditionHistoryPanel(String id, List<InstrumentCalibration> instrumentCalibrations, final int pageSize, Instrument instrument) { super(id);/*from w w w .ja v a 2 s .c o m*/ setOutputMarkupId(true); add(new AttributeModifier("class", true, new Model<String>("experimental-condition-history-panel"))); this.instrument = instrument; WebMarkupContainer selectCalibrationId = new WebMarkupContainer("selectCalibrationId"); if (instrumentCalibrations.size() >= 1) selectedInstrumentCalibration = instrumentCalibrations.get(0); final DropDownChoice<InstrumentCalibration> instrumentCalibrationChoice = new DropDownChoice<InstrumentCalibration>( "instrumentCalibrationChoice", new PropertyModel<InstrumentCalibration>(this, "selectedInstrumentCalibration"), instrumentCalibrations, new ChoiceRenderer<InstrumentCalibration>() { private static final long serialVersionUID = 1L; @Override public Object getDisplayValue(InstrumentCalibration object) { return new SpringStringResourceModel(object.getName(), object.getName()).getString(); } @Override public String getIdValue(InstrumentCalibration object, int index) { return object.getName(); } }); instrumentCalibrationChoice.add(new OnChangeAjaxBehavior() { private static final long serialVersionUID = 1L; @Override protected void onUpdate(AjaxRequestTarget target) { OnyxEntityList<ExperimentalCondition> newTable = getTable(pageSize); list.replaceWith(newTable); list = newTable; target.appendJavascript("styleOnyxEntityListNavigationBar('" + getMarkupId() + "');"); target.addComponent(list); } }); selectCalibrationId.add(instrumentCalibrationChoice); add(selectCalibrationId); if (instrumentCalibrations.size() <= 1) { selectCalibrationId.setVisible(false); list = getTable(pageSize + 2); } else { list = getTable(pageSize); } add(list); }
From source file:org.obiba.onyx.jade.core.wicket.workstation.WorkstationLogPanel.java
License:Open Source License
public WorkstationLogPanel(String id) { super(id);// w w w .j a v a 2 s . co m experimentalConditionDialogHelperPanel = new ExperimentalConditionDialogHelperPanel( "experimentalConditionDialogHelperPanel", null, null); add(experimentalConditionDialogHelperPanel); final List<ExperimentalConditionLog> experimentalConditionLogs = getExperimentalConditionLogs(); if (experimentalConditionLogs.size() >= 1) selectedExperimentalConditionLog = experimentalConditionLogs.get(0); final DropDownChoice<ExperimentalConditionLog> workstationLogChoice = new DropDownChoice<ExperimentalConditionLog>( "workstationLogChoice", new PropertyModel<ExperimentalConditionLog>(this, "selectedExperimentalConditionLog"), getExperimentalConditionLogs(), new ChoiceRenderer<ExperimentalConditionLog>() { private static final long serialVersionUID = 1L; @Override public Object getDisplayValue(ExperimentalConditionLog object) { String name = object.getName() + "Log"; return new SpringStringResourceModel(name, name).getString(); } @Override public String getIdValue(ExperimentalConditionLog object, int index) { return object.getName(); } }); workstationLogChoice.add(new OnChangeAjaxBehavior() { private static final long serialVersionUID = 1L; @Override protected void onUpdate(AjaxRequestTarget target) { ExperimentalConditionHistoryPanel newExperimentalConditionHistoryPanel = getExperimentalConditionHistoryPanel(); experimentalConditionHistoryPanel.replaceWith(newExperimentalConditionHistoryPanel); experimentalConditionHistoryPanel = newExperimentalConditionHistoryPanel; if (experimentalConditionLogs.size() == 0) experimentalConditionHistoryPanel.setVisible(false); target.addComponent(experimentalConditionHistoryPanel); workstationLogChoice.updateModel(); } }); add(workstationLogChoice); AjaxLink addWorkstationLogButton = new AjaxLink("addWorkstationLogButton") { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget target) { experimentalConditionDialogHelperPanel.setExperimentalConditionLog(selectedExperimentalConditionLog, null); experimentalConditionDialogHelperPanel.getExperimentalConditionDialog() .setWindowClosedCallback(new WindowClosedCallback() { private static final long serialVersionUID = 1L; public void onClose(AjaxRequestTarget target, Status status) { ExperimentalConditionHistoryPanel newExperimentalConditionHistoryPanel = getExperimentalConditionHistoryPanel(); experimentalConditionHistoryPanel.replaceWith(newExperimentalConditionHistoryPanel); experimentalConditionHistoryPanel = newExperimentalConditionHistoryPanel; if (experimentalConditionLogs.size() == 0) experimentalConditionHistoryPanel.setVisible(false); target.addComponent(experimentalConditionHistoryPanel); } }); SpringStringResourceModel experimentalConditionNameResource = new SpringStringResourceModel( selectedExperimentalConditionLog.getName(), selectedExperimentalConditionLog.getName()); String experimentalConditionName = experimentalConditionNameResource.getString(); experimentalConditionDialogHelperPanel.getExperimentalConditionDialog() .setTitle(new StringResourceModel("ExperimentalConditionDialogTitle", WorkstationLogPanel.this, new Model<ValueMap>( new ValueMap("experimentalConditionName=" + experimentalConditionName)))); experimentalConditionDialogHelperPanel.getExperimentalConditionDialog().show(target); } }; add(addWorkstationLogButton); if (experimentalConditionLogs.size() == 0) addWorkstationLogButton.setVisible(false); experimentalConditionHistoryPanel = getExperimentalConditionHistoryPanel(); add(experimentalConditionHistoryPanel); if (experimentalConditionLogs.size() == 0) experimentalConditionHistoryPanel.setVisible(false); }
From source file:org.obiba.onyx.quartz.core.wicket.layout.impl.standard.DropDownQuestionCategoriesPanel.java
License:Open Source License
@SuppressWarnings("serial") public DropDownQuestionCategoriesPanel(String id, IModel questionModel) { super(id, questionModel, null); setOutputMarkupId(true);//from w ww .j a va 2s .c o m Question question = getQuestion(); // This component is visible when an open answer is needed add(new EmptyPanel("open")); // When navigating to previous question if (!activeQuestionnaireAdministrationService.isQuestionnaireDevelopmentMode()) { CategoryAnswer previousAnswer = null; List<CategoryAnswer> categoryAnswers = activeQuestionnaireAdministrationService.findAnswers(question); if (categoryAnswers != null && categoryAnswers.size() != 0) { previousAnswer = categoryAnswers.get(0); for (QuestionCategory questionCategory : question.getQuestionCategories()) { if (questionCategory.getCategory().getName().equals(previousAnswer.getCategoryName())) { selectedQuestionCategoryModel = new QuestionnaireModel(questionCategory); break; } } updateOpenAnswerDefinitionPanel(null, selectedQuestionCategoryModel); } } questionCategoriesDropDownChoice = new DropDownChoice("questionCategories", new PropertyModel(this, "selectedQuestionCategory"), new LoadableDetachableModel() { @Override protected Object load() { QuestionCategoriesProvider questionCategoriesProvider = new QuestionCategoriesProvider( getQuestionModel(), new QuestionCategoryEscapeFilter(false)); return questionCategoriesProvider.getDataList(); } }, new QuestionCategoryChoiceRenderer()); questionCategoriesDropDownChoice.setOutputMarkupId(true); questionCategoriesDropDownChoice.setLabel(new QuestionnaireStringResourceModel(question, "label", false)); questionCategoriesDropDownChoice.setNullValid(true); // Set model on submission if (!activeQuestionnaireAdministrationService.isQuestionnaireDevelopmentMode()) { questionCategoriesDropDownChoice.add(new OnChangeAjaxBehavior() { @Override protected void onUpdate(final AjaxRequestTarget target) { log.debug("onUpdate()={}", selectedQuestionCategoryModel != null ? selectedQuestionCategoryModel.getObject() : null); updateOpenAnswerDefinitionPanel(target, selectedQuestionCategoryModel); // Exclusive choice, only one answer per question activeQuestionnaireAdministrationService.deleteAnswers(getQuestion()); if (selectedQuestionCategoryModel != null) { activeQuestionnaireAdministrationService .answer((QuestionCategory) selectedQuestionCategoryModel.getObject()); } if (escapeQuestionCategoriesPanel != null) { escapeQuestionCategoriesPanel.setNoSelection(); target.addComponent(escapeQuestionCategoriesPanel); } updateFeedbackPanel(target); fireQuestionCategorySelected(target, getQuestionModel(), selectedQuestionCategoryModel == null ? null : selectedQuestionCategoryModel); } @Override protected void onError(final AjaxRequestTarget target, RuntimeException e) { updateFeedbackPanel(target); // Update component target.addComponent(DropDownQuestionCategoriesPanel.this); } }); } add(questionCategoriesDropDownChoice); if (hasEscapeQuestionCategories()) { add(escapeQuestionCategoriesPanel = new DefaultEscapeQuestionCategoriesPanel("escapeCategories", getQuestionModel())); escapeQuestionCategoriesPanel.add(new AnswerCountValidator(getQuestionModel())); } else { add(new EmptyPanel("escapeCategories").setVisible(false)); } add(new InvalidFormFieldBehavior()); }