1 16 package com.google.gwt.user.client.ui; 17 18 import com.google.gwt.user.client.DOM; 19 import com.google.gwt.user.client.Event; 20 21 41 public class TabBar extends Composite implements SourcesTabEvents, 42 ClickListener { 43 44 50 private static final class ClickDecoratorPanel extends SimplePanel { 51 ClickListener delegate; 52 53 ClickDecoratorPanel(Widget child, ClickListener delegate) { 54 this.delegate = delegate; 55 setWidget(child); 56 sinkEvents(Event.ONCLICK); 57 } 58 59 public void onBrowserEvent(Event event) { 60 switch (DOM.eventGetType(event)) { 62 case Event.ONCLICK: 63 delegate.onClick(this); 64 } 65 } 66 } 67 68 private static final String STYLENAME_DEFAULT = "gwt-TabBarItem"; 69 private HorizontalPanel panel = new HorizontalPanel(); 70 private Widget selectedTab; 71 private TabListenerCollection tabListeners; 72 73 76 public TabBar() { 77 initWidget(panel); 78 sinkEvents(Event.ONCLICK); 79 setStyleName("gwt-TabBar"); 80 81 panel.setVerticalAlignment(HasVerticalAlignment.ALIGN_BOTTOM); 82 83 HTML first = new HTML(" ", true), rest = new HTML(" ", true); 84 first.setStyleName("gwt-TabBarFirst"); 85 rest.setStyleName("gwt-TabBarRest"); 86 first.setHeight("100%"); 87 rest.setHeight("100%"); 88 89 panel.add(first); 90 panel.add(rest); 91 first.setHeight("100%"); 92 panel.setCellHeight(first, "100%"); 93 panel.setCellWidth(rest, "100%"); 94 } 95 96 101 public void addTab(String text) { 102 insertTab(text, getTabCount()); 103 } 104 105 111 public void addTab(String text, boolean asHTML) { 112 insertTab(text, asHTML, getTabCount()); 113 } 114 115 120 public void addTab(Widget widget) { 121 insertTab(widget, getTabCount()); 122 } 123 124 public void addTabListener(TabListener listener) { 125 if (tabListeners == null) { 126 tabListeners = new TabListenerCollection(); 127 } 128 tabListeners.add(listener); 129 } 130 131 136 public int getSelectedTab() { 137 if (selectedTab == null) { 138 return -1; 139 } 140 return panel.getWidgetIndex(selectedTab) - 1; 141 } 142 143 148 public int getTabCount() { 149 return panel.getWidgetCount() - 2; 150 } 151 152 158 public String getTabHTML(int index) { 159 if (index >= getTabCount()) { 160 return null; 161 } 162 Widget widget = panel.getWidget(index + 1); 163 if (widget instanceof HTML) { 164 return ((HTML) widget).getHTML(); 165 } else if (widget instanceof Label) { 166 return ((Label) widget).getText(); 167 } else { 168 return DOM.getInnerHTML(widget.getElement()); 170 } 171 } 172 173 180 public void insertTab(String text, boolean asHTML, int beforeIndex) { 181 checkInsertBeforeTabIndex(beforeIndex); 182 183 Label item; 184 if (asHTML) { 185 item = new HTML(text); 186 } else { 187 item = new Label(text); 188 } 189 190 item.setWordWrap(false); 191 item.addClickListener(this); 192 item.setStyleName(STYLENAME_DEFAULT); 193 panel.insert(item, beforeIndex + 1); 194 } 195 196 202 public void insertTab(String text, int beforeIndex) { 203 insertTab(text, false, beforeIndex); 204 } 205 206 212 public void insertTab(Widget widget, int beforeIndex) { 213 checkInsertBeforeTabIndex(beforeIndex); 214 215 ClickDecoratorPanel decWidget = new ClickDecoratorPanel(widget, this); 216 decWidget.addStyleName(STYLENAME_DEFAULT); 217 panel.insert(decWidget, beforeIndex + 1); 218 } 219 220 public void onClick(Widget sender) { 221 for (int i = 1; i < panel.getWidgetCount() - 1; ++i) { 222 if (panel.getWidget(i) == sender) { 223 selectTab(i - 1); 224 return; 225 } 226 } 227 } 228 229 234 public void removeTab(int index) { 235 checkTabIndex(index); 236 237 Widget toRemove = panel.getWidget(index + 1); 239 if (toRemove == selectedTab) { 240 selectedTab = null; 241 } 242 panel.remove(toRemove); 243 } 244 245 public void removeTabListener(TabListener listener) { 246 if (tabListeners != null) { 247 tabListeners.remove(listener); 248 } 249 } 250 251 259 public boolean selectTab(int index) { 260 checkTabIndex(index); 261 262 if (tabListeners != null) { 263 if (!tabListeners.fireBeforeTabSelected(this, index)) { 264 return false; 265 } 266 } 267 268 setSelectionStyle(selectedTab, false); 270 if (index == -1) { 271 selectedTab = null; 272 return true; 273 } 274 275 selectedTab = panel.getWidget(index + 1); 276 setSelectionStyle(selectedTab, true); 277 278 if (tabListeners != null) { 279 tabListeners.fireTabSelected(this, index); 280 } 281 return true; 282 } 283 284 private void checkInsertBeforeTabIndex(int beforeIndex) { 285 if ((beforeIndex < 0) || (beforeIndex > getTabCount())) { 286 throw new IndexOutOfBoundsException (); 287 } 288 } 289 290 private void checkTabIndex(int index) { 291 if ((index < -1) || (index >= getTabCount())) { 292 throw new IndexOutOfBoundsException (); 293 } 294 } 295 296 private void setSelectionStyle(Widget item, boolean selected) { 297 if (item != null) { 298 if (selected) { 299 item.addStyleName("gwt-TabBarItem-selected"); 300 } else { 301 item.removeStyleName("gwt-TabBarItem-selected"); 302 } 303 } 304 } 305 } 306 | Popular Tags |