fun createPopup()

in src/main/java/com/maddyhome/idea/vim/ui/widgets/mode/ModeWidgetPopup.kt [58:117]


    fun createPopup(): JBPopup? {
      synchronized(this) {
        if (currentPopup?.isDisposed == false) return null
        val mainPanel = JPanel(BorderLayout())
        val buttonPanel = JPanel(FlowLayout(FlowLayout.RIGHT))

        val applyButton = JButton("Apply").apply { isEnabled = false }
        val cancelButton = JButton("Close")
        buttonPanel.add(applyButton)
        buttonPanel.add(cancelButton)
        mainPanel.add(buttonPanel, BorderLayout.SOUTH)

        val tabbedPane = JBTabbedPane()
        val lightThemeSettings = createPanel(getWidgetThemeColors(true))
        val darkThemeSettings = createPanel(getWidgetThemeColors(false))
        tabbedPane.addTab(MessageHelper.message("widget.mode.popup.tab.light"), lightThemeSettings.addScrollPane())
        tabbedPane.addTab(MessageHelper.message("widget.mode.popup.tab.dark"), darkThemeSettings.addScrollPane())
        tabbedPane.preferredSize = Dimension(300, 300)
        for (i in 0 until tabbedPane.tabCount) {
          val label = JLabel(tabbedPane.getTitleAt(i), JLabel.CENTER)
          label.preferredSize = Dimension(126, tabbedPane.getTabComponentAt(i).preferredSize.height)
          tabbedPane.setTabComponentAt(i, label)
        }
        tabbedPane.selectedIndex = if (LafManager.getInstance().currentUIThemeLookAndFeel.isDark) 1 else 0
        mainPanel.add(tabbedPane, BorderLayout.CENTER)

        val popupContent = ContentFactory.getInstance().createContent(mainPanel, "", false).component
        val popup = JBPopupFactory.getInstance()
          .createComponentPopupBuilder(popupContent, popupContent)
          .setTitle(MessageHelper.message("widget.mode.popup.title"))
          .setResizable(true)
          .setMovable(true)
          .setRequestFocus(true)
          .setCancelOnClickOutside(false)
          .setCancelKeyEnabled(false)
          .createPopup()

        applyButton.addActionListener {
          lightThemeSettings.apply()
          darkThemeSettings.apply()
          repaintModeWidget()
        }

        cancelButton.addActionListener {
          popup.cancel()
        }

        val alarm = Alarm(popup)
        fun updateApplyButtonVisibility() {
          alarm.addRequest({
            applyButton.isEnabled = lightThemeSettings.isModified() || darkThemeSettings.isModified()
            updateApplyButtonVisibility()
          }, 500L)
        }
        updateApplyButtonVisibility()

        currentPopup = popup
        return currentPopup
      }
    }