// 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.debugging.DebuggingModelController; import com.google.collide.client.history.Place; import com.google.collide.client.ui.tooltip.Tooltip; import com.google.collide.client.ui.tree.Tree; import com.google.collide.client.util.Elements; import com.google.collide.client.workspace.FileTreeModel; import com.google.collide.client.workspace.FileTreeNode; import com.google.collide.client.workspace.FileTreeUiController; import com.google.collide.dto.DirInfo; import com.google.collide.dto.ProjectInfo; import com.google.gwt.resources.client.CssResource; import elemental.html.Element; /** * {@link WorkspaceNavigationSection} that is the presenter for the File Tree. * * This class owns the instances of the {@link FileTreeUiController}, and the {@link Tree} widget. * */ public class FileTreeSection extends WorkspaceNavigationSection<FileTreeSection.View> { /** * Static factory method for obtaining an instance of the FileTreeSection. */ public static FileTreeSection create(Place place, AppContext appContext, FileTreeModel fileTreeModel, DebuggingModelController debuggingModelController) { // create the view FileTreeSection.View view = new FileTreeSection.View(appContext.getResources()); // Create the Tree presenter. FileTreeNodeRenderer nodeRenderer = FileTreeNodeRenderer.create(appContext.getResources()); FileTreeNodeDataAdapter nodeDataAdapter = new FileTreeNodeDataAdapter(); Tree<FileTreeNode> tree = Tree.create( view.treeView, nodeDataAdapter, nodeRenderer, appContext.getResources()); // Create the UI controller. FileTreeUiController treeUiController = FileTreeUiController.create(place, fileTreeModel, tree, appContext, debuggingModelController); // attach a file tree menu to the button treeUiController.getContextMenuController() .createMenuDropdown(Elements.asJsElement(view.menuButton)); // Instantiate and return the FileTreeSection. FileTreeSection fileTreeSection = new FileTreeSection(view, tree, treeUiController, fileTreeModel); return fileTreeSection; } public interface Css extends CssResource { String root(); } /** * CSS and images used by the FileTreeSection. */ public interface Resources extends WorkspaceNavigationSection.Resources, Tooltip.Resources, FileTreeNodeRenderer.Resources { @Source("FileTreeSection.css") Css workspaceNavigationFileTreeSectionCss(); } /** * View for the FileTreeSection. */ static class View extends WorkspaceNavigationSection.View<WorkspaceNavigationSection.ViewEvents> { final Element root; Tree.View<FileTreeNode> treeView; View(Resources res) { super(res); // Instantiate subviews. this.treeView = new Tree.View<FileTreeNode>(res); root = Elements.createDivElement(res.workspaceNavigationFileTreeSectionCss().root()); root.appendChild(treeView.getElement()); // Initialize the View. setTitle("Project Files"); setStretch(true); setShowMenuButton(true); setContent(root); setContentAreaScrollable(true); setUnderlineHeader(true); title.addClassName(css.headerLink()); } } private class ViewEventsImpl extends WorkspaceNavigationSection.AbstractViewEventsImpl { @Override public void onTitleClicked() { if (projectInfo != null) { // was goto landing } } } private final Tree<FileTreeNode> tree; private final FileTreeUiController fileTreeUiController; private ProjectInfo projectInfo; private final FileTreeModel fileTreeModel; private final boolean isReadOnly = false; private final FileTreeModel.TreeModelChangeListener fileTreeModelChangeListener = new FileTreeModel.BasicTreeModelChangeListener() { @Override public void onTreeModelChange() { updateProjectTemplatePickerVisibility(); } }; FileTreeSection(View view, Tree<FileTreeNode> tree, FileTreeUiController fileTreeUiController, FileTreeModel fileTreeModel) { super(view); view.setDelegate(new ViewEventsImpl()); this.tree = tree; this.fileTreeUiController = fileTreeUiController; this.fileTreeModel = fileTreeModel; fileTreeModel.addModelChangeListener(fileTreeModelChangeListener); getView().setTitle("Dimly Project"); updateProjectTemplatePickerVisibility(); } public void cleanup() { fileTreeModel.removeModelChangeListener(fileTreeModelChangeListener); } public Tree<FileTreeNode> getTree() { return tree; } public FileTreeUiController getFileTreeUiController() { return fileTreeUiController; } private void updateProjectTemplatePickerVisibility() { if (isReadOnly) { return; } DirInfo root = (DirInfo) fileTreeModel.getWorkspaceRoot(); /* * If it is null, the file tree hasn't been loaded yet so we can't be sure whether or not there * are files, don't show it yet */ boolean showPicker = root != null && root.getFiles().isEmpty() && root.getSubDirectories().isEmpty(); } }