• 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 ***/

Generováno čt 3. bře 2011 13.55:32 pro projekt Aplet pro demonstraci Boyerova-Mooreova algoritmu - programem  doxygen 1.7.1