Отображение вопросов
Метод genQues, приведенный в листинге 7.12, вызывается после того, как переменной nowNode присваивается значение того элемента dues, который требуется отобразить. Обратите внимание на то, как используется указатель типа вопроса (QMC или QMCM) для выбора сообщения-подсказки. После того как напечатаны текст вопроса и подсказка, метод genQues создает форму, содержащую различные варианты ответа.
Листинг 7.12. Метод genQuest (Interpreter-Java)
public void genQuest( PrintWriter out ){ Element E = (Element) nowNode ; String qid = E.getAttribute("id") ; String type = E.getAttribute("type"); String lim = E.getAttribute("limit"); // out.print("Question id: " + qid + " type: " + type + brcrlf ); writeHead( out ); NodeList nm = E.getElementsByTagName("Qtext"); out.print( nm.item(0).getFirstChild().getNodeValue() ); out.println(brcrlf ); NodeList opm = E.getElementsByTagName("Qopt"); int optCt = opm.getLength(); int typeN = lookUpType( type ); switch( typeN ){ case QMC : out.print("Choose one"); break ; case QMCM : if( lim.length() == 0 ){ out.print("Choose any number"); } else { out.print("Choose up to " + lim ); } break ; default : out.print("Unknown type"); } out.print( brcrlf ); startForm( out ); // creates <form... for( int i = 0 ; i < optCt ; i++ ){ doOption(out, opm.item(i), typeN ); } endForm( out, qid ); }
Метод genQuest в предыдущем листинге вызывает метод doOption (листинг 7.13) для каждого элемента <Qopt>. Если вы захотите добавить дополнительные типы ответов, например поле для ввода текста, вам потребуется модифицировать именно этот метод. В этом листинге также показан метод checkBl ockType, который используется для проверки атрибутов элемента Block.
Листинг 7.13. Метод doOption (Interpretr.java)
// opN is from node list of <Qopt> - create output // <Qopt val="a" branch="" >Option a.</Qopt> private void doOption(PrintWriter out, Node opN, int typeN ){ Element E = (Element) opN; String val = E.getAttribute("val") ; String branch = E.getAttribute("branch"); String content = E.getFirstChild().getNodeValue(); // what else? type of option display? switch( typeN ){ // known valid case QMC : out.print("<input name=\"opt\" value=\"" + val + "\" type=\"RADIO\" >" ); break ; case QMCM : out.print("<input name=\"opt\" value=\"" + val + "\" type=\"CHECKBOX\" >" ); break ; } // now for the text out.println( content ); out.println( brcrlf ); }
// look at the type and css attributes in <Block> private void checkBlockType( ){ Element E = (Element)nowBlock ; String tmp = E.getAttribute("type"); terminal = tmp.equals("terminal"); tmp = E.getAttribute("css"); if( tmp.length() > 0 ) css = tmp ; System.out.println("checkBlockType - css:" + css ); }