/**
* Copyright 2010 Google Inc.
*
* 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.waveprotocol.wave.client.widget.toolbar.buttons;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.StyleInjector;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.resources.client.ClientBundle;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.resources.client.ImageResource.ImageOptions;
import com.google.gwt.resources.client.ImageResource.RepeatStyle;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.HTMLPanel;
import com.google.gwt.user.client.ui.Widget;
import org.waveprotocol.wave.client.common.webdriver.DebugClassHelper;
import org.waveprotocol.wave.client.widget.common.ImplPanel;
/**
* Widget implementation of a {@link ToolbarButtonView} for displaying
* in a vertical toolbar.
*
* @author kalman@google.com (Benjamin Kalman)
*/
public final class VerticalToolbarButtonWidget extends Composite implements ToolbarButtonUi {
interface Resources extends ClientBundle {
@Source("VerticalToolbarButtonWidget.css")
Css css();
@Source("button_down_large.png")
@ImageOptions(repeatStyle = RepeatStyle.Vertical)
ImageResource buttonDown();
@Source("arrow_vertical.png")
ImageResource dropdownArrow();
}
interface Css extends CssResource {
String self();
String content();
String visualElement();
String textElement();
String textElementWithVisualElement();
String enabled();
String hidden();
String down();
String dropdownArrow();
String divider();
}
interface Binder extends UiBinder<Widget, VerticalToolbarButtonWidget> {}
private static final Binder BINDER = GWT.create(Binder.class);
@UiField(provided = true)
static final Resources res = GWT.create(Resources.class);
static {
StyleInjector.inject(res.css().getText(), true);
}
@UiField HTMLPanel self;
@UiField ImplPanel content;
@UiField Element visualElement;
@UiField Element textElement;
@UiField Element dropdownArrow;
@UiField Element divider;
private Listener listener = null;
private Element currentVisualElement = null;
public VerticalToolbarButtonWidget() {
initWidget(BINDER.createAndBindUi(this));
}
@UiHandler("content")
void handleButtonClicked(ClickEvent e) {
if (listener != null) {
listener.onClick();
}
}
@UiHandler("content")
void handleMouseDown(MouseDownEvent e) {
// Prevent the editor from losing selection focus.
e.preventDefault();
e.stopPropagation();
}
@Override
public void setState(State state) {
switch (state) {
case ENABLED:
self.getElement().removeClassName(res.css().hidden());
self.getElement().addClassName(res.css().enabled());
removeDebugClass("disabled");
break;
case DISABLED:
self.getElement().removeClassName(res.css().hidden());
self.getElement().removeClassName(res.css().enabled());
addDebugClass("disabled");
break;
case INVISIBLE:
self.getElement().addClassName(res.css().hidden());
break;
}
}
@Override
public void setText(String text) {
textElement.setInnerText(text);
}
@Override
public void setTooltip(String tooltip) {
setTitle(tooltip);
}
@Override
public void setVisualElement(Element element) {
if (currentVisualElement != null) {
currentVisualElement.removeFromParent();
}
visualElement.appendChild(element);
currentVisualElement = element;
textElement.addClassName(res.css().textElementWithVisualElement());
}
@Override
public void setDown(boolean isDown) {
if (isDown) {
self.addStyleName(res.css().down());
} else {
self.removeStyleName(res.css().down());
}
}
@Override
public void setShowDropdownArrow(boolean showDropdownArrow) {
if (showDropdownArrow) {
dropdownArrow.removeClassName(res.css().hidden());
} else {
dropdownArrow.addClassName(res.css().hidden());
}
}
@Override
public void setShowDivider(boolean showDivider) {
if (showDivider) {
divider.removeClassName(res.css().hidden());
} else {
divider.addClassName(res.css().hidden());
}
}
@Override
public void addDebugClass(String dc) {
DebugClassHelper.addDebugClass(content, dc);
}
@Override
public void removeDebugClass(String dc) {
DebugClassHelper.removeDebugClass(content, dc);
}
@Override
public void setListener(Listener listener) {
this.listener = listener;
}
@Override
public Widget hackGetWidget() {
return this;
}
}