/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Mozilla Communicator client code. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1998 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Robert Churchill * David Hyatt * Chris Waterson * Pierre Phaneuf * Neil Deakin * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #ifndef nsXULTemplateBuilder_h__ #define nsXULTemplateBuilder_h__ #include "nsStubDocumentObserver.h" #include "nsIScriptSecurityManager.h" #include "nsIContent.h" #include "nsIObserver.h" #include "nsIRDFCompositeDataSource.h" #include "nsIRDFContainer.h" #include "nsIRDFContainerUtils.h" #include "nsIRDFDataSource.h" #include "nsIRDFObserver.h" #include "nsIRDFService.h" #include "nsIXULTemplateBuilder.h" #include "nsFixedSizeAllocator.h" #include "nsVoidArray.h" #include "nsCOMArray.h" #include "nsTArray.h" #include "nsDataHashtable.h" #include "nsTemplateRule.h" #include "nsTemplateMatch.h" #include "nsIXULTemplateQueryProcessor.h" #include "nsCycleCollectionParticipant.h" #include "prlog.h" #ifdef PR_LOGGING extern PRLogModuleInfo* gXULTemplateLog; #endif class nsIXULDocument; class nsIRDFCompositeDataSource; class nsIObserverService; /** * An object that translates an RDF graph into a presentation using a * set of rules. */ class nsXULTemplateBuilder : public nsIXULTemplateBuilder, public nsIObserver, public nsStubDocumentObserver { public: nsXULTemplateBuilder(); virtual ~nsXULTemplateBuilder(); nsresult InitGlobals(); /** * Clear the template builder structures. The aIsFinal flag is set to true * when the template is going away. */ virtual void Uninit(PRBool aIsFinal); // nsISupports interface NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsXULTemplateBuilder, nsIXULTemplateBuilder) // nsIXULTemplateBuilder interface NS_DECL_NSIXULTEMPLATEBUILDER // nsIObserver Interface NS_DECL_NSIOBSERVER // nsIMutationObserver NS_DECL_NSIMUTATIONOBSERVER_ATTRIBUTECHANGED NS_DECL_NSIMUTATIONOBSERVER_CONTENTREMOVED NS_DECL_NSIMUTATIONOBSERVER_NODEWILLBEDESTROYED /** * Remove an old result and/or add a new result. This method will retrieve * the set of containers where the result could be inserted and either add * the new result to those containers, or remove the result from those * containers. UpdateResultInContainer is called for each container. * * @param aOldResult result to remove * @param aNewResult result to add * @param aQueryNode query node for new result */ nsresult UpdateResult(nsIXULTemplateResult* aOldResult, nsIXULTemplateResult* aNewResult, nsIDOMNode* aQueryNode); /** * Remove an old result and/or add a new result from a specific container. * * @param aOldResult result to remove * @param aNewResult result to add * @param aQueryNode queryset for the new result * @param aOldId id of old result * @param aNewId id of new result * @param aInsertionPoint container to remove or add result inside */ nsresult UpdateResultInContainer(nsIXULTemplateResult* aOldResult, nsIXULTemplateResult* aNewResult, nsTemplateQuerySet* aQuerySet, nsIRDFResource* aOldId, nsIRDFResource* aNewId, nsIContent* aInsertionPoint); nsresult ComputeContainmentProperties(); static PRBool IsTemplateElement(nsIContent* aContent); virtual nsresult RebuildAll() = 0; // must be implemented by subclasses /** * Find the