// Copyright 2012 Google Inc. All Rights Reserved.
//
// 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 com.google.collide.client.code;
import com.google.collide.client.common.BaseResources;
import com.google.collide.client.ui.menu.PositionController;
import com.google.collide.client.ui.tooltip.Tooltip;
import com.google.collide.client.util.CssUtils;
import com.google.collide.client.util.Elements;
import com.google.collide.client.workspace.outline.OutlineSection;
import com.google.collide.mvp.CompositeView;
import com.google.collide.mvp.UiComponent;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.DivElement;
import com.google.gwt.dom.client.Node;
import com.google.gwt.resources.client.CssResource;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiTemplate;
import elemental.events.Event;
import elemental.events.EventListener;
import elemental.html.Element;
/**
* Footer toolbar in the WorkspaceNavigation on the left of the CodePerspective below the file tree.
*/
public class WorkspaceNavigationToolBar extends UiComponent<WorkspaceNavigationToolBar.View> {
/**
* Creates the default version of the footer toolbar in the WorkspaceNavigation.
*/
public static WorkspaceNavigationToolBar create(
View view, CollaborationSection collabSection, OutlineSection outlineSection) {
return new WorkspaceNavigationToolBar(view, collabSection, outlineSection);
}
/**
* Style names associated with elements in the toolbar.
*/
public interface Css extends CssResource {
String outerBorder();
String toolBar();
String collaborateIcon();
String deltaIcon();
String navigatorIcon();
}
/**
* Images and CssResources consumed by the WorkspaceNavigationToolBar.
*/
public interface Resources extends Tooltip.Resources, BaseResources.Resources {
@Source("collaborate_icon.png")
ImageResource collaborateIcon();
/**
* Returns the image used for the workspace delta icon.
*
* The method deltaIcon is taken by
* {@link com.google.collide.client.diff.DiffCommon.Resources#deltaIcon()}.
*/
@Source("delta_icon.png")
ImageResource workspaceDeltaIcon();
@Source("navigator_icon.png")
ImageResource navigatorIcon();
@Source({"WorkspaceNavigationToolBar.css", "constants.css",
"com/google/collide/client/common/constants.css"})
Css workspaceNavigationToolBarCss();
}
/**
* The View for the WorkspaceNavigationToolBar.
*/
public static class View extends CompositeView<ViewEvents> {
@UiTemplate("WorkspaceNavigationToolBar.ui.xml")
interface MyBinder extends UiBinder<DivElement, View> {
}
static MyBinder binder = GWT.create(MyBinder.class);
@UiField
DivElement toolBar;
@UiField
DivElement collaborateButton;
@UiField
DivElement collaborateIcon;
@UiField
DivElement deltaButton;
@UiField
DivElement deltaIcon;
@UiField
DivElement navigatorButton;
@UiField
DivElement navigatorIcon;
@UiField(provided = true)
final Resources res;
private Element activeButton;
public View(Resources res) {
this.res = res;
setElement(Elements.asJsElement(binder.createAndBindUi(this)));
attachHandlers();
// Tooltips
Tooltip.create(res, Elements.asJsElement(collaborateButton),
PositionController.VerticalAlign.TOP, PositionController.HorizontalAlign.MIDDLE,
"Work with collaborators");
Tooltip.create(res, Elements.asJsElement(deltaButton), PositionController.VerticalAlign.TOP,
PositionController.HorizontalAlign.MIDDLE, "See what's changed in this branch");
Tooltip.create(res, Elements.asJsElement(navigatorButton),
PositionController.VerticalAlign.TOP, PositionController.HorizontalAlign.MIDDLE,
"View the code navigator");
}
protected void attachHandlers() {
getElement().setOnClick(new EventListener() {
@Override
public void handleEvent(Event evt) {
ViewEvents delegate = getDelegate();
if (delegate == null) {
return;
}
Node target = (Node) evt.getTarget();
if (collaborateButton.isOrHasChild(target)) {
delegate.onCollaborateButtonClicked();
} else if (deltaButton.isOrHasChild(target)) {
delegate.onDeltaButtonClicked();
} else if (navigatorButton.isOrHasChild(target)) {
delegate.onNavigatorButtonClicked();
}
}
});
}
private void setActiveButton(Element button) {
if (this.activeButton != null) {
this.activeButton.removeClassName(res.baseCss().drawerIconButtonActiveLight());
}
this.activeButton = button;
if (button != null) {
button.addClassName(res.baseCss().drawerIconButtonActiveLight());
}
}
}
/**
* Events reported by the EditorToolBar's View.
*/
interface ViewEvents {
void onCollaborateButtonClicked();
void onDeltaButtonClicked();
void onNavigatorButtonClicked();
}
private class ToolbarViewEvents implements WorkspaceNavigationToolBar.ViewEvents {
@Override
public void onCollaborateButtonClicked() {
toggleSection(collabSection, Elements.asJsElement(getView().collaborateButton));
}
@Override
public void onDeltaButtonClicked() {
// used to show delta section
}
@Override
public void onNavigatorButtonClicked() {
toggleSection(outlineSection, Elements.asJsElement(getView().navigatorButton));
}
}
private final OutlineSection outlineSection;
private final CollaborationSection collabSection;
private WorkspaceNavigation navigation;
WorkspaceNavigationToolBar(
View view, CollaborationSection collabSection, OutlineSection outlineSection) {
super(view);
this.collabSection = collabSection;
this.outlineSection = outlineSection;
getView().setDelegate(new ToolbarViewEvents());
}
public void setWorkspaceNavigation(WorkspaceNavigation navigation) {
this.navigation = navigation;
}
void hideDeltaButton() {
CssUtils.setDisplayVisibility2((Element) (getView().deltaButton), false);
}
private boolean toggleSection(WorkspaceNavigationSection<?> section, Element button) {
if (navigation == null) {
return false;
}
boolean showing = navigation.toggleBottomSection(section);
if (showing) {
getView().setActiveButton(button);
} else {
getView().setActiveButton(null);
}
return showing;
}
}