// 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.util.CssUtils;
import com.google.collide.client.util.Elements;
import com.google.collide.mvp.CompositeView;
import com.google.collide.mvp.UiComponent;
import com.google.common.annotations.VisibleForTesting;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.AnchorElement;
import com.google.gwt.dom.client.DivElement;
import com.google.gwt.resources.client.CssResource;
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;
/**
* Presenter for a section in the navigation bar. A section consists of a header
* and a content area.
*
*/
public class WorkspaceNavigationSection<V extends WorkspaceNavigationSection.View<?>> extends
UiComponent<V> {
public interface Css extends CssResource {
String closeX();
String contentArea();
String contentAreaScrollable();
String header();
String root();
String stretch();
String blue();
String underlineHeader();
String headerLink();
String menuButton();
}
public interface ViewEvents {
void onTitleClicked();
void onCloseClicked();
void onMenuButtonClicked();
}
public static abstract class AbstractViewEventsImpl implements ViewEvents {
@Override
public void onTitleClicked() {
}
@Override
public void onCloseClicked() {
}
@Override
public void onMenuButtonClicked() {
}
}
@VisibleForTesting
public static class View<D extends ViewEvents> extends CompositeView<D> {
@UiTemplate("WorkspaceNavigationSection.ui.xml")
interface MyBinder extends UiBinder<DivElement, View<?>> {
}
static MyBinder binder = GWT.create(MyBinder.class);
@UiField(provided = true)
final BaseResources.Css baseCss;
@UiField(provided = true)
final Css css;
@UiField(provided = true)
final Resources res;
@UiField
DivElement header;
@UiField
AnchorElement closeX;
@UiField
DivElement contentArea;
@UiField
AnchorElement menuButton;
@UiField
AnchorElement title;
private Element contentElement;
protected View(Resources res) {
this.css = res.workspaceNavigationSectionCss();
this.baseCss = res.baseCss();
this.res = res;
setElement(Elements.asJsElement(binder.createAndBindUi(this)));
attachEventHandlers();
setCloseable(false);
setShowMenuButton(false);
}
private void attachEventHandlers() {
Elements.asJsElement(closeX).setOnClick(new EventListener() {
@Override
public void handleEvent(Event arg0) {
if (getDelegate() != null) {
getDelegate().onCloseClicked();
}
}
});
Elements.asJsElement(title).setOnClick(new EventListener() {
@Override
public void handleEvent(Event arg0) {
if (getDelegate() != null) {
getDelegate().onTitleClicked();
}
}
});
Elements.asJsElement(menuButton).setOnClick(new EventListener() {
@Override
public void handleEvent(Event arg0) {
if (getDelegate() != null) {
getDelegate().onMenuButtonClicked();
}
}
});
}
@VisibleForTesting
public Element getContentElement() {
return contentElement;
}
protected void setContent(Element newContentElement) {
if (contentElement == newContentElement) {
return;
}
if (contentElement != null) {
Elements.asJsElement(contentArea).replaceChild(newContentElement, contentElement);
} else {
Elements.asJsElement(contentArea).appendChild(newContentElement);
}
contentElement = newContentElement;
}
protected void setContentAreaScrollable(boolean scrollable) {
Element contentAreaElement = Elements.asJsElement(contentArea);
CssUtils.setClassNameEnabled(contentAreaElement, css.contentAreaScrollable(), scrollable);
}
protected void setStretch(boolean stretch) {
CssUtils.setClassNameEnabled(getElement(), css.stretch(), stretch);
}
protected void setBlue(boolean blue) {
CssUtils.setClassNameEnabled(getElement(), css.blue(), blue);
}
public void setTitle(String title) {
Elements.asJsElement(this.title).setTextContent(title);
}
public void setCloseable(boolean closeable) {
CssUtils.setDisplayVisibility(Elements.asJsElement(closeX), closeable);
}
public void setShowMenuButton(boolean visible) {
CssUtils.setDisplayVisibility(Elements.asJsElement(menuButton), visible);
}
protected void setUnderlineHeader(boolean underline) {
CssUtils.setClassNameEnabled(Elements.asJsElement(header), css.underlineHeader(), underline);
}
}
public interface Resources extends BaseResources.Resources {
@Source({"WorkspaceNavigationSection.css", "constants.css",
"com/google/collide/client/common/constants.css"})
Css workspaceNavigationSectionCss();
}
public void setVisible(boolean visible) {
CssUtils.setDisplayVisibility(getView().getElement(), visible);
}
public void makeTitleLink() {
}
protected WorkspaceNavigationSection(V view) {
super(view);
}
}