/*
* Copyright (c) 2010 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.util.Iterator;
import com.google.gwt.dom.client.Element;
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.DOM;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HasWidgets;
import com.google.gwt.user.client.ui.Widget;
import com.gwtmobile.ui.client.page.Transition;
import com.gwtmobile.ui.client.utils.Utils;
//FIXME: extends PanelBase
public class TabPanel extends WidgetBase implements HasWidgets, HasSelectionHandlers<Integer>, ClickHandler {
private FlowPanel _panel = new FlowPanel();
private FlowPanel _tabHeaderPanel = new FlowPanel();
private FlowPanel _tabContentPanel = new FlowPanel();
private int _selectedTabIndex = -1;
public TabPanel() {
initWidget(_panel);
setStyleName("TabPanel");
_panel.add(_tabHeaderPanel);
_panel.add(_tabContentPanel);
_tabHeaderPanel.addDomHandler(this, ClickEvent.getType());
}
@Override
public void add(Widget w) {
assert w instanceof Tab : "Can only place Tab widgets inside a Tab Panel.";
_tabHeaderPanel.add(w);
}
@Override
public void onInitialLoad() {
if (_tabHeaderPanel.getWidgetCount() > 0) {
//FIXME:allow a different default tab to be set?
selectTab(0);
}
}
public void selectTab(int index) {
if (_selectedTabIndex == index) {
return;
}
Tab from = unselectCurrentTab();
Tab to = (Tab) _tabHeaderPanel.getWidget(index);
to.addStyleName("Selected");
if (from == null) {
_tabContentPanel.add(to.getContent());
}
else {
Transition transition = Transition.SLIDE;
transition.start(from.getContent(), to.getContent(), _tabContentPanel,
index < _selectedTabIndex);
}
_selectedTabIndex = index;
SelectionEvent.fire(this, _selectedTabIndex);
}
public int getSelectedTabIndex() {
return _selectedTabIndex;
}
public Tab getSelectedTab() {
return (Tab) _tabHeaderPanel.getWidget(_selectedTabIndex);
}
@Override
public void onClick(ClickEvent event) {
int index = getClickedTabHeaderIndex(event);
if (index != -1) {
selectTab(index);
}
}
@Override
public void clear() {
_panel.clear();
}
@Override
public Iterator<Widget> iterator() {
return _panel.iterator();
}
@Override
public boolean remove(Widget w) {
return _panel.remove(w);
}
private Tab unselectCurrentTab() {
if (_selectedTabIndex == -1) {
return null;
}
Tab tab = (Tab) _tabHeaderPanel.getWidget(_selectedTabIndex);
tab.removeStyleName("Selected");
return tab;
}
private int getClickedTabHeaderIndex(ClickEvent e) {
Element div = Element.as(e.getNativeEvent().getEventTarget());
if (div == _tabHeaderPanel.getElement()) {
Utils.Console("Is click on tab header working? " + e.toString());
return -1;
}
while (div.getParentElement() != _tabHeaderPanel.getElement()) {
div = div.getParentElement();
}
int index = DOM.getChildIndex(
(com.google.gwt.user.client.Element)_tabHeaderPanel.getElement(),
(com.google.gwt.user.client.Element)div);
return index;
}
@Override
public HandlerRegistration addSelectionHandler(
SelectionHandler<Integer> handler) {
return this.addHandler(handler, SelectionEvent.getType());
}
}