ModuleBuilder () { return new GeneralModuleBuilder() { @Override public @NotNull List<Class<? extends ModuleWizardStep>> getIgnoredSteps() { return List.of(ProjectSettingsStep.class); } @Override public @NotNull ModuleWizardStep getCustomOptionsStep(WizardContext context, Disposable parentDisposable) { ProjectSettingsStep step = new ProjectSettingsStep(context); step.getExpertPlaceholder().removeAll(); JTextPane textPane = new JTextPane(); textPane.setText(getDescription()); step.getExpertPlaceholder().setMinimumSize(new Dimension(0, 100)); step.getExpertPlaceholder().add(ScrollPaneFactory.createScrollPane(textPane)); return step; } @Override public boolean isAvailable() { return !isNewWizard(); } @Override public ModuleType<?> getModuleType() { return GeneralModuleTypeForIdea.this; } @Override public @Nullable List<Module> commit(@NotNull Project project, ModifiableModuleModel model, ModulesProvider modulesProvider) { List<Module> modules = super.commit(project, model, modulesProvider); scheduleTooltip(project); return modules; } private void scheduleTooltip(@NotNull Project project) { StartupManager.getInstance(project).runAfterOpened(() -> { if (ProjectView.getInstance(project).getCurrentProjectViewPane() != null) { showTooltip(project); return; } project.getMessageBus().connect().subscribe(ToolWindowManagerListener.TOPIC, new ToolWindowManagerListener() { @Override public void toolWindowShown(@NotNull ToolWindow toolWindow) { if (!"Project".equals(toolWindow.getId())) return; showTooltip(project); } }); }); } private void showTooltip(Project project) { ApplicationManager.getApplication().invokeLater(() -> { JTree tree = ProjectView.getInstance(project).getCurrentProjectViewPane().getTree(); String shortcutText = KeymapUtil.getShortcutText(IdeActions.ACTION_NEW_ELEMENT); GotItTooltip tooltip = new GotItTooltip("empty.project.create.file", IdeBundle.message("to.create.new.file.tooltip", shortcutText), project) .withPosition(Balloon.Position.atRight); ApplicationManager.getApplication().getMessageBus().connect(tooltip).subscribe(AnActionListener.TOPIC, new AnActionListener() { @Override public void afterActionPerformed(@NotNull AnAction action, @NotNull AnActionEvent event, @NotNull AnActionResult result) { tooltip.gotIt(); Disposer.dispose(tooltip); } }); tooltip.show(tree, (component, balloon) -> getPoint(tree)); }); } private static Point getPoint(JTree tree) { TreePath path = tree.getSelectionPath(); Rectangle bounds = tree.getPathBounds(path); int x = tree.getVisibleRect().width + 5; return bounds == null ? new Point(x, 10) : new Point(x, (int)bounds.getCenterY()); } }; }