From 8a7a2fa0e61aa0e56d2265ce6e95c8049db48419 Mon Sep 17 00:00:00 2001 From: Konstantin Bulenkov Date: Fri, 18 Aug 2017 22:33:08 +0200 Subject: [PATCH] use smart select EP for trees. initial. --- .../ui/tree/TreeSmartSelectProvider.java | 67 +++++++++++++++++++ .../src/META-INF/PlatformExtensions.xml | 1 + 2 files changed, 68 insertions(+) create mode 100644 platform/platform-impl/src/com/intellij/ui/tree/TreeSmartSelectProvider.java diff --git a/platform/platform-impl/src/com/intellij/ui/tree/TreeSmartSelectProvider.java b/platform/platform-impl/src/com/intellij/ui/tree/TreeSmartSelectProvider.java new file mode 100644 index 000000000000..aca6253956a4 --- /dev/null +++ b/platform/platform-impl/src/com/intellij/ui/tree/TreeSmartSelectProvider.java @@ -0,0 +1,67 @@ +/* + * Copyright 2000-2017 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.ui.tree; + +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.ide.SmartSelectProvider; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import javax.swing.tree.TreePath; +import java.awt.*; + +/** + * @author Konstantin Bulenkov + */ +public class TreeSmartSelectProvider implements SmartSelectProvider { + @Override + public void increaseSelection(JTree tree) { + TreePath path = tree.getLeadSelectionPath(); + if (path == null) return; + increaseSelection(path, tree); + } + + private static void increaseSelection(TreePath path, JTree tree) { + TreePath parentPath = path.getParentPath(); + if (parentPath == null) return; + boolean madeSelection = false; + for (int i = 0; i < tree.getVisibleRowCount(); i++) { + TreePath row = tree.getPathForRow(i); + if (parentPath.isDescendant(row)) { + if (!tree.isRowSelected(i)) { + madeSelection = true; + tree.getSelectionModel().addSelectionPath(row); + } + } + } + if (!madeSelection) { + increaseSelection(parentPath, tree); + } + } + + @Override + public void decreaseSelection(JTree tree) { + //todo[kb] + } + + @Nullable + @Override + public JTree getSource(DataContext context) { + Component component = PlatformDataKeys.CONTEXT_COMPONENT.getData(context); + return component instanceof JTree ? (JTree)component : null; + } +} diff --git a/platform/platform-resources/src/META-INF/PlatformExtensions.xml b/platform/platform-resources/src/META-INF/PlatformExtensions.xml index 617bb0510692..44c373637773 100644 --- a/platform/platform-resources/src/META-INF/PlatformExtensions.xml +++ b/platform/platform-resources/src/META-INF/PlatformExtensions.xml @@ -508,5 +508,6 @@ +