📄 httpform.cxx
字号:
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;}PStringList PHTTPField::GetAllNames() const{ PStringList list; list.DisallowDeleteObjects(); list.AppendString(fullName); return list;}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){ 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 << PHTML::TableData("NOWRAP"); 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]+[^-]*[ \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::TableData() << 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){ 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);}PStringList PHTTPCompositeField::GetAllNames() const{ PStringList list; list.DisallowDeleteObjects(); for (PINDEX i = 0; i < GetSize(); i++) { PStringList sublist = fields[i].GetAllNames(); for (PINDEX j = 0; j < sublist.GetSize(); j++) list.AppendString(sublist[j]); } return 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) : PHTTPCompositeField(fld->GetName(), fld->GetTitle(), fld->GetHelp()), baseField(fld){ orderedArray = ordered; AddBlankField();}PHTTPFieldArray::~PHTTPFieldArray(){ delete baseField;}void PHTTPFieldArray::SetSize(PINDEX newSize){ while (fields.GetSize() > newSize) fields.RemoveAt(fields.GetSize()-1); while (fields.GetSize() <= newSize) 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(); 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"); AddArrayControlBox(html, i); } html << PHTML::TableEnd();}void PHTTPFieldArray::ExpandFieldNames(PString & text, PINDEX start, PINDEX & finish) const{ PString original = text(start, finish); PINDEX origFinish = finish; PINDEX finalFinish = finish; PINDEX fld = fields.GetSize(); while (fld > 0) { fields[--fld].ExpandFieldNames(text, start, finish); PINDEX pos,len; static PRegularExpression RowNum("<?!--#form[ \t\r\n]+rownum[ \t\r\n]*-->?", PRegularExpression::Extended|PRegularExpression::IgnoreCase); while (text.FindRegEx(RowNum, pos, len, start, finish)) SpliceAdjust(psprintf("%u", fld+1), text, pos, len, finish); static PRegularExpression SubForm("<?!--#form[ \t\r\n]+subform[ \t\r\n]*-->?", PRegularExpression::Extended|PRegularExpression::IgnoreCase); while (text.FindRegEx(SubForm, pos, len, start, finish)) { PString fmt = fullName; if (fmt.Find("%u") == P_MAX_INDEX) fmt += " %u"; SpliceAdjust("subformprefix=" + PURL::TranslateString(psprintf(fmt, fld+1), PURL::QueryTranslation), text, pos, len, finish); } static PRegularExpression RowControl("<?!--#form[ \t\r\n]+rowcontrol[ \t\r\n]*-->?", PRegularExpression::Extended|PRegularExpression::IgnoreCase); while (text.FindRegEx(RowControl, pos, len, start, finish)) { PHTML html(PHTML::InForm); AddArrayControlBox(html, fld); SpliceAdjust(html, text, pos, len, finish); } static PRegularExpression SelectRow("<select[ \t\r\n][^>]*name[ \t\r\n]*=[ \t\r\n]*\"!--#form[ \t\r\n]+rowselect[ \t\r\n]*--\"[^>]*>", PRegularExpression::Extended|PRegularExpression::IgnoreCase); static PRegularExpression SelEndRegEx("</select[^>]*>", PRegularExpression::Extended|PRegularExpression::IgnoreCase); PINDEX begin, end; while (FindSpliceBlock(SelectRow, SelEndRegEx, text, 0, pos, len, begin, end)) { PStringList options = GetArrayControlOptions(fld, fields.GetSize()-1, orderedArray); AdjustSelectOptions(text, begin, end, options[0], options, finish); static PRegularExpression RowSelect("!--#form[ \t\r\n]+rowselect[ \t\r\n]*--", PRegularExpression::Extended|PRegularExpression::IgnoreCase); if (text.FindRegEx(RowSelect, pos, len, pos, begin)) SpliceAdjust(fields[fld].GetName() + ArrayControlBox, text, pos, len, finish); } finalFinish += finish - origFinish; if (fld > 0) { text.Splice(original, start, 0); finish = origFinish; finalFinish += finish - start; } } finish = finalFinish;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -