/**
* Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org>
*
* 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 org.onebusaway.webapp.gwt.viewkit;
import java.util.ArrayList;
import java.util.List;
import org.onebusaway.webapp.gwt.viewkit.BarButtonItem.EBarButtonSystemItem;
import org.onebusaway.webapp.gwt.viewkit.resources.ViewKitCssResource;
import org.onebusaway.webapp.gwt.viewkit.resources.ViewKitResources;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Widget;
public class NavigationBar {
private static final ViewKitCssResource _css = ViewKitResources.INSTANCE.getCSS();
private Grid _panel;
private List<NavigationItem> _items = new ArrayList<NavigationItem>();
private NavigationController _controller;
public NavigationBar(NavigationController controller) {
_controller = controller;
}
public Widget getView() {
if (_panel == null) {
_panel = new Grid(1, 3);
_panel.setCellPadding(0);
_panel.setCellSpacing(0);
_panel.addStyleName(_css.NavigationBar());
_panel.getCellFormatter().addStyleName(0, 0, _css.NavigationBarLeftItem());
_panel.getCellFormatter().setAlignment(0, 0,
HasHorizontalAlignment.ALIGN_LEFT, HasVerticalAlignment.ALIGN_MIDDLE);
_panel.getCellFormatter().addStyleName(0, 1,
_css.NavigationBarCenterItem());
_panel.getCellFormatter().setAlignment(0, 1,
HasHorizontalAlignment.ALIGN_CENTER,
HasVerticalAlignment.ALIGN_MIDDLE);
_panel.getCellFormatter().addStyleName(0, 2,
_css.NavigationBarRightItem());
_panel.getCellFormatter().setAlignment(0, 2,
HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
}
return _panel;
}
public void pushNavigationItem(NavigationItem item) {
_items.add(item);
refresh();
}
public void popNavigationItem() {
if (!_items.isEmpty()) {
_items.remove(_items.size() - 1);
refresh();
}
}
public void popToRootNavigationItem() {
while( _items.size() > 1 )
_items.remove(_items.size() - 1);
refresh();
}
private void refresh() {
getView();
_panel.setText(0, 0, "");
_panel.setText(0, 1, "");
_panel.setText(0, 2, "");
if (_items.isEmpty())
return;
NavigationItem item = _items.get(_items.size() - 1);
String title = item.getTitle();
if (title != null) {
_panel.setText(0, 1, title);
}
if (item.getLeftBarButtonItem() != null) {
addBarButtonItemToBar(item.getLeftBarButtonItem(), 0);
} else {
NavigationItem back = null;
if (_items.size() > 1)
back = _items.get(_items.size() - 2);
if (back != null) {
String backTitle = "Back";
if (back.getTitle() != null)
backTitle = back.getTitle();
Grid backButton = createBackButton(backTitle);
backButton.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent arg0) {
_controller.popViewController();
}
});
_panel.setWidget(0, 0, backButton);
}
}
if (item.getRightBarButtonItem() != null)
addBarButtonItemToBar(item.getRightBarButtonItem(), 2);
}
private void addBarButtonItemToBar(BarButtonItem item, int index) {
Grid button = null;
if (item.getSystemItem() != null)
button = createButton(item.getSystemItem());
else if (item.getTitle() != null)
button = createButton(item.getTitle());
if (button != null) {
_panel.setWidget(0, index, button);
if (item.getClickHandler() != null)
button.addClickHandler(item.getClickHandler());
}
}
private Grid createBackButton(String text) {
Grid backPanel = new Grid(1, 3);
backPanel.addStyleName(_css.NavigationBarButton());
backPanel.getCellFormatter().addStyleName(0, 0,
_css.NavigationBarButtonLeftArrow());
backPanel.getCellFormatter().addStyleName(0, 1,
_css.NavigationBarButtonCenter());
backPanel.getCellFormatter().addStyleName(0, 2,
_css.NavigationBarButtonRightRounded());
backPanel.setText(0, 0, "");
backPanel.setText(0, 1, text);
backPanel.setText(0, 2, "");
return backPanel;
}
private Grid createButton(String text) {
Grid button = createButton();
button.setText(0, 1, text);
return button;
}
private Grid createButton(EBarButtonSystemItem systemItem) {
ViewKitResources resources = ViewKitResources.INSTANCE;
ImageResource r = null;
switch (systemItem) {
case CROSS_HAIRS:
r = resources.BarButtonSystemCrossHairsImage();
break;
case REFRESH:
default:
r = resources.BarButtonSystemRefreshImage();
break;
}
Image image = new Image(r.getURL(), r.getLeft(), r.getTop(), r.getWidth(),
r.getHeight());
Grid button = createButton();
button.setWidget(0, 1, image);
return button;
}
private Grid createButton() {
Grid backPanel = new Grid(1, 3);
backPanel.addStyleName(_css.NavigationBarButton());
backPanel.getCellFormatter().addStyleName(0, 0,
_css.NavigationBarButtonLeftRounded());
backPanel.getCellFormatter().addStyleName(0, 1,
_css.NavigationBarButtonCenter());
backPanel.getCellFormatter().addStyleName(0, 2,
_css.NavigationBarButtonRightRounded());
backPanel.setText(0, 0, "");
backPanel.setText(0, 2, "");
return backPanel;
}
}