A tab component mixin would fit here nicely :) so a wrapper does not have to be arround every tab.
Davor Hrg On Tue, Mar 11, 2008 at 3:34 PM, Howard Lewis Ship <[EMAIL PROTECTED]> wrote: > You should think not of the Tabs conponent "controlling" the Tab > components, but of all of them working together. > > The Tabs component can place an object into the Environment. > > The Tab components can retrieve that object, to "register" themselves > so that the Tabs can render the correct markup. > > This is the relationship between Form and TextField (and friends). > > > > > On Tue, Mar 11, 2008 at 6:31 AM, Davor Hrg <[EMAIL PROTECTED]> wrote: > > actualy, > > you need not even do anything on the server side for such tabs, > > > > this can be easily achieved with a small javascript function. > > go through all children and generate tab controls taking title attribute > > as ctrl text: > > > > child.getAttribute("title"); > > > > for example I have a small hacked up js just for it > > it uses label instead title > > > > > > var TapestryUtil = { > > createTabs: function(id){ > > var elem = $(id); > > var selected = elem.getAttribute("selected"); > > var tabs = document.createElement("DIV"); > > tabs.className = "minitab"; > > var cont = document.createElement("DIV"); > > cont.className = "minitab_content"; > > var ch; > > while(ch = elem.firstChild){ > > elem.removeChild(ch); > > cont.appendChild(ch); > > var code = ch.getAttribute("code"); > > var label = ch.getAttribute("label"); > > > > var tab = document.createElement("A"); > > tab.href="#"+(code||""); > > tab.className = "minitab"; > > tab.innerHTML = label || code || "unlabelled"; > > tab._refContent = ch; > > tab.onclick = tabClick; > > > > if(code != null && selected != "null" && selected == code){ > > ch.style.display == ""; > > }else if(selected != null) > > ch.style.display == "none"; > > > > if(ch.style.display != "none") tab.className += " > selected_minitab"; > > tabs.appendChild(tab); > > } > > elem.appendChild(tabs); > > elem.appendChild(cont); > > > > function tabClick(){ > > var current = this; > > this.blur(); > > var ch = current.parentNode.firstChild; > > while(ch){ > > if(ch != current){ > > Element.removeClassName(ch,"selected_minitab"); > > ch._refContent.style.display = "none"; > > }else{ > > Element.addClassName(ch,"selected_minitab"); > > ch._refContent.style.display = ""; > > } > > ch = ch.nextSibling; > > } > > return false; > > } > > } > > > > > > }; > > > > Davor Hrg > > > > > > > > > > On Tue, Mar 11, 2008 at 1:15 PM, David Marquis <[EMAIL PROTECTED]> wrote: > > > Hi, > > > > > > He's having the same problem I had some time ago. > > > Suppose I want to create a Tab Component and I want to be able to > > > define it like this in the templates: > > > > > > <t:tabs t:id="myTabs"> > > > <t:tab t:id="tabOne" title="First tab"> > > > <h1>Body of tab1</h1> > > > <p>Continuing body...</p> > > > </t:tab> > > > <t:tab t:id="tabTwo" title="Second tab"> > > > <h1>Body of tab2</h1> > > > <p>Continuing body...</p> > > > </t:tab> > > > </t:tabs> > > > > > > If would then like to 'render' this about that way: > > > > > > <div class="tabs"> > > > <ul class="tabTitles"> > > > <li><a href="." onclick="switchtabs(1);">First tab</li> > > > <li><a href="." onclick="switchtabs(2);">Second tab</li> > > > </ul> > > > <div id="tabOne" class="tab selected"> > > > <h1>Body of tab1</h1> > > > <p>Continuing body...</p> > > > </div> > > > <div id="tabTwo" class="tab"> > > > <h1>Body of tab2</h1> > > > <p>Continuing body...</p> > > > </div> > > > </div> > > > > > > This is, I think, the most natural way of expressing tabs. > > > But such a thing is not possible, because the Tabs component cannot > > > accessing its child Tag components dynamically. > > > More: if you provide a body for a component (like above), you cannot > > > provide a template for this same component. > > > > > > I haven't found a way to implement such a component, and I think I had > > > about the same initial problem as Christopher : A component cannot > > > easily access its 'children' defined in the base template, build an > > > internal model from that, and render using this model and an internal > > > template. > > > > > > -- > > > David > > > > > > > > > > > > On 11-Mar-08, at 6:57 AM, Davor Hrg wrote: > > > > > > > explain what are zou trzing to achieve, maybe we can offer a > different > > > > approach.. > > > > > > > > Davor Hrg > > > > > > > > On Tue, Mar 11, 2008 at 10:33 AM, Cordenier Christophe > > > > <[EMAIL PROTECTED]> wrote: > > > >> Thank you for your answer, > > > >> > > > >> But actually my component must access its child in a dynamic way. > > > >> It will be used in different context for analysis purpose. > > > >> > > > >> I've been searching for different ways to access a component body. > > > >> > > > >> For exemple, by using "nestedId" at creation time by decorating the > > > >> PageElementFactory to identify if a component is contained in my > > > >> component, but the nestedId does not contain the id of the parent > > > >> component but is only suffixed to the container nested id. > > > >> > > > >> By decorating ComponentPageElement and intercepting "addToBody" > > > >> method call for my component only, but it was not enough for the > > > >> children and I don't want to generalize the use of these kind of > > > >> hooks or wrapping mechanism because of the "internal" aspect of the > > > >> PageElementFactory and ComponentPageElement classes. > > > >> > > > >> Best regards, > > > >> Christophe. > > > >> > > > >> -----Message d'origine----- > > > >> De : Davor Hrg [mailto:[EMAIL PROTECTED] > > > >> Envoyé : mardi 11 mars 2008 10:08 > > > >> À : Tapestry users > > > >> Objet : Re: T5 : How to access to a Component Body ? > > > >> > > > >> > > > >> > > > >> you can not access child components geenricaly, > > > >> but you can access blocks by id. > > > >> > > > >> you can embed components > > > >> @Component TextField name; //component's class is decided here > > > >> and in template simply put: > > > >> <div t:id="name"/> > > > >> > > > >> > > > >> but to access a textfield as Field you can: > > > >> @InjectComponent private Field name; > > > >> and then component's class is resolved from the template > > > >> so in the template you must put: > > > >> <t:textfield id="name"/> > > > >> > > > >> > > > >> you can not use it like this: > > > >> @Component private Field name; > > > >> and in template > > > >> <t:textfield id="name"/> > > > >> > > > >> > > > >> Davor Hrg > > > >> On Tue, Mar 11, 2008 at 9:25 AM, Cordenier Christophe > > > >> <[EMAIL PROTECTED]> wrote: > > > >>> Hello, > > > >>> > > > >>> I'm currently working on a component that needs to access the > > > >>> content of its body to extract informations like parameters, or > > > >>> persistent variable used by the components declared in its body. > > > >>> > > > >>> Actually, the ComponentResources class allows me to access the > > > >>> container of a component, but it appears that a child is not > > > >>> "contained in" the component. > > > >>> This should have helped me from a down-top view. > > > >>> > > > >>> And I didn't find any method to access the body of a component. > > > >>> > > > >>> Does anyone knows a way to access the children of a component ? > > > >>> > > > >>> Best Regards, > > > >>> Christophe Cordenier. > > > >>> > > > >>> > > > >>> Ce message et les pi?ces jointes sont confidentiels et r?serv?s ? > > > >>> l'usage exclusif de ses destinataires. Il peut ?galement ?tre prot? > > > >>> g? par le secret professionnel. Si vous recevez ce message par > > > >>> erreur, merci d'en avertir imm?diatement l'exp?diteur et de le d? > > > >>> truire. L'int?grit? du message ne pouvant ?tre assur?e sur > > > >>> Internet, la responsabilit? du groupe Atos Origin ne pourra ?tre > > > >>> recherch?e quant au contenu de ce message. Bien que les meilleurs > > > >>> efforts soient faits pour maintenir cette transmission exempte de > > > >>> tout virus, l'exp?diteur ne donne aucune garantie ? cet ?gard et > > > >>> sa responsabilit? ne saurait ?tre recherch?e pour tout dommage r? > > > >>> sultant d'un virus transmis. > > > >>> > > > >>> This e-mail and the documents attached are confidential and > > > >>> intended solely for the addressee; it may also be privileged. If > > > >>> you receive this e-mail in error, please notify the sender > > > >>> immediately and destroy it. As its integrity cannot be secured on > > > >>> the Internet, the Atos Origin group liability cannot be triggered > > > >>> for the message content. Although the sender endeavours to > > > >>> maintain a computer virus-free network, the sender does not > > > >>> warrant that this transmission is virus-free and will not be > > > >>> liable for any damages resulting from any virus transmitted. > > > >>> > > > >>> > > > >>> > --------------------------------------------------------------------- > > > >>> To unsubscribe, e-mail: [EMAIL PROTECTED] > > > >>> For additional commands, e-mail: [EMAIL PROTECTED] > > > >>> > > > >>> > > > >> > > > >> > --------------------------------------------------------------------- > > > >> To unsubscribe, e-mail: [EMAIL PROTECTED] > > > >> For additional commands, e-mail: [EMAIL PROTECTED] > > > >> > > > >> > > > >> > > > >> > > > >> Ce message et les pièces jointes sont confidentiels et réservés à > > > >> l'usage exclusif de ses destinataires. Il peut également être > > > >> protégé par le secret professionnel. Si vous recevez ce message par > > > >> erreur, merci d'en avertir immédiatement l'expéditeur et de le > > > >> détruire. L'intégrité du message ne pouvant être assurée sur > > > >> Internet, la responsabilité du groupe Atos Origin ne pourra être > > > >> recherchée quant au contenu de ce message. Bien que les meilleurs > > > >> efforts soient faits pour maintenir cette transmission exempte de > > > >> tout virus, l'expéditeur ne donne aucune garantie à cet égard et sa > > > >> responsabilité ne saurait être recherchée pour tout dommage > > > >> résultant d'un virus transmis. > > > >> > > > >> > > > >> > > > >> This e-mail and the documents attached are confidential and > > > >> intended solely for the addressee; it may also be privileged. If > > > >> you receive this e-mail in error, please notify the sender > > > >> immediately and destroy it. As its integrity cannot be secured on > > > >> the Internet, the Atos Origin group liability cannot be triggered > > > >> for the message content. Although the sender endeavours to maintain > > > >> a computer virus-free network, the sender does not warrant that > > > >> this transmission is virus-free and will not be liable for any > > > >> damages resulting from any virus transmitted. > > > >> > > > >> > > > >> > --------------------------------------------------------------------- > > > >> To unsubscribe, e-mail: [EMAIL PROTECTED] > > > >> For additional commands, e-mail: [EMAIL PROTECTED] > > > >> > > > >> > > > > > > > > --------------------------------------------------------------------- > > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > -- > Howard M. Lewis Ship > > Creator Apache Tapestry and Apache HiveMind > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]