📄 httpform.cxx
字号:
finish = pos + after - 1;
}
PINDEX selpos = option.Find("selected");
PString thisValue = text(start, finish).Trim();
if (thisValue == myValue) {
if (selpos == P_MAX_INDEX) {
text.Splice(" selected", pos+7, 0);
if (finishAdjust != P_MAX_INDEX)
finishAdjust += 9;
if (end != P_MAX_INDEX)
end += 9;
len += 9;
}
}
else {
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;
}
//////////////////////////////////////////////////////////////////////////////
// PHTTPCompositeField
PHTTPCompositeField::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);
}
//////////////////////////////////////////////////////////////////////////////
// PHTTPSubForm
PHTTPSubForm::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
{
}
//////////////////////////////////////////////////////////////////////////////
// PHTTPFieldArray
PHTTPFieldArray::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);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -