Content (@NotNull AbstractTerminalRunner<?> terminalRunner, @NotNull ToolWindow toolWindow, @Nullable TerminalWidget terminalWidget, @Nullable TerminalTabState tabState, boolean deferSessionStartUntilUiShown) { TerminalToolWindowPanel panel = new TerminalToolWindowPanel(PropertiesComponent.getInstance(myProject), toolWindow); Content content = ContentFactory.getInstance().createContent(panel, null, false); TerminalWidget widget = terminalWidget; if (widget == null) { String currentWorkingDir = terminalRunner.getCurrentWorkingDir(tabState); NullableLazyValue<Path> commandHistoryFileLazyValue = NullableLazyValue.atomicLazyNullable(() -> { return TerminalCommandHistoryManager.getInstance().getOrCreateCommandHistoryFile( tabState != null ? tabState.myCommandHistoryFileName : null, myProject ); }); ShellStartupOptions startupOptions = new ShellStartupOptions.Builder() .workingDirectory(currentWorkingDir) .shellCommand(tabState != null ? tabState.myShellCommand : null) .commandHistoryFileProvider(() -> commandHistoryFileLazyValue.getValue()) .build(); widget = terminalRunner.startShellTerminalWidget(content, startupOptions, deferSessionStartUntilUiShown); widget.getTerminalTitle().change(state -> { if (state.getDefaultTitle() == null) { state.setDefaultTitle(terminalRunner.getDefaultTabTitle()); } return Unit.INSTANCE; }); TerminalWorkingDirectoryManager.setInitialWorkingDirectory(content, currentWorkingDir); } else { TerminalWidgetKt.setNewParentDisposable(terminalWidget, content); } if (tabState != null && tabState.myTabName != null) { widget.getTerminalTitle().change(state -> { if (tabState.myIsUserDefinedTabTitle) { state.setUserDefinedTitle(tabState.myTabName); } else { state.setDefaultTitle(tabState.myTabName); } return null; }); } updateTabTitle(widget.getTerminalTitle(), toolWindow, content); setupTerminalWidget(toolWindow, widget, content); content.setCloseable(true); content.putUserData(TERMINAL_WIDGET_KEY, widget); TerminalContainer container = new TerminalContainer(myProject, content, widget, this); panel.setContent(container.getWrapperPanel()); panel.addFocusListener(createFocusListener(toolWindow)); TerminalWidget finalWidget = widget; myTerminalSetupHandlers.forEach(consumer -> consumer.accept(finalWidget)); panel.updateDFState(); content.setPreferredFocusedComponent(() -> finalWidget.getPreferredFocusableComponent()); return content; }