/**
 *
 */
public class DebuggerFrame extends javax.swing.JFrame {

  /** Initializes the Form */
  public DebuggerFrame() {
    initComponents ();
    pack ();
  }

  /** This method is called from within the constructor to
   * initialize the form.
   * WARNING: Do NOT modify this code. The content of this method is
   * always regenerated by the FormEditor.
   */
  private void initComponents () {//GEN-BEGIN:initComponents
    setResizable (false);
    setTitle ("PICDebugger");
    setFont (new java.awt.Font ("Monospaced", 0, 12));
    addWindowListener (new java.awt.event.WindowAdapter () {
        public void windowClosing (java.awt.event.WindowEvent evt) {
          exitForm (evt);
        }
      }
    );
    getContentPane ().setLayout (new java.awt.GridBagLayout ());
    java.awt.GridBagConstraints gridBagConstraints1;

    LeftPanel = new javax.swing.JPanel ();
    LeftPanel.setPreferredSize (new java.awt.Dimension(300, 400));
    LeftPanel.setMaximumSize (new java.awt.Dimension(300, 400));
    LeftPanel.setMinimumSize (new java.awt.Dimension(300, 400));
    LeftPanel.setLayout (new java.awt.CardLayout ());

      TabbedPane = new javax.swing.JTabbedPane ();

        ProgramPanel = new javax.swing.JPanel ();
        ProgramPanel.setToolTipText ("Program loaded into the PIC.");
        ProgramPanel.setName ("null");
        ProgramPanel.setLayout (new java.awt.BorderLayout ());

          ProgramScrollPane = new javax.swing.JScrollPane ();
          ProgramScrollPane.setPreferredSize (new java.awt.Dimension(290, 300));
          ProgramScrollPane.setMaximumSize (new java.awt.Dimension(290, 300));
          ProgramScrollPane.setMinimumSize (new java.awt.Dimension(290, 300));

            ProgramList = new javax.swing.JList ();
            ProgramList.setToolTipText ("Disassembled program loaded into the PIC.");
            ProgramList.setSelectionMode (javax.swing.ListSelectionModel.SINGLE_SELECTION);
            ProgramList.setFont (new java.awt.Font ("Monospaced", 0, 12));

          ProgramScrollPane.setViewportView (ProgramList);
          ProgramPanel.add (ProgramScrollPane, "North");

          ProgramBottomPanel = new javax.swing.JPanel ();
          ProgramBottomPanel.setLayout (new java.awt.BorderLayout ());

            SetPCButton = new javax.swing.JButton ();
            SetPCButton.setToolTipText ("Sets PC to be the selected instruction.");
            SetPCButton.setText ("Set PC");
            SetPCButton.addActionListener (new java.awt.event.ActionListener () {
                public void actionPerformed (java.awt.event.ActionEvent evt) {
                  SetPCButtonActionPerformed (evt);
                }
              }
            );
            ProgramBottomPanel.add (SetPCButton, "Center");

            GotoPCButton = new javax.swing.JButton ();
            GotoPCButton.setToolTipText ("Sets selection to PC.");
            GotoPCButton.setText ("Goto PC");
            GotoPCButton.addActionListener (new java.awt.event.ActionListener () {
                public void actionPerformed (java.awt.event.ActionEvent evt) {
                  GotoPCButtonActionPerformed (evt);
                }
              }
            );
            ProgramBottomPanel.add (GotoPCButton, "East");

            LoadAndSaveProgramPanel = new javax.swing.JPanel ();
            LoadAndSaveProgramPanel.setLayout (new java.awt.BorderLayout ());

              LoadButton = new javax.swing.JButton ();
              LoadButton.setToolTipText ("Loads a program.");
              LoadButton.setText ("Load");
              LoadButton.setActionCommand ("Load");
              LoadButton.addActionListener (new java.awt.event.ActionListener () {
                  public void actionPerformed (java.awt.event.ActionEvent evt) {
                    LoadButtonActionPerformed (evt);
                  }
                }
              );
              LoadAndSaveProgramPanel.add (LoadButton, "West");

              SaveProgramButton = new javax.swing.JButton ();
              SaveProgramButton.setToolTipText ("Saves the disassembled program loaded into the PIC.");
              SaveProgramButton.setText ("Save");
              SaveProgramButton.addActionListener (new java.awt.event.ActionListener () {
                  public void actionPerformed (java.awt.event.ActionEvent evt) {
                    SaveProgramButtonActionPerformed (evt);
                  }
                }
              );
              LoadAndSaveProgramPanel.add (SaveProgramButton, "East");

            ProgramBottomPanel.add (LoadAndSaveProgramPanel, "North");

            SetRemoveBPBouton = new javax.swing.JButton ();
            SetRemoveBPBouton.setToolTipText ("Sets/Removes a breakpoint at the selected position.");
            SetRemoveBPBouton.setText ("Breakpoint");
            SetRemoveBPBouton.addActionListener (new java.awt.event.ActionListener () {
                public void actionPerformed (java.awt.event.ActionEvent evt) {
                  SetRemoveBPBoutonActionPerformed (evt);
                }
              }
            );
            ProgramBottomPanel.add (SetRemoveBPBouton, "West");

          ProgramPanel.add (ProgramBottomPanel, "South");

        TabbedPane.addTab ("Program", ProgramPanel);

        SourcePanel = new javax.swing.JPanel ();
        SourcePanel.setToolTipText ("Source code to assemble.");
        SourcePanel.setLayout (new java.awt.BorderLayout ());

          SourceScrollPane = new javax.swing.JScrollPane ();
          SourceScrollPane.setPreferredSize (new java.awt.Dimension(290, 290));
          SourceScrollPane.setMaximumSize (new java.awt.Dimension(290, 290));
          SourceScrollPane.setMinimumSize (new java.awt.Dimension(290, 290));

            SourceTextArea = new javax.swing.JTextArea ();

          SourceScrollPane.setViewportView (SourceTextArea);
          SourcePanel.add (SourceScrollPane, "North");

          SourceBottomPanel = new javax.swing.JPanel ();
          SourceBottomPanel.setLayout (new java.awt.BorderLayout ());

            AssembleAndLoadButton = new javax.swing.JButton ();
            AssembleAndLoadButton.setToolTipText ("Assembles the source code above and loads the program into the PIC.");
            AssembleAndLoadButton.setText ("Assemble and load");
            AssembleAndLoadButton.addActionListener (new java.awt.event.ActionListener () {
                public void actionPerformed (java.awt.event.ActionEvent evt) {
                  AssembleAndLoadButtonActionPerformed (evt);
                }
              }
            );
            SourceBottomPanel.add (AssembleAndLoadButton, "South");

            LoadFileButton = new javax.swing.JButton ();
            LoadFileButton.setToolTipText ("Loads a file.");
            LoadFileButton.setText ("Load File");
            LoadFileButton.addActionListener (new java.awt.event.ActionListener () {
                public void actionPerformed (java.awt.event.ActionEvent evt) {
                  LoadFileButtonActionPerformed (evt);
                }
              }
            );
            SourceBottomPanel.add (LoadFileButton, "West");

            AssemblerOutputTextField = new javax.swing.JTextField ();
            AssemblerOutputTextField.setToolTipText ("Assembler output.");
            AssemblerOutputTextField.setEditable (false);
            SourceBottomPanel.add (AssemblerOutputTextField, "North");

            SaveFileButton = new javax.swing.JButton ();
            SaveFileButton.setToolTipText ("Saves the file above.");
            SaveFileButton.setText ("Save File");
            SaveFileButton.addActionListener (new java.awt.event.ActionListener () {
                public void actionPerformed (java.awt.event.ActionEvent evt) {
                  SaveFileButtonActionPerformed (evt);
                }
              }
            );
            SourceBottomPanel.add (SaveFileButton, "East");

          SourcePanel.add (SourceBottomPanel, "South");

        TabbedPane.addTab ("Source", SourcePanel);

        SymbolicPanel = new javax.swing.JPanel ();
        SymbolicPanel.setToolTipText ("Symbolic information.");
        SymbolicPanel.setLayout (new java.awt.BorderLayout ());

          LabelsPanel = new javax.swing.JPanel ();
          LabelsPanel.setLayout (new java.awt.BorderLayout ());

            LabelsLabel = new javax.swing.JLabel ();
            LabelsLabel.setHorizontalTextPosition (javax.swing.SwingConstants.CENTER);
            LabelsLabel.setText ("Labels");
            LabelsLabel.setHorizontalAlignment (javax.swing.SwingConstants.CENTER);
            LabelsPanel.add (LabelsLabel, "North");

            LabelsScrollPane = new javax.swing.JScrollPane ();
            LabelsScrollPane.setPreferredSize (new java.awt.Dimension(200, 170));
            LabelsScrollPane.setMaximumSize (new java.awt.Dimension(200, 170));
            LabelsScrollPane.setMinimumSize (new java.awt.Dimension(200, 170));

              LabelsList = new javax.swing.JList ();
              LabelsList.setToolTipText ("Symbolic information labels.");
              LabelsList.setFont (new java.awt.Font ("Monospaced", 0, 12));
              LabelsList.addMouseListener (new java.awt.event.MouseAdapter () {
                  public void mouseClicked (java.awt.event.MouseEvent evt) {
                    LabelsListMouseClicked (evt);
                  }
                }
              );

            LabelsScrollPane.setViewportView (LabelsList);
            LabelsPanel.add (LabelsScrollPane, "Center");

          SymbolicPanel.add (LabelsPanel, "North");

          VariablesPanel = new javax.swing.JPanel ();
          VariablesPanel.setLayout (new java.awt.BorderLayout ());

            VariablesLabel = new javax.swing.JLabel ();
            VariablesLabel.setHorizontalTextPosition (javax.swing.SwingConstants.CENTER);
            VariablesLabel.setText ("Variables");
            VariablesLabel.setHorizontalAlignment (javax.swing.SwingConstants.CENTER);
            VariablesPanel.add (VariablesLabel, "North");

            VariablesScrollPane = new javax.swing.JScrollPane ();
            VariablesScrollPane.setToolTipText ("Symbolic information variables.");
            VariablesScrollPane.setPreferredSize (new java.awt.Dimension(200, 170));
            VariablesScrollPane.setMaximumSize (new java.awt.Dimension(200, 170));
            VariablesScrollPane.setMinimumSize (new java.awt.Dimension(200, 170));

              VariablesList = new javax.swing.JList ();
              VariablesList.setToolTipText ("Symbolic information variables.");
              VariablesList.setFont (new java.awt.Font ("Monospaced", 0, 12));
              VariablesList.addMouseListener (new java.awt.event.MouseAdapter () {
                  public void mouseClicked (java.awt.event.MouseEvent evt) {
                    VariablesListMouseClicked (evt);
                  }
                }
              );

            VariablesScrollPane.setViewportView (VariablesList);
            VariablesPanel.add (VariablesScrollPane, "Center");

          SymbolicPanel.add (VariablesPanel, "South");

        TabbedPane.addTab ("Symbolic", SymbolicPanel);

        OptionPanel = new javax.swing.JPanel ();
        OptionPanel.setToolTipText ("PICDebugger options.");
        OptionPanel.setLayout (new javax.swing.BoxLayout (OptionPanel, 1));

          UseSymbolicCheckBox = new javax.swing.JCheckBox ();
          UseSymbolicCheckBox.setText ("Use symbolic information.");
          UseSymbolicCheckBox.addActionListener (new java.awt.event.ActionListener () {
              public void actionPerformed (java.awt.event.ActionEvent evt) {
                UseSymbolicCheckBoxActionPerformed (evt);
              }
            }
          );
          OptionPanel.add (UseSymbolicCheckBox);

          SaveAsCodCheckBox = new javax.swing.JCheckBox ();
          SaveAsCodCheckBox.setText ("Save binary files as .cod rather than as .hex.");
          SaveAsCodCheckBox.addActionListener (new java.awt.event.ActionListener () {
              public void actionPerformed (java.awt.event.ActionEvent evt) {
                SaveAsCodCheckBoxActionPerformed (evt);
              }
            }
          );
          OptionPanel.add (SaveAsCodCheckBox);

        TabbedPane.addTab ("Options", OptionPanel);

      LeftPanel.add (TabbedPane, "card2");

    gridBagConstraints1 = new java.awt.GridBagConstraints ();
    getContentPane ().add (LeftPanel, gridBagConstraints1);

    RightPanel = new javax.swing.JPanel ();
    RightPanel.setPreferredSize (new java.awt.Dimension(300, 400));
    RightPanel.setMaximumSize (new java.awt.Dimension(300, 400));
    RightPanel.setMinimumSize (new java.awt.Dimension(300, 400));
    RightPanel.setLayout (new java.awt.BorderLayout ());

      RightTopPanel = new javax.swing.JPanel ();
      RightTopPanel.setPreferredSize (new java.awt.Dimension(180, 170));
      RightTopPanel.setMaximumSize (new java.awt.Dimension(180, 170));
      RightTopPanel.setLayout (new java.awt.BorderLayout ());

        StackScrollPane = new javax.swing.JScrollPane ();
        StackScrollPane.setPreferredSize (new java.awt.Dimension(90, 120));
        StackScrollPane.setMaximumSize (new java.awt.Dimension(90, 120));
        StackScrollPane.setMinimumSize (new java.awt.Dimension(90, 120));

          StackList = new javax.swing.JList ();
          StackList.setToolTipText ("CPU stack.");
          StackList.setSelectionMode (javax.swing.ListSelectionModel.SINGLE_SELECTION);
          StackList.setFont (new java.awt.Font ("Monospaced", 0, 12));
          StackList.addMouseListener (new java.awt.event.MouseAdapter () {
              public void mouseClicked (java.awt.event.MouseEvent evt) {
                StackListMouseClicked (evt);
              }
            }
          );

        StackScrollPane.setViewportView (StackList);
        RightTopPanel.add (StackScrollPane, "Center");

        RightTopTopPanel = new javax.swing.JPanel ();
        RightTopTopPanel.setLayout (new java.awt.BorderLayout ());

          CPULabel = new javax.swing.JLabel ();
          CPULabel.setHorizontalTextPosition (javax.swing.SwingConstants.CENTER);
          CPULabel.setText ("CPU");
          CPULabel.setHorizontalAlignment (javax.swing.SwingConstants.CENTER);
          RightTopTopPanel.add (CPULabel, "Center");

          RightTopTopBottomPanel = new javax.swing.JPanel ();
          RightTopTopBottomPanel.setLayout (new java.awt.BorderLayout ());

            CPUStateLabel = new javax.swing.JLabel ();
            CPUStateLabel.setHorizontalTextPosition (javax.swing.SwingConstants.LEFT);
            CPUStateLabel.setText ("CPU State");
            CPUStateLabel.setHorizontalAlignment (javax.swing.SwingConstants.LEFT);
            RightTopTopBottomPanel.add (CPUStateLabel, "West");

            StackLabel = new javax.swing.JLabel ();
            StackLabel.setHorizontalTextPosition (javax.swing.SwingConstants.CENTER);
            StackLabel.setText ("Stack");
            StackLabel.setHorizontalAlignment (javax.swing.SwingConstants.CENTER);
            RightTopTopBottomPanel.add (StackLabel, "Center");

            BreakpointsLabel = new javax.swing.JLabel ();
            BreakpointsLabel.setText ("Breakpoints");
            RightTopTopBottomPanel.add (BreakpointsLabel, "East");

          RightTopTopPanel.add (RightTopTopBottomPanel, "South");

        RightTopPanel.add (RightTopTopPanel, "North");

        BreakpointsScrollPane = new javax.swing.JScrollPane ();
        BreakpointsScrollPane.setPreferredSize (new java.awt.Dimension(90, 120));
        BreakpointsScrollPane.setMaximumSize (new java.awt.Dimension(90, 120));
        BreakpointsScrollPane.setMinimumSize (new java.awt.Dimension(90, 120));

          BreakpointsList = new javax.swing.JList ();
          BreakpointsList.setToolTipText ("Breakpoints.");
          BreakpointsList.setSelectionMode (javax.swing.ListSelectionModel.SINGLE_SELECTION);
          BreakpointsList.setFont (new java.awt.Font ("Monospaced", 0, 12));
          BreakpointsList.addMouseListener (new java.awt.event.MouseAdapter () {
              public void mouseClicked (java.awt.event.MouseEvent evt) {
                BreakpointsListMouseClicked (evt);
              }
            }
          );

        BreakpointsScrollPane.setViewportView (BreakpointsList);
        RightTopPanel.add (BreakpointsScrollPane, "East");

        CPUStateList = new javax.swing.JList ();
        CPUStateList.setToolTipText ("CPU's internal registers.");
        CPUStateList.setBackground (java.awt.Color.lightGray);
        CPUStateList.setSelectionMode (javax.swing.ListSelectionModel.SINGLE_SELECTION);
        CPUStateList.setFont (new java.awt.Font ("Monospaced", 0, 12));
        CPUStateList.addMouseListener (new java.awt.event.MouseAdapter () {
            public void mouseClicked (java.awt.event.MouseEvent evt) {
              CPUStateListMouseClicked (evt);
            }
          }
        );
        RightTopPanel.add (CPUStateList, "West");

      RightPanel.add (RightTopPanel, "North");

      RightBottomPanel = new javax.swing.JPanel ();
      RightBottomPanel.setLayout (new java.awt.BorderLayout ());

        TraceButton = new javax.swing.JButton ();
        TraceButton.setToolTipText ("Executes one instruction.");
        TraceButton.setText ("Trace");
        TraceButton.addActionListener (new java.awt.event.ActionListener () {
            public void actionPerformed (java.awt.event.ActionEvent evt) {
              TraceButtonActionPerformed (evt);
            }
          }
        );
        RightBottomPanel.add (TraceButton, "West");

        RunButton = new javax.swing.JButton ();
        RunButton.setToolTipText ("Runs/Stops  the program.");
        RunButton.setText ("Run");
        RunButton.addActionListener (new java.awt.event.ActionListener () {
            public void actionPerformed (java.awt.event.ActionEvent evt) {
              RunButtonActionPerformed (evt);
            }
          }
        );
        RightBottomPanel.add (RunButton, "North");

        AnimateButton = new javax.swing.JButton ();
        AnimateButton.setToolTipText ("Animated run of the program.");
        AnimateButton.setText ("Animate");
        AnimateButton.addActionListener (new java.awt.event.ActionListener () {
            public void actionPerformed (java.awt.event.ActionEvent evt) {
              AnimateButttonActionPerformed (evt);
            }
          }
        );
        RightBottomPanel.add (AnimateButton, "East");

        StepOverButton = new javax.swing.JButton ();
        StepOverButton.setToolTipText ("Steps over calls.");
        StepOverButton.setText ("Step over");
        StepOverButton.addActionListener (new java.awt.event.ActionListener () {
            public void actionPerformed (java.awt.event.ActionEvent evt) {
              StepOverButtonActionPerformed (evt);
            }
          }
        );
        RightBottomPanel.add (StepOverButton, "Center");

      RightPanel.add (RightBottomPanel, "South");

      FileRegistersPanel = new javax.swing.JPanel ();
      FileRegistersPanel.setLayout (new java.awt.BorderLayout ());

        FileRegistersScrollPane = new javax.swing.JScrollPane ();
        FileRegistersScrollPane.setPreferredSize (new java.awt.Dimension(290, 150));
        FileRegistersScrollPane.setMaximumSize (new java.awt.Dimension(290, 150));
        FileRegistersScrollPane.setMinimumSize (new java.awt.Dimension(290, 150));

          FileRegistersList = new javax.swing.JList ();
          FileRegistersList.setToolTipText ("File registers.");
          FileRegistersList.setSelectionMode (javax.swing.ListSelectionModel.SINGLE_SELECTION);
          FileRegistersList.setFont (new java.awt.Font ("Monospaced", 0, 12));
          FileRegistersList.addMouseListener (new java.awt.event.MouseAdapter () {
              public void mouseClicked (java.awt.event.MouseEvent evt) {
                FileRegistersListMouseClicked (evt);
              }
            }
          );

        FileRegistersScrollPane.setViewportView (FileRegistersList);
        FileRegistersPanel.add (FileRegistersScrollPane, "South");

        FileRegistersLabel = new javax.swing.JLabel ();
        FileRegistersLabel.setHorizontalTextPosition (javax.swing.SwingConstants.CENTER);
        FileRegistersLabel.setPreferredSize (new java.awt.Dimension(77, 25));
        FileRegistersLabel.setMaximumSize (new java.awt.Dimension(77, 25));
        FileRegistersLabel.setMinimumSize (new java.awt.Dimension(77, 25));
        FileRegistersLabel.setText ("File Registers");
        FileRegistersLabel.setHorizontalAlignment (javax.swing.SwingConstants.CENTER);
        FileRegistersPanel.add (FileRegistersLabel, "North");

      RightPanel.add (FileRegistersPanel, "Center");

    gridBagConstraints1 = new java.awt.GridBagConstraints ();
    getContentPane ().add (RightPanel, gridBagConstraints1);

  }//GEN-END:initComponents

  private void UseSymbolicCheckBoxActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_UseSymbolicCheckBoxActionPerformed
    // Add your handling code here:
  }//GEN-LAST:event_UseSymbolicCheckBoxActionPerformed

  private void SaveAsCodCheckBoxActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SaveAsCodCheckBoxActionPerformed
    // Add your handling code here:
  }//GEN-LAST:event_SaveAsCodCheckBoxActionPerformed

  private void VariablesListMouseClicked (java.awt.event.MouseEvent evt) {//GEN-FIRST:event_VariablesListMouseClicked
    // Add your handling code here:
  }//GEN-LAST:event_VariablesListMouseClicked

  private void LabelsListMouseClicked (java.awt.event.MouseEvent evt) {//GEN-FIRST:event_LabelsListMouseClicked
    int i = Link.modele().getLabelAddress(LabelsList.getSelectedIndex());
    ProgramList.setSelectedIndex(i);
    ProgramList.ensureIndexIsVisible(i);
  }//GEN-LAST:event_LabelsListMouseClicked

  private void AssembleAndLoadButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AssembleAndLoadButtonActionPerformed
    Link.modele().UpdateSource(SourceTextArea.getText());
    Link.modele().AssembleAndLoadSource();
  }//GEN-LAST:event_AssembleAndLoadButtonActionPerformed

  private void SaveFileButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SaveFileButtonActionPerformed
    Link.modele().UpdateSource(SourceTextArea.getText());
    Link.modele().SaveSource("a.asm");
  }//GEN-LAST:event_SaveFileButtonActionPerformed

  private void LoadFileButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_LoadFileButtonActionPerformed
    javax.swing.JFileChooser chooser = new javax.swing.JFileChooser(".");
    ExampleFileFilter filter = new ExampleFileFilter();
    filter.addExtension("asm");
    chooser.setFileFilter(filter);
    int returnVal = chooser.showOpenDialog(this);
    if(returnVal == javax.swing.JFileChooser.APPROVE_OPTION) {
            Link.modele().LoadSource(chooser.getSelectedFile().getName());
    }
  }//GEN-LAST:event_LoadFileButtonActionPerformed

  private void StepOverButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_StepOverButtonActionPerformed
    Link.modele().StepOver();
  }//GEN-LAST:event_StepOverButtonActionPerformed

  private void FileRegistersListMouseClicked (java.awt.event.MouseEvent evt) {//GEN-FIRST:event_FileRegistersListMouseClicked
    Link.modele().setRAM(FileRegistersList.getSelectedIndex());
  }//GEN-LAST:event_FileRegistersListMouseClicked

  private void SaveProgramButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SaveProgramButtonActionPerformed
    Link.modele().SaveProgram("a.hex");
  }//GEN-LAST:event_SaveProgramButtonActionPerformed

  private void StackListMouseClicked (java.awt.event.MouseEvent evt) {//GEN-FIRST:event_StackListMouseClicked
    Link.modele().setStack(StackList.getSelectedIndex());
  }//GEN-LAST:event_StackListMouseClicked

  private void GotoPCButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_GotoPCButtonActionPerformed
    int i = Link.modele().getPC();
    ProgramList.setSelectedIndex(i);
    ProgramList.ensureIndexIsVisible(i);
  }//GEN-LAST:event_GotoPCButtonActionPerformed

  private void SetPCButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SetPCButtonActionPerformed
    Link.modele().setPC(ProgramList.getSelectedIndex());
  }//GEN-LAST:event_SetPCButtonActionPerformed

  private void CPUStateListMouseClicked (java.awt.event.MouseEvent evt) {//GEN-FIRST:event_CPUStateListMouseClicked
    Link.modele().ModifyState(CPUStateList.getSelectedIndex());
  }//GEN-LAST:event_CPUStateListMouseClicked

  private void BreakpointsListMouseClicked (java.awt.event.MouseEvent evt) {//GEN-FIRST:event_BreakpointsListMouseClicked
    int i = Link.modele().GetBreakpoint(BreakpointsList.getSelectedIndex());
    ProgramList.setSelectedIndex(i);
    ProgramList.ensureIndexIsVisible(i);
  }//GEN-LAST:event_BreakpointsListMouseClicked

  private void AnimateButttonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_AnimateButttonActionPerformed
    if(Link.modele().Running()) {
      Link.modele().Stop();
    }
    else {
      Link.modele().Animate();
      RunButton.setText("Stop");
      AnimateButton.setEnabled(false);
      TraceButton.setEnabled(false);
      StepOverButton.setEnabled(false);
    }
  }//GEN-LAST:event_AnimateButttonActionPerformed

  private void RunButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_RunButtonActionPerformed
    if(Link.modele().Running()) {
      Link.modele().Stop();
    }
    else {
      Link.modele().Run();
      RunButton.setText("Stop");
      AnimateButton.setEnabled(false);
      TraceButton.setEnabled(false);
      StepOverButton.setEnabled(false);
    }
  }//GEN-LAST:event_RunButtonActionPerformed

  private void TraceButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_TraceButtonActionPerformed
    Link.modele().Trace();
  }//GEN-LAST:event_TraceButtonActionPerformed

  private void LoadButtonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_LoadButtonActionPerformed
    javax.swing.JFileChooser chooser = new javax.swing.JFileChooser(".");
    ExampleFileFilter filter = new ExampleFileFilter();
    filter.addExtension("hex");
    filter.addExtension("cod");
    chooser.setFileFilter(filter);
    int returnVal = chooser.showOpenDialog(this);
    if(returnVal == javax.swing.JFileChooser.APPROVE_OPTION) {
            Link.modele().LoadProgram(chooser.getSelectedFile().getName());
    }
  }//GEN-LAST:event_LoadButtonActionPerformed

  private void SetRemoveBPBoutonActionPerformed (java.awt.event.ActionEvent evt) {//GEN-FIRST:event_SetRemoveBPBoutonActionPerformed
    int i = ProgramList.getSelectedIndex();
    if(Link.modele().IsBreakpoint(i))
      Link.modele().RemoveBreakpoint(i);
    else
      Link.modele().SetBreakpoint(i);
  }//GEN-LAST:event_SetRemoveBPBoutonActionPerformed

  /** Exit the Application */
  private void exitForm(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_exitForm
    System.exit (0);
  }//GEN-LAST:event_exitForm


