void (final Project project, @Nullable final Point point, final JComponent component, final boolean showAllOptions, @NotNull final XBreakpoint breakpoint) { final XBreakpointManager breakpointManager = XDebuggerManager.getInstance(project).getBreakpointManager(); final XLightBreakpointPropertiesPanel propertiesPanel = new XLightBreakpointPropertiesPanel(project, breakpointManager, (XBreakpointBase)breakpoint, showAllOptions); final Ref<Balloon> balloonRef = Ref.create(null); final Ref<Boolean> isLoading = Ref.create(Boolean.FALSE); final Ref<Boolean> moreOptionsRequested = Ref.create(Boolean.FALSE); propertiesPanel.setDelegate(() -> { if (!isLoading.get()) { propertiesPanel.saveProperties(); } if (!balloonRef.isNull()) { balloonRef.get().hide(); } propertiesPanel.dispose(); showXBreakpointEditorBalloon(project, point, component, true, breakpoint); moreOptionsRequested.set(true); }); isLoading.set(Boolean.TRUE); propertiesPanel.loadProperties(); isLoading.set(Boolean.FALSE); if (moreOptionsRequested.get()) { return; } Runnable showMoreOptions = () -> { propertiesPanel.saveProperties(); propertiesPanel.dispose(); BreakpointsDialogFactory.getInstance(project).showDialog(breakpoint); }; final JComponent mainPanel = propertiesPanel.getMainPanel(); final Balloon balloon = showBreakpointEditor(project, mainPanel, point, component, showMoreOptions, breakpoint); balloonRef.set(balloon); Disposable disposable = Disposer.newDisposable(); balloon.addListener(new JBPopupListener() { @Override public void onClosed(@NotNull LightweightWindowEvent event) { Disposer.dispose(disposable); propertiesPanel.saveProperties(); propertiesPanel.dispose(); } }); project.getMessageBus().connect(disposable).subscribe(XBreakpointListener.TOPIC, new XBreakpointListener<>() { @Override public void breakpointRemoved(@NotNull XBreakpoint<?> removedBreakpoint) { if (removedBreakpoint.equals(breakpoint)) { balloon.hide(); } } }); ApplicationManager.getApplication().invokeLater(() -> IdeFocusManager.findInstance().requestFocus(mainPanel, true)); }