1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* ***** BEGIN LICENSE BLOCK *****
3 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5 * The contents of this file are subject to the Mozilla Public License Version
6 * 1.1 (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 * http://www.mozilla.org/MPL/
10 * Software distributed under the License is distributed on an "AS IS" basis,
11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 * for the specific language governing rights and limitations under the
15 * The Original Code is mozilla.org code.
17 * The Initial Developer of the Original Code is Neil Deakin
18 * Portions created by the Initial Developer are Copyright (C) 2005
19 * the Initial Developer. All Rights Reserved.
23 * Alternatively, the contents of this file may be used under the terms of
24 * either of the GNU General Public License Version 2 or later (the "GPL"),
25 * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26 * in which case the provisions of the GPL or the LGPL are applicable instead
27 * of those above. If you wish to allow use of your version of this file only
28 * under the terms of either the GPL or the LGPL, and not to allow others to
29 * use your version of this file under the terms of the MPL, indicate your
30 * decision by deleting the provisions above and replace them with the notice
31 * and other provisions required by the GPL or the LGPL. If you do not delete
32 * the provisions above, a recipient may use your version of this file under
33 * the terms of any one of the MPL, the GPL or the LGPL.
35 * ***** END LICENSE BLOCK ***** */
37 #include "nsXULTemplateResultRDF.h"
38 #include "nsXULContentUtils.h"
40 // XXXndeakin for some reason, making this class have classinfo breaks trees.
41 //#include "nsIDOMClassInfo.h"
43 NS_IMPL_CYCLE_COLLECTION_1(nsXULTemplateResultRDF
, mQuery
)
45 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsXULTemplateResultRDF
)
46 NS_INTERFACE_MAP_ENTRY(nsIXULTemplateResult
)
47 NS_INTERFACE_MAP_ENTRY(nsISupports
)
50 NS_IMPL_CYCLE_COLLECTING_ADDREF(nsXULTemplateResultRDF
)
51 NS_IMPL_CYCLE_COLLECTING_RELEASE(nsXULTemplateResultRDF
)
53 nsXULTemplateResultRDF::nsXULTemplateResultRDF(nsIRDFResource
* aNode
)
59 nsXULTemplateResultRDF::nsXULTemplateResultRDF(nsRDFQuery
* aQuery
,
60 const Instantiation
& aInst
,
61 nsIRDFResource
*aNode
)
68 nsXULTemplateResultRDF::~nsXULTemplateResultRDF()
73 nsXULTemplateResultRDF::GetIsContainer(PRBool
* aIsContainer
)
75 *aIsContainer
= PR_FALSE
;
78 nsXULTemplateQueryProcessorRDF
* processor
= GetProcessor();
80 return processor
->CheckContainer(mNode
, aIsContainer
);
87 nsXULTemplateResultRDF::GetIsEmpty(PRBool
* aIsEmpty
)
92 nsXULTemplateQueryProcessorRDF
* processor
= GetProcessor();
94 return processor
->CheckEmpty(mNode
, aIsEmpty
);
101 nsXULTemplateResultRDF::GetMayProcessChildren(PRBool
* aMayProcessChildren
)
103 // RDF always allows recursion
104 *aMayProcessChildren
= PR_TRUE
;
109 nsXULTemplateResultRDF::GetId(nsAString
& aId
)
112 return NS_ERROR_FAILURE
;
115 mNode
->GetValueConst(&uri
);
117 CopyUTF8toUTF16(uri
, aId
);
123 nsXULTemplateResultRDF::GetResource(nsIRDFResource
** aResource
)
126 NS_IF_ADDREF(*aResource
);
131 nsXULTemplateResultRDF::GetType(nsAString
& aType
)
137 nsXULTemplateQueryProcessorRDF
* processor
= GetProcessor();
140 rv
= processor
->CheckIsSeparator(mNode
, &found
);
141 if (NS_SUCCEEDED(rv
) && found
)
142 aType
.AssignLiteral("separator");
149 nsXULTemplateResultRDF::GetBindingFor(nsIAtom
* aVar
, nsAString
& aValue
)
151 nsCOMPtr
<nsIRDFNode
> val
;
152 GetAssignment(aVar
, getter_AddRefs(val
));
154 return nsXULContentUtils::GetTextForNode(val
, aValue
);
158 nsXULTemplateResultRDF::GetBindingObjectFor(nsIAtom
* aVar
, nsISupports
** aValue
)
160 GetAssignment(aVar
, (nsIRDFNode
**)aValue
);
166 nsXULTemplateResultRDF::RuleMatched(nsISupports
* aQuery
, nsIDOMNode
* aRuleNode
)
168 // when a rule matches, set the bindings that must be used.
169 nsXULTemplateQueryProcessorRDF
* processor
= GetProcessor();
171 RDFBindingSet
* bindings
= processor
->GetBindingsForRule(aRuleNode
);
173 nsresult rv
= mBindingValues
.SetBindingSet(bindings
);
177 bindings
->AddDependencies(mNode
, this);
185 nsXULTemplateResultRDF::HasBeenRemoved()
187 // when a result is no longer used, clean up the dependencies and
188 // memory elements that refer to it
189 mBindingValues
.RemoveDependencies(mNode
, this);
191 nsXULTemplateQueryProcessorRDF
* processor
= GetProcessor();
193 processor
->RemoveMemoryElements(mInst
, this);
200 nsXULTemplateResultRDF::GetAssignment(nsIAtom
* aVar
, nsIRDFNode
** aValue
)
202 // look up a variable in the assignments map
204 mInst
.mAssignments
.GetAssignmentFor(aVar
, aValue
);
206 // if not found, look up the variable in the bindings
208 mBindingValues
.GetAssignmentFor(this, aVar
, aValue
);
213 nsXULTemplateResultRDF::SyncAssignments(nsIRDFResource
* aSubject
,
214 nsIRDFResource
* aPredicate
,
217 // synchronize the bindings when an assertion is added or removed
218 RDFBindingSet
* bindingset
= mBindingValues
.GetBindingSet();
220 return bindingset
->SyncAssignments(aSubject
, aPredicate
, aTarget
,
221 (aSubject
== mNode
) ? mQuery
->GetMemberVariable() : nsnull
,
222 this, mBindingValues
);
229 nsXULTemplateResultRDF::HasMemoryElement(const MemoryElement
& aMemoryElement
)
231 MemoryElementSet::ConstIterator last
= mInst
.mSupport
.Last();
232 for (MemoryElementSet::ConstIterator element
= mInst
.mSupport
.First();
233 element
!= last
; ++element
) {
234 if ((*element
).Equals(aMemoryElement
))