001package com.github.gwtbootstrap.client.ui; 002 003import com.github.gwtbootstrap.client.ui.base.DivWidget; 004import com.github.gwtbootstrap.client.ui.base.HasIcon; 005import com.github.gwtbootstrap.client.ui.base.HasVisibility; 006import com.github.gwtbootstrap.client.ui.base.IconAnchor; 007import com.github.gwtbootstrap.client.ui.constants.BaseIconType; 008import com.github.gwtbootstrap.client.ui.constants.Constants; 009import com.github.gwtbootstrap.client.ui.constants.IconPosition; 010import com.github.gwtbootstrap.client.ui.constants.IconSize; 011import com.github.gwtbootstrap.client.ui.constants.IconType; 012import com.github.gwtbootstrap.client.ui.event.HasVisibleHandlers; 013import com.github.gwtbootstrap.client.ui.event.HiddenHandler; 014import com.github.gwtbootstrap.client.ui.event.HideHandler; 015import com.github.gwtbootstrap.client.ui.event.ShowHandler; 016import com.github.gwtbootstrap.client.ui.event.ShownHandler; 017import com.google.gwt.event.shared.HandlerRegistration; 018import com.google.gwt.uibinder.client.UiChild; 019import com.google.gwt.user.client.ui.Widget; 020 021/** 022 * Collapsible Widget like accordion. 023 * <p> 024 * Please see {@link Accordion} 025 * </p> 026 * @since 2.2.1.0 027 * @author ohashi keisuke 028 * @see Accordion 029 * @see Collapse 030 * @see CollapseTrigger 031 * @see <a href="http://twitter.github.com/bootstrap/javascript.html#collapse">Twitter Bootstrap document</a> 032 * 033 */ 034public class AccordionGroup extends DivWidget implements HasIcon, HasVisibility, HasVisibleHandlers { 035 036 private final DivWidget heading; 037 038 private DivWidget innerBody = new DivWidget(Constants.ACCORDION_INNER); 039 040 private IconAnchor trigger = new IconAnchor(); 041 042 private Collapse collapse; 043 044 private CollapseTrigger collapseTrigger; 045 046 private boolean defaultOpen; 047 048 public AccordionGroup() { 049 super(Constants.ACCORDION_GROUP); 050 051 DivWidget body = new DivWidget(Constants.ACCORDION_BODY); 052 053 body.add(innerBody); 054 055 collapse = new Collapse(); 056 057 collapse.setWidget(body); 058 059 collapse.setExistTrigger(true); 060 061 trigger.addStyleName(Constants.ACCORDION_TOGGLE); 062 063 collapseTrigger = new CollapseTrigger("#" + collapse.getId()); 064 065 collapseTrigger.setAccordionTrigger(true); 066 067 collapseTrigger.setWidget(trigger); 068 069 heading = new DivWidget(Constants.ACCORDION_HEADING); 070 071 heading.add(collapseTrigger); 072 073 super.add(heading); 074 075 super.add(collapse.asWidget()); 076 } 077 078 public DivWidget getHeading() { 079 return heading; 080 } 081 082 public IconAnchor getTrigger() { 083 return trigger; 084 } 085 086 /** 087 * {@inheritDoc} 088 */ 089 @Override 090 public void setIcon(IconType type) { 091 setBaseIcon(type); 092 } 093 094 /** 095 * {@inheritDoc} 096 */ 097 @Override 098 public void setBaseIcon(BaseIconType type) { 099 trigger.setBaseIcon(type); 100 } 101 102 /** 103 * {@inheritDoc} 104 */ 105 @Override 106 public void setIconSize(IconSize size) { 107 trigger.setIconSize(size); 108 } 109 110 public void setParent(String parent) { 111 collapseTrigger.setParent(parent); 112 } 113 114 /** 115 * {@inheritDoc} 116 */ 117 @Override 118 public HandlerRegistration addHideHandler(HideHandler handler) { 119 return collapse.addHideHandler(handler); 120 } 121 122 /** 123 * {@inheritDoc} 124 */ 125 @Override 126 public HandlerRegistration addHiddenHandler(HiddenHandler handler) { 127 return collapse.addHiddenHandler(handler); 128 } 129 130 /** 131 * {@inheritDoc} 132 */ 133 @Override 134 public HandlerRegistration addShowHandler(ShowHandler handler) { 135 return collapse.addShowHandler(handler); 136 } 137 138 /** 139 * {@inheritDoc} 140 */ 141 @Override 142 public HandlerRegistration addShownHandler(ShownHandler handler) { 143 return collapse.addShownHandler(handler); 144 } 145 146 /** 147 * {@inheritDoc} 148 */ 149 @Override 150 public void show() { 151 collapse.show(); 152 } 153 154 /** 155 * {@inheritDoc} 156 */ 157 @Override 158 public void hide() { 159 collapse.hide(); 160 } 161 162 /** 163 * {@inheritDoc} 164 */ 165 @Override 166 public void toggle() { 167 collapse.toggle(); 168 } 169 170 /** 171 * {@inheritDoc} 172 */ 173 @Override 174 public void add(Widget w) { 175 innerBody.add(w); 176 } 177 178 /** 179 * {@inheritDoc} 180 */ 181 @Override 182 public void clear() { 183 innerBody.clear(); 184 } 185 186 /** 187 * {@inheritDoc} 188 */ 189 @Override 190 public boolean remove(Widget w) { 191 return innerBody.remove(w); 192 } 193 194 /** 195 * Add a widget to trigger anchor 196 * @param w added widget 197 */ 198 @UiChild(limit=1,tagname="customTrigger") 199 public void addCustomTrigger(Widget w) { 200 trigger.insert(w, 0); 201 } 202 203 /** 204 * is opened on attached. 205 * @return defaultOpen true:open false:close 206 */ 207 public boolean isDefaultOpen() { 208 return defaultOpen; 209 } 210 211 /** 212 * Set is opened on attached. 213 * @param defaultOpen true:open false:close 214 */ 215 public void setDefaultOpen(boolean defaultOpen) { 216 this.defaultOpen = defaultOpen; 217 218 if(!isAttached()) { 219 collapse.getWidget().setStyleName("in", defaultOpen); 220 } 221 222 } 223 224 public void setHeading(String heading) { 225 trigger.setText(heading); 226 } 227 228 /** 229 * {@inheritDoc} 230 */ 231 @Override 232 public void setCustomIconStyle(String customIconStyle) { 233 trigger.setCustomIconStyle(customIconStyle); 234 } 235 236 /** 237 * {@inheritDoc} 238 */ 239 @Override 240 public void setIconPosition(IconPosition position) { 241 trigger.setIconPosition(position); 242 } 243 244}