public void onClick(ClickEvent event) {
Widget caption = (Widget) event.getSource();
int index = getWidgetIndex(caption.getParent());
- // IE needs explicit focus()
- if (BrowserInfo.get().isIE()) {
- getTabsheet().focus();
- }
getTabsheet().onTabSelected(index);
}
* @return Whether the tab could be selected or not.
*/
private boolean onTabSelected(final int tabIndex) {
- Tab tab = tb.getTab(tabIndex);
- if (client == null || disabled || waitingForResponse) {
+ if (disabled || waitingForResponse) {
return false;
}
- if (!tab.isEnabledOnServer() || tab.isHiddenOnServer()) {
+ final Object tabKey = tabKeys.get(tabIndex);
+ if (disabledTabKeys.contains(tabKey)) {
return false;
}
- if (activeTabIndex != tabIndex) {
+ if (client != null && activeTabIndex != tabIndex) {
tb.selectTab(tabIndex);
- // If this TabSheet already has focus, set the new selected tab
- // as focused.
if (focusedTab != null) {
- focusedTab = tab;
+ focusedTab = tb.getTab(tabIndex);
}
addStyleDependentName("loading");
}
});
waitingForResponse = true;
+
+ return true;
}
- // Note that we return true when tabIndex == activeTabIndex; the active
- // tab could be selected, it's just a no-op.
- return true;
+ return false;
}
public ApplicationConnection getApplicationConnection() {
- (isScrolledTabs() ? scroller.getOffsetWidth() : 0);
}
- private boolean isClipped(Tab tab) {
- return tab.getAbsoluteLeft() + tab.getOffsetWidth() > getAbsoluteLeft()
- + getOffsetWidth() - scroller.getOffsetWidth();
- }
-
@Override
protected void clearPaintables() {
int keycode = event.getNativeEvent().getKeyCode();
if (keycode == getPreviousTabKey()) {
- selectPreviousTab();
+ int newTabIndex = activeTabIndex;
+ // Find the previous non-disabled tab with wraparound.
+ do {
+ newTabIndex = (newTabIndex != 0) ? newTabIndex - 1 : tb
+ .getTabCount() - 1;
+ } while (newTabIndex != activeTabIndex
+ && !onTabSelected(newTabIndex));
+ activeTabIndex = newTabIndex;
+
+ // Tab scrolling
+ if (isScrolledTabs()) {
+ int newFirstIndex = tb.scrollLeft(scrollerIndex);
+ if (newFirstIndex != -1) {
+ scrollerIndex = newFirstIndex;
+ updateTabScroller();
+ }
+ }
+
} else if (keycode == getNextTabKey()) {
- selectNextTab();
+ int newTabIndex = activeTabIndex;
+ // Find the next non-disabled tab with wraparound.
+ do {
+ newTabIndex = (newTabIndex + 1) % tb.getTabCount();
+ } while (newTabIndex != activeTabIndex
+ && !onTabSelected(newTabIndex));
+ activeTabIndex = newTabIndex;
+
+ if (isClippedTabs()) {
+ int newFirstIndex = tb.scrollRight(scrollerIndex);
+ if (newFirstIndex != -1) {
+ scrollerIndex = newFirstIndex;
+ updateTabScroller();
+ }
+ }
+
} else if (keycode == getCloseTabKey()) {
Tab tab = tb.getTab(activeTabIndex);
if (tab.isClosable()) {
tab.onClose();
+ removeTab(activeTabIndex);
}
}
}
}
- /**
- * @return The key code of the keyboard shortcut that selects the previous
- * tab in a focused tabsheet.
- */
protected int getPreviousTabKey() {
return KeyCodes.KEY_LEFT;
}
- /**
- * @return The key code of the keyboard shortcut that selects the next tab
- * in a focused tabsheet.
- */
protected int getNextTabKey() {
return KeyCodes.KEY_RIGHT;
}
- /**
- * @return The key code of the keyboard shortcut that closes the currently
- * selected tab in a focused tabsheet.
- */
protected int getCloseTabKey() {
return KeyCodes.KEY_DELETE;
}
-
- private void selectPreviousTab() {
- int newTabIndex = activeTabIndex;
- // Find the previous visible and enabled tab if any.
- do {
- newTabIndex--;
- } while (newTabIndex >= 0 && !onTabSelected(newTabIndex));
-
- if (newTabIndex >= 0) {
- activeTabIndex = newTabIndex;
- if (isScrolledTabs()) {
- // Scroll until the new active tab is visible
- int newScrollerIndex = scrollerIndex;
- while (tb.getTab(activeTabIndex).getAbsoluteLeft() < getAbsoluteLeft()
- && newScrollerIndex != -1) {
- newScrollerIndex = tb.scrollLeft(newScrollerIndex);
- }
- scrollerIndex = newScrollerIndex;
- updateTabScroller();
- }
- }
- }
-
- private void selectNextTab() {
- int newTabIndex = activeTabIndex;
- // Find the next visible and enabled tab if any.
- do {
- newTabIndex++;
- } while (newTabIndex < getTabCount() && !onTabSelected(newTabIndex));
-
- if (newTabIndex < getTabCount()) {
- activeTabIndex = newTabIndex;
- if (isClippedTabs()) {
- // Scroll until the new active tab is completely visible
- int newScrollerIndex = scrollerIndex;
- while (isClipped(tb.getTab(activeTabIndex))
- && newScrollerIndex != -1) {
- newScrollerIndex = tb.scrollRight(newScrollerIndex);
- }
- scrollerIndex = newScrollerIndex;
- updateTabScroller();
- }
- }
- }
}