00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 package boyermooredemo;
00027
00028 import java.awt.BasicStroke;
00029 import java.awt.Color;
00030 import java.awt.Dimension;
00031 import java.awt.Font;
00032 import java.awt.FontMetrics;
00033 import java.awt.Graphics;
00034 import java.awt.Graphics2D;
00035 import java.awt.Rectangle;
00036
00037 import javax.swing.JPanel;
00038 import javax.swing.Scrollable;
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052 public class Tabulka extends JPanel implements Scrollable {
00053
00054
00055
00056 private int pocetRadku = 0;
00057
00058
00059
00060 private int pocetSloupcu = 0;
00061
00062
00063
00064
00065 private int ohraniceni = 0;
00066
00067
00068
00069 private String[][] bunky;
00070
00071
00072
00073
00074
00075 private Color[][][] barvyBunek;
00076
00077
00078
00079 private Color barvaPozadi;
00080
00081
00082
00083 private Color barvaPisma;
00084
00085
00086
00087 private int sirkaPlatna = 0;
00088
00089
00090
00091 private int vyskaPlatna = 0;
00092
00093
00094
00095 private int okrajeBunky = 4;
00096
00097
00098
00099 private int sirkaPrazdneho = 5;
00100
00101
00102
00103 private int sirkaBunky = 5;
00104
00105
00106
00107 private int vyskaBunky = 10;
00108
00109
00110
00111 private FontMetrics metrikaFontu = null;
00112
00113
00114
00115
00116 private boolean prvniHlavicka = false;
00117
00118
00119
00120 private int sirkaPrvniho = 5;
00121
00122
00123
00124 private boolean posledniJiny = false;
00125
00126
00127
00128 private int sirkaPosledniho = 5;
00129
00130
00131
00132
00133 public static final int POSUN_VLEVO = 0;
00134
00135
00136
00137 public static final int POSUN_VPRAVO = 1;
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152 public Tabulka (int radky, int sloupce, int ohraniceniTabuky, int okrajeBunkyTab,
00153 Color barvaPozadiTab, Color barvaPismaTab,
00154 boolean prvniHlavickaTab, boolean posledniSlJiny)
00155 {
00156 this.setDoubleBuffered(true);
00157 this.ohraniceni = ohraniceniTabuky;
00158 this.barvaPozadi = barvaPozadiTab;
00159 this.barvaPisma = barvaPismaTab;
00160 this.okrajeBunky = okrajeBunkyTab;
00161 this.prvniHlavicka = prvniHlavickaTab;
00162 this.posledniJiny = posledniSlJiny;
00163
00164 this.pocetRadku = radky;
00165 this.pocetSloupcu = sloupce;
00166
00167 this.setFont(new Font("Arial",Font.PLAIN,12));
00168 this.metrikaFontu = this.getFontMetrics(this.getFont());
00169 if (prvniHlavickaTab)
00170 {
00171
00172 this.sirkaPrvniho += 2 * this.ohraniceni;
00173 }
00174
00175
00176 this.sirkaPlatna = 10;
00177 this.vyskaPlatna = 10;
00178
00179 this.vyskaBunky = this.metrikaFontu.getMaxAscent();
00180
00181 this.bunky = new String[radky][sloupce];
00182 this.barvyBunek = new Color[radky][sloupce][2];
00183
00184 for (int i = 0; i < radky; i++)
00185 {
00186 for (int j = 0; j < sloupce; j++)
00187 {
00188 this.bunky[i][j] = "";
00189 this.barvyBunek[i][j][0] = barvaPismaTab;
00190 this.barvyBunek[i][j][1] = barvaPozadiTab;
00191 }
00192 }
00193
00194
00195
00196 this.sirkaPlatna = sloupce * (this.sirkaBunky + ohraniceniTabuky + this.okrajeBunky * 2)
00197 + 4 * ohraniceniTabuky + 10;
00198 this.vyskaPlatna = radky * (this.vyskaBunky + ohraniceniTabuky + this.okrajeBunky * 2)
00199 + 4 * ohraniceniTabuky + 10;
00200 }
00201
00202
00203
00204
00205
00206
00207 public void vyprazdniTabulku(boolean vcetnePrvniho)
00208 {
00209 int zacatek;
00210 if (vcetnePrvniho)
00211 {
00212 zacatek = 0;
00213 if (this.prvniHlavicka)
00214 {
00215 this.sirkaPrvniho = this.sirkaPrazdneho + 2 * this.ohraniceni;
00216 }
00217 else
00218 {
00219 this.sirkaPrvniho = this.sirkaPrazdneho;
00220 }
00221 }
00222 else
00223 {
00224 zacatek = 1;
00225 }
00226 this.sirkaBunky = this.sirkaPrazdneho;
00227 this.sirkaPosledniho = this.sirkaPrazdneho;
00228
00229 for (int i = 0; i < this.pocetRadku; i++)
00230 {
00231 for (int j = zacatek; j < this.pocetSloupcu; j++)
00232 {
00233 this.bunky[i][j] = "";
00234 this.barvyBunek[i][j][0] = this.barvaPisma;
00235 this.barvyBunek[i][j][1] = this.barvaPozadi;
00236 }
00237 }
00238
00239
00240 this.sirkaPlatna = (this.pocetSloupcu - 2) * (this.sirkaBunky + this.ohraniceni + this.okrajeBunky * 2)
00241 + this.sirkaPrvniho + this.sirkaPosledniho + 2 * this.ohraniceni + this.okrajeBunky * 4
00242 + 4 * this.ohraniceni + 10;
00243 this.vyskaPlatna = this.pocetRadku * (this.vyskaBunky + this.ohraniceni + this.okrajeBunky * 2)
00244 + 4 * this.ohraniceni + 10;
00245 this.prekresliTabulku();
00246 }
00247
00248
00249
00250
00251
00252
00253
00254
00255 public void nastavObsah(int radek, int sloupec, String hodnota)
00256 {
00257 int sirkaObsahu;
00258 int porovnavanaSirka;
00259 if (this.prvniHlavicka && sloupec == 0)
00260 {
00261 porovnavanaSirka = this.sirkaPrvniho;
00262 }
00263 else if (this.posledniJiny && sloupec == (this.pocetSloupcu - 1))
00264 {
00265 porovnavanaSirka = this.sirkaPosledniho;
00266 }
00267 else
00268 {
00269 porovnavanaSirka = this.sirkaBunky;
00270 }
00271 this.bunky[radek][sloupec] = hodnota;
00272 if (hodnota.length() > 0)
00273 {
00274 sirkaObsahu = metrikaFontu.stringWidth(hodnota);
00275 }
00276 else
00277 {
00278 sirkaObsahu = this.sirkaPrazdneho;
00279 }
00280 if (sirkaObsahu > porovnavanaSirka)
00281 {
00282 if (this.prvniHlavicka && sloupec == 0)
00283 {
00284 this.sirkaPrvniho = sirkaObsahu;
00285
00286 this.sirkaPrvniho += 2 * this.ohraniceni;
00287 }
00288 else if (this.posledniJiny && sloupec == (this.pocetSloupcu - 1))
00289 {
00290 this.sirkaPosledniho = sirkaObsahu;
00291 }
00292 else
00293 {
00294 this.sirkaBunky = sirkaObsahu;
00295 if (!this.prvniHlavicka)
00296 {
00297 this.sirkaPrvniho = sirkaObsahu;
00298 }
00299 if (!this.posledniJiny)
00300 {
00301 this.sirkaPosledniho = sirkaObsahu;
00302 }
00303 }
00304
00305
00306 this.sirkaPlatna = (this.pocetSloupcu - 2) * (this.sirkaBunky + this.ohraniceni + this.okrajeBunky * 2)
00307 + this.sirkaPrvniho + this.sirkaPosledniho + 2 * this.ohraniceni + this.okrajeBunky * 4
00308 + 4 * this.ohraniceni + 10;
00309 this.vyskaPlatna = this.pocetRadku * (this.vyskaBunky + this.ohraniceni + this.okrajeBunky * 2)
00310 + 4 * this.ohraniceni + 10;
00311 }
00312 this.prekresliTabulku();
00313 }
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323 public void nastavBarvu(int radek, int sloupec, Color barvaPozadiB, Color barvaPismaB)
00324 {
00325 this.barvyBunek[radek][sloupec][0] = barvaPismaB;
00326 this.barvyBunek[radek][sloupec][1] = barvaPozadiB;
00327 this.prekresliTabulku();
00328 }
00329
00330
00331
00332
00333
00334 public void minimalizaceSirky()
00335 {
00336 int minSirka = this.sirkaPrazdneho;
00337 int sirkaObsahu;
00338 int zacatek;
00339 if (this.prvniHlavicka)
00340 {
00341 zacatek = 1;
00342 for (int i = 0; i < this.pocetRadku; i++)
00343 {
00344 sirkaObsahu = this.metrikaFontu.stringWidth(bunky[i][0]);
00345 if (sirkaObsahu > minSirka)
00346 {
00347 minSirka = sirkaObsahu;
00348 }
00349 }
00350 this.sirkaPrvniho = minSirka;
00351
00352 this.sirkaPrvniho += 2 * this.ohraniceni;
00353 }
00354 else
00355 {
00356 zacatek = 0;
00357 }
00358 int konec = this.pocetSloupcu;
00359 if (this.posledniJiny)
00360 {
00361 konec--;
00362 for (int i = 0; i < this.pocetRadku; i++)
00363 {
00364 sirkaObsahu = this.metrikaFontu.stringWidth(bunky[i][konec]);
00365 if (sirkaObsahu > minSirka)
00366 {
00367 minSirka = sirkaObsahu;
00368 }
00369 }
00370 this.sirkaPosledniho = minSirka;
00371 }
00372
00373 for (int i = 0; i < this.pocetRadku; i++)
00374 {
00375 for (int j = zacatek; j < konec; j++)
00376 {
00377 sirkaObsahu = this.metrikaFontu.stringWidth(bunky[i][j]);
00378 if (sirkaObsahu > minSirka)
00379 {
00380 minSirka = sirkaObsahu;
00381 }
00382 }
00383 }
00384 this.sirkaBunky = minSirka;
00385 if (!this.prvniHlavicka)
00386 {
00387 this.sirkaPrvniho = minSirka;
00388 }
00389 if (!this.posledniJiny)
00390 {
00391 this.sirkaPosledniho = minSirka;
00392 }
00393
00394
00395 this.sirkaPlatna = (this.pocetSloupcu - 2) * (this.sirkaBunky + this.ohraniceni + this.okrajeBunky * 2)
00396 + this.sirkaPrvniho + this.sirkaPosledniho + 2 * this.ohraniceni + this.okrajeBunky * 4
00397 + 4 * this.ohraniceni + 10;
00398 this.vyskaPlatna = this.pocetRadku * (this.vyskaBunky + this.ohraniceni + this.okrajeBunky * 2)
00399 + 4 * this.ohraniceni + 10;
00400 this.prekresliTabulku();
00401 }
00402
00403
00404
00405
00406
00407
00408
00409
00410 public void zmenRozmery (int novyPocetRadku, int novyPocetSloupcu)
00411 {
00412 String[][] noveBunky;
00413 Color[][][] noveBarvyBunek;
00414
00415 if (novyPocetRadku > this.pocetRadku)
00416 {
00417
00418 noveBunky = new String[novyPocetRadku][this.pocetSloupcu];
00419
00420 noveBarvyBunek = new Color[novyPocetRadku][this.pocetSloupcu][2];
00421
00422 for (int i = 0; i < this.pocetRadku; i++)
00423 {
00424 for (int j = 0; j < this.pocetSloupcu; j++)
00425 {
00426 noveBunky[i][j] = this.bunky[i][j];
00427 noveBarvyBunek[i][j][0] = this.barvyBunek[i][j][0];
00428 noveBarvyBunek[i][j][1] = this.barvyBunek[i][j][1];
00429 }
00430 }
00431
00432 for (int i = this.pocetRadku; i < novyPocetRadku; i++)
00433 {
00434 for (int j = 0; j < this.pocetSloupcu; j++)
00435 {
00436 this.bunky[i][j] = "";
00437 this.barvyBunek[i][j][0] = this.barvaPisma;
00438 this.barvyBunek[i][j][1] = this.barvaPozadi;
00439 }
00440 }
00441 this.pocetRadku = novyPocetRadku;
00442
00443 this.bunky = noveBunky;
00444 this.barvyBunek = noveBarvyBunek;
00445 }
00446 else if (novyPocetRadku < this.pocetRadku)
00447 {
00448 this.pocetRadku = novyPocetRadku;
00449 }
00450
00451 if (novyPocetSloupcu > this.pocetSloupcu)
00452 {
00453
00454 noveBunky = new String[this.pocetRadku][novyPocetSloupcu];
00455
00456 noveBarvyBunek = new Color[this.pocetRadku][novyPocetSloupcu][2];
00457
00458 for (int i = 0; i < this.pocetRadku; i++)
00459 {
00460 for (int j = 0; j < this.pocetSloupcu; j++)
00461 {
00462 noveBunky[i][j] = this.bunky[i][j];
00463 noveBarvyBunek[i][j][0] = this.barvyBunek[i][j][0];
00464 noveBarvyBunek[i][j][1] = this.barvyBunek[i][j][1];
00465 }
00466 }
00467
00468 for (int i = 0; i < this.pocetRadku; i++)
00469 {
00470 for (int j = this.pocetSloupcu; j < novyPocetSloupcu; j++)
00471 {
00472 noveBunky[i][j] = new String("");
00473 noveBarvyBunek[i][j][0] = this.barvaPisma;
00474 noveBarvyBunek[i][j][1] = this.barvaPozadi;
00475 }
00476 }
00477 this.pocetSloupcu = novyPocetSloupcu;
00478
00479 this.bunky = noveBunky;
00480 this.barvyBunek = noveBarvyBunek;
00481 }
00482 else if (novyPocetSloupcu < this.pocetSloupcu)
00483 {
00484 this.pocetSloupcu = novyPocetSloupcu;
00485 }
00486
00487
00488
00489 this.sirkaPlatna = (this.pocetSloupcu - 2) * (this.sirkaBunky + this.ohraniceni + this.okrajeBunky * 2)
00490 + this.sirkaPrvniho + this.sirkaPosledniho + 2 * this.ohraniceni + this.okrajeBunky * 4
00491 + 4 * this.ohraniceni + 10;
00492 this.vyskaPlatna = this.pocetRadku * (this.vyskaBunky + this.ohraniceni + this.okrajeBunky * 2)
00493 + 4 * this.ohraniceni + 10;
00494 this.prekresliTabulku();
00495 }
00496
00497
00498
00499
00500
00501
00502
00503
00504
00505
00506
00507 public void posunRadek(int radek, int smer, int pocet)
00508 {
00509 if (smer == this.POSUN_VLEVO)
00510 {
00511 for (int i = 0; i < (this.pocetSloupcu - pocet); i++)
00512 {
00513 this.bunky[radek][i] = this.bunky[radek][i+pocet];
00514 }
00515 for (int i = (this.pocetSloupcu - pocet); i < this.pocetSloupcu; i++)
00516 {
00517 this.bunky[radek][i] = "";
00518 }
00519 }
00520 else
00521 {
00522 for (int i = (this.pocetSloupcu - 1); (i - pocet) >= 0; i--)
00523 {
00524 this.bunky[radek][i] = this.bunky[radek][i-pocet];
00525 }
00526 for (int i = 0; i < pocet; i++)
00527 {
00528 this.bunky[radek][i] = "";
00529 }
00530 }
00531 }
00532
00533
00534
00535
00536 private void prekresliTabulku()
00537 {
00538
00539 this.setMinimumSize(new Dimension(this.sirkaPlatna,this.vyskaPlatna));
00540 this.setPreferredSize(new Dimension(this.sirkaPlatna,this.vyskaPlatna));
00541 this.setSize(this.sirkaPlatna,this.vyskaPlatna);
00542 this.revalidate();
00543 this.repaint();
00544 }
00545
00546
00547
00548
00549
00550
00551 public void paintComponent(Graphics g)
00552 {
00553 int zacatek;
00554 if (this.prvniHlavicka)
00555 {
00556 zacatek = 1;
00557 }
00558 else
00559 {
00560 zacatek = 0;
00561 }
00562 int konec;
00563 if (this.posledniJiny)
00564 {
00565 konec = this.pocetSloupcu - 1;
00566 }
00567 else
00568 {
00569 konec = this.pocetSloupcu;
00570 }
00571 super.paintComponent(g);
00572 Graphics2D g2 = (Graphics2D)g;
00573 int invariant1 = 5 + 2 * this.ohraniceni - this.okrajeBunky;
00574 int invariant1P = 5 + 2 * this.ohraniceni - this.okrajeBunky
00575 + zacatek * (this.sirkaPrvniho - this.sirkaBunky);
00576
00577 int invariant2 = 2 * this.okrajeBunky;
00578
00579 int invariant3 = this.sirkaBunky + this.ohraniceni;
00580
00581 int invariant4 = this.vyskaBunky + this.ohraniceni;
00582
00583 int invariant5 = this.sirkaBunky + this.ohraniceni + invariant2;
00584
00585 int invariant6 = this.vyskaBunky + this.ohraniceni + invariant2;
00586 for (int i = 0; i < this.pocetRadku; i++)
00587 {
00588 for (int j = zacatek; j < konec; j++)
00589 {
00590
00591 g2.setColor(this.barvyBunek[i][j][1]);
00592 g2.fillRect(invariant1P + this.okrajeBunky + j * invariant5,
00593 invariant1 + this.okrajeBunky + i * invariant6,
00594 this.sirkaBunky + invariant2,
00595 this.vyskaBunky + invariant2);
00596
00597 g2.setColor(this.barvyBunek[i][j][0]);
00598 g2.drawString(this.bunky[i][j],
00599 invariant1P + (j + 1) * invariant2 + j * invariant3,
00600 invariant1 + (i + 1) * invariant2 + i * invariant4 + this.vyskaBunky);
00601 }
00602 }
00603 if (this.prvniHlavicka)
00604 {
00605 for (int i = 0; i < this.pocetRadku; i++)
00606 {
00607
00608 g2.setColor(this.barvyBunek[i][0][1]);
00609 g2.fillRect(invariant1 + this.okrajeBunky,
00610 invariant1 + this.okrajeBunky + i * invariant6,
00611 this.sirkaPrvniho + invariant2,
00612 this.vyskaBunky + invariant2);
00613
00614 g2.setColor(this.barvyBunek[i][0][0]);
00615 g2.drawString(this.bunky[i][0],
00616 invariant1 + invariant2,
00617 invariant1 + (i + 1) * invariant2 + i * invariant4 + this.vyskaBunky);
00618
00619 }
00620 }
00621 if (this.posledniJiny)
00622 {
00623 for (int i = 0; i < this.pocetRadku; i++)
00624 {
00625
00626 g2.setColor(this.barvyBunek[i][konec][1]);
00627 g2.fillRect(invariant1P + this.okrajeBunky + konec * invariant5,
00628 invariant1 + this.okrajeBunky + i * invariant6,
00629 this.sirkaPosledniho + invariant2,
00630 this.vyskaBunky + invariant2);
00631
00632 g2.setColor(this.barvyBunek[i][konec][0]);
00633 g2.drawString(this.bunky[i][konec],
00634 invariant1P + (konec + 1) * invariant2 + konec * invariant3,
00635 invariant1 + (i + 1) * invariant2 + i * invariant4 + this.vyskaBunky);
00636 }
00637 }
00638
00639 if (this.ohraniceni > 0)
00640 {
00641 g2.setColor(new Color(0,0,0));
00642 g2.setStroke(new BasicStroke(this.ohraniceni * 2));
00643
00644 g2.drawRect(5 + this.ohraniceni,
00645 5 + this.ohraniceni,
00646 this.sirkaPlatna - 10 - 2 * this.ohraniceni,
00647 this.vyskaPlatna - 10 - 2 * this.ohraniceni);
00648 g2.setStroke(new BasicStroke(this.ohraniceni));
00649
00650 invariant1 = 5 + 2 * this.ohraniceni;
00651 invariant1P = 5 + 2 * this.ohraniceni + zacatek * (this.sirkaPrvniho - this.sirkaBunky);
00652 if (this.ohraniceni > 1)
00653 {
00654 invariant1 -= this.ohraniceni / 2;
00655 invariant1P -= this.ohraniceni / 2;
00656 }
00657
00658 invariant2 = 2 * this.okrajeBunky + this.vyskaBunky + this.ohraniceni;
00659
00660 invariant3 = this.sirkaPlatna - 5 - 2 * this.ohraniceni;
00661 for (int i = 1; i < this.pocetRadku; i++)
00662 {
00663 g2.drawLine(invariant1,
00664 invariant1 + i * invariant2,
00665 invariant3,
00666 invariant1 + i * invariant2);
00667 }
00668
00669 invariant2 = 2 * this.okrajeBunky + this.sirkaBunky + this.ohraniceni;
00670
00671 invariant3 = this.vyskaPlatna - 5 - 2 * this.ohraniceni;
00672 for (int i = 1 + zacatek; i < this.pocetSloupcu; i++)
00673 {
00674 g2.drawLine(invariant1P + i * invariant2,
00675 invariant1,
00676 invariant1P + i * invariant2,
00677 invariant3);
00678 }
00679 if (this.prvniHlavicka)
00680 {
00681 g2.drawLine(invariant1 + 1 * 2 * this.okrajeBunky + this.sirkaPrvniho + this.ohraniceni,
00682 invariant1,
00683 invariant1 + 1 * 2 * this.okrajeBunky + this.sirkaPrvniho + this.ohraniceni,
00684 invariant3);
00685 g2.drawLine(invariant1 + 1 * 2 * this.okrajeBunky + this.sirkaPrvniho - this.ohraniceni,
00686 invariant1,
00687 invariant1 + 1 * 2 * this.okrajeBunky + this.sirkaPrvniho - this.ohraniceni,
00688 invariant3);
00689 }
00690 }
00691 }
00692
00693
00694
00695
00696
00697
00698
00699
00700 public String vratObsah(int radek, int sloupec)
00701 {
00702 return this.bunky[radek][sloupec];
00703 }
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714 public Color vratBarvu(int radek, int sloupec,int pismoPozadi)
00715 {
00716 return this.barvyBunek[radek][sloupec][pismoPozadi];
00717 }
00718
00719
00720
00721
00722
00723
00724 public int vratPocetRadkuTabulky()
00725 {
00726 return this.pocetRadku;
00727 }
00728
00729
00730
00731
00732
00733
00734 public int vratPocetSloupcuTabulky()
00735 {
00736 return this.pocetSloupcu;
00737 }
00738
00739
00740
00741
00742
00743
00744 public Dimension getPreferredScrollableViewportSize() {
00745 return new Dimension(this.sirkaPlatna,this.vyskaPlatna);
00746 }
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756 public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation,
00757 int direction) {
00758 return this.sirkaBunky + this.ohraniceni + 2 * this.okrajeBunky;
00759 }
00760
00761
00762
00763
00764
00765
00766
00767
00768
00769 public int getScrollableBlockIncrement(Rectangle visibleRect,
00770 int orientation, int direction) {
00771 return 5 * (this.sirkaBunky + this.ohraniceni + 2 * this.okrajeBunky);
00772 }
00773
00774
00775
00776
00777
00778
00779 public boolean getScrollableTracksViewportWidth() {
00780 return false;
00781 }
00782
00783
00784
00785
00786
00787
00788 public boolean getScrollableTracksViewportHeight() {
00789 return false;
00790 }
00791 }
00792
00793