Exemple #1
0
 public DomWalker(DomExtensionFactory domExtensionFactory, InjectionClassBuilder classBuilder, ElementDescriptorFactory elementDescriptorFactory, StyleExtensionManager styleExtensionManager, LocalizationProvider localizationProvider)
 {
     this.domExtensionFactory      = domExtensionFactory;
     this.elementDescriptorFactory = elementDescriptorFactory;
     this.styleExtensionManager    = styleExtensionManager;
     this.localizationProvider     = localizationProvider;
     this.classBuilder             = classBuilder;
 }
Exemple #2
0
        private void investigateDomElement(HtmlElement element, AbstractBehavior parentBehavior)
        {
            var currentBehavior = parentBehavior;
            var domWalker       = this;

            var id = element.getAttribute("id");

            if (id != null)
            {
                //we have a reference to the element now, so remove the id so we dont have to deal with conflicts and clashes
                element.removeAttribute("id");
            }

            var elementDescriptor = elementDescriptorFactory.describeElement(element, extensionsToBeApplied);

            if (elementDescriptor.context != null)
            {
                //change the class builder for everything under this point in the DOM
                classBuilder = domExtensionFactory.buildChildClassBuilder(classBuilder, element, elementDescriptor.context);
                //change the domWalker for everything under this point in the DOM
                domWalker = (DomWalker)classBuilder.buildClass("randori.dom.DomWalker");
            }

            if (elementDescriptor.behavior != null)
            {
                //build a context for this behavior IF it turns out that this particular element defines one
                currentBehavior = domExtensionFactory.buildBehavior(classBuilder, element, elementDescriptor.behavior);

                //we have a new behavior, this effectively causes us to use a new context for the nodes below it
                //Make sure we add ourselves to our parent though
                if (parentBehavior != null)
                {
                    parentBehavior.injectPotentialNode(id, currentBehavior);
                }
            }
            else
            {
                if (id != null && currentBehavior != null)
                {
                    currentBehavior.injectPotentialNode(id, jQueryContext.J(element));
                }
            }

            if (elementDescriptor.fragment != null)
            {
                //build a context for this behavior IF it turns out that this particular element defines one
                domExtensionFactory.buildNewContent(element, elementDescriptor.fragment);
            }

            domWalker.walkChildren(element, currentBehavior);

            //Now that we have figured out all of the items under this dom element, setup the behavior
            if (currentBehavior != null && currentBehavior != parentBehavior)
            {
                currentBehavior.verifyAndRegister();
            }
        }
        public InjectionClassBuilder buildChildClassBuilder(InjectionClassBuilder classBuilder, HtmlElement element, JsString contextClassName)
        {
            var module   = (GuiceModule)classBuilder.buildClass(contextClassName);
            var injector = (ChildInjector)classBuilder.buildClass("guice.ChildInjector");
            var guiceJs  = new GuiceJs();

            guiceJs.configureInjector(injector, module);

            //Setup a new InjectionClassBuilder
            return((InjectionClassBuilder)injector.getInstance(typeof(InjectionClassBuilder)));
        }
        public AbstractBehavior buildBehavior(InjectionClassBuilder classBuilder, HtmlElement element, JsString behaviorClassName)
        {
            AbstractBehavior behavior = null;

            var resolution = classResolver.resolveClassName(behaviorClassName);

            if (resolution.builtIn)
            {
                /** If we have a type which was not created via Randori, we send it out to get created. In this way
                 * we dont worry about injection data and we allow for any crazy creation mechanism the client can
                 * consider **/
                behavior = externalBehaviorFactory.createExternalBehavior(element, behaviorClassName, resolution.type);
            }
            else
            {
                behavior = (AbstractBehavior)classBuilder.buildClass(behaviorClassName);
                behavior.provideDecoratedElement(element);
            }

            return(behavior);
        }