/** Add a TextView containing the hierarchy of groups to which the question belongs. */
  private void AddGroupText(PromptElement p) {
    StringBuffer s = new StringBuffer("");
    String t = "";
    int i;

    // list all groups in one string
    for (GroupElement g : p.getGroups()) {
      i = g.getRepeatCount() + 1;
      t = g.getGroupText();
      if (t != null) {
        s.append(t);
        if (g.isRepeat() && i > 0) {
          s.append(" (" + i + ")");
        }
        s.append(" > ");
      }
    }

    // build view
    if (s.length() > 0) {
      TextView tv = new TextView(getContext());
      tv.setText(s.substring(0, s.length() - 3));
      tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, TEXTSIZE - 7);
      tv.setPadding(0, 0, 0, 5);
      mView.addView(tv);
    }
  }
  /** Add a TextView containing the question text. */
  private void AddQuestionText(PromptElement p) {
    TextView tv = new TextView(getContext());
    tv.setText(p.getQuestionText());
    tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, TEXTSIZE);
    tv.setTypeface(null, Typeface.BOLD);

    tv.setPadding(0, 0, 0, 5);

    // wrap to the widget of view
    tv.setHorizontallyScrolling(false);
    mView.addView(tv);
  }
  public void buildView(PromptElement prompt) {
    // font size
    setTextSize(TypedValue.COMPLEX_UNIT_PX, GlobalConstants.APPLICATION_FONTSIZE);

    // capitalize the first letter of the sentence
    setKeyListener(new TextKeyListener(Capitalize.SENTENCES, false));

    // needed to make long read only text scroll
    setHorizontallyScrolling(false);
    setSingleLine(false);

    String s = prompt.getAnswerText();
    if (s != null) {
      setText(s);
    }
    if (prompt.isReadOnly()) {
      setBackgroundDrawable(null);
      setFocusable(false);
      setClickable(false);
    }
  }
  /** Add a TextView containing the help text. */
  private void AddHelpText(PromptElement p) {
    String s = p.getHelpText();

    if (s != null && !s.equals("")) {
      TextView tv = new TextView(getContext());
      tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, TEXTSIZE - 5);
      tv.setPadding(0, 0, 0, 7);
      // wrap to the widget of view
      tv.setHorizontallyScrolling(false);
      tv.setText(s);
      tv.setTypeface(null, Typeface.ITALIC);

      mView.addView(tv);
    }
  }
  @SuppressWarnings("unchecked")
  public void buildView(final PromptElement prompt) {
    mItems = prompt.getSelectItems();

    setOrientation(LinearLayout.VERTICAL);

    Vector ve = new Vector();
    if (prompt.getAnswerValue() != null) {
      ve = (Vector) prompt.getAnswerObject();
    }

    if (prompt.getSelectItems() != null) {
      OrderedHashtable h = prompt.getSelectItems();
      Enumeration en = h.keys();
      String k = null;
      String v = null;

      // counter for offset
      int i = 0;

      while (en.hasMoreElements()) {

        k = (String) en.nextElement();
        v = (String) h.get(k);

        // no checkbox group so id by answer + offset
        CheckBox c = new CheckBox(getContext());

        // when clicked, check for readonly before toggling
        c.setOnCheckedChangeListener(
            new CompoundButton.OnCheckedChangeListener() {
              public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (!mCheckboxInit && prompt.isReadonly()) {
                  if (buttonView.isChecked()) {
                    buttonView.setChecked(false);
                  } else {
                    buttonView.setChecked(true);
                  }
                }
              }
            });

        c.setId(CHECKBOX_ID + i);
        c.setText(k);
        c.setTextSize(TypedValue.COMPLEX_UNIT_PT, GlobalConstants.APPLICATION_FONTSIZE);

        for (int vi = 0; vi < ve.size(); vi++) {
          // match based on value, not key
          if (v.equals(((Selection) ve.elementAt(vi)).getValue())) {
            c.setChecked(true);
            break;
          }
        }

        c.setFocusable(!prompt.isReadonly());
        c.setEnabled(!prompt.isReadonly());
        addView(c);
        i++;
      }
    }

    mCheckboxInit = false;
  }