package org.openrosa.client.widget; import org.openrosa.client.model.FormDef; import org.openrosa.client.model.IFormElement; import org.openrosa.client.util.FormDesignerUtil; import org.openrosa.client.controller.ItemSelectionListener; import org.openrosa.client.locale.LocaleText; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.logical.shared.SelectionEvent; import com.google.gwt.event.logical.shared.SelectionHandler; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.HorizontalPanel; import com.google.gwt.user.client.ui.Hyperlink; import com.google.gwt.user.client.ui.MultiWordSuggestOracle; import com.google.gwt.user.client.ui.SuggestBox; import com.google.gwt.user.client.ui.TextBox; /** * This widget helps the user to build the form description template * and saves them from having to cram the syntax. * * @author daniel * */ public class DescTemplateWidget extends Composite{ private HorizontalPanel horizontalPanel = new HorizontalPanel(); private FormDef formDef; private SuggestBox sgstField = new SuggestBox(); private Hyperlink fieldHyperlink = new Hyperlink(LocaleText.get("addField"),""); private TextBox txtField = new TextBox(); private MultiWordSuggestOracle oracle = new MultiWordSuggestOracle(); private boolean enabled = false; private ItemSelectionListener itemSelectionListener; private int questionCount = 0; public DescTemplateWidget(ItemSelectionListener itemSelectionListener){ this.itemSelectionListener = itemSelectionListener; horizontalPanel.add(fieldHyperlink); fieldHyperlink.addClickHandler(new ClickHandler(){ public void onClick(ClickEvent event){ if(enabled){ if(questionCount == 0) setFormDef(formDef); horizontalPanel.remove(fieldHyperlink); horizontalPanel.add(sgstField); sgstField.setText(fieldHyperlink.getText()); sgstField.setFocus(true); txtField.selectAll(); } } }); initWidget(horizontalPanel); } public void setFormDef(FormDef formDef){ this.formDef = formDef; questionCount = formDef.getQuestionCount(); oracle.clear(); //for(int i=0; i<formDef.getPageCount(); i++) // FormDesignerUtil.loadQuestions(formDef.getPageAt(i).getQuestions(),null,oracle,false); FormDesignerUtil.loadQuestions(formDef.getChildren(),null,oracle,false); setupPopup(); } private void setupPopup(){ txtField = new TextBox(); sgstField = new SuggestBox(oracle,txtField); fieldHyperlink.setText(LocaleText.get("addField")); sgstField.addSelectionHandler(new SelectionHandler(){ public void onSelection(SelectionEvent event){ stopSelection(); } }); } public void stopSelection(){ if(horizontalPanel.getWidgetIndex(fieldHyperlink) != -1) return; String val = sgstField.getText(); if(val.trim().length() == 0) val = LocaleText.get("addField"); fieldHyperlink.setText(val); horizontalPanel.remove(sgstField); horizontalPanel.add(fieldHyperlink); IFormElement qtn = formDef.getQuestionWithText(sgstField.getText()); if(qtn != null){ fieldHyperlink.setText(LocaleText.get("addField")); itemSelectionListener.onItemSelected(this,"/"+formDef.getQuestionID()+"/"+qtn.getQuestionID()); } } public void setEnabled(boolean enabled){ this.enabled = enabled; if(!enabled && horizontalPanel.getWidgetIndex(fieldHyperlink) == -1) stopSelection(); } }