Subversion Repositories wimsdev

Rev

Rev 16561 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /*    Copyright (C) 1998-2003 XIAO, Gang of Universite de Nice - Sophia Antipolis
  2.  *
  3.  *  This program is free software; you can redistribute it and/or modify
  4.  *  it under the terms of the GNU General Public License as published by
  5.  *  the Free Software Foundation; either version 2 of the License, or
  6.  *  (at your option) any later version.
  7.  *
  8.  *  This program is distributed in the hope that it will be useful,
  9.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11.  *  GNU General Public License for more details.
  12.  *
  13.  *  You should have received a copy of the GNU General Public License
  14.  *  along with this program; if not, write to the Free Software
  15.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16.  */
  17.  
  18. /* html form simplification routines */
  19. #include "wims.h"
  20.  
  21. #define MAX_MENU_ITEMS 256
  22.  
  23. enum {
  24.   FORM_SELECT, FORM_RADIO, FORM_BAR, FORM_CHECKBOX
  25. };
  26.  
  27. /* Produces <select> and <option>s.
  28.  * Parameter string: name from n1 to n2 [prompt plist]
  29.  * or name, list slist [prompt plist]
  30.  * Using script to do this is too slow.
  31.  */
  32. void _form_menus(char *p,int kind)
  33. {
  34.   char *n, *li, *pp, *val, *p0, *p1, *p2, *pc, *s, *hmode, *name;
  35.   char *vlist[MAX_MENU_ITEMS], *plist[MAX_MENU_ITEMS];
  36.   char nbuf[MAX_LINELEN+1],vbuf[MAX_LINELEN+1],pbuf[MAX_LINELEN+1];
  37.   char buf[256], pfrb[256], pfre[256], input_id[128];
  38.   int i,i1=0,i2,itemcnt,type;
  39.   if(!outputing) return;
  40.   n=find_word_start(p); if(*n==0) return;
  41.   pp=find_word_end(n);
  42.   if(*pp!=0) *(pp++)=0;
  43.   else {
  44.     syntax: module_error("syntax_error"); return;
  45.   }
  46.   li=find_word_start(pp); pp=find_word_end(li);
  47.   if(*pp!=0) *(pp++)=0; else goto syntax;
  48.   itemcnt=0;
  49.   if(strcmp(li,"from")==0) {
  50.     p1=find_word_start(pp);
  51.     p2=wordchr(p1,"to"); if(p2==NULL || p2<=p1) goto syntax;
  52.     *(p2-1)=0; p2=find_word_start(p2+strlen("to"));
  53.     pp=wordchr(p2,"prompt"); if(pp!=NULL) *(pp-1)=0;
  54.     i1=evalue(p1); i2=evalue(p2);
  55.     if(i1<-100000000 || i1>100000000 || i2<-100000000 || i2>100000000)
  56.       goto syntax;
  57.     if(i2<i1) return;
  58.     if(i2>i1+MAX_MENU_ITEMS-1) i2=i1+MAX_MENU_ITEMS-1;
  59.     itemcnt=i2-i1+1;
  60.     type=0;
  61.   }
  62.   else {
  63.     if(strcmp(li,"list")==0) {
  64.       p1=find_word_start(pp);
  65.       pp=wordchr(p1,"prompt"); if(pp!=NULL && pp>p1) *(pp-1)=0;
  66.       ovlstrcpy(vbuf,p1);substit(vbuf);
  67.       itemcnt=cutitems(vbuf,vlist,MAX_MENU_ITEMS);
  68.       type=1;
  69.     }
  70.     else goto syntax;
  71.   }
  72.   for(i=0;i<itemcnt;i++) plist[i]=NULL;
  73.   if(pp!=NULL) {
  74.     p1=find_word_start(pp+strlen("prompt"));
  75.     ovlstrcpy(pbuf,p1);substit(pbuf);
  76.     cutitems(pbuf,plist,MAX_MENU_ITEMS);
  77.   }
  78.   ovlstrcpy(nbuf,n);substit(nbuf);
  79.   if(kind==FORM_SELECT) {
  80.     char *pp;
  81.     pp=getvar("wims_formselect_switch"); if(pp==NULL) pp="";
  82.     output("<select %s name=\"%s\" id=\"%s\">\n",pp,nbuf,nbuf);
  83.   }
  84.   if(kind==FORM_BAR) {
  85.     s=getvar("wims_ref_class");
  86.     if(s!=NULL && *s!=0 && !isspace(*s)) {
  87.       snprintf(pfrb,sizeof(pfrb)," <span class=\"%s\">",s); strcpy(pfre,"</span>");
  88.     } else { pfrb[0]=0; pfre[0]=0; }
  89.     output("%s<span style=\"font-weight:bold;\">-</span>&nbsp;",pfrb);
  90.   }
  91.   val=getvar(nbuf);if(val==NULL) val="";
  92.  
  93.   s = getvar("wims_ref_id");
  94.   if(s!=NULL && *s!=0 && !isspace(*s)) { strcpy(input_id,s); }
  95.   else { strcpy(input_id,nbuf);}
  96.  
  97.   for(i=0;i<itemcnt;i++) {
  98.     if(type==0) {
  99.       snprintf(buf,sizeof(buf),"%d",i+i1);
  100.       p0=buf;
  101.     }
  102.     else p0=vlist[i];
  103.     if(*find_word_start(p0)==0) continue;
  104.     if(plist[i]==NULL) plist[i]=p0;
  105.     if(*val!=0 &&
  106.         (strcmp(p0,val)==0 ||
  107.         ( (kind==FORM_SELECT || kind==FORM_CHECKBOX)
  108.         && itemchr(val,p0)!=NULL))) {
  109.       if(kind==FORM_SELECT) pc=" selected=\"selected\"";
  110.       else pc=" checked=\"checked\"";
  111.     }
  112.     else pc="";
  113.  
  114.     s = getvar("wims_ref_class");
  115.     hmode=getvar("wims_html_mode");
  116.     pfrb[0]=0; pfre[0]=0;
  117.     if(s!=NULL && *s!=0 && !isspace(*s)) {
  118.       if(hmode==NULL || *hmode==0 || isspace(*hmode)) {
  119.         hmode="span";
  120.       }
  121.       snprintf(pfrb, sizeof(pfrb), "<%s class=\"%s\">", hmode, s);
  122.       snprintf(pfre, sizeof(pfre), "</%s>", hmode);
  123.     } else {
  124.       if(hmode!=NULL && *hmode!=0) {
  125.         snprintf(pfrb, sizeof(pfrb), "<%s>", hmode);
  126.         snprintf(pfre, sizeof(pfre), "</%s>", hmode);
  127.       }
  128.     }
  129.     switch(kind) {
  130.       case FORM_RADIO: name="radio"; break;
  131.       case FORM_CHECKBOX: name="checkbox"; break;
  132.       case FORM_BAR: name="radio"; break;
  133.       default: name="";
  134.     }
  135.     switch(kind) {
  136.       case FORM_SELECT:
  137.         output("<option value=\"%s\"%s>%s</option>\n", p0, pc, plist[i]);
  138.         break;
  139.  
  140.       case FORM_RADIO:
  141.       case FORM_CHECKBOX:
  142.         if (itemcnt > 1) {
  143.           output("%s<input type=\"%s\" name=\"%s\" id=\"%s_%d\" value=\"%s\"%s><label for=\"%s_%d\">%s</label>%s",
  144.            pfrb,name,nbuf,input_id,i+1,p0,pc,input_id,i+1,plist[i],pfre);
  145.         } else {
  146.           output("%s<input type=\"%s\" name=\"%s\" id=\"%s\" value=\"%s\"%s><label for=\"%s\">%s</label>%s",
  147.            pfrb,name,nbuf,input_id,p0,pc,input_id,plist[i],pfre);
  148.         }
  149.         if(i<itemcnt-1 && itemcnt>2 && (hmode==NULL || *hmode==0)) _output_(",");
  150.         _output_("\n");
  151.         break;
  152.       case FORM_BAR:
  153.         output("<input type=\"%s\" name=\"%s\" id=\"%s_%d\" title=\"%s\" value=\"%s\"%s><label style=\"display:none\" for=\"%s_%d\">%s</label>",
  154.            name,nbuf,input_id,i+1,p0,p0,pc,input_id,i+1,p0);
  155.         break;
  156.     }
  157.   }
  158.   setvar("wims_ref_class","");
  159.   setvar("wims_ref_id","");
  160.   setvar("wims_html_mode","");
  161.   if(kind==FORM_SELECT) _output_("</select>");
  162.   if(kind==FORM_BAR) output("&nbsp;<span style=\"font-weight:bold;\">+</span>");
  163. }
  164.  
  165. void exec_formselect(char *p)
  166. {
  167.   _form_menus(p,FORM_SELECT);
  168. }
  169.  
  170. void exec_formradio(char *p)
  171. {
  172.   _form_menus(p,FORM_RADIO);
  173. }
  174.  
  175. void exec_formcheckbox(char *p)
  176. {
  177.   _form_menus(p,FORM_CHECKBOX);
  178. }
  179.  
  180. void exec_formbar(char *p)
  181. {
  182.   _form_menus(p,FORM_BAR);
  183. }
  184.