diff options
Diffstat (limited to 'platform/structure-view-api/src/com/intellij/ide/util/treeView/AbstractTreeStructure.java')
-rw-r--r-- | platform/structure-view-api/src/com/intellij/ide/util/treeView/AbstractTreeStructure.java | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/platform/structure-view-api/src/com/intellij/ide/util/treeView/AbstractTreeStructure.java b/platform/structure-view-api/src/com/intellij/ide/util/treeView/AbstractTreeStructure.java new file mode 100644 index 000000000000..acd6548ff26d --- /dev/null +++ b/platform/structure-view-api/src/com/intellij/ide/util/treeView/AbstractTreeStructure.java @@ -0,0 +1,78 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * 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.intellij.ide.util.treeView; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.ActionCallback; +import com.intellij.openapi.util.AsyncResult; +import com.intellij.psi.PsiDocumentManager; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public abstract class AbstractTreeStructure { + public abstract Object getRootElement(); + public abstract Object[] getChildElements(Object element); + @Nullable + public abstract Object getParentElement(Object element); + + @NotNull + public abstract NodeDescriptor createDescriptor(Object element, NodeDescriptor parentDescriptor); + + public abstract void commit(); + public abstract boolean hasSomethingToCommit(); + + @NotNull + public static ActionCallback asyncCommitDocuments(@NotNull Project project) { + if (project.isDisposed()) return new ActionCallback.Done(); + PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project); + if (!documentManager.hasUncommitedDocuments()) { + return new ActionCallback.Done(); + } + final ActionCallback callback = new ActionCallback(); + documentManager.performWhenAllCommitted(callback.createSetDoneRunnable()); + return callback; + } + + /** + * @return callback which is set to {@link ActionCallback#setDone()} when the tree structure is committed. + * By default it just calls {@link #commit()} synchronously but it is desirable to override it + * to provide asynchronous commit to the tree structure to make it more responsible. + * E.g. when you should commit all documents during the {@link #commit()}, + * you can use {@link #asyncCommitDocuments(Project)} to do it asynchronously. + */ + @NotNull + public ActionCallback asyncCommit() { + if (hasSomethingToCommit()) commit(); + return new ActionCallback.Done(); + } + + public boolean isToBuildChildrenInBackground(Object element){ + return false; + } + + public boolean isValid(Object element) { + return true; + } + + public boolean isAlwaysLeaf(Object element) { + return false; + } + + public AsyncResult<Object> revalidateElement(Object element) { + return new AsyncResult.Done<Object>(element); + } +}
\ No newline at end of file |