protected CompileCppDialog(
        Project _project, CompileHandler compilerHandler, CompileCppOptions options) {
      super(_project, false);

      project = _project;
      setModal(true);

      doRun.addItemListener(
          new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
              final boolean b = doRun.isSelected();
              executableFileName.setEnabled(b);
              executableFileName.setEditable(b);
            }
          });

      executableFileName.getEditor().setItem(options != null ? options.getOutputFileName() : "");
      doRun.setSelected(lastRunStatus);

      final CppSupportLoader loader = CppSupportLoader.getInstance(project);
      final String compileParameters = loader.getAdditionalCompileParameters();

      compileProperties.setText(
          (compileParameters != null && compileParameters.length() > 0
                  ? compileParameters + " "
                  : "")
              + CompileHandler.MARKER);

      setTitle(CppBundle.message("compile.cpp.file.dialog.title"));

      compilerSelector.setModel(
          new DefaultComboBoxModel(CppSupportSettings.CompilerSelectOptions.values()));
      compilerSelector.setSelectedItem(getCurrentCompilerOption(project));

      setSelectedProjectCompile();

      includeProjectCompileParametersCheckBox.addItemListener(
          new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
              setSelectedProjectCompile();
            }
          });

      includeProjectCompileParametersCheckBox.setSelected(loader.isIncludeProjectSettings());
      final String compileParametersText = compilerHandler.buildProjectCompileOptions(project);
      projectCompileParameters.setText(compileParametersText != null ? compileParametersText : "");

      init();
    }
  private void invoke(final Project project, final VirtualFile file, CompileCppOptions _options) {
    CompileHandler handler = getCompileHandler(CompileCppDialog.getCurrentCompilerOption(project));

    final CompileCppDialog dialog = new CompileCppDialog(project, handler, _options);
    dialog.show();
    if (dialog.getExitCode() != DialogWrapper.OK_EXIT_CODE) return;

    _options =
        new CompileCppOptions() {
          public String getCompilerOptions() {
            return dialog.getCompilerOptions();
          }

          public String getProjectCompilerOptions() {
            return dialog.getProjectCompilerOptions();
          }

          public boolean doRun() {
            return dialog.doRun();
          }

          public String getOutputFileName() {
            final String fileName = dialog.getOutputFileName();
            return fileName.length() > 0 ? fileName : null;
          }

          public Project getProject() {
            return project;
          }

          public boolean isCppFile() {
            return "cpp".endsWith(file.getExtension());
          }
        };

    final CompileCppOptions options = _options;
    handler = getCompileHandler(CompileCppDialog.getCurrentCompilerOption(project));
    List<String> runCommand = handler.buildCommand(file, options);

    if (runCommand == null) throw new RuntimeException("Cannot invoke compilation");

    final Map<String, String> commandLineProperties = handler.getCommandLineProperties();

    final String baseForExecutableFile = file.getParent().getPath() + File.separatorChar;
    final String fileToExecute = baseForExecutableFile + handler.getOutputFileName(file, options);
    new File(fileToExecute).delete();

    final ConsoleBuilder consoleBuilderRef[] = new ConsoleBuilder[1];
    Runnable action =
        new Runnable() {
          public void run() {
            if (options.doRun() && new File(fileToExecute).exists()) {
              new ConsoleBuilder(
                      "Run " + file.getName(),
                      new BuildState(
                          Arrays.asList(fileToExecute),
                          new File(file.getParent().getPath()),
                          commandLineProperties),
                      project,
                      null,
                      new Runnable() {
                        public void run() {
                          invoke(project, file, options);
                        }
                      },
                      new Runnable() {
                        public void run() {
                          consoleBuilderRef[0].start();
                        }
                      },
                      null)
                  .start();
            }
          }
        };

    final ConsoleBuilder consoleBuilder =
        new ConsoleBuilder(
            "Compile File " + file.getName(),
            new BuildState(runCommand, new File(file.getParent().getPath()), commandLineProperties),
            project,
            handler.getCompileLogFilter(file, options),
            new Runnable() {
              public void run() {
                invoke(project, file, options);
              }
            },
            null,
            action);
    consoleBuilderRef[0] = consoleBuilder;
    consoleBuilder.start();
  }