/* (non-Javadoc)
   * @see com.netlight.layout.runner.ILayoutRunnerPhase#execute(com.netlight.layout.runner.LayoutRunner)
   */
  @Override
  public void execute(ILayoutRunner runner, boolean stopThreadWhenDone) {
    IHierarchicalNodeLayout layout = runner.getLayout();
    IHierarchicalNodeModel model = layout.getModel();
    IBreakCriteria criteria = runner.getBreakCriteria();
    LayoutRunnerConfiguration settings = runner.getConfiguration();

    // int n = 0;

    if (layout != null) {
      while (runner.isRunning()) {
        runner.visit(layout);
        // fit view
        if (settings.isAllowAutoFitAtStepEnd()) runner.autoFit(model);

        // break using criteria?
        if (criteria != null)
          if (criteria.shouldBreak(layout)) {
            criteria.onBreak();

            if (stopThreadWhenDone) runner.setRunning(false, true);
            // no using runner.stop because this destroy our thread :)

            break;
          }

        // break because of ended algorithm
        if (!layout.canAlgo()) {
          if (stopThreadWhenDone) runner.setRunning(false, true);
          break;
        }
      }
    }
  }