Fix writing multiple selected items to the instance data (bug 278207). Also fixes bug 280504. Patch by aaronr@us.ibm.com, r=allan@beaufour.dk, sr=me.

This commit is contained in:
bryner%brianryner.com 2005-02-01 01:18:27 +00:00
Родитель 87401ae601
Коммит 9ad4cbaa75
5 изменённых файлов: 39 добавлений и 67 удалений

Просмотреть файл

@ -77,13 +77,13 @@ interface nsIXFormsSelectChild : nsISupports
void selectItemsByContent(in nsIDOMNode node);
/**
* Instructs the item to serialize its selected elements into |container|.
* Instructs the item to serialize its selected elements.
* For children that have a value child, they should append the value of
* any selected items to the text node child of |container|. For children
* any selected items to the provided string buffer. For children
* that have a copy child, they should copy the instance data element into
* |container|.
*/
void writeSelectedItems(in nsIDOMNode container);
void writeSelectedItems(in nsIDOMNode container, out AString stringBuffer);
/**
* Set the context node, position, and size to be used for XPath evaluation.

Просмотреть файл

@ -282,7 +282,8 @@ nsXFormsChoicesElement::SelectItemsByContent(nsIDOMNode *aNode)
}
NS_IMETHODIMP
nsXFormsChoicesElement::WriteSelectedItems(nsIDOMNode *aContainer)
nsXFormsChoicesElement::WriteSelectedItems(nsIDOMNode *aContainer,
nsAString &aStringBuffer)
{
nsCOMPtr<nsIDOMNodeList> children;
nsresult rv = mElement->GetChildNodes(getter_AddRefs(children));
@ -298,7 +299,7 @@ nsXFormsChoicesElement::WriteSelectedItems(nsIDOMNode *aContainer)
children->Item(i, getter_AddRefs(childNode));
childItem = do_QueryInterface(childNode);
if (childItem) {
childItem->WriteSelectedItems(aContainer);
childItem->WriteSelectedItems(aContainer, aStringBuffer);
}
}

Просмотреть файл

@ -264,74 +264,23 @@ nsXFormsItemElement::SelectItemsByContent(nsIDOMNode *aNode)
}
NS_IMETHODIMP
nsXFormsItemElement::WriteSelectedItems(nsIDOMNode *aContainer)
nsXFormsItemElement::WriteSelectedItems(nsIDOMNode *aContainer,
nsAString &aStringBuffer)
{
PRBool selected;
mOption->GetSelected(&selected);
if (!selected)
return NS_OK;
nsCOMPtr<nsIDOMNodeList> children;
nsresult rv = aContainer->GetChildNodes(getter_AddRefs(children));
NS_ENSURE_SUCCESS(rv, rv);
PRUint32 childCount;
children->GetLength(&childCount);
nsCOMPtr<nsIDOMNode> child, textNode;
for (PRUint32 i = 0; i < childCount; ++i) {
children->Item(i, getter_AddRefs(child));
PRUint16 nodeType;
child->GetNodeType(&nodeType);
if (nodeType == nsIDOMNode::TEXT_NODE) {
textNode = child;
break;
}
}
if (!textNode) {
// No text node, so make one.
nsCOMPtr<nsIDOMDocument> doc;
aContainer->GetOwnerDocument(getter_AddRefs(doc));
NS_ENSURE_TRUE(doc, NS_ERROR_FAILURE);
nsCOMPtr<nsIDOMText> text;
rv = doc->CreateTextNode(EmptyString(), getter_AddRefs(text));
NS_ENSURE_SUCCESS(rv, rv);
rv = aContainer->AppendChild(text, getter_AddRefs(child));
NS_ENSURE_SUCCESS(rv, rv);
textNode = text;
}
NS_ASSERTION(textNode, "We should have a text node by now");
nsAutoString value;
rv = GetValue(value);
nsresult rv = GetValue(value);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIModelElementPrivate> model = nsXFormsUtils::GetModel(mElement,
0);
nsCOMPtr<nsIDOMNode> modelNode = do_QueryInterface(model);
NS_ENSURE_STATE(modelNode);
/// @todo beaufour: The update code should probably not be here.
/// @see https://bugzilla.mozilla.org/show_bug.cgi?id=278207
/// Wherever its final resting place might be, it should be shared
/// with the code in nsXFormsInputElement
PRBool changed;
rv = model->SetNodeValue(textNode, value, &changed);
NS_ENSURE_SUCCESS(rv, rv);
if (changed) {
rv = nsXFormsUtils::DispatchEvent(modelNode, eEvent_Recalculate);
NS_ENSURE_SUCCESS(rv, rv);
rv = nsXFormsUtils::DispatchEvent(modelNode, eEvent_Revalidate);
NS_ENSURE_SUCCESS(rv, rv);
rv = nsXFormsUtils::DispatchEvent(modelNode, eEvent_Refresh);
NS_ENSURE_SUCCESS(rv, rv);
if(aStringBuffer.IsEmpty()){
aStringBuffer.Append(value);
}
else{
aStringBuffer.Append(NS_LITERAL_STRING(" ") + value);
}
return NS_OK;

Просмотреть файл

@ -208,7 +208,8 @@ nsXFormsItemSetElement::SelectItemsByContent(nsIDOMNode *aNode)
}
NS_IMETHODIMP
nsXFormsItemSetElement::WriteSelectedItems(nsIDOMNode *aContainer)
nsXFormsItemSetElement::WriteSelectedItems(nsIDOMNode *aContainer,
nsAString &aStringBuffer)
{
return NS_OK;
}

Просмотреть файл

@ -363,7 +363,7 @@ nsXFormsSelectElement::HandleEvent(nsIDOMEvent *aEvent)
if ((isIncremental && type.EqualsLiteral("change")) ||
(!isIncremental && type.EqualsLiteral("blur"))) {
if (!mBoundNode)
if (!mBoundNode || !mModel)
return NS_OK;
// Update the instance data with our selected items.
@ -376,13 +376,34 @@ nsXFormsSelectElement::HandleEvent(nsIDOMEvent *aEvent)
PRUint32 childCount;
children->GetLength(&childCount);
nsAutoString stringBuffer;
for (PRUint32 i = 0; i < childCount; ++i) {
children->Item(i, getter_AddRefs(child));
childItem = do_QueryInterface(child);
if (childItem) {
childItem->WriteSelectedItems(mBoundNode);
// This will go item by item, looking for selected nodes. For every
// selected option that it finds, it will append the option's value
// to the string buffer (for childItems that are not xforms:itemset's).
childItem->WriteSelectedItems(mBoundNode, stringBuffer);
}
}
PRBool changed = PR_FALSE;
rv = mModel->SetNodeValue(mBoundNode, stringBuffer, &changed);
NS_ENSURE_SUCCESS(rv, rv);
if (changed) {
nsCOMPtr<nsIDOMNode> modelNode = do_QueryInterface(mModel);
NS_ENSURE_STATE(modelNode);
rv = nsXFormsUtils::DispatchEvent(modelNode, eEvent_Recalculate);
NS_ENSURE_SUCCESS(rv, rv);
rv = nsXFormsUtils::DispatchEvent(modelNode, eEvent_Revalidate);
NS_ENSURE_SUCCESS(rv, rv);
rv = nsXFormsUtils::DispatchEvent(modelNode, eEvent_Refresh);
NS_ENSURE_SUCCESS(rv, rv);
}
}
return NS_OK;