/* * Copyright 2011 Vancouver Ywebb Consulting Ltd * * 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 next.i.view; import next.i.XStyle; import next.i.mobile.DragController; import next.i.mobile.DragEvent; import next.i.mobile.DragEventsHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter; import com.google.gwt.user.client.ui.HasVerticalAlignment; /** * This class encapsulates information about a navigation item on the * NavigationBar object's stack, including what is displayed on the navigation * bar when the item is at the top of the stack and how it is represented when * it is the back item. To be represented on the navigation bar, a navigation * item must have a title. * * <p> * It also represents an item in a Toolbar or NavigationItem. Each bar item * behaves similarly to a button, and has a title, image, action, and target. * The BarItem class provides methods you can use to specify bar button items * with system-provided images, such as the plus image. * </p> * * <p> * <img class='ai' src='../../../resources/XBarItem.png' /> * </p> */ public class XBarItem extends Composite implements HasClickHandlers, DragEventsHandler { private FlexTable _item; private boolean _hasClickHandler = false; private boolean enabled = true; // private boolean isBackButton; public static enum Type { BUTTON, BACK_BUTTON, TOGGLE_BUTTON, LABEL } XBarItem(Type type) { BarItem_(type); } public XBarItem(Type type, String title) { this(type); setTitle(title); } @Override public HandlerRegistration addClickHandler(ClickHandler handler) { _hasClickHandler = true; return addHandler(handler, ClickEvent.getType()); } @Override public void onLoad() { super.onLoad(); DragController.get().addDragEventsHandler(this); } @Override public void onUnload() { DragController.get().removeDragEventsHandler(this); } void setSelected(boolean isActive) { setSelected_(isActive); } public boolean isEnabled() { return enabled; } public void setEnabled(boolean enabled) { if (enabled) { XBarItem.this.removeStyleName(XStyle.disabled.name()); } else { XBarItem.this.addStyleName(XStyle.disabled.name()); } } boolean hasClickHandler() { return _hasClickHandler; } public void setTitle(String title) { _item.setText(0, 0, title); } public void setHighlighted(boolean isHightLighted) { addStyleName(XStyle.highlighted.name()); } public void onDragEnd(DragEvent e) { setSelected_(false); } public void onDragMove(DragEvent e) { setSelected_(true); } public void onDragStart(DragEvent e) { setSelected_(true); } /** * private */ private void setSelected_(boolean isActive) { if (isActive) { XBarItem.this.addStyleName(XStyle.selected.name()); } else { XBarItem.this.removeStyleName(XStyle.selected.name()); } } private void BarItem_(Type type) { _item = new FlexTable(); _item.setCellPadding(0); _item.setCellSpacing(0); initWidget(_item); sinkEvents(Event.ONCLICK | Event.ONTOUCHCANCEL | Event.ONTOUCHEND | Event.ONTOUCHMOVE | Event.ONTOUCHSTART); setStyleName(XStyle.navBarItem.name()); _item.setHTML(0, 0, " "); if (type != Type.LABEL) { _item.setHTML(0, 1, "<div> </div>"); } FlexCellFormatter cf = _item.getFlexCellFormatter(); cf.setStyleName(0, 0, "body"); if (type != Type.LABEL) { cf.setStyleName(0, 1, "right"); } cf.setVerticalAlignment(0, 0, HasVerticalAlignment.ALIGN_MIDDLE); if (type == Type.BACK_BUTTON) { addStyleName(XStyle.navBarItemBack.name()); } } @Override public void onDragMoveHorizontal(DragEvent e) { // Not implemented } @Override public void onDragMoveVertical(DragEvent e) { // Not implemented } }