@Override
  public void runWhenProjectIsInitialized(@NotNull final Runnable action) {
    final Application application = ApplicationManager.getApplication();
    if (application == null) return;

    //noinspection SynchronizeOnThis
    synchronized (this) {
      // in tests which simulate project opening, post-startup activities could have been run
      // already.
      // Then we should act as if the project was initialized
      boolean initialized =
          myProject.isInitialized()
              || application.isUnitTestMode() && myPostStartupActivitiesPassed;
      if (!initialized) {
        registerPostStartupActivity(action);
        return;
      }
    }

    Runnable runnable =
        new Runnable() {
          @Override
          public void run() {
            if (!myProject.isDisposed()) {
              action.run();
            }
          }
        };
    if (application.isDispatchThread() && ModalityState.current() == ModalityState.NON_MODAL) {
      runnable.run();
    } else {
      application.invokeLater(runnable, ModalityState.NON_MODAL);
    }
  }
  public synchronized void runWhenProjectIsInitialized(@NotNull final Runnable action) {
    final Runnable runnable;

    final Application application = ApplicationManager.getApplication();
    if (DumbService.isDumbAware(action)) {
      runnable =
          new DumbAwareRunnable() {
            public void run() {
              application.runWriteAction(action);
            }
          };
    } else {
      runnable =
          new Runnable() {
            public void run() {
              application.runWriteAction(action);
            }
          };
    }

    if (myProject.isInitialized()
        || application.isUnitTestMode() && myPostStartupActivitiesPassed) {
      // in tests which simulate project opening, post-startup activities could have been run
      // already.
      // Then we should act as if the project was initialized
      UIUtil.invokeLaterIfNeeded(
          new Runnable() {
            public void run() {
              if (!myProject.isDisposed()) {
                runnable.run();
              }
            }
          });
    } else {
      registerPostStartupActivity(runnable);
    }
  }