// 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.workspace.outline; import com.google.collide.client.AppContext; import com.google.collide.client.code.WorkspaceNavigationSection; import com.google.collide.client.ui.tree.Tree; import com.google.collide.client.workspace.outline.OutlineModel.OutlineModelListener; /** * Navigation panel that allows to quickly navigate through file structure. * */ public class OutlineSection extends WorkspaceNavigationSection<OutlineSection.View> { /** * Static factory method for obtaining an instance of the OutlineSection. */ public static OutlineSection create(View view, AppContext appContext, OutlineModel outlineModel, OutlineController outlineController) { // Create the Tree presenter. OutlineNodeRenderer nodeRenderer = new OutlineNodeRenderer(appContext.getResources()); OutlineNodeDataAdapter nodeDataAdapter = new OutlineNodeDataAdapter(); Tree<OutlineNode> tree = Tree.create(view.treeView, nodeDataAdapter, nodeRenderer, appContext.getResources()); tree.setTreeEventHandler(outlineController); // Instantiate and return the FileTreeSection. return new OutlineSection(view, tree, outlineModel); } private class OutlineModelListenerImpl implements OutlineModelListener { @Override public void rootChanged(OutlineNode newRoot) { tree.replaceSubtree(tree.getModel().getRoot(), newRoot, false); } @Override public void nodeUpdated(final OutlineNode node) { // TODO: we should have something like render(node) or even // adapter should be able to "update" rendered node. tree.renderTree(); } @Override public void rootUpdated() { tree.renderTree(); } } /** * CSS and images used by the OutlineSection. */ public interface Resources extends WorkspaceNavigationSection.Resources, Tree.Resources, OutlineNodeRenderer.Resources { } /** * View for the OutlineSection. */ public static class View extends WorkspaceNavigationSection.View<WorkspaceNavigationSection.ViewEvents> { final Tree.View<OutlineNode> treeView; public View(Resources res) { super(res); // Instantiate subviews. this.treeView = new Tree.View<OutlineNode>(res); // Initialize the View. setTitle("Code Navigator"); setStretch(true); setBlue(true); setContent(treeView.getElement()); setContentAreaScrollable(true); } } private final Tree<OutlineNode> tree; OutlineSection(View view, Tree<OutlineNode> tree, OutlineModel outlineModel) { super(view); this.tree = tree; outlineModel.setListener(new OutlineModelListenerImpl()); } }