// 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.code.EditableContentArea.Content; import com.google.collide.client.history.Place; import com.google.collide.client.util.Elements; 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.ParagraphElement; 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.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.events.EventRemover; import elemental.html.Element; /** * The screen you first see when opening a workspace that has no file selected. * */ public class NoFileSelectedPanel extends UiComponent<NoFileSelectedPanel.View> implements Content { private static final String REGULAR_MESSAGE = "Choose a file to begin editing."; public static NoFileSelectedPanel create(Place place, Resources res) { View view = new View(res); view.setMessage(REGULAR_MESSAGE); NoFileSelectedPanel panel = new NoFileSelectedPanel(view); return panel; } /** * Images and CSS. */ public interface Resources extends ClientBundle { @Source({"com/google/collide/client/common/constants.css", "NoFileSelectedPanel.css"}) Css noFileSelectedPanelCss(); @Source("editor.png") ImageResource editorLogo(); } /** * Styles names. */ public interface Css extends CssResource { String base(); String bigger(); String center(); String logo(); String text(); } /** * Events sourced by this View. */ public interface ViewEvents { // TODO: Add desktop Drag n' drop event. void onClicked(); } public static class View extends CompositeView<ViewEvents> { @UiTemplate("NoFileSelectedPanel.ui.xml") interface MyBinder extends UiBinder<com.google.gwt.dom.client.DivElement, View> { } private static MyBinder binder = GWT.create(MyBinder.class); final Resources res; @UiField(provided = true) final Css css; @UiField ParagraphElement message; private EventRemover remover; public View(Resources res) { this.res = res; this.css = res.noFileSelectedPanelCss(); setElement(Elements.asJsElement(binder.createAndBindUi(this))); handleEvents(); } public void detach() { // Remove ourselves, we have served our purpose. getElement().removeFromParent(); // Unhook the eventlistener just case. if (remover != null) { remover.remove(); } } /* * Set the message (the last line) of the panel. */ public void setMessage(String msg) { message.setInnerText(msg); } private void handleEvents() { remover = getElement().addEventListener(Event.CLICK, new EventListener() { @Override public void handleEvent(Event evt) { if (getDelegate() != null) { getDelegate().onClicked(); } } }, false); } } public NoFileSelectedPanel(View view) { super(view); getView().setMessage(REGULAR_MESSAGE); } public void detach() { getView().detach(); } @Override public Element getContentElement() { return getView().getElement(); } @Override public void onContentDisplayed() {} }