Applet pro demonstraci Boyerova-Mooreova algoritmu  1.0
BarevnyTextPane.java
Zobrazit dokumentaci tohoto souboru.
1 /******************************************************************************
2  * Název projektu: Aplet pro demonstraci Boyerova-Mooreova algoritmu
3  * Balíček: boyermooredemo
4  * Soubor: BarevnyTextPane.java
5  * Datum: 13.4.2008
6  * Poslední změna: 18.4.2008
7  * Autor: Jaroslav Dytrych xdytry00
8  *
9  * Popis: Třída pro vytvoření textového panelu, který umožňuje vkládat bloky
10  * textu, u nichž lze nastavit barvu písma a pozadí a zda je písmo tučné.
11  * Bloky jsou číslovány dle pořadí vložení do panelu a po jejich
12  * vložení je možné měnit barvu písma a pozadí bloku s daným číslem.
13  *
14  ******************************************************************************/
15 
16 /**
17  * @file BarevnyTextPane.java
18  *
19  * @brief Třída BarevnyTextPane - textový panel s barevnými bloky textu
20  */
21 
22 package boyermooredemo;
23 
24 import java.awt.Color;
25 import java.util.TreeMap;
26 import javax.swing.JOptionPane;
27 import javax.swing.JTextPane;
28 import javax.swing.text.BadLocationException;
29 import javax.swing.text.Style;
30 import javax.swing.text.StyleConstants;
31 import javax.swing.text.StyledDocument;
32 
33 /**
34  * Třída pro vytvoření textového panelu, který umožňuje vkládat bloky textu,
35  * u nichž lze nastavit barvu písma a pozadí a zda je písmo tučné.
36  * Bloky jsou číslovány dle pořadí vložení do panelu a po jejich vložení
37  * je možné měnit barvu písma a pozadí bloku s daným číslem.
38  *
39  * @brief Textový panel s barevnými bloky textu
40  */
41 public class BarevnyTextPane extends JTextPane {
42  /**
43  * Třída pro uchování informací o úseku textu
44  *
45  * @brief Třída pro uchování informací o úseku textu
46  */
47  class usekTextu
48  {
49  /** Začátek úseku textu */
50  public int zacatek;
51  /** Délka úseku textu */
52  public int delka;
53  /** Barva, se kterou byl úsek textu vložen do panelu */
54  public Color vychoziBarva;
55  /** Barva pozadí, se kterou byl úsek textu vložen do panelu */
56  public Color vychoziBarvaPozadi;
57  /** Určení, zda je úsek textu vypsán tučným písmem */
58  public boolean tucne;
59 
60  /**
61  * Konstruktor třídy, uloží informace o úseku
62  *
63  * @param zacatekUseku Pozice začátku úseku v dokumentu
64  * @param delkaUseku Délka úseku
65  * @param barva Barva úseku
66  * @param barvaPozadi Barva pozadí úseku
67  * @param tucneP Určuje, zda je písmo tučné
68  */
69  usekTextu(int zacatekUseku, int delkaUseku, Color barva, Color barvaPozadi,
70  boolean tucneP)
71  {
72  zacatek = zacatekUseku;
73  delka = delkaUseku;
74  vychoziBarva = barva;
75  vychoziBarvaPozadi = barvaPozadi;
76  tucne = tucneP;
77  }
78  } // class usekTextu
79 
80  private StyledDocument dokument; // dokument v panelu
81  private int pocetUseku = 0; // počet úseků textu vypsaných v panelu
82  private TreeMap<Integer,usekTextu> useky;
83 
84  /**
85  * Konstruktor třídy, vytvoří textový panel a provede inicializaci
86  */
87  public BarevnyTextPane()
88  {
89  super();
90  this.dokument = (StyledDocument)this.getDocument(); // získá dokument
91  this.useky = new TreeMap<Integer,usekTextu>(); // vytvoří kontejner pro úseky textu
92  this.pocetUseku = 0; // zatím není uložen žádný úsek textu
93  }
94 
95  /**
96  * Metoda pro vyprázdnění panelu
97  */
98  public void vyprazdniPanel()
99  {
100  try {
101  this.dokument.remove(0,dokument.getLength()); // vyprázdní dokument
102  } catch (BadLocationException e) {
103  JOptionPane.showMessageDialog(this, "Došlo k chybě při úpravě pole s algoritmem.",
104  "Chyba",JOptionPane.ERROR_MESSAGE);
105  }
106  this.useky = new TreeMap<Integer,usekTextu>(); // vyprázdní kontejner s informacemi o úsecích
107  this.pocetUseku = 0; // počet uložených úseků je nyní 0
108  }
109 
110  /**
111  * Metoda pro přidání textu do panelu
112  *
113  * @param vkladanyText Vkládaný text
114  * @param barva Barva textu
115  * @param barvaPozadi Barva pozadí
116  * @param tucnePismo Určuje, zda je písmo tučné
117  */
118  public void pridejText(String vkladanyText, Color barva, Color barvaPozadi,
119  boolean tucnePismo)
120  {
121  // vytvoří stylový objekt
122  Style styl = this.dokument.addStyle("Styl" + this.pocetUseku, null);
123  // Nastaví neproporcionální písmo
124  StyleConstants.setFontFamily(styl, "SansSerif");
125  // Nastaví velikost písma
126  StyleConstants.setFontSize(styl, 12);
127  // Nastaví barvu písma
128  StyleConstants.setForeground(styl, barva);
129  // Nastaví barvu pozadí
130  StyleConstants.setBackground(styl, barvaPozadi);
131  if (tucnePismo)
132  { // pokud má být písmo tučné, nastaví jej
133  StyleConstants.setBold(styl, true);
134  }
135 
136  // uloží informace o úseku do kontejneru
137  this.useky.put(this.pocetUseku,new usekTextu(dokument.getLength(),
138  vkladanyText.length(),barva,barvaPozadi,tucnePismo));
139  this.pocetUseku++; // byl přidán další úsek
140 
141  // Vloží úsek textu do dokumentu
142  try {
143  dokument.insertString(dokument.getLength(), vkladanyText, styl);
144  } catch (BadLocationException e) {
145  JOptionPane.showMessageDialog(this, "Došlo k chybě při vypisování algoritmu.",
146  "Chyba",JOptionPane.ERROR_MESSAGE);
147  }
148  } // public void pridejText()
149 
150  /**
151  * Metoda pro nastavení barvy úseku textu
152  *
153  * @param cisloUseku Číslo úseku textu
154  * @param barva Nová barva
155  * @param barvaPozadi Nová barva pozadí
156  */
157  public void nastavBarvu(int cisloUseku, Color barva, Color barvaPozadi)
158  {
159  // zjistí informace o úseku
160  usekTextu informace = useky.get(cisloUseku);
161 
162  dokument.removeStyle("Styl" + cisloUseku); // odebere starý styl úseku
163 
164  // vytvoří stylový objekt
165  Style styl = this.dokument.addStyle("Styl" + cisloUseku, null);
166  // Nastaví neproporcionální písmo
167  StyleConstants.setFontFamily(styl, "SansSerif");
168  // Nastaví velikost písma
169  StyleConstants.setFontSize(styl, 12);
170  // Nastaví barvu písma
171  StyleConstants.setForeground(styl, barva);
172  // Nastaví barvu pozadí
173  StyleConstants.setBackground(styl, barvaPozadi);
174  if (informace.tucne)
175  { // pokud má být písmo tučné, nastaví jej
176  StyleConstants.setBold(styl, true);
177  }
178 
179  // zjistí text úseku, odebere jej z dokumentu a vloží v nové barvě
180  String textUseku = "";
181  try {
182  textUseku = dokument.getText(informace.zacatek,informace.delka); // zjistí text
183  dokument.remove(informace.zacatek,informace.delka); // odebere
184  dokument.insertString(informace.zacatek, textUseku, styl); // vloží přebarvený
185  } catch (BadLocationException e) {
186  JOptionPane.showMessageDialog(this, "Došlo k chybě při vypisování algoritmu.",
187  "Chyba",JOptionPane.ERROR_MESSAGE);
188  }
189  } // public void nastavBarvu
190 
191  /**
192  * Metoda pro nastavení výchozí barvy úseku textu
193  * (nastaví úseku tu barvu, se kterou byl vložen do panelu)
194  *
195  * @param cisloUseku Číslo úseku textu
196  */
197  public void nastavVychoziBarvu(int cisloUseku)
198  {
199  // zjistí informace o úseku textu
200  usekTextu informace = useky.get(cisloUseku);
201 
202  dokument.removeStyle("Styl" + cisloUseku); // odebere starý styl úseku
203 
204  // vytvoří stylový objekt
205  Style styl = this.dokument.addStyle("Styl" + cisloUseku, null);
206  // Nastaví neproporcionální písmo
207  StyleConstants.setFontFamily(styl, "SansSerif");
208  // Nastaví velikost písma
209  StyleConstants.setFontSize(styl, 12);
210  // Nastaví barvu písma
211  StyleConstants.setForeground(styl, informace.vychoziBarva);
212  // Nastaví barvu pozadí
213  StyleConstants.setBackground(styl, informace.vychoziBarvaPozadi);
214  if (informace.tucne)
215  { // pokud má být písmo tučné, nastaví jej
216  StyleConstants.setBold(styl, true);
217  }
218 
219  // zjistí text úseku, odebere jej z dokumentu a vloží v nové barvě
220  String textUseku = "";
221  try {
222  textUseku = dokument.getText(informace.zacatek,informace.delka); // zjistí text
223  dokument.remove(informace.zacatek,informace.delka); // odebere
224  dokument.insertString(informace.zacatek, textUseku, styl); // vloží přebarvený
225  } catch (BadLocationException e) {
226  JOptionPane.showMessageDialog(this, "Došlo k chybě při vypisování algoritmu.",
227  "Chyba",JOptionPane.ERROR_MESSAGE);
228  }
229  } // public void nastavBarvu
230 
231 } // public class barevnyTextPane
232 
233 /*** Konec souboru BarevnyTextPane.java ***/
void nastavVychoziBarvu(int cisloUseku)
Třída pro uchování informací o úseku textu.
usekTextu(int zacatekUseku, int delkaUseku, Color barva, Color barvaPozadi, boolean tucneP)
void pridejText(String vkladanyText, Color barva, Color barvaPozadi, boolean tucnePismo)
Textový panel s barevnými bloky textu.
void nastavBarvu(int cisloUseku, Color barva, Color barvaPozadi)
TreeMap< Integer, usekTextu > useky