- Hlavní stránka
- Balíky
- Třídy
- Soubory

- Seznam souborů

# AppletBoyerMooreDemo.java

Zobrazit dokumentaci tohoto souboru.

    00001 /******************************************************************************
    00002  * Název projektu: Aplet pro demonstraci Boyerova-Mooreova algoritmu
    00003  * Balíček: boyermooredemo
    00004  * Soubor: AppletBoyerMooreDemo.java
    00005  * Datum:  11.4.2008
    00006  * Poslední změna: 18.4.2008
    00007  * Autor:  Jaroslav Dytrych xdytry00
    00008  *
    00009  * Popis: Třída tvořící applet pro demonstraci Boyerova-Mooreova algoritmu
    00010  *
    00011  ******************************************************************************/
    00012
    00013 /**
    00014  * @file AppletBoyerMooreDemo.java
    00015  *
    00016  * @brief Třída AppletBoyerMooreDemo - appplet pro demonstraci BMA, základ projektu
    00017  */
    00018
    00019 /**
    00020  * @package boyermooredemo
    00021  *
    00022  * @brief Aplet pro demonstraci Boyerova-Mooreova algoritmu
    00023  */
    00024
    00025 package boyermooredemo;
    00026
    00027 import java.awt.Color;
    00028 import java.awt.Component;
    00029 import java.awt.Dimension;
    00030 import java.awt.Font;
    00031 import java.awt.Rectangle;
    00032
    00033 import java.awt.event.MouseAdapter;
    00034 import java.awt.event.MouseEvent;
    00035
    00036 import java.util.ArrayList;
    00037 import java.util.ListIterator;
    00038
    00039 import javax.swing.BorderFactory;
    00040 import javax.swing.JApplet;
    00041 import javax.swing.JButton;
    00042 import javax.swing.JLabel;
    00043 import javax.swing.JOptionPane;
    00044 import javax.swing.JScrollPane;
    00045 import javax.swing.JTextArea;
    00046 import javax.swing.JTextField;
    00047 import javax.swing.SwingConstants;
    00048
    00049 /**
    00050  * Třída tvořící applet pro demonstraci Boyerova-Mooreova algoritmu
    00051  *
    00052  * @brief Appplet pro demonstraci BMA, základ projektu
    00053  */
    00054 public class AppletBoyerMooreDemo extends JApplet {
    00055
    00056   /**
    00057    * Instance třídy s konstantami
    00058    */
    00059   public Konstanty kon = new Konstanty();  // třída s konstantami
    00060   /**
    00061    * Instance třídy s BMA
    00062    */
    00063   private Algoritmus algBMA = new Algoritmus(this);  // třída s BMA
    00064
    00065   /** Aktuální krok vizualizace */
    00066   private int aktKrok = 0;
    00067   /** Celkový počet kroků vizualizace */
    00068   public int pocetKroku = 0;
    00069   /**
    00070    * Kontejner pro informace o změnách uživatelského rozhraní při vizualizaci
    00071    */
    00072   public ArrayList<ZmenaZobrazeni> prubehViz = new ArrayList<ZmenaZobrazeni>();
    00073   /**
    00074    * Iterátor pro kontejner s informacemi o změnách uživatelského rozhraní
    00075    * při vizualizaci
    00076    */
    00077   public ListIterator iteratorViz;
    00078
    00079   /** Číslo zobrazeného textu nápovědy */
    00080   private int zobrazenaNapoveda = 0;
    00081
    00082   /**
    00083    * Číslo aktuálně zobrazeného bloku algoritmu, pokud je vypsáno více bloků,
    00084    * číslo prvního z nich
    00085    */
    00086   private int zobrazenyBlokAlgoritmu = 0;
    00087   /** Číslo aktuálně zvýrazněného řádku algoritmu */
    00088   private int zvyraznenyRadek = kon.ZADNY_RADEK;
    00089
    00090   /** Popisek pro nadpis v hlavním panelu appletu */
    00091   private JLabel jLabelNadpis = new JLabel();
    00092
    00093   /** Popisek políčka pro hledaný řetězec */
    00094   private JLabel jLabelHledanyRetezec = new JLabel();
    00095   /** Políčko pro hledaný řetězec */
    00096   private JTextField jTextFieldHledanyRetezec = new JTextField();
    00097
    00098   /** Popisek textového pole pro prohledávaný text */
    00099   private JLabel jLabelProhledavanyText = new JLabel();
    00100   /** Textové pole pro prohledávaný text */
    00101   private JTextArea jTextAreaProhledavanyText = new JTextArea();
    00102   /** Skrolovací panel pro textové pole pro prohledávaný text */
    00103   private JScrollPane jScrollPaneProhledavanyText = new JScrollPane();
    00104
    00105   /** Popisek pro panel pro zobrazení zdrojového textu algoritmu */
    00106   private JLabel jLabelAlgoritmus = new JLabel();
    00107   /** Panel pro zobrazení zdrojového textu algoritmu */
    00108   private BarevnyTextPane barevnyTextPaneAlgoritmus = new BarevnyTextPane();
    00109   /** Skrolovací panel pro panel pro zobrazení zdrojového textu algoritmu */
    00110   private JScrollPane jScrollPaneAlgoritmus = new JScrollPane();
    00111
    00112   /** Tabulka s řetězci pro vizualizaci (zobrazuje porovnávání řetězců) */
    00113   private Tabulka tabulkaSR = new Tabulka(kon.TAB_SR_VR[0],kon.TAB_SR_VR[1],
    00114                                           0,2,new Color(255,255,255),
    00115                                           new Color(0,0,0), false, false);
    00116   /** Skrolovací panel pro tabulku s řetězci pro vizualizaci */
    00117   private JScrollPane jScrollPaneTabulkaSR = new JScrollPane();
    00118
    00119   /** Popisek tabulky delta1 */
    00120   private JLabel jLabelTabulkaDelta1 = new JLabel();
    00121   /** Tabulka delta1 */
    00122   private Tabulka tabulkaDelta1 = new Tabulka(kon.TAB_D1_VR[0],kon.TAB_D1_VR[1],
    00123                                               1,4,new Color(255,255,255),
    00124                                               new Color(0,0,0), true, true);
    00125   /** Skrolovací panel pro tabulku delta1 */
    00126   private JScrollPane jScrollPaneTabulkaDelta1 = new JScrollPane();
    00127
    00128   /** Popisek pro tabulku delta2 */
    00129   private JLabel jLabelTabulkaDelta2 = new JLabel();
    00130   /** Tabulka delta2 (jsou v ní zobrazeny i pole pat a shoda) */
    00131   private Tabulka tabulkaDelta2 = new Tabulka(kon.TAB_D2_VR[0],kon.TAB_D2_VR[1],
    00132                                               1,4,new Color(255,255,255),
    00133                                               new Color(0,0,0), true, false);
    00134   /** Skrolovací panel pro tabulku delta2 */
    00135   private JScrollPane jScrollPaneTabulkaDelta2 = new JScrollPane();
    00136
    00137   /** Tlačítko "Zpět" */
    00138   private JButton jButtonZpet = new JButton();
    00139   /** Tlačítko "Vpřed" */
    00140   private JButton jButtonVpred = new JButton();
    00141   /** Tlačítko "Reset" */
    00142   private JButton jButtonReset = new JButton();
    00143
    00144   /** Popisek pro textové pole s nápovědou */
    00145   private JLabel jLabelNapoveda = new JLabel();
    00146   /** Textové pole s nápovědou */
    00147   private JTextArea jTextAreaNapoveda = new JTextArea();
    00148   /** Skrolovací panel pro textové pole s nápovědou */
    00149   private JScrollPane jScrollPaneNapoveda = new JScrollPane();
    00150
    00151   /** Popisek pro políčko s proměnnou m */
    00152   private JLabel jLabelm = new JLabel();
    00153   /** Políčko s proměnnou m */
    00154   private JTextField jTextFieldm = new JTextField();
    00155
    00156   /** Popisek pro políčko s proměnnou n */
    00157   private JLabel jLabeln = new JLabel();
    00158   /** Políčko s proměnnou n */
    00159   private JTextField jTextFieldn = new JTextField();
    00160
    00161   /** Popisek pro políčko s proměnnou i */
    00162   private JLabel jLabeli = new JLabel();
    00163   /** Políčko s proměnnou i */
    00164   private JTextField jTextFieldi = new JTextField();
    00165
    00166   /** Popisek pro políčko s proměnnou j */
    00167   private JLabel jLabelj = new JLabel();
    00168   /** Políčko s proměnnou j */
    00169   private JTextField jTextFieldj = new JTextField();
    00170
    00171   /** Popisek pro políčko s proměnnou m-j+1 nebo n-m+1 */
    00172   private JLabel jLabelmj = new JLabel();
    00173   /** Políčko s proměnnou m-j+1 nebo n-m+1 */
    00174   private JTextField jTextFieldmj = new JTextField();
    00175
    00176   /** Popisek pro políčko s proměnnou i-j+1 nebo i+j-1 */
    00177   private JLabel jLabelij = new JLabel();
    00178   /** Políčko s proměnnou i-j+1 nebo i+j-1 */
    00179   private JTextField jTextFieldij = new JTextField();
    00180
    00181   /** Popisek pro políčko s proměnnou s */
    00182   private JLabel jLabels = new JLabel();
    00183   /** Políčko s proměnnou s */
    00184   private JTextField jTextFields = new JTextField();
    00185
    00186   /** Popisek pro políčko s proměnnou t */
    00187   private JLabel jLabelt = new JLabel();
    00188   /** Políčko s proměnnou t */
    00189   private JTextField jTextFieldt = new JTextField();
    00190
    00191   /** Popisek pro políčko s proměnnou L nebo d1P */
    00192   private JLabel jLabelL = new JLabel();
    00193   /** Políčko s proměnnou L nebo d1P */
    00194   private JTextField jTextFieldL = new JTextField();
    00195
    00196   /** Popisek pro políčko s proměnnou poz */
    00197   private JLabel jLabelpoz = new JLabel();
    00198   /** Políčko s proměnnou poz */
    00199   private JTextField jTextFieldpoz = new JTextField();
    00200
    00201   /** Popisek pro počítadlo kroků (přímo obsahuje počítadlo kroků) */
    00202   private JLabel jLabelPocitadloKroku = new JLabel();
    00203
    00204   /** Popisek pro legendu */
    00205   private JLabel jLabelLegenda = new JLabel();
    00206   /** 1. položka legendy (modrý obdélníček) */
    00207   private JTextField jTextFieldLegendaZvyrazneny = new JTextField();
    00208   /** 1. položka legendy (zvýrazněný řádek algoritmu) */
    00209   private JLabel jLabel1LegendaZvyrazneny = new JLabel();
    00210
    00211
    00212   /**
    00213    * Konstruktor třídy (prázdný, inicializace bude provedena metodou init)
    00214    */
    00215   public AppletBoyerMooreDemo()
    00216   {
    00217   }
    00218
    00219   /**
    00220    * Metoda pro inicializaci oblasti appletu
    00221    *
    00222    * @throws Exception Libovolná obecná programová výjimka při inicializaci
    00223    */
    00224   private void jbInit() throws Exception {
    00225     // nastavení rozložení v panelu
    00226     this.getContentPane().setLayout(null);
    00227     // nastavení rozměrů a písma hlavního panelu appletu
    00228     this.setSize(new Dimension(944, 651));
    00229     this.setFont(new Font("Dialog", 1, 12));
    00230
    00231     // nastavení jednotlivých komponent GUI (rozměry, umístění, texty popisků,
    00232     // barvy, tool-tipy, písma)
    00233     jLabelNadpis.setText("Demonstrace Boyerova-Mooreova algoritmu");
    00234     jLabelNadpis.setToolTipText("null");
    00235     jLabelNadpis.setFont(new Font("Dialog", 1, 14));
    00236     jLabelNadpis.setBounds(new Rectangle(20, 10, 385, 15));
    00237     jLabelHledanyRetezec.setText("Hledaný řetězec:");
    00238     jLabelHledanyRetezec.setBounds(new Rectangle(20, 35, 110, 20));
    00239     jLabelHledanyRetezec.setLabelFor(jTextFieldHledanyRetezec);
    00240     jTextFieldHledanyRetezec.setBounds(new Rectangle(130, 35, 305, 20));
    00241     jLabelProhledavanyText.setText("Prohledávaný text:");
    00242     jLabelProhledavanyText.setBounds(new Rectangle(20, 60, 120, 20));
    00243     jScrollPaneProhledavanyText.setBounds(new Rectangle(20, 80, 415, 65));
    00244     jTextAreaProhledavanyText.setColumns(20);
    00245     jTextAreaProhledavanyText.setRows(4);
    00246     jScrollPaneAlgoritmus.setBounds(new Rectangle(450, 25, 475, 565));
    00247     jLabelAlgoritmus.setText("Algoritmus:");
    00248     jLabelAlgoritmus.setBounds(new Rectangle(450, 5, 135, 20));
    00249     jScrollPaneTabulkaSR.setBounds(new Rectangle(20, 155, 415, 65));
    00250     jScrollPaneTabulkaDelta1.setBounds(new Rectangle(20, 245, 415, 75));
    00251     jScrollPaneTabulkaDelta2.setBounds(new Rectangle(20, 345, 415, 120));
    00252     jLabelTabulkaDelta1.setText("Tabulka delta1 (CharJump):");
    00253     jLabelTabulkaDelta2.setText("Tabulka delta2 (MatchJump):");
    00254     jLabelTabulkaDelta1.setBounds(new Rectangle(20, 225, 225, 20));
    00255     jLabelTabulkaDelta2.setBounds(new Rectangle(20, 325, 225, 20));
    00256     jButtonZpet.setText("Zpět");
    00257     jButtonZpet.setBounds(new Rectangle(25, 525, 70, 25));
    00258     jButtonVpred.setText("Vpřed");
    00259     jButtonVpred.setBounds(new Rectangle(110, 525, 70, 25));
    00260
    00261     jButtonReset.setText("Reset");
    00262     jButtonReset.setBounds(new Rectangle(355, 525, 75, 25));
    00263     jLabelNapoveda.setText("Nápověda:");
    00264     jLabelNapoveda.setBounds(new Rectangle(25, 550, 75, 20));
    00265     jScrollPaneNapoveda.setBounds(new Rectangle(25, 570, 410, 65));
    00266     jLabelLegenda.setText("Legenda:");
    00267     jLabelLegenda.setBounds(new Rectangle(455, 595, 80, 20));
    00268     jLabelLegenda.setFont(new Font("Dialog", 1, 12));
    00269     jLabeli.setText("i = ");
    00270     jLabeli.setBounds(new Rectangle(100, 470, 25, 20));
    00271     jLabelj.setBounds(new Rectangle(170, 470, 25, 20));
    00272     jLabelj.setText("j = ");
    00273     jTextFieldi.setBounds(new Rectangle(125, 470, 35, 20));
    00274     jTextFieldi.setBackground(new Color(99, 255, 99));
    00275     jTextFieldj.setBounds(new Rectangle(195, 470, 35, 20));
    00276     jTextFieldj.setBackground(new Color(115, 255, 255));
    00277     jLabelm.setText("m = ");
    00278     jLabelm.setBounds(new Rectangle(25, 470, 30, 20));
    00279     jLabelm.setToolTipText("Délka hledaného řetězce");
    00280     jTextFieldm.setBounds(new Rectangle(55, 470, 35, 20));
    00281     jTextFieldm.setToolTipText("Délka hledaného řetězce");
    00282     jTextFieldm.setBackground(Color.white);
    00283     jLabelmj.setText("m-j+1 = ");
    00284     jLabelmj.setBounds(new Rectangle(330, 470, 65, 20));
    00285     jTextFieldmj.setBounds(new Rectangle(395, 470, 35, 20));
    00286     jTextFieldmj.setBackground(new Color(255, 165, 165));
    00287     jLabelij.setText("i-j+1 = ");
    00288     jLabelij.setBounds(new Rectangle(240, 470, 55, 20));
    00289     jTextFieldij.setBounds(new Rectangle(290, 470, 35, 20));
    00290     jTextFieldij.setBackground(new Color(255, 255, 66));
    00291     jLabeln.setText("n = ");
    00292     jLabeln.setBounds(new Rectangle(25, 495, 30, 20));
    00293     jLabeln.setToolTipText("Délka prohledávaného textu");
    00294     jTextFieldn.setBounds(new Rectangle(55, 495, 35, 20));
    00295     jTextFieldn.setToolTipText("Délka prohledávaného textu");
    00296     jTextFieldn.setBackground(Color.white);
    00297     jLabels.setText("s = ");
    00298     jLabels.setBounds(new Rectangle(100, 495, 25, 20));
    00299     jTextFields.setBounds(new Rectangle(125, 495, 35, 20));
    00300     jTextFields.setBackground(new Color(255, 165, 214));
    00301     jLabelt.setText("t = ");
    00302     jLabelt.setBounds(new Rectangle(170, 495, 25, 20));
    00303     jTextFieldt.setBounds(new Rectangle(195, 495, 35, 20));
    00304     jTextFieldt.setBackground(new Color(198, 198, 255));
    00305     jLabelL.setText("     L = ");
    00306     jLabelL.setBounds(new Rectangle(245, 495, 45, 20));
    00307     jTextFieldL.setBounds(new Rectangle(290, 495, 35, 20));
    00308     jTextFieldL.setBackground(new Color(255, 222, 214));
    00309     jLabelpoz.setText("poz = ");
    00310     jLabelpoz.setBounds(new Rectangle(350, 495, 45, 20));
    00311     jLabelpoz.setToolTipText("Pozice hledaného řetězce v textu");
    00312     jTextFieldpoz.setBounds(new Rectangle(395, 495, 35, 20));
    00313     jTextFieldpoz.setBackground(new Color(255, 181, 99));
    00314     jTextFieldpoz.setToolTipText("Pozice hledaného řetězce v textu");
    00315     jLabelPocitadloKroku.setBounds(new Rectangle(210, 525, 115, 25));
    00316     jLabelPocitadloKroku.setHorizontalAlignment(SwingConstants.CENTER);
    00317     jLabelPocitadloKroku.setToolTipText("null");
    00318     jLabel1LegendaZvyrazneny.setText("Zvýraznění naposledy provedeného řádku zdrojového kódu");
    00319     jLabel1LegendaZvyrazneny.setBounds(new Rectangle(545, 600, 370, 20));
    00320     jLabel1LegendaZvyrazneny.setFont(new Font("Dialog", 0, 10));
    00321     jTextFieldLegendaZvyrazneny.setBounds(new Rectangle(525, 605, 15, 10));
    00322     jTextFieldLegendaZvyrazneny.setBackground(kon.BARVA_ZVYRAZNENI_P);
    00323     jTextFieldLegendaZvyrazneny.setEditable(false);
    00324
    00325     // Přiřazení obsluhy událostí myši tlačítku "Vpřed"
    00326     jButtonVpred.addMouseListener(new MouseAdapter() {
    00327         public void mouseClicked(MouseEvent e)
    00328         {  // obsluha kliknutí myší
    00329             jButtonVpred_mouseClicked(e);  // volání metody pro obsluhu
    00330         }
    00331       });
    00332     // Přiřazení obsluhy událostí myši tlačítku "Zpět"
    00333     jButtonZpet.addMouseListener(new MouseAdapter() {
    00334         public void mouseClicked(MouseEvent e)
    00335         {  // obsluha kliknutí myší
    00336           jButtonZpet_mouseClicked(e);  // volání metody pro obsluhu
    00337         }
    00338       });
    00339     // Přiřazení obsluhy událostí myši tlačítku "Reset"
    00340     jButtonReset.addMouseListener(new MouseAdapter() {
    00341         public void mouseClicked(MouseEvent e)
    00342         {  // obsluha kliknutí myší
    00343           jButtonReset_mouseClicked(e);  // volání metody pro obsluhu
    00344         }
    00345       });
    00346
    00347     // nastaví výchozí šířku buňky tabulek na šířku písmene A
    00348     tabulkaSR.nastavObsah(0,1,"A");
    00349     tabulkaSR.nastavObsah(0,1,"");
    00350     tabulkaDelta1.nastavObsah(0,1,"A");
    00351     tabulkaDelta1.nastavObsah(0,1,"");
    00352     tabulkaDelta2.nastavObsah(0,1,"A");
    00353     tabulkaDelta2.nastavObsah(0,1,"");
    00354
    00355     // vloží texty záhlaví do řádků
    00356     tabulkaDelta1.nastavObsah(0,0,"c");
    00357     tabulkaDelta1.nastavObsah(1,0,"delta1[c]");
    00358     tabulkaDelta2.nastavObsah(0,0,"i");
    00359     tabulkaDelta2.nastavObsah(1,0,"pat[i]");
    00360     tabulkaDelta2.nastavObsah(2,0,"shoda[i]");
    00361     tabulkaDelta2.nastavObsah(3,0,"delta2[i]");
    00362
    00363     // zakázání modifikace panelu s algoritmem
    00364     barevnyTextPaneAlgoritmus.setEditable(false);
    00365
    00366     // výpis kompletního zdrojového kódu algoritmu
    00367     vypisAlgoritmus();
    00368
    00369     // zakázání modifikace nápovědy
    00370     jTextAreaNapoveda.setEditable(false);
    00371
    00372     // vloží do pole s nápovědou výchozí obsah
    00373     jTextAreaNapoveda.setText(kon.textyNapovedy[0]);
    00374     zobrazenaNapoveda = 0;
    00375
    00376     // zakázání modifikace políček s proměnnými
    00377     jTextFieldm.setEditable(false);
    00378     jTextFieldn.setEditable(false);
    00379     jTextFieldi.setEditable(false);
    00380     jTextFieldj.setEditable(false);
    00381     jTextFieldij.setEditable(false);
    00382     jTextFieldmj.setEditable(false);
    00383     jTextFields.setEditable(false);
    00384     jTextFieldt.setEditable(false);
    00385     jTextFieldL.setEditable(false);
    00386     jTextFieldpoz.setEditable(false);
    00387
    00388     // okraje políček s proměnnými
    00389     jTextFieldm.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
    00390     jTextFieldn.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
    00391     jTextFieldi.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
    00392     jTextFieldj.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
    00393     jTextFieldij.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
    00394     jTextFieldmj.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
    00395     jTextFields.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
    00396     jTextFieldt.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
    00397     jTextFieldL.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
    00398     jTextFieldpoz.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
    00399
    00400
    00401     // vloží prvky do jejich skrolovacích panelů
    00402     jScrollPaneTabulkaSR.setViewportView(tabulkaSR);
    00403     jScrollPaneTabulkaDelta1.setViewportView(tabulkaDelta1);
    00404     jScrollPaneTabulkaDelta2.setViewportView(tabulkaDelta2);
    00405     jScrollPaneAlgoritmus.setViewportView(barevnyTextPaneAlgoritmus);
    00406     jScrollPaneNapoveda.setViewportView(jTextAreaNapoveda);
    00407     jScrollPaneProhledavanyText.setViewportView(jTextAreaProhledavanyText);
    00408
    00409     // vložení komponent GUI do panelu s appletem
    00410     this.getContentPane().add(jTextFieldLegendaZvyrazneny, null);
    00411     this.getContentPane().add(jLabel1LegendaZvyrazneny, null);
    00412     this.getContentPane().add(jLabelPocitadloKroku, null);
    00413     this.getContentPane().add(jTextFieldpoz, null);
    00414     this.getContentPane().add(jLabelpoz, null);
    00415     this.getContentPane().add(jTextFieldL, null);
    00416     this.getContentPane().add(jLabelL, null);
    00417     this.getContentPane().add(jTextFieldt, null);
    00418     this.getContentPane().add(jLabelt, null);
    00419     this.getContentPane().add(jTextFields, null);
    00420     this.getContentPane().add(jLabels, null);
    00421     this.getContentPane().add(jTextFieldn, null);
    00422     this.getContentPane().add(jLabeln, null);
    00423     this.getContentPane().add(jTextFieldij, null);
    00424     this.getContentPane().add(jLabelij, null);
    00425     this.getContentPane().add(jTextFieldmj, null);
    00426     this.getContentPane().add(jLabelmj, null);
    00427     this.getContentPane().add(jTextFieldm, null);
    00428     this.getContentPane().add(jLabelm, null);
    00429     this.getContentPane().add(jTextFieldj, null);
    00430     this.getContentPane().add(jTextFieldi, null);
    00431     this.getContentPane().add(jLabelj, null);
    00432     this.getContentPane().add(jLabeli, null);
    00433     this.getContentPane().add(jLabelLegenda, null);
    00434     this.getContentPane().add(jScrollPaneNapoveda, null);
    00435     this.getContentPane().add(jLabelNapoveda, null);
    00436     this.getContentPane().add(jButtonReset, null);
    00437     this.getContentPane().add(jButtonVpred, null);
    00438     this.getContentPane().add(jButtonZpet, null);
    00439     this.getContentPane().add(jLabelTabulkaDelta1, null);
    00440     this.getContentPane().add(jLabelTabulkaDelta2, null);
    00441     this.getContentPane().add(jScrollPaneTabulkaSR, null);
    00442     this.getContentPane().add(jLabelAlgoritmus, null);
    00443     this.getContentPane().add(jScrollPaneAlgoritmus, null);
    00444     this.getContentPane().add(jScrollPaneProhledavanyText, null);
    00445     this.getContentPane().add(jLabelProhledavanyText, null);
    00446     this.getContentPane().add(jTextFieldHledanyRetezec, null);
    00447     this.getContentPane().add(jLabelHledanyRetezec, null);
    00448     this.getContentPane().add(jLabelNadpis);
    00449     this.getContentPane().add(jScrollPaneTabulkaDelta1, null);
    00450     this.getContentPane().add(jScrollPaneTabulkaDelta2, null);
    00451
    00452     // deaktivace tlačítka zpět
    00453     jButtonZpet.setEnabled(false);
    00454   }  // private void jbInit()
    00455
    00456   /**
    00457    * Metoda pro inicializaci appletu, je volána prohlížečem
    00458    */
    00459   public void init()
    00460   {
    00461     try {
    00462       jbInit();  // uinicializace oblasti appletu
    00463     } catch (Exception e) {
    00464       e.printStackTrace();
    00465     }
    00466   }  // public void init()
    00467
    00468   /**
    00469    * Metoda pro obsluhu kliknutí na tlačítko Vpřed
    00470    *
    00471    * @param e Událost myši
    00472    */
    00473   private void jButtonVpred_mouseClicked(MouseEvent e) {
    00474     if (e.getButton()==e.BUTTON1 && ((Component)e.getSource()).isEnabled())
    00475     {  // pokud se jedná o levé tlačítko myši a tlačítko Vpřed není zakázané
    00476       if (aktKrok == 0)
    00477       {  // pokud zatím vizualizace nezačala
    00478         if (jTextFieldHledanyRetezec.getText().length() < 1)
    00479         {  // pokud nebyl zadán hledaný řetězec
    00480           JOptionPane.showMessageDialog(this, "Nebyl zadán hledaný řetězec",
    00481                                         "Chyba",JOptionPane.ERROR_MESSAGE);
    00482           return;
    00483         }
    00484         if (jTextAreaProhledavanyText.getText().length() < 1)
    00485         {  // pokud nebyl zadán prohledávaný text
    00486           JOptionPane.showMessageDialog(this, "Nebyl zadán prohledávaný text",
    00487                                         "Chyba",JOptionPane.ERROR_MESSAGE);
    00488           return;
    00489         }
    00490
    00491         // zakáže editaci řetězců
    00492         jTextFieldHledanyRetezec.setEditable(false);
    00493         jTextAreaProhledavanyText.setEditable(false);
    00494
    00495         // přejde na 1. krok vizualizace
    00496         aktKrok = 1;
    00497         // počet kroků vizualizace je nyní 1
    00498         pocetKroku = 1;
    00499
    00500         // Provede hledání řetězce pomocí BMA a vytvoří seznam změn zobrazení,
    00501         // se kterým bude následně prováděna vizualizace.
    00502         // Nastaví také počet kroků.
    00503         algBMA.BMA(jTextFieldHledanyRetezec.getText(),jTextAreaProhledavanyText.getText());
    00504         // získá iterátor do kontejneru se změnami zobrazení
    00505         iteratorViz = prubehViz.listIterator();
    00506
    00507         // vypíše obsah políčka s počítadlem kroků
    00508         jLabelPocitadloKroku.setText("krok 1 z " + pocetKroku);
    00509
    00510         // nastaví 2. text nápovědy
    00511         zobrazenaNapoveda = 1;
    00512         jTextAreaNapoveda.setText(kon.textyNapovedy[zobrazenaNapoveda]);
    00513
    00514         // vloží do pole s algoritmem metodu BMA
    00515         this.vypisBlokAlgoritmu(kon.BLOK_BMA,true);
    00516         // zvýrazní 1. řádek (9. řádek zdrojového kódu)
    00517         this.zvyrazniRadek(9);
    00518       }  // pokud zatím vizualizace nezačala
    00519       else
    00520       {  // pokud již vizualizace probíhá
    00521         if (aktKrok < pocetKroku)
    00522         {  // pokud lze udělat krok vpřed
    00523           krokVpred();  // udělá krok vpřed
    00524
    00525           if (aktKrok >= pocetKroku)
    00526           {  // pokud již nebude možné udělat další krok vpřed
    00527             jButtonVpred.setEnabled(false);  // zakáže tlačítko Vpřed
    00528           }
    00529           // byl udělán krok vpřed a následně tedy bude možné i zpět
    00530           jButtonZpet.setEnabled(true);  // povolí tlačítko Zpět
    00531         }  // pokud lze udělat krok vpřed
    00532         else
    00533         {  // pokud nelze udělat krok vpřed
    00534           jButtonVpred.setEnabled(false);  // zakáže tlačítko Vpřed
    00535         }
    00536       }  // pokud již vizualizace probíhá
    00537     }  // pokud se jedná o levé tlačítko myši a tlačítko Vpřed není zakázané
    00538   }  // private void jButtonVpred_mouseClicked()
    00539
    00540   /**
    00541    * Metoda pro obsluhu kliknutí na tlačítko Zpět
    00542    *
    00543    * @param e Událost myši
    00544    */
    00545   private void jButtonZpet_mouseClicked(MouseEvent e) {
    00546     if (e.getButton()==e.BUTTON1 && ((Component)e.getSource()).isEnabled())
    00547     {  // pokud se jedná o levé tlačítko myši a tlačítko Zpět není zakázané
    00548       if (aktKrok > 1)
    00549       {  // pokud lze udělat krok zpět
    00550         krokZpet();  // udělá krok zpět
    00551
    00552         if (aktKrok <= 1)
    00553         {  // pokud již nebude možné udělat další krok zpět
    00554           jButtonZpet.setEnabled(false);// zakáže tlačítko Zpět
    00555         }
    00556         // byl udělán krok zpět a následně tedy bude možné i Vpřed
    00557         jButtonVpred.setEnabled(true);  // povolí tlačítko Vpřed
    00558       }  // pokud lze udělat krok zpět
    00559       else
    00560       {  // pokud nelze udělat krok zpět
    00561         jButtonZpet.setEnabled(false);// zakáže tlačítko Zpět
    00562       }
    00563     }  // pokud se jedná o levé tlačítko myši a tlačítko Zpět není zakázané
    00564   }  // private void jButtonZpet_mouseClicked()
    00565
    00566   /**
    00567    * Metoda pro obsluhu kliknutí na tlačítko Reset
    00568    *
    00569    * @param e Událost myši
    00570    */
    00571   private void jButtonReset_mouseClicked(MouseEvent e) {
    00572     if (e.getButton()==e.BUTTON1 && ((Component)e.getSource()).isEnabled())
    00573     {  // pokud se jedná o levé tlačítko myši a tlačítko Reset není zakázané
    00574       // zakáže tlačítko Zpět a povolí tlačítko Vpřed
    00575       jButtonZpet.setEnabled(false);
    00576       jButtonVpred.setEnabled(true);
    00577       // vynuluje počítadla kroků
    00578       this.pocetKroku = 0;
    00579       this.aktKrok = 0;
    00580       this.jLabelPocitadloKroku.setText("");
    00581       // vymaže obsah kontejneru se změnami
    00582       this.prubehViz = new ArrayList<ZmenaZobrazeni>();
    00583       // nastaví výchozí rozměry tabulek
    00584       tabulkaSR.zmenRozmery(kon.TAB_SR_VR[0],kon.TAB_SR_VR[1]);
    00585       tabulkaDelta1.zmenRozmery(kon.TAB_D1_VR[0],kon.TAB_D1_VR[1]);
    00586       tabulkaDelta2.zmenRozmery(kon.TAB_D2_VR[0],kon.TAB_D2_VR[1]);
    00587       // vymaže obsah tabulek
    00588       tabulkaSR.vyprazdniTabulku(true);
    00589       tabulkaDelta1.vyprazdniTabulku(false);
    00590       tabulkaDelta2.vyprazdniTabulku(false);
    00591       // nastaví výchozí šířku buňky tabulky na šířku písmene A
    00592       tabulkaSR.nastavObsah(0,1,"A");
    00593       tabulkaSR.nastavObsah(0,1,"");
    00594       tabulkaDelta1.nastavObsah(0,1,"A");
    00595       tabulkaDelta1.nastavObsah(0,1,"");
    00596       tabulkaDelta2.nastavObsah(0,1,"A");
    00597       tabulkaDelta2.nastavObsah(0,1,"");
    00598       // vloží do pole s nápovědou výchozí obsah
    00599       jTextAreaNapoveda.setText(kon.textyNapovedy[0]);
    00600       zobrazenaNapoveda = 0;
    00601       // vyprázdní pole s algoritmem a vloží do něj celý algoritmus
    00602       barevnyTextPaneAlgoritmus.vyprazdniPanel();
    00603       vypisAlgoritmus();
    00604       // nyní není zvýrazněný žádný řádek
    00605       zvyraznenyRadek = kon.ZADNY_RADEK;
    00606       // nastaví popiskům výchozí texty
    00607       jLabelij.setText(kon.TEXTY_POPISKU_IMJ);
    00608       jLabelmj.setText(kon.TEXTY_POPISKU_MJ);
    00609       jLabelL.setText(kon.TEXTY_POPISKU_L);
    00610       // vymaže obsah polí s proměnnými
    00611       jTextFieldm.setText("");
    00612       jTextFieldn.setText("");
    00613       jTextFieldi.setText("");
    00614       jTextFieldj.setText("");
    00615       jTextFieldij.setText("");
    00616       jTextFieldmj.setText("");
    00617       jTextFields.setText("");
    00618       jTextFieldt.setText("");
    00619       jTextFieldL.setText("");
    00620       jTextFieldpoz.setText("");
    00621       // povolí editaci řetězců
    00622       jTextFieldHledanyRetezec.setEditable(true);
    00623       jTextAreaProhledavanyText.setEditable(true);
    00624     }  // pokud se jedná o levé tlačítko myši a tlačítko Reset není zakázané
    00625   }  // private void jButtonReset_mouseClicked()
    00626
    00627   /**
    00628    * Metoda pro výpis celého algoritmu do textového pole s algoritmem
    00629    */
    00630   private void vypisAlgoritmus()
    00631   {
    00632     // výpis jednotlivých bloků algoritmu
    00633     vypisBlokAlgoritmu(kon.BLOK_DEKLARACE,false);
    00634     vypisBlokAlgoritmu(kon.BLOK_BMA,false);
    00635     vypisBlokAlgoritmu(kon.BLOK_DELTA1,false);
    00636     vypisBlokAlgoritmu(kon.BLOK_DELTA2,false);
    00637     this.zobrazenyBlokAlgoritmu = 0;  // jsou vypsány všechny bloky počínaje 0
    00638   }
    00639
    00640   /**
    00641    * Metoda pro výpis bloku algoritmu do textového pole s algoritmem
    00642    *
    00643    * @param cislo Číslo bloku, který se má vypsat
    00644    * @param vymazat Určuje, zda se má před výpisem vymazat obsah pole
    00645    */
    00646   private void vypisBlokAlgoritmu(int cislo, boolean vymazat)
    00647   {
    00648     if (vymazat)
    00649     {  // pokud se má vymazat obsah pole, vymaže jej
    00650       barevnyTextPaneAlgoritmus.vyprazdniPanel();
    00651     }
    00652     for (int i = kon.blokyAlgoritmu[cislo][0]; i <= kon.blokyAlgoritmu[cislo][1]; i++)
    00653     {  // výpis bloku po jednotlivých úsecích
    00654       barevnyTextPaneAlgoritmus.pridejText(kon.textyAlgoritmu[i],kon.barvyAlgoritmu[i],
    00655                                            new Color(255,255,255),
    00656                                            kon.tucneCastiAlgoritmu[i]);
    00657     }
    00658     this.zobrazenyBlokAlgoritmu = cislo;  // aktualizace čísla zobrazeného bloku
    00659   }
    00660
    00661   /**
    00662    * Metoda pro zvýraznění řádku algoritmu
    00663    *
    00664    * @param cislo Číslo řádku algoritmu, který se má zvýraznit
    00665    */
    00666   private void zvyrazniRadek(int cislo)
    00667   {
    00668     int zacatek;  // pomocné proměnné
    00669     int konec;
    00670     if (zvyraznenyRadek != kon.ZADNY_RADEK)
    00671     {  // pokud je zvýrazněný nějaký řádek
    00672       // výpočet čísel bloků v panelu
    00673       zacatek = kon.radkyAlgoritmu[zvyraznenyRadek][0] - kon.blokyAlgoritmu[zobrazenyBlokAlgoritmu][0];
    00674       konec = kon.radkyAlgoritmu[zvyraznenyRadek][1] - kon.blokyAlgoritmu[zobrazenyBlokAlgoritmu][0];
    00675       for (int i = zacatek; i <= konec; i++)
    00676       {  // zruší zvýraznění jednotlivých bloků v řádku
    00677         this.barevnyTextPaneAlgoritmus.nastavVychoziBarvu(i);;
    00678       }
    00679     }
    00680     if (cislo != kon.ZADNY_RADEK)
    00681     {  // pokud se má zvýraznit některý řádek
    00682        // výpočet čísel bloků v panelu
    00683         zacatek = kon.radkyAlgoritmu[cislo][0] - kon.blokyAlgoritmu[zobrazenyBlokAlgoritmu][0];
    00684         konec = kon.radkyAlgoritmu[cislo][1] - kon.blokyAlgoritmu[zobrazenyBlokAlgoritmu][0];
    00685       for (int i = zacatek; i <= konec; i++)
    00686       {  // zvýrazní jednotlivé bloky v řádku
    00687         this.barevnyTextPaneAlgoritmus.nastavBarvu(i,kon.BARVA_ZVYRAZNENI_T,kon.BARVA_ZVYRAZNENI_P);
    00688       }
    00689     }
    00690     zvyraznenyRadek = cislo;  // aktualizace čísla zvýrazněného řádku
    00691   }  // private void zvyrazniRadek()
    00692
    00693   /**
    00694    * Metoda pro nastavení hodnoty v políčku s proměnnou
    00695    *
    00696    * @param cislo Číslo políčka (definované ve třídě Konstanty)
    00697    * @param hodnota Hodnota, která se má nastavit
    00698    */
    00699   private void nastavPolePromenne(int cislo,int hodnota)
    00700   {
    00701     Integer pomI;
    00702     pomI = new Integer(hodnota);  // převede hodnotu na objekt
    00703     // převede hodnotu na řetězec a volá metodu pro nastavení řetězcové hodnoty
    00704     // políčka
    00705     nastavPolePromenne(cislo,pomI.toString());
    00706   }  // private void nastavPolePromenne()
    00707
    00708   /**
    00709    * Metoda pro nastavení hodnoty v políčku s proměnnou
    00710    *
    00711    * @param cislo Číslo políčka (definované ve třídě Konstanty)
    00712    * @param hodnota Hodnota, která se má nastavit
    00713    */
    00714   private void nastavPolePromenne(int cislo,String hodnota)
    00715   {
    00716     // zvolí správné pole a nastaví jeho hodnotu
    00717     if (cislo == kon.PROM_M)
    00718     {
    00719       this.jTextFieldm.setText(hodnota);
    00720     }
    00721     else if (cislo == kon.PROM_N)
    00722     {
    00723       this.jTextFieldn.setText(hodnota);
    00724     }
    00725     else if (cislo == kon.PROM_I)
    00726     {
    00727       this.jTextFieldi.setText(hodnota);
    00728     }
    00729     else if (cislo == kon.PROM_J)
    00730     {
    00731       this.jTextFieldj.setText(hodnota);
    00732     }
    00733     else if (cislo == kon.PROM_IJ)
    00734     {
    00735       this.jTextFieldij.setText(hodnota);
    00736     }
    00737     else if (cislo == kon.PROM_MJ)
    00738     {
    00739       this.jTextFieldmj.setText(hodnota);
    00740     }
    00741     else if (cislo == kon.PROM_S)
    00742     {
    00743       this.jTextFields.setText(hodnota);
    00744     }
    00745     else if (cislo == kon.PROM_T)
    00746     {
    00747       this.jTextFieldt.setText(hodnota);
    00748     }
    00749     else if (cislo == kon.PROM_L)
    00750     {
    00751       this.jTextFieldL.setText(hodnota);
    00752     }
    00753     else if (cislo == kon.PROM_POZ)
    00754     {
    00755       this.jTextFieldpoz.setText(hodnota);
    00756     }
    00757   }  // private void nastavPolePromenne()
    00758
    00759   /**
    00760    * Metoda pro získání obsahu políčka s proměnnou
    00761    *
    00762    * @param cislo Číslo políčka (definované ve třídě Konstanty)
    00763    * @return Vrací obsah políčka
    00764    */
    00765   private String vratObsahPolePromenne(int cislo)
    00766   {
    00767     // zvolí správné pole a vrátí jeho obsah
    00768     if (cislo == kon.PROM_M)
    00769     {
    00770       return jTextFieldm.getText();
    00771     }
    00772     else if (cislo == kon.PROM_N)
    00773     {
    00774       return jTextFieldn.getText();
    00775     }
    00776     else if (cislo == kon.PROM_I)
    00777     {
    00778       return jTextFieldi.getText();
    00779     }
    00780     else if (cislo == kon.PROM_J)
    00781     {
    00782       return jTextFieldj.getText();
    00783     }
    00784     else if (cislo == kon.PROM_IJ)
    00785     {
    00786       return jTextFieldij.getText();
    00787     }
    00788     else if (cislo == kon.PROM_MJ)
    00789     {
    00790       return jTextFieldmj.getText();
    00791     }
    00792     else if (cislo == kon.PROM_S)
    00793     {
    00794       return jTextFields.getText();
    00795     }
    00796     else if (cislo == kon.PROM_T)
    00797     {
    00798       return jTextFieldt.getText();
    00799     }
    00800     else if (cislo == kon.PROM_L)
    00801     {
    00802       return jTextFieldL.getText();
    00803     }
    00804     else if (cislo == kon.PROM_POZ)
    00805     {
    00806       return jTextFieldpoz.getText();
    00807     }
    00808     return "";  // pokud nebylo zvoleno žádné pole, vrátí prázdný řetězec
    00809   }  // private void vratHodnotuPolePromenne()
    00810
    00811   /**
    00812    * Metoda pro provedení jednoho kroku vizualizace
    00813    */
    00814   private void krokVpred()
    00815   {
    00816     ZmenaZobrazeni zmena;  // proměnná pro informace o změně
    00817     boolean konec = false;  // pomocná proměnná
    00818
    00819     aktKrok++;  // provádí se krok vpřed
    00820
    00821     // aktualizuje obsah políčka s počítadlem kroků
    00822     jLabelPocitadloKroku.setText("krok " + aktKrok + " / " + pocetKroku);
    00823
    00824     if (!iteratorViz.hasNext())
    00825     {  // pokud není v seznamu žádná změna, nelze pokračovat
    00826       return;
    00827     }
    00828
    00829     // získání informací o první změně v kroku
    00830     zmena = (ZmenaZobrazeni)iteratorViz.next();
    00831
    00832     while (!konec && zmena.cisloKroku == aktKrok)
    00833     {  // provedení všech změn v kroku
    00834       if (zmena.operace == kon.ZM_T_H)
    00835       {  // změna hodnoty políčka v tabulce
    00836         if (zmena.tabulka == kon.TAB_SR)
    00837         {  // tabulkaSR
    00838           // nastaví původní hodnotu do objektu změny a provede změnu
    00839           zmena.puvodniObsah = tabulkaSR.vratObsah(zmena.radek,zmena.sloupec);
    00840           tabulkaSR.nastavObsah(zmena.radek,zmena.sloupec,zmena.novyObsah);
    00841         }
    00842         else if (zmena.tabulka == kon.TAB_D1)
    00843         {  // tabulka delta1
    00844           // nastaví původní hodnotu do objektu změny a provede změnu
    00845           zmena.puvodniObsah = tabulkaDelta1.vratObsah(zmena.radek,zmena.sloupec);
    00846           tabulkaDelta1.nastavObsah(zmena.radek,zmena.sloupec,zmena.novyObsah);
    00847         }
    00848         else if (zmena.tabulka == kon.TAB_D2)
    00849         {  // tabulka delta2
    00850           // nastaví původní hodnotu do objektu změny a provede změnu
    00851           zmena.puvodniObsah = tabulkaDelta2.vratObsah(zmena.radek,zmena.sloupec);
    00852           tabulkaDelta2.nastavObsah(zmena.radek,zmena.sloupec,zmena.novyObsah);
    00853         }
    00854       }  // změna hodnoty políčka v tabulce
    00855       else if (zmena.operace == kon.ZM_T_B)
    00856       {  // změna barvy políčka v tabulce
    00857         if (zmena.tabulka == kon.TAB_SR)
    00858         {  // tabulkaSR
    00859           // nastaví původní hodnoty do objektu změny a provede změnu
    00860           zmena.puvodniBarvaTextu = tabulkaSR.vratBarvu(zmena.radek,zmena.sloupec,0);
    00861           zmena.puvodniBarvaPozadi = tabulkaSR.vratBarvu(zmena.radek,zmena.sloupec,1);
    00862           tabulkaSR.nastavBarvu(zmena.radek,zmena.sloupec,zmena.barvaPozadi,
    00863                                 zmena.barvaTextu);
    00864         }
    00865         else if (zmena.tabulka == kon.TAB_D1)
    00866         {  // tabulka delta1
    00867           // nastaví původní hodnoty do objektu změny a provede změnu
    00868           zmena.puvodniBarvaTextu = tabulkaDelta1.vratBarvu(zmena.radek,zmena.sloupec,0);
    00869           zmena.puvodniBarvaPozadi = tabulkaDelta1.vratBarvu(zmena.radek,zmena.sloupec,1);
    00870           tabulkaDelta1.nastavBarvu(zmena.radek,zmena.sloupec,zmena.barvaPozadi,
    00871                                     zmena.barvaTextu);
    00872         }
    00873         else if (zmena.tabulka == kon.TAB_D2)
    00874         {  // tabulka delta2
    00875           // nastaví původní hodnoty do objektu změny a provede změnu
    00876           zmena.puvodniBarvaTextu = tabulkaDelta2.vratBarvu(zmena.radek,zmena.sloupec,0);
    00877           zmena.puvodniBarvaPozadi = tabulkaDelta2.vratBarvu(zmena.radek,zmena.sloupec,1);
    00878           tabulkaDelta2.nastavBarvu(zmena.radek,zmena.sloupec,zmena.barvaPozadi,
    00879                                     zmena.barvaTextu);
    00880         }
    00881       }  // změna barvy políčka v tabulce
    00882       else if (zmena.operace == kon.ZM_T_P)
    00883       {  // posun řádku tabulky
    00884         if (zmena.tabulka == kon.TAB_SR)
    00885         {  // tabulkaSR
    00886           // posuv řádku
    00887           tabulkaSR.posunRadek(zmena.radek,zmena.smer,zmena.pocet);
    00888         }
    00889         else if (zmena.tabulka == kon.TAB_D1)
    00890         {  // tabulka delta1
    00891           // posuv řádku
    00892           tabulkaDelta1.posunRadek(zmena.radek,zmena.smer,zmena.pocet);
    00893         }
    00894         else if (zmena.tabulka == kon.TAB_D2)
    00895         {  // tabulka delta2
    00896           // posuv řádku
    00897           tabulkaDelta2.posunRadek(zmena.radek,zmena.smer,zmena.pocet);
    00898         }
    00899       }  // posun řádku tabulky
    00900       else if (zmena.operace == kon.ZM_T_R)
    00901       {  // změna rozměrů tabulky
    00902         if (zmena.tabulka == kon.TAB_SR)
    00903         {  // tabulkaSR
    00904           // nastaví původní rozměry do objektu změny a provede změnu
    00905           zmena.puvodneRadku = tabulkaSR.vratPocetRadkuTabulky();
    00906           zmena.puvodneSloupcu = tabulkaSR.vratPocetSloupcuTabulky();
    00907           tabulkaSR.zmenRozmery(zmena.radek,zmena.sloupec);
    00908         }
    00909         else if (zmena.tabulka == kon.TAB_D1)
    00910         {  // tabulka delta1
    00911           // nastaví původní rozměry do objektu změny a provede změnu
    00912           zmena.puvodneRadku = tabulkaDelta1.vratPocetRadkuTabulky();
    00913           zmena.puvodneSloupcu = tabulkaDelta1.vratPocetSloupcuTabulky();
    00914           tabulkaDelta1.zmenRozmery(zmena.radek,zmena.sloupec);
    00915         }
    00916         else if (zmena.tabulka == kon.TAB_D2)
    00917         {  // tabulka delta2
    00918           // nastaví původní rozměry do objektu změny a provede změnu
    00919           zmena.puvodneRadku = tabulkaDelta2.vratPocetRadkuTabulky();
    00920           zmena.puvodneSloupcu = tabulkaDelta2.vratPocetSloupcuTabulky();
    00921           tabulkaDelta2.zmenRozmery(zmena.radek,zmena.sloupec);
    00922         }
    00923       }  // změna rozměrů tabulky
    00924       else if (zmena.operace == kon.ZM_A_B)
    00925       {  // výměna bloku v panelu s algoritmem
    00926         // uloží číslo původního bloku do objektu změny a provede výměnu
    00927         zmena.puvodniCislo = zobrazenyBlokAlgoritmu;
    00928         vypisBlokAlgoritmu(zmena.cislo,true);
    00929       }  // výměna bloku v panelu s algoritmem
    00930       else if (zmena.operace == kon.ZM_A_Z)
    00931       {  // změna zvýrazněného řádku v poli s algoritmem
    00932         // uloží číslo zvýrazněného řádku do objektu změny a provede změnu
    00933         zmena.puvodniCislo = zvyraznenyRadek;
    00934         zvyrazniRadek(zmena.cislo);
    00935       }  // změna zvýrazněného řádku v poli s algoritmem
    00936       else if (zmena.operace == kon.ZM_P)
    00937       {  // změna hodnoty proměnné
    00938         // uloží původní hodnotu proměnné do objektu změny a provede změnu
    00939         zmena.puvodniObsah = vratObsahPolePromenne(zmena.cislo);
    00940         nastavPolePromenne(zmena.cislo,zmena.novyObsah);
    00941       }  // změna hodnoty proměnné
    00942       else if (zmena.operace == kon.ZM_N)
    00943       {  // změna obsahu pole s nápovědou
    00944         // uloží číslo zobrazeného textu do objektu změny a provede změnu
    00945         zmena.puvodniCislo = zobrazenaNapoveda;
    00946         zobrazenaNapoveda = zmena.cislo;
    00947         jTextAreaNapoveda.setText(kon.textyNapovedy[zmena.cislo]);
    00948       }  // změna obsahu pole s nápovědou
    00949       else if (zmena.operace == kon.ZM_PO)
    00950       {  // změna textu popisku
    00951         if (zmena.cislo == kon.POPISEK_IJ)
    00952         {  // pokud se jedná o popisek i-j+1 nebo i+j-1
    00953           // uloží původní text popisku do objektu změny a provede změnu
    00954           zmena.puvodniObsah = jLabelij.getText();
    00955           jLabelij.setText(zmena.novyObsah);
    00956         }
    00957         else if (zmena.cislo == kon.POPISEK_MJ)
    00958         {  // pokud se jedná o popisek m-j+1 nebo n-m+1
    00959           // uloží původní text popisku do objektu změny a provede změnu
    00960           zmena.puvodniObsah = jLabelmj.getText();
    00961           jLabelmj.setText(zmena.novyObsah);
    00962         }
    00963         else if (zmena.cislo == kon.POPISEK_L)
    00964         {  // pokud se jedná o popisek L nebo d1p
    00965           // uloží původní text popisku do objektu změny a provede změnu
    00966           zmena.puvodniObsah = jLabelL.getText();
    00967           jLabelL.setText(zmena.novyObsah);
    00968         }
    00969       }  // změna textu popisku
    00970
    00971       if (iteratorViz.hasNext())
    00972       {  // pokud je k dispozici další změna
    00973         // získání informací o další změně
    00974         zmena = (ZmenaZobrazeni)iteratorViz.next();
    00975       }
    00976       else
    00977       {  // pokud další změna není k dispozici
    00978         konec = true;  // ukončí cyklus
    00979       }
    00980     }  // provedení všech změn v kroku
    00981
    00982     if (zmena.cisloKroku != aktKrok)
    00983     {  // přejel na 1. změnu dalšího kroku, je nutno se vrátit
    00984       zmena = (ZmenaZobrazeni)iteratorViz.previous();  // návrat o 1 položku zpět
    00985     }
    00986   }  // krokVpred()
    00987
    00988   /**
    00989    * Metoda pro provedení jednoho zpětného kroku vizualizace
    00990    */
    00991   private void krokZpet()
    00992   {
    00993     ZmenaZobrazeni zmena;  // proměnná pro informace o změně
    00994     boolean konec = false;  // pomocná proměnná
    00995
    00996     if (!iteratorViz.hasPrevious())
    00997     {  // pokud není v seznamu žádná změna k vrácení, nelze pokračovat
    00998       return;
    00999     }
    01000
    01001     // získání informací o poslední změně v předchozím kroku
    01002     zmena = (ZmenaZobrazeni)iteratorViz.previous();
    01003
    01004     while (!konec && zmena.cisloKroku == aktKrok)
    01005     {  // vrácení všech změn v kroku
    01006       if (zmena.operace == kon.ZM_T_H)
    01007       {  // změna hodnoty políčka v tabulce
    01008         if (zmena.tabulka == kon.TAB_SR)
    01009         {  // tabulkaSR
    01010           tabulkaSR.nastavObsah(zmena.radek,zmena.sloupec,zmena.puvodniObsah);
    01011         }
    01012         else if (zmena.tabulka == kon.TAB_D1)
    01013         {  // tabulka delta1
    01014           tabulkaDelta1.nastavObsah(zmena.radek,zmena.sloupec,zmena.puvodniObsah);
    01015         }
    01016         else if (zmena.tabulka == kon.TAB_D2)
    01017         {  // tabulka delta2
    01018           tabulkaDelta2.nastavObsah(zmena.radek,zmena.sloupec,zmena.puvodniObsah);
    01019         }
    01020       }  // změna hodnoty políčka v tabulce
    01021       else if (zmena.operace == kon.ZM_T_B)
    01022       {  // změna barvy políčka v tabulce
    01023         if (zmena.tabulka == kon.TAB_SR)
    01024         {  // tabulkaSR
    01025           tabulkaSR.nastavBarvu(zmena.radek,zmena.sloupec,zmena.puvodniBarvaPozadi,
    01026                                 zmena.puvodniBarvaTextu);
    01027         }
    01028         else if (zmena.tabulka == kon.TAB_D1)
    01029         {  // tabulka delta1
    01030           tabulkaDelta1.nastavBarvu(zmena.radek,zmena.sloupec,zmena.puvodniBarvaPozadi,
    01031                                     zmena.puvodniBarvaTextu);
    01032         }
    01033         else if (zmena.tabulka == kon.TAB_D2)
    01034         {  // tabulka delta2
    01035           tabulkaDelta2.nastavBarvu(zmena.radek,zmena.sloupec,zmena.puvodniBarvaPozadi,
    01036                                     zmena.puvodniBarvaTextu);
    01037         }
    01038       }  // změna barvy políčka v tabulce
    01039       else if (zmena.operace == kon.ZM_T_P)
    01040       {  // posun řádku tabulky
    01041         if (zmena.tabulka == kon.TAB_SR)
    01042         {  // tabulkaSR
    01043           if (zmena.smer == tabulkaSR.POSUN_VPRAVO)
    01044           {  // pokud se posouvalo vpravo, posune vlevo
    01045             tabulkaSR.posunRadek(zmena.radek,tabulkaSR.POSUN_VLEVO,zmena.pocet);
    01046           }
    01047           else
    01048           {  // pokud se posouvalo vlevo, posune vpravo
    01049             tabulkaSR.posunRadek(zmena.radek,tabulkaSR.POSUN_VPRAVO,zmena.pocet);
    01050           }
    01051         }
    01052         else if (zmena.tabulka == kon.TAB_D1)
    01053         {  // tabulka delta1
    01054           if (zmena.smer == tabulkaDelta1.POSUN_VPRAVO)
    01055           {  // pokud se posouvalo vpravo, posune vlevo
    01056             tabulkaDelta1.posunRadek(zmena.radek,tabulkaDelta1.POSUN_VLEVO,zmena.pocet);
    01057           }
    01058           else
    01059           {  // pokud se posouvalo vlevo, posune vpravo
    01060             tabulkaDelta1.posunRadek(zmena.radek,tabulkaDelta1.POSUN_VPRAVO,zmena.pocet);
    01061           }
    01062         }
    01063         else if (zmena.tabulka == kon.TAB_D2)
    01064         {  // tabulka delta2
    01065           if (zmena.smer == tabulkaDelta2.POSUN_VPRAVO)
    01066           {  // pokud se posouvalo vpravo, posune vlevo
    01067             tabulkaDelta2.posunRadek(zmena.radek,tabulkaDelta2.POSUN_VLEVO,zmena.pocet);
    01068           }
    01069           else
    01070           {  // pokud se posouvalo vlevo, posune vpravo
    01071             tabulkaDelta2.posunRadek(zmena.radek,tabulkaDelta2.POSUN_VPRAVO,zmena.pocet);
    01072           }
    01073         }
    01074       }  // posun řádku tabulky
    01075       else if (zmena.operace == kon.ZM_T_R)
    01076       {  // změna rozměrů tabulky
    01077         if (zmena.tabulka == kon.TAB_SR)
    01078         {  // tabulkaSR
    01079           tabulkaSR.zmenRozmery(zmena.puvodneRadku,zmena.puvodneSloupcu);
    01080         }
    01081         else if (zmena.tabulka == kon.TAB_D1)
    01082         {  // tabulka delta1
    01083           tabulkaDelta1.zmenRozmery(zmena.puvodneRadku,zmena.puvodneSloupcu);
    01084         }
    01085         else if (zmena.tabulka == kon.TAB_D2)
    01086         {  // tabulka delta2
    01087           tabulkaDelta2.zmenRozmery(zmena.puvodneRadku,zmena.puvodneSloupcu);
    01088         }
    01089       }  // změna rozměrů tabulky
    01090       else if (zmena.operace == kon.ZM_A_B)
    01091       {  // výměna bloku v panelu s algoritmem
    01092         vypisBlokAlgoritmu(zmena.puvodniCislo,true);
    01093       }  // výměna bloku v panelu s algoritmem
    01094       else if (zmena.operace == kon.ZM_A_Z)
    01095       {  // změna zvýrazněného řádku v poli s algoritmem
    01096         zvyrazniRadek(zmena.puvodniCislo);
    01097       }  // změna zvýrazněného řádku v poli s algoritmem
    01098       else if (zmena.operace == kon.ZM_P)
    01099       {  // změna hodnoty proměnné
    01100         nastavPolePromenne(zmena.cislo,zmena.puvodniObsah);
    01101       }  // změna hodnoty proměnné
    01102       else if (zmena.operace == kon.ZM_N)
    01103       {  // změna obsahu pole s nápovědou
    01104         zobrazenaNapoveda = zmena.puvodniCislo;
    01105         jTextAreaNapoveda.setText(kon.textyNapovedy[zmena.puvodniCislo]);
    01106       }  // změna obsahu pole s nápovědou
    01107       else if (zmena.operace == kon.ZM_PO)
    01108       {  // změna textu popisku
    01109         if (zmena.cislo == kon.POPISEK_IJ)
    01110         {  // pokud se jedná o popisek i-j+1 nebo i+j-1
    01111           jLabelij.setText(zmena.puvodniObsah);
    01112         }
    01113         else if (zmena.cislo == kon.POPISEK_MJ)
    01114         {  // pokud se jedná o popisek m-j+1 nebo n-m+1
    01115           jLabelmj.setText(zmena.puvodniObsah);
    01116         }
    01117         else if (zmena.cislo == kon.POPISEK_L)
    01118         {  // pokud se jedná o popisek L nebo d1p
    01119           jLabelL.setText(zmena.puvodniObsah);
    01120         }
    01121       }  // změna textu popisku
    01122
    01123       if (iteratorViz.hasPrevious())
    01124       {  // pokud je k dispozici předchozí změna
    01125         // získání informací o předchozí změně
    01126         zmena = (ZmenaZobrazeni)iteratorViz.previous();
    01127       }
    01128       else
    01129       {  // pokud předchozí změna není k dispozici
    01130         konec = true;  // ukončí cyklus
    01131       }
    01132     }  // vrácení všech změn v kroku
    01133
    01134     if (zmena.cisloKroku != aktKrok)
    01135     {  // přejel na poslední změnu předchozího kroku, je nutno se vrátit
    01136       zmena = (ZmenaZobrazeni)iteratorViz.next();  // návrat o 1 položku vpřed
    01137     }
    01138
    01139     aktKrok--;  // byl proveden krok zpět
    01140
    01141     // aktualizuje obsah políčka s počítadlem kroků
    01142     jLabelPocitadloKroku.setText("krok " + aktKrok + " / " + pocetKroku);
    01143   }  // krokZpet()
    01144
    01145 } // public class AppletBoyerMooreDemo
    01146
    01147 /*** Konec souboru AppletBoyerMooreDemo.java ***/