void (Project project, PageFormat pageFormat, BasePainter painter) { final PrinterJob printerJob = PrinterJob.getPrinterJob(); try { printerJob.setPrintable(painter, pageFormat); if (!printerJob.printDialog()) { return; } } catch (Exception e) { LOG.warn(e); } PsiDocumentManager.getInstance(project).commitAllDocuments(); ProgressManager.getInstance() .run(new Task.Backgroundable(project, EditorBundle.message("print.progress"), true, PerformInBackgroundOption.ALWAYS_BACKGROUND) { @Override public void run(@NotNull ProgressIndicator indicator) { try { painter.setProgress(indicator); printerJob.print(); } catch (ProcessCanceledException e) { LOG.info("Cancelled"); printerJob.cancel(); } catch (PrinterException e) { LOG.warn(e); @NonNls String message = ObjectUtils.notNull(e.getMessage(), e.getClass().getName()); Notifications.Bus.notify(new Notification("Print", CommonBundle.getErrorTitle(), message, NotificationType.ERROR)); } catch (Exception e) { LOG.error(e); } finally { painter.dispose(); } } }); }