protected void stepFWDBackTrack(boolean showSteps) {

      // Global alignment: start from D(m,n)

      // TODO: Not very elegant. To be changed!
      CellElement theOneBefore = null;
      if (!m_backTrackList.isEmpty()) {
         theOneBefore = (CellElement) m_backTrackList.getLast();
      }

      if (m_backtrackLastSel == null) {
         // Policy for automatic pointer selection!!
         m_backTrackList.add(theOneBefore.getPointerWithPolicy(
             m_backtrackingPolicy));
      }
      else {
         m_backTrackList.add(m_backtrackLastSel);
      }

      CellElement currentCell = (CellElement) m_backTrackList.getLast();

      if (m_backTrackList.size() > 1) {
         setResultString(theOneBefore, currentCell);
      }

      Point D = new Point(currentCell.getColumn() - 1, currentCell.getRow() - 1);

      m_l1Choiche.setBackground(m_mainPane.getBackground());
      m_l2Choiche.setBackground(m_mainPane.getBackground());
      m_l3Choiche.setBackground(m_mainPane.getBackground());

      CellElement leftCell = currentCell.getLeftPointer();
      CellElement topCell = currentCell.getTopPointer();
      CellElement topLeftCell = currentCell.getDiagPointer();

      String DEqual = "D(" + (D.y) + ", " + (D.x) + ") = Select";
      String DLeft = "";
      String DTop = "";
      String DTopLeft = "";

      m_dpTable.clearInteractiveCells();

      // Init choosen array
      LinkedList highlightList = new LinkedList();

      if (leftCell == null) {
         DLeft = "No Pointer";
      }
      else {
         DLeft = "D(" + (leftCell.getRow() - 1) + ", " +
             (leftCell.getColumn() - 1) + ")";
         m_dpTable.addInteractiveCell(leftCell);
         highlightList.add(leftCell);
      }

      if (topCell == null) {
         DTop = "No Pointer";
      }
      else {
         DTop = "D(" + (topCell.getRow() - 1) + ", " +
             (topCell.getColumn() - 1) + ")";
         m_dpTable.addInteractiveCell(topCell);
         highlightList.add(topCell);
      }

      if (topLeftCell == null) {
         DTopLeft = "No Pointer";
      }
      else {
         DTopLeft = "D(" + (topLeftCell.getRow() - 1) + ", " +
             (topLeftCell.getColumn() - 1) + ")";
         m_dpTable.addInteractiveCell(topLeftCell);
         highlightList.add(topLeftCell);
      }

      m_lDEqual.setText(DEqual);
      m_l1Choiche.setText(DLeft);
      m_l2Choiche.setText(DTop);
      m_l3Choiche.setText(DTopLeft);

      m_dpTable.setTriArrows(currentCell, false);
      m_dpTable.setMultipleCellHighlight(highlightList);

      currentCell.setColor(Color.green);

      if (currentCell.getColumn() == 1 &&
          currentCell.getRow() == 1) {

         m_btnNext.setEnabled(false);
         m_btnEnd.setEnabled(false);
         m_dpTable.clearAllArrows();
         m_dpTable.clearGridCircle();
      }
      else {
         // TODO: Not elegant. To be changed
         m_btnNext.setEnabled(true);
         m_btnEnd.setEnabled(true);
      }

      if (showSteps) {
         m_dpTable.paint(m_dpTable.getGraphics());
      }

      m_backtrackLastSel = null;
   }