📄 httpform.cxx
字号:
if (validValues.GetSize() > 0) { PINDEX valid; for (valid = 0; valid < validValues.GetSize(); valid++) { if (thisValue == validValues[valid]) break; } if (valid >= validValues.GetSize()) { text.Delete(pos, len); selpos = P_MAX_INDEX; if (finishAdjust != P_MAX_INDEX) finishAdjust -= len; if (end != P_MAX_INDEX) end -= len; len = 0; } } if (selpos != P_MAX_INDEX) { selpos += pos; PINDEX sellen = 8; if (text[selpos-1] == ' ') { selpos--; sellen++; } text.Delete(selpos, sellen); if (finishAdjust != P_MAX_INDEX) finishAdjust -= sellen; if (end != P_MAX_INDEX) end -= sellen; len -= sellen; } } }}PString PHTTPField::GetHTMLSelect(const PString & selection) const{ PString text = selection; PStringList dummy1; PINDEX dummy2 = P_MAX_INDEX; AdjustSelectOptions(text, 0, P_MAX_INDEX, GetValue(FALSE), dummy1, dummy2); return text;}void PHTTPField::GetHTMLHeading(PHTML &) const{}static int SplitConfigKey(const PString & fullName, PString & section, PString & key){ if (fullName.IsEmpty()) return 0; PINDEX slash = fullName.FindLast('\\'); if (slash == 0 || slash >= fullName.GetLength()-1) { key = fullName; return 1; } section = fullName.Left(slash); key = fullName.Mid(slash+1); if (section.IsEmpty() || key.IsEmpty()) return 0; return 2;}void PHTTPField::LoadFromConfig(PConfig & cfg){ PString section, key; switch (SplitConfigKey(fullName, section, key)) { case 1 : SetValue(cfg.GetString(key, GetValue(TRUE))); break; case 2 : SetValue(cfg.GetString(section, key, GetValue(TRUE))); }}void PHTTPField::SaveToConfig(PConfig & cfg) const{ PString section, key; switch (SplitConfigKey(fullName, section, key)) { case 1 : cfg.SetString(key, GetValue()); break; case 2 : cfg.SetString(section, key, GetValue()); }}BOOL PHTTPField::Validated(const PString &, PStringStream &) const{ return TRUE;}void PHTTPField::GetAllNames(PStringList & list) const{ list.AppendString(fullName);}void PHTTPField::SetAllValues(const PStringToString & data){ if (!baseName && data.Contains(fullName)) SetValue(data[fullName]);}BOOL PHTTPField::ValidateAll(const PStringToString & data, PStringStream & msg) const{ if (data.Contains(fullName)) return Validated(data[fullName], msg); return TRUE;}//////////////////////////////////////////////////////////////////////////////// PHTTPCompositeFieldPHTTPCompositeField::PHTTPCompositeField(const char * nam, const char * titl, const char * hlp) : PHTTPField(nam, titl, hlp){}void PHTTPCompositeField::SetName(const PString & newName){ if (fullName.IsEmpty() || newName.IsEmpty()) return; for (PINDEX i = 0; i < fields.GetSize(); i++) { PHTTPField & field = fields[i]; PString firstPartOfName = psprintf(fullName, i+1); PString subFieldName; if (field.GetName().Find(firstPartOfName) == 0) subFieldName = field.GetName().Mid(firstPartOfName.GetLength()); else subFieldName = field.GetName(); firstPartOfName = psprintf(newName, i+1); if (subFieldName[0] == '\\' || firstPartOfName[firstPartOfName.GetLength()-1] == '\\') field.SetName(firstPartOfName + subFieldName); else field.SetName(firstPartOfName & subFieldName); } PHTTPField::SetName(newName);}const PHTTPField * PHTTPCompositeField::LocateName(const PString & name) const{ if (fullName == name) return this; for (PINDEX i = 0; i < fields.GetSize(); i++) { const PHTTPField * field = fields[i].LocateName(name); if (field != NULL) return field; } return NULL;}PHTTPField * PHTTPCompositeField::NewField() const{ PHTTPCompositeField * fld = new PHTTPCompositeField(baseName, title, help); for (PINDEX i = 0; i < fields.GetSize(); i++) fld->Append(fields[i].NewField()); return fld;}void PHTTPCompositeField::GetHTMLTag(PHTML & html) const{ for (PINDEX i = 0; i < fields.GetSize(); i++) { if (i != 0 && html.Is(PHTML::InTable)) html << PHTML::TableData("NOWRAP ALIGN=CENTER"); fields[i].GetHTMLTag(html); }}PString PHTTPCompositeField::GetHTMLInput(const PString & input) const{ return input;}void PHTTPCompositeField::ExpandFieldNames(PString & text, PINDEX start, PINDEX & finish) const{ static PRegularExpression FieldName( "!--#form[ \t\r\n]+(-?[^-])+[ \t\r\n]+(-?[^-])+--" "|" "<[a-z]*[ \t\r\n][^>]*name[ \t\r\n]*=[ \t\r\n]*\"[^\"]*\"[^>]*>", PRegularExpression::IgnoreCase); PString name; PINDEX pos, len; while (start < finish && FindSpliceFieldName(text, start, pos, len, name)) { if (pos > finish) break; for (PINDEX fld = 0; fld < fields.GetSize(); fld++) { if (fields[fld].GetBaseName() *= name) { SpliceAdjust(fields[fld].GetName(), text, pos, len, finish); break; } } start = pos + len; }}void PHTTPCompositeField::GetHTMLHeading(PHTML & html) const{ html << PHTML::TableRow(); for (PINDEX i = 0; i < fields.GetSize(); i++) html << PHTML::TableHeader() << fields[i].GetTitle();}PString PHTTPCompositeField::GetValue(BOOL dflt) const{ PStringStream value; for (PINDEX i = 0; i < fields.GetSize(); i++) value << fields[i].GetValue(dflt) << '\n'; return value;}void PHTTPCompositeField::SetValue(const PString &){ PAssertAlways(PLogicError);}void PHTTPCompositeField::LoadFromConfig(PConfig & cfg){ SetName(fullName); for (PINDEX i = 0; i < GetSize(); i++) fields[i].LoadFromConfig(cfg);}void PHTTPCompositeField::SaveToConfig(PConfig & cfg) const{ for (PINDEX i = 0; i < GetSize(); i++) fields[i].SaveToConfig(cfg);}void PHTTPCompositeField::GetAllNames(PStringList & list) const{ for (PINDEX i = 0; i < GetSize(); i++) fields[i].GetAllNames(list);}void PHTTPCompositeField::SetAllValues(const PStringToString & data){ for (PINDEX i = 0; i < fields.GetSize(); i++) fields[i].SetAllValues(data);}BOOL PHTTPCompositeField::ValidateAll(const PStringToString & data, PStringStream & msg) const{ for (PINDEX i = 0; i < fields.GetSize(); i++) if (!fields[i].ValidateAll(data, msg)) return FALSE; return TRUE;}PINDEX PHTTPCompositeField::GetSize() const{ return fields.GetSize();}void PHTTPCompositeField::Append(PHTTPField * fld){ fields.Append(fld);}//////////////////////////////////////////////////////////////////////////////// PHTTPSubFormPHTTPSubForm::PHTTPSubForm(const PString & subForm, const char * name, const char * title, PINDEX prim, PINDEX sec) : PHTTPCompositeField(name, title, NULL), subFormName(subForm){ primary = prim; secondary = sec;}PHTTPField * PHTTPSubForm::NewField() const{ PHTTPCompositeField * fld = new PHTTPSubForm(subFormName, baseName, title, primary, secondary); for (PINDEX i = 0; i < fields.GetSize(); i++) fld->Append(fields[i].NewField()); return fld;}void PHTTPSubForm::GetHTMLTag(PHTML & html) const{ PString value = fields[primary].GetValue(); if (value.IsEmpty()) value = "New"; html << PHTML::HotLink(subFormName + "?subformprefix=" + PURL::TranslateString(fullName, PURL::QueryTranslation)) << value << PHTML::HotLink(); if (secondary != P_MAX_INDEX) html << PHTML::TableData("NOWRAP") << fields[secondary].GetValue();}void PHTTPSubForm::GetHTMLHeading(PHTML &) const{}//////////////////////////////////////////////////////////////////////////////// PHTTPFieldArrayPHTTPFieldArray::PHTTPFieldArray(PHTTPField * fld, BOOL ordered, PINDEX fixedSize) : PHTTPCompositeField(fld->GetName(), fld->GetTitle(), fld->GetHelp()), baseField(fld){ orderedArray = ordered; canAddElements = fixedSize == 0; SetSize(fixedSize);}PHTTPFieldArray::~PHTTPFieldArray(){ delete baseField;}void PHTTPFieldArray::SetSize(PINDEX newSize){ while (fields.GetSize() > newSize) fields.RemoveAt(fields.GetSize()-1); while (fields.GetSize() < newSize) AddBlankField(); if (canAddElements) AddBlankField();}PHTTPField * PHTTPFieldArray::NewField() const{ return new PHTTPFieldArray(baseField->NewField(), orderedArray);}static const char ArrayControlBox[] = " Array Control";static const char ArrayControlKeep[] = "Keep";static const char ArrayControlRemove[] = "Remove";static const char ArrayControlMoveUp[] = "Move Up";static const char ArrayControlMoveDown[] = "Move Down";static const char ArrayControlToTop[] = "To Top";static const char ArrayControlToBottom[] = "To Bottom";static const char ArrayControlIgnore[] = "Ignore";static const char ArrayControlAddTop[] = "Add Top";static const char ArrayControlAddBottom[] = "Add Bottom";static const char ArrayControlAdd[] = "Add";static PStringList GetArrayControlOptions(PINDEX fld, PINDEX size, BOOL orderedArray){ PStringList options; if (fld >= size) { options.AppendString(ArrayControlIgnore); if (size == 0 || !orderedArray) options.AppendString(ArrayControlAdd); else { options.AppendString(ArrayControlAddTop); options.AppendString(ArrayControlAddBottom); } } else { options.AppendString(ArrayControlKeep); options.AppendString(ArrayControlRemove); if (orderedArray) { if (fld > 0) options.AppendString(ArrayControlMoveUp); if (fld < size-1) options.AppendString(ArrayControlMoveDown); if (fld > 0) options.AppendString(ArrayControlToTop); if (fld < size-1) options.AppendString(ArrayControlToBottom); } } return options;}void PHTTPFieldArray::AddArrayControlBox(PHTML & html, PINDEX fld) const{ PStringList options = GetArrayControlOptions(fld, fields.GetSize()-1, orderedArray); html << PHTML::Select(fields[fld].GetName() + ArrayControlBox); for (PINDEX i = 0; i < options.GetSize(); i++) html << PHTML::Option(i == 0 ? PHTML::Selected : PHTML::NotSelected) << options[i]; html << PHTML::Select();}void PHTTPFieldArray::GetHTMLTag(PHTML & html) const{ html << PHTML::TableStart("border=1 cellspacing=0 cellpadding=8"); baseField->GetHTMLHeading(html); for (PINDEX i = 0; i < fields.GetSize(); i++) { html << PHTML::TableRow() << PHTML::TableData("NOWRAP"); fields[i].GetHTMLTag(html); html << PHTML::TableData("NOWRAP"); if (canAddElements) AddArrayControlBox(html, i); } html << PHTML::TableEnd();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -