AbstractPopup (Project project, @NotNull JComponent component, @Nullable JComponent preferredFocusedComponent, boolean requestFocus, boolean focusable, boolean movable, String dimensionServiceKey, boolean resizable, @NlsContexts.PopupTitle @Nullable String caption, @Nullable Computable<Boolean> callback, boolean cancelOnClickOutside, @NotNull Set<? extends JBPopupListener> listeners, boolean useDimServiceForXYLocation, ActiveComponent commandButton, @Nullable IconButton cancelButton, @Nullable MouseChecker cancelOnMouseOutCallback, boolean cancelOnWindow, @Nullable ActiveIcon titleIcon, boolean cancelKeyEnabled, boolean locateByContent, boolean placeWithinScreenBounds, @Nullable Dimension minSize, float alpha, @Nullable MaskProvider maskProvider, boolean inStack, boolean modalContext, Component @NotNull [] focusOwners, @Nullable @NlsContexts.PopupAdvertisement String adText, int adTextAlignment, boolean headerAlwaysFocusable, @NotNull List<? extends Pair<ActionListener, KeyStroke>> keyboardActions, Component settingsButtons, final @Nullable Processor<? super JBPopup> pinCallback, boolean mayBeParent, boolean showShadow, boolean showBorder, Color borderColor, boolean cancelOnWindowDeactivation, @Nullable BooleanFunction<? super KeyEvent> keyEventHandler) { assert !requestFocus || focusable : "Incorrect argument combination: requestFocus=true focusable=false"; all.add(this); myActivityKey = new UiActivity.Focus("Popup:" + this); myProject = project; myComponent = component; mySpeedSearchFoundInRootComponent = findInComponentHierarchy(component, it -> it instanceof ListWithFilter ? ((ListWithFilter<?>)it).getSpeedSearch() : null); myPopupBorder = showBorder ? borderColor != null ? PopupBorder.Factory.createColored(borderColor) : PopupBorder.Factory.create(true, showShadow) : PopupBorder.Factory.createEmpty(); myPopupBorder.setPopupUsed(); myShadowed = showShadow; if (showBorder) { myPopupBorderColor = borderColor == null ? JBUI.CurrentTheme.Popup.borderColor(true) : borderColor; } myContent = createContentPanel(resizable, myPopupBorder, false); myMayBeParent = mayBeParent; myCancelOnWindowDeactivation = cancelOnWindowDeactivation; myContent.add(component, BorderLayout.CENTER); if (adText != null) { setAdText(adText, adTextAlignment); } myCancelKeyEnabled = cancelKeyEnabled; myLocateByContent = locateByContent; myLocateWithinScreen = placeWithinScreenBounds; myAlpha = alpha; myMaskProvider = maskProvider; myInStack = inStack; myModalContext = modalContext; myFocusOwners = focusOwners; myHeaderAlwaysFocusable = headerAlwaysFocusable; myMovable = movable; myHeaderPanel = new JPanel(new BorderLayout()) { @Override public Color getBackground() { return JBUI.CurrentTheme.Popup.headerBackground(true); } }; if (caption != null) { if (!caption.isEmpty()) { TitlePanel titlePanel = titleIcon == null ? new TitlePanel() : new TitlePanel(titleIcon.getRegular(), titleIcon.getInactive()); titlePanel.setText(caption); titlePanel.setPopupTitle(ExperimentalUI.isNewUI()); myCaption = titlePanel; } else { myCaption = new CaptionPanel(); } if (pinCallback != null) { Icon icon = ToolWindowManager.getInstance(myProject != null ? myProject : ProjectUtil.guessCurrentProject((JComponent)myOwner)) .getLocationIcon(ToolWindowId.FIND, AllIcons.General.Pin_tab); myCaption.setButtonComponent(new InplaceButton( new IconButton(IdeBundle.message("show.in.find.window.button.name"), icon), e -> pinCallback.process(this) ), JBUI.Borders.empty(4)); } else if (cancelButton != null) { myCaption.setButtonComponent(new InplaceButton(cancelButton, e -> cancel()), JBUI.Borders.empty(4)); } else if (commandButton != null) { myCaption.setButtonComponent(commandButton, null); } } else { myCaption = new CaptionPanel(); myCaption.setBorder(null); myCaption.setPreferredSize(JBUI.emptySize()); } setWindowActive(myHeaderAlwaysFocusable); myHeaderPanel.add(myCaption, BorderLayout.NORTH); myContent.add(myHeaderPanel, BorderLayout.NORTH); myForcedHeavyweight = true; myResizable = resizable; myPreferredFocusedComponent = preferredFocusedComponent; myRequestFocus = requestFocus; myFocusable = focusable; myDimensionServiceKey = dimensionServiceKey; myCallBack = callback; myCancelOnClickOutside = cancelOnClickOutside; myCancelOnMouseOutCallback = cancelOnMouseOutCallback; myListeners.addAll(listeners); myUseDimServiceForXYLocation = useDimServiceForXYLocation; myCancelOnWindow = cancelOnWindow; myMinSize = minSize; if (Registry.is("ide.popup.horizontal.scroll.bar.opaque")) { forHorizontalScrollBar(bar -> bar.setOpaque(true)); } for (Pair<ActionListener, KeyStroke> pair : keyboardActions) { myContent.registerKeyboardAction(pair.getFirst(), pair.getSecond(), JComponent.WHEN_IN_FOCUSED_WINDOW); } if (settingsButtons != null) { myCaption.addSettingsComponent(settingsButtons); } myKeyEventHandler = keyEventHandler; debugState("popup initialized", State.NEW); myState = State.INIT; Component clickSource = PopupImplUtil.getClickSourceFromLastInputEvent(); if (!(clickSource instanceof JList<?> || clickSource instanceof JTree)) { PopupUtil.setPopupToggleComponent(this, clickSource); } ActionUtil.initActionContextForComponent(myContent); return this; }