/*
* Copyright (c) 2010-2011 Zhihua (Dennis) Jiang
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.gwtmobile.ui.client.widgets;
import java.beans.Beans;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.HasSelectionHandlers;
import com.google.gwt.event.logical.shared.SelectionEvent;
import com.google.gwt.event.logical.shared.SelectionHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.gwt.user.client.ui.Widget;
import com.gwtmobile.ui.client.CSS.StyleNames.Primary;
import com.gwtmobile.ui.client.CSS.StyleNames.Secondary;
public class TabPanel extends PanelBase
implements HasSelectionHandlers<Integer>, ClickHandler {
public enum TabPosition { Top, Bottom }; // todo: LeftTabs, RightTabs
private TabHeaderPanel _tabHeaderPanel;
private TabContentPanel _tabContentPanel;
private int _selectedTabIndex = -1;
private int _defaultTabIndex = 0;
private boolean _fullHeight = false;
private TabPosition _tabPosition = TabPosition.Top;
public TabPanel() {
setStyleName(Primary.TabPanel);
addStyleName(_tabPosition.toString());
}
@Override
public void add(Widget w) {
if (w instanceof TabHeaderPanel) {
if (_tabHeaderPanel == null) {
_tabHeaderPanel = (TabHeaderPanel)w;
_tabHeaderPanel.addDomHandler(this, ClickEvent.getType());
super.add(_tabHeaderPanel);
return;
}
else {
assert false : "The TabPanel can only contain one TabHeaderPanel";
}
}
if (w instanceof TabContentPanel) {
if (_tabContentPanel == null) {
_tabContentPanel = (TabContentPanel)w;
super.add(_tabContentPanel);
return;
}
else {
assert false : "The TabPanel can only contain one TabContentPanel";
}
}
if (isDesignTimeEmptyLabel(w)) {
super.add(w);
return;
}
assert false : "TabPanel can only contains a TabHeaderPanel and a TabContentPanel. ("+w.getClass().getName()+")";
}
@Override
public void onInitialLoad() {
if (_tabHeaderPanel != null && _tabHeaderPanel.getWidgetCount() > 0) {
// Use selectedTabIndex as design time tab selector.
if (Beans.isDesignTime() && _selectedTabIndex > -1) {
selectTab(_selectedTabIndex);
}
else {
selectTab(_defaultTabIndex);
}
}
}
public void selectTab(int index) {
if (_selectedTabIndex == index) {
return;
}
if (_selectedTabIndex != -1) {
_tabHeaderPanel.unSelectHeader(_selectedTabIndex);
}
_tabHeaderPanel.selectHeader(index);
//FIXME
if (_tabContentPanel != null) _tabContentPanel.selectTab(_selectedTabIndex, index);
_selectedTabIndex = index;
SelectionEvent.fire(this, _selectedTabIndex);
}
public int getSelectedTabIndex() {
return _selectedTabIndex;
}
public void setSelectedTabIndex(int index) {
selectTab(index);
}
public TabHeader getSelectedTab() {
return (TabHeader) _tabHeaderPanel.getWidget(_selectedTabIndex);
}
public TabContent getSelectedTabContent() {
return _tabContentPanel.getSelectedTabContent();
}
@Override
public void onClick(ClickEvent event) {
int index = _tabHeaderPanel.getClickedTabHeaderIndex(event);
if (index != -1) {
selectTab(index);
}
}
@Override
public HandlerRegistration addSelectionHandler(
SelectionHandler<Integer> handler) {
return this.addHandler(handler, SelectionEvent.getType());
}
public TabPosition getTabPosition() {
return _tabPosition;
}
public void setTabPosition(TabPosition tabsPosition) {
this._tabPosition = tabsPosition;
if (tabsPosition == TabPosition.Bottom && getWidget(0) == _tabHeaderPanel) {
super.clear();
super.add(_tabContentPanel);
super.add(_tabHeaderPanel);
addStyleName(Secondary.Bottom);
removeStyleName(Secondary.Top);
} else if(tabsPosition == TabPosition.Top && getWidget(0) == _tabContentPanel){
super.clear();
super.add(_tabHeaderPanel);
super.add(_tabContentPanel);
addStyleName(Secondary.Top);
removeStyleName(Secondary.Bottom);
}
}
public int getDefaultTabIndex() {
return _defaultTabIndex;
}
public void setDefaultTabIndex(int defaultTabIndex) {
this._defaultTabIndex = defaultTabIndex;
}
public boolean isFullHeight() {
return _fullHeight;
}
public void setFullHeight(boolean fullHeight) {
this._fullHeight = fullHeight;
if (fullHeight){
addStyleName(Secondary.FullHeight);
} else {
removeStyleName(Secondary.FullHeight);
}
}
public void setTabBarPanel(boolean isTabBarPanel) {
if (isTabBarPanel) {
addStyleName(Primary.TabBarPanel);
}
else {
removeStyleName(Primary.TabBarPanel);
}
}
@Override
protected String getDesignTimeMessage() {
return "Add a TabHeaderPanel and a TabContentPanel.";
}
}