/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.ide.part.explorer.project;
import com.google.common.base.Predicate;
import org.eclipse.che.api.promises.client.Operation;
import org.eclipse.che.api.promises.client.OperationException;
import org.eclipse.che.ide.api.app.AppContext;
import org.eclipse.che.ide.api.data.tree.Node;
import org.eclipse.che.ide.api.data.tree.TreeExpander;
import org.eclipse.che.ide.api.resources.Resource;
import org.eclipse.che.ide.ui.smartTree.Tree;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.collect.Iterables.any;
/**
* Project explorer tree expander. Takes care about resources loading state, in case if tree has been never expanded before, it requests
* infinite resource tree from the server and then expands project tree on the UI. On the second time it just expands project tree without
* additional resource requests.
*
* @author Vlad Zhukovskyi
* @since 5.0.0
* @see TreeExpander
*/
final class ProjectExplorerTreeExpander implements TreeExpander {
private Tree tree;
private AppContext appContext;
public ProjectExplorerTreeExpander(Tree tree, AppContext appContext) {
this.tree = tree;
this.appContext = appContext;
}
private final boolean[] everExpanded = new boolean[]{false};
@Override
public void expandTree() {
if (everExpanded[0]) {
tree.expandAll();
return;
}
appContext.getWorkspaceRoot().getTree(-1).then(new Operation<Resource[]>() {
@Override
public void apply(Resource[] ignored) throws OperationException {
everExpanded[0] = true;
tree.expandAll();
}
});
}
@Override
public boolean isExpandEnabled() {
return tree.getNodeStorage().getAllItemsCount() != 0;
}
@Override
public void collapseTree() {
tree.collapseAll();
}
@Override
public boolean isCollapseEnabled() {
return any(tree.getRootNodes(), isExpanded());
}
private Predicate<Node> isExpanded() {
return new Predicate<Node>() {
@Override
public boolean apply(@javax.annotation.Nullable Node node) {
checkNotNull(node);
return tree.isExpanded(node);
}
};
}
}