// 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.AppContext;
import com.google.collide.client.code.gotodefinition.GoToDefinitionRenderer;
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.gwt.resources.client.CssResource;
import elemental.html.DivElement;
import elemental.html.Element;
/**
* The main content area on the CodePerspective.
*
*/
public class EditableContentArea extends UiComponent<EditableContentArea.View> {
/**
* Static factory method for obtaining an instance of the EditableContentArea.
*/
public static EditableContentArea create(
View view, AppContext appContext, EditorBundle editorBundle) {
final EditorToolBar toolBar = EditorToolBar.create(
view.getEditorToolBarView(), FileSelectedPlace.PLACE, appContext, editorBundle);
// Hook presenter in the editor bundle to the view in the header
editorBundle.getBreadcrumbs().setView(view.getBreadcrumbsView());
return new EditableContentArea(view, toolBar);
}
/**
* Type for things that can be added to the content area of the CodePerspective.
*/
public interface Content {
/**
* @return The {@link Element} that we set as the contents of the content
* area.
*/
Element getContentElement();
/**
* Called when the content is displayed.
*
* It's possible that element returned by {@link #getContentElement()} was removed from DOM and
* re-added, so this callback is a good place to re-initialize any values that may have been
* cleared.
*/
void onContentDisplayed();
}
/**
* Style names.
*/
public interface Css extends CssResource {
String base();
String contentHeader();
String contentContainer();
int editableContentAreaRight();
}
public interface Resources
extends
GoToDefinitionRenderer.Resources,
EditorToolBar.Resources,
WorkspaceLocationBreadcrumbs.Resources,
NoFileSelectedPanel.Resources,
UneditableDisplay.Resources {
@Source({"com/google/collide/client/common/constants.css", "EditableContentArea.css"})
Css editableContentAreaCss();
}
/**
* The View for the EditableContentArea.
*/
public static class View extends CompositeView<Void> {
private DivElement header;
private DivElement content;
private final WorkspaceLocationBreadcrumbs.View breadcrumbsView;
private final EditorToolBar.View editorToolBarView;
private final Css css;
public View(Resources res) {
super(Elements.createDivElement(res.editableContentAreaCss().base()));
this.css = res.editableContentAreaCss();
// Instantiate sub-views.
this.breadcrumbsView = new WorkspaceLocationBreadcrumbs.View(res);
this.editorToolBarView = new EditorToolBar.View(res);
createDom();
}
public Element getContentElement() {
return content;
}
public Element getHeaderElement() {
return header;
}
public EditorToolBar.View getEditorToolBarView() {
return editorToolBarView;
}
public WorkspaceLocationBreadcrumbs.View getBreadcrumbsView() {
return breadcrumbsView;
}
public int getDefaultEditableContentAreaRight() {
return css.editableContentAreaRight();
}
private void createDom() {
Element elem = getElement();
header = Elements.createDivElement(css.contentHeader());
content = Elements.createDivElement(css.contentContainer());
elem.appendChild(header);
elem.appendChild(content);
header.appendChild(breadcrumbsView.getElement());
header.appendChild(editorToolBarView.getElement());
}
}
private Content currentContent;
private final EditorToolBar toolBar;
EditableContentArea(View view, EditorToolBar toolBar) {
super(view);
this.toolBar = toolBar;
}
public EditorToolBar getEditorToolBar() {
return toolBar;
}
public Content getCurrentContent() {
return currentContent;
}
/**
* Sets the contents of the content area under the header.
*
* @param content the content to display, or null to clear content
* @param showHistoryIcon whether or not to show the history button for this content.
*/
public void setContent(Content content, boolean showHistoryIcon) {
if (currentContent == content) {
return;
}
if (currentContent != null) {
currentContent.getContentElement().removeFromParent();
}
getView().getContentElement().setInnerHTML("");
if (content != null) {
getView().getContentElement().appendChild(content.getContentElement());
}
currentContent = content;
currentContent.onContentDisplayed();
getEditorToolBar().getView().setHistoryButtonVisible(showHistoryIcon);
setLocationBreadcrumbsVisibility(true);
}
/**
* Sets the contents of the content area under the header. Assumes content can
* display history and shows history icon. (Use
* {@link #setContent(Content, boolean)} to customize).
*
* @param content the content to display, or null to clear content
*/
public void setContent(Content content) {
setContent(content, true);
}
public void setLocationBreadcrumbsVisibility(boolean visible) {
CssUtils.setDisplayVisibility2(getView().breadcrumbsView.getElement(), visible);
}
}