IDEA-186349 add utility methods to simplify implementing Navigatable
authorSergey Malenkov <sergey.malenkov@jetbrains.com>
Tue, 6 Mar 2018 14:06:51 +0000 (17:06 +0300)
committerSergey Malenkov <sergey.malenkov@jetbrains.com>
Tue, 6 Mar 2018 14:10:25 +0000 (17:10 +0300)
platform/platform-api/src/com/intellij/util/OpenSourceUtil.java

index 79610b8dd60d8445a75be63c203c69186511a32e..16023d8084ed5df802083e6dd625fff911b48fcc 100644 (file)
@@ -24,6 +24,20 @@ public class OpenSourceUtil {
   }
 
   /**
+   * @return {@code true} if the specified {@code object} is {@link Navigatable} and supports navigation
+   */
+  public static boolean canNavigate(@Nullable Object object) {
+    return object instanceof Navigatable && ((Navigatable)object).canNavigate();
+  }
+
+  /**
+   * @return {@code true} if the specified {@code object} is {@link Navigatable} and supports navigation to source
+   */
+  public static boolean canNavigateToSource(@Nullable Object object) {
+    return object instanceof Navigatable && ((Navigatable)object).canNavigateToSource();
+  }
+
+  /**
    * Invokes {@link #navigate(boolean, Navigatable...)} that always requests focus.
    */
   public static void navigate(@Nullable Navigatable... navigatables) {
@@ -57,13 +71,11 @@ public class OpenSourceUtil {
     Navigatable nonSourceNavigatable = null;
     boolean alreadyNavigatedToSource = false;
     for (Navigatable navigatable : navigatables) {
-      if (navigatable != null) {
-        if (navigateToSource(requestFocus, tryNotToScroll, navigatable)) {
-          alreadyNavigatedToSource = true;
-        }
-        else if (!alreadyNavigatedToSource && nonSourceNavigatable == null && navigatable.canNavigate()) {
-          nonSourceNavigatable = navigatable;
-        }
+      if (navigateToSource(requestFocus, tryNotToScroll, navigatable)) {
+        alreadyNavigatedToSource = true;
+      }
+      else if (!alreadyNavigatedToSource && nonSourceNavigatable == null && canNavigate(navigatable)) {
+        nonSourceNavigatable = navigatable;
       }
     }
     if (alreadyNavigatedToSource) return true;
@@ -99,7 +111,7 @@ public class OpenSourceUtil {
    * @return {@code true} if navigation is done, {@code false} otherwise
    */
   public static boolean navigateToSource(boolean requestFocus, boolean tryNotToScroll, @Nullable Navigatable navigatable) {
-    if (navigatable == null || !navigatable.canNavigateToSource()) return false;
+    if (!canNavigateToSource(navigatable)) return false;
     if (tryNotToScroll && navigatable instanceof StatePreservingNavigatable) {
       ((StatePreservingNavigatable)navigatable).navigate(requestFocus, true);
     }