// Variables declaration - do not modify//GEN-BEGIN:variables
  private javax.swing.JPanel LeftPanel;
  private javax.swing.JPanel RightPanel;
  private javax.swing.JTabbedPane TabbedPane;
  private javax.swing.JPanel ProgramPanel;
  private javax.swing.JPanel SourcePanel;
  private javax.swing.JPanel SymbolicPanel;
  private javax.swing.JPanel OptionPanel;
  private javax.swing.JScrollPane ProgramScrollPane;
  private javax.swing.JPanel ProgramBottomPanel;
  private javax.swing.JList ProgramList;
  private javax.swing.JButton SetPCButton;
  private javax.swing.JButton GotoPCButton;
  private javax.swing.JPanel LoadAndSaveProgramPanel;
  private javax.swing.JButton SetRemoveBPBouton;
  private javax.swing.JButton LoadButton;
  private javax.swing.JButton SaveProgramButton;
  private javax.swing.JScrollPane SourceScrollPane;
  private javax.swing.JPanel SourceBottomPanel;
  private javax.swing.JTextArea SourceTextArea;
  private javax.swing.JButton AssembleAndLoadButton;
  private javax.swing.JButton LoadFileButton;
  private javax.swing.JTextField AssemblerOutputTextField;
  private javax.swing.JButton SaveFileButton;
  private javax.swing.JPanel LabelsPanel;
  private javax.swing.JPanel VariablesPanel;
  private javax.swing.JLabel LabelsLabel;
  private javax.swing.JScrollPane LabelsScrollPane;
  private javax.swing.JList LabelsList;
  private javax.swing.JLabel VariablesLabel;
  private javax.swing.JScrollPane VariablesScrollPane;
  private javax.swing.JList VariablesList;
  private javax.swing.JCheckBox UseSymbolicCheckBox;
  private javax.swing.JCheckBox SaveAsCodCheckBox;
  private javax.swing.JPanel RightTopPanel;
  private javax.swing.JPanel RightBottomPanel;
  private javax.swing.JPanel FileRegistersPanel;
  private javax.swing.JScrollPane StackScrollPane;
  private javax.swing.JPanel RightTopTopPanel;
  private javax.swing.JScrollPane BreakpointsScrollPane;
  private javax.swing.JList CPUStateList;
  private javax.swing.JList StackList;
  private javax.swing.JLabel CPULabel;
  private javax.swing.JPanel RightTopTopBottomPanel;
  private javax.swing.JLabel CPUStateLabel;
  private javax.swing.JLabel StackLabel;
  private javax.swing.JLabel BreakpointsLabel;
  private javax.swing.JList BreakpointsList;
  private javax.swing.JButton TraceButton;
  private javax.swing.JButton RunButton;
  private javax.swing.JButton AnimateButton;
  private javax.swing.JButton StepOverButton;
  private javax.swing.JScrollPane FileRegistersScrollPane;
  private javax.swing.JLabel FileRegistersLabel;
  private javax.swing.JList FileRegistersList;
