Applet pro demonstraci Boyerova-Mooreova algoritmu  1.0
AppletBoyerMooreDemo.java
Zobrazit dokumentaci tohoto souboru.
1 /******************************************************************************
2  * Název projektu: Applet pro demonstraci Boyerova-Mooreova algoritmu
3  * Balíček: boyermooredemo
4  * Soubor: AppletBoyerMooreDemo.java
5  * Datum: 11.4.2008
6  * Poslední změna: 18.4.2008
7  * Autor: Jaroslav Dytrych xdytry00
8  *
9  * Popis: Třída tvořící applet pro demonstraci Boyerova-Mooreova algoritmu
10  *
11  ******************************************************************************/
12 
13 /**
14  * @file AppletBoyerMooreDemo.java
15  *
16  * @brief Třída AppletBoyerMooreDemo - appplet pro demonstraci BMA, základ projektu
17  */
18 
19 /**
20  * @package boyermooredemo
21  *
22  * @brief Applet pro demonstraci Boyerova-Mooreova algoritmu
23  */
24 
25 package boyermooredemo;
26 
27 import java.awt.Color;
28 import java.awt.Component;
29 import java.awt.Dimension;
30 import java.awt.Font;
31 import java.awt.Rectangle;
32 
33 import java.awt.event.MouseAdapter;
34 import java.awt.event.MouseEvent;
35 
36 import java.util.ArrayList;
37 import java.util.ListIterator;
38 
39 import javax.swing.BorderFactory;
40 import javax.swing.JFrame;
41 import javax.swing.JButton;
42 import javax.swing.JLabel;
43 import javax.swing.JOptionPane;
44 import javax.swing.JScrollPane;
45 import javax.swing.JTextArea;
46 import javax.swing.JTextField;
47 import javax.swing.SwingConstants;
48 
49 /**
50  * Třída tvořící applet pro demonstraci Boyerova-Mooreova algoritmu
51  *
52  * @brief Applet pro demonstraci BMA, základ projektu
53  */
54 public class AppletBoyerMooreDemo extends JFrame {
55 
56  /**
57  * Instance třídy s konstantami
58  */
59  public Konstanty kon = new Konstanty(); // třída s konstantami
60  /**
61  * Instance třídy s BMA
62  */
63  private Algoritmus algBMA = new Algoritmus(this); // třída s BMA
64 
65  /** Aktuální krok vizualizace */
66  private int aktKrok = 0;
67  /** Celkový počet kroků vizualizace */
68  public int pocetKroku = 0;
69  /**
70  * Kontejner pro informace o změnách uživatelského rozhraní při vizualizaci
71  */
72  public ArrayList<ZmenaZobrazeni> prubehViz = new ArrayList<ZmenaZobrazeni>();
73  /**
74  * Iterátor pro kontejner s informacemi o změnách uživatelského rozhraní
75  * při vizualizaci
76  */
77  public ListIterator iteratorViz;
78 
79  /** Číslo zobrazeného textu nápovědy */
80  private int zobrazenaNapoveda = 0;
81 
82  /**
83  * Číslo aktuálně zobrazeného bloku algoritmu, pokud je vypsáno více bloků,
84  * číslo prvního z nich
85  */
86  private int zobrazenyBlokAlgoritmu = 0;
87  /** Číslo aktuálně zvýrazněného řádku algoritmu */
88  private int zvyraznenyRadek = kon.ZADNY_RADEK;
89 
90  /** Popisek pro nadpis v hlavním panelu appletu */
91  private JLabel jLabelNadpis = new JLabel();
92 
93  /** Popisek políčka pro hledaný řetězec */
94  private JLabel jLabelHledanyRetezec = new JLabel();
95  /** Políčko pro hledaný řetězec */
96  private JTextField jTextFieldHledanyRetezec = new JTextField();
97 
98  /** Popisek textového pole pro prohledávaný text */
99  private JLabel jLabelProhledavanyText = new JLabel();
100  /** Textové pole pro prohledávaný text */
101  private JTextArea jTextAreaProhledavanyText = new JTextArea();
102  /** Skrolovací panel pro textové pole pro prohledávaný text */
103  private JScrollPane jScrollPaneProhledavanyText = new JScrollPane();
104 
105  /** Popisek pro panel pro zobrazení zdrojového textu algoritmu */
106  private JLabel jLabelAlgoritmus = new JLabel();
107  /** Panel pro zobrazení zdrojového textu algoritmu */
109  /** Skrolovací panel pro panel pro zobrazení zdrojového textu algoritmu */
110  private JScrollPane jScrollPaneAlgoritmus = new JScrollPane();
111 
112  /** Tabulka s řetězci pro vizualizaci (zobrazuje porovnávání řetězců) */
113  private Tabulka tabulkaSR = new Tabulka(kon.TAB_SR_VR[0],kon.TAB_SR_VR[1],
114  0,2,new Color(255,255,255),
115  new Color(0,0,0), false, false);
116  /** Skrolovací panel pro tabulku s řetězci pro vizualizaci */
117  private JScrollPane jScrollPaneTabulkaSR = new JScrollPane();
118 
119  /** Popisek tabulky delta1 */
120  private JLabel jLabelTabulkaDelta1 = new JLabel();
121  /** Tabulka delta1 */
122  private Tabulka tabulkaDelta1 = new Tabulka(kon.TAB_D1_VR[0],kon.TAB_D1_VR[1],
123  1,4,new Color(255,255,255),
124  new Color(0,0,0), true, true);
125  /** Skrolovací panel pro tabulku delta1 */
126  private JScrollPane jScrollPaneTabulkaDelta1 = new JScrollPane();
127 
128  /** Popisek pro tabulku delta2 */
129  private JLabel jLabelTabulkaDelta2 = new JLabel();
130  /** Tabulka delta2 (jsou v ní zobrazeny i pole pat a shoda) */
131  private Tabulka tabulkaDelta2 = new Tabulka(kon.TAB_D2_VR[0],kon.TAB_D2_VR[1],
132  1,4,new Color(255,255,255),
133  new Color(0,0,0), true, false);
134  /** Skrolovací panel pro tabulku delta2 */
135  private JScrollPane jScrollPaneTabulkaDelta2 = new JScrollPane();
136 
137  /** Tlačítko "Zpět" */
138  private JButton jButtonZpet = new JButton();
139  /** Tlačítko "Vpřed" */
140  private JButton jButtonVpred = new JButton();
141  /** Tlačítko "Reset" */
142  private JButton jButtonReset = new JButton();
143 
144  /** Popisek pro textové pole s nápovědou */
145  private JLabel jLabelNapoveda = new JLabel();
146  /** Textové pole s nápovědou */
147  private JTextArea jTextAreaNapoveda = new JTextArea();
148  /** Skrolovací panel pro textové pole s nápovědou */
149  private JScrollPane jScrollPaneNapoveda = new JScrollPane();
150 
151  /** Popisek pro políčko s proměnnou m */
152  private JLabel jLabelm = new JLabel();
153  /** Políčko s proměnnou m */
154  private JTextField jTextFieldm = new JTextField();
155 
156  /** Popisek pro políčko s proměnnou n */
157  private JLabel jLabeln = new JLabel();
158  /** Políčko s proměnnou n */
159  private JTextField jTextFieldn = new JTextField();
160 
161  /** Popisek pro políčko s proměnnou i */
162  private JLabel jLabeli = new JLabel();
163  /** Políčko s proměnnou i */
164  private JTextField jTextFieldi = new JTextField();
165 
166  /** Popisek pro políčko s proměnnou j */
167  private JLabel jLabelj = new JLabel();
168  /** Políčko s proměnnou j */
169  private JTextField jTextFieldj = new JTextField();
170 
171  /** Popisek pro políčko s proměnnou m-j+1 nebo n-m+1 */
172  private JLabel jLabelmj = new JLabel();
173  /** Políčko s proměnnou m-j+1 nebo n-m+1 */
174  private JTextField jTextFieldmj = new JTextField();
175 
176  /** Popisek pro políčko s proměnnou i-j+1 nebo i+j-1 */
177  private JLabel jLabelij = new JLabel();
178  /** Políčko s proměnnou i-j+1 nebo i+j-1 */
179  private JTextField jTextFieldij = new JTextField();
180 
181  /** Popisek pro políčko s proměnnou s */
182  private JLabel jLabels = new JLabel();
183  /** Políčko s proměnnou s */
184  private JTextField jTextFields = new JTextField();
185 
186  /** Popisek pro políčko s proměnnou t */
187  private JLabel jLabelt = new JLabel();
188  /** Políčko s proměnnou t */
189  private JTextField jTextFieldt = new JTextField();
190 
191  /** Popisek pro políčko s proměnnou L nebo d1P */
192  private JLabel jLabelL = new JLabel();
193  /** Políčko s proměnnou L nebo d1P */
194  private JTextField jTextFieldL = new JTextField();
195 
196  /** Popisek pro políčko s proměnnou poz */
197  private JLabel jLabelpoz = new JLabel();
198  /** Políčko s proměnnou poz */
199  private JTextField jTextFieldpoz = new JTextField();
200 
201  /** Popisek pro počítadlo kroků (přímo obsahuje počítadlo kroků) */
202  private JLabel jLabelPocitadloKroku = new JLabel();
203 
204  /** Popisek pro legendu */
205  private JLabel jLabelLegenda = new JLabel();
206  /** 1. položka legendy (modrý obdélníček) */
207  private JTextField jTextFieldLegendaZvyrazneny = new JTextField();
208  /** 1. položka legendy (zvýrazněný řádek algoritmu) */
209  private JLabel jLabel1LegendaZvyrazneny = new JLabel();
210 
211 
212  /**
213  * Konstruktor třídy - upravená metoda pro inicializaci původního appletu
214  */
216  {
217  // vytvoříme JFrame
218  super();
219  this.addWindowListener(new java.awt.event.WindowAdapter() {
220  public void windowClosing(java.awt.event.WindowEvent e) {
221  System.exit(0);
222  };
223  });
224 
225  try {
226  jbInit(); // inicializace oblasti appletu
227  } catch (Exception e) {
228  e.printStackTrace();
229  }
230 
231  this.setVisible(true); // zobrazení JFrame
232  } // public AppletBoyerMooreDemo()
233 
234  /**
235  * Metoda pro spuštění appletu konvertovaného na samostatnou aplikaci
236  */
237  public static void main(String[] args) {
239  }
240 
241  /**
242  * Metoda pro inicializaci oblasti appletu
243  *
244  * @throws Exception Libovolná obecná programová výjimka při inicializaci
245  */
246  private void jbInit() throws Exception {
247  // nastavení rozložení v panelu
248  this.getContentPane().setLayout(null);
249  // nastavení rozměrů a písma hlavního panelu appletu
250  this.setSize(new Dimension(964, 720));
251  this.setFont(new Font("Dialog", 1, 12));
252 
253  // nastavení jednotlivých komponent GUI (rozměry, umístění, texty popisků,
254  // barvy, tool-tipy, písma)
255  jLabelNadpis.setText("Demonstrace Boyerova-Mooreova algoritmu");
256  jLabelNadpis.setToolTipText("null");
257  jLabelNadpis.setFont(new Font("Dialog", 1, 14));
258  jLabelNadpis.setBounds(new Rectangle(20, 10, 385, 15));
259  jLabelHledanyRetezec.setText("Hledaný řetězec:");
260  jLabelHledanyRetezec.setBounds(new Rectangle(20, 35, 135, 20));
261  jLabelHledanyRetezec.setLabelFor(jTextFieldHledanyRetezec);
262  jTextFieldHledanyRetezec.setBounds(new Rectangle(140, 35, 305, 20));
263  jLabelProhledavanyText.setText("Prohledávaný text:");
264  jLabelProhledavanyText.setBounds(new Rectangle(20, 60, 140, 20));
265  jScrollPaneProhledavanyText.setBounds(new Rectangle(20, 80, 425, 65));
266  jTextAreaProhledavanyText.setColumns(20);
267  jTextAreaProhledavanyText.setRows(4);
268  jScrollPaneAlgoritmus.setBounds(new Rectangle(460, 25, 475, 610));
269  jLabelAlgoritmus.setText("Algoritmus:");
270  jLabelAlgoritmus.setBounds(new Rectangle(460, 5, 135, 20));
271  jScrollPaneTabulkaSR.setBounds(new Rectangle(20, 155, 425, 65));
272  jScrollPaneTabulkaDelta1.setBounds(new Rectangle(20, 245, 425, 75));
273  jScrollPaneTabulkaDelta2.setBounds(new Rectangle(20, 345, 425, 120));
274  jLabelTabulkaDelta1.setText("Tabulka delta1 (CharJump):");
275  jLabelTabulkaDelta2.setText("Tabulka delta2 (MatchJump):");
276  jLabelTabulkaDelta1.setBounds(new Rectangle(20, 225, 225, 20));
277  jLabelTabulkaDelta2.setBounds(new Rectangle(20, 325, 225, 20));
278  jButtonZpet.setText("Zpět");
279  jButtonZpet.setBounds(new Rectangle(25, 525, 70, 25));
280  jButtonVpred.setText("Vpřed");
281  jButtonVpred.setBounds(new Rectangle(110, 525, 90, 25));
282 
283  jButtonReset.setText("Reset");
284  jButtonReset.setBounds(new Rectangle(365, 525, 75, 25));
285  jLabelNapoveda.setText("Nápověda:");
286  jLabelNapoveda.setBounds(new Rectangle(25, 550, 75, 20));
287  jScrollPaneNapoveda.setBounds(new Rectangle(25, 570, 420, 95));
288  jLabelLegenda.setText("Legenda:");
289  jLabelLegenda.setBounds(new Rectangle(465, 640, 80, 20));
290  jLabelLegenda.setFont(new Font("Dialog", 1, 12));
291  jLabeli.setText("i = ");
292  jLabeli.setBounds(new Rectangle(100, 470, 25, 20));
293  jLabelj.setBounds(new Rectangle(170, 470, 25, 20));
294  jLabelj.setText("j = ");
295  jTextFieldi.setBounds(new Rectangle(125, 470, 35, 20));
296  jTextFieldi.setBackground(new Color(99, 255, 99));
297  jTextFieldj.setBounds(new Rectangle(195, 470, 35, 20));
298  jTextFieldj.setBackground(new Color(115, 255, 255));
299  jLabelm.setText("m = ");
300  jLabelm.setBounds(new Rectangle(25, 470, 40, 20));
301  jLabelm.setToolTipText("Délka hledaného řetězce");
302  jTextFieldm.setBounds(new Rectangle(55, 470, 35, 20));
303  jTextFieldm.setToolTipText("Délka hledaného řetězce");
304  jTextFieldm.setBackground(Color.white);
305  jLabelmj.setText("m-j+1 = ");
306  jLabelmj.setBounds(new Rectangle(332, 470, 65, 20));
307  jTextFieldmj.setBounds(new Rectangle(395, 470, 35, 20));
308  jTextFieldmj.setBackground(new Color(255, 165, 165));
309  jLabelij.setText("i-j+1 = ");
310  jLabelij.setBounds(new Rectangle(240, 470, 55, 20));
311  jTextFieldij.setBounds(new Rectangle(290, 470, 35, 20));
312  jTextFieldij.setBackground(new Color(255, 255, 66));
313  jLabeln.setText("n = ");
314  jLabeln.setBounds(new Rectangle(25, 495, 30, 20));
315  jLabeln.setToolTipText("Délka prohledávaného textu");
316  jTextFieldn.setBounds(new Rectangle(55, 495, 35, 20));
317  jTextFieldn.setToolTipText("Délka prohledávaného textu");
318  jTextFieldn.setBackground(Color.white);
319  jLabels.setText("s = ");
320  jLabels.setBounds(new Rectangle(100, 495, 25, 20));
321  jTextFields.setBounds(new Rectangle(125, 495, 35, 20));
322  jTextFields.setBackground(new Color(255, 165, 214));
323  jLabelt.setText("t = ");
324  jLabelt.setBounds(new Rectangle(170, 495, 25, 20));
325  jTextFieldt.setBounds(new Rectangle(195, 495, 35, 20));
326  jTextFieldt.setBackground(new Color(198, 198, 255));
327  jLabelL.setText(" L = ");
328  jLabelL.setBounds(new Rectangle(245, 495, 50, 20));
329  jTextFieldL.setBounds(new Rectangle(290, 495, 35, 20));
330  jTextFieldL.setBackground(new Color(255, 222, 214));
331  jLabelpoz.setText("poz = ");
332  jLabelpoz.setBounds(new Rectangle(350, 495, 45, 20));
333  jLabelpoz.setToolTipText("Pozice hledaného řetězce v textu");
334  jTextFieldpoz.setBounds(new Rectangle(395, 495, 35, 20));
335  jTextFieldpoz.setBackground(new Color(255, 181, 99));
336  jTextFieldpoz.setToolTipText("Pozice hledaného řetězce v textu");
337  jLabelPocitadloKroku.setBounds(new Rectangle(210, 525, 115, 25));
338  jLabelPocitadloKroku.setHorizontalAlignment(SwingConstants.CENTER);
339  jLabelPocitadloKroku.setToolTipText("null");
340  jLabel1LegendaZvyrazneny.setText("Zvýraznění naposledy provedeného řádku zdrojového kódu");
341  jLabel1LegendaZvyrazneny.setBounds(new Rectangle(555, 640, 370, 20));
342  jLabel1LegendaZvyrazneny.setFont(new Font("Dialog", 0, 10));
343  jTextFieldLegendaZvyrazneny.setBounds(new Rectangle(535, 645, 15, 10));
344  jTextFieldLegendaZvyrazneny.setBackground(kon.BARVA_ZVYRAZNENI_P);
345  jTextFieldLegendaZvyrazneny.setEditable(false);
346 
347  // Přiřazení obsluhy událostí myši tlačítku "Vpřed"
348  jButtonVpred.addMouseListener(new MouseAdapter() {
349  public void mouseClicked(MouseEvent e)
350  { // obsluha kliknutí myší
351  jButtonVpred_mouseClicked(e); // volání metody pro obsluhu
352  }
353  });
354  // Přiřazení obsluhy událostí myši tlačítku "Zpět"
355  jButtonZpet.addMouseListener(new MouseAdapter() {
356  public void mouseClicked(MouseEvent e)
357  { // obsluha kliknutí myší
358  jButtonZpet_mouseClicked(e); // volání metody pro obsluhu
359  }
360  });
361  // Přiřazení obsluhy událostí myši tlačítku "Reset"
362  jButtonReset.addMouseListener(new MouseAdapter() {
363  public void mouseClicked(MouseEvent e)
364  { // obsluha kliknutí myší
365  jButtonReset_mouseClicked(e); // volání metody pro obsluhu
366  }
367  });
368 
369  // nastaví výchozí šířku buňky tabulek na šířku písmene A
370  tabulkaSR.nastavObsah(0,1,"A");
371  tabulkaSR.nastavObsah(0,1,"");
372  tabulkaDelta1.nastavObsah(0,1,"A");
373  tabulkaDelta1.nastavObsah(0,1,"");
374  tabulkaDelta2.nastavObsah(0,1,"A");
375  tabulkaDelta2.nastavObsah(0,1,"");
376 
377  // vloží texty záhlaví do řádků
378  tabulkaDelta1.nastavObsah(0,0,"c");
379  tabulkaDelta1.nastavObsah(1,0,"delta1[c]");
380  tabulkaDelta2.nastavObsah(0,0,"i");
381  tabulkaDelta2.nastavObsah(1,0,"pat[i]");
382  tabulkaDelta2.nastavObsah(2,0,"shoda[i]");
383  tabulkaDelta2.nastavObsah(3,0,"delta2[i]");
384 
385  // zakázání modifikace panelu s algoritmem
386  barevnyTextPaneAlgoritmus.setEditable(false);
387 
388  // výpis kompletního zdrojového kódu algoritmu
389  vypisAlgoritmus();
390 
391  // zakázání modifikace nápovědy
392  jTextAreaNapoveda.setEditable(false);
393 
394  // vloží do pole s nápovědou výchozí obsah
395  jTextAreaNapoveda.setText(kon.textyNapovedy[0]);
396  zobrazenaNapoveda = 0;
397 
398  // zakázání modifikace políček s proměnnými
399  jTextFieldm.setEditable(false);
400  jTextFieldn.setEditable(false);
401  jTextFieldi.setEditable(false);
402  jTextFieldj.setEditable(false);
403  jTextFieldij.setEditable(false);
404  jTextFieldmj.setEditable(false);
405  jTextFields.setEditable(false);
406  jTextFieldt.setEditable(false);
407  jTextFieldL.setEditable(false);
408  jTextFieldpoz.setEditable(false);
409 
410  // okraje políček s proměnnými
411  jTextFieldm.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
412  jTextFieldn.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
413  jTextFieldi.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
414  jTextFieldj.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
415  jTextFieldij.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
416  jTextFieldmj.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
417  jTextFields.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
418  jTextFieldt.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
419  jTextFieldL.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
420  jTextFieldpoz.setBorder(BorderFactory.createLineBorder(new Color(148,148,148), 1));
421 
422 
423  // vloží prvky do jejich skrolovacích panelů
424  jScrollPaneTabulkaSR.setViewportView(tabulkaSR);
425  jScrollPaneTabulkaDelta1.setViewportView(tabulkaDelta1);
426  jScrollPaneTabulkaDelta2.setViewportView(tabulkaDelta2);
427  jScrollPaneAlgoritmus.setViewportView(barevnyTextPaneAlgoritmus);
428  jScrollPaneNapoveda.setViewportView(jTextAreaNapoveda);
429  jScrollPaneProhledavanyText.setViewportView(jTextAreaProhledavanyText);
430 
431  // vložení komponent GUI do panelu s appletem
432  this.getContentPane().add(jTextFieldLegendaZvyrazneny, null);
433  this.getContentPane().add(jLabel1LegendaZvyrazneny, null);
434  this.getContentPane().add(jLabelPocitadloKroku, null);
435  this.getContentPane().add(jTextFieldpoz, null);
436  this.getContentPane().add(jLabelpoz, null);
437  this.getContentPane().add(jTextFieldL, null);
438  this.getContentPane().add(jLabelL, null);
439  this.getContentPane().add(jTextFieldt, null);
440  this.getContentPane().add(jLabelt, null);
441  this.getContentPane().add(jTextFields, null);
442  this.getContentPane().add(jLabels, null);
443  this.getContentPane().add(jTextFieldn, null);
444  this.getContentPane().add(jLabeln, null);
445  this.getContentPane().add(jTextFieldij, null);
446  this.getContentPane().add(jLabelij, null);
447  this.getContentPane().add(jTextFieldmj, null);
448  this.getContentPane().add(jLabelmj, null);
449  this.getContentPane().add(jTextFieldm, null);
450  this.getContentPane().add(jLabelm, null);
451  this.getContentPane().add(jTextFieldj, null);
452  this.getContentPane().add(jTextFieldi, null);
453  this.getContentPane().add(jLabelj, null);
454  this.getContentPane().add(jLabeli, null);
455  this.getContentPane().add(jLabelLegenda, null);
456  this.getContentPane().add(jScrollPaneNapoveda, null);
457  this.getContentPane().add(jLabelNapoveda, null);
458  this.getContentPane().add(jButtonReset, null);
459  this.getContentPane().add(jButtonVpred, null);
460  this.getContentPane().add(jButtonZpet, null);
461  this.getContentPane().add(jLabelTabulkaDelta1, null);
462  this.getContentPane().add(jLabelTabulkaDelta2, null);
463  this.getContentPane().add(jScrollPaneTabulkaSR, null);
464  this.getContentPane().add(jLabelAlgoritmus, null);
465  this.getContentPane().add(jScrollPaneAlgoritmus, null);
466  this.getContentPane().add(jScrollPaneProhledavanyText, null);
467  this.getContentPane().add(jLabelProhledavanyText, null);
468  this.getContentPane().add(jTextFieldHledanyRetezec, null);
469  this.getContentPane().add(jLabelHledanyRetezec, null);
470  this.getContentPane().add(jLabelNadpis);
471  this.getContentPane().add(jScrollPaneTabulkaDelta1, null);
472  this.getContentPane().add(jScrollPaneTabulkaDelta2, null);
473 
474  // deaktivace tlačítka zpět
475  jButtonZpet.setEnabled(false);
476  } // private void jbInit()
477 
478  /**
479  * Metoda pro obsluhu kliknutí na tlačítko Vpřed
480  *
481  * @param e Událost myši
482  */
483  private void jButtonVpred_mouseClicked(MouseEvent e) {
484  if (e.getButton()==e.BUTTON1 && ((Component)e.getSource()).isEnabled())
485  { // pokud se jedná o levé tlačítko myši a tlačítko Vpřed není zakázané
486  if (aktKrok == 0)
487  { // pokud zatím vizualizace nezačala
488  if (jTextFieldHledanyRetezec.getText().length() < 1)
489  { // pokud nebyl zadán hledaný řetězec
490  JOptionPane.showMessageDialog(this, "Nebyl zadán hledaný řetězec",
491  "Chyba",JOptionPane.ERROR_MESSAGE);
492  return;
493  }
494  if (jTextAreaProhledavanyText.getText().length() < 1)
495  { // pokud nebyl zadán prohledávaný text
496  JOptionPane.showMessageDialog(this, "Nebyl zadán prohledávaný text",
497  "Chyba",JOptionPane.ERROR_MESSAGE);
498  return;
499  }
500 
501  // zakáže editaci řetězců
502  jTextFieldHledanyRetezec.setEditable(false);
503  jTextAreaProhledavanyText.setEditable(false);
504 
505  // přejde na 1. krok vizualizace
506  aktKrok = 1;
507  // počet kroků vizualizace je nyní 1
508  pocetKroku = 1;
509 
510  // Provede hledání řetězce pomocí BMA a vytvoří seznam změn zobrazení,
511  // se kterým bude následně prováděna vizualizace.
512  // Nastaví také počet kroků.
513  algBMA.BMA(jTextFieldHledanyRetezec.getText(),jTextAreaProhledavanyText.getText());
514  // získá iterátor do kontejneru se změnami zobrazení
515  iteratorViz = prubehViz.listIterator();
516 
517  // vypíše obsah políčka s počítadlem kroků
518  jLabelPocitadloKroku.setText("krok 1 z " + pocetKroku);
519 
520  // nastaví 2. text nápovědy
521  zobrazenaNapoveda = 1;
522  jTextAreaNapoveda.setText(kon.textyNapovedy[zobrazenaNapoveda]);
523 
524  // vloží do pole s algoritmem metodu BMA
525  this.vypisBlokAlgoritmu(kon.BLOK_BMA,true);
526  // zvýrazní 1. řádek (9. řádek zdrojového kódu)
527  this.zvyrazniRadek(9);
528  } // pokud zatím vizualizace nezačala
529  else
530  { // pokud již vizualizace probíhá
531  if (aktKrok < pocetKroku)
532  { // pokud lze udělat krok vpřed
533  krokVpred(); // udělá krok vpřed
534 
535  if (aktKrok >= pocetKroku)
536  { // pokud již nebude možné udělat další krok vpřed
537  jButtonVpred.setEnabled(false); // zakáže tlačítko Vpřed
538  }
539  // byl udělán krok vpřed a následně tedy bude možné i zpět
540  jButtonZpet.setEnabled(true); // povolí tlačítko Zpět
541  } // pokud lze udělat krok vpřed
542  else
543  { // pokud nelze udělat krok vpřed
544  jButtonVpred.setEnabled(false); // zakáže tlačítko Vpřed
545  }
546  } // pokud již vizualizace probíhá
547  } // pokud se jedná o levé tlačítko myši a tlačítko Vpřed není zakázané
548  } // private void jButtonVpred_mouseClicked()
549 
550  /**
551  * Metoda pro obsluhu kliknutí na tlačítko Zpět
552  *
553  * @param e Událost myši
554  */
555  private void jButtonZpet_mouseClicked(MouseEvent e) {
556  if (e.getButton()==e.BUTTON1 && ((Component)e.getSource()).isEnabled())
557  { // pokud se jedná o levé tlačítko myši a tlačítko Zpět není zakázané
558  if (aktKrok > 1)
559  { // pokud lze udělat krok zpět
560  krokZpet(); // udělá krok zpět
561 
562  if (aktKrok <= 1)
563  { // pokud již nebude možné udělat další krok zpět
564  jButtonZpet.setEnabled(false);// zakáže tlačítko Zpět
565  }
566  // byl udělán krok zpět a následně tedy bude možné i Vpřed
567  jButtonVpred.setEnabled(true); // povolí tlačítko Vpřed
568  } // pokud lze udělat krok zpět
569  else
570  { // pokud nelze udělat krok zpět
571  jButtonZpet.setEnabled(false);// zakáže tlačítko Zpět
572  }
573  } // pokud se jedná o levé tlačítko myši a tlačítko Zpět není zakázané
574  } // private void jButtonZpet_mouseClicked()
575 
576  /**
577  * Metoda pro obsluhu kliknutí na tlačítko Reset
578  *
579  * @param e Událost myši
580  */
581  private void jButtonReset_mouseClicked(MouseEvent e) {
582  if (e.getButton()==e.BUTTON1 && ((Component)e.getSource()).isEnabled())
583  { // pokud se jedná o levé tlačítko myši a tlačítko Reset není zakázané
584  // zakáže tlačítko Zpět a povolí tlačítko Vpřed
585  jButtonZpet.setEnabled(false);
586  jButtonVpred.setEnabled(true);
587  // vynuluje počítadla kroků
588  this.pocetKroku = 0;
589  this.aktKrok = 0;
590  this.jLabelPocitadloKroku.setText("");
591  // vymaže obsah kontejneru se změnami
592  this.prubehViz = new ArrayList<ZmenaZobrazeni>();
593  // nastaví výchozí rozměry tabulek
594  tabulkaSR.zmenRozmery(kon.TAB_SR_VR[0],kon.TAB_SR_VR[1]);
595  tabulkaDelta1.zmenRozmery(kon.TAB_D1_VR[0],kon.TAB_D1_VR[1]);
596  tabulkaDelta2.zmenRozmery(kon.TAB_D2_VR[0],kon.TAB_D2_VR[1]);
597  // vymaže obsah tabulek
598  tabulkaSR.vyprazdniTabulku(true);
599  tabulkaDelta1.vyprazdniTabulku(false);
600  tabulkaDelta2.vyprazdniTabulku(false);
601  // nastaví výchozí šířku buňky tabulky na šířku písmene A
602  tabulkaSR.nastavObsah(0,1,"A");
603  tabulkaSR.nastavObsah(0,1,"");
604  tabulkaDelta1.nastavObsah(0,1,"A");
605  tabulkaDelta1.nastavObsah(0,1,"");
606  tabulkaDelta2.nastavObsah(0,1,"A");
607  tabulkaDelta2.nastavObsah(0,1,"");
608  // vloží do pole s nápovědou výchozí obsah
609  jTextAreaNapoveda.setText(kon.textyNapovedy[0]);
610  zobrazenaNapoveda = 0;
611  // vyprázdní pole s algoritmem a vloží do něj celý algoritmus
612  barevnyTextPaneAlgoritmus.vyprazdniPanel();
613  vypisAlgoritmus();
614  // nyní není zvýrazněný žádný řádek
615  zvyraznenyRadek = kon.ZADNY_RADEK;
616  // nastaví popiskům výchozí texty
617  jLabelij.setText(kon.TEXTY_POPISKU_IMJ);
618  jLabelmj.setText(kon.TEXTY_POPISKU_MJ);
619  jLabelL.setText(kon.TEXTY_POPISKU_L);
620  // vymaže obsah polí s proměnnými
621  jTextFieldm.setText("");
622  jTextFieldn.setText("");
623  jTextFieldi.setText("");
624  jTextFieldj.setText("");
625  jTextFieldij.setText("");
626  jTextFieldmj.setText("");
627  jTextFields.setText("");
628  jTextFieldt.setText("");
629  jTextFieldL.setText("");
630  jTextFieldpoz.setText("");
631  // povolí editaci řetězců
632  jTextFieldHledanyRetezec.setEditable(true);
633  jTextAreaProhledavanyText.setEditable(true);
634  } // pokud se jedná o levé tlačítko myši a tlačítko Reset není zakázané
635  } // private void jButtonReset_mouseClicked()
636 
637  /**
638  * Metoda pro výpis celého algoritmu do textového pole s algoritmem
639  */
640  private void vypisAlgoritmus()
641  {
642  // výpis jednotlivých bloků algoritmu
644  vypisBlokAlgoritmu(kon.BLOK_BMA,false);
645  vypisBlokAlgoritmu(kon.BLOK_DELTA1,false);
646  vypisBlokAlgoritmu(kon.BLOK_DELTA2,false);
647  this.zobrazenyBlokAlgoritmu = 0; // jsou vypsány všechny bloky počínaje 0
648  }
649 
650  /**
651  * Metoda pro výpis bloku algoritmu do textového pole s algoritmem
652  *
653  * @param cislo Číslo bloku, který se má vypsat
654  * @param vymazat Určuje, zda se má před výpisem vymazat obsah pole
655  */
656  private void vypisBlokAlgoritmu(int cislo, boolean vymazat)
657  {
658  if (vymazat)
659  { // pokud se má vymazat obsah pole, vymaže jej
660  barevnyTextPaneAlgoritmus.vyprazdniPanel();
661  }
662  for (int i = kon.blokyAlgoritmu[cislo][0]; i <= kon.blokyAlgoritmu[cislo][1]; i++)
663  { // výpis bloku po jednotlivých úsecích
664  barevnyTextPaneAlgoritmus.pridejText(kon.textyAlgoritmu[i],kon.barvyAlgoritmu[i],
665  new Color(255,255,255),
666  kon.tucneCastiAlgoritmu[i]);
667  }
668  this.zobrazenyBlokAlgoritmu = cislo; // aktualizace čísla zobrazeného bloku
669  }
670 
671  /**
672  * Metoda pro zvýraznění řádku algoritmu
673  *
674  * @param cislo Číslo řádku algoritmu, který se má zvýraznit
675  */
676  private void zvyrazniRadek(int cislo)
677  {
678  int zacatek; // pomocné proměnné
679  int konec;
680  if (zvyraznenyRadek != kon.ZADNY_RADEK)
681  { // pokud je zvýrazněný nějaký řádek
682  // výpočet čísel bloků v panelu
685  for (int i = zacatek; i <= konec; i++)
686  { // zruší zvýraznění jednotlivých bloků v řádku
687  this.barevnyTextPaneAlgoritmus.nastavVychoziBarvu(i);;
688  }
689  }
690  if (cislo != kon.ZADNY_RADEK)
691  { // pokud se má zvýraznit některý řádek
692  // výpočet čísel bloků v panelu
693  zacatek = kon.radkyAlgoritmu[cislo][0] - kon.blokyAlgoritmu[zobrazenyBlokAlgoritmu][0];
694  konec = kon.radkyAlgoritmu[cislo][1] - kon.blokyAlgoritmu[zobrazenyBlokAlgoritmu][0];
695  for (int i = zacatek; i <= konec; i++)
696  { // zvýrazní jednotlivé bloky v řádku
697  this.barevnyTextPaneAlgoritmus.nastavBarvu(i,kon.BARVA_ZVYRAZNENI_T,kon.BARVA_ZVYRAZNENI_P);
698  }
699  }
700  zvyraznenyRadek = cislo; // aktualizace čísla zvýrazněného řádku
701  } // private void zvyrazniRadek()
702 
703  /**
704  * Metoda pro nastavení hodnoty v políčku s proměnnou
705  *
706  * @param cislo Číslo políčka (definované ve třídě Konstanty)
707  * @param hodnota Hodnota, která se má nastavit
708  */
709  private void nastavPolePromenne(int cislo,int hodnota)
710  {
711  Integer pomI;
712  pomI = Integer.valueOf(hodnota); // převede hodnotu na objekt
713  // převede hodnotu na řetězec a volá metodu pro nastavení řetězcové hodnoty
714  // políčka
715  nastavPolePromenne(cislo,pomI.toString());
716  } // private void nastavPolePromenne()
717 
718  /**
719  * Metoda pro nastavení hodnoty v políčku s proměnnou
720  *
721  * @param cislo Číslo políčka (definované ve třídě Konstanty)
722  * @param hodnota Hodnota, která se má nastavit
723  */
724  private void nastavPolePromenne(int cislo,String hodnota)
725  {
726  // zvolí správné pole a nastaví jeho hodnotu
727  if (cislo == kon.PROM_M)
728  {
729  this.jTextFieldm.setText(hodnota);
730  }
731  else if (cislo == kon.PROM_N)
732  {
733  this.jTextFieldn.setText(hodnota);
734  }
735  else if (cislo == kon.PROM_I)
736  {
737  this.jTextFieldi.setText(hodnota);
738  }
739  else if (cislo == kon.PROM_J)
740  {
741  this.jTextFieldj.setText(hodnota);
742  }
743  else if (cislo == kon.PROM_IJ)
744  {
745  this.jTextFieldij.setText(hodnota);
746  }
747  else if (cislo == kon.PROM_MJ)
748  {
749  this.jTextFieldmj.setText(hodnota);
750  }
751  else if (cislo == kon.PROM_S)
752  {
753  this.jTextFields.setText(hodnota);
754  }
755  else if (cislo == kon.PROM_T)
756  {
757  this.jTextFieldt.setText(hodnota);
758  }
759  else if (cislo == kon.PROM_L)
760  {
761  this.jTextFieldL.setText(hodnota);
762  }
763  else if (cislo == kon.PROM_POZ)
764  {
765  this.jTextFieldpoz.setText(hodnota);
766  }
767  } // private void nastavPolePromenne()
768 
769  /**
770  * Metoda pro získání obsahu políčka s proměnnou
771  *
772  * @param cislo Číslo políčka (definované ve třídě Konstanty)
773  * @return Vrací obsah políčka
774  */
775  private String vratObsahPolePromenne(int cislo)
776  {
777  // zvolí správné pole a vrátí jeho obsah
778  if (cislo == kon.PROM_M)
779  {
780  return jTextFieldm.getText();
781  }
782  else if (cislo == kon.PROM_N)
783  {
784  return jTextFieldn.getText();
785  }
786  else if (cislo == kon.PROM_I)
787  {
788  return jTextFieldi.getText();
789  }
790  else if (cislo == kon.PROM_J)
791  {
792  return jTextFieldj.getText();
793  }
794  else if (cislo == kon.PROM_IJ)
795  {
796  return jTextFieldij.getText();
797  }
798  else if (cislo == kon.PROM_MJ)
799  {
800  return jTextFieldmj.getText();
801  }
802  else if (cislo == kon.PROM_S)
803  {
804  return jTextFields.getText();
805  }
806  else if (cislo == kon.PROM_T)
807  {
808  return jTextFieldt.getText();
809  }
810  else if (cislo == kon.PROM_L)
811  {
812  return jTextFieldL.getText();
813  }
814  else if (cislo == kon.PROM_POZ)
815  {
816  return jTextFieldpoz.getText();
817  }
818  return ""; // pokud nebylo zvoleno žádné pole, vrátí prázdný řetězec
819  } // private void vratHodnotuPolePromenne()
820 
821  /**
822  * Metoda pro provedení jednoho kroku vizualizace
823  */
824  private void krokVpred()
825  {
826  ZmenaZobrazeni zmena; // proměnná pro informace o změně
827  boolean konec = false; // pomocná proměnná
828 
829  aktKrok++; // provádí se krok vpřed
830 
831  // aktualizuje obsah políčka s počítadlem kroků
832  jLabelPocitadloKroku.setText("krok " + aktKrok + " / " + pocetKroku);
833 
834  if (!iteratorViz.hasNext())
835  { // pokud není v seznamu žádná změna, nelze pokračovat
836  return;
837  }
838 
839  // získání informací o první změně v kroku
840  zmena = (ZmenaZobrazeni)iteratorViz.next();
841 
842  while (!konec && zmena.cisloKroku == aktKrok)
843  { // provedení všech změn v kroku
844  if (zmena.operace == kon.ZM_T_H)
845  { // změna hodnoty políčka v tabulce
846  if (zmena.tabulka == kon.TAB_SR)
847  { // tabulkaSR
848  // nastaví původní hodnotu do objektu změny a provede změnu
849  zmena.puvodniObsah = tabulkaSR.vratObsah(zmena.radek,zmena.sloupec);
850  tabulkaSR.nastavObsah(zmena.radek,zmena.sloupec,zmena.novyObsah);
851  }
852  else if (zmena.tabulka == kon.TAB_D1)
853  { // tabulka delta1
854  // nastaví původní hodnotu do objektu změny a provede změnu
855  zmena.puvodniObsah = tabulkaDelta1.vratObsah(zmena.radek,zmena.sloupec);
856  tabulkaDelta1.nastavObsah(zmena.radek,zmena.sloupec,zmena.novyObsah);
857  }
858  else if (zmena.tabulka == kon.TAB_D2)
859  { // tabulka delta2
860  // nastaví původní hodnotu do objektu změny a provede změnu
861  zmena.puvodniObsah = tabulkaDelta2.vratObsah(zmena.radek,zmena.sloupec);
862  tabulkaDelta2.nastavObsah(zmena.radek,zmena.sloupec,zmena.novyObsah);
863  }
864  } // změna hodnoty políčka v tabulce
865  else if (zmena.operace == kon.ZM_T_B)
866  { // změna barvy políčka v tabulce
867  if (zmena.tabulka == kon.TAB_SR)
868  { // tabulkaSR
869  // nastaví původní hodnoty do objektu změny a provede změnu
870  zmena.puvodniBarvaTextu = tabulkaSR.vratBarvu(zmena.radek,zmena.sloupec,0);
871  zmena.puvodniBarvaPozadi = tabulkaSR.vratBarvu(zmena.radek,zmena.sloupec,1);
872  tabulkaSR.nastavBarvu(zmena.radek,zmena.sloupec,zmena.barvaPozadi,
873  zmena.barvaTextu);
874  }
875  else if (zmena.tabulka == kon.TAB_D1)
876  { // tabulka delta1
877  // nastaví původní hodnoty do objektu změny a provede změnu
878  zmena.puvodniBarvaTextu = tabulkaDelta1.vratBarvu(zmena.radek,zmena.sloupec,0);
879  zmena.puvodniBarvaPozadi = tabulkaDelta1.vratBarvu(zmena.radek,zmena.sloupec,1);
880  tabulkaDelta1.nastavBarvu(zmena.radek,zmena.sloupec,zmena.barvaPozadi,
881  zmena.barvaTextu);
882  }
883  else if (zmena.tabulka == kon.TAB_D2)
884  { // tabulka delta2
885  // nastaví původní hodnoty do objektu změny a provede změnu
886  zmena.puvodniBarvaTextu = tabulkaDelta2.vratBarvu(zmena.radek,zmena.sloupec,0);
887  zmena.puvodniBarvaPozadi = tabulkaDelta2.vratBarvu(zmena.radek,zmena.sloupec,1);
888  tabulkaDelta2.nastavBarvu(zmena.radek,zmena.sloupec,zmena.barvaPozadi,
889  zmena.barvaTextu);
890  }
891  } // změna barvy políčka v tabulce
892  else if (zmena.operace == kon.ZM_T_P)
893  { // posun řádku tabulky
894  if (zmena.tabulka == kon.TAB_SR)
895  { // tabulkaSR
896  // posuv řádku
897  tabulkaSR.posunRadek(zmena.radek,zmena.smer,zmena.pocet);
898  }
899  else if (zmena.tabulka == kon.TAB_D1)
900  { // tabulka delta1
901  // posuv řádku
902  tabulkaDelta1.posunRadek(zmena.radek,zmena.smer,zmena.pocet);
903  }
904  else if (zmena.tabulka == kon.TAB_D2)
905  { // tabulka delta2
906  // posuv řádku
907  tabulkaDelta2.posunRadek(zmena.radek,zmena.smer,zmena.pocet);
908  }
909  } // posun řádku tabulky
910  else if (zmena.operace == kon.ZM_T_R)
911  { // změna rozměrů tabulky
912  if (zmena.tabulka == kon.TAB_SR)
913  { // tabulkaSR
914  // nastaví původní rozměry do objektu změny a provede změnu
915  zmena.puvodneRadku = tabulkaSR.vratPocetRadkuTabulky();
916  zmena.puvodneSloupcu = tabulkaSR.vratPocetSloupcuTabulky();
917  tabulkaSR.zmenRozmery(zmena.radek,zmena.sloupec);
918  }
919  else if (zmena.tabulka == kon.TAB_D1)
920  { // tabulka delta1
921  // nastaví původní rozměry do objektu změny a provede změnu
922  zmena.puvodneRadku = tabulkaDelta1.vratPocetRadkuTabulky();
923  zmena.puvodneSloupcu = tabulkaDelta1.vratPocetSloupcuTabulky();
924  tabulkaDelta1.zmenRozmery(zmena.radek,zmena.sloupec);
925  }
926  else if (zmena.tabulka == kon.TAB_D2)
927  { // tabulka delta2
928  // nastaví původní rozměry do objektu změny a provede změnu
929  zmena.puvodneRadku = tabulkaDelta2.vratPocetRadkuTabulky();
930  zmena.puvodneSloupcu = tabulkaDelta2.vratPocetSloupcuTabulky();
931  tabulkaDelta2.zmenRozmery(zmena.radek,zmena.sloupec);
932  }
933  } // změna rozměrů tabulky
934  else if (zmena.operace == kon.ZM_A_B)
935  { // výměna bloku v panelu s algoritmem
936  // uloží číslo původního bloku do objektu změny a provede výměnu
938  vypisBlokAlgoritmu(zmena.cislo,true);
939  } // výměna bloku v panelu s algoritmem
940  else if (zmena.operace == kon.ZM_A_Z)
941  { // změna zvýrazněného řádku v poli s algoritmem
942  // uloží číslo zvýrazněného řádku do objektu změny a provede změnu
944  zvyrazniRadek(zmena.cislo);
945  } // změna zvýrazněného řádku v poli s algoritmem
946  else if (zmena.operace == kon.ZM_P)
947  { // změna hodnoty proměnné
948  // uloží původní hodnotu proměnné do objektu změny a provede změnu
950  nastavPolePromenne(zmena.cislo,zmena.novyObsah);
951  } // změna hodnoty proměnné
952  else if (zmena.operace == kon.ZM_N)
953  { // změna obsahu pole s nápovědou
954  // uloží číslo zobrazeného textu do objektu změny a provede změnu
956  zobrazenaNapoveda = zmena.cislo;
957  jTextAreaNapoveda.setText(kon.textyNapovedy[zmena.cislo]);
958  } // změna obsahu pole s nápovědou
959  else if (zmena.operace == kon.ZM_PO)
960  { // změna textu popisku
961  if (zmena.cislo == kon.POPISEK_IJ)
962  { // pokud se jedná o popisek i-j+1 nebo i+j-1
963  // uloží původní text popisku do objektu změny a provede změnu
964  zmena.puvodniObsah = jLabelij.getText();
965  jLabelij.setText(zmena.novyObsah);
966  }
967  else if (zmena.cislo == kon.POPISEK_MJ)
968  { // pokud se jedná o popisek m-j+1 nebo n-m+1
969  // uloží původní text popisku do objektu změny a provede změnu
970  zmena.puvodniObsah = jLabelmj.getText();
971  jLabelmj.setText(zmena.novyObsah);
972  }
973  else if (zmena.cislo == kon.POPISEK_L)
974  { // pokud se jedná o popisek L nebo d1p
975  // uloží původní text popisku do objektu změny a provede změnu
976  zmena.puvodniObsah = jLabelL.getText();
977  jLabelL.setText(zmena.novyObsah);
978  }
979  } // změna textu popisku
980 
981  if (iteratorViz.hasNext())
982  { // pokud je k dispozici další změna
983  // získání informací o další změně
984  zmena = (ZmenaZobrazeni)iteratorViz.next();
985  }
986  else
987  { // pokud další změna není k dispozici
988  konec = true; // ukončí cyklus
989  }
990  } // provedení všech změn v kroku
991 
992  if (zmena.cisloKroku != aktKrok)
993  { // přejel na 1. změnu dalšího kroku, je nutno se vrátit
994  zmena = (ZmenaZobrazeni)iteratorViz.previous(); // návrat o 1 položku zpět
995  }
996  } // krokVpred()
997 
998  /**
999  * Metoda pro provedení jednoho zpětného kroku vizualizace
1000  */
1001  private void krokZpet()
1002  {
1003  ZmenaZobrazeni zmena; // proměnná pro informace o změně
1004  boolean konec = false; // pomocná proměnná
1005 
1006  if (!iteratorViz.hasPrevious())
1007  { // pokud není v seznamu žádná změna k vrácení, nelze pokračovat
1008  return;
1009  }
1010 
1011  // získání informací o poslední změně v předchozím kroku
1012  zmena = (ZmenaZobrazeni)iteratorViz.previous();
1013 
1014  while (!konec && zmena.cisloKroku == aktKrok)
1015  { // vrácení všech změn v kroku
1016  if (zmena.operace == kon.ZM_T_H)
1017  { // změna hodnoty políčka v tabulce
1018  if (zmena.tabulka == kon.TAB_SR)
1019  { // tabulkaSR
1020  tabulkaSR.nastavObsah(zmena.radek,zmena.sloupec,zmena.puvodniObsah);
1021  }
1022  else if (zmena.tabulka == kon.TAB_D1)
1023  { // tabulka delta1
1024  tabulkaDelta1.nastavObsah(zmena.radek,zmena.sloupec,zmena.puvodniObsah);
1025  }
1026  else if (zmena.tabulka == kon.TAB_D2)
1027  { // tabulka delta2
1028  tabulkaDelta2.nastavObsah(zmena.radek,zmena.sloupec,zmena.puvodniObsah);
1029  }
1030  } // změna hodnoty políčka v tabulce
1031  else if (zmena.operace == kon.ZM_T_B)
1032  { // změna barvy políčka v tabulce
1033  if (zmena.tabulka == kon.TAB_SR)
1034  { // tabulkaSR
1035  tabulkaSR.nastavBarvu(zmena.radek,zmena.sloupec,zmena.puvodniBarvaPozadi,
1036  zmena.puvodniBarvaTextu);
1037  }
1038  else if (zmena.tabulka == kon.TAB_D1)
1039  { // tabulka delta1
1040  tabulkaDelta1.nastavBarvu(zmena.radek,zmena.sloupec,zmena.puvodniBarvaPozadi,
1041  zmena.puvodniBarvaTextu);
1042  }
1043  else if (zmena.tabulka == kon.TAB_D2)
1044  { // tabulka delta2
1045  tabulkaDelta2.nastavBarvu(zmena.radek,zmena.sloupec,zmena.puvodniBarvaPozadi,
1046  zmena.puvodniBarvaTextu);
1047  }
1048  } // změna barvy políčka v tabulce
1049  else if (zmena.operace == kon.ZM_T_P)
1050  { // posun řádku tabulky
1051  if (zmena.tabulka == kon.TAB_SR)
1052  { // tabulkaSR
1053  if (zmena.smer == tabulkaSR.POSUN_VPRAVO)
1054  { // pokud se posouvalo vpravo, posune vlevo
1055  tabulkaSR.posunRadek(zmena.radek,tabulkaSR.POSUN_VLEVO,zmena.pocet);
1056  }
1057  else
1058  { // pokud se posouvalo vlevo, posune vpravo
1059  tabulkaSR.posunRadek(zmena.radek,tabulkaSR.POSUN_VPRAVO,zmena.pocet);
1060  }
1061  }
1062  else if (zmena.tabulka == kon.TAB_D1)
1063  { // tabulka delta1
1064  if (zmena.smer == tabulkaDelta1.POSUN_VPRAVO)
1065  { // pokud se posouvalo vpravo, posune vlevo
1066  tabulkaDelta1.posunRadek(zmena.radek,tabulkaDelta1.POSUN_VLEVO,zmena.pocet);
1067  }
1068  else
1069  { // pokud se posouvalo vlevo, posune vpravo
1070  tabulkaDelta1.posunRadek(zmena.radek,tabulkaDelta1.POSUN_VPRAVO,zmena.pocet);
1071  }
1072  }
1073  else if (zmena.tabulka == kon.TAB_D2)
1074  { // tabulka delta2
1075  if (zmena.smer == tabulkaDelta2.POSUN_VPRAVO)
1076  { // pokud se posouvalo vpravo, posune vlevo
1077  tabulkaDelta2.posunRadek(zmena.radek,tabulkaDelta2.POSUN_VLEVO,zmena.pocet);
1078  }
1079  else
1080  { // pokud se posouvalo vlevo, posune vpravo
1081  tabulkaDelta2.posunRadek(zmena.radek,tabulkaDelta2.POSUN_VPRAVO,zmena.pocet);
1082  }
1083  }
1084  } // posun řádku tabulky
1085  else if (zmena.operace == kon.ZM_T_R)
1086  { // změna rozměrů tabulky
1087  if (zmena.tabulka == kon.TAB_SR)
1088  { // tabulkaSR
1089  tabulkaSR.zmenRozmery(zmena.puvodneRadku,zmena.puvodneSloupcu);
1090  }
1091  else if (zmena.tabulka == kon.TAB_D1)
1092  { // tabulka delta1
1093  tabulkaDelta1.zmenRozmery(zmena.puvodneRadku,zmena.puvodneSloupcu);
1094  }
1095  else if (zmena.tabulka == kon.TAB_D2)
1096  { // tabulka delta2
1097  tabulkaDelta2.zmenRozmery(zmena.puvodneRadku,zmena.puvodneSloupcu);
1098  }
1099  } // změna rozměrů tabulky
1100  else if (zmena.operace == kon.ZM_A_B)
1101  { // výměna bloku v panelu s algoritmem
1102  vypisBlokAlgoritmu(zmena.puvodniCislo,true);
1103  } // výměna bloku v panelu s algoritmem
1104  else if (zmena.operace == kon.ZM_A_Z)
1105  { // změna zvýrazněného řádku v poli s algoritmem
1106  zvyrazniRadek(zmena.puvodniCislo);
1107  } // změna zvýrazněného řádku v poli s algoritmem
1108  else if (zmena.operace == kon.ZM_P)
1109  { // změna hodnoty proměnné
1110  nastavPolePromenne(zmena.cislo,zmena.puvodniObsah);
1111  } // změna hodnoty proměnné
1112  else if (zmena.operace == kon.ZM_N)
1113  { // změna obsahu pole s nápovědou
1114  zobrazenaNapoveda = zmena.puvodniCislo;
1115  jTextAreaNapoveda.setText(kon.textyNapovedy[zmena.puvodniCislo]);
1116  } // změna obsahu pole s nápovědou
1117  else if (zmena.operace == kon.ZM_PO)
1118  { // změna textu popisku
1119  if (zmena.cislo == kon.POPISEK_IJ)
1120  { // pokud se jedná o popisek i-j+1 nebo i+j-1
1121  jLabelij.setText(zmena.puvodniObsah);
1122  }
1123  else if (zmena.cislo == kon.POPISEK_MJ)
1124  { // pokud se jedná o popisek m-j+1 nebo n-m+1
1125  jLabelmj.setText(zmena.puvodniObsah);
1126  }
1127  else if (zmena.cislo == kon.POPISEK_L)
1128  { // pokud se jedná o popisek L nebo d1p
1129  jLabelL.setText(zmena.puvodniObsah);
1130  }
1131  } // změna textu popisku
1132 
1133  if (iteratorViz.hasPrevious())
1134  { // pokud je k dispozici předchozí změna
1135  // získání informací o předchozí změně
1136  zmena = (ZmenaZobrazeni)iteratorViz.previous();
1137  }
1138  else
1139  { // pokud předchozí změna není k dispozici
1140  konec = true; // ukončí cyklus
1141  }
1142  } // vrácení všech změn v kroku
1143 
1144  if (zmena.cisloKroku != aktKrok)
1145  { // přejel na poslední změnu předchozího kroku, je nutno se vrátit
1146  zmena = (ZmenaZobrazeni)iteratorViz.next(); // návrat o 1 položku vpřed
1147  }
1148 
1149  aktKrok--; // byl proveden krok zpět
1150 
1151  // aktualizuje obsah políčka s počítadlem kroků
1152  jLabelPocitadloKroku.setText("krok " + aktKrok + " / " + pocetKroku);
1153  } // krokZpet()
1154 
1155 } // public class AppletBoyerMooreDemo
1156 
1157 /*** Konec souboru AppletBoyerMooreDemo.java ***/
static final int PROM_IJ
Definition: Konstanty.java:98
static final int ZADNY_RADEK
Definition: Konstanty.java:584
static final int ZM_T_H
Definition: Konstanty.java:64
static final int ZM_P
Definition: Konstanty.java:76
static final int POPISEK_L
Definition: Konstanty.java:115
void nastavVychoziBarvu(int cisloUseku)
static final int [] TAB_D2_VR
Definition: Konstanty.java:140
static final Color BARVA_ZVYRAZNENI_T
Definition: Konstanty.java:30
static final int PROM_S
Definition: Konstanty.java:102
static final int ZM_T_R
Definition: Konstanty.java:70
void posunRadek(int radek, int smer, int pocet)
Definition: Tabulka.java:507
Vyhledávání v řetězci a tvorba seznamu změn GUI.
Definition: Algoritmus.java:43
static final int [] TAB_D1_VR
Definition: Konstanty.java:138
static final String TEXTY_POPISKU_MJ
Definition: Konstanty.java:122
static final int BLOK_DELTA1
Definition: Konstanty.java:577
static final int TAB_D1
Definition: Konstanty.java:85
static final int POSUN_VPRAVO
Definition: Tabulka.java:137
static final int PROM_POZ
Definition: Konstanty.java:108
static final int TAB_D2
Definition: Konstanty.java:87
static final int [] TAB_SR_VR
Definition: Konstanty.java:136
ArrayList< ZmenaZobrazeni > prubehViz
static final int PROM_L
Definition: Konstanty.java:106
void vyprazdniTabulku(boolean vcetnePrvniho)
Definition: Tabulka.java:207
static final int ZM_T_P
Definition: Konstanty.java:68
void zmenRozmery(int novyPocetRadku, int novyPocetSloupcu)
Definition: Tabulka.java:410
static final int POSUN_VLEVO
Definition: Tabulka.java:133
Applet pro demonstraci BMA, základ projektu.
static final int PROM_I
Definition: Konstanty.java:94
int BMA(String P, String T)
Definition: Algoritmus.java:92
static final String [] textyAlgoritmu
Definition: Konstanty.java:162
static final boolean [] tucneCastiAlgoritmu
Definition: Konstanty.java:364
static final int ZM_PO
Definition: Konstanty.java:80
static final int [][] blokyAlgoritmu
Definition: Konstanty.java:565
void pridejText(String vkladanyText, Color barva, Color barvaPozadi, boolean tucnePismo)
static final int ZM_N
Definition: Konstanty.java:78
static final int PROM_M
Definition: Konstanty.java:90
Textový panel s barevnými bloky textu.
Color vratBarvu(int radek, int sloupec, int pismoPozadi)
Definition: Tabulka.java:714
void nastavBarvu(int cisloUseku, Color barva, Color barvaPozadi)
static final int BLOK_BMA
Definition: Konstanty.java:575
void nastavBarvu(int radek, int sloupec, Color barvaPozadiB, Color barvaPismaB)
Definition: Tabulka.java:323
static final int PROM_J
Definition: Konstanty.java:96
void nastavObsah(int radek, int sloupec, String hodnota)
Definition: Tabulka.java:255
static final int [][] radkyAlgoritmu
Definition: Konstanty.java:465
static final int PROM_T
Definition: Konstanty.java:104
static final int BLOK_DEKLARACE
Definition: Konstanty.java:573
static final int POPISEK_MJ
Definition: Konstanty.java:113
static final String [] textyNapovedy
Definition: Konstanty.java:145
static final int POPISEK_IJ
Definition: Konstanty.java:111
static final Color [] barvyAlgoritmu
Definition: Konstanty.java:263
void vypisBlokAlgoritmu(int cislo, boolean vymazat)
static final int ZM_A_B
Definition: Konstanty.java:72
static final int TAB_SR
Definition: Konstanty.java:83
Třída pro vytvoření tabulky se záhlavími řádků
Definition: Tabulka.java:52
String vratObsah(int radek, int sloupec)
Definition: Tabulka.java:700
void nastavPolePromenne(int cislo, String hodnota)
static final int PROM_MJ
Definition: Konstanty.java:100
Uchování informací o změnách zobrazení při vizualizaci.
static final int PROM_N
Definition: Konstanty.java:92
static final int ZM_T_B
Definition: Konstanty.java:66
static final int ZM_A_Z
Definition: Konstanty.java:74
static final int BLOK_DELTA2
Definition: Konstanty.java:579
static final Color BARVA_ZVYRAZNENI_P
Definition: Konstanty.java:32
Třída s konstantami.
Definition: Konstanty.java:28
void nastavPolePromenne(int cislo, int hodnota)
static final String TEXTY_POPISKU_IMJ
Definition: Konstanty.java:118
static final String TEXTY_POPISKU_L
Definition: Konstanty.java:126