package com.github.gwtbootstrap.client.ui; import com.github.gwtbootstrap.client.ui.base.AbstractMarkupWidget; import com.github.gwtbootstrap.client.ui.constants.Constants; import com.google.gwt.core.client.Scheduler; import com.google.gwt.core.client.Scheduler.ScheduledCommand; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.ui.Widget; /** * Markup widget of CollapseTrigger * <p> * It's a markup widget (decorator widget). * it's can exchange child to {@link Collapse}'s toggle trigger widget. * * <p> * <h3>UiBinder Usage:</h3> * </p> * <pre> * {@code * <b:CollapseTrigger target="#toggle1"> * <b:Button>Collapse Trigger</b:Button> * </b:CollapseTrigger> * * <!-- if use collapse trigger, you must set existTrigger=true attribute to Collapse tag. --> * <b:Collapse existTrigger="true" b:id="toggle1" defaultOpen="true"> * <b:FluidRow> * <b:Column size="12"> * <b:Alert close="false" animation="true" heading="collapsible1"> * <b:Paragraph> * Hello :D * </b:Paragraph> * </b:Alert> * </b:Column> * </b:FluidRow> * </b:Collapse> * } * </pre> * * @since 2.2.1.0 * @author ohashi keisuke * @see Accordion * @see Collapse * @see CollapseTrigger * @see <a href="http://getbootstrap.com/2.3.2/javascript.html#collapse">Bootstrap document</a> * */ public class CollapseTrigger extends AbstractMarkupWidget { private String target; private String parent; private boolean isAccordionTrigger = false; /** * Create an empty widget with target selector * @param target selector (eg: #myCollapse) */ public CollapseTrigger(String target) { this.target = target; } /** * Create an empty widget. */ public CollapseTrigger() { } /** * {@inheritDoc} */ @Override public Widget asWidget() { if(widget != null) { Element element = widget.getElement(); if (isAccordionTrigger) { element.setAttribute(Constants.DATA_TOGGLE, Constants.COLLAPSE); element.removeAttribute(Constants.DATA_TARGET); element.setAttribute("href", target); if(parent != null && !parent.isEmpty()) { setParent(parent); } Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { Collapse.configure(target, parent, false); } }); return super.asWidget(); } if(element.hasAttribute(Constants.DATA_TOGGLE) && widget instanceof HasClickHandlers && !widget.isAttached()) { Scheduler.get().scheduleDeferred(new ScheduledCommand() { @Override public void execute() { Collapse.configure(target, parent, false); ((HasClickHandlers)widget).addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { Collapse.changeVisibility(target, "toggle"); } }); } }); return super.asWidget(); } element.setAttribute(Constants.DATA_TARGET, target); element.setAttribute(Constants.DATA_TOGGLE, Constants.COLLAPSE); if(parent != null && !parent.isEmpty()) { setParent(parent); } } return super.asWidget(); } /** * Set target collapse selector. * @param target selector of target. (eg:#myCollapse) */ public void setTarget(String target) { this.target = target; if(widget != null) { Element element = widget.getElement(); element.setAttribute(Constants.DATA_TARGET, target); } } /** * Get target collapse selector. * @return selector. */ public String getTarget(){ return this.target; } /** * Set parent selector. * * it only work with {@link AccordionGroup}, * Please see <a href="https://github.com/twbs/bootstrap/issues/4988">this issue</a>. * * @param parent parent selector */ public void setParent(String parent) { this.parent = parent; if(widget != null) { widget.getElement().setAttribute("data-parent", parent); } } protected boolean isAccordionTrigger() { return isAccordionTrigger; } protected void setAccordionTrigger(boolean accordionTrigger) { isAccordionTrigger = accordionTrigger; } }