// End of variables declaration//GEN-END:variables

  public void RefreshProgram(javax.swing.DefaultListModel s) {
    ProgramList.setModel(s);
  }

  public void SelectProgram(int i) {
    ProgramList.setSelectedIndex(i);
    ProgramList.ensureIndexIsVisible(i);
  }

  public void RefreshCPUState(String s[]) {
    CPUStateList.setListData(s);
  }

  public void RefreshFileRegisters(String s[]) {
    FileRegistersList.setListData(s);
  }

  public void RefreshStack(String s[]) {
    StackList.setListData(s);
  }

  public void RefreshBreakpoints(String s[]) {
    BreakpointsList.setListData(s);
  }

  public String Request(String What, String Value) {
    ModifyDialog md = new ModifyDialog(this, true, What, Value);
    md.show();
    return md.GetValue();
  }

  public void Stopped() {
    RunButton.setText("Run");
    AnimateButton.setEnabled(true);
    TraceButton.setEnabled(true);
    StepOverButton.setEnabled(true);
  }

  public void UpdateSource(String s) {
    SourceTextArea.setText(s);
  }

  public void UpdateLabels(String s[]) {
    LabelsList.setListData(s);
  }

  public void UpdateVariables(String s[]) {
    VariablesList.setListData(s);
  }
  public static void main(java.lang.String[] args) {
    new DebuggerFrame ().show ();
  }

}