// 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.debugging; 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.resources.client.ClientBundle; import com.google.gwt.resources.client.CssResource; import com.google.gwt.resources.client.ImageResource; import elemental.events.Event; import elemental.events.EventListener; import elemental.html.Element; /** * Watch expressions pane in the debugging sidebar. * */ public class DebuggingSidebarWatchExpressionsPane extends UiComponent< DebuggingSidebarWatchExpressionsPane.View> { public interface Css extends CssResource { String root(); String button(); String plusButton(); String refreshButton(); } interface Resources extends ClientBundle, RemoteObjectTree.Resources { @Source("DebuggingSidebarWatchExpressionsPane.css") Css workspaceEditorDebuggingSidebarWatchExpressionsPaneCss(); @Source("plusButton.png") ImageResource plusButton(); @Source("refreshButton.png") ImageResource refreshButton(); } /** * Listener of this pane's events. */ interface Listener { void onBeforeAddWatchExpression(); void onWatchExpressionsCountChange(); } /** * The view for the pane. */ static class View extends CompositeView<ViewEvents> { private final Resources resources; private final Css css; private final RemoteObjectTree.View treeView; private final Element plusButton; private final Element refreshButton; View(Resources resources) { this.resources = resources; css = resources.workspaceEditorDebuggingSidebarWatchExpressionsPaneCss(); treeView = new RemoteObjectTree.View(resources); plusButton = Elements.createDivElement(css.button(), css.plusButton()); refreshButton = Elements.createDivElement(css.button(), css.refreshButton()); Element rootElement = Elements.createDivElement(css.root()); rootElement.appendChild(treeView.getElement()); setElement(rootElement); attachButtonListeners(); } private void attachButtonListeners() { plusButton.addEventListener(Event.CLICK, new EventListener() { @Override public void handleEvent(Event evt) { getDelegate().onAddNewExpression(); evt.stopPropagation(); } }, false); refreshButton.addEventListener(Event.CLICK, new EventListener() { @Override public void handleEvent(Event evt) { getDelegate().onWatchRefresh(); evt.stopPropagation(); } }, false); } private void attachControlButtons(Element controlButtonsRoot) { controlButtonsRoot.appendChild(refreshButton); controlButtonsRoot.appendChild(plusButton); } } /** * The view events. */ private interface ViewEvents { void onAddNewExpression(); void onWatchRefresh(); } static DebuggingSidebarWatchExpressionsPane create(View view, DebuggerState debuggerState) { RemoteObjectTree tree = RemoteObjectTree.create(view.treeView, view.resources, debuggerState); return new DebuggingSidebarWatchExpressionsPane(view, tree); } private final RemoteObjectTree tree; private Listener delegateListener; private final RemoteObjectTree.Listener remoteObjectTreeListener = new RemoteObjectTree.Listener() { @Override public void onRootChildrenChanged() { if (delegateListener != null) { delegateListener.onWatchExpressionsCountChange(); } } }; private final class ViewEventsImpl implements ViewEvents { @Override public void onAddNewExpression() { if (delegateListener != null) { delegateListener.onBeforeAddWatchExpression(); } tree.collapseRootChildren(); tree.addMutableRootChild(); } @Override public void onWatchRefresh() { refreshWatchExpressions(); } } @VisibleForTesting DebuggingSidebarWatchExpressionsPane(View view, RemoteObjectTree tree) { super(view); this.tree = tree; tree.setListener(remoteObjectTreeListener); view.setDelegate(new ViewEventsImpl()); } void setListener(Listener listener) { delegateListener = listener; } void attachControlButtons(Element controlButtonsRoot) { getView().attachControlButtons(controlButtonsRoot); } void refreshWatchExpressions() { tree.reevaluateRootChildren(); } int getExpressionsCount() { return tree.getRootChildrenCount(); } }