/*
* Copyright 2015 Red Hat, Inc. and/or its affiliates.
*
* 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.uberfire.client.views.pfly.toolbar;
import java.util.HashMap;
import java.util.Map;
import javax.enterprise.context.Dependent;
import com.google.gwt.animation.client.Animation;
import com.google.gwt.core.client.GWT;
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.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.FlowPanel;
import com.google.gwt.user.client.ui.Panel;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.SimplePanel;
import org.gwtbootstrap3.client.ui.Button;
import org.gwtbootstrap3.client.ui.ButtonGroup;
import org.gwtbootstrap3.client.ui.ButtonToolBar;
import org.gwtbootstrap3.client.ui.Tooltip;
import org.gwtbootstrap3.client.ui.constants.IconType;
import org.gwtbootstrap3.client.ui.constants.Placement;
import org.uberfire.client.resources.i18n.WorkbenchConstants;
import org.uberfire.client.views.pfly.sys.PatternFlyBootstrapper;
import org.uberfire.client.workbench.widgets.toolbar.WorkbenchToolBarPresenter;
import org.uberfire.workbench.model.toolbar.ToolBar;
import org.uberfire.workbench.model.toolbar.ToolBarItem;
import org.uberfire.workbench.model.toolbar.ToolBarTypeIcon;
import static org.uberfire.plugin.PluginUtil.ensureIterable;
/**
* The Tool Bar widget
*/
@Dependent
public class WorkbenchToolBarView extends Composite
implements
WorkbenchToolBarPresenter.View {
private static WorkbenchToolBarViewBinder uiBinder = GWT.create(WorkbenchToolBarViewBinder.class);
//Map of ToolBar to GWT Widgets used to represent them
private final Map<String, ButtonGroup> toolBarItemsMap = new HashMap<String, ButtonGroup>();
@UiField
public FlowPanel masterContainer;
@UiField
public FlowPanel container;
@UiField
public ButtonToolBar toolBar;
@UiField
public SimplePanel simpleMargin;
@UiField
public com.google.gwt.user.client.ui.Button viewControl;
@UiField
public Tooltip tip;
private State state = State.EXPANDED;
public WorkbenchToolBarView() {
PatternFlyBootstrapper.ensurejQueryIsAvailable();
initWidget(uiBinder.createAndBindUi(this));
tip.setTitle(WorkbenchConstants.INSTANCE.collapseToolbar());
tip.setPlacement(Placement.LEFT);
tip.setWidget(viewControl);
simpleMargin.setVisible(false);
}
@Override
public void addToolBar(final ToolBar _toolBar) {
final ButtonGroup bgroup = new ButtonGroup();
if (toolBarItemsMap.size() == 0) {
bgroup.getElement().getStyle().setPaddingLeft(19,
Style.Unit.PX);
}
for (final ToolBarItem item : ensureIterable(_toolBar.getItems())) {
Button button = new Button();
button.setIcon(IconType.valueOf(((ToolBarTypeIcon) item.getIcon()).getType().toString()));
button.setEnabled(item.isEnabled());
button.addClickHandler(new ClickHandler() {
@Override
public void onClick(final ClickEvent event) {
item.getCommand().execute();
}
});
Tooltip tooltip = new Tooltip(button);
tooltip.setPlacement(Placement.BOTTOM);
bgroup.add(tooltip);
}
toolBarItemsMap.put(_toolBar.getIdentifier(),
bgroup);
toolBar.add(bgroup);
}
/**
* Remove a Tool Bar item from the view.
*/
@Override
public void removeToolBar(final ToolBar _toolBar) {
toolBar.remove(toolBarItemsMap.remove(_toolBar.getIdentifier()));
}
@Override
public int getHeight() {
if (isExpanded()) {
return getOffsetHeight();
}
return 0;
}
private boolean isExpanded() {
return state == State.EXPANDED;
}
@Override
public void hide() {
container.setVisible(false);
simpleMargin.setVisible(true);
}
@Override
public void show() {
container.setVisible(true);
simpleMargin.setVisible(false);
}
@UiHandler("viewControl")
void handleClick(final ClickEvent e) {
if (isExpanded()) {
collapse();
} else {
expand();
}
}
private void expand() {
container.removeFromParent();
container.getElement().getStyle().clearTop();
container.getElement().getStyle().clearPosition();
container.getElement().getStyle().clearZIndex();
masterContainer.add(container);
tip.setTitle(WorkbenchConstants.INSTANCE.collapseToolbar());
tip.setPlacement(Placement.LEFT);
tip.setWidget(viewControl);
tip.reconfigure();
new ExpandAnimation().animate(8,
getOffsetWidth() - 1,
500);
state = State.EXPANDED;
}
private void collapse() {
new CollapseAnimation().animate(getOffsetWidth(),
8,
500);
container.removeFromParent();
container.getElement().getStyle().setTop(getAbsoluteTop(),
Style.Unit.PX);
container.getElement().getStyle().setPosition(Style.Position.FIXED);
container.getElement().getStyle().setZIndex(Integer.MAX_VALUE);
RootPanel.get().add(container);
tip.setTitle(WorkbenchConstants.INSTANCE.expandToolbar());
tip.setPlacement(Placement.RIGHT);
tip.setWidget(viewControl);
tip.reconfigure();
state = State.COLLAPSED;
}
enum State {
EXPANDED,
COLLAPSED;
}
interface WorkbenchToolBarViewBinder
extends
UiBinder<Panel, WorkbenchToolBarView> {
}
private class ExpandAnimation extends Animation {
private int endSize;
private int startSize;
private int startTabLeft;
private int endTabLeft;
@Override
protected void onComplete() {
toolBar.getElement().getStyle().clearLeft();
container.getElement().getStyle().clearWidth();
}
@Override
protected void onUpdate(double progress) {
double delta = (endSize - startSize) * progress;
double newSize = startSize + delta;
double deltaLeft = (endTabLeft - startTabLeft) * progress;
double newLeft = startTabLeft + deltaLeft;
toolBar.getElement().getStyle().setLeft(newLeft,
Style.Unit.PX);
container.setWidth(newSize + "px");
}
void animate(int startSize,
int endSize,
int duration) {
this.startSize = startSize;
this.endSize = endSize;
this.startTabLeft = toolBar.getAbsoluteLeft();
this.endTabLeft = 0;
run(duration);
}
}
private class CollapseAnimation extends Animation {
private int endSize;
private int startSize;
@Override
protected void onComplete() {
container.setWidth(null);
}
@Override
protected void onUpdate(double progress) {
double delta = (endSize - startSize) * progress;
double newSize = startSize + delta;
toolBar.getElement().getStyle().setLeft(delta,
Style.Unit.PX);
container.setWidth(newSize + "px");
}
void animate(int startSize,
int endSize,
int duration) {
this.startSize = startSize;
this.endSize = endSize;
run(duration);
}
}
}