override fun navigate()

in intellij/src/main/kotlin/motif/intellij/provider/ScopeNavigationLineMarkerProvider.kt [109:167]


    override fun navigate(event: MouseEvent?, element: PsiElement?) {
      val psiClassElement = element?.toPsiClass()
      if (psiClassElement is PsiClass) {
        val scopeEdges: Array<ScopeEdge>? =
            getParentScopes(psiClassElement.project, graph, psiClassElement)
        if (scopeEdges == null) {
          Messages.showInfoMessage(MESSAGE_NAVIGATION_NO_SCOPE, MESSAGE_TITLE)
          return
        }
        when (scopeEdges.size) {
          0 -> Messages.showInfoMessage(MESSAGE_NAVIGATION_PARENT_ROOT, MESSAGE_TITLE)
          1 -> navigateToParent(scopeEdges[0])
          else -> {
            val mouseEvent: MouseEvent = event ?: return
            val listPopup: ListPopup =
                JBPopupFactory.getInstance()
                    .createListPopup(
                        object :
                            BaseListPopupStep<ScopeEdge>(
                                "Select Parent Scope",
                                scopeEdges.toMutableList(),
                            ) {
                          override fun getTextFor(value: ScopeEdge): String =
                              value.parent.clazz.simpleName

                          override fun onChosen(
                              selectedValue: ScopeEdge?,
                              finalChoice: Boolean,
                          ): PopupStep<*>? {
                            selectedValue?.let { navigateToParent(it) }
                            return super.onChosen(selectedValue, finalChoice)
                          }
                        },
                    )
            listPopup.show(RelativePoint(mouseEvent))
          }
        }
      } else {
        val methodElement = element?.toPsiMethod()
        if (methodElement is PsiMethod) {
          val classElement = PsiTreeUtil.getParentOfType(methodElement, PsiClass::class.java)
          if (isMotifScopeClass(classElement) &&
              methodElement.returnType is PsiClassReferenceType) {
            val returnElementClass: PsiClass? =
                (methodElement.returnType as PsiClassReferenceType).resolve()
            returnElementClass?.let {
              val navigationElement = it.navigationElement
              if (navigationElement is Navigatable &&
                  (navigationElement as Navigatable).canNavigate()) {
                navigationElement.navigate(true)
              }
            }
          }
        }
      }
      project
          .getService(AnalyticsService::class.java)
          .logEvent(MotifAnalyticsActions.NAVIGATION_GUTTER_CLICK)
    }