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());
     m_l4Choiche.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.getIntVal() == 0) {

        m_btnNext.setEnabled(false);
        m_btnEnd.setEnabled(false);
        m_dpTable.clearAllArrows();
        m_dpTable.clearGridCircle();

        m_dpTable.clearInteractiveCells();
        m_dpTable.clearDPHighlights();
     }
     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;
  }