html.cxx
上传用户:hzhsqp
上传日期:2007-01-06
资源大小:1600k
文件大小:30k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * html.cxx
  3.  *
  4.  * HTML classes.
  5.  *
  6.  * Portable Windows Library
  7.  *
  8.  * Copyright (c) 1993-1998 Equivalence Pty. Ltd.
  9.  *
  10.  * The contents of this file are subject to the Mozilla Public License
  11.  * Version 1.0 (the "License"); you may not use this file except in
  12.  * compliance with the License. You may obtain a copy of the License at
  13.  * http://www.mozilla.org/MPL/
  14.  *
  15.  * Software distributed under the License is distributed on an "AS IS"
  16.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  17.  * the License for the specific language governing rights and limitations
  18.  * under the License.
  19.  *
  20.  * The Original Code is Portable Windows Library.
  21.  *
  22.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  23.  *
  24.  * Portions are Copyright (C) 1993 Free Software Foundation, Inc.
  25.  * All Rights Reserved.
  26.  *
  27.  * Contributor(s): ______________________________________.
  28.  *
  29.  * $Log: html.cxx,v $
  30.  * Revision 1.17  1998/11/30 04:51:51  robertj
  31.  * New directory structure
  32.  *
  33.  * Revision 1.16  1998/09/23 06:22:04  robertj
  34.  * Added open source copyright license.
  35.  *
  36.  * Revision 1.15  1998/01/26 02:49:15  robertj
  37.  * GNU support.
  38.  *
  39.  * Revision 1.14  1997/06/16 13:18:03  robertj
  40.  * Set Is() function to be const as it should have been.
  41.  *
  42.  * Revision 1.13  1996/08/19 13:40:31  robertj
  43.  * Fixed incorrect formatting of HTML tags (cosmetic only).
  44.  *
  45.  * Revision 1.12  1996/06/28 13:08:55  robertj
  46.  * Changed PHTML class so can create html fragments.
  47.  * Fixed nesting problem in tables.
  48.  *
  49.  * Revision 1.11  1996/06/01 04:18:45  robertj
  50.  * Fixed bug in RadioButton, having 2 VALUE fields
  51.  *
  52.  * Revision 1.10  1996/04/29 12:21:22  robertj
  53.  * Fixed spelling error in assert.
  54.  * Fixed check box HTML, should always have a value.
  55.  * Added display of value of unclosed HTML element.
  56.  *
  57.  * Revision 1.9  1996/04/14 02:52:04  robertj
  58.  * Added hidden fields to HTML.
  59.  *
  60.  * Revision 1.8  1996/03/31 09:03:07  robertj
  61.  * Changed HTML token so doesn't have trailing CRLF.
  62.  *
  63.  * Revision 1.7  1996/03/16 04:54:06  robertj
  64.  * Made the assert for unclosed HTML elements only on debug version.
  65.  *
  66.  * Revision 1.6  1996/03/12 11:30:33  robertj
  67.  * Fixed resetting of HTML output using operator=.
  68.  *
  69.  * Revision 1.5  1996/03/10 13:14:55  robertj
  70.  * Simplified some of the classes and added catch all string for attributes.
  71.  *
  72.  * Revision 1.4  1996/02/25 11:14:22  robertj
  73.  * Radio button support for forms.
  74.  *
  75.  * Revision 1.3  1996/02/19 13:31:51  robertj
  76.  * Removed MSC_VER test as now completely removed from WIN16 library.
  77.  *
  78.  * Revision 1.2  1996/02/08 12:24:30  robertj
  79.  * Further implementation.
  80.  *
  81.  * Revision 1.1  1996/02/03 11:18:46  robertj
  82.  * Initial revision
  83.  *
  84.  * Revision 1.3  1996/01/28 02:49:16  robertj
  85.  * Further implementation.
  86.  *
  87.  * Revision 1.2  1996/01/26 02:24:30  robertj
  88.  * Further implemetation.
  89.  *
  90.  * Revision 1.1  1996/01/23 13:04:32  robertj
  91.  * Initial revision
  92.  *
  93.  */
  94. #ifdef __GNUC__
  95. #pragma implementation "html.h"
  96. #endif
  97. #include <ptlib.h>
  98. #include <ptclib/html.h>
  99. //////////////////////////////////////////////////////////////////////////////
  100. // PHTML
  101. PHTML::PHTML(ElementInSet initialState)
  102. {
  103.   memset(elementSet, 0, sizeof(elementSet));
  104.   tableNestLevel = 0;
  105.   initialElement = initialState;
  106.   switch (initialState) {
  107.     case NumElementsInSet :
  108.       break;
  109.     case InBody :
  110.       Set(InBody);
  111.       break;
  112.     case InForm :
  113.       Set(InBody);
  114.       Set(InForm);
  115.       break;
  116.     default :
  117.       PAssertAlways(PInvalidParameter);
  118.   }
  119. }
  120. PHTML::PHTML(const char * cstr)
  121. {
  122.   memset(elementSet, 0, sizeof(elementSet));
  123.   tableNestLevel = 0;
  124.   initialElement = NumElementsInSet;
  125.   *this << Title(cstr) << Body() << Heading(1) << cstr << Heading(1);
  126. }
  127. PHTML::PHTML(const PString & str)
  128. {
  129.   memset(elementSet, 0, sizeof(elementSet));
  130.   tableNestLevel = 0;
  131.   initialElement = NumElementsInSet;
  132.   *this << Title(str) << Body() << Heading(1) << str << Heading(1);
  133. }
  134. PHTML::~PHTML()
  135. {
  136. #ifndef NDEBUG
  137.   if (initialElement != NumElementsInSet) {
  138.     Clr(initialElement);
  139.     Clr(InBody);
  140.   }
  141.   for (PINDEX i = 0; i < PARRAYSIZE(elementSet); i++)
  142.     PAssert(elementSet[i] == 0, psprintf("Failed to close element %u", i));
  143. #endif
  144. }
  145. PHTML & PHTML::operator=(const char * cstr)
  146. {
  147.   PStringStream::operator=("");
  148.   memset(elementSet, 0, sizeof(elementSet));
  149.   if (cstr != NULL && *cstr != '')
  150.     *this << Title(cstr) << Body() << Heading(1) << cstr << Heading(1);
  151.   return *this;
  152. }
  153. PHTML & PHTML::operator=(const PString & str)
  154. {
  155.   return operator=((const char *)str);
  156. }
  157. PHTML & PHTML::operator=(const PHTML &)
  158. {
  159.   PAssertAlways(PLogicError);
  160.   return *this;
  161. }
  162. BOOL PHTML::Is(ElementInSet elmt) const
  163. {
  164.   return (elementSet[elmt>>3]&(1<<(elmt&7))) != 0;
  165. }
  166. void PHTML::Set(ElementInSet elmt)
  167. {
  168.   elementSet[elmt>>3] |= (1<<(elmt&7));
  169. }
  170. void PHTML::Clr(ElementInSet elmt)
  171. {
  172.   elementSet[elmt>>3] &= ~(1<<(elmt&7));
  173. }
  174. void PHTML::Toggle(ElementInSet elmt)
  175. {
  176.   elementSet[elmt>>3] ^= (1<<(elmt&7));
  177. }
  178. void PHTML::Element::Output(PHTML & html) const
  179. {
  180.   PAssert(reqElement == NumElementsInSet || html.Is(reqElement),
  181.                                                 "HTML element out of context");
  182.   if (crlf == BothCRLF || (crlf == OpenCRLF && !html.Is(inElement)))
  183.     html << "rn";
  184.   html << '<';
  185.   if (html.Is(inElement))
  186.     html << '/';
  187.   html << name;
  188.   AddAttr(html);
  189.   if (attr != NULL)
  190.     html << ' ' << attr;
  191.   html << '>';
  192.   if (crlf == BothCRLF || (crlf == CloseCRLF && html.Is(inElement)))
  193.     html << "rn";
  194.   if (inElement != NumElementsInSet)
  195.     html.Toggle(inElement);
  196. }
  197. void PHTML::Element::AddAttr(PHTML &) const
  198. {
  199. }
  200. PHTML::HTML::HTML(const char * attr)
  201.   : Element("HTML", attr, InHTML, NumElementsInSet, BothCRLF)
  202. {
  203. }
  204. PHTML::Head::Head()
  205.   : Element("HEAD", NULL, InHead, NumElementsInSet, BothCRLF)
  206. {
  207. }
  208. void PHTML::Head::Output(PHTML & html) const
  209. {
  210.   PAssert(!html.Is(InBody), "HTML element out of context");
  211.   if (!html.Is(InHTML))
  212.     html << HTML();
  213.   Element::Output(html);
  214. }
  215. PHTML::Body::Body(const char * attr)
  216.   : Element("BODY", attr, InBody, NumElementsInSet, BothCRLF)
  217. {
  218. }
  219. void PHTML::Body::Output(PHTML & html) const
  220. {
  221.   if (!html.Is(InHTML))
  222.     html << HTML();
  223.   if (html.Is(InTitle))
  224.     html << Title();
  225.   if (html.Is(InHead))
  226.     html << Head();
  227.   Element::Output(html);
  228.   if (!html.Is(InBody))
  229.     html << HTML();
  230. }
  231. PHTML::Title::Title()
  232.   : Element("TITLE", NULL, InTitle, InHead, CloseCRLF)
  233. {
  234.   titleString = NULL;
  235. }
  236. PHTML::Title::Title(const char * titleCStr)
  237.   : Element("TITLE", NULL, InTitle, InHead, CloseCRLF)
  238. {
  239.   titleString = titleCStr;
  240. }
  241. PHTML::Title::Title(const PString & titleStr)
  242.   : Element("TITLE", NULL, InTitle, InHead, CloseCRLF)
  243. {
  244.   titleString = titleStr;
  245. }
  246. void PHTML::Title::Output(PHTML & html) const
  247. {
  248.   PAssert(!html.Is(InBody), "HTML element out of context");
  249.   if (!html.Is(InHead))
  250.     html << Head();
  251.   if (html.Is(InTitle)) {
  252.     if (titleString != NULL)
  253.       html << titleString;
  254.     Element::Output(html);
  255.   }
  256.   else {
  257.     Element::Output(html);
  258.     if (titleString != NULL) {
  259.       html << titleString;
  260.       Element::Output(html);
  261.     }
  262.   }
  263. }
  264. PHTML::Banner::Banner(const char * attr)
  265.   : Element("BANNER", attr, NumElementsInSet, InBody, BothCRLF)
  266. {
  267. }
  268. PHTML::Division::Division(const char * attr)
  269.   : Element("DIV", attr, InDivision, InBody, BothCRLF)
  270. {
  271. }
  272. PHTML::Heading::Heading(int number,
  273.                         int sequence,
  274.                         int skip,
  275.                         const char * attr)
  276.   : Element("H", attr, InHeading, InBody, CloseCRLF)
  277. {
  278.   num = number;
  279.   srcString = NULL;
  280.   seqNum = sequence;
  281.   skipSeq = skip;
  282. }
  283. PHTML::Heading::Heading(int number,
  284.                         const char * image,
  285.                         int sequence,
  286.                         int skip,
  287.                         const char * attr)
  288.   : Element("H", attr, InHeading, InBody, CloseCRLF)
  289. {
  290.   num = number;
  291.   srcString = image;
  292.   seqNum = sequence;
  293.   skipSeq = skip;
  294. }
  295. PHTML::Heading::Heading(int number,
  296.                         const PString & imageStr,
  297.                         int sequence,
  298.                         int skip,
  299.                         const char * attr)
  300.   : Element("H", attr, InHeading, InBody, CloseCRLF)
  301. {
  302.   num = number;
  303.   srcString = imageStr;
  304.   seqNum = sequence;
  305.   skipSeq = skip;
  306. }
  307. void PHTML::Heading::AddAttr(PHTML & html) const
  308. {
  309.   PAssert(num >= 1 && num <= 6, "Bad heading number");
  310.   html << num;
  311.   if (srcString != NULL)
  312.     html << " SRC="" << srcString << '"';
  313.   if (seqNum > 0)
  314.     html << " SEQNUM=" << seqNum;
  315.   if (skipSeq > 0)
  316.     html << " SKIP=" << skipSeq;
  317. }
  318. PHTML::BreakLine::BreakLine(const char * attr)
  319.   : Element("BR", attr, NumElementsInSet, InBody, CloseCRLF)
  320. {
  321. }
  322. PHTML::Paragraph::Paragraph(const char * attr)
  323.   : Element("P", attr, NumElementsInSet, InBody, OpenCRLF)
  324. {
  325. }
  326. PHTML::PreFormat::PreFormat(int widthInChars, const char * attr)
  327.   : Element("PRE", attr, InPreFormat, InBody, CloseCRLF)
  328. {
  329.   width = widthInChars;
  330. }
  331. void PHTML::PreFormat::AddAttr(PHTML & html) const
  332. {
  333.   if (width > 0)
  334.     html << " WIDTH=" << width;
  335. }
  336. PHTML::HotLink::HotLink(const char * href, const char * attr)
  337.   : Element("A", attr, InAnchor, InBody, NoCRLF)
  338. {
  339.   hrefString = href;
  340. }
  341. void PHTML::HotLink::AddAttr(PHTML & html) const
  342. {
  343.   if (hrefString != NULL && *hrefString != '')
  344.     html << " HREF="" << hrefString << '"';
  345.   else
  346.     PAssert(html.Is(InAnchor), PInvalidParameter);
  347. }
  348. PHTML::Target::Target(const char * name, const char * attr)
  349.   : Element("A", attr, NumElementsInSet, InBody, NoCRLF)
  350. {
  351.   nameString = name;
  352. }
  353. void PHTML::Target::AddAttr(PHTML & html) const
  354. {
  355.   if (nameString != NULL && *nameString != '')
  356.     html << " NAME="" << nameString << '"';
  357. }
  358. PHTML::ImageElement::ImageElement(const char * n,
  359.                                   const char * attr,
  360.                                   ElementInSet elmt,
  361.                                   ElementInSet req,
  362.                                   OptionalCRLF c,
  363.                                   const char * image)
  364.   : Element(n, attr, elmt, req, c)
  365. {
  366.   srcString = image;
  367. }
  368. void PHTML::ImageElement::AddAttr(PHTML & html) const
  369. {
  370.   if (srcString != NULL)
  371.     html << " SRC="" << srcString << '"';
  372. }
  373. PHTML::Image::Image(const char * src, int w, int h, const char * attr)
  374.   : ImageElement("IMG", attr, NumElementsInSet, InBody, NoCRLF, src)
  375. {
  376.   altString = NULL;
  377.   width = w;
  378.   height = h;
  379. }
  380. PHTML::Image::Image(const char * src,
  381.                     const char * alt,
  382.                     int w, int h,
  383.                     const char * attr)
  384.   : ImageElement("IMG", attr, NumElementsInSet, InBody, NoCRLF, src)
  385. {
  386.   altString = alt;
  387.   width = w;
  388.   height = h;
  389. }
  390. void PHTML::Image::AddAttr(PHTML & html) const
  391. {
  392.   PAssert(srcString != NULL && *srcString != '', PInvalidParameter);
  393.   if (altString != NULL)
  394.     html << " ALT="" << altString << '"';
  395.   if (width != 0)
  396.     html << " WIDTH=" << width;
  397.   if (height != 0)
  398.     html << " HEIGHT=" << height;
  399.   ImageElement::AddAttr(html);
  400. }
  401. PHTML::HRule::HRule(const char * image, const char * attr)
  402.   : ImageElement("HR", attr, NumElementsInSet, InBody, BothCRLF, image)
  403. {
  404. }
  405. PHTML::Note::Note(const char * image, const char * attr)
  406.   : ImageElement("NOTE", attr, InNote, InBody, BothCRLF, image)
  407. {
  408. }
  409. PHTML::Address::Address(const char * attr)
  410.   : Element("ADDRESS", attr, InAddress, InBody, BothCRLF)
  411. {
  412. }
  413. PHTML::BlockQuote::BlockQuote(const char * attr)
  414.   : Element("BQ", attr, InBlockQuote, InBody, BothCRLF)
  415. {
  416. }
  417. PHTML::Credit::Credit(const char * attr)
  418.   : Element("CREDIT", attr, NumElementsInSet, InBlockQuote, OpenCRLF)
  419. {
  420. }
  421. PHTML::SetTab::SetTab(const char * id, const char * attr)
  422.   : Element("TAB", attr, NumElementsInSet, InBody, NoCRLF)
  423. {
  424.   ident = id;
  425. }
  426. void PHTML::SetTab::AddAttr(PHTML & html) const
  427. {
  428.   PAssert(ident != NULL && *ident != '', PInvalidParameter);
  429.   html << " ID=" << ident;
  430. }
  431. PHTML::Tab::Tab(int indent, const char * attr)
  432.   : Element("TAB", attr, NumElementsInSet, InBody, NoCRLF)
  433. {
  434.   ident = NULL;
  435.   indentSize = indent;
  436. }
  437. PHTML::Tab::Tab(const char * id, const char * attr)
  438.   : Element("TAB", attr, NumElementsInSet, InBody, NoCRLF)
  439. {
  440.   ident = id;
  441.   indentSize = 0;
  442. }
  443. void PHTML::Tab::AddAttr(PHTML & html) const
  444. {
  445.   PAssert(indentSize!=0 || (ident!=NULL && *ident!=''), PInvalidParameter);
  446.   if (indentSize > 0)
  447.     html << " INDENT=" << indentSize;
  448.   else
  449.     html << " TO=" << ident;
  450. }
  451. PHTML::SimpleList::SimpleList(const char * attr)
  452.   : Element("UL", attr, InList, InBody, BothCRLF)
  453. {
  454. }
  455. void PHTML::SimpleList::AddAttr(PHTML & html) const
  456. {
  457.   html << " PLAIN";
  458. }
  459. PHTML::BulletList::BulletList(const char * attr)
  460.   : Element("UL", attr, InList, InBody, BothCRLF)
  461. {
  462. }
  463. PHTML::OrderedList::OrderedList(int seqNum, const char * attr)
  464.   : Element("OL", attr, InList, InBody, BothCRLF)
  465. {
  466.   sequenceNum = seqNum;
  467. }
  468. void PHTML::OrderedList::AddAttr(PHTML & html) const
  469. {
  470.   if (sequenceNum > 0)
  471.     html << " SEQNUM=" << sequenceNum;
  472.   if (sequenceNum < 0)
  473.     html << " CONTINUE";
  474. }
  475. PHTML::DefinitionList::DefinitionList(const char * attr)
  476.   : Element("DL", attr, InList, InBody, BothCRLF)
  477. {
  478. }
  479. PHTML::ListHeading::ListHeading(const char * attr)
  480.   : Element("LH", attr, InListHeading, InList, CloseCRLF)
  481. {
  482. }
  483. PHTML::ListItem::ListItem(int skip, const char * attr)
  484.   : Element("LI", attr, NumElementsInSet, InList, OpenCRLF)
  485. {
  486.   skipSeq = skip;
  487. }
  488. void PHTML::ListItem::AddAttr(PHTML & html) const
  489. {
  490.   if (skipSeq > 0)
  491.     html << " SKIP=" << skipSeq;
  492. }
  493. PHTML::DefinitionTerm::DefinitionTerm(const char * attr)
  494.   : Element("DT", attr, NumElementsInSet, InList, NoCRLF)
  495. {
  496. }
  497. void PHTML::DefinitionTerm::Output(PHTML & html) const
  498. {
  499.   PAssert(!html.Is(InDefinitionTerm), "HTML definition item missing");
  500.   Element::Output(html);
  501.   html.Set(InDefinitionTerm);
  502. }
  503. PHTML::DefinitionItem::DefinitionItem(const char * attr)
  504.   : Element("DD", attr, NumElementsInSet, InList, NoCRLF)
  505. {
  506. }
  507. void PHTML::DefinitionItem::Output(PHTML & html) const
  508. {
  509.   PAssert(html.Is(InDefinitionTerm), "HTML definition term missing");
  510.   Element::Output(html);
  511.   html.Clr(InDefinitionTerm);
  512. }
  513. PHTML::TableStart::TableStart(const char * attr)
  514.   : Element("TABLE", attr, InTable, InBody, BothCRLF)
  515. {
  516.   borderFlag = FALSE;
  517. }
  518. PHTML::TableStart::TableStart(BorderCodes border, const char * attr)
  519.   : Element("TABLE", attr, InTable, InBody, BothCRLF)
  520. {
  521.   borderFlag = border == Border;
  522. }
  523. void PHTML::TableStart::Output(PHTML & html) const
  524. {
  525.   if (html.tableNestLevel > 0)
  526.     html.Clr(InTable);
  527.   Element::Output(html);
  528. }
  529. void PHTML::TableStart::AddAttr(PHTML & html) const
  530. {
  531.   if (borderFlag)
  532.     html << " BORDER";
  533.   html.tableNestLevel++;
  534. }
  535. PHTML::TableEnd::TableEnd()
  536.   : Element("TABLE", "", InTable, InBody, BothCRLF)
  537. {
  538. }
  539. void PHTML::TableEnd::Output(PHTML & html) const
  540. {
  541.   PAssert(html.tableNestLevel > 0, "Table nesting error");
  542.   Element::Output(html);
  543.   html.tableNestLevel--;
  544.   if (html.tableNestLevel > 0)
  545.     html.Set(InTable);
  546. }
  547. PHTML::TableRow::TableRow(const char * attr)
  548.   : Element("TR", attr, NumElementsInSet, InTable, OpenCRLF)
  549. {
  550. }
  551. PHTML::TableHeader::TableHeader(const char * attr)
  552.   : Element("TH", attr, NumElementsInSet, InTable, CloseCRLF)
  553. {
  554. }
  555. PHTML::TableData::TableData(const char * attr)
  556.   : Element("TD", attr, NumElementsInSet, InTable, NoCRLF)
  557. {
  558. }
  559. PHTML::Form::Form(const char * method,
  560.                   const char * action,
  561.                   const char * mimeType,
  562.                   const char * script)
  563.   : Element("FORM", NULL, InForm, InBody, BothCRLF)
  564. {
  565.   methodString = method;
  566.   actionString = action;
  567.   mimeTypeString = mimeType;
  568.   scriptString = script;
  569. }
  570. void PHTML::Form::AddAttr(PHTML & html) const
  571. {
  572.   if (methodString != NULL)
  573.     html << " METHOD=" << methodString;
  574.   if (actionString != NULL)
  575.     html << " ACTION="" << actionString << '"';
  576.   if (mimeTypeString != NULL)
  577.     html << " ENCTYPE="" << mimeTypeString << '"';
  578.   if (scriptString != NULL)
  579.     html << " SCRIPT="" << scriptString << '"';
  580. }
  581. PHTML::FieldElement::FieldElement(const char * n,
  582.                                   const char * attr,
  583.                                   ElementInSet elmt,
  584.                                   OptionalCRLF c,
  585.                                   DisableCodes disabled)
  586.   : Element(n, attr, elmt, InForm, c)
  587. {
  588.   disabledFlag = disabled == Disabled;
  589. }
  590. void PHTML::FieldElement::AddAttr(PHTML & html) const
  591. {
  592.   if (disabledFlag)
  593.     html << " DISABLED";
  594. }
  595. PHTML::Select::Select(const char * fname, const char * attr)
  596.   : FieldElement("SELECT", attr, InSelect, BothCRLF, Enabled)
  597. {
  598.   nameString = fname;
  599. }
  600. PHTML::Select::Select(const char * fname,
  601.                       DisableCodes disabled,
  602.                       const char * attr)
  603.   : FieldElement("SELECT", attr, InSelect, BothCRLF, disabled)
  604. {
  605.   nameString = fname;
  606. }
  607. void PHTML::Select::AddAttr(PHTML & html) const
  608. {
  609.   if (!html.Is(InSelect)) {
  610.     PAssert(nameString != NULL && *nameString != '', PInvalidParameter);
  611.     html << " NAME="" << nameString << '"';
  612.   }
  613.   FieldElement::AddAttr(html);
  614. }
  615. PHTML::Option::Option(const char * attr)
  616.   : FieldElement("OPTION", attr, NumElementsInSet, NoCRLF, Enabled)
  617. {
  618.   selectedFlag = FALSE;
  619. }
  620. PHTML::Option::Option(SelectionCodes select,
  621.                       const char * attr)
  622.   : FieldElement("OPTION", attr, NumElementsInSet, NoCRLF, Enabled)
  623. {
  624.   selectedFlag = select == Selected;
  625. }
  626. PHTML::Option::Option(DisableCodes disabled,
  627.                       const char * attr)
  628.   : FieldElement("OPTION", attr, NumElementsInSet, NoCRLF, disabled)
  629. {
  630.   selectedFlag = FALSE;
  631. }
  632. PHTML::Option::Option(SelectionCodes select,
  633.                       DisableCodes disabled,
  634.                       const char * attr)
  635.   : FieldElement("OPTION", attr, NumElementsInSet, NoCRLF, disabled)
  636. {
  637.   selectedFlag = select == Selected;
  638. }
  639. void PHTML::Option::AddAttr(PHTML & html) const
  640. {
  641.   if (selectedFlag)
  642.     html << " SELECTED";
  643.   FieldElement::AddAttr(html);
  644. }
  645. PHTML::FormField::FormField(const char * n,
  646.                             const char * attr,
  647.                             ElementInSet elmt,
  648.                             OptionalCRLF c,
  649.                             DisableCodes disabled,
  650.                             const char * fname)
  651.   : FieldElement(n, attr, elmt, c, disabled)
  652. {
  653.   nameString = fname;
  654. }
  655. void PHTML::FormField::AddAttr(PHTML & html) const
  656. {
  657.   PAssert(nameString != NULL && *nameString != '', PInvalidParameter);
  658.   html << " NAME="" << nameString << '"';
  659.   FieldElement::AddAttr(html);
  660. }
  661. PHTML::TextArea::TextArea(const char * fname,
  662.                           DisableCodes disabled,
  663.                           const char * attr)
  664.   : FormField("TEXTAREA", attr, InSelect, BothCRLF, disabled, fname)
  665. {
  666.   numRows = numCols = 0;
  667. }
  668. PHTML::TextArea::TextArea(const char * fname,
  669.                           int rows, int cols,
  670.                           DisableCodes disabled,
  671.                           const char * attr)
  672.   : FormField("TEXTAREA", attr, InSelect, BothCRLF, disabled, fname)
  673. {
  674.   numRows = rows;
  675.   numCols = cols;
  676. }
  677. void PHTML::TextArea::AddAttr(PHTML & html) const
  678. {
  679.   if (numRows > 0)
  680.     html << " ROWS=" << numRows;
  681.   if (numCols > 0)
  682.     html << " COLS=" << numCols;
  683.   FormField::AddAttr(html);
  684. }
  685. PHTML::InputField::InputField(const char * type,
  686.                               const char * fname,
  687.                               DisableCodes disabled,
  688.                               const char * attr)
  689.   : FormField("INPUT", attr, NumElementsInSet, NoCRLF, disabled, fname)
  690. {
  691.   typeString = type;
  692. }
  693. void PHTML::InputField::AddAttr(PHTML & html) const
  694. {
  695.   PAssert(typeString != NULL && *typeString != '', PInvalidParameter);
  696.   html << " TYPE=" << typeString;
  697.   FormField::AddAttr(html);
  698. }
  699. PHTML::HiddenField::HiddenField(const char * fname,
  700.                                 const char * value,
  701.                                 const char * attr)
  702.   : InputField("hidden", fname, Enabled, attr)
  703. {
  704.   valueString = value;
  705. }
  706. void PHTML::HiddenField::AddAttr(PHTML & html) const
  707. {
  708.   InputField::AddAttr(html);
  709.   PAssert(valueString != NULL, PInvalidParameter);
  710.   html << " VALUE="" << valueString << '"';
  711. }
  712. PHTML::InputText::InputText(const char * fname,
  713.                             int size,
  714.                             const char * init,
  715.                             const char * attr)
  716.   : InputField("text", fname, Enabled, attr)
  717. {
  718.   width = size;
  719.   length = 0;
  720.   value = init;
  721. }
  722. PHTML::InputText::InputText(const char * fname,
  723.                             int size,
  724.                             DisableCodes disabled,
  725.                             const char * attr)
  726.   : InputField("text", fname, disabled, attr)
  727. {
  728.   width = size;
  729.   length = 0;
  730.   value = NULL;
  731. }
  732. PHTML::InputText::InputText(const char * fname,
  733.                             int size,
  734.                             int maxLength,
  735.                             DisableCodes disabled,
  736.                             const char * attr)
  737.   : InputField("text", fname, disabled, attr)
  738. {
  739.   width = size;
  740.   length = maxLength;
  741.   value = NULL;
  742. }
  743. PHTML::InputText::InputText(const char * fname,
  744.                             int size,
  745.                             const char * init,
  746.                             int maxLength,
  747.                             DisableCodes disabled,
  748.                             const char * attr)
  749.   : InputField("text", fname, disabled, attr)
  750. {
  751.   width = size;
  752.   length = maxLength;
  753.   value = init;
  754. }
  755. PHTML::InputText::InputText(const char * type,
  756.                             const char * fname,
  757.                             int size,
  758.                             const char * init,
  759.                             int maxLength,
  760.                             DisableCodes disabled,
  761.                             const char * attr)
  762.   : InputField(type, fname, disabled, attr)
  763. {
  764.   width = size;
  765.   length = maxLength;
  766.   value = init;
  767. }
  768. void PHTML::InputText::AddAttr(PHTML & html) const
  769. {
  770.   InputField::AddAttr(html);
  771.   html << " SIZE=" << width;
  772.   if (length > 0)
  773.     html << " MAXLENGTH=" << length;
  774.   if (value != NULL)
  775.     html << " VALUE="" << value << '"';
  776. }
  777. PHTML::InputPassword::InputPassword(const char * fname,
  778.                                     int size,
  779.                                     const char * init,
  780.                                     const char * attr)
  781.   : InputText("password", fname, size, init, 0, Enabled, attr)
  782. {
  783. }
  784. PHTML::InputPassword::InputPassword(const char * fname,
  785.                                     int size,
  786.                                     DisableCodes disabled,
  787.                                     const char * attr)
  788.   : InputText("password", fname, size, NULL, 0, disabled, attr)
  789. {
  790. }
  791. PHTML::InputPassword::InputPassword(const char * fname,
  792.                                     int size,
  793.                                     int maxLength,
  794.                                     DisableCodes disabled,
  795.                                     const char * attr)
  796.   : InputText("password", fname, size, NULL, maxLength, disabled, attr)
  797. {
  798. }
  799. PHTML::InputPassword::InputPassword(const char * fname,
  800.                                     int size,
  801.                                     const char * init,
  802.                                     int maxLength,
  803.                                     DisableCodes disabled,
  804.                                     const char * attr)
  805.   : InputText("password", fname, size, init, maxLength, disabled, attr)
  806. {
  807. }
  808. PHTML::RadioButton::RadioButton(const char * fname,
  809.                                 const char * value,
  810.                                 const char * attr)
  811.   : InputField("radio", fname, Enabled, attr)
  812. {
  813.   valueString = value;
  814.   checkedFlag = FALSE;
  815. }
  816. PHTML::RadioButton::RadioButton(const char * fname,
  817.                                 const char * value,
  818.                                 DisableCodes disabled,
  819.                                 const char * attr)
  820.   : InputField("radio", fname, disabled, attr)
  821. {
  822.   valueString = value;
  823.   checkedFlag = FALSE;
  824. }
  825. PHTML::RadioButton::RadioButton(const char * fname,
  826.                                 const char * value,
  827.                                 CheckedCodes check,
  828.                                 DisableCodes disabled,
  829.                                 const char * attr)
  830.   : InputField("radio", fname, disabled, attr)
  831. {
  832.   valueString = value;
  833.   checkedFlag = check == Checked;
  834. }
  835. PHTML::RadioButton::RadioButton(const char * type,
  836.                                 const char * fname,
  837.                                 const char * value,
  838.                                 CheckedCodes check,
  839.                                 DisableCodes disabled,
  840.                                 const char * attr)
  841.   : InputField(type, fname, disabled, attr)
  842. {
  843.   valueString = value;
  844.   checkedFlag = check == Checked;
  845. }
  846. void PHTML::RadioButton::AddAttr(PHTML & html) const
  847. {
  848.   InputField::AddAttr(html);
  849.   PAssert(valueString != NULL, PInvalidParameter);
  850.   html << " VALUE=" << valueString;
  851.   if (checkedFlag)
  852.     html << " CHECKED";
  853. }
  854. PHTML::CheckBox::CheckBox(const char * fname, const char * attr)
  855.   : RadioButton("checkbox", fname, "TRUE", UnChecked, Enabled, attr)
  856. {
  857. }
  858. PHTML::CheckBox::CheckBox(const char * fname,
  859.                           DisableCodes disabled,
  860.                           const char * attr)
  861.   : RadioButton("checkbox", fname, "TRUE", UnChecked, disabled, attr)
  862. {
  863. }
  864. PHTML::CheckBox::CheckBox(const char * fname,
  865.                           CheckedCodes check,
  866.                           DisableCodes disabled,
  867.                           const char * attr)
  868.   : RadioButton("checkbox", fname, "TRUE", check, disabled, attr)
  869. {
  870. }
  871. PHTML::InputRange::InputRange(const char * fname,
  872.                               int min, int max, int value,
  873.                               DisableCodes disabled,
  874.                               const char * attr)
  875.   : InputField("range", fname, disabled, attr)
  876. {
  877.   PAssert(min <= max, PInvalidParameter);
  878.   minValue = min;
  879.   maxValue = max;
  880.   if (value < min)
  881.     initValue = min;
  882.   else if (value > max)
  883.     initValue = max;
  884.   else
  885.     initValue = value;
  886. }
  887. void PHTML::InputRange::AddAttr(PHTML & html) const
  888. {
  889.   InputField::AddAttr(html);
  890.   PINDEX max = PMAX(-minValue, maxValue);
  891.   PINDEX width = 3;
  892.   while (max > 10) {
  893.     width++;
  894.     max /= 10;
  895.   }
  896.   html << " SIZE=" << width
  897.        << " MIN=" << minValue
  898.        << " MAX=" << maxValue
  899.        << " VALUE=" << initValue;
  900. }
  901. PHTML::InputFile::InputFile(const char * fname,
  902.                             const char * accept,
  903.                             DisableCodes disabled,
  904.                             const char * attr)
  905.   : InputField("file", fname, disabled, attr)
  906. {
  907.   acceptString = accept;
  908. }
  909. void PHTML::InputFile::AddAttr(PHTML & html) const
  910. {
  911.   InputField::AddAttr(html);
  912.   if (acceptString != NULL)
  913.     html << " ACCEPT="" << acceptString << '"';
  914. }
  915. PHTML::InputImage::InputImage(const char * fname,
  916.                               const char * src,
  917.                               DisableCodes disabled,
  918.                               const char * attr)
  919.   : InputField("image", fname, disabled, attr)
  920. {
  921.   srcString = src;
  922. }
  923. PHTML::InputImage::InputImage(const char * type,
  924.                               const char * fname,
  925.                               const char * src,
  926.                               DisableCodes disabled,
  927.                               const char * attr)
  928.   : InputField(type, fname, disabled, attr)
  929. {
  930.   srcString = src;
  931. }
  932. void PHTML::InputImage::AddAttr(PHTML & html) const
  933. {
  934.   InputField::AddAttr(html);
  935.   if (srcString != NULL)
  936.     html << " SRC="" << srcString << '"';
  937. }
  938. PHTML::InputScribble::InputScribble(const char * fname,
  939.                                     const char * src,
  940.                                     DisableCodes disabled,
  941.                                     const char * attr)
  942.   : InputImage("scribble", fname, src, disabled, attr)
  943. {
  944. }
  945. PHTML::ResetButton::ResetButton(const char * title,
  946.                                 const char * fname,
  947.                                 const char * src,
  948.                                 DisableCodes disabled,
  949.                                 const char * attr)
  950.   : InputImage("reset", fname != NULL ? fname : "reset", src, disabled, attr)
  951. {
  952.   titleString = title;
  953. }
  954. PHTML::ResetButton::ResetButton(const char * type,
  955.                                 const char * title,
  956.                                 const char * fname,
  957.                                 const char * src,
  958.                                 DisableCodes disabled,
  959.                                 const char * attr)
  960.   : InputImage(type, fname, src, disabled, attr)
  961. {
  962.   titleString = title;
  963. }
  964. void PHTML::ResetButton::AddAttr(PHTML & html) const
  965. {
  966.   InputImage::AddAttr(html);
  967.   if (titleString != NULL)
  968.     html << " VALUE="" << titleString << '"';
  969. }
  970. PHTML::SubmitButton::SubmitButton(const char * title,
  971.                                   const char * fname,
  972.                                   const char * src,
  973.                                   DisableCodes disabled,
  974.                                   const char * attr)
  975.   : ResetButton("submit",
  976.                   title, fname != NULL ? fname : "submit", src, disabled, attr)
  977. {
  978. }
  979. // End Of File ///////////////////////////////////////////////////////////////