/*
* 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.widgets;
import next.i.XStyle;
import next.i.mobile.DragController;
import next.i.mobile.DragEvent;
import next.i.mobile.DragEventsHandler;
import com.google.gwt.dom.client.Style;
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.Timer;
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;
/**
* Implements a button that intercepts touch events and sends an action message
* to a target object when it's tapped. You can set the title, image, and other
* appearance properties of a button. In addition, you can specify a different
* appearance for each button state.
*
* <p>
* <img class='ai' src='../../../../resources/XButton.png' />
* </p>
*/
public class XButton extends Composite implements HasClickHandlers, DragEventsHandler {
/**
* Specifies the style of a button.
*/
public static enum XButtonType {
Rounded("Rounded"),
Shadow("Shadow"),
Navigation("Navigation"),
NavigationBlue("Blue"),
NavigationRed("Red"),
NavigationBlack("Black"),
Image("Image")
;
private String css;
XButtonType(String css) {
this.css = css;
}
public String css() {
return css;
}
}
private String title;
private FlexTable _item;
private boolean _hasClickHandler = false;
private boolean enabled = true;
public XButton(String title) {
this(title, XButtonType.Rounded);
}
public XButton(String title, XButtonType buttonType) {
this(title, buttonType, true);
}
public XButton(String title, XButtonType buttonType, String imageUrl, String imagePressedUrl, boolean orientation) {
XButton_(buttonType, orientation, imageUrl, imagePressedUrl);
setTitle(title);
}
public XButton(String title, XButtonType buttonType, boolean orientation) {
XButton_(buttonType, orientation, null, null);
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);
}
@Override
public void onBrowserEvent(Event e) {
e.stopPropagation();
super.onBrowserEvent(e);
}
void setSelected(boolean isActive) {
setSelected_(isActive);
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
if (enabled) {
removeStyleName(XStyle.disabled.name());
} else {
addStyleName(XStyle.disabled.name());
}
}
boolean hasClickHandler() {
return _hasClickHandler;
}
public void setTitle(String title) {
this.title = title;
_item.setText(0, 0, title);
}
public String getTitle() {
return title;
}
public void onDragEnd(DragEvent e) {
new Timer() {
public void run() {
setSelected_(false);
}
}.schedule(200);
}
public void onDragMove(DragEvent e) {
setSelected_(true);
}
public void onDragStart(DragEvent e) {
setSelected_(true);
}
/**
* private
*/
private void setSelected_(boolean isActive) {
if (isActive) {
addStyleName(XStyle.selected.name());
} else {
removeStyleName(XStyle.selected.name());
}
}
private void XButton_(XButtonType buttonType, boolean iconOrientationLeft, String imageUrl, String imagePressedUrl) {
_item = new FlexTable();
_item.setCellPadding(0);
_item.setCellSpacing(0);
initWidget(_item);
sinkEvents(Event.ONCLICK | Event.ONTOUCHCANCEL | Event.ONTOUCHEND | Event.ONTOUCHMOVE | Event.ONTOUCHSTART);
setStyleName(XStyle.xbutton.name());
_item.setHTML(0, 0, " ");
_item.setHTML(0, 1, "<div> </div>");
FlexCellFormatter cf = _item.getFlexCellFormatter();
cf.setStyleName(0, 0, "body");
cf.setStyleName(0, 1, "right");
cf.setVerticalAlignment(0, 0, HasVerticalAlignment.ALIGN_MIDDLE);
if (buttonType == XButtonType.NavigationRed || buttonType == XButtonType.NavigationBlue
|| buttonType == XButtonType.NavigationBlack) {
addStyleName(XButtonType.Navigation.css() + " " + buttonType.css());
} else {
addStyleName(buttonType.css());
}
if (buttonType == XButtonType.Image) {
Style s = _item.getElement().getStyle();
// TODO fix pressed state
s.setProperty("backgroundImage", "url(" + imageUrl + ")");
if (iconOrientationLeft) {
s.setProperty("paddingLeft", "30px");
s.setProperty("backgroundPosition", "left center");
} else {
s.setProperty("paddingRight", "30px");
s.setProperty("backgroundPosition", "right center");
}
}
}
@Override
public void onDragMoveHorizontal(DragEvent e) {
// Not implemented
}
@Override
public void onDragMoveVertical(DragEvent e) {
// Not implemented
}
}